fix(fhir): ensure strict canonical display values for SNOMED/LOINC/HL7 codings to prevent PHR validation errors

This commit is contained in:
DevSoftTech Server 2026-09-04 20:14:44 +05:30
parent 6525422af4
commit a6bb1f7cda

View File

@ -273,6 +273,7 @@ class DischargeFhirGenerator extends \App\Libraries\Abdm\Fhir\Generators\Abstrac
// ABDM PHR: use exam category for admission/discharge condition observations; // ABDM PHR: use exam category for admission/discharge condition observations;
// vital-signs category only for true vital measurements. // vital-signs category only for true vital measurements.
$obsCategoryCode = ($isAdm || $isDis) ? 'exam' : 'vital-signs'; $obsCategoryCode = ($isAdm || $isDis) ? 'exam' : 'vital-signs';
$obsCategoryCanonicalDisplay = ($isAdm || $isDis) ? 'Exam' : 'Vital Signs';
$obsCategorySystem = 'http://terminology.hl7.org/CodeSystem/observation-category'; $obsCategorySystem = 'http://terminology.hl7.org/CodeSystem/observation-category';
$coding = []; $coding = [];
@ -314,7 +315,7 @@ class DischargeFhirGenerator extends \App\Libraries\Abdm\Fhir\Generators\Abstrac
'coding' => [[ 'coding' => [[
'system' => $obsCategorySystem, 'system' => $obsCategorySystem,
'code' => $obsCategoryCode, 'code' => $obsCategoryCode,
'display' => $obsCategoryDisplay, 'display' => $obsCategoryCanonicalDisplay,
]], ]],
]], ]],
'code' => [ 'code' => [
@ -595,12 +596,17 @@ class DischargeFhirGenerator extends \App\Libraries\Abdm\Fhir\Generators\Abstrac
$docTitle = trim((string) ($document['title'] ?? 'Clinical document')); $docTitle = trim((string) ($document['title'] ?? 'Clinical document'));
$snomedCode = trim((string) ($document['snomed_code'] ?? '')); $snomedCode = trim((string) ($document['snomed_code'] ?? ''));
$snomedDisplay = trim((string) ($document['snomed_display'] ?? ''));
if ($snomedCode === '') { if ($snomedCode === '') {
if (stripos($docTitle, 'Bill') !== false || stripos($docTitle, 'Invoice') !== false) { if (stripos($docTitle, 'Bill') !== false || stripos($docTitle, 'Invoice') !== false) {
$snomedCode = '823651000000106'; // Billing record $snomedCode = '823651000000106'; // Billing record
$snomedDisplay = 'Billing record';
} else { } else {
$snomedCode = '373942005'; // Discharge summary $snomedCode = '373942005'; // Discharge summary
$snomedDisplay = 'Discharge summary';
} }
} elseif ($snomedDisplay === '') {
$snomedDisplay = $docTitle;
} }
$rawBytes = base64_decode($data); $rawBytes = base64_decode($data);
@ -620,7 +626,7 @@ class DischargeFhirGenerator extends \App\Libraries\Abdm\Fhir\Generators\Abstrac
'type' => ['coding' => [[ 'type' => ['coding' => [[
'system' => 'http://snomed.info/sct', 'system' => 'http://snomed.info/sct',
'code' => $snomedCode, 'code' => $snomedCode,
'display' => $docTitle, 'display' => $snomedDisplay,
]], 'text' => $docTitle], ]], 'text' => $docTitle],
'subject' => [ 'subject' => [
'reference' => $patientRef, 'reference' => $patientRef,
@ -812,7 +818,7 @@ class DischargeFhirGenerator extends \App\Libraries\Abdm\Fhir\Generators\Abstrac
return ['code' => '8462-4', 'display' => 'Diastolic blood pressure']; return ['code' => '8462-4', 'display' => 'Diastolic blood pressure'];
} }
if (str_contains($upper, 'SPO2') || str_contains($upper, 'OXYGEN')) { if (str_contains($upper, 'SPO2') || str_contains($upper, 'OXYGEN')) {
return ['code' => '2708-6', 'display' => 'Oxygen saturation in Arterial blood by Pulse oximetry']; return ['code' => '59408-5', 'display' => 'Oxygen saturation in Arterial blood by Pulse oximetry'];
} }
if (str_contains($upper, 'RBS') || str_contains($upper, 'RANDOM BLOOD SUGAR') || str_contains($upper, 'GLUCOSE')) { if (str_contains($upper, 'RBS') || str_contains($upper, 'RANDOM BLOOD SUGAR') || str_contains($upper, 'GLUCOSE')) {
return ['code' => '2345-7', 'display' => 'Glucose [Mass/volume] in Serum or Plasma']; return ['code' => '2345-7', 'display' => 'Glucose [Mass/volume] in Serum or Plasma'];