From dc081ef86abd5e5dbf01d5db24a12cd0b4865c8f Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sat, 21 Mar 2026 14:56:14 +0000 Subject: [PATCH] adding admin reports --- includes/layout/header.php | 4 +- includes/pages/reports.php | 307 +++++++++++++++++++++++++++++++++++++ lang.php | 24 ++- reports.php | 17 ++ 4 files changed, 348 insertions(+), 4 deletions(-) create mode 100644 includes/pages/reports.php create mode 100644 reports.php diff --git a/includes/layout/header.php b/includes/layout/header.php index 8756560..98798e9 100644 --- a/includes/layout/header.php +++ b/includes/layout/header.php @@ -168,6 +168,8 @@ $site_favicon = !empty($site_settings['company_favicon']) ? $site_settings['comp + + @@ -220,4 +222,4 @@ $site_favicon = !empty($site_settings['company_favicon']) ? $site_settings['comp - + \ No newline at end of file diff --git a/includes/pages/reports.php b/includes/pages/reports.php new file mode 100644 index 0000000..ab7760f --- /dev/null +++ b/includes/pages/reports.php @@ -0,0 +1,307 @@ +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. Visits by Status +$stmt = $db->prepare("SELECT status, COUNT(*) as count FROM visits WHERE DATE(visit_date) BETWEEN ? AND ? GROUP BY status"); +$stmt->execute([$start_date, $end_date]); +$visits_by_status = $stmt->fetchAll(PDO::FETCH_KEY_PAIR); + +// 6. 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); + +// 7. Visits by Doctor +$stmt = $db->prepare(" + SELECT d.name_$lang as doctor_name, COUNT(v.id) as count + FROM visits v + JOIN doctors 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); + +// 8. Patient Gender Distribution (All time or filtered? Let's do filtered by creation date to match "New Patients") +$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); + +// --- PREPARE DATA FOR JS --- +$chart_status_labels = array_keys($visits_by_status); +$chart_status_data = array_values($visits_by_status); + +$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); + +?> + + + + +
+

+ + +
+
+ + +
+ - +
+ + +
+ +
+
+ + +
+
+
+
+
+ +
+
+
+

+
+
+
+
+
+
+
+
+ +
+
+
+

+
+
+
+
+
+
+
+
+ +
+
+
+

+
+
+
+
+
+
+
+
+ +
+
+
+

+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+ + +
+
+
+
+
+
+
+ +
+
+
+
+
+
+
()
+
+
+
+ +
+
+
+
+
+ + diff --git a/lang.php b/lang.php index 7ba3dbd..47d58e1 100644 --- a/lang.php +++ b/lang.php @@ -423,7 +423,16 @@ $translations = [ 'payment_method_cash' => 'Cash', 'payment_method_card' => 'Credit Card', 'transactions' => 'Transactions', - 'companies' => 'Companies' + 'companies' => 'Companies', + 'admin_reports' => 'Admin Reports', + 'new_patients' => 'New Patients', + 'total_visits' => 'Total Visits', + 'total_revenue' => 'Total Revenue', + 'pending_bills' => 'Pending Bills', + 'visits_by_status' => 'Visits by Status', + 'revenue_trend' => 'Revenue Trend', + 'top_diagnoses' => 'Top Diagnoses', + 'top_doctors' => 'Top Doctors' ], 'ar' => [ 'attachment' => 'المرفق', @@ -860,6 +869,15 @@ $translations = [ 'payment_method_cash' => 'نقدي', 'payment_method_card' => 'بطاقة ائتمان', 'transactions' => 'المعاملات', - 'companies' => 'الشركات' + 'companies' => 'الشركات', + 'admin_reports' => 'التقارير الإدارية', + 'new_patients' => 'مرضى جدد', + 'total_visits' => 'إجمالي الزيارات', + 'total_revenue' => 'إجمالي الإيرادات', + 'pending_bills' => 'فواتير معلقة', + 'visits_by_status' => 'الزيارات حسب الحالة', + 'revenue_trend' => 'اتجاه الإيرادات', + 'top_diagnoses' => 'أهم التشخيصات', + 'top_doctors' => 'أفضل الأطباء' ] -]; +]; \ No newline at end of file diff --git a/reports.php b/reports.php new file mode 100644 index 0000000..ada19bd --- /dev/null +++ b/reports.php @@ -0,0 +1,17 @@ +