diff --git a/app/Config/Routes.php b/app/Config/Routes.php
index a4e9d368..9eaf2c54 100755
--- a/app/Config/Routes.php
+++ b/app/Config/Routes.php
@@ -564,6 +564,7 @@ $routes->group("employeeRest", ["filter" => "authJWT"], function ($routes) {
$routes->post("ticketConversationSave", "ThzController::ticketConversationSave");
$routes->get("ticketConversationList", "ThzController::ticketConversationList");
$routes->get("ticketHistoryList", "ThzController::ticketHistoryList");
+ $routes->match(['get','post','put'], 'ticketType', 'ThzController::ticketType');
$routes->get("hrFileList", "EmployeeRestController::hrFileList");
$routes->get("hrFileUploadMasters", "EmployeeRestController::hrFileUploadMasters");
@@ -663,4 +664,10 @@ $routes->post("ticketConversationSave", "ThzController::ticketConversationSave")
$routes->get("ticketConversationList", "ThzController::ticketConversationList");
$routes->post('ticketAutoFetchDetails',"ThzController::ticketAutoFetchDetails");
$routes->match(['get','post','put'], 'ticketType', 'ThzController::ticketType');
-$routes->get("ticketHistoryList", "ThzController::ticketHistoryList");
\ No newline at end of file
+$routes->get("ticketHistoryList", "ThzController::ticketHistoryList");
+
+
+//for testing
+$routes->group('test', function($routes) {
+ $routes->post('api/saveForm', 'TestingController::saveForm');
+});
diff --git a/app/Controllers/ClientController.php b/app/Controllers/ClientController.php
index 9845210a..4a73bb1b 100755
--- a/app/Controllers/ClientController.php
+++ b/app/Controllers/ClientController.php
@@ -5060,9 +5060,10 @@ class ClientController extends AdminController
// ---------- TICKET SERVICE CONTROLLER --------------------------------------------------------------------------------
$ticketServiceController = new TicketServiceController();
- // $response = $ticketServiceController->claimDumpExcelFileFormatValidation(["file_id" => 3]);
- // $response = $ticketServiceController->claimDumpExcelFileDataValidation(["file_id" => 3]);
- // $response = $ticketServiceController->claimDumpOnBoardProcess(["file_id" => 3]);
+ // $response = $ticketServiceController->claimDumpExcelFileFormatValidation(["file_id" => 34]);
+ // $response = $ticketServiceController->claimDumpExcelFileDataValidation(["file_id" => 34]);
+ // $response = $ticketServiceController->getClaimExcelErrorData(["file_id" => 41]);
+ // $response = $ticketServiceController->claimDumpOnBoardProcess(["file_id" => 17]);
// $response = $ticketServiceController->extractExcelData("claims_dump_form_client.xlsx");
// dd($response);
@@ -5079,8 +5080,16 @@ class ClientController extends AdminController
// $res = $empServiceController->employeesCorrectionProcess(['file_id' => '1681']);
// dd( $res);
- // $EmployeeMultiEventServiceController = new EmployeeMultiEventServiceController();
- // $res = $EmployeeMultiEventServiceController->constructMultiEventData(['file_id' => '1056']);
+ $EmployeeMultiEventServiceController = new EmployeeMultiEventServiceController();
+ // $res = $EmployeeMultiEventServiceController->constructMultiEventData(['file_id' => '1069']);
+ // $res = $EmployeeMultiEventServiceController->excelMultieventFileFormateValidation(['file_id' => '1084']);
+ // $res = $EmployeeMultiEventServiceController->excelMultieventFileDataValidation(['file_id' => '1069']);
+ // $res = $EmployeeMultiEventServiceController->excelMultieventFileOnBoard(['file_id' => '1069']);
+ // dd($res);
+
+ // $res = $EmployeeMultiEventServiceController->getExcelErrorData(1069, $res);
+ // $res['file_id'] = 1069;
+ // echo view('excel_errors', $res);
// dd($res);
// ---------- POLICY TRANSACTION CONTROLLER --------------------------------------------------------------------------------
@@ -5454,10 +5463,21 @@ class ClientController extends AdminController
}
}
- public function getTheEmpDataForClaimSearchByMobile($param, $type = 'mobile', $client_policy_id = null, $client_id = null)
+ public function getTheEmpDataForClaimSearchByMobile($param, $type = 'mobile', $client_policy_id = null, $client_id = null, $ticket_type_id = null)
{
$field_name = 'employees.' . $type;
+ $policy_type_id = [];
+ if($ticket_type_id == 1){
+ $policy_type_id = [2, 3, 4, 5];
+ }else if($ticket_type_id == 2){
+ $policy_type_id = [1];
+ }else if($ticket_type_id == 3){
+ $policy_type_id = [6];
+ }else if($ticket_type_id == 4){
+ $policy_type_id = [7];
+ }
+
// Construct the base query
$query = $this->clientPolicyModel
->select("
@@ -5481,7 +5501,7 @@ class ClientController extends AdminController
->join('insurers', 'client_policy.insurer_id = insurers.id')
->join('tpa', 'client_policy.tpa_id = tpa.id', 'left')
->join('employees', 'clients.id = employees.client_id')
- ->join('employee_polices', 'employees.id = employee_polices.employee_id')
+ ->join('employee_polices', 'employees.id = employee_polices.employee_id AND client_policy.id = employee_polices.client_policy_id')
->where('client_policy.is_active', 1)
->where('insurers.is_active', 1)
->where('tpa.is_active', 1)
@@ -5499,6 +5519,10 @@ class ClientController extends AdminController
if (!empty($client_policy_id)) {
$query->where('employee_polices.client_policy_id', $client_policy_id);
}
+
+ if($policy_type_id != null){
+ $query->whereIn('client_policy.policy_type_id', $policy_type_id);
+ }
$query->groupBy('employees.id')
->orderBy('employees.id', 'DESC');
@@ -6612,268 +6636,6 @@ class ClientController extends AdminController
// ------------------- DEMO CLIENT FUNCTION --------------------------------------------------------------------------------
- // public function wipeDemoClient()
- // {
- // // $this->myLogger->logme('error', "Wipe Demo Client function called");
- // $this->myLogger->logme('error', "Wipe Demo Client function called"); // Red text
-
- // $this->myLogger->logme('error', "Wipe Demo client Payload : " . json_encode($this->request->getPost() ?? []));
- // $client_id = $this->request->getPost('client_id');
-
- // if (empty($client_id)) {
- // return $this->respond(['status' => false, 'message' => 'Client id required'], 404);
- // }
-
- // // 1. Client Model
- // $client_data = $this->clientModel->where('id', $client_id)->where('is_active', 1)->first();
- // $this->myLogger->logme('error', "Client data : " . json_encode($client_data ?? []));
-
- // if (!empty($client_data)) {
- // $is_deleted = $this->clientModel->where('id', $client_id)->delete();
-
- // if ($is_deleted) {
- // $this->myLogger->logme('error', "Client data removed successfully.");
- // } else {
- // $this->myLogger->logme('error', "Client record does not exist.");
- // }
- // } else {
- // return $this->respond(['status' => false, 'message' => 'Client not found'], 404);
- // }
-
- // // 2. Client RM Model
- // $client_rm_data = $this->clientRMModel->where('client_id', $client_id)->first();
- // $this->myLogger->logme('error', "Client Relationship Manager data : " . json_encode($client_rm_data ?? []));
-
- // if (!empty($client_rm_data)) {
- // $is_deleted = $this->clientRMModel->where('client_id', $client_id)->delete();
-
- // if ($is_deleted) {
- // $this->myLogger->logme('error', "Client Relationship Manager data removed successfully.");
- // } else {
- // $this->myLogger->logme('error', "Client Relationship Manager record does not exist. To delete");
- // }
- // } else {
- // $this->myLogger->logme('error', "Client Relationship Manager data not found.");
- // }
-
- // // 3. Client KYC Docs Model
- // $client_kyc_data = $this->clientKYCDocsModel->where('client_id', $client_id)->findAll();
- // $this->myLogger->logme('error', "Client KYC Docs data : " . json_encode($client_kyc_data ?? []));
-
- // if (!empty($client_kyc_data)) {
- // $is_deleted = $this->clientKYCDocsModel->where('client_id', $client_id)->delete();
- // if ($is_deleted) {
- // $this->myLogger->logme('error', "Client KYC Docs data removed successfully.");
- // } else {
- // $this->myLogger->logme('error', "Client KYC Docs record does not exist. To delete");
- // }
- // } else {
- // $this->myLogger->logme('error', "Client KYC Docs data not found.");
- // }
-
- // // 4. Client Branch Model
- // $client_branch_data = $this->clientBranchModel->where('client_id', $client_id)->findAll();
- // $this->myLogger->logme('error', "Client Branch data : " . json_encode($client_branch_data ?? []));
-
- // $branch_ids = array_column($client_branch_data, 'id') ?? [];
- // $this->myLogger->logme('error', "Client Branch id count : " . count($branch_ids ?? []));
-
- // if (!empty($client_branch_data)) {
-
- // $is_deleted = $this->clientBranchModel->where('client_id', $client_id)->delete();
-
- // if ($is_deleted) {
- // $this->myLogger->logme('error', "Client Branch data removed successfully.");
-
- // if(!empty($branch_ids)){
-
- // $level_contact_data = $this->levelContactModel->where('contact_type', 'client')->whereIn('ref_id', $branch_ids)->findAll();
- // $this->myLogger->logme('error', "Level Contact data : " . json_encode($level_contact_data ?? []));
-
- // $is_deleted = $this->levelContactModel->where('contact_type', 'client')->whereIn('ref_id', $branch_ids)->delete();
- // if ($is_deleted) {
- // $this->myLogger->logme('error', "Level Contact data removed successfully.");
- // } else {
- // $this->myLogger->logme('error', "Level Contact record does not exist. To delete");
- // }
-
- // }else{
- // $this->myLogger->logme('error', "Level Contact data not found.");
- // }
-
- // } else {
- // $this->myLogger->logme('error', "Client Branch record does not exist. To delete");
- // }
- // } else {
- // $this->myLogger->logme('error', "Client Branch data not found.");
- // }
-
- // // 5. Client Policy Model
- // $client_policy_data = $this->clientPolicyModel->where('client_id', $client_id)->findAll();
- // $this->myLogger->logme('error', "Client Policy data : " . json_encode($client_policy_data ?? []));
-
- // $policy_ids = array_column($client_policy_data, 'id') ?? [];
- // $this->myLogger->logme('error', "Client Policy id count : " . count($policy_ids ?? []));
-
- // if (!empty($client_policy_data)) {
- // $is_deleted = $this->clientPolicyModel->where('client_id', $client_id)->delete();
- // if ($is_deleted) {
-
- // $this->myLogger->logme('error', "Client Policy data removed successfully.");
-
- // if(!empty($policy_ids)){
-
- // $employee_policy_data = $this->employeePolicyModel->whereIn('client_policy_id', $policy_ids)->findAll();
- // $this->myLogger->logme('error', "Employee Policy data count : " . count($employee_policy_data ?? []));
-
- // $is_deleted = $this->employeePolicyModel->whereIn('client_policy_id', $policy_ids)->delete();
- // if ($is_deleted) {
- // $this->myLogger->logme('error', "Employee policy data removed successfully.");
- // } else {
- // $this->myLogger->logme('error', "Employee policy record does not exist. To delete");
- // }
-
- // }else{
- // $this->myLogger->logme('error', "Employee policy data not found.");
- // }
-
- // } else {
- // $this->myLogger->logme('error', "Client Policy record does not exist. To delete");
- // }
- // } else {
- // $this->myLogger->logme('error', "Client Policy data not found.");
- // }
-
- // // 6. Employee Model
- // $employee_data = $this->employeeModel->where('client_id', $client_id)->findAll();
- // $this->myLogger->logme('error', "Employee data count : " . count($employee_data ?? []));
-
- // if (!empty($employee_data)) {
-
- // $is_deleted = $this->employeeModel->where('client_id', $client_id)->delete();
- // if ($is_deleted) {
- // $this->myLogger->logme('error', "Employee data removed successfully.");
- // } else {
- // $this->myLogger->logme('error', "Employee record does not exist. To delete");
- // }
- // } else {
- // $this->myLogger->logme('error', "Employee data not found.");
- // }
-
- // // 7. Client Deposit Model
- // $client_deposit_data = $this->clientDepositModel->where('client_id', $client_id)->findAll();
- // $this->myLogger->logme('error', "Client Deposit data : " . json_encode($client_deposit_data ?? []));
-
- // if (!empty($client_deposit_data)) {
- // $is_deleted = $this->clientDepositModel->where('client_id', $client_id)->delete();
- // if ($is_deleted) {
- // $this->myLogger->logme('error', "Client Deposit data removed successfully.");
- // } else {
- // $this->myLogger->logme('error', "Client Deposit record does not exist. To delete");
- // }
- // } else {
- // $this->myLogger->logme('error', "Client Deposit data not found.");
- // }
-
- // // 8. Policy Premium 1 Model
- // $policy_premium1_data = $this->policyPremium1Model->where('client_id', $client_id)->findAll();
- // $this->myLogger->logme('error', "Policy Premium 1 data count : " . count($policy_premium1_data ?? []));
-
- // if (!empty($policy_premium1_data)) {
- // $is_deleted = $this->policyPremium1Model->where('client_id', $client_id)->delete();
- // if ($is_deleted) {
- // $this->myLogger->logme('error', "Policy Premium 1 data removed successfully.");
- // } else {
- // $this->myLogger->logme('error', "Policy Premium 1 record does not exist. To delete");
- // }
- // } else {
- // $this->myLogger->logme('error', "Policy Premium 1 data not found.");
- // }
-
- // // 9. Policy Premium 2 Model
- // $policy_premium2_data = $this->policyPremium2Model->where('client_id', $client_id)->findAll();
- // $this->myLogger->logme('error', "Policy Premium 2 data count: " . count($policy_premium2_data ?? []));
-
- // if (!empty($policy_premium2_data)) {
- // $is_deleted = $this->policyPremium2Model->where('client_id', $client_id)->delete();
- // if ($is_deleted) {
- // $this->myLogger->logme('error', "Policy Premium 2 data removed successfully.");
- // } else {
- // $this->myLogger->logme('error', "Policy Premium 2 record does not exist. To delete");
- // }
- // } else {
- // $this->myLogger->logme('error', "Policy Premium 2 data not found.");
- // }
-
- // // 10. Notification Model
- // $notification_data = $this->notificationModel->where('client_id', $client_id)->findAll();
- // $this->myLogger->logme('error', "Notification data : " . json_encode($notification_data ?? []));
-
- // if (!empty($notification_data)) {
- // $is_deleted = $this->notificationModel->where('client_id', $client_id)->delete();
- // if ($is_deleted) {
- // $this->myLogger->logme('error', "Notification data removed successfully.");
- // } else {
- // $this->myLogger->logme('error', "Notification record does not exist. To delete");
- // }
- // } else {
- // $this->myLogger->logme('error', "Notification data not found.");
- // }
-
- // // 11. CD Master Model
- // $cd_master_data = $this->CDMasterModel->where('client_id', $client_id)->findAll();
- // $this->myLogger->logme('error', "CD Master data : " . json_encode($cd_master_data ?? []));
-
- // if (!empty($cd_master_data)) {
- // $is_deleted = $this->CDMasterModel->where('client_id', $client_id)->delete();
- // if ($is_deleted) {
- // $this->myLogger->logme('error', "CD Master data removed successfully.");
- // } else {
- // $this->myLogger->logme('error', "CD Master record does not exist. To delete");
- // }
- // } else {
- // $this->myLogger->logme('error', "CD Master data not found.");
- // }
-
- // // 12. Policy Transaction Model
- // $policy_transaction_data = $this->policyTransactionModel->where('client_id', $client_id)->findAll();
- // $this->myLogger->logme('error', "Policy Transaction data : " . json_encode($policy_transaction_data ?? []));
-
- // $pt_ids = array_column($policy_transaction_data, 'id') ?? [];
- // $this->myLogger->logme('error', "Policy Transaction id count : " . count($pt_ids ?? []));
-
- // if (!empty($policy_transaction_data)) {
- // $is_deleted = $this->policyTransactionModel->where('client_id', $client_id)->delete();
- // if ($is_deleted) {
- // $this->myLogger->logme('error', "Policy Transaction data removed successfully.");
-
- // if(!empty($pt_ids)){
-
- // $pt_co_share_data = $this->PTCOShareDetailsModel->whereIn('pt_id', $pt_ids)->findAll();
- // $this->myLogger->logme('error', "PT CO Share data : " . json_encode($pt_co_share_data ?? []));
-
- // $is_deleted = $this->PTCOShareDetailsModel->whereIn('pt_id', $pt_ids)->delete();
- // if ($is_deleted) {
- // $this->myLogger->logme('error', "PT CO Share data removed successfully.");
- // } else {
- // $this->myLogger->logme('error', "PT CO Share record does not exist. To delete");
- // }
-
- // }else{
- // $this->myLogger->logme('error', "PT CO Share data not found.");
- // }
-
- // } else {
- // $this->myLogger->logme('error', "Policy Transaction record does not exist. To delete");
- // }
- // } else {
- // $this->myLogger->logme('error', "Policy Transaction data not found.");
- // }
-
- // $this->myLogger->logme('error', "Wipe Demo Client function closed");
- // return $this->respond(['status' => true, 'message' => 'Demo client data wiped successfully'], 200);
- // }
-
public function wipeDemoClient()
{
$this->myLogger->logme('error', "========================================");
diff --git a/app/Controllers/EmployeeController.php b/app/Controllers/EmployeeController.php
index 91ed4ef6..5a5039f6 100755
--- a/app/Controllers/EmployeeController.php
+++ b/app/Controllers/EmployeeController.php
@@ -277,22 +277,28 @@ class EmployeeController extends AdminController
$file_id = $this->fileModel->insert(['file_name' => $filename, 'client_id' => $client_id, 'policy_id' => $policy_id, 'created_by' => $loggedInUserID, 'status' => $status, 'action' => $action, 'client_branch_id' => $branch_id,'uploaded_by' => 1, 'hr_file_id' => $hr_file_id]); //here field policy_id have client_policy_id and not policy id from policy master
$this->myLogger->logme("error", '{file_id} uploaded success', ['file_id' => $file_id]);
- //start validation process
- if($fileSize < 1) // if file size less than 1
- {
- $empServiceController = new EmployeeServiceController();
- $result = $empServiceController->excelFileFormatValidation(['file_id' => $file_id]);
- $this->myLogger->logme("error", '{file_id} is less than 1MB, validating on the fly', ['file_id' => $file_id]);
- //endof validation process
- if (isset($result['error_summary']) && count($result['error_summary'])) {
- return $this->respond(['dataStatus' => false, 'code' => 404, 'message' => 'file rejected with errors'], 200);
- }
- }
- else //if file size greater than 1 add the file as job
- {
- $job_details = new Jobs();
- $r = Jobs::addJob(['job_name' => 'excelFileFormatValidation','payload' => ['file_id' => $file_id]]);
+ if ($action == "all") {
+
+ $r = Jobs::addJob(['job_name' => 'excelMultieventFileFormateValidation', 'payload' => ['file_id' => $file_id]]);
$this->myLogger->logme("error", '{file_id} is greather than 1MB, validating with job queue', ['file_id' => $file_id]);
+
+ } else {
+ //start validation process
+ if ($fileSize < 1) // if file size less than 1
+ {
+ $empServiceController = new EmployeeServiceController();
+ $result = $empServiceController->excelFileFormatValidation(['file_id' => $file_id]);
+ $this->myLogger->logme("error", '{file_id} is less than 1MB, validating on the fly', ['file_id' => $file_id]);
+ //endof validation process
+ if (isset($result['error_summary']) && count($result['error_summary'])) {
+ return $this->respond(['dataStatus' => false, 'code' => 404, 'message' => 'file rejected with errors'], 200);
+ }
+ } else //if file size greater than 1 add the file as job
+ {
+ $job_details = new Jobs();
+ $r = Jobs::addJob(['job_name' => 'excelFileFormatValidation', 'payload' => ['file_id' => $file_id]]);
+ $this->myLogger->logme("error", '{file_id} is greather than 1MB, validating with job queue', ['file_id' => $file_id]);
+ }
}
return $this->respond(['dataStatus' => true, 'code' => 200, 'data' => 'file upload success'], 200);
@@ -303,7 +309,7 @@ class EmployeeController extends AdminController
//for TPA/insurer upload
$data['events'] = ['inception' => 'Inception (Employee + Dependents)', 'missed_inception' => 'Missed Inception (Employee + Dependents)', 'addition' => 'Addition (Employee + Dependents)', 'dependent_addition' => 'Dependent Addition (Only Dependents)', 'deletion' => 'Deletion', 'correction' => 'Correction', 'si_enhancement' => 'SI Enhancement'];
//for inception upload
- $data['actions'] = ['inception' => 'Inception (Employee + Dependents)', 'missed_inception' => 'Missed Inception (Employee + Dependents)', 'addition' => 'Addition (Employee + Dependents)', 'dependent_addition' => 'Dependent Addition (Only Dependents)', 'deletion' => 'Deletion', 'correction' => 'Correction', 'si_enhancement' => 'SI Enhancement'];
+ $data['actions'] = ['all' => 'All', 'inception' => 'Inception (Employee + Dependents)', 'missed_inception' => 'Missed Inception (Employee + Dependents)', 'addition' => 'Addition (Employee + Dependents)', 'dependent_addition' => 'Dependent Addition (Only Dependents)', 'deletion' => 'Deletion', 'correction' => 'Correction', 'si_enhancement' => 'SI Enhancement'];
// $data['actions'] = ['inception' => 'Inception (Employee + Dependents)', 'missed_inception' => 'Missed Inception (Employee + Dependents)', 'addition' => 'Addition (Employee + Dependents)', 'dependent_addition' => 'Dependent Addition (Only Dependents)', 'deletion' => 'Deletion', 'correction' => 'Correction', 'si_enhancement' => 'SI Enhancement','enrollment' => 'Enrolment'];
// $data['import_or_export'] = ['import' => 'Import', 'export' => 'Export'];
@@ -469,6 +475,8 @@ class EmployeeController extends AdminController
$filePath = ROOTPATH . 'public/sample_excel/sample_inception.xls';
}else if ($actionType == 'member_data') {
$filePath = ROOTPATH . 'public/sample_excel/Sample_Member_Data.xlsx';
+ }else if ($actionType == 'all') {
+ $filePath = ROOTPATH . 'public/sample_excel/sample_multievent_file.xlsx';
}
// Check if the file exists
diff --git a/app/Controllers/EmployeeMultiEventServiceController.php b/app/Controllers/EmployeeMultiEventServiceController.php
new file mode 100644
index 00000000..a7519fea
--- /dev/null
+++ b/app/Controllers/EmployeeMultiEventServiceController.php
@@ -0,0 +1,2871 @@
+ [
+ 'name' => 'Self',
+ 'gender' => 'M',
+ 'age_min' => 18,
+ 'age_max' => null
+ ],
+ 'spouse' => [
+ 'name' => 'Spouse',
+ 'gender' => 'F',
+ 'age_min' => 18,
+ 'age_max' => null
+ ],
+ 'son' => [
+ 'name' => 'Son',
+ 'gender' => 'M',
+ 'age_min' => null,
+ 'age_max' => 25
+ ],
+ 'daughter' => [
+ 'name' => 'Daughter',
+ 'gender' => 'F',
+ 'age_min' => null,
+ 'age_max' => 25
+ ],
+ 'father' => [
+ 'name' => 'Father',
+ 'gender' => 'M',
+ 'age_min' => 18,
+ 'age_max' => null
+ ],
+ 'mother' => [
+ 'name' => 'Mother',
+ 'gender' => 'F',
+ 'age_min' => 18,
+ 'age_max' => null
+ ],
+ 'father-in-law' => [
+ 'name' => 'Father in Law',
+ 'gender' => 'M',
+ 'age_min' => 18,
+ 'age_max' => null
+ ],
+ 'mother-in-law' => [
+ 'name' => 'Mother in Law',
+ 'gender' => 'F',
+ 'age_min' => 18,
+ 'age_max' => null
+ ]
+ ];
+
+ protected $inception_excel_columns = [
+ 'sno' => [
+ 'col_idx' => 0,
+ 'col_cell_name' => 'A',
+ 'col_name' => 'S.No',
+ 'is_mandatory' => true,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'emp_id' => [
+ 'col_idx' => 1,
+ 'col_cell_name' => 'B',
+ 'col_name' => 'EMP ID',
+ 'is_mandatory' => true,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'name_of_emp_dep' => [
+ 'col_idx' => 2,
+ 'col_cell_name' => 'C',
+ 'col_name' => 'NAME OF EMP/DEP',
+ 'is_mandatory' => true,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'dob' => [
+ 'col_idx' => 3,
+ 'col_cell_name' => 'D',
+ 'col_name' => 'DOB',
+ 'is_mandatory' => ['I', 'A', 'DA'],
+ 'data_type' => 'str',
+ 'format' => 'd-M-Y',
+ 'allowed_values' => null,
+ 'custom' => 'check_dob_diff',
+ 'params' => ['row', 'relationship', 'default_age_ratio', 'policy_details']
+ ],
+ 'gender' => [
+ 'col_idx' => 4,
+ 'col_cell_name' => 'E',
+ 'col_name' => 'Gender',
+ 'is_mandatory' => ['I', 'A', 'DA'],
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => ['M', 'F']
+ ],
+ 'relationship' => [
+ 'col_idx' => 5,
+ 'col_cell_name' => 'F',
+ 'col_name' => 'RELATIONSHIP',
+ 'is_mandatory' => ['I', 'A', 'DA'],
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => ['Self', 'Spouse', 'Son', 'Daughter', 'Father', 'Mother', 'Father in Law', 'Mother in Law'],
+ 'custom' => 'check_relationship',
+ 'params' => ['row', 'relationship', 'policy_terms']
+ ],
+ 'basic_cover_si' => [
+ 'col_idx' => 6,
+ 'col_cell_name' => 'G',
+ 'col_name' => 'BASIC COVER SI',
+ 'is_mandatory' => null,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null,
+ 'custom' => 'check_si',
+ 'params' => ['row', 'policy_details', 'slab_details']
+ ],
+ 'doc' => [
+ 'col_idx' => 7,
+ 'col_cell_name' => 'H',
+ 'col_name' => 'Date of Coverage',
+ 'is_mandatory' => ['A', 'DA'],
+ 'data_type' => 'str',
+ 'format' => 'd-M-Y',
+ 'allowed_values' => null,
+ 'custom' => 'check_doc',
+ 'params' => ['row', 'policy_details']
+ ],
+ 'doj' => [
+ 'col_idx' => 8,
+ 'col_cell_name' => 'I',
+ 'col_name' => 'DOJ',
+ 'is_mandatory' => false,
+ 'data_type' => 'str',
+ 'format' => 'd-M-Y',
+ 'allowed_values' => null,
+ 'custom' => 'check_doj',
+ 'params' => ['row']
+ ],
+ 'basic_pay' => [
+ 'col_idx' => 9,
+ 'col_cell_name' => 'J',
+ 'col_name' => 'Basic Pay',
+ 'is_mandatory' => false,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null,
+ 'custom' => 'check_basic_pay',
+ 'params' => ['row', 'policy_terms', 'slab_details']
+ ],
+ 'band_grade' => [
+ 'col_idx' => 10,
+ 'col_cell_name' => 'K',
+ 'col_name' => 'Band/Grade',
+ 'is_mandatory' => false,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null,
+ 'custom' => 'check_employee_band',
+ 'params' => ['row', 'policy_terms', 'slab_details']
+ ],
+ 'designation' => [
+ 'col_idx' => 11,
+ 'col_cell_name' => 'L',
+ 'col_name' => 'Designation',
+ 'is_mandatory' => false,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'phone' => [
+ 'col_idx' => 12,
+ 'col_cell_name' => 'M',
+ 'col_name' => 'Phone',
+ 'is_mandatory' => false,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null,
+ 'custom' => 'check_dup_mobileno',
+ 'params' => ['row', 'existing_mobilenos']
+ ],
+ 'email' => [
+ 'col_idx' => 13,
+ 'col_cell_name' => 'N',
+ 'col_name' => 'Email',
+ 'is_mandatory' => false,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null,
+ 'custom' => 'check_dup_email',
+ 'params' => ['row', 'existing_mobilenos']
+ ],
+ 'pre_existing_ailments' => [
+ 'col_idx' => 14,
+ 'col_cell_name' => 'O',
+ 'col_name' => 'PRE EXISTING AILMENTS',
+ 'is_mandatory' => ['I', 'A', 'DA'],
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => ['0', '1']
+ ],
+ 'change_event' => [
+ 'col_idx' => 15,
+ 'col_cell_name' => 'P',
+ 'col_name' => 'Change event',
+ 'is_mandatory' => ['A', 'DA', 'D'],
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'date_of_exit' => [
+ 'col_idx' => 16,
+ 'col_cell_name' => 'Q',
+ 'col_name' => 'Date of exit',
+ 'is_mandatory' => ['D'],
+ 'data_type' => 'str',
+ 'format' => 'd-M-Y',
+ 'allowed_values' => null
+ ],
+ 'reason_for_exit' => [
+ 'col_idx' => 17,
+ 'col_cell_name' => 'R',
+ 'col_name' => 'Reason for exit',
+ 'is_mandatory' => ['D'],
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'unit' => [
+ 'col_idx' => 18,
+ 'col_cell_name' => 'S',
+ 'col_name' => 'Unit',
+ 'is_mandatory' => false,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null,
+ 'custom' => 'check_unit',
+ 'params' => ['row', 'existing_units']
+ ]
+ ];
+
+ protected $deletion_excel_columns = [
+ 'sno' => [
+ 'col_idx' => 0,
+ 'col_cell_name' => 'A',
+ 'col_name' => 'S.No',
+ 'is_mandatory' => true,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'emp_id' => [
+ 'col_idx' => 1,
+ 'col_cell_name' => 'B',
+ 'col_name' => 'EMP ID',
+ 'is_mandatory' => true,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'name_of_emp_dep' => [
+ 'col_idx' => 2,
+ 'col_cell_name' => 'C',
+ 'col_name' => 'NAME OF EMP/DEP',
+ 'is_mandatory' => true,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'change_event' => [
+ 'col_idx' => 3,
+ 'col_cell_name' => 'D',
+ 'col_name' => 'Change event',
+ 'is_mandatory' => ['D'],
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'date_of_exit' => [
+ 'col_idx' => 4,
+ 'col_cell_name' => 'E',
+ 'col_name' => 'Date of exit',
+ 'is_mandatory' => ['D'],
+ 'data_type' => 'str',
+ 'format' => 'd-M-Y',
+ 'allowed_values' => null
+ ],
+ 'reason_for_exit' => [
+ 'col_idx' => 5,
+ 'col_cell_name' => 'F',
+ 'col_name' => 'Reason for exit',
+ 'is_mandatory' => ['D'],
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'claim_status' => [
+ 'col_idx' => 6,
+ 'col_cell_name' => 'G',
+ 'col_name' => 'Claim status',
+ 'is_mandatory' => ['D'],
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => [0, 1]
+ ]
+ ];
+
+ protected $correction_excel_columns = [
+ 'sno' => [
+ 'col_idx' => 0,
+ 'col_cell_name' => 'A',
+ 'col_name' => 'S.No',
+ 'is_mandatory' => true,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'emp_id' => [
+ 'col_idx' => 1,
+ 'col_cell_name' => 'B',
+ 'col_name' => 'EMP ID',
+ 'is_mandatory' => true,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'name_of_emp_dep' => [
+ 'col_idx' => 2,
+ 'col_cell_name' => 'C',
+ 'col_name' => 'NAME OF EMP/DEP',
+ 'is_mandatory' => true,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'field' => [
+ 'col_idx' => 3,
+ 'col_cell_name' => 'D',
+ 'col_name' => 'Field',
+ 'is_mandatory' => true,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => ['name', 'dob', 'relationship', 'email_corporate']
+ ],
+ 'value' => [
+ 'col_idx' => 4,
+ 'col_cell_name' => 'E',
+ 'col_name' => 'Value',
+ 'is_mandatory' => true,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'date_of_correction' => [
+ 'col_idx' => 5,
+ 'col_cell_name' => 'F',
+ 'col_name' => 'Date of Correction',
+ 'is_mandatory' => true,
+ 'data_type' => 'str',
+ 'format' => 'd-M-Y',
+ 'allowed_values' => null
+ ],
+ 'change_event' => [
+ 'col_idx' => 6,
+ 'col_cell_name' => 'G',
+ 'col_name' => 'Change event',
+ 'is_mandatory' => true,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'remarks' => [
+ 'col_idx' => 7,
+ 'col_cell_name' => 'H',
+ 'col_name' => 'Remarks',
+ 'is_mandatory' => false,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ]
+ ];
+
+ protected $si_enhance_excel_columns = [
+ 'sno' => [
+ 'col_idx' => 0,
+ 'col_cell_name' => 'A',
+ 'col_name' => 'S.No',
+ 'is_mandatory' => true,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'emp_id' => [
+ 'col_idx' => 1,
+ 'col_cell_name' => 'B',
+ 'col_name' => 'EMP ID',
+ 'is_mandatory' => true,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'name_of_emp_dep' => [
+ 'col_idx' => 2,
+ 'col_cell_name' => 'C',
+ 'col_name' => 'NAME OF EMP/DEP',
+ 'is_mandatory' => true,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'augmented_si' => [
+ 'col_idx' => 3,
+ 'col_cell_name' => 'D',
+ 'col_name' => 'Augmented SI',
+ 'is_mandatory' => true,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null,
+ 'custom' => 'check_si',
+ 'params' => ['row', 'policy_details', 'slab_details']
+ ],
+ 'date_of_enhancement' => [
+ 'col_idx' => 4,
+ 'col_cell_name' => 'E',
+ 'col_name' => 'Date of SI Enhancement',
+ 'is_mandatory' => true,
+ 'data_type' => 'str',
+ 'format' => 'd-M-Y',
+ 'allowed_values' => null
+ ]
+ ];
+
+ protected $enrollment_excel_columns = [
+ 'sno' => [
+ 'col_idx' => 0,
+ 'col_cell_name' => 'A',
+ 'col_name' => 'Sno',
+ 'is_mandatory' => true,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'emp_id' => [
+ 'col_idx' => 1,
+ 'col_cell_name' => 'B',
+ 'col_name' => 'Emp code',
+ 'is_mandatory' => true,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'name_of_emp_dep' => [
+ 'col_idx' => 2,
+ 'col_cell_name' => 'C',
+ 'col_name' => 'Name',
+ 'is_mandatory' => true,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'doj' => [
+ 'col_idx' => 3,
+ 'col_cell_name' => 'D',
+ 'col_name' => 'DOJ',
+ 'is_mandatory' => true,
+ 'data_type' => 'str',
+ 'format' => 'd-M-Y',
+ 'allowed_values' => null,
+ 'custom' => null
+ ],
+ 'gender' => [
+ 'col_idx' => 4,
+ 'col_cell_name' => 'E',
+ 'col_name' => 'Gender',
+ 'is_mandatory' => ['I', 'A', 'DA', 'E'],
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => ['M', 'F']
+ ],
+ 'relationship' => [
+ 'col_idx' => 5,
+ 'col_cell_name' => 'F',
+ 'col_name' => 'Relation',
+ 'is_mandatory' => ['I', 'A', 'DA', 'E'],
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null,
+ 'custom' => null
+ ],
+ 'dob' => [
+ 'col_idx' => 6,
+ 'col_cell_name' => 'G',
+ 'col_name' => 'DOB',
+ 'is_mandatory' => ['I', 'A', 'DA'],
+ 'data_type' => 'str',
+ 'format' => 'd-M-Y',
+ 'allowed_values' => null,
+ 'custom' => null,
+ ],
+ 'email' => [
+ 'col_idx' => 7,
+ 'col_cell_name' => 'H',
+ 'col_name' => 'Mail',
+ 'is_mandatory' => false,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'phone' => [
+ 'col_idx' => 8,
+ 'col_cell_name' => 'I',
+ 'col_name' => 'Mobile',
+ 'is_mandatory' => false,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null,
+ 'custom' => null
+ ],
+ 'basic_cover_si' => [
+ 'col_idx' => 9,
+ 'col_cell_name' => 'J',
+ 'col_name' => 'SI',
+ 'is_mandatory' => null,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null,
+ 'custom' => null
+ ],
+ 'band_grade' => [
+ 'col_idx' => 10,
+ 'col_cell_name' => 'K',
+ 'col_name' => 'Grade',
+ 'is_mandatory' => false,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null,
+ 'custom' => null
+ ],
+ 'basic_pay' => [
+ 'col_idx' => 11,
+ 'col_cell_name' => 'L',
+ 'col_name' => 'Basic Pay',
+ 'is_mandatory' => false,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null,
+ 'custom' => null
+ ],
+ 'unit' => [
+ 'col_idx' => 12,
+ 'col_cell_name' => 'M',
+ 'col_name' => 'Unit',
+ 'is_mandatory' => false,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'doc' => [
+ 'col_idx' => 13,
+ 'col_cell_name' => 'N',
+ 'col_name' => 'DOC',
+ 'is_mandatory' => false,
+ 'data_type' => 'str',
+ 'format' => 'd-M-Y',
+ 'allowed_values' => null
+ ]
+ ];
+
+ protected $incetion_to_enrollment_mapping = [
+ 0 => 0, // inception: sno (S.No) -> enrollment: sno (Sno)
+ 1 => 1, // inception: emp_id (EMP ID) -> enrollment: emp_code (Emp_Code)
+ 2 => 2, // inception: name_of_emp_dep (NAME OF EMP/DEP) -> enrollment: name (NAME OF EMP/DEP)
+ 3 => 6, // inception: dob (DOB) -> enrollment: dob (DOB)
+ 4 => 4, // inception: gender (Gender) -> enrollment: gender (Gender)
+ 5 => 5, // inception: relationship (RELATIONSHIP) -> enrollment: relationship (Relation)
+ 6 => 9, // inception: basic_cover_si (BASIC COVER SI) -> enrollment: basic_cover_si (SI)
+ 7 => 13, // inception: doc (Date of Coverage)
+ 8 => 3, // inception: doj (DOJ) -> enrollment: doj (DOJ)
+ 9 => 11, // inception: basic_pay (Basic Pay) -> enrollment: basic_pay (Basic Pay)
+ 10 => 10, // inception: band_grade (Band/Grade) -> enrollment: band_grade (Grade)
+ 11 => null, // inception: designation (Designation) -> No match in enrollment
+ 12 => 8, // inception: phone (Phone) -> enrollment: phone (Mobile)
+ 13 => 7, // inception: email (Email) -> enrollment: email (Email)
+ 14 => null, // inception: pre_existing_ailments (PRE EXISTING AILMENTS) -> No match in enrollment
+ 15 => null, // inception: change_event (Change event) -> No match in enrollment
+ 16 => null, // inception: date_of_exit (Date of exit) -> No match in enrollment
+ 17 => null, // inception: reason_for_exit (Reason for exit) -> No match in enrollment
+ 18 => null // inception: reason_for_exit (Reason for exit) -> No match in enrollment
+ ];
+
+ protected $enrollment_to_inception_mapping = [
+ 0 => 0, // enrollment: sno (Sno) -> inception: sno (S.No)
+ 1 => 1, // enrollment: emp_code (Emp_Code) -> inception: emp_id (EMP ID)
+ 2 => 2, // enrollment: name (NAME OF EMP/DEP) -> inception: name_of_emp_dep (NAME OF EMP/DEP)
+ 3 => 8, // enrollment: doj (DOJ) -> inception: doj (DOJ)
+ 4 => 4, // enrollment: gender (Gender) -> inception: gender (Gender)
+ 5 => 5, // enrollment: relationship (Relation) -> inception: relationship (RELATIONSHIP)
+ 6 => 3, // enrollment: dob (DOB) -> inception: dob (DOB)
+ 7 => 13, // enrollment: email (Email) -> inception: email (Email)
+ 8 => 12, // enrollment: phone (Mobile) -> inception: phone (Phone)
+ 9 => 6, // enrollment: basic_cover_si (SI) -> inception: basic_cover_si (BASIC COVER SI)
+ 10 => 10, // enrollment: band_grade (Grade) -> inception: band_grade (Band/Grade)
+ 11 => 9 // enrollment: basic_pay (Basic Pay) -> inception: basic_pay (Basic Pay)
+ ];
+
+ protected $multievent_excel_columns = [
+ 'sno' => [
+ 'col_idx' => 0,
+ 'col_cell_name' => 'A',
+ 'col_name' => 'S.No',
+ 'is_mandatory' => true,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'emp_id' => [
+ 'col_idx' => 1,
+ 'col_cell_name' => 'B',
+ 'col_name' => 'Emp ID',
+ 'is_mandatory' => true,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'name_of_emp_dep' => [
+ 'col_idx' => 2,
+ 'col_cell_name' => 'C',
+ 'col_name' => 'Name of Emp/Dep',
+ 'is_mandatory' => true,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'dob' => [
+ 'col_idx' => 3,
+ 'col_cell_name' => 'D',
+ 'col_name' => 'DOB',
+ 'is_mandatory' => false,
+ 'data_type' => 'date',
+ 'format' => 'Y-m-d',
+ 'allowed_values' => null
+ ],
+ 'gender' => [
+ 'col_idx' => 4,
+ 'col_cell_name' => 'E',
+ 'col_name' => 'Gender',
+ 'is_mandatory' => false,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => ['Male', 'Female', 'Other']
+ ],
+ 'relationship' => [
+ 'col_idx' => 5,
+ 'col_cell_name' => 'F',
+ 'col_name' => 'Relationship',
+ 'is_mandatory' => false,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'basic_cover_si' => [
+ 'col_idx' => 6,
+ 'col_cell_name' => 'G',
+ 'col_name' => 'Basic cover SI',
+ 'is_mandatory' => false,
+ 'data_type' => 'numeric',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'doc' => [
+ 'col_idx' => 7,
+ 'col_cell_name' => 'H',
+ 'col_name' => 'Date of Coverage',
+ 'is_mandatory' => false,
+ 'data_type' => 'date',
+ 'format' => 'Y-m-d',
+ 'allowed_values' => null
+ ],
+ 'doj' => [
+ 'col_idx' => 8,
+ 'col_cell_name' => 'I',
+ 'col_name' => 'DOJ',
+ 'is_mandatory' => false,
+ 'data_type' => 'date',
+ 'format' => 'Y-m-d',
+ 'allowed_values' => null
+ ],
+ 'basic_pay' => [
+ 'col_idx' => 9,
+ 'col_cell_name' => 'J',
+ 'col_name' => 'Basic Pay',
+ 'is_mandatory' => false,
+ 'data_type' => 'numeric',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'band_grade' => [
+ 'col_idx' => 10,
+ 'col_cell_name' => 'K',
+ 'col_name' => 'Band/Grade',
+ 'is_mandatory' => false,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'designation' => [
+ 'col_idx' => 11,
+ 'col_cell_name' => 'L',
+ 'col_name' => 'Designation',
+ 'is_mandatory' => false,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'phone' => [
+ 'col_idx' => 12,
+ 'col_cell_name' => 'M',
+ 'col_name' => 'Phone',
+ 'is_mandatory' => false,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'email' => [
+ 'col_idx' => 13,
+ 'col_cell_name' => 'N',
+ 'col_name' => 'Email',
+ 'is_mandatory' => false,
+ 'data_type' => 'email',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'pre_existing_ailments' => [
+ 'col_idx' => 14,
+ 'col_cell_name' => 'O',
+ 'col_name' => 'Pre Existing Ailments',
+ 'is_mandatory' => false,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'date_of_exit' => [
+ 'col_idx' => 15,
+ 'col_cell_name' => 'P',
+ 'col_name' => 'Date of Exit',
+ 'is_mandatory' => false,
+ 'data_type' => 'date',
+ 'format' => 'Y-m-d',
+ 'allowed_values' => null
+ ],
+ 'reason_for_exit' => [
+ 'col_idx' => 16,
+ 'col_cell_name' => 'Q',
+ 'col_name' => 'Reason for Exit',
+ 'is_mandatory' => false,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'claim_status' => [
+ 'col_idx' => 17,
+ 'col_cell_name' => 'R',
+ 'col_name' => 'Claim Status',
+ 'is_mandatory' => false,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => ['Approved', 'Rejected', 'Pending']
+ ],
+ 'field' => [
+ 'col_idx' => 18,
+ 'col_cell_name' => 'S',
+ 'col_name' => 'Correction Field',
+ 'is_mandatory' => false,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'value' => [
+ 'col_idx' => 19,
+ 'col_cell_name' => 'T',
+ 'col_name' => 'Correction Value',
+ 'is_mandatory' => false,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'date_of_correction' => [
+ 'col_idx' => 20,
+ 'col_cell_name' => 'U',
+ 'col_name' => 'Date of Correction',
+ 'is_mandatory' => false,
+ 'data_type' => 'date',
+ 'format' => 'Y-m-d',
+ 'allowed_values' => null
+ ],
+ 'remarks' => [
+ 'col_idx' => 21,
+ 'col_cell_name' => 'V',
+ 'col_name' => 'Correction Remarks',
+ 'is_mandatory' => false,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'augmented_si' => [
+ 'col_idx' => 22,
+ 'col_cell_name' => 'W',
+ 'col_name' => 'Augmented SI',
+ 'is_mandatory' => false,
+ 'data_type' => 'numeric',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'date_of_enhancement' => [
+ 'col_idx' => 23,
+ 'col_cell_name' => 'X',
+ 'col_name' => 'Date of SI Enhancement',
+ 'is_mandatory' => false,
+ 'data_type' => 'date',
+ 'format' => 'Y-m-d',
+ 'allowed_values' => null
+ ],
+ 'change_event' => [
+ 'col_idx' => 24,
+ 'col_cell_name' => 'Y',
+ 'col_name' => 'Change Event',
+ 'is_mandatory' => false,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ],
+ 'unit' => [
+ 'col_idx' => 25,
+ 'col_cell_name' => 'Z',
+ 'col_name' => 'Unit',
+ 'is_mandatory' => false,
+ 'data_type' => 'str',
+ 'format' => null,
+ 'allowed_values' => null
+ ]
+ ];
+
+
+
+
+ public function __construct()
+ {
+ // helper('utility');
+ set_session_context('EmployeeService');
+ $this->myLogger = \Config\Services::mylogger();
+ $this->employeeModel = new EmployeeModel();
+ $this->employeePolicyModel = new EmployeePolicyModel();
+ $this->clientModel = new ClientModel();
+ $this->fileModel = new FileModel();
+ $this->clientPolicyModel = new ClientPolicyModel();
+ $this->policiesModel = new PolicesModel();
+ $this->empEndorsementModel = new EmpEndorsementModel();
+ $this->messageModel = new MessageModel();
+ $this->clientBranchModel = new ClientBranchModel();
+ $this->notificationModel = new NotificationModel();
+ $this->insurerModel = new InsurerModel();
+ }
+
+ // ------------ FUNCTION FOR VADITATIONS HANDLERS -------------------------------------------------------------------------------------
+
+ public function excelMultieventFileFormateValidation($params)
+ {
+ helper('excel_util_helper');
+ $file_id = $params['file_id'];
+ $file = $this->fileModel->find($file_id);
+
+ if (!isset($file)) {
+ //file not found in DB
+ return array('status' => false, 'msg' => 'file not found in DB');
+ }
+ $file_name_with_path = WRITEPATH . "/uploads/excel/" . $file['file_name'];
+
+ //check physical file
+ if (!file_exists($file_name_with_path)) {
+ //file not found update status and reason
+ $message = "Physcial file not found";
+ // echo $message;
+ $this->myLogger->logme('error', ($message . ' for file id ' . $file_id));
+ $this->fileModel->where('id', $file_id)->set(['status' => 'failed', 'reason' => json_encode(['error_summary' => array_count_values([5]), 'error_data' => $message])])->update();
+ return array('error_summary' => [5], 'error_data' => $message);
+ }
+
+ $columns_to_check = $this->multievent_excel_columns;
+ $allowedHighestColumn = end($columns_to_check);
+ // print_rr($this->correction_excel_columns); die;
+
+ $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file_name_with_path);
+ $worksheet = $spreadsheet->getActiveSheet();
+ $highestRow = $worksheet->getHighestDataRow();
+ $highestColumn = $worksheet->getHighestDataColumn();
+
+ $excel_data = $worksheet->rangeToArray('A1:' . $allowedHighestColumn['col_cell_name'] . $highestRow);
+ $excel_header = $excel_data[0];
+
+ //check columns order in excel
+ $column_count_res = check_columns_name($columns_to_check, $excel_header);
+ if (isset($column_count_res) && count($column_count_res)) {
+ //columns count mismatch
+ $message = implode("\n", $column_count_res);
+ // echo $message;
+ $this->myLogger->logme('error', ($message . ' for file id ' . $file_id));
+ $this->fileModel->where('id', $file_id)->set(['status' => 'failed', 'reason' => json_encode(['error_summary' => array_count_values([6]), 'error_data' => $message])])->update();
+ return array('error_summary' => [6], 'error_data' => $message);
+ }
+
+ //check no of columns in excel
+ $total_defined_columns = count($columns_to_check);
+ $excel_columns = ($excel_data[0]);
+ $excel_columns_count = count($excel_columns);
+
+ if ($total_defined_columns != $excel_columns_count) {
+ //columns count mismatch
+ $message = "File columns count mismatch. Expected - $total_defined_columns and received - $excel_columns_count";
+ $this->myLogger->logme('error', ($message . ' for file id ' . $file_id));
+ $this->fileModel->where('id', $file_id)->set(['status' => 'failed', 'reason' => json_encode(['error_summary' => array_count_values([5]), 'error_data' => $message])])->update();
+ return array('error_summary' => [5], 'error_data' => $message);
+ }
+
+ // $file_paths = [
+ // 'inception' => '/opt/lampp/htdocs/claims/nhance/writable/tmp/inception_1756269562.json',
+ // 'missed_inception' => '/opt/lampp/htdocs/claims/nhance/writable/tmp/missed_inception_1756269562.json',
+ // 'addition' => '/opt/lampp/htdocs/claims/nhance/writable/tmp/addition_1756269562.json',
+ // 'dependent_addition' => '/opt/lampp/htdocs/claims/nhance/writable/tmp/dependent_addition_1756269562.json',
+ // 'deletion' => '/opt/lampp/htdocs/claims/nhance/writable/tmp/deletion_1756269562.json',
+ // 'correction' => '/opt/lampp/htdocs/claims/nhance/writable/tmp/correction_1756269562.json',
+ // 'si_enhancement' => '/opt/lampp/htdocs/claims/nhance/writable/tmp/si_enhancement_1756269562.json',
+ // ];
+ //construct and save as a .JSON file to the tmp folder and return the file paths
+ $file_paths = $this->constructMultiEventData($params);
+ $params['multi_event_file_paths'] = $file_paths;
+ // print_rr($file_paths);
+
+ $error = [];
+
+ //inception
+ if(isset($file_paths['inception']) && $file_paths['inception'] != "" && $file_paths['inception'] != null){
+ $params["action"] = "inception";
+ $params["file_path"] = $file_paths['inception'];
+ $error[] = $this->excelFileFormatValidation($params);
+ }
+
+ //addition
+ if(isset($file_paths['addition']) && $file_paths['addition'] != "" && $file_paths['addition'] != null){
+ $params["action"] = "addition";
+ $params["file_path"] = $file_paths['addition'];
+ $error[] = $this->excelFileFormatValidation($params);
+ }
+
+ //dependent_addition
+ if(isset($file_paths['dependent_addition']) && $file_paths['dependent_addition'] != "" && $file_paths['dependent_addition'] != null){
+ $params["action"] = "dependent_addition";
+ $params["file_path"] = $file_paths['dependent_addition'];
+ $error[] = $this->excelFileFormatValidation($params);
+ }
+
+ //deletion
+ if(isset($file_paths['deletion']) && $file_paths['deletion'] != "" && $file_paths['deletion'] != null){
+ $params["action"] = "deletion";
+ $params["file_path"] = $file_paths['deletion'];
+ $error[] = $this->excelFileFormatValidation($params);
+ }
+
+ //correction
+ if(isset($file_paths['correction']) && $file_paths['correction'] != "" && $file_paths['correction'] != null){
+ $params["action"] = "correction";
+ $params["file_path"] = $file_paths['correction'];
+ $error[] = $this->excelFileFormatValidation($params);
+ }
+
+ //si_enhancement
+ if(isset($file_paths['si_enhancement']) && $file_paths['si_enhancement'] != "" && $file_paths['si_enhancement'] != null){
+ $params["action"] = "si_enhancement";
+ $params["file_path"] = $file_paths['si_enhancement'];
+ $error[] = $this->excelFileFormatValidation($params);
+ }
+
+ //missed_inception
+ if(isset($file_paths['missed_inception']) && $file_paths['missed_inception'] != "" && $file_paths['missed_inception'] != null){
+ $params["action"] = "missed_inception";
+ $params["file_path"] = $file_paths['missed_inception'];
+ $error[] = $this->excelFileFormatValidation($params);
+ }
+
+ $error_type = 1;
+ $error = $this->mergeErrors($error, $error_type);
+ // print_rr($error);die;
+
+ if (isset($error['error_data']) && count($error['error_data']) == 0) {
+ $r = Jobs::addJob(['job_name' => 'excelMultieventFileDataValidation', 'payload' => $params]);
+ } else {
+
+ // $error['error_summary'] = array_count_values($error['error_summary']);
+ $status = 'failed';
+ $failure_reason = ((json_encode($error)));
+ $this->fileModel->where('id', $file_id)->set(['status' => $status, 'reason' => $failure_reason])->update();
+ $this->myLogger->logme("error", 'excel Multi event File Formate Validation {file_id} uploaded failed', ['file_id' => $file_id]);
+
+ //set failure msg to pull notifications
+ $this->setPullNotification($this->getFileMetaDataByFileId($file_id, 'failure'));
+
+ // remove the file form the folder after failed the function
+ $this->unlinkFiles($file_paths);
+ }
+
+ return ($error);
+
+ }
+
+ public function excelMultieventFileDataValidation($params)
+ {
+ helper('excel_util_helper');
+ $file_id = $params['file_id'];
+ $file = $this->fileModel->find($file_id);
+
+ if (!isset($file)) {
+ //file not found in DB
+ return array('status' => false, 'msg' => 'file not found in DB');
+ }
+
+ // $file_paths = [
+ // 'inception' => '/opt/lampp/htdocs/claims/nhance/writable/tmp/inception_1756269562.json',
+ // 'missed_inception' => '/opt/lampp/htdocs/claims/nhance/writable/tmp/missed_inception_1756269562.json',
+ // 'addition' => '/opt/lampp/htdocs/claims/nhance/writable/tmp/addition_1756269562.json',
+ // 'dependent_addition' => '/opt/lampp/htdocs/claims/nhance/writable/tmp/dependent_addition_1756269562.json',
+ // 'deletion' => '/opt/lampp/htdocs/claims/nhance/writable/tmp/deletion_1756269562.json',
+ // 'correction' => '/opt/lampp/htdocs/claims/nhance/writable/tmp/correction_1756269562.json',
+ // 'si_enhancement' => '/opt/lampp/htdocs/claims/nhance/writable/tmp/si_enhancement_1756269562.json',
+ // ];
+ // set the file paths
+ $file_paths = $params['multi_event_file_paths'];
+ // print_rr($file_paths);
+
+ $error = [];
+
+ //inception
+ if (isset($file_paths['inception']) && $file_paths['inception'] != "" && $file_paths['inception'] != null) {
+ $params["action"] = "inception";
+ $params["file_path"] = $file_paths['inception'];
+ $error[] = $this->excelFileDataValidation($params);
+ }
+
+ //addition
+ if (isset($file_paths['addition']) && $file_paths['addition'] != "" && $file_paths['addition'] != null) {
+ $params["action"] = "addition";
+ $params["file_path"] = $file_paths['addition'];
+ $error[] = $this->excelFileDataValidation($params);
+ }
+
+ //dependent_addition
+ if (isset($file_paths['dependent_addition']) && $file_paths['dependent_addition'] != "" && $file_paths['dependent_addition'] != null) {
+ $params["action"] = "dependent_addition";
+ $params["file_path"] = $file_paths['dependent_addition'];
+ $error[] = $this->excelFileDataValidation($params);
+ }
+
+ //deletion
+ if (isset($file_paths['deletion']) && $file_paths['deletion'] != "" && $file_paths['deletion'] != null) {
+ $params["action"] = "deletion";
+ $params["file_path"] = $file_paths['deletion'];
+ $error[] = $this->excelFileDataValidation($params);
+ }
+
+ //correction
+ if (isset($file_paths['correction']) && $file_paths['correction'] != "" && $file_paths['correction'] != null) {
+ $params["action"] = "correction";
+ $params["file_path"] = $file_paths['correction'];
+ $error[] = $this->excelFileDataValidation($params);
+ }
+
+ //si_enhancement
+ if (isset($file_paths['si_enhancement']) && $file_paths['si_enhancement'] != "" && $file_paths['si_enhancement'] != null) {
+ $params["action"] = "si_enhancement";
+ $params["file_path"] = $file_paths['si_enhancement'];
+ $error[] = $this->excelFileDataValidation($params);
+ }
+
+ //missed_inception
+ if (isset($file_paths['missed_inception']) && $file_paths['missed_inception'] != "" && $file_paths['missed_inception'] != null) {
+ $params["action"] = "missed_inception";
+ $params["file_path"] = $file_paths['missed_inception'];
+ $error[] = $this->excelFileDataValidation($params);
+ }
+
+ $error_type = 2;
+ $error = $this->mergeErrors($error, $error_type);
+ // print_rr($error);die;
+
+ if (isset($error['error_data']) && count($error['error_data']) == 0) {
+ $r = Jobs::addJob(['job_name' => 'excelMultieventFileOnBoard', 'payload' => $params]);
+ } else {
+
+ // $error['error_summary'] = array_count_values($error['error_summary']);
+ $status = 'failed';
+ $failure_reason = ((json_encode($error)));
+ $this->fileModel->where('id', $file_id)->set(['status' => $status, 'reason' => $failure_reason])->update();
+ $this->myLogger->logme("error", 'excel Multi event File Data Validation {file_id} uploaded failed', ['file_id' => $file_id]);
+
+ //set failure msg to pull notifications
+ $this->setPullNotification($this->getFileMetaDataByFileId($file_id, 'failure'));
+ }
+
+ return ($error);
+ }
+
+ public function excelMultieventFileOnBoard($params)
+ {
+ helper('excel_util_helper');
+
+ $file_id = $params['file_id'];
+ $file = $this->fileModel->find($file_id);
+
+ if (!isset($file)) {
+ //file not found in DB
+ return array('status' => false, 'msg' => 'file not found in DB');
+ }
+
+ // $file_paths = [
+ // 'inception' => '/opt/lampp/htdocs/claims/nhance/writable/tmp/inception_1756269562.json',
+ // 'missed_inception' => '/opt/lampp/htdocs/claims/nhance/writable/tmp/missed_inception_1756269562.json',
+ // 'addition' => '/opt/lampp/htdocs/claims/nhance/writable/tmp/addition_1756269562.json',
+ // 'dependent_addition' => '/opt/lampp/htdocs/claims/nhance/writable/tmp/dependent_addition_1756269562.json',
+ // 'deletion' => '/opt/lampp/htdocs/claims/nhance/writable/tmp/deletion_1756269562.json',
+ // 'correction' => '/opt/lampp/htdocs/claims/nhance/writable/tmp/correction_1756269562.json',
+ // 'si_enhancement' => '/opt/lampp/htdocs/claims/nhance/writable/tmp/si_enhancement_1756269562.json',
+ // ];
+ $file_paths = $params['multi_event_file_paths'];
+ // print_rr($file_paths);
+
+ $error = [];
+
+ //inception
+ if (isset($file_paths['inception']) && $file_paths['inception'] != "" && $file_paths['inception'] != null) {
+ $params["action"] = "inception";
+ $params["file_path"] = $file_paths['inception'];
+ $error['inception'] = $this->employeesOnboardPreprocess($params);
+ }
+
+ //addition
+ if (isset($file_paths['addition']) && $file_paths['addition'] != "" && $file_paths['addition'] != null) {
+ $params["action"] = "addition";
+ $params["file_path"] = $file_paths['addition'];
+ $error['addition'] = $this->employeesOnboardPreprocess($params);
+ }
+
+ //dependent_addition
+ if (isset($file_paths['dependent_addition']) && $file_paths['dependent_addition'] != "" && $file_paths['dependent_addition'] != null) {
+ $params["action"] = "dependent_addition";
+ $params["file_path"] = $file_paths['dependent_addition'];
+ $error['dependent_addition'] = $this->employeesOnboardPreprocess($params);
+ }
+
+ //missed_inception
+ if (isset($file_paths['missed_inception']) && $file_paths['missed_inception'] != "" && $file_paths['missed_inception'] != null) {
+ $params["action"] = "missed_inception";
+ $params["file_path"] = $file_paths['missed_inception'];
+ $error['missed_inception'] = $this->employeesOnboardPreprocess($params);
+ }
+
+ //deletion
+ if (isset($file_paths['deletion']) && $file_paths['deletion'] != "" && $file_paths['deletion'] != null) {
+ $params["action"] = "deletion";
+ $params["file_path"] = $file_paths['deletion'];
+ $error['deletion'] = $this->employeeDisembark($params);
+ }
+
+ //correction
+ if (isset($file_paths['correction']) && $file_paths['correction'] != "" && $file_paths['correction'] != null) {
+ $params["action"] = "correction";
+ $params["file_path"] = $file_paths['correction'];
+ $error['correction'] = $this->employeesCorrectionProcess($params);
+ }
+
+ //si_enhancement
+ if (isset($file_paths['si_enhancement']) && $file_paths['si_enhancement'] != "" && $file_paths['si_enhancement'] != null) {
+ $params["action"] = "si_enhancement";
+ $params["file_path"] = $file_paths['si_enhancement'];
+ $error['si_enhancement'] = $this->employeesSIEnhanceProcess($params);
+ }
+
+ $this->fileModel->where('id', $file_id)->set(['status' => 'success', 'reason' => ''])->update();
+ $this->myLogger->logme("error", $file['action'].': {file_id} uploaded success', ['file_id' => $file_id]);
+ $this->setPullNotification($this->getFileMetaDataByFileId($file_id, 'success'));
+
+ //After insert the success than remove the TEMP JSON files
+ // $this->unlinkFiles($params['multi_event_file_paths']);
+
+ return ($error);
+ }
+
+ // ------------ FUNCTION FOR VADITATIONS -------------------------------------------------------------------------------------
+
+ public function excelFileFormatValidation($params)
+ {
+ helper('excel_util_helper');
+ // dd($params);
+ //get file name
+ $file_id = $params['file_id'];
+ $file = $this->fileModel->find($file_id);
+ $file['action'] = $params['action'];
+ // dd($file);
+
+ $return = [];
+ if (!isset($file)) {
+ //file not found in DB
+ return array('status' => false, 'msg' => 'file not found in DB');
+ }
+
+ $file_name_with_path = WRITEPATH . "/uploads/excel/" . $file['file_name'];
+
+ //check physical file
+ if (!file_exists($file_name_with_path)) {
+ //file not found update status and reason
+ $message = "Physcial file not found";
+ $this->myLogger->logme('error', ($message . ' for file id ' . $file_id));
+ $this->fileModel->where('id', $file_id)->set(['status' => 'failed', 'reason' => json_encode(['error_summary' => array_count_values([5]), 'error_data' => $message])])->update();
+ return array('error_summary' => [5], 'error_data' => $message);
+ }
+
+ //start validation process
+ $columns_to_check = [];
+ if ($file['action'] == 'inception') {
+ $columns_to_check = $this->inception_excel_columns;
+ }
+ if ($file['action'] == 'addition') {
+ $columns_to_check = $this->inception_excel_columns;
+ }
+ if ($file['action'] == 'dependent_addition') {
+ $columns_to_check = $this->inception_excel_columns;
+ }
+ if ($file['action'] == 'deletion') {
+ $columns_to_check = $this->deletion_excel_columns;
+ }
+ if ($file['action'] == 'correction') {
+ $columns_to_check = $this->correction_excel_columns;
+ }
+ if ($file['action'] == 'si_enhancement') {
+ $columns_to_check = $this->si_enhance_excel_columns;
+ }
+ if ($file['action'] == 'enrollment') {
+ $columns_to_check = $this->enrollment_excel_columns;
+ }
+ if ($file['action'] == 'missed_inception') {
+ $columns_to_check = $this->inception_excel_columns;
+ }
+
+ $columns_to_check = $this->syncColIndex($this->multievent_excel_columns, $columns_to_check);
+ // print_rr($columns_to_check);
+
+ $result = ['error_type' => 1, 'error_summary' => [], 'error_data' => []];
+ $keys = array_keys($columns_to_check);
+
+ $excel_data = json_decode(file_get_contents($params['file_path'] ?? []), true);
+ // dd($excel_data);
+
+ // get policy and rack details
+ $policy_details = $this->clientPolicyModel->getPolicyDetails($file['client_id'], $file['policy_id']);
+ $policy_terms = json_decode($policy_details[0]->policy_terms);
+ $policy_terms = (array) $policy_terms; // convert obj to array
+ $default_age_ratio = isset($policy_terms['age_ratio']) ? json_decode(json_encode($policy_terms['age_ratio']), true) : [];
+
+ //get policy slab rates
+ $slab_details = $this->policiesModel->getPolicySlabRatesForEmpOnboard($file['policy_id'], $file['client_id']);
+ // dd($slab_details);
+
+ //remove header
+ unset($excel_data[0]);
+ $relationship = $this->general_relationships;
+ //get exisiting mobilr nos
+ $existing_mobilenos = $this->employeePolicyModel->getExisitingMobileNos(client_policy_id: $file['policy_id']);
+ //get existing units in the current branch
+ $existing_units = $this->clientBranchModel->getExisitingUnits(client_id: $file['client_id'], client_branch_id: $file['client_branch_id']);
+ // dd($excel_data);
+ foreach ($excel_data as $row_key => $row) {
+ //define row wise action/event in temporary variable
+ $current_column_action = null;
+ if ($file['action'] == 'inception') {
+ $current_column_action = 'I';
+ } else if ($file['action'] == 'addition') {
+ $current_column_action = 'A';
+ } else if ($file['action'] == 'dependent_addition') {
+ $current_column_action = 'DA';
+ } else if ($file['action'] == 'deletion') {
+ $current_column_action = 'D';
+ } else if ($file['action'] == 'correction') {
+ $current_column_action = 'C';
+ } else if ($file['action'] == 'si_enhancement') {
+ $current_column_action = 'SI';
+ } else if ($file['action'] == 'enrollment') {
+ $current_column_action = 'I';
+ } else if ($file['action'] == 'missed_inception') {
+ $current_column_action = 'MI';
+ }
+ //1. avoid empty rows
+ if (check_row_is_empty_or_null($row)) {
+ break;
+ }
+ // Kint::dump($keys);
+ if ($file['action'] == 'enrollment') {
+ $row = transform_enrollment_row_to_inception_row($row);
+ $columns_to_check = $this->inception_excel_columns;
+ $keys = array_keys($columns_to_check);
+ $enrollment_columns_to_check = $this->enrollment_excel_columns;
+ $enrollment_keys = array_keys($enrollment_columns_to_check);
+ }
+
+ //iterate each row for columns validations
+ foreach ($row as $col_key => $col) {
+ $is_mandatory = $columns_to_check[$keys[$col_key]]['is_mandatory'];
+ $format = $columns_to_check[$keys[$col_key]]['format'];
+ $allowed_values = $columns_to_check[$keys[$col_key]]['allowed_values'];
+ $custom_function = isset($columns_to_check[$keys[$col_key]]['custom']) ? $columns_to_check[$keys[$col_key]]['custom'] : null;
+ $binding_params = isset($columns_to_check[$keys[$col_key]]['params']) ? $columns_to_check[$keys[$col_key]]['params'] : null;
+
+ $column_dispaly_name = $columns_to_check[$keys[$col_key]]['col_name'];
+ $column_index = $columns_to_check[$keys[$col_key]]['col_idx'];
+ $column_cell = $columns_to_check[$keys[$col_key]]['col_cell_name'];
+ if ($file['action'] == 'enrollment') {
+ if (isset($enrollment_keys[$this->incetion_to_enrollment_mapping[$col_key]]) && $enrollment_keys[$this->incetion_to_enrollment_mapping[$col_key]] != null && $enrollment_keys[$this->incetion_to_enrollment_mapping[$col_key]] != "") {
+ $column_dispaly_name = $enrollment_columns_to_check[$enrollment_keys[$this->incetion_to_enrollment_mapping[$col_key]]]['col_name'];
+ $column_index = $enrollment_columns_to_check[$enrollment_keys[$this->incetion_to_enrollment_mapping[$col_key]]]['col_idx'];
+ $column_cell = $enrollment_columns_to_check[$enrollment_keys[$this->incetion_to_enrollment_mapping[$col_key]]]['col_cell_name'];
+ }
+ }
+
+ $row['current_action'] = $current_column_action;
+
+ //mandatory check
+ if (is_bool($is_mandatory) && $is_mandatory === true) {
+ if ($col == "" || $col == NULL) {
+ array_push($result['error_summary'], 1); //push error code for summary
+ $result['error_data'][$row_key][$keys[$col_key]]['col_name'] = $column_dispaly_name; //push column name
+ $result['error_data'][$row_key][$keys[$col_key]]['col_idx'] = $column_index; //push column index
+ $result['error_data'][$row_key][$keys[$col_key]]['error'][] = 'Value is mandatory'; //push exact error desc
+ }
+ }
+
+ //if is_mandatory is array (action based mandatory check)
+ if ($current_column_action != null && is_array($is_mandatory) && in_array(strtoupper(trim($current_column_action)), $is_mandatory)) {
+ $allowed_actions = $columns_to_check[$keys[$col_key]]['is_mandatory'];
+ if ($col == "" || $col == NULL) {
+ array_push($result['error_summary'], 1);
+ $result['error_data'][$row_key][$keys[$col_key]]['col_name'] = $column_dispaly_name; //push column name
+ $result['error_data'][$row_key][$keys[$col_key]]['col_idx'] = $column_index; //push column index
+ $result['error_data'][$row_key][$keys[$col_key]]['error'][] = 'Value is mandatory for this action/event';
+ }
+ }
+
+ //format check
+ if (isset($format)) {
+ $format_error = check_excel_date_format($col, $format);
+ if (!$format_error['status']) {
+ array_push($result['error_summary'], 2);
+ $result['error_data'][$row_key][$keys[$col_key]]['col_name'] = $column_dispaly_name; //push column name
+ $result['error_data'][$row_key][$keys[$col_key]]['col_idx'] = $column_index; //push column index
+ $result['error_data'][$row_key][$keys[$col_key]]['error'][] = $format_error['error'];
+ }
+ }
+ // Kint::dump($is_mandatory);
+ //allowed values check
+ if (($is_mandatory === true && isset($allowed_values) && is_array($allowed_values)) || (is_array($is_mandatory) && (isset($allowed_values) && is_array($allowed_values)))) {
+ // print_r($allowed_values);
+ // dd($col);
+ if (!in_array((trim($col)), $allowed_values)) {
+ array_push($result['error_summary'], 3);
+ $result['error_data'][$row_key][$keys[$col_key]]['col_name'] = $column_dispaly_name; //push column name
+ $result['error_data'][$row_key][$keys[$col_key]]['col_idx'] = $column_index; //push column index
+ $result['error_data'][$row_key][$keys[$col_key]]['error'][] = "Value not allowed: Expected " . implode(",", $allowed_values) . " and received $col";
+ }
+ }
+
+ //custom function check
+ if (isset($custom_function)) {
+ //convert string params into PHP variables
+ // Create an array of variables to pass custom helper funcitons
+ $param_values = [];
+ foreach ($binding_params as $bkey => $bparam) {
+ $param_values[] = ($$bparam);
+ }
+ // dd(($param_values));//die();
+ $res = call_user_func_array($custom_function, $param_values);
+ // print_r($res['status']);die();
+ if ($res['status'] === false) {
+ array_push($result['error_summary'], 4);
+ $result['error_data'][$row_key][$keys[$col_key]]['col_name'] = $column_dispaly_name; //push column name
+ $result['error_data'][$row_key][$keys[$col_key]]['col_idx'] = $column_index; //push column index
+ $result['error_data'][$row_key][$keys[$col_key]]['error'][] = $res['error'];
+ }
+ }
+ } //col foreach
+ // break;
+ } //row foreach
+
+ // dd($result);
+ if (isset($result['error_summary']) && count($result['error_summary'])) {
+ $result['error_summary'] = array_count_values($result['error_summary']);
+ $this->myLogger->logme("error", '{file_id} uploaded failed', ['file_id' => $file_id]);
+ }
+
+ return $result;
+ }
+
+ public function excelFileDataValidation($params)
+ {
+ helper('excel_util_helper');
+
+ //get file name
+ $file_id = $params['file_id'];
+ $file = $this->fileModel->find($file_id);
+ $file['action'] = $params['action'];
+ // Kint::dump($file);
+
+ $return = [];
+ if (!isset($file)) {
+ //file not found in DB
+ return array('status' => false, 'msg' => 'file not found in DB');
+ }
+
+ $columns_to_check = [];
+ if ($file['action'] == 'inception') {
+ $columns_to_check = $this->inception_excel_columns;
+ }
+ if ($file['action'] == 'addition') {
+ $columns_to_check = $this->inception_excel_columns;
+ }
+ if ($file['action'] == 'dependent_addition') {
+ $columns_to_check = $this->inception_excel_columns;
+ }
+ if ($file['action'] == 'deletion') {
+ $columns_to_check = $this->deletion_excel_columns;
+ }
+ if ($file['action'] == 'correction') {
+ $columns_to_check = $this->correction_excel_columns;
+ }
+ if ($file['action'] == 'si_enhancement') {
+ $columns_to_check = $this->si_enhance_excel_columns;
+ }
+ if ($file['action'] == 'enrollment') {
+ $columns_to_check = $this->enrollment_excel_columns;
+ }
+ if ($file['action'] == 'missed_inception') {
+ $columns_to_check = $this->inception_excel_columns;
+ }
+
+ $columns_to_check = $this->syncColIndex($this->multievent_excel_columns, $columns_to_check);
+ // print_rr($columns_to_check);
+
+ // get policy and rack details
+ $policy_terms = $this->clientPolicyModel->getPolicyDetails($file['client_id'], $file['policy_id']);
+ $policy_details = (array)$policy_terms[0];
+ $is_lgbtq = $policy_details['is_lgbtq'];
+
+ $policy_terms = json_decode($policy_terms[0]->policy_terms);
+ $policy_terms = (array) $policy_terms; // convert obj to array
+ // dd($policy_terms);
+
+ $result = ['error_type' => 2, 'error_summary' => [], 'error_data' => []];
+ $keys = array_keys($columns_to_check);
+ $allowedHighestColumn = end($columns_to_check);
+
+ //get excel data
+ $excel_data = json_decode(file_get_contents($params['file_path'] ?? []), true);
+ // Kint::dump($excel_data);
+
+ //remove header
+ unset($excel_data[0]);
+ $relationship = $this->general_relationships;
+
+
+ if (in_array($file['action'], ['inception', 'missed_inception', 'addition', 'dependent_addition', 'deletion', 'correction', 'si_enhancement', 'enrollment'])) // the below funcitons are only for I,DA,A
+ {
+ $employee_data_group_by_family = data_group_by_family($excel_data, 'excel', ($file['action'] == 'enrollment' ? 'enrollment' : ''));
+ // dd($employee_data_group_by_family);
+ $is_self_available_in_policy_terms = false;
+ if ($policy_details['policy_type_id'] == 3) // GMC parents
+ {
+ $temp = $policy_terms['family_floaters'];
+ $temp = is_array($temp) ? $temp : (is_object($temp) ? (array)$temp : []);
+
+ $is_self_available_in_policy_terms = isset($temp['self']) && $temp['self'] == 1 ? true : false;
+ // Kint::dump($temp['self']);
+ // dd($is_self_available_in_policy_terms);
+ }
+ // dd($employee_data_group_by_family);
+ foreach ($employee_data_group_by_family as $emp_id => $family) {
+
+ //if action is DA then get all familiy members,transfrom them into excel array, addd data source as db or excel
+ if ($file['action'] == 'dependent_addition') {
+ $existing_famility_details = $this->employeeModel->getEmpFamilybyEmpCode(emp_code: $emp_id, client_id: $file['client_id'], client_policy_id: $file['policy_id'], emp_status: ['active'], policy_status: ['active'], client_branch_id: [$file['client_branch_id']]);
+ // dd(($existing_famility_details));
+ //transsform familiy details from db columns to exxcel row with column indexs for checking remaining functionalitites
+ $existing_famility_details = transform_db_data_to_excel($existing_famility_details, $file);
+ // dd(array_keys($existing_famility_details[0]));
+ $family = array_merge($family, $existing_famility_details);
+ // kint::dump($family);
+ $family = data_group_by_family($family)[$emp_id]; // reason to call this again bring self to first index of the array
+ }
+ $firstNonTemp = null;
+
+ foreach ($family as $fam) {
+ if (!isset($fam['temp'])) {
+ $firstNonTemp = $fam;
+ break;
+ }
+ }
+ // kint::dump($family);//die();
+
+ //check name dup within a family
+ if ($file['action'] == 'inception' || $file['action'] == 'missed_inception' || $file['action'] == 'addition' || $file['action'] == 'dependent_addition' || $file['action'] == 'enrollment') {
+ $res = name_dup_check_within_family($family, $file['action']); //in both file data & DB data
+ // dd($res);
+ if (count($res)) {
+ foreach ($res as $k => $rowid) {
+ array_push($result['error_summary'], 7); // dup entry in excel file
+ $result['error_data'][$rowid]['name_of_emp_dep']['error'][] = "Twofold Name found within family";
+ }
+ }
+ }
+
+ if ((($file['action'] == 'inception' || $file['action'] == 'missed_inception' || $file['action'] == 'addition' || $file['action'] == 'enrollment') || ($policy_details['policy_type_id'] == 3 && $is_self_available_in_policy_terms)) && ($policy_details['base_policy'] == null || $policy_details['base_policy'] == 0)) // 3 is GMC parents dep addon)
+ {
+ $res = check_self_available_in_family($family, $file['action']);
+ if (!$res['is_self_found']) {
+ array_push($result['error_summary'], 14); // Self not found
+ $result['error_data'][$res['row_id']]['sno']['error'][] = "Self not found in uploaded file";
+ }
+ }
+
+ //check self avaialbe either same policy DB level(i.e.) gMC parents
+ if ($file['action'] == 'dependent_addition' || ($policy_details['policy_type_id'] == 3 && !$is_self_available_in_policy_terms)) // 3 is GMC parents as base policy not as dep addon)
+ {
+ $self_details = $this->employeeModel->getEmpFamilybyEmpCode(emp_code: trim($emp_id), client_id: $file['client_id'], emp_status: ['active', 'draft', 'enrolled'], policy_status: ['active', 'draft', 'enrolled'], client_branch_id: [$file['client_branch_id']], relationship: ['self']);
+ // dd($self_details);
+ if (!count($self_details)) {
+ array_push($result['error_summary'], 14); // Self not found
+ $result['error_data'][$firstNonTemp[0]]['sno']['error'][] = "Self not found in Database";
+ }
+ }
+
+
+ if ($file['action'] == 'dependent_addition' || $file['action'] == 'addition' || $file['action'] == 'inception' || $file['action'] == 'missed_inception' || $file['action'] == 'enrollment') {
+ $res = check_dependent_conflict($family, $policy_terms, $file['action'], $is_lgbtq);
+ // Kint::dump($res);
+ if (!$res['status']) {
+ foreach ($res['error_data'] as $key => $value) {
+ array_push($result['error_summary'], $value['code']);
+ $result['error_data'][$value['row_id']][($value['col_name'])]['error'][] = $value['msg'];
+ }
+ }
+ }
+
+ //check dup with empid and name with db
+ $res = name_and_empid_check_in_db($family, $file);
+ // Kint::dump($res['del']);
+ // echo '
';
+ // print_r($res);
+ if (count($res['del'])) {
+ foreach ($res['del'] as $k => $rowid) {
+ array_push($result['error_summary'], 10); //record not avail for deletion
+ $result['error_data'][$rowid]['name_of_emp_dep']['error'][] = "Record Not found ";
+ }
+ }
+ if (count($res['i'])) {
+ foreach ($res['i'] as $k => $rowid) {
+ array_push($result['error_summary'], 9); //dup entry
+ $result['error_data'][$rowid]['name_of_emp_dep']['error'][] = "Record already exists";
+ }
+ }
+ } // end of foreach
+ } // end of if current action I,DA,A
+
+ // return $result;
+ if (isset($result['error_summary']) && count($result['error_summary'])) {
+
+ $result['error_summary'] = array_count_values($result['error_summary']);
+ $status = 'failed';
+ $failure_reason = ((json_encode($result)));
+ $this->fileModel->where('id', $file_id)->set(['status' => $status, 'reason' => $failure_reason])->update();
+ $this->myLogger->logme("error", '{file_id} uploaded failed', ['file_id' => $file_id]);
+
+ //set failure msg to pull notifications
+ $this->setPullNotification($this->getFileMetaDataByFileId($file_id, 'failure'));
+
+ }
+
+ return $result;
+ }
+
+ // ------------ FUNCTION FOR ON-BOARD PROCESS -------------------------------------------------------------------------------------
+
+ // calculate data points and premium
+ public function employeesOnboardPreprocess($params)
+ {
+ helper('excel_util_helper');
+ // dd($params);
+ if (isset($params['file_id'])) //handle data from excel to inception
+ {
+ //get file name
+ $file_id = $params['file_id'];
+ $file = $this->fileModel->find($file_id);
+ $file['action'] = $params['action'];
+ // dd($file);
+ $return = [];
+ if (!isset($file)) {
+ //file not found in DB
+ return array('status' => false, 'msg' => 'file not found in DB');
+ }
+
+ // $file_name_with_path = WRITEPATH . "/uploads/excel/" . $file['file_name'];
+
+ // //check physical file
+ // if (!file_exists($file_name_with_path)) {
+ // //file not found update status and reason
+ // $message = "Physical file not found";
+ // // echo $message;
+ // $this->myLogger->logme('error', ($message . ' for file id ' . $file_id));
+ // $this->fileModel->where('id', $file_id)->set(['status' => 'failed', 'reason' => json_encode(['error_summary' => array_count_values([5]), 'error_data' => $message])])->update();
+ // return array('error_summary' => [5], 'error_data' => $message);
+ // }
+
+ $columns_to_check = [];
+ if ($file['action'] == 'inception') {
+ $columns_to_check = $this->inception_excel_columns;
+ }
+ if ($file['action'] == 'addition') {
+ $columns_to_check = $this->inception_excel_columns;
+ }
+ if ($file['action'] == 'dependent_addition') {
+ $columns_to_check = $this->inception_excel_columns;
+ }
+ if ($file['action'] == 'deletion') {
+ $columns_to_check = $this->deletion_excel_columns;
+ }
+ if ($file['action'] == 'correction') {
+ $columns_to_check = $this->correction_excel_columns;
+ }
+ if ($file['action'] == 'si_enhancement') {
+ $columns_to_check = $this->si_enhance_excel_columns;
+ }
+ if ($file['action'] == 'missed_inception') {
+ $columns_to_check = $this->inception_excel_columns;
+ }
+
+ // get policy and rack details
+ $policy_terms = $this->clientPolicyModel->getPolicyDetails($file['client_id'], $file['policy_id']);
+ $policy_terms = (array) $policy_terms[0]; // convert obj to array
+ // $policy_terms = json_decode($policy_terms[0]->policy_terms);
+
+ // dd($policy_terms);
+
+ //get excel data
+ // $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file_name_with_path);
+ // $sheet = $spreadsheet->getActiveSheet();
+ // $highestRowAndColumn = $sheet->getHighestRowAndColumn();
+ // $allowedHighestColumn = end($columns_to_check);
+ // $excel_data = $sheet->rangeToArray('A1:' . $allowedHighestColumn['col_cell_name'] . $highestRowAndColumn['row']);
+ $excel_data = json_decode(file_get_contents($params['file_path'] ?? []), true);
+ unset($excel_data[0]);
+
+
+ //get policy slab rates
+ $slab_details = $this->policiesModel->getPolicySlabRatesForEmpOnboard($file['policy_id'], $file['client_id']);
+ // dd($slab_details);
+ //get existing units in the current branch
+ $existing_units = $this->clientBranchModel->getExisitingUnits(client_id: $file['client_id'], client_branch_id: $file['client_branch_id']);
+
+ $employee_data_group_by_family = data_group_by_family($excel_data);
+ // dd($employee_data_group_by_family);
+ foreach ($employee_data_group_by_family as $emp_id => $family) {
+
+ //if action is DA then get all familiy members,transfrom them into excel array, addd data source as db or excel
+ if ($file['action'] == 'dependent_addition') {
+ $existing_famility_details = $this->employeeModel->getEmpFamilybyEmpCode(emp_code: $emp_id, client_id: $file['client_id'], client_policy_id: $file['policy_id'], emp_status: ['active'], policy_status: ['active'], client_branch_id: [$file['client_branch_id']]);
+ // dd($existing_famility_details);
+ //transsform familiy details from db columns to exxcel row with column indexs for checking remaining functionalitites
+ $existing_famility_details = transform_db_data_to_excel($existing_famility_details, $file);
+ // Kint::dump($existing_famility_details);
+ $family = array_merge($family, $existing_famility_details);
+ $family = data_group_by_family($family)[$emp_id]; // reason to call this again is bring self to first index of the array
+ // dd($family);
+ }
+
+ // Kint::dump($family);
+ $data = calculate_premium_new(family_data: $family, policy_terms: $policy_terms, slab_details: $slab_details, fileArr: $file, existing_units: $existing_units);
+ // dd($data);
+ $employee_data_group_by_family[$emp_id] = $data;
+ $this->employeesOnboardProcess(['familiy_data' => $data, 'file' => $file]);
+ }
+
+ // $this->fileModel->where('id', $file_id)->set(['status' => 'success', 'reason' => ''])->update();
+ $this->myLogger->logme("error", $file['action'].': {file_id} uploaded success', ['file_id' => $file_id]);
+ // $this->setPullNotification($this->getFileMetaDataByFileId($file_id, 'success'));
+ } else if (isset($params['client_policy_id'])) //handle data from enrollment to inception
+ {
+ $client_policy_id = $params['client_policy_id'];
+ //get client id
+ $client_id = ($this->clientPolicyModel->select('client_id')->find($client_policy_id))['client_id'];
+ // dd($client_id);
+
+ // get policy and rack details
+ $policy_terms = $this->clientPolicyModel->getPolicyDetails($client_id, $client_policy_id);
+ $policy_terms = (array) $policy_terms[0]; // convert obj to array
+
+ //get policy slab rates
+ $slab_details = $this->policiesModel->getPolicySlabRatesForEmpOnboard($client_policy_id, $client_id);
+
+ $existing_famility_details = $this->employeeModel->getEmpFamilybyEmpCode(client_id: $client_id, client_policy_id: $client_policy_id, emp_status: ['enrolled'], policy_status: ['enrolled']);
+
+ // $file = ['id' => null,'client_id' => $client_id,'policy_id' => $client_policy_id,'action' => 'inception'];
+ $file = ['id' => null, 'client_id' => $client_id, 'policy_id' => $client_policy_id, 'action' => 'inception', 'created_by' => get_session_userid(), 'client_branch_id' => $params['client_branch_id']];
+
+ //get existing units in the current branch
+ $existing_units = $this->clientBranchModel->getExisitingUnits(client_id: $file['client_id'], client_branch_id: $file['client_branch_id']);
+ // dd($this->employeeModel->getLastQuery());
+ // Kint::dump($existing_famility_details);die();
+ $employee_data_group_by_family = data_group_by_family($existing_famility_details, $data_source = 'db');
+ // dd($employee_data_group_by_family);
+ foreach ($employee_data_group_by_family as $emp_id => $family) {
+ $transformed_famility_details = transform_db_data_to_excel($family);
+ // $data = calculate_premium_new($transformed_famility_details,$policy_terms,$slab_details,$file);
+ $data = calculate_premium_new(family_data: $transformed_famility_details, policy_terms: $policy_terms, slab_details: $slab_details, fileArr: $file, existing_units: $existing_units);
+ // dd($data);
+ $employee_data_group_by_family[$emp_id] = $data;
+ $this->employeesOnboardProcess(['familiy_data' => $data, 'file' => $file]);
+ }
+
+ // dd($employee_data_group_by_family);
+ }
+
+ // die();
+ return (count($employee_data_group_by_family));
+ }
+
+ //deletion of emp
+ public function employeeDisembark($params)
+ {
+ helper('excel_util_helper');
+
+ //get file name
+ $file_id = $params['file_id'];
+ $file = $this->fileModel->find($file_id);
+ $file['action'] = $params['action'];
+ // dd($file);
+
+ // $file_name_with_path = WRITEPATH . "/uploads/excel/" . $file['file_name'];
+ // $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file_name_with_path);
+ // $sheet = $spreadsheet->getActiveSheet();
+ // $highestRowAndColumn = $sheet->getHighestRowAndColumn();
+ // $allowedHighestColumn = end($this->deletion_excel_columns);
+ // $excel_data = $sheet->rangeToArray('A1:' . $allowedHighestColumn['col_cell_name'] . $highestRowAndColumn['row']);
+ // dd($excel_data);
+
+ $excel_data = json_decode(file_get_contents($params['file_path'] ?? []), true);
+ unset($excel_data[0]);
+ // kint::dump($excel_data);
+
+ $endorsement_data = [];
+ $policy_terms = $this->clientPolicyModel->getPolicyDetails($file['client_id'], $file['policy_id']);
+ $insurer = new InsurerModel();
+ $insurer = ($insurer->find($policy_terms[0]->insurer_id));
+ // kint::dump($insurer);
+
+ //make closure funciton which is going to use only by this method
+ $endorsement = function ($data, $file, $row) use ($insurer) {
+
+ $group_key = rand(100000, 999999);
+ $row[4] = change_date_format($row[4], 'd-M-Y', 'Y-m-d'); // date of exit from excel
+ // Kint::dump($row[4]);
+ // check if insurer configured with add one day for deletion
+ // if($insurer['deletion_add_day'] == true)
+ // {
+ // $row[4] = (new \DateTime($row[4]))->modify('+1 day')->format('Y-m-d');
+ // }
+ // dd($row[4]);
+ //for emp table
+ // $this->empEndorsementModel->save(['pk' => (int)$data['emp_id'],'emp_code' => $data['emp_code'],'table_name' => 'employees','actions' => 'd','name' => $data['name'],'field_name' => 'emp_status','old_value' => $data['emp_status'],'new_value' => 'deactivate','created_by' => $file['created_by'],'remarks' => 'general deletion','group_key' => $group_key,'file_id' => $file['id'],'status' => 'pending']);
+ // dd( $this->empEndorsementModel->getLastQuery());
+ // $this->empEndorsementModel->save(['pk' => (int)$data['emp_id'],'emp_code' => $data['emp_code'],'table_name' => 'employees','actions' => 'd','name' => $data['name'],'field_name' => 'change_event','old_value' => $data['change_event'],'new_value' => 'deletion','created_by' => $file['created_by'],'remarks' => 'general deletion']);
+
+ // for employee policy table
+ $this->empEndorsementModel->save(['pk' => (int)$data['emp_policy_id'], 'emp_code' => $data['emp_code'], 'table_name' => 'employee_polices', 'actions' => 'd', 'name' => $data['name'], 'field_name' => 'date_of_exit', 'old_value' => $data['date_of_exit'], 'new_value' => $row[4], 'created_by' => $file['created_by'], 'remarks' => 'general deletion', 'group_key' => $group_key, 'file_id' => $file['id'], 'status' => 'pending']);
+ $this->empEndorsementModel->save(['pk' => (int)$data['emp_policy_id'], 'emp_code' => $data['emp_code'], 'table_name' => 'employee_polices', 'actions' => 'd', 'name' => $data['name'], 'field_name' => 'reason_for_exit', 'old_value' => $data['reason_for_exit'], 'new_value' => $row[5], 'created_by' => $file['created_by'], 'remarks' => 'general deletion', 'group_key' => $group_key, 'file_id' => $file['id'], 'status' => 'pending']);
+ $this->empEndorsementModel->save(['pk' => (int)$data['emp_policy_id'], 'emp_code' => $data['emp_code'], 'table_name' => 'employee_polices', 'actions' => 'd', 'name' => $data['name'], 'field_name' => 'status', 'old_value' => $data['status'], 'new_value' => 'inactive', 'created_by' => $file['created_by'], 'remarks' => 'general deletion', 'group_key' => $group_key, 'file_id' => $file['id'], 'status' => 'pending']);
+ $this->empEndorsementModel->save(['pk' => (int)$data['emp_policy_id'], 'emp_code' => $data['emp_code'], 'table_name' => 'employee_polices', 'actions' => 'd', 'name' => $data['name'], 'field_name' => 'claim_status', 'old_value' => $data['claim_status'], 'new_value' => $row[6], 'created_by' => $file['created_by'], 'remarks' => 'general deletion', 'group_key' => $group_key, 'file_id' => $file['id'], 'status' => 'pending']);
+ };
+
+ //iterate each row
+ foreach ($excel_data as $col_key => $row) {
+ if (check_row_is_empty_or_null($row)) {
+ break;
+ }
+ // echo '
START- ' . $row[2];
+
+ $employee = $this->employeeModel
+ ->select('employees.*, employee_polices.id as emp_policy_pk')
+ ->join('employee_polices', 'employees.id = employee_polices.employee_id')
+ ->where('employees.emp_code', $row[1])
+ ->where('employees.name', $row[2])
+ ->where('employees.client_id', $file['client_id'])
+ ->where('employees.client_branch_id', $file['client_branch_id'])
+ ->where('employee_polices.client_policy_id', $file['policy_id'])
+ ->where('employees.emp_status !=', 'truncated')
+ ->where('employees.is_active', 1)
+ ->where('employee_polices.status !=', 'truncated')
+ ->where('employee_polices.is_active', 1)
+ ->first();
+
+ // $employee = $this->employeeModel->where('emp_code', $row[1])->where('name',$row[2])->where('client_id',$file['client_id'])->first();
+ // dd($employee);
+ // kint::dump($employee);
+
+ if (is_array($employee) && count($employee)) {
+ // dd($employee);
+ $existing_endorsements = $this->empEndorsementModel->where('actions', 'd')
+ ->where('table_name', 'employee_polices')
+ ->where('endorsement_id is null')
+ ->where('emp_code', $employee['emp_code'])
+ ->where('name', $employee['name'])
+ ->where('pk', $employee['emp_policy_pk'])
+ ->where('field_name', 'status')
+ ->where('status !=', 'truncated')
+ ->where('is_active', 1)
+ ->findAll();
+
+ // dd($existing_endorsements);
+ if (!count($existing_endorsements)) {
+ // dd($employee);
+ if (strtolower($employee['relationship']) != 'self') {
+
+ if (!in_array($employee['id'], $endorsement_data)) //make entry in endorsement firsttime only with checking that PK of emp exisintg in variable $endorsement_data
+ {
+ $employee_policy = $this->employeePolicyModel
+ ->where('employee_id', $employee['id'])
+ ->where('client_policy_id', $file['policy_id'])
+ ->where('status !=', 'truncated')
+ ->where('is_active', 1)
+ ->first();
+
+ $data = ['emp_id' => $employee['id'], 'name' => $employee['name'], 'emp_status' => $employee['emp_status'], 'emp_policy_id' => $employee_policy['id'], 'emp_code' => $employee['emp_code'], 'change_event' => $employee['change_event'], 'date_of_exit' => $employee_policy['date_of_exit'], 'reason_for_exit' => $employee_policy['reason_for_exit'], 'status' => $employee_policy['status'], 'claim_status' => $employee_policy['claim_status']];
+ $endorsement($data, $file, $row);
+ $endorsement_data[] = $employee['id'];
+ }
+ } else {
+
+ $family = $this->employeeModel->getEmpFamilybyEmpCode(emp_code: $row[1], client_id: $file['client_id'], client_policy_id: $file['policy_id'], emp_status: ['active'], policy_status: ['active']);
+ // Kint::dump($family);
+ foreach ($family as $key => $emp) {
+
+ if (!in_array($emp['emp_id'], $endorsement_data)) {
+ $endorsement($emp, $file, $row);
+
+ $endorsement_data[] = $emp['emp_id'];
+ }
+ }
+ }
+ } else {
+ $this->myLogger->logme("error", 'Existing endorsement pending for this employee : emp_code : {emp_code} - emp_name : {name}', ['emp_code' => $row[1], 'name' => $row[2]]);
+ }
+ } else {
+ $this->myLogger->logme("error", '{emp_code} - {name} not found', ['emp_code' => $row[1], 'name' => $row[2]]);
+ }
+
+ // print_r($endorsement_data);
+
+ }
+
+ // $this->fileModel->where('id', $file_id)->set(['status' => 'success', 'reason' => ''])->update();
+ // $this->setPullNotification($this->getFileMetaDataByFileId($file_id, 'success'));
+
+ $this->myLogger->logme("error", $file['action'] . ' : {file_id} uploaded success', ['file_id' => $file_id]);
+ return $endorsement_data;
+ }
+
+ //correction of emp
+ public function employeesCorrectionProcess($params)
+ {
+ helper('excel_util_helper');
+ //get file name
+ $file_id = $params['file_id'];
+ $file = $this->fileModel->find($file_id);
+ $file['action'] = $params['action'];
+
+
+ // $file_name_with_path = WRITEPATH . "/uploads/excel/" . $file['file_name'];
+ // $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file_name_with_path);
+ // $sheet = $spreadsheet->getActiveSheet();
+ // $highestRowAndColumn = $sheet->getHighestRowAndColumn();
+ // $allowedHighestColumn = end($this->correction_excel_columns);
+ // $excel_data = $sheet->rangeToArray('A1:' . $allowedHighestColumn['col_cell_name'] . $highestRowAndColumn['row']);
+
+ $excel_data = json_decode(file_get_contents($params['file_path'] ?? []), true);
+ unset($excel_data[0]);
+ // dd($excel_data);
+
+ //iterate each row
+ foreach ($excel_data as $col_key => $row) {
+ if (check_row_is_empty_or_null($row)) {
+ break;
+ }
+ // echo '
START- ' . $row[2];
+
+ $field_name = $row[3];
+ $field_value = ($field_name == 'dob' ? change_date_format($row[4], 'd-M-Y', 'Y-m-d') : $row[4]);
+
+
+ $employee = $this->employeeModel
+ ->where('emp_code', $row[1])
+ ->where('name', $row[2])
+ ->where('client_id', $file['client_id'])
+ ->where('client_branch_id', $file['client_branch_id'])
+ ->where('emp_status', 'active')
+ ->where('is_active', 1)
+ ->first();
+ $existing_endorsements = $this->empEndorsementModel->where('actions', 'c')
+ ->where('table_name', 'employees')
+ ->where('endorsement_id is null')
+ ->where('emp_code', $employee['emp_code'])
+ ->where('name', $employee['name'])
+ ->where('field_name', $field_name)
+ ->where('is_active', 1)
+ ->where('status !=', 'truncated')
+ ->findAll();
+ // dd($existing_endorsements);
+ //make entry in endorsement table
+ if (!count($existing_endorsements)) {
+ $group_key = rand(100000, 999999);
+ $this->empEndorsementModel->save(['pk' => (int)$employee['id'], 'emp_code' => $employee['emp_code'], 'table_name' => 'employees', 'actions' => 'c', 'name' => $employee['name'], 'field_name' => $field_name, 'old_value' => $employee[$field_name], 'new_value' => $field_value, 'created_by' => $file['created_by'], 'remarks' => $row[7], 'date_of_correction' => change_date_format($row[5], 'd-M-Y', 'Y-m-d'), 'group_key' => $group_key, 'file_id' => $file['id'], 'status' => 'pending']);
+ }
+ }
+
+ // $this->fileModel->where('id', $file_id)->set(['status' => 'success', 'reason' => ''])->update();
+ // $this->setPullNotification($this->getFileMetaDataByFileId($file_id, 'success'));
+ $this->myLogger->logme("error", $file['action'] . ' : {file_id} uploaded success', ['file_id' => $file_id]);
+ return true;
+ }
+
+ //enhance of emp
+ public function employeesSIEnhanceProcess($params)
+ {
+ helper('excel_util_helper');
+ //get file name
+ $file_id = $params['file_id'];
+ $file = $this->fileModel->find($file_id);
+ $file['action'] = $params['action'];
+
+ // $file_name_with_path = WRITEPATH . "/uploads/excel/" . $file['file_name'];
+ // $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file_name_with_path);
+ // $sheet = $spreadsheet->getActiveSheet();
+ // $highestRowAndColumn = $sheet->getHighestRowAndColumn();
+ // $allowedHighestColumn = end($this->si_enhance_excel_columns);
+ // $excel_data = $sheet->rangeToArray('A1:' . $allowedHighestColumn['col_cell_name'] . $highestRowAndColumn['row']);
+ $excel_data = json_decode(file_get_contents($params['file_path'] ?? []), true);
+ unset($excel_data[0]);
+ // dd($excel_data);
+
+ //get policy slab rates
+ $slab_details = $this->policiesModel->getPolicySlabRatesForEmpOnboard($file['policy_id'], $file['client_id']);
+ //iterate each row
+ // dd($slab_details);
+ foreach ($excel_data as $col_key => $row) {
+ if (check_row_is_empty_or_null($row)) {
+ break;
+ }
+ // echo '
START- ' . $row[2];
+ $employee = $this->employeeModel
+ ->where('emp_code', $row[1])
+ ->where('name', $row[2])
+ ->where('client_id', $file['client_id'])
+ ->where('client_branch_id', $file['client_branch_id'])
+ ->where('emp_status', 'active')
+ ->where('is_active', 1)
+ ->first();
+ $employee_policy = $this->employeePolicyModel
+ ->where('employee_id', $employee['id'])
+ ->where('client_policy_id', $file['policy_id'])
+ ->where('status', 'active')
+ ->where('is_active', 1)
+ ->first();
+ // dd($employee, $employee_policy);
+
+ $existing_endorsements = $this->empEndorsementModel->where('actions', 'si')
+ ->where('table_name', 'employee_polices')
+ ->where('endorsement_id is null')
+ ->where('emp_code', $employee['emp_code'])
+ ->where('name', $employee['name'])
+ ->where('field_name', 'basic_cover_si')
+ ->findAll();
+ // dd($existing_endorsements);
+ //make entry in endorsement table
+ if (!count($existing_endorsements)) {
+ //transform data to send
+
+ //get applicable slab rate for current member relation
+ $pre_rack_rate_name = '';
+ $applicable_rack_rate_name = '';
+ $applicable_rack_rate_master = [];
+ foreach ($slab_details['slab_rates'] as $skey => $slab_value) {
+ if ($pre_rack_rate_name != $slab_value['rack_rate_name']) {
+ $pre_rack_rate_name = $slab_value['rack_rate_name'];
+ $rack_rate_json = json_decode($slab_value['additional_relationship'], true);
+ $relationship_array_key = strtolower(trim($employee['relationship']));
+
+ if (in_array($relationship_array_key, ['son', 'daughter'])) {
+ $relationship_array_key = 'childrens';
+ } elseif (in_array($relationship_array_key, ['father', 'mother'])) {
+ $relationship_array_key = 'parents';
+ } elseif (in_array($relationship_array_key, ['father in law', 'mother in law', 'father-in-law', 'mother-in-law'])) {
+ $relationship_array_key = 'parents-in-law';
+ }
+
+ if (array_key_exists($relationship_array_key, $rack_rate_json) && $rack_rate_json[$relationship_array_key] != 0 && $rack_rate_json[$relationship_array_key] != 'NA') {
+ $applicable_rack_rate_name = $slab_value['rack_rate_name'];
+ $applicable_rack_rate_master = $slab_value['grid_master'];
+ break;
+ }
+ }
+ }
+
+ //get max age,max count of the familiy
+ $max_age_and_max_count_of_current_member = $this->employeeModel->getFamiliyCountAndMaxage($employee['emp_code']);
+ //transform SI excel row data as inception excel OR premium calculateable fomart
+
+ $data = transform_si_excel_row_to_calculatable_format(employee: $employee, employee_policy: $employee_policy, maxage_and_maxcount: $max_age_and_max_count_of_current_member, slab_details: $slab_details, applicable_slab_name: $applicable_rack_rate_name, augmented_si: $row[3], grid_master: $applicable_rack_rate_master);
+ $policy_terms = $this->clientPolicyModel->getPolicyDetails($file['client_id'], $file['policy_id']);
+ $policy_terms = (array) $policy_terms[0];
+ // dd($policy_terms);
+ //grouping slab details by rack rate name
+ $temp_slab_rates = group_slab_rates_basedon_name($slab_details);
+
+ $calculated_data = premium_calculation_manager($data, $policy_terms, $temp_slab_rates, $row[3]);
+
+ $group_key = rand(100000, 999999);
+ $this->empEndorsementModel->save(['pk' => (int)$employee_policy['id'], 'emp_code' => $employee['emp_code'], 'table_name' => 'employee_polices', 'actions' => 'si', 'name' => $employee['name'], 'field_name' => 'basic_cover_si', 'old_value' => $employee_policy['basic_cover_si'], 'new_value' => $row[3], 'created_by' => $file['created_by'], 'remarks' => 'general si enhancement', 'group_key' => $group_key, 'file_id' => $file['id'], 'status' => 'pending']);
+ $this->empEndorsementModel->save(['pk' => (int)$employee_policy['id'], 'emp_code' => $employee['emp_code'], 'table_name' => 'employee_polices', 'actions' => 'si', 'name' => $employee['name'], 'field_name' => 'premium', 'old_value' => $employee_policy['premium'], 'new_value' => $calculated_data['policy_details']['premium'], 'created_by' => $file['created_by'], 'remarks' => 'general si enhancement', 'group_key' => $group_key, 'file_id' => $file['id'], 'status' => 'pending']);
+ $this->empEndorsementModel->save(['pk' => (int)$employee_policy['id'], 'emp_code' => $employee['emp_code'], 'table_name' => 'employee_polices', 'actions' => 'si', 'name' => $employee['name'], 'field_name' => 'si_enhancement_date', 'old_value' => null, 'new_value' => change_date_format($row[4], 'd-M-Y', 'Y-m-d'), 'created_by' => $file['created_by'], 'remarks' => 'general si enhancement', 'group_key' => $group_key, 'file_id' => $file['id'], 'status' => 'pending']);
+ }
+ }
+
+ // $this->fileModel->where('id', $file_id)->set(['status' => 'success', 'reason' => ''])->update();
+ // $this->setPullNotification($this->getFileMetaDataByFileId($file_id, 'success'));
+ $this->myLogger->logme("error", $file['action'] . ' : {file_id} uploaded success', ['file_id' => $file_id]);
+
+ return true;
+ }
+
+ // insert or update in db for inception addition depent addition
+ public function employeesOnboardProcess($params)
+ {
+ // dd($params);
+
+ $familiy_data = $params['familiy_data'];
+ $file = $params['file'];
+
+ $policy_details = $this->clientPolicyModel->where('id', $file['policy_id'])->first();
+ // dd($policy_details);
+
+ foreach ($familiy_data as $fkey => $value) {
+ if (is_array($value)) {
+
+
+ if ($file['id'] == null || $value['temp']['source'] == 'excel' || (($file['action'] == 'dependent_addition' && ($value['temp']['premium_type'] == 1 && strtolower($value['relationship']) == 'self') || ($value['temp']['premium_type'] == 2 || $value['temp']['premium_type'] == null)))) //insert data come from excel and from db i.e. ( $file['id'] == null for enrollment data)
+ {
+
+ $employee = $this->employeeModel->checkExistingEmp($value, $file['client_branch_id']);
+ $policy_data = $value['policy_details'];
+ $temp = $value['temp'];
+ unset($value['policy_details']);
+ unset($value['temp']);
+ // Kint::dump($value);
+ // Kint::dump($temp);
+ // Kint::dump($policy_data);
+ // echo '---------------------------------------';
+
+ //start implemet of si enhancement of grid type 10,11
+ if (count($employee) && $file['action'] == 'dependent_addition' && $temp['source'] == 'db' && in_array($temp['grid_id'], [10, 11]) && (($temp['premium_type'] == 1 && (strtolower($value['relationship']) == 'self' || $temp['acting_self'])) || ($temp['premium_type'] == 2 || $temp['premium_type'] == null))) {
+ $log_message = 'Employee record from DB,Checking SI for - ' . $employee[0]['name'] . '(' . $employee[0]['emp_code'] . ')';
+ $this->myLogger->logme('error', $log_message);
+ $res = $this->employeesSIEnhanceProcessWhileOnbboard(employee: $employee[0], policy_data: $policy_data, file: $file); // where employee holds existing emp data and policy_data holds new si enhancement
+
+ break; //skip db employee
+ }
+ //end implemet of si enhancement of grid type
+ //save employee table
+ $value['relationship'] = ucfirst(trim($value['relationship']));
+ if (count($employee)) {
+ $value['updated_by'] = $file['created_by'];
+ $value['id'] = $employee[0]['id'];
+ $value['emp_status'] = 'active';
+ $value['family_floater_key'] = generate_family_floater_key($value['relationship']);
+ $value['client_branch_id'] = $file['client_branch_id'];
+ $value['file_id'] = isset($employee[0]['file_id']) && $employee[0]['file_id'] != '' ? $employee[0]['file_id'] : $file['id'];
+ $log_message = 'Update Employee - ' . $employee[0]['name'] . '(' . $employee[0]['emp_code'] . ') with PK ' . $employee[0]['id'];
+ // $this->myLogger->logme('error',('Update - ' . $employee[0]['id'].' - '. $employee[0]['emp_code'] .' - '.$employee[0]['name']));
+ // echo 'insert emp';
+ } else {
+ $value['emp_status'] = 'active';
+ $value['created_by'] = $file['created_by'];
+ $value['client_branch_id'] = $file['client_branch_id'];
+ $value['family_floater_key'] = generate_family_floater_key($value['relationship']);
+ $value['file_id'] = isset($employee[0]['file_id']) && $employee[0]['file_id'] != '' ? $employee[0]['file_id'] : $file['id'];
+ $log_message = 'Insert Employee- ' . $value['name'] . '(' . $value['emp_code'] . ') with PK ';
+ // $this->myLogger->logme('error',('Insert - ' . $value['emp_code'] .' - '. $value['name']));
+ // echo 'update emp';
+ }
+ $value = ExcelSanitizeHelper::sanitizeArrayData($value);
+ $this->employeeModel->save($value);
+ if (isset($value['id'])) {
+ $emp_id = $value['id'];
+ } else {
+ $emp_id = $this->employeeModel->getInsertID();
+ $log_message .= $emp_id;
+ }
+
+ //commanded for last insert id is coming from buffer
+ // $emp_id = $this->employeeModel->getInsertID();
+ // if($emp_id != 0){ $log_message .= $emp_id; }
+ // else{ $emp_id = $employee[0]['id']; }
+
+ $this->myLogger->logme('error', $log_message);
+
+ //save policy table
+ $employee_policy = $this->employeePolicyModel->checkExistingEmpPolicy(['employee_id' => $emp_id, 'client_policy_id' => $file['policy_id']]);
+ if (count($employee_policy)) {
+ $policy_data['updated_by'] = $file['created_by'];
+ $policy_data['id'] = $employee_policy[0]['id'];
+ $policy_data['status'] = 'active';
+ $policy_data['payable_employee'] = check_pay_by_employee_or_company($policy_details['policy_terms'], $value['relationship']);
+ $policy_data['file_id'] = isset($employee_policy[0]['file_id']) && $employee_policy[0]['file_id'] != '' ? $employee_policy[0]['file_id'] : $file['id'];
+ $log_message = 'Update Employee Policy for ' . $value['name'] . '(' . $value['emp_code'] . ') with PK- ' . $employee_policy[0]['id'] . ' client policy ID ' . $employee_policy[0]['client_policy_id'] . ' with SI ' . $policy_data['basic_cover_si'];
+ // echo 'insert policy';
+ } else {
+ $policy_data['employee_id'] = $emp_id;
+ $policy_data['client_policy_id'] = $file['policy_id'];
+ $policy_data['created_by'] = $file['created_by'];
+ $policy_data['status'] = 'active';
+ $policy_data['payable_employee'] = check_pay_by_employee_or_company($policy_details['policy_terms'], $value['relationship']);
+ $policy_data['file_id'] = $file['id'];
+ $log_message = 'Insert Employee Policy for ' . $value['name'] . '(' . $value['emp_code'] . ') - client policy id -' . $file['policy_id'] . ' - with SI ' . $policy_data['basic_cover_si'];
+ // echo 'update policy';
+ }
+ // log_message('error',json_encode($policy_data));
+ // dd($this->employeePolicyModel->save($policy_data));
+ $res = $this->employeePolicyModel->save($policy_data);
+ // if($res){log_message('error','ths the resul'.$res);}
+ if (isset($policy_data['id'])) {
+ $emp_policy_id = $policy_data['id'];
+ } else {
+ $emp_policy_id = $this->employeePolicyModel->getInsertID();
+ }
+
+ if ($emp_policy_id != 0) //emp policy inserted
+ {
+ $log_message .= ' with PK ' . $emp_policy_id;
+
+ //make endorsement entry if action is addition OR Dependt addition
+ if (($file['action'] == 'missed_inception' || $file['action'] == 'dependent_addition' || $file['action'] == 'addition') && $temp['source'] == 'excel') {
+ $log_message = $file['action'] . ' - endorsement' . $value['emp_code'] . ' - ' . $value['name'] . ' - with policy id' . $emp_policy_id;
+ $this->myLogger->logme('error', $log_message);
+ $actions = ($file['action'] == 'dependent_addition' ? 'da' : ($file['action'] == 'addition' ? 'a' : 'a'));
+ $addition_endorse_data = ['pk' => $emp_policy_id, 'group_key' => rand(100000, 999999), 'emp_code' => $value['emp_code'], 'table_name' => 'employee_polices', 'actions' => $actions, 'name' => $value['name'], 'field_name' => 'basic_cover_si', 'old_value' => NULL, 'new_value' => $policy_data['basic_cover_si'], 'remarks' => 'addition endorsement', 'file_id' => $file['id'], 'created_by' => $file['created_by'], 'status' => 'pending'];
+ $this->employeeEndorsementforAddtionAndDependentAddition($addition_endorse_data);
+ }
+ }
+ // else{ $emp_policy_id = $employee_policy[0]['id']; }
+
+ $this->myLogger->logme('error', $log_message);
+ } // if end
+ } // is array check end
+ else {
+ $this->myLogger->logme('error', '######Incoming value is not an array');
+ }
+ } // for end
+ } //function end
+
+
+ public function employeeEndorsementforAddtionAndDependentAddition($employee)
+ {
+ $this->empEndorsementModel->save($employee);
+ }
+
+ // $employee -> holds existing emp model obj and $policy_data holds new policy changes as array
+ public function employeesSIEnhanceProcessWhileOnbboard(array $employee, array $policy_data, array $file)
+ {
+
+ $employee = $this->employeeModel->where('emp_code', $employee['emp_code'])->where('name', $employee['name'])->where('client_id', $employee['client_id'])->where('client_branch_id', $file['client_branch_id'])->where('is_active', 1)->first();
+ // Kint::dump($this->employeeModel->getLastQuery());
+ // dd($employee);
+ $employee_policy = $this->employeePolicyModel->where('employee_id', $employee['id'])->where('client_policy_id', $file['policy_id'])->first();
+ // dd($employee_policy);
+ // $slab_details = $this->policiesModel->getPolicySlabRatesForEmpOnboard($employee_policy['client_policy_id'],$employee['client_id']);
+ // dd($slab_details);
+ // $temp_slab_details = ($temp['grid_type'] == 'primary' ? $slab_details['slab_rates'] : $slab_details['additional_slab_info']['slab_rates']);
+
+ //check si has changed in normal case OR check premium only changed, still treat as SI enhancement in grid type 10
+ if ($employee_policy['basic_cover_si'] != $policy_data['basic_cover_si'] || ($policy_data['premium'] != null && $policy_data['premium'] != "" && $employee_policy['premium'] != $policy_data['premium'])) {
+ $existing_endorsements = $this->empEndorsementModel->where('actions', 'si')
+ ->where('table_name', 'employee_polices')
+ ->where('endorsement_id is null')
+ ->where('emp_code', $employee['emp_code'])
+ ->where('name', $employee['name'])
+ ->where('field_name', 'basic_cover_si')
+ ->findAll();
+ //make entry in endorsement table
+ if (!count($existing_endorsements)) {
+ $group_key = rand(100000, 999999);
+ $data = array(
+ ['pk' => (int)$employee_policy['id'], 'emp_code' => $employee['emp_code'], 'table_name' => 'employee_polices', 'actions' => 'si', 'name' => $employee['name'], 'field_name' => 'basic_cover_si', 'old_value' => $employee_policy['basic_cover_si'], 'new_value' => $policy_data['basic_cover_si'], 'created_by' => $file['created_by'], 'remarks' => 'general si enhancement via DA', 'group_key' => $group_key, 'file_id' => $file['id']],
+ ['pk' => (int)$employee_policy['id'], 'emp_code' => $employee['emp_code'], 'table_name' => 'employee_polices', 'actions' => 'si', 'name' => $employee['name'], 'field_name' => 'premium', 'old_value' => $employee_policy['premium'], 'new_value' => $policy_data['premium'], 'created_by' => $file['created_by'], 'remarks' => 'general si enhancement via DA', 'group_key' => $group_key, 'file_id' => $file['id']],
+ ['pk' => (int)$employee_policy['id'], 'emp_code' => $employee['emp_code'], 'table_name' => 'employee_polices', 'actions' => 'si', 'name' => $employee['name'], 'field_name' => 'si_enhancement_date', 'old_value' => null, 'new_value' => date('Y-m-d'), 'created_by' => $file['created_by'], 'remarks' => 'general si enhancement via DA', 'group_key' => $group_key, 'file_id' => $file['id']]
+ );
+
+ $this->empEndorsementModel->insertBatch($data);
+ $this->myLogger->logme('error', ($employee['emp_code'] . ' - ' . $employee['name'] . '- ( NEW/OLD SI - ' . $employee_policy['basic_cover_si'] . '/' . $policy_data['basic_cover_si'] . ')' . '( NEW/OLD PREMIUM - ' . $employee_policy['premium'] . '/' . $policy_data['premium'] . ') ' . ' - si enhancement via DA'));
+ $log_message = 'SI enhancement done during dependent_addition - ' . $employee['name'] . '(' . $employee['emp_code'] . ')';
+ $this->myLogger->logme('error', $log_message);
+ return true; //retun true when endorsement inserted
+
+ }
+ return false; //retun false when endorsement not happend
+ }
+ return false; //retun false when endorsement not happend
+
+
+ }
+
+ // --------------- FUNCTION FOR ERROR DISPLAY ------------------------------------------------------------------------------------------
+
+ public function getExcelErrorData($file_id, $res)
+ {
+
+ try {
+ $file = $this->fileModel->find($file_id);
+ // $error_data = json_decode($file['reason'], true);
+ $error_data = $res;
+ // dd($error_data);
+ // return $error_data;
+
+ $file_name_with_path = WRITEPATH . "/uploads/excel/" . $file['file_name'];
+
+ //check the file exist or not
+ if (!file_exists($file_name_with_path)) {
+ $error_message = "File not found";
+ $this->myLogger->logme('error', ($error_message . ' for file id ' . $file_id));
+ return 0;
+ }
+
+ $column_to_check = $this->multievent_excel_columns;
+ $allowedHighestColumn = end($column_to_check);
+
+ $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file_name_with_path);
+ $sheet = $spreadsheet->getActiveSheet();
+
+ $highestRow = $sheet->getHighestDataRow();
+ $excel_data = $sheet->rangeToArray('A1:' . $allowedHighestColumn['col_cell_name'] . $highestRow);
+
+ $excelErrorData['excel_header'] = $excel_data[0];
+ unset($excel_data[0]);
+ // echo '
';
+ // Kint::dump($excel_data);
+ if ($error_data['error_type'] == 1) {
+
+ $finalArray = [];
+ foreach ($error_data['error_data'] as $key => $value) {
+
+ foreach ($value as $key2 => $value2) {
+ $error_data = $value2['error'];
+ $data = ['value' => $excel_data[$key][$value2['col_idx']], 'error' => $error_data,];
+ $excel_data[$key][$value2['col_idx']] = $data;
+ }
+ array_push($finalArray, $excel_data[$key]);
+ }
+
+ foreach ($finalArray as $fkey => $value) {
+ foreach ($value as $vkey => $arrayData) {
+ if (!is_array($arrayData)) {
+ $data = ['value' => $arrayData];
+ $finalArray[$fkey][$vkey] = $data;
+ }
+ }
+ }
+
+ $excelErrorData['excel_data'] = $finalArray;
+ return $excelErrorData;
+ } else if ($error_data['error_type'] == 2) {
+
+
+ $allErrors = [];
+ $typeTowArray = [];
+
+ foreach ($error_data['error_data'] as $index => $item) {
+
+ foreach ($item as $field) {
+ if (!isset($allErrors[$index])) {
+ $allErrors[$index] = [];
+ }
+ $allErrors[$index] = array_merge($allErrors[$index], $field['error']);
+ }
+ }
+
+ // dd(array_keys($allErrors));
+ foreach ($allErrors as $key => $value) {
+ // echo $key;
+ // print_r($value);
+ foreach ($excel_data as $excel_data_index => $excel_data_value) {
+ if ($excel_data_value[0] == $key) {
+ $data = ['value' => $excel_data[$excel_data_index][1], 'error' => $value,];
+ $excel_data[$excel_data_index][1] = $data;
+ array_push($typeTowArray, $excel_data[$excel_data_index]);
+ break;
+ }
+ }
+ }
+ // dd($data);
+ foreach ($typeTowArray as $fkey => $value) {
+ foreach ($value as $vkey => $arrayData) {
+ if (!is_array($arrayData)) {
+ $data = ['value' => $arrayData];
+ $typeTowArray[$fkey][$vkey] = $data;
+ }
+ }
+ }
+
+ $excelErrorData['excel_data'] = $typeTowArray;
+ return $excelErrorData;
+ }
+ } catch (\Exception $e) {
+ // // Handle any exceptions
+ // $errorMessage = $e->getMessage(); //die();
+ // $this->myLogger->logme('error', $errorMessage);
+ // return false; // You can return an error response here
+
+ $errorDetails = [
+ 'error_message' => $e->getMessage(),
+ 'file' => $e->getFile(),
+ 'line' => $e->getLine(),
+ 'stack_trace' => $e->getTraceAsString(),
+ ];
+ return $errorDetails;
+ }
+ }
+
+ // ---------------------------------------------------------------------------------
+
+ public function getFileMetaDataByFileId($file_id, $status = 'success')
+ {
+
+ $data = $this->fileModel
+ ->select('files.*, clients.client_name, clients.short_name, policy_type.policy_type as policy_name,client_branch.branch_code')
+ ->join('clients', 'clients.id = files.client_id')
+ ->join('client_policy', 'client_policy.id = files.policy_id')
+ ->join('policy_type', 'policy_type.id = client_policy.policy_type_id')
+ ->join('client_branch', 'client_branch.id = files.client_branch_id', 'left')
+ ->where('files.id', $file_id)
+ ->first();
+
+ if ($status == 'success') {
+ $msg_title = 'File Upload Success';
+ } else if ($status == 'failure') {
+ $msg_title = 'File Upload Failure';
+ }
+
+ $msg_txt = $data['client_name'] . ' (' . $data['branch_code'] . ') - ' . $data['policy_name'] . ' - ' . ucfirst($data['action']);
+ $user_id = $data['created_by'];
+ $url = 'employee/upload';
+
+ return ['msg_txt' => $msg_txt, 'user_id' => $user_id, 'url' => $url, 'status' => $status, 'title' => $msg_title];
+ }
+
+ public function setPullNotification($data)
+ {
+
+
+ $array = ['message_text' => $data['msg_txt'], 'action_url' => $data['url'], 'msg_status' => $data['status'], 'msg_title' => $data['title']];
+ $jsonEncodeData = json_encode($array);
+
+ $msg_data = [
+
+ 'message_text' => $jsonEncodeData,
+ 'user_id' => $data['user_id'],
+ 'role_id' => NULL,
+ 'team_id' => NULL,
+ 'message_type' => '1to1',
+ ];
+
+
+ $this->messageModel->insert($msg_data);
+ }
+
+ public function employeesEnrollmentInsert($params)
+ {
+ // dd($this->request);
+ helper('excel_util_helper');
+ //get file name
+ $file_id = $params['file_id'];
+ $file = $this->fileModel->find($file_id);
+ // dd($file);
+ $return = [];
+ if (!isset($file)) {
+ //file not found in DB
+ return array('status' => false, 'msg' => 'file not found in DB');
+ }
+ $file_name_with_path = WRITEPATH . "/uploads/excel/" . $file['file_name'];
+
+ //check physical file
+ if (!file_exists($file_name_with_path)) {
+ //file not found update status and reason
+ $message = "Physical file not found";
+ // echo $message;
+ $this->myLogger->logme('error', ($message . ' for file id ' . $file_id));
+ $this->fileModel->where('id', $file_id)->set(['status' => 'failed', 'reason' => json_encode(['error_summary' => array_count_values([5]), 'error_data' => $message])])->update();
+ return array('error_summary' => [5], 'error_data' => $message);
+ }
+
+ //get excel data
+ $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file_name_with_path);
+ $sheet = $spreadsheet->getActiveSheet();
+
+ $highestRowAndColumn = $sheet->getHighestRowAndColumn();
+ $result = ['error_type' => 2, 'error_summary' => [], 'error_data' => []];
+ $columns_to_check = $this->enrollment_excel_columns;
+ $keys = array_keys($columns_to_check);
+ $allowedHighestColumn = end($columns_to_check);
+ $excel_data = $sheet->rangeToArray('A1:' . $allowedHighestColumn['col_cell_name'] . $highestRowAndColumn['row']);
+ // print_r($keys);die();
+ //get existing units in the current branch
+ $existing_units = $this->clientBranchModel->getExisitingUnits(client_id: $file['client_id'], client_branch_id: $file['client_branch_id']);
+ //remove header
+ unset($excel_data[0]);
+ // dd($excel_data);
+ $emp_emails = [];
+
+ //check is welcome notification enabled
+ $notification = $this->notificationModel->where('client_id', $file['client_id'])->where('template_name', 'member_welcome_mail')->first();
+ // dd($notification);
+ $client_details = $this->clientModel->where('id', $file['client_id'])->first();
+ $policy_details = $this->clientPolicyModel->where('id', $file['policy_id'])->first();
+
+ // dd($policy_details);
+
+ //get policy slab rates
+ // $slab_details = $this->policiesModel->getPolicySlabRatesForEmpOnboard($file['policy_id'],$file['client_id']);
+ // dd($slab_details);
+
+ foreach ($excel_data as $key => $row) {
+ $is_row_empty = check_row_is_empty_or_null($row);
+ if (!$is_row_empty) {
+
+ $value = [];
+ $policy_data = [];
+ $temp_unit = '';
+ if (empty($row[12])) {
+ $temp_unit = $existing_units[0];
+ }
+
+ $value['emp_code'] = $row[1];
+ $value['name'] = $row[2];
+ $value['doj'] = (!empty($row[3]) ? change_date_format($row[3], 'd-M-Y', 'Y-m-d') : null);
+ $value['gender'] = $row[4];
+ $value['relationship'] = ucfirst(trim($row[5]));
+ $value['dob'] = change_date_format($row[6], 'd-M-Y', 'Y-m-d');
+ $value['email_corporate'] = $row[7];
+ $value['mobile'] = $row[8];
+ $value['band'] = $row[10];
+ $value['basic_pay'] = $row[11];
+ $value['unit'] = $temp_unit;
+ $value['family_floater_key'] = null;
+ $value['client_id'] = $file['client_id'];
+ $value['client_branch_id'] = $file['client_branch_id'];
+ $value['file_id'] = $file_id;
+ $value['is_addon_value'] = $policy_details['policy_type_id'] == 3 ? 1 : 0;
+
+ $value['temp']['emp_id'] = null; // dummy value for using exisitng funciton in model
+ if (strtolower(trim($value['relationship'])) === 'mother' || strtolower(trim($value['relationship'])) === 'father') {
+ $relation = 'parent';
+ } else if (strtolower(trim($value['relationship'])) === 'son' || strtolower(trim($value['relationship'])) === 'daughter') {
+ $relation = 'child';
+ } else if ((strtolower(trim($value['relationship'])) === 'father in law' || strtolower(trim($value['relationship'])) === 'mother in law') || (strtolower(trim($value['relationship'])) === 'father-in-law' || strtolower(trim($value['relationship'])) === 'mother-in-law')) {
+ $relation = 'parent_in_law';
+ } else if (strtolower(trim($value['relationship'])) === 'spouse') {
+ $relation = 'spouse';
+ } else if (strtolower(trim($value['relationship'])) === 'self') {
+ $relation = 'self';
+ } else {
+ $relation = '';
+ }
+ $value['family_floater_key'] = $relation;
+
+ // dd($value['family_floater_key']);
+
+ $policy_data['basic_cover_si'] = $row[9];
+ $policy_data['date_coverage'] = $row[13] != "" && $row[13] != null ? change_date_format($row[13], 'd-M-Y', 'Y-m-d') : null;
+ $policy_data['client_policy_id'] = $file['policy_id'];
+
+ $employee = $this->employeeModel->checkExistingEmployee($value, $file['client_branch_id']);
+ unset($value['temp']);
+ //save employee table
+ // dd($employee['id']);
+ if ($employee !== null) {
+ $value['updated_by'] = $file['created_by'];
+ $value['id'] = $employee['id'];
+ $value['emp_status'] = 'draft';
+
+ $log_message = 'Enrollment Update Employee - ' . $employee['name'] . '(' . $employee['emp_code'] . ') with PK ' . $employee['id'];
+ } else {
+ $value['emp_status'] = 'draft';
+ $value['created_by'] = $file['created_by'];
+ $log_message = 'Enrollment Insert Employee- ' . $value['name'] . '(' . $value['emp_code'] . ') with PK ';
+ }
+
+ $value = ExcelSanitizeHelper::sanitizeArrayData($value);
+ $this->employeeModel->save($value);
+ if (isset($value['id'])) {
+ $emp_id = $value['id'];
+ } else {
+ $emp_id = $this->employeeModel->getInsertID();
+ $log_message .= $emp_id;
+ }
+
+ // $emp_id = $this->employeeModel->getInsertID();
+ // if($emp_id != 0){ $log_message .= $emp_id; }
+ // else{ $emp_id = $employee['id']; }
+
+ $this->myLogger->logme('error', $log_message);
+
+ //save policy table
+ $employee_policy = $this->employeePolicyModel->checkExistingEmpPolicy(['employee_id' => $emp_id, 'client_policy_id' => $file['policy_id']]);
+ if (count($employee_policy)) {
+ $policy_data['updated_by'] = $file['created_by'];
+ $policy_data['id'] = $employee_policy[0]['id'];
+ $policy_data['status'] = 'draft';
+ $policy_data['payable_employee'] = check_pay_by_employee_or_company($policy_details['policy_terms'], $value['relationship']);
+ $policy_data['file_id'] = isset($employee_policy[0]['file_id']) && $employee_policy[0]['file_id'] != '' ? $employee_policy[0]['file_id'] : $file_id;
+ $log_message = 'Update Employee Policy for ' . $value['name'] . '(' . $value['emp_code'] . ') with PK- ' . $employee_policy[0]['id'] . ' client policy ID ' . $employee_policy[0]['client_policy_id'] . ' with SI ' . $policy_data['basic_cover_si'];
+ // echo 'insert policy';
+ } else {
+ $policy_data['employee_id'] = $emp_id;
+ $policy_data['client_policy_id'] = $file['policy_id'];
+ $policy_data['created_by'] = $file['created_by'];
+ $policy_data['status'] = 'draft';
+ $policy_data['payable_employee'] = check_pay_by_employee_or_company($policy_details['policy_terms'], $value['relationship']);
+ $policy_data['file_id'] = $file_id;
+ $log_message = 'Insert Employee Policy for ' . $value['name'] . '(' . $value['emp_code'] . ') - client policy id -' . $file['policy_id'] . ' - with SI ' . $policy_data['basic_cover_si'];
+ // echo 'update policy';
+ }
+
+ log_message('error', json_encode($policy_data));
+ // dd($policy_data);
+ $this->employeePolicyModel->save($policy_data);
+ $emp_policy_id = $this->employeePolicyModel->getInsertID();
+ $this->myLogger->logme('error', $log_message);
+
+ $employeeRestController = new EmployeeRestController();
+ $employeeRestController->updatePremiumAmount($file['policy_id'], $value['emp_code'], $file['client_branch_id']);
+
+
+ //save email of self for send mail later
+ if (isset($notification) && $notification['enabled'] == 1 && $notification['mail_content'] != '') {
+ if (strtolower($value['relationship']) == 'self' && $value['email_corporate'] != "") {
+ $params['dataToInsert'] = $value; //holds employee master data
+ $params['notification'] = $notification;
+ $params['client_data'] = $client_details;
+ $params['common'] = [
+ 'client_id' => $file['client_id'],
+ 'client_branch_id' => $file['client_branch_id'],
+ 'client_policy_id' => $file['policy_id'],
+ 'employee_policy_id' => $emp_policy_id ?? null,
+ 'employee_id' => $emp_id,
+ 'mail_type' => 'member_welcome_mail',
+ ];
+ //store email and mail content via helper to send notification
+ $emp_emails[] = sendMailNotification::sendMailNotification('member_welcome_mail', $params);
+ }
+ }
+ } // endof if row is empty check
+ } //end of for loop
+
+ // dd($emp_emails);
+
+ // for bulk mail queue job push
+ if (!empty($emp_emails) && count($emp_emails) > 0) {
+
+ $emp_emails = array_chunk($emp_emails, 20);
+
+ foreach ($emp_emails as $key => $value) {
+ $job_details = new Jobs();
+ $r = Jobs::addJob(['job_name' => 'bulk_mail', 'payload' => $value]);
+ }
+ }
+
+ $this->fileModel->where('id', $file_id)->set(['status' => 'success', 'reason' => ''])->update();
+ $this->myLogger->logme("error", '{file_id} uploaded success', ['file_id' => $file_id]);
+
+ $this->setPullNotification($this->getFileMetaDataByFileId($file_id, 'success'));
+
+
+ return true;
+ } //end of employeesEnrollmentInsert
+
+ // --------------- FUNCTION FOR MULTI EVENT ------------------------------------------------------------------
+
+ public function constructMultiEventData($params)
+ {
+ $file_id = $params['file_id'];
+ $file = $this->fileModel->where('is_active', 1)->where('id', $file_id)->first();
+ $file_name = $file['file_name'];
+
+ $column_to_check = $this->multievent_excel_columns;
+ $allowedHighestColumn = end($column_to_check);
+ $event_coumn_index = $column_to_check['change_event']['col_idx'];
+
+ $addition_column_to_check = $this->inception_excel_columns;
+ $correction_column_to_check = $this->correction_excel_columns;
+ $deletion_column_to_check = $this->deletion_excel_columns;
+ $si_column_to_check = $this->si_enhance_excel_columns;
+
+ $file_name_with_path = WRITEPATH . "uploads/excel/" . $file_name;
+ $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file_name_with_path);
+ $worksheet = $spreadsheet->getActiveSheet();
+
+ $highestRow = $worksheet->getHighestDataRow();
+ $highestColumn = $worksheet->getHighestDataColumn();
+
+ $excel_data = $worksheet->rangeToArray('A1:' . $allowedHighestColumn['col_cell_name'] . $highestRow);
+ $excel_header = $excel_data[0];
+ unset($excel_data[0]);
+ $excel_data = ExcelSanitizeHelper::sanitizeArrayData($excel_data);
+
+
+ // Buckets
+ $inception = [];
+ $missed_inception = [];
+ $addition_endorsement = [];
+ $dependent_addition_endorsement = [];
+ $deletion_endorsement = [];
+ $correction_endorsement = [];
+ $si_enhancement_endorsement = [];
+
+ foreach ($excel_data as $row_idx => $row_value) {
+ $event = strtolower(trim($row_value[$event_coumn_index] ?? ''));
+
+ switch ($event) {
+ case "addition":
+ if (empty($addition_endorsement)) {
+ $addition_endorsement[] = $this->buildHeaderData($addition_column_to_check);
+ }
+ $addition_endorsement[$row_idx] = $this->buildEndorsementData($row_value, $row_idx, $addition_column_to_check, $column_to_check);
+ break;
+
+ case "missed inception":
+ if (empty($missed_inception)) {
+ $missed_inception[] = $this->buildHeaderData($addition_column_to_check);
+ }
+ $missed_inception[$row_idx] = $this->buildEndorsementData($row_value, $row_idx, $addition_column_to_check, $column_to_check);
+ break;
+
+ case "dependent addition":
+ if (empty($dependent_addition_endorsement)) {
+ $dependent_addition_endorsement[] = $this->buildHeaderData($addition_column_to_check);
+ }
+ $dependent_addition_endorsement[$row_idx] = $this->buildEndorsementData($row_value, $row_idx, $addition_column_to_check, $column_to_check);
+ break;
+
+ case "correction":
+ if (empty($correction_endorsement)) {
+ $correction_endorsement[] = $this->buildHeaderData($correction_column_to_check);
+ }
+ $correction_endorsement[$row_idx] = $this->buildEndorsementData($row_value, $row_idx, $correction_column_to_check, $column_to_check);
+ break;
+
+ case "deletion":
+ if (empty($deletion_endorsement)) {
+ $deletion_endorsement[] = $this->buildHeaderData($deletion_column_to_check);
+ }
+ $deletion_endorsement[$row_idx] = $this->buildEndorsementData($row_value, $row_idx, $deletion_column_to_check, $column_to_check);
+ break;
+
+ case "si enhancement":
+ if (empty($si_enhancement_endorsement)) {
+ $si_enhancement_endorsement[] = $this->buildHeaderData($si_column_to_check);
+ }
+ $si_enhancement_endorsement[$row_idx] = $this->buildEndorsementData($row_value, $row_idx, $si_column_to_check, $column_to_check);
+ break;
+
+ default: // inception
+ if (empty($inception) || $inception == "") {
+ $inception[] = $this->buildHeaderData($addition_column_to_check);
+ }
+ $inception[$row_idx] = $this->buildEndorsementData($row_value, $row_idx, $addition_column_to_check, $column_to_check);
+ break;
+ }
+ }
+
+ // Final data collection
+ $finalData = [
+ 'inception' => $inception,
+ 'missed_inception' => $missed_inception,
+ 'addition' => $addition_endorsement,
+ 'dependent_addition' => $dependent_addition_endorsement,
+ 'deletion' => $deletion_endorsement,
+ 'correction' => $correction_endorsement,
+ 'si_enhancement' => $si_enhancement_endorsement,
+ ];
+ // dd($finalData);
+
+ // Save JSON file in writable/tmp/
+ $savedFiles = [];
+ foreach ($finalData as $key => $data) {
+ $filePath = WRITEPATH . 'tmp/' . $key . '_' . time() . '.json';
+ file_put_contents($filePath, json_encode($data, JSON_PRETTY_PRINT));
+ $savedFiles[$key] = $filePath;
+ }
+
+ return $savedFiles;
+
+ }
+
+ public function buildEndorsementData(array $row_value, $row_idx, array $convertable_column, array $multi_event_column): array
+ {
+ $newRow = [];
+ foreach ($convertable_column as $col => $col_val) {
+ $idx = $multi_event_column[$col]['col_idx'];
+ $newRow[] = $row_value[$idx] ?? '';
+ }
+
+ return $newRow;
+ }
+
+ public function buildHeaderData(array $convertable_column): array
+ {
+ $headerRow = [];
+ foreach ($convertable_column as $col) {
+ $headerRow[] = $col['col_name'];
+ }
+
+ return $headerRow;
+ }
+
+ public function unlinkFiles($filePaths)
+ {
+ foreach ($filePaths as $filePath) {
+ if (file_exists($filePath)) {
+ unlink($filePath); // delete file
+ }
+ }
+ }
+
+ public function readTheJsonFileToArray($filePaths)
+ {
+ $allData = [];
+ foreach ($filePaths as $type => $filePath) {
+ if (file_exists($filePath)) {
+ $allData[$type] = json_decode(file_get_contents($filePath), true);
+ }
+ }
+
+ return $allData;
+ }
+
+ public function mergeErrors(array $data, $error_type = 1): array
+ {
+ $merged = [
+ 'error_type' => $error_type,
+ 'error_summary' => [],
+ 'error_data' => []
+ ];
+
+ foreach ($data as $item) {
+ // Merge error_summary (sum values)
+ foreach ($item['error_summary'] as $key => $value) {
+ if (!isset($merged['error_summary'][$key])) {
+ $merged['error_summary'][$key] = 0;
+ }
+ $merged['error_summary'][$key] += $value;
+ }
+
+ // Merge error_data (append rows)
+ foreach ($item['error_data'] as $rowIndex => $rowErrors) {
+ if (!isset($merged['error_data'][$rowIndex])) {
+ $merged['error_data'][$rowIndex] = [];
+ }
+
+ foreach ($rowErrors as $fieldKey => $fieldError) {
+ if (!isset($merged['error_data'][$rowIndex][$fieldKey])) {
+ $merged['error_data'][$rowIndex][$fieldKey] = $fieldError;
+ } else {
+ // merge errors if same field exists
+ $merged['error_data'][$rowIndex][$fieldKey]['error'] = array_merge(
+ $merged['error_data'][$rowIndex][$fieldKey]['error'],
+ $fieldError['error']
+ );
+ // remove duplicates & reindex
+ $merged['error_data'][$rowIndex][$fieldKey]['error'] = array_values(
+ array_unique($merged['error_data'][$rowIndex][$fieldKey]['error'])
+ );
+ }
+ }
+ }
+ }
+
+ return $merged;
+ }
+
+ public function syncColIndex(array $main, array $temp): array
+ {
+ foreach ($temp as $key => &$t) {
+ if (isset($main[$key])) {
+ $t['col_idx'] = $main[$key]['col_idx']; // update col_idx
+ $t['col_cell_name'] = $main[$key]['col_cell_name']; // optional: also sync cell name
+ }
+ }
+ unset($t); // break reference
+
+ return $temp;
+ }
+
+
+
+}
diff --git a/app/Controllers/JobWorker.php b/app/Controllers/JobWorker.php
index 7136c017..1f322c84 100755
--- a/app/Controllers/JobWorker.php
+++ b/app/Controllers/JobWorker.php
@@ -155,6 +155,18 @@ class JobWorker extends AdminController
'type' => 'CC', // Handler Category
'handler' => 'App\Controllers\TicketServiceController',
],
+ 'excelMultieventFileFormateValidation' => [
+ 'type' => 'CC', // Handler Category
+ 'handler' => 'App\Controllers\EmployeeMultiEventServiceController',
+ ],
+ 'excelMultieventFileDataValidation' => [
+ 'type' => 'CC', // Handler Category
+ 'handler' => 'App\Controllers\EmployeeMultiEventServiceController',
+ ],
+ 'excelMultieventFileOnBoard' => [
+ 'type' => 'CC', // Handler Category
+ 'handler' => 'App\Controllers\EmployeeMultiEventServiceController',
+ ],
];
diff --git a/app/Controllers/LeadsController.php b/app/Controllers/LeadsController.php
index 6590496c..f990adb0 100644
--- a/app/Controllers/LeadsController.php
+++ b/app/Controllers/LeadsController.php
@@ -386,6 +386,20 @@ class LeadsController extends BaseController
$data['source_policy_end_date'] = null;
}
+ //convert the date
+ if (!empty($data['next_reminder_date'])) {
+ $data['next_reminder_date'] = change_date_format($data['next_reminder_date']);
+ } else {
+ $data['next_reminder_date'] = null;
+ }
+
+ //convert 0 and 1
+ if (isset($data['is_insurer_auto_mail'])) {
+ $data['is_insurer_auto_mail'] = 1;
+ } else {
+ $data['is_insurer_auto_mail'] = 0;
+ }
+
// $file_name = file_Upload($files[$index], $uploadFilePath);
$last_3_years_claims = $data['finyear'];
@@ -462,9 +476,12 @@ class LeadsController extends BaseController
'lead_form_type' => $data['lead_form_type'] ?? 1,
'custom_fields' => $data['custom_fields'] ?? null,
- 'source_policy_start_date' => $data['source_policy_start_date'] ?? null,
- 'source_policy_end_date' => $data['source_policy_end_date'] ?? null,
- 'claim_history' => $data['claim_history'] ?? 0
+ 'source_policy_start_date' => $data['source_policy_start_date'] ?? null,
+ 'source_policy_end_date' => $data['source_policy_end_date'] ?? null,
+ 'claim_history' => $data['claim_history'] ?? 0,
+
+ 'next_reminder_date' => $data['next_reminder_date'] ?? 0,
+ 'is_insurer_auto_mail' => $data['is_insurer_auto_mail'] ?? 0
];
}
// print_r($processedData);die();
@@ -3641,7 +3658,7 @@ class LeadsController extends BaseController
}
if (!empty($data['lead_edit_data'])) {
- foreach (['policy_start_date', 'policy_end_date', 'source_policy_start_date', 'source_policy_end_date', 'incurred_claims_date'] as $dateField) {
+ foreach (['policy_start_date', 'policy_end_date', 'source_policy_start_date', 'source_policy_end_date', 'incurred_claims_date', 'next_reminder_date'] as $dateField) {
$data['lead_edit_data'][$dateField] = !empty($data['lead_edit_data'][$dateField])
? change_date_format($data['lead_edit_data'][$dateField], 'Y-m-d', 'd/m/Y')
: null;
diff --git a/app/Controllers/TestingController.php b/app/Controllers/TestingController.php
new file mode 100644
index 00000000..8fe06352
--- /dev/null
+++ b/app/Controllers/TestingController.php
@@ -0,0 +1,25 @@
+request->getPost();
+
+ // For testing: just return the received data
+ return $this->respond([
+ 'status' => 'success',
+ 'message' => 'Form data received successfully!',
+ 'data' => $data
+ ]);
+ }
+}
diff --git a/app/Controllers/ThzController.php b/app/Controllers/ThzController.php
index ad3633e2..645b3ea6 100644
--- a/app/Controllers/ThzController.php
+++ b/app/Controllers/ThzController.php
@@ -31,6 +31,7 @@ class ThzController extends BaseController
protected $clientModel;
protected $ticketMailTemplateModel;
+ protected $myLogger;
public function __construct()
{
@@ -43,6 +44,7 @@ class ThzController extends BaseController
$this->clientPolicyModel = new ClientPolicyModel();
$this->clientModel = new ClientModel();
$this->ticketMailTemplateModel = new TicketMailTemplateModel();
+ $this->myLogger = \Config\Services::mylogger();
}
public function index()
@@ -51,7 +53,8 @@ class ThzController extends BaseController
}
public function ticketSave(){
-
+ try
+ {
$data = $this->request->getPost();
if (!empty($data['thz_id'])) {
@@ -99,11 +102,27 @@ class ThzController extends BaseController
'message' => $result ? "Ticket {$text}d successfully " : "Unable to {$text} ticket. Please try again." ,
'notification' => $emailNotificationResult ? 'Email Notification Success..!!' : 'Email Notification Failed..!!'
])->setStatusCode($result ? 200 : 400);
+ } catch (\Throwable $e) {
+ $code = ($e->getCode() && $e->getCode() >= 100 && $e->getCode() < 600) ? $e->getCode() : 500;
+
+ $isDbError = $e instanceof \CodeIgniter\Database\Exceptions\DatabaseException
+ || $e instanceof \mysqli_sql_exception
+ || $e instanceof \PDOException;
+
+ $context = ['title' => get_class($e),'type' => get_class($e),'code' => $code,'message' => $e->getMessage(),'file' => $e->getFile(),'line' => $e->getLine()];
+
+ $this->myLogger->logme('error', "Exception: {message} in {file} on line {line}", $context, 0);
+
+ return $this->response->setJSON([ 'status' => 'error', 'message' => $isDbError ? 'Data Access Error' : $e->getMessage(),
+ 'ref' => $isDbError ? 'database' : 'application' . $code . ' / ' . $e->getLine()
+ ])->setStatusCode($code);
+ }
}
public function ticketList()
{
+ try{
$returnType = strtolower($this->request->getGet('return_type') ?? 'api');
@@ -117,7 +136,8 @@ class ThzController extends BaseController
if ($returnType === 'api') {
if (empty($tickets)) {
- return $this->response->setJSON([ 'status' => 'error','message' => 'No tickets found'])->setStatusCode(404);
+ // return $this->response->setJSON([ 'status' => 'error','message' => 'No tickets found'])->setStatusCode(404);
+ throw new \RuntimeException('No tickets found', 400);
}
}else{
@@ -126,18 +146,37 @@ class ThzController extends BaseController
$data['assignee'] = $this->userModel->where('is_active', 1)->whereIn('role', ['2', '3','4'])->findAll(); // enga 5-"head" and 1-"admin" assign pannvaga so dropdown la varakudhathu
// 2,3,4 remain person varannum.
$data['client_list'] = $this->clientModel->getCreatedByUserName();
+ $data['ticket_type'] = $this->thzTypeModel->where('is_active', 1)->findAll();
return $this->loadLayout('thz_list', $data);
}
+
return $this->response->setJSON([
'status' => 'success',
'data' => $tickets,
])->setStatusCode(200);
+ }
+ catch (\Throwable $e) {
+ $code = ($e->getCode() && $e->getCode() >= 100 && $e->getCode() < 600) ? $e->getCode() : 500;
+
+ $isDbError = $e instanceof \CodeIgniter\Database\Exceptions\DatabaseException
+ || $e instanceof \mysqli_sql_exception
+ || $e instanceof \PDOException;
+
+ $context = ['title' => get_class($e),'type' => get_class($e),'code' => $code,'message' => $e->getMessage(),'file' => $e->getFile(),'line' => $e->getLine()];
+
+ $this->myLogger->logme('error', "Exception: {message} in {file} on line {line}", $context, 0);
+
+ return $this->response->setJSON([ 'status' => 'error', 'message' => $isDbError ? 'Data Access Error' : $e->getMessage(),
+ 'ref' => $isDbError ? 'database' : 'application' . $code . ' / ' . $e->getLine()
+ ])->setStatusCode($code);
+ }
}
public function ticketConversationSave(){
+ try {
$data = $this->request->getPost();
$data['notes_type'] = $data['notes_type'] ?? 'External' ;
@@ -145,7 +184,8 @@ class ThzController extends BaseController
$result = $this->thzMasterNotesModel->insert($data);
if(empty($result)){
- return $this->response->setJSON((['status' => 'error', 'message' => 'No tickets found']))->setStatusCode(404);
+ // return $this->response->setJSON((['status' => 'error', 'message' => 'No tickets found']))->setStatusCode(404);
+ throw new \RuntimeException('No tickets found', 404);
}
if($data['notes_type'] == "External"){
@@ -161,41 +201,72 @@ class ThzController extends BaseController
'message' => $result ? "Ticket Notes created successfully" : "Unable to create ticket notes. Please try again." ,
'notification' => $emailNotificationResult ? 'Email Notification Success..!!' : 'Email Notification Failed Or No Need..!!'
])->setStatusCode($result ? 200 : 400);
+ }
+ catch (\Throwable $e) {
+ $code = ($e->getCode() && $e->getCode() >= 100 && $e->getCode() < 600) ? $e->getCode() : 500;
+
+ $isDbError = $e instanceof \CodeIgniter\Database\Exceptions\DatabaseException
+ || $e instanceof \mysqli_sql_exception
+ || $e instanceof \PDOException;
+
+ $context = ['title' => get_class($e),'type' => get_class($e),'code' => $code,'message' => $e->getMessage(),'file' => $e->getFile(),'line' => $e->getLine()];
+
+ $this->myLogger->logme('error', "Exception: {message} in {file} on line {line}", $context, 0);
+ return $this->response->setJSON([ 'status' => 'error', 'message' => $isDbError ? 'Data Access Error' : $e->getMessage(),
+ 'ref' => $isDbError ? 'database' : 'application' . $code . ' / ' . $e->getLine()
+ ])->setStatusCode($code);
+ }
}
- public function ticketAutoFetchDetails(){
+ public function ticketAutoFetchDetails()
+ {
+ try {
$data = $this->request->getPost();
- $client_id = $data['client_id'];
- $mobile = $data['mobile'];
+ $client_id = $data['client_id'] ?? null;
+ $mobile = $data['mobile'] ?? null;
- if($client_id && $mobile){
-
- $details = $this->thzMasterModel->ticketAutoFetchDetails($client_id ,$mobile);
-
- if(empty($details)){
- return $this->response->setJSON((['status' => 'error', 'message' => 'No Data found']))->setStatusCode(400);
- }else{
-
- $policyIds = array_column($details, 'policy_id');
- $policyIds = array_filter($policyIds);
- $clientPolicy = $this->clientPolicyModel->whereIn('id', $policyIds)->where('is_active', 1)->get()->getResultArray();
- $result['client_details'] = $details;
- $result['policy_details'] = empty($clientPolicy) ? [] : $clientPolicy ;
+ if ($client_id && $mobile) {
+ $details = $this->thzMasterModel->ticketAutoFetchDetails($client_id, $mobile);
+ if (empty($details)) {
+ throw new \RuntimeException('No Data found', 400);
}
- }else{
- return $this->response->setJSON((['status' => 'error', 'message' => 'Client and Mobile Not found']))->setStatusCode(400);
- }
-
- return $this->response->setJSON((['status' => 'success', 'data' => $result]))->setStatusCode(200);
-
+ $policyIds = array_filter(array_column($details, 'policy_id'));
+ $clientPolicy = !empty($policyIds)
+ ? $this->clientPolicyModel->whereIn('id', $policyIds)->where('is_active', 1)->get()->getResultArray()
+ : [];
+
+ $result['client_details'] = $details;
+ $result['policy_details'] = $clientPolicy ?? [];
+ } else {
+ throw new \RuntimeException('Client and Mobile Not found', 400);
+ }
+
+ return $this->response->setJSON(['status' => 'success', 'data' => $result])->setStatusCode(200);
+
+ }
+ catch (\Throwable $e) {
+ $code = ($e->getCode() && $e->getCode() >= 100 && $e->getCode() < 600) ? $e->getCode() : 500;
+
+ $isDbError = $e instanceof \CodeIgniter\Database\Exceptions\DatabaseException
+ || $e instanceof \mysqli_sql_exception
+ || $e instanceof \PDOException;
+
+ $context = ['title' => get_class($e),'type' => get_class($e),'code' => $code,'message' => $e->getMessage(),'file' => $e->getFile(),'line' => $e->getLine()];
+
+ $this->myLogger->logme('error', "Exception: {message} in {file} on line {line}", $context, 0);
+
+ return $this->response->setJSON([ 'status' => 'error', 'message' => $isDbError ? 'Data Access Error' : $e->getMessage(),
+ 'ref' => $isDbError ? 'database' : 'application' . $code . ' / ' . $e->getLine()
+ ])->setStatusCode($code);
+ }
}
- public function ticketConversationList(){
-
+ public function ticketConversationList()
+ {
$data = $this->request->getGet();
$returnType = strtolower($this->request->getGet('return_type') ?? 'api');
@@ -215,16 +286,32 @@ class ThzController extends BaseController
$notes = $this->thzMasterNotesModel->ticketConversationList($thz_id, $returnType );
$result['notes'] = !empty($notes) ? $notes : [];
}else{
- return $this->response->setJSON((['status' => 'error', 'message' => 'No tickets found']))->setStatusCode(400);
+ // return $this->response->setJSON((['status' => 'error', 'message' => 'No tickets found']))->setStatusCode(400);
+ throw new \RuntimeException('No tickets found', 400);
}
}else{
- return $this->response->setJSON((['status' => 'error', 'message' => 'No tickets found']))->setStatusCode(404);
+ // return $this->response->setJSON((['status' => 'error', 'message' => 'No tickets found']))->setStatusCode(404);
+ throw new \RuntimeException('No tickets found', 404);
}
-
-
if ($returnType === 'api') {
- return $this->response->setJSON((['status' => 'success', 'data' => $result]))->setStatusCode(200);
+ try {
+ return $this->response->setJSON((['status' => 'success', 'data' => $result]))->setStatusCode(200);
+ } catch (\Throwable $e) {
+ $code = ($e->getCode() && $e->getCode() >= 100 && $e->getCode() < 600) ? $e->getCode() : 500;
+
+ $isDbError = $e instanceof \CodeIgniter\Database\Exceptions\DatabaseException
+ || $e instanceof \mysqli_sql_exception
+ || $e instanceof \PDOException;
+
+ $context = ['title' => get_class($e),'type' => get_class($e),'code' => $code,'message' => $e->getMessage(),'file' => $e->getFile(),'line' => $e->getLine()];
+
+ $this->myLogger->logme('error', "Exception: {message} in {file} on line {line}", $context, 0);
+
+ return $this->response->setJSON([ 'status' => 'error', 'message' => $isDbError ? 'Data Access Error' : $e->getMessage(),
+ 'ref' => $isDbError ? 'database' : 'application' . $code . ' / ' . $e->getLine()
+ ])->setStatusCode($code);
+ }
}else{
$assign_to = $result['master'][0]['assign_to'];
@@ -247,24 +334,24 @@ class ThzController extends BaseController
$result['assignee'] = $this->userModel->where('is_active', 1)->whereIn('role', ['2', '3','4'])->findAll(); // enga 5-"head" and 1-"admin" assign pannvaga so dropdown la varakudhathu
// 2,3,4 remain person varannum.
$result['policy_terms'] = $toGetPolicyId ? $this->getPolicyTerms($toGetPolicyId) : '';
+
+ $result['ticket_type'] = $this->thzTypeModel->where('is_active', 1)->findAll();
return $this->loadLayout('thz_notes', $result);
- }
-
+
+ }
}
public function ticketType()
{
- $method = $this->request->getMethod(); // get, post
-
- if ($method === 'get') {
-
- $types = $this->thzTypeModel->where('is_active', 1)->findAll();
+ $method = $this->request->getMethod(); // get, post
+ try{
+ if ($method === 'get') {
+ $types = $this->thzTypeModel->select('id,name,is_active')->where('is_active', 1)->findAll();
if (empty($types)) {
return $this->response->setJSON(['status' => 'error','message' => 'No ticket types found'])->setStatusCode(404);
}
return $this->response->setJSON(['status' => 'success','data' => $types])->setStatusCode(200);
-
}
if ($method === 'post') {
@@ -280,20 +367,37 @@ class ThzController extends BaseController
$result = true;
}
- $id = isset($insertID) && !empty($insertID) ? $insertID : $updateID ;
+ $id = isset($insertID) && !empty($insertID) ? $insertID : ($updateID ?? null);
- return $this->response->setJSON([
- 'status' => $id ? 'success' : 'error',
- 'message' => $id ? "Ticket Type {$text}d successfully " : "Unable to {$text} ticket type. Please try again." ,
- 'id' => $id
+ return $this->response->setJSON([
+ 'status' => $id ? 'success' : 'error',
+ 'message' => $id ? "Ticket Type {$text}d successfully" : "Unable to {$text} ticket type. Please try again.",
+ 'id' => $id
])->setStatusCode($id ? 200 : 400);
- }
- return $this->response->setJSON(['status' => 'error','message' => 'No ticket types found'])->setStatusCode(404);
+ }
+ return $this->response->setJSON([ 'status' => 'error', 'message' => 'Invalid request method' ])->setStatusCode(405);
+ }
+ catch (\Throwable $e) {
+ $code = ($e->getCode() && $e->getCode() >= 100 && $e->getCode() < 600) ? $e->getCode() : 500;
+
+ $isDbError = $e instanceof \CodeIgniter\Database\Exceptions\DatabaseException
+ || $e instanceof \mysqli_sql_exception
+ || $e instanceof \PDOException;
+
+ $context = ['title' => get_class($e),'type' => get_class($e),'code' => $code,'message' => $e->getMessage(),'file' => $e->getFile(),'line' => $e->getLine()];
+
+ $this->myLogger->logme('error', "Exception: {message} in {file} on line {line}", $context, 0);
+
+ return $this->response->setJSON([ 'status' => 'error', 'message' => $isDbError ? 'Data Access Error' : $e->getMessage(),
+ 'ref' => $isDbError ? 'database' : 'application' . $code . ' / ' . $e->getLine()
+ ])->setStatusCode($code);
+ }
}
public function ticketHistoryList()
{
-
+ try
+ {
$data = $this->request->getGet();
$thz_id = $data['thz_id'];
// $details = $this->thzHistoryModal->whereIn('thz_id', $thz_id)->where('is_active', 1)->get()->getResultArray();
@@ -306,11 +410,27 @@ class ThzController extends BaseController
if (empty($details)) {
- return $this->response->setJSON([ 'status' => 'error','message' => 'No History found'])->setStatusCode(404);
+ // return $this->response->setJSON([ 'status' => 'error','message' => 'No History found'])->setStatusCode(404);
+ throw new \RuntimeException('No History found', 404);
}
- return $this->response->setJSON(['status' => 'success','data' => $details])->setStatusCode(200);
+ return $this->response->setJSON(['status' => 'success','data' => $details])->setStatusCode(200);
+ } catch (\Throwable $e) {
+ $code = ($e->getCode() && $e->getCode() >= 100 && $e->getCode() < 600) ? $e->getCode() : 500;
+
+ $isDbError = $e instanceof \CodeIgniter\Database\Exceptions\DatabaseException
+ || $e instanceof \mysqli_sql_exception
+ || $e instanceof \PDOException;
+
+ $context = ['title' => get_class($e),'type' => get_class($e),'code' => $code,'message' => $e->getMessage(),'file' => $e->getFile(),'line' => $e->getLine()];
+
+ $this->myLogger->logme('error', "Exception: {message} in {file} on line {line}", $context, 0);
+
+ return $this->response->setJSON([ 'status' => 'error', 'message' => $isDbError ? 'Data Access Error' : $e->getMessage(),
+ 'ref' => $isDbError ? 'database / ' : 'application / ' . $code . ' / ' . $e->getLine()
+ ])->setStatusCode($code);
+ }
}
diff --git a/app/Controllers/TicketController.php b/app/Controllers/TicketController.php
index 53ab6586..0fe8752b 100644
--- a/app/Controllers/TicketController.php
+++ b/app/Controllers/TicketController.php
@@ -1868,18 +1868,40 @@ class TicketController extends BaseController
public function getPoliciesbyEmpID()
{
$received_data = $this->request->getPost();
+ $ticket_type_id = $this->request->getPost('ticket_type_id') ?? null;
$emp_id = $received_data['emp_id'];
-
+
// Get all client policy IDs for the given employee
- $policies = $this->employeePolicyModel
- ->select('client_policy_id')
- ->where('employee_id', $emp_id)
- ->where('is_active', 1)
- ->where('status', 'active')
- ->findAll();
-
+ if ($ticket_type_id == 1) {
+
+ //get the self data for get the all policy list aginst the emp_code
+ $self_data = $this->employeeModel->where('is_active', 1)->where('id', $emp_id)->first();
+
+ $db = db_connect();
+ $builder = $db->table('employees e');
+ $builder->select('ep.*');
+ $builder->join('employee_polices ep', 'e.id = ep.employee_id');
+ $builder->join('client_policy cp', 'cp.id = ep.client_policy_id AND cp.policy_type_id IN (2,3,4,5)');
+ $builder->where('e.is_active', 1);
+ $builder->where('ep.is_active', 1);
+ $builder->where('e.emp_code', $self_data['emp_code']);
+ $builder->groupBy('client_policy_id');
+
+ $query = $builder->get();
+ $policies = $query->getResultArray();
+ } else {
+
+ $policies = $this->employeePolicyModel
+ ->select('client_policy_id')
+ ->where('employee_id', $emp_id)
+ ->where('is_active', 1)
+ ->where('status', 'active')
+ ->findAll();
+ }
+
+ // Return empty if no policies found
if (empty($policies)) {
- return []; // Return empty if no policies found
+ return [];
}
// Extract client policy IDs into an array
@@ -1902,7 +1924,7 @@ class TicketController extends BaseController
->join('tpa', 'tpa.id = client_policy.tpa_id AND tpa.is_active = 1', 'left')
->where('client_policy.policy_status', 1)
->whereIn('client_policy.id', $policy_ids)
- ->findAll();
+ ->findAll();
// dd($policyNameandID);
if ($policyNameandID){
diff --git a/app/Models/GmailSentHistoryModel.php b/app/Models/GmailSentHistoryModel.php
index d26486e8..75abbbe0 100644
--- a/app/Models/GmailSentHistoryModel.php
+++ b/app/Models/GmailSentHistoryModel.php
@@ -7,5 +7,5 @@ use CodeIgniter\Model;
class GmailSentHistoryModel extends Model{
protected $table = 'gmail_sent_history';
protected $primaryKey = 'id';
- protected $allowedFields = ["id", "mail", "bcc", "cc", "message", "attachments", "client_id", "client_branch_id", "client_policy_id", "employee_policy_id", "employee_id", "mail_type", "gmail_api_status", "gmail_api_id", "module", "pk", "from_mail", "created_by", "created_at", "updated_by", "updated_at", "isactive","received_message"];
+ protected $allowedFields = ["id", "mail", "bcc", "cc", "message", "attachments", "client_id", "client_branch_id", "client_policy_id", "employee_policy_id", "employee_id", "mail_type", "gmail_api_status", "gmail_api_id", "module", "pk", "from_mail", "created_by", "created_at", "updated_by", "updated_at", "isactive","received_message", "common"];
}
\ No newline at end of file
diff --git a/app/Models/LeadsModel.php b/app/Models/LeadsModel.php
index 4a8498ef..67a354b1 100644
--- a/app/Models/LeadsModel.php
+++ b/app/Models/LeadsModel.php
@@ -101,6 +101,10 @@ class LeadsModel extends Model
'total_lives_at_incept',
'premium_at_incept',
+
+ 'next_reminder_date',
+ 'is_insurer_auto_mail',
+ 'quote_received_insurer',
];
diff --git a/app/Models/LevelContactModel.php b/app/Models/LevelContactModel.php
index cf5d596d..bfdeb97c 100755
--- a/app/Models/LevelContactModel.php
+++ b/app/Models/LevelContactModel.php
@@ -33,7 +33,9 @@ class LevelContactModel extends Model
->select('
level_contacts.id,
insurers.short_name as insurer_name,
+ insurers.id as insurer_id,
insurer_branch.branch_code,
+ insurer_branch.id as insurer_branch_id,
level_contacts.name as contact_person_name,
level_contacts.email as contact_person_email
')
@@ -51,7 +53,7 @@ class LevelContactModel extends Model
$query->where('insurer_branch.insurer_id', $insurer_id);
}
- $result = $query->get()->getResultArray();
+ $result = $query->orderBy('insurers.id')->get()->getResultArray();
return $result;
}
diff --git a/app/Views/leads_form.php b/app/Views/leads_form.php
index f6370884..aa40bc28 100644
--- a/app/Views/leads_form.php
+++ b/app/Views/leads_form.php
@@ -332,6 +332,20 @@
+
+
+
+
+
+
+
+
+
+
+
@@ -556,6 +570,12 @@
console.log('---- completed ----')
+ var next_reminder_date = flatpickr("#next_reminder_date", {
+ dateFormat: "d/m/Y",
+ allowInput: false,
+ maxDate: "today"
+ });
+
})
//------------------------------ GET DATA ( EDIT, BRANCH, POLICY ) ---------------------------------------------------------------------------
diff --git a/app/Views/leads_form_handler.php b/app/Views/leads_form_handler.php
index b3b0f1ba..484a5f2f 100644
--- a/app/Views/leads_form_handler.php
+++ b/app/Views/leads_form_handler.php
@@ -823,6 +823,13 @@ if (isset($selected_lead_type)) {
$('#entity_type_id').val(data.entity_type_id || '');
$('#lead_status').val(data.status || '');
$('#notes').val(data.notes || '');
+ $('#next_reminder_date').val(data.next_reminder_date || '');
+
+ if (data.is_insurer_auto_mail == 1) {
+ $('#is_insurer_auto_mail').prop('checked', true);
+ } else {
+ $('#is_insurer_auto_mail').prop('checked', false);
+ }
// setTimeout(() => {
// $('#client_id').val(data.client_id || '').change();
@@ -1144,7 +1151,5 @@ if (isset($selected_lead_type)) {
});
}
-
-
diff --git a/app/Views/other_policy_terms.php b/app/Views/other_policy_terms.php
index 9cdf9887..03850e4b 100755
--- a/app/Views/other_policy_terms.php
+++ b/app/Views/other_policy_terms.php
@@ -229,6 +229,7 @@
});
var policy_type_id = "";
+ var other_auto_save_enable = false;
$('body').on('click', '.btnPolicyMaster', function() {
$("#append_html_for_other_policy_terms").empty();
@@ -276,10 +277,12 @@
if (res.emp_count_by_policy != 0) {
$("#btnOtherTermsSubmit").hide();
$("#otherButtonSpecialCondition").hide();
+ other_auto_save_enable = false;
} else {
$("#btnOtherTermsSubmit").show();
$("#otherButtonSpecialCondition").show();
- startAutoSubmit('OTHERS');
+ // startAutoSubmit('OTHERS');
+ other_auto_save_enable = true;
}
@@ -760,12 +763,12 @@
}
function beautifyString(str) {
- return str
- .split('_') // Split the string by underscores
- .map(word =>
- word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() // Capitalize each word
- )
- .join(' '); // Join with spaces instead of underscores
+ return str
+ .split('_') // Split the string by underscores
+ .map(word =>
+ word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() // Capitalize each word
+ )
+ .join(' '); // Join with spaces instead of underscores
}
function autoSaveOtherTerms(){
@@ -836,4 +839,42 @@
}
+ function debounceothers(fn, delay) {
+ let timeout;
+ return function () {
+ clearTimeout(timeout);
+ timeout = setTimeout(fn, delay);
+ };
+ }
+
+ $(document).ready(function () {
+ const form = document.querySelector("#otherPolicyTerms");
+
+ // MutationObserver (always runs)
+ const observer = new MutationObserver(() => {
+ $("#otherPolicyTerms").find("input, select, textarea").each(function () {
+ if (other_auto_save_enable) { // only bind autosave if enabled
+ if (!$(this).attr("data-observed")) {
+ const debouncedSave = debounceothers(autoSaveOtherTerms, 1000);
+ $(this).on("input change", debouncedSave);
+ $(this).attr("data-observed", "true");
+ }
+ }
+ });
+ });
+
+ observer.observe(form, { childList: true, subtree: true });
+
+ // Bind for existing fields (only if enabled)
+ if (other_auto_save_enable) {
+ const debouncedSave = debounceothers(autoSaveOtherTerms, 1000);
+ $("#otherPolicyTerms").find("input, select, textarea").each(function () {
+ $(this).on("input change", debouncedSave);
+ $(this).attr("data-observed", "true");
+ });
+ } else {
+ console.log("This policy has employee processed (autosave disabled) -- OTHERS") ;
+ }
+ });
+
\ No newline at end of file
diff --git a/app/Views/policy_gmc_terms.php b/app/Views/policy_gmc_terms.php
index 2b6431e7..4dace342 100755
--- a/app/Views/policy_gmc_terms.php
+++ b/app/Views/policy_gmc_terms.php
@@ -889,6 +889,7 @@
\ No newline at end of file
diff --git a/app/Views/policy_gpa_terms.php b/app/Views/policy_gpa_terms.php
index 64395581..77168662 100755
--- a/app/Views/policy_gpa_terms.php
+++ b/app/Views/policy_gpa_terms.php
@@ -473,6 +473,7 @@
var policy_grid_id = $('#client_id').val();
var grid_html = '';
+ var gpa_auto_save_enable = false;
$("#policyGPATerms").submit(function(event) {
@@ -603,10 +604,12 @@
if (res.emp_count_by_policy != 0) {
$("#btnGPATermsSubmit").hide();
$("#gpaButtonSpecialCondition").hide();
+ gpa_auto_save_enable = false;
} else {
$("#btnGPATermsSubmit").show();
$("#gpaButtonSpecialCondition").show();
startAutoSubmit('GPA');
+ gpa_auto_save_enable = true;
}
@@ -720,7 +723,17 @@
// console.log('jsonObject value', jsonObject[key])
// console.log('jsonObject value type', typeof jsonObject[key])
- let elements = document.getElementsByName(key);
+ let elements; // declare the element variable
+
+ if (key === "terrorism") {
+ let form = document.getElementById("policyGPATerms");
+ elements = form.querySelectorAll('[name="terrorism"]');
+ } else {
+ elements = document.getElementsByName(key);
+ }
+
+
+ // let elements = document.getElementsByName(key);
if (elements && elements.length > 0) {
let element = elements[0];
@@ -1086,4 +1099,43 @@
});
}
+ function debouncegpa(fn, delay) {
+ let timeout;
+ return function () {
+ clearTimeout(timeout);
+ timeout = setTimeout(fn, delay);
+ };
+ }
+
+ $(document).ready(function () {
+ const form = document.querySelector("#policyGPATerms");
+
+ // MutationObserver (always runs)
+ const observer = new MutationObserver(() => {
+ $("#policyGPATerms").find("input, select, textarea").each(function () {
+ if (gpa_auto_save_enable) { // only bind autosave if enabled
+ if (!$(this).attr("data-observed")) {
+ const debouncedSave = debouncegpa(autoSaveGpaTerms, 1000);
+ $(this).on("input change", debouncedSave);
+ $(this).attr("data-observed", "true");
+ }
+ }
+ });
+ });
+
+ observer.observe(form, { childList: true, subtree: true });
+
+ // Bind for existing fields (only if enabled)
+ if (gpa_auto_save_enable) {
+ const debouncedSave = debouncegpa(autoSaveGpaTerms, 1000);
+ $("#policyGPATerms").find("input, select, textarea").each(function () {
+ $(this).on("input change", debouncedSave);
+ $(this).attr("data-observed", "true");
+ });
+ } else {
+ console.log("This policy has employee processed (autosave disabled) -- GPA");
+ }
+ });
+
+
\ No newline at end of file
diff --git a/app/Views/thz_list.php b/app/Views/thz_list.php
index b38798ac..1057ad26 100644
--- a/app/Views/thz_list.php
+++ b/app/Views/thz_list.php
@@ -7,8 +7,17 @@
width: 100%;
}
+/* .table thead th {
+ vertical-align: bottom;
+ border-bottom: 2px solid #fff;
+} */
+/* Add shadow + spacing row "card" effect */
+tbody tr {
+ /* box-shadow: 0 2px 5px rgba(0,0,0,0.08); */
+}
+
/* Search input with icon */
.dataTables_filter {
position: absolute;
@@ -196,7 +205,7 @@ table thead th {
-
+
| Ticket ID |
@@ -341,17 +350,17 @@ table thead th {
@@ -725,15 +734,14 @@ $(document).ready(function() {
hideandshowpolicy();
var ticketsTable = $('#scroll-horizontal-datatable');
- $('#scroll-horizontal-datatable_filter').prepend('');
if (ticketsTable.length) {
ticketsTable.DataTable({
scrollX: true,
- dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" +
- "<'row'<'col-sm-12'tr>>" +
- "<'row'<'col-sm-5'i><'col-sm-7'p>>",
+ dom: "<'row'<'col-sm-2'f><'col-sm-10 text-right'B>>" +
+ "<'row'<'col-sm-12'tr>>" +
+ "<'row'<'col-sm-5'i><'col-sm-7'p>>",
buttons: [
{
text: ' Create New Ticket ',
@@ -775,7 +783,6 @@ $(document).ready(function() {
},
paging: true,
pageLength: 25,
- ordering: false,
});
} else {
diff --git a/app/Views/thz_notes.php b/app/Views/thz_notes.php
index 2a5720b7..03b2aa66 100644
--- a/app/Views/thz_notes.php
+++ b/app/Views/thz_notes.php
@@ -347,8 +347,15 @@ hr{
diff --git a/app/Views/ticket_form_gmc.php b/app/Views/ticket_form_gmc.php
index 84564f78..25d15e5b 100644
--- a/app/Views/ticket_form_gmc.php
+++ b/app/Views/ticket_form_gmc.php
@@ -924,8 +924,11 @@
hiddenData = $("#empIDHidden").val();
hiddenData = JSON.parse(hiddenData);
console.log('employee id ', hiddenData['emp_id']);
+ let ticket_type_id = $('#ticket_type_id').val();
+ console.log("ticket_type_id", ticket_type_id);
data = {
- emp_id: hiddenData['emp_id']
+ emp_id: hiddenData['emp_id'],
+ ticket_type_id: ticket_type_id,
}
$.ajax({
url: '= base_url("/ticket/getPoliciesbyEmpID") ?>',
diff --git a/app/Views/ticket_form_handler.php b/app/Views/ticket_form_handler.php
index 92e4d4b8..e066d030 100644
--- a/app/Views/ticket_form_handler.php
+++ b/app/Views/ticket_form_handler.php
@@ -205,6 +205,7 @@
var client_list = ''; // local variable for storing the client branch list
var branch_list = ''; // local variable for storing the client branch list
var policy_list = ''; // local variable for storing the client policy list
+ var selected_ticket_type_id = `= $selected_ticket_type ?? null ?>`;
$(document).ready(function() {
getClientAndBranchAndPolicy();
@@ -592,7 +593,8 @@
let type = $('#employee_data_points').val()
let param = $('#emp_mobile_number_for_claim').val()
let client_policy_id = $('#emp_client_policy_data_list').val()
- let client_id = $('#mobile_emp_client_data_list').val()
+ let client_id = $('#mobile_emp_client_data_list').val();
+ console.log('selected_ticket_type_id', selected_ticket_type_id);
if (searchType == 'client') {
type = 'emp_code';
@@ -600,7 +602,7 @@
client_id = $('#emp_client_data_list').val()
}
let url = '= base_url('util/getTheEmpDataForClaimSearchByMobile/') ?>' + param + '/' + type + '/' +
- client_policy_id + '/' + client_id;
+ client_policy_id + '/' + client_id + '/'+ selected_ticket_type_id;
// Data to send in the AJAX request
let requestData = {
@@ -608,6 +610,7 @@
type: type,
client_policy_id: client_policy_id,
client_id: client_id,
+ ticket_type_id: selected_ticket_type_id,
};
// Show loader
diff --git a/app/Views/view_rfq.php b/app/Views/view_rfq.php
index cf213fad..cf5e22d2 100644
--- a/app/Views/view_rfq.php
+++ b/app/Views/view_rfq.php
@@ -3713,7 +3713,7 @@ function appendInput(data) {
for (const id in contacts) {
const contact = contacts[id];
html += `
-
+
`;
}
@@ -3885,13 +3885,21 @@ function constructURL_ForInsurerAndClientMailSend() {
} else {
var insurerContact = $('#insurerContact').val();
insurerContact = insurerContact.map(Number);
+
+ let insurerIds = [];
+ $("#insurerContact option:selected").each(function () {
+ insurerIds.push($(this).data("value"));
+ });
+ console.log(insurerIds);
+
formData.append('file_type', 'rfq');
formData.append('recipient_type', 'insurer');
formData.append('recipient_mail', JSON.stringify(insurerContact));
+ formData.append('insurer_ids', JSON.stringify(insurerIds));
}
- ajaxRequest(formData)
- console.log('formData', formData)
+ ajaxRequest(formData);
+ console.log('formData', formData);
}
diff --git a/public/sample_excel/sample_multievent_file.xls b/public/sample_excel/sample_multievent_file.xls
new file mode 100644
index 00000000..6db7fcea
Binary files /dev/null and b/public/sample_excel/sample_multievent_file.xls differ
diff --git a/public/sample_excel/sample_multievent_file.xlsx b/public/sample_excel/sample_multievent_file.xlsx
new file mode 100644
index 00000000..552e4888
Binary files /dev/null and b/public/sample_excel/sample_multievent_file.xlsx differ