From 3717c788f8eb334a285489c14dd823b5e41c6367 Mon Sep 17 00:00:00 2001 From: Venkatesh Date: Tue, 7 Apr 2026 12:39:22 +0530 Subject: [PATCH 1/4] FIX_RFQ_GPA_NOT_OPENING_ISSUE --- app/Controllers/LeadsController.php | 114 +++++++++++++++------------- 1 file changed, 63 insertions(+), 51 deletions(-) diff --git a/app/Controllers/LeadsController.php b/app/Controllers/LeadsController.php index 12f9ed38..fd5ab968 100644 --- a/app/Controllers/LeadsController.php +++ b/app/Controllers/LeadsController.php @@ -6802,67 +6802,79 @@ class LeadsController extends BaseController public function handleMemberDataGPATotalSumInsurerFromExcel($params) { - $lead_id = $params['lead_id']; - $lead_data = $this->leadsModel->find((int) $lead_id); - // dd($lead_data); - $file_name_with_path = WRITEPATH . "/uploads/lead_files/" . $lead_data['file_name']; - // dd($file_name_with_path); + try { + $lead_id = $params['lead_id']; + $lead_data = $this->leadsModel->find((int) $lead_id); - if (! $lead_data) { - return ['status' => 'failed', 'message' => 'Opportunity data not found']; - } - - if ($lead_data['file_name']) { - - //check physical file - if (! file_exists($file_name_with_path)) { - - $message = "Lead Physcial file not found"; - $this->myLogger->logme('error', ($message . ' for file ' . $file_name_with_path)); - return ['status' => 'failed', 'message' => 'no physical file']; + if (! $lead_data) { + return ['status' => 'failed', 'message' => 'Opportunity data not found']; } - $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file_name_with_path); + $file_name_with_path = WRITEPATH . "/uploads/lead_files/" . $lead_data['file_name']; - //get members data - $members_sheet = $spreadsheet->getSheet(0); - $highestRowAndColumn = $members_sheet->getHighestRowAndColumn(); - // dd($highestRowAndColumn); + if ($lead_data['file_name']) { - $uncleaned_members = $members_sheet->rangeToArray('A1:' . $highestRowAndColumn['column'] . $highestRowAndColumn['row']); - // dd($uncleaned_members); + //check physical file + if (! file_exists($file_name_with_path)) { - $members = ExcelSanitizeHelper::sanitizeArrayData($uncleaned_members); - // dd($members); - - // Check column headings - $members_heading = $members[0]; - $available_col = []; - - $lower_headers = array_map('strtolower', $members_heading); - foreach ($lower_headers as $index => $header) { - if (preg_match('/^(sa\s*-\s*option|proposed\s+sum\s+insured)\s+\d+$/i', $header)) { - $column_name = $members_heading[$index]; - $sum = 0; - - for ($i = 1; $i < count($members); $i++) { - $cell_raw = $members[$i][$index] ?? ''; - $cell_clean = preg_replace('/[^0-9.\-]/', '', $cell_raw); // remove non-numeric chars - - if ($cell_clean !== '' && is_numeric($cell_clean)) { - $sum += (float) $cell_clean; - } - } - - $available_col[] = $sum; + $message = "Lead Physcial file not found"; + $this->myLogger->logme('error', ($message . ' for file ' . $file_name_with_path)); + return ['status' => 'failed', 'message' => 'no physical file']; } + + $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file_name_with_path); + + //get members data + $members_sheet = $spreadsheet->getSheet(0); + $highestRowAndColumn = $members_sheet->getHighestRowAndColumn(); + + // Read raw values and skip formula evaluation to avoid Calculation exceptions from malformed formulas. + $uncleaned_members = $members_sheet->rangeToArray( + 'A1:' . $highestRowAndColumn['column'] . $highestRowAndColumn['row'], + null, + false, + true, + false + ); + + $members = ExcelSanitizeHelper::sanitizeArrayData($uncleaned_members); + + // Check column headings + $members_heading = $members[0]; + $available_col = []; + + $lower_headers = array_map('strtolower', $members_heading); + foreach ($lower_headers as $index => $header) { + if (preg_match('/^(sa\s*-\s*option|proposed\s+sum\s+insured)\s+\d+$/i', $header)) { + $sum = 0; + + for ($i = 1; $i < count($members); $i++) { + $cell_raw = $members[$i][$index] ?? ''; + $cell_clean = preg_replace('/[^0-9.\-]/', '', $cell_raw); // remove non-numeric chars + + if ($cell_clean !== '' && is_numeric($cell_clean)) { + $sum += (float) $cell_clean; + } + } + + $available_col[] = $sum; + } + } + + return $available_col; } - // dd($available_col); - return $available_col; - } + return []; + } catch (\Throwable $e) { + log_message('error', 'Exception in handleMemberDataGPATotalSumInsurerFromExcel: {message}', [ + 'message' => $e->getMessage(), + ]); + log_message('error', 'Trace: {trace}', [ + 'trace' => $e->getTraceAsString(), + ]); - return []; + return []; + } } public function generateDemographyDataTable($param = []) From 2e873ccdef12bd1d0cfa16843fff6d798d3f66aa Mon Sep 17 00:00:00 2001 From: velz Date: Wed, 8 Apr 2026 10:01:23 +0530 Subject: [PATCH 2/4] TEST_NONEB_API_DOCS_UPDATED --- dev_logs/2026-04-01.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/dev_logs/2026-04-01.md b/dev_logs/2026-04-01.md index 1d7e53a6..35ab7f11 100644 --- a/dev_logs/2026-04-01.md +++ b/dev_logs/2026-04-01.md @@ -71,3 +71,41 @@ Old function copied as `uploadRequiredDoc_v1` (preserved for reference). ### API Docs - `nonebapidocs.md` - `dev_logs/non_eb_claim_api.md` + +--- + +## LeadsController — Bug Fix: `createClientWithLeadData` for Non-EB Leads + +### 6. Fix: `prepareClientPolicyData` crashes on Non-EB leads + +**Problem:** `proposel_data` is always `null` for Non-EB leads. The function unconditionally did: +```php +$proposel_data = json_decode($data['proposel_data'], true); +list($insurer_branch_id, $insurer_id) = explode('-', $proposel_data['insurer'], 2); +``` +This throws a PHP 8 TypeError (cannot access key on null) for any Non-EB lead, making `createClientWithLeadData` silently fail. + +**Fix:** Split insurer resolution by `lead_form_type`: +- **EB (`lead_form_type == 1`):** parse insurer from `proposel_data['insurer']` as `"{insurer_branch_id}-{insurer_id}"` — unchanged +- **Non-EB:** read `insurer_id` and `insurer_branch_id` directly from lead row columns + +### 7. Fix: `getPlacementJson` null-safety for Non-EB leads + +**Problem:** Same null `proposel_data` issue — `json_decode($data['proposel_data'], true)` returned null, and downstream `$proposel_data['proposel_name']` access would crash if a Non-EB lead had QCR data. + +**Fix:** `json_decode($data['proposel_data'] ?? '', true) ?? []` — `proposel_data` is now always an array, so all `??` key accesses are safe. + +### Smoke Test Results + +| Path | Step | Result | +|---|---|---| +| EB | `proposel_data` decode | ✅ decodes normally | +| EB | `explode('-', proposel_data['insurer'])` | ✅ `insurer_branch_id` + `insurer_id` parsed correctly | +| EB | `preparePolicyTermsFromRFQ` | ✅ unaffected | +| Non-EB | `proposel_data` null → `[]` | ✅ safe | +| Non-EB | insurer from lead row columns | ✅ `insurer_id` + `insurer_branch_id` read directly | +| Non-EB | `getPlacementJson` — no QCR data | ✅ returns null safely, policy terms skipped | +| Non-EB | `getPlacementJson` — QCR data exists | ⚠️ line 4356: `$proposel_data['proposel_name']` missing `??` — pending clarification on whether Non-EB leads can have QCR data | + +### Files Changed +- `app/Controllers/LeadsController.php` From b665bf6d801c652708559de3a4e397474914f523 Mon Sep 17 00:00:00 2001 From: Gowtham M Date: Wed, 8 Apr 2026 10:42:04 +0530 Subject: [PATCH 3/4] DOA undefined error in vidal and mediassist controller : GWM --- app/Controllers/MediAssistApiController.php | 1 + app/Controllers/VidalApiController.php | 1 + 2 files changed, 2 insertions(+) diff --git a/app/Controllers/MediAssistApiController.php b/app/Controllers/MediAssistApiController.php index 092ec7c2..3a70329b 100644 --- a/app/Controllers/MediAssistApiController.php +++ b/app/Controllers/MediAssistApiController.php @@ -845,6 +845,7 @@ class MediAssistApiController extends BaseController tm.id, tm.tpa_no as memberId, tm.tpa_claim_push_reference_no as claimRefNo, + tm.doa, cp.policy_no as policyNo, cp.policy_start_date as startDate, cp.policy_end_date as endDate, diff --git a/app/Controllers/VidalApiController.php b/app/Controllers/VidalApiController.php index 782fb781..23394231 100644 --- a/app/Controllers/VidalApiController.php +++ b/app/Controllers/VidalApiController.php @@ -465,6 +465,7 @@ class VidalApiController extends BaseController tm.tpa_no as memberId, tm.tpa_claim_push_reference_no as claimRefNo, tm.tpa_claim_id as claimID, + tm.doa, cp.policy_no as policyNo, cp.policy_start_date as startDate, cp.policy_end_date as endDate, From 0d8418259dbcfe9780f7a1565699fc8ba1dd9d1a Mon Sep 17 00:00:00 2001 From: velz Date: Wed, 8 Apr 2026 11:09:15 +0530 Subject: [PATCH 4/4] FIX_POLICY_TYPE_VALIDAION --- app/Controllers/LeadsController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Controllers/LeadsController.php b/app/Controllers/LeadsController.php index fd5ab968..9384b60d 100644 --- a/app/Controllers/LeadsController.php +++ b/app/Controllers/LeadsController.php @@ -506,7 +506,7 @@ class LeadsController extends BaseController 'errors' => ['required' => 'Claim Year is required for all entries.', 'regex_match' => 'Year must be in format YYYY-YYYY.'], ]; $rules['first_policy_type_.*'] = [ - 'rules' => 'required|regex_match[/^[a-zA-Z0-9_-]+$/]', + 'rules' => 'required|regex_match[/^[a-zA-Z0-9 _-]+$/]', 'errors' => ['required' => 'Policy Type is required in Claim History.', 'regex_match' => 'Policy Type only letters, numbers, space, hyphens and underscores are allowed', ], @@ -517,7 +517,7 @@ class LeadsController extends BaseController 'regex_match' => 'Date of Loss must be inValid format.'], ]; $rules['first_cause_of_loss.*'] = [ - 'rules' => 'required|regex_match[/^[a-zA-Z0-9\s_-]+$/]', + 'rules' => 'required|regex_match[/^[a-zA-Z0-9 _-]+$/]', 'errors' => [ 'required' => 'Cause of Loss is required.', 'regex_match' => 'Cause of Loss only letters, numbers, space, hyphens and underscores are allowed',