Aggiornamento PERSONALE
This commit is contained in:
+15
-16
@@ -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,
|
FROM
|
||||||
posizione
|
statoOrdine AS so1
|
||||||
)
|
|
||||||
|
WHERE
|
||||||
VALUES (
|
so1.nomeStato = 'inserito'
|
||||||
'inserito',
|
|
||||||
1
|
LIMIT
|
||||||
)
|
1
|
||||||
");
|
");
|
||||||
|
|
||||||
$stmt->execute();
|
$stmt->execute();
|
||||||
|
|
||||||
$idStatoOrdine = $pdo->lastInsertId();
|
$idStatoOrdine = $stmt->fetchColumn();
|
||||||
|
|
||||||
$stmt = $pdo->prepare("
|
$stmt = $pdo->prepare("
|
||||||
INSERT
|
INSERT
|
||||||
|
|||||||
@@ -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"; ?>
|
||||||
|
|||||||
@@ -197,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
|
||||||
);
|
);
|
||||||
Reference in New Issue
Block a user