prepare(" SELECT indirizzo.idIndirizzo, indirizzo.via, indirizzo.numeroCivico, indirizzo.predefinito, indirizzo.idComune FROM indirizzo WHERE indirizzo.idCliente = :idCliente "); $stmt->execute([ "idCliente" => $idCliente ]); $indirizzi = $stmt->fetchAll(PDO::FETCH_ASSOC); /* ============================================================ * EVENTUALE ORDINE IN BOZZA * ============================================================ */ $stmt = $pdo->prepare(" SELECT ordine.idOrdine FROM ordine WHERE ordine.idCliente = :idCliente AND ordine.statoConferma = 'bozza' ORDER BY ordine.dataOraCreazione DESC LIMIT 1 "); $stmt->execute([ "idCliente" => $idCliente ]); $idOrdine = $stmt->fetchColumn(); if ($idOrdine === false) { $idOrdine = null; } /* ============================================================ * PRODOTTI DISPONIBILI * ============================================================ */ $stmt = $pdo->prepare(" SELECT prodotto.idProdotto, prodotto.nome, prodotto.descrizione, prodotto.prezzoBase, prodotto.tempoPreparazione, prodotto.proceduraPreparazione, prodotto.disponibile FROM prodotto WHERE prodotto.disponibile = 1 ORDER BY prodotto.nome "); $stmt->execute(); $prodotti = $stmt->fetchAll(PDO::FETCH_ASSOC); /* ============================================================ * CARATTERISTICHE DISPONIBILI * ============================================================ */ $stmt = $pdo->prepare(" SELECT caratteristica.idCaratteristica, caratteristica.nome, caratteristica.descrizione, caratteristica.differenzaPrezzo, caratteristica.predefinita, caratteristica.disponibile, caratteristica.idProdotto, caratteristica.idGruppoEsclusione, gruppoEsclusione.nome AS nomeGruppo FROM caratteristica LEFT JOIN gruppoEsclusione ON caratteristica.idGruppoEsclusione = gruppoEsclusione.idGruppoEsclusione WHERE caratteristica.disponibile = 1 ORDER BY caratteristica.idProdotto, caratteristica.idGruppoEsclusione, caratteristica.idCaratteristica "); $stmt->execute(); $caratteristicheDisponibili = $stmt->fetchAll(PDO::FETCH_ASSOC); /* ============================================================ * QUERY 3 * * Inserimento di un prodotto in un ordine * con le caratteristiche selezionate. * ============================================================ */ if (postMethod() && $azione === "aggiungi") { if ( $idCliente <= 0 || !$idProdotto || !$quantita || $quantita < 1 || $quantita > 255 ) { $messaggio = "Dati in input non validi"; } else { try { /* Verifico che il prodotto esista e sia disponibile. */ $stmt = $pdo->prepare(" SELECT prodotto.prezzoBase FROM prodotto WHERE prodotto.idProdotto = :idProdotto AND prodotto.disponibile = 1 LIMIT 1 "); $stmt->execute([ "idProdotto" => $idProdotto ]); $prezzoBaseApplicato = $stmt->fetchColumn(); if ($prezzoBaseApplicato === false) { $messaggio = "Prodotto inesistente o non disponibile"; } else { /* Se non esiste una bozza recupero l'indirizzo predefinito. */ if (!$idOrdine) { $stmt = $pdo->prepare(" SELECT indirizzo.idIndirizzo FROM indirizzo WHERE indirizzo.idCliente = :idCliente AND indirizzo.predefinito = 1 LIMIT 1 "); $stmt->execute([ "idCliente" => $idCliente ]); $idIndirizzo = $stmt->fetchColumn(); if ($idIndirizzo === false) { $messaggio = "Prima di creare un ordine devi impostare un indirizzo predefinito."; } } if ($idOrdine || $idIndirizzo) { $pdo->beginTransaction(); /* ======================================================== * CREAZIONE EVENTUALE BOZZA * ======================================================== */ if (!$idOrdine) { $stmt = $pdo->prepare(" INSERT INTO ordine ( dataOraCreazione, dataOraConferma, dataOraAnnullamento, statoConferma, orarioConsegna, totale, tempoStimatoConsegna, idCliente, idIndirizzo ) VALUES ( NOW(), NULL, NULL, 'bozza', NULL, 0.00, NULL, :idCliente, :idIndirizzo ) "); $stmt->execute([ "idCliente" => $idCliente, "idIndirizzo" => $idIndirizzo ]); $idOrdine = (int) $pdo->lastInsertId(); } /* ======================================================== * INSERIMENTO RIGA ORDINE * ======================================================== */ $stmt = $pdo->prepare(" INSERT INTO rigaOrdine ( quantita, prezzoBaseApplicato, idOrdine, idProdotto ) VALUES ( :quantita, :prezzoBaseApplicato, :idOrdine, :idProdotto ) "); $stmt->execute([ "quantita" => $quantita, "prezzoBaseApplicato" => $prezzoBaseApplicato, "idOrdine" => $idOrdine, "idProdotto" => $idProdotto ]); $idRigaOrdine = (int) $pdo->lastInsertId(); /* ======================================================== * CARATTERISTICHE DELLA RIGA * ======================================================== */ $stmtCaratteristica = $pdo->prepare(" SELECT caratteristica.idCaratteristica, caratteristica.differenzaPrezzo, caratteristica.idGruppoEsclusione FROM caratteristica WHERE caratteristica.idCaratteristica = :idCaratteristica AND caratteristica.idProdotto = :idProdotto AND caratteristica.disponibile = 1 LIMIT 1 "); $stmtInserisciCaratteristica = $pdo->prepare(" INSERT INTO rigaOrdineSelezionaCaratteristica ( idCaratteristica, idRigaOrdine, differenzaPrezzoApplicata ) VALUES ( :idCaratteristica, :idRigaOrdine, :differenzaPrezzoApplicata ) "); $gruppiSelezionati = []; foreach ($caratteristiche as $idCaratteristica) { $stmtCaratteristica->execute([ "idCaratteristica" => $idCaratteristica, "idProdotto" => $idProdotto ]); $caratteristica = $stmtCaratteristica->fetch(PDO::FETCH_ASSOC); if (!$caratteristica) { throw new RuntimeException( "Caratteristica non valida per il prodotto selezionato." ); } $idGruppoEsclusione = $caratteristica["idGruppoEsclusione"]; if ($idGruppoEsclusione !== null) { $idGruppoEsclusione = (int) $idGruppoEsclusione; if (isset($gruppiSelezionati[$idGruppoEsclusione])) { throw new RuntimeException( "Sono state selezionate due caratteristiche incompatibili." ); } $gruppiSelezionati[$idGruppoEsclusione] = true; } $stmtInserisciCaratteristica->execute([ "idCaratteristica" => $idCaratteristica, "idRigaOrdine" => $idRigaOrdine, "differenzaPrezzoApplicata" => $caratteristica["differenzaPrezzo"] ]); } /* ======================================================== * FINE QUERY 3 * ======================================================== */ $pdo->commit(); // POST -> REDIRECT -> GET header("Location: ordine.php"); exit; } } } catch (Throwable $e) { if ($pdo->inTransaction()) { $pdo->rollBack(); } die( "Errore durante l'aggiunta del prodotto all'ordine: " . $e->getMessage() ); } } } /* ============================================================ * RIGHE DELLA BOZZA * ============================================================ */ if ($idOrdine) { $stmt = $pdo->prepare(" SELECT rigaOrdine.idRigaOrdine, rigaOrdine.quantita, rigaOrdine.prezzoBaseApplicato, rigaOrdine.idOrdine, rigaOrdine.idProdotto, prodotto.nome AS nomeProdotto, ( rigaOrdine.quantita * ( rigaOrdine.prezzoBaseApplicato + COALESCE( ( SELECT SUM( rigaOrdineSelezionaCaratteristica.differenzaPrezzoApplicata ) FROM rigaOrdineSelezionaCaratteristica WHERE rigaOrdineSelezionaCaratteristica.idRigaOrdine = rigaOrdine.idRigaOrdine ), 0 ) ) ) AS subtotale FROM rigaOrdine JOIN prodotto ON rigaOrdine.idProdotto = prodotto.idProdotto WHERE rigaOrdine.idOrdine = :idOrdine ORDER BY rigaOrdine.idRigaOrdine "); $stmt->execute([ "idOrdine" => $idOrdine ]); $righeOrdine = $stmt->fetchAll(PDO::FETCH_ASSOC); } /* ============================================================ * QUERY 4 * * Calcolo totale e tempo stimato di consegna * ============================================================ */ if ($idOrdine) { $stmt = $pdo->prepare(" SELECT SUM( ( rigaOrdine.prezzoBaseApplicato + COALESCE( ( SELECT SUM( rigaOrdineSelezionaCaratteristica.differenzaPrezzoApplicata ) FROM rigaOrdineSelezionaCaratteristica WHERE rigaOrdineSelezionaCaratteristica.idRigaOrdine = rigaOrdine.idRigaOrdine ), 0 ) ) * rigaOrdine.quantita ) AS totale, SUM( prodotto.tempoPreparazione * rigaOrdine.quantita ) AS tempoStimatoConsegna FROM rigaOrdine JOIN prodotto ON prodotto.idProdotto = rigaOrdine.idProdotto WHERE rigaOrdine.idOrdine = :idOrdine "); $stmt->execute([ "idOrdine" => $idOrdine ]); $riepilogo = $stmt->fetch(PDO::FETCH_ASSOC); } /* ============================================================ * CONFERMA / ANNULLA * ============================================================ */ if (postMethod() && in_array($azione, ["conferma", "annulla"], true)) { // Annullamento ordine if ($azione === "annulla") { // Registrazione dell'annullamento dell'ordine $stmt = $pdo->prepare(" UPDATE ordine SET ordine.dataOraAnnullamento = NOW(), ordine.statoConferma = 'annullato', ordine.orarioConsegna = NULL, ordine.tempoStimatoConsegna = NULL WHERE ordine.idOrdine = :idOrdine AND ordine.idCliente = :idCliente AND ordine.statoConferma = 'bozza' "); $stmt->execute([ "idOrdine" => $idOrdine, "idCliente" => $idCliente ]); // Pulizia del riepilogo header("Location: ordine.php"); // Messaggio $_SESSION["messaggio"] = "Ordine annullato con successo"; exit; } // Conferma ordine if ($azione === "conferma") { // Calcolo del tempo di preparazione $stmt = $pdo->prepare(" SELECT COALESCE( SUM(rigaOrdine.quantita * prodotto.tempoPreparazione), 0 ) AS tempoPreparazione FROM ordine JOIN rigaOrdine ON rigaOrdine.idOrdine = ordine.idOrdine JOIN prodotto ON rigaOrdine.idProdotto = prodotto.idProdotto WHERE ordine.idOrdine = :idOrdine "); $stmt->execute([ "idOrdine" => $idOrdine ]); $tempoPreparazione = $stmt->fetchColumn(); // Calcolo del totale $stmt = $pdo->prepare(" SELECT COALESCE( SUM(totali.totaleRigaOrdine), 0 ) FROM rigaOrdine AS ro1 LEFT JOIN ( SELECT ro2.idRigaOrdine AS idRigaOrdine, ro2.quantita * ( ro2.prezzoBaseApplicato + COALESCE( SUM(rosc2.differenzaPrezzoApplicata), 0 ) ) AS totaleRigaOrdine FROM rigaOrdine AS ro2 LEFT JOIN rigaOrdineSelezionaCaratteristica AS rosc2 ON ro2.idRigaOrdine = rosc2.idRigaOrdine WHERE ro2.idOrdine = :idOrdine GROUP BY ro2.idRigaOrdine ) AS totali ON ro1.idRigaOrdine = totali.idRigaOrdine WHERE ro1.idOrdine = :idOrdine "); $stmt->execute([ "idOrdine" => $idOrdine ]); $totale = $stmt->fetchColumn(); // Registrazione della conferma dell'ordine $stmt = $pdo->prepare(" UPDATE ordine SET ordine.dataOraConferma = NOW(), ordine.statoConferma = 'confermato', ordine.totale = :totale, ordine.tempoStimatoConsegna = :tempoPreparazione WHERE ordine.idOrdine = :idOrdine AND ordine.idCliente = :idCliente AND ordine.statoConferma = 'bozza' "); $stmt->execute([ "idOrdine" => $idOrdine, "idCliente" => $idCliente, "totale" => $totale, "tempoPreparazione" => $tempoPreparazione ]); // Creazione dello storicoStato e statoOrdine $stmt = $pdo->prepare(" INSERT INTO statoOrdine ( nomeStato, posizione ) VALUES ( 'IN LAVORAZIONE', 1 ) "); $stmt->execute(); $idStatoOrdine = $pdo->lastInsertId(); $stmt = $pdo->prepare(" INSERT INTO storicoStato ( timestamp, idOrdine, idStatoOrdine ) VALUES ( NOW(), :idOrdine, :idStatoOrdine ) "); $stmt->execute([ "idOrdine" => $idOrdine, "idStatoOrdine" => $idStatoOrdine ]); // Pulizia del riepilogo header("Location: ordine.php"); // Messaggio $_SESSION["messaggio"] = "Ordine confermato con successo"; exit; } } /* ============================================================ * PAGINA * ============================================================ */ $pageTitle = "Componi ordine"; $basePath = ".."; require __DIR__ . "/../includes/header.php"; ?>

Componi ordine

Aggiungi un prodotto

Caratteristiche

Seleziona prima un prodotto.

Riepilogo

La bozza è vuota.

×

Totale:
Tempo stimato: min

Conferma o annulla