feat(discharge): support section placeholders
This commit is contained in:
parent
472b8367d9
commit
0b05d7284c
|
|
@ -333,6 +333,11 @@ class Ipd_discharge extends BaseController
|
||||||
'hospital_email' => esc($hEmail),
|
'hospital_email' => esc($hEmail),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
$sectionVars = $this->buildDischargeSectionTokenVars($content);
|
||||||
|
foreach ($sectionVars as $key => $value) {
|
||||||
|
$tokens[$key] = $value;
|
||||||
|
}
|
||||||
|
|
||||||
foreach ($tokens as $key => $value) {
|
foreach ($tokens as $key => $value) {
|
||||||
$key = (string) $key;
|
$key = (string) $key;
|
||||||
$value = (string) $value;
|
$value = (string) $value;
|
||||||
|
|
@ -356,6 +361,135 @@ class Ipd_discharge extends BaseController
|
||||||
return $tokens;
|
return $tokens;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function buildDischargeSectionTokenVars(string $content): array
|
||||||
|
{
|
||||||
|
$full = trim($content);
|
||||||
|
if ($full === '') {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$allMarkers = [
|
||||||
|
'Discharge Summary',
|
||||||
|
'Presenting Complaints and Reason for Admission',
|
||||||
|
'General Examination on Admission',
|
||||||
|
'Clinical Investigation Reports',
|
||||||
|
'Final Diagnosis',
|
||||||
|
'Course in the hospital',
|
||||||
|
'Examination on Discharge',
|
||||||
|
'Surgery',
|
||||||
|
'Procedure',
|
||||||
|
'Personal History',
|
||||||
|
'Discharge Medications',
|
||||||
|
'Discharge Advice/Instructions/Summary',
|
||||||
|
'Dietary Advice',
|
||||||
|
'Signature of Consultant',
|
||||||
|
'Drug Allergy / ADR',
|
||||||
|
'Co-Morbidities',
|
||||||
|
'Summary of key investigations during Hospitalization',
|
||||||
|
'Nursing Trend',
|
||||||
|
];
|
||||||
|
|
||||||
|
$section = function (array $starts, array $extraEnds = []) use ($full, $allMarkers): string {
|
||||||
|
return $this->extractDischargeSectionByMarkers($full, $starts, array_merge($allMarkers, $extraEnds));
|
||||||
|
};
|
||||||
|
|
||||||
|
$summary = $section(['Discharge Summary']);
|
||||||
|
$finalDiagnosis = $section(['Final Diagnosis']);
|
||||||
|
$surgery = $section(['Surgery']);
|
||||||
|
$procedure = $section(['Procedure']);
|
||||||
|
$personalHistory = $section(['Personal History']);
|
||||||
|
$presentingComplaints = $section(['Presenting Complaints and Reason for Admission']);
|
||||||
|
$generalExam = $section(['General Examination on Admission']);
|
||||||
|
$clinicalInvestigations = $section(['Clinical Investigation Reports']);
|
||||||
|
$courseInHospital = $section(['Course in the hospital']);
|
||||||
|
$examOnDischarge = $section(['Examination on Discharge']);
|
||||||
|
$dischargeMedications = $section(['Discharge Medications']);
|
||||||
|
$dietaryAdvice = $section(['Dietary Advice']);
|
||||||
|
$dischargeInstructions = $section(['Discharge Advice/Instructions/Summary']);
|
||||||
|
$signatureBlock = $section(['Signature of Consultant'], ['Signature of Medical Officer', 'Signature of Receiver / Date']);
|
||||||
|
|
||||||
|
$vars = [
|
||||||
|
'DISCHARGE_SUMMARY' => $summary,
|
||||||
|
'FINAL_DIAGNOSIS' => $finalDiagnosis,
|
||||||
|
'SURGERY' => $surgery,
|
||||||
|
'PROCEDURE' => $procedure,
|
||||||
|
'PERSONAL_HISTORY' => $personalHistory,
|
||||||
|
'PRESENTING_COMPLAINTS' => $presentingComplaints,
|
||||||
|
'GENERAL_EXAM_ADMISSION' => $generalExam,
|
||||||
|
'CLINICAL_INVESTIGATION_REPORTS' => $clinicalInvestigations,
|
||||||
|
'COURSE_IN_HOSPITAL' => $courseInHospital,
|
||||||
|
'EXAMINATION_ON_DISCHARGE' => $examOnDischarge,
|
||||||
|
'DISCHARGE_MEDICATIONS' => $dischargeMedications,
|
||||||
|
'DIETARY_ADVICE' => $dietaryAdvice,
|
||||||
|
'DISCHARGE_INSTRUCTIONS' => $dischargeInstructions,
|
||||||
|
'SIGNATURE_BLOCK' => $signatureBlock,
|
||||||
|
// Legacy style aliases to ease migration from CI3-style template variables.
|
||||||
|
'FinalDiagnosis' => $finalDiagnosis,
|
||||||
|
'Surgery' => $surgery,
|
||||||
|
'Procedure' => $procedure,
|
||||||
|
'personal_history' => $personalHistory,
|
||||||
|
'discharge_complaint' => $presentingComplaints,
|
||||||
|
'discharge_general_exam' => $generalExam,
|
||||||
|
'lab_test_content' => $clinicalInvestigations,
|
||||||
|
'Course_in_the_hospital' => $courseInHospital,
|
||||||
|
'discharge_exam_on_discharge' => $examOnDischarge,
|
||||||
|
'Discharge_Medications' => $dischargeMedications,
|
||||||
|
'diet_advice' => $dietaryAdvice,
|
||||||
|
'Discharge_Instructions' => $dischargeInstructions,
|
||||||
|
];
|
||||||
|
|
||||||
|
return $vars;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function extractDischargeSectionByMarkers(string $html, array $startNeedles, array $endNeedles): string
|
||||||
|
{
|
||||||
|
$startPos = null;
|
||||||
|
foreach ($startNeedles as $needle) {
|
||||||
|
$pos = stripos($html, (string) $needle);
|
||||||
|
if ($pos !== false && ($startPos === null || $pos < $startPos)) {
|
||||||
|
$startPos = $pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($startPos === null) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
$tagStart = strrpos(substr($html, 0, $startPos), '<');
|
||||||
|
$sliceStart = $tagStart !== false ? $tagStart : $startPos;
|
||||||
|
|
||||||
|
$sliceEnd = strlen($html);
|
||||||
|
foreach ($endNeedles as $needle) {
|
||||||
|
$needle = (string) $needle;
|
||||||
|
if ($needle === '') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$isStartNeedle = false;
|
||||||
|
foreach ($startNeedles as $startNeedle) {
|
||||||
|
if (strcasecmp($needle, (string) $startNeedle) === 0) {
|
||||||
|
$isStartNeedle = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($isStartNeedle) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$candidate = stripos($html, $needle, $startPos + 1);
|
||||||
|
if ($candidate !== false && $candidate < $sliceEnd) {
|
||||||
|
$tag = strrpos(substr($html, 0, $candidate), '<');
|
||||||
|
$sliceEnd = $tag !== false ? $tag : $candidate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($sliceEnd <= $sliceStart) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
return trim(substr($html, $sliceStart, $sliceEnd - $sliceStart));
|
||||||
|
}
|
||||||
|
|
||||||
private function normalizeLegacyDischargeTemplate(string $html): string
|
private function normalizeLegacyDischargeTemplate(string $html): string
|
||||||
{
|
{
|
||||||
$out = str_replace(["\r\n", "\r"], "\n", $html);
|
$out = str_replace(["\r\n", "\r"], "\n", $html);
|
||||||
|
|
@ -429,11 +563,10 @@ class Ipd_discharge extends BaseController
|
||||||
$templateHtml = '{{CONTENT}}';
|
$templateHtml = '{{CONTENT}}';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strpos($templateHtml, '{{CONTENT}}') === false) {
|
$tokenVars = $this->buildDischargeTemplateTokenVars($panelData, $content);
|
||||||
|
if (! $this->templateHasKnownDischargeTokens($templateHtml, $tokenVars)) {
|
||||||
$templateHtml .= "\n{{CONTENT}}";
|
$templateHtml .= "\n{{CONTENT}}";
|
||||||
}
|
}
|
||||||
|
|
||||||
$tokenVars = $this->buildDischargeTemplateTokenVars($panelData, $content);
|
|
||||||
$patientName = html_entity_decode((string) ($tokenVars['PATIENT_NAME'] ?? ''), ENT_QUOTES, 'UTF-8');
|
$patientName = html_entity_decode((string) ($tokenVars['PATIENT_NAME'] ?? ''), ENT_QUOTES, 'UTF-8');
|
||||||
$patientCode = html_entity_decode((string) ($tokenVars['UHID'] ?? ''), ENT_QUOTES, 'UTF-8');
|
$patientCode = html_entity_decode((string) ($tokenVars['UHID'] ?? ''), ENT_QUOTES, 'UTF-8');
|
||||||
$ipdCode = html_entity_decode((string) ($tokenVars['IPD_CODE'] ?? ''), ENT_QUOTES, 'UTF-8');
|
$ipdCode = html_entity_decode((string) ($tokenVars['IPD_CODE'] ?? ''), ENT_QUOTES, 'UTF-8');
|
||||||
|
|
@ -475,6 +608,26 @@ class Ipd_discharge extends BaseController
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function templateHasKnownDischargeTokens(string $templateHtml, array $tokenVars): bool
|
||||||
|
{
|
||||||
|
if (trim($templateHtml) === '') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (array_keys($tokenVars) as $tokenName) {
|
||||||
|
$tokenName = (string) $tokenName;
|
||||||
|
if ($tokenName === '') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strpos($templateHtml, '{{' . $tokenName . '}}') !== false || strpos($templateHtml, '{' . $tokenName . '}') !== false) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private function shouldUseContentOnlyTemplate(string $content, string $templateHtml): bool
|
private function shouldUseContentOnlyTemplate(string $content, string $templateHtml): bool
|
||||||
{
|
{
|
||||||
$content = trim($content);
|
$content = trim($content);
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,11 @@ $status = (int) ($edit['status'] ?? 1);
|
||||||
<code>{{AGE_GENDER}}</code>, <code>{{ADMIT_DATE}}</code>, <code>{{DISCHARGE_DATE}}</code>, <code>{{CURRENT_DATE}}</code>,
|
<code>{{AGE_GENDER}}</code>, <code>{{ADMIT_DATE}}</code>, <code>{{DISCHARGE_DATE}}</code>, <code>{{CURRENT_DATE}}</code>,
|
||||||
<code>{{H_Name}}</code>, <code>{{H_address_1}}</code>, <code>{{H_address_2}}</code>, <code>{{H_phone_No}}</code>, <code>{{H_Email}}</code>,
|
<code>{{H_Name}}</code>, <code>{{H_address_1}}</code>, <code>{{H_address_2}}</code>, <code>{{H_phone_No}}</code>, <code>{{H_Email}}</code>,
|
||||||
<code>{{hospital_name}}</code>, <code>{{hospital_address}}</code>, <code>{{hospital_phone}}</code>, <code>{{hospital_email}}</code>,
|
<code>{{hospital_name}}</code>, <code>{{hospital_address}}</code>, <code>{{hospital_phone}}</code>, <code>{{hospital_email}}</code>,
|
||||||
<code>{{PRINT_TIME}}</code>.
|
<code>{{PRINT_TIME}}</code>.<br>
|
||||||
|
Section placeholders for custom layout/order: <code>{{DISCHARGE_SUMMARY}}</code>, <code>{{FINAL_DIAGNOSIS}}</code>, <code>{{SURGERY}}</code>,
|
||||||
|
<code>{{PROCEDURE}}</code>, <code>{{PERSONAL_HISTORY}}</code>, <code>{{PRESENTING_COMPLAINTS}}</code>, <code>{{GENERAL_EXAM_ADMISSION}}</code>,
|
||||||
|
<code>{{CLINICAL_INVESTIGATION_REPORTS}}</code>, <code>{{COURSE_IN_HOSPITAL}}</code>, <code>{{EXAMINATION_ON_DISCHARGE}}</code>,
|
||||||
|
<code>{{DISCHARGE_MEDICATIONS}}</code>, <code>{{DIETARY_ADVICE}}</code>, <code>{{DISCHARGE_INSTRUCTIONS}}</code>, <code>{{SIGNATURE_BLOCK}}</code>.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="alert alert-warning py-2 small">
|
<div class="alert alert-warning py-2 small">
|
||||||
|
|
@ -155,7 +159,7 @@ $status = (int) ($edit['status'] ?? 1);
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<label class="form-label small">Template HTML</label>
|
<label class="form-label small">Template HTML</label>
|
||||||
<textarea name="template_html" id="template_html_editor" rows="12" class="form-control" required><?= esc($templateHtml) ?></textarea>
|
<textarea name="template_html" id="template_html_editor" rows="12" class="form-control" required><?= esc($templateHtml) ?></textarea>
|
||||||
<small class="text-muted">Use the editor to format layout. Use the <code>Source</code> button for raw HTML. Keep <code>{{CONTENT}}</code> in the template.</small>
|
<small class="text-muted">Use the editor to format layout. Use the <code>Source</code> button for raw HTML. You can use one <code>{{CONTENT}}</code> block or arrange section placeholders in any custom order.</small>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user