diff --git a/app/Controllers/Abha.php b/app/Controllers/Abha.php index 39d1e17..955dad3 100644 --- a/app/Controllers/Abha.php +++ b/app/Controllers/Abha.php @@ -43,8 +43,8 @@ class Abha extends BaseController return $this->response->setJSON([ 'ok' => 0, - 'error_text' => $result['error_text'] ?? $result['message'] - ?? $result['data']['message'] ?? 'Failed to send OTP', + 'error_text' => $this->extractBridgeErrorText($result, 'Failed to send OTP'), + 'request_id' => (string) ($result['request_id'] ?? ''), ]); } @@ -76,8 +76,8 @@ class Abha extends BaseController if (empty($result['ok']) || $result['ok'] != 1) { return $this->response->setJSON([ 'ok' => 0, - 'error_text' => $result['error_text'] ?? $result['message'] - ?? $result['data']['message'] ?? 'OTP verification failed', + 'error_text' => $this->extractBridgeErrorText($result, 'OTP verification failed'), + 'request_id' => (string) ($result['request_id'] ?? ''), ]); } $payload = $result['data'] ?? $result; @@ -175,8 +175,8 @@ class Abha extends BaseController return $this->response->setJSON([ 'ok' => 0, - 'error_text' => $result['error_text'] ?? $result['message'] - ?? $result['data']['message'] ?? 'Failed to send mobile OTP', + 'error_text' => $this->extractBridgeErrorText($result, 'Failed to send mobile OTP'), + 'request_id' => (string) ($result['request_id'] ?? ''), ]); } @@ -206,8 +206,8 @@ class Abha extends BaseController if (empty($result['ok']) || $result['ok'] != 1) { return $this->response->setJSON([ 'ok' => 0, - 'error_text' => $result['error_text'] ?? $result['message'] - ?? $result['data']['message'] ?? 'Mobile OTP verification failed', + 'error_text' => $this->extractBridgeErrorText($result, 'Mobile OTP verification failed'), + 'request_id' => (string) ($result['request_id'] ?? ''), ]); } @@ -583,6 +583,36 @@ class Abha extends BaseController . ''; } + /** + * Normalize nested bridge error payloads into a single readable message. + * + * @param array $result + */ + private function extractBridgeErrorText(array $result, string $fallback): string + { + $candidates = [ + $result['error_text'] ?? null, + $result['message'] ?? null, + $result['error']['message'] ?? null, + $result['error']['description'] ?? null, + $result['error']['code'] ?? null, + $result['data']['message'] ?? null, + $result['data']['error']['message'] ?? null, + $result['data']['error']['description'] ?? null, + $result['data']['error']['code'] ?? null, + $result['description'] ?? null, + $result['data']['description'] ?? null, + ]; + + foreach ($candidates as $candidate) { + if (is_string($candidate) && trim($candidate) !== '') { + return trim($candidate); + } + } + + return $fallback; + } + // ------------------------------------------------------------------------- // Private helper — find or auto-create patient from ABHA profile data // ------------------------------------------------------------------------- diff --git a/app/Views/billing/Patient_V.php b/app/Views/billing/Patient_V.php index 12015b8..99c4e31 100644 --- a/app/Views/billing/Patient_V.php +++ b/app/Views/billing/Patient_V.php @@ -751,6 +751,31 @@ return $('input[name=""]').first().val() || ''; }; + function pickApiMessage(resp, fallbackText) { + var r = resp || {}; + var candidates = [ + r.error_text, + r.message, + r.description, + r.error && r.error.message, + r.error && r.error.description, + r.error && r.error.code, + r.data && r.data.message, + r.data && r.data.description, + r.data && r.data.error && r.data.error.message, + r.data && r.data.error && r.data.error.description, + r.data && r.data.error && r.data.error.code + ]; + + for (var i = 0; i < candidates.length; i++) { + if (typeof candidates[i] === 'string' && candidates[i].trim() !== '') { + return candidates[i].trim(); + } + } + + return fallbackText; + } + $('form.form1').on('submit', function(form) { $("#RegisterPatient").prop("disabled", true); form.preventDefault(); @@ -849,7 +874,7 @@ txnId = resp.txn_id || null; abhaStep(2); } else { - showAlert('abha_step1_alert', 'danger', (resp && resp.error_text) ? resp.error_text : 'Failed to send OTP. Please try again.'); + showAlert('abha_step1_alert', 'danger', pickApiMessage(resp, 'Failed to send OTP. Please try again.')); } }, 'json').fail(function() { $('#abha_get_otp_spinner').addClass('d-none'); @@ -912,7 +937,7 @@ ); abhaStep(4); } else { - showAlert('abha_step2_alert', 'danger', (resp && resp.error_text) ? resp.error_text : 'Invalid OTP. Please try again.'); + showAlert('abha_step2_alert', 'danger', pickApiMessage(resp, 'Invalid OTP. Please try again.')); } }, 'json').fail(function() { $('#abha_verify_otp_spinner').addClass('d-none'); @@ -953,7 +978,7 @@ $('#link_step_2').show(); linkAlert('link_step1_alert', 'success', 'OTP sent to mobile ending ' + mobile.slice(-4) + '.'); } else { - linkAlert('link_step1_alert', 'danger', (resp && resp.error_text) ? resp.error_text : 'Failed to send OTP.'); + linkAlert('link_step1_alert', 'danger', pickApiMessage(resp, 'Failed to send OTP.')); } }, 'json').fail(function() { $('#abha_link_send_spinner').addClass('d-none'); @@ -1012,7 +1037,7 @@ '' ); } else { - linkAlert('link_step2_alert', 'danger', (resp && resp.error_text) ? resp.error_text : 'OTP verification failed.'); + linkAlert('link_step2_alert', 'danger', pickApiMessage(resp, 'OTP verification failed.')); } }, 'json').fail(function() { $('#abha_link_verify_spinner').addClass('d-none'); @@ -1046,7 +1071,7 @@ + ''; $('#abha_bridge_test_result').html(html); } else { - $('#abha_bridge_test_result').html('
' + ((resp && resp.error_text) ? resp.error_text : 'Bridge test failed') + '
'); + $('#abha_bridge_test_result').html('
' + pickApiMessage(resp, 'Bridge test failed') + '
'); } }, 'json').fail(function(xhr) { $('#abha_bridge_test_spinner').addClass('d-none'); @@ -1131,7 +1156,7 @@ $.getJSON('', function(resp) { if (!resp || resp.ok != 1 || !resp.qr_data) { - var msg = (resp && resp.error_text) ? resp.error_text : 'Unable to load Health Facility QR.'; + var msg = pickApiMessage(resp, 'Unable to load Health Facility QR.'); $('#abhareg_facility_loading').html(''); $('#abhareg_facility_alert').html('
' + msg + '
'); return; @@ -1376,7 +1401,7 @@ $('#abhareg_abha_status').html('VALID'); $('#abhareg_goto_stepB').removeClass('d-none'); } else { - var msg = (resp && resp.error_text) ? resp.error_text : (resp && resp.status ? 'Status: ' + resp.status : 'ABHA not found or invalid.'); + var msg = pickApiMessage(resp, (resp && resp.status ? 'Status: ' + resp.status : 'ABHA not found or invalid.')); regAlert('abhareg_num_stepA_alert', 'danger', msg); $('#abhareg_abha_status').html('INVALID'); } @@ -1416,7 +1441,7 @@ regTxnId = resp.txn_id || null; onSuccess(mobile); } else { - regAlert(alertId, 'danger', (resp && resp.error_text) ? resp.error_text : 'Failed to send OTP.'); + regAlert(alertId, 'danger', pickApiMessage(resp, 'Failed to send OTP.')); } }, 'json').fail(function() { $('#' + spinId).addClass('d-none'); @@ -1438,7 +1463,7 @@ if (resp && resp.ok == 1) { showRegResult(resp); } else { - regAlert(alertId, 'danger', (resp && resp.error_text) ? resp.error_text : 'OTP verification failed.'); + regAlert(alertId, 'danger', pickApiMessage(resp, 'OTP verification failed.')); } }, 'json').fail(function() { $('#' + spinId).addClass('d-none'); diff --git a/app/Views/partials/abha_create_panel.php b/app/Views/partials/abha_create_panel.php index 84ddb2e..0bb2c2a 100644 --- a/app/Views/partials/abha_create_panel.php +++ b/app/Views/partials/abha_create_panel.php @@ -356,6 +356,30 @@ $_aadh = esc($data[0]->udai ?? ''); if (html !== undefined) b.innerHTML = html; } function safe(s) { return $('
').text(s).html(); } + function pickApiMessage(res, fallbackText) { + var r = res || {}; + var candidates = [ + r.error_text, + r.message, + r.description, + r.error && r.error.message, + r.error && r.error.description, + r.error && r.error.code, + r.data && r.data.message, + r.data && r.data.description, + r.data && r.data.error && r.data.error.message, + r.data && r.data.error && r.data.error.description, + r.data && r.data.error && r.data.error.code + ]; + + for (var i = 0; i < candidates.length; i++) { + if (typeof candidates[i] === 'string' && candidates[i].trim() !== '') { + return candidates[i].trim(); + } + } + + return fallbackText; + } /* ── step indicator ──────────────────────────────────────────── */ function setStep(n) { @@ -464,7 +488,7 @@ $_aadh = esc($data[0]->udai ?? ''); setTimeout(function () { document.getElementById('cvp_otp_input').focus(); }, 80); } else { showMsg('cvp_step1_msg', 'danger', '' + - safe(res.error_text || res.message || res.error || 'Failed to send OTP.')); + safe(pickApiMessage(res, 'Failed to send OTP.'))); } }); }); @@ -487,7 +511,8 @@ $_aadh = esc($data[0]->udai ?? ''); showMsg('cvp_step2_msg', 'success', 'New OTP sent.'); $('#cvp_otp_input').val('').trigger('focus'); } else { - showMsg('cvp_step2_msg', 'danger', 'Resend failed: ' + safe(res.message || res.error || '')); + showMsg('cvp_step2_msg', 'danger', '' + + safe(pickApiMessage(res, 'Resend failed.'))); } }); }); @@ -506,7 +531,7 @@ $_aadh = esc($data[0]->udai ?? ''); setBtn('cvp_btn_verify_otp', false, 'Verify OTP'); if (res.ok != 1) { showMsg('cvp_step2_msg', 'danger', '' + - safe(res.error_text || res.message || res.error || 'Verification failed.')); + safe(pickApiMessage(res, 'Verification failed.'))); return; } var abhaData = extractAbha(res); @@ -544,7 +569,7 @@ $_aadh = esc($data[0]->udai ?? ''); setTimeout(function () { document.getElementById('cvp_mob_otp_input').focus(); }, 80); } else { showMsg('cvp_step3_send_msg', 'danger', '' + - safe(res.error_text || res.message || res.error || 'Failed to send OTP.')); + safe(pickApiMessage(res, 'Failed to send OTP.'))); } }); }); @@ -567,7 +592,7 @@ $_aadh = esc($data[0]->udai ?? ''); setBtn('cvp_btn_mob_verify_otp', false, 'Verify Mobile OTP'); if (res.ok != 1) { showMsg('cvp_step3_otp_msg', 'danger', '' + - safe(res.error_text || res.message || res.error || 'Verification failed.')); + safe(pickApiMessage(res, 'Verification failed.'))); return; } var abhaData = extractAbha(res); @@ -626,7 +651,7 @@ $_aadh = esc($data[0]->udai ?? ''); setTimeout(function () { document.getElementById('cvpv_a_otp').focus(); }, 80); } else { showMsg('cvpv_a_step1_msg', 'danger', '' + - safe(res.error_text || res.message || res.error || 'Failed to send OTP.')); + safe(pickApiMessage(res, 'Failed to send OTP.'))); } }); }); @@ -649,7 +674,7 @@ $_aadh = esc($data[0]->udai ?? ''); setBtn('cvpv_btn_a_verify', false, 'Verify & Link ABHA'); if (res.ok != 1) { showMsg('cvpv_a_step2_msg', 'danger', '' + - safe(res.error_text || res.message || res.error || 'Verification failed.')); + safe(pickApiMessage(res, 'Verification failed.'))); return; } var abhaData = extractAbha(res); @@ -687,7 +712,7 @@ $_aadh = esc($data[0]->udai ?? ''); setTimeout(function () { document.getElementById('cvpv_m_otp').focus(); }, 80); } else { showMsg('cvpv_m_step1_msg', 'danger', '' + - safe(res.error_text || res.message || res.error || 'Failed to send OTP.')); + safe(pickApiMessage(res, 'Failed to send OTP.'))); } }); }); @@ -707,7 +732,7 @@ $_aadh = esc($data[0]->udai ?? ''); setBtn('cvpv_btn_m_verify', false, 'Verify & Link ABHA'); if (res.ok != 1) { showMsg('cvpv_m_step2_msg', 'danger', '' + - safe(res.error_text || res.message || res.error || 'Verification failed.')); + safe(pickApiMessage(res, 'Verification failed.'))); return; } var abhaData = extractAbha(res);