diff --git a/app/Controllers/Opd.php b/app/Controllers/Opd.php
index 379bec9..e5a6e0a 100644
--- a/app/Controllers/Opd.php
+++ b/app/Controllers/Opd.php
@@ -1782,6 +1782,15 @@ class Opd extends BaseController
$when = trim((string) ($med['dosage_when_label'] ?? $med['dosage_when'] ?? ''));
$remark = trim((string) ($med['remark'] ?? ''));
$inst = trim(($when !== '' ? $when : '') . ($remark !== '' ? ($when !== '' ? ' | ' : '') . $remark : ''));
+ $doseFreqText = trim($dose . ' ' . $freq);
+ $doseFreqLocal = $this->translateToLocalPatientText($doseFreqText);
+ if (strtolower(trim($doseFreqLocal)) === strtolower(trim($doseFreqText))) {
+ $doseFreqLocal = '';
+ }
+ $instLocal = $this->translateToLocalPatientText($inst);
+ if (strtolower(trim($instLocal)) === strtolower(trim($inst))) {
+ $instLocal = '';
+ }
$nameHtml = esc($name);
if ($generic !== '') {
$nameHtml .= '
Salt/Generic: ' . esc($generic) . '
';
@@ -1789,38 +1798,18 @@ class Opd extends BaseController
$medicalHtml .= ''
. '| ' . $i . ' | '
. '' . $nameHtml . ' | '
- . '' . esc(trim($dose . ' ' . $freq)) . ' | '
+ . '' . esc($doseFreqText)
+ . ($doseFreqLocal !== '' ? (' ' . esc($doseFreqLocal) . ' ') : '')
+ . ' | '
. '' . esc($days) . ' | '
- . '' . esc($inst) . ' | '
+ . '' . esc($inst)
+ . ($instLocal !== '' ? (' ' . esc($instLocal) . ' ') : '')
+ . ' | '
. '
';
}
$medicalHtml .= '';
}
- $rxInvestigation = trim((string) ($rx['investigation'] ?? ''));
- if ($rxInvestigation === '' && !empty($data['rx_investigations']) && is_array($data['rx_investigations'])) {
- $parts = [];
- foreach ($data['rx_investigations'] as $inv) {
- $txt = trim((string) ($inv['investigation_name'] ?? $inv['investigation'] ?? ''));
- if ($txt !== '') {
- $parts[] = $txt;
- }
- }
- $rxInvestigation = implode(', ', $parts);
- }
-
- $rxAdvice = trim((string) ($rx['advice'] ?? ''));
- if ($rxAdvice === '' && !empty($data['rx_advices']) && is_array($data['rx_advices'])) {
- $parts = [];
- foreach ($data['rx_advices'] as $adv) {
- $txt = trim((string) ($adv['advice_txt'] ?? $adv['advice'] ?? ''));
- if ($txt !== '') {
- $parts[] = $txt;
- }
- }
- $rxAdvice = implode(', ', $parts);
- }
-
$rxRead = static function (array $row, array $keys): string {
foreach ($keys as $key) {
if (array_key_exists($key, $row)) {
@@ -1834,12 +1823,47 @@ class Opd extends BaseController
return '';
};
- $complaintText = $rxRead($rx, ['complaints', 'Complaint']);
- $provisionalDiagnosisText = $rxRead($rx, ['Provisional_diagnosis', 'provisional_diagnosis']);
+ $rxInvestigation = $rxRead($rx, ['investigation', 'Investigations', 'investigations', 'Investigation']);
+ if ($rxInvestigation === '' && !empty($data['rx_investigations']) && is_array($data['rx_investigations'])) {
+ $parts = [];
+ foreach ($data['rx_investigations'] as $inv) {
+ $txt = trim((string) ($inv['investigation_name'] ?? $inv['investigation'] ?? ''));
+ if ($txt !== '') {
+ $parts[] = $txt;
+ }
+ }
+ $rxInvestigation = implode(', ', $parts);
+ }
+
+ $rxAdvice = $rxRead($rx, ['advice', 'Advice', 'prescription_advice', 'advice_notes', 'advice_note']);
+ if ($rxAdvice === '' && !empty($data['rx_advices']) && is_array($data['rx_advices'])) {
+ $parts = [];
+ foreach ($data['rx_advices'] as $adv) {
+ $txt = trim((string) ($adv['advice_txt'] ?? $adv['advice'] ?? ''));
+ if ($txt !== '') {
+ $parts[] = $txt;
+ }
+ }
+ $rxAdvice = implode(', ', $parts);
+ }
+
+ $complaintText = $rxRead($rx, ['complaints', 'Complaint', 'complaint', 'chief_complaint', 'chief_complaints']);
+ if ($complaintText === '') {
+ $complaintText = trim((string) ($opd->complaints ?? ($opd->complaint ?? '')));
+ }
+
+ $provisionalDiagnosisText = $rxRead($rx, ['Provisional_diagnosis', 'provisional_diagnosis', 'provisional_diagnosis_text']);
$diagnosisText = $provisionalDiagnosisText !== ''
? $provisionalDiagnosisText
- : $rxRead($rx, ['diagnosis', 'Diagnosis']);
- $findingExaminationsText = $rxRead($rx, ['Finding_Examinations', 'finding_examinations']);
+ : $rxRead($rx, ['diagnosis', 'Diagnosis', 'final_diagnosis', 'dx']);
+
+ if ($diagnosisText === '') {
+ $diagnosisText = implode(', ', is_array($data['selected_morbidities'] ?? null) ? ($data['selected_morbidities'] ?? []) : []);
+ }
+
+ $findingExaminationsText = $rxRead($rx, ['Finding_Examinations', 'finding_examinations', 'finding', 'findings', 'examination']);
+ $prescriberRemarksText = $rxRead($rx, ['Prescriber_Remarks', 'prescriber_remarks', 'remarks', 'remark', 'doctor_note']);
+ $nextVisitText = $rxRead($rx, ['next_visit', 'next_visit_date', 'follow_up', 'followup', 'review_after']);
$complaintLocal = $this->translateToLocalPatientText($complaintText);
$diagnosisLocal = $this->translateToLocalPatientText($diagnosisText);
$investigationLocal = $this->translateToLocalPatientText($rxInvestigation);
@@ -1946,10 +1970,10 @@ class Opd extends BaseController
'vital_content' => implode(' | ', $vitals),
'Finding_Examinations' => $findingExaminationsText,
'finding_examinations' => $findingExaminationsText,
- 'Prescriber_Remarks' => (string) ($rx['Prescriber_Remarks'] ?? ''),
+ 'Prescriber_Remarks' => $prescriberRemarksText,
'advice' => $rxAdvice,
'advice_local' => $rxAdviceLocal,
- 'next_visit' => (string) ($rx['next_visit'] ?? ''),
+ 'next_visit' => $nextVisitText,
'refer_to' => (string) ($rx['refer_to'] ?? ''),
'painscale' => '',
'painscale_img' => '',
@@ -2365,6 +2389,93 @@ class Opd extends BaseController
}
}
+ // Add case-insensitive token aliases for legacy template compatibility.
+ foreach ($tokens as $key => $value) {
+ $lower = strtolower((string) $key);
+ if (! array_key_exists($lower, $tokens)) {
+ $tokens[$lower] = $value;
+ }
+
+ $ucfirst = ucfirst($lower);
+ if (! array_key_exists($ucfirst, $tokens)) {
+ $tokens[$ucfirst] = $value;
+ }
+ }
+
+ $formatBlock = static function (string $label, string $value, bool $lineBreakAfterLabel = false): string {
+ $value = trim($value);
+ if ($value === '') {
+ return '';
+ }
+
+ $headingHtml = '' . $label . ' :';
+
+ if ($lineBreakAfterLabel) {
+ return '' . $headingHtml . '
' . $value . '
';
+ }
+
+ return '' . $headingHtml . ' ' . $value . '
';
+ };
+
+ $tokens['vital_content_raw'] = (string) ($tokens['vital_content'] ?? '');
+ $tokens['Complaint_raw'] = (string) ($tokens['Complaint'] ?? '');
+ $tokens['diagnosis_raw'] = (string) ($tokens['diagnosis'] ?? '');
+ $tokens['Provisional_diagnosis_raw'] = (string) ($tokens['Provisional_diagnosis'] ?? '');
+ $tokens['Finding_Examinations_raw'] = (string) ($tokens['Finding_Examinations'] ?? '');
+ $tokens['investigation_raw'] = (string) ($tokens['investigation'] ?? '');
+ $tokens['Prescriber_Remarks_raw'] = (string) ($tokens['Prescriber_Remarks'] ?? '');
+ $tokens['advice_raw'] = (string) ($tokens['advice'] ?? '');
+ $tokens['next_visit_raw'] = (string) ($tokens['next_visit'] ?? '');
+
+ $tokens['vital_content'] = $formatBlock('Vitals', (string) ($tokens['vital_content'] ?? ''), true);
+ $tokens['Complaint'] = $formatBlock('Complaint', (string) ($tokens['Complaint_raw'] ?? ''));
+ $tokens['complaint'] = $tokens['Complaint'];
+ $tokens['diagnosis'] = $formatBlock('Diagnosis', (string) ($tokens['diagnosis_raw'] ?? ''));
+ $tokens['Diagnosis'] = $tokens['diagnosis'];
+ $tokens['Provisional_diagnosis'] = $formatBlock('Provisional Diagnosis', (string) ($tokens['Provisional_diagnosis_raw'] ?? ''));
+ $tokens['provisional_diagnosis'] = $tokens['Provisional_diagnosis'];
+ $tokens['Finding_Examinations'] = $formatBlock('Finding / Examination', (string) ($tokens['Finding_Examinations_raw'] ?? ''));
+ $tokens['finding_examinations'] = $tokens['Finding_Examinations'];
+ $tokens['investigation'] = $formatBlock('Investigation Advised', (string) ($tokens['investigation_raw'] ?? ''));
+ $tokens['Prescriber_Remarks'] = $formatBlock('Remarks', (string) ($tokens['Prescriber_Remarks_raw'] ?? ''));
+ $tokens['advice'] = $formatBlock('Advice', (string) ($tokens['advice_raw'] ?? ''));
+ $tokens['next_visit'] = $formatBlock('Next Visit', (string) ($tokens['next_visit_raw'] ?? ''));
+
+ $medicalHtml = trim((string) ($tokens['medical'] ?? ''));
+ $tokens['Rx'] = $medicalHtml !== ''
+ ? ''
+ : '';
+ $tokens['rx'] = $tokens['Rx'];
+
+ $tokens['VitalsBlock'] = (string) ($tokens['vital_content'] ?? '');
+ $tokens['ComplaintBlock'] = (string) ($tokens['Complaint'] ?? '');
+ $tokens['DiagnosisBlock'] = (string) ($tokens['diagnosis'] ?? '');
+ $tokens['ProvisionalDiagnosisBlock'] = (string) ($tokens['Provisional_diagnosis'] ?? '');
+ $tokens['FindingBlock'] = (string) ($tokens['Finding_Examinations'] ?? '');
+ $tokens['InvestigationBlock'] = (string) ($tokens['investigation'] ?? '');
+ $tokens['RemarksBlock'] = (string) ($tokens['Prescriber_Remarks'] ?? '');
+ $tokens['AdviceBlock'] = (string) ($tokens['advice'] ?? '');
+ $tokens['NextVisitBlock'] = (string) ($tokens['next_visit'] ?? '');
+
+ $tokens['RxTable'] = $medicalHtml;
+ $tokens['rx_table'] = $medicalHtml;
+
+ $fullBlocks = array_values(array_filter([
+ (string) ($tokens['VitalsBlock'] ?? ''),
+ (string) ($tokens['ComplaintBlock'] ?? ''),
+ (string) ($tokens['DiagnosisBlock'] ?? ''),
+ (string) ($tokens['ProvisionalDiagnosisBlock'] ?? ''),
+ (string) ($tokens['FindingBlock'] ?? ''),
+ (string) ($tokens['Rx'] ?? ''),
+ (string) ($tokens['InvestigationBlock'] ?? ''),
+ (string) ($tokens['RemarksBlock'] ?? ''),
+ (string) ($tokens['AdviceBlock'] ?? ''),
+ (string) ($tokens['NextVisitBlock'] ?? ''),
+ ], static fn ($value): bool => trim((string) $value) !== ''));
+
+ $tokens['RxFullBlock'] = implode("\n", $fullBlocks);
+ $tokens['rx_full_block'] = $tokens['RxFullBlock'];
+
// Load hospital settings from database
$hName = $this->readSettingValueFromDb('H_Name');
$hAddress1 = $this->readSettingValueFromDb('H_address_1');