fix(abdm): ensure lab, radiology, and health document tasks load FHIR bundles and push to bridge
This commit is contained in:
parent
63cb6b810a
commit
c76ad4e8bd
|
|
@ -10674,9 +10674,10 @@ class AbdmGateway extends BaseController
|
||||||
|
|
||||||
private function buildHealthDocumentRecordPayload(int $patientId, string $abhaId = '', int $recordId = 0, array $patientRow = []): ?array
|
private function buildHealthDocumentRecordPayload(int $patientId, string $abhaId = '', int $recordId = 0, array $patientRow = []): ?array
|
||||||
{
|
{
|
||||||
|
$hasPost = $this->request && method_exists($this->request, 'getPost');
|
||||||
$targetRecordId = $recordId > 0
|
$targetRecordId = $recordId > 0
|
||||||
? $recordId
|
? $recordId
|
||||||
: (int) ($this->request->getPost('record_id') ?? $this->request->getPost('patient_doc_id') ?? $this->request->getPost('document_id') ?? $this->request->getPost('entity_id') ?? 0);
|
: (int) ($hasPost ? ($this->request->getPost('record_id') ?? $this->request->getPost('patient_doc_id') ?? $this->request->getPost('document_id') ?? $this->request->getPost('entity_id') ?? 0) : 0);
|
||||||
|
|
||||||
if ($patientId <= 0 && $targetRecordId > 0) {
|
if ($patientId <= 0 && $targetRecordId > 0) {
|
||||||
if ($this->db->tableExists('file_upload_data')) {
|
if ($this->db->tableExists('file_upload_data')) {
|
||||||
|
|
@ -10719,7 +10720,7 @@ class AbdmGateway extends BaseController
|
||||||
$gatewayPayload = $adapter->toGatewayPayload($output, $source, $hfrId);
|
$gatewayPayload = $adapter->toGatewayPayload($output, $source, $hfrId);
|
||||||
|
|
||||||
$isFromFile = isset($source['record_id']) && str_starts_with((string)$source['record_id'], 'file-');
|
$isFromFile = isset($source['record_id']) && str_starts_with((string)$source['record_id'], 'file-');
|
||||||
$reqCcRef = trim((string) ($this->request->getPost('care_context_reference') ?? ''));
|
$reqCcRef = trim((string) ($hasPost ? ($this->request->getPost('care_context_reference') ?? '') : ''));
|
||||||
$resolvedCcRef = $reqCcRef !== '' ? $reqCcRef : (string) ($gatewayPayload['care_context_reference'] ?? ('DOC-' . ($source['record_id'] ?? $targetRecordId) . '-' . date('Ymd', strtotime((string)($source['visit_date'] ?? date('Y-m-d'))))));
|
$resolvedCcRef = $reqCcRef !== '' ? $reqCcRef : (string) ($gatewayPayload['care_context_reference'] ?? ('DOC-' . ($source['record_id'] ?? $targetRecordId) . '-' . date('Ymd', strtotime((string)($source['visit_date'] ?? date('Y-m-d'))))));
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
|
@ -10735,15 +10736,15 @@ class AbdmGateway extends BaseController
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
// Fall through
|
log_message('warning', '[buildHealthDocumentRecordPayload] doctor doc bundle error: ' . $e->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$title = trim((string) ($this->request->getPost('document_title') ?? $this->request->getPost('title') ?? ''));
|
$title = trim((string) ($hasPost ? ($this->request->getPost('document_title') ?? $this->request->getPost('title') ?? '') : ''));
|
||||||
$documentText = trim((string) ($this->request->getPost('document_text') ?? $this->request->getPost('notes') ?? ''));
|
$documentText = trim((string) ($hasPost ? ($this->request->getPost('document_text') ?? $this->request->getPost('notes') ?? '') : ''));
|
||||||
$contentType = trim((string) ($this->request->getPost('content_type') ?? ''));
|
$contentType = trim((string) ($hasPost ? ($this->request->getPost('content_type') ?? '') : ''));
|
||||||
$base64 = trim((string) ($this->request->getPost('document_base64') ?? ''));
|
$base64 = trim((string) ($hasPost ? ($this->request->getPost('document_base64') ?? '') : ''));
|
||||||
$filePath = trim((string) ($this->request->getPost('file_path') ?? $this->request->getPost('attachment_path') ?? ''));
|
$filePath = trim((string) ($hasPost ? ($this->request->getPost('file_path') ?? $this->request->getPost('attachment_path') ?? '') : ''));
|
||||||
if ($title === '') {
|
if ($title === '') {
|
||||||
$title = 'Health Document';
|
$title = 'Health Document';
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1501,6 +1501,27 @@ class EAtriaBridgeConnector implements AbdmConnectorInterface
|
||||||
$visitDate = (string) ($data['visit_date'] ?? date('Y-m-d'));
|
$visitDate = (string) ($data['visit_date'] ?? date('Y-m-d'));
|
||||||
|
|
||||||
$bundle = $data['record_data'] ?? $data['fhir_bundle'] ?? null;
|
$bundle = $data['record_data'] ?? $data['fhir_bundle'] ?? null;
|
||||||
|
if (empty($bundle) && $careContextReference !== '') {
|
||||||
|
try {
|
||||||
|
$db = \Config\Database::connect();
|
||||||
|
if ($db->tableExists('health_records')) {
|
||||||
|
$hrRow = $db->table('health_records')
|
||||||
|
->where('care_context_reference', $careContextReference)
|
||||||
|
->orderBy('id', 'DESC')
|
||||||
|
->get(1)
|
||||||
|
->getRowArray();
|
||||||
|
$raw = $hrRow['record_data'] ?? $hrRow['fhir_bundle'] ?? null;
|
||||||
|
if (! empty($raw)) {
|
||||||
|
$dec = json_decode((string) $raw, true);
|
||||||
|
if (is_array($dec) && ! empty($dec) && isset($dec['resourceType'])) {
|
||||||
|
$bundle = $dec;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (\Throwable) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (! empty($bundle) && is_array($bundle)) {
|
if (! empty($bundle) && is_array($bundle)) {
|
||||||
// When a FHIR bundle is attached, push to /api/v3/records/push so the bridge
|
// When a FHIR bundle is attached, push to /api/v3/records/push so the bridge
|
||||||
// validates the FHIR resources and holds the bundle for on-demand patient fetch.
|
// validates the FHIR resources and holds the bundle for on-demand patient fetch.
|
||||||
|
|
|
||||||
|
|
@ -956,23 +956,101 @@ class AbdmTaskBoardSyncService
|
||||||
log_message('warning', '[processIndividualWorkTask] Invoice bundle generation error: ' . $inve->getMessage());
|
log_message('warning', '[processIndividualWorkTask] Invoice bundle generation error: ' . $inve->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} elseif (in_array($taskType, ['lab_report_publish', 'radiology_report_publish'], true)) {
|
||||||
|
if (empty($pushData['bundle']) && $this->db->tableExists('health_records')) {
|
||||||
|
$hr = $this->db->table('health_records')
|
||||||
|
->where('entity_id', (string) $entityId)
|
||||||
|
->where('hi_type', 'DiagnosticReportRecord')
|
||||||
|
->orderBy('id', 'DESC')
|
||||||
|
->get(1)
|
||||||
|
->getRowArray();
|
||||||
|
$raw = $hr['record_data'] ?? $hr['fhir_bundle'] ?? null;
|
||||||
|
if (! empty($raw)) {
|
||||||
|
$dec = json_decode((string) $raw, true);
|
||||||
|
if (is_array($dec) && ! empty($dec) && isset($dec['resourceType'])) {
|
||||||
|
$pushData['bundle'] = $dec;
|
||||||
|
$pushData['fhir_bundle'] = $dec;
|
||||||
|
$pushData['record_data'] = $dec;
|
||||||
|
$bundleJson = (string) $raw;
|
||||||
|
if (! empty($hr['care_context_reference'])) {
|
||||||
|
$careContextRef = (string) $hr['care_context_reference'];
|
||||||
|
$pushData['care_context_reference'] = $careContextRef;
|
||||||
|
$pushData['queue_id'] = $careContextRef;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (empty($pushData['bundle']) && class_exists('\App\Controllers\AbdmGateway')) {
|
||||||
|
try {
|
||||||
|
$gw = new \App\Controllers\AbdmGateway();
|
||||||
|
$diagRes = $gw->pushDiagnosisReportBundleInternal((int) $entityId, $patientId, $abhaAddress !== '' ? $abhaAddress : $abhaNumber, '', '', $careContextRef, true);
|
||||||
|
if (! empty($diagRes['health_record_id']) && $this->db->tableExists('health_records')) {
|
||||||
|
$genHr = $this->db->table('health_records')->where('id', (int) $diagRes['health_record_id'])->get(1)->getRowArray();
|
||||||
|
$rawGen = $genHr['record_data'] ?? $genHr['fhir_bundle'] ?? null;
|
||||||
|
if (! empty($rawGen)) {
|
||||||
|
$decGen = json_decode((string) $rawGen, true);
|
||||||
|
if (is_array($decGen) && ! empty($decGen)) {
|
||||||
|
$pushData['bundle'] = $decGen;
|
||||||
|
$pushData['fhir_bundle'] = $decGen;
|
||||||
|
$pushData['record_data'] = $decGen;
|
||||||
|
$bundleJson = (string) $rawGen;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (\Throwable $de) {
|
||||||
|
log_message('warning', '[processIndividualWorkTask] Diagnostic report bundle generation error: ' . $de->getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} elseif ($taskType === 'health_document_publish') {
|
||||||
|
if (empty($pushData['bundle']) && class_exists('\App\Controllers\DoctorDocument')) {
|
||||||
|
try {
|
||||||
|
$docCtrl = new \App\Controllers\DoctorDocument();
|
||||||
|
$src = $docCtrl->buildHealthDocumentSource((int) $entityId);
|
||||||
|
if (! empty($src)) {
|
||||||
|
$factory = new \App\Libraries\Abdm\Fhir\FhirGeneratorFactory();
|
||||||
|
$gen = $factory->healthDocument()->generate($src);
|
||||||
|
$adapter = new \App\Libraries\Abdm\Fhir\Support\GatewayPayloadAdapter();
|
||||||
|
$hfrId = (string) ($src['hfr_id'] ?? 'HFR-IN-HMS');
|
||||||
|
$docPayload = $adapter->toGatewayPayload($gen, $src, $hfrId);
|
||||||
|
if (! empty($docPayload['fhir_bundle'])) {
|
||||||
|
$pushData['bundle'] = $docPayload['fhir_bundle'];
|
||||||
|
$pushData['fhir_bundle'] = $docPayload['fhir_bundle'];
|
||||||
|
$pushData['record_data'] = $docPayload['fhir_bundle'];
|
||||||
|
$bundleJson = (string) json_encode($docPayload['fhir_bundle'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||||
|
if (! empty($docPayload['care_context_reference'])) {
|
||||||
|
$careContextRef = (string) $docPayload['care_context_reference'];
|
||||||
|
$pushData['care_context_reference'] = $careContextRef;
|
||||||
|
$pushData['queue_id'] = $careContextRef;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (\Throwable $he) {
|
||||||
|
log_message('warning', '[processIndividualWorkTask] Health document bundle generation error: ' . $he->getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generic fallback: check if bundle already exists in health_records
|
// Generic fallback: check if bundle already exists in health_records
|
||||||
if (empty($pushData['bundle']) && $this->db->tableExists('health_records')) {
|
if (empty($pushData['bundle']) && $this->db->tableExists('health_records')) {
|
||||||
$hr = $this->db->table('health_records')
|
$hr = $this->db->table('health_records')
|
||||||
->where('entity_id', (string) $entityId)
|
->groupStart()
|
||||||
->where('patient_id', $patientId)
|
->where('care_context_reference', $careContextRef)
|
||||||
|
->orGroupStart()
|
||||||
|
->where('entity_id', (string) $entityId)
|
||||||
|
->where('patient_id', $patientId)
|
||||||
|
->groupEnd()
|
||||||
|
->groupEnd()
|
||||||
->orderBy('id', 'DESC')
|
->orderBy('id', 'DESC')
|
||||||
->get(1)
|
->get(1)
|
||||||
->getRowArray();
|
->getRowArray();
|
||||||
if (! empty($hr['fhir_bundle'])) {
|
$rawBundle = $hr['record_data'] ?? $hr['fhir_bundle'] ?? null;
|
||||||
$decoded = json_decode((string) $hr['fhir_bundle'], true);
|
if (! empty($rawBundle)) {
|
||||||
if (is_array($decoded) && ! empty($decoded)) {
|
$decoded = json_decode((string) $rawBundle, true);
|
||||||
|
if (is_array($decoded) && ! empty($decoded) && isset($decoded['resourceType'])) {
|
||||||
$pushData['bundle'] = $decoded;
|
$pushData['bundle'] = $decoded;
|
||||||
$pushData['fhir_bundle'] = $decoded;
|
$pushData['fhir_bundle'] = $decoded;
|
||||||
$pushData['record_data'] = $decoded;
|
$pushData['record_data'] = $decoded;
|
||||||
$bundleJson = (string) $hr['fhir_bundle'];
|
$bundleJson = (string) $rawBundle;
|
||||||
if (! empty($hr['care_context_reference'])) {
|
if (! empty($hr['care_context_reference'])) {
|
||||||
$careContextRef = (string) $hr['care_context_reference'];
|
$careContextRef = (string) $hr['care_context_reference'];
|
||||||
$pushData['care_context_reference'] = $careContextRef;
|
$pushData['care_context_reference'] = $careContextRef;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user