diff --git a/db/migrations/20260329_add_sick_leave_to_visits.sql b/db/migrations/20260329_add_sick_leave_to_visits.sql new file mode 100644 index 0000000..39f10e6 --- /dev/null +++ b/db/migrations/20260329_add_sick_leave_to_visits.sql @@ -0,0 +1,53 @@ +SET @dbname = DATABASE(); +SET @tablename = 'visits'; + +-- Add sick_leave_days +SET @columnname = 'sick_leave_days'; +SET @preparedStatement = (SELECT IF( + ( + SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS + WHERE + TABLE_SCHEMA = @dbname + AND TABLE_NAME = @tablename + AND COLUMN_NAME = @columnname + ) > 0, + "SELECT 1", + CONCAT("ALTER TABLE ", @tablename, " ADD COLUMN ", @columnname, " INT NULL;") +)); +PREPARE alterIfNotExists FROM @preparedStatement; +EXECUTE alterIfNotExists; +DEALLOCATE PREPARE alterIfNotExists; + +-- Add sick_leave_start_date +SET @columnname = 'sick_leave_start_date'; +SET @preparedStatement = (SELECT IF( + ( + SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS + WHERE + TABLE_SCHEMA = @dbname + AND TABLE_NAME = @tablename + AND COLUMN_NAME = @columnname + ) > 0, + "SELECT 1", + CONCAT("ALTER TABLE ", @tablename, " ADD COLUMN ", @columnname, " DATE NULL;") +)); +PREPARE alterIfNotExists FROM @preparedStatement; +EXECUTE alterIfNotExists; +DEALLOCATE PREPARE alterIfNotExists; + +-- Add sick_leave_remarks +SET @columnname = 'sick_leave_remarks'; +SET @preparedStatement = (SELECT IF( + ( + SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS + WHERE + TABLE_SCHEMA = @dbname + AND TABLE_NAME = @tablename + AND COLUMN_NAME = @columnname + ) > 0, + "SELECT 1", + CONCAT("ALTER TABLE ", @tablename, " ADD COLUMN ", @columnname, " TEXT NULL;") +)); +PREPARE alterIfNotExists FROM @preparedStatement; +EXECUTE alterIfNotExists; +DEALLOCATE PREPARE alterIfNotExists; \ No newline at end of file diff --git a/includes/actions.php b/includes/actions.php index 9ac1d25..68adceb 100644 --- a/includes/actions.php +++ b/includes/actions.php @@ -235,6 +235,9 @@ if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'POST') $diagnosis = $_POST['diagnosis'] ?? ''; $treatment = $_POST['treatment_plan'] ?? ''; $nursing_notes = $_POST['nursing_notes'] ?? ''; +$sick_leave_start_date = !empty($_POST['sick_leave_start_date']) ? $_POST['sick_leave_start_date'] : null; + $sick_leave_days = !empty($_POST['sick_leave_days']) ? (int)$_POST['sick_leave_days'] : null; + $sick_leave_remarks = $_POST['sick_leave_remarks'] ?? null; if ($patient_id && ($doctor_id || $nurse_id)) { $db->beginTransaction(); @@ -249,8 +252,8 @@ if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'POST') $address = $apt['address'] ?? null; } - $stmt = $db->prepare("INSERT INTO visits (patient_id, doctor_id, nurse_id, visit_type, address, appointment_id, weight, blood_pressure, heart_rate, temperature, symptoms, diagnosis, treatment_plan, nursing_notes) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); - $stmt->execute([$patient_id, $doctor_id, $nurse_id, $visit_type, $address, $appointment_id, $weight, $bp, $hr, $temp, $symptoms, $diagnosis, $treatment, $nursing_notes]); + $stmt = $db->prepare("INSERT INTO visits (patient_id, doctor_id, nurse_id, visit_type, address, appointment_id, weight, blood_pressure, heart_rate, temperature, symptoms, diagnosis, treatment_plan, nursing_notes, sick_leave_start_date, sick_leave_days, sick_leave_remarks) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + $stmt->execute([$patient_id, $doctor_id, $nurse_id, $visit_type, $address, $appointment_id, $weight, $bp, $hr, $temp, $symptoms, $diagnosis, $treatment, $nursing_notes, $sick_leave_start_date, $sick_leave_days, $sick_leave_remarks]); $visit_id = $db->lastInsertId(); $token_message = ''; @@ -328,6 +331,9 @@ if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'POST') $diagnosis = $_POST['diagnosis'] ?? ''; $treatment = $_POST['treatment_plan'] ?? ''; $nursing_notes = $_POST['nursing_notes'] ?? ''; +$sick_leave_start_date = !empty($_POST['sick_leave_start_date']) ? $_POST['sick_leave_start_date'] : null; + $sick_leave_days = !empty($_POST['sick_leave_days']) ? (int)$_POST['sick_leave_days'] : null; + $sick_leave_remarks = $_POST['sick_leave_remarks'] ?? null; // Check for 24h restriction $stmtSet = $db->prepare("SELECT setting_value FROM settings WHERE setting_key = 'disable_visit_edit_24h'"); @@ -354,8 +360,8 @@ if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'POST') if ($id) { // Removed patient_id from UPDATE - $stmt = $db->prepare("UPDATE visits SET doctor_id = ?, weight = ?, blood_pressure = ?, heart_rate = ?, temperature = ?, symptoms = ?, diagnosis = ?, treatment_plan = ?, nursing_notes = ? WHERE id = ?"); - $stmt->execute([$doctor_id, $weight, $bp, $hr, $temp, $symptoms, $diagnosis, $treatment, $nursing_notes, $id]); + $stmt = $db->prepare("UPDATE visits SET doctor_id = ?, weight = ?, blood_pressure = ?, heart_rate = ?, temperature = ?, symptoms = ?, diagnosis = ?, treatment_plan = ?, nursing_notes = ?, sick_leave_start_date = ?, sick_leave_days = ?, sick_leave_remarks = ? WHERE id = ?"); + $stmt->execute([$doctor_id, $weight, $bp, $hr, $temp, $symptoms, $diagnosis, $treatment, $nursing_notes, $sick_leave_start_date, $sick_leave_days, $sick_leave_remarks, $id]); $stmt = $db->prepare("DELETE FROM visit_prescriptions WHERE visit_id = ?"); $stmt->execute([$id]); if (isset($_POST['prescriptions']) && is_array($_POST['prescriptions'])) { diff --git a/includes/layout/footer.php b/includes/layout/footer.php index d937bf4..3d853ec 100644 --- a/includes/layout/footer.php +++ b/includes/layout/footer.php @@ -733,6 +733,9 @@ +
@@ -836,6 +839,24 @@
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+
+
@@ -1244,6 +1265,11 @@ function showEditVisitModal(data) { $('#visit_patient_age').val(''); } + // Populate Sick Leave + document.getElementById('visit_sick_leave_start_date').value = data.sick_leave_start_date || ''; + document.getElementById('visit_sick_leave_days').value = data.sick_leave_days || ''; + document.getElementById('visit_sick_leave_remarks').value = data.sick_leave_remarks || ''; + // Populate Summernote fields $('#visit_symptoms').summernote('code', data.symptoms || ''); $('#visit_diagnosis').summernote('code', data.diagnosis || ''); diff --git a/includes/layout/header.php b/includes/layout/header.php index fba8612..fd720b3 100644 --- a/includes/layout/header.php +++ b/includes/layout/header.php @@ -219,7 +219,15 @@ $site_favicon = !empty($site_settings['company_favicon']) ? $site_settings['comp - + + + + +
+ +
diff --git a/includes/pages/reports.php b/includes/pages/reports.php index ae078bf..2249471 100644 --- a/includes/pages/reports.php +++ b/includes/pages/reports.php @@ -174,7 +174,7 @@ $chart_gender_data = array_values($patients_by_gender);
-

+

diff --git a/includes/pages/visits.php b/includes/pages/visits.php index 7d167cd..5cd6ec3 100644 --- a/includes/pages/visits.php +++ b/includes/pages/visits.php @@ -196,6 +196,13 @@ if (isset($_GET['ajax_search'])) { data-bs-toggle="tooltip" title=""> + + + + +
@@ -425,6 +432,13 @@ if (isset($_GET['ajax_search'])) { data-bs-toggle="tooltip" title=""> + + + + +
diff --git a/lang.php b/lang.php index 44a7fc1..496ec19 100644 --- a/lang.php +++ b/lang.php @@ -45,6 +45,7 @@ $translations = array ( 'doctor_holidays' => 'Doctor Holidays', 'nurses' => 'Nurses', 'admin_reports' => 'Admin Reports', + 'general_statistics' => 'General Statistics', 'settings' => 'Settings', 'company_profile' => 'Company Profile', 'employees' => 'Employees', @@ -218,6 +219,9 @@ $translations = array ( 'consumption_report' => 'Consumption Report', 'total_cost' => 'Total Cost', 'start_date' => 'Start Date', + 'sick_leave' => 'Sick Leave', + 'duration_days' => 'Duration (Days)', + 'remarks' => 'Remarks', 'end_date' => 'End Date', 'filter' => 'Filter', 'all_departments' => 'All Departments', @@ -557,6 +561,7 @@ $translations = array ( 'doctor_holidays' => 'إجازات الأطباء', 'nurses' => 'الممريضين', 'admin_reports' => 'تقارير الإدارة', + 'general_statistics' => 'إحصاءات عامة', 'settings' => 'الإعدادات', 'company_profile' => 'ملف الشركة', 'employees' => 'الموظفين', @@ -730,6 +735,9 @@ $translations = array ( 'consumption_report' => 'تقرير الاستهلاك', 'total_cost' => 'التكلفة الإجمالية', 'start_date' => 'تاريخ البدء', + 'sick_leave' => 'إجازة مرضية', + 'duration_days' => 'المدة (بالأيام)', + 'remarks' => 'ملاحظات', 'end_date' => 'تاريخ الانتهاء', 'filter' => 'تصفية', 'all_departments' => 'كل الأقسام', diff --git a/print_sick_leave.php b/print_sick_leave.php new file mode 100644 index 0000000..931c224 --- /dev/null +++ b/print_sick_leave.php @@ -0,0 +1,145 @@ +prepare(" + SELECT + v.*, + p.name as patient_name, + p.dob, + p.gender, + e.name_en as doctor_name_en, + e.name_ar as doctor_name_ar, + dept.name_en as specialization_en, + dept.name_ar as specialization_ar + FROM visits v + JOIN patients p ON v.patient_id = p.id + LEFT JOIN employees e ON v.doctor_id = e.id + LEFT JOIN departments dept ON e.department_id = dept.id + WHERE v.id = ? + "); + $stmt->execute([$visit_id]); + $visit = $stmt->fetch(); + + if (!$visit) { + throw new Exception("Visit not found"); + } + + $lang = $_SESSION['lang'] ?? 'en'; +} catch (Exception $e) { + die("Error: " . $e->getMessage()); +} +?> + + + + + + <?php echo __('print_sick_leave'); ?> #<?php echo $visit_id; ?> + + + + + +
+
+ + +
+ +
+

Hospital Management System

+

123 Medical Center Street, City, Country

+

Phone: +123 456 7890 | Email: info@hospital.com

+
+ +
+ +
+ +
+

+ + تشهد العيادة بأن المريض + , + العمر: , + الجنس: , + قد تم فحصه وعلاجه في منشأتنا بتاريخ + . + + This is to certify that + , + Age: , + Gender: , + was examined and treated at our facility on + . + +

+ +

+ + بناءً على الفحص الطبي، يُنصح المريض بأخذ إجازة مرضية لمدة + أيام, + ابتداءً من تاريخ + . + + Based on the medical examination, the patient is advised to take a medical leave of absence for + days, + starting from + . + +

+ + +

+
+ +

+ +
+ + +
+ + +