From 1107e003f8e156a9990bcd727bc36414119e8898 Mon Sep 17 00:00:00 2001 From: solocla Date: Fri, 17 Jul 2026 10:53:31 +0200 Subject: [PATCH] update stats monthly --- public/userarea/stats_export_lims_monthly.php | 48 +++++++++++------- .../stats_export_lims_monthly_data.php | 50 +++++++++++++++---- 2 files changed, 71 insertions(+), 27 deletions(-) diff --git a/public/userarea/stats_export_lims_monthly.php b/public/userarea/stats_export_lims_monthly.php index 3d81b79..e66b49c 100644 --- a/public/userarea/stats_export_lims_monthly.php +++ b/public/userarea/stats_export_lims_monthly.php @@ -109,17 +109,18 @@
-
Export mese (status L)
-
0
+
Campioni mese
+
0
+ Commesse: 0
-
Export anno (status L)
-
0
- Dati a partire dal 16/07/2026 +
Campioni anno
+
0
+ Commesse: 0 · dal 16/07/2026
@@ -154,7 +155,7 @@
-
Export per cliente (idclient) — top 15
+
Campioni per cliente (idclient) — top 15
@@ -164,7 +165,7 @@
-
Export per utente (user_id) — top 15
+
Campioni per utente (user_id) — top 15
@@ -187,7 +188,8 @@ ID Cliente Cliente - Export + Campioni + Commesse @@ -208,7 +210,8 @@ ID Utente Utente - Export + Campioni + Commesse @@ -273,6 +276,10 @@ data: 'clientname', defaultContent: '—' }, + { + data: 'parts', + className: 'text-end' + }, { data: 'tot', className: 'text-end' @@ -296,6 +303,10 @@ data: 'username', defaultContent: '—' }, + { + data: 'parts', + className: 'text-end' + }, { data: 'tot', className: 'text-end' @@ -359,32 +370,35 @@ return; } - // KPI mese - $('#kpiExport').text(res.totals.export); + // KPI mese — dato principale = campioni/parti, sotto le commesse + $('#kpiParts').text(res.totals.parts ?? 0); + $('#kpiExport').text(res.totals.export ?? 0); $('#kpiClienti').text(res.byClient.length); $('#kpiLimsSamples').text(res.limsSamples ?? 0); const limsTot = parseInt(res.limsSamples ?? 0, 10); + const partsTot = parseInt(res.totals.parts ?? 0, 10); if (limsTot > 0) { - const perc = (res.totals.export / limsTot) * 100; + const perc = (partsTot / limsTot) * 100; $('#kpiPerc').text(perc.toFixed(1) + '%'); } else { $('#kpiPerc').text('—'); } - // Box annuale - $('#kpiExportYear').text(res.totalsYear.export); + // Box annuale — campioni + commesse + $('#kpiPartsYear').text(res.totalsYear ? (res.totalsYear.parts ?? 0) : 0); + $('#kpiExportYear').text(res.totalsYear ? (res.totalsYear.export ?? 0) : 0); $('#yearLabel').text(res.year); - // Grafici + // Grafici — valori = campioni/parti const clientTop = topN(res.byClient); const userTop = topN(res.byUser); chartClienti = renderBarChart(chartClienti, 'chartClienti', clientTop.map(r => r.clientname ? (r.clientname + ' (' + r.idclient + ')') : ('ID ' + r.idclient)), - clientTop.map(r => r.tot), 'Export'); + clientTop.map(r => r.parts), 'Campioni'); chartUtenti = renderBarChart(chartUtenti, 'chartUtenti', userTop.map(r => r.username ? (r.username + ' (' + r.user_id + ')') : ('ID ' + r.user_id)), - userTop.map(r => r.tot), 'Export'); + userTop.map(r => r.parts), 'Campioni'); // Tabelle dtClienti.clear().rows.add(res.byClient).draw(); diff --git a/public/userarea/stats_export_lims_monthly_data.php b/public/userarea/stats_export_lims_monthly_data.php index f5ff68c..4535459 100644 --- a/public/userarea/stats_export_lims_monthly_data.php +++ b/public/userarea/stats_export_lims_monthly_data.php @@ -16,15 +16,18 @@ try { $year = $dm->format('Y'); - // --- Export per cliente (status = 'l', giornata su export_date, filtro mese) --- + // --- Export per cliente (status = 'l', filtro mese) --- + // tot = numero commesse, parts = numero parti/campioni $stmtC = $pdo->prepare(" SELECT d.idclient AS idclient, - COUNT(*) AS tot + COUNT(DISTINCT d.iddatadb) AS tot, + COUNT(ip.id) AS parts FROM datadb d + LEFT JOIN identification_parts ip ON ip.iddatadb = d.iddatadb WHERE d.status = 'l' AND DATE_FORMAT(d.export_date, '%Y-%m') = :m GROUP BY d.idclient - ORDER BY tot DESC + ORDER BY parts DESC "); $stmtC->execute(['m' => $month]); $byClient = $stmtC->fetchAll(PDO::FETCH_ASSOC); @@ -40,16 +43,19 @@ try { } // --- Export per utente (status = 'l', filtro mese) --- + // tot = numero commesse, parts = numero parti/campioni $stmtU = $pdo->prepare(" SELECT d.user_id AS user_id, TRIM(CONCAT(COALESCE(u.first_name,''),' ',COALESCE(u.last_name,''))) AS username, - COUNT(*) AS tot + COUNT(DISTINCT d.iddatadb) AS tot, + COUNT(ip.id) AS parts FROM datadb d LEFT JOIN auth_users u ON u.id = d.user_id + LEFT JOIN identification_parts ip ON ip.iddatadb = d.iddatadb WHERE d.status = 'l' AND DATE_FORMAT(d.export_date, '%Y-%m') = :m GROUP BY d.user_id, username - ORDER BY tot DESC + ORDER BY parts DESC "); $stmtU->execute(['m' => $month]); $byUser = $stmtU->fetchAll(PDO::FETCH_ASSOC); @@ -58,6 +64,7 @@ try { foreach ($byClient as &$r) { $r['idclient'] = $r['idclient'] !== null ? (int)$r['idclient'] : null; $r['tot'] = (int)$r['tot']; + $r['parts'] = (int)$r['parts']; $nm = $clientNames[$r['idclient']] ?? ''; $r['clientname'] = $nm !== '' ? $nm : null; } @@ -65,16 +72,28 @@ try { foreach ($byUser as &$r) { $r['user_id'] = $r['user_id'] !== null ? (int)$r['user_id'] : null; $r['tot'] = (int)$r['tot']; + $r['parts'] = (int)$r['parts']; if (isset($r['username'])) $r['username'] = $r['username'] !== null && $r['username'] !== '' ? $r['username'] : null; } unset($r); - // --- Totale export del mese --- + // --- Totale COMMESSE del mese --- $totExport = array_sum(array_column($byClient, 'tot')); - // --- Totale export dell'ANNO del mese selezionato --- + // --- Totale PARTI/CAMPIONI del mese (status = 'l') --- + $stmtP = $pdo->prepare(" + SELECT COUNT(*) + FROM identification_parts ip + INNER JOIN datadb d ON d.iddatadb = ip.iddatadb + WHERE d.status = 'l' + AND DATE_FORMAT(d.export_date, '%Y-%m') = :m + "); + $stmtP->execute(['m' => $month]); + $totParts = (int)$stmtP->fetchColumn(); + + // --- Totale COMMESSE dell'ANNO del mese selezionato --- $stmtY = $pdo->prepare(" - SELECT COUNT(*) + SELECT COUNT(*) FROM datadb d WHERE d.status = 'l' AND YEAR(d.export_date) = :y @@ -82,6 +101,17 @@ try { $stmtY->execute(['y' => $year]); $totExportYear = (int)$stmtY->fetchColumn(); + // --- Totale PARTI dell'ANNO del mese selezionato --- + $stmtYP = $pdo->prepare(" + SELECT COUNT(*) + FROM identification_parts ip + INNER JOIN datadb d ON d.iddatadb = ip.iddatadb + WHERE d.status = 'l' + AND YEAR(d.export_date) = :y + "); + $stmtYP->execute(['y' => $year]); + $totPartsYear = (int)$stmtYP->fetchColumn(); + // --- Campioni LIMS: somma dei total_samples di tutti i giorni del mese --- $stmtL = $pdo->prepare(" SELECT COALESCE(SUM(total_samples), 0) @@ -95,8 +125,8 @@ try { 'success' => true, 'month' => $month, 'year' => (int)$year, - 'totals' => ['export' => (int)$totExport], - 'totalsYear' => ['export' => $totExportYear], + 'totals' => ['export' => (int)$totExport, 'parts' => $totParts], + 'totalsYear' => ['export' => $totExportYear, 'parts' => $totPartsYear], 'byClient' => $byClient, 'byUser' => $byUser, 'limsSamples' => $limsSamples,