Compare commits
5 Commits
ec30fb40b9
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 9a8acb16fd | |||
| 57abac80bd | |||
| a121224899 | |||
| 42979685fb | |||
| c796788339 |
+190
-145
@@ -1,175 +1,220 @@
|
||||
<?php
|
||||
require_once __DIR__ . "/../includes/auth.php";
|
||||
requireRole("cliente");
|
||||
require_once __DIR__ . "/../config/database.php";
|
||||
$idCliente = (int) $_SESSION["idUtente"];
|
||||
$azione = $_POST["azione"] ?? null;
|
||||
$idIndirizzo = filter_input(INPUT_POST, "idIndirizzo", FILTER_VALIDATE_INT);
|
||||
$via = trim($_POST["via"] ?? "");
|
||||
$numeroCivico = trim($_POST["numeroCivico"] ?? "");
|
||||
$idComune = filter_input(INPUT_POST, "idComune", FILTER_VALIDATE_INT);
|
||||
$indirizzi = [];
|
||||
$messaggio = null;
|
||||
$comuni = [];
|
||||
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT
|
||||
comune.idComune,
|
||||
comune.nome AS nomeComune,
|
||||
provincia.nome AS nomeProvincia,
|
||||
provincia.sigla
|
||||
require_once __DIR__ . "/../includes/auth.php";
|
||||
requireRole("cliente");
|
||||
require_once __DIR__ . "/../config/database.php";
|
||||
$idCliente = (int) $_SESSION["idUtente"];
|
||||
$azione = $_POST["azione"] ?? null;
|
||||
$idIndirizzo = filter_input(INPUT_POST, "idIndirizzo", FILTER_VALIDATE_INT);
|
||||
$via = trim($_POST["via"] ?? "");
|
||||
$numeroCivico = trim($_POST["numeroCivico"] ?? "");
|
||||
$idComune = filter_input(INPUT_POST, "idComune", FILTER_VALIDATE_INT);
|
||||
$indirizzi = [];
|
||||
$messaggio = null;
|
||||
$comuni = [];
|
||||
|
||||
FROM comune JOIN provincia ON comune.idProvincia = provincia.idProvincia
|
||||
");
|
||||
$stmt->execute();
|
||||
$comuni = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
$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->execute();
|
||||
$comuni = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
if (postMethod()) {
|
||||
|
||||
try {
|
||||
if (postMethod()) {
|
||||
|
||||
switch($azione) {
|
||||
case "predefinito": {
|
||||
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
|
||||
]);
|
||||
case "predefinito": { // OKOKFATTO
|
||||
|
||||
// Settando indirizzo corrente come predefinito
|
||||
$stmt = $pdo->prepare("
|
||||
UPDATE indirizzo
|
||||
SET predefinito = 1
|
||||
WHERE
|
||||
idCliente = :idCliente AND idIndirizzo = :idIndirizzo
|
||||
");
|
||||
$stmt->execute([
|
||||
"idCliente" => $idCliente,
|
||||
"idIndirizzo" => $idIndirizzo
|
||||
]);
|
||||
|
||||
$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
|
||||
try {
|
||||
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
|
||||
) 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;
|
||||
");
|
||||
$stmt->execute([
|
||||
"idCliente" => $idCliente
|
||||
]);
|
||||
|
||||
// Settando indirizzo corrente come predefinito
|
||||
$stmt = $pdo->prepare("
|
||||
UPDATE indirizzo
|
||||
SET predefinito = 1
|
||||
WHERE
|
||||
idCliente = :idCliente AND idIndirizzo = :idIndirizzo
|
||||
");
|
||||
$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": {
|
||||
if (!$idIndirizzo) {
|
||||
$messaggio = "Id indirizzo non valido";
|
||||
die("Id indirizzo non valido");
|
||||
case "inserisci": { // OKOKFATTO
|
||||
try {
|
||||
if (
|
||||
$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("
|
||||
DELETE FROM indirizzo
|
||||
WHERE
|
||||
idIndirizzo = :idIndirizzo AND idCliente = :idCliente
|
||||
");
|
||||
$stmt->execute([
|
||||
"idIndirizzo" => $idIndirizzo,
|
||||
"idCliente" => $idCliente
|
||||
]);
|
||||
$pdo->commit();
|
||||
$pdo->beginTransaction();
|
||||
|
||||
$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:
|
||||
$messaggio = "Azione non valida";
|
||||
break;
|
||||
}
|
||||
|
||||
} catch (PDOException $e) {
|
||||
if ($pdo->inTransaction()) {
|
||||
$pdo->rollBack();
|
||||
}
|
||||
die(
|
||||
"Errore durante l'aggiunta dell'indirizzo di consegna: "
|
||||
. $e->getMessage()
|
||||
);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT
|
||||
indirizzo.idIndirizzo,
|
||||
indirizzo.via,
|
||||
indirizzo.numeroCivico,
|
||||
indirizzo.predefinito,
|
||||
comune.nome AS nomeComune,
|
||||
provincia.sigla AS siglaProvincia
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT
|
||||
indirizzo.idIndirizzo,
|
||||
indirizzo.via,
|
||||
indirizzo.numeroCivico,
|
||||
indirizzo.predefinito,
|
||||
comune.nome AS nomeComune,
|
||||
provincia.sigla AS siglaProvincia
|
||||
|
||||
FROM (indirizzo JOIN comune ON indirizzo.idComune = comune.idComune)
|
||||
JOIN provincia ON comune.idProvincia = provincia.idProvincia
|
||||
FROM (indirizzo JOIN comune ON indirizzo.idComune = comune.idComune)
|
||||
JOIN provincia ON comune.idProvincia = provincia.idProvincia
|
||||
|
||||
WHERE idCliente = :idCliente
|
||||
");
|
||||
$stmt->execute([
|
||||
"idCliente" => $idCliente
|
||||
]);
|
||||
$indirizzi = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
WHERE idCliente = :idCliente
|
||||
");
|
||||
$stmt->execute([
|
||||
"idCliente" => $idCliente
|
||||
]);
|
||||
$indirizzi = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
$pageTitle = "Indirizzi"; $basePath = "..";
|
||||
require __DIR__ . "/../includes/header.php";
|
||||
$pageTitle = "Indirizzi"; $basePath = "..";
|
||||
require __DIR__ . "/../includes/header.php";
|
||||
?>
|
||||
<h1 class="h3">Indirizzi di consegna</h1>
|
||||
<?php if ($messaggio): ?><div class="alert alert-warning"><?= e($messaggio) ?></div><?php endif; ?>
|
||||
|
||||
+38
-29
@@ -1,30 +1,33 @@
|
||||
<?php
|
||||
require_once __DIR__ . "/../includes/auth.php";
|
||||
requireRole("cliente");
|
||||
require_once __DIR__ . "/../config/database.php";
|
||||
require_once __DIR__ . "/../includes/auth.php";
|
||||
requireRole("cliente");
|
||||
require_once __DIR__ . "/../config/database.php";
|
||||
|
||||
$idCliente = (int) $_SESSION["idUtente"];
|
||||
$prodotti = [];
|
||||
$idCliente = (int) $_SESSION["idUtente"];
|
||||
$prodotti = [];
|
||||
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT
|
||||
prodotto.idProdotto,
|
||||
prodotto.nome,
|
||||
prodotto.descrizione,
|
||||
prodotto.prezzoBase,
|
||||
caratteristica.nome AS nomeCaratteristica,
|
||||
caratteristica.differenzaPrezzo
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT
|
||||
prodotto.idProdotto,
|
||||
prodotto.nome,
|
||||
prodotto.descrizione,
|
||||
prodotto.prezzoBase,
|
||||
caratteristica.nome AS nomeCaratteristica,
|
||||
caratteristica.differenzaPrezzo
|
||||
|
||||
FROM prodotto JOIN caratteristica ON prodotto.idProdotto = caratteristica.idProdotto
|
||||
");
|
||||
$stmt->execute();
|
||||
$prodotti = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
FROM prodotto JOIN caratteristica ON prodotto.idProdotto = caratteristica.idProdotto
|
||||
");
|
||||
$stmt->execute();
|
||||
$prodotti = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
$pageTitle = "Menu"; $basePath = "..";
|
||||
require __DIR__ . "/../includes/header.php";
|
||||
$pageTitle = "Menu"; $basePath = "..";
|
||||
require __DIR__ . "/../includes/header.php";
|
||||
?>
|
||||
<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>
|
||||
</div>
|
||||
<?php if (!$prodotti): ?>
|
||||
@@ -32,15 +35,21 @@ require __DIR__ . "/../includes/header.php";
|
||||
<?php endif; ?>
|
||||
<div class="row g-3">
|
||||
<?php foreach ($prodotti as $prodotto): ?>
|
||||
<div class="col-md-6"><div class="card h-100 shadow-sm"><div class="card-body">
|
||||
<h2 class="h5"><?= e($prodotto["nome"] ?? "") ?></h2>
|
||||
<p><?= e($prodotto["descrizione"] ?? "") ?></p>
|
||||
<span class="badge bg-primary">€ <?= e(number_format((float) ($prodotto["prezzoBase"] ?? 0), 2, ",", ".")) ?></span>
|
||||
<?php if (!empty($prodotto["nomeCaratteristica"])): ?>
|
||||
<hr><strong>Caratteristica:</strong> <?= e($prodotto["nomeCaratteristica"]) ?>
|
||||
(+ € <?= e($prodotto["differenzaPrezzo"] ?? 0) ?>)
|
||||
<?php endif; ?>
|
||||
</div></div></div>
|
||||
<div class="col-md-6">
|
||||
<div class="card h-100 shadow-sm">
|
||||
<div class="card-body">
|
||||
<h2 class="h5"><?= e($prodotto["nome"] ?? "") ?></h2>
|
||||
<p><?= e($prodotto["descrizione"] ?? "") ?></p>
|
||||
<span class="badge bg-primary">€ <?= e(number_format((float) ($prodotto["prezzoBase"] ?? 0), 2, ",", ".")) ?></span>
|
||||
<?php if (!empty($prodotto["nomeCaratteristica"])): ?>
|
||||
<hr>
|
||||
<strong>Caratteristica:</strong>
|
||||
<?= e($prodotto["nomeCaratteristica"]) ?>
|
||||
(+ € <?= e($prodotto["differenzaPrezzo"] ?? 0) ?>)
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<?php require __DIR__ . "/../includes/footer.php"; ?>
|
||||
|
||||
@@ -47,9 +47,6 @@
|
||||
]);
|
||||
|
||||
$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 = "..";
|
||||
require __DIR__ . "/../includes/header.php";
|
||||
?>
|
||||
|
||||
+69
-17
@@ -26,6 +26,7 @@
|
||||
$prodotti = []; // CARICATO
|
||||
$caratteristicheDisponibili = []; // CARICATO
|
||||
$indirizzi = []; // CARICATO
|
||||
$indirizzoPredefinito = null; // CARICATO
|
||||
$righeOrdine = []; // CARICATO
|
||||
|
||||
$riepilogo = null; // CARICATO
|
||||
@@ -51,6 +52,29 @@
|
||||
|
||||
$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
|
||||
@@ -580,30 +604,29 @@
|
||||
");
|
||||
|
||||
$stmt->execute([
|
||||
"idOrdine" => $idOrdine,
|
||||
"idCliente" => $idCliente,
|
||||
"totale" => $totale,
|
||||
"tempoPreparazione" => $tempoPreparazione
|
||||
"tempoPreparazione" => $tempoPreparazione,
|
||||
"idOrdine" => $idOrdine,
|
||||
"idCliente" => $idCliente
|
||||
]);
|
||||
|
||||
// Creazione dello storicoStato e statoOrdine
|
||||
$stmt = $pdo->prepare("
|
||||
INSERT
|
||||
INTO statoOrdine
|
||||
(
|
||||
nomeStato,
|
||||
posizione
|
||||
)
|
||||
|
||||
VALUES (
|
||||
'IN LAVORAZIONE',
|
||||
1
|
||||
)
|
||||
SELECT
|
||||
MIN(so1.idStatoOrdine)
|
||||
|
||||
FROM
|
||||
statoOrdine AS so1
|
||||
|
||||
WHERE
|
||||
so1.nomeStato = 'inserito'
|
||||
|
||||
LIMIT
|
||||
1
|
||||
");
|
||||
|
||||
$stmt->execute();
|
||||
|
||||
$idStatoOrdine = $pdo->lastInsertId();
|
||||
$idStatoOrdine = $stmt->fetchColumn();
|
||||
|
||||
$stmt = $pdo->prepare("
|
||||
INSERT
|
||||
@@ -834,7 +857,36 @@
|
||||
name="idIndirizzo"
|
||||
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): ?>
|
||||
<option value="<?= e($i["idIndirizzo"]) ?>">
|
||||
|
||||
+86
-16
@@ -1,20 +1,90 @@
|
||||
<?php
|
||||
require_once __DIR__ . "/../includes/auth.php";
|
||||
requireRole("personale");
|
||||
require_once __DIR__ . "/../config/database.php";
|
||||
$idPersonale = (int) $_SESSION["idUtente"];
|
||||
$conteggi = [];
|
||||
/*
|
||||
* QUERY 11 - Conteggio degli ordini attivi divisi per stato di avanzamento
|
||||
* Input: nessuno (l'id $idPersonale è disponibile per il contesto UI)
|
||||
* Output atteso: idStatoOrdine, nomeStato, posizione, numeroOrdini
|
||||
* TODO SQL: implementare manualmente la Query 11.
|
||||
*/
|
||||
$pageTitle = "Dashboard personale"; $basePath = "..";
|
||||
require __DIR__ . "/../includes/header.php";
|
||||
require_once __DIR__ . "/../includes/auth.php";
|
||||
requireRole("personale");
|
||||
require_once __DIR__ . "/../config/database.php";
|
||||
$idPersonale = (int) $_SESSION["idUtente"];
|
||||
$conteggi = [];
|
||||
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT
|
||||
ss1.idOrdine,
|
||||
ss1.idStatoOrdine,
|
||||
so1.nomeStato,
|
||||
so1.posizione,
|
||||
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>
|
||||
<?php if (!$conteggi): ?><div class="alert alert-info">I conteggi saranno mostrati dopo l'implementazione della Query 11.</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"><?= e($c["numeroOrdini"]) ?></div><div><?= e($c["nomeStato"]) ?></div></div></div></div><?php endforeach; ?></div>
|
||||
<h1 class="h3">Dashboard personale</h1>
|
||||
<p>Panoramica degli ordini attivi.</p>
|
||||
<?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>
|
||||
<?php require __DIR__ . "/../includes/footer.php"; ?>
|
||||
|
||||
@@ -1,33 +1,295 @@
|
||||
<?php
|
||||
require_once __DIR__ . "/../includes/auth.php";
|
||||
requireRole("personale");
|
||||
require_once __DIR__ . "/../config/database.php";
|
||||
$idPersonale = (int) $_SESSION["idUtente"];
|
||||
$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);
|
||||
$ordine = null; $righe = []; $storico = []; $statoSuccessivo = null; $messaggio = null;
|
||||
/* TODO SQL DI SUPPORTO - Caricare testata, righe con caratteristiche,
|
||||
* ingredienti/procedura, indirizzo, stato corrente e storico dell'ordine.
|
||||
* Input: $idOrdine. Output: attributi omonimi dello schema e nomi descrittivi. */
|
||||
if (postMethod()) {
|
||||
/*
|
||||
* QUERY 14 - Aggiornamento progressivo dello stato di un ordine
|
||||
* Input: $idOrdine, $idStatoOrdine, $idPersonale
|
||||
* Output: nuovo nomeStato, posizione e timestamp registrato
|
||||
* Vincolo UI/DB: solo il successore dello stato corrente; mai regressioni.
|
||||
* TODO SQL: implementare manualmente la Query 14.
|
||||
*/
|
||||
$messaggio = "Query 14 predisposta: stato non ancora aggiornato.";
|
||||
}
|
||||
$pageTitle = "Dettaglio ordine"; $basePath = "..";
|
||||
require __DIR__ . "/../includes/header.php";
|
||||
require_once __DIR__ . "/../includes/auth.php";
|
||||
requireRole("personale");
|
||||
require_once __DIR__ . "/../config/database.php";
|
||||
$idPersonale = (int) $_SESSION["idUtente"];
|
||||
$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);
|
||||
$ordine = null; // CARICATO
|
||||
$righe = []; // CARICATO
|
||||
$caratteristiche = []; // CARICATO
|
||||
$storico = []; // CARICATO
|
||||
$statoSuccessivo = null; // CARICATO
|
||||
$messaggio = $_SESSION["messaggio"] ?? null;
|
||||
unset($_SESSION["messaggio"]);
|
||||
|
||||
// Recupero l'ordine
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT
|
||||
uso.idOrdine,
|
||||
uso.idStatoOrdine,
|
||||
uso.nomeStato,
|
||||
uso.posizione
|
||||
|
||||
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; ?>
|
||||
<?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="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; ?>
|
||||
|
||||
<?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="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"><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>
|
||||
<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($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"; ?>
|
||||
|
||||
+607
-22
@@ -1,24 +1,609 @@
|
||||
<?php
|
||||
require_once __DIR__ . "/../includes/auth.php";
|
||||
requireRole("personale");
|
||||
require_once __DIR__ . "/../config/database.php";
|
||||
$idPersonale = (int) $_SESSION["idUtente"];
|
||||
$soloInRitardo = ($_GET["filtro"] ?? "") === "ritardo";
|
||||
$ordini = [];
|
||||
/*
|
||||
* QUERY 5 - Ordini non ancora messi in preparazione dopo più di un'ora
|
||||
* Input: nessuno; $soloInRitardo controlla la vista richiesta dalla UI
|
||||
* Output atteso: idOrdine, dataOraCreazione, orarioConsegna, totale,
|
||||
* nomeCliente, cognomeCliente, via, numeroCivico, nomeComune,
|
||||
* nomeStato, timestampUltimoStato, minutiAttesa
|
||||
* TODO SQL: implementare manualmente la Query 5.
|
||||
*/
|
||||
/* Per la vista completa degli ordini correnti predisporre inoltre una query
|
||||
* di supporto con gli stessi campi, senza il vincolo "oltre un'ora". */
|
||||
$pageTitle = "Ordini correnti"; $basePath = "..";
|
||||
require __DIR__ . "/../includes/header.php";
|
||||
|
||||
require_once __DIR__ . "/../includes/auth.php";
|
||||
|
||||
requireRole("personale");
|
||||
|
||||
require_once __DIR__ . "/../config/database.php";
|
||||
|
||||
$idPersonale = (int) $_SESSION["idUtente"];
|
||||
|
||||
$soloInRitardo = ($_GET["filtro"] ?? "") === "ritardo";
|
||||
|
||||
$ordini = [];
|
||||
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT
|
||||
o1.idOrdine,
|
||||
o1.dataOraCreazione,
|
||||
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>
|
||||
<?php require __DIR__ . "/../includes/footer.php"; ?>
|
||||
|
||||
|
||||
<div class="d-flex justify-content-between align-items-center mb-4">
|
||||
|
||||
<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
|
||||
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=[];
|
||||
/* 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.
|
||||
*/}
|
||||
$pageTitle="Monitoraggio ordini";$basePath="..";require __DIR__."/../includes/header.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=[];
|
||||
|
||||
// Ricavo gli ordini
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT
|
||||
o1.idOrdine,
|
||||
CONCAT(u1.nome, ' ', u1.cognome) AS cliente,
|
||||
o1.dataOraCreazione,
|
||||
o1.statoConferma,
|
||||
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>
|
||||
<?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;?>
|
||||
<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>
|
||||
|
||||
<?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";?>
|
||||
|
||||
+66
-1
@@ -88,7 +88,13 @@ CREATE TABLE ordine (
|
||||
-- CREAZIONE RELAZIONE STATO ORDINE
|
||||
CREATE TABLE statoOrdine (
|
||||
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
|
||||
);
|
||||
|
||||
@@ -191,4 +197,63 @@ CREATE TABLE rigaOrdineSelezionaCaratteristica (
|
||||
|
||||
FOREIGN KEY (idCaratteristica) REFERENCES caratteristica (idCaratteristica),
|
||||
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
|
||||
[+] Immagini
|
||||
[+] Immagini
|
||||
|
||||
[+] OKOKFATTO,CARICATO keywords da eliminare
|
||||
Reference in New Issue
Block a user