diff --git a/app/Controllers/ClientController.php b/app/Controllers/ClientController.php
index ad3b28d1..2874c2cc 100755
--- a/app/Controllers/ClientController.php
+++ b/app/Controllers/ClientController.php
@@ -974,22 +974,28 @@ class ClientController extends AdminController
$rules = [
'entity_type_id' => [
- 'rules' => 'required',
+ 'rules' => 'required|numeric',
'errors' => [
'required' => 'Entity Type is required',
+ 'numeric' => 'Invalid Entity Type selected'
]
],
'client_name' => [
- 'rules' => 'required|alpha_space',
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9\s_-]+$/]|min_length[2]||max_length[45]',
'errors' => [
- 'required' => 'Client Name is required',
- 'alpha_space' => 'Client Name can only contain alphabets and spaces.',
+ 'required' => 'Client Name is required',
+ 'regex_match' => 'Client Name can only contain letters, numbers, spaces, hyphens(-), and underscores(_).',
+ 'min_length' => 'Client Name must be at least 2 characters.',
+ 'max_length' => 'Client Name must not exceed 45 characters.',
]
],
'short_name' => [
- 'rules' => 'required',
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9_-]+$/]|min_length[2]||max_length[15]',
'errors' => [
- 'required' => 'Client Short Name is required',
+ 'required' => 'Client Short Name is required',
+ 'regex_match' => 'Client Short Name can only contain letters, numbers, hyphens(-), and underscores(_) with no spaces.',
+ 'min_length' => 'Client Short Name must be at least 2 characters.',
+ 'max_length' => 'Client Short Name must not exceed 15 characters.',
]
],
'pan' => [
@@ -1145,7 +1151,7 @@ class ClientController extends AdminController
$this->myLogger->logme('error', 'Create Client KYC function called');
$rules = [
- 'other_docs_name.*' => [
+ 'other_docs_name' => [
'label' => 'Documents Name',
'rules' => 'permit_empty|regex_match[/^[a-zA-Z0-9_\- ]+$/]',
'errors' => [
@@ -1153,8 +1159,8 @@ class ClientController extends AdminController
]
],
- 'file_name.*' => [
- 'rules' => 'uploaded[file_name.*]|max_size[file_name.*,5120]|ext_in[file_name.*,pdf,jpg,jpeg,png]',
+ 'file_name' => [
+ 'rules' => 'uploaded[file_name]|max_size[file_name,5120]|ext_in[file_name,pdf,jpg,jpeg,png]',
'errors' => [
'uploaded' => 'KYC document file is required',
'max_size' => 'File size should not exceed 5MB',
@@ -1516,6 +1522,52 @@ class ClientController extends AdminController
$this->myLogger->logme('error', 'Client relation function called');
+ $rules = [
+ // --- Hidden Fields ---
+ 'PrimaryKey' => [
+ 'rules' => 'permit_empty|numeric',
+ ],
+ 'client_id' => [
+ 'rules' => 'required|numeric',
+ 'errors' => ['required' => 'Client ID is missing.']
+ ],
+
+ // --- Account Manager (Array Category) ---
+ // Note the .* which validates every item inside the multiple select array
+ 'account_manager' => [
+ 'rules' => 'required',
+ 'errors' => [
+ 'required' => 'Please select at least one Account Manager (L1).',
+ ]
+ ],
+
+ // --- Manager (L2) ---
+ 'manager' => [
+ 'rules' => 'required|numeric',
+ 'errors' => [
+ 'required' => 'Please select a Manager (L2).',
+ 'numeric' => 'Invalid Manager selection.'
+ ]
+ ],
+
+ // --- Head ---
+ 'head' => [
+ 'rules' => 'required|numeric',
+ 'errors' => [
+ 'required' => 'Please select a Head.',
+ 'numeric' => 'Invalid Head selection.'
+ ]
+ ],
+ ];
+ if (!$this->validate($rules)) {
+ return $this->response->setStatusCode(400)->setJSON([
+ 'status' => false,
+ 'message' => 'Input validation failed',
+ 'code' => 400,
+ 'errors' => $this->validator->getErrors()
+ ]);
+ }
+
$data['client_id'] = $this->request->getPost('client_id');
$data['created_by'] = get_session_userid();
$inserted = false;
@@ -1550,6 +1602,52 @@ class ClientController extends AdminController
public function editClientRelation()
{
$this->myLogger->logme('error', 'Client relation function called');
+ $rules = [
+ // --- Hidden Fields ---
+ 'PrimaryKey' => [
+ 'rules' => 'permit_empty|numeric',
+ ],
+
+ 'client_id' => [
+ 'rules' => 'required|numeric',
+ 'errors' => ['required' => 'Client ID is missing.']
+ ],
+
+ // --- Account Manager (Array Category) ---
+ // Note the .* which validates every item inside the multiple select array
+ 'account_manager' => [
+ 'rules' => 'required',
+ 'errors' => [
+ 'required' => 'Please select at least one Account Manager (L1).',
+ ]
+ ],
+
+ // --- Manager (L2) ---
+ 'manager' => [
+ 'rules' => 'required|numeric',
+ 'errors' => [
+ 'required' => 'Please select a Manager (L2).',
+ 'numeric' => 'Invalid Manager selection.'
+ ]
+ ],
+
+ // --- Head ---
+ 'head' => [
+ 'rules' => 'required|numeric',
+ 'errors' => [
+ 'required' => 'Please select a Head.',
+ 'numeric' => 'Invalid Head selection.'
+ ]
+ ],
+ ];
+ if (!$this->validate($rules)) {
+ return $this->response->setStatusCode(400)->setJSON([
+ 'status' => false,
+ 'message' => 'Input validation failed',
+ 'code' => 400,
+ 'errors' => $this->validator->getErrors()
+ ]);
+ }
$id = $this->request->getPost('PrimaryKey');
$data['client_id'] = $this->request->getPost('client_id');
@@ -1627,84 +1725,89 @@ class ClientController extends AdminController
$this->myLogger->logme('error', 'Client branch CREATE function called');
$rules = [
- 'branch_name' => [
- 'rules' => 'required',
- 'errors' => [
- 'required' => 'Branch Name is required',
- ]
- ],
- 'branch_code' => [
- 'rules' => 'required',
- 'errors' => [
- 'required' => 'Branch Code is required',
- ]
- ],
- 'address1' => [
- 'rules' => 'required',
- 'errors' => [
- 'required' => 'Address Line 1 is required',
- ]
- ],
- 'state' => [
- 'rules' => 'required',
- 'errors' => [
- 'required' => 'State is required',
- ]
- ],
- 'district' => [
- 'rules' => 'required',
- 'errors' => [
- 'required' => 'District is required.',
- ]
- ],
- 'city' => [
- 'rules' => 'required',
- 'errors' => [
- 'required' => 'City is required.',
- ]
- ],
- 'pincode' => [
- 'rules' => 'required',
- 'errors' => [
- 'required' => 'Pincode is required.',
- ]
- ],
- 'gst' => [
- 'rules' => 'required|regex_match[/^\d{2}[A-Z]{5}\d{4}[A-Z]{1}[A-Z\d]{1}Z[A-Z\d]{1}$/]',
- 'errors' => [
- 'required' => 'GST number is required',
- 'regex_match' => 'Invalid GST Number. Example: 12ABCDE1234F5Z6'
- ]
- ],
- 'name.*' => [
- 'rules' => 'required|alpha_space',
- 'errors' => [
- 'required' => 'Contact name is required',
- 'alpha_space' => 'Contact name may contain only letters and spaces'
- ]
- ],
- 'designation.*' => [
- 'rules' => 'required|alpha_space',
- 'errors' => [
- 'required' => 'Designation is required',
- 'alpha_space' => 'Designation may contain only letters and spaces'
- ]
- ],
- 'email.*' => [
- 'rules' => 'required|valid_email',
- 'errors' => [
- 'required' => 'Email is required',
- 'valid_email' => 'Please enter a valid email address'
- ]
- ],
- 'mobile.*' => [
- 'rules' => 'required|numeric|exact_length[10]',
- 'errors' => [
- 'required' => 'Mobile number is required',
- 'numeric' => 'Mobile number must contain digits only',
- 'exact_length' => 'Mobile number must be exactly 10 digits'
- ]
- ],
+ 'branch_name' => [
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9\s_-]+$/]|min_length[3]',
+ 'errors' => [
+ 'required' => 'Branch Name is required',
+ 'regex_match' => 'Branch Name can only contain letters, numbers, spaces, hyphens(-), and underscores(_).',
+ ]
+ ],
+ 'branch_code' => [
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9_-]+$/]',
+ 'errors' => [
+ 'required' => 'Branch Code is required',
+ 'regex_match' => 'Branch Code can only contain letters, numbers, hyphens(-), and underscores(_).',
+ ]
+ ],
+ 'address1' => [
+ 'rules' => 'required',
+ 'errors' => ['required' => 'Address Line 1 is required']
+ ],
+ 'address2' => [
+ 'rules' => 'permit_empty|string',
+ ],
+ 'state' => [
+ 'rules' => 'required|numeric',
+ 'errors' => ['required' => 'State is required']
+ ],
+ 'district' => [
+ 'rules' => 'required',
+ 'errors' => ['required' => 'District is required.']
+ ],
+ 'city' => [
+ 'rules' => 'required',
+ 'errors' => ['required' => 'City is required.']
+ ],
+ 'pincode' => [
+ 'rules' => 'required|numeric|exact_length[6]',
+ 'errors' => [
+ 'required' => 'Pincode is required.',
+ 'numeric' => 'Pincode must be numeric',
+ 'exact_length' => 'Pincode must be exactly 6 digits'
+ ]
+ ],
+ 'gst' => [
+ 'rules' => 'required|regex_match[/^\d{2}[A-Z]{5}\d{4}[A-Z]{1}[A-Z\d]{1}Z[A-Z\d]{1}$/]',
+ 'errors' => [
+ 'required' => 'GST number is required',
+ 'regex_match' => 'Invalid GST Number format.'
+ ]
+ ],
+ 'name.*' => [
+ 'rules' => 'required|alpha_space',
+ 'errors' => [
+ 'required' => 'Contact name is required',
+ 'alpha_space' => 'Contact name may contain only letters and spaces'
+ ]
+ ],
+ 'designation.*' => [
+ 'rules' => 'required|alpha_space',
+ 'errors' => [
+ 'required' => 'Designation is required',
+ 'alpha_space' => 'Designation may contain only letters and spaces'
+ ]
+ ],
+ 'email.*' => [
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/]',
+ 'errors' => [
+ 'required' => 'Email address is required.',
+ 'regex_match' => 'Please enter a valid email format (e.g., name@domain.com).'
+ ]
+ ],
+ 'mobile.*' => [
+ 'rules' => 'required|numeric|exact_length[10]',
+ 'errors' => [
+ 'required' => 'Mobile number is required',
+ 'numeric' => 'Mobile number must contain digits only',
+ 'exact_length' => 'Mobile number must be exactly 10 digits'
+ ]
+ ],
+ 'units.*' => [
+ 'rules' => 'permit_empty|numeric' // For the multiple select
+ ],
+ 'sez' => [
+ 'rules' => 'permit_empty' // For the checkbox
+ ]
];
if (!$this->validate($rules)) {
@@ -2080,11 +2183,11 @@ class ClientController extends AdminController
]
],
'email.*' => [
- 'rules' => 'required|valid_email',
- 'errors' => [
- 'required' => 'Email is required',
- 'valid_email' => 'Please enter a valid email address'
- ]
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/]',
+ 'errors' => [
+ 'required' => 'Email address is required.',
+ 'regex_match' => 'Please enter a valid email format (e.g., name@domain.com).'
+ ]
],
'mobile.*' => [
'rules' => 'required|numeric|exact_length[10]',
@@ -2382,6 +2485,92 @@ class ClientController extends AdminController
$request_post_data = $this->request->getPost();
$sanitized_post_data = sanitizeInputArrayAdvanced($request_post_data);
+ $rules = [
+ // --- BASIC SELECTS (Required) ---
+ 'client_branch_id' => [
+ 'rules' => 'required',
+ 'errors' => ['required' => 'Please select a Client Branch.']
+ ],
+ 'policy_type_id' => [
+ 'rules' => 'required|is_natural_no_zero',
+ 'errors' => [
+ 'required' => 'Policy Type is required.',
+ 'is_natural_no_zero' => 'Please select a valid Policy Type.'
+ ]
+ ],
+ 'insurer' => [
+ 'rules' => 'required',
+ 'errors' => ['required' => 'Please select an Insurer.']
+ ],
+ 'tpa' => [
+ 'rules' => 'required',
+ 'errors' => ['required' => 'Please select a TPA.']
+ ],
+
+ // --- TEXT FIELDS (Required & Specific Format) ---
+ 'policy_no' => [
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9\s_\-\/\\\]+$/]',
+ 'errors' => [
+ 'required' => 'This field is required.',
+ 'regex_match' => 'Only letters, numbers, spaces, _, -, /, and \ are allowed.'
+ ]
+ ],
+ 'gst' => [
+ 'rules' => 'required|numeric|greater_than_equal_to[0]|less_than_equal_to[100]',
+ 'errors' => [
+ 'required' => 'GST percentage is required.',
+ 'numeric' => 'GST must be a valid number.',
+ 'greater_than_equal_to' => 'GST cannot be negative.',
+ 'less_than_equal_to' => 'GST percentage cannot exceed 100%.'
+ ]
+ ],
+
+ // --- DATE FIELDS (Required) ---
+ 'policy_start_date' => [
+ 'rules' => 'required',
+ 'errors' => [
+ 'required' => 'Start date is required.',
+ ]
+ ],
+ 'policy_end_date' => [
+ 'rules' => 'required',
+ 'errors' => [
+ 'required' => 'End date is required.',
+ ]
+ ],
+
+ // --- PERMIT EMPTY FIELDS (Optional) ---
+ 'base_policy' => [
+ 'rules' => 'permit_empty'
+ ],
+ 'wellness_plan_id' => [
+ 'rules' => 'permit_empty|alpha_numeric',
+ 'errors' => [
+ 'alpha_numeric' => 'Wellness Plan ID can only contain letters and numbers (no spaces or special characters).'
+ ]
+ ],
+ 'wellness_vendor_id' => [
+ 'rules' => 'permit_empty'
+ ],
+ 'disclaimer' => [
+ 'rules' => 'permit_empty|string|min_length[5]',
+ 'errors' => ['min_length' => 'Disclaimer should be at least 5 characters long if provided.']
+ ],
+
+ // --- CHECKBOXES (Permit Empty) ---
+ 'enrolment_visibility' => ['rules' => 'permit_empty'],
+ 'is_lgbtq' => ['rules' => 'permit_empty']
+ ];
+
+ if (!$this->validate($rules)) {
+ return $this->response->setStatusCode(400)->setJSON([
+ 'status' => false,
+ 'message' => 'Input validation failed',
+ 'code' => 400,
+ 'errors' => $this->validator->getErrors()
+ ]);
+ }
+
$policy_type_id = $sanitized_post_data['policy_type_id'] ?? null;
$client_branch_id = $sanitized_post_data['client_branch_id'] ?? null;
$client_id = $sanitized_post_data['client_id'] ?? null;
@@ -2479,6 +2668,94 @@ class ClientController extends AdminController
/** here ci4 rules not implemented, because UI screen Fields are hide/show implemented thats why */
public function editClientPolicy()
{
+ $rules = [
+ // --- BASIC SELECTS (Required) ---
+ 'client_branch_id' => [
+ 'rules' => 'required',
+ 'errors' => ['required' => 'Please select a Client Branch.']
+ ],
+ 'policy_type_id' => [
+ 'rules' => 'required|is_natural_no_zero',
+ 'errors' => [
+ 'required' => 'Policy Type is required.',
+ 'is_natural_no_zero' => 'Please select a valid Policy Type.'
+ ]
+ ],
+ 'insurer' => [
+ 'rules' => 'required',
+ 'errors' => ['required' => 'Please select an Insurer.']
+ ],
+ 'tpa' => [
+ 'rules' => 'required',
+ 'errors' => ['required' => 'Please select a TPA.']
+ ],
+
+ // --- TEXT FIELDS (Required & Specific Format) ---
+ 'policy_no' => [
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9\s_\-\/\\\]+$/]',
+ 'errors' => [
+ 'required' => 'This field is required.',
+ 'regex_match' => 'Only letters, numbers, spaces, _, -, /, and \ are allowed.'
+ ]
+ ],
+ 'gst' => [
+ 'rules' => 'required|numeric|greater_than_equal_to[0]|less_than_equal_to[100]',
+ 'errors' => [
+ 'required' => 'GST percentage is required.',
+ 'numeric' => 'GST must be a valid number.',
+ 'greater_than_equal_to' => 'GST cannot be negative.',
+ 'less_than_equal_to' => 'GST percentage cannot exceed 100%.'
+ ]
+ ],
+
+ // --- DATE FIELDS (Required) ---
+ 'policy_start_date' => [
+ 'rules' => 'required|valid_date',
+ 'errors' => [
+ 'required' => 'Start date is required.',
+ 'valid_date' => 'Enter a valid date format (YYYY-MM-DD).'
+ ]
+ ],
+ 'policy_end_date' => [
+ 'rules' => 'required|valid_date',
+ 'errors' => [
+ 'required' => 'End date is required.',
+ 'valid_date' => 'Enter a valid date format (YYYY-MM-DD).'
+ ]
+ ],
+
+ // --- PERMIT EMPTY FIELDS (Optional) ---
+ 'base_policy' => [
+ 'rules' => 'permit_empty'
+ ],
+ 'wellness_plan_id' => [
+ 'rules' => 'permit_empty|alpha_numeric',
+ 'errors' => [
+ 'alpha_numeric' => 'Wellness Plan ID can only contain letters and numbers (no spaces or special characters).'
+ ]
+ ],
+ 'wellness_vendor_id' => [
+ 'rules' => 'permit_empty'
+ ],
+ 'disclaimer' => [
+ 'rules' => 'permit_empty|string|min_length[5]',
+ 'errors' => ['min_length' => 'Disclaimer should be at least 5 characters long if provided.']
+ ],
+
+ // --- CHECKBOXES (Permit Empty) ---
+ 'enrolment_visibility' => ['rules' => 'permit_empty'],
+ 'is_lgbtq' => ['rules' => 'permit_empty']
+ ];
+
+ if (!$this->validate($rules)) {
+ return $this->response->setStatusCode(400)->setJSON([
+ 'status' => false,
+ 'message' => 'Input validation failed',
+ 'code' => 400,
+ 'errors' => $this->validator->getErrors()
+ ]);
+ }
+
$this->myLogger->logme('error', 'Client policy function called');
$data = $this->request->getPost();
$sanitized_post_data = sanitizeInputArrayAdvanced($data);
diff --git a/app/Controllers/EmployeeController.php b/app/Controllers/EmployeeController.php
index f754b918..4a019293 100755
--- a/app/Controllers/EmployeeController.php
+++ b/app/Controllers/EmployeeController.php
@@ -2767,10 +2767,10 @@ class EmployeeController extends AdminController
// ]
// ],
'email_corporate' => [
- 'rules' => 'required|valid_email',
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/]',
'errors' => [
- 'required' => 'Email is required',
- 'valid_email' => 'Enter a valid email address'
+ 'required' => 'Email address is required.',
+ 'regex_match' => 'Please enter a valid email format (e.g., name@company.com).'
]
],
'mobile' => [
diff --git a/app/Controllers/LeadsController.php b/app/Controllers/LeadsController.php
index 092003a4..2deca1f1 100644
--- a/app/Controllers/LeadsController.php
+++ b/app/Controllers/LeadsController.php
@@ -379,6 +379,7 @@ class LeadsController extends BaseController
private function prepareLeadData()
{
$rules = [
+
'lead_type' => [
'rules' => 'integer',
'errors' => ['required' => 'Lead Type is required']
@@ -406,19 +407,33 @@ class LeadsController extends BaseController
'rules' => 'required',
'errors' => ['required' => 'GST Number is required']
],
- 'branch_name' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Branch Name is required']
+ 'gst' => [
+ 'rules' => 'required|regex_match[/^[0-9]{2}[A-Z]{5}[0-9]{4}[A-Z]{1}[1-9A-Z]{1}Z[0-9A-Z]{1}$/]',
+ 'errors' => [
+ 'required' => 'GST Number is required.',
+ 'regex_match' => 'Invalid GST format. Example: 22AAAAA0000A1Z5'
+ ]
],
- 'branch_code' => [
- 'rules' => 'required',
- 'errors' => ['required' => 'Branch Code is required']
+ 'branch_name' => [
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9\s_-]+$/]|min_length[3]',
+ 'errors' => [
+ 'required' => 'Branch Name is required.',
+ 'regex_match' => 'Branch Name can only contain letters, numbers, spaces, - and _.',
+ 'min_length' => 'Branch Name must be at least 3 characters long.'
+ ]
+ ],
+ 'branch_code' => [
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9_-]+$/]',
+ 'errors' => [
+ 'required' => 'Branch Code is required.',
+ 'regex_match' => 'Branch Code can only contain letters, numbers, - and _.'
+ ]
],
'contact_person_name' => [
'rules' => 'required|regex_match[/^[a-zA-Z0-9_ -]+$/]',
'errors' => [
'required' => 'Contact Person Name is required',
- 'regex_match' => 'Contact person name only letters, numbers and characters _ - and space are allowed'
+ 'regex_match' => 'Contact person name only letters, numbers and spaces, - and _.'
]
],
'contact_person_mobile' => [
@@ -429,12 +444,14 @@ class LeadsController extends BaseController
]
],
'contact_person_email' => [
- 'rules' => 'required|valid_email|regex_match[/^[a-zA-Z0-9_-]+$/]',
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/]',
'errors' => [
- 'required' => 'Contact Person Email is required',
- 'valid_email' => 'Please enter a valid email address',
- 'regex_match' => 'Contact Person Email Only letters, numbers and characters _ - @ . are allowed'
+ 'required' => 'Contact Person Email address is required.',
+ 'regex_match' => 'Please enter a valid email format (e.g., name@domain.com).'
]
+ // 'rules' => 'required|valid_email|regex_match[/^[a-zA-Z0-9_-]+$/]',
+ // 'regex_match' => 'Contact Person Email Only letters, numbers and characters _ - @ . are allowed'
+
],
'salse_person_id' => [
'rules' => 'required',
diff --git a/app/Controllers/MasterController.php b/app/Controllers/MasterController.php
index 074b36bc..cff68f18 100755
--- a/app/Controllers/MasterController.php
+++ b/app/Controllers/MasterController.php
@@ -403,10 +403,11 @@ class MasterController extends AdminController
// Contact Details (Array)
// ======================
'name.*' => [
- 'rules' => 'required|trim|min_length[2]',
+ 'rules' => 'required|trim|min_length[2]|regex_match[/^[a-zA-Z0-9\s_-]+$/]',
'errors' => [
'required' => 'Contact name is required',
- 'min_length' => 'Contact name must be at least 2 characters'
+ 'min_length' => 'Contact name must be at least 2 characters',
+ 'regex_match' => 'Contact name is invalid Format'
]
],
@@ -418,10 +419,10 @@ class MasterController extends AdminController
],
'email.*' => [
- 'rules' => 'required|valid_email',
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/]',
'errors' => [
- 'required' => 'Email is required',
- 'valid_email' => 'Invalid email format'
+ 'required' => 'Email address is required.',
+ 'regex_match' => 'Please enter a valid email format (e.g., name@company.com).'
]
],
@@ -658,10 +659,10 @@ class MasterController extends AdminController
],
'email.*' => [
- 'rules' => 'required|valid_email',
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/]',
'errors' => [
- 'required' => 'Email is required',
- 'valid_email' => 'Invalid email format'
+ 'required' => 'Email address is required.',
+ 'regex_match' => 'Please enter a valid email format (e.g., name@company.com).'
]
],
@@ -1054,10 +1055,10 @@ class MasterController extends AdminController
],
'email.*' => [
- 'rules' => 'required|valid_email',
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/]',
'errors' => [
- 'required' => 'Email is required',
- 'valid_email' => 'Invalid email format'
+ 'required' => 'Email address is required.',
+ 'regex_match' => 'Please enter a valid email format (e.g., name@company.com).'
]
],
@@ -1367,10 +1368,10 @@ class MasterController extends AdminController
],
'email.*' => [
- 'rules' => 'required|valid_email',
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/]',
'errors' => [
- 'required' => 'Email is required',
- 'valid_email' => 'Invalid email format'
+ 'required' => 'Email address is required.',
+ 'regex_match' => 'Please enter a valid email format (e.g., name@company.com).'
]
],
@@ -3518,10 +3519,10 @@ class MasterController extends AdminController
]
],
'email' => [
- 'rules' => 'required|valid_email',
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/]',
'errors' => [
- 'required' => 'Email is required',
- 'valid_email' => 'Enter a valid email address'
+ 'required' => 'Email address is required.',
+ 'regex_match' => 'Please enter a valid email format (e.g., name@company.com).'
]
],
'mobile' => [
diff --git a/app/Controllers/PolicyTransactionController.php b/app/Controllers/PolicyTransactionController.php
index efc3efcd..4a5d3d04 100644
--- a/app/Controllers/PolicyTransactionController.php
+++ b/app/Controllers/PolicyTransactionController.php
@@ -1012,9 +1012,8 @@
'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|regex_match[/^-?\d+(\.\d+)?$/]|differs[0]',
+ 'base_premium.*' => ['label' => 'Base Premium', 'rules' => 'permit_empty|regex_match[/^-?\d+(\.\d+)?$/]|differs[0]',
'errors' => [
- 'required' => 'Base Premium is required.',
'regex_match' => 'Base Premium must be a valid positive or negative number.',
'differs' => 'Base Premium cannot be zero.'
]],
@@ -2483,9 +2482,8 @@
],
'base_premium.*' => [
'label' => 'Base Premium',
- 'rules' => 'required|regex_match[/^-?\d+(\.\d+)?$/]|differs[0]',
+ 'rules' => 'permit_empty|regex_match[/^-?\d+(\.\d+)?$/]|differs[0]',
'errors' => [
- 'required' => 'Base Premium is required.',
'regex_match' => 'Base Premium must be a valid positive or negative number.',
'differs' => 'Base Premium cannot be zero.'
]
diff --git a/app/Controllers/ThzController.php b/app/Controllers/ThzController.php
index 827b6587..a4bde6dd 100644
--- a/app/Controllers/ThzController.php
+++ b/app/Controllers/ThzController.php
@@ -89,10 +89,10 @@ class ThzController extends BaseController
],
'email' => [
- 'rules' => 'required|valid_email|max_length[150]',
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/]',
'errors' => [
- 'required' => 'Email is required',
- 'valid_email' => 'Please enter a valid email address'
+ 'required' => 'Email address is required.',
+ 'regex_match' => 'Please enter a valid email format (e.g., name@company.com).'
]
],
diff --git a/app/Controllers/TicketController.php b/app/Controllers/TicketController.php
index 6f69ed45..2a265f4c 100644
--- a/app/Controllers/TicketController.php
+++ b/app/Controllers/TicketController.php
@@ -1135,19 +1135,44 @@ class TicketController extends BaseController
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_code' => [
+ 'label' => 'Employee Code',
+ 'rules' => 'required|min_length[2]|max_length[20]|regex_match[/^[a-zA-Z0-9_-]+$/]',
+ 'errors' => [
+ 'required' => 'Employee Code is required.',
+ 'regex_match' => 'Employee Code cannot contain spaces or special characters (only letters, numbers, - and _ allowed).'
+ ]
],
- '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_name' => [
+ 'label' => 'Employee Name',
+ 'rules' => 'required|min_length[3]|regex_match[/^[a-zA-Z0-9\s_-]+$/]',
+ 'errors' => [
+ 'required' => 'Employee Name is required',
+ 'min_length' => 'Employee Name must be at least 3 characters long',
+ 'regex_match' => 'Employee Name can only contain letters, numbers, spaces, hyphens, and underscores.'
+ ]
],
- 'insured_name' => ['label' => 'Insured Name','rules' => 'required',
- 'errors' => ['required' => 'Insured Name is required']
+ 'insured_name' => [
+ 'label' => 'Insured Name',
+ 'rules' => 'required|min_length[3]|regex_match[/^[a-zA-Z0-9\s_-]+$/]',
+ 'errors' => [
+ 'required' => 'Insured Name is required',
+ 'min_length' => 'Insured Name must be at least 3 characters long',
+ 'regex_match' => 'Insured Name can only contain letters, numbers, spaces, hyphens, and underscores.'
+ ]
],
'relationship' => ['label' => 'Relationship','rules' => 'required',
'errors' => ['required' => 'Please select a Relationship']
],
- 'policy_no' => ['label' => 'Policy No','rules' => 'permit_empty','errors' => []],
+ 'policy_no' => [
+ 'label' => 'Policy Number',
+ // Allows: A-Z, a-z, 0-9, spaces (\s), hyphens (\-), underscores (_), and slashes (\/)
+ 'rules' => 'permit_empty|min_length[3]|max_length[50]|regex_match[/^[a-zA-Z0-9\s\-\/_]+$/]',
+ 'errors' => [
+ 'min_length' => 'Policy Number appears too short (min 5 characters).',
+ 'regex_match' => 'Policy Number can only contain letters, numbers, spaces, hyphens(-), underscores(_), and slashes(/).'
+ ]
+ ],
'tpa_no' => ['label' => 'TPA ID','rules' => 'permit_empty','errors' => []],
'emp_mobile' => ['label' => 'Employee Mobile No','rules' => 'required|numeric|exact_length[10]',
'errors' => [
@@ -1156,11 +1181,19 @@ class TicketController extends BaseController
'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_mail' => ['label' => 'Employee Mail ID',
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/]',
+ 'errors' => [
+ 'required' => 'Employee Email address is required.',
+ 'regex_match' => 'Please enter a valid email format (e.g., name@domain.com).'
+ ]
],
- 'emp_personal_mail' => ['label' => 'Personal Mail ID','rules' => 'permit_empty|valid_email',
- 'errors' => ['valid_email' => 'Personal email format is invalid']
+ 'emp_personal_mail' => ['label' => 'Personal Mail ID',
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/]',
+ 'errors' => [
+ 'required' => 'Personal Email address is required.',
+ 'regex_match' => 'Please enter a valid email format (e.g., name@domain.com).'
+ ]
],
'client_policy_id' => ['label' => 'Policy','rules' => 'required',
'errors' => ['required' => 'Please select a Policy']
@@ -1258,15 +1291,20 @@ class TicketController extends BaseController
'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_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' => 'Mail ID','rules' => 'permit_empty|valid_email',
- 'errors' => ['valid_email' => 'Please provide a valid email address format.']
+ 'emp_mail' => ['label' => 'Employee Mail ID',
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/]',
+ 'errors' => [
+ 'required' => 'Employee Email address is required.',
+ 'regex_match' => 'Please enter a valid email format (e.g., name@domain.com).'
+ ]
],
-
// --- 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.']],
@@ -1278,24 +1316,43 @@ class TicketController extends BaseController
} else {
$rules = [
// --- EMPLOYEE DETAILS ---
- 'emp_code' => ['label' => 'Employee ID', 'rules' => 'required',
- 'errors' => ['required' => 'Employee Code is required']
+ 'emp_code' => [
+ 'label' => 'Employee Code',
+ 'rules' => 'required|min_length[2]|max_length[20]|regex_match[/^[a-zA-Z0-9_-]+$/]',
+ 'errors' => [
+ 'required' => 'Employee Code is required.',
+ 'regex_match' => 'Employee Code cannot contain spaces or special characters (only letters, numbers, - and _ allowed).',
+ ]
],
- '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_name' => [
+ 'label' => 'Employee Name',
+ 'rules' => 'required|min_length[3]|regex_match[/^[a-zA-Z0-9\s_-]+$/]',
+ 'errors' => [
+ 'required' => 'Employee Name is required',
+ 'min_length' => 'Employee Name must be at least 3 characters long',
+ 'regex_match' => 'Employee Name can only contain letters, numbers, spaces, hyphens, and underscores.'
+ ]
],
- 'emp_mobile' => ['label' => 'Mobile No','rules' => 'required|numeric|exact_length[10]',
+ 'emp_mobile' => ['label' => 'Employee Mobile No','rules' => 'required|numeric|exact_length[10]',
'errors' => [
'required' => 'Mobile number is required',
- 'numeric' => 'Mobile must be digits only',
+ 'numeric' => 'Mobile must contain only numbers',
'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_mail' => ['label' => 'Employee Mail ID',
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/]',
+ 'errors' => [
+ 'required' => 'Employee Email address is required.',
+ 'regex_match' => 'Please enter a valid email format (e.g., name@domain.com).'
+ ]
],
- 'emp_personal_mail' => ['label' => 'Personal Mail','rules' => 'permit_empty|valid_email',
- 'errors' => ['valid_email' => 'Personal email format is invalid']
+ 'emp_personal_mail' => ['label' => 'Personal Mail ID',
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/]',
+ 'errors' => [
+ 'required' => 'Personal Email address is required.',
+ 'regex_match' => 'Please enter a valid email format (e.g., name@domain.com).'
+ ]
],
'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']],
@@ -1399,19 +1456,44 @@ class TicketController extends BaseController
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_code' => [
+ 'label' => 'Employee Code',
+ 'rules' => 'required|min_length[2]|max_length[20]|regex_match[/^[a-zA-Z0-9_-]+$/]',
+ 'errors' => [
+ 'required' => 'Employee Code is required.',
+ 'regex_match' => 'Employee Code cannot contain spaces or special characters (only letters, numbers, - and _ allowed).',
+ ]
],
- '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_name' => [
+ 'label' => 'Employee Name',
+ 'rules' => 'required|min_length[3]|regex_match[/^[a-zA-Z0-9\s_-]+$/]',
+ 'errors' => [
+ 'required' => 'Employee Name is required',
+ 'min_length' => 'Employee Name must be at least 3 characters long',
+ 'regex_match' => 'Employee Name can only contain letters, numbers, spaces, hyphens, and underscores.'
+ ]
],
- 'insured_name' => ['label' => 'Insured Name','rules' => 'required',
- 'errors' => ['required' => 'Insured Name is required']
+ 'insured_name' => [
+ 'label' => 'Insured Name',
+ 'rules' => 'required|min_length[3]|regex_match[/^[a-zA-Z0-9\s_-]+$/]',
+ 'errors' => [
+ 'required' => 'Insured Name is required',
+ 'min_length' => 'Insured Name must be at least 3 characters long',
+ 'regex_match' => 'Insured Name can only contain letters, numbers, spaces, hyphens, and underscores.'
+ ]
],
'relationship' => ['label' => 'Relationship','rules' => 'required',
'errors' => ['required' => 'Please select a Relationship']
],
- 'policy_no' => ['label' => 'Policy No','rules' => 'permit_empty','errors' => []],
+ 'policy_no' => [
+ 'label' => 'Policy Number',
+ // Allows: A-Z, a-z, 0-9, spaces (\s), hyphens (\-), underscores (_), and slashes (\/)
+ 'rules' => 'permit_empty|min_length[3]|max_length[50]|regex_match[/^[a-zA-Z0-9\s\-\/_]+$/]',
+ 'errors' => [
+ 'min_length' => 'Policy Number appears too short (min 5 characters).',
+ 'regex_match' => 'Policy Number can only contain letters, numbers, spaces, hyphens(-), underscores(_), and slashes(/).'
+ ]
+ ],
'tpa_no' => ['label' => 'TPA ID','rules' => 'permit_empty','errors' => []],
'emp_mobile' => ['label' => 'Employee Mobile No','rules' => 'required|numeric|exact_length[10]',
'errors' => [
@@ -1420,11 +1502,19 @@ class TicketController extends BaseController
'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_mail' => ['label' => 'Employee Mail ID',
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/]',
+ 'errors' => [
+ 'required' => 'Employee Email address is required.',
+ 'regex_match' => 'Please enter a valid email format (e.g., name@domain.com).'
+ ]
],
- 'emp_personal_mail' => ['label' => 'Personal Mail ID','rules' => 'permit_empty|valid_email',
- 'errors' => ['valid_email' => 'Personal email format is invalid']
+ 'emp_personal_mail' => ['label' => 'Personal Mail ID',
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/]',
+ 'errors' => [
+ 'required' => 'Personal Email address is required.',
+ 'regex_match' => 'Please enter a valid email format (e.g., name@domain.com).'
+ ]
],
'client_policy_id' => ['label' => 'Policy','rules' => 'required',
'errors' => ['required' => 'Please select a Policy']
@@ -1522,15 +1612,20 @@ class TicketController extends BaseController
'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_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' => 'Mail ID','rules' => 'permit_empty|valid_email',
- 'errors' => ['valid_email' => 'Please provide a valid email address format.']
+ 'emp_mail' => ['label' => 'Employee Mail ID',
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/]',
+ 'errors' => [
+ 'required' => 'Employee Email address is required.',
+ 'regex_match' => 'Please enter a valid email format (e.g., name@domain.com).'
+ ]
],
-
// --- 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.']],
@@ -1542,24 +1637,43 @@ class TicketController extends BaseController
} else {
$rules = [
// --- EMPLOYEE DETAILS ---
- 'emp_code' => ['label' => 'Employee ID', 'rules' => 'required',
- 'errors' => ['required' => 'Employee Code is required']
+ 'emp_code' => [
+ 'label' => 'Employee Code',
+ 'rules' => 'required|min_length[2]|max_length[20]|regex_match[/^[a-zA-Z0-9_-]+$/]',
+ 'errors' => [
+ 'required' => 'Employee Code is required.',
+ 'regex_match' => 'Employee Code cannot contain spaces or special characters (only letters, numbers, - and _ allowed).',
+ ]
],
- '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_name' => [
+ 'label' => 'Employee Name',
+ 'rules' => 'required|min_length[3]|regex_match[/^[a-zA-Z0-9\s_-]+$/]',
+ 'errors' => [
+ 'required' => 'Employee Name is required',
+ 'min_length' => 'Employee Name must be at least 3 characters long',
+ 'regex_match' => 'Employee Name can only contain letters, numbers, spaces, hyphens, and underscores.'
+ ]
],
- 'emp_mobile' => ['label' => 'Mobile No','rules' => 'required|numeric|exact_length[10]',
+ 'emp_mobile' => ['label' => 'Employee Mobile No','rules' => 'required|numeric|exact_length[10]',
'errors' => [
'required' => 'Mobile number is required',
- 'numeric' => 'Mobile must be digits only',
+ 'numeric' => 'Mobile must contain only numbers',
'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_mail' => ['label' => 'Employee Mail ID',
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/]',
+ 'errors' => [
+ 'required' => 'Employee Email address is required.',
+ 'regex_match' => 'Please enter a valid email format (e.g., name@domain.com).'
+ ]
],
- 'emp_personal_mail' => ['label' => 'Personal Mail','rules' => 'permit_empty|valid_email',
- 'errors' => ['valid_email' => 'Personal email format is invalid']
+ 'emp_personal_mail' => ['label' => 'Personal Mail ID',
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/]',
+ 'errors' => [
+ 'required' => 'Personal Email address is required.',
+ 'regex_match' => 'Please enter a valid email format (e.g., name@domain.com).'
+ ]
],
'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']],
@@ -1813,8 +1927,11 @@ class TicketController extends BaseController
$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.']
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/]',
+ 'errors' => [
+ 'required' => 'Email address is required.',
+ 'regex_match' => 'Please enter a valid email format (e.g., name@company.com).'
+ ]
],
'mail_subject' => [
'label' => 'Subject',
@@ -1823,11 +1940,6 @@ class TicketController extends BaseController
'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.']
]
];
@@ -3509,6 +3621,160 @@ class TicketController extends BaseController
// -------- END CLAIM DUMP UPLOAD ----------------------------------------------------------------------------------------------
public function saveIRDocsJson()
+ {
+ // -----------------------------------------------------
+ // 1) GET INPUT
+ // -----------------------------------------------------
+ $request_data = $this->request->getPost();
+ $data = sanitizeInputArrayAdvanced($request_data);
+
+ $ticket_id = $data['ticket_id'] ?? '';
+ $required_docs = $data['required_docs'] ?? '';
+
+ // -----------------------------------------------------
+ // 2) BASIC VALIDATION (CI4)
+ // -----------------------------------------------------
+ $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',
+ 'errors' => [
+ 'required' => 'Document data is required'
+ ]
+ ]
+ ];
+
+ if (!$this->validate($rules)) {
+ return $this->response->setStatusCode(400)->setJSON([
+ 'status' => false,
+ 'message' => 'Input validation failed',
+ 'code' => 400,
+ 'errors' => $this->validator->getErrors()
+ ]);
+ }
+
+ // -----------------------------------------------------
+ // 3) VALIDATE JSON FORMAT
+ // -----------------------------------------------------
+ $docsArray = json_decode($required_docs, true);
+
+ if (json_last_error() !== JSON_ERROR_NONE) {
+ return $this->response->setStatusCode(400)->setJSON([
+ 'status' => false,
+ 'message' => 'Input validation failed',
+ 'code' => 400,
+ 'errors' => [
+ 'required_docs' => 'Invalid JSON format'
+ ]
+ ]);
+ }
+
+ // -----------------------------------------------------
+ // 4) VALIDATE JSON STRUCTURE
+ // -----------------------------------------------------
+ if (!isset($docsArray['docs']) || !is_array($docsArray['docs'])) {
+ return $this->response->setStatusCode(400)->setJSON([
+ 'status' => false,
+ 'message' => 'Input validation failed',
+ 'code' => 400,
+ 'errors' => [
+ 'required_docs' => 'Invalid document structure'
+ ]
+ ]);
+ }
+
+ // -----------------------------------------------------
+ // 5) VALIDATE EACH DOCUMENT NAME
+ // -----------------------------------------------------
+ foreach ($docsArray['docs'] as $index => $doc) {
+
+ // Check document_name exists
+ if (!isset($doc['document_name'])) {
+ return $this->response->setStatusCode(400)->setJSON([
+ 'status' => false,
+ 'code' => 400,
+ 'message' => 'Input validation failed',
+ 'errors' => [
+ 'required_docs' =>
+ "Document name missing at row " . ($index + 1)
+ ]
+ ]);
+ }
+
+ // YOUR REQUIRED REGEX RULE
+ if (!preg_match('/^[a-zA-Z0-9_\- ]+$/', $doc['document_name'])) {
+ return $this->response->setStatusCode(400)->setJSON([
+ 'status' => false,
+ 'code' => 400,
+ 'message' => 'Input validation failed',
+ 'errors' => [
+ 'required_docs' =>
+ "Document name '{$doc['document_name']}' can only contain letters, numbers, hyphens and underscores"
+ ]
+ ]);
+ }
+
+ // Check document_received exists
+ if (!array_key_exists('document_received', $doc)) {
+ return $this->response->setStatusCode(400)->setJSON([
+ 'status' => false,
+ 'code' => 400,
+ 'message' => 'Input validation failed',
+ 'errors' => [
+ 'required_docs' =>
+ "document_received key missing at row " . ($index + 1)
+ ]
+ ]);
+ }
+ }
+
+ // -----------------------------------------------------
+ // 6) EXTRA SAFETY CHECKS
+ // -----------------------------------------------------
+ if (empty($ticket_id) || empty($required_docs)) {
+ return $this->respond([
+ 'status' => false,
+ 'code' => 404,
+ 'message' => 'Failed to save Docs'
+ ], 200);
+ }
+
+ // -----------------------------------------------------
+ // 7) UPDATE DATABASE
+ // -----------------------------------------------------
+ db_connect()->query(
+ "UPDATE ticket_master SET required_docs = ? WHERE id = ?",
+ [$required_docs, $ticket_id]
+ );
+
+ // -----------------------------------------------------
+ // 8) RETURN UPDATED DATA
+ // -----------------------------------------------------
+ $saved = $this->ticketMasterModel
+ ->select('required_docs')
+ ->where('id', $ticket_id)
+ ->first();
+
+ $savedDocs = json_decode($saved['required_docs'] ?? '{}', true) ?? [];
+
+ return $this->respond([
+ 'status' => true,
+ 'code' => 200,
+ 'message' => 'IR docs saved successfully',
+ 'data' => $savedDocs
+ ], 200);
+ }
+
+ public function saveIRDocsJson_old()
{
$request_data = $this->request->getPost();
$data = sanitizeInputArrayAdvanced($request_data);
diff --git a/app/Controllers/UserController.php b/app/Controllers/UserController.php
index d2a32ac1..44b44e51 100755
--- a/app/Controllers/UserController.php
+++ b/app/Controllers/UserController.php
@@ -139,10 +139,10 @@ class UserController extends AdminController
// Email
// ======================
'email' => [
- 'rules' => 'required|valid_email',
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/]',
'errors' => [
- 'required' => 'Email is required',
- 'valid_email' => 'Please enter a valid email address',
+ 'required' => 'Email address is required.',
+ 'regex_match' => 'Please enter a valid email format (e.g., name@company.com).'
]
],
@@ -323,10 +323,10 @@ class UserController extends AdminController
// Email
// ======================
'email' => [
- 'rules' => 'required|valid_email',
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/]',
'errors' => [
- 'required' => 'Email is required',
- 'valid_email' => 'Please enter a valid email address',
+ 'required' => 'Email address is required.',
+ 'regex_match' => 'Please enter a valid email format (e.g., name@company.com).'
]
],
@@ -829,10 +829,10 @@ class UserController extends AdminController
// Email
// ======================
'email' => [
- 'rules' => 'required|valid_email',
+ 'rules' => 'required|regex_match[/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/]',
'errors' => [
- 'required' => 'Email is required',
- 'valid_email' => 'Please enter a valid email address',
+ 'required' => 'Email address is required.',
+ 'regex_match' => 'Please enter a valid email format (e.g., name@company.com).'
]
],
// ======================
diff --git a/app/Views/client_kyc.php b/app/Views/client_kyc.php
index e9b726a5..6a8a0259 100755
--- a/app/Views/client_kyc.php
+++ b/app/Views/client_kyc.php
@@ -165,7 +165,32 @@
console.error(status, error);
$('.loader').fadeOut();
$('.loader-mask').delay(350).fadeOut('slow');
- toastr.warning('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 === 404) {
+ toastr.warning('Resource not found', 'Warning');
+ } 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');
+ }
+
}
});
});
@@ -221,7 +246,31 @@
console.error(status, error);
$('.loader').fadeOut();
$('.loader-mask').delay(350).fadeOut('slow');
- toastr.warning('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 === 404) {
+ toastr.warning('Resource not found', 'Warning');
+ } 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/client_rm.php b/app/Views/client_rm.php
index 4d3dd823..a996bd93 100755
--- a/app/Views/client_rm.php
+++ b/app/Views/client_rm.php
@@ -158,7 +158,33 @@ $(document).ready(function(){
setTimeout(function() {
$('.loader').fadeOut();
$('.loader-mask').delay(350).fadeOut('slow');
- console.log('Something Wrong!', 'warning'); }, 1000);
+ 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 === 404) {
+ toastr.warning('Resource not found', 'Warning');
+ } 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/kyc_entity_type_basic_info.php b/app/Views/kyc_entity_type_basic_info.php
index 88c08db9..65441948 100755
--- a/app/Views/kyc_entity_type_basic_info.php
+++ b/app/Views/kyc_entity_type_basic_info.php
@@ -88,7 +88,31 @@ $(document).ready(function () {
setTimeout(function() {
$('.loader').fadeOut();
$('.loader-mask').delay(350).fadeOut('slow');
- toastr.warning('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 === 404) {
+ toastr.warning('Resource not found', 'Warning');
+ } 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);
}
});