fixed stat 4

This commit is contained in:
2026-10-13 17:34:33 +02:00
parent 22114963db
commit b2a2f56383
2 changed files with 30 additions and 12 deletions
+20 -2
View File
@@ -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",
+10 -10
View File
@@ -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