query($totalProductsQuery); $totalProducts = $totalProductsResult->fetch_assoc()['totalProducts']; // Statistic 2: Total number of reports $totalReportsQuery = " SELECT COUNT(DISTINCT r.idreports) AS totalReports FROM reports r LEFT JOIN products p ON r.idproducts = p.idproducts $filters "; $totalReportsResult = $conn->query($totalReportsQuery); $totalReports = $totalReportsResult->fetch_assoc()['totalReports']; // Statistic 3: Number of 'fail' reports and percentage compared to total $failedReportsQuery = " SELECT COUNT(DISTINCT r.idreports) AS failedReports FROM reports r LEFT JOIN products p ON r.idproducts = p.idproducts $filters AND UPPER(r.reportsRating) IN ('FAIL', 'F', 'DOESN\'T COMPLY') "; $failedReportsResult = $conn->query($failedReportsQuery); $failedReports = $failedReportsResult->fetch_assoc()['failedReports']; $failedReportsPercent = ($totalReports > 0) ? ($failedReports / $totalReports) * 100 : 0; // Statistic 4: Total number of tests performed (distinct tests) $totalTestsQuery = " SELECT COUNT(DISTINCT ap.idreports, ap.idPart, ap.result_TestName) AS totalTests FROM analysis_project ap LEFT JOIN result_project rp ON ap.idAnalysis_Project = rp.idanalysis_project LEFT JOIN reports r ON ap.idreports = r.idreports LEFT JOIN products p ON r.idproducts = p.idproducts $filters "; $totalTestsResult = $conn->query($totalTestsQuery); $totalTests = $totalTestsResult->fetch_assoc()['totalTests']; // Statistic 5: Number of 'fail' tests and percentage (case-insensitive for rating fail) $failedTestsQuery = " SELECT COUNT(DISTINCT ap.idreports, ap.idPart, ap.result_TestName) AS failedTests FROM analysis_project ap LEFT JOIN result_project rp ON ap.idAnalysis_Project = rp.idanalysis_project LEFT JOIN reports r ON ap.idreports = r.idreports LEFT JOIN products p ON r.idproducts = p.idproducts $filters AND UPPER(ap.test_Rating) IN ('FAIL', 'F', 'DOESN\'T COMPLY') "; $failedTestsResult = $conn->query($failedTestsQuery); $failedTests = $failedTestsResult->fetch_assoc()['failedTests']; $failedTestsPercent = ($totalTests > 0) ? ($failedTests / $totalTests) * 100 : 0; // Pie Chart Data for Reports (Fail, Pass, Others) $failReportsPieQuery = " SELECT COUNT(*) AS failReports FROM reports r LEFT JOIN products p ON r.idproducts = p.idproducts $filters AND UPPER(r.reportsRating) IN ('FAIL', 'F', 'DOESN\'T COMPLY') "; $failReportsPieResult = $conn->query($failReportsPieQuery); $failReportsPie = $failReportsPieResult->fetch_assoc()['failReports']; $passReportsPieQuery = " SELECT COUNT(*) AS passReports FROM reports r LEFT JOIN products p ON r.idproducts = p.idproducts $filters AND UPPER(r.reportsRating) IN ('PASS', 'P', 'COMPLIES') "; $passReportsPieResult = $conn->query($passReportsPieQuery); $passReportsPie = $passReportsPieResult->fetch_assoc()['passReports']; $otherReportsPieQuery = " SELECT COUNT(*) AS otherReports FROM reports r LEFT JOIN products p ON r.idproducts = p.idproducts $filters AND UPPER(r.reportsRating) NOT IN ('FAIL', 'F', 'DOESN\'T COMPLY', 'PASS', 'P', 'COMPLIES') "; $otherReportsPieResult = $conn->query($otherReportsPieQuery); $otherReportsPie = $otherReportsPieResult->fetch_assoc()['otherReports']; // Query to get the top 10 analyses with the most 'Fail' results $topFailingAnalysisQuery = " SELECT a.nameanalysisvoc AS analysisName, COUNT(DISTINCT ap.idreports, ap.idPart, ap.result_TestName) AS failCount FROM analysis_project ap LEFT JOIN result_project rp ON ap.idAnalysis_Project = rp.idanalysis_project LEFT JOIN reports r ON ap.idreports = r.idreports LEFT JOIN products p ON r.idproducts = p.idproducts LEFT JOIN analysisvocabulary a ON ap.result_TestName = a.idanalysisvocabulary $filters AND UPPER(ap.test_Rating) IN ('FAIL', 'F', 'DOESN\'T COMPLY') GROUP BY ap.result_TestName ORDER BY failCount DESC LIMIT 10 "; $topFailingAnalysisResult = $conn->query($topFailingAnalysisQuery); $topFailingAnalysis = []; while ($row = $topFailingAnalysisResult->fetch_assoc()) { $analysisName = (strlen($row['analysisName']) > 80) ? substr($row['analysisName'], 0, 80) . '...' : $row['analysisName']; $topFailingAnalysis[] = ['name' => $analysisName, 'failCount' => $row['failCount']]; } // Statistic for worst suppliers based on % of failed reports $worstSuppliersQuery = " SELECT p.namesupplier AS supplier, COUNT(r.idreports) AS totalReports, SUM(CASE WHEN UPPER(r.reportsRating) IN ('FAIL', 'F', 'DOESN\'T COMPLY') THEN 1 ELSE 0 END) AS failedReports, (SUM(CASE WHEN UPPER(r.reportsRating) IN ('FAIL', 'F', 'DOESN\'T COMPLY') THEN 1 ELSE 0 END) / COUNT(r.idreports)) * 100 AS failPercentage FROM reports r LEFT JOIN products p ON r.idproducts = p.idproducts $filters GROUP BY p.namesupplier ORDER BY failPercentage DESC LIMIT 10 "; $worstSuppliersResult = $conn->query($worstSuppliersQuery); $worstSuppliers = []; while ($row = $worstSuppliersResult->fetch_assoc()) { $worstSuppliers[] = [ 'supplier' => $row['supplier'], 'failPercentage' => round($row['failPercentage'], 2), 'totalReports' => $row['totalReports'], 'failedReports' => $row['failedReports'] ]; } $suPfilters = ''; // Statistic for products by suppliers if (!empty($supplierFilter)) { $suPfilters .= " AND p.namesupplier IN ($supplierFilter)"; } if (!empty($refNumberFilter)) { $suPfilters .= " AND p.products_refnumber IN ($refNumberFilter)"; } if (!empty($productsSeasonFilter)) { $suPfilters .= " AND p.products_season IN ($productsSeasonFilter)"; } if (!empty($ageRangeFilter)) { $suPfilters .= " AND p.agerange IN ($ageRangeFilter)"; } $productBySupplierQuery = " SELECT p.namesupplier AS supplier, COUNT(p.idproducts) AS totalProducts FROM products p WHERE p.namesupplier IS NOT NULL $suPfilters GROUP BY p.namesupplier ORDER BY totalProducts DESC"; $productBySupplierResult = $conn->query($productBySupplierQuery); $productBySupplier = []; while ($row = $productBySupplierResult->fetch_assoc()) { $productBySupplier[] = [ 'supplier' => $row['supplier'], 'totalProducts' => $row['totalProducts'] ]; } // refNumbers $refNumbersQuery = " SELECT p.products_refnumber AS refNumber FROM products p WHERE p.products_refnumber IS NOT NULL GROUP BY p.products_refnumber "; $refNumbersResult = $conn->query($refNumbersQuery); $refNumbers = []; while ($row = $refNumbersResult->fetch_assoc()) { $refNumbers[] = [ 'refNumber' => $row['refNumber'] ]; } // productsSeason $productsSeasonQuery = " SELECT p.products_season AS season FROM products p WHERE p.products_season IS NOT NULL GROUP BY p.products_season "; $productsSeasonResult = $conn->query($productsSeasonQuery); $productsSeasons = []; while ($row = $productsSeasonResult->fetch_assoc()) { $productsSeasons[] = [ "season" => $row['season'] ]; } // ageRanges $ageRangeQuery = " SELECT p.agerange AS ageRange FROM products p WHERE p.agerange IS NOT NULL GROUP BY p.agerange "; $ageRangeResult = $conn->query($ageRangeQuery); $ageRange = []; while ($row = $ageRangeResult->fetch_assoc()) { $ageRange[] = [ "ageRange" => $row['ageRange'] ]; } // labNames $labNameQuery = " SELECT r.reports_LabName AS LabName FROM reports r WHERE r.reports_LabName IS NOT NULL GROUP BY r.reports_LabName "; $labNameResult = $conn->query($labNameQuery); $labName = []; while ($row = $labNameResult->fetch_assoc()) { $labName[] = [ "LabName" => $row['LabName'] ]; } // tesTypes $tesTypeQuery = " SELECT r.reports_testype AS tesType FROM reports r WHERE r.reports_testype IS NOT NULL GROUP BY r.reports_testype "; $tesTypeResult = $conn->query($tesTypeQuery); $tesType = []; while ($row = $tesTypeResult->fetch_assoc()) { $tesType[] = [ "tesType" => $row['tesType'] ]; } // numberLabs $numberLabsQuery = " SELECT r.reportsNumberLab as reportNumber FROM reports r WHERE r.reportsNumberLab IS NOT NULL GROUP BY r.reportsNumberLab "; $numberLabsResult = $conn->query($numberLabsQuery); $numberLabs = []; while ($row = $numberLabsResult->fetch_assoc()) { $numberLabs[] = [ "reportNumber" => $row['reportNumber'] ]; } // New Query: Distribution of analyses (for pie chart) $analysisDistributionQuery = " SELECT a.nameanalysisvoc AS analysisName, COUNT(DISTINCT ap.idreports, ap.idPart, ap.result_TestName) AS totalTests FROM analysis_project ap LEFT JOIN analysisvocabulary a ON ap.result_TestName = a.idanalysisvocabulary LEFT JOIN reports r ON ap.idreports = r.idreports LEFT JOIN products p ON r.idproducts = p.idproducts $filters GROUP BY ap.result_TestName ORDER BY totalTests DESC "; $analysisDistributionResult = $conn->query($analysisDistributionQuery); $analysisDistribution = []; while ($row = $analysisDistributionResult->fetch_assoc()) { $analysisDistribution[] = [ 'analysisName' => $row['analysisName'], 'totalTests' => $row['totalTests'] ]; } // fecth analytes with most fails $failedAnalytesQuery = " SELECT c.namecompoundsvocabulary AS AnalyteName, COUNT(*) AS FailCount FROM result_project rp LEFT JOIN compundsvocabulary c ON rp.result_AnalytsName = c.idcompoundsvocabulary WHERE LOWER(rp.result_AnalytsRating) IN ('f', 'fail', 'doesn\'t comply') GROUP BY c.namecompoundsvocabulary ORDER BY FailCount DESC LIMIT 10; "; $resultFailedAnalytes = mysqli_query($repnew, $failedAnalytesQuery) or die("Error in Selecting " . mysqli_error($repnew)); // Verifica se ci sono risultati $failedAnalytes = array(); while ($row = mysqli_fetch_assoc($resultFailedAnalytes)) { $failedAnalytes[] = [ 'AnalyteName' => $row['AnalyteName'], 'FailCount' => $row['FailCount'] ]; } // Ora controlliamo se รจ una richiesta AJAX if ($_SERVER['REQUEST_METHOD'] === 'POST') { // Rispondi ai dati aggiornati tramite AJAX echo json_encode([ 'totalProducts' => $totalProducts, 'totalReports' => $totalReports, 'failedReports' => $failedReports, 'failedReportsPercent' => $failedReportsPercent, 'totalTests' => $totalTests, 'failedTests' => $failedTests, 'failedTestsPercent' => $failedTestsPercent, 'failReportsPie' => $failReportsPie, 'passReportsPie' => $passReportsPie, 'otherReportsPie' => $otherReportsPie, 'topFailingAnalysis' => $topFailingAnalysis, 'worstSuppliers' => $worstSuppliers, 'productBySupplier' => $productBySupplier, 'refNumbers' => $refNumbers, 'productsSeasons' => $productsSeasons, 'ageRange' => $ageRange, 'labName' => $labName, 'tesType' => $tesType, 'numberLabs' => $numberLabs, 'failedAnalytes' => $failedAnalytes, 'analysisDistribution' => $analysisDistribution // Distribuzione delle analisi per il grafico a torta ]); exit; // Ferma l'esecuzione del resto dello script dopo aver risposto all'AJAX } ?>