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
+13 -14
View File
@@ -604,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,
posizione
)
VALUES ( FROM
'inserito', statoOrdine AS so1
WHERE
so1.nomeStato = 'inserito'
LIMIT
1 1
)
"); ");
$stmt->execute(); $stmt->execute();
$idStatoOrdine = $pdo->lastInsertId(); $idStatoOrdine = $stmt->fetchColumn();
$stmt = $pdo->prepare(" $stmt = $pdo->prepare("
INSERT INSERT
+288 -29
View File
@@ -1,33 +1,292 @@
<?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
)
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; ?> <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"; ?>
+59
View File
@@ -198,3 +198,62 @@ 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
);