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 = '' + 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 = '' + 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", ` diff --git a/app/Views/frontend_content_list.php b/app/Views/frontend_content_list.php index b90f8869..71f8e0ed 100644 --- a/app/Views/frontend_content_list.php +++ b/app/Views/frontend_content_list.php @@ -450,17 +450,31 @@ error: function () { $('.loader, .loader-mask').fadeOut(); 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("Something went wrong!", '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'); + } + } }); } diff --git a/app/Views/insurer_basic_info.php b/app/Views/insurer_basic_info.php index f553b093..fa13a529 100755 --- a/app/Views/insurer_basic_info.php +++ b/app/Views/insurer_basic_info.php @@ -264,16 +264,29 @@ input:checked + .slider:before { console.error(status, error); $('.loader').fadeOut(); $('.loader-mask').delay(350).fadeOut('slow'); - console.log('Something Wrong!', 'warning'); 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'); } } }); diff --git a/app/Views/insurer_export_templete.php b/app/Views/insurer_export_templete.php index 5ad3bdc0..bac14afc 100755 --- a/app/Views/insurer_export_templete.php +++ b/app/Views/insurer_export_templete.php @@ -323,35 +323,31 @@ console.error('Response headers:', xhr.getAllResponseHeaders()); console.error('Response URL:', xhr.responseURL); - // Handle validation errors (CI4) - if (xhr.status === 400) { - - let response = null; - - try { - response = JSON.parse(xhr.responseText); - } catch (e) { - toastr.error('Invalid server response', 'Error'); - return; - } - - if (response.errors) { - $.each(response.errors, function (field, message) { - toastr.warning(message, 'Validation Error'); - }); - } else { - toastr.warning(response.message || 'Validation failed', 'Warning'); - } - - return; - } - - // Handle server errors - if (xhr.status >= 500) { - toastr.error('Server error. Please try again later.', 'Error'); - return; - } + 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'); + } + // Fallback toastr.error('Unexpected error occurred.', 'Error'); }, diff --git a/app/Views/kyc_docs.php b/app/Views/kyc_docs.php index 385817c2..1efa8204 100755 --- a/app/Views/kyc_docs.php +++ b/app/Views/kyc_docs.php @@ -255,16 +255,27 @@ $(document).ready(function () { $('.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 { + toastr.error('An unexpected error occurred. Please try again later.', 'Error'); } - toastr.warning('Something Wrong!', 'Warning'); }, 1000); } }); @@ -307,16 +318,27 @@ $(document).ready(function () { $('.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'); - } - } - toastr.warning('Something Wrong!', '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 { + toastr.error('An unexpected error occurred. Please try again later.', 'Error'); + } }, 1000); } }); diff --git a/app/Views/leads_form.php b/app/Views/leads_form.php index 44ca3949..ef30ba59 100644 --- a/app/Views/leads_form.php +++ b/app/Views/leads_form.php @@ -1697,20 +1697,45 @@ }, error: function(xhr, status, error) { - console.error(xhr.responseText); - console.error(status, error); + 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); + } + $('.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'); - }); + 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.warning(response.message || 'Validation failed', 'Warning'); + toastr.error('An unexpected error occurred. Please try again later.', 'Error'); } - } } }); }); diff --git a/app/Views/leads_non_eb.php b/app/Views/leads_non_eb.php index 8b61fc90..8f5a82f8 100644 --- a/app/Views/leads_non_eb.php +++ b/app/Views/leads_non_eb.php @@ -629,23 +629,29 @@ $('.loader').fadeOut(); $('.loader-mask').delay(350).fadeOut('slow'); 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) { - // Only add the message if it hasn't been seen before - if (!seenMessages.includes(message)) { - errorMessages += `• ${message}
`; - seenMessages.push(message); // Mark this message as "seen" - } - }); + 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'); + } - toastr.error(errorMessages, 'Validation Error', { "allowHtml": true }); + } 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.warning(response.message || 'Validation failed', 'Warning'); + toastr.error('An unexpected error occurred. Please try again later.', 'Error'); } - } } }); }); diff --git a/app/Views/nhance_branch_list.php b/app/Views/nhance_branch_list.php index d91db327..7dc6f819 100644 --- a/app/Views/nhance_branch_list.php +++ b/app/Views/nhance_branch_list.php @@ -279,20 +279,45 @@ $('.loader-mask').delay(350).fadeOut('slow'); }, function(xhr, status, error) { - console.error('Error fetching data:', error); - console.error(xhr.responseText); - $('.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'); - } - } + $('.loader').fadeOut(); + $('.loader-mask').delay(350).fadeOut('slow'); + // 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 Text: " + xhr.responseText); + } + 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/policy_transaction_endorsement_form.php b/app/Views/policy_transaction_endorsement_form.php index 0e15e129..4b4ab0ba 100644 --- a/app/Views/policy_transaction_endorsement_form.php +++ b/app/Views/policy_transaction_endorsement_form.php @@ -913,6 +913,29 @@ console.error(status, error); $('.loader').fadeOut(); $('.loader-mask').delay(350).fadeOut('slow'); + 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/policy_transaction_inception_form.php b/app/Views/policy_transaction_inception_form.php index 2fd4092b..7a9c9489 100644 --- a/app/Views/policy_transaction_inception_form.php +++ b/app/Views/policy_transaction_inception_form.php @@ -4098,6 +4098,31 @@ console.error(status, error); $('.loader').fadeOut(); $('.loader-mask').delay(350).fadeOut('slow'); + setTimeout(function() { + 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'); + } + }, 1000); } }); }); diff --git a/app/Views/pos_list.php b/app/Views/pos_list.php index d94e45c2..500fbdfa 100644 --- a/app/Views/pos_list.php +++ b/app/Views/pos_list.php @@ -361,18 +361,34 @@ } $('.loader, .loader-mask').fadeOut(); }, - error: function () { + error: function (xhr) { $('.loader, .loader-mask').fadeOut(); - 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'); - } - } + 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'); + } + console.error('Unexpected error:', xhr.responseText); + } }); } diff --git a/app/Views/retail_endorsement_list.php b/app/Views/retail_endorsement_list.php index 97a163a3..67ad9fce 100755 --- a/app/Views/retail_endorsement_list.php +++ b/app/Views/retail_endorsement_list.php @@ -273,6 +273,15 @@ }); + $(document).on('click', '.emp_data_model', function() { + + var id = $(this).attr('data-id'); + var eno = $(this).attr('data-eno'); + var status = $(this).attr('data-status'); + + fetchRetailEndorsementData(id, eno, status); + }); + function submitRetailEndorsement(e) { e.preventDefault(); // stop normal form submit var form = document.getElementById("retailEndorsementForm"); @@ -310,18 +319,31 @@ } }, error: function(xhr) { - toastr.error("Something went wrong!", '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'); - } - } + 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/rto_master_list.php b/app/Views/rto_master_list.php index 3c8c912a..b872d8be 100644 --- a/app/Views/rto_master_list.php +++ b/app/Views/rto_master_list.php @@ -244,15 +244,29 @@ $('.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'); + } }); } diff --git a/app/Views/test_members_list.php b/app/Views/test_members_list.php index 2a618e2b..5dc58646 100644 --- a/app/Views/test_members_list.php +++ b/app/Views/test_members_list.php @@ -717,14 +717,20 @@ document.addEventListener("DOMContentLoaded", function () { } 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{ toastr.warning('Error uploading file', 'Warning'); } // toastr.warning('Error uploading file', 'Warning'); diff --git a/app/Views/thz_list.php b/app/Views/thz_list.php index 0ee4c871..d055fe91 100644 --- a/app/Views/thz_list.php +++ b/app/Views/thz_list.php @@ -506,18 +506,31 @@ beccause = dataTables_length and dataTables_paginate need in same line thats why } }, error: function(xhr) { - 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("Something went wrong!", 'Error');} console.error(xhr.responseText); + 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() { btn.disabled = false; diff --git a/app/Views/thz_notes.php b/app/Views/thz_notes.php index 914eb751..194ed82d 100644 --- a/app/Views/thz_notes.php +++ b/app/Views/thz_notes.php @@ -571,17 +571,31 @@ data-backdrop="static" } }, error: function(xhr) { - 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("Something went wrong!", 'Error'); } console.error(xhr.responseText); + 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() { btn.disabled = false; @@ -628,19 +642,31 @@ data-backdrop="static" } }, error: function(xhr) { - 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("Something went wrong!", 'Error'); console.error(xhr.responseText); - } + 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() { btn.disabled = false;} }); diff --git a/app/Views/ticket_edit_onbording.php b/app/Views/ticket_edit_onbording.php index 35df8a96..45eabbc3 100644 --- a/app/Views/ticket_edit_onbording.php +++ b/app/Views/ticket_edit_onbording.php @@ -264,6 +264,30 @@ // Hide loader $('.loader').fadeOut(); $('.loader-mask').delay(350).fadeOut('slow'); + 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/ticket_form_handler.php b/app/Views/ticket_form_handler.php index 9b141783..d744931e 100644 --- a/app/Views/ticket_form_handler.php +++ b/app/Views/ticket_form_handler.php @@ -787,6 +787,31 @@ // Hide loader $('.loader').fadeOut(); $('.loader-mask').delay(350).fadeOut('slow'); + + 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/ticket_mail_template.php b/app/Views/ticket_mail_template.php index ba3cf875..00db4cb5 100644 --- a/app/Views/ticket_mail_template.php +++ b/app/Views/ticket_mail_template.php @@ -436,14 +436,29 @@ $('.loader-mask').delay(350).fadeOut('slow'); 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{toastr.error('Something Wrong!', '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'); + } + }, 1000); } }); diff --git a/app/Views/ticket_note.php b/app/Views/ticket_note.php index c92e5ec0..97c37331 100644 --- a/app/Views/ticket_note.php +++ b/app/Views/ticket_note.php @@ -79,17 +79,63 @@ $(document).ready(function() { $('.loader').fadeOut(); $('.loader-mask').delay(350).fadeOut('slow'); let message = response.message; - toastr.error(message, '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'); + } + } }, function(xhr, status, error) { console.error('Error fetching data:', error); console.error(xhr.responseText); - toastr.error('An error occurred while fetching the report page.', 'Error'); - $('.loader').fadeOut(); $('.loader-mask').delay(350).fadeOut('slow'); + 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/ticket_reply.php b/app/Views/ticket_reply.php index d83fcbf8..9a732b39 100644 --- a/app/Views/ticket_reply.php +++ b/app/Views/ticket_reply.php @@ -195,7 +195,30 @@ $(document).ready(function() { { $('.loader').fadeOut(); $('.loader-mask').delay(350).fadeOut('slow'); - toastr.error('Something Wrong!', 'warning'); + 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'); + } }, 1000); } }); diff --git a/app/Views/tpa_basic_info.php b/app/Views/tpa_basic_info.php index 4dce8a77..f258ff2d 100755 --- a/app/Views/tpa_basic_info.php +++ b/app/Views/tpa_basic_info.php @@ -331,14 +331,29 @@ // Handle validation errors (CI4) 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 === 500) { + toastr.error('Something went wrong . Please try again later.', 'Server Error'); + } else { + toastr.error('An unexpected error occurred. Please try again later.', 'Error'); } + }, 1000); } }); diff --git a/app/Views/tpa_branch.php b/app/Views/tpa_branch.php index c95dd734..f8e30273 100755 --- a/app/Views/tpa_branch.php +++ b/app/Views/tpa_branch.php @@ -479,16 +479,29 @@ $(document).ready(function () { $('.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'); - } - } - toastr.warning('Something Wrong!', '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'); + } }, 1000); }, complete: function() { diff --git a/app/Views/vehicle_details.php b/app/Views/vehicle_details.php index 3b57d4dd..466795de 100644 --- a/app/Views/vehicle_details.php +++ b/app/Views/vehicle_details.php @@ -248,21 +248,32 @@ $(document).ready(function() { $('.loader-mask').delay(350).fadeOut('slow'); $submitButton.prop('disabled', false); 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 === 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/vehicle_master_list.php b/app/Views/vehicle_master_list.php index d0ef7767..9ddf3e56 100644 --- a/app/Views/vehicle_master_list.php +++ b/app/Views/vehicle_master_list.php @@ -787,16 +787,30 @@ $("#vehicle_form").submit(function(event) { console.error(status, error); $('.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'); - } - } + 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/vehicle_type_master_list.php b/app/Views/vehicle_type_master_list.php index 984f4ecc..b06382b7 100755 --- a/app/Views/vehicle_type_master_list.php +++ b/app/Views/vehicle_type_master_list.php @@ -222,16 +222,30 @@ console.error(xhr.responseText); $('.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'); - } - } + 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'); + } }); }