diff --git a/app/Controllers/Ipd_discharge.php b/app/Controllers/Ipd_discharge.php
index 9c5743c..b9a5efb 100644
--- a/app/Controllers/Ipd_discharge.php
+++ b/app/Controllers/Ipd_discharge.php
@@ -5756,7 +5756,7 @@ class Ipd_discharge extends BaseController
$date = $this->parseInputDateToDb((string) ($this->request->getPost('new_procedure_date') ?? ''));
$remark = trim((string) ($this->request->getPost('new_procedure_remark') ?? ''));
$masterId = max(0, (int) ($this->request->getPost('new_procedure_master_id') ?? 0));
- if ($name !== '' && $this->tableHasColumns('ipd_discharge_procedure', ['ipd_id', 'procedure_name'])) {
+ if ($name !== '' && $date !== null && $this->tableHasColumns('ipd_discharge_procedure', ['ipd_id', 'procedure_name'])) {
$insert = [
'ipd_id' => $ipdId,
'procedure_name' => $name,
@@ -5776,9 +5776,13 @@ class Ipd_discharge extends BaseController
$notice = $savedAny ? 'Procedure row added.' : 'Unable to add procedure row.';
$noticeType = $savedAny ? 'success' : 'warning';
} else {
- $notice = $name === ''
- ? 'Enter procedure name before adding.'
- : 'Procedure table/columns are missing in database.';
+ if ($name === '') {
+ $notice = 'Enter procedure name before adding.';
+ } elseif ($date === null) {
+ $notice = 'Select a valid procedure date before adding.';
+ } else {
+ $notice = 'Procedure table/columns are missing in database.';
+ }
$noticeType = 'warning';
}
} elseif ($action === 'remove_procedure') {
diff --git a/app/Views/billing/ipd/discharge_create.php b/app/Views/billing/ipd/discharge_create.php
index 60d8eb2..e80747f 100644
--- a/app/Views/billing/ipd/discharge_create.php
+++ b/app/Views/billing/ipd/discharge_create.php
@@ -1312,17 +1312,17 @@ $historyFields = [
-
-
@@ -2321,7 +2321,8 @@ $historyFields = [
// Surgery quick-add button
var btnQuickSurgery = document.getElementById('btn_quick_add_surgery');
- if (btnQuickSurgery) {
+ if (btnQuickSurgery && btnQuickSurgery.dataset.quickAddBound !== '1') {
+ btnQuickSurgery.dataset.quickAddBound = '1';
btnQuickSurgery.addEventListener('click', function() {
var surgeryInput = document.getElementById('new_surgery_name');
var surgeryName = surgeryInput ? surgeryInput.value.trim() : '';
@@ -2345,7 +2346,8 @@ $historyFields = [
// Procedure quick-add button
var btnQuickProcedure = document.getElementById('btn_quick_add_procedure');
- if (btnQuickProcedure) {
+ if (btnQuickProcedure && btnQuickProcedure.dataset.quickAddBound !== '1') {
+ btnQuickProcedure.dataset.quickAddBound = '1';
btnQuickProcedure.addEventListener('click', function() {
var procedureInput = document.getElementById('new_procedure_name');
var procedureName = procedureInput ? procedureInput.value.trim() : '';
@@ -2368,7 +2370,8 @@ $historyFields = [
}
// Save button in modal
- if (btnSave) {
+ if (btnSave && btnSave.dataset.quickAddBound !== '1') {
+ btnSave.dataset.quickAddBound = '1';
btnSave.addEventListener('click', function() {
var name = quickName.value.trim();
var type = quickType.value;
@@ -2476,6 +2479,8 @@ $historyFields = [
var dropdown = document.getElementById(dropdownId);
var hidden = document.getElementById(hiddenId);
if (!input || !dropdown || !hidden) return;
+ if (input.dataset.termAutocompleteBound === '1') return;
+ input.dataset.termAutocompleteBound = '1';
var searchTimer = null;
var highlightedIndex = -1;
@@ -3289,14 +3294,12 @@ $historyFields = [
return;
}
- if (window.__ipdSurgeryCrudBound === true) {
- return;
- }
- window.__ipdSurgeryCrudBound = true;
-
var $type = $('#surgery_master_type');
var $search = $('#surgery_master_search');
var $rows = $('#surgery_master_rows');
+ if (!form || !$type.length || !$search.length || !$rows.length) {
+ return;
+ }
function setMasterStatus(text, level) {
setSectionStatus('surgery_master_status', text, level || 'muted');
@@ -3348,27 +3351,32 @@ $historyFields = [
});
}
- $(document).on('click', '#btn_discharge_manage_surgery_master', function() {
+ $(document)
+ .off('click.ipdSurgeryCrud', '#btn_discharge_manage_surgery_master')
+ .on('click.ipdSurgeryCrud', '#btn_discharge_manage_surgery_master', function() {
clearMasterForm();
+ $search.val('');
setMasterStatus('', 'muted');
fetchMasterRows();
showModalById('ipdSurgeryMasterModal');
});
- $('#btn_surgery_master_refresh').on('click', fetchMasterRows);
- $type.on('change', function() {
+ $('#btn_surgery_master_refresh').off('.ipdSurgeryCrud').on('click.ipdSurgeryCrud', fetchMasterRows);
+ $type.off('.ipdSurgeryCrud').on('change.ipdSurgeryCrud', function() {
clearMasterForm();
fetchMasterRows();
});
- $search.on('input', function() {
+ $search.off('.ipdSurgeryCrud').on('input.ipdSurgeryCrud', function() {
fetchMasterRows();
});
- $('#btn_surgery_master_clear').on('click', function() {
+ $('#btn_surgery_master_clear').off('.ipdSurgeryCrud').on('click.ipdSurgeryCrud', function() {
clearMasterForm();
});
- $(document).on('click', '.btn-master-edit', function() {
+ $(document)
+ .off('click.ipdSurgeryCrud', '.btn-master-edit')
+ .on('click.ipdSurgeryCrud', '.btn-master-edit', function() {
var id = parseInt($(this).data('id') || '0', 10);
var type = ($type.val() || 'surgery').toString();
var row = (surgeryMasterState[type] || []).find(function(item) {
@@ -3385,7 +3393,9 @@ $historyFields = [
$('#surgery_master_active').val(parseInt(row.is_active || '0', 10) === 1 ? '1' : '0');
});
- $(document).on('click', '.btn-master-delete', function() {
+ $(document)
+ .off('click.ipdSurgeryCrud', '.btn-master-delete')
+ .on('click.ipdSurgeryCrud', '.btn-master-delete', function() {
var id = parseInt($(this).data('id') || '0', 10);
if (id <= 0) {
return;
@@ -3415,7 +3425,7 @@ $historyFields = [
});
});
- $('#btn_surgery_master_save').on('click', function() {
+ $('#btn_surgery_master_save').off('.ipdSurgeryCrud').on('click.ipdSurgeryCrud', function() {
var name = ($('#surgery_master_name').val() || '').toString().trim();
if (name === '') {
setMasterStatus('Name is required.', 'error');
@@ -3450,8 +3460,7 @@ $historyFields = [
}
function initSurgeryTools(form) {
- // Surgery/Procedure autocomplete now handled by initSurgeryProcedureAutocomplete()
- // Old bindSurgeryTermLookup removed - using custom dropdown instead of datalist
+ initSurgeryProcedureAutocomplete();
initSurgeryMasterCrud(form);
}
@@ -4147,7 +4156,63 @@ $historyFields = [
var dischargeMedSuggestRows = [];
var dischargeMedInputTimer = null;
+ function applyDischargeMedicineMatch(matched) {
+ if (!matched || !dischargeMedInput) {
+ return;
+ }
+
+ $(dischargeMedInput).data('med-id', parseInt(matched.id || 0, 10));
+ if (section.querySelector('#discharge_med_id')) {
+ section.querySelector('#discharge_med_id').value = String(matched.id || '0');
+ }
+ if (section.querySelector('#discharge_med_salt')) {
+ section.querySelector('#discharge_med_salt').value = String(matched.med_salt || '').trim();
+ }
+ if (dischargeMedType && dischargeMedType.value.trim() === '') {
+ dischargeMedType.value = String(matched.med_type || '').trim();
+ }
+
+ var fieldMap = [
+ ['dosage', '#discharge_dosage'],
+ ['dosage_when', '#discharge_dosage_when'],
+ ['dosage_freq', '#discharge_dosage_freq'],
+ ['dosage_where', '#discharge_dose_where']
+ ];
+ fieldMap.forEach(function(mapping) {
+ var value = matched[mapping[0]];
+ var target = section.querySelector(mapping[1]);
+ if (value && target && target.value === '') {
+ ensureDoseOption(target, value);
+ target.value = value;
+ }
+ });
+
+ var textFieldMap = [
+ ['no_of_days', '#discharge_no_of_days'],
+ ['qty', '#discharge_qty'],
+ ['remark', '#discharge_remark']
+ ];
+ textFieldMap.forEach(function(mapping) {
+ var value = matched[mapping[0]];
+ var target = section.querySelector(mapping[1]);
+ if (value && target && target.value === '') {
+ target.value = String(value).trim();
+ }
+ });
+ }
+
if (dischargeMedInput) {
+ dischargeMedInput.addEventListener('keydown', function(event) {
+ if (event.key !== 'Enter') {
+ return;
+ }
+
+ dischargeMedInput.dataset.suppressImplicitSubmit = '1';
+ setTimeout(function() {
+ delete dischargeMedInput.dataset.suppressImplicitSubmit;
+ }, 0);
+ });
+
dischargeMedInput.addEventListener('input', function() {
var q = String(dischargeMedInput.value || '').trim();
@@ -4197,18 +4262,7 @@ $historyFields = [
}
});
if (matched) {
- // Store med_id
- $(dischargeMedInput).data('med-id', parseInt(matched.id || 0, 10));
- if (section.querySelector('#discharge_med_id')) {
- section.querySelector('#discharge_med_id').value = String(matched.id || '0');
- }
- if (section.querySelector('#discharge_med_salt')) {
- section.querySelector('#discharge_med_salt').value = String(matched.med_salt || '').trim();
- }
- // Auto-fill type if empty
- if (dischargeMedType && dischargeMedType.value.trim() === '') {
- dischargeMedType.value = String(matched.med_type || '').trim();
- }
+ applyDischargeMedicineMatch(matched);
}
}, 'json').fail(function() {
dischargeMedSuggestRows = [];
@@ -4244,54 +4298,7 @@ $historyFields = [
});
if (matched) {
- // Store med_id for reference
- $(dischargeMedInput).data('med-id', parseInt(matched.id || 0, 10));
- if (section.querySelector('#discharge_med_id')) {
- section.querySelector('#discharge_med_id').value = String(matched.id || '0');
- }
- if (section.querySelector('#discharge_med_salt')) {
- section.querySelector('#discharge_med_salt').value = String(matched.med_salt || '').trim();
- }
-
- // Auto-fill Type
- if (dischargeMedType && dischargeMedType.value.trim() === '') {
- dischargeMedType.value = String(matched.med_type || '').trim();
- }
-
- // Auto-fill dose fields if they have values
- var dosageSelect = section.querySelector('#discharge_dosage');
- var whenSelect = section.querySelector('#discharge_dosage_when');
- var freqSelect = section.querySelector('#discharge_dosage_freq');
- var whereSelect = section.querySelector('#discharge_dose_where');
- var daysInput = section.querySelector('#discharge_no_of_days');
- var qtyInput = section.querySelector('#discharge_qty');
- var remarkInput = section.querySelector('#discharge_remark');
-
- if (matched.dosage && dosageSelect && dosageSelect.value === '') {
- ensureDoseOption(dosageSelect, matched.dosage);
- dosageSelect.value = matched.dosage;
- }
- if (matched.dosage_when && whenSelect && whenSelect.value === '') {
- ensureDoseOption(whenSelect, matched.dosage_when);
- whenSelect.value = matched.dosage_when;
- }
- if (matched.dosage_freq && freqSelect && freqSelect.value === '') {
- ensureDoseOption(freqSelect, matched.dosage_freq);
- freqSelect.value = matched.dosage_freq;
- }
- if (matched.dosage_where && whereSelect && whereSelect.value === '') {
- ensureDoseOption(whereSelect, matched.dosage_where);
- whereSelect.value = matched.dosage_where;
- }
- if (matched.no_of_days && daysInput && daysInput.value === '') {
- daysInput.value = String(matched.no_of_days || '').trim();
- }
- if (matched.qty && qtyInput && qtyInput.value === '') {
- qtyInput.value = String(matched.qty || '').trim();
- }
- if (matched.remark && remarkInput && remarkInput.value === '') {
- remarkInput.value = String(matched.remark || '').trim();
- }
+ applyDischargeMedicineMatch(matched);
} else {
// No match found - clear med_id
$(dischargeMedInput).data('med-id', 0);
@@ -4314,13 +4321,13 @@ $historyFields = [
var $empty = $('#discharge_substitute_empty');
var $rows = $('#discharge_substitute_rows');
- if (medId <= 0 && medName === '') {
+ if (medId <= 0) {
$box.hide();
return;
}
$note.text('loading...');
- $empty.show();
+ $empty.hide();
$rows.empty();
$box.show();
@@ -5244,6 +5251,11 @@ $historyFields = [
form.addEventListener('submit', function(e) {
e.preventDefault();
+ var medicineNameInput = form.querySelector('#discharge_med_name');
+ if (medicineNameInput && medicineNameInput.dataset.suppressImplicitSubmit === '1') {
+ delete medicineNameInput.dataset.suppressImplicitSubmit;
+ return;
+ }
syncEditorValues();
// DISABLED: No longer needed since medicines are saved via AJAX on Add button
// serializeDischargeMedicineTable();
@@ -5306,6 +5318,17 @@ $historyFields = [
targetSectionId = 'section-medicine';
}
+ if (actionValue === 'add_procedure') {
+ var procedureDateInput = form.querySelector('[name="new_procedure_date"]');
+ if (!procedureDateInput || String(procedureDateInput.value || '').trim() === '') {
+ setSectionStatus('discharge_surgery_status', 'Select procedure date before adding.', 'error');
+ if (procedureDateInput) {
+ procedureDateInput.focus();
+ }
+ return;
+ }
+ }
+
window.jQuery.ajax({
url: form.getAttribute('action') || window.location.href,
type: 'POST',