From b2a2f563834337e9be57b6e3f902039f51b204c6 Mon Sep 17 00:00:00 2001 From: solocla Date: Tue, 13 Oct 2026 17:34:33 +0200 Subject: [PATCH] fixed stat 4 --- public/userarea/class/MagoSalesStats.php | 22 ++++++++++++++++++++-- public/userarea/sales_orders_stats.php | 20 ++++++++++---------- 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/public/userarea/class/MagoSalesStats.php b/public/userarea/class/MagoSalesStats.php index 50504e22..f1b149d4 100644 --- a/public/userarea/class/MagoSalesStats.php +++ b/public/userarea/class/MagoSalesStats.php @@ -59,6 +59,12 @@ class MagoSalesStats return "DATE_ADD($z, INTERVAL (" . (int)self::ZIBO_WEEK_END_DAYS . " - WEEKDAY($z)) DAY)"; } + /** Scadenza di testata (usata solo per ordini senza righe). */ + public static function headerDue($a) + { + return "COALESCE(" . self::ziboDeadline($a) . ", " . self::clientDate($a) . ", $a.compulsory_delivery_date)"; + } + /** Scadenza effettiva di una riga: fine settimana ZIBO, se manca la data cliente. */ public static function lineDue($a) { @@ -167,6 +173,18 @@ class MagoSalesStats COALESCE(l.late_lines, 0) AS late_lines, COALESCE(l.late_lines_client, 0) AS late_lines_client, COALESCE(l.week_lines, 0) AS week_lines, + -- RITARDO calcolato sulle RIGHE: un ordine รจ in ritardo solo se ha almeno una riga aperta scaduta. + -- (Solo se l'ordine non ha righe si usa la data di testata.) + CASE WHEN o.cancelled = 0 AND o.delivered = 0 AND ( + (COALESCE(l.lines_total, 0) > 0 AND l.late_lines > 0) + OR (COALESCE(l.lines_total, 0) = 0 AND " . self::headerDue('o') . " < CURDATE()) + ) THEN 1 ELSE 0 END AS is_late, + CASE WHEN o.cancelled = 0 AND o.delivered = 0 AND ( + (COALESCE(l.lines_total, 0) > 0 AND l.late_lines_client > 0) + OR (COALESCE(l.lines_total, 0) = 0 AND " . self::clientDate('o') . " < CURDATE()) + ) THEN 1 ELSE 0 END AS is_late_client, + -- scadenza delle sole righe ancora aperte (per il grafico scadenze) + CASE WHEN COALESCE(l.lines_total, 0) > 0 THEN l.next_due ELSE " . self::headerDue('o') . " END AS open_due, CASE WHEN o.cancelled = 1 THEN 'annullato' WHEN o.delivered = 1 THEN 'evaso' @@ -250,8 +268,8 @@ class MagoSalesStats 'evaso' => "x.status = 'evaso'", 'annullato' => "x.status = 'annullato'", 'bloccato' => "x.status = 'bloccato'", - 'ritardo' => "(x.status IN ('aperto','bloccato') AND x.due_date < CURDATE())", - 'ritardo_cliente' => "(x.status IN ('aperto','bloccato') AND x.client_date < CURDATE())", + 'ritardo' => "x.is_late = 1", + 'ritardo_cliente' => "x.is_late_client = 1", 'settimana' => "(x.status IN ('aperto','bloccato') AND x.week_lines > 0)", // righe da consegnare questa settimana 'da_fatturare' => "(x.delivered = 1 AND x.invoiced = 0 AND x.cancelled = 0)", 'fatturato' => "x.invoiced = 1", diff --git a/public/userarea/sales_orders_stats.php b/public/userarea/sales_orders_stats.php index df69e981..d4a49799 100644 --- a/public/userarea/sales_orders_stats.php +++ b/public/userarea/sales_orders_stats.php @@ -72,8 +72,8 @@ if ($action === 'data') { SUM(x.status = 'evaso') AS delivered, SUM(x.status = 'annullato') AS cancelled, SUM(x.status = 'bloccato') AS blocked, - SUM(x.status IN ('aperto','bloccato') AND x.due_date < CURDATE()) AS late, - SUM(x.status IN ('aperto','bloccato') AND x.client_date < CURDATE()) AS late_client, + SUM(x.is_late) AS late, + SUM(x.is_late_client) AS late_client, SUM(x.status IN ('aperto','bloccato') AND x.late_lines > 0 AND x.late_lines < x.open_lines) AS late_partial, SUM(CASE WHEN x.status IN ('aperto','bloccato') THEN x.late_lines ELSE 0 END) AS late_lines, SUM(x.status IN ('aperto','bloccato') AND x.week_lines > 0) AS week_orders, @@ -84,7 +84,7 @@ if ($action === 'data') { THEN DATEDIFF(x.due_date, x.order_date) END) AS avg_lead_days, COALESCE(SUM($val), 0) AS value_total, COALESCE(SUM(CASE WHEN x.status IN ('aperto','bloccato') THEN x.taxable_amount ELSE 0 END), 0) AS value_open, - COALESCE(SUM(CASE WHEN x.status IN ('aperto','bloccato') AND x.due_date < CURDATE() THEN x.taxable_amount ELSE 0 END), 0) AS value_late, + COALESCE(SUM(CASE WHEN x.is_late = 1 THEN x.taxable_amount ELSE 0 END), 0) AS value_late, COALESCE(SUM(CASE WHEN x.delivered = 1 AND x.invoiced = 0 AND x.cancelled = 0 THEN x.taxable_amount ELSE 0 END), 0) AS value_to_invoice, AVG(CASE WHEN x.status <> 'annullato' THEN x.taxable_amount END) AS value_avg, SUM(x.summary_tb_modified IS NULL) AS missing_amounts @@ -151,11 +151,11 @@ if ($action === 'data') { $dueBuckets = MagoSalesStats::fetchAllQ($pdo, " SELECT bucket, SUM(mv) AS n FROM ( SELECT CASE - WHEN x.due_date IS NULL THEN '6_senza' - WHEN x.due_date < CURDATE() THEN '1_scaduti' - WHEN YEARWEEK(x.due_date, 3) = YEARWEEK(CURDATE(), 3) THEN '2_settimana' - WHEN YEARWEEK(x.due_date, 3) = YEARWEEK(CURDATE() + INTERVAL 7 DAY, 3) THEN '3_prossima' - WHEN x.due_date <= CURDATE() + INTERVAL 30 DAY THEN '4_30gg' + WHEN x.is_late = 1 THEN '1_scaduti' + WHEN x.open_due IS NULL THEN '6_senza' + WHEN YEARWEEK(x.open_due, 3) = YEARWEEK(CURDATE(), 3) THEN '2_settimana' + WHEN YEARWEEK(x.open_due, 3) = YEARWEEK(CURDATE() + INTERVAL 7 DAY, 3) THEN '3_prossima' + WHEN x.open_due <= CURDATE() + INTERVAL 30 DAY THEN '4_30gg' ELSE '5_oltre' END AS bucket, $m AS mv @@ -188,9 +188,9 @@ if ($action === 'data') { x.salesperson, x.area, x.status, x.invoiced, x.your_reference, x.taxable_amount, x.total_amount, x.zibo_date, x.client_date, x.open_lines, x.late_lines, x.late_lines_client, x.open_dates, x.week_lines, - (x.status IN ('aperto','bloccato') AND x.client_date < CURDATE()) AS is_late_client, + x.is_late_client, (x.summary_tb_modified IS NULL) AS no_amount, - (x.status IN ('aperto','bloccato') AND x.due_date < CURDATE()) AS is_late + x.is_late FROM $from WHERE $where ORDER BY x.order_date DESC, x.sale_ord_id DESC