/**
  * Restiuisce un singleton per creare Pagamenti
  * @return \DipartimentoFactory
  */
 public static function instance()
 {
     if (!isset(self::$singleton)) {
         self::$singleton = new PagamentoFactory();
     }
     return self::$singleton;
 }
 public function handle_input(&$request)
 {
     $vd = new ViewDescriptor();
     $vd->setPagina($request['page']);
     $this->setImpToken($vd, $request);
     //untente non autentificato
     if (!$this->loggedIn()) {
         $this->showLoginPage($vd);
     } else {
         $user = UserFactory::instance()->cercaUtentePerId($_SESSION[BaseController::user], $_SESSION[BaseController::role]);
         //carica le pizze da visualizzare sulla galleria
         $listaPizzeConImg = PizzaFactory::instance()->getListaPizze(true);
         reset($listaPizzeConImg);
         $pizza = current($listaPizzeConImg);
         $index = 0;
         //        var_dump($listaPizzeConImg);
         $vd->setAjaxFile(basename(__DIR__) . '/../view/ajax.php');
         if (isset($request["subpage"])) {
             switch ($request["subpage"]) {
                 case 'base':
                     $vd->setSottoPagina('base');
                     $vd->setBreadcrumb("Modifica username o e-mail");
                     break;
                 case 'password':
                     $vd->setSottoPagina('password');
                     $vd->setBreadcrumb("Modifica password");
                     break;
                 case 'pagamento':
                     $pagamenti = PagamentoFactory::instance()->getListaPagamentiPerCliente($user);
                     $vd->setSottoPagina('pagamento');
                     $vd->setBreadcrumb("Visualizza i tuoi metodi di pagamento");
                     break;
                 case 'visualizza_pagamento':
                     $pagamenti = PagamentoFactory::instance()->getListaPagamentiPerCliente($user);
                     $vd->setSottoPagina('visualizza_pagamento');
                     $vd->setBreadcrumb("Visualizza i tuoi metodi di pagamento");
                     break;
                 case 'indirizzo':
                     $vd->setSottoPagina('indirizzo');
                     $vd->setBreadcrumb("Modifica indirizzo di consegna");
                     break;
                 case 'account':
                     $msg = array();
                     if (!isset($_SESSION[self::elenco_articoli])) {
                         $_SESSION[self::elenco_articoli] = array();
                     }
                     $vd->setSottoPagina('account');
                     break;
                 case 'conferma_ordine_step1':
                     $vd->setSottoPagina('conferma_ordine_step1');
                     $vd->setTitoloStep('Passo 1: seleziona indirizzo di consegna');
                     break;
                 case 'conferma_ordine_step2':
                     $vd->setSottoPagina('conferma_ordine_step2');
                     $vd->setTitoloStep('Passo 2: riepilogo articoli');
                     break;
                 case 'conferma_ordine_step3':
                     $vd->setSottoPagina('conferma_ordine_step3');
                     $vd->setTitoloStep('Passo 3: seleziona metodo di pagamento');
                     $pagamenti = PagamentoFactory::instance()->getListaPagamentiPerCliente($user);
                     break;
                 case 'cronologia_ordini':
                     $ordini = OrdineFactory::instance()->getListaOrdiniPerCliente($user);
                     $vd->setSottoPagina('cronologia_ordini');
                     $vd->setBreadcrumb("Visualizza cronologia ordini");
                     break;
                 case 'ordini_attivi':
                     $ordini = OrdineFactory::instance()->getListaOrdiniPerCliente($user, true);
                     $vd->setSottoPagina('cronologia_ordini');
                     $vd->setBreadcrumb("Visualizza ordini in corso");
                     break;
                 default:
                     if (!isset($_SESSION[self::elenco_articoli])) {
                         $_SESSION[self::elenco_articoli] = array();
                     }
                     $vd->setSottoPagina('home');
                     break;
             }
         }
         if (isset($request["cmd"])) {
             switch ($request["cmd"]) {
                 //salvataggio permanente elenco articoli
                 case 'ordina':
                     $msg = array();
                     if (!empty($_SESSION[self::elenco_articoli])) {
                         if (isset($request['carta'])) {
                             $carta = intval($request['carta']);
                             $pagamento = PagamentoFactory::instance()->cercaPagamentoPerId($carta);
                             if (!isset($pagamento)) {
                                 $msg[] = 'Il metodo di pagamento inserito non è valido';
                                 $vd->setTitoloStep('Passo 3: seleziona metodo di pagamento');
                                 $vd->setSottoPagina('conferma_ordine_step3');
                             } else {
                                 if (!OrdineFactory::instance()->salvaOrdine($_SESSION[self::elenco_articoli], $user->getId(), $pagamento, $this->getSubTotale(true))) {
                                     $msg[] = '<li>Spiacente. Impossibile terminare la transazione</li>';
                                     $vd->setTitoloStep('Passo 3: seleziona metodo di pagamento');
                                     $vd->setSottoPagina('conferma_ordine_step3');
                                 } else {
                                     $_SESSION[self::elenco_articoli] = array();
                                     $vd->setSottoPagina('home');
                                 }
                             }
                         }
                         $this->creaFeedbackUtente($msg, $vd, 'Ordine inviato');
                     }
                     $this->showHomeCliente($vd);
                     $pagamenti = PagamentoFactory::instance()->getListaPagamentiPerCliente($user);
                     break;
                     //rimuove un articolo dal carrello
                 //rimuove un articolo dal carrello
                 case 'remove':
                     if (isset($request['key'])) {
                         $key = intval($request['key']);
                         if (array_key_exists($key, $_SESSION[self::elenco_articoli])) {
                             $this->rimuoviArticolo($_SESSION[self::elenco_articoli][$key]);
                         }
                     }
                     $subpage = $_REQUEST['subpage'];
                     if (empty($_SESSION[self::elenco_articoli])) {
                         $subpage = 'home';
                         $vd->setSottoPagina('home');
                     }
                     $this->showHomeCliente($vd);
                     header('Location: ' . Settings::getApplicationPath() . "php/cliente/{$subpage}");
                     exit;
                     break;
                     /**
                      * è stato aggiunto un "articolo" al carrello, 
                      * ovvero una quantità di pizze di un determinato tipo e di una certa dimensione
                      */
                 /**
                  * è stato aggiunto un "articolo" al carrello, 
                  * ovvero una quantità di pizze di un determinato tipo e di una certa dimensione
                  */
                 case 'add':
                     //controlla la provenienza della richiesta: selectmenu form ...
                     if (isset($request['pizza-selection']) && isset($request['size']) && isset($request['quantity'])) {
                         if (PizzaFactory::instance()->cercaPizzaPerId(intval($request['pizza-selection']))) {
                             $articolo = new ArticoloSession(PizzaFactory::instance()->cercaPizzaPerId(intval($request['pizza-selection'])), $request['size'], intval($request['quantity']));
                             $this->aggiungiArticolo($articolo);
                         }
                     }
                     //... altrimenti gallery form
                     if (isset($request['pizza-gallery']) && isset($request['size']) && isset($request['quantity'])) {
                         $key = intval($request['pizza-gallery']);
                         if (array_key_exists($key, $listaPizzeConImg)) {
                             $articolo = new ArticoloSession(PizzaFactory::instance()->cercaPizzaPerId($listaPizzeConImg[$key]->getId()), $request['size'], intval($request['quantity']));
                             $this->aggiungiArticolo($articolo);
                         }
                     }
                     //                        file_put_contents('php/text.txt', $_SERVER['REQUEST_URI'], FILE_APPEND);
                     $vd->setSottoPagina('home');
                     $this->showHomeCliente($vd);
                     /**
                      * Evita l'auto-submit del form in seguito alla ricarica della pagina nel browser.
                      * Problema presente anche nel progetto d'esempio:
                      * http://spano.sc.unica.it/amm2014/davide/esami14/php/docente/reg_esami_step1?cmd=r_nuovo
                      */
                     header('Location: ' . Settings::getApplicationPath() . 'php/cliente/home');
                     exit;
                     break;
                     //visualizza i dettagli di un metodo di pagamento selezionato
                 //visualizza i dettagli di un metodo di pagamento selezionato
                 case 'v_pagamento':
                     $msg = array();
                     //                        var_dump($request);
                     $p = 0;
                     if (isset($request['carta'])) {
                         $p = filter_var($request['carta'], FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
                         if (!array_key_exists($p, $pagamenti)) {
                             $msg[] = '<li>Il metodo di pagamento specificato non &egrave; valido</li>';
                             $vd->setSottoPagina('pagamento');
                             $this->creaFeedbackUtente($msg, $vd, '');
                         } else {
                             $carta = $pagamenti[$p];
                             $vd->setSottoPagina('visualizza_pagamento');
                         }
                     } else {
                         $vd->setSottoPagina('pagamento');
                     }
                     $this->showHomeUser($vd);
                     break;
                 case 'aggiorna_indirizzo':
                     $msg = array();
                     $this->aggiornaIndirizzo($user, $request, $msg);
                     $this->creaFeedbackUtente($msg, $vd, "Indirizzo di consegna aggiornato");
                     $this->showHomeUser($vd);
                     break;
                 case 'aggiorna_password':
                     $msg = array();
                     $this->aggiornaPassword($user, $request, $msg);
                     $this->creaFeedbackUtente($msg, $vd, 'Password aggiornata');
                     $vd->setSottoPagina('password');
                     $vd->setBreadcrumb("Modifica password");
                     $this->showHomeUser($vd);
                     break;
                     // aggiorna username, e-mail
                 // aggiorna username, e-mail
                 case 'aggiorna_info_base':
                     $msg = array();
                     $vd->setSottoPagina('base');
                     $vd->setBreadcrumb("Modifica username o e-mail");
                     $this->aggiornaInfoBase($user, $request, $msg);
                     $this->creaFeedbackUtente($msg, $vd, 'Username/e-mail sono stati aggiornati');
                     $this->showHomeUser($vd);
                     break;
                 case 'logout':
                     $this->logout($vd);
                     break;
                     // ajax: click di un bullet: cambia pizza visualizzata sulla gallery
                 // ajax: click di un bullet: cambia pizza visualizzata sulla gallery
                 case 'go':
                     $vd->toggleJson();
                     $index = filter_var($request["id"], FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
                     if (!array_key_exists($index, $listaPizzeConImg)) {
                         $index = 0;
                     }
                     $pizza = $listaPizzeConImg[$index];
                     break;
                     // ajax: click next arrow: visualizza la pizza successiva
                 // ajax: click next arrow: visualizza la pizza successiva
                 case 'next':
                     $vd->toggleJson();
                     $index = filter_var($request["id"], FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
                     if (!isset($index)) {
                         $intVal = 0;
                     }
                     $index++;
                     if ($index > count($listaPizzeConImg) - 1) {
                         $index = 0;
                     }
                     $pizza = $listaPizzeConImg[$index];
                     break;
                     // ajax: click previous arrow: visualizza la pizza precedente
                 // ajax: click previous arrow: visualizza la pizza precedente
                 case 'prev':
                     $vd->toggleJson();
                     $index = filter_var($request["id"], FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
                     if (!isset($index)) {
                         $index = 0;
                     }
                     $index--;
                     if ($index < 0) {
                         $index = count($listaPizzeConImg) - 1;
                     }
                     $pizza = $listaPizzeConImg[$index];
                     break;
                 default:
                     $this->showHomeCliente($vd);
             }
         } else {
             // nessun comando
             $user = UserFactory::instance()->cercaUtentePerId($_SESSION[BaseController::user], $_SESSION[BaseController::role]);
             $this->showHomeUser($vd);
         }
     }
     require basename(__DIR__) . '/../view/master.php';
 }
 /**
  * Salva un ordine sul DB
  * @param $elenco array di articoli che fanno parte dell'ordine
  * @param $cliente id cliente che ha effettuato l'ordine
  * @param Pagamento $pay il metodo di ordine scelto dal cliente
  * @param float $subtotale il prezzo dell'ordine
  * @return boolean true se il salvataggio va a buon fine, false altrimenti
  */
 public function salvaOrdine($elenco, $cliente_id, Pagamento $pay, $subtotale)
 {
     $mysqli = Db::getInstance()->connectDb();
     if (!isset($mysqli)) {
         error_log("[salvaOrdine] impossibile inizializzare il database");
         $mysqli->close();
         return false;
     }
     $stmt = $mysqli->stmt_init();
     $stmt2 = $mysqli->stmt_init();
     $insert_ordine = "insert into ordini (id, data_creazione, subtotale, cliente_id) \n            values (default, NOW(), ?, ?)";
     $insert_articoli = 'insert into articoli values
         (default, ?, ?, ?, ?, ?)';
     //stmt tab ordini
     $stmt->prepare($insert_ordine);
     if (!$stmt) {
         error_log("[salvaOrdine] impossibile" . " inizializzare il prepared statement");
         $mysqli->close();
         return false;
     }
     //stmt tab articoli
     $stmt2->prepare($insert_articoli);
     if (!$stmt2) {
         error_log("[salvaOrdine] impossibile" . " inizializzare il prepared statement 2");
         $mysqli->close();
         return false;
     }
     //stmt tab ordini
     if (!$stmt->bind_param('di', floatval($subtotale), intval($cliente_id))) {
         error_log("[salvaOrdine] impossibile" . " effettuare il binding in input stmt");
         $mysqli->close();
         return false;
     }
     //var stmt tab articoli
     $articolo_size = '';
     $articolo_qty = 0;
     $articolo_prezzo = 0.0;
     $articolo_pizza_id = 0;
     $ordine_id = 0;
     //stmt tab articoli
     if (!$stmt2->bind_param('sidii', $articolo_size, $articolo_qty, $articolo_prezzo, $articolo_pizza_id, $ordine_id)) {
         error_log("[salvaOrdine] impossibile" . " effettuare il binding in input stmt2");
         $mysqli->close();
         return false;
     }
     // inizio transazione
     $mysqli->autocommit(false);
     //        echo 'attuale:' . $pay->getSaldo() . '<br>';
     if ($pay->getSaldo() >= $subtotale) {
         PagamentoFactory::instance()->aggiornaSaldoPagamento($pay, $pay->getSaldo() - $subtotale);
         //        echo 'nuovo:' . $pay->getSaldo() . '<br>';
     } else {
         $mysqli->rollback();
         $mysqli->close();
         return false;
     }
     //stmt tab ordini
     if (!$stmt->execute()) {
         error_log("[salvaOrdine] impossibile" . " eseguire lo statement");
         $mysqli->rollback();
         $mysqli->close();
         return false;
     }
     //stmt tab articoli
     foreach ($elenco as $articolo) {
         $articolo_size = $articolo->getSize();
         $articolo_qty = $articolo->getQty();
         $articolo_prezzo = $articolo->getPrezzoArticolo();
         $articolo_pizza_id = $articolo->getPizza()->getId();
         $ordine_id = $stmt->insert_id;
         if (!$stmt2->execute()) {
             error_log("[salvaOrdine] impossibile" . " eseguire lo statement 2");
             $mysqli->rollback();
             $mysqli->close();
             return false;
         }
     }
     // tutto ok, posso rendere persistente il salvataggio
     $mysqli->commit();
     $mysqli->autocommit(true);
     $mysqli->close();
     return true;
 }