From c4a3e48dd2c4bc9c71c17ad4824e3c5357e740b0 Mon Sep 17 00:00:00 2001 From: solocla Date: Thu, 22 Oct 2026 13:48:48 +0200 Subject: [PATCH] added prefernce business overview --- .../20261022114511_create_user_ui_prefs.php | 22 + public/userarea/class/UiPrefs.php | 74 + public/userarea/photos/26-27-1792584866.jpeg | Bin 0 -> 86828 bytes public/userarea/production_dashboard_v2.php | 1208 +++++++++++ public/userarea/production_programming_v2.php | 1839 +++++++++++++++++ public/userarea/sales_customer.php | 70 +- public/userarea/sales_orders_deliveries.php | 58 +- public/userarea/sales_orders_stats.php | 117 +- public/userarea/sales_orders_years.php | 168 +- public/userarea/sales_summary.php | 21 +- public/userarea/ui_layout.js | 361 ++++ public/userarea/ui_prefs.php | 45 + 12 files changed, 3777 insertions(+), 206 deletions(-) create mode 100644 db/migrations/20261022114511_create_user_ui_prefs.php create mode 100644 public/userarea/class/UiPrefs.php create mode 100644 public/userarea/photos/26-27-1792584866.jpeg create mode 100644 public/userarea/production_dashboard_v2.php create mode 100644 public/userarea/production_programming_v2.php create mode 100644 public/userarea/ui_layout.js create mode 100644 public/userarea/ui_prefs.php diff --git a/db/migrations/20261022114511_create_user_ui_prefs.php b/db/migrations/20261022114511_create_user_ui_prefs.php new file mode 100644 index 00000000..88651e9d --- /dev/null +++ b/db/migrations/20261022114511_create_user_ui_prefs.php @@ -0,0 +1,22 @@ +table('user_ui_prefs', ['comment' => 'Layout pagine personalizzato per utente']) + ->addColumn('user_id', 'integer', ['signed' => false]) + ->addColumn('page', 'string', ['limit' => 50, 'comment' => 'chiave pagina, es. sales_orders_stats']) + ->addColumn('layout', 'text', ['null' => true, 'comment' => 'JSON {order, hidden, sizes}']) + ->addColumn('updated_at', 'datetime', ['null' => true]) + ->addIndex(['user_id', 'page'], ['unique' => true]) + ->create(); + } +} diff --git a/public/userarea/class/UiPrefs.php b/public/userarea/class/UiPrefs.php new file mode 100644 index 00000000..f757887c --- /dev/null +++ b/public/userarea/class/UiPrefs.php @@ -0,0 +1,74 @@ +prepare('SELECT layout FROM user_ui_prefs WHERE user_id = ? AND page = ?'); + $st->execute([$userId, $page]); + $j = $st->fetchColumn(); + $d = $j ? json_decode($j, true) : null; + return is_array($d) ? self::clean($d) : []; + } catch (Throwable $e) { + return []; + } + } + + public static function save(PDO $pdo, int $userId, string $page, array $layout): bool + { + if ($userId <= 0 || !self::validPage($page)) return false; + $json = json_encode(self::clean($layout)); + $st = $pdo->prepare('INSERT INTO user_ui_prefs (user_id, page, layout, updated_at) VALUES (?, ?, ?, NOW()) + ON DUPLICATE KEY UPDATE layout = VALUES(layout), updated_at = NOW()'); + return $st->execute([$userId, $page, $json]); + } + + public static function reset(PDO $pdo, int $userId, string $page): bool + { + if ($userId <= 0 || !self::validPage($page)) return false; + $st = $pdo->prepare('DELETE FROM user_ui_prefs WHERE user_id = ? AND page = ?'); + return $st->execute([$userId, $page]); + } + + /** Attributi HTML per il contenitore dei riquadri: data-layout + data-prefs. */ + public static function attr(PDO $pdo, $userId, string $page): string + { + $p = self::get($pdo, (int)$userId, $page); + return 'data-layout="' . htmlspecialchars($page) . '" data-prefs="' + . htmlspecialchars(json_encode($p ?: new stdClass()), ENT_QUOTES) . '"'; + } + + private static function clean(array $d): array + { + $key = function ($k) { + return is_string($k) && preg_match('/^[a-z0-9_]{1,40}$/', $k); + }; + $order = array_values(array_unique(array_filter((array)($d['order'] ?? []), $key))); + $hidden = array_values(array_unique(array_filter((array)($d['hidden'] ?? []), $key))); + $sizes = []; + foreach ((array)($d['sizes'] ?? []) as $k => $v) { + if ($key($k) && in_array((int)$v, self::SIZES, true)) $sizes[$k] = (int)$v; + } + return [ + 'order' => array_slice($order, 0, 60), + 'hidden' => array_slice($hidden, 0, 60), + 'sizes' => $sizes ?: new stdClass(), + ]; + } +} diff --git a/public/userarea/photos/26-27-1792584866.jpeg b/public/userarea/photos/26-27-1792584866.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..3f5b74d21fadae7455e007ceb00de3aab53d7bb7 GIT binary patch literal 86828 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 zyhIegL60V?=|E3fK}xt}4?scc`<getConnection(); +$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + +/* ===================== MENU (stesse voci e permessi della dashboard attuale + pagine nuove) ===================== */ +$dashboardSections = [ + [ + 'id' => 'secOperativo', + 'title' => 'Operativo', + 'subtitle' => 'Produzione di tutti i giorni', + 'icon' => '🚀', + 'buttons' => [ + ['label' => 'Programmazione', 'icon' => '🗓️', 'class' => 'btn-programmazione', 'url' => 'produzione_programmazione_drag.php', 'permission' => 'production.programming.view'], + ['label' => 'Programmazione (nuova)', 'icon' => '📋', 'class' => 'btn-programmazione', 'url' => 'production_programming_v2.php', 'permission' => 'production.programming.view'], + ['label' => 'Tabellone', 'icon' => '🧱', 'class' => 'btn-programmazione', 'url' => 'production_board.php', 'permission' => 'production.programming.view'], + ['label' => 'Nuovi da Mago', 'icon' => '📥', 'class' => 'btn-mago', 'url' => 'production_mago_queue.php', 'permission' => 'production.programming.view', 'badge' => 'mago'], + ['label' => 'Line View', 'icon' => '⚙️', 'class' => 'btn-status', 'url' => 'production_line_view2.php', 'permission' => 'production.line_view.view'], + ['label' => 'Postazione tablet', 'icon' => '📱', 'class' => 'btn-status', 'url' => 'production_station.php', 'permission' => 'production.line_view.view'], + ['label' => 'Magazzino', 'icon' => '📦', 'class' => 'btn-magazzino', 'url' => 'warehouse_dashboard.php', 'permission' => 'warehouse.dashboard.view'], + ['label' => 'Smart-Alert', 'icon' => '⏰', 'class' => 'btn-scadenziario', 'url' => 'scadenzario/index.php', 'permission' => 'deadlines.view'], + ], + ], + [ + 'id' => 'secDirezione', + 'title' => 'Direzione', + 'subtitle' => 'Statistiche, fermi e supervisione', + 'icon' => '📊', + 'buttons' => [ + ['label' => 'Statistiche Produzione', 'icon' => '📈', 'class' => 'btn-statistiche', 'url' => 'production_stats.php', 'permission' => 'production.stats.view'], + ['label' => 'Pause & Fermi', 'icon' => '🛑', 'class' => 'btn-pause-stats', 'url' => 'pause_stats.php', 'permission' => 'production.stats.view'], + ['label' => 'Manager', 'icon' => '👔', 'class' => 'btn-manager', 'url' => 'manager_produzione.php', 'permission' => 'production.manager.view'], + ['label' => 'Manager Stats', 'icon' => '📊', 'class' => 'btn-manager-stats', 'url' => 'manager_stats.php', 'permission' => 'production.manager_stats.view'], + ['label' => 'Schermo reparto', 'icon' => '📺', 'class' => 'btn-kiosk', 'url' => 'kiosk_admin.php', 'permission' => 'production.programming.view'], + ], + ], + [ + 'id' => 'secVendite', + 'title' => 'Business Overview', + 'subtitle' => 'Ordini, fatturato, clienti e consegne (Mago)', + 'icon' => '💶', + 'buttons' => [ + ['label' => 'Sommario', 'icon' => '🚦', 'class' => 'btn-sales-summary', 'url' => 'sales_summary.php', 'permission' => 'sales.stats.view'], + ['label' => 'Andamento ordini', 'icon' => '🧾', 'class' => 'btn-sales', 'url' => 'sales_orders_stats.php', 'permission' => 'sales.stats.view'], + ['label' => 'Confronto anni', 'icon' => '📊', 'class' => 'btn-sales', 'url' => 'sales_orders_years.php', 'permission' => 'sales.stats.view'], + ['label' => 'Scheda cliente', 'icon' => '🪪', 'class' => 'btn-sales', 'url' => 'sales_customer.php', 'permission' => 'sales.stats.view'], + ['label' => 'Consegne', 'icon' => '🚚', 'class' => 'btn-sales-deliveries', 'url' => 'sales_orders_deliveries.php', 'permission' => 'sales.deliveries.view'], + ], + ], + [ + 'id' => 'secAnagrafiche', + 'title' => 'Anagrafiche', + 'subtitle' => 'Dati di base e setup di produzione', + 'icon' => '🗂️', + 'buttons' => [ + ['label' => 'Mescole', 'icon' => '⚗️', 'class' => 'btn-mescole', 'url' => 'mescole.php', 'permission' => 'masterdata.mescole.view'], + ['label' => 'Elenco Profili', 'icon' => '🧩', 'class' => 'btn-matrici', 'url' => 'matrici.php', 'permission' => 'masterdata.matrici.view'], + ['label' => 'Linee Produzione', 'icon' => '🏭', 'class' => 'btn-linee', 'url' => 'linee.php', 'permission' => 'masterdata.linee.view'], + ['label' => 'Imballaggi', 'icon' => '📦', 'class' => 'btn-setup', 'url' => 'packaging_items.php', 'permission' => 'masterdata.packaging.view'], + ['label' => 'Suppliers', 'icon' => '🏷️', 'class' => 'btn-setup', 'url' => 'suppliers.php', 'permission' => 'masterdata.suppliers.view'], + ['label' => 'Setup', 'icon' => '⚙️', 'class' => 'btn-setup', 'url' => 'lookup_values.php', 'permission' => 'masterdata.lookup.view'], + ['label' => 'Fogli di lavoro', 'icon' => '🗒️', 'class' => 'btn-setup', 'url' => 'worksheets.php', 'permission' => 'masterdata.worksheets.view'], + ], + ], + [ + 'id' => 'secServizi', + 'title' => 'Servizi', + 'subtitle' => 'Status, cause pausa, attrezzature', + 'icon' => '🧰', + 'buttons' => [ + ['label' => 'Status', 'icon' => '📋', 'class' => 'btn-setup', 'url' => 'production_status.php', 'permission' => 'services.status.view'], + ['label' => 'Cause di Pausa', 'icon' => '🛑', 'class' => 'btn-problem', 'url' => 'production_pause_reasons.php', 'permission' => 'services.pause_reasons.view'], + ['label' => 'Attrezzature', 'icon' => '🛠️', 'class' => 'btn-tools', 'url' => 'production_tools.php', 'permission' => 'services.tools.view'], + ], + ], + [ + 'id' => 'secPersonale', + 'title' => 'Personale', + 'subtitle' => 'Dipendenti, formazione, skill', + 'icon' => '👥', + 'buttons' => [ + ['label' => 'Dipendenti', 'icon' => '👥', 'class' => 'btn-employees', 'url' => 'employees.php', 'permission' => 'hr.employees.view'], + ['label' => 'Mansioni', 'icon' => '🧩', 'class' => 'btn-setup', 'url' => 'job-roles.php', 'permission' => 'hr.employees.view'], + ['label' => 'Departments', 'icon' => '🏢', 'class' => 'btn-departments', 'url' => 'departments.php', 'permission' => 'hr.departments.view'], + ['label' => 'DPI', 'icon' => '🦺', 'class' => 'btn-setup', 'url' => 'ppe-items.php', 'permission' => 'hr.employees.view'], + ['label' => 'Gestione Formazione', 'icon' => '🎓', 'class' => 'btn-setup', 'url' => 'trainings.php', 'permission' => 'hr.trainings.view'], + ['label' => 'Skills', 'icon' => '🧠', 'class' => 'btn-setup', 'url' => 'skills.php', 'permission' => 'hr.skills.view'], + ], + ], +]; + +/* ===================== DATI ===================== */ +$TZ = new DateTimeZone('Europe/Rome'); +$UTC = new DateTimeZone('UTC'); +$u = function (DateTime $d) use ($UTC) { + $x = clone $d; + return $x->setTimezone($UTC)->format('Y-m-d H:i:s'); +}; +const DV2_NOT_FINISHED = '1,6,2,7'; // da programmare, programmato, in produzione, pausa + +/** Lavori conclusi tra due istanti locali (per ora di fine, salvata in UTC). */ +$produced = function (DateTime $from, DateTime $to) use ($pdo, $u) { + $st = $pdo->prepare("SELECT COUNT(*) n, COALESCE(SUM(kgprod),0) kg, COALESCE(SUM(mtprod),0) mt, COALESCE(SUM(scarto),0) sc + FROM productiondata WHERE end_time >= ? AND end_time < ? AND id_status NOT IN (" . DV2_NOT_FINISHED . ")"); + $st->execute([$u($from), $u($to)]); + $r = $st->fetch(PDO::FETCH_ASSOC); + $kg = (float)$r['kg']; + $sc = (float)$r['sc']; + return ['n' => (int)$r['n'], 'kg' => $kg, 'mt' => (float)$r['mt'], 'scarto' => ($kg + $sc) > 0 ? $sc / ($kg + $sc) * 100 : null]; +}; + +$now = new DateTime('now', $TZ); +$today = new DateTime('today', $TZ); +$yest = (clone $today)->modify('-1 day'); +$yestSame = (clone $yest)->setTime((int)$now->format('H'), (int)$now->format('i')); +$monthStart = new DateTime('first day of this month 00:00', $TZ); +$prevMonthStart = (clone $monthStart)->modify('-1 month'); +$prevMonthSame = (clone $prevMonthStart)->modify('+' . ($now->getTimestamp() - $monthStart->getTimestamp()) . ' seconds'); + +$K = ['today' => null, 'yest' => null, 'month' => null, 'prevMonth' => null]; +$stops = null; +$todo = ['mago' => 0, 'problemi' => 0, 'compilare' => 0, 'daprog' => 0, 'ritardo' => 0]; +$lines = []; +try { + $K['today'] = $produced($today, $now); + $K['yest'] = $produced($yest, $yestSame); + $K['month'] = $produced($monthStart, $now); + $K['prevMonth'] = $produced($prevMonthStart, $prevMonthSame); + + // ore di fermo della settimana + $mon = new DateTime('monday this week', $TZ); + $st = $pdo->prepare("SELECT COALESCE(SUM(GREATEST(0, TIMESTAMPDIFF(SECOND, GREATEST(start_pause, ?), COALESCE(end_pause, UTC_TIMESTAMP())))), 0) + FROM production_pauses WHERE COALESCE(end_pause, UTC_TIMESTAMP()) > ?"); + $st->execute([$u($mon), $u($mon)]); + $stops = (int)$st->fetchColumn() / 3600; + + // cose da gestire + $todo['problemi'] = (int)$pdo->query("SELECT COUNT(*) FROM productiondata WHERE id_status = 8")->fetchColumn(); + $todo['compilare'] = (int)$pdo->query("SELECT COUNT(*) FROM productiondata WHERE id_status = 11")->fetchColumn(); + $todo['daprog'] = (int)$pdo->query("SELECT COUNT(*) FROM productiondata WHERE id_status = 1")->fetchColumn(); + $todo['ritardo'] = (int)$pdo->query("SELECT COUNT(*) FROM productiondata WHERE id_status IN (1,6) AND data_zibo IS NOT NULL AND data_zibo < CURDATE()")->fetchColumn(); + try { + $todo['mago'] = (int)$pdo->query("SELECT COUNT(*) FROM mago_prod_queue WHERE queue_status = 'nuovo' OR (queue_status = 'importato' AND mago_changed = 1)")->fetchColumn(); + } catch (Throwable $e) { + } + + // linee adesso + foreach ($pdo->query("SELECT * FROM production_lines ORDER BY line_number, id")->fetchAll(PDO::FETCH_ASSOC) as $l) { + if (isset($l['status']) && $l['status'] !== '' && $l['status'] !== 'active') continue; + $lines[(int)$l['id']] = ['id' => (int)$l['id'], 'name' => $l['name'], 'color' => $l['color'] ?: '#64748b', 'job' => null, 'queue' => 0, 'next' => null]; + } + $rows = $pdo->query(" + SELECT p.id_linea, p.id_status, p.start_time, p.ore_previste, m.nome AS matrice, + (SELECT COALESCE(SUM(TIMESTAMPDIFF(SECOND, pp.start_pause, pp.end_pause)),0) FROM production_pauses pp WHERE pp.id_production = p.id AND pp.end_pause IS NOT NULL) AS pause_sec, + (SELECT pp.start_pause FROM production_pauses pp WHERE pp.id_production = p.id AND pp.end_pause IS NULL ORDER BY pp.start_pause DESC LIMIT 1) AS open_pause + FROM productiondata p LEFT JOIN matrice m ON m.id = p.idmatrice WHERE p.id_status IN (2,7) ORDER BY p.start_time")->fetchAll(PDO::FETCH_ASSOC); + foreach ($rows as $r) { + $lid = (int)$r['id_linea']; + if (!isset($lines[$lid]) || $lines[$lid]['job']) continue; + $lines[$lid]['job'] = [ + 'matrice' => $r['matrice'], + 'paused' => (int)$r['id_status'] === 7, + 'start_ms' => $r['start_time'] ? (new DateTime($r['start_time'], $UTC))->getTimestamp() * 1000 : null, + 'open_pause_ms' => $r['open_pause'] ? (new DateTime($r['open_pause'], $UTC))->getTimestamp() * 1000 : null, + 'pause_sec' => (int)$r['pause_sec'], + 'ore' => (float)$r['ore_previste'], + ]; + } + foreach ($pdo->query("SELECT p.id_linea, m.nome FROM productiondata p LEFT JOIN matrice m ON m.id = p.idmatrice WHERE p.id_status = 6 ORDER BY p.priority IS NULL, p.priority, p.id") as $r) { + $lid = (int)$r['id_linea']; + if (!isset($lines[$lid])) continue; + $lines[$lid]['queue']++; + if ($lines[$lid]['next'] === null) $lines[$lid]['next'] = $r['nome']; + } +} catch (Throwable $e) { + // la dashboard resta usabile anche se un dato non è disponibile +} + +$userName = ''; +if (!empty($iduserlogin)) { + try { + $st = $pdo->prepare("SELECT COALESCE(NULLIF(TRIM(first_name), ''), username, email) FROM auth_users WHERE id = ?"); + $st->execute([(int)$iduserlogin]); + $userName = (string)$st->fetchColumn(); + } catch (Throwable $e) { + } +} + +if (!function_exists('visibleButtons')) { + function visibleButtons(array $buttons) + { + return array_values(array_filter($buttons, fn($b) => empty($b['permission']) || userCan($b['permission']))); + } +} + +function dv2Num($v, $d = 0) +{ + return number_format((float)$v, $d, ',', '.'); +} + +/** Freccia di confronto (▲ ▼) con percentuale. */ +function dv2Cmp($cur, $prev, $lowerBetter = false) +{ + if ($cur === null || $prev === null) return '—'; + if (!$prev && !$cur) return '= uguale'; + if (!$prev) return '▲ nuovo'; + $p = round(($cur - $prev) / $prev * 100); + if ($p == 0) return '= uguale'; + $good = $lowerBetter ? $p < 0 : $p > 0; + return '' . ($p > 0 ? '▲' : '▼') . ' ' . abs($p) . '%'; +} + +$hour = (int)$now->format('H'); +$greet = $hour < 13 ? 'Buongiorno' : ($hour < 18 ? 'Buon pomeriggio' : 'Buonasera'); +$GIORNI = ['domenica', 'lunedì', 'martedì', 'mercoledì', 'giovedì', 'venerdì', 'sabato']; +$MESI = ['', 'gennaio', 'febbraio', 'marzo', 'aprile', 'maggio', 'giugno', 'luglio', 'agosto', 'settembre', 'ottobre', 'novembre', 'dicembre']; +$canProg = userCan('production.programming.view'); +$canLine = userCan('production.line_view.view'); +$canStats = userCan('production.stats.view'); +?> + $sec['id'], 'title' => $sec['title'], 'icon' => $sec['icon'], 'buttons' => $b]; +} +$todoItems = []; +if ($canProg && $todo['mago']) $todoItems[] = ['n' => $todo['mago'], 'l' => 'Nuovi ordini da Mago', 'u' => 'production_mago_queue.php', 'c' => 'info', 'i' => '📥']; +if ($canProg && $todo['ritardo']) $todoItems[] = ['n' => $todo['ritardo'], 'l' => 'Data Zibo già passata', 'u' => 'production_programming_v2.php', 'c' => 'hot', 'i' => '⏰']; +if ($todo['problemi']) $todoItems[] = ['n' => $todo['problemi'], 'l' => 'Chiusi con problema', 'u' => $canLine ? 'production_line_view2.php' : '', 'c' => 'hot', 'i' => '⚠️']; +if ($todo['compilare']) $todoItems[] = ['n' => $todo['compilare'], 'l' => 'Dati di fine da compilare', 'u' => $canLine ? 'production_line_view2.php' : '', 'c' => 'warn', 'i' => '📝']; +if ($canProg && $todo['daprog']) $todoItems[] = ['n' => $todo['daprog'], 'l' => 'Da programmare', 'u' => 'production_programming_v2.php', 'c' => 'plain', 'i' => '🗓️']; +$t = $K['today']; +$y = $K['yest']; +$m = $K['month']; +$pm = $K['prevMonth']; +?> + + + + + + + + + Dashboard <?= htmlspecialchars($titlewebsite, ENT_QUOTES, 'UTF-8'); ?> + + + + + + + + + +
+
+ + +
+
+
+ + + + + \ No newline at end of file diff --git a/public/userarea/production_programming_v2.php b/public/userarea/production_programming_v2.php new file mode 100644 index 00000000..b58e0b9f --- /dev/null +++ b/public/userarea/production_programming_v2.php @@ -0,0 +1,1839 @@ +getConnection(); +$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + +const PV_TODO = 1; // Da programmare +const PV_PLAN = 6; // Programmato +const PV_ACTIVE = [2, 7, 8]; // In produzione, Pausa, Problema + +function pvOut(array $a) +{ + while (ob_get_level()) ob_end_clean(); + header('Content-Type: application/json; charset=utf-8'); + echo json_encode($a); + exit; +} + +if (!userCan('production.programming.view')) { + if (isset($_GET['action']) || isset($_POST['action'])) pvOut(['success' => false, 'message' => 'Non hai i permessi per questa pagina']); + while (ob_get_level()) ob_end_clean(); + http_response_code(403); + echo '

Accesso non consentito

Torna alla Dashboard
'; + exit; +} + +function pvHas(PDO $pdo, $t) +{ + static $c = []; + if (!isset($c[$t])) { + try { + $pdo->query("SELECT 1 FROM `$t` LIMIT 0"); + $c[$t] = true; + } catch (Throwable $e) { + $c[$t] = false; + } + } + return $c[$t]; +} + +function pvMs($utc) +{ + return $utc ? (new DateTime($utc, new DateTimeZone('UTC')))->getTimestamp() * 1000 : null; +} + +/** Lavori aperti (da programmare, programmati, in macchina) con tutto quello che serve alla pagina. */ +function pvJobs(PDO $pdo) +{ + $mago = pvHas($pdo, 'mago_prod_queue'); + $photos = pvHas($pdo, 'production_photos') + ? "(SELECT GROUP_CONCAT(ph.photo_type) FROM production_photos ph WHERE ph.production_id = p.id)" : 'NULL'; + $in = implode(',', array_merge([PV_TODO, PV_PLAN], PV_ACTIVE)); + $rows = $pdo->query(" + SELECT p.id, p.id_status, p.id_linea, p.priority, p.conferma_ordine, p.idmatrice, m.nome AS matrice, m.photo, + p.id_cliente, c.nome AS cliente, p.data_zibo, p.data_cliente, p.data_produzione, p.metri, p.kg_sp, p.kg_p, + p.ore_previste, p.note_extra, p.note_operatore, p.start_time, + s.nome AS status_nome, COALESCE(s.badge_color, '#6c757d') AS status_color, + (SELECT GROUP_CONCAT(ms.nome ORDER BY ms.nome SEPARATOR '||') FROM productiondata_mescole pm JOIN mescole ms ON ms.id = pm.id_mescola WHERE pm.id_productiondata = p.id) AS mescole, + (SELECT GROUP_CONCAT(pm.id_mescola) FROM productiondata_mescole pm WHERE pm.id_productiondata = p.id) AS mescole_ids, + (SELECT GROUP_CONCAT(ml.idlinea) FROM matrici_lines ml WHERE ml.idmatrice = p.idmatrice) AS matrice_lines, + (SELECT COALESCE(SUM(TIMESTAMPDIFF(SECOND, pp.start_pause, pp.end_pause)), 0) FROM production_pauses pp WHERE pp.id_production = p.id AND pp.end_pause IS NOT NULL) AS pause_sec, + (SELECT pp.start_pause FROM production_pauses pp WHERE pp.id_production = p.id AND pp.end_pause IS NULL ORDER BY pp.start_pause DESC LIMIT 1) AS open_pause, + " . ($mago ? "(SELECT MAX(q.mago_changed) FROM mago_prod_queue q WHERE q.productiondata_id = p.id)" : "NULL") . " AS mago_changed, + " . ($mago ? "(SELECT COUNT(*) FROM mago_prod_queue q WHERE q.productiondata_id = p.id)" : "0") . " AS from_mago, + $photos AS photos + FROM productiondata p + LEFT JOIN matrice m ON m.id = p.idmatrice + LEFT JOIN clients c ON c.id = p.id_cliente + LEFT JOIN production_status s ON s.id = p.id_status + WHERE p.id_status IN ($in) + ORDER BY p.priority IS NULL, p.priority, p.id")->fetchAll(PDO::FETCH_ASSOC); + + foreach ($rows as &$j) { + foreach (['id', 'id_status', 'id_linea', 'idmatrice', 'id_cliente', 'priority'] as $k) $j[$k] = $j[$k] === null ? null : (int)$j[$k]; + foreach (['metri', 'kg_sp', 'kg_p', 'ore_previste'] as $k) $j[$k] = (float)$j[$k]; + $j['mescole'] = $j['mescole'] ? explode('||', $j['mescole']) : []; + $j['mescole_ids'] = $j['mescole_ids'] ? array_map('intval', explode(',', $j['mescole_ids'])) : []; + $j['matrice_lines'] = $j['matrice_lines'] ? array_map('intval', explode(',', $j['matrice_lines'])) : []; + $j['from_mago'] = (int)$j['from_mago'] > 0; + $j['mago_changed'] = (int)$j['mago_changed'] === 1; + $j['start_ms'] = pvMs($j['start_time']); + $j['open_pause_ms'] = pvMs($j['open_pause']); + $j['pause_sec'] = (int)$j['pause_sec']; + $ph = ['lotto_mescola' => 0, 'parametri_macchina' => 0, 'problema' => 0]; + foreach (array_filter(explode(',', (string)$j['photos'])) as $t) if (isset($ph[$t])) $ph[$t]++; + $j['photos'] = $ph; + unset($j['start_time'], $j['open_pause']); + } + unset($j); + return $rows; +} + +function pvDate($k) +{ + $v = trim((string)($_POST[$k] ?? '')); + return MagoSalesStats::isValidDate($v) ? $v : null; +} + +/* ===================== AJAX ===================== */ +$action = $_GET['action'] ?? $_POST['action'] ?? ''; +if ($action !== '') { + try { + if ($action === 'list') { + $lines = []; + foreach ($pdo->query("SELECT * FROM production_lines ORDER BY line_number, id")->fetchAll(PDO::FETCH_ASSOC) as $l) { + $lines[] = [ + 'id' => (int)$l['id'], + 'name' => $l['name'], + 'color' => !empty($l['color']) ? $l['color'] : '#64748b', + 'active' => !isset($l['status']) || $l['status'] === '' || $l['status'] === 'active' + ]; + } + $nuovi = pvHas($pdo, 'mago_prod_queue') ? (int)$pdo->query("SELECT COUNT(*) FROM mago_prod_queue WHERE queue_status = 'nuovo' OR (queue_status = 'importato' AND mago_changed = 1)")->fetchColumn() : 0; + pvOut(['success' => true, 'now_ms' => time() * 1000, 'lines' => $lines, 'jobs' => pvJobs($pdo), 'nuoviMago' => $nuovi]); + } + + if ($action === 'options') { + pvOut([ + 'success' => true, + 'matrici' => $pdo->query("SELECT id, nome FROM matrice WHERE TRIM(nome) <> '' ORDER BY nome")->fetchAll(PDO::FETCH_ASSOC), + 'mescole' => $pdo->query("SELECT id, nome FROM mescole WHERE is_active = 1 ORDER BY nome")->fetchAll(PDO::FETCH_ASSOC), + 'clienti' => $pdo->query("SELECT id, nome FROM clients ORDER BY nome")->fetchAll(PDO::FETCH_ASSOC), + ]); + } + + if ($action === 'matinfo') { + pvOut(['success' => true, 'info' => MagoProduction::matriceInfo($pdo, (int)($_GET['id'] ?? 0))]); + } + + // ---------- nuovo / modifica ---------- + if ($action === 'save') { + $id = (int)($_POST['id'] ?? 0); + $idm = (int)($_POST['idmatrice'] ?? 0); + $lin = (int)($_POST['id_linea'] ?? 0); + if (!$idm) throw new RuntimeException('Scegli la matrice'); + if (!$lin) throw new RuntimeException('Scegli la linea'); + $status = (int)($_POST['id_status'] ?? PV_TODO); + if (!in_array($status, [PV_TODO, PV_PLAN], true)) $status = PV_TODO; + $num = function ($k, $max = 99999999) { + return min($max, round((float)str_replace(',', '.', (string)($_POST[$k] ?? 0)), 2)); + }; + $f = [ + 'conferma_ordine' => mb_substr(trim((string)($_POST['conferma_ordine'] ?? '')), 0, 50) ?: null, + 'idmatrice' => $idm, + 'id_linea' => $lin, + 'id_cliente' => (int)($_POST['id_cliente'] ?? 0) ?: null, + 'data_zibo' => pvDate('data_zibo'), + 'data_cliente' => pvDate('data_cliente'), + 'data_produzione' => pvDate('data_produzione'), + 'metri' => $num('metri'), + 'kg_sp' => $num('kg_sp'), + 'kg_p' => $num('kg_p'), + 'ore_previste' => $num('ore_previste', 999.99), + 'note_extra' => trim((string)($_POST['note_extra'] ?? '')) ?: null, + ]; + $pdo->beginTransaction(); + if ($id) { + $st = $pdo->prepare("SELECT id_status FROM productiondata WHERE id = ? FOR UPDATE"); + $st->execute([$id]); + $cur = $st->fetchColumn(); + if ($cur === false) throw new RuntimeException('Lavoro non trovato'); + $cur = (int)$cur; + $set = implode(', ', array_map(fn($k) => "$k = :$k", array_keys($f))); + if (in_array($cur, [PV_TODO, PV_PLAN], true) && $status !== $cur) { + $set .= ', id_status = :st, priority = :pr'; + $f['st'] = $status; + $f['pr'] = MagoProduction::nextPriority($pdo, $status); + } + $f['id'] = $id; + $pdo->prepare("UPDATE productiondata SET $set WHERE id = :id")->execute($f); + } else { + $f['id_status'] = $status; + $f['priority'] = MagoProduction::nextPriority($pdo, $status); + $cols = array_keys($f); + $pdo->prepare("INSERT INTO productiondata (Data, " . implode(', ', $cols) . ", fermomacchina, `hour`, hourprod, kgprod, mtprod, scarto) + VALUES (CURDATE(), :" . implode(', :', $cols) . ", 0, '00:00:00', '00:00:00', 0, 0, 0)")->execute($f); + $id = (int)$pdo->lastInsertId(); + } + $pdo->prepare("DELETE FROM productiondata_mescole WHERE id_productiondata = ?")->execute([$id]); + $ins = $pdo->prepare("INSERT INTO productiondata_mescole (id_productiondata, id_mescola) VALUES (?, ?)"); + foreach (array_unique(array_filter(array_map('intval', (array)($_POST['mescole'] ?? [])))) as $m) $ins->execute([$id, $m]); + $pdo->commit(); + pvOut(['success' => true, 'id' => $id]); + } + + // ---------- ordine di tutte le righe (anche quelle nascoste dal filtro) ---------- + if ($action === 'order') { + $p = json_decode((string)($_POST['payload'] ?? ''), true); + if (!is_array($p)) throw new RuntimeException('Dati non validi'); + $upd = $pdo->prepare("UPDATE productiondata SET id_status = ?, priority = ? WHERE id = ? AND id_status IN (" . PV_TODO . "," . PV_PLAN . ")"); + $pdo->beginTransaction(); + foreach ([PV_PLAN => 'plan', PV_TODO => 'todo'] as $st => $k) { + $n = 0; + foreach ((array)($p[$k] ?? []) as $id) $upd->execute([$st, ++$n, (int)$id]); + } + $pdo->commit(); + pvOut(['success' => true]); + } + + // ---------- azioni su più righe ---------- + if ($action === 'bulk') { + $ids = array_values(array_filter(array_map('intval', (array)($_POST['ids'] ?? [])))); + if (!$ids) throw new RuntimeException('Nessuna riga selezionata'); + $op = (string)($_POST['op'] ?? ''); + $pdo->beginTransaction(); + if ($op === 'program' || $op === 'unprogram') { + $to = $op === 'program' ? PV_PLAN : PV_TODO; + $prio = MagoProduction::nextPriority($pdo, $to); + $st = $pdo->prepare("UPDATE productiondata SET id_status = ?, priority = ? WHERE id = ? AND id_status IN (" . PV_TODO . "," . PV_PLAN . ")"); + foreach ($ids as $id) $st->execute([$to, $prio++, $id]); + } elseif ($op === 'line') { + $lin = (int)($_POST['line'] ?? 0); + if (!$lin) throw new RuntimeException('Scegli la linea'); + $st = $pdo->prepare("UPDATE productiondata SET id_linea = ? WHERE id = ? AND id_status IN (" . PV_TODO . "," . PV_PLAN . ")"); + foreach ($ids as $id) $st->execute([$lin, $id]); + } else { + throw new RuntimeException('Azione sconosciuta'); + } + $pdo->commit(); + pvOut(['success' => true, 'n' => count($ids)]); + } + + // ---------- duplica (per ripetere un lavoro) ---------- + if ($action === 'duplicate') { + $id = (int)($_POST['id'] ?? 0); + $pdo->beginTransaction(); + $prio = MagoProduction::nextPriority($pdo, PV_TODO); + $st = $pdo->prepare("INSERT INTO productiondata (Data, conferma_ordine, idmatrice, id_linea, id_cliente, data_zibo, data_cliente, metri, kg_sp, kg_p, + ore_previste, note_extra, id_status, priority, fermomacchina, `hour`, hourprod, kgprod, mtprod, scarto) + SELECT CURDATE(), conferma_ordine, idmatrice, id_linea, id_cliente, data_zibo, data_cliente, metri, kg_sp, kg_p, + ore_previste, note_extra, ?, ?, 0, '00:00:00', '00:00:00', 0, 0, 0 FROM productiondata WHERE id = ?"); + $st->execute([PV_TODO, $prio, $id]); + if (!$st->rowCount()) throw new RuntimeException('Lavoro non trovato'); + $new = (int)$pdo->lastInsertId(); + $pdo->prepare("INSERT INTO productiondata_mescole (id_productiondata, id_mescola) SELECT ?, id_mescola FROM productiondata_mescole WHERE id_productiondata = ?")->execute([$new, $id]); + $pdo->commit(); + pvOut(['success' => true, 'id' => $new]); + } + + // ---------- elimina (solo non avviati) ---------- + if ($action === 'delete') { + $id = (int)($_POST['id'] ?? 0); + $pdo->beginTransaction(); + $st = $pdo->prepare("SELECT id_status FROM productiondata WHERE id = ? FOR UPDATE"); + $st->execute([$id]); + $cur = $st->fetchColumn(); + if ($cur === false) throw new RuntimeException('Lavoro non trovato'); + if (!in_array((int)$cur, [PV_TODO, PV_PLAN], true)) throw new RuntimeException('Si possono eliminare solo i lavori non ancora avviati'); + if (pvHas($pdo, 'mago_prod_queue')) { + $pdo->prepare("UPDATE mago_prod_queue SET queue_status = 'nuovo', productiondata_id = NULL, imported_at = NULL, mago_changed = 0, mago_changes = '', updated_at = NOW() WHERE productiondata_id = ?")->execute([$id]); + } + $pdo->prepare("DELETE FROM productiondata_mescole WHERE id_productiondata = ?")->execute([$id]); + $pdo->prepare("DELETE FROM productiondata WHERE id = ?")->execute([$id]); + $pdo->commit(); + pvOut(['success' => true]); + } + + // ---------- foto di un lavoro in macchina ---------- + if ($action === 'photos') { + $id = (int)($_GET['id'] ?? 0); + $st = $pdo->prepare("SELECT id, photo_type, param_position, filename, created_at FROM production_photos WHERE production_id = ? ORDER BY created_at DESC, id DESC"); + $st->execute([$id]); + $params = []; + $st2 = $pdo->prepare("SELECT pl.position, pl.short_label, pl.label FROM production_line_params pl JOIN productiondata p ON p.id_linea = pl.line_id WHERE p.id = ? ORDER BY pl.position"); + try { + $st2->execute([$id]); + $params = $st2->fetchAll(PDO::FETCH_ASSOC); + } catch (Throwable $e) { + } + pvOut(['success' => true, 'rows' => $st->fetchAll(PDO::FETCH_ASSOC), 'params' => $params]); + } + + pvOut(['success' => false, 'message' => 'Azione sconosciuta']); + } catch (Throwable $e) { + if ($pdo->inTransaction()) $pdo->rollBack(); + $msg = $e->getMessage(); + if (strpos($msg, '1451') !== false) $msg = 'Il lavoro ha dati collegati (foto, registrazioni) e non si può eliminare'; + pvOut(['success' => false, 'message' => $msg]); + } +} +?> + + + + + + + + + Programmazione produzione - <?= htmlspecialchars($titlewebsite, ENT_QUOTES, 'UTF-8'); ?> + + + + + + + + + + + +
+ + + +
+
+
+
+
+
+
Programmazione produzione
+ Clic su una riga per modificarla · trascina per cambiare l'ordine +
+
+
+ Nuovi da Mago + Vista tabellone + + Torna +
+
+ +
+
+ +
+ +
+
+
In macchina
0 +
+
+
+ +
+
+
Programmati
0 + L'ordine vale per tutte le righe, anche quelle nascoste dal filtro +
+
+ + + + + + + + + + + + + + + + + + + + + + +
#OrdineMatriceMescoleLineaClienteData ZiboData clienteMetriKg SPKg POreNoteAzioni
+
+
+ +
+
+
Da programmare
0 + Clic sulle intestazioni per ordinare · seleziona più righe per azioni multiple +
+
+ + + + + + + + + + + + + + + + + + + + + +
OrdineMatriceMescoleLineaClienteData ZiboData clienteMetriKg SPKg POreNoteAzioni
+
+
+ + +
+ + +
+ +
+
+
+
+ +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/userarea/sales_customer.php b/public/userarea/sales_customer.php index ea3ecddb..ba893f43 100644 --- a/public/userarea/sales_customer.php +++ b/public/userarea/sales_customer.php @@ -5,6 +5,7 @@ error_reporting(E_ALL); include('include/headscript.php'); require_once __DIR__ . '/class/MagoSalesStats.php'; +require_once __DIR__ . '/class/UiPrefs.php'; $db = DBHandlerSelect::getInstance(); $pdo = $db->getConnection(); @@ -1228,52 +1229,53 @@ if ($action === 'data') {
- -
-
+
+ +
> +
Ordinato e fatturato per anno
Anno in corso: valori ad oggi
-
+
Ultimi 24 mesi
Ordinato per data ordine, fatturato per data fattura
-
- - -
-
- - - - - -
-
-
-
-
-
- - -
- -
-
+
+ +
> +
@@ -740,37 +742,37 @@ if ($action === 'data') {
-
+
Clienti con più ritardo
Valore residuo scaduto (data ZIBO) · clicca per filtrare
-
- - -
-
-
Righe da consegnare
-
Ordinate per scadenza
-
-
- - - - - - - - - - - - - - -
OrdineClienteArticoloResiduoConsegna (ZIBO / cliente)RitardoValore residuoAgente
+
+
+
+
Righe da consegnare
+
Ordinate per scadenza
+
+
+ + + + + + + + + + + + + + +
OrdineClienteArticoloResiduoConsegna (ZIBO / cliente)RitardoValore residuoAgente
+
+
diff --git a/public/userarea/sales_orders_stats.php b/public/userarea/sales_orders_stats.php index b035f91c..fb1ca7a9 100644 --- a/public/userarea/sales_orders_stats.php +++ b/public/userarea/sales_orders_stats.php @@ -6,6 +6,7 @@ error_reporting(E_ALL); include('include/headscript.php'); require_once __DIR__ . '/class/MagoSync.php'; require_once __DIR__ . '/class/MagoSalesStats.php'; +require_once __DIR__ . '/class/UiPrefs.php'; $db = DBHandlerSelect::getInstance(); $pdo = $db->getConnection(); @@ -1072,17 +1073,49 @@ if ($action === 'order') { +
-
Analisi
-
- - +
+ Grafici in +
+ + +
+
- -
-
+ +
> + +
+
+
+
Elenco ordini
+
Clicca una riga per il dettaglio
+
+
+ + + + + + + + + + + + + + + + +
N° ordineDataClienteRif. clienteConsegna (ZIBO / cliente)ImponibileStatoFatt.AgenteArea
+
+
+
+
@@ -1093,83 +1126,47 @@ if ($action === 'order') {
-
+
Ripartizione per stato
Clicca una fetta per filtrare
-
- -
-
+
Top 10 clienti per numero ordini
Clicca un cliente per vedere solo i suoi ordini
-
+
Scadenze ordini aperti
In base alla data di consegna prevista
-
- -
-
+
Top 10 articoli per numero ordini
Dalle righe ordine · passa sopra una barra per quantità e valore
-
- -
-
+
Ordini per area
-
+
Ordini per agente
- - -
-
-
Elenco ordini
-
Clicca una riga per il dettaglio
-
-
- - - - - - - - - - - - - - - - -
N° ordineDataClienteRif. clienteConsegna (ZIBO / cliente)ImponibileStatoFatt.AgenteArea
-
-
@@ -1382,10 +1379,18 @@ if ($action === 'order') { } // aperta da link (?q=numero ordine): non sovrascrivo i filtri salvati dell'utente - const URL_Q = new URLSearchParams(location.search).get('q'); + const URL_P = new URLSearchParams(location.search); + const URL_Q = URL_P.get('q'); + // aperta dal Sommario (?from=&to=&st=): periodo e stati del box cliccato, senza toccare i filtri salvati + const URL_RANGE = /^\d{4}-\d{2}-\d{2}$/.test(URL_P.get('from') || '') ? { + from: URL_P.get('from'), + to: /^\d{4}-\d{2}-\d{2}$/.test(URL_P.get('to') || '') ? URL_P.get('to') : URL_P.get('from'), + st: (URL_P.get('st') || '').split(',').filter(Boolean) + } : null; + const URL_LINK = !!(URL_Q || URL_RANGE); function saveFilters(f) { - if (URL_Q) return; + if (URL_LINK) return; try { localStorage.setItem(STORE_KEY, JSON.stringify(Object.assign({}, f, { metric: metric @@ -2328,7 +2333,7 @@ if ($action === 'order') { loadFilterOptions(false).then(d => { window.__totalOrders = d && d.sync ? d.sync.total_orders : 0; - const saved = URL_Q ? null : restoreFilters(); + const saved = URL_LINK ? null : restoreFilters(); if (saved && saved.metric === 'value') metric = 'value'; if (URL_Q) { // tutto lo storico, solo l'ordine cercato; se è uno solo apro il dettaglio @@ -2337,6 +2342,11 @@ if ($action === 'order') { $('#periodChips .chip').removeClass('active'); $('#fSearch').val(URL_Q); window.__autoOpen = URL_Q; + } else if (URL_RANGE) { + $('#fFrom').val(URL_RANGE.from); + $('#fTo').val(URL_RANGE.to); + $('#periodChips .chip').removeClass('active'); + URL_RANGE.st.forEach(st => $(`#statusChips .chip[data-status="${st}"]`).addClass('active')); } if (saved && saved.from) { $('#fFrom').val(saved.from); @@ -2346,7 +2356,7 @@ if ($action === 'order') { $('#fAreas').val(saved.areas || []).trigger('change.select2'); (saved.statuses || []).forEach(s => $(`#statusChips .chip[data-status="${s}"]`).addClass('active')); $('#fSearch').val(saved.q || ''); - } else if (!URL_Q) { + } else if (!URL_LINK) { setPeriod('y' + new Date().getFullYear(), true); } loadData(); @@ -2355,6 +2365,7 @@ if ($action === 'order') { })(); + \ No newline at end of file diff --git a/public/userarea/sales_orders_years.php b/public/userarea/sales_orders_years.php index 04350aac..a04ac6fb 100644 --- a/public/userarea/sales_orders_years.php +++ b/public/userarea/sales_orders_years.php @@ -5,6 +5,7 @@ error_reporting(E_ALL); include('include/headscript.php'); require_once __DIR__ . '/class/MagoSalesStats.php'; +require_once __DIR__ . '/class/UiPrefs.php'; $db = DBHandlerSelect::getInstance(); $pdo = $db->getConnection(); @@ -1033,120 +1034,119 @@ if ($action === 'data') {
- - -
- Situazione ad oggi - non dipende dagli anni scelti · segue i filtri cliente, agente e area -
-
-
-
Ordinato vs fatturato · ultimi 24 mesi
-
Barre: valori del mese · linea: book-to-bill su 3 mesi (ordinato ÷ fatturato: sopra 1 il portafoglio cresce, sotto 1 si consuma)
-
-
+
-
Anni a confronto
-
- - -
-
+ +
> +
+
+ Situazione ad oggi + non dipende dagli anni scelti · segue i filtri cliente, agente e area +
+
+
+
Ordinato vs fatturato · ultimi 24 mesi
+
Barre: valori del mese · linea: book-to-bill su 3 mesi (ordinato ÷ fatturato: sopra 1 il portafoglio cresce, sotto 1 si consuma)
+
+
+
+
+
Anni a confronto
+
+
+
Andamento mensile
Stagionalità: un colore per anno
-
+
Progressivo dell'anno
Somma da gennaio: dice se si è avanti o indietro rispetto agli anni scorsi
-
- - -
-
+
Fatturato per mese
Imponibile fatture + acconti − note di credito, per data fattura
-
+
Fatturato progressivo dell'anno
Somma da gennaio del fatturato, anno su anno
-
- - -
- -