/** * 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 è 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; }