From 80dbd269291cdba9a5fd9e61f0806b7b14461cfe Mon Sep 17 00:00:00 2001 From: solocla Date: Mon, 20 Jul 2026 10:47:54 +0200 Subject: [PATCH] fixed stats --- public/userarea/stats_export_lims.php | 66 ++++++++++++---------- public/userarea/stats_export_lims_data.php | 60 +++++++++++++++++--- 2 files changed, 87 insertions(+), 39 deletions(-) diff --git a/public/userarea/stats_export_lims.php b/public/userarea/stats_export_lims.php index 797d13f2..a48c10cd 100644 --- a/public/userarea/stats_export_lims.php +++ b/public/userarea/stats_export_lims.php @@ -103,30 +103,31 @@ -
+
-
Export mese
-
0
- Dati dal 16/07/2026 +
Campioni mese
+
0
+ Commesse: 0 · dal 16/07/2026
-
Export anno
-
0
- Dati dal 16/07/2026 +
Campioni anno
+
0
+ Commesse: 0 · dal 16/07/2026
-
Export giorno (status L)
-
0
+
Campioni esportati (giorno)
+
0
+ Commesse: 0
@@ -146,14 +147,6 @@
-
-
-
-
Clienti distinti
-
0
-
-
-
@@ -222,7 +215,8 @@ ID Cliente Cliente - Export + Campioni + Commesse @@ -243,7 +237,8 @@ ID Utente Utente - Export + Campioni + Commesse @@ -295,6 +290,10 @@ data: 'clientname', defaultContent: '—' }, + { + data: 'parts', + className: 'text-end' + }, { data: 'tot', className: 'text-end' @@ -318,6 +317,10 @@ data: 'username', defaultContent: '—' }, + { + data: 'parts', + className: 'text-end' + }, { data: 'tot', className: 'text-end' @@ -428,11 +431,13 @@ return; } - // KPI - $('#kpiExport').text(res.totals.export); - $('#kpiExportMonth').text(res.totalsMonth ? res.totalsMonth.export : 0); - $('#kpiExportYear').text(res.totalsYear ? res.totalsYear.export : 0); - $('#kpiClienti').text(res.byClient.length); + // KPI — dato principale = parti/campioni, sotto le commesse + $('#kpiParts').text(res.totals.parts ?? 0); + $('#kpiExport').text(res.totals.export ?? 0); + $('#kpiPartsMonth').text(res.totalsMonth ? (res.totalsMonth.parts ?? 0) : 0); + $('#kpiExportMonth').text(res.totalsMonth ? (res.totalsMonth.export ?? 0) : 0); + $('#kpiPartsYear').text(res.totalsYear ? (res.totalsYear.parts ?? 0) : 0); + $('#kpiExportYear').text(res.totalsYear ? (res.totalsYear.export ?? 0) : 0); $('#kpiLimsSamples').text(res.limsSamples ?? 0); $('#limsSamplesInput').val(res.limsSamples ?? ''); @@ -452,25 +457,26 @@ } 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('—'); } - // Torta esportati vs totale - renderPie(res.totals.export, limsTot); + // Torta parti esportate vs totale inserito nel LIMS + renderPie(partsTot, limsTot); - // 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_data.php b/public/userarea/stats_export_lims_data.php index a918633a..91913325 100644 --- a/public/userarea/stats_export_lims_data.php +++ b/public/userarea/stats_export_lims_data.php @@ -15,14 +15,17 @@ try { } // --- Export per cliente (status = 'l', giornata su export_date) --- + // 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(d.export_date) = :d GROUP BY d.idclient - ORDER BY tot DESC + ORDER BY parts DESC "); $stmtC->execute(['d' => $date]); $byClient = $stmtC->fetchAll(PDO::FETCH_ASSOC); @@ -38,16 +41,19 @@ try { } // --- Export per utente (status = 'l', giornata su export_date) --- + // 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(d.export_date) = :d GROUP BY d.user_id, username - ORDER BY tot DESC + ORDER BY parts DESC "); $stmtU->execute(['d' => $date]); $byUser = $stmtU->fetchAll(PDO::FETCH_ASSOC); @@ -56,6 +62,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; } @@ -63,6 +70,7 @@ 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); @@ -70,7 +78,19 @@ try { // --- Totale export della giornata --- $totExport = array_sum(array_column($byClient, 'tot')); - // --- Totale export del MESE della data selezionata (status = 'l') --- + // --- Totale PARTI/CAMPIONI della giornata (righe identification_parts legate + // ai datadb esportati status='l' in questa giornata) --- + $stmtP = $pdo->prepare(" + SELECT COUNT(*) + FROM identification_parts ip + INNER JOIN datadb d ON d.iddatadb = ip.iddatadb + WHERE d.status = 'l' + AND DATE(d.export_date) = :d + "); + $stmtP->execute(['d' => $date]); + $totParts = (int)$stmtP->fetchColumn(); + + // --- Totale COMMESSE del MESE (status = 'l') --- $stmtM = $pdo->prepare(" SELECT COUNT(*) FROM datadb d @@ -80,7 +100,18 @@ try { $stmtM->execute(['m' => $d->format('Y-m')]); $totExportMonth = (int)$stmtM->fetchColumn(); - // --- Totale export dell'ANNO della data selezionata (status = 'l') --- + // --- Totale PARTI del MESE (status = 'l') --- + $stmtMP = $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 + "); + $stmtMP->execute(['m' => $d->format('Y-m')]); + $totPartsMonth = (int)$stmtMP->fetchColumn(); + + // --- Totale COMMESSE dell'ANNO (status = 'l') --- $stmtY = $pdo->prepare(" SELECT COUNT(*) FROM datadb d @@ -90,6 +121,17 @@ try { $stmtY->execute(['y' => $d->format('Y')]); $totExportYear = (int)$stmtY->fetchColumn(); + // --- Totale PARTI dell'ANNO (status = 'l') --- + $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' => $d->format('Y')]); + $totPartsYear = (int)$stmtYP->fetchColumn(); + // --- Campioni totali inseriti nel LIMS per la giornata (tabella lims_daily_samples) --- $stmtL = $pdo->prepare("SELECT total_samples FROM lims_daily_samples WHERE sample_date = :d LIMIT 1"); $stmtL->execute(['d' => $date]); @@ -101,9 +143,9 @@ try { 'date' => $date, 'month' => $d->format('Y-m'), 'year' => (int)$d->format('Y'), - 'totals' => ['export' => (int)$totExport], - 'totalsMonth' => ['export' => $totExportMonth], - 'totalsYear' => ['export' => $totExportYear], + 'totals' => ['export' => (int)$totExport, 'parts' => $totParts], + 'totalsMonth' => ['export' => $totExportMonth, 'parts' => $totPartsMonth], + 'totalsYear' => ['export' => $totExportYear, 'parts' => $totPartsYear], 'byClient' => $byClient, 'byUser' => $byUser, 'limsSamples' => $limsSamples,