From 2e873ccdef12bd1d0cfa16843fff6d798d3f66aa Mon Sep 17 00:00:00 2001 From: velz Date: Wed, 8 Apr 2026 10:01:23 +0530 Subject: [PATCH 1/5] 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 2/5] 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 3/5] 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', From 1d561d63b6421e68025436f77b8e578f19b89699 Mon Sep 17 00:00:00 2001 From: "sanjeev.p" Date: Wed, 8 Apr 2026 11:41:48 +0530 Subject: [PATCH 4/5] FIX_Sales Tracker only --- app/Controllers/SalesController.php | 16 ++++++++++++---- app/Models/SalesActualLeadModel.php | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/app/Controllers/SalesController.php b/app/Controllers/SalesController.php index 32284322..d42bea40 100644 --- a/app/Controllers/SalesController.php +++ b/app/Controllers/SalesController.php @@ -537,13 +537,21 @@ class SalesController extends BaseController $value = trim($this->request->getGet('value') ?? ''); $exclude_id = $this->request->getGet('exclude_id'); - // ── Whitelist ───────────────────────────────────────────── + // ── Whitelist (table → model, pk, allowed fields) ───────── $allowed = [ - 'clients' => ['model' => $this->clientModel, 'pk' => 'id'], + 'clients' => [ + 'model' => $this->clientModel, + 'pk' => 'id', + 'fields' => ['short_name', 'client_name'], + ], + 'sales_actual_leads' => [ + 'model' => $this->leadModel, + 'pk' => 'lead_id', + 'fields' => ['company_name'], + ], ]; - // ── Allowed fields per table ────────────────────────────── - if (!array_key_exists($table, $allowed) || !in_array($field, ['short_name', 'client_name'])) { + if (! isset($allowed[$table]) || ! in_array($field, $allowed[$table]['fields'], true)) { return $this->response ->setStatusCode(400) ->setContentType('application/json') diff --git a/app/Models/SalesActualLeadModel.php b/app/Models/SalesActualLeadModel.php index 55ee787a..d52fcd23 100644 --- a/app/Models/SalesActualLeadModel.php +++ b/app/Models/SalesActualLeadModel.php @@ -50,7 +50,7 @@ class SalesActualLeadModel extends Model 'company_name' => [ 'required' => 'Company Name is Missing', // 'alpha_space' => 'Company Name must contain only letters and spaces', - 'regex_match' => 'Company Name can only contain letters, numbers, spaces, hyphens and underscores.', + 'regex_match' => 'Company Name can only contain letters, numbers.', 'min_length' => 'Company Name must be at least 2 characters long', 'max_length' => 'Company Name must be at most 255 characters long' ], From 45c20b5ffb23a0077f82b1d82268c93c2a013b03 Mon Sep 17 00:00:00 2001 From: velz Date: Wed, 8 Apr 2026 12:58:17 +0530 Subject: [PATCH 5/5] FIX_NONEB_FILE_ASSINGERS_ISSUE --- app/Controllers/LeadsController.php | 53 ++++++++++--------- ...non_eb_claim_api.md => non_eb_claim_api.md | 0 {dev_logs => public/dev_logs}/2026-04-01.md | 0 ...-06_inception_form_live_validation_plan.md | 0 4 files changed, 27 insertions(+), 26 deletions(-) rename dev_logs/non_eb_claim_api.md => non_eb_claim_api.md (100%) rename {dev_logs => public/dev_logs}/2026-04-01.md (100%) rename {dev_logs => public/dev_logs}/2026-04-06_inception_form_live_validation_plan.md (100%) diff --git a/app/Controllers/LeadsController.php b/app/Controllers/LeadsController.php index 9384b60d..bf3de0c8 100644 --- a/app/Controllers/LeadsController.php +++ b/app/Controllers/LeadsController.php @@ -5393,31 +5393,32 @@ class LeadsController extends BaseController $this->myLogger->logme('error', "QCR Sheet: copied from RFQ sheet | lead_id={$leadId}, rfq_sheet_id={$rfqSheetId}, new_sheet_id={$newSheetId}"); // Apply permissions: sales team as editors - $salesTeam = $this->userModel - ->select('user_profiles.email') - ->join('user_teams', 'user_profiles.id = user_teams.user_id') - ->where('user_teams.team_id', 5) - ->where('user_teams.is_active', 1) - ->where('user_profiles.is_active', 1) - ->findAll(); - $editorEmails = array_values(array_filter(array_unique(array_column($salesTeam, 'email')))); + // $salesTeam = $this->userModel + // ->select('user_profiles.email') + // ->join('user_teams', 'user_profiles.id = user_teams.user_id') + // ->where('user_teams.team_id', 5) + // ->where('user_teams.is_active', 1) + // ->where('user_profiles.is_active', 1) + // ->findAll(); + // $editorEmails = array_values(array_filter(array_unique(array_column($salesTeam, 'email')))); // Decode rfq_qcr_viewers from lead and add as viewers - $viewerEmails = []; + $editorEmails = []; if (! empty($lead['rfq_qcr_viewers'])) { $decoded = json_decode($lead['rfq_qcr_viewers'], true); if (is_array($decoded)) { - $viewerEmails = array_values(array_filter(array_unique($decoded))); + $editorEmails = array_values(array_filter(array_unique($decoded))); } } - if (! empty($editorEmails) || ! empty($viewerEmails)) { + // !dd($editorEmails); + if (! empty($editorEmails)) { try { $sheetLib->applyPermissions($newSheetId, [ 'editors' => $editorEmails, - 'viewers' => $viewerEmails, + // 'viewers' => $viewerEmails, ]); - $this->myLogger->logme('error', "QCR Sheet: permissions applied | sheet_id={$newSheetId}, editors=" . count($editorEmails) . ", viewers=" . count($viewerEmails)); + $this->myLogger->logme('error', "QCR Sheet: permissions applied | sheet_id={$newSheetId}, editors=" . count($editorEmails)); } catch (\Throwable $e) { $this->myLogger->logme('error', "QCR Sheet: failed to apply permissions | sheet_id={$newSheetId}, error=" . $e->getMessage()); } @@ -5634,30 +5635,30 @@ class LeadsController extends BaseController $this->myLogger->logme('error', "Placement Sheet: copied from QCR | lead_id={$leadId}, qcr_sheet_id={$qcrSheetId}, placement_sheet_id={$placementSheetId}"); // Apply same permissions as QCR (editors: sales team, viewers: rfq_qcr_viewers) - $salesTeam = $this->userModel - ->select('user_profiles.email') - ->join('user_teams', 'user_profiles.id = user_teams.user_id') - ->where('user_teams.team_id', 5) - ->where('user_teams.is_active', 1) - ->where('user_profiles.is_active', 1) - ->findAll(); - $editorEmails = array_values(array_filter(array_unique(array_column($salesTeam, 'email')))); + // $salesTeam = $this->userModel + // ->select('user_profiles.email') + // ->join('user_teams', 'user_profiles.id = user_teams.user_id') + // ->where('user_teams.team_id', 5) + // ->where('user_teams.is_active', 1) + // ->where('user_profiles.is_active', 1) + // ->findAll(); + // $editorEmails = array_values(array_filter(array_unique(array_column($salesTeam, 'email')))); - $viewerEmails = []; + $editorEmails = []; if (! empty($lead_data['rfq_qcr_viewers'])) { $decoded = json_decode($lead_data['rfq_qcr_viewers'], true); if (is_array($decoded)) { - $viewerEmails = array_values(array_filter(array_unique($decoded))); + $editorEmails = array_values(array_filter(array_unique($decoded))); } } - if (! empty($editorEmails) || ! empty($viewerEmails)) { + if (! empty($editorEmails) ) { try { $sheetLib->applyPermissions($placementSheetId, [ 'editors' => $editorEmails, - 'viewers' => $viewerEmails, + // 'viewers' => $viewerEmails, ]); - $this->myLogger->logme('error', "Placement Sheet: permissions applied | sheet_id={$placementSheetId}, editors=" . count($editorEmails) . ", viewers=" . count($viewerEmails)); + $this->myLogger->logme('error', "Placement Sheet: permissions applied | sheet_id={$placementSheetId}, editors=" . count($editorEmails)); } catch (\Throwable $e) { $this->myLogger->logme('error', "Placement Sheet: failed to apply permissions | sheet_id={$placementSheetId}, error=" . $e->getMessage()); } diff --git a/dev_logs/non_eb_claim_api.md b/non_eb_claim_api.md similarity index 100% rename from dev_logs/non_eb_claim_api.md rename to non_eb_claim_api.md diff --git a/dev_logs/2026-04-01.md b/public/dev_logs/2026-04-01.md similarity index 100% rename from dev_logs/2026-04-01.md rename to public/dev_logs/2026-04-01.md diff --git a/dev_logs/2026-04-06_inception_form_live_validation_plan.md b/public/dev_logs/2026-04-06_inception_form_live_validation_plan.md similarity index 100% rename from dev_logs/2026-04-06_inception_form_live_validation_plan.md rename to public/dev_logs/2026-04-06_inception_form_live_validation_plan.md