diff --git a/public/userarea/class/MagoSalesStats.php b/public/userarea/class/MagoSalesStats.php index 3ac57efe..0dda9934 100644 --- a/public/userarea/class/MagoSalesStats.php +++ b/public/userarea/class/MagoSalesStats.php @@ -211,6 +211,32 @@ class MagoSalesStats ]; } + /** + * SOMMARIO (semafori): soglie [verde, rosso]. Tra le due = giallo. + * Per gli indicatori "più alto è meglio" verde se >= primo valore, rosso se < secondo. + * Per quelli "più basso è meglio" verde se <= primo valore, rosso se > secondo. + */ + const SUMMARY_THRESHOLDS = [ + 'growth' => [3, -3], // % crescita vs stessa data anno prima (fatturato, ordinato, previsione) + 'b2b' => [1.05, 0.95], // book-to-bill 90 gg + 'cover_weeks' => [8, 4], // settimane di lavoro in portafoglio + 'late_pct' => [10, 25], // % del portafoglio già oltre data ZIBO (più basso è meglio) + 'risk_pct' => [3, 8], // % fatturato 12 mesi di clienti dormienti/persi (più basso è meglio) + 'top5_pct' => [40, 60], // % fatturato 12 mesi dei primi 5 clienti (più basso è meglio) + 'cn_pct' => [1.5, 3], // % note di credito su fatturato 12 mesi (più basso è meglio) + 'customers' => [0, -5], // % variazione clienti attivi 12 mesi + ]; + + /** Semaforo: 'green' | 'yellow' | 'red' | 'grey' (dato non disponibile). */ + public static function light($value, $key, $lowerIsBetter = false) + { + if ($value === null || !is_finite((float)$value)) return 'grey'; + [$g, $r] = self::SUMMARY_THRESHOLDS[$key]; + $v = (float)$value; + if ($lowerIsBetter) return $v <= $g ? 'green' : ($v > $r ? 'red' : 'yellow'); + return $v >= $g ? 'green' : ($v < $r ? 'red' : 'yellow'); + } + /** Etichette dei tipi documento (tabella documenti). */ const INVOICE_TYPE_LABELS = [ 3407874 => 'Fattura', diff --git a/public/userarea/sales_customer.php b/public/userarea/sales_customer.php index 823e8538..bcdfd2bc 100644 --- a/public/userarea/sales_customer.php +++ b/public/userarea/sales_customer.php @@ -1198,6 +1198,7 @@ if ($action === 'data') {