Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9a8acb16fd | |||
| 57abac80bd | |||
| a121224899 | |||
| 42979685fb | |||
| c796788339 |
+190
-145
@@ -1,175 +1,220 @@
|
|||||||
<?php
|
<?php
|
||||||
require_once __DIR__ . "/../includes/auth.php";
|
require_once __DIR__ . "/../includes/auth.php";
|
||||||
requireRole("cliente");
|
requireRole("cliente");
|
||||||
require_once __DIR__ . "/../config/database.php";
|
require_once __DIR__ . "/../config/database.php";
|
||||||
$idCliente = (int) $_SESSION["idUtente"];
|
$idCliente = (int) $_SESSION["idUtente"];
|
||||||
$azione = $_POST["azione"] ?? null;
|
$azione = $_POST["azione"] ?? null;
|
||||||
$idIndirizzo = filter_input(INPUT_POST, "idIndirizzo", FILTER_VALIDATE_INT);
|
$idIndirizzo = filter_input(INPUT_POST, "idIndirizzo", FILTER_VALIDATE_INT);
|
||||||
$via = trim($_POST["via"] ?? "");
|
$via = trim($_POST["via"] ?? "");
|
||||||
$numeroCivico = trim($_POST["numeroCivico"] ?? "");
|
$numeroCivico = trim($_POST["numeroCivico"] ?? "");
|
||||||
$idComune = filter_input(INPUT_POST, "idComune", FILTER_VALIDATE_INT);
|
$idComune = filter_input(INPUT_POST, "idComune", FILTER_VALIDATE_INT);
|
||||||
$indirizzi = [];
|
$indirizzi = [];
|
||||||
$messaggio = null;
|
$messaggio = null;
|
||||||
$comuni = [];
|
$comuni = [];
|
||||||
|
|
||||||
$stmt = $pdo->prepare("
|
|
||||||
SELECT
|
|
||||||
comune.idComune,
|
|
||||||
comune.nome AS nomeComune,
|
|
||||||
provincia.nome AS nomeProvincia,
|
|
||||||
provincia.sigla
|
|
||||||
|
|
||||||
FROM comune JOIN provincia ON comune.idProvincia = provincia.idProvincia
|
$stmt = $pdo->prepare("
|
||||||
");
|
SELECT
|
||||||
$stmt->execute();
|
comune.idComune,
|
||||||
$comuni = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
comune.nome AS nomeComune,
|
||||||
|
provincia.nome AS nomeProvincia,
|
||||||
|
provincia.sigla
|
||||||
|
|
||||||
|
FROM comune JOIN provincia ON comune.idProvincia = provincia.idProvincia
|
||||||
|
");
|
||||||
|
$stmt->execute();
|
||||||
|
$comuni = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
if (postMethod()) {
|
if (postMethod()) {
|
||||||
|
|
||||||
try {
|
|
||||||
|
|
||||||
switch($azione) {
|
switch($azione) {
|
||||||
case "predefinito": {
|
case "predefinito": { // OKOKFATTO
|
||||||
if (!$idIndirizzo) {
|
|
||||||
$messaggio = "Id indirizzo non valido";
|
|
||||||
die("Id indirizzo non valido");
|
|
||||||
}
|
|
||||||
|
|
||||||
$pdo->beginTransaction();
|
|
||||||
|
|
||||||
// Rimozione dei precedenti indirizzi predefiniti
|
|
||||||
$stmt = $pdo->prepare("
|
|
||||||
UPDATE indirizzo
|
|
||||||
SET predefinito = 0
|
|
||||||
WHERE idCliente = :idCliente
|
|
||||||
");
|
|
||||||
$stmt->execute([
|
|
||||||
"idCliente" => $idCliente
|
|
||||||
]);
|
|
||||||
|
|
||||||
// Settando indirizzo corrente come predefinito
|
try {
|
||||||
$stmt = $pdo->prepare("
|
if (!$idIndirizzo) {
|
||||||
UPDATE indirizzo
|
$messaggio = "Id indirizzo non valido";
|
||||||
SET predefinito = 1
|
die("Id indirizzo non valido");
|
||||||
WHERE
|
}
|
||||||
idCliente = :idCliente AND idIndirizzo = :idIndirizzo
|
|
||||||
");
|
$pdo->beginTransaction();
|
||||||
$stmt->execute([
|
|
||||||
"idCliente" => $idCliente,
|
// Rimozione dei precedenti indirizzi predefiniti
|
||||||
"idIndirizzo" => $idIndirizzo
|
$stmt = $pdo->prepare("
|
||||||
]);
|
UPDATE indirizzo
|
||||||
|
SET predefinito = 0
|
||||||
$pdo->commit();
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case "inserisci": {
|
|
||||||
if (
|
|
||||||
$via === "" ||
|
|
||||||
$numeroCivico === "" ||
|
|
||||||
$idComune === ""
|
|
||||||
) {
|
|
||||||
$messaggio = "Compila i campi correttamente";
|
|
||||||
die("Compila i campi correttamente");
|
|
||||||
}
|
|
||||||
|
|
||||||
$stmt = $pdo->prepare("
|
|
||||||
SELECT EXISTS (
|
|
||||||
SELECT 1
|
|
||||||
FROM indirizzo
|
|
||||||
WHERE idCliente = :idCliente
|
WHERE idCliente = :idCliente
|
||||||
) AS esiste
|
");
|
||||||
");
|
$stmt->execute([
|
||||||
$stmt->execute([
|
"idCliente" => $idCliente
|
||||||
"idCliente" => $idCliente
|
]);
|
||||||
]);
|
|
||||||
$predefinito = $stmt->fetchColumn();
|
// Settando indirizzo corrente come predefinito
|
||||||
if ($predefinito) {
|
$stmt = $pdo->prepare("
|
||||||
// Sono presenti record di indirizzi
|
UPDATE indirizzo
|
||||||
$predefinito = 0;
|
SET predefinito = 1
|
||||||
} else {
|
WHERE
|
||||||
// Non sono presenti record di indirizzi
|
idCliente = :idCliente AND idIndirizzo = :idIndirizzo
|
||||||
$predefinito = 1;
|
");
|
||||||
|
$stmt->execute([
|
||||||
|
"idCliente" => $idCliente,
|
||||||
|
"idIndirizzo" => $idIndirizzo
|
||||||
|
]);
|
||||||
|
|
||||||
|
$pdo->commit();
|
||||||
|
|
||||||
|
break;
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
|
||||||
|
if ($pdo -> inTransaction()) {
|
||||||
|
$pdo->rollBack();
|
||||||
|
}
|
||||||
|
|
||||||
|
$messaggio =
|
||||||
|
"Errore durante l'aggiornamento dell'indirizzo" .
|
||||||
|
$e->getMessage();
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
$pdo->beginTransaction();
|
|
||||||
$stmt = $pdo->prepare("
|
|
||||||
INSERT INTO indirizzo (via, numeroCivico, predefinito, idComune, idCliente)
|
|
||||||
VALUES (:via, :numeroCivico, :predefinito, :idComune, :idCliente)
|
|
||||||
");
|
|
||||||
$stmt->execute([
|
|
||||||
"via" => $via,
|
|
||||||
"numeroCivico" => $numeroCivico,
|
|
||||||
"predefinito" => $predefinito,
|
|
||||||
"idComune" => $idComune,
|
|
||||||
"idCliente" => $idCliente
|
|
||||||
]);
|
|
||||||
$pdo->commit();
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case "elimina": {
|
case "inserisci": { // OKOKFATTO
|
||||||
if (!$idIndirizzo) {
|
try {
|
||||||
$messaggio = "Id indirizzo non valido";
|
if (
|
||||||
die("Id indirizzo non valido");
|
$via === "" ||
|
||||||
|
$numeroCivico === "" ||
|
||||||
|
$idComune === ""
|
||||||
|
) {
|
||||||
|
$messaggio = "Compila i campi correttamente";
|
||||||
|
die("Compila i campi correttamente");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Verifica della presenza di indirizzi
|
||||||
|
già registrati a nome del cliente.
|
||||||
|
|
||||||
|
Questa operazione non richiede che
|
||||||
|
sia inserita nella beginTransaction()
|
||||||
|
*/
|
||||||
|
$stmt = $pdo->prepare("
|
||||||
|
SELECT EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM indirizzo
|
||||||
|
WHERE idCliente = :idCliente
|
||||||
|
) AS esiste
|
||||||
|
");
|
||||||
|
$stmt->execute([
|
||||||
|
"idCliente" => $idCliente
|
||||||
|
]);
|
||||||
|
$predefinito = $stmt->fetchColumn();
|
||||||
|
if ($predefinito) {
|
||||||
|
// Sono presenti record di indirizzi
|
||||||
|
$predefinito = 0;
|
||||||
|
} else {
|
||||||
|
// Non sono presenti record di indirizzi
|
||||||
|
$predefinito = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Inizia la transazione,
|
||||||
|
si inserisce nel database la via.
|
||||||
|
*/
|
||||||
|
$pdo->beginTransaction();
|
||||||
|
$stmt = $pdo->prepare("
|
||||||
|
INSERT INTO indirizzo (via, numeroCivico, predefinito, idComune, idCliente)
|
||||||
|
VALUES (:via, :numeroCivico, :predefinito, :idComune, :idCliente)
|
||||||
|
");
|
||||||
|
$stmt->execute([
|
||||||
|
"via" => $via,
|
||||||
|
"numeroCivico" => $numeroCivico,
|
||||||
|
"predefinito" => $predefinito,
|
||||||
|
"idComune" => $idComune,
|
||||||
|
"idCliente" => $idCliente
|
||||||
|
]);
|
||||||
|
|
||||||
|
$pdo->commit();
|
||||||
|
|
||||||
|
$messaggio = "Indirizzo aggiunto con successo";
|
||||||
|
|
||||||
|
break;
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
|
||||||
|
if ($pdo -> inTransaction()) {
|
||||||
|
$pdo->rollBack();
|
||||||
|
}
|
||||||
|
|
||||||
|
$messaggio =
|
||||||
|
"Errore durante l'inserimento dell'indirizzo" .
|
||||||
|
$e->getMessage();
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$pdo->beginTransaction();
|
case "elimina": { // OKOKFATTO
|
||||||
|
try {
|
||||||
|
if (!$idIndirizzo) {
|
||||||
|
$messaggio = "Id indirizzo non valido";
|
||||||
|
die("Id indirizzo non valido");
|
||||||
|
}
|
||||||
|
|
||||||
$stmt = $pdo->prepare("
|
$pdo->beginTransaction();
|
||||||
DELETE FROM indirizzo
|
|
||||||
WHERE
|
|
||||||
idIndirizzo = :idIndirizzo AND idCliente = :idCliente
|
|
||||||
");
|
|
||||||
$stmt->execute([
|
|
||||||
"idIndirizzo" => $idIndirizzo,
|
|
||||||
"idCliente" => $idCliente
|
|
||||||
]);
|
|
||||||
$pdo->commit();
|
|
||||||
|
|
||||||
$messaggio = "Indirizzo eliminato con successo";
|
$stmt = $pdo->prepare("
|
||||||
|
DELETE FROM indirizzo
|
||||||
|
WHERE
|
||||||
|
idIndirizzo = :idIndirizzo AND idCliente = :idCliente
|
||||||
|
");
|
||||||
|
$stmt->execute([
|
||||||
|
"idIndirizzo" => $idIndirizzo,
|
||||||
|
"idCliente" => $idCliente
|
||||||
|
]);
|
||||||
|
$pdo->commit();
|
||||||
|
|
||||||
break;
|
$messaggio = "Indirizzo eliminato con successo";
|
||||||
|
|
||||||
|
break;
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
|
||||||
|
if ($pdo -> inTransaction()) {
|
||||||
|
$pdo->rollBack();
|
||||||
|
}
|
||||||
|
|
||||||
|
$messaggio =
|
||||||
|
"Errore durante l'eliminazione dell'indirizzo" .
|
||||||
|
$e->getMessage();
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
$messaggio = "Azione non valida";
|
$messaggio = "Azione non valida";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (PDOException $e) {
|
|
||||||
if ($pdo->inTransaction()) {
|
|
||||||
$pdo->rollBack();
|
|
||||||
}
|
|
||||||
die(
|
|
||||||
"Errore durante l'aggiunta dell'indirizzo di consegna: "
|
|
||||||
. $e->getMessage()
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
$stmt = $pdo->prepare("
|
$stmt = $pdo->prepare("
|
||||||
SELECT
|
SELECT
|
||||||
indirizzo.idIndirizzo,
|
indirizzo.idIndirizzo,
|
||||||
indirizzo.via,
|
indirizzo.via,
|
||||||
indirizzo.numeroCivico,
|
indirizzo.numeroCivico,
|
||||||
indirizzo.predefinito,
|
indirizzo.predefinito,
|
||||||
comune.nome AS nomeComune,
|
comune.nome AS nomeComune,
|
||||||
provincia.sigla AS siglaProvincia
|
provincia.sigla AS siglaProvincia
|
||||||
|
|
||||||
FROM (indirizzo JOIN comune ON indirizzo.idComune = comune.idComune)
|
FROM (indirizzo JOIN comune ON indirizzo.idComune = comune.idComune)
|
||||||
JOIN provincia ON comune.idProvincia = provincia.idProvincia
|
JOIN provincia ON comune.idProvincia = provincia.idProvincia
|
||||||
|
|
||||||
WHERE idCliente = :idCliente
|
WHERE idCliente = :idCliente
|
||||||
");
|
");
|
||||||
$stmt->execute([
|
$stmt->execute([
|
||||||
"idCliente" => $idCliente
|
"idCliente" => $idCliente
|
||||||
]);
|
]);
|
||||||
$indirizzi = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
$indirizzi = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
$pageTitle = "Indirizzi"; $basePath = "..";
|
$pageTitle = "Indirizzi"; $basePath = "..";
|
||||||
require __DIR__ . "/../includes/header.php";
|
require __DIR__ . "/../includes/header.php";
|
||||||
?>
|
?>
|
||||||
<h1 class="h3">Indirizzi di consegna</h1>
|
<h1 class="h3">Indirizzi di consegna</h1>
|
||||||
<?php if ($messaggio): ?><div class="alert alert-warning"><?= e($messaggio) ?></div><?php endif; ?>
|
<?php if ($messaggio): ?><div class="alert alert-warning"><?= e($messaggio) ?></div><?php endif; ?>
|
||||||
|
|||||||
+38
-29
@@ -1,30 +1,33 @@
|
|||||||
<?php
|
<?php
|
||||||
require_once __DIR__ . "/../includes/auth.php";
|
require_once __DIR__ . "/../includes/auth.php";
|
||||||
requireRole("cliente");
|
requireRole("cliente");
|
||||||
require_once __DIR__ . "/../config/database.php";
|
require_once __DIR__ . "/../config/database.php";
|
||||||
|
|
||||||
$idCliente = (int) $_SESSION["idUtente"];
|
$idCliente = (int) $_SESSION["idUtente"];
|
||||||
$prodotti = [];
|
$prodotti = [];
|
||||||
|
|
||||||
$stmt = $pdo->prepare("
|
$stmt = $pdo->prepare("
|
||||||
SELECT
|
SELECT
|
||||||
prodotto.idProdotto,
|
prodotto.idProdotto,
|
||||||
prodotto.nome,
|
prodotto.nome,
|
||||||
prodotto.descrizione,
|
prodotto.descrizione,
|
||||||
prodotto.prezzoBase,
|
prodotto.prezzoBase,
|
||||||
caratteristica.nome AS nomeCaratteristica,
|
caratteristica.nome AS nomeCaratteristica,
|
||||||
caratteristica.differenzaPrezzo
|
caratteristica.differenzaPrezzo
|
||||||
|
|
||||||
FROM prodotto JOIN caratteristica ON prodotto.idProdotto = caratteristica.idProdotto
|
FROM prodotto JOIN caratteristica ON prodotto.idProdotto = caratteristica.idProdotto
|
||||||
");
|
");
|
||||||
$stmt->execute();
|
$stmt->execute();
|
||||||
$prodotti = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
$prodotti = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
$pageTitle = "Menu"; $basePath = "..";
|
$pageTitle = "Menu"; $basePath = "..";
|
||||||
require __DIR__ . "/../includes/header.php";
|
require __DIR__ . "/../includes/header.php";
|
||||||
?>
|
?>
|
||||||
<div class="d-flex justify-content-between align-items-center mb-3">
|
<div class="d-flex justify-content-between align-items-center mb-3">
|
||||||
<div><h1 class="h3 mb-1">Menu</h1><p class="text-muted mb-0">Prodotti disponibili e personalizzazioni.</p></div>
|
<div>
|
||||||
|
<h1 class="h3 mb-1">Menu</h1>
|
||||||
|
<p class="text-muted mb-0">Prodotti disponibili e personalizzazioni.</p>
|
||||||
|
</div>
|
||||||
<a class="btn btn-primary" href="ordine.php">Componi ordine</a>
|
<a class="btn btn-primary" href="ordine.php">Componi ordine</a>
|
||||||
</div>
|
</div>
|
||||||
<?php if (!$prodotti): ?>
|
<?php if (!$prodotti): ?>
|
||||||
@@ -32,15 +35,21 @@ require __DIR__ . "/../includes/header.php";
|
|||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
<div class="row g-3">
|
<div class="row g-3">
|
||||||
<?php foreach ($prodotti as $prodotto): ?>
|
<?php foreach ($prodotti as $prodotto): ?>
|
||||||
<div class="col-md-6"><div class="card h-100 shadow-sm"><div class="card-body">
|
<div class="col-md-6">
|
||||||
<h2 class="h5"><?= e($prodotto["nome"] ?? "") ?></h2>
|
<div class="card h-100 shadow-sm">
|
||||||
<p><?= e($prodotto["descrizione"] ?? "") ?></p>
|
<div class="card-body">
|
||||||
<span class="badge bg-primary">€ <?= e(number_format((float) ($prodotto["prezzoBase"] ?? 0), 2, ",", ".")) ?></span>
|
<h2 class="h5"><?= e($prodotto["nome"] ?? "") ?></h2>
|
||||||
<?php if (!empty($prodotto["nomeCaratteristica"])): ?>
|
<p><?= e($prodotto["descrizione"] ?? "") ?></p>
|
||||||
<hr><strong>Caratteristica:</strong> <?= e($prodotto["nomeCaratteristica"]) ?>
|
<span class="badge bg-primary">€ <?= e(number_format((float) ($prodotto["prezzoBase"] ?? 0), 2, ",", ".")) ?></span>
|
||||||
(+ € <?= e($prodotto["differenzaPrezzo"] ?? 0) ?>)
|
<?php if (!empty($prodotto["nomeCaratteristica"])): ?>
|
||||||
<?php endif; ?>
|
<hr>
|
||||||
</div></div></div>
|
<strong>Caratteristica:</strong>
|
||||||
|
<?= e($prodotto["nomeCaratteristica"]) ?>
|
||||||
|
(+ € <?= e($prodotto["differenzaPrezzo"] ?? 0) ?>)
|
||||||
|
<?php endif; ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</div>
|
</div>
|
||||||
<?php require __DIR__ . "/../includes/footer.php"; ?>
|
<?php require __DIR__ . "/../includes/footer.php"; ?>
|
||||||
|
|||||||
@@ -47,9 +47,6 @@
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
$ordini = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
$ordini = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
/* TODO SQL DI SUPPORTO - Elenco e stato degli ordini del cliente.
|
|
||||||
* Input: $idCliente. Output: idOrdine, dataOraCreazione, statoConferma,
|
|
||||||
* orarioConsegna, totale, tempoStimatoConsegna, nomeStato. */
|
|
||||||
$pageTitle = "I miei ordini"; $basePath = "..";
|
$pageTitle = "I miei ordini"; $basePath = "..";
|
||||||
require __DIR__ . "/../includes/header.php";
|
require __DIR__ . "/../includes/header.php";
|
||||||
?>
|
?>
|
||||||
|
|||||||
+69
-17
@@ -26,6 +26,7 @@
|
|||||||
$prodotti = []; // CARICATO
|
$prodotti = []; // CARICATO
|
||||||
$caratteristicheDisponibili = []; // CARICATO
|
$caratteristicheDisponibili = []; // CARICATO
|
||||||
$indirizzi = []; // CARICATO
|
$indirizzi = []; // CARICATO
|
||||||
|
$indirizzoPredefinito = null; // CARICATO
|
||||||
$righeOrdine = []; // CARICATO
|
$righeOrdine = []; // CARICATO
|
||||||
|
|
||||||
$riepilogo = null; // CARICATO
|
$riepilogo = null; // CARICATO
|
||||||
@@ -51,6 +52,29 @@
|
|||||||
|
|
||||||
$indirizzi = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
$indirizzi = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
|
$stmt = $pdo->prepare("
|
||||||
|
SELECT
|
||||||
|
indirizzo.idIndirizzo,
|
||||||
|
indirizzo.via,
|
||||||
|
indirizzo.numeroCivico,
|
||||||
|
indirizzo.predefinito,
|
||||||
|
indirizzo.idComune
|
||||||
|
|
||||||
|
FROM
|
||||||
|
indirizzo
|
||||||
|
|
||||||
|
WHERE
|
||||||
|
indirizzo.idCliente = :idCliente
|
||||||
|
AND indirizzo.predefinito = 1
|
||||||
|
|
||||||
|
LIMIT 1
|
||||||
|
");
|
||||||
|
|
||||||
|
$stmt->execute([
|
||||||
|
"idCliente" => $idCliente
|
||||||
|
]);
|
||||||
|
|
||||||
|
$indirizzoPredefinito = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
/* ============================================================
|
/* ============================================================
|
||||||
* EVENTUALE ORDINE IN BOZZA
|
* EVENTUALE ORDINE IN BOZZA
|
||||||
@@ -580,30 +604,29 @@
|
|||||||
");
|
");
|
||||||
|
|
||||||
$stmt->execute([
|
$stmt->execute([
|
||||||
"idOrdine" => $idOrdine,
|
|
||||||
"idCliente" => $idCliente,
|
|
||||||
"totale" => $totale,
|
"totale" => $totale,
|
||||||
"tempoPreparazione" => $tempoPreparazione
|
"tempoPreparazione" => $tempoPreparazione,
|
||||||
|
"idOrdine" => $idOrdine,
|
||||||
|
"idCliente" => $idCliente
|
||||||
]);
|
]);
|
||||||
|
|
||||||
// Creazione dello storicoStato e statoOrdine
|
|
||||||
$stmt = $pdo->prepare("
|
$stmt = $pdo->prepare("
|
||||||
INSERT
|
SELECT
|
||||||
INTO statoOrdine
|
MIN(so1.idStatoOrdine)
|
||||||
(
|
|
||||||
nomeStato,
|
FROM
|
||||||
posizione
|
statoOrdine AS so1
|
||||||
)
|
|
||||||
|
WHERE
|
||||||
VALUES (
|
so1.nomeStato = 'inserito'
|
||||||
'IN LAVORAZIONE',
|
|
||||||
1
|
LIMIT
|
||||||
)
|
1
|
||||||
");
|
");
|
||||||
|
|
||||||
$stmt->execute();
|
$stmt->execute();
|
||||||
|
|
||||||
$idStatoOrdine = $pdo->lastInsertId();
|
$idStatoOrdine = $stmt->fetchColumn();
|
||||||
|
|
||||||
$stmt = $pdo->prepare("
|
$stmt = $pdo->prepare("
|
||||||
INSERT
|
INSERT
|
||||||
@@ -834,7 +857,36 @@
|
|||||||
name="idIndirizzo"
|
name="idIndirizzo"
|
||||||
required
|
required
|
||||||
>
|
>
|
||||||
<option value="">Seleziona...</option>
|
<?php if ($indirizzoPredefinito === null): ?>
|
||||||
|
<option value="">Seleziona...</option>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<?php if ($indirizzoPredefinito !== null): ?>
|
||||||
|
<option
|
||||||
|
value="<?= e($indirizzoPredefinito["idIndirizzo"]) ?>"
|
||||||
|
select
|
||||||
|
>
|
||||||
|
<?= e($indirizzoPredefinito["via"] . " " . $indirizzoPredefinito["numeroCivico"]) ?>
|
||||||
|
<?= !empty($indirizzoPredefinito["predefinito"]) ? "(predefinito)" : "" ?>
|
||||||
|
</option>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
// Rimuovo l'indirizzo dagli indirizzi
|
||||||
|
<?php
|
||||||
|
if (
|
||||||
|
is_array($indirizzoPredefinito) &&
|
||||||
|
isset($indirizzoPredefinito["idIndirizzo"]) &&
|
||||||
|
isset($indirizzoPredefinito["via"]) &&
|
||||||
|
isset($indirizzoPredefinito["numeroCivico"])
|
||||||
|
) {
|
||||||
|
foreach ($indirizzi as $key => $i) {
|
||||||
|
if ($i["idIndirizzo"] == $indirizzoPredefinito["idIndirizzo"]) {
|
||||||
|
unset($indirizzi[$key]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
|
||||||
<?php foreach ($indirizzi as $i): ?>
|
<?php foreach ($indirizzi as $i): ?>
|
||||||
<option value="<?= e($i["idIndirizzo"]) ?>">
|
<option value="<?= e($i["idIndirizzo"]) ?>">
|
||||||
|
|||||||
+86
-16
@@ -1,20 +1,90 @@
|
|||||||
<?php
|
<?php
|
||||||
require_once __DIR__ . "/../includes/auth.php";
|
require_once __DIR__ . "/../includes/auth.php";
|
||||||
requireRole("personale");
|
requireRole("personale");
|
||||||
require_once __DIR__ . "/../config/database.php";
|
require_once __DIR__ . "/../config/database.php";
|
||||||
$idPersonale = (int) $_SESSION["idUtente"];
|
$idPersonale = (int) $_SESSION["idUtente"];
|
||||||
$conteggi = [];
|
$conteggi = [];
|
||||||
/*
|
|
||||||
* QUERY 11 - Conteggio degli ordini attivi divisi per stato di avanzamento
|
$stmt = $pdo->prepare("
|
||||||
* Input: nessuno (l'id $idPersonale è disponibile per il contesto UI)
|
SELECT
|
||||||
* Output atteso: idStatoOrdine, nomeStato, posizione, numeroOrdini
|
ss1.idOrdine,
|
||||||
* TODO SQL: implementare manualmente la Query 11.
|
ss1.idStatoOrdine,
|
||||||
*/
|
so1.nomeStato,
|
||||||
$pageTitle = "Dashboard personale"; $basePath = "..";
|
so1.posizione,
|
||||||
require __DIR__ . "/../includes/header.php";
|
conteggioOrdiniPerOrdine.numeroOrdini
|
||||||
|
|
||||||
|
FROM
|
||||||
|
storicoStato AS ss1
|
||||||
|
|
||||||
|
JOIN statoOrdine AS so1
|
||||||
|
ON ss1.idStatoOrdine = so1.idStatoOrdine
|
||||||
|
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT
|
||||||
|
o3.idOrdine,
|
||||||
|
COALESCE(
|
||||||
|
SUM(ro3.quantita),
|
||||||
|
0
|
||||||
|
) AS numeroOrdini
|
||||||
|
|
||||||
|
FROM
|
||||||
|
ordine AS o3
|
||||||
|
|
||||||
|
JOIN rigaOrdine AS ro3
|
||||||
|
ON o3.idOrdine = ro3.idOrdine
|
||||||
|
|
||||||
|
GROUP BY
|
||||||
|
o3.idOrdine
|
||||||
|
) AS conteggioOrdiniPerOrdine
|
||||||
|
ON ss1.idOrdine = conteggioOrdiniPerOrdine.idOrdine
|
||||||
|
|
||||||
|
WHERE
|
||||||
|
so1.posizione = (
|
||||||
|
SELECT
|
||||||
|
MAX(so2.posizione)
|
||||||
|
|
||||||
|
FROM
|
||||||
|
storicoStato AS ss2
|
||||||
|
|
||||||
|
JOIN statoOrdine AS so2
|
||||||
|
ON ss2.idStatoOrdine = so2.idStatoOrdine
|
||||||
|
|
||||||
|
WHERE
|
||||||
|
ss2.idOrdine = ss1.idOrdine
|
||||||
|
)
|
||||||
|
");
|
||||||
|
|
||||||
|
$stmt->execute();
|
||||||
|
|
||||||
|
$conteggi = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
|
$pageTitle = "Dashboard personale"; $basePath = "..";
|
||||||
|
require __DIR__ . "/../includes/header.php";
|
||||||
?>
|
?>
|
||||||
<h1 class="h3">Dashboard personale</h1><p>Panoramica degli ordini attivi.</p>
|
<h1 class="h3">Dashboard personale</h1>
|
||||||
<?php if (!$conteggi): ?><div class="alert alert-info">I conteggi saranno mostrati dopo l'implementazione della Query 11.</div><?php endif; ?>
|
<p>Panoramica degli ordini attivi.</p>
|
||||||
<div class="row g-3 mb-4"><?php foreach ($conteggi as $c): ?><div class="col-sm-6 col-lg"><div class="card text-center h-100 shadow-sm"><div class="card-body"><div class="display-6"><?= e($c["numeroOrdini"]) ?></div><div><?= e($c["nomeStato"]) ?></div></div></div></div><?php endforeach; ?></div>
|
<?php if (!$conteggi): ?>
|
||||||
|
<div class="alert alert-info">Non ci sono ordini!</div>
|
||||||
|
<?php endif; ?>
|
||||||
|
<div class="row g-3 mb-4">
|
||||||
|
<?php foreach ($conteggi as $c): ?>
|
||||||
|
<div class="col-sm-6 col-lg">
|
||||||
|
<div class="card text-center h-100 shadow-sm">
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="display-6">
|
||||||
|
<?= "N. Ordini: " . e($c["numeroOrdini"]) ?>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<?= "ID Ordine: " . e($c["idOrdine"]) ?>
|
||||||
|
<br>
|
||||||
|
<?= "Stato: " . e($c["nomeStato"]) ?>
|
||||||
|
<br>
|
||||||
|
<?= "Posizione: " . e($c["posizione"]) ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<?php endforeach; ?></div>
|
||||||
|
|
||||||
<a class="btn btn-primary" href="ordini.php">Apri gli ordini correnti</a>
|
<a class="btn btn-primary" href="ordini.php">Apri gli ordini correnti</a>
|
||||||
<?php require __DIR__ . "/../includes/footer.php"; ?>
|
<?php require __DIR__ . "/../includes/footer.php"; ?>
|
||||||
|
|||||||
@@ -1,33 +1,295 @@
|
|||||||
<?php
|
<?php
|
||||||
require_once __DIR__ . "/../includes/auth.php";
|
require_once __DIR__ . "/../includes/auth.php";
|
||||||
requireRole("personale");
|
requireRole("personale");
|
||||||
require_once __DIR__ . "/../config/database.php";
|
require_once __DIR__ . "/../config/database.php";
|
||||||
$idPersonale = (int) $_SESSION["idUtente"];
|
$idPersonale = (int) $_SESSION["idUtente"];
|
||||||
$idOrdine = filter_input(INPUT_GET, "idOrdine", FILTER_VALIDATE_INT) ?: filter_input(INPUT_POST, "idOrdine", FILTER_VALIDATE_INT);
|
$idOrdine = filter_input(INPUT_GET, "idOrdine", FILTER_VALIDATE_INT) ?: filter_input(INPUT_POST, "idOrdine", FILTER_VALIDATE_INT);
|
||||||
$idStatoOrdine = filter_input(INPUT_POST, "idStatoOrdine", FILTER_VALIDATE_INT);
|
$idStatoOrdine = filter_input(INPUT_POST, "idStatoOrdine", FILTER_VALIDATE_INT);
|
||||||
$ordine = null; $righe = []; $storico = []; $statoSuccessivo = null; $messaggio = null;
|
$ordine = null; // CARICATO
|
||||||
/* TODO SQL DI SUPPORTO - Caricare testata, righe con caratteristiche,
|
$righe = []; // CARICATO
|
||||||
* ingredienti/procedura, indirizzo, stato corrente e storico dell'ordine.
|
$caratteristiche = []; // CARICATO
|
||||||
* Input: $idOrdine. Output: attributi omonimi dello schema e nomi descrittivi. */
|
$storico = []; // CARICATO
|
||||||
if (postMethod()) {
|
$statoSuccessivo = null; // CARICATO
|
||||||
/*
|
$messaggio = $_SESSION["messaggio"] ?? null;
|
||||||
* QUERY 14 - Aggiornamento progressivo dello stato di un ordine
|
unset($_SESSION["messaggio"]);
|
||||||
* Input: $idOrdine, $idStatoOrdine, $idPersonale
|
|
||||||
* Output: nuovo nomeStato, posizione e timestamp registrato
|
// Recupero l'ordine
|
||||||
* Vincolo UI/DB: solo il successore dello stato corrente; mai regressioni.
|
$stmt = $pdo->prepare("
|
||||||
* TODO SQL: implementare manualmente la Query 14.
|
SELECT
|
||||||
*/
|
uso.idOrdine,
|
||||||
$messaggio = "Query 14 predisposta: stato non ancora aggiornato.";
|
uso.idStatoOrdine,
|
||||||
}
|
uso.nomeStato,
|
||||||
$pageTitle = "Dettaglio ordine"; $basePath = "..";
|
uso.posizione
|
||||||
require __DIR__ . "/../includes/header.php";
|
|
||||||
|
FROM
|
||||||
|
ultimoStatoOrdini AS uso
|
||||||
|
|
||||||
|
WHERE
|
||||||
|
uso.idOrdine = :idOrdine
|
||||||
|
");
|
||||||
|
|
||||||
|
$stmt->execute([
|
||||||
|
"idOrdine" => $idOrdine
|
||||||
|
]);
|
||||||
|
|
||||||
|
$ordine = $stmt->fetch(PDO::FETCH_ASSOC) ?: null;
|
||||||
|
|
||||||
|
// Recupero delle righe
|
||||||
|
$stmt = $pdo->prepare("
|
||||||
|
SELECT
|
||||||
|
ro1.idRigaOrdine,
|
||||||
|
p1.nome AS nomeProdotto,
|
||||||
|
ro1.quantita,
|
||||||
|
p1.proceduraPreparazione
|
||||||
|
|
||||||
|
FROM
|
||||||
|
rigaOrdine AS ro1
|
||||||
|
|
||||||
|
JOIN prodotto AS p1
|
||||||
|
ON ro1.idProdotto = p1.idProdotto
|
||||||
|
|
||||||
|
WHERE
|
||||||
|
ro1.idOrdine = :idOrdine
|
||||||
|
");
|
||||||
|
|
||||||
|
$stmt->execute([
|
||||||
|
"idOrdine" => $idOrdine
|
||||||
|
]);
|
||||||
|
|
||||||
|
$righe = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
|
// Recupero delle caratteristiche
|
||||||
|
$stmt = $pdo->prepare("
|
||||||
|
SELECT
|
||||||
|
ro1.idRigaOrdine,
|
||||||
|
GROUP_CONCAT(
|
||||||
|
CONCAT(c1.nome, ' - ', c1.descrizione)
|
||||||
|
SEPARATOR ', '
|
||||||
|
) AS caratteristiche
|
||||||
|
|
||||||
|
FROM
|
||||||
|
rigaOrdine AS ro1
|
||||||
|
|
||||||
|
JOIN rigaOrdineSelezionaCaratteristica AS rosc1
|
||||||
|
ON ro1.idRigaOrdine = rosc1.idRigaOrdine
|
||||||
|
|
||||||
|
JOIN caratteristica AS c1
|
||||||
|
ON rosc1.idCaratteristica = c1.idCaratteristica
|
||||||
|
|
||||||
|
WHERE
|
||||||
|
ro1.idOrdine = :idOrdine
|
||||||
|
|
||||||
|
GROUP BY
|
||||||
|
ro1.idRigaOrdine
|
||||||
|
|
||||||
|
");
|
||||||
|
|
||||||
|
$stmt->execute([
|
||||||
|
"idOrdine" => $idOrdine
|
||||||
|
]);
|
||||||
|
|
||||||
|
$caratteristiche = $stmt->fetchAll(PDO::FETCH_KEY_PAIR);
|
||||||
|
|
||||||
|
// Recupero lo storico
|
||||||
|
$stmt = $pdo->prepare("
|
||||||
|
SELECT
|
||||||
|
statoOrdini.timestamp,
|
||||||
|
statoOrdini.nomeStato,
|
||||||
|
statoOrdini.nomePersonale,
|
||||||
|
statoOrdini.cognomePersonale
|
||||||
|
|
||||||
|
FROM
|
||||||
|
statoOrdini
|
||||||
|
|
||||||
|
WHERE
|
||||||
|
statoOrdini.idOrdine = :idOrdine
|
||||||
|
");
|
||||||
|
|
||||||
|
$stmt->execute([
|
||||||
|
"idOrdine" => $idOrdine
|
||||||
|
]);
|
||||||
|
|
||||||
|
$storico = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
|
// Recupero dello stato successivo
|
||||||
|
$stmt = $pdo->prepare("
|
||||||
|
SELECT
|
||||||
|
uso.idOrdine,
|
||||||
|
so1.idStatoOrdine,
|
||||||
|
so1.nomeStato,
|
||||||
|
so1.posizione
|
||||||
|
|
||||||
|
FROM
|
||||||
|
ultimoStatoOrdini AS uso
|
||||||
|
|
||||||
|
JOIN statoOrdine AS so1
|
||||||
|
ON so1.posizione = (
|
||||||
|
SELECT
|
||||||
|
MIN(so2.posizione)
|
||||||
|
|
||||||
|
FROM
|
||||||
|
statoOrdine AS so2
|
||||||
|
|
||||||
|
WHERE
|
||||||
|
so2.posizione > uso.posizione
|
||||||
|
)
|
||||||
|
|
||||||
|
WHERE
|
||||||
|
uso.idOrdine = :idOrdine
|
||||||
|
");
|
||||||
|
|
||||||
|
$stmt->execute([
|
||||||
|
"idOrdine" => $idOrdine
|
||||||
|
]);
|
||||||
|
|
||||||
|
$statoSuccessivo = $stmt->fetch(PDO::FETCH_ASSOC) ?: null;
|
||||||
|
|
||||||
|
if (postMethod()) {
|
||||||
|
|
||||||
|
// Controllo input
|
||||||
|
if (
|
||||||
|
$idOrdine === null || $idOrdine === false ||
|
||||||
|
$idStatoOrdine === null || $idStatoOrdine === false ||
|
||||||
|
$idPersonale <= 0
|
||||||
|
) {
|
||||||
|
$messaggio = "Errore: dati non validi per l'aggiornamento dello stato.";
|
||||||
|
} else {
|
||||||
|
// Aggiornamento dello stato attuale
|
||||||
|
try {
|
||||||
|
|
||||||
|
$pdo->beginTransaction();
|
||||||
|
|
||||||
|
// Ottengo il nuovo stato
|
||||||
|
$idStatoOrdineSuccessivo = $statoSuccessivo["idStatoOrdine"] ?? null;
|
||||||
|
|
||||||
|
$stmt = $pdo->prepare("
|
||||||
|
INSERT
|
||||||
|
INTO storicoStato
|
||||||
|
(
|
||||||
|
timestamp,
|
||||||
|
idOrdine,
|
||||||
|
idStatoOrdine,
|
||||||
|
idPersonale
|
||||||
|
)
|
||||||
|
|
||||||
|
VALUES (
|
||||||
|
NOW(),
|
||||||
|
:idOrdine,
|
||||||
|
:idStatoOrdine,
|
||||||
|
:idPersonale
|
||||||
|
)
|
||||||
|
");
|
||||||
|
|
||||||
|
$stmt->execute([
|
||||||
|
"idOrdine" => $idOrdine,
|
||||||
|
"idStatoOrdine" => $idStatoOrdineSuccessivo,
|
||||||
|
"idPersonale" => $idPersonale
|
||||||
|
]);
|
||||||
|
|
||||||
|
$pdo->commit();
|
||||||
|
|
||||||
|
// Pulizia
|
||||||
|
header("Location: dettaglio_ordine.php?idOrdine=" . $idOrdine);
|
||||||
|
|
||||||
|
// Messaggio
|
||||||
|
$_SESSION["messaggio"] = "Ordine aggiornato con successo";
|
||||||
|
|
||||||
|
exit;
|
||||||
|
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
|
||||||
|
if ($pdo -> inTransaction()) {
|
||||||
|
$pdo -> rollback();
|
||||||
|
}
|
||||||
|
|
||||||
|
$messaggio =
|
||||||
|
"Errore durante l'aggiornamento dello stato dell'ordine" .
|
||||||
|
$e -> getMessage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
$pageTitle = "Dettaglio ordine"; $basePath = "..";
|
||||||
|
require __DIR__ . "/../includes/header.php";
|
||||||
?>
|
?>
|
||||||
<div class="d-flex justify-content-between"><h1 class="h3">Ordine #<?= e($idOrdine ?: "—") ?></h1><a class="btn btn-outline-secondary" href="ordini.php">Indietro</a></div>
|
|
||||||
<?php if (!$idOrdine): ?><div class="alert alert-danger">Specificare un ID ordine valido.</div><?php endif; ?>
|
<div class="d-flex justify-content-between">
|
||||||
<?php if ($messaggio): ?><div class="alert alert-warning"><?= e($messaggio) ?></div><?php endif; ?>
|
<h1 class="h3">Ordine #<?= e($idOrdine ?: "—") ?></h1>
|
||||||
<?php if (!$ordine): ?><div class="alert alert-info">Il dettaglio sarà disponibile dopo il TODO SQL di supporto.</div><?php endif; ?>
|
<a class="btn btn-outline-secondary" href="ordini.php">Indietro</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php if (!$idOrdine): ?>
|
||||||
|
<div class="alert alert-danger">Specificare un ID ordine valido.</div>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<?php if ($messaggio): ?>
|
||||||
|
<div class="alert alert-warning"><?= e($messaggio) ?></div>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<?php if (!$ordine): ?>
|
||||||
|
<div class="alert alert-info">Il dettaglio sarà disponibile dopo il TODO SQL di supporto.</div>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
<div class="row g-4"><div class="col-lg-8">
|
<div class="row g-4"><div class="col-lg-8">
|
||||||
<div class="card shadow-sm mb-3"><div class="card-body"><h2 class="h5">Preparazione</h2><table class="table"><thead><tr><th>Prodotto</th><th>Qtà</th><th>Caratteristiche</th><th>Procedura</th></tr></thead><tbody><?php foreach ($righe as $r): ?><tr><td><?= e($r["nomeProdotto"]) ?></td><td><?= e($r["quantita"]) ?></td><td><?= e($r["caratteristiche"] ?? "—") ?></td><td><?= e($r["proceduraPreparazione"] ?? "—") ?></td></tr><?php endforeach; ?></tbody></table></div></div>
|
<div class="card shadow-sm mb-3">
|
||||||
<div class="card shadow-sm"><div class="card-body"><h2 class="h5">Storico stati</h2><ol class="mb-0"><?php foreach ($storico as $s): ?><li><?= e($s["timestamp"]) ?> — <?= e($s["nomeStato"]) ?> (<?= e(($s["nomePersonale"] ?? "") . " " . ($s["cognomePersonale"] ?? "")) ?>)</li><?php endforeach; ?></ol></div></div>
|
<div class="card-body">
|
||||||
</div><div class="col-lg-4"><div class="card shadow-sm"><div class="card-body"><h2 class="h5">Avanzamento</h2><p>Corrente: <span class="badge bg-primary"><?= e($ordine["nomeStato"] ?? "—") ?></span></p><p class="small text-muted">Progressione: inserito → in preparazione → pronto → in consegna → consegnato.</p><form method="post"><input type="hidden" name="idOrdine" value="<?= e($idOrdine) ?>"><input type="hidden" name="idStatoOrdine" value="<?= e($statoSuccessivo["idStatoOrdine"] ?? "") ?>"><button class="btn btn-success w-100" <?= $statoSuccessivo ? "" : "disabled" ?>>Passa a: <?= e($statoSuccessivo["nomeStato"] ?? "nessuno") ?></button></form></div></div></div></div>
|
<h2 class="h5">Preparazione</h2>
|
||||||
|
<table class="table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Prodotto</th>
|
||||||
|
<th>Qtà</th>
|
||||||
|
<th>Caratteristiche</th>
|
||||||
|
<th>Procedura</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<?php foreach ($righe as $r): ?>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<?= e($r["nomeProdotto"]) ?>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<?= e($r["quantita"]) ?>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<?= e($caratteristiche[$r["idRigaOrdine"]] ?? "—") ?>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<?= e($r["proceduraPreparazione"] ?? "—") ?>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card shadow-sm">
|
||||||
|
<div class="card-body">
|
||||||
|
<h2 class="h5">Storico stati</h2>
|
||||||
|
<ol class="mb-0">
|
||||||
|
<?php foreach ($storico as $s): ?>
|
||||||
|
<li><?= e($s["timestamp"]) ?> — <?= e($s["nomeStato"]) ?> (<?= e(($s["nomePersonale"] ?? "") . " " . ($s["cognomePersonale"] ?? "")) ?>)</li>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</ol>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-4">
|
||||||
|
<div class="card shadow-sm">
|
||||||
|
<div class="card-body">
|
||||||
|
<h2 class="h5">Avanzamento</h2>
|
||||||
|
<p>Corrente: <span class="badge bg-primary"><?= e($ordine["nomeStato"] ?? "—") ?></span></p>
|
||||||
|
<p class="small text-muted">Progressione: inserito → in preparazione → pronto → in consegna → consegnato.</p>
|
||||||
|
<form method="post">
|
||||||
|
<input type="hidden" name="idOrdine" value="<?= e($idOrdine) ?>">
|
||||||
|
<input type="hidden" name="idStatoOrdine" value="<?= e($statoSuccessivo["idStatoOrdine"] ?? "") ?>">
|
||||||
|
<button class="btn btn-success w-100" <?= $statoSuccessivo ? "" : "disabled" ?>>Passa a: <?= e($statoSuccessivo["nomeStato"] ?? "nessuno") ?></button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<?php require __DIR__ . "/../includes/footer.php"; ?>
|
<?php require __DIR__ . "/../includes/footer.php"; ?>
|
||||||
|
|||||||
+607
-22
@@ -1,24 +1,609 @@
|
|||||||
<?php
|
<?php
|
||||||
require_once __DIR__ . "/../includes/auth.php";
|
|
||||||
requireRole("personale");
|
require_once __DIR__ . "/../includes/auth.php";
|
||||||
require_once __DIR__ . "/../config/database.php";
|
|
||||||
$idPersonale = (int) $_SESSION["idUtente"];
|
requireRole("personale");
|
||||||
$soloInRitardo = ($_GET["filtro"] ?? "") === "ritardo";
|
|
||||||
$ordini = [];
|
require_once __DIR__ . "/../config/database.php";
|
||||||
/*
|
|
||||||
* QUERY 5 - Ordini non ancora messi in preparazione dopo più di un'ora
|
$idPersonale = (int) $_SESSION["idUtente"];
|
||||||
* Input: nessuno; $soloInRitardo controlla la vista richiesta dalla UI
|
|
||||||
* Output atteso: idOrdine, dataOraCreazione, orarioConsegna, totale,
|
$soloInRitardo = ($_GET["filtro"] ?? "") === "ritardo";
|
||||||
* nomeCliente, cognomeCliente, via, numeroCivico, nomeComune,
|
|
||||||
* nomeStato, timestampUltimoStato, minutiAttesa
|
$ordini = [];
|
||||||
* TODO SQL: implementare manualmente la Query 5.
|
|
||||||
*/
|
$stmt = $pdo->prepare("
|
||||||
/* Per la vista completa degli ordini correnti predisporre inoltre una query
|
SELECT
|
||||||
* di supporto con gli stessi campi, senza il vincolo "oltre un'ora". */
|
o1.idOrdine,
|
||||||
$pageTitle = "Ordini correnti"; $basePath = "..";
|
o1.dataOraCreazione,
|
||||||
require __DIR__ . "/../includes/header.php";
|
o1.orarioConsegna,
|
||||||
|
o1.totale,
|
||||||
|
o1.idCliente,
|
||||||
|
o1.idIndirizzo,
|
||||||
|
abitazione.via,
|
||||||
|
abitazione.numeroCivico,
|
||||||
|
abitazione.nomeComune,
|
||||||
|
clienti.nome AS nomeCliente,
|
||||||
|
clienti.cognome AS cognomeCliente,
|
||||||
|
stati.nomeStato,
|
||||||
|
stati.timestampUltimoStato,
|
||||||
|
TIMESTAMPDIFF(
|
||||||
|
MINUTE,
|
||||||
|
stati.timestampUltimoStato,
|
||||||
|
CURRENT_TIMESTAMP
|
||||||
|
) AS minutiAttesa
|
||||||
|
|
||||||
|
FROM
|
||||||
|
ordine AS o1
|
||||||
|
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT
|
||||||
|
ss2.idOrdine,
|
||||||
|
so2.nomeStato,
|
||||||
|
ss2.timestamp AS timestampUltimoStato
|
||||||
|
|
||||||
|
FROM
|
||||||
|
storicoStato AS ss2
|
||||||
|
|
||||||
|
JOIN statoOrdine AS so2
|
||||||
|
ON ss2.idStatoOrdine = so2.idStatoOrdine
|
||||||
|
|
||||||
|
WHERE
|
||||||
|
so2.posizione = (
|
||||||
|
SELECT
|
||||||
|
MAX(so3.posizione)
|
||||||
|
|
||||||
|
FROM
|
||||||
|
storicoStato AS ss3
|
||||||
|
|
||||||
|
JOIN statoOrdine AS so3
|
||||||
|
ON ss3.idStatoOrdine = so3.idStatoOrdine
|
||||||
|
|
||||||
|
WHERE
|
||||||
|
ss3.idOrdine = ss2.idOrdine
|
||||||
|
)
|
||||||
|
) AS stati
|
||||||
|
ON o1.idOrdine = stati.idOrdine
|
||||||
|
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT
|
||||||
|
c4.idUtente,
|
||||||
|
u4.nome,
|
||||||
|
u4.cognome
|
||||||
|
|
||||||
|
FROM
|
||||||
|
cliente AS c4
|
||||||
|
|
||||||
|
JOIN utente AS u4
|
||||||
|
ON u4.idUtente = c4.idUtente
|
||||||
|
) AS clienti
|
||||||
|
ON o1.idCliente = clienti.idUtente
|
||||||
|
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT
|
||||||
|
i5.idIndirizzo,
|
||||||
|
i5.via,
|
||||||
|
i5.numeroCivico,
|
||||||
|
c5.nome AS nomeComune
|
||||||
|
|
||||||
|
FROM
|
||||||
|
indirizzo AS i5
|
||||||
|
|
||||||
|
JOIN comune AS c5
|
||||||
|
ON i5.idComune = c5.idComune
|
||||||
|
) AS abitazione
|
||||||
|
ON o1.idIndirizzo = abitazione.idIndirizzo
|
||||||
|
|
||||||
|
WHERE
|
||||||
|
1
|
||||||
|
");
|
||||||
|
|
||||||
|
$stmt->execute();
|
||||||
|
|
||||||
|
$ordini = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
|
|
||||||
|
// Dati di riepilogo ottenuti dagli ordini già caricati
|
||||||
|
$numeroOrdini = count($ordini);
|
||||||
|
|
||||||
|
$numeroInRitardo = count(
|
||||||
|
array_filter(
|
||||||
|
$ordini,
|
||||||
|
function ($ordine) {
|
||||||
|
return isset($ordine["minutiAttesa"])
|
||||||
|
&& (int) $ordine["minutiAttesa"] >= 60;
|
||||||
|
}
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
$valoreTotaleOrdini = array_sum(
|
||||||
|
array_map(
|
||||||
|
function ($ordine) {
|
||||||
|
return (float) ($ordine["totale"] ?? 0);
|
||||||
|
},
|
||||||
|
$ordini
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
$pageTitle = "Ordini correnti";
|
||||||
|
$basePath = "..";
|
||||||
|
|
||||||
|
require __DIR__ . "/../includes/header.php";
|
||||||
|
|
||||||
?>
|
?>
|
||||||
<div class="d-flex justify-content-between align-items-center mb-3"><h1 class="h3">Ordini correnti</h1><div><a class="btn btn-outline-secondary" href="ordini.php">Tutti</a> <a class="btn btn-warning" href="?filtro=ritardo">In attesa da oltre un'ora (Q5)</a></div></div>
|
|
||||||
<?php if (!$ordini): ?><div class="alert alert-info">Nessun risultato: completare la Query 5 o il caricamento di supporto.</div><?php endif; ?>
|
|
||||||
<div class="table-responsive"><table class="table table-striped align-middle"><thead><tr><th>Ordine</th><th>Cliente</th><th>Creato</th><th>Stato</th><th>Attesa</th><th>Consegna</th><th></th></tr></thead><tbody><?php foreach ($ordini as $o): ?><tr><td>#<?= e($o["idOrdine"]) ?></td><td><?= e(($o["nomeCliente"] ?? "") . " " . ($o["cognomeCliente"] ?? "")) ?></td><td><?= e($o["dataOraCreazione"]) ?></td><td><span class="badge bg-secondary"><?= e($o["nomeStato"]) ?></span></td><td><?= e($o["minutiAttesa"] ?? "—") ?> min</td><td><?= e($o["orarioConsegna"]) ?></td><td><a class="btn btn-sm btn-primary" href="dettaglio_ordine.php?idOrdine=<?= e($o["idOrdine"]) ?>">Dettaglio</a></td></tr><?php endforeach; ?></tbody></table></div>
|
<div class="d-flex justify-content-between align-items-center mb-4">
|
||||||
<?php require __DIR__ . "/../includes/footer.php"; ?>
|
|
||||||
|
<div>
|
||||||
|
<h1 class="h3 mb-1">
|
||||||
|
Ordini correnti
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<div class="text-muted">
|
||||||
|
Gestione degli ordini attualmente presenti nel sistema
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<a
|
||||||
|
class="btn btn-outline-secondary"
|
||||||
|
href="ordini.php"
|
||||||
|
>
|
||||||
|
Tutti
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<a
|
||||||
|
class="btn btn-warning"
|
||||||
|
href="?filtro=ritardo"
|
||||||
|
>
|
||||||
|
In attesa da oltre un'ora (Q5)
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- RIEPILOGO -->
|
||||||
|
|
||||||
|
<div class="row g-3 mb-4">
|
||||||
|
|
||||||
|
<div class="col-md-4">
|
||||||
|
|
||||||
|
<div class="card shadow-sm h-100">
|
||||||
|
|
||||||
|
<div class="card-body">
|
||||||
|
|
||||||
|
<div class="text-muted small">
|
||||||
|
Ordini visualizzati
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="fs-3 fw-bold">
|
||||||
|
<?= e($numeroOrdini) ?>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="col-md-4">
|
||||||
|
|
||||||
|
<div class="card shadow-sm h-100">
|
||||||
|
|
||||||
|
<div class="card-body">
|
||||||
|
|
||||||
|
<div class="text-muted small">
|
||||||
|
In attesa da almeno 60 minuti
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="fs-3 fw-bold text-danger">
|
||||||
|
<?= e($numeroInRitardo) ?>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="col-md-4">
|
||||||
|
|
||||||
|
<div class="card shadow-sm h-100">
|
||||||
|
|
||||||
|
<div class="card-body">
|
||||||
|
|
||||||
|
<div class="text-muted small">
|
||||||
|
Valore complessivo
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="fs-3 fw-bold">
|
||||||
|
<?= number_format(
|
||||||
|
$valoreTotaleOrdini,
|
||||||
|
2,
|
||||||
|
",",
|
||||||
|
"."
|
||||||
|
) ?> €
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<?php if (!$ordini): ?>
|
||||||
|
|
||||||
|
<div class="alert alert-info">
|
||||||
|
Nessun risultato: completare la Query 5 o il caricamento di supporto.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php else: ?>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="card shadow-sm">
|
||||||
|
|
||||||
|
<div class="card-header">
|
||||||
|
|
||||||
|
<strong>
|
||||||
|
Elenco ordini
|
||||||
|
</strong>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="table-responsive">
|
||||||
|
|
||||||
|
<table class="table table-hover align-middle mb-0">
|
||||||
|
|
||||||
|
<thead class="table-light">
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
|
||||||
|
<th>
|
||||||
|
Ordine
|
||||||
|
</th>
|
||||||
|
|
||||||
|
<th>
|
||||||
|
Cliente
|
||||||
|
</th>
|
||||||
|
|
||||||
|
<th>
|
||||||
|
Indirizzo
|
||||||
|
</th>
|
||||||
|
|
||||||
|
<th>
|
||||||
|
Creato
|
||||||
|
</th>
|
||||||
|
|
||||||
|
<th>
|
||||||
|
Stato
|
||||||
|
</th>
|
||||||
|
|
||||||
|
<th>
|
||||||
|
Ultimo aggiornamento
|
||||||
|
</th>
|
||||||
|
|
||||||
|
<th>
|
||||||
|
Attesa
|
||||||
|
</th>
|
||||||
|
|
||||||
|
<th>
|
||||||
|
Consegna
|
||||||
|
</th>
|
||||||
|
|
||||||
|
<th class="text-end">
|
||||||
|
Totale
|
||||||
|
</th>
|
||||||
|
|
||||||
|
<th>
|
||||||
|
</th>
|
||||||
|
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
</thead>
|
||||||
|
|
||||||
|
|
||||||
|
<tbody>
|
||||||
|
|
||||||
|
<?php foreach ($ordini as $o): ?>
|
||||||
|
|
||||||
|
|
||||||
|
<?php
|
||||||
|
|
||||||
|
$minutiAttesa = null;
|
||||||
|
|
||||||
|
if (isset($o["minutiAttesa"])) {
|
||||||
|
$minutiAttesa = (int) $o["minutiAttesa"];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Colore badge attesa
|
||||||
|
|
||||||
|
if ($minutiAttesa === null) {
|
||||||
|
|
||||||
|
$classeAttesa = "bg-secondary";
|
||||||
|
|
||||||
|
} elseif ($minutiAttesa >= 60) {
|
||||||
|
|
||||||
|
$classeAttesa = "bg-danger";
|
||||||
|
|
||||||
|
} elseif ($minutiAttesa >= 30) {
|
||||||
|
|
||||||
|
$classeAttesa = "bg-warning text-dark";
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
$classeAttesa = "bg-success";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Colore badge stato
|
||||||
|
|
||||||
|
switch ($o["nomeStato"] ?? "") {
|
||||||
|
|
||||||
|
case "inserito":
|
||||||
|
$classeStato = "bg-secondary";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "in preparazione":
|
||||||
|
$classeStato = "bg-warning text-dark";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "pronto":
|
||||||
|
$classeStato = "bg-info text-dark";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "in consegna":
|
||||||
|
$classeStato = "bg-primary";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "consegnato":
|
||||||
|
$classeStato = "bg-success";
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
$classeStato = "bg-secondary";
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
|
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- ID ORDINE -->
|
||||||
|
|
||||||
|
<td>
|
||||||
|
|
||||||
|
<strong>
|
||||||
|
#<?= e($o["idOrdine"]) ?>
|
||||||
|
</strong>
|
||||||
|
|
||||||
|
</td>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- CLIENTE -->
|
||||||
|
|
||||||
|
<td>
|
||||||
|
|
||||||
|
<div class="fw-semibold">
|
||||||
|
|
||||||
|
<?= e(
|
||||||
|
($o["nomeCliente"] ?? "")
|
||||||
|
. " "
|
||||||
|
. ($o["cognomeCliente"] ?? "")
|
||||||
|
) ?>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="small text-muted">
|
||||||
|
|
||||||
|
Cliente #<?= e($o["idCliente"]) ?>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</td>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- INDIRIZZO -->
|
||||||
|
|
||||||
|
<td>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
|
||||||
|
<?= e(
|
||||||
|
($o["via"] ?? "")
|
||||||
|
. " "
|
||||||
|
. ($o["numeroCivico"] ?? "")
|
||||||
|
) ?>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="small text-muted">
|
||||||
|
|
||||||
|
<?= e(
|
||||||
|
$o["nomeComune"] ?? ""
|
||||||
|
) ?>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</td>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- DATA CREAZIONE -->
|
||||||
|
|
||||||
|
<td>
|
||||||
|
|
||||||
|
<?php if (!empty($o["dataOraCreazione"])): ?>
|
||||||
|
|
||||||
|
<?= e(
|
||||||
|
date(
|
||||||
|
"d/m/Y H:i",
|
||||||
|
strtotime(
|
||||||
|
$o["dataOraCreazione"]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
) ?>
|
||||||
|
|
||||||
|
<?php else: ?>
|
||||||
|
|
||||||
|
<span class="text-muted">
|
||||||
|
—
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
</td>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- STATO -->
|
||||||
|
|
||||||
|
<td>
|
||||||
|
|
||||||
|
<span class="badge <?= $classeStato ?>">
|
||||||
|
|
||||||
|
<?= e(
|
||||||
|
$o["nomeStato"] ?? "Sconosciuto"
|
||||||
|
) ?>
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
</td>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- TIMESTAMP ULTIMO STATO -->
|
||||||
|
|
||||||
|
<td>
|
||||||
|
|
||||||
|
<?php if (!empty($o["timestampUltimoStato"])): ?>
|
||||||
|
|
||||||
|
<?= e(
|
||||||
|
date(
|
||||||
|
"d/m/Y H:i",
|
||||||
|
strtotime(
|
||||||
|
$o["timestampUltimoStato"]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
) ?>
|
||||||
|
|
||||||
|
<?php else: ?>
|
||||||
|
|
||||||
|
<span class="text-muted">
|
||||||
|
—
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
</td>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- MINUTI ATTESA -->
|
||||||
|
|
||||||
|
<td>
|
||||||
|
|
||||||
|
<?php if ($minutiAttesa !== null): ?>
|
||||||
|
|
||||||
|
<span class="badge <?= $classeAttesa ?>">
|
||||||
|
|
||||||
|
<?= e($minutiAttesa) ?> min
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<?php else: ?>
|
||||||
|
|
||||||
|
<span class="text-muted">
|
||||||
|
—
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
</td>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- ORARIO CONSEGNA -->
|
||||||
|
|
||||||
|
<td>
|
||||||
|
|
||||||
|
<?php if (!empty($o["orarioConsegna"])): ?>
|
||||||
|
|
||||||
|
<?= e(
|
||||||
|
date(
|
||||||
|
"d/m/Y H:i",
|
||||||
|
strtotime(
|
||||||
|
$o["orarioConsegna"]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
) ?>
|
||||||
|
|
||||||
|
<?php else: ?>
|
||||||
|
|
||||||
|
<span class="text-muted">
|
||||||
|
Non definita
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
</td>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- TOTALE -->
|
||||||
|
|
||||||
|
<td class="text-end fw-semibold">
|
||||||
|
|
||||||
|
<?= number_format(
|
||||||
|
(float) ($o["totale"] ?? 0),
|
||||||
|
2,
|
||||||
|
",",
|
||||||
|
"."
|
||||||
|
) ?> €
|
||||||
|
|
||||||
|
</td>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- DETTAGLIO -->
|
||||||
|
|
||||||
|
<td class="text-end">
|
||||||
|
|
||||||
|
<a
|
||||||
|
class="btn btn-sm btn-primary"
|
||||||
|
href="dettaglio_ordine.php?idOrdine=<?= e($o["idOrdine"]) ?>"
|
||||||
|
>
|
||||||
|
Dettaglio
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</td>
|
||||||
|
|
||||||
|
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
|
||||||
|
<?php endforeach; ?>
|
||||||
|
|
||||||
|
</tbody>
|
||||||
|
|
||||||
|
</table>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
|
||||||
|
<?php
|
||||||
|
|
||||||
|
require __DIR__ . "/../includes/footer.php";
|
||||||
|
|
||||||
|
?>
|
||||||
+175
-17
@@ -1,20 +1,178 @@
|
|||||||
<?php
|
<?php
|
||||||
require_once __DIR__."/../includes/auth.php";requireRole("proprietario");require_once __DIR__."/../config/database.php";
|
require_once __DIR__."/../includes/auth.php";requireRole("proprietario");require_once __DIR__."/../config/database.php";
|
||||||
$idOrdine=filter_input(INPUT_GET,"idOrdine",FILTER_VALIDATE_INT);$stato=trim($_GET["stato"]??"");$ordini=[];$personaleOrdine=[];
|
$idOrdine=filter_input(INPUT_GET,"idOrdine",FILTER_VALIDATE_INT);
|
||||||
/* TODO SQL DI SUPPORTO - Monitorare ordini passati, attivi ed evasi.
|
$stato=trim($_GET["stato"]??"");
|
||||||
* Input: $stato. Output: idOrdine, cliente, dataOraCreazione, statoConferma,
|
$ordini=[];
|
||||||
* nomeStato, orarioConsegna, totale, indirizzo. */
|
$personaleOrdine=[];
|
||||||
if($idOrdine){
|
|
||||||
/*
|
// Ricavo gli ordini
|
||||||
* QUERY 13 - Membri del personale che hanno lavorato a un ordine
|
$stmt = $pdo->prepare("
|
||||||
* Input: $idOrdine
|
SELECT
|
||||||
* Output atteso: idUtente, nome, cognome, email, numeroCambiStato,
|
o1.idOrdine,
|
||||||
* primoIntervento, ultimoIntervento
|
CONCAT(u1.nome, ' ', u1.cognome) AS cliente,
|
||||||
* TODO SQL: implementare manualmente la Query 13.
|
o1.dataOraCreazione,
|
||||||
*/}
|
o1.statoConferma,
|
||||||
$pageTitle="Monitoraggio ordini";$basePath="..";require __DIR__."/../includes/header.php";
|
uso1.nomeStato,
|
||||||
|
o1.orarioConsegna,
|
||||||
|
o1.totale
|
||||||
|
|
||||||
|
FROM
|
||||||
|
ordine AS o1
|
||||||
|
|
||||||
|
LEFT JOIN ultimoStatoOrdini AS uso1
|
||||||
|
ON o1.idOrdine = uso1.idOrdine
|
||||||
|
|
||||||
|
LEFT JOIN cliente AS c1
|
||||||
|
ON o1.idCliente = c1.idUtente
|
||||||
|
|
||||||
|
LEFT JOIN utente AS u1
|
||||||
|
ON c1.idUtente = u1.idUtente
|
||||||
|
|
||||||
|
WHERE
|
||||||
|
1
|
||||||
|
");
|
||||||
|
|
||||||
|
$stmt->execute();
|
||||||
|
|
||||||
|
$ordini = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
|
/* TODO SQL DI SUPPORTO - Monitorare ordini passati, attivi ed evasi.
|
||||||
|
* Input: $stato. Output: idOrdine, cliente, dataOraCreazione, statoConferma,
|
||||||
|
* nomeStato, orarioConsegna, totale, indirizzo. */
|
||||||
|
if($idOrdine){
|
||||||
|
/*
|
||||||
|
* QUERY 13 - Membri del personale che hanno lavorato a un ordine
|
||||||
|
* Input: $idOrdine
|
||||||
|
* Output atteso: idUtente, nome, cognome, email, numeroCambiStato,
|
||||||
|
* primoIntervento, ultimoIntervento
|
||||||
|
* TODO SQL: implementare manualmente la Query 13.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Membri del personale che hanno lavorato a un ordine
|
||||||
|
$stmt = $pdo->prepare("
|
||||||
|
SELECT
|
||||||
|
u1.idUtente,
|
||||||
|
u1.nome,
|
||||||
|
u1.cognome,
|
||||||
|
u1.email,
|
||||||
|
COUNT(ss1.idStoricoStato) AS numeroCambiStato,
|
||||||
|
MIN(ss1.timestamp) AS primoIntervento,
|
||||||
|
MAX(ss1.timestamp) AS ultimoIntervento
|
||||||
|
|
||||||
|
FROM
|
||||||
|
storicoStato AS ss1
|
||||||
|
|
||||||
|
JOIN personale AS p1
|
||||||
|
ON ss1.idPersonale = p1.idUtente
|
||||||
|
|
||||||
|
JOIN utente AS u1
|
||||||
|
ON p1.idUtente = u1.idUtente
|
||||||
|
|
||||||
|
WHERE
|
||||||
|
ss1.idOrdine = :idOrdine
|
||||||
|
|
||||||
|
GROUP BY
|
||||||
|
u1.idUtente,
|
||||||
|
u1.nome,
|
||||||
|
u1.cognome,
|
||||||
|
u1.email
|
||||||
|
|
||||||
|
ORDER BY
|
||||||
|
primoIntervento
|
||||||
|
");
|
||||||
|
|
||||||
|
$stmt->execute([
|
||||||
|
"idOrdine" => $idOrdine
|
||||||
|
]);
|
||||||
|
|
||||||
|
$personaleOrdine = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
|
}
|
||||||
|
$pageTitle="Monitoraggio ordini";$basePath="..";require __DIR__."/../includes/header.php";
|
||||||
?>
|
?>
|
||||||
<h1 class="h3">Monitoraggio ordini</h1><form method="get" class="card card-body mb-3"><div class="row g-3 align-items-end"><div class="col-md-4"><label class="form-label">Stato</label><select class="form-select" name="stato"><option value="">Tutti</option><?php foreach(["inserito","in preparazione","pronto","in consegna","consegnato"] as $s):?><option <?=$stato===$s?"selected":""?>><?=e($s)?></option><?php endforeach;?></select></div><div class="col-md-4"><label class="form-label">ID ordine per personale (Q13)</label><input class="form-control" type="number" min="1" name="idOrdine" value="<?=e($idOrdine)?>"></div><div class="col-md-2"><button class="btn btn-primary">Applica</button></div></div></form>
|
<h1 class="h3">Monitoraggio ordini</h1>
|
||||||
<?php if(!$ordini):?><div class="alert alert-info">Completare il TODO SQL per visualizzare gli ordini.</div><?php endif;?><div class="table-responsive"><table class="table table-striped"><thead><tr><th>ID</th><th>Cliente</th><th>Creazione</th><th>Conferma</th><th>Stato</th><th>Consegna</th><th>Totale</th></tr></thead><tbody><?php foreach($ordini as $o):?><tr><td><?=e($o["idOrdine"])?></td><td><?=e($o["cliente"])?></td><td><?=e($o["dataOraCreazione"])?></td><td><?=e($o["statoConferma"])?></td><td><?=e($o["nomeStato"]??"—")?></td><td><?=e($o["orarioConsegna"])?></td><td>€ <?=e($o["totale"])?></td></tr><?php endforeach;?></tbody></table></div>
|
<form method="get" class="card card-body mb-3">
|
||||||
<?php if($idOrdine):?><div class="card card-body mt-4"><h2 class="h5">Personale dell'ordine #<?=e($idOrdine)?> (Q13)</h2><?php if(!$personaleOrdine):?><p class="text-muted">Risultati disponibili dopo la Query 13.</p><?php endif;?><table class="table"><thead><tr><th>Nome</th><th>Email</th><th>Cambi stato</th><th>Primo</th><th>Ultimo</th></tr></thead><tbody><?php foreach($personaleOrdine as $p):?><tr><td><?=e($p["nome"]." ".$p["cognome"])?></td><td><?=e($p["email"])?></td><td><?=e($p["numeroCambiStato"])?></td><td><?=e($p["primoIntervento"])?></td><td><?=e($p["ultimoIntervento"])?></td></tr><?php endforeach;?></tbody></table></div><?php endif;?>
|
<div class="row g-3 align-items-end">
|
||||||
|
<div class="col-md-4">
|
||||||
|
<label class="form-label">Stato</label>
|
||||||
|
<select class="form-select" name="stato">
|
||||||
|
<option value="">Tutti</option>
|
||||||
|
<?php foreach(["inserito","in preparazione","pronto","in consegna","consegnato"] as $s):?>
|
||||||
|
<option <?=$stato===$s?"selected":""?>><?=e($s)?></option>
|
||||||
|
<?php endforeach;?>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-4">
|
||||||
|
<label class="form-label">ID ordine per personale (Q13)</label>
|
||||||
|
<input class="form-control" type="number" min="1" name="idOrdine" value="<?=e($idOrdine)?>">
|
||||||
|
</div>
|
||||||
|
<div class="col-md-2">
|
||||||
|
<button class="btn btn-primary">Applica</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<?php if(!$ordini):?>
|
||||||
|
<div class="alert alert-info">Completare il TODO SQL per visualizzare gli ordini.</div>
|
||||||
|
<?php endif;?>
|
||||||
|
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-striped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>ID</th>
|
||||||
|
<th>Cliente</th>
|
||||||
|
<th>Creazione</th>
|
||||||
|
<th>Conferma</th>
|
||||||
|
<th>Stato</th>
|
||||||
|
<th>Consegna</th>
|
||||||
|
<th>Totale</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<?php foreach($ordini as $o):?>
|
||||||
|
<tr>
|
||||||
|
<td><?=e($o["idOrdine"])?></td>
|
||||||
|
<td><?=e($o["cliente"])?></td>
|
||||||
|
<td><?=e($o["dataOraCreazione"])?></td>
|
||||||
|
<td><?=e($o["statoConferma"])?></td>
|
||||||
|
<td><?=e($o["nomeStato"]??"—")?></td>
|
||||||
|
<td><?=e($o["orarioConsegna"])?></td>
|
||||||
|
<td>€ <?=e($o["totale"])?></td>
|
||||||
|
</tr>
|
||||||
|
<?php endforeach;?>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php if($idOrdine):?>
|
||||||
|
<div class="card card-body mt-4">
|
||||||
|
<h2 class="h5">Personale dell'ordine #<?=e($idOrdine)?> (Q13)</h2>
|
||||||
|
<?php if(!$personaleOrdine):?>
|
||||||
|
<p class="text-muted">Risultati disponibili dopo la Query 13.</p>
|
||||||
|
<?php endif;?>
|
||||||
|
<table class="table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Nome</th>
|
||||||
|
<th>Email</th>
|
||||||
|
<th>Cambi stato</th>
|
||||||
|
<th>Primo</th>
|
||||||
|
<th>Ultimo</th>
|
||||||
|
</tr></thead>
|
||||||
|
<tbody>
|
||||||
|
<?php foreach($personaleOrdine as $p):?>
|
||||||
|
<tr>
|
||||||
|
<td><?=e($p["nome"]." ".$p["cognome"])?></td>
|
||||||
|
<td><?=e($p["email"])?></td>
|
||||||
|
<td><?=e($p["numeroCambiStato"])?></td>
|
||||||
|
<td><?=e($p["primoIntervento"])?></td>
|
||||||
|
<td><?=e($p["ultimoIntervento"])?></td>
|
||||||
|
</tr>
|
||||||
|
<?php endforeach;?>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<?php endif;?>
|
||||||
|
|
||||||
<?php require __DIR__."/../includes/footer.php";?>
|
<?php require __DIR__."/../includes/footer.php";?>
|
||||||
|
|||||||
+66
-1
@@ -88,7 +88,13 @@ CREATE TABLE ordine (
|
|||||||
-- CREAZIONE RELAZIONE STATO ORDINE
|
-- CREAZIONE RELAZIONE STATO ORDINE
|
||||||
CREATE TABLE statoOrdine (
|
CREATE TABLE statoOrdine (
|
||||||
idStatoOrdine INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
|
idStatoOrdine INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
|
||||||
nomeStato VARCHAR(30) NOT NULL,
|
nomeStato ENUM(
|
||||||
|
'inserito',
|
||||||
|
'in preparazione',
|
||||||
|
'pronto',
|
||||||
|
'in consegna',
|
||||||
|
'consegnato'
|
||||||
|
),
|
||||||
posizione TINYINT NOT NULL
|
posizione TINYINT NOT NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -191,4 +197,63 @@ CREATE TABLE rigaOrdineSelezionaCaratteristica (
|
|||||||
|
|
||||||
FOREIGN KEY (idCaratteristica) REFERENCES caratteristica (idCaratteristica),
|
FOREIGN KEY (idCaratteristica) REFERENCES caratteristica (idCaratteristica),
|
||||||
FOREIGN KEY (idRigaOrdine) REFERENCES rigaOrdine (idRigaOrdine)
|
FOREIGN KEY (idRigaOrdine) REFERENCES rigaOrdine (idRigaOrdine)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CREAZIONE VISTE (RECUPERO ULTIMO STATO ORDINE)
|
||||||
|
CREATE VIEW ultimoStatoOrdini AS (
|
||||||
|
SELECT
|
||||||
|
ss1.idOrdine,
|
||||||
|
ss1.idStatoOrdine,
|
||||||
|
so1.nomeStato,
|
||||||
|
so1.posizione
|
||||||
|
|
||||||
|
FROM
|
||||||
|
storicoStato AS ss1
|
||||||
|
|
||||||
|
JOIN statoOrdine AS so1
|
||||||
|
ON ss1.idStatoOrdine = so1.idStatoOrdine
|
||||||
|
|
||||||
|
WHERE
|
||||||
|
so1.posizione = (
|
||||||
|
SELECT
|
||||||
|
MAX(so2.posizione)
|
||||||
|
|
||||||
|
FROM
|
||||||
|
storicoStato AS ss2
|
||||||
|
|
||||||
|
JOIN statoOrdine AS so2
|
||||||
|
ON ss2.idStatoOrdine = so2.idStatoOrdine
|
||||||
|
|
||||||
|
WHERE
|
||||||
|
ss2.idOrdine = ss1.idOrdine
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CREAZIONE VISTE (RECUPERO STATO COMPLETO ORDINE)
|
||||||
|
CREATE VIEW statoOrdini AS (
|
||||||
|
SELECT
|
||||||
|
ss1.idOrdine,
|
||||||
|
ss1.idStatoOrdine,
|
||||||
|
ss1.idPersonale,
|
||||||
|
u1.nome AS nomePersonale,
|
||||||
|
u1.cognome AS cognomePersonale,
|
||||||
|
ss1.timestamp,
|
||||||
|
so1.nomeStato
|
||||||
|
|
||||||
|
FROM storicoStato AS ss1
|
||||||
|
|
||||||
|
JOIN statoOrdine AS so1
|
||||||
|
ON ss1.idStatoOrdine = so1.idStatoOrdine
|
||||||
|
|
||||||
|
LEFT JOIN personale AS p1
|
||||||
|
ON ss1.idPersonale = p1.idUtente
|
||||||
|
|
||||||
|
LEFT JOIN utente AS u1
|
||||||
|
ON p1.idUtente = u1.idUtente
|
||||||
|
|
||||||
|
WHERE
|
||||||
|
1
|
||||||
|
|
||||||
|
ORDER BY
|
||||||
|
ss1.timestamp
|
||||||
);
|
);
|
||||||
+3
-1
@@ -1,2 +1,4 @@
|
|||||||
[+] Preferiti: Il cliente può avere dei prodotti preferiti
|
[+] Preferiti: Il cliente può avere dei prodotti preferiti
|
||||||
[+] Immagini
|
[+] Immagini
|
||||||
|
|
||||||
|
[+] OKOKFATTO,CARICATO keywords da eliminare
|
||||||
Reference in New Issue
Block a user