From b19d1d40c276f4ea74cdb4581bdb05f2dfb3d373 Mon Sep 17 00:00:00 2001 From: DevSoftTech Server Date: Fri, 19 Jun 2026 13:12:34 +0530 Subject: [PATCH] Fix OPD PDF overflow and compact consult placeholders --- app/Controllers/Opd.php | 84 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 77 insertions(+), 7 deletions(-) diff --git a/app/Controllers/Opd.php b/app/Controllers/Opd.php index 14a3e9b..fbf7d0b 100644 --- a/app/Controllers/Opd.php +++ b/app/Controllers/Opd.php @@ -2171,6 +2171,7 @@ class Opd extends BaseController $tokenVars = $this->buildOpdPdfTokenVars($data); $html = $this->applyOpdPdfTemplateTokens($customHtml, $tokenVars); $html = $this->sanitizeOpdNamedHeaderFooterReferences($html); + $html = $this->applyOpdLongContentPaginationGuard($html); if ($debugHtml) { return $this->response @@ -2377,6 +2378,8 @@ class Opd extends BaseController $rawFooterHtml = ''; } + $html = $this->applyOpdLongContentPaginationGuard($html); + if ($rawHeaderHtml !== '') { $renderedHeaderHtml = $this->applyOpdPdfTemplateTokens($rawHeaderHtml, $tokenVars); if (preg_match('/<\s*(htmlpageheader|sethtmlpageheader)\b/i', $renderedHeaderHtml) === 1) { @@ -3796,26 +3799,42 @@ class Opd extends BaseController 'duration' => 'Duration', 'date' => 'Date', ]); + $complaintTerms = []; + foreach ($complaintItems as $item) { + $term = trim((string) ($item['term'] ?? '')); + if ($term !== '') { + $complaintTerms[] = $term; + } + } + $tokens['complaint_list_compact'] = implode(', ', array_values(array_unique($complaintTerms))); $tokens['diagnosis_list'] = $renderClinicalList($diagnosisItems, [ 'duration' => 'Duration', 'date' => 'Date', ]); + $diagnosisTerms = []; + foreach ($diagnosisItems as $item) { + $term = trim((string) ($item['term'] ?? '')); + if ($term !== '') { + $diagnosisTerms[] = $term; + } + } + $tokens['diagnosis_list_compact'] = implode(', ', array_values(array_unique($diagnosisTerms))); $tokens['provisional_diagnosis_list'] = $renderClinicalList($provisionalDiagnosisItems); $vitalCoreRaw = (string) ($tokens['vital_content_raw'] ?? ''); $tokens['vital_content'] = $vitalCoreRaw; $tokens['vital_content_block'] = $formatBlock('Vitals', $vitalCoreRaw, false); - $complaintBlockValue = (string) ($tokens['complaint_list'] ?? ''); + $complaintBlockValue = trim((string) ($tokens['complaint_list_compact'] ?? '')); if ($complaintBlockValue === '') { - $complaintBlockValue = nl2br($escape((string) ($tokens['Complaint_raw'] ?? ''))); + $complaintBlockValue = trim((string) ($tokens['Complaint_raw'] ?? '')); } - $tokens['Complaint'] = $formatBlock('Complaint', $complaintBlockValue, true); + $tokens['Complaint'] = $formatBlock('Complaint', $escape($complaintBlockValue), false); $tokens['complaint'] = $tokens['Complaint']; - $diagnosisBlockValue = (string) ($tokens['diagnosis_list'] ?? ''); + $diagnosisBlockValue = trim((string) ($tokens['diagnosis_list_compact'] ?? '')); if ($diagnosisBlockValue === '') { - $diagnosisBlockValue = nl2br($escape((string) ($tokens['diagnosis_raw'] ?? ''))); + $diagnosisBlockValue = trim((string) ($tokens['diagnosis_raw'] ?? '')); } - $tokens['diagnosis'] = $formatBlock('Diagnosis', $diagnosisBlockValue, true); + $tokens['diagnosis'] = $formatBlock('Diagnosis', $escape($diagnosisBlockValue), false); $tokens['Diagnosis'] = $tokens['diagnosis']; $provisionalBlockValue = (string) ($tokens['provisional_diagnosis_list'] ?? ''); if ($provisionalBlockValue === '') { @@ -3823,7 +3842,19 @@ class Opd extends BaseController } $tokens['Provisional_diagnosis'] = $formatBlock('Provisional Diagnosis', $provisionalBlockValue, true); $tokens['provisional_diagnosis'] = $tokens['Provisional_diagnosis']; - $tokens['Finding_Examinations'] = $formatBlock('Finding / Examination', (string) ($tokens['Finding_Examinations_raw'] ?? '')); + $findingItems = $splitClinicalText((string) ($tokens['Finding_Examinations_raw'] ?? '')); + $findingTerms = []; + foreach ($findingItems as $item) { + $term = trim((string) ($item['term'] ?? '')); + if ($term !== '') { + $findingTerms[] = $term; + } + } + $findingCompact = implode(', ', array_values(array_unique($findingTerms))); + if ($findingCompact === '') { + $findingCompact = trim((string) ($tokens['Finding_Examinations_raw'] ?? '')); + } + $tokens['Finding_Examinations'] = $formatBlock('Finding / Examination', $escape($findingCompact), false); $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'] ?? '')); @@ -4268,6 +4299,45 @@ class Opd extends BaseController return $html; } + private function applyOpdLongContentPaginationGuard(string $html): string + { + if ($html === '') { + return ''; + } + + $usesRxPlace = preg_match('/\.rxplace\b|class\s*=\s*["\'][^"\']*\brxplace\b/i', $html) === 1; + if (! $usesRxPlace) { + return $html; + } + + $plainText = html_entity_decode(strip_tags($html), ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); + $textLength = strlen((string) $plainText); + $lineBreakCount = substr_count(strtolower($html), ' 1800 || $lineBreakCount > 45 || $rowCount > 18; + if (! $looksLong) { + return $html; + } + + $guardCss = ''; + + return $guardCss . "\n" . $html; + } + /** * Read a setting value from the hospital_setting table */