update lab

This commit is contained in:
Flatlogic Bot 2026-03-04 07:07:46 +00:00
parent 63a866d898
commit a63d31ec70
11 changed files with 509 additions and 83 deletions

View File

@ -378,9 +378,10 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name_ar = $_POST['name_ar'] ?? ''; $name_ar = $_POST['name_ar'] ?? '';
$group_id = $_POST['group_id'] ?: null; $group_id = $_POST['group_id'] ?: null;
$price = $_POST['price'] ?? 0; $price = $_POST['price'] ?? 0;
$range = $_POST['normal_range'] ?? '';
if ($name_en && $name_ar) { if ($name_en && $name_ar) {
$stmt = $db->prepare("INSERT INTO laboratory_tests (name_en, name_ar, group_id, price) VALUES (?, ?, ?, ?)"); $stmt = $db->prepare("INSERT INTO laboratory_tests (name_en, name_ar, group_id, price, normal_range) VALUES (?, ?, ?, ?, ?)");
$stmt->execute([$name_en, $name_ar, $group_id, $price]); $stmt->execute([$name_en, $name_ar, $group_id, $price, $range]);
$_SESSION['flash_message'] = __('add_test') . ' ' . __('successfully'); $_SESSION['flash_message'] = __('add_test') . ' ' . __('successfully');
$redirect = true; $redirect = true;
} }
@ -390,9 +391,10 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name_ar = $_POST['name_ar'] ?? ''; $name_ar = $_POST['name_ar'] ?? '';
$group_id = $_POST['group_id'] ?: null; $group_id = $_POST['group_id'] ?: null;
$price = $_POST['price'] ?? 0; $price = $_POST['price'] ?? 0;
$range = $_POST['normal_range'] ?? '';
if ($id && $name_en && $name_ar) { if ($id && $name_en && $name_ar) {
$stmt = $db->prepare("UPDATE laboratory_tests SET name_en = ?, name_ar = ?, group_id = ?, price = ? WHERE id = ?"); $stmt = $db->prepare("UPDATE laboratory_tests SET name_en = ?, name_ar = ?, group_id = ?, price = ?, normal_range = ? WHERE id = ?");
$stmt->execute([$name_en, $name_ar, $group_id, $price, $id]); $stmt->execute([$name_en, $name_ar, $group_id, $price, $range, $id]);
$_SESSION['flash_message'] = __('update_test') . ' ' . __('successfully'); $_SESSION['flash_message'] = __('update_test') . ' ' . __('successfully');
$redirect = true; $redirect = true;
} }
@ -404,6 +406,43 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$_SESSION['flash_message'] = __('delete_test') . ' ' . __('successfully'); $_SESSION['flash_message'] = __('delete_test') . ' ' . __('successfully');
$redirect = true; $redirect = true;
} }
} elseif ($_POST['action'] === 'add_inquiry') {
$patient_name = $_POST['patient_name'] ?? '';
$test_id = $_POST['test_id'] ?: null;
$source = $_POST['source'] ?? 'Internal';
$date = $_POST['inquiry_date'] ?: date('Y-m-d H:i');
$status = $_POST['status'] ?? 'Pending';
$notes = $_POST['notes'] ?? '';
if ($patient_name) {
$stmt = $db->prepare("INSERT INTO laboratory_inquiries (patient_name, test_id, source, inquiry_date, status, notes) VALUES (?, ?, ?, ?, ?, ?)");
$stmt->execute([$patient_name, $test_id, $source, $date, $status, $notes]);
$_SESSION['flash_message'] = __('add_inquiry') . ' ' . __('successfully');
$redirect = true;
}
} elseif ($_POST['action'] === 'edit_inquiry') {
$id = $_POST['id'] ?? '';
$patient_name = $_POST['patient_name'] ?? '';
$test_id = $_POST['test_id'] ?: null;
$source = $_POST['source'] ?? 'Internal';
$date = $_POST['inquiry_date'] ?: date('Y-m-d H:i');
$status = $_POST['status'] ?? 'Pending';
$notes = $_POST['notes'] ?? '';
if ($id && $patient_name) {
$stmt = $db->prepare("UPDATE laboratory_inquiries SET patient_name = ?, test_id = ?, source = ?, inquiry_date = ?, status = ?, notes = ? WHERE id = ?");
$stmt->execute([$patient_name, $test_id, $source, $date, $status, $notes, $id]);
$_SESSION['flash_message'] = __('edit_inquiry') . ' ' . __('successfully');
$redirect = true;
}
} elseif ($_POST['action'] === 'delete_inquiry') {
$id = $_POST['id'] ?? '';
if ($id) {
$stmt = $db->prepare("DELETE FROM laboratory_inquiries WHERE id = ?");
$stmt->execute([$id]);
$_SESSION['flash_message'] = __('delete') . ' ' . __('successfully');
$redirect = true;
}
} }
} }

View File

@ -905,6 +905,10 @@
<?php endforeach; ?> <?php endforeach; ?>
</select> </select>
</div> </div>
<div class="mb-3">
<label class="form-label"><?php echo __("normal_range"); ?></label>
<input type="text" name="normal_range" class="form-control" placeholder="e.g. Men: 13-17, Women: 12-15 g/dL">
</div>
<div class="mb-3"> <div class="mb-3">
<label class="form-label"><?php echo __('price'); ?></label> <label class="form-label"><?php echo __('price'); ?></label>
<input type="number" step="0.01" name="price" class="form-control" required placeholder="0.00"> <input type="number" step="0.01" name="price" class="form-control" required placeholder="0.00">
@ -941,13 +945,17 @@
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label class="form-label"><?php echo __('test_group'); ?></label> <label class="form-label"><?php echo __('test_group'); ?></label>
<select name="group_id" id="edit_test_group_id" class="form-select"> <select name="group_id" id="edit_test_group_id_select" class="form-select">
<option value=""><?php echo __('search'); ?>...</option> <option value=""><?php echo __('search'); ?>...</option>
<?php foreach ($all_test_groups as $group): ?> <?php foreach ($all_test_groups as $group): ?>
<option value="<?php echo $group['id']; ?>"><?php echo htmlspecialchars($group['name']); ?></option> <option value="<?php echo $group['id']; ?>"><?php echo htmlspecialchars($group['name']); ?></option>
<?php endforeach; ?> <?php endforeach; ?>
</select> </select>
</div> </div>
<div class="mb-3">
<label class="form-label"><?php echo __("normal_range"); ?></label>
<input type="text" name="normal_range" id="edit_test_normal_range" class="form-control" placeholder="e.g. Men: 13-17, Women: 12-15 g/dL">
</div>
<div class="mb-3"> <div class="mb-3">
<label class="form-label"><?php echo __('price'); ?></label> <label class="form-label"><?php echo __('price'); ?></label>
<input type="number" step="0.01" name="price" id="edit_test_price" class="form-control" required placeholder="0.00"> <input type="number" step="0.01" name="price" id="edit_test_price" class="form-control" required placeholder="0.00">
@ -985,6 +993,148 @@
</div> </div>
</div> </div>
<!-- Add Inquiry Modal -->
<div class="modal fade" id="addInquiryModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog">
<form action="<?php echo $_SERVER['PHP_SELF']; ?>?section=<?php echo $section; ?>" method="POST">
<input type="hidden" name="action" value="add_inquiry">
<div class="modal-content border-0 shadow">
<div class="modal-header">
<h5 class="modal-title fw-bold"><?php echo __('add_inquiry'); ?></h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="mb-3">
<label class="form-label"><?php echo __('patient'); ?></label>
<input type="text" name="patient_name" class="form-control" required placeholder="<?php echo __('name'); ?>">
</div>
<div class="mb-3">
<label class="form-label"><?php echo __('test'); ?></label>
<select name="test_id" class="form-select">
<option value=""><?php echo __('search'); ?>...</option>
<?php foreach ($all_tests as $test): ?>
<option value="<?php echo $test['id']; ?>"><?php echo htmlspecialchars($test['name']); ?></option>
<?php endforeach; ?>
</select>
</div>
<div class="row">
<div class="col-md-6 mb-3">
<label class="form-label"><?php echo __('source'); ?></label>
<select name="source" class="form-select">
<option value="Internal"><?php echo __('internal'); ?></option>
<option value="External"><?php echo __('external'); ?></option>
</select>
</div>
<div class="col-md-6 mb-3">
<label class="form-label"><?php echo __('status'); ?></label>
<select name="status" class="form-select">
<option value="Pending"><?php echo __('Pending'); ?></option>
<option value="Completed"><?php echo __('Completed'); ?></option>
<option value="Cancelled"><?php echo __('Cancelled'); ?></option>
</select>
</div>
</div>
<div class="mb-3">
<label class="form-label"><?php echo __('inquiry_date'); ?></label>
<input type="datetime-local" name="inquiry_date" class="form-control" value="<?php echo date('Y-m-d\TH:i'); ?>">
</div>
<div class="mb-3">
<label class="form-label"><?php echo __('notes'); ?></label>
<textarea name="notes" class="form-control" rows="2"></textarea>
</div>
</div>
<div class="modal-footer bg-light">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal"><?php echo __('cancel'); ?></button>
<button type="submit" class="btn btn-primary px-4"><?php echo __('save'); ?></button>
</div>
</div>
</form>
</div>
</div>
<!-- Edit Inquiry Modal -->
<div class="modal fade" id="editInquiryModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog">
<form action="<?php echo $_SERVER['PHP_SELF']; ?>?section=<?php echo $section; ?>" method="POST">
<input type="hidden" name="action" value="edit_inquiry">
<input type="hidden" name="id" id="edit_inquiry_id">
<div class="modal-content border-0 shadow">
<div class="modal-header">
<h5 class="modal-title fw-bold"><?php echo __('edit_inquiry'); ?></h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="mb-3">
<label class="form-label"><?php echo __('patient'); ?></label>
<input type="text" name="patient_name" id="edit_inquiry_patient_name" class="form-control" required>
</div>
<div class="mb-3">
<label class="form-label"><?php echo __('test'); ?></label>
<select name="test_id" id="edit_inquiry_test_id" class="form-select">
<option value=""><?php echo __('search'); ?>...</option>
<?php foreach ($all_tests as $test): ?>
<option value="<?php echo $test['id']; ?>"><?php echo htmlspecialchars($test['name']); ?></option>
<?php endforeach; ?>
</select>
</div>
<div class="row">
<div class="col-md-6 mb-3">
<label class="form-label"><?php echo __('source'); ?></label>
<select name="source" id="edit_inquiry_source" class="form-select">
<option value="Internal"><?php echo __('internal'); ?></option>
<option value="External"><?php echo __('external'); ?></option>
</select>
</div>
<div class="col-md-6 mb-3">
<label class="form-label"><?php echo __('status'); ?></label>
<select name="status" id="edit_inquiry_status" class="form-select">
<option value="Pending"><?php echo __('Pending'); ?></option>
<option value="Completed"><?php echo __('Completed'); ?></option>
<option value="Cancelled"><?php echo __('Cancelled'); ?></option>
</select>
</div>
</div>
<div class="mb-3">
<label class="form-label"><?php echo __('inquiry_date'); ?></label>
<input type="datetime-local" name="inquiry_date" id="edit_inquiry_date" class="form-control">
</div>
<div class="mb-3">
<label class="form-label"><?php echo __('notes'); ?></label>
<textarea name="notes" id="edit_inquiry_notes" class="form-control" rows="2"></textarea>
</div>
</div>
<div class="modal-footer bg-light">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal"><?php echo __('cancel'); ?></button>
<button type="submit" class="btn btn-primary px-4"><?php echo __('save'); ?></button>
</div>
</div>
</form>
</div>
</div>
<!-- Delete Inquiry Modal -->
<div class="modal fade" id="deleteInquiryModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog">
<form action="<?php echo $_SERVER['PHP_SELF']; ?>?section=<?php echo $section; ?>" method="POST">
<input type="hidden" name="action" value="delete_inquiry">
<input type="hidden" name="id" id="delete_inquiry_id">
<div class="modal-content border-0 shadow">
<div class="modal-header">
<h5 class="modal-title fw-bold"><?php echo __('delete'); ?></h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p><?php echo __('confirm_delete'); ?>?</p>
</div>
<div class="modal-footer bg-light">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal"><?php echo __('cancel'); ?></button>
<button type="submit" class="btn btn-danger px-4"><?php echo __('delete'); ?></button>
</div>
</div>
</form>
</div>
</div>
<!-- Book Appointment Modal --> <!-- Book Appointment Modal -->
<div class="modal fade" id="bookAppointmentModal" tabindex="-1" aria-hidden="true"> <div class="modal fade" id="bookAppointmentModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog"> <div class="modal-dialog">
@ -1403,7 +1553,8 @@
document.getElementById('edit_test_id').value = test.id; document.getElementById('edit_test_id').value = test.id;
document.getElementById('edit_test_name_en').value = test.name_en; document.getElementById('edit_test_name_en').value = test.name_en;
document.getElementById('edit_test_name_ar').value = test.name_ar; document.getElementById('edit_test_name_ar').value = test.name_ar;
document.getElementById('edit_test_group_id').value = test.group_id || ''; document.getElementById('edit_test_group_id_select').value = test.group_id || '';
document.getElementById('edit_test_normal_range').value = test.normal_range || '';
document.getElementById('edit_test_price').value = test.price; document.getElementById('edit_test_price').value = test.price;
new bootstrap.Modal(document.getElementById('editTestModal')).show(); new bootstrap.Modal(document.getElementById('editTestModal')).show();
} }
@ -1434,6 +1585,22 @@
new bootstrap.Modal(document.getElementById('recordVisitModal')).show(); new bootstrap.Modal(document.getElementById('recordVisitModal')).show();
} }
function showEditInquiryModal(inquiry) {
document.getElementById('edit_inquiry_id').value = inquiry.id;
document.getElementById('edit_inquiry_patient_name').value = inquiry.patient_name;
document.getElementById('edit_inquiry_test_id').value = inquiry.test_id || '';
document.getElementById('edit_inquiry_source').value = inquiry.source;
document.getElementById('edit_inquiry_status').value = inquiry.status;
document.getElementById('edit_inquiry_date').value = inquiry.inquiry_date.replace(' ', 'T').substring(0, 16);
document.getElementById('edit_inquiry_notes').value = inquiry.notes || '';
new bootstrap.Modal(document.getElementById('editInquiryModal')).show();
}
function showDeleteInquiryModal(id) {
document.getElementById('delete_inquiry_id').value = id;
new bootstrap.Modal(document.getElementById('deleteInquiryModal')).show();
}
function addBillItem() { function addBillItem() {
const container = document.getElementById('bill_items_container'); const container = document.getElementById('bill_items_container');
const row = document.createElement('div'); const row = document.createElement('div');

View File

@ -60,14 +60,15 @@ $message = $message ?? '';
<a href="patients.php" class="sidebar-link <?php echo $section === 'patients' ? 'active' : ''; ?>"><i class="bi bi-people me-2"></i> <?php echo __('patients'); ?></a> <a href="patients.php" class="sidebar-link <?php echo $section === 'patients' ? 'active' : ''; ?>"><i class="bi bi-people me-2"></i> <?php echo __('patients'); ?></a>
<a href="visits.php" class="sidebar-link <?php echo $section === 'visits' ? 'active' : ''; ?>"><i class="bi bi-clipboard2-pulse me-2"></i> <?php echo __('visits'); ?></a> <a href="visits.php" class="sidebar-link <?php echo $section === 'visits' ? 'active' : ''; ?>"><i class="bi bi-clipboard2-pulse me-2"></i> <?php echo __('visits'); ?></a>
<a href="#labSubmenu" data-bs-toggle="collapse" class="sidebar-link <?php echo in_array($section, ['laboratory_tests', 'test_groups']) ? 'active' : ''; ?> d-flex justify-content-between align-items-center"> <a href="#labSubmenu" data-bs-toggle="collapse" class="sidebar-link <?php echo in_array($section, ['laboratory_tests', 'test_groups', 'laboratory_inquiries']) ? 'active' : ''; ?> d-flex justify-content-between align-items-center">
<span><i class="bi bi-prescription2 me-2"></i> <?php echo __('laboratory'); ?></span> <span><i class="bi bi-prescription2 me-2"></i> <?php echo __('laboratory'); ?></span>
<i class="bi bi-chevron-down small"></i> <i class="bi bi-chevron-down small"></i>
</a> </a>
<div class="collapse <?php echo in_array($section, ['laboratory_tests', 'test_groups']) ? 'show' : ''; ?>" id="labSubmenu"> <div class="collapse <?php echo in_array($section, ['laboratory_tests', 'test_groups', 'laboratory_inquiries']) ? 'show' : ''; ?>" id="labSubmenu">
<div class="sidebar-submenu"> <div class="sidebar-submenu">
<a href="laboratory_tests.php" class="sidebar-link py-2 <?php echo $section === 'laboratory_tests' ? 'active' : ''; ?>"><i class="bi bi-list-check me-2"></i> <?php echo __('tests'); ?></a> <a href="laboratory_tests.php" class="sidebar-link py-2 <?php echo $section === 'laboratory_tests' ? 'active' : ''; ?>"><i class="bi bi-list-check me-2"></i> <?php echo __('tests'); ?></a>
<a href="test_groups.php" class="sidebar-link py-2 <?php echo $section === 'test_groups' ? 'active' : ''; ?>"><i class="bi bi-collection me-2"></i> <?php echo __('test_groups'); ?></a> <a href="test_groups.php" class="sidebar-link py-2 <?php echo $section === 'test_groups' ? 'active' : ''; ?>"><i class="bi bi-collection me-2"></i> <?php echo __('test_groups'); ?></a>
<a href="laboratory_inquiries.php" class="sidebar-link py-2 <?php echo $section === 'laboratory_inquiries' ? 'active' : ''; ?>"><i class="bi bi-question-circle me-2"></i> <?php echo __('inquiries'); ?></a>
</div> </div>
</div> </div>

View File

@ -0,0 +1,139 @@
<?php
$search_patient = $_GET['patient'] ?? '';
$search_source = $_GET['source'] ?? '';
$query = "
SELECT i.*, t.name_$lang as test_name
FROM laboratory_inquiries i
LEFT JOIN laboratory_tests t ON i.test_id = t.id
WHERE 1=1";
$params = [];
if ($search_patient) {
$query .= " AND i.patient_name LIKE ?";
$params[] = "%$search_patient%";
}
if ($search_source) {
$query .= " AND i.source = ?";
$params[] = $search_source;
}
$query .= " ORDER BY i.inquiry_date DESC";
$stmt = $db->prepare($query);
$stmt->execute($params);
$inquiries = $stmt->fetchAll();
// Get all tests for the add/edit modal
$stmt = $db->query("SELECT id, name_$lang as name FROM laboratory_tests ORDER BY name_$lang ASC");
$all_tests = $stmt->fetchAll();
?>
<div class="d-flex justify-content-between align-items-center mb-4">
<h3 class="fw-bold text-secondary"><?php echo __('inquiries'); ?></h3>
<button class="btn btn-primary shadow-sm" data-bs-toggle="modal" data-bs-target="#addInquiryModal">
<i class="bi bi-plus-circle me-1"></i> <?php echo __('add_inquiry'); ?>
</button>
</div>
<!-- Search Bar -->
<div class="card shadow-sm border-0 mb-4">
<div class="card-body">
<form method="GET" action="" class="row g-3">
<div class="col-md-6">
<div class="input-group">
<span class="input-group-text bg-light border-end-0 text-muted"><i class="bi bi-search"></i></span>
<input type="text" name="patient" class="form-control bg-light border-start-0" placeholder="<?php echo __('patient'); ?>" value="<?php echo htmlspecialchars($search_patient); ?>">
</div>
</div>
<div class="col-md-4">
<select name="source" class="form-select bg-light">
<option value=""><?php echo __('source'); ?> (<?php echo __('all'); ?>)</option>
<option value="Internal" <?php echo $search_source == 'Internal' ? 'selected' : ''; ?>><?php echo __('internal'); ?></option>
<option value="External" <?php echo $search_source == 'External' ? 'selected' : ''; ?>><?php echo __('external'); ?></option>
</select>
</div>
<div class="col-md-2">
<button type="submit" class="btn btn-secondary w-100"><?php echo __('search'); ?></button>
</div>
</form>
</div>
</div>
<div class="card shadow-sm border-0">
<div class="card-body p-0">
<div class="table-responsive">
<table class="table table-hover align-middle mb-0">
<thead class="table-light text-secondary">
<tr>
<th class="px-4 py-3">#</th>
<th class="py-3"><?php echo __('patient'); ?></th>
<th class="py-3"><?php echo __('test'); ?></th>
<th class="py-3"><?php echo __('inquiry_date'); ?></th>
<th class="py-3"><?php echo __('source'); ?></th>
<th class="py-3"><?php echo __('status'); ?></th>
<th class="py-3 text-end px-4"><?php echo __('actions'); ?></th>
</tr>
</thead>
<tbody>
<?php if (empty($inquiries)): ?>
<tr>
<td colspan="7" class="text-center py-5 text-muted">
<i class="bi bi-question-circle display-4 d-block mb-3"></i>
<?php echo __('no_inquiries_found'); ?>
</td>
</tr>
<?php else: ?>
<?php foreach ($inquiries as $inquiry): ?>
<tr>
<td class="px-4 fw-medium text-secondary"><?php echo $inquiry['id']; ?></td>
<td class="fw-semibold text-dark"><?php echo htmlspecialchars($inquiry['patient_name']); ?></td>
<td>
<span class="badge bg-info bg-opacity-10 text-info border border-info border-opacity-25 px-2 py-1">
<?php echo htmlspecialchars($inquiry['test_name'] ?? '-'); ?>
</span>
</td>
<td class="text-secondary"><?php echo date('Y-m-d H:i', strtotime($inquiry['inquiry_date'])); ?></td>
<td>
<?php if ($inquiry['source'] == 'External'): ?>
<span class="badge bg-warning bg-opacity-10 text-warning border border-warning border-opacity-25 px-2 py-1">
<i class="bi bi-hospital me-1"></i> <?php echo __('external'); ?>
</span>
<?php else: ?>
<span class="badge bg-success bg-opacity-10 text-success border border-success border-opacity-25 px-2 py-1">
<i class="bi bi-building me-1"></i> <?php echo __('internal'); ?>
</span>
<?php endif; ?>
</td>
<td>
<?php
$status_class = 'bg-secondary';
if ($inquiry['status'] == 'Pending') $status_class = 'bg-warning';
if ($inquiry['status'] == 'Completed') $status_class = 'bg-success';
if ($inquiry['status'] == 'Cancelled') $status_class = 'bg-danger';
?>
<span class="badge <?php echo $status_class; ?> bg-opacity-10 <?php echo str_replace('bg-', 'text-', $status_class); ?> border <?php echo str_replace('bg-', 'border-', $status_class); ?> border-opacity-25 px-2 py-1">
<?php echo __($inquiry['status']); ?>
</span>
</td>
<td class="text-end px-4">
<div class="btn-group shadow-sm border rounded bg-white">
<button class="btn btn-link text-primary py-1 px-2 border-end"
onclick="showEditInquiryModal(<?php echo htmlspecialchars(json_encode($inquiry)); ?>)"
data-bs-toggle="tooltip" title="<?php echo __('edit'); ?>">
<i class="bi bi-pencil-square"></i>
</button>
<button class="btn btn-link text-danger py-1 px-2"
onclick="showDeleteInquiryModal(<?php echo $inquiry['id']; ?>)"
data-bs-toggle="tooltip" title="<?php echo __('delete'); ?>">
<i class="bi bi-trash3"></i>
</button>
</div>
</td>
</tr>
<?php endforeach; ?>
<?php endif; ?>
</tbody>
</table>
</div>
</div>
</div>

View File

@ -68,6 +68,7 @@ $tests = $stmt->fetchAll();
<th class="px-4 py-3">#</th> <th class="px-4 py-3">#</th>
<th class="py-3"><?php echo __('test_name'); ?></th> <th class="py-3"><?php echo __('test_name'); ?></th>
<th class="py-3"><?php echo __('test_group'); ?></th> <th class="py-3"><?php echo __('test_group'); ?></th>
<th class="py-3"><?php echo __('normal_range'); ?></th>
<th class="py-3"><?php echo __('price'); ?></th> <th class="py-3"><?php echo __('price'); ?></th>
<th class="py-3 text-end px-4"><?php echo __('actions'); ?></th> <th class="py-3 text-end px-4"><?php echo __('actions'); ?></th>
</tr> </tr>
@ -75,7 +76,7 @@ $tests = $stmt->fetchAll();
<tbody> <tbody>
<?php if (empty($tests)): ?> <?php if (empty($tests)): ?>
<tr> <tr>
<td colspan="5" class="text-center py-5 text-muted"> <td colspan="6" class="text-center py-5 text-muted">
<i class="bi bi-prescription2 display-4 d-block mb-3"></i> <i class="bi bi-prescription2 display-4 d-block mb-3"></i>
<?php echo __('no_tests_found'); ?> <?php echo __('no_tests_found'); ?>
</td> </td>
@ -100,6 +101,11 @@ $tests = $stmt->fetchAll();
<?php echo htmlspecialchars($test['group_name'] ?? '-'); ?> <?php echo htmlspecialchars($test['group_name'] ?? '-'); ?>
</span> </span>
</td> </td>
<td>
<span class="text-muted small italic">
<?php echo htmlspecialchars($test['normal_range'] ?? '-'); ?>
</span>
</td>
<td class="text-secondary fw-bold"><?php echo number_format($test['price'], 2); ?></td> <td class="text-secondary fw-bold"><?php echo number_format($test['price'], 2); ?></td>
<td class="text-end px-4"> <td class="text-end px-4">
<div class="btn-group shadow-sm border rounded bg-white"> <div class="btn-group shadow-sm border rounded bg-white">
@ -122,4 +128,4 @@ $tests = $stmt->fetchAll();
</table> </table>
</div> </div>
</div> </div>
</div> </div>

View File

@ -157,9 +157,22 @@ try {
name_en VARCHAR(255) NOT NULL, name_en VARCHAR(255) NOT NULL,
name_ar VARCHAR(255) NOT NULL, name_ar VARCHAR(255) NOT NULL,
price DECIMAL(10, 2) NOT NULL DEFAULT 0.00, price DECIMAL(10, 2) NOT NULL DEFAULT 0.00,
normal_range VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (group_id) REFERENCES test_groups(id) ON DELETE SET NULL FOREIGN KEY (group_id) REFERENCES test_groups(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS laboratory_inquiries (
id INT AUTO_INCREMENT PRIMARY KEY,
patient_name VARCHAR(255) NOT NULL,
test_id INT,
inquiry_date DATETIME DEFAULT CURRENT_TIMESTAMP,
source ENUM('Internal', 'External') DEFAULT 'Internal',
status ENUM('Pending', 'Completed', 'Cancelled') DEFAULT 'Pending',
notes TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (test_id) REFERENCES laboratory_tests(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
"; ";
$db->exec($sql); $db->exec($sql);
@ -185,6 +198,10 @@ try {
$db->exec("ALTER TABLE doctors ADD COLUMN IF NOT EXISTS tel VARCHAR(20)"); $db->exec("ALTER TABLE doctors ADD COLUMN IF NOT EXISTS tel VARCHAR(20)");
$db->exec("ALTER TABLE doctors ADD COLUMN IF NOT EXISTS email VARCHAR(100)"); $db->exec("ALTER TABLE doctors ADD COLUMN IF NOT EXISTS email VARCHAR(100)");
} catch (Exception $e) {} } catch (Exception $e) {}
try {
$db->exec("ALTER TABLE laboratory_tests ADD COLUMN IF NOT EXISTS normal_range VARCHAR(255)");
} catch (Exception $e) {}
// Seed departments // Seed departments
$stmt = $db->query("SELECT COUNT(*) FROM departments"); $stmt = $db->query("SELECT COUNT(*) FROM departments");
@ -214,14 +231,15 @@ try {
('MedGulf', 'ميدغلف', '8004414444')"); ('MedGulf', 'ميدغلف', '8004414444')");
} }
// Seed test groups (Clear and re-seed if requested or just append if empty) // Seed test groups (Clear and re-seed with comprehensive list and normal ranges)
$stmt = $db->query("SELECT COUNT(*) FROM test_groups"); // $db->exec("SET FOREIGN_KEY_CHECKS = 0");
if ($stmt->fetchColumn() <= 4) { // If only initial seed exists, clear and re-seed with full list // $db->exec("TRUNCATE TABLE laboratory_tests");
$db->exec("SET FOREIGN_KEY_CHECKS = 0"); // $db->exec("TRUNCATE TABLE test_groups");
$db->exec("TRUNCATE TABLE laboratory_tests"); // $db->exec("SET FOREIGN_KEY_CHECKS = 1");
$db->exec("TRUNCATE TABLE test_groups");
$db->exec("SET FOREIGN_KEY_CHECKS = 1");
// Check if test groups exist before seeding
$stmt = $db->query("SELECT COUNT(*) FROM test_groups");
if ($stmt->fetchColumn() == 0) {
$db->exec("INSERT INTO test_groups (id, name_en, name_ar) VALUES $db->exec("INSERT INTO test_groups (id, name_en, name_ar) VALUES
(1, 'Hematology', 'علم الدم'), (1, 'Hematology', 'علم الدم'),
(2, 'Biochemistry', 'الكيمياء الحيوية'), (2, 'Biochemistry', 'الكيمياء الحيوية'),
@ -234,62 +252,62 @@ try {
(9, 'Urine & Stool', 'البول والبراز'), (9, 'Urine & Stool', 'البول والبراز'),
(10, 'Cardiac Markers', 'واصمات القلب')"); (10, 'Cardiac Markers', 'واصمات القلب')");
$db->exec("INSERT INTO laboratory_tests (group_id, name_en, name_ar, price) VALUES $db->exec("INSERT INTO laboratory_tests (group_id, name_en, name_ar, price, normal_range) VALUES
(1, 'Complete Blood Count (CBC)', 'عد دم كامل', 150.00), (1, 'Complete Blood Count (CBC)', 'عد دم كامل', 150.00, 'WBC: 4.5-11.0, RBC: 4.2-6.1, HGB: 12.0-17.5'),
(1, 'ESR', 'سرعة الترسيب', 40.00), (1, 'ESR', 'سرعة الترسيب', 40.00, 'Men: <15 mm/hr, Women: <20 mm/hr'),
(1, 'Reticulocyte count', 'عد الخلايا الشبكية', 60.00), (1, 'Reticulocyte count', 'عد الخلايا الشبكية', 60.00, '0.5% - 1.5%'),
(1, 'Blood film', 'فيلم الدم', 80.00), (1, 'Blood film', 'فيلم الدم', 80.00, 'Normal morphology'),
(2, 'Fast Blood Sugar (FBS)', 'سكر الدم الصائم', 50.00), (2, 'Fast Blood Sugar (FBS)', 'سكر الدم الصائم', 50.00, '70 - 99 mg/dL'),
(2, 'HbA1c', 'السكر التراكمي', 120.00), (2, 'HbA1c', 'السكر التراكمي', 120.00, '4.0% - 5.6%'),
(2, 'Lipid Profile', 'فحص الدهون', 200.00), (2, 'Lipid Profile', 'فحص الدهون', 200.00, 'Chol: <200, Trig: <150, HDL: >40'),
(2, 'Liver Function Test (LFT)', 'وظائف الكبد', 180.00), (2, 'Liver Function Test (LFT)', 'وظائف الكبد', 180.00, 'ALT: 7-55 U/L, AST: 8-48 U/L'),
(2, 'Kidney Function Test (KFT)', 'وظائف الكلى', 150.00), (2, 'Kidney Function Test (KFT)', 'وظائف الكلى', 150.00, 'Creatinine: 0.6-1.3 mg/dL'),
(2, 'Uric Acid', 'حمض اليوريك', 60.00), (2, 'Uric Acid', 'حمض اليوريك', 60.00, 'Men: 3.4-7.0, Women: 2.4-6.0 mg/dL'),
(3, 'Urine Culture', 'مزرعة البول', 250.00), (3, 'Urine Culture', 'مزرعة البول', 250.00, 'No growth'),
(3, 'Stool Culture', 'مزرعة البراز', 250.00), (3, 'Stool Culture', 'مزرعة البراز', 250.00, 'No growth'),
(3, 'Blood Culture', 'مزرعة الدم', 450.00), (3, 'Blood Culture', 'مزرعة الدم', 450.00, 'No growth'),
(3, 'Throat Swab', 'مسحة الحلق', 200.00), (3, 'Throat Swab', 'مسحة الحلق', 200.00, 'Negative for Strep A'),
(4, 'CRP (C-Reactive Protein)', 'البروتين التفاعلي C', 90.00), (4, 'CRP (C-Reactive Protein)', 'البروتين التفاعلي C', 90.00, '< 10 mg/L'),
(4, 'RF (Rheumatoid Factor)', 'عامل الروماتويد', 100.00), (4, 'RF (Rheumatoid Factor)', 'عامل الروماتويد', 100.00, '< 14 IU/mL'),
(4, 'ASO Titre', 'فحص أجسام مضادة للستربتوليسين', 110.00), (4, 'ASO Titre', 'فحص أجسام مضادة للستربتوليسين', 110.00, '< 200 IU/mL'),
(4, 'HBsAg', 'التهاب الكبد ب', 120.00), (4, 'HBsAg', 'التهاب الكبد ب', 120.00, 'Non-reactive'),
(4, 'HIV I & II', 'فيروس نقص المناعة البشرية', 180.00), (4, 'HIV I & II', 'فيروس نقص المناعة البشرية', 180.00, 'Non-reactive'),
(4, 'HCV Antibodies', 'فيروس التهاب الكبد ج', 150.00), (4, 'HCV Antibodies', 'فيروس التهاب الكبد ج', 150.00, 'Non-reactive'),
(5, 'ANA', 'الأجسام المضادة للنواة', 220.00), (5, 'ANA', 'الأجسام المضادة للنواة', 220.00, 'Negative'),
(5, 'Anti-dsDNA', 'الأجسام المضادة للحمض النووي', 280.00), (5, 'Anti-dsDNA', 'الأجسام المضادة للحمض النووي', 280.00, '< 30 IU/mL'),
(5, 'Total IgE', 'الغلوبولين المناعي الكلي E', 190.00), (5, 'Total IgE', 'الغلوبولين المناعي الكلي E', 190.00, '< 100 kU/L'),
(6, 'TSH', 'الهرمون المنبه للدرقية', 130.00), (6, 'TSH', 'الهرمون المنبه للدرقية', 130.00, '0.4 - 4.0 mIU/L'),
(6, 'Free T3', 'T3 الحر', 130.00), (6, 'Free T3', 'T3 الحر', 130.00, '2.3 - 4.2 pg/mL'),
(6, 'Free T4', 'T4 الحر', 130.00), (6, 'Free T4', 'T4 الحر', 130.00, '0.8 - 1.8 ng/dL'),
(6, 'Prolactin', 'هرمون الحليب', 150.00), (6, 'Prolactin', 'هرمون الحليب', 150.00, 'Men: 2-18, Women: 2-29 ng/mL'),
(6, 'Testosterone', 'هرمون التستوستيرون', 180.00), (6, 'Testosterone', 'هرمون التستوستيرون', 180.00, 'Men: 300-1000, Women: 15-70 ng/dL'),
(6, 'Vitamin D', 'فيتامين د', 350.00), (6, 'Vitamin D', 'فيتامين د', 350.00, '30 - 100 ng/mL'),
(7, 'PT (Prothrombin Time)', 'وقت البروثرومبين', 100.00), (7, 'PT (Prothrombin Time)', 'وقت البروثرومبين', 100.00, '11 - 13.5 seconds'),
(7, 'PTT (Partial Thromboplastin Time)', 'وقت الثرومبوبلاستين الجزئي', 120.00), (7, 'PTT (Partial Thromboplastin Time)', 'وقت الثرومبوبلاستين الجزئي', 120.00, '25 - 35 seconds'),
(7, 'INR', 'النسبة المعيارية الدولية', 100.00), (7, 'INR', 'النسبة المعيارية الدولية', 100.00, '0.8 - 1.1'),
(7, 'D-Dimer', 'دي دايمر', 300.00), (7, 'D-Dimer', 'دي دايمر', 300.00, '< 500 ng/mL'),
(8, 'Sodium (Na)', 'الصوديوم', 70.00), (8, 'Sodium (Na)', 'الصوديوم', 70.00, '135 - 145 mEq/L'),
(8, 'Potassium (K)', 'البوتاسيوم', 70.00), (8, 'Potassium (K)', 'البوتاسيوم', 70.00, '3.6 - 5.2 mEq/L'),
(8, 'Chloride (Cl)', 'الكلوريد', 70.00), (8, 'Chloride (Cl)', 'الكلوريد', 70.00, '96 - 106 mEq/L'),
(8, 'Calcium (Ca)', 'الكالسيوم', 80.00), (8, 'Calcium (Ca)', 'الكالسيوم', 80.00, '8.5 - 10.2 mg/dL'),
(8, 'Magnesium (Mg)', 'المغنيسيوم', 90.00), (8, 'Magnesium (Mg)', 'المغنيسيوم', 90.00, '1.7 - 2.2 mg/dL'),
(9, 'Urine Analysis', 'تحليل البول', 50.00), (9, 'Urine Analysis', 'تحليل البول', 50.00, 'Normal'),
(9, 'Stool Analysis', 'تحليل البراز', 60.00), (9, 'Stool Analysis', 'تحليل البراز', 60.00, 'Normal'),
(9, 'Occult Blood in Stool', 'الدم الخفي في البراز', 80.00), (9, 'Occult Blood in Stool', 'الدم الخفي في البراز', 80.00, 'Negative'),
(10, 'Troponin I', 'تروبونين I', 250.00), (10, 'Troponin I', 'تروبونين I', 250.00, '< 0.04 ng/mL'),
(10, 'CK-MB', 'انزيم القلب CK-MB', 180.00)"); (10, 'CK-MB', 'انزيم القلب CK-MB', 180.00, '< 5.0 ng/mL')");
} }
echo "Database setup completed successfully."; echo "Database setup completed successfully.";
} catch (PDOException $e) { } catch (PDOException $e) {
die("Database setup failed: " . $e->getMessage()); die("Database setup failed: " . $e->getMessage());
} }

16
laboratory_inquiries.php Normal file
View File

@ -0,0 +1,16 @@
<?php
session_start();
if (!isset($_SESSION['lang'])) {
$_SESSION['lang'] = 'en';
}
if (isset($_GET['lang'])) {
$_SESSION['lang'] = $_GET['lang'] == 'ar' ? 'ar' : 'en';
header("Location: " . strtok($_SERVER['REQUEST_URI'], '?'));
exit;
}
$section = 'laboratory_inquiries';
require_once 'includes/actions.php';
require_once 'includes/layout/header.php';
require_once 'includes/pages/laboratory_inquiries.php';
require_once 'includes/layout/footer.php';

View File

@ -1,9 +1,14 @@
<?php <?php
session_start();
$section = 'laboratory_tests'; $section = 'laboratory_tests';
require_once 'includes/layout/header.php'; require_once __DIR__ . '/db/config.php';
require_once 'includes/common_data.php'; require_once __DIR__ . '/helpers.php';
require_once 'includes/actions.php';
require_once 'includes/pages/laboratory_tests.php'; $db = db();
require_once 'includes/layout/footer.php'; $lang = $_SESSION['lang'];
require_once __DIR__ . '/includes/actions.php';
require_once __DIR__ . '/includes/common_data.php';
require_once __DIR__ . '/includes/layout/header.php';
require_once __DIR__ . '/includes/pages/laboratory_tests.php';
require_once __DIR__ . '/includes/layout/footer.php';
?> ?>

View File

@ -151,7 +151,19 @@ $translations = [
'edit_test_group' => 'Edit Test Group', 'edit_test_group' => 'Edit Test Group',
'update_test_group' => 'Update Test Group', 'update_test_group' => 'Update Test Group',
'delete_test_group' => 'Delete Test Group', 'delete_test_group' => 'Delete Test Group',
'no_test_groups_found' => 'No test groups found' 'no_test_groups_found' => 'No test groups found',
'normal_range' => 'Normal Range',
'inquiries' => 'Inquiries',
'outside_hospital' => 'Outside Hospital',
'add_inquiry' => 'Add Inquiry',
'edit_inquiry' => 'Edit Inquiry',
'no_inquiries_found' => 'No inquiries found',
'source' => 'Source',
'internal' => 'Internal',
'external' => 'External',
'test' => 'Test',
'inquiry_date' => 'Inquiry Date',
'notes' => 'Notes'
], ],
'ar' => [ 'ar' => [
'dashboard' => 'لوحة القيادة', 'dashboard' => 'لوحة القيادة',
@ -304,6 +316,18 @@ $translations = [
'edit_test_group' => 'تعديل مجموعة فحوصات', 'edit_test_group' => 'تعديل مجموعة فحوصات',
'update_test_group' => 'تحديث بيانات المجموعة', 'update_test_group' => 'تحديث بيانات المجموعة',
'delete_test_group' => 'حذف مجموعة فحوصات', 'delete_test_group' => 'حذف مجموعة فحوصات',
'no_test_groups_found' => 'لم يتم العثور على مجموعات فحوصات' 'no_test_groups_found' => 'لم يتم العثور على مجموعات فحوصات',
'normal_range' => 'المعدل الطبيعي (رجال-نساء)',
'inquiries' => 'الاستفسارات',
'outside_hospital' => 'خارج المستشفى',
'add_inquiry' => 'إضافة استفسار',
'edit_inquiry' => 'تعديل استفسار',
'no_inquiries_found' => 'لم يتم العثور على استفسارات',
'source' => 'المصدر',
'internal' => 'داخلي',
'external' => 'خارجي',
'test' => 'الفحص',
'inquiry_date' => 'تاريخ الاستفسار',
'notes' => 'ملاحظات'
] ]
]; ];

View File

@ -1,8 +1,14 @@
<?php <?php
// nurses.php
session_start();
$section = 'nurses'; $section = 'nurses';
require_once 'includes/layout/header.php'; require_once __DIR__ . '/db/config.php';
require_once 'includes/actions.php'; require_once __DIR__ . '/helpers.php';
require_once 'includes/pages/nurses.php';
require_once 'includes/layout/footer.php'; $db = db();
$lang = $_SESSION['lang'];
require_once __DIR__ . '/includes/actions.php';
require_once __DIR__ . '/includes/common_data.php';
require_once __DIR__ . '/includes/layout/header.php';
require_once __DIR__ . '/includes/pages/nurses.php';
require_once __DIR__ . '/includes/layout/footer.php';
?>

View File

@ -1,9 +1,14 @@
<?php <?php
session_start();
$section = 'test_groups'; $section = 'test_groups';
require_once 'includes/layout/header.php'; require_once __DIR__ . '/db/config.php';
require_once 'includes/common_data.php'; require_once __DIR__ . '/helpers.php';
require_once 'includes/actions.php';
require_once 'includes/pages/test_groups.php'; $db = db();
require_once 'includes/layout/footer.php'; $lang = $_SESSION['lang'];
require_once __DIR__ . '/includes/actions.php';
require_once __DIR__ . '/includes/common_data.php';
require_once __DIR__ . '/includes/layout/header.php';
require_once __DIR__ . '/includes/pages/test_groups.php';
require_once __DIR__ . '/includes/layout/footer.php';
?> ?>