added sales summary
This commit is contained in:
@@ -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',
|
||||
|
||||
@@ -1198,6 +1198,7 @@ if ($action === 'data') {
|
||||
<div class="card-body pt-0">
|
||||
|
||||
<div class="stats-tabs">
|
||||
<a href="sales_summary.php"><i class="fa-solid fa-gauge-high me-1"></i> Sommario</a>
|
||||
<a href="sales_orders_stats.php"><i class="fa-solid fa-list-check me-1"></i> Andamento ordini</a>
|
||||
<a href="sales_orders_years.php"><i class="fa-solid fa-chart-column me-1"></i> Confronto anni</a>
|
||||
<a href="sales_customer.php" class="active"><i class="fa-solid fa-address-card me-1"></i> Scheda cliente</a>
|
||||
@@ -1925,7 +1926,7 @@ if ($action === 'data') {
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
<script src="sales_help.js?v=1"></script>
|
||||
<script src="sales_help.js?v=2"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -57,6 +57,87 @@
|
||||
<p class="sh-note">Utile prima di una telefonata o di una visita. I clienti visti di recente restano a portata di clic.</p>`,
|
||||
},
|
||||
|
||||
"page.summary": {
|
||||
t: "Sommario: come si legge",
|
||||
b: `<p>Il <b>riepilogo per la direzione</b>: in un colpo d'occhio cosa va bene e cosa no.</p>
|
||||
<ul>
|
||||
<li><b>Semaforo in alto</b>: il giudizio complessivo. Il punteggio su 100 conta i verdi (100), i gialli (50) e i rossi (0).</li>
|
||||
<li><b>Cosa va bene / Cosa non va</b>: gli stessi indicatori, scritti in frasi semplici; i rossi sono in cima.</li>
|
||||
<li><b>Tessere</b>: ogni indicatore ha il suo colore. <span class="sh-chip sh-green">Bene</span> <span class="sh-chip sh-amber">Così così</span> <span class="sh-chip sh-red">Male</span>. Clic sulla tessera per andare alla pagina con i dettagli.</li>
|
||||
<li><b>Clienti da guardare</b>: chi cresce, chi cala, chi richiamare subito. Clic sul nome per la scheda cliente.</li>
|
||||
</ul>
|
||||
<p class="sh-note">Il sommario guarda sempre <b>tutta l'azienda ad oggi</b>: non ha filtri. Per approfondire usa le altre pagine.</p>`,
|
||||
},
|
||||
|
||||
/* ===================== SOMMARIO ===================== */
|
||||
"sm.invYtd": {
|
||||
t: "Fatturato dell'anno",
|
||||
b: `<p>Fatturato da gennaio a oggi rispetto allo <b>stesso periodo dell'anno scorso</b>.</p>
|
||||
<p>🟢 almeno +3% · 🟡 tra −3% e +3% · 🔴 sotto −3%.</p>`,
|
||||
},
|
||||
"sm.ordYtd": {
|
||||
t: "Ordinato dell'anno",
|
||||
b: `<p>Ordini ricevuti da gennaio a oggi rispetto allo stesso periodo dell'anno scorso. È il fatturato dei prossimi mesi.</p>
|
||||
<p>🟢 almeno +3% · 🟡 tra −3% e +3% · 🔴 sotto −3%.</p>`,
|
||||
},
|
||||
"sm.forecast": {
|
||||
t: "Chiusura prevista",
|
||||
b: `<p>Come chiuderà l'anno se si continua con lo stesso ritmo degli anni scorsi, confrontata con l'anno scorso intero.</p>
|
||||
<p>🟢 almeno +3% · 🟡 tra −3% e +3% · 🔴 sotto −3%.</p>
|
||||
<p class="sh-note">È una stima: diventa più affidabile man mano che l'anno avanza.</p>`,
|
||||
},
|
||||
"sm.b2b": {
|
||||
t: "Book-to-bill",
|
||||
b: `<p>Ordini entrati ÷ fatture emesse negli ultimi 90 giorni. Dice se il lavoro in arrivo tiene il passo con quello che consegniamo.</p>
|
||||
<p>🟢 da 1,05 (il portafoglio cresce) · 🟡 tra 0,95 e 1,05 · 🔴 sotto 0,95 (lo stiamo consumando).</p>
|
||||
<p class="sh-note">Il grafico mostra lo stesso valore mese per mese (su 3 mesi): la riga tratteggiata è 1.</p>`,
|
||||
},
|
||||
"sm.cover": {
|
||||
t: "Lavoro in portafoglio",
|
||||
b: `<p>Per quante <b>settimane di lavoro</b> basta quello che abbiamo da consegnare, al ritmo di fatturato degli ultimi 3 mesi.</p>
|
||||
<p>🟢 almeno 8 settimane · 🟡 da 4 a 8 · 🔴 meno di 4.</p>`,
|
||||
},
|
||||
"sm.late": {
|
||||
t: "Consegne in ritardo",
|
||||
b: `<p>Quanta parte del portafoglio è già <b>oltre la settimana ZIBO</b> comunicata al cliente.</p>
|
||||
<p>🟢 fino al 10% · 🟡 dal 10 al 25% · 🔴 oltre il 25%.</p>
|
||||
<p class="sh-note">Cosa fare: apri Consegne e parti dalle righe scadute.</p>`,
|
||||
},
|
||||
"sm.risk": {
|
||||
t: "Clienti a rischio",
|
||||
b: `<p>Clienti abituali <b>dormienti</b> o <b>probabilmente persi</b> e quanto valevano in un anno, rispetto al giro d'affari totale.</p>
|
||||
<p>🟢 fino al 3% · 🟡 dal 3 all'8% · 🔴 oltre l'8%.</p>
|
||||
<p class="sh-note">Cosa fare: lista "Da richiamare subito" qui sotto, o quella completa in Confronto anni.</p>`,
|
||||
},
|
||||
"sm.top5": {
|
||||
t: "Peso dei primi 5 clienti",
|
||||
b: `<p>Quanto del fatturato degli ultimi 12 mesi viene dai 5 clienti più grandi. Più è alto, più dipendiamo da pochi nomi.</p>
|
||||
<p>🟢 fino al 40% · 🟡 dal 40 al 60% · 🔴 oltre il 60%.</p>`,
|
||||
},
|
||||
"sm.customers": {
|
||||
t: "Clienti attivi",
|
||||
b: `<p>Clienti che hanno ordinato negli ultimi 12 mesi, confrontati con i 12 mesi prima. "Nuovi" = primo ordine nell'ultimo anno.</p>
|
||||
<p>🟢 stabili o in crescita · 🟡 fino a −5% · 🔴 oltre −5%.</p>`,
|
||||
},
|
||||
"sm.cn": {
|
||||
t: "Note di credito",
|
||||
b: `<p>Note di credito degli ultimi 12 mesi in percentuale sul fatturato: misura resi, sconti e contestazioni.</p>
|
||||
<p>🟢 fino all'1,5% · 🟡 dall'1,5 al 3% · 🔴 oltre il 3%.</p>`,
|
||||
},
|
||||
"sm.up": {
|
||||
t: "Clienti che crescono",
|
||||
b: `<p>I clienti che hanno aumentato di più (in euro) negli ultimi 12 mesi rispetto ai 12 precedenti. Da coltivare.</p>`,
|
||||
},
|
||||
"sm.down": {
|
||||
t: "Clienti che calano",
|
||||
b: `<p>I clienti che sono diminuiti di più (in euro) negli ultimi 12 mesi rispetto ai 12 precedenti.</p>
|
||||
<p class="sh-note">Cosa fare: capire il motivo (concorrenza, prezzi, problemi di consegna) con una telefonata.</p>`,
|
||||
},
|
||||
"sm.call": {
|
||||
t: "Da richiamare subito",
|
||||
b: `<p>I clienti abituali più importanti che si sono fermati (dormienti o probabilmente persi), ordinati per valore.</p>`,
|
||||
},
|
||||
|
||||
/* ===================== ANDAMENTO ORDINI ===================== */
|
||||
"st.orders": {
|
||||
t: "Ordini",
|
||||
|
||||
@@ -630,6 +630,7 @@ if ($action === 'data') {
|
||||
|
||||
<div class="stats-tabs">
|
||||
<?php if ($canStats) : ?>
|
||||
<a href="sales_summary.php"><i class="fa-solid fa-gauge-high me-1"></i> Sommario</a>
|
||||
<a href="sales_orders_stats.php"><i class="fa-solid fa-list-check me-1"></i> Andamento ordini</a>
|
||||
<a href="sales_orders_years.php"><i class="fa-solid fa-chart-column me-1"></i> Confronto anni</a>
|
||||
<a href="sales_customer.php"><i class="fa-solid fa-address-card me-1"></i> Scheda cliente</a>
|
||||
@@ -1299,7 +1300,7 @@ if ($action === 'data') {
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
<script src="sales_help.js?v=1"></script>
|
||||
<script src="sales_help.js?v=2"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -932,6 +932,7 @@ if ($action === 'order') {
|
||||
<div class="card-body pt-0">
|
||||
|
||||
<div class="stats-tabs">
|
||||
<a href="sales_summary.php"><i class="fa-solid fa-gauge-high me-1"></i> Sommario</a>
|
||||
<a href="sales_orders_stats.php" class="active"><i class="fa-solid fa-list-check me-1"></i> Andamento ordini</a>
|
||||
<a href="sales_orders_years.php"><i class="fa-solid fa-chart-column me-1"></i> Confronto anni</a>
|
||||
<a href="sales_customer.php"><i class="fa-solid fa-address-card me-1"></i> Scheda cliente</a>
|
||||
@@ -2353,7 +2354,7 @@ if ($action === 'order') {
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
<script src="sales_help.js?v=1"></script>
|
||||
<script src="sales_help.js?v=2"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -974,6 +974,7 @@ if ($action === 'data') {
|
||||
<div class="card-body pt-0">
|
||||
|
||||
<div class="stats-tabs">
|
||||
<a href="sales_summary.php"><i class="fa-solid fa-gauge-high me-1"></i> Sommario</a>
|
||||
<a href="sales_orders_stats.php"><i class="fa-solid fa-list-check me-1"></i> Andamento ordini</a>
|
||||
<a href="sales_orders_years.php" class="active"><i class="fa-solid fa-chart-column me-1"></i> Confronto anni</a>
|
||||
<a href="sales_customer.php"><i class="fa-solid fa-address-card me-1"></i> Scheda cliente</a>
|
||||
@@ -2387,7 +2388,7 @@ if ($action === 'data') {
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
<script src="sales_help.js?v=1"></script>
|
||||
<script src="sales_help.js?v=2"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user