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());
+}
+?>
+
+
+
+
+
+
#
+
+
+
+
+
+
+
+ Print
+ Close
+
+
+
+
+
+
+
+
+
+
+
+ تشهد العيادة بأن المريض
+ ,
+ العمر: ,
+ الجنس: ,
+ قد تم فحصه وعلاجه في منشأتنا بتاريخ
+ .
+
+ 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
+ .
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+