ABDM: treat transient handoff timeout as queued when recent OPD record exists
This commit is contained in:
parent
fbaa985857
commit
428dcd2aa9
|
|
@ -5416,6 +5416,29 @@ class Opd_prescription extends BaseController
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
log_message('error', '[fhir_bundle_submit] OPD#' . $opdId . ': ' . $e->getMessage());
|
log_message('error', '[fhir_bundle_submit] OPD#' . $opdId . ': ' . $e->getMessage());
|
||||||
$isTimeout = $this->isTransientFhirGatewayHandoffError($e);
|
$isTimeout = $this->isTransientFhirGatewayHandoffError($e);
|
||||||
|
|
||||||
|
if ($isTimeout) {
|
||||||
|
$recentState = $this->resolveRecentFhirGatewaySubmissionState($opdId, $sessionId);
|
||||||
|
if ($recentState !== null) {
|
||||||
|
$queueId = (string) ($recentState['queue_id'] ?? '');
|
||||||
|
$bridgeId = (int) ($recentState['bridge_id'] ?? 0);
|
||||||
|
$status = (string) ($recentState['status'] ?? 'queued');
|
||||||
|
$queueText = $queueId !== '' ? (' Queue: ' . $queueId . '.') : '';
|
||||||
|
|
||||||
|
return $this->response->setJSON([
|
||||||
|
'ok' => 1,
|
||||||
|
'queue_id' => $queueId !== '' ? $queueId : null,
|
||||||
|
'bridge_id' => $bridgeId > 0 ? $bridgeId : null,
|
||||||
|
'status' => $status,
|
||||||
|
'retryable' => 1,
|
||||||
|
'timed_out' => 1,
|
||||||
|
'message' => 'Gateway handoff timed out, but the record appears queued already.' . $queueText . ' Recheck Link Status in M2 ABDM Gateway.',
|
||||||
|
'csrfName' => csrf_token(),
|
||||||
|
'csrfHash' => csrf_hash(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$friendly = $isTimeout
|
$friendly = $isTimeout
|
||||||
? 'Gateway handoff timed out. Bridge is slow/unreachable right now. Please retry submit in a minute.'
|
? 'Gateway handoff timed out. Bridge is slow/unreachable right now. Please retry submit in a minute.'
|
||||||
: 'Gateway handoff failed: ' . $e->getMessage();
|
: 'Gateway handoff failed: ' . $e->getMessage();
|
||||||
|
|
@ -5482,6 +5505,78 @@ class Opd_prescription extends BaseController
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function resolveRecentFhirGatewaySubmissionState(int $opdId, int $sessionId): ?array
|
||||||
|
{
|
||||||
|
if ($opdId <= 0 || ! $this->db->tableExists('health_records')) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$fields = $this->db->getFieldNames('health_records') ?? [];
|
||||||
|
if (empty($fields)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$select = [];
|
||||||
|
foreach (['id', 'abdm_txn_id', 'bridge_record_id', 'push_status', 'care_context_reference', 'updated_at', 'created_at'] as $field) {
|
||||||
|
if (in_array($field, $fields, true)) {
|
||||||
|
$select[] = $field;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (empty($select)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$findCandidate = function (?string $careContextLike) use ($fields, $select, $opdId): ?array {
|
||||||
|
$builder = $this->db->table('health_records')->select(implode(',', $select));
|
||||||
|
|
||||||
|
if (in_array('entity_type', $fields, true) && in_array('entity_id', $fields, true)) {
|
||||||
|
$builder->where('entity_type', 'opd')->where('entity_id', (string) $opdId);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($careContextLike !== null && in_array('care_context_reference', $fields, true)) {
|
||||||
|
$builder->like('care_context_reference', $careContextLike, 'after');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array('id', $fields, true)) {
|
||||||
|
$builder->orderBy('id', 'DESC');
|
||||||
|
} elseif (in_array('updated_at', $fields, true)) {
|
||||||
|
$builder->orderBy('updated_at', 'DESC');
|
||||||
|
}
|
||||||
|
|
||||||
|
$row = $builder->get(1)->getRowArray();
|
||||||
|
if (empty($row)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$status = strtolower(trim((string) ($row['push_status'] ?? '')));
|
||||||
|
$queueId = trim((string) ($row['abdm_txn_id'] ?? ''));
|
||||||
|
$bridgeId = (int) ($row['bridge_record_id'] ?? 0);
|
||||||
|
$isUsable = in_array($status, ['queued', 'pushed', 'linked', 'in_progress'], true)
|
||||||
|
|| $queueId !== ''
|
||||||
|
|| $bridgeId > 0;
|
||||||
|
|
||||||
|
if (! $isUsable) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return [
|
||||||
|
'status' => $status !== '' ? $status : 'queued',
|
||||||
|
'queue_id' => $queueId,
|
||||||
|
'bridge_id' => $bridgeId,
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
if ($sessionId > 0 && in_array('care_context_reference', $fields, true)) {
|
||||||
|
$careContextPrefix = 'OPD-' . $opdId . '-S' . $sessionId . '-';
|
||||||
|
$candidate = $findCandidate($careContextPrefix);
|
||||||
|
if ($candidate !== null) {
|
||||||
|
return $candidate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $findCandidate(null);
|
||||||
|
}
|
||||||
|
|
||||||
public function fhir_complaint_recode()
|
public function fhir_complaint_recode()
|
||||||
{
|
{
|
||||||
if (! $this->request->isAJAX()) {
|
if (! $this->request->isAJAX()) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user