From bca95f14e66f4bf6c461f7d9f2c213edf470e668 Mon Sep 17 00:00:00 2001 From: DevSoftTech Server Date: Tue, 7 Apr 2026 11:34:57 +0530 Subject: [PATCH] fix: {{medical}} prints Generic Name instead of Substitute in OPD consult print Root cause: the fallback lookup from opd_med_master used $labelField = $masterSaltField ?? $masterGenericField which preferred salt_name (the Substitute / other brand names field) over genericname (the actual Generic Name / composition). If a prescription row's inline genericname was empty, the Substitute string was written into it and then printed as \"Salt/Generic\" in the {{medical}} block. Fixes applied in three places: 1. Opd.php buildOpdLetterPrintData - master lookup now prefers genericname 2. Opd.php buildOpdLetterPrintData second loop - removed inline salt_name fallback that overwrote genericname with Substitute value 3. Opd.php buildLegacyDashboardTemplateVars - removed salt_name from the generic resolution chain used when rendering the medicine table HTML 4. Opd_prescription.php medicine list function - same preferGenericname fix and removed inline salt_name -> genericname overwrite" --- app/Controllers/Opd.php | 9 ++++++--- app/Controllers/Opd_prescription.php | 12 +++++------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/app/Controllers/Opd.php b/app/Controllers/Opd.php index 3857d1e..3b7cb36 100644 --- a/app/Controllers/Opd.php +++ b/app/Controllers/Opd.php @@ -2253,7 +2253,8 @@ class Opd extends BaseController if ($formulationPrefix !== '' && $name !== '' && preg_match('/^' . preg_quote($formulationPrefix, '/') . '\b/i', $name) !== 1) { $name = trim($formulationPrefix . ' ' . $name); } - $generic = trim((string) ($med['genericname'] ?? $med['generic_name'] ?? $med['salt_name'] ?? '')); + // salt_name is Substitute (other brand names), not Generic Name — do not use it as generic fallback + $generic = trim((string) ($med['genericname'] ?? $med['generic_name'] ?? '')); $dose = trim((string) ($med['dosage_label'] ?? $med['dosage'] ?? $med['drug_dose'] ?? $med['dose'] ?? '')); $freq = trim((string) ($med['dosage_freq_label'] ?? $med['dosage_freq'] ?? $med['drug_freq'] ?? $med['frequency'] ?? '')); $doseLocalRaw = trim((string) ($med['dosage_local_label'] ?? $med['dosage_local'] ?? '')); @@ -3728,7 +3729,8 @@ class Opd extends BaseController $masterGenericField = $this->resolveFirstField($masterFields, ['genericname', 'generic_name']); $masterSaltField = $this->resolveFirstField($masterFields, ['salt_name', 'sal_name', 'salt', 'saltname']); $masterFormulationField = $this->resolveFirstField($masterFields, ['formulation', 'dosage_form', 'form']); - $labelField = $masterSaltField ?? $masterGenericField; + // Prefer genericname (Generic Name) over salt_name (Substitute) for "Salt/Generic" print label + $labelField = $masterGenericField ?? $masterSaltField; $select = []; if ($masterIdField !== null) { $select[] = $masterIdField . ' as med_id'; @@ -3763,7 +3765,8 @@ class Opd extends BaseController } foreach ($data['rx_medicines'] as &$medRow) { - $genericInline = trim((string) ($medRow['genericname'] ?? ($medRow['salt_name'] ?? ''))); + // Only check genericname — do NOT fall back to salt_name (that is the Substitute field) + $genericInline = trim((string) ($medRow['genericname'] ?? '')); if ($genericInline === '') { $fallback = $medGenericMap[(int) ($medRow['med_id'] ?? 0)] ?? ''; if ($fallback !== '') { diff --git a/app/Controllers/Opd_prescription.php b/app/Controllers/Opd_prescription.php index a65156a..c47a229 100644 --- a/app/Controllers/Opd_prescription.php +++ b/app/Controllers/Opd_prescription.php @@ -1652,7 +1652,8 @@ class Opd_prescription extends BaseController $masterIdField = $this->resolveFirstField($masterFields, ['id']); $masterGenericField = $this->resolveFirstField($masterFields, ['genericname', 'generic_name']); $masterSaltField = $this->resolveFirstField($masterFields, ['salt_name', 'sal_name', 'salt', 'saltname']); - $labelField = $masterSaltField ?? $masterGenericField; + // Prefer genericname (Generic Name) over salt_name (Substitute) + $labelField = $masterGenericField ?? $masterSaltField; if ($masterIdField !== null && $labelField !== null) { $medRows = $this->db->table($masterTable) @@ -1679,13 +1680,10 @@ class Opd_prescription extends BaseController foreach ($rows as &$row) { if (trim((string) ($row['genericname'] ?? '')) === '') { - $inlineSalt = trim((string) ($row['salt_name'] ?? '')); - if ($inlineSalt !== '') { - $row['genericname'] = $inlineSalt; - } - + // Do NOT fall back to salt_name — that field stores Substitute (other brand names), + // not the generic/salt composition. Use master lookup only. $fallback = $medGenericMap[(int) ($row['med_id'] ?? 0)] ?? ''; - if (($row['genericname'] ?? '') === '' && $fallback !== '') { + if ($fallback !== '') { $row['genericname'] = $fallback; } }