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']]; } // Query per il grafico a barre orizzontali con raggruppamento basato su products_season // Gestione del raggruppamento dinamico dal POST $groupingField = isset($_POST['groupingField']) ? $_POST['groupingField'] : 'products_season'; $passConditions = implode("', '", array_map('addslashes', RATING_PASS)); $failConditions = implode("', '", array_map('addslashes', RATING_FAIL)); $otherConditions = implode("', '", array_map('addslashes', RATING_OTHER)); // Query per il grafico a barre orizzontali con sezioni multicolore $horizontalBarQuery = " SELECT COALESCE(p.$groupingField, 'empty') AS groupingValue, SUM(CASE WHEN UPPER(r.reportsRating) IN ('$passConditions') THEN 1 ELSE 0 END) AS passCount, SUM(CASE WHEN UPPER(r.reportsRating) IN ('$failConditions') THEN 1 ELSE 0 END) AS failCount, SUM(CASE WHEN UPPER(r.reportsRating) NOT IN ('$passConditions', '$failConditions') THEN 1 ELSE 0 END) AS otherCount FROM reports r LEFT JOIN products p ON r.idproducts = p.idproducts $filters GROUP BY COALESCE(p.$groupingField, 'empty') ORDER BY failCount DESC LIMIT 20; "; $horizontalBarResult = $conn->query($horizontalBarQuery); $horizontalBarData = []; while ($row = $horizontalBarResult->fetch_assoc()) { $horizontalBarData[] = [ 'groupingValue' => $row['groupingValue'], 'passCount' => $row['passCount'], 'failCount' => $row['failCount'], 'otherCount' => $row['otherCount'] ]; } // Query per ottenere il conteggio di Pass, Fail e altri dalle analisi $horizontalBarAnalysisQuery = " SELECT COALESCE(p.$groupingField, 'empty') AS groupingValue, SUM(CASE WHEN UPPER(ap.test_Rating) IN ('PASS', 'P', 'COMPLIES') THEN 1 ELSE 0 END) AS passCount, SUM(CASE WHEN UPPER(ap.test_Rating) IN ('FAIL', 'F', 'DOESN\'T COMPLY') THEN 1 ELSE 0 END) AS failCount, SUM(CASE WHEN UPPER(ap.test_Rating) NOT IN ('PASS', 'P', 'COMPLIES', 'FAIL', 'F', 'DOESN\'T COMPLY') THEN 1 ELSE 0 END) AS otherCount FROM analysis_project ap LEFT JOIN reports r ON ap.idreports = r.idreports LEFT JOIN products p ON r.idproducts = p.idproducts $filters GROUP BY COALESCE(p.$groupingField, 'empty') ORDER BY failCount DESC LIMIT 20 "; $horizontalBarAnalysisResult = $conn->query($horizontalBarAnalysisQuery); $horizontalBarAnalysisData = []; while ($row = $horizontalBarAnalysisResult->fetch_assoc()) { $horizontalBarAnalysisData[] = [ 'groupingValue' => $row['groupingValue'], 'passCount' => (int)$row['passCount'], 'failCount' => (int)$row['failCount'], 'otherCount' => (int)$row['otherCount'] ]; } // 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, failedReports DESC LIMIT 30; "; $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 LIMIT 30 "; $productBySupplierResult = $conn->query($productBySupplierQuery); $productBySupplier = []; while ($row = $productBySupplierResult->fetch_assoc()) { $productBySupplier[] = [ 'supplier' => $row['supplier'], 'totalProducts' => $row['totalProducts'] ]; } $productDropdownQuery = " SELECT DISTINCT p.namesupplier AS supplier FROM products p WHERE p.namesupplier IS NOT NULL ORDER BY p.namesupplier ASC "; $productDropdownResult = $conn->query($productDropdownQuery); $productDropdown = []; while ($row = $productDropdownResult->fetch_assoc()) { $productDropdown[] = [ 'supplier' => $row['supplier'] ]; } // 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 AND a.nameanalysisvoc is not null GROUP BY ap.result_TestName ORDER BY totalTests DESC LIMIT 20 "; $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 LEFT JOIN reports r ON rp.idreports = r.idreports LEFT JOIN products p ON r.idproducts = p.idproducts $filters AND 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'] ]; } // New Query: phasequery $phaseQuery = " SELECT p.products_phase AS phase, COUNT(*) AS totalProducts FROM products p LEFT JOIN reports r ON p.idproducts = r.idproducts $filters AND p.products_phase IS NOT NULL GROUP BY p.products_phase ORDER BY totalProducts DESC "; $phaseQueryResult = $conn->query($phaseQuery); // Process the results $phaseData = []; while ($row = $phaseQueryResult->fetch_assoc()) { $phaseData[] = [ 'phase' => $row['phase'], 'totalProducts' => $row['totalProducts'] ]; } // New Query: Phase ratings distribution $phaseRatingsQuery = " SELECT p.products_phase AS phase, SUM(CASE WHEN UPPER(r.reportsRating) IN ('PASS', 'P', 'COMPLY') THEN 1 ELSE 0 END) AS passCount, SUM(CASE WHEN UPPER(r.reportsRating) IN ('FAIL', 'F', 'DOESN\'T COMPLY') THEN 1 ELSE 0 END) AS failCount, SUM(CASE WHEN UPPER(r.reportsRating) NOT IN ('PASS', 'P', 'COMPLY', 'FAIL', 'F', 'DOESN\'T COMPLY') THEN 1 ELSE 0 END) AS otherCount FROM products p LEFT JOIN reports r ON p.idproducts = r.idproducts $filters AND p.products_phase IS NOT NULL GROUP BY p.products_phase ORDER BY p.products_phase ASC "; $phaseRatingsResult = $conn->query($phaseRatingsQuery); // Process the results $phaseRatingsData = []; while ($row = $phaseRatingsResult->fetch_assoc()) { $phaseRatingsData[] = [ 'phase' => $row['phase'], 'passCount' => (int)$row['passCount'], 'failCount' => (int)$row['failCount'], 'otherCount' => (int)$row['otherCount'] ]; } // 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, 'productDropdown' => $productDropdown, 'tesType' => $tesType, 'numberLabs' => $numberLabs, 'failedAnalytes' => $failedAnalytes, 'analysisDistribution' => $analysisDistribution, // Distribuzione delle analisi per il grafico a torta 'horizontalBarData' => $horizontalBarData, // Dati per il grafico a barre orizzontali 'phaseData' => $phaseData, 'horizontalBarAnalysisData' => $horizontalBarAnalysisData, 'phaseRatingsData' => $phaseRatingsData // Nuovi dati per il grafico delle fasi ]); exit; // Ferma l'esecuzione del resto dello script dopo aver risposto all'AJAX } ?>