updating patient form

This commit is contained in:
Flatlogic Bot 2026-03-05 18:47:27 +00:00
parent 48924b82af
commit 6439167fd2
9 changed files with 259 additions and 416 deletions

View File

@ -0,0 +1,5 @@
-- Add civil_id, nationality, city to patients
ALTER TABLE patients
ADD COLUMN civil_id VARCHAR(50) DEFAULT NULL,
ADD COLUMN nationality VARCHAR(100) DEFAULT NULL,
ADD COLUMN city VARCHAR(100) DEFAULT NULL;

View File

@ -83,10 +83,13 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$insurance_company_id = $_POST['insurance_company_id'] ?: null; $insurance_company_id = $_POST['insurance_company_id'] ?: null;
$policy_number = $_POST['policy_number'] ?? ''; $policy_number = $_POST['policy_number'] ?? '';
$address = $_POST['address'] ?? ''; $address = $_POST['address'] ?? '';
$civil_id = $_POST['civil_id'] ?? '';
$nationality = $_POST['nationality'] ?? '';
$city = $_POST['city'] ?? '';
if ($name) { if ($name) {
$stmt = $db->prepare("INSERT INTO patients (name, phone, dob, gender, blood_group, insurance_company_id, policy_number, address) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); $stmt = $db->prepare("INSERT INTO patients (name, phone, dob, gender, blood_group, insurance_company_id, policy_number, address, civil_id, nationality, city) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
$stmt->execute([$name, $phone, $dob, $gender, $blood_group, $insurance_company_id, $policy_number, $address]); $stmt->execute([$name, $phone, $dob, $gender, $blood_group, $insurance_company_id, $policy_number, $address, $civil_id, $nationality, $city]);
$_SESSION['flash_message'] = __('add_patient') . ' ' . __('successfully'); $_SESSION['flash_message'] = __('add_patient') . ' ' . __('successfully');
$redirect = true; $redirect = true;
} }
@ -100,10 +103,13 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$insurance_company_id = $_POST['insurance_company_id'] ?: null; $insurance_company_id = $_POST['insurance_company_id'] ?: null;
$policy_number = $_POST['policy_number'] ?? ''; $policy_number = $_POST['policy_number'] ?? '';
$address = $_POST['address'] ?? ''; $address = $_POST['address'] ?? '';
$civil_id = $_POST['civil_id'] ?? '';
$nationality = $_POST['nationality'] ?? '';
$city = $_POST['city'] ?? '';
if ($id && $name) { if ($id && $name) {
$stmt = $db->prepare("UPDATE patients SET name = ?, phone = ?, dob = ?, gender = ?, blood_group = ?, insurance_company_id = ?, policy_number = ?, address = ? WHERE id = ?"); $stmt = $db->prepare("UPDATE patients SET name = ?, phone = ?, dob = ?, gender = ?, blood_group = ?, insurance_company_id = ?, policy_number = ?, address = ?, civil_id = ?, nationality = ?, city = ? WHERE id = ?");
$stmt->execute([$name, $phone, $dob, $gender, $blood_group, $insurance_company_id, $policy_number, $address, $id]); $stmt->execute([$name, $phone, $dob, $gender, $blood_group, $insurance_company_id, $policy_number, $address, $civil_id, $nationality, $city, $id]);
$_SESSION['flash_message'] = __('edit_patient') . ' ' . __('successfully'); $_SESSION['flash_message'] = __('edit_patient') . ' ' . __('successfully');
$redirect = true; $redirect = true;
} }
@ -758,6 +764,9 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$phone = $_POST['phone'] ?? ''; $phone = $_POST['phone'] ?? '';
$email = $_POST['email'] ?? ''; $email = $_POST['email'] ?? '';
$address = $_POST['address'] ?? ''; $address = $_POST['address'] ?? '';
$civil_id = $_POST['civil_id'] ?? '';
$nationality = $_POST['nationality'] ?? '';
$city = $_POST['city'] ?? '';
if ($name_en && $name_ar) { if ($name_en && $name_ar) {
$stmt = $db->prepare("INSERT INTO suppliers (name_en, name_ar, contact_person, phone, email, address) VALUES (?, ?, ?, ?, ?, ?)"); $stmt = $db->prepare("INSERT INTO suppliers (name_en, name_ar, contact_person, phone, email, address) VALUES (?, ?, ?, ?, ?, ?)");
@ -773,6 +782,9 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$phone = $_POST['phone'] ?? ''; $phone = $_POST['phone'] ?? '';
$email = $_POST['email'] ?? ''; $email = $_POST['email'] ?? '';
$address = $_POST['address'] ?? ''; $address = $_POST['address'] ?? '';
$civil_id = $_POST['civil_id'] ?? '';
$nationality = $_POST['nationality'] ?? '';
$city = $_POST['city'] ?? '';
if ($id && $name_en && $name_ar) { if ($id && $name_en && $name_ar) {
$stmt = $db->prepare("UPDATE suppliers SET name_en = ?, name_ar = ?, contact_person = ?, phone = ?, email = ?, address = ? WHERE id = ?"); $stmt = $db->prepare("UPDATE suppliers SET name_en = ?, name_ar = ?, contact_person = ?, phone = ?, email = ?, address = ? WHERE id = ?");

View File

@ -19,4 +19,4 @@ $scheduled_appointments = $db->query("
FROM appointments a FROM appointments a
JOIN patients p ON a.patient_id = p.id JOIN patients p ON a.patient_id = p.id
WHERE a.status = 'Scheduled' WHERE a.status = 'Scheduled'
ORDER BY a.start_time ASC")->fetchAll(); ORDER BY a.start_time ASC")->fetchAll();$all_countries = require __DIR__ . "/countries.php";

28
includes/countries.php Normal file
View File

@ -0,0 +1,28 @@
<?php
// includes/countries.php
return [
"Afghanistan", "Albania", "Algeria", "Andorra", "Angola", "Antigua and Barbuda", "Argentina", "Armenia", "Australia", "Austria", "Azerbaijan",
"Bahamas", "Bahrain", "Bangladesh", "Barbados", "Belarus", "Belgium", "Belize", "Benin", "Bhutan", "Bolivia", "Bosnia and Herzegovina", "Botswana", "Brazil", "Brunei", "Bulgaria", "Burkina Faso", "Burundi",
"Cabo Verde", "Cambodia", "Cameroon", "Canada", "Central African Republic", "Chad", "Chile", "China", "Colombia", "Comoros", "Congo (Congo-Brazzaville)", "Costa Rica", "Croatia", "Cuba", "Cyprus", "Czechia (Czech Republic)",
"Democratic Republic of the Congo", "Denmark", "Djibouti", "Dominica", "Dominican Republic",
"Ecuador", "Egypt", "El Salvador", "Equatorial Guinea", "Eritrea", "Estonia", "Eswatini (fmr. 'Swaziland')", "Ethiopia",
"Fiji", "Finland", "France",
"Gabon", "Gambia", "Georgia", "Germany", "Ghana", "Greece", "Grenada", "Guatemala", "Guinea", "Guinea-Bissau", "Guyana",
"Haiti", "Holy See", "Honduras", "Hungary",
"Iceland", "India", "Indonesia", "Iran", "Iraq", "Ireland", "Israel", "Italy", "Ivory Coast",
"Jamaica", "Japan", "Jordan",
"Kazakhstan", "Kenya", "Kiribati", "Kuwait", "Kyrgyzstan",
"Laos", "Latvia", "Lebanon", "Lesotho", "Liberia", "Libya", "Liechtenstein", "Lithuania", "Luxembourg",
"Madagascar", "Malawi", "Malaysia", "Maldives", "Mali", "Malta", "Marshall Islands", "Mauritania", "Mauritius", "Mexico", "Micronesia", "Moldova", "Monaco", "Mongolia", "Montenegro", "Morocco", "Mozambique", "Myanmar (formerly Burma)",
"Namibia", "Nauru", "Nepal", "Netherlands", "New Zealand", "Nicaragua", "Niger", "Nigeria", "North Korea", "North Macedonia", "Norway",
"Oman",
"Pakistan", "Palau", "Palestine State", "Panama", "Papua New Guinea", "Paraguay", "Peru", "Philippines", "Poland", "Portugal",
"Qatar",
"Romania", "Russia", "Rwanda",
"Saint Kitts and Nevis", "Saint Lucia", "Saint Vincent and the Grenadines", "Samoa", "San Marino", "Sao Tome and Principe", "Saudi Arabia", "Senegal", "Serbia", "Seychelles", "Sierra Leone", "Singapore", "Slovakia", "Slovenia", "Solomon Islands", "Somalia", "South Africa", "South Korea", "South Sudan", "Spain", "Sri Lanka", "Sudan", "Suriname", "Sweden", "Switzerland", "Syria",
"Tajikistan", "Tanzania", "Thailand", "Timor-Leste", "Togo", "Tonga", "Trinidad and Tobago", "Tunisia", "Turkey", "Turkmenistan", "Tuvalu",
"Uganda", "Ukraine", "United Arab Emirates", "United Kingdom", "United States of America", "Uruguay", "Uzbekistan",
"Vanuatu", "Venezuela", "Vietnam",
"Yemen",
"Zambia", "Zimbabwe"
];

View File

@ -18,6 +18,24 @@
<div class="mb-3"> <div class="mb-3">
<label class="form-label"><?php echo __('name'); ?></label> <label class="form-label"><?php echo __('name'); ?></label>
<input type="text" name="name" class="form-control" required> <input type="text" name="name" class="form-control" required>
</div>\1\n <div class="row">
<div class="col-md-6 mb-3">
<label class="form-label"><?php echo __('civil_id'); ?></label>
<input type="text" name="civil_id" class="form-control">
</div>
<div class="col-md-6 mb-3">
<label class="form-label"><?php echo __('nationality'); ?></label>
<select name="nationality" class="form-select select2-modal">
<option value=""><?php echo __('search'); ?>...</option>
<?php foreach ($all_countries as $c): ?>
<option value="<?php echo htmlspecialchars($c); ?>"><?php echo htmlspecialchars($c); ?></option>
<?php endforeach; ?>
</select>
</div>
</div>
<div class="mb-3">
<label class="form-label"><?php echo __('city'); ?></label>
<input type="text" name="city" class="form-control">
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-6 mb-3"> <div class="col-md-6 mb-3">
@ -90,6 +108,25 @@
<label class="form-label"><?php echo __('name'); ?></label> <label class="form-label"><?php echo __('name'); ?></label>
<input type="text" name="name" id="edit_patient_name" class="form-control" required> <input type="text" name="name" id="edit_patient_name" class="form-control" required>
</div> </div>
<div class="row">
<div class="col-md-6 mb-3">
<label class="form-label"><?php echo __('civil_id'); ?></label>
<input type="text" name="civil_id" id="edit_patient_civil_id" class="form-control">
</div>
<div class="col-md-6 mb-3">
<label class="form-label"><?php echo __('nationality'); ?></label>
<select name="nationality" id="edit_patient_nationality" class="form-select select2-modal">
<option value=""><?php echo __('search'); ?>...</option>
<?php foreach ($all_countries as $c): ?>
<option value="<?php echo htmlspecialchars($c); ?>"><?php echo htmlspecialchars($c); ?></option>
<?php endforeach; ?>
</select>
</div>
</div>
<div class="mb-3">
<label class="form-label"><?php echo __('city'); ?></label>
<input type="text" name="city" id="edit_patient_city" class="form-control">
</div>
<div class="row"> <div class="row">
<div class="col-md-6 mb-3"> <div class="col-md-6 mb-3">
<label class="form-label"><?php echo __('phone'); ?></label> <label class="form-label"><?php echo __('phone'); ?></label>
@ -2159,6 +2196,10 @@
var fields = { var fields = {
'edit_patient_id': patient.id, 'edit_patient_id': patient.id,
'edit_patient_name': patient.name, 'edit_patient_name': patient.name,
'edit_patient_civil_id': patient.civil_id || '',
'edit_patient_nationality': patient.nationality || '',
'edit_patient_city': patient.city || '',
'edit_patient_phone': patient.phone, 'edit_patient_phone': patient.phone,
'edit_patient_dob': patient.dob, 'edit_patient_dob': patient.dob,
'edit_patient_gender': patient.gender, 'edit_patient_gender': patient.gender,
@ -2169,7 +2210,12 @@
}; };
for (var id in fields) { for (var id in fields) {
var field = document.getElementById(id); var field = document.getElementById(id);
if (field) field.value = fields[id]; if (field) {
field.value = fields[id];
if (id === 'edit_patient_nationality') {
$(field).val(fields[id]).trigger('change');
}
}
} }
bootstrap.Modal.getOrCreateInstance(el).show(); bootstrap.Modal.getOrCreateInstance(el).show();
} }

View File

@ -250,6 +250,9 @@ $translations = [
'save_visit_to_add_inquiries' => 'Please save the visit first to add inquiries.', 'save_visit_to_add_inquiries' => 'Please save the visit first to add inquiries.',
'or' => 'or', 'or' => 'or',
'no_patients_found' => 'No patients found', 'no_patients_found' => 'No patients found',
'civil_id' => 'Civil ID',
'nationality' => 'Nationality',
'city' => 'City',
], ],
'ar' => [ 'ar' => [
'attachment' => 'المرفق', 'attachment' => 'المرفق',
@ -503,5 +506,8 @@ $translations = [
'save_visit_to_add_inquiries' => 'يرجى حفظ الزيارة أولاً لإضافة الاستفسارات.', 'save_visit_to_add_inquiries' => 'يرجى حفظ الزيارة أولاً لإضافة الاستفسارات.',
'or' => 'أو', 'or' => 'أو',
'no_patients_found' => 'لم يتم العثور على مرضى', 'no_patients_found' => 'لم يتم العثور على مرضى',
'civil_id' => 'الرقم المدني',
'nationality' => 'الجنسية',
'city' => 'المدينة',
] ]
]; ];

View File

@ -63,12 +63,18 @@ try {
.prescription-header { border-bottom: 2px solid #000; padding-bottom: 20px; margin-bottom: 30px; } .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; } .prescription-footer { border-top: 2px solid #000; padding-top: 20px; margin-top: 50px; }
.rx-symbol { font-size: 40px; font-weight: bold; font-family: cursive; margin-bottom: 10px; } .rx-symbol { font-size: 40px; font-weight: bold; font-family: cursive; margin-bottom: 10px; }
.drug-item { margin-bottom: 15px; border-bottom: 1px dashed #ccc; padding-bottom: 10px; }
.drug-name { font-weight: bold; font-size: 18px; } /* Grid Table Styles */
.drug-dose { font-style: italic; } .drug-grid { width: 100%; border-collapse: collapse; table-layout: fixed; }
.drug-grid td { border: 1px solid #000; padding: 8px; vertical-align: top; }
.drug-name { font-weight: bold; font-size: 15px; margin-bottom: 4px; display: block; }
.drug-meta { font-size: 13px; line-height: 1.4; }
.drug-meta strong { color: #555; }
@media print { @media print {
.no-print { display: none; } .no-print { display: none; }
body { padding: 20px; } body { padding: 20px; }
.drug-grid td { page-break-inside: avoid; }
} }
</style> </style>
</head> </head>
@ -116,26 +122,32 @@ try {
<?php if (empty($prescriptions)): ?> <?php if (empty($prescriptions)): ?>
<p class="text-muted text-center py-5">No medications prescribed.</p> <p class="text-muted text-center py-5">No medications prescribed.</p>
<?php else: ?> <?php else: ?>
<div class="list-group list-group-flush"> <table class="drug-grid">
<?php foreach ($prescriptions as $index => $p): ?> <?php
<div class="drug-item"> $chunks = array_chunk($prescriptions, 3); // 3 columns
<div class="row"> foreach ($chunks as $row):
<div class="col-1 text-muted fw-bold"><?php echo $index + 1; ?>.</div> ?>
<div class="col-11"> <tr>
<?php foreach ($row as $p): ?>
<td>
<div class="drug-name"><?php echo htmlspecialchars($p['drug_name']); ?></div> <div class="drug-name"><?php echo htmlspecialchars($p['drug_name']); ?></div>
<div class="row mt-1"> <div class="drug-meta">
<div class="col-md-6"> <div><strong>Dose:</strong> <?php echo htmlspecialchars($p['dosage']); ?></div>
<span class="text-muted">Dose:</span> <span class="drug-dose"><?php echo htmlspecialchars($p['dosage']); ?></span> <div><strong>Instr:</strong> <?php echo htmlspecialchars($p['instructions']); ?></div>
</div>
<div class="col-md-6">
<span class="text-muted">Instructions:</span> <span><?php echo htmlspecialchars($p['instructions']); ?></span>
</div>
</div>
</div>
</div>
</div> </div>
</td>
<?php endforeach; ?> <?php endforeach; ?>
</div>
<?php
// Fill empty cells if the last row has fewer than 3 items
$missing = 3 - count($row);
for ($i = 0; $i < $missing; $i++):
?>
<td>&nbsp;</td>
<?php endfor; ?>
</tr>
<?php endforeach; ?>
</table>
<?php endif; ?> <?php endif; ?>
</div> </div>

View File

@ -2,109 +2,37 @@ import re
file_path = 'includes/actions.php' file_path = 'includes/actions.php'
try:
with open(file_path, 'r') as f: with open(file_path, 'r') as f:
content = f.read() content = f.read()
except FileNotFoundError:
print(f"Error: {file_path} not found.")
exit(1)
# New function implementation # 1. Update variable assignments
new_function = r""" function parse_import_file($file_input) { # This is safe to replace globally as it adds variables where address is defined.
if (!isset($file_input['error']) || $file_input['error'] !== UPLOAD_ERR_OK) { content = content.replace(
$_SESSION['import_error'] = 'Upload error code: ' . ($file_input['error'] ?? 'unknown'); "$address = $_POST['address'] ?? '';",
return false; "$address = $_POST['address'] ?? '';\n $civil_id = $_POST['civil_id'] ?? '';\n $nationality = $_POST['nationality'] ?? '';\n $city = $_POST['city'] ?? '';"
} )
$ext = strtolower(pathinfo($file_input['name'], PATHINFO_EXTENSION));
$rows = [];
if ($ext === 'csv') { # 2. Update INSERT query (Add Patient)
$handle = fopen($file_input['tmp_name'], 'r'); old_insert = '"INSERT INTO patients (name, phone, dob, gender, blood_group, insurance_company_id, policy_number, address) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"'
if ($handle === false) { new_insert = '"INSERT INTO patients (name, phone, dob, gender, blood_group, insurance_company_id, policy_number, address, civil_id, nationality, city) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"'
$_SESSION['import_error'] = 'Failed to open CSV file.'; content = content.replace(old_insert, new_insert)
return false;
}
# Skip header
fgetcsv($handle);
while (($row = fgetcsv($handle)) !== false) {
if (array_filter($row)) {
$rows[] = $row;
}
}
fclose($handle);
if (empty($rows)) {
$_SESSION['import_error'] = 'CSV file is empty or could not be parsed.';
}
} elseif ($ext === 'xlsx' || $ext === 'xls') {
require_once __DIR__ . '/SimpleXLSX.php';
if ($xlsx = \Shuchkin\SimpleXLSX::parse($file_input['tmp_name'])) {
$rows = $xlsx->rows();
array_shift($rows); # Skip header
if (empty($rows)) {
$_SESSION['import_error'] = 'Excel file is empty.';
}
} else {
$_SESSION['import_error'] = 'SimpleXLSX Error: ' . \Shuchkin\SimpleXLSX::parseError();
return false;
}
} else {
$_SESSION['import_error'] = "Unsupported file extension: $ext. Please upload .csv or .xlsx";
return false;
}
return $rows;
}"""
# Escape specific regex characters in the new function if we used it in regex, but here we use it as replacement string. # Update INSERT execution array
# We need to escape backslashes in the replacement string if we use re.sub, because \1, \g<1> etc have meaning. old_exec_insert = '[$name, $phone, $dob, $gender, $blood_group, $insurance_company_id, $policy_number, $address]'
# However, our replacement string doesn't have those. But PHP has backslashes (namespaces). new_exec_insert = '[$name, $phone, $dob, $gender, $blood_group, $insurance_company_id, $policy_number, $address, $civil_id, $nationality, $city]'
# So we need to escape backslashes for python string, and then for re.sub. content = content.replace(old_exec_insert, new_exec_insert)
# Actually, let's use string.replace() if possible, but we don't know the exact content of the old function to replace it exactly if it varies. # 3. Update UPDATE query (Edit Patient)
# But we know the structure. old_update = '"UPDATE patients SET name = ?, phone = ?, dob = ?, gender = ?, blood_group = ?, insurance_company_id = ?, policy_number = ?, address = ? WHERE id = ?"'
# Let's try to identify the start and end of the function. new_update = '"UPDATE patients SET name = ?, phone = ?, dob = ?, gender = ?, blood_group = ?, insurance_company_id = ?, policy_number = ?, address = ?, civil_id = ?, nationality = ?, city = ? WHERE id = ?"'
content = content.replace(old_update, new_update)
start_marker = "function parse_import_file($file_input) {" # Update UPDATE execution array
end_marker = "return $rows;\n }" old_exec_update = '[$name, $phone, $dob, $gender, $blood_group, $insurance_company_id, $policy_number, $address, $id]'
new_exec_update = '[$name, $phone, $dob, $gender, $blood_group, $insurance_company_id, $policy_number, $address, $civil_id, $nationality, $city, $id]'
start_pos = content.find(start_marker) content = content.replace(old_exec_update, new_exec_update)
if start_pos != -1:
end_pos = content.find(end_marker, start_pos)
if end_pos != -1:
end_pos += len(end_marker)
# Replace the function
content = content[:start_pos] + new_function.strip() + "\n" + content[end_pos:]
print("Replaced function parse_import_file.")
else:
print("Could not find end of function parse_import_file.")
# Fallback to regex if simple find fails (e.g. whitespace diff)
pattern = r"function parse_import_file\(\$file_input\) \{[\s\S]+?return \$rows;\s+\}"
if re.search(pattern, content):
content = re.sub(pattern, new_function, content, count=1)
print("Replaced function parse_import_file using regex.")
else:
print("Could not find function parse_import_file using regex.")
else:
print("Could not find start of function parse_import_file.")
# Fallback to regex
pattern = r"function parse_import_file\(\$file_input\) \{[\s\S]+?return \$rows;\s+\}"
if re.search(pattern, content):
content = re.sub(pattern, new_function, content, count=1)
print("Replaced function parse_import_file using regex (fallback).")
else:
print("Could not find function parse_import_file using regex (fallback).")
# Update the calling logic
old_msg = "$_SESSION['flash_message'] = 'Failed to parse file or empty.';"
new_msg = "$_SESSION['flash_message'] = $_SESSION['import_error'] ?? 'Failed to parse file or empty.'; unset($_SESSION['import_error']);"
if old_msg in content:
content = content.replace(old_msg, new_msg)
print("Updated error message logic.")
else:
print("Could not find old error message logic.")
with open(file_path, 'w') as f: with open(file_path, 'w') as f:
f.write(content) f.write(content)
print("Finished updating includes/actions.php") print("Updated actions.php")

View File

@ -1,308 +1,114 @@
import re import re
file_path = 'includes/layout/footer.php' file_path = 'includes/layout/footer.php'
with open(file_path, 'r', encoding='utf-8') as f: with open(file_path, 'r') as f:
content = f.read() content = f.read()
# Define the new content for Record Visit Modal # 1. Update Add Patient Modal
record_visit_modal = """<!-- Record Visit Modal --> # Look for the name input in addPatientModal
<div class="modal fade" id="recordVisitModal" tabindex="-1" aria-hidden="true"> pattern_add = r'(<div class="modal fade" id="addPatientModal".*?name="name".*?</div>)'
<div class="modal-dialog modal-lg"> replacement_add = r'\1\n' + \
<form action="<?php echo $_SERVER['PHP_SELF']; ?>?section=<?php echo $section; ?>" method="POST" enctype="multipart/form-data"> r''' <div class="row">
<input type="hidden" name="action" value="record_visit"> <div class="col-md-6 mb-3">
<div class="modal-content border-0 shadow"> <label class="form-label"><?php echo __('civil_id'); ?></label>
<div class="modal-header"> <input type="text" name="civil_id" class="form-control">
<h5 class="modal-title fw-bold text-white"><?php echo __('add_visit'); ?></h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div> </div>
<div class="modal-body"> <div class="col-md-6 mb-3">
<ul class="nav nav-tabs mb-3" id="recordVisitTabs" role="tablist"> <label class="form-label"><?php echo __('nationality'); ?></label>
<li class="nav-item" role="presentation"> <select name="nationality" class="form-select select2-modal">
<button class="nav-link active" id="rv-patient-tab" data-bs-toggle="tab" data-bs-target="#rv-patient" type="button" role="tab" aria-controls="rv-patient" aria-selected="true"><?php echo __('patient'); ?></button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="rv-vital-tab" data-bs-toggle="tab" data-bs-target="#rv-vital" type="button" role="tab" aria-controls="rv-vital" aria-selected="false"><?php echo __('vitals'); ?></button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="rv-symptoms-tab" data-bs-toggle="tab" data-bs-target="#rv-symptoms" type="button" role="tab" aria-controls="rv-symptoms" aria-selected="false"><?php echo __('symptoms'); ?> &amp; <?php echo __('diagnosis'); ?></button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="rv-inquiries-tab" data-bs-toggle="tab" data-bs-target="#rv-inquiries" type="button" role="tab" aria-controls="rv-inquiries" aria-selected="false"><?php echo __('inquiries'); ?></button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="rv-treatment-tab" data-bs-toggle="tab" data-bs-target="#rv-treatment" type="button" role="tab" aria-controls="rv-treatment" aria-selected="false"><?php echo __('treatment_plan'); ?> &amp; <?php echo __('prescriptions'); ?></button>
</li>
</ul>
<div class="tab-content" id="recordVisitTabContent">
<!-- Patient Details -->
<div class="tab-pane fade show active" id="rv-patient" role="tabpanel" aria-labelledby="rv-patient-tab">
<div class="row">
<div class="col-md-12 mb-3">
<label class="form-label"><?php echo __('appointment'); ?> (<?php echo __('optional'); ?>)</label>
<select name="appointment_id" class="form-select select2-modal" id="visit_appointment_select" onchange="updateVisitFields()">
<option value=""><?php echo __('search'); ?>...</option> <option value=""><?php echo __('search'); ?>...</option>
<?php foreach ($scheduled_appointments as $sa): <?php foreach ($all_countries as $c): ?>
?><option value="<?php echo $sa['id']; ?>" data-patient="<?php echo $sa['patient_id']; ?>" data-doctor="<?php echo $sa['doctor_id']; ?>"> <option value="<?php echo htmlspecialchars($c); ?>"><?php echo htmlspecialchars($c); ?></option>
<?php echo htmlspecialchars($sa['patient_name']); ?> - <?php echo $sa['start_time']; ?>
</option>
<?php endforeach; ?> <?php endforeach; ?>
</select> </select>
</div> </div>
</div> </div>
<div class="row">
<div class="col-md-6 mb-3">
<label class="form-label"><?php echo __('patient'); ?></label>
<select name="patient_id" id="visit_patient_id" class="form-select select2-modal" required>
<option value=""><?php echo __('search'); ?>...</option>
<?php foreach ($all_patients as $p):
?><option value="<?php echo $p['id']; ?>"><?php echo htmlspecialchars($p['name']); ?></option>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-6 mb-3">
<label class="form-label"><?php echo __('doctor'); ?></label>
<select name="doctor_id" id="visit_doctor_id" class="form-select select2-modal" required>
<option value=""><?php echo __('search'); ?>...</option>
<?php foreach ($all_doctors as $d):
?><option value="<?php echo $d['id']; ?>"><?php echo htmlspecialchars($d['name']); ?></option>
<?php endforeach; ?>
</select>
</div>
</div>
</div>
<!-- Vitals -->
<div class="tab-pane fade" id="rv-vital" role="tabpanel" aria-labelledby="rv-vital-tab">
<h6 class="fw-bold mb-3"><?php echo __('vitals'); ?></h6>
<div class="row">
<div class="col-md-6 mb-3">
<label class="form-label"><?php echo __('weight'); ?></label>
<input type="text" name="weight" class="form-control">
</div>
<div class="col-md-6 mb-3">
<label class="form-label"><?php echo __('blood_pressure'); ?></label>
<input type="text" name="blood_pressure" class="form-control" placeholder="120/80">
</div>
<div class="col-md-6 mb-3">
<label class="form-label"><?php echo __('heart_rate'); ?></label>
<input type="text" name="heart_rate" class="form-control">
</div>
<div class="col-md-6 mb-3">
<label class="form-label"><?php echo __('temperature'); ?></label>
<input type="text" name="temperature" class="form-control">
</div>
</div>
</div>
<!-- Symptoms & Diagnosis -->
<div class="tab-pane fade" id="rv-symptoms" role="tabpanel" aria-labelledby="rv-symptoms-tab">
<div class="mb-3"> <div class="mb-3">
<div class="d-flex justify-content-between align-items-center mb-2"> <label class="form-label"><?php echo __('city'); ?></label>
<label class="form-label mb-0"><?php echo __('symptoms'); ?></label> <input type="text" name="city" class="form-control">
<button type="button" class="btn btn-sm btn-outline-info" onclick="generateAISuggestion(this)" data-target="symptoms"> </div>'''
<i class="bi bi-stars"></i> AI Suggestion
</button>
</div>
<textarea name="symptoms" class="form-control rich-editor" rows="2"></textarea>
</div>
<div class="mb-3">
<div class="d-flex justify-content-between align-items-center mb-2">
<label class="form-label mb-0"><?php echo __('diagnosis'); ?></label>
<button type="button" class="btn btn-sm btn-outline-info" onclick="generateAISuggestion(this)" data-target="diagnosis">
<i class="bi bi-stars"></i> AI Suggestion
</button>
</div>
<textarea name="diagnosis" class="form-control rich-editor" rows="2"></textarea>
</div>
</div>
<!-- Inquiries -->
<div class="tab-pane fade" id="rv-inquiries" role="tabpanel" aria-labelledby="rv-inquiries-tab">
<div class="alert alert-info py-3">
<i class="bi bi-info-circle me-2"></i>
<?php echo __('save_visit_to_add_inquiries'); ?>
</div>
</div>
<!-- Treatment & Prescription -->
<div class="tab-pane fade" id="rv-treatment" role="tabpanel" aria-labelledby="rv-treatment-tab">
<div class="mb-3">
<div class="d-flex justify-content-between align-items-center mb-2">
<label class="form-label mb-0"><?php echo __("treatment_plan"); ?></label>
<button type="button" class="btn btn-sm btn-outline-info" onclick="generateAISuggestion(this)" data-target="treatment_plan">
<i class="bi bi-stars"></i> AI Suggestion
</button>
</div>
<textarea name="treatment_plan" class="form-control rich-editor" rows="2"></textarea>
</div>
<hr>
<div class="mb-3">
<div class="d-flex justify-content-between align-items-center mb-2">
<label class="form-label mb-0 fw-bold"><?php echo __('prescriptions'); ?></label>
<button type="button" class="btn btn-sm btn-outline-primary" onclick="addPrescriptionRow('visit_prescriptions_container')">
<i class="bi bi-plus-circle"></i> <?php echo __('add_drug'); ?>
</button>
</div>
<div id="visit_prescriptions_container"></div>
</div>
</div>
</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-info text-white px-4"><?php echo __('save'); ?></button>
</div>
</div>
</form>
</div>
</div>
"
# Define the new content for Edit Visit Modal # We need to be careful not to match too much.
edit_visit_modal = """<!-- Edit Visit Modal --> # Let's find the specific div for name inside addPatientModal
<div class="modal fade" id="editVisitModal" tabindex="-1" aria-hidden="true"> # It's better to find the index.
<div class="modal-dialog modal-lg">
<form action="<?php echo $_SERVER['PHP_SELF']; ?>?section=<?php echo $section; ?>" method="POST" enctype="multipart/form-data"> add_modal_start = content.find('id="addPatientModal"')
<input type="hidden" name="action" value="edit_visit"> if add_modal_start != -1:
<input type="hidden" name="id" id="edit_visit_id"> # Find the name input div AFTER this start
<div class="modal-content border-0 shadow"> name_div_end = content.find('</div>', content.find('name="name"', add_modal_start)) + 6
<div class="modal-header">
<h5 class="modal-title fw-bold text-white"><?php echo __('edit_visit'); ?></h5> # Check if we already added it (idempotency)
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> if 'name="civil_id"' not in content[name_div_end:name_div_end+500]:
</div> content = content[:name_div_end] + replacement_add + content[name_div_end:]
<div class="modal-body">
<ul class="nav nav-tabs mb-3" id="editVisitTabs" role="tablist"> # 2. Update Edit Patient Modal
<li class="nav-item" role="presentation"> edit_modal_start = content.find('id="editPatientModal"')
<button class="nav-link active" id="ev-patient-tab" data-bs-toggle="tab" data-bs-target="#ev-patient" type="button" role="tab" aria-controls="ev-patient" aria-selected="true"><?php echo __('patient'); ?></button> if edit_modal_start != -1:
</li> # Find the name input div AFTER this start
<li class="nav-item" role="presentation"> name_div_end = content.find('</div>', content.find('name="name"', edit_modal_start)) + 6
<button class="nav-link" id="ev-vital-tab" data-bs-toggle="tab" data-bs-target="#ev-vital" type="button" role="tab" aria-controls="ev-vital" aria-selected="false"><?php echo __('vitals'); ?></button>
</li> replacement_edit = r'''
<li class="nav-item" role="presentation">
<button class="nav-link" id="ev-symptoms-tab" data-bs-toggle="tab" data-bs-target="#ev-symptoms" type="button" role="tab" aria-controls="ev-symptoms" aria-selected="false"><?php echo __('symptoms'); ?> &amp; <?php echo __('diagnosis'); ?></button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="ev-inquiries-tab" data-bs-toggle="tab" data-bs-target="#ev-inquiries" type="button" role="tab" aria-controls="ev-inquiries" aria-selected="false"><?php echo __('inquiries'); ?></button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="ev-treatment-tab" data-bs-toggle="tab" data-bs-target="#ev-treatment" type="button" role="tab" aria-controls="ev-treatment" aria-selected="false"><?php echo __('treatment_plan'); ?> &amp; <?php echo __('prescriptions'); ?></button>
</li>
</ul>
<div class="tab-content" id="editVisitTabContent">
<!-- Patient Details -->
<div class="tab-pane fade show active" id="ev-patient" role="tabpanel" aria-labelledby="ev-patient-tab">
<div class="row"> <div class="row">
<div class="col-md-6 mb-3"> <div class="col-md-6 mb-3">
<label class="form-label"><?php echo __('patient'); ?></label> <label class="form-label"><?php echo __('civil_id'); ?></label>
<select name="patient_id" id="edit_visit_patient_id" class="form-select select2-modal" required> <input type="text" name="civil_id" id="edit_patient_civil_id" class="form-control">
<option value=""><?php echo __('search'); ?>...</option>
<?php foreach ($all_patients as $p):
?><option value="<?php echo $p['id']; ?>"><?php echo htmlspecialchars($p['name']); ?></option>
<?php endforeach; ?>
</select>
</div> </div>
<div class="col-md-6 mb-3"> <div class="col-md-6 mb-3">
<label class="form-label"><?php echo __('doctor'); ?></label> <label class="form-label"><?php echo __('nationality'); ?></label>
<select name="doctor_id" id="edit_visit_doctor_id" class="form-select select2-modal" required> <select name="nationality" id="edit_patient_nationality" class="form-select select2-modal">
<option value=""><?php echo __('search'); ?>...</option> <option value=""><?php echo __('search'); ?>...</option>
<?php foreach ($all_doctors as $d): <?php foreach ($all_countries as $c): ?>
?><option value="<?php echo $d['id']; ?>"><?php echo htmlspecialchars($d['name']); ?></option> <option value="<?php echo htmlspecialchars($c); ?>"><?php echo htmlspecialchars($c); ?></option>
<?php endforeach; ?> <?php endforeach; ?>
</select> </select>
</div> </div>
</div> </div>
</div>
<!-- Vitals -->
<div class="tab-pane fade" id="ev-vital" role="tabpanel" aria-labelledby="ev-vital-tab">
<h6 class="fw-bold mb-3"><?php echo __('vitals'); ?></h6>
<div class="row">
<div class="col-md-6 mb-3">
<label class="form-label"><?php echo __('weight'); ?></label>
<input type="text" name="weight" id="edit_visit_weight" class="form-control">
</div>
<div class="col-md-6 mb-3">
<label class="form-label"><?php echo __('blood_pressure'); ?></label>
<input type="text" name="blood_pressure" id="edit_visit_blood_pressure" class="form-control" placeholder="120/80">
</div>
<div class="col-md-6 mb-3">
<label class="form-label"><?php echo __('heart_rate'); ?></label>
<input type="text" name="heart_rate" id="edit_visit_heart_rate" class="form-control">
</div>
<div class="col-md-6 mb-3">
<label class="form-label"><?php echo __('temperature'); ?></label>
<input type="text" name="temperature" id="edit_visit_temperature" class="form-control">
</div>
</div>
</div>
<!-- Symptoms & Diagnosis -->
<div class="tab-pane fade" id="ev-symptoms" role="tabpanel" aria-labelledby="ev-symptoms-tab">
<div class="mb-3"> <div class="mb-3">
<div class="d-flex justify-content-between align-items-center mb-2"> <label class="form-label"><?php echo __('city'); ?></label>
<label class="form-label mb-0"><?php echo __('symptoms'); ?></label> <input type="text" name="city" id="edit_patient_city" class="form-control">
<button type="button" class="btn btn-sm btn-outline-info" onclick="generateAISuggestion(this)" data-target="symptoms"> </div>'''
<i class="bi bi-stars"></i> AI Suggestion
</button>
</div>
<textarea name="symptoms" id="edit_visit_symptoms" class="form-control rich-editor" rows="2"></textarea>
</div>
<div class="mb-3">
<div class="d-flex justify-content-between align-items-center mb-2">
<label class="form-label mb-0"><?php echo __('diagnosis'); ?></label>
<button type="button" class="btn btn-sm btn-outline-info" onclick="generateAISuggestion(this)" data-target="diagnosis">
<i class="bi bi-stars"></i> AI Suggestion
</button>
</div>
<textarea name="diagnosis" id="edit_visit_diagnosis" class="form-control rich-editor" rows="2"></textarea>
</div>
</div>
<!-- Inquiries -->
<div class="tab-pane fade" id="ev-inquiries" role="tabpanel" aria-labelledby="ev-inquiries-tab">
<div class="alert alert-info py-3">
<i class="bi bi-info-circle me-2"></i>
<?php echo __('save_visit_to_add_inquiries'); ?>
</div>
</div>
<!-- Treatment & Prescription -->
<div class="tab-pane fade" id="ev-treatment" role="tabpanel" aria-labelledby="ev-treatment-tab">
<div class="mb-3">
<div class="d-flex justify-content-between align-items-center mb-2">
<label class="form-label mb-0"><?php echo __("treatment_plan"); ?></label>
<button type="button" class="btn btn-sm btn-outline-info" onclick="generateAISuggestion(this)" data-target="treatment_plan">
<i class="bi bi-stars"></i> AI Suggestion
</button>
</div>
<textarea name="treatment_plan" id="edit_visit_treatment_plan" class="form-control rich-editor" rows="2"></textarea>
</div>
<hr>
<div class="mb-3">
<div class="d-flex justify-content-between align-items-center mb-2">
<label class="form-label mb-0 fw-bold"><?php echo __('prescriptions'); ?></label>
<button type="button" class="btn btn-sm btn-outline-primary" onclick="addPrescriptionRow('edit_visit_prescriptions_container')">
<i class="bi bi-plus-circle"></i> <?php echo __('add_drug'); ?>
</button>
</div>
<div id="edit_visit_prescriptions_container"></div>
</div>
</div>
</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>
"
# Replace the blocks if 'name="civil_id"' not in content[name_div_end:name_div_end+500]:
start_marker = "<!-- Record Visit Modal -->" content = content[:name_div_end] + replacement_edit + content[name_div_end:]
end_marker = "<!-- Create Bill Modal -->"
start_idx = content.find(start_marker) # 3. Update JS showEditPatientModal
end_idx = content.find(end_marker) js_func = 'function showEditPatientModal(patient) {'
js_start = content.find(js_func)
if js_start != -1:
# Find the fields object
fields_start = content.find("var fields = {", js_start)
if fields_start != -1:
# Insert new fields
insert_pos = content.find("'edit_patient_name': patient.name,", fields_start) + len("'edit_patient_name': patient.name,")
if start_idx != -1 and end_idx != -1: new_js_fields = r'''
new_content = content[:start_idx] + record_visit_modal + "\n\n" + edit_visit_modal + "\n\n" + content[end_idx:] 'edit_patient_civil_id': patient.civil_id || '',
with open(file_path, 'w', encoding='utf-8') as f: 'edit_patient_nationality': patient.nationality || '',
f.write(new_content) 'edit_patient_city': patient.city || '',
else: '''''
print("Could not find markers")
if "'edit_patient_civil_id'" not in content[fields_start:fields_start+500]:
content = content[:insert_pos] + new_js_fields + content[insert_pos:]
# Find the loop to add trigger
loop_start = content.find("for (var id in fields) {", js_start)
if loop_start != -1:
# We want to add the trigger inside the loop
# Find 'if (field) field.value = fields[id];'
val_set = content.find("if (field) field.value = fields[id];", loop_start)
if val_set != -1:
replace_js = '''if (field) {
field.value = fields[id];
if (id === 'edit_patient_nationality') {
$(field).val(fields[id]).trigger('change');
}
}'''
content = content.replace("if (field) field.value = fields[id];", replace_js, 1)
with open(file_path, 'w') as f:
f.write(content)
print("Updated footer.php")