Autosave: 20260329-135759

This commit is contained in:
Flatlogic Bot 2026-03-29 13:57:59 +00:00
parent d22f5a1d5d
commit 83aa809d57
8 changed files with 267 additions and 7 deletions

View File

@ -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;

View File

@ -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'])) {

View File

@ -733,6 +733,9 @@
<li class="nav-item" role="presentation">
<button class="nav-link" id="prescriptions-tab" data-bs-toggle="tab" data-bs-target="#visit-prescriptions" type="button" role="tab"><?php echo __('prescriptions'); ?></button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="sick-leave-tab" data-bs-toggle="tab" data-bs-target="#visit-sick-leave" type="button" role="tab"><?php echo __('sick_leave'); ?></button>
</li>
</ul>
<div class="tab-content" id="visitTabsContent">
@ -836,6 +839,24 @@
</div>
</div>
<!-- Sick Leave Tab -->
<div class="tab-pane fade" id="visit-sick-leave" role="tabpanel">
<div class="row">
<div class="col-md-6 mb-3">
<label class="form-label"><?php echo __('start_date'); ?></label>
<input type="date" name="sick_leave_start_date" id="visit_sick_leave_start_date" class="form-control">
</div>
<div class="col-md-6 mb-3">
<label class="form-label"><?php echo __('duration_days'); ?></label>
<input type="number" name="sick_leave_days" id="visit_sick_leave_days" class="form-control" min="1">
</div>
<div class="col-12 mb-3">
<label class="form-label"><?php echo __('remarks'); ?></label>
<textarea name="sick_leave_remarks" id="visit_sick_leave_remarks" class="form-control" rows="3"></textarea>
</div>
</div>
</div>
<!-- Prescriptions Tab -->
<div class="tab-pane fade" id="visit-prescriptions" role="tabpanel">
<label class="form-label fw-bold"><?php echo __('prescriptions'); ?></label>
@ -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 || '');

View File

@ -219,7 +219,15 @@ $site_favicon = !empty($site_settings['company_favicon']) ? $site_settings['comp
<?php endif; ?>
<?php if (has_permission('reports')): ?>
<a href="reports.php" class="sidebar-link <?php echo $section === 'reports' ? 'active' : ''; ?>"><i class="bi bi-bar-chart-line me-2"></i> <?php echo __('admin_reports'); ?></a>
<a href="#reportsSubmenu" data-bs-toggle="collapse" class="sidebar-link <?php echo in_array($section, ['reports']) ? 'active' : ''; ?> d-flex justify-content-between align-items-center">
<span><i class="bi bi-bar-chart-line me-2"></i> <?php echo __('reports'); ?></span>
<i class="bi bi-chevron-down small"></i>
</a>
<div class="collapse <?php echo in_array($section, ['reports']) ? 'show' : ''; ?>" id="reportsSubmenu">
<div class="sidebar-submenu">
<a href="reports.php" class="sidebar-link py-2 <?php echo $section === 'reports' ? 'active' : ''; ?>"><i class="bi bi-graph-up me-2"></i> <?php echo __('general_statistics'); ?></a>
</div>
</div>
<?php endif; ?>
<?php if (has_permission('users')): ?>

View File

@ -174,7 +174,7 @@ $chart_gender_data = array_values($patients_by_gender);
<!-- Print Header -->
<div class="print-header">
<h2><?php echo __('admin_reports'); ?></h2>
<h2><?php echo __('general_statistics'); ?></h2>
<p class="text-muted">
<?php echo __('report_period'); ?>: <?php echo $start_date; ?> <?php echo __('to'); ?> <?php echo $end_date; ?><br>
<?php echo __('generated_on'); ?>: <?php echo date('Y-m-d H:i'); ?>
@ -182,7 +182,7 @@ $chart_gender_data = array_values($patients_by_gender);
</div>
<div class="d-flex justify-content-between align-items-center mb-4 no-print">
<h3 class="fw-bold text-secondary"><?php echo __('admin_reports'); ?></h3>
<h3 class="fw-bold text-secondary"><?php echo __('general_statistics'); ?></h3>
<div class="d-flex gap-2">
<!-- Date Filter Form -->

View File

@ -196,6 +196,13 @@ if (isset($_GET['ajax_search'])) {
data-bs-toggle="tooltip" title="<?php echo __('print_prescription'); ?>">
<i class="bi bi-printer"></i>
</a>
<?php if (!empty($v['sick_leave_start_date']) && !empty($v['sick_leave_days'])): ?>
<a href="print_sick_leave.php?visit_id=<?php echo $v['id']; ?>" target="_blank"
class="btn btn-sm btn-outline-danger"
data-bs-toggle="tooltip" title="<?php echo __('print_sick_leave'); ?>">
<i class="bi bi-file-medical"></i>
</a>
<?php endif; ?>
</div>
</td>
</tr>
@ -425,6 +432,13 @@ if (isset($_GET['ajax_search'])) {
data-bs-toggle="tooltip" title="<?php echo __('print_prescription'); ?>">
<i class="bi bi-printer"></i>
</a>
<?php if (!empty($v['sick_leave_start_date']) && !empty($v['sick_leave_days'])): ?>
<a href="print_sick_leave.php?visit_id=<?php echo $v['id']; ?>" target="_blank"
class="btn btn-sm btn-outline-danger"
data-bs-toggle="tooltip" title="<?php echo __('print_sick_leave'); ?>">
<i class="bi bi-file-medical"></i>
</a>
<?php endif; ?>
</div>
</td>
</tr>

View File

@ -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' => 'كل الأقسام',

145
print_sick_leave.php Normal file
View File

@ -0,0 +1,145 @@
<?php
require 'db/config.php';
require 'helpers.php';
require_once __DIR__ . '/includes/auth.php';
check_auth();
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
try {
$db = db();
$visit_id = $_GET['visit_id'] ?? 0;
if (!$visit_id) {
throw new Exception("Invalid Visit ID");
}
$stmt = $db->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());
}
?>
<!DOCTYPE html>
<html lang="<?php echo $lang; ?>" dir="<?php echo $lang == 'ar' ? 'rtl' : 'ltr'; ?>">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><?php echo __('print_sick_leave'); ?> #<?php echo $visit_id; ?></title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<style>
body { font-family: 'Times New Roman', Times, serif; }
.prescription-header { border-bottom: 2px solid #000; padding-bottom: 20px; margin-bottom: 30px; }
.prescription-footer { border-top: 2px solid #000; padding-top: 20px; margin-top: 50px; }
.certificate-title { font-size: 32px; font-weight: bold; text-align: center; text-transform: uppercase; margin-bottom: 40px; text-decoration: underline; }
.content-body { font-size: 18px; line-height: 2; margin-bottom: 40px; }
.data-field { font-weight: bold; border-bottom: 1px dotted #000; display: inline-block; min-width: 150px; padding: 0 5px; text-align: center; }
@media print {
.no-print { display: none; }
body { padding: 40px; }
}
</style>
</head>
<body onload="window.print()">
<div class="container">
<div class="no-print mb-3 text-end">
<button onclick="window.print()" class="btn btn-primary">Print</button>
<button onclick="window.close()" class="btn btn-secondary">Close</button>
</div>
<div class="prescription-header text-center">
<h2>Hospital Management System</h2>
<p>123 Medical Center Street, City, Country</p>
<p>Phone: +123 456 7890 | Email: info@hospital.com</p>
</div>
<div class="certificate-title">
<?php echo $lang == 'ar' ? 'شهادة إجازة مرضية' : 'Medical Sick Leave Certificate'; ?>
</div>
<div class="content-body">
<p>
<?php if($lang == 'ar'): ?>
تشهد العيادة بأن المريض
<span class="data-field"><?php echo htmlspecialchars($visit['patient_name']); ?></span>,
العمر: <span class="data-field"><?php echo calculate_age($visit['dob']); ?></span>,
الجنس: <span class="data-field"><?php echo $visit['gender'] == 'Male' ? 'ذكر' : 'أنثى'; ?></span>,
قد تم فحصه وعلاجه في منشأتنا بتاريخ
<span class="data-field"><?php echo date('d M Y', strtotime($visit['visit_date'] ?? 'now')); ?></span>.
<?php else: ?>
This is to certify that
<span class="data-field"><?php echo htmlspecialchars($visit['patient_name']); ?></span>,
Age: <span class="data-field"><?php echo calculate_age($visit['dob']); ?></span>,
Gender: <span class="data-field"><?php echo $visit['gender']; ?></span>,
was examined and treated at our facility on
<span class="data-field"><?php echo date('d M Y', strtotime($visit['visit_date'] ?? 'now')); ?></span>.
<?php endif; ?>
</p>
<p>
<?php if($lang == 'ar'): ?>
بناءً على الفحص الطبي، يُنصح المريض بأخذ إجازة مرضية لمدة
<span class="data-field"><?php echo htmlspecialchars($visit['sick_leave_days'] ?? 0); ?></span> أيام,
ابتداءً من تاريخ
<span class="data-field"><?php echo htmlspecialchars($visit['sick_leave_start_date'] ?? ''); ?></span>.
<?php else: ?>
Based on the medical examination, the patient is advised to take a medical leave of absence for
<span class="data-field"><?php echo htmlspecialchars($visit['sick_leave_days'] ?? 0); ?></span> days,
starting from
<span class="data-field"><?php echo htmlspecialchars($visit['sick_leave_start_date'] ?? ''); ?></span>.
<?php endif; ?>
</p>
<?php if (!empty($visit['sick_leave_remarks'])): ?>
<p>
<strong><?php echo $lang == 'ar' ? 'ملاحظات / توصيات:' : 'Remarks / Recommendations:'; ?></strong><br>
<span style="white-space: pre-line;"><?php echo htmlspecialchars($visit['sick_leave_remarks']); ?></span>
</p>
<?php endif; ?>
</div>
<div class="prescription-footer mt-5">
<div class="row">
<div class="col-8">
<p class="small text-muted">
<?php echo $lang == 'ar' ? 'تم إصدار هذه الشهادة بناءً على تقييم الطبيب وهي صالحة فقط للتواريخ المذكورة.' : 'This certificate is issued based on the doctor\'s assessment and is valid only for the stated dates.'; ?>
</p>
</div>
<div class="col-4 text-center">
<div class="border-bottom border-dark mb-2" style="height: 50px;"></div>
<p class="fw-bold mb-0">Dr. <?php echo $visit['doctor_name_' . $lang] ?? $visit['doctor_name_en']; ?></p>
<p class="small text-muted"><?php echo $visit['specialization_' . $lang] ?? $visit['specialization_en']; ?></p>
</div>
</div>
</div>
</div>
</body>
</html>