From a1c9d9f789b3de2f86461dba418fe8d23d5269b7 Mon Sep 17 00:00:00 2001 From: solocla Date: Wed, 26 Nov 2025 11:24:29 +0100 Subject: [PATCH] dashboard fix --- public/userarea/manager_produzione.php | 576 ++++++++++++++++++ public/userarea/manager_stats.php | 281 +++++++++ public/userarea/production_dashboard.php | 46 +- public/userarea/production_line_view2.php | 76 ++- .../produzione_programmazione_drag.php | 10 +- 5 files changed, 957 insertions(+), 32 deletions(-) create mode 100644 public/userarea/manager_produzione.php create mode 100644 public/userarea/manager_stats.php diff --git a/public/userarea/manager_produzione.php b/public/userarea/manager_produzione.php new file mode 100644 index 0000000..bdd604b --- /dev/null +++ b/public/userarea/manager_produzione.php @@ -0,0 +1,576 @@ +getConnection(); + +// --- LISTE --- +$linee = $pdo->query("SELECT id, line_number, name FROM production_lines ORDER BY line_number")->fetchAll(); +$status_list = $pdo->query("SELECT id, nome, badge_color, line_color FROM production_status ORDER BY ordinamento, nome")->fetchAll(PDO::FETCH_ASSOC); + +// --- CARICO TUTTE LE PRODUZIONI UNA VOLTA SOLA --- +$sql = "SELECT + p.*, + m.nome AS matrice, + ms.nome AS mescola, + l.name AS linea, + c.nome AS cliente, + s.nome AS status_nome, + COALESCE(s.badge_color, '#6c757d') AS badge_color, + COALESCE(s.line_color, '#ffffff') AS line_color + FROM productiondata p + LEFT JOIN matrice m ON p.idmatrice = m.id + LEFT JOIN mescole ms ON p.idmescola = ms.id + LEFT JOIN production_lines l ON p.id_linea = l.id + LEFT JOIN clients c ON p.id_cliente = c.id + LEFT JOIN production_status s ON p.id_status = s.id + ORDER BY p.data_produzione DESC, p.Data DESC, p.id DESC"; + +$rows = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC); + +// --- RECORD SPECIALI (IN PRODUZIONE / PAUSA / PROBLEMA) --- +$rows_special = array_filter($rows, function ($r) { + return in_array((int)$r['id_status'], [2, 7, 8]); +}); +?> + + + + + + Produzione - Vista Manageriale | <?= $titlewebsite ?> + + + + + + + + + + + + +
+ + + +
+
+ + + + +
+
+
Produzione in corso / pausa / problema
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MatriceMescolaLineaClienteData ZiboData ClienteMetriKg SPOre previsteTimerStatusFoto
+ + + + + + + + + + + +
+
+ +
+ Nessuna produzione attualmente in stato In produzione / Pausa / Problema. +
+ +
+
+ + + + +
+
+
Tutte le produzioni (vista manageriale)
+ +
+ + +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MatriceMescolaLineaClienteData ZiboData ClienteMetriKg SPKg PKg prod.Scarto (kg)Scarto %Ore previsteTempo lavoroStatusFoto
0 ? number_format($scartoPct, 1, ',', '.') . ' %' : '-' ?> + + + + + + + + + +
+
+ +
+
+ +
+
+ + +
+ + +
+ +
+ + +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/public/userarea/manager_stats.php b/public/userarea/manager_stats.php new file mode 100644 index 0000000..8b53371 --- /dev/null +++ b/public/userarea/manager_stats.php @@ -0,0 +1,281 @@ +getConnection(); + +// --- Filtro periodo --- +$from = $_GET['from'] ?? date('Y-m-01'); +$to = $_GET['to'] ?? date('Y-m-t'); + +// --- Query base --- +$baseWhere = "WHERE p.data_produzione BETWEEN :from AND :to"; + +// --- KPI --- +$kpi = $pdo->prepare(" + SELECT + COUNT(*) AS totale, + SUM(p.ore_previste) AS orepreviste, + SUM(p.metri) AS metri, + SUM(p.kg_sp) AS kgsp + FROM productiondata p + $baseWhere +"); +$kpi->execute(['from' => $from, 'to' => $to]); +$kpi = $kpi->fetch(PDO::FETCH_ASSOC); + +// --- Grafico stati --- +$stati = $pdo->prepare(" + SELECT s.nome, COUNT(*) AS totale + FROM productiondata p + LEFT JOIN production_status s ON p.id_status = s.id + $baseWhere + GROUP BY p.id_status +"); +$stati->execute(['from' => $from, 'to' => $to]); +$data_stati = $stati->fetchAll(PDO::FETCH_ASSOC); + +// --- Grafico per linea --- +$linee = $pdo->prepare(" + SELECT l.name, COUNT(*) AS totale + FROM productiondata p + LEFT JOIN production_lines l ON p.id_linea = l.id + $baseWhere + GROUP BY p.id_linea +"); +$linee->execute(['from' => $from, 'to' => $to]); +$data_linee = $linee->fetchAll(PDO::FETCH_ASSOC); + +// --- Metri per mescola --- +$mescole = $pdo->prepare(" + SELECT ms.nome, SUM(p.metri) AS metri + FROM productiondata p + LEFT JOIN mescole ms ON p.idmescola = ms.id + $baseWhere + GROUP BY p.idmescola +"); +$mescole->execute(['from' => $from, 'to' => $to]); +$data_mescole = $mescole->fetchAll(PDO::FETCH_ASSOC); + +// --- Ore previste per cliente --- +$clienti = $pdo->prepare(" + SELECT c.nome, SUM(p.ore_previste) AS ore + FROM productiondata p + LEFT JOIN clients c ON p.id_cliente = c.id + $baseWhere + GROUP BY p.id_cliente +"); +$clienti->execute(['from' => $from, 'to' => $to]); +$data_clienti = $clienti->fetchAll(PDO::FETCH_ASSOC); +?> + + + + + + + Statistiche Produzione | <?= $titlewebsite ?> + + + + + + + +
+ + + +
+
+ + + + +
+
Filtra periodo
+
+
+
+ + +
+
+ + +
+
+ +
+
+
+
+ + + + +
+ +
+
+
+
Produzioni
+
+
+ +
+
+
+
Ore previste
+
+
+ +
+
+
+
Metri totali
+
+
+ +
+
+
+
Kg SP totali
+
+
+ +
+ + + + +
+
Distribuzione per stato
+
+
+
+
+ + + + +
+
Produzioni per linea
+
+
+
+
+ + + + +
+
Metri programmati per mescola
+
+
+
+
+ + + + +
+
Ore previste per cliente
+
+
+
+
+ +
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/public/userarea/production_dashboard.php b/public/userarea/production_dashboard.php index 5f3a6ea..f058acd 100644 --- a/public/userarea/production_dashboard.php +++ b/public/userarea/production_dashboard.php @@ -40,8 +40,8 @@ display: flex; flex-wrap: wrap; justify-content: center; - gap: 20px; - margin-bottom: 50px; + gap: 15px; + margin-bottom: 20px; width: 100%; max-width: 900px; } @@ -93,7 +93,7 @@ width: 100%; max-width: 900px; justify-items: center; - margin-bottom: 40px; + margin-bottom: 20px; } .dashboard-grid-bottom { @@ -203,6 +203,19 @@ background-color: #dc2626 !important; /* rosso scuro hover */ } + + /* --- Pulsanti grandi (default) --- */ + .dash-btn-large { + padding: 18px 10px; + font-size: 1.3rem; + } + + /* --- Pulsanti di servizio: piΓΉ bassi --- */ + .dash-btn-small { + padding: 9px 10px !important; + font-size: 1.05rem !important; + min-height: 80px; + } @@ -253,36 +266,47 @@
- - - + + + + +
- - - @@ -291,13 +315,13 @@
- - diff --git a/public/userarea/production_line_view2.php b/public/userarea/production_line_view2.php index e0492b9..3a461e8 100644 --- a/public/userarea/production_line_view2.php +++ b/public/userarea/production_line_view2.php @@ -196,42 +196,54 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['stop_production'])) // --- SALVATAGGIO DATI FINE PRODUZIONE --- if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['save_final_data'])) { - $id = (int)$_POST['id']; + + $id = (int)$_POST['id']; $kgprod = (float)$_POST['kgprod']; $mtprod = (float)$_POST['mtprod']; $scarto = (float)$_POST['scarto']; - $note = trim($_POST['note'] ?? ''); + $note = trim($_POST['note'] ?? ''); $reason = $_POST['reason'] ?? 'fine'; try { - // Calcolo automatico del tempo totale in ore + // Recupero tempo totale giΓ  calcolato $sql = "SELECT tempo_totale_produzione FROM productiondata WHERE id = :id"; $stmt = $pdo->prepare($sql); $stmt->execute(['id' => $id]); $seconds = (int)$stmt->fetchColumn(); - $hours = round($seconds / 3600, 2); - // Stato di destinazione + // Calcolo scarto % + $totaleKg = $kgprod + $scarto; + $scartoPerc = 0.00; + + if ($totaleKg > 0) { + $scartoPerc = round(($scarto / $totaleKg) * 100, 2); + } + + // Stato destinazione $nextStatus = ($reason === 'problema') ? 8 : $statusQualita; + // Update finale $sql = "UPDATE productiondata - SET kgprod = :kgprod, - mtprod = :mtprod, - scarto = :scarto, - note_operatore = :note, - hourprod = SEC_TO_TIME(:seconds), - id_status = :status, - end_time = COALESCE(end_time, UTC_TIMESTAMP()) - WHERE id = :id"; + SET kgprod = :kgprod, + mtprod = :mtprod, + scarto = :scarto, + scarto_perc = :scarto_perc, + note_operatore = :note, + hourprod = SEC_TO_TIME(:seconds), + id_status = :status, + end_time = COALESCE(end_time, UTC_TIMESTAMP()) + WHERE id = :id"; + $stmt = $pdo->prepare($sql); $stmt->execute([ - 'kgprod' => $kgprod, - 'mtprod' => $mtprod, - 'scarto' => $scarto, - 'note' => $note, - 'seconds' => $seconds, - 'status' => $nextStatus, - 'id' => $id + 'kgprod' => $kgprod, + 'mtprod' => $mtprod, + 'scarto' => $scarto, + 'scarto_perc' => $scartoPerc, + 'note' => $note, + 'seconds' => $seconds, + 'status' => $nextStatus, + 'id' => $id ]); echo json_encode(['success' => true]); @@ -241,6 +253,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['save_final_data'])) exit; } + + // --- AJAX PRINCIPALE: carica i record della data selezionata --- if (!empty($_GET['ajax'])) { @@ -913,6 +927,11 @@ if (!empty($_GET['ajax'])) { + + + + +
@@ -1387,6 +1406,9 @@ if (!empty($_GET['ajax'])) { // Pulisci i campi reali $('#kgprod, #mtprod, #scarto').val(''); $('#finalNote').val(note || ''); + $('#kgprod, #scarto').off('input').on('input', recalcScrapPerc); + $('#scartoPerc').val(''); + // Recupera i dati teorici del record const card = $(`.record-card[data-id="${id}"]`); @@ -1430,6 +1452,20 @@ if (!empty($_GET['ajax'])) { }); } + function recalcScrapPerc() { + const kg = parseFloat($('#kgprod').val()) || 0; + const sc = parseFloat($('#scarto').val()) || 0; + const tot = kg + sc; + let perc = 0; + + if (tot > 0) { + perc = (sc / tot) * 100; + } + + $('#scartoPerc').val(perc.toFixed(2) + ' %'); + } + + // --- START PRODUZIONE --- diff --git a/public/userarea/produzione_programmazione_drag.php b/public/userarea/produzione_programmazione_drag.php index d452f1c..dd94468 100644 --- a/public/userarea/produzione_programmazione_drag.php +++ b/public/userarea/produzione_programmazione_drag.php @@ -357,7 +357,15 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['action'])) { - +