prepare("SELECT COUNT(*) FROM patients WHERE DATE(created_at) BETWEEN ? AND ?"); $stmt->execute([$start_date, $end_date]); $new_patients = $stmt->fetchColumn(); // 2. Total Visits $stmt = $db->prepare("SELECT COUNT(*) FROM visits WHERE DATE(visit_date) BETWEEN ? AND ?"); $stmt->execute([$start_date, $end_date]); $total_visits = $stmt->fetchColumn(); // 3. Total Revenue $stmt = $db->prepare("SELECT SUM(total_amount) FROM bills WHERE DATE(created_at) BETWEEN ? AND ?"); $stmt->execute([$start_date, $end_date]); $total_revenue = $stmt->fetchColumn() ?: 0; // 4. Pending Bills (Outstanding amount for bills created in this period) $stmt = $db->prepare("SELECT SUM(patient_payable) FROM bills WHERE status != 'Paid' AND DATE(created_at) BETWEEN ? AND ?"); $stmt->execute([$start_date, $end_date]); $pending_bills = $stmt->fetchColumn() ?: 0; // 5. Revenue Trend (Daily) $stmt = $db->prepare("SELECT DATE(created_at) as date, SUM(total_amount) as total FROM bills WHERE DATE(created_at) BETWEEN ? AND ? GROUP BY DATE(created_at) ORDER BY date ASC"); $stmt->execute([$start_date, $end_date]); $revenue_trend = $stmt->fetchAll(PDO::FETCH_ASSOC); // 6. Visits by Doctor (Top 5) // Updated to join employees $stmt = $db->prepare(" SELECT d.name_$lang as doctor_name, COUNT(v.id) as count FROM visits v JOIN employees d ON v.doctor_id = d.id WHERE DATE(v.visit_date) BETWEEN ? AND ? GROUP BY v.doctor_id ORDER BY count DESC LIMIT 5 "); $stmt->execute([$start_date, $end_date]); $visits_by_doctor = $stmt->fetchAll(PDO::FETCH_ASSOC); // 7. Patient Gender Distribution $stmt = $db->prepare("SELECT gender, COUNT(*) as count FROM patients WHERE DATE(created_at) BETWEEN ? AND ? GROUP BY gender"); $stmt->execute([$start_date, $end_date]); $patients_by_gender = $stmt->fetchAll(PDO::FETCH_KEY_PAIR); // 8. Department Revenue Report // Updated to join employees $stmt = $db->prepare(" SELECT d.name_$lang as name, COUNT(DISTINCT b.visit_id) as visit_count, SUM(b.total_amount) as revenue FROM bills b JOIN visits v ON b.visit_id = v.id JOIN employees doc ON v.doctor_id = doc.id JOIN departments d ON doc.department_id = d.id WHERE b.status = 'Paid' AND DATE(b.created_at) BETWEEN ? AND ? GROUP BY d.id ORDER BY revenue DESC "); $stmt->execute([$start_date, $end_date]); $dept_revenue = $stmt->fetchAll(PDO::FETCH_ASSOC); // 9. Doctor Revenue Report // Updated to join employees $stmt = $db->prepare(" SELECT doc.name_$lang as name, d.name_$lang as department_name, COUNT(DISTINCT b.visit_id) as visit_count, SUM(b.total_amount) as revenue FROM bills b JOIN visits v ON b.visit_id = v.id JOIN employees doc ON v.doctor_id = doc.id LEFT JOIN departments d ON doc.department_id = d.id WHERE b.status = 'Paid' AND DATE(b.created_at) BETWEEN ? AND ? GROUP BY doc.id ORDER BY revenue DESC "); $stmt->execute([$start_date, $end_date]); $doctor_revenue = $stmt->fetchAll(PDO::FETCH_ASSOC); // 10. Patient Nationality Distribution (Omani vs Non-Omani) $stmt = $db->prepare(" SELECT CASE WHEN nationality = 'Oman' THEN 'omani' WHEN nationality IS NULL OR nationality = '' THEN 'unknown_nationality' ELSE 'non_omani' END as nat_group, COUNT(*) as count FROM patients WHERE DATE(created_at) BETWEEN ? AND ? GROUP BY nat_group "); $stmt->execute([$start_date, $end_date]); $patients_by_nationality_raw = $stmt->fetchAll(PDO::FETCH_KEY_PAIR); // Translate labels $patients_by_nationality = []; foreach ($patients_by_nationality_raw as $key => $val) { $patients_by_nationality[__($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'); $chart_revenue_labels = array_column($revenue_trend, 'date'); $chart_revenue_data = array_column($revenue_trend, 'total'); $chart_doctor_labels = array_column($visits_by_doctor, 'doctor_name'); $chart_doctor_data = array_column($visits_by_doctor, 'count'); $chart_gender_labels = array_keys($patients_by_gender); $chart_gender_data = array_values($patients_by_gender); ?>

-

()
(Paid)
(Paid)