Aggiornamento PERSONALE

This commit is contained in:
Emanuele Slusarz
2026-08-23 15:34:23 +02:00
parent a121224899
commit 57abac80bd
3 changed files with 362 additions and 45 deletions
+15 -16
View File
@@ -604,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 (
'inserito',
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
+288 -29
View File
@@ -1,33 +1,292 @@
<?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
)
VALUES (
NOW(),
:idOrdine,
:idStatoOrdine
)
");
$stmt->execute([
"idOrdine" => $idOrdine,
"idStatoOrdine" => $idStatoOrdineSuccessivo
]);
$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"; ?>