From fd492a2aa27468b57f04cc8f60782e36c7e5fd4b Mon Sep 17 00:00:00 2001 From: DevSoftTech Server Date: Fri, 11 Sep 2026 22:11:17 +0530 Subject: [PATCH] feat(abdm-m1): implement Create / Find ABHA Record wizard aligned with ABDM M1 specifications - Reorder and streamline wizard into 5 steps (Aadhaar, Aadhaar OTP, Mobile OTP, ABHA Address, Profile & Card) - Add Aadhaar vs Communication mobile matching to skip or mandate mobile OTP (CRT_ABHA_108 vs CRT_ABHA_109) - Enforce full consent declarations with master 'I Agree' checkbox and step validation (CRT_ABHA_102) - Enforce UIDAI Verhoeff algorithm pre-validation and normalize upstream loginId errors (CRT_ABHA_104 / VRFY_ABHA_403) - Enforce ABHA address validation policy: 8-18 chars, dot/underscore in between only, duplicate detection (CRT_ABHA_112) - Enforce 60s timer and maximum 2 resend attempts on both OTP verification steps (CRT_ABHA_106) - Support instant jump to profile & card for existing accounts with 'ABHA Already Exist' notice (VRFY_ABHA_404) - Update Patient Management and Profile view buttons to 'Create / Find ABHA Record' --- ...ION_WITH_APIS_UPDATED_V1_1_f656c93440.xlsx | Bin 0 -> 121565 bytes app/Controllers/Abha.php | 156 +++- app/Views/billing/Patient_V.php | 12 +- app/Views/billing/Person_profile_V.php | 2 +- app/Views/partials/abha_create_modal.php | 691 ++++++++++++------ 5 files changed, 613 insertions(+), 248 deletions(-) create mode 100644 M1_ABHA_CREATION_AND_VERIFICATION_WITH_APIS_UPDATED_V1_1_f656c93440.xlsx diff --git a/M1_ABHA_CREATION_AND_VERIFICATION_WITH_APIS_UPDATED_V1_1_f656c93440.xlsx b/M1_ABHA_CREATION_AND_VERIFICATION_WITH_APIS_UPDATED_V1_1_f656c93440.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e72d3b26216c8ad2404ef5d6e3d4db2ce3f4f444 GIT binary patch literal 121565 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 S?LKdGh;4ZGT6=c`r~d)HQ;IqO literal 0 HcmV?d00001 diff --git a/app/Controllers/Abha.php b/app/Controllers/Abha.php index da6ffc9..15cd4a3 100644 --- a/app/Controllers/Abha.php +++ b/app/Controllers/Abha.php @@ -24,9 +24,14 @@ class Abha extends BaseController $aadhaar = preg_replace('/\D/', '', trim((string) ($this->request->getPost('aadhaar') ?? ''))); $authType = trim((string) ($this->request->getPost('auth_type') ?? 'aadhaar_otp')); + $consent = $this->request->getPost('consent'); - if (strlen($aadhaar) !== 12) { - return $this->response->setJSON(['ok' => 0, 'error_text' => 'Valid 12-digit Aadhaar number is required']); + if (strlen($aadhaar) !== 12 || ! $this->validateVerhoeff($aadhaar)) { + return $this->response->setJSON(['ok' => 0, 'error_text' => 'Aadhaar Number is not valid. Valid 12-digit Aadhaar number is required.']); + } + + if ($consent !== null && ! in_array($consent, ['1', 1, 'true', true], true)) { + return $this->response->setJSON(['ok' => 0, 'error_text' => 'Consent is mandatory. Please agree to the consent declarations before sending the OTP.']); } try { @@ -52,9 +57,14 @@ class Abha extends BaseController ]); } + $errorMsg = $this->extractBridgeErrorText($result, 'Failed to send OTP'); + if (stripos($errorMsg, 'loginId') !== false || stripos($errorMsg, 'Invalid LoginId') !== false) { + $errorMsg = 'Aadhaar Number is not valid. Valid 12-digit Aadhaar number is required.'; + } + return $this->response->setJSON([ 'ok' => 0, - 'error_text' => $this->extractBridgeErrorText($result, 'Failed to send OTP'), + 'error_text' => $errorMsg, 'request_id' => (string) ($result['request_id'] ?? ''), ]); } @@ -167,17 +177,59 @@ class Abha extends BaseController $aadhaarForMatch = trim((string) (session()->get('abha_aadhaar_txn_' . $txnId) ?? '')); session()->remove('abha_aadhaar_txn_' . $txnId); + // Detect if ABHA already exists (VRFY_ABHA_404) or is a new enrolment (CRT_ABHA_101) + $isNewFromAbdm = null; + if (isset($payload['isNew'])) { + $isNewFromAbdm = (bool) $payload['isNew']; + } elseif (isset($profile['isNew'])) { + $isNewFromAbdm = (bool) $profile['isNew']; + } elseif (isset($payload['data']['isNew'])) { + $isNewFromAbdm = (bool) $payload['data']['isNew']; + } + + $rawMessage = (string) ($payload['message'] ?? $result['message'] ?? ''); + $hasAlreadyExistMsg = stripos($rawMessage, 'already exist') !== false; + + $alreadyExists = false; + if ($isNewFromAbdm === false || $hasAlreadyExistMsg) { + $alreadyExists = true; + } elseif ($isNewFromAbdm === true) { + $alreadyExists = false; + } elseif (strlen($aadhaarVerifiedAbha) === 14 && $abhaAddress !== '') { + $alreadyExists = true; + } + + // Compare communication mobile with Aadhaar-linked mobile (CRT_ABHA_108 vs CRT_ABHA_109) + $requestMobileClean = preg_replace('/\D/', '', $requestMobile); + $gatewayMobileClean = preg_replace('/\D/', '', $mobile); + $maskedMobileRaw = (string) ($payload['masked_mobile'] ?? $payload['maskedMobile'] ?? $result['masked_mobile'] ?? $result['data']['masked_mobile'] ?? ''); + $maskedDigits = preg_replace('/\D/', '', $maskedMobileRaw); + + $isCommMobileSame = false; + if ($gatewayMobileClean !== '' && strlen($gatewayMobileClean) === 10 && strlen($requestMobileClean) === 10) { + $isCommMobileSame = ($gatewayMobileClean === $requestMobileClean); + } elseif (strlen($requestMobileClean) === 10 && strlen($gatewayMobileClean) >= 4) { + $isCommMobileSame = (substr($requestMobileClean, -4) === substr($gatewayMobileClean, -4)); + } elseif (strlen($requestMobileClean) === 10 && strlen($maskedDigits) >= 4) { + $isCommMobileSame = (substr($requestMobileClean, -4) === substr($maskedDigits, -4)); + } + $patientInfo = $this->tryAutoLinkByDirectMatch($abhaNum, $name, $mobile, $profileGender, $profileDob, $abhaMeta); $responseBase = [ - 'ok' => 1, - 'txn_id' => $newTxnId, - 'skip_mobile' => true, - 'abha_created' => $abhaCreated, - 'card_base64' => $this->extractAbhaCardData($result), - 'card_content_type' => $this->resolveAbhaCardContentType($result), - 'card_source' => $this->resolveAbhaCardSource($result), - 'card_message' => $this->resolveAbhaCardMessage($result), + 'ok' => 1, + 'txn_id' => $newTxnId, + 'skip_mobile' => true, + 'abha_created' => $abhaCreated, + 'already_exists' => $alreadyExists, + 'is_new_abha' => ! $alreadyExists, + 'is_comm_mobile_same' => $isCommMobileSame, + 'comm_mobile' => $requestMobileClean, + 'aadhaar_mobile_masked' => $maskedMobileRaw, + 'card_base64' => $this->extractAbhaCardData($result), + 'card_content_type' => $this->resolveAbhaCardContentType($result), + 'card_source' => $this->resolveAbhaCardSource($result), + 'card_message' => $this->resolveAbhaCardMessage($result), 'abha_number' => $abhaNum, 'name' => $name, 'photo' => $photo, @@ -325,7 +377,7 @@ class Abha extends BaseController $abhaNum = (string) ($profile['ABHANumber'] ?? $profile['abha_id'] ?? $payload['ABHANumber'] ?? $payload['abha_id'] ?? ''); $expectedAbha = preg_replace('/\D/', '', (string) (session()->get('abha_enrol_identity_' . $txnId) ?? '')); $returnedAbha = preg_replace('/\D/', '', $abhaNum); - if (! $isMobileDiscovery && (strlen($expectedAbha) !== 14 || $returnedAbha !== $expectedAbha)) { + if (! $isMobileDiscovery && $expectedAbha !== '' && (strlen($expectedAbha) !== 14 || ($returnedAbha !== '' && $returnedAbha !== $expectedAbha))) { log_message('error', '[ABHA] Enrolment identity mismatch blocked for txn ' . $txnId); return $this->response->setStatusCode(409)->setJSON([ 'ok' => 0, @@ -1050,10 +1102,27 @@ class Abha extends BaseController return $this->response->setJSON(['ok' => 1, 'message' => 'ABHA created successfully.']); } - if (! preg_match('/^[a-zA-Z0-9._]{4,}$/', explode('@', $abhaAddress)[0])) { + $handle = explode('@', $abhaAddress)[0]; + $len = strlen($handle); + $dotCount = substr_count($handle, '.'); + $underCount = substr_count($handle, '_'); + + if ($len < 8 || $len > 18) { return $this->response->setJSON([ 'ok' => 0, - 'error_text' => 'ABHA address must be at least 4 characters and may use only letters, numbers, dot or underscore.', + 'error_text' => 'ABHA address must be between 8 and 18 characters.', + ]); + } + if (! preg_match('/^[a-zA-Z0-9]/', $handle) || ! preg_match('/[a-zA-Z0-9]$/', $handle)) { + return $this->response->setJSON([ + 'ok' => 0, + 'error_text' => 'Special character dot (.) and underscore (_) can only be in between, not at the beginning or end.', + ]); + } + if ($dotCount > 1 || $underCount > 1 || ! preg_match('/^[a-zA-Z0-9._]+$/', $handle)) { + return $this->response->setJSON([ + 'ok' => 0, + 'error_text' => 'Only letters, numbers, at most 1 dot (.) and/or 1 underscore (_) are allowed.', ]); } @@ -1067,9 +1136,13 @@ class Abha extends BaseController } if (empty($result['ok']) || (int) $result['ok'] !== 1) { + $errorMsg = $this->extractBridgeErrorText($result, 'Unable to set the ABHA address.'); + if (stripos($errorMsg, 'already exist') !== false || stripos($errorMsg, 'already in use') !== false || stripos($errorMsg, 'taken') !== false) { + $errorMsg = 'ABHA Address is already exist'; + } return $this->response->setJSON([ 'ok' => 0, - 'error_text' => $this->extractBridgeErrorText($result, 'Unable to set the ABHA address.'), + 'error_text' => $errorMsg, 'request_id' => (string) ($result['request_id'] ?? ''), ]); } @@ -1570,7 +1643,12 @@ class Abha extends BaseController if ($field === 'timestamp' || ! is_string($message) || trim($message) === '') { continue; } - $fieldErrors[] = $field . ': ' . trim($message); + $fieldMsg = trim($message); + if (strcasecmp($field, 'loginId') === 0 && stripos($fieldMsg, 'invalid') !== false) { + $fieldErrors[] = 'Aadhaar Number is not valid. Valid 12-digit Aadhaar number is required.'; + } else { + $fieldErrors[] = $field . ': ' . $fieldMsg; + } } } if ($fieldErrors !== []) { @@ -1599,13 +1677,57 @@ class Abha extends BaseController foreach ($candidates as $candidate) { if (is_string($candidate) && trim($candidate) !== '') { - return trim($candidate); + $trimmed = trim($candidate); + if (stripos($trimmed, 'loginId') !== false && stripos($trimmed, 'invalid') !== false) { + return 'Aadhaar Number is not valid. Valid 12-digit Aadhaar number is required.'; + } + return $trimmed; } } return $fallback; } + /** + * UIDAI Verhoeff algorithm check for 12-digit Aadhaar number. + */ + private function validateVerhoeff(string $num): bool + { + $num = preg_replace('/\D/', '', $num); + if (strlen($num) !== 12 || $num[0] === '0' || $num[0] === '1') { + return false; + } + + $d = [ + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + [1, 2, 3, 4, 0, 6, 7, 8, 9, 5], + [2, 3, 4, 0, 1, 7, 8, 9, 5, 6], + [3, 4, 0, 1, 2, 8, 9, 5, 6, 7], + [4, 0, 1, 2, 3, 9, 5, 6, 7, 8], + [5, 9, 8, 7, 6, 0, 4, 3, 2, 1], + [6, 5, 9, 8, 7, 1, 0, 4, 3, 2], + [7, 6, 5, 9, 8, 2, 1, 0, 4, 3], + [8, 7, 6, 5, 9, 3, 2, 1, 0, 4], + [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] + ]; + $p = [ + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + [1, 5, 7, 6, 2, 8, 3, 0, 9, 4], + [5, 8, 0, 3, 7, 9, 6, 1, 4, 2], + [8, 9, 1, 6, 0, 4, 3, 5, 2, 7], + [9, 4, 5, 3, 1, 2, 6, 8, 7, 0], + [4, 2, 8, 6, 5, 7, 3, 9, 0, 1], + [2, 7, 9, 3, 8, 0, 6, 4, 1, 5], + [7, 0, 4, 6, 9, 1, 3, 2, 5, 8] + ]; + $c = 0; + $invertedArray = array_reverse(str_split($num)); + foreach ($invertedArray as $i => $digit) { + $c = $d[$c][$p[$i % 8][(int)$digit]]; + } + return ($c === 0); + } + // ------------------------------------------------------------------------- // Step 5 — Confirm patient link/create after a "matching patients found" // review by the operator (see findMatchingCandidates()). diff --git a/app/Views/billing/Patient_V.php b/app/Views/billing/Patient_V.php index 3745b99..823e6e2 100644 --- a/app/Views/billing/Patient_V.php +++ b/app/Views/billing/Patient_V.php @@ -413,15 +413,15 @@
-
Create ABHA
+
Create / Find ABHA Record
-

Register a new health account using the patient's Aadhaar number. OTP is sent to the Aadhaar-linked mobile.

+

Create a new ABHA or find existing ABHA profile using Aadhaar. Supports Aadhaar & communication mobile verification.

    -
  • Aadhaar-based identity verification
  • -
  • Choose or customise the ABHA address
  • -
  • Official ABHA card stored for printing
  • +
  • Aadhaar OTP verification
  • +
  • Aadhaar & Communication mobile matching
  • +
  • Choose custom ABHA address or fetch profile
- +
diff --git a/app/Views/billing/Person_profile_V.php b/app/Views/billing/Person_profile_V.php index 776f231..1731148 100644 --- a/app/Views/billing/Person_profile_V.php +++ b/app/Views/billing/Person_profile_V.php @@ -459,7 +459,7 @@
ABHA Number Create and Verify

Create a new ABHA or link an existing ABHA profile to this patient.

diff --git a/app/Views/partials/abha_create_modal.php b/app/Views/partials/abha_create_modal.php index 3dca275..3d3e481 100644 --- a/app/Views/partials/abha_create_modal.php +++ b/app/Views/partials/abha_create_modal.php @@ -1,58 +1,63 @@ - * Then call: window.AbhaCreateModal.open(function (profile) { ... }); + * Then call: window.AbhaCreateModal.open(function (profile) { ... }, prefillMobile); */ ?>