diff --git a/includes/pages/reports.php b/includes/pages/reports.php index 957a1cb..3b63bd2 100644 --- a/includes/pages/reports.php +++ b/includes/pages/reports.php @@ -115,6 +115,95 @@ foreach ($patients_by_nationality_raw as $key => $val) { $chart_nationality_labels = array_keys($patients_by_nationality); $chart_nationality_data = array_values($patients_by_nationality); +// 11. Visits with Lab Tests by Nationality +$stmt = $db->prepare(" + SELECT + CASE + WHEN p.nationality = 'Oman' THEN 'omani' + WHEN p.nationality IS NULL OR p.nationality = '' THEN 'unknown_nationality' + ELSE 'non_omani' + END as nat_group, + COUNT(DISTINCT v.id) as count + FROM visits v + JOIN patients p ON v.patient_id = p.id + JOIN laboratory_inquiries l ON l.visit_id = v.id + WHERE DATE(v.visit_date) BETWEEN ? AND ? + GROUP BY nat_group"); +$stmt->execute([$start_date, $end_date]); +$lab_by_nationality_raw = $stmt->fetchAll(PDO::FETCH_KEY_PAIR); + +$lab_by_nationality = []; +foreach ($lab_by_nationality_raw as $key => $val) { + $lab_by_nationality[__($key)] = $val; +} +$chart_lab_nat_labels = array_keys($lab_by_nationality); +$chart_lab_nat_data = array_values($lab_by_nationality); + +// 12. Visits with X-Ray by Nationality +$stmt = $db->prepare(" + SELECT + CASE + WHEN p.nationality = 'Oman' THEN 'omani' + WHEN p.nationality IS NULL OR p.nationality = '' THEN 'unknown_nationality' + ELSE 'non_omani' + END as nat_group, + COUNT(DISTINCT v.id) as count + FROM visits v + JOIN patients p ON v.patient_id = p.id + JOIN xray_inquiries x ON x.visit_id = v.id + WHERE DATE(v.visit_date) BETWEEN ? AND ? + GROUP BY nat_group"); +$stmt->execute([$start_date, $end_date]); +$xray_by_nationality_raw = $stmt->fetchAll(PDO::FETCH_KEY_PAIR); + +$xray_by_nationality = []; +foreach ($xray_by_nationality_raw as $key => $val) { + $xray_by_nationality[__($key)] = $val; +} +$chart_xray_nat_labels = array_keys($xray_by_nationality); +$chart_xray_nat_data = array_values($xray_by_nationality); + +// 13. Visits by Department and Nationality +$stmt = $db->prepare(" + SELECT + d.name_$lang as dept_name, + SUM(CASE WHEN p.nationality = 'Oman' THEN 1 ELSE 0 END) as omani_count, + SUM(CASE WHEN p.nationality != 'Oman' AND p.nationality IS NOT NULL AND p.nationality != '' THEN 1 ELSE 0 END) as non_omani_count, + SUM(CASE WHEN p.nationality IS NULL OR p.nationality = '' THEN 1 ELSE 0 END) as unknown_count + FROM visits v + JOIN patients p ON v.patient_id = p.id + JOIN employees e ON v.doctor_id = e.id + JOIN departments d ON e.department_id = d.id + WHERE DATE(v.visit_date) BETWEEN ? AND ? + GROUP BY d.id"); +$stmt->execute([$start_date, $end_date]); +$dept_nat_data = $stmt->fetchAll(PDO::FETCH_ASSOC); + +$chart_dept_nat_labels = array_column($dept_nat_data, 'dept_name'); +$chart_dept_nat_omani = array_column($dept_nat_data, 'omani_count'); +$chart_dept_nat_non_omani = array_column($dept_nat_data, 'non_omani_count'); +$chart_dept_nat_unknown = array_column($dept_nat_data, 'unknown_count'); + +// 14. Visits by Doctor and Nationality +$stmt = $db->prepare(" + SELECT + e.name_$lang as doctor_name, + SUM(CASE WHEN p.nationality = 'Oman' THEN 1 ELSE 0 END) as omani_count, + SUM(CASE WHEN p.nationality != 'Oman' AND p.nationality IS NOT NULL AND p.nationality != '' THEN 1 ELSE 0 END) as non_omani_count, + SUM(CASE WHEN p.nationality IS NULL OR p.nationality = '' THEN 1 ELSE 0 END) as unknown_count + FROM visits v + JOIN patients p ON v.patient_id = p.id + JOIN employees e ON v.doctor_id = e.id + WHERE DATE(v.visit_date) BETWEEN ? AND ? + GROUP BY e.id"); +$stmt->execute([$start_date, $end_date]); +$doc_nat_data = $stmt->fetchAll(PDO::FETCH_ASSOC); + +$chart_doc_nat_labels = array_column($doc_nat_data, 'doctor_name'); +$chart_doc_nat_omani = array_column($doc_nat_data, 'omani_count'); +$chart_doc_nat_non_omani = array_column($doc_nat_data, 'non_omani_count'); +$chart_doc_nat_unknown = array_column($doc_nat_data, 'unknown_count'); + // --- PREPARE DATA FOR JS --- $chart_dept_revenue_labels = array_column($dept_revenue, 'name'); $chart_dept_revenue_data = array_column($dept_revenue, 'revenue'); @@ -164,6 +253,11 @@ $chart_gender_data = array_values($patients_by_gender); } /* Ensure Charts are Visible */ + .g-4, .gy-4 { --bs-gutter-y: 0.5rem !important; --bs-gutter-x: 0.5rem !important; } + .mb-5, .mb-4 { margin-bottom: 0.5rem !important; } + .card-body { min-height: auto !important; padding: 0.5rem !important; } + .card-body > div { height: 250px !important; max-height: 250px !important; } + h5 { font-size: 14pt !important; margin-bottom: 5px !important; } canvas { max-width: 100% !important; height: auto !important; @@ -182,7 +276,7 @@ $chart_gender_data = array_values($patients_by_gender); /* Page Break */ .page-break { - page-break-before: always; + page-break-inside: avoid; margin-bottom: 20px !important; } /* Header for Print */ @@ -233,7 +327,7 @@ $chart_gender_data = array_values($patients_by_gender);