diff --git a/app/Controllers/EmployeeController.php b/app/Controllers/EmployeeController.php
index a8bd7c44..bc12d31b 100755
--- a/app/Controllers/EmployeeController.php
+++ b/app/Controllers/EmployeeController.php
@@ -3407,9 +3407,10 @@ class EmployeeController extends AdminController
try {
$rules = [
'endorsement_no' => [
- 'rules' => 'required',
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9\/_\-]+$/]',
'errors' => [
- 'required' => 'Endorsement Number is missing'
+ 'required' => 'Endorsement Number is missing.',
+ 'regex_match' => 'Endorsement Number can only contain letters, numbers, slashes (/), underscores (_), and hyphens (-).'
]
],
'status' => [
diff --git a/app/Controllers/LeadsController.php b/app/Controllers/LeadsController.php
index c8413098..dc577af0 100644
--- a/app/Controllers/LeadsController.php
+++ b/app/Controllers/LeadsController.php
@@ -380,7 +380,7 @@ class LeadsController extends BaseController
{
$rules = [
'lead_type' => [
- 'rules' => 'required',
+ 'rules' => 'integer',
'errors' => ['required' => 'Lead Type is required']
],
'issuer' => [
@@ -455,6 +455,38 @@ class LeadsController extends BaseController
'errors' => ['required' => 'Date of Expiry is required']
];
}
+
+ // 1. MANUALLY VALIDATE FILES BEFORE PROCESSING
+ // $allFiles = $this->request->getFiles();
+ // foreach ($allFiles as $inputName => $files) {
+ // // If it's a single file, wrap it in an array to use the same logic
+ // $fileArray = is_array($files) ? $files : [$files];
+
+ // foreach ($fileArray as $index => $file) {
+ // if ($file->isValid() && !$file->hasMoved()) {
+ // $extension = strtolower($file->getExtension());
+
+ // // Logic: index 0 is Excel only, others are mixed
+ // if ($index === 0) {
+ // $allowed = ['xls', 'xlsx'];
+ // } else {
+ // $allowed = ['xls', 'xlsx', 'pdf', 'jpg', 'jpeg', 'png'];
+ // }
+
+ // if (!in_array($extension, $allowed)) {
+ // // Return 400 Error immediately
+ // return $this->response->setStatusCode(400)->setJSON([
+ // 'status' => false,
+ // 'message' => 'Input validation failed',
+ // 'code' => 400,
+ // 'errors' => [
+ // $inputName => "File " . ($index + 1) . " has an invalid extension ($extension). Allowed: " . implode(',', $allowed)
+ // ]
+ // ]);
+ // }
+ // }
+ // }
+ // }
if (!$this->validate($rules)) {
return $this->response->setStatusCode(400)->setJSON([
diff --git a/app/Controllers/PolicyTransactionController.php b/app/Controllers/PolicyTransactionController.php
index 592e7405..62a75808 100644
--- a/app/Controllers/PolicyTransactionController.php
+++ b/app/Controllers/PolicyTransactionController.php
@@ -918,6 +918,144 @@
public function createInceptionPolicy()
{
$post_data = $this->request->getPost();
+
+ $rules = [
+ // ==========================================
+ // 1. CLIENT SECTION (5 Fields)
+ // ==========================================
+ 'client_id' => ['label' => 'Client','rules' => 'required','errors' => ['required' => 'Please select a Client.']],
+ 'client_type' => ['label' => 'Client Type','rules' => 'required','errors' => ['required' => 'Client Type must be selected.']],
+ 'industry_type' => ['label' => 'Industry','rules' => 'permit_empty','errors' => []], // No errors needed for permit_empty unless adding other rules
+ 'gst_no' => ['label' => 'GST Number','rules' => 'permit_empty|regex_match[/^[0-9]{2}[A-Z]{5}[0-9]{4}[A-Z]{1}[1-9A-Z]{1}Z[0-9A-Z]{1}$/]','errors' => ['alpha_numeric' => 'GST Number should only contain letters and numbers.','regex_match' => 'Invalid GST format. (Example: 22AAAAA0000A1Z5)']],
+ 'pan_no' => ['label' => 'PAN Number','rules' => 'permit_empty|regex_match[/^[A-Z]{5}[0-9]{4}[A-Z]{1}$/]','errors' => ['alpha_numeric' => 'PAN Number should only contain letters and numbers.','regex_match' => 'Invalid PAN format. (Example: ABCDE1234F)']],
+ // ==========================================
+ // 2. PRE-SALES SECTION (3 Fields)
+ // ==========================================
+ 'lead_source' => ['label' => 'Lead Source', 'rules' => 'permit_empty', 'errors' => []],
+ 'opportunity_id' => ['label' => 'Opportunity', 'rules' => 'permit_empty', 'errors' => []],
+ 'quotation_ref' => ['label' => 'Quotation Ref', 'rules' => 'permit_empty', 'errors' => []],
+
+ // ==========================================
+ // 3. POLICY DOCUMENT (2 Fields)
+ // ==========================================
+ 'policy_copy' => ['label' => 'Policy Copy', 'rules' => 'permit_empty', 'errors' => []],
+ 'proposal_form' => ['label' => 'Proposal Form', 'rules' => 'permit_empty', 'errors' => []],
+
+ // ==========================================
+ // 4. VEHICLE DOCUMENT (2 Fields)
+ // ==========================================
+ 'rc_copy' => ['label' => 'RC Copy', 'rules' => 'permit_empty', 'errors' => []],
+ 'inspection_report' => ['label' => 'Inspection Report', 'rules' => 'permit_empty', 'errors' => []],
+
+ // ==========================================
+ // 5. SALES SECTION (12 Fields)
+ // ==========================================
+ 'base_policy' => ['label' => 'Base Policy', 'rules' => 'permit_empty','errors' => []],
+ 'policy_no' => ['label' => 'Policy Number', 'rules' => 'required|regex_match[/^[a-zA-Z0-9\/_-]+$/]',
+ 'errors' => [
+ 'required' => 'Policy Number is Must.',
+ 'regex_match' => 'Policy Number can only contain letters, numbers, and symbols like / - or _'
+ ]],
+ 'policy_issue_date' => ['label' => 'Issue Date', 'rules' => 'required|valid_date[Y-m-d]|regex_match[/^\d{4}-\d{2}-\d{2}$/]',
+ 'errors' => [
+ 'required' => 'Policy Issue Date is required.',
+ 'valid_date' => 'Please provide a valid Policy Issue Date.',
+ 'regex_match' => 'The Policy Issue Date format is incorrect. '
+ ]],
+ 'month' => ['label' => 'Issue Month', 'rules' => 'required','errors' => [
+ 'required' => 'Please select or enter the Policy Issue Month.'
+ ]],
+ 'policy_start_date' => ['label' => 'D.O.C',
+ 'rules' => 'required|valid_date[Y-m-d]|regex_match[/^\d{4}-\d{2}-\d{2}$/]',
+ 'errors' => [
+ 'required' => 'D.O.C (Start Date) is required.',
+ 'valid_date' => 'Please provide a valid D.O.C date.',
+ 'regex_match' => 'The D.O.C date format is incorrect. '
+ ]],
+ 'policy_end_date' => ['label' => 'D.O.E', 'rules' => 'required|valid_date[Y-m-d]|regex_match[/^\d{4}-\d{2}-\d{2}$/]','errors' => [
+ 'required' => 'D.O.E (Expiry Date) is required.',
+ 'valid_date' => 'Please provide a valid D.O.E date.',
+ 'regex_match' => 'The D.O.E date format is incorrect. '
+ ]],
+ 'emp_count' => ['label' => 'No of Insured', 'rules' => 'permit_empty|numeric','errors' => [
+ 'numeric' => 'No of Insured must contain only numbers.'
+ ]],
+ 'dependent_count' => ['label' => 'No of Dependents', 'rules' => 'permit_empty|numeric','errors' => [
+ 'numeric' => 'No of Dependents must contain only numbers.'
+ ]],
+ 'installment' => ['label' => 'Installment', 'rules' => 'permit_empty','errors' => []],
+ 'installment_data' => ['label' => 'Installment Data', 'rules' => 'permit_empty','errors' => []],
+ 'co_share' => ['label' => 'CoP Yes', 'rules' => 'permit_empty','errors' => []],
+ 'bro_payable_by' => ['label' => 'Remuneration Pay By', 'rules' => 'permit_empty','errors' => []],
+ 'renewal_date' => ['label' => 'Renewal Date', 'rules' => 'required|valid_date[Y-m-d]|regex_match[/^\d{4}-\d{2}-\d{2}$/]','errors' => [
+ 'required' => 'Renewal Date is required.',
+ 'valid_date' => 'Please provide a valid Renewal Date.',
+ 'regex_match' => 'The Renewal Date format is incorrect. '
+ ]],
+ 'sales_generated_by' => ['label' => 'Sales Generated By', 'rules' => 'permit_empty','errors' => [
+ // 'required' => 'Please select the person who generated this sale.'
+ ]],
+ 'serviced_by' => ['label' => 'Serviced By', 'rules' => 'permit_empty','errors' => [
+ // 'required' => 'Please select the service person for this policy.'
+ ]],
+ 'pos_id' => ['label' => 'POS', 'rules' => 'permit_empty','errors' => []],
+
+ // ==========================================
+ // 6. PREMIUM DETAILS (Array Fields - 25 Fields)
+ // Use .* because these come from the dynamic table
+ // ==========================================
+ 'follow_insurer_id.*' => ['label' => 'Insurer', 'rules' => 'required','errors' => ['required' => 'Please select an Insurer.']],
+ 'co_share_type.*' => ['label' => 'Is Leader', 'rules' => 'permit_empty','errors' => []],
+ 'cd_ac_no_for_child.*' => ['label' => 'CD Acc No', 'rules' => 'permit_empty','errors' => []],
+ 'cd_current_balance.*' => ['label' => 'CD Amount', 'rules' => 'permit_empty','errors' => []],
+ 'follower_policy_no.*' => ['label' => 'Follower Policy No', 'rules' => 'permit_empty','errors' => []],
+ 'calc_policy_issue_date.*' => ['label' => 'Policy Issue Date', 'rules' => 'required','errors' => [ 'required' => 'Policy Issue Date is required' ]],
+ 'co_share_per.*' => ['label' => 'Co-Share %', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Co-Share % must be a valid decimal.']],
+ 'non_comm_per_amt.*' => ['label' => 'Non-Comm Premium', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Amount must be numeric.']],
+ 'base_premium.*' => ['label' => 'Base Premium', 'rules' => 'required|numeric|differs[0]','errors' => [
+ 'required' => 'Base Premium is required.',
+ 'numeric' => 'Base Premium must be a valid number.',
+ 'differs' => 'Base Premium cannot be zero; please enter a positive or negative value.'
+ ]],
+ 'tp_premium.*' => ['label' => 'TP Premium', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'TP Premium must be numeric.']],
+ 'ter_premium.*' => ['label' => 'TEP Premium', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'TEP Premium must be numeric.']],
+ 'co_premium.*' => ['label' => 'Co-Premium', 'rules' => 'permit_empty|decimal','errors'=> ['decimal' => 'Co-Premium must be numeric.']],
+ 'co_tp_premium.*' => ['label' => 'Co-TP Premium', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Co-TP Premium must be numeric.']],
+ 'co_ter_premium.*' => ['label' => 'Co-TEP Premium', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Co-TEP Premium must be numeric.']],
+ 'cgst.*' => ['label' => 'CGST', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'CGST must be numeric.']],
+ 'sgst.*' => ['label' => 'SGST', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'SGST must be numeric.']],
+ 'igst.*' => ['label' => 'IGST', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'IGST must be numeric.']],
+ 'gst_amount.*' => ['label' => 'GST Amount', 'rules' => 'permit_empty|decimal|greater_than[0]','errors' => [
+ 'decimal' => 'GST Amount must be a valid numeric value.',
+ 'greater_than' => 'GST Amount cannot be zero; please enter a value greater than 0.'
+ ]],
+ 'stamp_duty.*' => ['label' => 'Stamp Duty', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Stamp Duty must be numeric.']],
+ 'total.*' => ['label' => 'Total', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Total must be a numeric value.']],
+ 'agreed_bp.*' => ['label' => 'Agreed BP %', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Agreed BP % must be numeric.']],
+ 'agreed_tp.*' => ['label' => 'Agreed TP %', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Agreed TP % must be numeric.']],
+ 'agreed_ter.*' => ['label' => 'Agreed TEP %', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Agreed TEP % must be numeric.']],
+ 'agreed_amount.*' => ['label' => 'Agreed Amount', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Agreed Amount must be numeric.']],
+ 'actual_bp_amt.*' => ['label' => 'Actual BP Amount', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Actual BP Amount must be numeric.']],
+ 'actual_tp_amt.*' => ['label' => 'Actual TP Amount', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Actual TP Amount must be numeric.']],
+ 'actual_tep_amt.*' => ['label' => 'Actual TEP Amount', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Actual TEP Amount must be numeric.']],
+ 'actual_bp_per.*' => ['label' => 'Actual BP %', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Actual BP % must be numeric.']],
+ 'actual_tp_per.*' => ['label' => 'Actual TP %', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Actual TP % must be numeric.']],
+ 'actual_tep_per.*' => ['label' => 'Actual TEP %', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Actual TEP % must be numeric.']],
+ 'actual_bp_brokerage_amt.*'=> ['label' => 'BP Remuneration', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'BP Remuneration must be numeric.']],
+ 'actual_tp_brokerage_amt.*'=> ['label' => 'TP Remuneration', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'TP Remuneration must be numeric.']],
+ 'actual_tep_brokerage_amt.*'=>['label' => 'TEP Remuneration', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'TEP Remuneration must be numeric.']],
+ 'exp_amt.*' => ['label' => 'Expected Amount', 'rules' => 'permit_empty|decimal','errors' => ['decimal'=> 'The Expected Amount field must contain a valid number.']]
+ ];
+
+ if (!$this->validate($rules)) {
+ return $this->response->setStatusCode(400)->setJSON([
+ 'status' => false,
+ 'message' => 'Input validation failed',
+ 'code' => 400,
+ 'errors' => $this->validator->getErrors()
+ ]);
+ }
+
$post_data = $post_data ? sanitizeInputArrayAdvanced($post_data) : [];
$this->myLogger->logme('error', 'Policy Trancaction form data : '. json_encode($post_data));
@@ -2253,16 +2391,264 @@
public function createEndorsementPolicy()
{
// $id = $this->request->getPost('id');
+ $rules = [
+ // ==========================================
+ // 1. CLIENT SECTION
+ // ==========================================
+ 'client_id' => [
+ 'label' => 'Client',
+ 'rules' => 'required',
+ 'errors' => ['required' => 'Client selection is mandatory.']
+ ],
+ 'client_policy_id' => [
+ 'label' => 'Policy',
+ 'rules' => 'required',
+ 'errors' => ['required' => 'Please select the policy to endorse.']
+ ],
+ 'client_type' => ['rules' => 'permit_empty','errors' => []],
+ 'client_branch_id' => ['rules' => 'permit_empty','errors' => []],
+
+ // ==========================================
+ // 2. ENDORSEMENT SECTION
+ // ==========================================
+ 'action_type' => [
+ 'label' => 'Endorsement Type',
+ 'rules' => 'required',
+ 'errors' => ['required' => 'Select an Endorsement Type.']
+ ],
+ 'endorsement_no' => ['label' => 'Endorsement No','rules' => 'permit_empty|regex_match[/^[a-zA-Z0-9\/_-]+$/]',
+ 'errors' => [ 'regex_match' => 'Endorsement No can only contain letters, numbers, and symbols like / - or _' ]],
+ 'data_received_date' => [
+ 'label' => 'Data Received Date',
+ 'rules' => 'required|valid_date[d/m/Y]',
+ 'errors' => ['required' => 'Data Received Date is required.', 'valid_date' => 'Please provide a valid Data Received Date.']
+ ],
+ 'policy_issue_date' => [
+ 'label' => 'Endorsement Issue Date',
+ 'rules' => 'required|valid_date[d/m/Y]',
+ 'errors' => ['required' => 'Endorsement Issue Date is required.', 'valid_date' => 'Please provide a valid Endorsement Issue Date.']
+ ],
+ // ==========================================
+ // ENDORSEMENT SECTION
+ // ==========================================
+ 'month' => [
+ 'label' => 'Endorsement Issue Month',
+ 'rules' => 'required',
+ 'errors' => ['required' => 'Endorsement Issue Month (MM/YYYY) is required.']
+ ],
+ 'endorse_eff_date' => [
+ 'label' => 'Endorsement Effective Date',
+ 'rules' => 'permit_empty|valid_date[d/m/Y]',
+ 'errors' => ['valid_date' => 'Please provide a valid Endorsement Effective Date.']
+ ],
+ 'emp_count' => [
+ 'label' => 'No of Insured',
+ 'rules' => 'permit_empty|numeric',
+ 'errors' => ['numeric' => 'No of Insured must be a number.']
+ ],
+ 'dependent_count' => [
+ 'label' => 'No of Dependents',
+ 'rules' => 'permit_empty|numeric',
+ 'errors' => ['numeric' => 'No of Dependents must be a number.']
+ ],
+ 'last_action_date' => [
+ 'label' => 'Latest Action Date',
+ 'rules' => 'permit_empty|valid_date[d/m/Y]',
+ 'errors' => ['valid_date' => 'Please provide a valid Latest Action Date.']
+ ],
+ 'install_due_date' => [
+ 'label' => 'Installment Due Date',
+ 'rules' => 'permit_empty|valid_date[d/m/Y]',
+ 'errors' => ['valid_date' => 'Please provide a valid Installment Due Date.']
+ ],
+
+ // ==========================================
+ // PREMIUM DETAILS (ARRAY FIELDS .*)
+ // ==========================================
+ 'follow_insurer_id.*' => [
+ 'label' => 'Insurer',
+ 'rules' => 'required',
+ 'errors' => ['required' => 'Please select an Insurer.']
+ ],
+ 'calc_policy_issue_date.*' => [
+ 'label' => 'Premium Endorsement Issue Date',
+ 'rules' => 'required',
+ 'errors' => ['required' => 'Endorsement Issue Date is required.']
+ ],
+ 'co_share_per.*' => [
+ 'label' => 'Co-Share %',
+ 'rules' => 'permit_empty|decimal',
+ 'errors' => ['decimal' => 'Co-Share % must be a valid decimal.']
+ ],
+ 'base_premium.*' => [
+ 'label' => 'Base Premium',
+ 'rules' => 'required|numeric|differs[0]',
+ 'errors' => [
+ 'required' => 'Base Premium is required.',
+ 'numeric' => 'Base Premium must be a valid number.',
+ 'differs' => 'Base Premium cannot be zero; please enter a positive or negative value.'
+ ]
+ ],
+ 'total.*' => [
+ 'label' => 'Total Premium',
+ 'rules' => 'permit_empty|decimal',
+ 'errors' => ['decimal' => 'Total Premium must be a valid amount.'],
+ ],
+
+ // Decimal validation with Labels
+ 'non_comm_per_amt.*' => [
+ 'label' => 'Non-Comm Premium',
+ 'rules' => 'permit_empty|decimal',
+ 'errors' => ['decimal' => 'Non-Comm Premium must be numeric.']
+ ],
+ 'tp_premium.*' => [
+ 'label' => 'TP Premium',
+ 'rules' => 'permit_empty|decimal',
+ 'errors' => ['decimal' => 'TP Premium must be numeric.']
+ ],
+ 'ter_premium.*' => [
+ 'label' => 'TEP Premium',
+ 'rules' => 'permit_empty|decimal',
+ 'errors' => ['decimal' => 'TEP Premium must be numeric.']
+ ],
+ 'co_premium.*' => [
+ 'label' => 'Co-Premium',
+ 'rules' => 'permit_empty|decimal',
+ 'errors' => ['decimal' => 'Co-Premium must be numeric.']
+ ],
+ 'co_tp_premium.*' => [
+ 'label' => 'Co-TP Premium',
+ 'rules' => 'permit_empty|decimal',
+ 'errors' => ['decimal' => 'Co-TP Premium must be numeric.']
+ ],
+ 'co_ter_premium.*' => [
+ 'label' => 'Co-TEP Premium',
+ 'rules' => 'permit_empty|decimal',
+ 'errors' => ['decimal' => 'Co-TEP Premium must be numeric.']
+ ],
+ 'cgst.*' => [
+ 'label' => 'CGST',
+ 'rules' => 'permit_empty|decimal',
+ 'errors' => ['decimal' => 'CGST must be numeric.']
+ ],
+ 'sgst.*' => [
+ 'label' => 'SGST',
+ 'rules' => 'permit_empty|decimal',
+ 'errors' => ['decimal' => 'SGST must be numeric.']
+ ],
+ 'igst.*' => [
+ 'label' => 'IGST',
+ 'rules' => 'permit_empty|decimal',
+ 'errors' => ['decimal' => 'IGST must be numeric.']
+ ],
+ 'gst_amount.*' => [
+ 'label' => 'GST Amount',
+ 'rules' => 'permit_empty|decimal|greater_than[0]',
+ 'errors' => ['decimal' => 'GST Amount must be numeric.','greater_than' => 'GST Amount cannot be zero; please enter a value greater than 0.']
+ ],
+ 'stamp_duty.*' => [
+ 'label' => 'Stamp Duty',
+ 'rules' => 'permit_empty|decimal',
+ 'errors' => ['decimal' => 'Stamp Duty must be numeric.']
+ ],
+ 'agreed_bp.*' => [
+ 'label' => 'Agreed BP %',
+ 'rules' => 'permit_empty|decimal',
+ 'errors' => ['decimal' => 'Agreed BP % must be numeric.']
+ ],
+ 'agreed_tp.*' => [
+ 'label' => 'Agreed TP %',
+ 'rules' => 'permit_empty|decimal',
+ 'errors' => ['decimal' => 'Agreed TP % must be numeric.']
+ ],
+ 'agreed_ter.*' => [
+ 'label' => 'Agreed TEP %',
+ 'rules' => 'permit_empty|decimal',
+ 'errors' => ['decimal' => 'Agreed TEP % must be numeric.']
+ ],
+ 'agreed_amount.*' => [
+ 'label' => 'Agreed Amount',
+ 'rules' => 'permit_empty|decimal',
+ 'errors' => ['decimal' => 'Agreed Amount must be numeric.']
+ ],
+
+ // Finance/Management Specific Labels
+ 'actual_bp_amt.*' => [
+ 'label' => 'Actual BP Amount',
+ 'rules' => 'permit_empty|decimal',
+ 'errors' => ['decimal' => 'Actual BP Amount must be numeric.']
+ ],
+ 'actual_tp_amt.*' => [
+ 'label' => 'Actual TP Amount',
+ 'rules' => 'permit_empty|decimal',
+ 'errors' => ['decimal' => 'Actual TP Amount must be numeric.']
+ ],
+ 'actual_tep_amt.*' => [
+ 'label' => 'Actual TEP Amount',
+ 'rules' => 'permit_empty|decimal',
+ 'errors' => ['decimal' => 'Actual TEP Amount must be numeric.']
+ ],
+ 'actual_bp_per.*' => [
+ 'label' => 'Actual BP %',
+ 'rules' => 'permit_empty|decimal',
+ 'errors' => ['decimal' => 'Actual BP % must be numeric.']
+ ],
+ 'actual_tp_per.*' => [
+ 'label' => 'Actual TP %',
+ 'rules' => 'permit_empty|decimal',
+ 'errors' => ['decimal' => 'Actual TP % must be numeric.']
+ ],
+ 'actual_tep_per.*' => [
+ 'label' => 'Actual TEP %',
+ 'rules' => 'permit_empty|decimal',
+ 'errors' => ['decimal' => 'Actual TEP % must be numeric.']
+ ],
+ 'actual_bp_brokerage_amt.*' => [
+ 'label' => 'BP Remuneration',
+ 'rules' => 'permit_empty|decimal',
+ 'errors' => ['decimal' => 'BP Remuneration must be numeric.']
+ ],
+ 'actual_tp_brokerage_amt.*' => [
+ 'label' => 'TP Remuneration',
+ 'rules' => 'permit_empty|decimal',
+ 'errors' => ['decimal' => 'TP Remuneration must be numeric.']
+ ],
+ 'actual_tep_brokerage_amt.*' => [
+ 'label' => 'TEP Remuneration',
+ 'rules' => 'permit_empty|decimal',
+ 'errors' => ['decimal' => 'TEP Remuneration must be numeric.']
+ ],
+ 'exp_amt.*' => [
+ 'label' => 'Expected Amount',
+ 'rules' => 'permit_empty|decimal',
+ 'errors' => ['decimal' => 'Expected Amount must be numeric.']
+ ],
+ 'co_share_type.*' => ['label' => 'Is Leader', 'rules' => 'permit_empty','errors' => []],
+ 'follower_policy_no.*' => ['label' => 'Follower Policy No', 'rules' => 'permit_empty','errors' => []],
+ 'co_share_id.*' => ['label' => 'Record ID', 'rules' => 'permit_empty','errors' => []],
+ ];
+
+ if (!$this->validate($rules)) {
+ return $this->response->setStatusCode(400)->setJSON([
+ 'status' => false,
+ 'message' => 'Input validation failed',
+ 'code' => 400,
+ 'errors' => $this->validator->getErrors()
+ ]);
+ }
+
$data = $this->preparePolicyTransactionData();
+
+ $id = (isset($data['id']) && !empty($data['id'])) ? $data['id'] : null;
+
$data['status'] = 'completed';
- $id = $data['id'] ?? null;
- // print_r($data); die;
if (!$id) {
return $this->insertEndorsementTransaction($data);
} else {
return $this->updateEndorsementTransaction($id, $data);
}
+
}
private function preparePolicyTransactionData()
diff --git a/app/Controllers/TicketController.php b/app/Controllers/TicketController.php
index 9b2c1771..6f69ed45 100644
--- a/app/Controllers/TicketController.php
+++ b/app/Controllers/TicketController.php
@@ -952,6 +952,13 @@ class TicketController extends BaseController
{
// $ticket_data = $this->ticketMasterModel->where('id', $ticket_id)->where('is_active', 1)->first();
$ticket_data = $this->ticketMasterModel->getTicketDataByTicketID($ticket_id);
+
+
+ // Security Check: Verify if record exists
+ if (empty($ticket_data)) {
+ // Redirect or show a 404 to prevent "Undefined array key" errors
+ return redirect()->to(base_url('ticket/list'))->with('error', 'Ticket not found');
+ }
$ticket_data = $this->formatDateForClaim($ticket_data, 'd/m/Y');
@@ -1120,117 +1127,197 @@ class TicketController extends BaseController
public function createTicket()
{
- $rules = [
- 'emp_code' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Employee Code is required']
- ],
+ $request_data = $this->request->getPost();
+ $selected_ticket_type = $this->request->getPost('ticket_type_id');
- 'emp_name' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Employee Name is required']
- ],
+ // 1. Initialize an empty rules array
+ $rules = [];
+ if ($selected_ticket_type == 1 || $selected_ticket_type == 72) {
+ $rules = [
+ // --- EMPLOYEE DETAILS ---
+ 'emp_code' => ['label' => 'Employee Code','rules' => 'required|alpha_numeric_space',
+ 'errors' => ['required' => 'Employee Code is required']
+ ],
+ 'emp_name' => ['label' => 'Employee Name','rules' => 'required|min_length[3]',
+ 'errors' => ['required' => 'Employee Name is required','min_length' => 'Employee Name must be at least 3 characters long']
+ ],
+ 'insured_name' => ['label' => 'Insured Name','rules' => 'required',
+ 'errors' => ['required' => 'Insured Name is required']
+ ],
+ 'relationship' => ['label' => 'Relationship','rules' => 'required',
+ 'errors' => ['required' => 'Please select a Relationship']
+ ],
+ 'policy_no' => ['label' => 'Policy No','rules' => 'permit_empty','errors' => []],
+ 'tpa_no' => ['label' => 'TPA ID','rules' => 'permit_empty','errors' => []],
+ 'emp_mobile' => ['label' => 'Employee Mobile No','rules' => 'required|numeric|exact_length[10]',
+ 'errors' => [
+ 'required' => 'Mobile number is required',
+ 'numeric' => 'Mobile must contain only numbers',
+ 'exact_length' => 'Mobile must be exactly 10 digits'
+ ]
+ ],
+ 'emp_mail' => ['label' => 'Employee Mail ID','rules' => 'required|valid_email',
+ 'errors' => ['required' => 'Employee Email is required','valid_email' => 'Please provide a valid email address']
+ ],
+ 'emp_personal_mail' => ['label' => 'Personal Mail ID','rules' => 'permit_empty|valid_email',
+ 'errors' => ['valid_email' => 'Personal email format is invalid']
+ ],
+ 'client_policy_id' => ['label' => 'Policy','rules' => 'required',
+ 'errors' => ['required' => 'Please select a Policy']
+ ],
+ 'acm_id' => ['label' => 'Account Manager','rules' => 'required',
+ 'errors' => ['required' => 'Select an Account Manager']
+ ],
- 'insured_name' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Insured Name is required']
- ],
+ // --- CLAIM DETAILS ---
+ 'claim_status_id' => ['label' => 'Status','rules' => 'required',
+ 'errors' => ['required' => 'Claim Status is required']
+ ],
+ 'priority' => ['label' => 'Priority','rules' => 'required',
+ 'errors' => ['required' => 'Priority is required']
+ ],
+ 'mode_of_intimation' => ['label' => 'Mode of Submission','rules' => 'required',
+ 'errors' => ['required' => 'Mode of Submission is required']
+ ],
+ 'claim_type' => ['label' => 'Claim Type','rules' => 'required',
+ 'errors' => ['required' => 'Claim Type is required']
+ ],
+ 'hospital_name' => ['label' => 'Hospital Name','rules' => 'required',
+ 'errors' => ['required' => 'Hospital Name is required']
+ ],
+ 'hospital_address' => ['label' => 'Hospital Address','rules' => 'required',
+ 'errors' => ['required' => 'Hospital Address is required']
+ ],
+ 'hospital_city' => ['label' => 'Hospital City','rules' => 'required',
+ 'errors' => ['required' => 'City is required']
+ ],
+ 'hospital_state' => ['label' => 'Hospital State','rules' => 'required',
+ 'errors' => ['required' => 'State is required']
+ ],
+ 'hospital_pin_code' => ['label' => 'Hospital Pincode','rules' => 'required|numeric|exact_length[6]',
+ 'errors' => ['exact_length' => 'Pincode must be 6 digits']
+ ],
+ 'hospital_phone_no' => ['label' => 'Hospital Phone','rules' => 'required|numeric|min_length[10]',
+ 'errors' => ['min_length' => 'Phone number too short']
+ ],
+ 'doa' => ['label' => 'DOA', 'rules' => 'required',
+ 'errors' => ['required' => 'Date of Admission is required']
+ ],
+ 'dod' => [ 'label' => 'DOD', 'rules' => 'required',
+ 'errors' => ['required' => 'Date of Discharge is required']
+ ],
+ 'claim_amount' => [
+ 'label' => 'Claim Amount',
+ 'rules' => 'permit_empty|numeric',
+ 'errors' => ['numeric' => 'Claim Amount must contain only numbers.']
+ ],
+ 'pod_no' => ['label' => 'POD No','rules' => 'permit_empty','errors' => []],
- 'relationship' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Relationship is required']
- ],
+ // --- ADDITIONAL / CONDITIONAL FIELDS ---
+ 'claim_number' => ['label' => 'Claim Number','rules' => 'permit_empty|alpha_numeric_punct','errors' => ['alpha_numeric_punct' => 'Invalid Claim Number.']],
+ 'denial_date' => ['label' => 'Denial Date','rules' => 'permit_empty|regex_match[/^\d{2}\/\d{2}\/\d{4}$/]','errors' => ['regex_match' => 'Denial Date must be dd/mm/yyyy.']],
+ 'approved_amount' => ['label' => 'Approved Amount','rules' => 'permit_empty|numeric',
+ 'errors' => ['numeric' => 'Approved amount must be numeric']
+ ],
+ 'approved_date' => ['label' => 'Approved Date','rules' => 'permit_empty|regex_match[/^\d{2}\/\d{2}\/\d{4}$/]','errors' => ['regex_match' => 'Approved Date must be dd/mm/yyyy.']],
+ 'approved_letter' => ['label' => 'Approved Letter','rules' => 'permit_empty','errors' => []],
+ 'approved_description' => ['label' => 'Approved Description','rules' => 'permit_empty','errors' => []],
+ 'utr_details' => ['label' => 'UTR Details','rules' => 'permit_empty|alpha_numeric_punct','errors' => ['alpha_numeric_punct' => 'UTR Details contains invalid characters.']],
+ 'settled_date' => ['label' => 'Settled Date','rules' => 'permit_empty|regex_match[/^\d{2}\/\d{2}\/\d{4}$/]','errors' => ['regex_match' => 'Settled Date must be dd/mm/yyyy.']],
+ 'settle_letter' => ['label' => 'Settle Letter','rules' => 'permit_empty','errors' => []],
+ 'pay_initiate_date' => ['label' => 'Payment Initiate Date','rules' => 'permit_empty|regex_match[/^\d{2}\/\d{2}\/\d{4}$/]','errors' => ['regex_match' => 'Payment Initiate Date must be dd/mm/yyyy.']],
+ 'cancel_remark' => ['label' => 'Cancel Remark','rules' => 'permit_empty','errors' => []],
+ 'return_remark' => ['label' => 'Return Remark','rules' => 'permit_empty','errors' => []],
+ 'awb_no_courier_name' => ['label' => 'AWB No','rules' => 'permit_empty','errors' => []],
+ 'non_id_reason' => ['label' => 'Non ID Reason','rules' => 'permit_empty','errors' => []],
+ 'client_id' => ['rules' => 'required','errors' => ['required' => 'Client ID is required']],
+ 'insurer_id' => ['rules' => 'required','errors' => ['required' => 'Insurer is required'],
+ 'si_amt' => [ 'label' => 'Sum Insured', 'rules' => 'permit_empty|numeric', 'errors' => ['numeric' => 'Sum Insured must be a valid number.']],
+ 'registration_date' => ['label' => 'Registration Date','rules' => 'permit_empty|regex_match[/^\d{2}\/\d{2}\/\d{4}$/]','errors' => ['regex_match' => 'Registration Date must be dd/mm/yyyy.']],
+ 'denial_reason' => ['label' => 'Denial Reason', 'rules' => 'permit_empty|string','errors' => ['string' => 'Invalid characters in Denial Reason.']],
+ ],
+ ];
+ } else if ($selected_ticket_type == 8) {
+ $rules = [
+ // --- GENERAL DETAILS ---
+ 'client_name' => ['label' => 'Client Name','rules' => 'required|is_not_list[0]',
+ 'errors' => [
+ 'required' => 'Please select a Client Name.',
+ 'is_not_list' => 'Please select a valid Client from the list.'
+ ]
+ ],
+ 'vehicle_id' => ['label' => 'Vehicle',
+ 'rules' => 'required',
+ 'errors' => [
+ 'required' => 'Vehicle selection is required.'
+ ]
+ ],
+ 'client_policy_id' => ['label' => 'Policy','rules' => 'required',
+ 'errors' => ['required' => 'Please select a Policy.',]
+ ],
+ 'insurer_id' => ['label' => 'Insurer ID','rules' => 'required',
+ 'errors' => ['required' => 'Insurer data is missing. Please re-select the policy.']
+ ],
+ 'emp_mobile' => ['label' => 'Mobile No','rules' => 'permit_empty|numeric|exact_length[10]',
+ 'errors' => ['numeric' => 'Mobile number must contain only digits.',
+ 'exact_length' => 'Mobile number must be exactly 10 digits.'
+ ]
+ ],
+ 'emp_mail' => ['label' => 'Mail ID','rules' => 'permit_empty|valid_email',
+ 'errors' => ['valid_email' => 'Please provide a valid email address format.']
+ ],
- 'emp_mobile' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Employee Mobile is required']
- ],
+ // --- CLAIM DETAILS ---
+ 'ticket_type_id' => ['label' => 'Policy Type','rules' => 'required','errors' => ['required' => 'Policy Type is required.']],
+ 'claim_status_id' => ['label' => 'Status','rules' => 'required','errors' => ['required' => 'Status is required.']],
- 'emp_mail' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Employee Email is required']
- ],
+ // --- HIDDEN KEYS (Integrity Checks) ---
+ 'ticket_master_id' => ['label' => 'Ticket Master ID','rules' => 'permit_empty','errors' => []],
+ 'client_id' => ['label' => 'Client ID','rules' => 'required','errors' => ['required' => 'System error: Client ID is missing.']]
+ ];
+ } else {
+ $rules = [
+ // --- EMPLOYEE DETAILS ---
+ 'emp_code' => ['label' => 'Employee ID', 'rules' => 'required',
+ 'errors' => ['required' => 'Employee Code is required']
+ ],
+ 'emp_name' => ['label' => 'Employee Name','rules' => 'required|min_length[3]',
+ 'errors' => ['required' => 'Employee Name is required','min_length' => 'Employee Name must be at least 3 characters long']
+ ],
+ 'emp_mobile' => ['label' => 'Mobile No','rules' => 'required|numeric|exact_length[10]',
+ 'errors' => [
+ 'required' => 'Mobile number is required',
+ 'numeric' => 'Mobile must be digits only',
+ 'exact_length' => 'Mobile must be exactly 10 digits'
+ ]
+ ],
+ 'emp_mail' => ['label' => 'Mail ID','rules' => 'required|valid_email',
+ 'errors' => ['required' => 'Official email is required','valid_email' => 'Please provide a valid official email']
+ ],
+ 'emp_personal_mail' => ['label' => 'Personal Mail','rules' => 'permit_empty|valid_email',
+ 'errors' => ['valid_email' => 'Personal email format is invalid']
+ ],
+ 'client_policy_id' => ['label' => 'Policy','rules' => 'required','errors' => ['required' => 'Please select a Policy']],
+ 'acm_id' => ['label' => 'Account Manager','rules' => 'required','errors' => ['required' => 'Account Manager must be selected']],
- 'client_id' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Client ID is required']
- ],
-
- 'insurer_id' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Insurer is required']
- ],
-
- 'client_policy_id' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Policy is required']
- ],
-
- 'claim_status_id' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Claim Status is required']
- ],
-
- 'priority' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Priority is required']
- ],
-
- 'mode_of_intimation' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Mode of Intimation is required']
- ],
-
- 'claim_type' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Claim Type is required']
- ],
-
- 'hospital_name' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Hospital Name is required']
- ],
-
- 'hospital_address' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Hospital Address is required']
- ],
-
- 'hospital_city' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Hospital City is required']
- ],
-
- 'hospital_state' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Hospital State is required']
- ],
-
- 'hospital_pin_code' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Hospital Pincode is required']
- ],
-
- 'hospital_phone_no' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Hospital Phone Number is required']
- ],
-
- 'doa' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Date of Admission is required']
- ],
-
- 'dod' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Date of Discharge is required']
- ],
-
- 'claim_amount' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Claim Amount is required']
- ],
- ];
+ // --- CLAIM DETAILS ---
+ 'claim_status_id' => ['label' => 'Status','rules' => 'required','errors' => ['required' => 'Claim status is required']],
+ 'claim_type' => ['label' => 'Claim Type','rules' => 'required','errors' => ['required' => 'Claim type is required']],
+ 'dob' => ['label' => 'Date of Birth','rules' => 'required','errors' => ['required' => 'Date of Birth is required']],
+ 'date_of_intimat' => ['label' => 'Date of Intimation','rules' => 'required','errors' => ['required' => 'Intimation date is required']],
+ 'si_amt' => ['label' => 'Sum Insured','rules' => 'required|numeric','errors' => ['numeric' => 'Sum insured must be a number']],
+ 'approved_amount' => ['label' => 'Approved Amount','rules' => 'permit_empty|numeric','errors' => ['numeric' => 'Approved amount must be numeric']],
+ 'approved_date' => ['label' => 'Approved Date','rules' => 'permit_empty|regex_match[/^\d{2}\/\d{2}\/\d{4}$/]','errors' => ['regex_match' => 'Approved Date must be dd/mm/yyyy.']],
+ 'approved_letter' => ['label' => 'Approved Letter','rules' => 'permit_empty','errors' => []],
+ 'approved_description' => ['label' => 'Approved Description','rules' => 'permit_empty','errors' => []],
+ 'utr_details' => ['label' => 'UTR Details','rules' => 'permit_empty|alpha_numeric_punct','errors' => ['alpha_numeric_punct' => 'UTR Details contains invalid characters.']],
+ 'settled_date' => ['label' => 'Settled Date','rules' => 'permit_empty|regex_match[/^\d{2}\/\d{2}\/\d{4}$/]','errors' => ['regex_match' => 'Settled Date must be dd/mm/yyyy.']],
+ 'settle_letter' => ['label' => 'Settle Letter','rules' => 'permit_empty','errors' => []],
+ 'pay_initiate_date' => ['label' => 'Payment Initiate Date','rules' => 'permit_empty|regex_match[/^\d{2}\/\d{2}\/\d{4}$/]','errors' => ['regex_match' => 'Payment Initiate Date must be dd/mm/yyyy.']],
+ 'cancel_remark' => ['label' => 'Cancel Remark','rules' => 'permit_empty','errors' => []],
+ 'return_remark' => ['label' => 'Return Remark','rules' => 'permit_empty','errors' => []],
+ ];
+ }
if (!$this->validate($rules)) {
return $this->response->setStatusCode(400)->setJSON([
@@ -1303,119 +1390,198 @@ class TicketController extends BaseController
public function updateTicket()
{
+
+ $request_data = $this->request->getPost();
+ $selected_ticket_type = $this->request->getPost('ticket_type_id');
- $rules = [
- 'emp_code' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Employee Code is required']
- ],
+ // 1. Initialize an empty rules array
+ $rules = [];
+ if ($selected_ticket_type == 1 || $selected_ticket_type == 72) {
+ $rules = [
+ // --- EMPLOYEE DETAILS ---
+ 'emp_code' => ['label' => 'Employee Code','rules' => 'required|alpha_numeric_space',
+ 'errors' => ['required' => 'Employee Code is required']
+ ],
+ 'emp_name' => ['label' => 'Employee Name','rules' => 'required|min_length[3]',
+ 'errors' => ['required' => 'Employee Name is required','min_length' => 'Employee Name must be at least 3 characters long']
+ ],
+ 'insured_name' => ['label' => 'Insured Name','rules' => 'required',
+ 'errors' => ['required' => 'Insured Name is required']
+ ],
+ 'relationship' => ['label' => 'Relationship','rules' => 'required',
+ 'errors' => ['required' => 'Please select a Relationship']
+ ],
+ 'policy_no' => ['label' => 'Policy No','rules' => 'permit_empty','errors' => []],
+ 'tpa_no' => ['label' => 'TPA ID','rules' => 'permit_empty','errors' => []],
+ 'emp_mobile' => ['label' => 'Employee Mobile No','rules' => 'required|numeric|exact_length[10]',
+ 'errors' => [
+ 'required' => 'Mobile number is required',
+ 'numeric' => 'Mobile must contain only numbers',
+ 'exact_length' => 'Mobile must be exactly 10 digits'
+ ]
+ ],
+ 'emp_mail' => ['label' => 'Employee Mail ID','rules' => 'required|valid_email',
+ 'errors' => ['required' => 'Employee Email is required','valid_email' => 'Please provide a valid email address']
+ ],
+ 'emp_personal_mail' => ['label' => 'Personal Mail ID','rules' => 'permit_empty|valid_email',
+ 'errors' => ['valid_email' => 'Personal email format is invalid']
+ ],
+ 'client_policy_id' => ['label' => 'Policy','rules' => 'required',
+ 'errors' => ['required' => 'Please select a Policy']
+ ],
+ 'acm_id' => ['label' => 'Account Manager','rules' => 'required',
+ 'errors' => ['required' => 'Select an Account Manager']
+ ],
- 'emp_name' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Employee Name is required']
- ],
+ // --- CLAIM DETAILS ---
+ 'claim_status_id' => ['label' => 'Status','rules' => 'required',
+ 'errors' => ['required' => 'Claim Status is required']
+ ],
+ 'priority' => ['label' => 'Priority','rules' => 'required',
+ 'errors' => ['required' => 'Priority is required']
+ ],
+ 'mode_of_intimation' => ['label' => 'Mode of Submission','rules' => 'required',
+ 'errors' => ['required' => 'Mode of Submission is required']
+ ],
+ 'claim_type' => ['label' => 'Claim Type','rules' => 'required',
+ 'errors' => ['required' => 'Claim Type is required']
+ ],
+ 'hospital_name' => ['label' => 'Hospital Name','rules' => 'required',
+ 'errors' => ['required' => 'Hospital Name is required']
+ ],
+ 'hospital_address' => ['label' => 'Hospital Address','rules' => 'required',
+ 'errors' => ['required' => 'Hospital Address is required']
+ ],
+ 'hospital_city' => ['label' => 'Hospital City','rules' => 'required',
+ 'errors' => ['required' => 'City is required']
+ ],
+ 'hospital_state' => ['label' => 'Hospital State','rules' => 'required',
+ 'errors' => ['required' => 'State is required']
+ ],
+ 'hospital_pin_code' => ['label' => 'Hospital Pincode','rules' => 'required|numeric|exact_length[6]',
+ 'errors' => ['exact_length' => 'Pincode must be 6 digits']
+ ],
+ 'hospital_phone_no' => ['label' => 'Hospital Phone','rules' => 'required|numeric|min_length[10]',
+ 'errors' => ['min_length' => 'Phone number too short']
+ ],
+ 'doa' => ['label' => 'DOA', 'rules' => 'required',
+ 'errors' => ['required' => 'Date of Admission is required']
+ ],
+ 'dod' => [ 'label' => 'DOD', 'rules' => 'required',
+ 'errors' => ['required' => 'Date of Discharge is required']
+ ],
+ 'claim_amount' => [
+ 'label' => 'Claim Amount',
+ 'rules' => 'permit_empty|numeric',
+ 'errors' => ['numeric' => 'Claim Amount must contain only numbers.']
+ ],
+ 'pod_no' => ['label' => 'POD No','rules' => 'permit_empty','errors' => []],
- 'insured_name' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Insured Name is required']
- ],
+ // --- ADDITIONAL / CONDITIONAL FIELDS ---
+ 'claim_number' => ['label' => 'Claim Number','rules' => 'permit_empty|alpha_numeric_punct','errors' => ['alpha_numeric_punct' => 'Invalid Claim Number.']],
+ 'denial_date' => ['label' => 'Denial Date','rules' => 'permit_empty|regex_match[/^\d{2}\/\d{2}\/\d{4}$/]','errors' => ['regex_match' => 'Denial Date must be dd/mm/yyyy.']],
+ 'approved_amount' => ['label' => 'Approved Amount','rules' => 'permit_empty|numeric',
+ 'errors' => ['numeric' => 'Approved amount must be numeric']
+ ],
+ 'approved_date' => ['label' => 'Approved Date','rules' => 'permit_empty|regex_match[/^\d{2}\/\d{2}\/\d{4}$/]','errors' => ['regex_match' => 'Approved Date must be dd/mm/yyyy.']],
+ 'approved_letter' => ['label' => 'Approved Letter','rules' => 'permit_empty','errors' => []],
+ 'approved_description' => ['label' => 'Approved Description','rules' => 'permit_empty','errors' => []],
+ 'utr_details' => ['label' => 'UTR Details','rules' => 'permit_empty|alpha_numeric_punct','errors' => ['alpha_numeric_punct' => 'UTR Details contains invalid characters.']],
+ 'settled_date' => ['label' => 'Settled Date','rules' => 'permit_empty|regex_match[/^\d{2}\/\d{2}\/\d{4}$/]','errors' => ['regex_match' => 'Settled Date must be dd/mm/yyyy.']],
+ 'settle_letter' => ['label' => 'Settle Letter','rules' => 'permit_empty','errors' => []],
+ 'pay_initiate_date' => ['label' => 'Payment Initiate Date','rules' => 'permit_empty|regex_match[/^\d{2}\/\d{2}\/\d{4}$/]','errors' => ['regex_match' => 'Payment Initiate Date must be dd/mm/yyyy.']],
+ 'cancel_remark' => ['label' => 'Cancel Remark','rules' => 'permit_empty','errors' => []],
+ 'return_remark' => ['label' => 'Return Remark','rules' => 'permit_empty','errors' => []],
+ 'awb_no_courier_name' => ['label' => 'AWB No','rules' => 'permit_empty','errors' => []],
+ 'non_id_reason' => ['label' => 'Non ID Reason','rules' => 'permit_empty','errors' => []],
+ 'client_id' => ['rules' => 'required','errors' => ['required' => 'Client ID is required']],
+ 'insurer_id' => ['rules' => 'required','errors' => ['required' => 'Insurer is required'],
+ 'si_amt' => [ 'label' => 'Sum Insured', 'rules' => 'permit_empty|numeric', 'errors' => ['numeric' => 'Sum Insured must be a valid number.']],
+ 'registration_date' => ['label' => 'Registration Date','rules' => 'permit_empty|regex_match[/^\d{2}\/\d{2}\/\d{4}$/]','errors' => ['regex_match' => 'Registration Date must be dd/mm/yyyy.']],
+ 'denial_reason' => ['label' => 'Denial Reason', 'rules' => 'permit_empty|string','errors' => ['string' => 'Invalid characters in Denial Reason.']],
+ ],
+ ];
+ } else if ($selected_ticket_type == 8) {
+ $rules = [
+ // --- GENERAL DETAILS ---
+ 'client_name' => ['label' => 'Client Name','rules' => 'required|is_not_list[0]',
+ 'errors' => [
+ 'required' => 'Please select a Client Name.',
+ 'is_not_list' => 'Please select a valid Client from the list.'
+ ]
+ ],
+ 'vehicle_id' => ['label' => 'Vehicle',
+ 'rules' => 'required',
+ 'errors' => [
+ 'required' => 'Vehicle selection is required.'
+ ]
+ ],
+ 'client_policy_id' => ['label' => 'Policy','rules' => 'required',
+ 'errors' => ['required' => 'Please select a Policy.',]
+ ],
+ 'insurer_id' => ['label' => 'Insurer ID','rules' => 'required',
+ 'errors' => ['required' => 'Insurer data is missing. Please re-select the policy.']
+ ],
+ 'emp_mobile' => ['label' => 'Mobile No','rules' => 'permit_empty|numeric|exact_length[10]',
+ 'errors' => ['numeric' => 'Mobile number must contain only digits.',
+ 'exact_length' => 'Mobile number must be exactly 10 digits.'
+ ]
+ ],
+ 'emp_mail' => ['label' => 'Mail ID','rules' => 'permit_empty|valid_email',
+ 'errors' => ['valid_email' => 'Please provide a valid email address format.']
+ ],
- 'relationship' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Relationship is required']
- ],
+ // --- CLAIM DETAILS ---
+ 'ticket_type_id' => ['label' => 'Policy Type','rules' => 'required','errors' => ['required' => 'Policy Type is required.']],
+ 'claim_status_id' => ['label' => 'Status','rules' => 'required','errors' => ['required' => 'Status is required.']],
- 'emp_mobile' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Employee Mobile is required']
- ],
-
- 'emp_mail' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Employee Email is required']
- ],
-
- 'client_id' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Client ID is required']
- ],
-
- 'insurer_id' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Insurer is required']
- ],
-
- 'client_policy_id' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Policy is required']
- ],
-
- 'claim_status_id' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Claim Status is required']
- ],
-
- 'priority' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Priority is required']
- ],
-
- 'mode_of_intimation' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Mode of Intimation is required']
- ],
-
- 'claim_type' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Claim Type is required']
- ],
-
- 'hospital_name' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Hospital Name is required']
- ],
-
- 'hospital_address' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Hospital Address is required']
- ],
-
- 'hospital_city' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Hospital City is required']
- ],
-
- 'hospital_state' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Hospital State is required']
- ],
-
- 'hospital_pin_code' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Hospital Pincode is required']
- ],
-
- 'hospital_phone_no' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Hospital Phone Number is required']
- ],
-
- 'doa' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Date of Admission is required']
- ],
-
- 'dod' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Date of Discharge is required']
- ],
-
- 'claim_amount' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Claim Amount is required']
- ],
- ];
+ // --- HIDDEN KEYS (Integrity Checks) ---
+ 'ticket_master_id' => ['label' => 'Ticket Master ID','rules' => 'permit_empty','errors' => []],
+ 'client_id' => ['label' => 'Client ID','rules' => 'required','errors' => ['required' => 'System error: Client ID is missing.']]
+ ];
+ } else {
+ $rules = [
+ // --- EMPLOYEE DETAILS ---
+ 'emp_code' => ['label' => 'Employee ID', 'rules' => 'required',
+ 'errors' => ['required' => 'Employee Code is required']
+ ],
+ 'emp_name' => ['label' => 'Employee Name','rules' => 'required|min_length[3]',
+ 'errors' => ['required' => 'Employee Name is required','min_length' => 'Employee Name must be at least 3 characters long']
+ ],
+ 'emp_mobile' => ['label' => 'Mobile No','rules' => 'required|numeric|exact_length[10]',
+ 'errors' => [
+ 'required' => 'Mobile number is required',
+ 'numeric' => 'Mobile must be digits only',
+ 'exact_length' => 'Mobile must be exactly 10 digits'
+ ]
+ ],
+ 'emp_mail' => ['label' => 'Mail ID','rules' => 'required|valid_email',
+ 'errors' => ['required' => 'Official email is required','valid_email' => 'Please provide a valid official email']
+ ],
+ 'emp_personal_mail' => ['label' => 'Personal Mail','rules' => 'permit_empty|valid_email',
+ 'errors' => ['valid_email' => 'Personal email format is invalid']
+ ],
+ 'client_policy_id' => ['label' => 'Policy','rules' => 'required','errors' => ['required' => 'Please select a Policy']],
+ 'acm_id' => ['label' => 'Account Manager','rules' => 'required','errors' => ['required' => 'Account Manager must be selected']],
+ // --- CLAIM DETAILS ---
+ 'claim_status_id' => ['label' => 'Status','rules' => 'required','errors' => ['required' => 'Claim status is required']],
+ 'claim_type' => ['label' => 'Claim Type','rules' => 'required','errors' => ['required' => 'Claim type is required']],
+ 'dob' => ['label' => 'Date of Birth','rules' => 'required','errors' => ['required' => 'Date of Birth is required']],
+ 'date_of_intimat' => ['label' => 'Date of Intimation','rules' => 'required','errors' => ['required' => 'Intimation date is required']],
+ 'si_amt' => ['label' => 'Sum Insured','rules' => 'required|numeric','errors' => ['numeric' => 'Sum insured must be a number']],
+ 'approved_amount' => ['label' => 'Approved Amount','rules' => 'permit_empty|numeric','errors' => ['numeric' => 'Approved amount must be numeric']],
+ 'approved_date' => ['label' => 'Approved Date','rules' => 'permit_empty|regex_match[/^\d{2}\/\d{2}\/\d{4}$/]','errors' => ['regex_match' => 'Approved Date must be dd/mm/yyyy.']],
+ 'approved_letter' => ['label' => 'Approved Letter','rules' => 'permit_empty','errors' => []],
+ 'approved_description' => ['label' => 'Approved Description','rules' => 'permit_empty','errors' => []],
+ 'utr_details' => ['label' => 'UTR Details','rules' => 'permit_empty|alpha_numeric_punct','errors' => ['alpha_numeric_punct' => 'UTR Details contains invalid characters.']],
+ 'settled_date' => ['label' => 'Settled Date','rules' => 'permit_empty|regex_match[/^\d{2}\/\d{2}\/\d{4}$/]','errors' => ['regex_match' => 'Settled Date must be dd/mm/yyyy.']],
+ 'settle_letter' => ['label' => 'Settle Letter','rules' => 'permit_empty','errors' => []],
+ 'pay_initiate_date' => ['label' => 'Payment Initiate Date','rules' => 'permit_empty|regex_match[/^\d{2}\/\d{2}\/\d{4}$/]','errors' => ['regex_match' => 'Payment Initiate Date must be dd/mm/yyyy.']],
+ 'cancel_remark' => ['label' => 'Cancel Remark','rules' => 'permit_empty','errors' => []],
+ 'return_remark' => ['label' => 'Return Remark','rules' => 'permit_empty','errors' => []],
+ ];
+ }
if (!$this->validate($rules)) {
return $this->response->setStatusCode(400)->setJSON([
'status' => false,
@@ -1424,8 +1590,7 @@ class TicketController extends BaseController
'errors' => $this->validator->getErrors()
]);
}
-
- $request_data = $this->request->getPost();
+
$sanitized_data = sanitizeInputArrayAdvanced($request_data);
$ticket_data = $this->formatDateForClaim($sanitized_data);
$ticket_id = $this->request->getPost('ticket_master_id');
@@ -1604,12 +1769,34 @@ class TicketController extends BaseController
}
}
} elseif ($action == 2) {
- $data = $this->request->getPost();
+ $request_data = $this->request->getPost();
+
+ $rules = [
+ 'note' => [
+ 'label' => 'Add Notes',
+ 'rules' => 'required|min_length[3]|max_length[1000]',
+ 'errors' => [
+ 'required' => 'The note field cannot be empty.',
+ 'min_length' => 'The note is too short (minimum 3 characters).',
+ 'max_length' => 'The note cannot exceed 1000 characters.'
+ ]
+ ],
+ ];
+
+ if (!$this->validate($rules)) {
+ return $this->response->setStatusCode(400)->setJSON([
+ 'status' => false,
+ 'message' => 'Input validation failed',
+ 'code' => 400,
+ 'errors' => $this->validator->getErrors()
+ ]);
+ }
+
+ $data = sanitizeInputArrayAdvanced($request_data);
// if (isset($data['id']) && $data['id'] != ''){
// print_rr($data);die();
$status = $this->ticketNoteModel->save($data);
$id = isset($data['id']) ? $data['id'] : $this->ticketNoteModel->insertID();
-
// }
if ($status) {
return $this->respond(['status' => true, 'id' => $id], 200);
@@ -1623,6 +1810,35 @@ class TicketController extends BaseController
{
$received_data = $this->request->getPost();
+ $rules = [
+ 'emp_mail' => [
+ 'label' => 'To',
+ 'rules' => 'required|valid_email',
+ 'errors' => ['required' => 'Recipient email is missing.','valid_email' => 'Please provide a valid email address for the recipient.']
+ ],
+ 'mail_subject' => [
+ 'label' => 'Subject',
+ 'rules' => 'required|min_length[5]',
+ 'errors' => [
+ 'required' => 'Please enter a Subject for the mail.',
+ 'min_length' => 'Subject should be at least 5 characters long.'
+ ]
+ ],
+ 'content' => [
+ 'label' => 'Mail Content',
+ 'rules' => 'required',
+ 'errors' => ['required' => 'You cannot send an empty mail.']
+ ]
+ ];
+
+ if (!$this->validate($rules)) {
+ return $this->response->setStatusCode(400)->setJSON([
+ 'status' => false,
+ 'message' => 'Input validation failed',
+ 'code' => 400,
+ 'errors' => $this->validator->getErrors()
+ ]);
+ }
// print_r($received_data); die;
$received_data['sender'] = 'staff';
$status = $this->ticketMessageModel->insert($received_data);
@@ -2773,7 +2989,45 @@ class TicketController extends BaseController
public function upload_url()
{
- $data = $this->request->getPost();
+
+ $request_data = $this->request->getPost();
+ $data = sanitizeInputArrayAdvanced($request_data);
+
+ $rules = [
+ 'ticket_id_url' => [
+ 'label' => 'Ticket ID URL',
+ 'rules' => 'required|numeric',
+ 'errors' => [
+ 'required' => 'System could not identify the Number.',
+ 'numeric' => 'Invalid format.'
+ ]
+ ],
+ 'docs_name.*' => [
+ 'label' => 'Required Documents',
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9_\- ]+$/]',
+ 'errors' => [
+ 'required' => 'Document Name is required',
+ 'regex_match' => 'Document Name can only contain letters, numbers, hyphens, and underscores'
+ ]
+ ],
+ 'url.*' => [
+ 'label' => 'URL',
+ 'rules' => 'required',
+ 'errors' => [
+ 'required' => 'URL is required',
+ ]
+ ]
+ ];
+
+ if (!$this->validate($rules)) {
+ return $this->response->setStatusCode(400)->setJSON([
+ 'status' => false,
+ 'message' => 'Input validation failed',
+ 'code' => 400,
+ 'errors' => $this->validator->getErrors()
+ ]);
+ }
+
$get_file_data = $this->request->getFiles('file_upload') ?? [];
$ticket_id = $data['ticket_id_url'];
@@ -3254,12 +3508,40 @@ class TicketController extends BaseController
}
// -------- END CLAIM DUMP UPLOAD ----------------------------------------------------------------------------------------------
-
-
public function saveIRDocsJson()
{
- $ticket_id = $this->request->getPost('ticket_id');
- $required_docs = $this->request->getPost('required_docs');
+ $request_data = $this->request->getPost();
+ $data = sanitizeInputArrayAdvanced($request_data);
+ $ticket_id = $data['ticket_id'];
+ $required_docs = $data['required_docs'];
+
+ $rules = [
+ 'ticket_id' => [
+ 'label' => 'Ticket ID',
+ 'rules' => 'required|numeric',
+ 'errors' => [
+ 'required' => 'System could not identify the Number.',
+ 'numeric' => 'Invalid format.'
+ ]
+ ],
+ 'required_docs' => [
+ 'label' => 'Required Documents',
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9_\- ]+$/]',
+ 'errors' => [
+ 'required' => 'Document Name is required',
+ 'regex_match' => 'Document Name can only contain letters, numbers, hyphens, and underscores'
+ ]
+ ]
+ ];
+
+ if (!$this->validate($rules)) {
+ return $this->response->setStatusCode(400)->setJSON([
+ 'status' => false,
+ 'message' => 'Input validation failed',
+ 'code' => 400,
+ 'errors' => $this->validator->getErrors()
+ ]);
+ }
if(empty($ticket_id)){
return $this->respond(['status' => false, 'code' => 404, 'message' => 'Failed to save Docs'], 200);
diff --git a/app/Views/UserList.php b/app/Views/UserList.php
index 674a0d95..571ddda9 100755
--- a/app/Views/UserList.php
+++ b/app/Views/UserList.php
@@ -1148,15 +1148,28 @@ table.dataTable tbody td {
console.error("Error Thrown:", error);
console.error("Status:", status);
if (xhr.status === 400) {
- let response = JSON.parse(xhr.responseText);
- if (response.errors) {
- $.each(response.errors, function (field, message) {
- toastr.warning(message, 'Validation Error');
- });
- } else {
- toastr.warning(response.message || 'Validation failed', 'Warning');
- }
- }else{toastr.error('Server error occurred.', 'Error');}
+ let response = JSON.parse(xhr.responseText);
+ let errorMessages = "";
+ let seenMessages = []; // Array to store unique messages
+ if (response.errors) {
+ $.each(response.errors, function (field, message) {
+ if (!seenMessages.includes(message)) {
+ errorMessages += `• ${message}
`;
+ seenMessages.push(message); // Mark this message as "seen"
+ }
+ });
+ toastr.error(errorMessages, 'Validation Error', { "allowHtml": true });
+ } else {
+ toastr.warning(response.message || 'Validation failed', 'Warning');
+ }
+ } else if (xhr.status === 403) {
+ let response = JSON.parse(xhr.responseText);
+ toastr.error(response.message, 'Security Policy');
+ } else if (xhr.status === 500) {
+ toastr.error('Something went wrong . Please try again later.', 'Server Error');
+ } else {
+ toastr.error('An unexpected error occurred. Please try again later.', 'Error');
+ }
}
});
@@ -1357,15 +1370,31 @@ table.dataTable tbody td {
error: function(xhr) {
console.log("Error: " + xhr.statusText);
if (xhr.status === 400) {
- let response = JSON.parse(xhr.responseText);
- if (response.errors) {
- $.each(response.errors, function (field, message) {
- toastr.warning(message, 'Validation Error');
- });
- } else {
- toastr.warning(response.message || 'Validation failed', 'Warning');
- }
- }else{toastr.error('Server error occurred.', 'Error');}
+ let response = JSON.parse(xhr.responseText);
+ let errorMessages = "";
+ let seenMessages = []; // Array to store unique messages
+ if (response.errors) {
+ $.each(response.errors, function (field, message) {
+ if (!seenMessages.includes(message)) {
+ errorMessages += `• ${message}
`;
+ seenMessages.push(message); // Mark this message as "seen"
+ }
+ });
+ toastr.error(errorMessages, 'Validation Error', { "allowHtml": true });
+ } else {
+ toastr.warning(response.message || 'Validation failed', 'Warning');
+ }
+
+ }else if (xhr.status === 403) {
+ let response = JSON.parse(xhr.responseText);
+ toastr.error(response.message, 'Security Policy');
+ } else if (xhr.status === 500) {
+ toastr.error('Something went wrong . Please try again later.', 'Server Error');
+ } else {
+ toastr.error('An unexpected error occurred. Please try again later.', 'Error');
+ }
+ console.error('Unexpected error:', xhr.responseText);
+
},
complete: function() {
btn.disabled = false;
@@ -1426,17 +1455,31 @@ table.dataTable tbody td {
},
error: function(xhr) {
console.log("Error: " + xhr.statusText);
- toastr.error('Server error occurred.', 'Error');
+ console.error(xhr.responseText);
if (xhr.status === 400) {
- let response = JSON.parse(xhr.responseText);
- if (response.errors) {
- $.each(response.errors, function (field, message) {
- toastr.warning(message, 'Validation Error');
- });
- } else {
- toastr.warning(response.message || 'Validation failed', 'Warning');
- }
- }else{toastr.error('Server error occurred.', 'Error');}
+ let response = JSON.parse(xhr.responseText);
+ let errorMessages = "";
+ let seenMessages = []; // Array to store unique messages
+ if (response.errors) {
+ $.each(response.errors, function (field, message) {
+ if (!seenMessages.includes(message)) {
+ errorMessages += `• ${message}
`;
+ seenMessages.push(message); // Mark this message as "seen"
+ }
+ });
+ toastr.error(errorMessages, 'Validation Error', { "allowHtml": true });
+ } else {
+ toastr.warning(response.message || 'Validation failed', 'Warning');
+ }
+
+ } else if (xhr.status === 403) {
+ let response = JSON.parse(xhr.responseText);
+ toastr.error(response.message, 'Security Policy');
+ } else if (xhr.status === 500) {
+ toastr.error('Something went wrong . Please try again later.', 'Server Error');
+ } else {
+ toastr.error('An unexpected error occurred. Please try again later.', 'Error');
+ }
},
complete: function() {
btn.disabled = false;
diff --git a/app/Views/add_image_list.php b/app/Views/add_image_list.php
index 113ce962..d79655f6 100755
--- a/app/Views/add_image_list.php
+++ b/app/Views/add_image_list.php
@@ -219,39 +219,42 @@ table.dataTable thead th {
}
},
error: function(xhr, status, error) {
- console.error(xhr.responseText);
- console.error('Status:', status);
- console.error('Error:', error);
+ // Get the current domain
+ const hostname = window.location.hostname;
+ if (hostname === 'localhost' || hostname === '127.0.0.1') {
+ // DEVELOPER MODE: Show everything in a nice group
+ console.group("%c Debug: Server Error ", "background: #222; color: #bada55; padding: 2px;");
+ console.error("Status:", xhr.status);
+ console.error("Type:", error);
+ console.error("Full Response:", xhr.responseText);
+ console.groupEnd();
+ } else {
+ // LIVE MODE: Only log a simple, non-revealing error
+ console.error("Server Error: Action could not be completed. Reference Code: " + xhr.responseText);
+ }
- let msg = 'Something went wrong. Please try again later.';
-
- switch (xhr.status) {
- case 400:
- let response = xhr.responseJSON || JSON.parse(xhr.responseText);
- if (response.errors) {
- $.each(response.errors, function (field, message) {
- toastr.warning(message, 'Validation Error');
- });
- } else {
- toastr.warning(response.message || 'Validation failed', 'Warning');
- }
- msg = response.message || 'Bad Request — Invalid input.';
- break;
- case 401:
- msg = 'Unauthorized — Please log in again.';
- break;
- case 403:
- msg = 'Forbidden — You do not have permission.';
- break;
- case 404:
- msg = 'Not Found — Requested URL or resource not found.';
- break;
- case 500:
- console.log('Internal Server Error — Please contact support.');
- msg = xhr.responseJSON?.message || xhr.responseText || msg;
- break;
- default:
- msg = xhr.responseJSON?.message || xhr.responseText || msg;
+ if (xhr.status === 400) {
+ let response = JSON.parse(xhr.responseText);
+ let errorMessages = "";
+ let seenMessages = []; // Array to store unique messages
+ if (response.errors) {
+ $.each(response.errors, function (field, message) {
+ if (!seenMessages.includes(message)) {
+ errorMessages += `• ${message}
`;
+ seenMessages.push(message); // Mark this message as "seen"
+ }
+ });
+ toastr.error(errorMessages, 'Validation Error', { "allowHtml": true });
+ } else {
+ toastr.warning(response.message || 'Validation failed', 'Warning');
+ }
+ } else if (xhr.status === 403) {
+ let response = JSON.parse(xhr.responseText);
+ toastr.error(response.message, 'Security Policy');
+ } else if (xhr.status === 500) {
+ toastr.error('Something went wrong . Please try again later.', 'Server Error');
+ } else {
+ toastr.error('An unexpected error occurred. Please try again later.', 'Error');
}
}
diff --git a/app/Views/bds_dump_file_list.php b/app/Views/bds_dump_file_list.php
index 0f7f1cd2..b8a39153 100644
--- a/app/Views/bds_dump_file_list.php
+++ b/app/Views/bds_dump_file_list.php
@@ -196,14 +196,29 @@
error: function(xhr, status, error) {
// Handle error response
console.error('Upload failed:', error);
- console.error('Upload failed:', error);
+ console.error('Unexpected error:', xhr.responseText);
if (xhr.status === 400) {
- var response = JSON.parse(xhr.responseText);
- toastr.warning(response.message || 'Validation failed', 'Warning');
- }
- if (xhr.status === 500) {
- var response = JSON.parse(xhr.responseText);
- toastr.warning(response.message || 'Validation failed', 'Warning');
+ let response = JSON.parse(xhr.responseText);
+ let errorMessages = "";
+ let seenMessages = []; // Array to store unique messages
+ if (response.errors) {
+ $.each(response.errors, function (field, message) {
+ if (!seenMessages.includes(message)) {
+ errorMessages += `• ${message}
`;
+ seenMessages.push(message); // Mark this message as "seen"
+ }
+ });
+ toastr.error(errorMessages, 'Validation Error', { "allowHtml": true });
+ } else {
+ toastr.warning(response.message || 'Validation failed', 'Warning');
+ }
+ } else if (xhr.status === 403) {
+ let response = JSON.parse(xhr.responseText);
+ toastr.error(response.message, 'Security Policy');
+ } else if (xhr.status === 500) {
+ toastr.error('Something went wrong . Please try again later.', 'Server Error');
+ } else {
+ toastr.error('An unexpected error occurred. Please try again later.', 'Error');
}
},
complete: function() {
diff --git a/app/Views/cd_master_add_modal.php b/app/Views/cd_master_add_modal.php
index 23ca8ce1..4cc06188 100644
--- a/app/Views/cd_master_add_modal.php
+++ b/app/Views/cd_master_add_modal.php
@@ -205,14 +205,27 @@
$('.loader').fadeOut();
$('.loader-mask').delay(350).fadeOut('slow');
if (xhr.status === 400) {
- let response = JSON.parse(xhr.responseText);
- if (response.errors) {
- $.each(response.errors, function (field, message) {
- toastr.warning(message, 'Validation Error');
- });
- } else {
- toastr.warning(response.message || 'Validation failed', 'Warning');
+ let response = JSON.parse(xhr.responseText);
+ let errorMessages = "";
+ let seenMessages = []; // Array to store unique messages
+ if (response.errors) {
+ $.each(response.errors, function (field, message) {
+ if (!seenMessages.includes(message)) {
+ errorMessages += `• ${message}
`;
+ seenMessages.push(message); // Mark this message as "seen"
}
+ });
+ toastr.error(errorMessages, 'Validation Error', { "allowHtml": true });
+ } else {
+ toastr.warning(response.message || 'Validation failed', 'Warning');
+ }
+ } else if (xhr.status === 403) {
+ let response = JSON.parse(xhr.responseText);
+ toastr.error(response.message, 'Security Policy');
+ } else if (xhr.status === 500) {
+ toastr.error('Something went wrong . Please try again later.', 'Server Error');
+ } else {
+ toastr.error('An unexpected error occurred. Please try again later.', 'Error');
}
toastr.error('An error occurred while adding the CD account number.', 'Error');
}
diff --git a/app/Views/claim_files_upload.php b/app/Views/claim_files_upload.php
index cd2b4368..7b9cd814 100644
--- a/app/Views/claim_files_upload.php
+++ b/app/Views/claim_files_upload.php
@@ -217,6 +217,29 @@
console.log("error in submission of url data");
console.error(xhr.responseText);
console.error(status, error);
+ if (xhr.status === 400) {
+ let response = JSON.parse(xhr.responseText);
+ let errorMessages = "";
+ let seenMessages = []; // Array to store unique messages
+ if (response.errors) {
+ $.each(response.errors, function (field, message) {
+ if (!seenMessages.includes(message)) {
+ errorMessages += `• ${message}
`;
+ seenMessages.push(message); // Mark this message as "seen"
+ }
+ });
+ toastr.error(errorMessages, 'Validation Error', { "allowHtml": true });
+ } else {
+ toastr.warning(response.message || 'Validation failed', 'Warning');
+ }
+ } else if (xhr.status === 403) {
+ let response = JSON.parse(xhr.responseText);
+ toastr.error(response.message, 'Security Policy');
+ } else if (xhr.status === 500) {
+ toastr.error('Something went wrong . Please try again later.', 'Server Error');
+ } else {
+ toastr.error('An unexpected error occurred. Please try again later.', 'Error');
+ }
},
complete : function(){
@@ -673,7 +696,30 @@
}, function(xhr, status, error) {
console.error('Error fetching data:', error);
console.error(xhr.responseText);
- toastr.error('An error occurred while saving docs.', 'Error');
+ if (xhr.status === 400) {
+ let response = JSON.parse(xhr.responseText);
+ let errorMessages = "";
+ let seenMessages = []; // Array to store unique messages
+ if (response.errors) {
+ $.each(response.errors, function (field, message) {
+ if (!seenMessages.includes(message)) {
+ errorMessages += `• ${message}
`;
+ seenMessages.push(message); // Mark this message as "seen"
+ }
+ });
+ toastr.error(errorMessages, 'Validation Error', { "allowHtml": true });
+ } else {
+ toastr.warning(response.message || 'Validation failed', 'Warning');
+ }
+ } else if (xhr.status === 403) {
+ let response = JSON.parse(xhr.responseText);
+ toastr.error(response.message, 'Security Policy');
+ } else if (xhr.status === 500) {
+ toastr.error('Something went wrong . Please try again later.', 'Server Error');
+ } else {
+ toastr.error('An unexpected error occurred. Please try again later.', 'Error');
+ }
+
});
}
diff --git a/app/Views/claim_mis_file_list.php b/app/Views/claim_mis_file_list.php
index 5d9304ef..56a7c04e 100644
--- a/app/Views/claim_mis_file_list.php
+++ b/app/Views/claim_mis_file_list.php
@@ -235,14 +235,29 @@
error: function(xhr, status, error) {
// Handle error response
console.error('Upload failed:', error);
- console.error('Upload failed:', error);
+ console.error('Unexpected error:', xhr.responseText);
if (xhr.status === 400) {
- var response = JSON.parse(xhr.responseText);
- toastr.warning(response.message || 'Validation failed', 'Warning');
- }
- if (xhr.status === 500) {
- var response = JSON.parse(xhr.responseText);
- toastr.warning(response.message || 'Validation failed', 'Warning');
+ let response = JSON.parse(xhr.responseText);
+ let errorMessages = "";
+ let seenMessages = []; // Array to store unique messages
+ if (response.errors) {
+ $.each(response.errors, function (field, message) {
+ if (!seenMessages.includes(message)) {
+ errorMessages += `• ${message}
`;
+ seenMessages.push(message); // Mark this message as "seen"
+ }
+ });
+ toastr.error(errorMessages, 'Validation Error', { "allowHtml": true });
+ } else {
+ toastr.warning(response.message || 'Validation failed', 'Warning');
+ }
+ } else if (xhr.status === 403) {
+ let response = JSON.parse(xhr.responseText);
+ toastr.error(response.message, 'Security Policy');
+ } else if (xhr.status === 500) {
+ toastr.error('Something went wrong . Please try again later.', 'Server Error');
+ } else {
+ toastr.error('An unexpected error occurred. Please try again later.', 'Error');
}
},
complete: function() {
diff --git a/app/Views/client_basic_info.php b/app/Views/client_basic_info.php
index 625efc1e..17722d1c 100755
--- a/app/Views/client_basic_info.php
+++ b/app/Views/client_basic_info.php
@@ -351,19 +351,28 @@ input:checked + .slider:before {
$submitButton.prop('disabled', false);
if (xhr.status === 400) {
let response = JSON.parse(xhr.responseText);
+ let errorMessages = "";
+ let seenMessages = []; // Array to store unique messages
if (response.errors) {
$.each(response.errors, function (field, message) {
- toastr.warning(message, 'Validation Error');
+ if (!seenMessages.includes(message)) {
+ errorMessages += `• ${message}
`;
+ seenMessages.push(message); // Mark this message as "seen"
+ }
});
+ toastr.error(errorMessages, 'Validation Error', { "allowHtml": true });
} else {
toastr.warning(response.message || 'Validation failed', 'Warning');
}
+ } else if (xhr.status === 403) {
+ let response = JSON.parse(xhr.responseText);
+ toastr.error(response.message, 'Security Policy');
} else if (xhr.status === 404) {
toastr.warning('Resource not found', 'Warning');
} else if (xhr.status === 500) {
- toastr.warning('Internal server error', 'Warning');
+ toastr.error('Something went wrong . Please try again later.', 'Server Error');
} else {
- toastr.warning('Unknown error occurred', 'Warning');
+ toastr.error('An unexpected error occurred. Please try again later.', 'Error');
}
}, 1000);
}
diff --git a/app/Views/client_branch.php b/app/Views/client_branch.php
index c9b1719d..97d8161a 100755
--- a/app/Views/client_branch.php
+++ b/app/Views/client_branch.php
@@ -558,19 +558,7 @@ $("#branch_form").submit(function(event) {
if(xhr.status === 409){
alert('The Current Branch is Already Existing..!!');
}
- // if (xhr.status === 400) {
- // let response = JSON.parse(xhr.responseText);
- // if (response.errors) {
- // let errorMessages = "";
- // $.each(response.errors, function (field, message) {
- // errorMessages += `• ${message}
`;
- // });
- // toastr.error(errorMessages, 'Validation Error', { "allowHtml": true });
- // } else {
- // toastr.warning(response.message || 'Validation failed', 'Warning');
- // }
- // }
- if (xhr.status === 400) {
+ else if (xhr.status === 400) {
let response = JSON.parse(xhr.responseText);
let errorMessages = "";
let seenMessages = []; // Array to store unique messages
@@ -587,6 +575,13 @@ $("#branch_form").submit(function(event) {
} else {
toastr.warning(response.message || 'Validation failed', 'Warning');
}
+ } else if (xhr.status === 403) {
+ let response = JSON.parse(xhr.responseText);
+ toastr.error(response.message, 'Security Policy');
+ } else if (xhr.status === 500) {
+ toastr.error('Something went wrong . Please try again later.', 'Server Error');
+ } else {
+ toastr.error('An unexpected error occurred. Please try again later.', 'Error');
}
}, 300);
},
diff --git a/app/Views/client_list.php b/app/Views/client_list.php
index 90bf5f3e..6594af87 100755
--- a/app/Views/client_list.php
+++ b/app/Views/client_list.php
@@ -378,55 +378,55 @@ $(document).ready(function()
`);
- $('#toggleButtons').on('change', function() {
- let type = $(this).is(':checked') ? 1 : 2;
- // $('div.col-6 h4').text(
- // $(this).is(':checked')
- // ? "GC Client List"
- // : "RC Client List"
- // );
- let url = '= base_url('client/typeList/') ?>' + type;
- $.ajax({
- url: url,
- method: 'GET',
- success: function(response) {
- if (response.status === "success" && Array.isArray(response.data)) {
- console.error("#CL 1 : ", response.data);
- renderRows(response.data);
- } else {
- console.error("#CL 2 : ", response.data);
- renderRows([]);
- }
- },
- error: function(xhr, status, error) {
- console.error("Error loading:", error);
- renderRows([]);
- }
- });
- });
+$('#toggleButtons').on('change', function() {
+ let type = $(this).is(':checked') ? 1 : 2;
+ let url = '= base_url('client/typeList/') ?>' + type;
+
+ $('.loader').fadeIn(); // Show loader during AJAX
+
+ $.ajax({
+ url: url,
+ method: 'GET',
+ success: function(response) {
+ $('.loader').fadeOut();
+ // Pass response.data directly to the function
+ if (response.status === "success") {
+ renderRows(response.data);
+ } else {
+ // If the structure is slightly different, pass the whole object
+ renderRows(response);
+ }
+ },
+ error: function(xhr, status, error) {
+ $('.loader').fadeOut();
+ console.error("Error loading:", error);
+ renderRows([]);
+ }
+ });
+});
})
- function renderRows(data) {
- table.clear();
- if (Array.isArray(data) && data.length) {
- data.forEach((row, index) => {
- // let clientrm = json_encode($client_rm)
- // let account_managers = "";
- //
- // clientrm.forEach(client => {
- // if (client.client_id == row.id) {
- // account_managers += client.account_manager + ", ";
- // }
- // });
- // account_managers = account_managers.replace(/,\s*$/, "");
- // if (account_managers === "") account_managers = "N/A";
+ function renderRows(incomingData) {
+
+ let actualList = [];
+ if (incomingData && incomingData.clientList) {
+ actualList = incomingData.clientList;
+ } else if (Array.isArray(incomingData)) {
+ actualList = incomingData;
+ }
+
+ table.clear();
+
+ if (actualList.length > 0) {
+ actualList.forEach((row, index) => {
+
let rowData = [
index + 1,
`${row.client_name} (${row.short_name})`,
- row.account_managers,
+ row.account_managers || "N/A",
`