';print_r($CashDepositData); echo '';die; - if(count($CashDepositData)) - { + if (count($CashDepositData)) { // Define headers and map database fields to Excel fields $headers = [ 'Date' => 'created_at', @@ -2727,7 +2732,7 @@ class EmployeeRestController extends AdminController // Set the header for download - $filename = $CashDepositData[0]->insurer_name.'-CashDeposit.xlsx'; + $filename = $CashDepositData[0]->insurer_name . '-CashDeposit.xlsx'; header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="' . $filename . '"'); header('Cache-Control: max-age=0'); @@ -2738,12 +2743,10 @@ class EmployeeRestController extends AdminController exit; return $this->respond(['status' => 'success', 'code' => 200, 'data' => []], 200); - - }else{ + } else { return $this->respond(['status' => 'failed', 'code' => 404, 'data' => []], 200); } - } @@ -2751,126 +2754,121 @@ class EmployeeRestController extends AdminController { try { - $clientPolicy = $this->clientPolicyModel->where('id',$this->request->getGet('client_policy_id')) - ->where('open_for_enrollment',1)->findAll(); - - if(count($clientPolicy)) - { + $clientPolicy = $this->clientPolicyModel->where('id', $this->request->getGet('client_policy_id')) + ->where('open_for_enrollment', 1)->findAll(); + + if (count($clientPolicy)) { - if($clientPolicy[0]['is_addon'] == 2)//Topup + if ($clientPolicy[0]['is_addon'] == 2) //Topup { - if($clientPolicy[0]['policy_type_id'] == 4)//GMC-Topup + if ($clientPolicy[0]['policy_type_id'] == 4) //GMC-Topup { - $empData = $this->employeeModel->where('emp_code',$this->request->getGet('emp_code')) - ->where('is_addon_value', 0 ) - ->findAll(); - }else if($clientPolicy[0]['policy_type_id'] == 5)//GMC-Parent-Topup + $empData = $this->employeeModel->where('emp_code', $this->request->getGet('emp_code')) + ->where('is_addon_value', 0) + ->findAll(); + } else if ($clientPolicy[0]['policy_type_id'] == 5) //GMC-Parent-Topup { - $empData = $this->employeeModel->where('emp_code',$this->request->getGet('emp_code')) - ->where('is_addon_value', 1 ) - ->findAll(); + $empData = $this->employeeModel->where('emp_code', $this->request->getGet('emp_code')) + ->where('is_addon_value', 1) + ->findAll(); } - - if(count($empData)) - { + + if (count($empData)) { foreach ($empData as $key => $value) { - $this->employeePolicyModel->where('client_policy_id',$this->request->getGet('client_policy_id') ) - ->where('employee_id', $value['id'] ) - ->set(array('is_active'=> 0 )) - ->update(); - + $this->employeePolicyModel->where('client_policy_id', $this->request->getGet('client_policy_id')) + ->where('employee_id', $value['id']) + ->set(array('is_active' => 0)) + ->update(); } } - - } - else if($clientPolicy[0]['is_addon'] == 3)//Dependent addon + } else if ($clientPolicy[0]['is_addon'] == 3) //Dependent addon { - $empData = $this->employeeModel->where('emp_code',$this->request->getGet('emp_code')) - ->where('is_addon_value', 1 )->findAll(); - if(count($empData)) - { - foreach ($empData as $key => $value) { + $empData = $this->employeeModel->where('emp_code', $this->request->getGet('emp_code')) + ->where('is_addon_value', 1)->findAll(); + if (count($empData)) { + foreach ($empData as $key => $value) { - $this->employeePolicyModel->where('client_policy_id',$this->request->getGet('client_policy_id') ) - ->where('employee_id', $value['id'] ) - ->set(array('is_active'=> 0 )) - ->update(); + $this->employeePolicyModel->where('client_policy_id', $this->request->getGet('client_policy_id')) + ->where('employee_id', $value['id']) + ->set(array('is_active' => 0)) + ->update(); + } + $this->employeeModel->where('emp_code', $this->request->getGet('emp_code')) + ->where('is_active', 1)->where('is_addon_value', 1) + ->set(array('is_active' => 0)) + ->update(); } - - $this->employeeModel->where('emp_code', $this->request->getGet('emp_code') ) - ->where('is_active', 1 )->where('is_addon_value', 1 ) - ->set(array('is_active'=> 0 )) - ->update(); - } - } - - - return $this->respond(['status' => 'success','code' => 200,'data' =>[] ], 200); - - }else{ - return $this->respond(['status' => 'failed','code' => 404,'data' => [] ], 200); + + + return $this->respond(['status' => 'success', 'code' => 200, 'data' => []], 200); + } else { + return $this->respond(['status' => 'failed', 'code' => 404, 'data' => []], 200); } - - } catch (\Exception $e) { - return $this->respond(['status' => 'failed','code' => 500,'data' => $e->getMessage()], 500); + return $this->respond(['status' => 'failed', 'code' => 500, 'data' => $e->getMessage()], 500); } - } function getEmployeeActiveOrInactivePolicy() { - if($this->request->getGet('type') == 'Active'){ $policy_status = 1; $policy_status_key = "Active"; }else{ $policy_status = 0; $policy_status_key = "InActive";} + if ($this->request->getGet('type') == 'Active') { + $policy_status = 1; + $policy_status_key = "Active"; + } else { + $policy_status = 0; + $policy_status_key = "InActive"; + } $dayInterval = 10; $ClientPolicyData = $this->clientPolicyModel->select("client_policy.* , policy_type.policy_type as policy_type,insurers.name as insurer_name,tpa.name as tpa_name,tpa.network_hospitals as network_hospitals_url, policy_type.long_name as policy_long_name, DATE_ADD(client_policy.policy_end_date, INTERVAL {$dayInterval} DAY) as claims_grace_date") - ->join('insurers', 'client_policy.insurer_id = insurers.id', 'left') - ->join('tpa', 'client_policy.tpa_id = tpa.id', 'left') - ->join('policy_type', 'client_policy.policy_type_id = policy_type.id', 'left') - ->where('client_policy.client_id', $this->request->getGet('client_id') ) - ->where('client_policy.client_branch_id', $this->request->getGet('client_branch_id') ) - ->where('client_policy.is_active', 1 ) - ->where('client_policy.policy_status', $policy_status) - ->where('client_policy.enrolment_visibility', 1) - ->orderby('client_policy.id' , 'ASC') - ->findAll(); + ->join('insurers', 'client_policy.insurer_id = insurers.id', 'left') + ->join('tpa', 'client_policy.tpa_id = tpa.id', 'left') + ->join('policy_type', 'client_policy.policy_type_id = policy_type.id', 'left') + ->where('client_policy.client_id', $this->request->getGet('client_id')) + ->where('client_policy.client_branch_id', $this->request->getGet('client_branch_id')) + ->where('client_policy.is_active', 1) + ->where('client_policy.policy_status', $policy_status) + ->where('client_policy.enrolment_visibility', 1) + ->orderby('client_policy.id', 'ASC') + ->findAll(); // Retrieve employee and dependents data by passing the employee code - $employeeData = $this->employeeModel->where('emp_code',$this->request->getGet('emp_code')) - ->where('client_id',$this->request->getGet('client_id')) - ->where('client_branch_id',$this->request->getGet('client_branch_id')) - ->where('is_active', 1 )->findAll(); - - $employeeSelfData = $this->employeeModel->where('emp_code',$this->request->getGet('emp_code')) - ->where('client_id',$this->request->getGet('client_id')) - ->where('client_branch_id',$this->request->getGet('client_branch_id')) - ->where('family_floater_key','self')->where('is_active', 1 ) - ->get()->getRow(); + $employeeData = $this->employeeModel->where('emp_code', $this->request->getGet('emp_code')) + ->where('client_id', $this->request->getGet('client_id')) + ->where('client_branch_id', $this->request->getGet('client_branch_id')) + ->where('is_active', 1)->findAll(); + + $employeeSelfData = $this->employeeModel->where('emp_code', $this->request->getGet('emp_code')) + ->where('client_id', $this->request->getGet('client_id')) + ->where('client_branch_id', $this->request->getGet('client_branch_id')) + ->where('family_floater_key', 'self')->where('is_active', 1) + ->get()->getRow(); $employeeName = $employeeSelfData->name ?? ""; - + //for get the pre enrollment policy count $empMobileNo = $this->request->getGet('mobile_no'); $clientId = $this->request->getGet('client_id'); - if(!empty($employeeSelfData) && isset($employeeSelfData->email_corporate)){ + if (!empty($employeeSelfData) && isset($employeeSelfData->email_corporate)) { $prePolicyCount = $this->getPreEmployeePolicyCount($empMobileNo, $clientId, $employeeSelfData->email_corporate); - }else{ + } else { $prePolicyCount = $this->getPreEmployeePolicyCount($empMobileNo, $clientId); } - - $whereArrayForId = []; - foreach ( $employeeData as $key => $value) { array_push($whereArrayForId, $value['id']); } - if(count($ClientPolicyData) > 0 && count($employeeData) > 0) - { + $whereArrayForId = []; + foreach ($employeeData as $key => $value) { + array_push($whereArrayForId, $value['id']); + } + + if (count($ClientPolicyData) > 0 && count($employeeData) > 0) { $result = []; foreach ($ClientPolicyData as $key => $ClientPolicyValue) { @@ -2878,38 +2876,35 @@ class EmployeeRestController extends AdminController continue; } - if($ClientPolicyValue['policy_type_id'] == 1) - { + if ($ClientPolicyValue['policy_type_id'] == 1) { $policyGroup = 'gpa'; $data['ticket_type_id'] = 2; + $data['ticket_settled_status_id'] = 24; $data['claim_subject'] = "Claim GPA"; $data['sum_insured_label'] = "Sum Assured"; - - }else if($ClientPolicyValue['policy_type_id'] == 6) - { + } else if ($ClientPolicyValue['policy_type_id'] == 6) { $policyGroup = 'other'; $data['ticket_type_id'] = 3; + $data['ticket_settled_status_id'] = 34; $data['claim_subject'] = "Claim EDLI"; $data['sum_insured_label'] = "Sum Assured"; - - }else if($ClientPolicyValue['policy_type_id'] == 7) - { + } else if ($ClientPolicyValue['policy_type_id'] == 7) { $policyGroup = 'other'; $data['ticket_type_id'] = 4; + $data['ticket_settled_status_id'] = 44; $data['claim_subject'] = "Claim GTLI"; $data['sum_insured_label'] = "Sum Assured"; - - }else - { + } else { $policyGroup = 'gmc'; $data['ticket_type_id'] = 1; + $data['ticket_settled_status_id'] = 11; $data['claim_subject'] = "Claim GMC"; $data['sum_insured_label'] = "Sum Insured"; } - $terms = json_decode($ClientPolicyValue['policy_terms'] , true); + $terms = json_decode($ClientPolicyValue['policy_terms'], true); $data['policy_terms'] = isset($terms['enrollment_display_key']) && !empty($terms['enrollment_display_key']) ? $terms['enrollment_display_key'] : $this->policyTermsFiter($terms, $policyGroup); - + $data['client_id'] = $ClientPolicyValue['client_id']; $data['client_policy_id'] = $ClientPolicyValue['id']; @@ -2934,61 +2929,80 @@ class EmployeeRestController extends AdminController // if($ClientPolicyValue['policy_type_id'] == 5){ $data['heading'] = 'Group Medical Coverage - Parents (Top Up)'; }else // if($ClientPolicyValue['policy_type_id'] == 7){ $data['heading'] = 'Group Term Life Insurance'; } - if($ClientPolicyValue['policy_type_id'] == 1 || $ClientPolicyValue['policy_type_id'] == 6 || $ClientPolicyValue['policy_type_id'] == 7) - { - $data['floter_text_heading'] = 'Sum Insured'; - }else{ - - if(isset($terms['family_floater']) && strpos(strtolower($terms['family_floater']), "no") !== false ){ $data['floter_text_heading'] = 'Sum Insured'; }else{ $data['floter_text_heading'] = 'Floter Sum Insured'; } + if ($ClientPolicyValue['policy_type_id'] == 1 || $ClientPolicyValue['policy_type_id'] == 6 || $ClientPolicyValue['policy_type_id'] == 7) { + $data['floter_text_heading'] = 'Sum Insured'; + } else { + + if (isset($terms['family_floater']) && strpos(strtolower($terms['family_floater']), "no") !== false) { + $data['floter_text_heading'] = 'Sum Insured'; + } else { + $data['floter_text_heading'] = 'Floter Sum Insured'; + } } - + $employee_policy = $this->employeePolicyModel->select('employees.*,employee_polices.employee_id , employee_polices.basic_cover_si , employee_polices.premium , employee_polices.gst , employee_polices.tpa_id , employee_polices.rand_string , employee_polices.uhid as uhid') - ->join('employees', 'employee_polices.employee_id = employees.id', 'left') - ->whereIn('employee_polices.employee_id',$whereArrayForId) - ->where('employee_polices.client_policy_id',$ClientPolicyValue['id']) - ->where('employee_polices.is_active', 1 )->findAll(); - if(count($employee_policy) > 0) - { + ->join('employees', 'employee_polices.employee_id = employees.id', 'left') + ->whereIn('employee_polices.employee_id', $whereArrayForId) + ->where('employee_polices.client_policy_id', $ClientPolicyValue['id']) + ->where('employee_polices.is_active', 1)->findAll(); + if (count($employee_policy) > 0) { $si_value = 0; $si_premium_value = 0; $si_gst_value = 0; - - foreach ($employee_policy as $key => $value) { - if(isset($value['basic_cover_si'])){ $si_value = ($si_value == 0) ? $value['basic_cover_si'] : $si_value; } - if(isset($value['premium'])){ $si_premium_value = $si_premium_value + $value['premium'];} - if(isset($value['gst'])){ $si_gst_value = $si_gst_value + $value['gst'];} - } - - if($employee_policy[0]['tpa_id'] != null) - $data['eCardDownload'] = base_url('download-e-card/') . $employee_policy[0]['rand_string'].'/1'; + foreach ($employee_policy as $key => $value) { + if (isset($value['basic_cover_si'])) { + $si_value = ($si_value == 0) ? $value['basic_cover_si'] : $si_value; + } + if (isset($value['premium'])) { + $si_premium_value = $si_premium_value + $value['premium']; + } + if (isset($value['gst'])) { + $si_gst_value = $si_gst_value + $value['gst']; + } + } + + + if ($employee_policy[0]['tpa_id'] != null) + $data['eCardDownload'] = base_url('download-e-card/') . $employee_policy[0]['rand_string'] . '/1'; else - $data['eCardDownload'] = null; - - - + $data['eCardDownload'] = null; + + + $data['si_value'] = $si_value; $data['si_premium_value'] = ($ClientPolicyValue['policy_type_id'] == 1 || $ClientPolicyValue['policy_type_id'] == 2) ? 0 : round($si_premium_value); $data['si_gst_value'] = ($ClientPolicyValue['policy_type_id'] == 1 || $ClientPolicyValue['policy_type_id'] == 2) ? 0 : round($si_gst_value); - + $data['EmployeePolicy'] = $employee_policy; + + //fetch claims data + $approvedClaimsAmount = $this->ticketMaster + ->select('SUM(approved_amount) AS total_settled_amount') + ->where('emp_code', $employee_policy[0]['emp_code']) + ->where('client_policy_id', $data['client_policy_id']) + ->where('claim_status_id', $data['ticket_settled_status_id']) + ->groupBy('emp_code') + ->groupBy('client_policy_id') + ->groupBy('claim_status_id') + ->get()->getRow(); + $data['total_settled_amount'] = $approvedClaimsAmount ? ($approvedClaimsAmount->total_settled_amount ?? 0) : 0; array_push($result, $data); } - + + } - return $this->respond(['status' => 'success','code' => 200,'data' => $result , 'emp_name' => $employeeName, 'pre_policy_count' => $prePolicyCount ], 200); - - }else{ - return $this->respond(['status' => 'failed','code' => 404,'data' => [] ], 200); + return $this->respond(['status' => 'success', 'code' => 200, 'data' => $result, 'emp_name' => $employeeName, 'pre_policy_count' => $prePolicyCount], 200); + } else { + return $this->respond(['status' => 'failed', 'code' => 404, 'data' => []], 200); } - } - function policyTermsFiter($terms , $type) - { - if(empty($terms)){ + function policyTermsFiter($terms, $type) + { + if (empty($terms)) { return []; } @@ -3020,7 +3034,7 @@ class EmployeeRestController extends AdminController ]; $gmc = [ - + "waiverofpreexistingdiseases" => "Waiver of Pre-existing Diseases", "waiverof1,2,3&4thyearexclusions" => "Waiver of 1, 2, 3 & 4th year Exclusions", "waiverof30dayswaitingperiod" => "Waiver of 30 days waiting period", @@ -3042,59 +3056,51 @@ class EmployeeRestController extends AdminController ]; $finalarray = []; - if($type == 'gpa'){ + if ($type == 'gpa') { foreach ($gpa as $key => $value) { - if(isset($terms->$key)) - { - if($terms->$key == 1) - { + if (isset($terms->$key)) { + if ($terms->$key == 1) { $termsValue = 'Yes'; - }else if($terms->$key == 0) - { + } else if ($terms->$key == 0) { $termsValue = 'No'; - }else - { + } else { $termsValue = $terms->$key; } $finalarray[$value] = $termsValue; } } - if(isset(($terms->gpa_special_condition_label)) && is_array($terms->gpa_special_condition_label) && is_array($terms->gpa_special_condition_input)){ - for ($i=0; $i < count($terms->gpa_special_condition_label); $i++) { + if (isset(($terms->gpa_special_condition_label)) && is_array($terms->gpa_special_condition_label) && is_array($terms->gpa_special_condition_input)) { + for ($i = 0; $i < count($terms->gpa_special_condition_label); $i++) { $finalarray[$terms->gpa_special_condition_label[$i]] = $terms->gpa_special_condition_input[$i]; } } - }else if($type == 'other'){ + } else if ($type == 'other') { foreach ($terms as $key => $value) { - if($key != "multiple_sum_insured" && $value != ""){ + if ($key != "multiple_sum_insured" && $value != "") { $result = ucwords(str_replace('_', ' ', $key)); $finalarray[$result] = $value; } } - if(isset(($terms->gpa_special_condition_label)) && is_array($terms->gpa_special_condition_label) && is_array($terms->gpa_special_condition_input)){ - for ($i=0; $i < count($terms->gpa_special_condition_label); $i++) { + if (isset(($terms->gpa_special_condition_label)) && is_array($terms->gpa_special_condition_label) && is_array($terms->gpa_special_condition_input)) { + for ($i = 0; $i < count($terms->gpa_special_condition_label); $i++) { $finalarray[$terms->gpa_special_condition_label[$i]] = $terms->gpa_special_condition_input[$i]; } } - }else{ + } else { foreach ($gmc as $key => $value) { - if(isset($terms->$key)) - { - if($terms->$key == 1) - { + if (isset($terms->$key)) { + if ($terms->$key == 1) { $termsValue = 'Yes'; - }else if($terms->$key == 0) - { + } else if ($terms->$key == 0) { $termsValue = 'No'; - }else - { + } else { $termsValue = $terms->$key; } $finalarray[$value] = $termsValue; - } + } } - if(isset(($terms->special_condition_label)) && is_array($terms->special_condition_label) && is_array($terms->special_condition_input)){ - for ($i=0; $i < count($terms->special_condition_label); $i++) { + if (isset(($terms->special_condition_label)) && is_array($terms->special_condition_label) && is_array($terms->special_condition_input)) { + for ($i = 0; $i < count($terms->special_condition_label); $i++) { $finalarray[$terms->special_condition_label[$i]] = $terms->special_condition_input[$i]; } } @@ -3119,42 +3125,40 @@ class EmployeeRestController extends AdminController public function getFEContent() { try { - + $feContentData = $this->feContentModel->findAll(); if (count($feContentData) > 0) { - - return $this->respond(['status' => 'success','code' => 200,'data' => $feContentData ],200); + return $this->respond(['status' => 'success', 'code' => 200, 'data' => $feContentData], 200); } else { - - return $this->respond(['status' => 'failed','code' => 404,'data' => 'No Data'],404); + + return $this->respond(['status' => 'failed', 'code' => 404, 'data' => 'No Data'], 404); } - } catch (\Throwable $th) { - return $this->respond(['status' => 'failed','code' => 500,'data' => $th],500); - } + } catch (\Throwable $th) { + return $this->respond(['status' => 'failed', 'code' => 500, 'data' => $th], 500); + } } public function getAdvertisementImage() { try { - - $img = $this->addImgModel->where('is_active',1)->findAll(); - - if (count($img) > 0) { - $data=[]; - foreach ($img as $key => $value) { - $url = base_url('public/uploads/add_image_upload/').$value['name']; - array_push($data,$url); - } - - return $this->respond(['status' => 'success','code' => 200,'data' => $data ],200); + $img = $this->addImgModel->where('is_active', 1)->findAll(); + + if (count($img) > 0) { + $data = []; + foreach ($img as $key => $value) { + $url = base_url('public/uploads/add_image_upload/') . $value['name']; + array_push($data, $url); + } + + return $this->respond(['status' => 'success', 'code' => 200, 'data' => $data], 200); } else { - - return $this->respond(['status' => 'failed','code' => 404,'data' => 'No Data'],404); + + return $this->respond(['status' => 'failed', 'code' => 404, 'data' => 'No Data'], 404); } } catch (\Throwable $th) { - return $this->respond(['status' => 'failed','code' => 500,'data' => $th],500); + return $this->respond(['status' => 'failed', 'code' => 500, 'data' => $th], 500); } } @@ -3162,29 +3166,28 @@ class EmployeeRestController extends AdminController public function storeFireBase() { try { - + $firebase_token = isset($this->request->getJSON()->firebase_token) ? $this->request->getJSON()->firebase_token : null; $mobile = isset($this->request->getJSON()->mobile) ? $this->request->getJSON()->mobile : null; $email_id = isset($this->request->getJSON()->email_id) ? $this->request->getJSON()->email_id : null; - + // Ensure the mobile number is provided if (empty($mobile)) { return $this->respond(['status' => 'failed', 'code' => 400, 'message' => 'Mobile number is required'], 400); } - + // Fetch employee - if (isset($mobile)) - { - $employee = $this->employeeModel->where('mobile', $mobile)->where('relationship', 'self')->where('is_active', 1)->first(); - } else { - $employee = $this->employeeModel->where('email_corporate', $email_id)->where('relationship', 'self')->where('is_active', 1)->first(); - } - - + if (isset($mobile)) { + $employee = $this->employeeModel->where('mobile', $mobile)->where('relationship', 'self')->where('is_active', 1)->first(); + } else { + $employee = $this->employeeModel->where('email_corporate', $email_id)->where('relationship', 'self')->where('is_active', 1)->first(); + } + + if ($employee) { // Check if firebase_token is provided if (!empty($firebase_token)) { - + // Check if the current firebase_token is different from the new one if ($employee['firebase_token'] !== $firebase_token) { // Update the employee's firebase_token @@ -3195,7 +3198,7 @@ class EmployeeRestController extends AdminController $db = \Config\Database::connect(); $builder = $db->table('employees'); $update_emp = $builder->update($data, ['id' => $id]); - + // Check if the update was successful if ($db->affectedRows() > 0) { // Fetch the updated employee data @@ -3229,16 +3232,16 @@ class EmployeeRestController extends AdminController // $deviceToken = 'cMVKESh8QzqIl8nh_yqbcl:APA91bHKm87Sh1goVJNKZtctV4etgLMQboI0eyDVn3MH1yf9cO-2RtQRlFnKLdataOxosoxm7a4JvATKjfI1_Bids46mGw5m8zesp90mR4odCbD_cJtGmBeMYt4hssSY0YtAht1emK_H'; // $title = 'Nhance'; // $body = 'All your policy enrolled successfully ..!'; - + // // Initialize Firebase with the service account // $firebase = (new Factory) // ->withServiceAccount(APPPATH . 'Config/google-services.json') // ->createMessaging(); - + // $notification = Notification::create($title, $body); // $message = CloudMessage::withTarget('token', $deviceToken) // ->withNotification($notification); - + // try { // $firebase->send($message); // return $this->response->setJSON(['status' => 'success']); @@ -3255,22 +3258,26 @@ class EmployeeRestController extends AdminController $empCode = $this->request->getGet('emp_code'); $clientId = $this->request->getGet('client_id'); $clientBranchId = $this->request->getGet('client_branch_id'); - - if (!$empCode || !$clientId || !$clientBranchId) { return $this->fail("emp_code, client_id, and client_branch_id are required parameters."); } + + if (!$empCode || !$clientId || !$clientBranchId) { + return $this->fail("emp_code, client_id, and client_branch_id are required parameters."); + } //Fetch active employee details $employees = $this->employeeModel->select('id,emp_code,name,relationship,dob,emp_status,is_addon_value,created_at,updated_at') - ->where([ - 'emp_code' => $empCode, - 'client_id' => $clientId, - 'client_branch_id' => $clientBranchId, - 'is_active' => 1 - ]) - ->findAll(); + ->where([ + 'emp_code' => $empCode, + 'client_id' => $clientId, + 'client_branch_id' => $clientBranchId, + 'is_active' => 1 + ]) + ->findAll(); //Find status of self - $selfEmployee = array_filter($employees, function($employee) { return $employee['relationship'] === 'Self'; }); + $selfEmployee = array_filter($employees, function ($employee) { + return $employee['relationship'] === 'Self'; + }); $data['self_status'] = !empty($selfEmployee) ? array_values($selfEmployee)[0]['emp_status'] : null; $data['self_enrolled_time'] = !empty($selfEmployee) ? array_values($selfEmployee)[0]['updated_at'] : null; $data['self_employee_id'] = !empty($selfEmployee) ? array_values($selfEmployee)[0]['id'] : null; @@ -3278,113 +3285,113 @@ class EmployeeRestController extends AdminController //Fetch employee policy details $employeeIds = array_column($employees, 'id'); - $policies = $this->employeePolicyModel->whereIn('employee_id', $employeeIds)->where('is_active',1)->findAll(); + $policies = $this->employeePolicyModel->whereIn('employee_id', $employeeIds)->where('is_active', 1)->findAll(); + - //Find the stage of enrolment process $employeeStatuses = array_column($employees, 'emp_status'); $employeePolicyStatuses = array_column($policies, 'status'); $uniqueStatuses = array_unique(array_merge($employeeStatuses, $employeePolicyStatuses)); - - if(count($uniqueStatuses) > 1){ $enrolmentStagekey = 1; }else{ if($uniqueStatuses[0] == 'draft'){ $enrolmentStagekey = 0; }else{ $enrolmentStagekey = 2; } } - - $enrolmentStage = ['Draft Only','Intermittent Enrollment','Successful Enrollment']; + + if (count($uniqueStatuses) > 1) { + $enrolmentStagekey = 1; + } else { + if ($uniqueStatuses[0] == 'draft') { + $enrolmentStagekey = 0; + } else { + $enrolmentStagekey = 2; + } + } + + $enrolmentStage = ['Draft Only', 'Intermittent Enrollment', 'Successful Enrollment']; $data['enrolment_stage'] = $enrolmentStage[$enrolmentStagekey]; $data['revert_employee_data'] = []; $data['revert_employee_policy_data'] = []; - if($enrolmentStagekey == 1) - { + if ($enrolmentStagekey == 1) { //Find active employee history $empIdsWithoutSelf = $employeeIds; $key = array_search($data['self_employee_id'], $empIdsWithoutSelf); - unset($empIdsWithoutSelf[$key]); - foreach ($empIdsWithoutSelf as $key => $pk) - { - $retrivedData = $this->retriveOldData($data['self_enrolled_time'],'employees',$pk); - if($retrivedData != false) - array_push($data['revert_employee_data'] , $retrivedData); + unset($empIdsWithoutSelf[$key]); + foreach ($empIdsWithoutSelf as $key => $pk) { + $retrivedData = $this->retriveOldData($data['self_enrolled_time'], 'employees', $pk); + if ($retrivedData != false) + array_push($data['revert_employee_data'], $retrivedData); } //Find inactive employee history $inActiveEmployees = $this->employeeModel->select('id,emp_code,name,relationship,dob,emp_status,is_addon_value,created_at,updated_at') - ->where([ - 'emp_code' => $empCode, - 'client_id' => $clientId, - 'client_branch_id' => $clientBranchId, - 'is_active' => 0 - ]) - ->findAll(); - $inActiveEmployeeIds = array_column($inActiveEmployees, 'id'); - foreach ($inActiveEmployeeIds as $key => $pk) - { - $retrivedData = $this->retriveOldData($data['self_enrolled_time'],'employees',$pk); - if($retrivedData != false) - array_push($data['revert_employee_data'] , $retrivedData); + ->where([ + 'emp_code' => $empCode, + 'client_id' => $clientId, + 'client_branch_id' => $clientBranchId, + 'is_active' => 0 + ]) + ->findAll(); + $inActiveEmployeeIds = array_column($inActiveEmployees, 'id'); + foreach ($inActiveEmployeeIds as $key => $pk) { + $retrivedData = $this->retriveOldData($data['self_enrolled_time'], 'employees', $pk); + if ($retrivedData != false) + array_push($data['revert_employee_data'], $retrivedData); } - + //Merged active and inactive employees , employee_polict history - $mergedEmpIds = array_merge($employeeIds,$inActiveEmployeeIds); + $mergedEmpIds = array_merge($employeeIds, $inActiveEmployeeIds); $empPolicyData = $this->employeePolicyModel->whereIn('employee_id', $mergedEmpIds)->findAll(); $employeePolicyIds = array_column($empPolicyData, 'id'); - foreach ($employeePolicyIds as $key => $pk) - { - $retrivedData = $this->retriveOldData($data['self_enrolled_time'],'employee_polices',$pk); - if($retrivedData != false) - array_push($data['revert_employee_policy_data'] , $retrivedData); + foreach ($employeePolicyIds as $key => $pk) { + $retrivedData = $this->retriveOldData($data['self_enrolled_time'], 'employee_polices', $pk); + if ($retrivedData != false) + array_push($data['revert_employee_policy_data'], $retrivedData); } } - if($this->request->getGet('revert_data') == 1) - { + if ($this->request->getGet('revert_data') == 1) { //update data back to employee - if(count($data['revert_employee_data'])){ - foreach ($data['revert_employee_data'] as $key => $val) - { - $this->employeeModel->where('id',$val['id'] )->set($val['data'])->update(); + if (count($data['revert_employee_data'])) { + foreach ($data['revert_employee_data'] as $key => $val) { + $this->employeeModel->where('id', $val['id'])->set($val['data'])->update(); } } //update data back to employee policy - if(count($data['revert_employee_policy_data'])){ - foreach ($data['revert_employee_policy_data'] as $key => $val) - { - $this->employeePolicyModel->where('id',$val['id'] )->set($val['data'])->update(); - } + if (count($data['revert_employee_policy_data'])) { + foreach ($data['revert_employee_policy_data'] as $key => $val) { + $this->employeePolicyModel->where('id', $val['id'])->set($val['data'])->update(); + } } //update enrolled status for self - if(count($data['revert_employee_data']) || count($data['revert_employee_policy_data'])){ - $this->employeeModel->where('id',$data['self_employee_id'] )->set(array('emp_status'=>'enrolled'))->update(); - $data['retrieve_status'] = 'Data revert successfully'; - }else{ - $data['retrieve_status'] = 'There is no data to revert'; + if (count($data['revert_employee_data']) || count($data['revert_employee_policy_data'])) { + $this->employeeModel->where('id', $data['self_employee_id'])->set(array('emp_status' => 'enrolled'))->update(); + $data['retrieve_status'] = 'Data revert successfully'; + } else { + $data['retrieve_status'] = 'There is no data to revert'; } - } - - + + // Fetch all policies related to these employees who currently active $current_employee_data = $this->employeeModel->select('id,emp_code,name,relationship,dob,emp_status,is_addon_value,created_at,updated_at') - ->where([ - 'emp_code' => $empCode, - 'client_id' => $clientId, - 'client_branch_id' => $clientBranchId, - 'is_active' => 1 - ]) - ->findAll(); - $Ids = array_column($current_employee_data, 'id'); - $policies = $this->employeePolicyModel->whereIn('employee_id', $Ids)->where('is_active',1)->findAll(); + ->where([ + 'emp_code' => $empCode, + 'client_id' => $clientId, + 'client_branch_id' => $clientBranchId, + 'is_active' => 1 + ]) + ->findAll(); + $Ids = array_column($current_employee_data, 'id'); + $policies = $this->employeePolicyModel->whereIn('employee_id', $Ids)->where('is_active', 1)->findAll(); // Group policies by policy_id $groupedPolicies = []; foreach ($policies as $policy) { $policyId = $policy['client_policy_id']; - + if (!isset($groupedPolicies[$policyId])) { $groupedPolicies[$policyId] = [ 'policy_id' => $policy['id'], @@ -3416,24 +3423,28 @@ class EmployeeRestController extends AdminController // Re-index the grouped policies $data['currentPolicies'] = array_values($groupedPolicies); - + return $this->respond(['data' => $data]); } - public function retriveOldData($self_enrolled_time,$table,$pk) + public function retriveOldData($self_enrolled_time, $table, $pk) { - $historyData = $this->auditHistoryModel->where('pk', $pk)->where('table_name',$table)->findAll(); + $historyData = $this->auditHistoryModel->where('pk', $pk)->where('table_name', $table)->findAll(); $beforeEnrolled = []; $afterEnrolled = []; // Split the array foreach ($historyData as $val) { - if ($val['created_at'] <= $self_enrolled_time) { $beforeEnrolled[] = $val; } else { $afterEnrolled[] = $val; } + if ($val['created_at'] <= $self_enrolled_time) { + $beforeEnrolled[] = $val; + } else { + $afterEnrolled[] = $val; + } } - if(count($beforeEnrolled) && count($afterEnrolled)){ //After enrolment edited some of the data - + if (count($beforeEnrolled) && count($afterEnrolled)) { //After enrolment edited some of the data + $temp['table'] = $table; $temp['id'] = $pk; // Extract earliest `old_value` for each `field_name` @@ -3447,22 +3458,19 @@ class EmployeeRestController extends AdminController } $temp['data'] = $originalValues; return $temp; - - }else if(!count($beforeEnrolled) && !count($afterEnrolled)){ //After enrolment created new data + } else if (!count($beforeEnrolled) && !count($afterEnrolled)) { //After enrolment created new data $temp['table'] = $table; $temp['id'] = $pk; - $temp['data'] = ['is_active'=> 0 ]; + $temp['data'] = ['is_active' => 0]; return $temp; - - }else if(!count($beforeEnrolled) && count($afterEnrolled)){ //After enrolment created new data and edited some of the data + } else if (!count($beforeEnrolled) && count($afterEnrolled)) { //After enrolment created new data and edited some of the data $temp['table'] = $table; $temp['id'] = $pk; - $temp['data'] = ['is_active'=> 0 ]; + $temp['data'] = ['is_active' => 0]; return $temp; - - }else if(count($beforeEnrolled) && !count($afterEnrolled)){ //After enrolment nothing changes from the data + } else if (count($beforeEnrolled) && !count($afterEnrolled)) { //After enrolment nothing changes from the data return false; } @@ -3472,13 +3480,12 @@ class EmployeeRestController extends AdminController public function findThePolicyIsOpenForEnrollment($plicy_id) { - $policy = $this->clientPolicyModel->where('id',$plicy_id)->where('open_for_enrollment',1)->find(); + $policy = $this->clientPolicyModel->where('id', $plicy_id)->where('open_for_enrollment', 1)->find(); - if($policy) - return true; + if ($policy) + return true; else - return false; - + return false; } // ---------------- TICKET API's --------------------------------------------------------------------------------------------------- @@ -3505,7 +3512,7 @@ class EmployeeRestController extends AdminController $insured_emp_id = $received_data['insured_emp_id']; $file_data = []; - if(isset($get_file_data) && !empty($get_file_data)){ + if (isset($get_file_data) && !empty($get_file_data)) { $file_path = WRITEPATH . 'uploads/claim_files/'; $file_data = multi_file_Upload($get_file_data, $file_path, $get_docs_name); } @@ -3513,13 +3520,13 @@ class EmployeeRestController extends AdminController if (empty($received_data['doa'])) { $received_data['doa'] = null; - } else{ + } else { $ticket_data['doa'] = change_date_format($received_data['doa']); } if (empty($received_data['dod'])) { $received_data['dod'] = null; - } else{ + } else { $ticket_data['dod'] = change_date_format($received_data['dod']); } @@ -3562,22 +3569,22 @@ class EmployeeRestController extends AdminController $emp_ticket_data = $this->employeeModel->query($sql)->getResultArray(); // print_r(db_connect()->getLastQuery()); die; - if(!empty($emp_ticket_data)){ + if (!empty($emp_ticket_data)) { $fetchData = $emp_ticket_data[0]; $claimStatusQuery = $this->claimStatusModel - ->select('id') - ->where('ticket_type', $fetchData['ticket_type_id']) - ->orderBy('id', 'asc'); - + ->select('id') + ->where('ticket_type', $fetchData['ticket_type_id']) + ->orderBy('id', 'asc'); + if ($fetchData['ticket_type_id'] == 1 && !empty($fetchData['tpa_no'])) { $results = $claimStatusQuery->findAll(2); $fetchData['claim_status_id'] = $results[1]['id'] ?? $results[0]['id']; } else { $fetchData['claim_status_id'] = $claimStatusQuery->first()['id']; } - + $fetchData['priority'] = 1; $fetchData['mode_of_intimation'] = 3; @@ -3636,21 +3643,18 @@ class EmployeeRestController extends AdminController $this->myLogger->logme('error', "Claim initiated, Failed to send Mail :$ticket_id "); return $this->respond(['status' => false, 'code' => 400, 'message' => $message], 200); } - } else { $message = 'Something Went Wrong'; return $this->respond(['status' => false, 'code' => 400, 'message' => $message], 200); } - - }else{ + } else { return $this->response->setJSON(['status' => false, 'code' => 200, 'message' => 'The employee is not active.'])->setStatusCode(404); } } public function handleCliamFiles($data, $ticket_id, $ticket_message_id = null) { - if(!empty($data) && !empty($ticket_id)) - { + if (!empty($data) && !empty($ticket_id)) { $insert_ids = []; $pdf_exist_in_the_file = false; $claim_file = new ClaimFilesModel(); @@ -3668,17 +3672,17 @@ class EmployeeRestController extends AdminController $insert_ids[] = $claim_file->insert($data); - if(getMimeTypeByFileName($value['file_name']) == "application/pdf"){ + if (getMimeTypeByFileName($value['file_name']) == "application/pdf") { $pdf_exist_in_the_file = true; } } - if($pdf_exist_in_the_file){ + if ($pdf_exist_in_the_file) { // this call for TPA integration $apiServiceController = new ApiServiceController(); $apiServiceController->pushClaims($ticket_id); log_message('error', "pushClaims function called with Ticket ID: {$ticket_id}, In Employee Rest Controller"); - }else{ + } else { log_message('error', "Failed to call the pushClaims function in EmployeeRestController for Ticket ID: {$ticket_id}, because the .pdf file does not exist."); } @@ -3777,8 +3781,7 @@ class EmployeeRestController extends AdminController } $filtered = array_values($filtered); - return $this->response->setJSON(['status' => true,'code' => 200, 'ticket_type' => $filtered ])->setStatusCode(200); - + return $this->response->setJSON(['status' => true, 'code' => 200, 'ticket_type' => $filtered])->setStatusCode(200); } catch (\Throwable $e) { $this->myLogger->logme('error', "Error in get_ticket_type: " . $e->getMessage() . " Trace: " . $e->getTraceAsString()); return $this->response->setJSON([ @@ -3804,7 +3807,7 @@ class EmployeeRestController extends AdminController $ticket_type = $this->request->getGet('ticket_type') ?? null; $ticket_id = $this->request->getGet('ticket_id') ?? null; $request = \Config\Services::request(); - $uri = $request->uri->getPath(); + $uri = $request->uri->getPath(); $returnType = ""; // $returnType = (strpos($uri, 'api') !== false) ? 'api' : 'web'; // dd($emp_id); @@ -3818,24 +3821,40 @@ class EmployeeRestController extends AdminController if (!empty($ticket_data)) { - $client_claim_status = [ - 'Received' => [1, 2, 3, 4, 15, 16, 17, 18, 25, 26, 27, 28, 35, 36, 37, 38], - 'Rejected' => [8, 49, 55, 60], - 'Cancelled' => [13, 47, 53, 58], - 'Returned' => [14, 48, 54, 59], - 'Closed' => [12, 22, 32, 42], - 'Approved' => [9, 20, 30, 40], - 'Settled' => [11, 24, 34], - 'Under Process' => [5, 6, 7, 10, 19, 23, 45, 50, 29, 33, 51, 39, 43, 56], - ]; + // $client_claim_status = [ + // 'Received' => [1, 2, 3, 4, 15, 16, 17, 18, 25, 26, 27, 28, 35, 36, 37, 38], + // 'Rejected' => [8, 49, 55, 60], + // 'Cancelled' => [13, 47, 53, 58], + // 'Returned' => [14, 48, 54, 59], + // 'Closed' => [12, 22, 32, 42], + // 'Approved' => [9, 20, 30, 40], + // 'Settled' => [11, 24, 34], + // 'Under Process' => [5, 6, 7, 10, 19, 23, 45, 50, 29, 33, 51, 39, 43, 56], + // ]; + + // $client_claim_status = [ + // 'Claim Received' => [1, 2, 3, 15, 16, 17, 18, 25, 26, 27, 28, 35, 36, 37, 38], + // 'Under Process' => [5, 6, 7, 10, 19, 23, 45, 50, 29, 33, 51, 39, 43, 56], + // 'Information Required' => [4], + // 'Approved' => [9, 20, 30, 40], + // 'Settled' => [11, 24, 34], + // 'Denial Review Awaited' => [66], + // 'Rejected' => [8, 49, 55, 60], + // ]; + + // construct the claim status + $client_claim_status = $this->getClaimStatusGrouped(); foreach ($ticket_data as $key => $value) { foreach ($client_claim_status as $claim_key => $claim_value) { if (in_array($value['claim_status_id'], $claim_value)) { // Corrected argument order $ticket_data[$key]['claim_status'] = $claim_key ?? null; // Assign back to the main array + }else if(in_array($value['old_status_id'], $claim_value)){ + $ticket_data[$key]['claim_status'] = $claim_key ?? null; // Assign back to the main array } } + $ticket_data[$key]['priority_type'] = $priorityType[$value['priority']] ?? null; $ticket_data[$key]['mode_of_intimate_type'] = $modeOFIntimate[$value['mode_of_intimation']] ?? null; $ticket_data[$key]['relationship_type'] = ucfirst($value['relationship']) ?? null; @@ -3843,9 +3862,9 @@ class EmployeeRestController extends AdminController if (in_array($value['claim_type'], [2, 3, 4])) { $claimPrimaryTypey = "2"; } - $ticket_data[$key]['claim_type_value'] = $claimType[$claimPrimaryTypey][$value['claim_type']] ?? null; + $ticket_data[$key]['claim_type_value'] = $claimType[$claimPrimaryTypey][$value['claim_type']] ?? null; $ticket_data[$key]['ticket_policy_type'] = $ticketTypeArray[$value['ticket_type_id']] ?? null; - + $claim_file_urls = []; if (isset($value['ticket_message_id'])) { @@ -3860,7 +3879,7 @@ class EmployeeRestController extends AdminController ->findAll(); foreach ($claim_files_data as &$value) { - $value['url'] = base_url('downloadClaimFile/') . $value['claim_file_id']; + $value['url'] = base_url('downloadClaimFile/') . $value['claim_file_id']; $claim_file_urls[] = $value; } unset($value); @@ -3868,15 +3887,41 @@ class EmployeeRestController extends AdminController // always set the key (empty if no files found) $ticket_data[$key]['claim_files'] = $claim_file_urls; - } } return $this->response->setJSON(['ticket_data' => $ticket_data])->setStatusCode(200); } + public function getClaimStatusGrouped() + { + // Fetch active claim statuses + $ticketClaimStatus = $this->claimStatusModel + ->select('id, display_name') + ->where('display_name IS NOT NULL') + ->where('is_active', 1) + ->findAll(); + + $result = []; + + foreach ($ticketClaimStatus as $row) { + $name = $row['display_name']; + $id = $row['id']; + + if (!isset($result[$name])) { + $result[$name] = []; + } + + $result[$name][] = $id; + } + + return $result; + } + + // not in use did for testing - function encrypt_for_sso(): string { + function encrypt_for_sso(): string + { $key = "32D1D5535157AF3D4667ADAB0CC795D77D022BB281AD3272EB134C72BD0B185E"; @@ -3930,8 +3975,6 @@ class EmployeeRestController extends AdminController $finalUrl = $baseURL . '/sso?userParams=' . $output . '&clientId=' . $clientId; return $finalUrl; - - } @@ -4040,7 +4083,7 @@ class EmployeeRestController extends AdminController // } public function getPreEmployeePolicyCount($mobile_no, $clientId = null, $email = null) - { + { log_message('error', 'STEP 1: getPreEmployeePolicyCount called with params: ' . json_encode(['mobile_no' => $mobile_no, 'client_id' => $clientId, 'email' => $email])); if (empty($mobile_no) && empty($email)) { @@ -4061,25 +4104,23 @@ class EmployeeRestController extends AdminController } else { log_message('error', 'STEP 4: No client found for ID: ' . $clientId); } - } else { log_message('error', 'STEP 3: No clientId provided. Skipping client lookup.'); } - if(!empty($email)){ + if (!empty($email)) { $post_data = [ 'email_id' => $email, 'client_short_name' => $client_short_name ]; - }else{ + } else { $post_data = [ 'mobile_number' => $mobile_no, 'client_short_name' => $client_short_name ]; - } - + log_message('error', 'STEP 5: Calling third-party API with payload: ' . json_encode($post_data)); @@ -4104,80 +4145,79 @@ class EmployeeRestController extends AdminController } } - private function callThirdPartyAPI($postData , $endPoint) + private function callThirdPartyAPI($postData, $endPoint) { $client = \Config\Services::curlrequest(); - $url = env('PRE_ENROLLMENT_BASEURL').$endPoint; - $response = $client->post( $url, ['json' => $postData, 'http_errors' => false ] ); + $url = env('PRE_ENROLLMENT_BASEURL') . $endPoint; + $response = $client->post($url, ['json' => $postData, 'http_errors' => false]); // return json_decode($response->getBody(), true); return $response->getBody(); } - //-------------------------------------------------------------------------------------------- - public function hrFileUpload() - { - try { - // Check file - $file = $this->request->getFile('file_name'); - if (!$file) { - return $this->response->setJSON([ - 'status' => false, - 'message' => "Invalid file or file not uploaded.", - 'data' => "No Data" - ]); - } - - // Upload folder path - $uploadPath = WRITEPATH . 'uploads/hr_files/'; - - // If directory not exists, create it - if (!is_dir($uploadPath)) { - mkdir($uploadPath, 0777, true); - } - - // New file name with timestamp - $newFileName = time() . '_' . $file->getRandomName(); - - // Move file - $file->move($uploadPath, $newFileName); - - // Prepare data - $data = [ - 'client_id' => $this->request->getPost('client_id'), - 'client_branch_id' => $this->request->getPost('client_branch_id'), - 'policy_id' => $this->request->getPost('policy_id'), - 'policy_no' => $this->request->getPost('policy_no'), - 'file_name' => $newFileName, - 'file_action' => $this->request->getPost('file_action'), - 'status' => 'Yet to start', - 'created_by' => $this->request->getPost('created_by'), - 'updated_by' => $this->request->getPost('created_by'), - ]; - - // Save into DB - $result = $this->hrFileUploadModel->insert($data); + //-------------------------------------------------------------------------------------------- + public function hrFileUpload() + { + try { + // Check file + $file = $this->request->getFile('file_name'); + if (!$file) { + return $this->response->setJSON([ + 'status' => false, + 'message' => "Invalid file or file not uploaded.", + 'data' => "No Data" + ]); + } - if($result){ + // Upload folder path + $uploadPath = WRITEPATH . 'uploads/hr_files/'; + + // If directory not exists, create it + if (!is_dir($uploadPath)) { + mkdir($uploadPath, 0777, true); + } + + // New file name with timestamp + $newFileName = time() . '_' . $file->getRandomName(); + + // Move file + $file->move($uploadPath, $newFileName); + + // Prepare data + $data = [ + 'client_id' => $this->request->getPost('client_id'), + 'client_branch_id' => $this->request->getPost('client_branch_id'), + 'policy_id' => $this->request->getPost('policy_id'), + 'policy_no' => $this->request->getPost('policy_no'), + 'file_name' => $newFileName, + 'file_action' => $this->request->getPost('file_action'), + 'status' => 'Yet to start', + 'created_by' => $this->request->getPost('created_by'), + 'updated_by' => $this->request->getPost('created_by'), + ]; + + // Save into DB + $result = $this->hrFileUploadModel->insert($data); + + if ($result) { $this->giveNotificationToClientsAccountManager($data); - } - - return $this->respondCreated([ - 'status' => true, - 'message' => 'File uploaded successfully', - 'data' => $data - ]); - - } catch (\Exception $e) { - return $this->failServerError($e->getMessage()); - } - - } + } - private function giveNotificationToClientsAccountManager($data){ - - $client_name = $this->clientModel->where('id',$data['client_id'])->findAll()[0]['client_name'] ?? [] ; + return $this->respondCreated([ + 'status' => true, + 'message' => 'File uploaded successfully', + 'data' => $data + ]); + } catch (\Exception $e) { + return $this->failServerError($e->getMessage()); + } + } + + private function giveNotificationToClientsAccountManager($data) + { + + $client_name = $this->clientModel->where('id', $data['client_id'])->findAll()[0]['client_name'] ?? []; $account_manager_email = $this->clientRMModel->findAccountManagerEmail($data['client_id']); @@ -4185,20 +4225,20 @@ class EmployeeRestController extends AdminController $mailTemplate = $this->ticketMailTemplateModel->where('template_name', $templateName)->findAll()[0] ?? []; - if(empty($mailTemplate)){ + if (empty($mailTemplate)) { //empty mail template please update the template in database or create one..!! - log_message("error","Empty mail template for inception_addition please update the template in database or create one..!!"); - return ; + log_message("error", "Empty mail template for inception_addition please update the template in database or create one..!!"); + return; } - + $data['file_action'] = ucwords(preg_replace("/_/", " ", $data['file_action'])); $mailTemplate['mail_content'] = str_replace('%file_action%', $data['file_action'] ?? '', $mailTemplate['mail_content']); $mailTemplate['mail_content'] = str_replace('%client_name%', $client_name ?? '', $mailTemplate['mail_content']); $mailTemplate['mail_content'] = str_replace('%policy_no%', $data['policy_no'] ?? '', $mailTemplate['mail_content']); - $mailTemplate['subject'] = str_replace('%subject%',$data['file_action']??'',$mailTemplate['subject']); - $mailTemplate['subject'] = str_replace('%client_name%',$client_name??'',$mailTemplate['subject']); + $mailTemplate['subject'] = str_replace('%subject%', $data['file_action'] ?? '', $mailTemplate['subject']); + $mailTemplate['subject'] = str_replace('%client_name%', $client_name ?? '', $mailTemplate['subject']); $from_mail = ""; $to_mail = $account_manager_email; @@ -4208,62 +4248,60 @@ class EmployeeRestController extends AdminController $attachments = ""; $reply_to = ""; $bcc_string = ""; - - MailHelper::send_email(['from_mail' => $from_mail, 'mail' => $to_mail, 'cc' => $cc_string, 'subject' => $subject, 'message' => $message, 'attachments' => $attachments, 'reply_to' => $reply_to, 'bcc' => $bcc_string]); - } + MailHelper::send_email(['from_mail' => $from_mail, 'mail' => $to_mail, 'cc' => $cc_string, 'subject' => $subject, 'message' => $message, 'attachments' => $attachments, 'reply_to' => $reply_to, 'bcc' => $bcc_string]); + } + + public function updateHrFileUploadData() + { + try { + $id = $this->request->getPost('id'); + + if (!$id) { + return $this->failValidationErrors('ID is required for update.'); + } + + // Prepare data + $data = [ + 'client_id' => $this->request->getPost('client_id'), + 'client_branch_id' => $this->request->getPost('client_branch_id'), + 'policy_id' => $this->request->getPost('policy_id'), + 'policy_no' => $this->request->getPost('policy_no'), + 'file_action' => $this->request->getPost('file_action'), + 'status' => $this->request->getPost('status'), + 'updated_by' => $this->request->getPost('updated_by'), + ]; + + // Check if record exists + $record = $this->hrFileUploadModel->find($id); + if (!$record) { + return $this->failNotFound("Record with ID {$id} not found."); + } + + // Update record + $this->hrFileUploadModel->update($id, $data); + + return $this->respond([ + 'status' => true, + 'message' => 'File record updated successfully', + 'data' => $data + ], 200); + } catch (\Exception $e) { + return $this->failServerError($e->getMessage()); + } + } + + + public function hrFileDownload($id = null) + { + try { - public function updateHrFileUploadData() - { - try { - $id = $this->request->getPost('id'); - - if (!$id) { - return $this->failValidationErrors('ID is required for update.'); - } - - // Prepare data - $data = [ - 'client_id' => $this->request->getPost('client_id'), - 'client_branch_id' => $this->request->getPost('client_branch_id'), - 'policy_id' => $this->request->getPost('policy_id'), - 'policy_no' => $this->request->getPost('policy_no'), - 'file_action' => $this->request->getPost('file_action'), - 'status' => $this->request->getPost('status'), - 'updated_by' => $this->request->getPost('updated_by'), - ]; - - // Check if record exists - $record = $this->hrFileUploadModel->find($id); - if (!$record) { - return $this->failNotFound("Record with ID {$id} not found."); - } - - // Update record - $this->hrFileUploadModel->update($id, $data); - - return $this->respond([ - 'status' => true, - 'message' => 'File record updated successfully', - 'data' => $data - ], 200); - - } catch (\Exception $e) { - return $this->failServerError($e->getMessage()); - } - } - - - public function hrFileDownload($id = null) - { - try { - $file_id = $this->request->getGet('id') ?? $id; - + // Find record - $record = $this->hrFileUploadModel->where('id',$file_id)->find(); - + $record = $this->hrFileUploadModel->where('id', $file_id)->find(); + // print_rr( $record);die; if (!$record) { @@ -4281,19 +4319,19 @@ class EmployeeRestController extends AdminController // Force file download return $this->response->download($filePath, null) - ->setFileName($record[0]['file_name']); - } catch (\Exception $e) { - return $this->failServerError($e->getMessage()); - } - } - + ->setFileName($record[0]['file_name']); + } catch (\Exception $e) { + return $this->failServerError($e->getMessage()); + } + } + // public function hrFileList() // { // try { // $request = service('request'); // $builder = $this->hrFileUploadModel // ->select('hr_file_upload.* , c.short_name , cb.branch_name , lc.name as first_name '); - + // // Allowed filter keys // $filters = [ // 'client_id', @@ -4303,7 +4341,7 @@ class EmployeeRestController extends AdminController // 'status', // 'created_by' // ]; - + // // Apply filters dynamically // foreach ($filters as $key) { // $value = $request->getGetPost($key); // supports both GET and POST @@ -4311,13 +4349,13 @@ class EmployeeRestController extends AdminController // $builder->where($key, $value); // } // } - + // // Fetch results // $builder->join('clients c', 'c.id = hr_file_upload.client_id AND c.is_active = 1', 'left'); // $builder->join('client_branch cb', 'cb.id = hr_file_upload.client_branch_id AND cb.is_active = 1', 'left'); // $builder->join('level_contacts lc', 'lc.id = hr_file_upload.created_by AND lc.contact_type = "client" AND lc.is_active = 1', 'left'); // $data = $builder->findAll(); - + // return $this->respond([ // 'status' => true, // 'message' => 'File list fetched successfully', @@ -4370,10 +4408,10 @@ class EmployeeRestController extends AdminController FROM files f1 WHERE f1.is_active = 1 ORDER BY f1.id DESC - LIMIT 1) f', - 'f.hr_file_id = hr_file_upload.id', + LIMIT 1) f', + 'f.hr_file_id = hr_file_upload.id', 'left' - ); + ); // Allowed filter keys $filters = [ @@ -4406,7 +4444,7 @@ class EmployeeRestController extends AdminController return $this->failServerError($e->getMessage()); } } - + public function hrFileUploadMasters() { try { @@ -4432,14 +4470,14 @@ class EmployeeRestController extends AdminController if (empty($policy_id)) { $policy_id = $this->request->getGet('policy_id'); $api_name = $this->request->getGet('api_name'); - log_message('error', "Input parameters fetched from GET: policy_id={$policy_id}, api_name={$api_name}"); + log_message('error', "Input parameters fetched from GET: policy_id={$policy_id}, api_name={$api_name}"); } else { - log_message('error', "Input parameters received directly: policy_id={$policy_id}, api_name={$api_name}"); + log_message('error', "Input parameters received directly: policy_id={$policy_id}, api_name={$api_name}"); } // Step 2: Validate policy_id if (empty($policy_id)) { - log_message('error', 'Policy ID is empty'); + log_message('error', 'Policy ID is empty'); if ($return_type == 'api') { return $this->respond(['status' => false, 'code' => 200, 'message' => 'Policy ID missing']); } @@ -4447,14 +4485,14 @@ class EmployeeRestController extends AdminController } // Step 3: Fetch policy data - log_message('error', "Fetching policy data for policy_id={$policy_id}"); + log_message('error', "Fetching policy data for policy_id={$policy_id}"); $policy_data = $this->clientPolicyModel ->where('is_active', 1) ->where('id', $policy_id) ->first(); if (empty($policy_data)) { - log_message('error', "Policy data not found for policy_id={$policy_id}"); + log_message('error', "Policy data not found for policy_id={$policy_id}"); if ($return_type == 'api') { return $this->respond(['status' => false, 'code' => 200, 'message' => 'Policy data not found']); } @@ -4463,7 +4501,7 @@ class EmployeeRestController extends AdminController // Step 4: Check for TPA ID if (empty($policy_data['tpa_id'])) { - log_message('error', "TPA ID not found for policy_id={$policy_id}"); + log_message('error', "TPA ID not found for policy_id={$policy_id}"); if ($return_type == 'api') { return $this->respond(['status' => false, 'code' => 200, 'message' => 'TPA ID not found']); } @@ -4471,10 +4509,10 @@ class EmployeeRestController extends AdminController } $tpa_id = $policy_data['tpa_id']; - log_message('error', "Found TPA ID={$tpa_id} for policy_id={$policy_id}"); + log_message('error', "Found TPA ID={$tpa_id} for policy_id={$policy_id}"); // Step 5: Check if API service is enabled - log_message('error', "Checking TPA API service for TPA ID={$tpa_id} and API name={$api_name}"); + log_message('error', "Checking TPA API service for TPA ID={$tpa_id} and API name={$api_name}"); $tpaApiServiceModel = new TpaApiSeviceModel(); $api_data = $tpaApiServiceModel ->where('is_active', 1) @@ -4483,34 +4521,34 @@ class EmployeeRestController extends AdminController ->first(); if (!empty($api_data)) { - log_message('error', "API '{$api_name}' is enabled for TPA ID={$tpa_id}"); + log_message('error', "API '{$api_name}' is enabled for TPA ID={$tpa_id}"); if ($return_type == 'api') { return $this->respond(['status' => true, 'code' => 200, 'message' => 'API services enabled']); } return true; } else { - log_message('error', "API '{$api_name}' is NOT enabled for TPA ID={$tpa_id}"); + log_message('error', "API '{$api_name}' is NOT enabled for TPA ID={$tpa_id}"); if ($return_type == 'api') { return $this->respond(['status' => false, 'code' => 200, 'message' => 'API services not enabled']); } return false; } } catch (\Throwable $th) { - log_message('error', 'Exception in checkTpaApiEnable: ' . $th->getMessage()); + log_message('error', 'Exception in checkTpaApiEnable: ' . $th->getMessage()); if ($return_type == 'api') { return $this->respond(['status' => false, 'code' => 500, 'message' => 'Internal Server Error']); } return false; } finally { - log_message('error', '--- END checkTpaApiEnable ---'); + log_message('error', '--- END checkTpaApiEnable ---'); } } - public function getEcardURL() - { - try{ + public function getEcardURL() + { + try { $id = $this->request->getGet('id'); $emp_code = $this->request->getGet('emp_code'); @@ -4518,40 +4556,34 @@ class EmployeeRestController extends AdminController $policy_no = $this->request->getGet('policy_no'); $employee_policy = $this->employeePolicyModel - ->select('employees.*, employee_polices.tpa_id , employee_polices.rand_string , employee_polices.uhid as uhid , client_policy.tpa_id as tpa_primary_id ') - ->join('employees', 'employee_polices.employee_id = employees.id', 'left') - ->join('client_policy', 'employee_polices.client_policy_id = client_policy.id', 'left') - ->where('employee_polices.employee_id',$id) - ->where('employee_polices.client_policy_id',$client_policy_id) - ->where('employee_polices.is_active', 1 )->findAll(); + ->select('employees.*, employee_polices.tpa_id , employee_polices.rand_string , employee_polices.uhid as uhid , client_policy.tpa_id as tpa_primary_id ') + ->join('employees', 'employee_polices.employee_id = employees.id', 'left') + ->join('client_policy', 'employee_polices.client_policy_id = client_policy.id', 'left') + ->where('employee_polices.employee_id', $id) + ->where('employee_polices.client_policy_id', $client_policy_id) + ->where('employee_polices.is_active', 1)->findAll(); - - if(count($employee_policy) > 0) - { - if($employee_policy[0]['tpa_id'] != null) - { - if($employee_policy[0]['tpa_primary_id'] == 2)//Medi assist + + if (count($employee_policy) > 0) { + if ($employee_policy[0]['tpa_id'] != null) { + if ($employee_policy[0]['tpa_primary_id'] == 2) //Medi assist { $mediAssistController = new MediAssistApiController(); - $data['eCardDownload'] = $mediAssistController->EcardRequest( $emp_code, $policy_no ); - }else{ - $data['eCardDownload'] = base_url('download-e-card/') . $employee_policy[0]['rand_string'].'/1'; + $data['eCardDownload'] = $mediAssistController->EcardRequest($emp_code, $policy_no); + } else { + $data['eCardDownload'] = base_url('download-e-card/') . $employee_policy[0]['rand_string'] . '/1'; } - } else { - $data['eCardDownload'] = null; + $data['eCardDownload'] = null; } - }else{ - $data['eCardDownload'] = null; + } else { + $data['eCardDownload'] = null; } - return $this->respond(['status' => true,'message' => '','data' => $data]); - - } catch(\Exception $e){ - + return $this->respond(['status' => true, 'message' => '', 'data' => $data]); + } catch (\Exception $e) { } - } - -} \ No newline at end of file + } +} diff --git a/app/Controllers/EmployeeServiceController.php b/app/Controllers/EmployeeServiceController.php index 690e9c08..28721878 100755 --- a/app/Controllers/EmployeeServiceController.php +++ b/app/Controllers/EmployeeServiceController.php @@ -1387,10 +1387,16 @@ class EmployeeServiceController extends AdminController $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); + $self = current(array_filter($family, fn($r) => strtolower($r[5] ?? '') === 'self')); + $premium = (int)($self['temp']['rata_premimum'] ?? 0); + foreach ($family as &$r) if (strtolower($r[5] ?? '') !== 'self') $r['self_rata_premium'] = $premium; } // Kint::dump($family); $data = calculate_premium_new(family_data:$family,policy_terms: $policy_terms,slab_details : $slab_details,fileArr: $file, existing_units:$existing_units); + // if($file['action'] == 'dependent_addition') { + // $data = validatet_family_floter_rata_premium($data); + // } // dd($data); $employee_data_group_by_family[$emp_id] = $data; $this->employeesOnboardProcess(['familiy_data' => $data,'file' => $file]); diff --git a/app/Controllers/InsuranceCommissionController.php b/app/Controllers/InsuranceCommissionController.php new file mode 100644 index 00000000..f2907bf6 --- /dev/null +++ b/app/Controllers/InsuranceCommissionController.php @@ -0,0 +1,279 @@ +myLogger = \Config\Services::mylogger(); + // Load rules file if present in writable config path + // $rulesPath = WRITEPATH . 'config/insurance_rules.json'; + // if (file_exists($rulesPath)) { + // $this->loadRulesFromFile($rulesPath); + // } + } + + /** + * POST /insurance/calculate + * Accepts JSON body with policy data and returns commission calculation + */ + public function initiateCommissionCalc() + { + // Accept POST params (JSON, form-data, x-www-form-urlencoded) + $input = $this->request->getPost(); + + if (empty($input)) { + $json = $this->request->getJSON(true); + if ($json) { + $input = $json; + } + } + + if (empty($input)) { + return $this->failValidationError('No input data received'); + } + // -------- Required Params Check -------- + if (empty($input['policy_issue_date'])) { + return $this->failValidationError('policy_issue_date is required'); + } + + if (empty($input['department'])) { + return $this->failValidationError('department is required'); + } + + if (empty($input['insurer_id'])) { + return $this->failValidationError('insurer_id is required'); + } + + + // -------- Build Dynamic Rules Path -------- + $policyDate = strtotime($input['policy_issue_date']); + if (!$policyDate) { + return $this->failValidationError('Invalid policy_issue_date'); + } + + $month = strtoupper(date('M', $policyDate)); // SEP + $year = date('Y', $policyDate); // 2025 + $folderName = $month . $year; // SEP2025 + + $insurerId = $input['insurer_id']; // 5 + $department = ucfirst(strtolower($input['department'])); // Motor, Health, Fire + + // Final Path: WRITEPATH/rules/SEP2025/5_Motor.json + $rulesPath = WRITEPATH . "uploads/commission/rules/{$folderName}/{$insurerId}_{$department}.json"; + // echo $rulesPath;die(); + + if (!file_exists($rulesPath)) { + return $this->fail("Rules file not found at: {$rulesPath}"); + } + + // Load the dynamic rule set + $this->loadRulesFromFile($rulesPath); + + // -------- Execute Rule Matching & Commission Calculation -------- + try { + $result = $this->calculateCommission($input); + + $comment = isset($result['rule']['name']) + ? "Matched rule: " . $result['rule']['name'] + : "Matched rule: (unnamed rule)"; + + return $this->respond([ + 'success' => true, + 'data' => [ + 'payout' => $result['payout'], + 'rule' => $result['rule'], + 'comment' => $comment, + // 'rules_path_used' => $rulesPath + ] + ]); + + } catch (\Exception $e) { + return $this->fail($e->getMessage()); + } + } + + + /** + * Load rules JSON and normalise department keys to lowercase for lookups + */ + private function loadRulesFromFile(string $filePath) + { + if (!file_exists($filePath)) { + throw new \Exception("Rules file not found: {$filePath}"); + } + + $json = file_get_contents($filePath); + $parsed = json_decode($json, true); + + if (json_last_error() !== JSON_ERROR_NONE) { + throw new \Exception('Invalid JSON in rules file: ' . json_last_error_msg()); + } + // print_r($parsed);die(); + // Normalise department keys to lowercase for consistent lookups + $this->rules = []; + foreach ($parsed as $dept => $rules) { + if($rules['is_deleted'] === false) + { + $this->rules[strtolower($dept)] = $rules; + } + } + + // print_r($this->rules);die(); + } + + public function calculateCommission(array $policyData) + { + $department = $policyData['department'] ?? ''; + $deptKey = strtolower($department); + // print_r($this->rules);die(); + // if (!isset($this->rules[$deptKey])) { + // throw new \Exception("No rules found for department: {$department}"); + // } + + $matchingRules = []; + + foreach ($this->rules as $rule) { + if ($this->evaluateConditions($rule['conditions'] ?? [], $policyData)) { + $matchingRules[] = $rule; + } + } + + if (empty($matchingRules)) { + throw new \Exception('No matching rules found for the policy data'); + } + // print_r($matchingRules);die; + // Use the first matching rule. In future you can implement priority/weighting + $applicableRule = $matchingRules[0]; + + $payout = $this->applyCalculation($applicableRule['calculation'], $policyData); + + return ['rule' => $applicableRule, 'payout' => $payout]; + } + + private function evaluateConditions(array $conditions, array $data): bool + { + foreach ($conditions as $condition) { + $field = $condition['field']; + $operator = $condition['operator']; + $expectedValue = $condition['value']; + + if (!array_key_exists($field, $data)) { + return false; + } + + $actualValue = $data[$field]; + + if (!$this->compareValues($actualValue, $operator, $expectedValue)) { + return false; + } + } + + return true; + } + + private function compareValues($actual, string $operator, $expected): bool + { + switch ($operator) { + case '==': + return $actual == $expected; + case '!=': + return $actual != $expected; + case '>': + return $actual > $expected; + case '>=': + return $actual >= $expected; + case '<': + return $actual < $expected; + case '<=': + return $actual <= $expected; + case 'between': + return is_array($expected) && $actual >= $expected[0] && $actual <= $expected[1]; + case 'in': + return is_array($expected) && in_array($actual, $expected); + default: + throw new \Exception("Unsupported operator: {$operator}"); + } + } + + private function applyCalculation(array $calculation, array $policyData) + { + $type = $calculation['type'] ?? null; + + switch ($type) { + case 'percentage': + $percentage = $calculation['value'] ?? 0; + $base = $calculation['on'] ?? null; + + if ($base === null || !isset($policyData[$base])) { + throw new \Exception("Base value for calculation not found: {$base}"); + } + + return ($percentage / 100) * $policyData[$base]; + + case 'composite': + $total = 0; + + foreach ($calculation['components'] as $component) { + $percentage = $component['percentage'] ?? 0; + $base = $component['on'] ?? null; + + if ($base === null || !isset($policyData[$base])) { + throw new \Exception("Base value for calculation not found: {$base}"); + } + + if (!empty($component['only_first_year'])) { + if (!empty($policyData['is_renewal'])) { + continue; // Skip this component for renewals + } + } + + $total += ($percentage / 100) * $policyData[$base]; + } + + return $total; + + case 'fixed': + $fixedAmount = $calculation['value'] ?? 0; + + // If 'on' specified but not needed, return fixed amount as-is + return $fixedAmount; + + default: + throw new \Exception('Unsupported calculation type: ' . $type); + } + } + + public function getVolumeReward(array $premiumData) + { + $annualPremium = $premiumData['annual_premium'] ?? 0; + $department = $premiumData['department'] ?? ''; + + if ($department === 'Fire' || $department === 'Marine' || $department === 'Engineering') { + if ($annualPremium > 20000000) { + return 0.01 * $annualPremium; + } elseif ($annualPremium > 10000000) { + return 0.005 * $annualPremium; + } elseif ($annualPremium > 5000000) { + return 0.0025 * $annualPremium; + } + } elseif ($department === 'Motor') { + if ($annualPremium > 15000000) { + return 0.02 * $annualPremium; + } elseif ($annualPremium > 7500000) { + return 0.01 * $annualPremium; + } + } + + return 0; + } +} diff --git a/app/Controllers/MasterController.php b/app/Controllers/MasterController.php index 76bd1a5a..d2ce1329 100755 --- a/app/Controllers/MasterController.php +++ b/app/Controllers/MasterController.php @@ -1976,6 +1976,9 @@ class MasterController extends AdminController 'lead_files' => WRITEPATH . 'uploads/lead_files/', 'claim_files' => WRITEPATH . 'uploads/claim_files/', 'claim_dump_excel' => WRITEPATH . 'uploads/claim_dump_excel/', + 'commission' => WRITEPATH . 'uploads/commission/', + 'files' => WRITEPATH . 'uploads/commission/files', + 'rules' => WRITEPATH . 'uploads/commission/rules', 'claim_sample_forms' => ROOTPATH . 'public/claim_sample_forms/', ]; diff --git a/app/Controllers/MediAssistApiController.php b/app/Controllers/MediAssistApiController.php index 4e13298c..621a187f 100644 --- a/app/Controllers/MediAssistApiController.php +++ b/app/Controllers/MediAssistApiController.php @@ -331,6 +331,7 @@ class MediAssistApiController extends BaseController $db = \Config\Database::connect(); $updated = 0; + $employee_policy_ids = []; foreach ($employeePolicyData as $policy_data) { foreach ($allBenef as $row) { @@ -370,6 +371,10 @@ class MediAssistApiController extends BaseController WHERE id = ?"; $db->query($sql, [$row['benefMediAssistID'], $policy_data['emp_policy_id']]); + // for e-card send + if(strtolower(trim($policy_data['relationship'])) == 'self'){ + $employee_policy_ids[] = $policy_data['emp_policy_id']; + } if ($db->affectedRows() > 0) { $updated++; @@ -384,6 +389,12 @@ class MediAssistApiController extends BaseController } } + // send e-card + if(!empty($employee_policy_ids)){ + log_message('error', "sendMailForDownloadingECard JOB PUSHED."); + Jobs::addJob(['job_name' => 'sendMailForDownloadingECard', 'payload' => $employee_policy_ids]); + } + // update file table status after the tpa id successfully updated if (isset($requestData['file_id']) && !empty($requestData['file_id'])) { $file_model = new BatchFileModel(); diff --git a/app/Controllers/NotificationController.php b/app/Controllers/NotificationController.php index ee50a0fd..98067fa9 100755 --- a/app/Controllers/NotificationController.php +++ b/app/Controllers/NotificationController.php @@ -258,7 +258,7 @@ class NotificationController extends AdminController $template_id = $this->request->getPost('template_id'); - $test_mail = $this->request->getPost('test_mail'); + // $test_mail = $this->request->getPost('test_mail'); $test_mail_list = $this->request->getPost('test_mail_list'); @@ -268,27 +268,67 @@ class NotificationController extends AdminController if(!empty($notification_data)){ - $params = [ - 'client_data' => $client_data, - 'notification_data' => $notification_data, - 'test_mail' => $test_mail, - 'test_mail_list' => $test_mail_list - ]; + // First Index as test mail all are testmaillist + // $params = [ + // 'client_data' => $client_data, + // 'notification_data' => $notification_data, + // 'test_mail' => $test_mail, + // 'test_mail_list' => $test_mail_list + // ]; + // $testMailData = sendMailNotification::sendMailNotificationForTesting($notification_data['template_name'], $params); + // if (!empty($testMailData)) { + // $mail_send_return1 = MailHelper::send_email($testMailData); + // $this->myLogger->logme("info", $mail_send_return1); + // $this->myLogger->logme("info", $mail_send_return1); + // return $this->respond(['status' => true,'code' => 200, 'respond' => json_decode($mail_send_return1)]); + // }else{ + // return $this->respond(['status' => false,'code' => 200, 'message' => 'Test Mail Data Does Not Exist']); + // } - $testMailData = sendMailNotification::sendMailNotificationForTesting($notification_data['template_name'], $params); - // print_r($testMailData); die; - if (!empty($testMailData)) { - $mail_send_return1 = MailHelper::send_email($testMailData); - $this->myLogger->logme("info", $mail_send_return1); - $this->myLogger->logme("info", $mail_send_return1); + $mailArray = explode(',', $test_mail_list); + $successMails = []; + $failedMails = []; - return $this->respond(['status' => true,'code' => 200, 'respond' => json_decode($mail_send_return1)]); + foreach ($mailArray as $singleMail) { + $singleMail = trim($singleMail); - }else{ + $params = [ + 'client_data' => $client_data, + 'notification_data' => $notification_data, + 'test_mail' => $singleMail, + 'test_mail_list' => "" // optional + ]; + + $testMailData = sendMailNotification::sendMailNotificationForTesting($notification_data['template_name'], $params); + + if (!empty($testMailData)) { + $mail_send_return1 = MailHelper::send_email($testMailData); + + if ($mail_send_return1) { + $successMails[] = $singleMail; + } else { + $failedMails[] = $singleMail; + } + + $this->myLogger->logme("info", "Mail attempt to {$singleMail}: " . $mail_send_return1); + } else { + $failedMails[] = $singleMail; + $this->myLogger->logme("info", "Test Mail Data Does Not Exist for {$singleMail}"); + } + } + + // Prepare final response + if (!empty($successMails)) { + $responseMessage = "Count " . count($successMails) . " mail(s) sent successfully: \n" . implode("\n", $successMails); + if (!empty($failedMails)) { + $responseMessage .= "\nCount " . count($failedMails) . " mail(s) failed: \n" . implode("\n", $failedMails); + } + return $this->respond(['status' => true,'code' => 200,'message' => $responseMessage]); + } else { + return $this->respond(['status' => false,'code' => 200,'message' => 'All mails failed to send: ' . implode(", ", $failedMails)]); + } - return $this->respond(['status' => false,'code' => 200, 'message' => 'Test Mail Data Does Not Exist']); - } }else{ return $this->respond(['status' => false,'code' => 200, 'message' => 'Notification Template not enabled']); diff --git a/app/Controllers/PayoutController.php b/app/Controllers/PayoutController.php new file mode 100644 index 00000000..7dccb5ba --- /dev/null +++ b/app/Controllers/PayoutController.php @@ -0,0 +1,616 @@ +myLogger = \Config\Services::mylogger(); + + $this->payout_status = [ + 1 => "Pending", + 2 => "Completed", + ]; + + $this->invoiceItemModel = new InvoiceItemModel(); + $this->invoiceModel = new InvoiceModel(); + $this->invoiceUtrModel = new InvoiceUtrModel(); + $this->policyTransactionModel = new PolicyTransactionModel(); + $this->auditHistory = new AuditHistoryModel(); + } + + public function payoutList() + { + // for filtering list + if($this->request->is('post')){ + try{ + $data = $this->request->getPost(); + // print_r($data); die; + + $agent_id = $data['agent_id'] ?? null; + $status_id = $data['status_id'] ?? null; + $start_date = $data['start_date'] ?? null; + $end_date = $data['end_date'] ?? null; + + $payout_data = $this->invoiceModel->invoiceList($agent_id, $status_id, $start_date, $end_date); + + $payout_data['payout_list_data'] = $payout_data; + $payout_data = view('payout_list', $payout_data); + + if(!empty($payout_data)){ + return $this->respond(['status' => true, 'code' => 200, 'data' => $payout_data], 200); + }else{ + return $this->respond(['status' => false, 'code' => 400, 'data' => $payout_data, "message" => "No data found"], 200); + } + }catch (\Throwable $th) { + + $this->myLogger->logme("error", "PayoutController - payoutList: Exception: " . $th->getMessage() . " --- Line: " . $th->getLine() . " --- Trace: " . $th->getTraceAsString()); + $errorData = [ + 'message' => $th->getMessage(), + 'file' => $th->getFile(), + 'line' => $th->getLine(), + 'code' => $th->getCode(), + 'trace' => $th->getTraceAsString(), + 'trace_array' => $th->getTrace(), // full array version (optional) + 'function' => $th->getTrace()[0]['function'] ?? null, + 'class' => $th->getTrace()[0]['class'] ?? null, + ]; + $payout_data = view('payout_list'); + return $this->respond(['status' => false, 'code' => 500, 'data' => $payout_data, "message" => "No data found", 'error_data' => $errorData], 500); + } + } + + // for list + $data['payout_status'] = $this->payout_status; + $data['agent_list'] = $this->invoiceModel->agentList(); + $data['page_name'] = "Invoices"; + $payout_data['payout_list_data'] = $this->invoiceModel->invoiceList(); + $data['payout_list'] = view('payout_list', $payout_data); + + // dd($data); + return $this->loadLayout('payout_list_handler', $data); + } + + public function fetchUtrDetails() + { + $invoice_id = $this->request->getPost('invoice_id') ?? null; + $payout_data = $this->constructUtrDetails($invoice_id); + + if(!empty($payout_data)){ + return $this->respond(['status' => true, 'code' => 200, 'data' => $payout_data], 200); + }else{ + return $this->respond(['status' => false, 'code' => 400, 'data' => $payout_data, "message" => "No data found"], 200); + } + } + + public function constructUtrDetails($invoice_id) + { + $utr_data = $this->invoiceUtrModel->where('is_active', 1)->where('invoice_id', $invoice_id)->findAll(); + $summary_data = $this->invoiceModel->utrSummary($invoice_id); + + if($summary_data['invoice_amount'] == $summary_data['total_utr_amount']) { + $data['invoice_completed'] = true; + } + + $data['utr_list_data'] = $utr_data; + $data['summary'] = $summary_data; + $data = view('payout_utr_details', $data); + + return $data; + } + + public function saveUtrDetails() + { + $data = $this->request->getPost(); + $invoice_id = $this->request->getPost('invoice_id') ?? null; + $utr_id = $this->request->getPost('utr_pk') ?? null; + + if(isset($data['utr_date'])){ + $data['utr_date'] = change_date_format($data['utr_date']); + } + + + if(!empty($utr_id)){ + + $update = $this->invoiceUtrModel->where('id', $utr_id)->set($data)->update(); + $payout_edit_data = $this->constructUtrDetails($invoice_id); + + if($update){ + + $summary_data = $this->invoiceModel->utrSummary($invoice_id); + if($summary_data['invoice_amount'] == $summary_data['total_utr_amount']){ + $sql = "UPDATE partner_invoice SET payout_status = 2 WHERE id = ?"; + db_connect()->query($sql, [$invoice_id]); + } + + return $this->respond(['status' => true, 'code' => 200, 'data' => $payout_edit_data, "message" => "UTR successfully updated"], 200); + }else{ + return $this->respond(['status' => false, 'code' => 400, 'data' => $payout_edit_data, "message" => "Failed to update UTR"], 200); + } + + }else{ + + unset($data['utr_pk']); + $insert_id = $this->invoiceUtrModel->insert($data); + $payout_data = $this->constructUtrDetails($invoice_id); + + if($insert_id){ + + $summary_data = $this->invoiceModel->utrSummary($invoice_id); + if($summary_data['invoice_amount'] == $summary_data['total_utr_amount']){ + $sql = "UPDATE partner_invoice SET payout_status = 2 WHERE id = ?"; + db_connect()->query($sql, [$invoice_id]); + } + + return $this->respond(['status' => true, 'code' => 200, 'data' => $payout_data, "message" => "UTR added successfully"], 200); + }else{ + return $this->respond(['status' => false, 'code' => 400, 'data' => $payout_data, "message" => "Failed to add UTR"], 200); + } + } + } + + public function removeUtrDetails() + { + $data = $this->request->getPost(); + + if(isset($data['utr_id'])){ + + $sql = "UPDATE partner_invoice_utr SET is_active = 0 WHERE id = ?"; + $update = db_connect()->query($sql, [$data['utr_id']]); + + $payout_data = $this->constructUtrDetails($data['invoice_id'] ?? ""); + + if($update){ + return $this->respond(['status' => true, 'code' => 200, 'data' => $payout_data, "message" => "UTR removed successfully"], 200); + }else{ + return $this->respond(['status' => false, 'code' => 400, 'data' => $payout_data, "message" => "Failed to remove UTR"], 200); + } + }else { + return $this->respond(['status' => false, 'code' => 500, 'data' => "", "message" => "Failed to remove UTR"], 200); + } + } + + + /*************************************************************************************************************/ + //... Payout-invoice Mapping Commission's amount and Adjustment's Amount - Data Display + public function invoices() + { + + $type = $this->request->getGet('type'); + + $title = $type === 'add' ? 'Add Payouts' + : ($type === 'edit' ? 'Edit Payouts' + : ($type === 'adjustment' ? 'Payouts Adjustment' + : 'Payouts')); + + $data['tab_name'] = $title; + $data['page_name'] = $title; + + $id = $this->request->getGet('id'); + + if($type == 'add') + { + $data['agents'] = $this->invoiceModel->agentList(['is_active' => 1]); // common both add and edit + } + else + { + $data['agents'] = $this->invoiceModel->agentList(); // common both add and edit + } + // $data['checked_policy_numbers'] = []; + // $data['invoice'] = []; + // $data['extra_payouts'] = []; + + //... Now Seperated add => 'policy_transaction_payouts1' + //... Now Seperated edit and adjustment => 'policy_transaction_payouts' old file + //... Reason : Due Datatable issues Export button Searching like that so seperated + if ($type === 'add') { + // $invoiceNo = $this->generateInvoiceNumber(); + $data['payouts'] = $this->invoiceModel->payoutList(1); + // print_rr($data['payouts']);die(); + // print_rr($this->invoiceModel->getLastQuery());die(); + // $data['invoice_number'] = $invoiceNo; + return $this->loadLayout('invoice_policy_mapping_add', $data); + } + + if (($type === 'edit' || $type === 'adjustment') && !empty($id)) { + + $invoice = $this->invoiceModel->where('id', $id)->first(); + $data['freeze_edit'] = $this->auditHistory->where('table_name', 'partner_invoice')->where('pk', $id)->countAllResults(); + + + $agentId = $invoice['agent_id'] ?? null; + + $data['payouts'] = $this->invoiceModel->payoutList(2 ,$agentId,$id); + $data['extra_payouts'] = $agentId ? $this->invoiceModel->payoutList(3, $agentId) : []; + + $invoice_items = $this->invoiceItemModel->where('invoice_id', $id)->findAll(); + + if (!$invoice) { return redirect()->to('payout/invoices')->with('error', 'Invoice not found'); } + + $data['invoice'] = $invoice; + $data['invoice_items'] = $invoice_items; + // Initialize array for policy numbers + $data['checked_policy_numbers'] = array_column(array_filter($invoice_items, fn($ii) => isset($ii['is_active']) && $ii['is_active'] == 1),'policy_no'); + + $data['invoice_number']= $invoice['invoice_no']; + $data['type'] = $type; + $data['payout_status'] = $invoice['payout_status'] ; + // dd($data); + return $this->loadLayout('invoice_policy_mapping', $data); + + } + + + } + + //... Payout-invoice Mapping - Save/update/soft Delete/Hard Delete Data + public function saveInvoice() + { + $json = $this->request->getJSON(true); + // print_rr($json);die(); + + if (!$json) { + return $this->response->setJSON(['error' => 'Invalid JSON','message' => 'Invalid JSON received.'])->setStatusCode(400); + } + + $id = $json['invoice_id'] ?? null; + try { + + //... ADD Part + if (empty($id)) { + $exists = $this->invoiceModel + ->where('invoice_no', $json['invoice_no']) + ->first(); + + if ($exists) { + $InvNum = $this->generateInvoiceNumber($json['agent_id']); + } else { + $InvNum = $json['invoice_no']; + } + + $invoiceData = [ + 'invoice_no' => $InvNum, + 'agent_id' => $json['agent_id'], + 'invoice_date' => $json['invoice_date'], + 'invoice_amount' => $json['invoice_amount'], + 'payout_status' => 1 + ]; + + $invoiceId = $this->invoiceModel->insert($invoiceData); + + foreach ($json['policies'] as $p) { + $this->invoiceItemModel->insert([ + 'invoice_id' => $invoiceId, + 'policy_id' => $p['partner_policy_id'], + 'policy_no' => $p['policy_no'], + 'commission_amount' => $p['commission_amount'], + 'is_active' => 1 + ]); + } + + $message = "Invoice created successfully.\nInvoice No: " . $json['invoice_no']; + + } + + // ... EDIT part + if (!empty($id)) { + + $invoiceId = $id; + + $invoiceData = [ + 'invoice_no' => $json['invoice_no'], + 'agent_id' => $json['agent_id'], + 'invoice_date' => $json['invoice_date'], + 'invoice_amount' => $json['invoice_amount'], + ]; + + $this->invoiceModel->update($invoiceId, $invoiceData); + + //... Fetch existing invoice item rows + $existingItems = $this->invoiceItemModel + ->where('invoice_id', $invoiceId) + ->findAll(); + + //... Create map by policy_no + $existingMap = []; + foreach ($existingItems as $item) { + $existingMap[$item['policy_no']] = $item; + } + + $newPolicyNos = []; + + //... Loop new JSON policies + foreach ($json['policies'] as $p) { + + $newPolicyNos[] = $p['policy_no']; + + if (isset($existingMap[$p['policy_no']])) { + + //... Update existing item + $this->invoiceItemModel + ->where('id', $existingMap[$p['policy_no']]['id']) + ->set([ + 'commission_amount' => $p['commission_amount'], + 'is_active' => 1 + ]) + ->update(); + + } else { + + //... Insert new item + $this->invoiceItemModel->insert([ + 'invoice_id' => $invoiceId, + 'policy_id' => $p['policy_id'], + 'policy_no' => $p['policy_no'], + 'commission_amount' => $p['commission_amount'], + 'is_active' => 1, + ]); + } + } + + //... Delete items removed in JSON (hard delete) + foreach ($existingItems as $old) { + if (!in_array($old['policy_no'], $newPolicyNos)) { + $this->invoiceItemModel + ->where('id', $old['id']) + ->delete(); + } + } + //... Delete items removed in JSON (soft delete REF : SVM ) + // foreach ($existingItems as $old) { + // if (!in_array($old['policy_no'], $newPolicyNos)) { + // $this->invoiceItemModel + // ->where('id', $old['id']) + // ->set(['is_active' => 0]) + // ->update(); + // } + // } + + $message = "Invoice updated successfully."; + + } + + return $this->response->setJSON([ + 'status' => 'success', + 'message' => $message, + 'invoice_id' => $invoiceId + ]); + + } catch (\Exception $e) { + + return $this->response->setJSON([ + 'status' => 'error', + 'message' => 'Unexpected error occurred: ' . $e->getMessage() + ]); + } + } + + + + //... Payout-invoice Mapping - Invoice number is auto-generated only for the Add mode. + // Note New Pattern : INV/AG001/20251101/xx (REF:SVM) + public function generateInvoiceNumberAjax($agentId) + { + if (!$agentId) { + return $this->response->setJSON([ + 'status' => 'error', + 'message' => 'Agent ID missing' + ]); + } + + $invoiceNo = $this->generateInvoiceNumber($agentId); + + return $this->response->setJSON([ + 'status' => 'success', + 'invoice_no' => $invoiceNo + ]); + } + + //... Payout-invoice Mapping - Invoice number is auto-generated only for the Add mode. + // Note New Pattern : INV/AG001/20251101/xx (REF:SVM) + private function generateInvoiceNumber($agentId) + { + $agent = $this->invoiceModel->agentListById($agentId); + $agentCode = $agent["agent_code"]; + + $today = date("Ymd"); + $likePattern = "INV/$agentCode/$today/%"; + + $count = $this->invoiceModel + ->like("invoice_no", $likePattern) + ->countAllResults(); + + $nextNumber = $count + 1; + + return "INV/$agentCode/$today/$nextNumber"; + } + + // private function generateInvoiceNumber() + // { + // $year = date('Y'); + // $month = date('m'); + + // do { + // // random 3-digit number + // $random = str_pad(rand(1, 999), 3, '0', STR_PAD_LEFT); + // $invoiceNo = "INV{$year}{$month}{$random}"; + + // // check main invoice table + // $existsMain = $this->invoiceModel + // ->where('invoice_no', $invoiceNo) + // ->first(); + + // // check partner invoice table + // $existsPartner = $this->invoiceModel + // ->where('invoice_no', $invoiceNo) + // ->first(); + + // } while ($existsMain || $existsPartner); // regenerate if duplicate found + + // return $invoiceNo; + // } + + //... Payout-invoice Mapping Audit History Based on "Adjustment" value (REF: KV,SVM) + public function auditHistory() + { + + + $iid = $this->request->getGet('id'); + + $details['invoice'] = $this->auditHistory + ->select('auditing_history.*,partner_invoice.invoice_no, user_profiles.first_name as created_name') + ->join('user_profiles', 'user_profiles.id = auditing_history.created_by', 'left') + ->join('partner_invoice', 'partner_invoice.id = auditing_history.pk', 'left') + ->where('auditing_history.table_name', 'partner_invoice') // ok + ->where('auditing_history.pk', $iid) + ->orderBy('auditing_history.created_at', 'desc') + ->get() + ->getResultArray(); + + $details['invoice_child'] = $this->auditHistory + ->select('auditing_history.*,partner_invoice.invoice_no, user_profiles.first_name as created_name,partner_invoice_items.policy_no') + ->join('user_profiles', 'user_profiles.id = auditing_history.created_by', 'left') + ->join('partner_invoice_items', 'partner_invoice_items.id = auditing_history.pk', 'left') + ->join('partner_invoice', 'partner_invoice.id = partner_invoice_items.invoice_id', 'left') + ->where('auditing_history.table_name', 'partner_invoice_items') // FIXED + ->where('partner_invoice.id', $iid) + ->orderBy('auditing_history.created_at', 'desc') + ->get() + ->getResultArray(); + + return $this->response->setJSON([ + 'status' => 'success', + 'data' => $details + ]); + + } + + // **************************************************************************************************************************************************************** + + public function preview($invoiceId = null) + { + $invoiceId = $this->request->getGet('invoice_id'); + + // Get invoice data from database + $invoiceData = $this->getInvoiceData($invoiceId); + + if (empty($invoiceData)) { + return $this->respond([ + 'status' => false, + 'code' => 404, + 'data' => '', + 'message' => 'Invoice not found' + ], 200); + } + + // Load view with data + $html = view('invoice_template_2', $invoiceData); + // echo $html; die; + + return $this->respond([ + 'status' => true, + 'code' => 200, + 'data' => $html + ], 200); + } + + public function downloadPdf($invoiceId = null, $type = 0) + { + // Get invoice data from database + $invoiceData = $this->getInvoiceData($invoiceId); + + if (empty($invoiceData)) { + return redirect()->back()->with('error', 'Invoice not found'); + } + + // Generate HTML + $html = view('invoice_template_2', $invoiceData); + + // Configure Dompdf + $options = new Options(); + $options->set('isHtml5ParserEnabled', true); + $options->set('isPhpEnabled', true); + $options->set('isRemoteEnabled', true); + $options->set('defaultFont', 'Arial'); + $options->set('chroot', FCPATH); + + // Initialize Dompdf + $dompdf = new Dompdf($options); + + // Load HTML + $dompdf->loadHtml($html); + + // Set paper size and orientation + $dompdf->setPaper('A4', 'portrait'); + + // Render PDF + $dompdf->render(); + + // Generate filename + $filename = 'Invoice_' . $invoiceData['invoice_no'] . '_' . date('Ymd') . '.pdf'; + + if($type == 0){ + // Download PDF + return $this->response + ->setHeader('Content-Type', 'application/pdf') + ->setHeader('Content-Disposition', 'attachment; filename="' . $filename . '"') + ->setBody($dompdf->output()); + }else{ + // View PDF + return $this->response + ->setHeader('Content-Type', 'application/pdf') + ->setHeader('Content-Disposition', 'inline; filename="' . $filename . '"') + ->setBody($dompdf->output()); + } + + + } + + private function getInvoiceData($invoiceId) + { + $invoice_data = $this->invoiceModel + ->select(' + + partner_invoice.*, + + pa.name as agent_name, + pa.email as agent_email, + pa.mobile as agent_mobile, + pa.address as agent_address, + pa.agent_code, + pa.certificate_file_name, + pa.commission_retain + ') + ->join('partner_agent pa', 'partner_invoice.agent_id = pa.id') + ->where('partner_invoice.is_active', 1) + ->where('partner_invoice.id', $invoiceId) + ->first(); + + return $invoice_data; + } + +} diff --git a/app/Controllers/PolicyTransactionController.php b/app/Controllers/PolicyTransactionController.php index a2f88d5f..e970d9b5 100644 --- a/app/Controllers/PolicyTransactionController.php +++ b/app/Controllers/PolicyTransactionController.php @@ -496,12 +496,18 @@ $cop_amt = $data['co_premium'][$index] ?? 0; } + if(isset($data['calc_policy_issue_date'][$index])){ + $data['calc_policy_issue_date'][$index] = change_date_format($data['calc_policy_issue_date'][$index]); + } + + $co_share_type_value = $data['co_share'] == 1 ? $data['co_share_type'][$index] ?? 1 : 1; + // Prepare each co-share detail entry $coShareDetails[] = [ 'pt_id' => $pt_id, 'insurer_id' => $insurer_id ?? 0, 'insurer_branch_id' => $insurer_branch_id ?? 0, - 'co_share_type' => $data['co_share_type'][$index] ?? 1, + 'co_share_type' => $co_share_type_value, 'co_share_per' => $data['co_share_per'][$index] ?? 0, 'bp_amt' => $data['base_premium'][$index] ?? 0, 'bp_gst_amt' => $data['gst_amount'][$index] ?? 0, @@ -539,6 +545,7 @@ 'id' => $data['co_share_id'][$index] ?? null, // Assuming this is the ID to identify existing records 'follower_policy_no' => $data['follower_policy_no'][$index] ?? null, 'non_comm_per_amt' => $data['non_comm_per_amt'][$index] ?? null, + 'pt_policy_issue_date' => $data['calc_policy_issue_date'][$index] ?? null, ]; } @@ -1001,7 +1008,9 @@ co_share_id = pt_co_share_details.id AND is_active = 1 - ) AS actual_tep_brokerage_amount + ) AS actual_tep_brokerage_amount, + + DATE_FORMAT(pt_policy_issue_date, '%d/%m/%Y') AS pt_policy_issue_date ") ->where('pt_id', $id) @@ -1590,7 +1599,9 @@ co_share_id = pt_co_share_details.id AND is_active = 1 - ) AS actual_tep_brokerage_amount + ) AS actual_tep_brokerage_amount, + + DATE_FORMAT(pt_policy_issue_date, '%d/%m/%Y') AS pt_policy_issue_date ") ->where('pt_id', $id) @@ -3197,116 +3208,116 @@ } - public function reportBDSNew() - { - // 🧭 Basic Page Info - $data['tab_name'] = 'BDS Report'; - $data['page_name'] = 'BDS Report'; + public function reportBDSNew() + { + // 🧭 Basic Page Info + $data['tab_name'] = 'BDS Report'; + $data['page_name'] = 'BDS Report'; - // 📋 Dropdown Data - $data['issuer'] = [1 => 'JIBS', 2 => 'Nhance']; - $data['client_type'] = [1 => 'Group', 2 => 'Individual']; - $data['issuing_type'] = [1 => 'Fresh', 2 => 'Renewal', 3 => 'Roll Over']; - $data['policy_status'] = [ - 'pending' => 'Pending', - 'exported_to_insurer' => 'Exported to Insurer', - 'imported_from_insurer'=> 'Imported from Insurer', - 'exported_to_tpa' => 'Exported to TPA', - 'imported_from_tpa' => 'Imported from TPA', - 'completed' => 'Completed' - ]; - $data['invoice_status_array'] = [ - 'yet_to_generate' => 'Yet to Generate', - 'generated' => 'Generated', - 'send' => 'Send', - 'recived' => 'Recived', - ]; - $data['date_type'] = [ - 'policy_issue_date' => 'Policy Issue Date', - 'policy_start_date' => 'Policy Start Date', - 'policy_end_date' => 'Policy End Date', - 'data_received_date' => 'Data Received Date', - 'closure_date' => 'Closure Date', - 'statement_month' => 'Statement Month', - ]; + // 📋 Dropdown Data + $data['issuer'] = [1 => 'JIBS', 2 => 'Nhance']; + $data['client_type'] = [1 => 'Group', 2 => 'Individual']; + $data['issuing_type'] = [1 => 'Fresh', 2 => 'Renewal', 3 => 'Roll Over']; + $data['policy_status'] = [ + 'pending' => 'Pending', + 'exported_to_insurer' => 'Exported to Insurer', + 'imported_from_insurer'=> 'Imported from Insurer', + 'exported_to_tpa' => 'Exported to TPA', + 'imported_from_tpa' => 'Imported from TPA', + 'completed' => 'Completed' + ]; + $data['invoice_status_array'] = [ + 'yet_to_generate' => 'Yet to Generate', + 'generated' => 'Generated', + 'send' => 'Send', + 'recived' => 'Recived', + ]; + $data['date_type'] = [ + 'policy_issue_date' => 'Policy Issue Date', + 'policy_start_date' => 'Policy Start Date', + 'policy_end_date' => 'Policy End Date', + 'data_received_date' => 'Data Received Date', + 'closure_date' => 'Closure Date', + 'statement_month' => 'Statement Month', + ]; - // 🏢 Fetch Active Data - $data['insurer'] = $this->insurerModel->where('is_active', 1)->findAll(); - $data['policy_types'] = $this->policyTypeModel->where('is_active', 1)->findAll(); - $data['clients'] = $this->clientModel->where('is_active', 1)->findAll(); - $data['users'] = $this->userModel->where('is_active', 1)->findAll(); - $data['policy_count'] = $this->policyTransactionModel->where('is_active', 1)->countAllResults(); + // 🏢 Fetch Active Data + $data['insurer'] = $this->insurerModel->where('is_active', 1)->findAll(); + $data['policy_types'] = $this->policyTypeModel->where('is_active', 1)->findAll(); + $data['clients'] = $this->clientModel->where('is_active', 1)->findAll(); + $data['users'] = $this->userModel->where('is_active', 1)->findAll(); + $data['policy_count'] = $this->policyTransactionModel->where('is_active', 1)->countAllResults(); - // 🕐 Filters - $start_date = $this->request->getGet('start_date'); - $end_date = $this->request->getGet('end_date'); - $client_id = $this->request->getGet('client_id'); - $insurer_id = $this->request->getGet('insurer_id'); - $policy_type_id = $this->request->getGet('policy_type_id'); - $date_type = $this->request->getGet('date_type'); - $issuer = $this->request->getGet('issuer'); - $client_branch_id = $this->request->getGet('client_branch_id'); - $insurer_branch_id = $this->request->getGet('insurer_branch_id'); - $client_policy_id = $this->request->getGet('client_policy_id'); - $user_id = $this->request->getGet('user_id'); + // 🕐 Filters + $start_date = $this->request->getGet('start_date'); + $end_date = $this->request->getGet('end_date'); + $client_id = $this->request->getGet('client_id'); + $insurer_id = $this->request->getGet('insurer_id'); + $policy_type_id = $this->request->getGet('policy_type_id'); + $date_type = $this->request->getGet('date_type'); + $issuer = $this->request->getGet('issuer'); + $client_branch_id = $this->request->getGet('client_branch_id'); + $insurer_branch_id = $this->request->getGet('insurer_branch_id'); + $client_policy_id = $this->request->getGet('client_policy_id'); + $user_id = $this->request->getGet('user_id'); - // Handle statement month range - if ($date_type == 'statement_month') { - $start_date = (string) date('Y-m-01', strtotime($start_date)); - $end_date = (string) date('Y-m-31', strtotime($end_date)); - } + // Handle statement month range + if ($date_type == 'statement_month') { + $start_date = (string) date('Y-m-01', strtotime($start_date)); + $end_date = (string) date('Y-m-31', strtotime($end_date)); + } - // Ensure default values - $start_date = $start_date ?: 0; - $end_date = $end_date ?: 0; - $client_id = $client_id ?: 0; - $insurer_id = $insurer_id ?: 0; - $policy_type_id = $policy_type_id ?: 0; - $date_type = $date_type ?: 0; - $issuer = $issuer ?: 0; - $client_branch_id = $client_branch_id ?: 0; - $insurer_branch_id = $insurer_branch_id ?: 0; - $client_policy_id = $client_policy_id ?: 0; - $user_id = $user_id ?: 0; + // Ensure default values + $start_date = $start_date ?: 0; + $end_date = $end_date ?: 0; + $client_id = $client_id ?: 0; + $insurer_id = $insurer_id ?: 0; + $policy_type_id = $policy_type_id ?: 0; + $date_type = $date_type ?: 0; + $issuer = $issuer ?: 0; + $client_branch_id = $client_branch_id ?: 0; + $insurer_branch_id = $insurer_branch_id ?: 0; + $client_policy_id = $client_policy_id ?: 0; + $user_id = $user_id ?: 0; - // 🧾 Handle POST requests (Dashboard filters) - if ($this->request->is('post')) { - $isFromDashboard = $this->request->getPost('is_dashboard'); + // 🧾 Handle POST requests (Dashboard filters) + if ($this->request->is('post')) { + $isFromDashboard = $this->request->getPost('is_dashboard'); - if (!empty($isFromDashboard) && $isFromDashboard == 1) { - $ids = array_filter(explode(',', $this->request->getPost('ids'))); + if (!empty($isFromDashboard) && $isFromDashboard == 1) { + $ids = array_filter(explode(',', $this->request->getPost('ids'))); - if (!empty($ids)) { - $idsStr = implode(',', array_map('intval', $ids)); // sanitize IDs - $where = "policy_transaction.id IN ($idsStr)"; - } else { - $where = []; // No valid IDs + if (!empty($ids)) { + $idsStr = implode(',', array_map('intval', $ids)); // sanitize IDs + $where = "policy_transaction.id IN ($idsStr)"; + } else { + $where = []; // No valid IDs + } } } + + // 📊 Fetch report data + $data['report_list'] = $this->policyTransactionModel->reportBDSNew( + $start_date, + $end_date, + $client_id, + $insurer_id, + $policy_type_id, + $date_type, + $issuer, + $client_branch_id, + $insurer_branch_id, + $client_policy_id, + $user_id, + $where ?? '' + ); + + $data['list_new'] = true; + + // 🧩 Load View + $this->loadLayout('report_bds_filter', $data); } - // 📊 Fetch report data - $data['report_list'] = $this->policyTransactionModel->reportBDSNew( - $start_date, - $end_date, - $client_id, - $insurer_id, - $policy_type_id, - $date_type, - $issuer, - $client_branch_id, - $insurer_branch_id, - $client_policy_id, - $user_id, - $where ?? '' - ); - - $data['list_new'] = true; - - // 🧩 Load View - $this->loadLayout('report_bds_filter', $data); - } - } diff --git a/app/Controllers/RuleImportController.php b/app/Controllers/RuleImportController.php new file mode 100644 index 00000000..d1647bae --- /dev/null +++ b/app/Controllers/RuleImportController.php @@ -0,0 +1,844 @@ +myLogger = \Config\Services::mylogger(); + $this->ruleImportService = \Config\Services::ruleImportService(); + $this->partnerPolicyModel = new partnerPolicyModel(); + $this->commissionFilesModel = new CommissionFilesModel(); + $this->insurerModel = new InsurerModel(); + $this->departments = [ + 'motor' => 'Motor', + 'health' => 'Health', + ]; + + $this->departmentFields = [ + 'motor' => [ + 'department', + 'vehicle_type', + 'vehicle_sub_type', + 'policy_type', + 'vehicle_age', + 'is_new_vehicle', + 'cubic_capacity', + 'policy_business_type', + 'fuel_type', + 'produt', + 'geo_rto_state', + 'geo_rto_city', + 'model', + 'make', + 'weight', + 'renewal_type', + 'renewal_sub_type', + 'premium', + 'od_premium', + 'tp_premium', + 'product' + ], + ]; + + } + + public function commissionFileUploadList() + { + $data['page_name'] = "Commision File Upload"; + $data['departments'] = $this->departments; + $data['insurers'] = $this->insurerModel->where('is_active', 1)->findAll(); + $data['commission_file_list'] = $this->commissionFilesModel + ->select('commission_files.*, insurers.short_name as insurer_name, user_profiles.first_name as created_user_name') + ->join('insurers', 'commission_files.insurer_id = insurers.id') + ->join('user_profiles', 'commission_files.created_by = user_profiles.id') + ->where('commission_files.is_active', 1) + ->orderBy('commission_files.id', 'desc') + ->findAll(); + // dd( $data); + return $this->loadLayout('commission_file_upload', $data); + } + + /** + * Upload endpoint for form (POST) + * Input form field: 'rules_file' + */ + public function uploadORI() + { + // echo 'hi'; + !dd($result = $this->ruleImportService->processUpload(['id' => 1,'file_name' => 'sample_commission.csv','insurer_id' => 5, 'department' => 'motor' ,'commission_month' => '2025-11-10']));die; + try { + $file = $this->request->getFile('rules_file'); + if (!$file || !$file->isValid()) { + return $this->response->setJSON(['status'=>false,'message'=>'No file uploaded or upload error']); + } + + // Move uploaded file to writable temp location + $tmpPath = WRITEPATH . 'uploads/' . $file->getRandomName(); + $file->move(WRITEPATH . 'uploads', $file->getName()); // keep original name inside uploads + $uploadedFullPath = $file->getTempName(); // Note: CI may store in tmp; we will use moved file path instead + $movedPath = WRITEPATH . 'uploads/' . $file->getName(); + + // Process file + $result = $this->ruleImportService->processUpload($movedPath, $file->getName()); + + // Return JSON with annotated file link if present + if (isset($result['annotated_file']) && $result['annotated_file']) { + $annotUrl = base_url('writable/uploads/annotated/' . basename($result['annotated_file'])); + $result['annotated_url'] = $annotUrl; + } + + return $this->response->setJSON($result); + + } catch (\Throwable $e) { + $this->myLogger->logme('error', 'RuleImportController::upload ' . $e->getMessage()); + return $this->response->setJSON(['status'=>false,'message'=>$e->getMessage()]); + } + } + + public function upload() + { + try { + + // --------------------------------------------------------- + // 1. Get uploaded file + // --------------------------------------------------------- + $file = $this->request->getFile('rules_file'); + if (!$file || !$file->isValid()) { + $this->myLogger->logme('error', 'RuleImportController::upload - No file or invalid upload.'); + return $this->respond(['status' => false, 'code' => 404, 'message' => 'No file uploaded or upload error.'], 200); + } + + // --------------------------------------------------------- + // 2. Read POST fields + // --------------------------------------------------------- + // print_r($this->request->getPost()); die; + $insurerId = $this->request->getPost('insurer_id'); + $department = $this->request->getPost('department'); + $commissionMonth = $this->request->getPost('commission_month'); + $overwrite = $this->request->getPost('overwrite') ?? 1; + $createdBy = get_session_userid(); + + if (empty($insurerId) || empty($department) || empty($commissionMonth)) { + $this->myLogger->logme('error', 'RuleImportController::upload - Missing required POST data.' . json_encode($this->request->getPost() ?? [])); + return $this->respond(['status' => false, 'code' => 404, 'message' => 'Missing required fields: insurer_id, department, commission_month'], 200); + } + + $commissionMonth = $commissionMonth . '-01'; + $commissionMonth = change_date_format($commissionMonth, 'Y-M-d', 'Y-m-d'); + + // Optional / default fields + $postedFileName = $this->request->getPost('file_name') ?: $file->getClientName(); + $fileStatus = $this->request->getPost('file_status') ?: 'pending'; + $isActive = $this->request->getPost('is_active') !== null ? (int)$this->request->getPost('is_active') : 1; + // rules_count is given by user but we will override it after processing on success + $postedRulesCount = $this->request->getPost('rules_count') !== null + ? (int)$this->request->getPost('rules_count') + : 0; + + // --------------------------------------------------------- + // 3. Move file to WRITEPATH/uploads/commission/files using user filename + // (no random name as per your requirement) + // --------------------------------------------------------- + $uploadDir = WRITEPATH . 'uploads/commission/files/'; + if (!is_dir($uploadDir)) { + if (!mkdir($uploadDir, 0755, true) && !is_dir($uploadDir)) { + throw new \RuntimeException("Failed to create upload directory: {$uploadDir}"); + } + } + + // sanitize user file name but keep it deterministic (no random, no timestamp) + $safeName = preg_replace('/[^a-zA-Z0-9_\-\.]/', '_', $postedFileName); + + // $movedFullPath = $uploadDir . $safeName; + + $file->move($uploadDir, $safeName); + $targetFileName = $file->getName(); + $movedFullPath = $uploadDir . $targetFileName; + if (!file_exists($movedFullPath)) { + $this->myLogger->logme('error', "RuleImportController::upload - Failed to move uploaded file to {$movedFullPath}"); + return $this->respond(['status' => false, 'code' => 404, 'message' => 'Failed to store uploaded file.'], 500); + } + + $this->myLogger->logme('info', "RuleImportController::upload - File moved to {$movedFullPath}"); + + // --------------------------------------------------------- + // 4. Insert commission_files row with status pending + // --------------------------------------------------------- + $insertData = [ + 'file_name' => $targetFileName, + 'insurer_id' => (int)$insurerId, + 'department' => $department, + 'commission_month' => $commissionMonth, + 'rules_count' => 0, // will update on success + 'file_status' => $fileStatus, // 'pending' by default + 'is_active' => $isActive, + 'created_by' => (int)$createdBy, + 'created_at' => date('Y-m-d H:i:s'), + ]; + + $this->commissionFilesModel->insert($insertData); + $insertId = $this->commissionFilesModel->getInsertID(); + + if (empty($insertId)) { + $this->myLogger->logme('error', 'RuleImportController::upload - Failed to insert commission_files record', ['data' => $insertData]); + return $this->respond([ + 'status' => false, + 'code' => 404, + 'message' => 'Failed to record upload in database.' + ], 200); + } + + $this->myLogger->logme('info', "RuleImportController::upload - commission_files inserted id={$insertId}", $insertData); + + // --------------------------------------------------------- + // 5. Call ruleImportService->processUpload with inserted file info + // As per your spec: + // $this->ruleImportService->processUpload([ + // 'id' => 1, + // 'file_name' => 'sample_commission.csv', + // 'insurer_id' => 5, + // 'department' => 'motor', + // 'commission_month' => '2025-11-10' + // ]) + // --------------------------------------------------------- + $payload = [ + 'id' => (int)$insertId, + 'file_name' => $targetFileName, + 'insurer_id' => (int)$insurerId, + 'department' => $department, + 'commission_month' => $commissionMonth, + 'created_by' => (int)$createdBy, + + ]; + + $this->myLogger->logme('info', 'RuleImportController::upload - Calling ruleImportService->processUpload', ['payload' => $payload]); + + $result = $this->ruleImportService->processUpload($payload); + + if (!is_array($result) || !isset($result['status'])) { + $this->myLogger->logme('error', 'RuleImportController::upload - Invalid service response', ['response' => $result]); + // update file status as failed + $this->commissionFilesModel->update($insertId, [ + 'file_status' => 'failed', + 'updated_by' => (int)$createdBy, + 'updated_at' => date('Y-m-d H:i:s'), + ]); + return $this->respond([ + 'status' => false, + 'code' => 404, + 'message' => 'Invalid response from import service.' + ], 200); + } + + // --------------------------------------------------------- + // 6. Handle SUCCESS + // - result['rules'] exists + // - result['errors'] empty + // - NO annotated_file + // - Save rules as JSON in WRITEPATH/uploads/commission/json/{insurer_id}_{department}.json + // --------------------------------------------------------- + if ($result['status'] === 'success') { + $rulesArray = isset($result['rules']) && is_array($result['rules']) ? $result['rules'] : []; + $rulesCount = count($rulesArray); + + // Save JSON to WRITEPATH . 'uploads/commission/json/{insurer_id}_{department}.json' + $month_path = strtoupper(date('M', strtotime($commissionMonth))) . date('Y', strtotime($commissionMonth)); + $jsonDir = WRITEPATH . 'uploads/commission/rules/'.$month_path . '/'; + if (!is_dir($jsonDir)) { + if (!mkdir($jsonDir, 0755, true) && !is_dir($jsonDir)) { + throw new \RuntimeException("Failed to create JSON output directory: {$jsonDir}"); + } + } + + $this->myLogger->logme('error', 'RuleImportController::jsonDir' . $jsonDir); + + $deptSlug = preg_replace('/[^a-zA-Z0-9_\-]/', '_', strtolower($department)); + $jsonName = (int)$insurerId . '_' . $deptSlug . '.json'; + $jsonPath = $jsonDir . $jsonName; + + $jsonData = json_encode($rulesArray, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + if ($jsonData === false) { + $this->myLogger->logme('error', 'RuleImportController::upload - json_encode failed for rules', [ + 'last_error' => json_last_error_msg() + ]); + // mark as failed since we cannot save rules + $this->commissionFilesModel->update($insertId, [ + 'file_status' => 'failed', + 'updated_by' => (int)$createdBy, + 'updated_at' => date('Y-m-d H:i:s'), + ]); + return $this->respond([ + 'status' => false, + 'code' => 404, + 'message' => 'Failed to encode rules as JSON.' + ], 200); + } + + // handle existing JSON file based on $override (bool) + if (file_exists($jsonPath)) { + if ($overwrite) { + // rename existing file before overwrite + if (file_exists($jsonPath)) { + + $backupPath = $jsonPath . '.' . date('YmdHis') . '.bak'; + + if (!@rename($jsonPath, $backupPath)) { + $this->myLogger->logme( + 'warning', + 'RuleImportController::upload - Failed to rename existing JSON before overwrite', + [ + 'json_path' => $jsonPath, + 'backup_path' => $backupPath + ] + ); + // continue anyway; writing to same path will overwrite + } + } + $finalJson = $jsonData; + } else { + // append: merge existing JSON with new JSON data + $existingRaw = @file_get_contents($jsonPath); + if ($existingRaw === false) { + $this->myLogger->logme('warning', 'RuleImportController::upload - Could not read existing JSON, will replace with new data', ['json_path' => $jsonPath]); + $finalJson = $jsonData; + } else { + $existingDecoded = json_decode($existingRaw, true); + $newDecoded = json_decode($jsonData, true); + + // if decoding fails, treat as empty array/object and log + if (json_last_error() !== JSON_ERROR_NONE && !is_array($existingDecoded) && !is_object($existingDecoded)) { + $this->myLogger->logme('warning', 'RuleImportController::upload - Existing JSON decode failed; replacing with new data', ['json_path' => $jsonPath, 'json_error' => json_last_error_msg()]); + $finalJson = $jsonData; + } else { + // normalize to PHP arrays for easy merging + if (!is_array($existingDecoded)) { + $existingDecoded = [$existingDecoded]; + } + if (!is_array($newDecoded)) { + $newDecoded = [$newDecoded]; + } + + // merge arrays (preserves numeric keys by reindexing) + $merged = array_merge($existingDecoded, $newDecoded); + $this->myLogger->logme('error', 'RuleImportController::JSON MERGED'); + $finalJson = json_encode($merged, JSON_PRETTY_PRINT); + if ($finalJson === false) { + $this->myLogger->logme('error', 'RuleImportController::upload - Failed to encode merged JSON', ['json_path' => $jsonPath, 'merge_count' => count($merged)]); + $this->commissionFilesModel->update($insertId, [ + 'file_status' => 'failed', + 'updated_by' => (int)$createdBy, + 'updated_at' => date('Y-m-d H:i:s'), + ]); + return $this->respond([ + 'status' => false, + 'code' => 500, + 'message' => 'Failed to encode merged rules JSON.' + ], 500); + } + } + } + } + } else { + // file doesn't exist, just write new data + $finalJson = $jsonData; + } + + // write final JSON to disk with exclusive lock + if (file_put_contents($jsonPath, $finalJson, LOCK_EX) === false) { + $this->myLogger->logme('error', 'RuleImportController::upload - Failed to write rules JSON file', ['json_path' => $jsonPath]); + $this->commissionFilesModel->update($insertId, [ + 'file_status' => 'failed', + 'updated_by' => (int)$createdBy, + 'updated_at' => date('Y-m-d H:i:s'), + ]); + return $this->respond([ + 'status' => false, + 'code' => 404, + 'message' => 'Failed to store rules JSON file.' + ], 500); + } + + // success continues... + $this->myLogger->logme('info', 'RuleImportController::upload - Rules JSON file written', ['json_path' => $jsonPath, 'overwrite' => (bool)$overwrite]); + + + $this->myLogger->logme('info', 'RuleImportController::upload - Rules JSON written', [ + 'file_id' => $insertId, + 'json_path' => $jsonPath, + 'rules_cnt' => $rulesCount, + ]); + + // Update DB: status, rules_count, updated_by + $this->commissionFilesModel->update($insertId, [ + 'file_status' => 'success', + 'rules_count' => $rulesCount, + 'updated_by' => (int)$createdBy, + 'updated_at' => date('Y-m-d H:i:s'), + // If you have a column for JSON path, uncomment: + // 'json_file_path' => $jsonPath, + ]); + + return $this->respond([ + 'status' => true, + 'code' => 200, + 'message' => 'File processed successfully.', + 'file_id' => $insertId, + 'rules_count' => $rulesCount, + 'json_file' => $jsonPath, + 'service' => $result, // optional: return full service response if you want + ], 200); + } + + // --------------------------------------------------------- + // 7. Handle ERROR (validation failed etc.) + // - Do NOT save any rules JSON + // - Update file_status to validation_failed + // - Store annotated_file path if you have such a column + // --------------------------------------------------------- + if ($result['status'] === 'error') { + $annotatedPath = $result['annotated_file'] ?? null; + $errors = $result['errors'] ?? []; + + $updateData = [ + 'file_status' => 'failed', + 'rules_count' => 0, // do not save rules + 'updated_by' => (int)$createdBy, + 'updated_at' => date('Y-m-d H:i:s'), + ]; + + // If you have a column for annotated file path, e.g. annotated_file_path + if ($annotatedPath) { + $updateData['annotated_file_path'] = $annotatedPath; + } + + $this->commissionFilesModel->update($insertId, $updateData); + + $this->myLogger->logme('error', "RuleImportController::upload - Validation failed for file_id={$insertId}", [ + 'errors' => $errors, + 'annotated_file' => $annotatedPath + ]); + + return $this->respond([ + 'status' => false, + 'code' => 404, + 'message' => 'Validation failed. No rules saved.', + 'file_id' => $insertId, + 'errors' => $errors, + 'annotated_file' => $annotatedPath, + ], 422); + } + + // --------------------------------------------------------- + // 8. Unexpected status + // --------------------------------------------------------- + $this->myLogger->logme('error', 'RuleImportController::upload - Unexpected result status from service', ['result' => $result]); + $this->commissionFilesModel->update($insertId, [ + 'file_status' => 'failed', + 'updated_by' => (int)$createdBy, + 'updated_at' => date('Y-m-d H:i:s'), + ]); + + return $this->respond([ + 'status' => false, + 'code' => 404, + 'message' => $result['message'] + ], 200); + } catch (\Throwable $ex) { + $this->myLogger->logme('error', 'RuleImportController::upload exception: ' . $ex->getMessage(), [ + 'trace' => $ex->getTraceAsString() + ]); + + // Try to update the commission_files record if insertId exists + if (isset($insertId) && !empty($insertId)) { + try { + $this->commissionFilesModel->update($insertId, [ + 'file_status' => 'failed', + 'updated_by' => get_session_userid(), + 'updated_at' => date('Y-m-d H:i:s'), + 'notes' => 'Upload exception: ' . $ex->getMessage(), + ]); + } catch (\Throwable $e2) { + $this->myLogger->logme('error', 'RuleImportController::upload - failed to update commission_files after exception: ' . $e2->getMessage()); + } + } + + return $this->respond([ + 'status' => false, + 'code' => 500, + 'message' => $ex->getMessage(), + ], 500); + } + } + + public function downloadSampleCommissionFileUploadExcel() + { + + $filePath = ROOTPATH . 'public/sample_excel/sample_commission.csv'; + // Check if the file exists + if (file_exists($filePath)) { + + // Set the appropriate MIME type + $mimeType = mime_content_type($filePath); + + // Send the file to the client for download + return $this->response->download($filePath, null, $mimeType); + } else { + // File not found, show an error message or redirect + echo view('errors/html/production'); + } + } + + public function downloadErrorFile() + { + $file_id = $this->request->getGet('file_id'); + + $file_data = $this->commissionFilesModel->where('id', $file_id)->where('is_active', 1)->first(); + + $filePath = WRITEPATH . 'uploads/commission/files/annotated_' . $file_data['file_name']; + + // Check if the file exists + if (file_exists($filePath)) { + + // Set the appropriate MIME type + $mimeType = mime_content_type($filePath); + + // Send the file to the client for download + return $this->response->download($filePath, null, $mimeType); + } else { + // File not found, show an error message or redirect + $data['message'] = 'The Physical File Not Found'; + echo view('errors/404', $data); + } + } + + public function deleteCommissionData($id) + { + + $return = $this->updateCommissionRules($id); + // dd($return); + + if($return['status'] == true){ + $this->commissionFilesModel->where('id', $id)->set(['is_active' => 0])->update(); + return $this->respond(['status' => true, 'code' => 200, 'message' => "File removed successfully"], 200); + }else{ + return $this->respond(['status' => false, 'code' => 400, 'message' => "Failed to remove file"], 200); + } + } + + public function updateCommissionRules($id, $post_data = null) + { + // 1. Fetch commission record + $commission_data = $this->commissionFilesModel + ->where('is_active', 1) + ->where('id', $id) + ->first(); + + if (!$commission_data) { + $this->myLogger->logme("error", "Commission record not found for ID: $id"); + return ['status' => false, 'message' => 'Commission record not found']; + } + + // 2. Convert commission_month → OCT2025 + $month = date("M", strtotime($commission_data['commission_month'])); + $year = date("Y", strtotime($commission_data['commission_month'])); + $monthFolder = strtoupper($month . $year); + + // 3. Path + $fileName = $commission_data['insurer_id'] . '_' . $commission_data['department'] . '.json'; + $filePath = WRITEPATH . "uploads/commission/rules/" . $monthFolder . "/" . $fileName; + + if (!file_exists($filePath)) { + $this->myLogger->logme("error", "Rule file not found: $filePath"); + return ['status' => false, 'message' => 'Rule file not found']; + } + + // 4. Read JSON + $json = file_get_contents($filePath); + $rules = json_decode($json, true); + // print_rr($rules); die; + + if (!is_array($rules)) { + $this->myLogger->logme("error", "Invalid JSON structure in file: $filePath"); + return ['status' => false, 'message' => 'Invalid rule file']; + } + + // 5. Mark matching rule as deleted + $ruleFound = false; + $log_message = "Rule file updated successfully"; + + if(empty($post_data)){ + foreach ($rules as &$rule) { + if (isset($rule['file_id']) && $rule['file_id'] == $id && isset($rule['is_deleted']) && $rule['is_deleted'] == false) { + $rule['is_deleted'] = true; + $ruleFound = true; + } + } + $log_message = "Rule marked as deleted and file updated successfully"; + } else { + + foreach ($rules as &$rule) { + // Match rules for the same file and not deleted + if (isset($rule['file_id']) && $rule['file_id'] == $id && $rule['is_deleted'] == false) + { + // 1. DELETE RULE + if (!empty($post_data['rule_id']) && $post_data['rule_id'] == $rule['id'] && isset($post_data['is_deleted'])) + { + $rule['is_deleted'] = true; + $ruleFound = true; + break; + } + + // 2. UPDATE RULE + if (!empty($post_data['rule_id']) && $post_data['rule_id'] == $rule['id']) + { + $rule['conditions'] = $post_data['rule_data']['conditions']; + $rule['calculation'] = $post_data['rule_data']['calculation']; + $rule['name'] = $post_data['rule_data']['name']; + $ruleFound = true; + break; + } + } + } + + // 3. CREATE NEW RULE (only if not found) + if (empty($post_data['rule_id']) && !$ruleFound) { + + $newRuleId = 'rule_' . substr(md5(json_encode($post_data['rule_data']) . time()), 0, 13) . '_' . $id . '_' . strtolower($monthFolder); + $newRule = [ + 'id' => $newRuleId, + 'name' => $post_data['rule_data']['name'], + "department" => $post_data['rule_data']['department'] ?? "motor", + 'is_deleted' => false, + 'file_id' => $id, + 'conditions' => $post_data['rule_data']['conditions'], + 'calculation' => $post_data['rule_data']['calculation'], + ]; + + $rules[] = $newRule; // correctly push new rule + + $ruleFound = true; + } + } + + if (!$ruleFound) { + $this->myLogger->logme("error", "No rule found with file_id: $id in file: $filePath"); + return ['status' => false, 'message' => 'Rule not found in file']; + } + + // 6. Always save file back (No unlink) + file_put_contents($filePath, json_encode($rules, JSON_PRETTY_PRINT)); + + $this->myLogger->logme("error", $log_message); + + return [ + 'status' => true, + 'message' => $log_message + ]; + } + + public function removeCommissionRules($id) + { + // 1. Fetch commission record + $commission_data = $this->commissionFilesModel + ->where('is_active', 1) + ->where('id', $id) + ->first(); + + if (!$commission_data) { + $this->myLogger->logme("error","Commission record not found for ID: $id"); + return ['status' => false, 'message' => 'Commission record not found']; + } + + // 2. Convert commission_month → OCT2025 + $month = date("M", strtotime($commission_data['commission_month'])); + $year = date("Y", strtotime($commission_data['commission_month'])); + $monthFolder = strtoupper($month . $year); // OCT2025 + + // 3. Build file name & path + $fileName = $commission_data['insurer_id'] . '_' . $commission_data['department'] . '.json'; + $filePath = WRITEPATH . "uploads/commission/rules/" . $monthFolder . "/" . $fileName; + + if (!file_exists($filePath)) { + $this->myLogger->logme("error","Rule file not found: $filePath"); + return ['status' => false, 'message' => 'Rule file not found']; + } + + // 4. Read file + $json = file_get_contents($filePath); + $rules = json_decode($json, true); + // dd($rules); + + if (!is_array($rules)) { + $this->myLogger->logme("error","Invalid JSON structure in file: $filePath"); + return ['status' => false, 'message' => 'Invalid rule file']; + } + + // 5. Remove rule where file_id == commission_data id + $updatedRules = array_filter($rules, function ($rule) use ($id) { + return isset($rule['file_id']) && $rule['file_id'] != $id; + }); + + $updatedRules = array_values($updatedRules); + + // 6. If empty → delete file + if (empty($updatedRules)) { + unlink($filePath); + + $this->myLogger->logme("error","Rule removed. File deleted because no rules left: $filePath"); + + return [ + 'status' => true, + 'message' => 'Rule deleted and file removed (no rules left)' + ]; + } + + // 7. Write updated JSON + file_put_contents($filePath, json_encode($updatedRules, JSON_PRETTY_PRINT)); + + $this->myLogger->logme("error","Rule removed successfully and file updated: $filePath"); + + return [ + 'status' => true, + 'message' => 'Rule removed and file updated successfully' + ]; + } + + public function checkSameEntry() + { + $data = $this->request->getGet(); + $commissionMonth = $data['commission_month'] . '-01'; + $data['commission_month'] = change_date_format($commissionMonth, 'Y-M-d', 'Y-m-d'); + + $count = $this->commissionFilesModel->where($data)->where('is_active', 1)->countAllResults(); + if($count > 0){ + return $this->respond(['status' => true, 'code' => 200, 'data' => $count, 'message' => ""], 200); + }else{ + return $this->respond(['status' => false, 'code' => 404, 'data' => $count, 'message' => ""], 200); + } + } + + public function ruleList($id) + { + $data['page_name'] = "Rule Manager"; + $data['departments'] = $this->departments; + $data['commission_file_id'] = $id; + $data['departmentFields'] = json_encode($this->departmentFields); + $data['rules'] = $this->getRuleJson($id); + return $this->loadLayout('commission_rules_list', $data); + } + + public function getRuleJson($id) + { + + // 1. Fetch commission record + $commission_data = $this->commissionFilesModel + ->where('is_active', 1) + ->where('id', $id) + ->first(); + + if (!$commission_data) { + $this->myLogger->logme("error", "Commission record not found for ID: $id"); + return []; + } + + // 2. Convert commission_month → OCT2025 + $month = date("M", strtotime($commission_data['commission_month'])); + $year = date("Y", strtotime($commission_data['commission_month'])); + $monthFolder = strtoupper($month . $year); + + // 3. Path + $fileName = $commission_data['insurer_id'] . '_' . $commission_data['department'] . '.json'; + $filePath = WRITEPATH . "uploads/commission/rules/" . $monthFolder . "/" . $fileName; + + if (!file_exists($filePath)) { + $this->myLogger->logme("error", "Rule file not found: $filePath"); + return []; + } + + // 4. Read JSON + $json = file_get_contents($filePath); + $rules = json_decode($json, true); + + if(!empty($rules)){ + return $rules; + }else{ + return []; + } + + } + + public function saveRule() + { + $post_data = $this->request->getPost(); + + $file_id = $post_data['file_id']; + $return = $this->updateCommissionRules($file_id, $post_data); + // print_r($return); die; + + if(empty($post_data['rule_id'])){ + $success_message = "New rule created successfully"; + $error_message = "Failed to created the new rule"; + }else{ + $success_message = "Rule updated successfully"; + $error_message = "Failed to update the rule"; + } + + if($return['status'] == true){ + $data = $this->getRuleJson($file_id); + return $this->respond(['status' => true, 'code' => 200, 'data' => $data, 'message' => $success_message], 200); + }else{ + return $this->respond(['status' => false, 'code' => 400, 'message' => $error_message], 200); + } + + } + + public function removeRule() + { + $post_data = $this->request->getPost(); + + $file_id = $post_data['file_id']; + $return = $this->updateCommissionRules($file_id, $post_data); + // print_r($return); die; + + $success_message = "Rule deleted successfully"; + $error_message = "Failed to delete the rule"; + + if($return['status'] == true){ + $data = $this->getRuleJson($file_id); + return $this->respond(['status' => true, 'code' => 200, 'data' => $data, 'message' => $success_message], 200); + }else{ + return $this->respond(['status' => false, 'code' => 400, 'message' => $error_message], 200); + } + } + + public function checkRuleUsage() + { + $rule_id = $this->request->getGet('rule_id'); + + $count = $this->partnerPolicyModel->where('commission_applied_rule', $rule_id) + ->countAllResults(); + // $count = 1; + return $this->respond(['status' => true, 'code' => 200, 'count' => $count, 'message' => ""], 200); + } + + +} diff --git a/app/Controllers/ThzController.php b/app/Controllers/ThzController.php index 29f89df4..139b5b8e 100644 --- a/app/Controllers/ThzController.php +++ b/app/Controllers/ThzController.php @@ -102,16 +102,19 @@ class ThzController extends BaseController public function ticketList() { - try { + // try { $returnType = strtolower($this->request->getGet('return_type') ?? 'api'); $data = $this->request->getGet(); - if ($returnType === 'web' && in_array(get_role_id(), [3, 4])) { + if ($returnType === 'web' && in_array(get_role_id(), [4])) { $data['assign_to'] = $data['assign_to'] ?? get_session_userid(); } + if ($returnType === 'web' && in_array(get_role_id(), [3])) { + $data['clientIds'] = $this->clientModel->getClientIdBasedonLoggedInSessionID(); + } $tickets = $this->fetchTicketsBasedOnrole($data); @@ -124,8 +127,9 @@ class ThzController extends BaseController } else { $data['ticket_data'] = $tickets; $data['assignee'] = $this->userModel->where('is_active', 1)->whereIn('role', ['3', '4'])->findAll(); - // enga 5-"head" and 1-"admin" assign pannvaga so dropdown la varakudhathu , 2-"manager l2 " - ivangalum assign pannalam - // 3,4 remain person varannum. + // enga 5-"head" and 1-"admin" assign pannvaga so dropdown la varakudhathu , 2-"manager l2 " - ivangalum assign pannalam. 3,4 remain person varannum dropdown la. + // Roles - 5 (Head) , 1 (Admin) and 2 (Manager) are already assigned to others, so the dropdown should not be shown. + // 3 (Account Manager) and 4 (Staff) should be selectable, so have to show in dropdown . $data['client_list'] = $this->clientModel->getCreatedByUserName(); $data['ticket_type'] = $this->thzTypeModel->where('is_active', 1)->findAll(); $data['tab_name'] = "Tickets"; @@ -138,9 +142,9 @@ class ThzController extends BaseController 'status' => 'success', 'data' => $tickets, ])->setStatusCode(200); - } catch (\Throwable $e) { - return handle_exception($e, $this->myLogger, $this->response); - } + // } catch (\Throwable $e) { + // return handle_exception($e, $this->myLogger, $this->response); + // } } public function ticketConversationSave() @@ -348,6 +352,7 @@ class ThzController extends BaseController // $id = $data['thz_id'] ?? null; $assign_to = $data['assign_to'] ?? null; $mobile = $data['mobile'] ?? null; + $clientIds = $data['clientIds'] ?? null; if (!empty($assign_to)) { // Tickets assigned to a staff @@ -371,6 +376,17 @@ class ThzController extends BaseController ->findAll(); } + + if (!empty($clientIds)) { + return $this->thzMasterModel + ->select('thz_master.*, user_profiles.first_name as assignee_name') + ->join('user_profiles', 'user_profiles.id = thz_master.assign_to', 'left') + ->whereIn('thz_master.client_id', $clientIds) + ->orderBy('thz_master.created_at', 'desc') + ->findAll(); + } + + // All tickets (e.g., for managers) return $this->thzMasterModel ->select('thz_master.*, user_profiles.first_name as assignee_name') diff --git a/app/Controllers/TicketController.php b/app/Controllers/TicketController.php index c8adbcbb..87620e51 100644 --- a/app/Controllers/TicketController.php +++ b/app/Controllers/TicketController.php @@ -26,6 +26,7 @@ use App\Models\VehicleModel; use App\Models\PartnerPolicyModel; use DOMDocument; +use DOMXPath; use Psr\Log\LoggerInterface; use Kint\Kint; @@ -1313,7 +1314,7 @@ class TicketController extends BaseController } } - public function convertHtmlToText($html) + public function convertHtmlToTextOld($html) { if(!empty($html)){ $dom = new DOMDocument(); @@ -1324,6 +1325,36 @@ class TicketController extends BaseController } } + public function convertHtmlToText($html) + { + if (empty($html)) { + return ''; + } + + // Remove BOM / strange characters + $html = preg_replace('/[\x00-\x1F\x80-\xFF]/', ' ', $html); + + // Load HTML safely + $dom = new DOMDocument(); + libxml_use_internal_errors(true); + $dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8')); + + // Remove style and script tags + $xpath = new DOMXPath($dom); + foreach ($xpath->query('//style|//script') as $node) { + $node->parentNode->removeChild($node); + } + + // Extract clean text + $text = $dom->textContent; + + // Clean extra spaces + $text = preg_replace('/\s+/', ' ', $text); + + return trim($text); + } + + public function removeTicket() { $ticket_id = $this->request->getGet('ticket_id'); @@ -2011,6 +2042,7 @@ class TicketController extends BaseController { $received_data = $this->request->getPost(); $ticket_type_id = $this->request->getPost('ticket_type_id') ?? null; + $client_id = $this->request->getPost('client_id') ?? null; $emp_id = $received_data['emp_id']; // Get all client policy IDs for the given employee @@ -2027,6 +2059,9 @@ class TicketController extends BaseController $builder->where('e.is_active', 1); $builder->where('ep.is_active', 1); $builder->where('e.emp_code', $self_data['emp_code']); + if(!empty($client_id)){ + $builder->where('e.client_id', $client_id); + } $builder->groupBy('client_policy_id'); $query = $builder->get(); @@ -2064,7 +2099,7 @@ class TicketController extends BaseController ->join('policy_type', 'policy_type.id = client_policy.policy_type_id AND policy_type.is_active = 1') ->join('insurers', 'insurers.id = client_policy.insurer_id AND insurers.is_active = 1', 'left') ->join('tpa', 'tpa.id = client_policy.tpa_id AND tpa.is_active = 1', 'left') - ->where('client_policy.policy_status', 1) + // ->where('client_policy.policy_status', 1) ->whereIn('client_policy.id', $policy_ids) ->findAll(); diff --git a/app/Filters/CommissionApiFilter.php b/app/Filters/CommissionApiFilter.php new file mode 100644 index 00000000..d7ae956e --- /dev/null +++ b/app/Filters/CommissionApiFilter.php @@ -0,0 +1,55 @@ +getHeaderLine('X'); + $authHeader = $_SERVER['REDIRECT_HTTP_AUTHORIZATION']; + // echo $authHeader;die(); + if (empty($authHeader)) { + return service('response')->setJSON([ + 'success' => false, + 'error' => 'Authorization header missing' + ])->setStatusCode(403); + } + + // Expected format: Bearer YOUR_API_KEY + if (stripos($authHeader, 'Bearer ') !== 0) { + return service('response')->setJSON([ + 'success' => false, + 'error' => 'Invalid Authorization format. Expected: Bearer
| Advertisement Image Name | -Status | -Action | +Advertisement Image Name |
+ Status |
+ Action |
||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| S.No | -Client Name | -Insurer Name | -Insurer Branch Name | -Opening Date | -CD Account No | -Opening Amount | -Date/User | -Action | + S.No |
+ Client Name |
+ Insurer Name |
+ Insurer Branch Name |
+ Opening Date |
+ CD Account No |
+ Opening Amount |
+ Date/User |
+ Action |
||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| S.No | +S.No | Docs Name | File Name | Action | diff --git a/app/Views/employee_data_list.php b/app/Views/employee_data_list.php index 4b594084..9bdc75d5 100755 --- a/app/Views/employee_data_list.php +++ b/app/Views/employee_data_list.php @@ -76,6 +76,9 @@ border-radius: 5px; box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); } + + .dataTables_length label {height: 21px !important;} + @@ -341,9 +344,13 @@ if (ticketsTable.length) { ticketsTable.DataTable({ scrollX: true, + // dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right + // "<'row'<'col-sm-12'tr>>" + + // "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right - "<'row'<'col-sm-12'tr>>" + - "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector + "<'row'<'col-sm-12'tr>>" + + "<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>", + lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]], buttons: [ { extend: 'collection', diff --git a/app/Views/endorsement_list.php b/app/Views/endorsement_list.php index 8512e000..a5535107 100755 --- a/app/Views/endorsement_list.php +++ b/app/Views/endorsement_list.php @@ -12,6 +12,8 @@ position: relative; left: 79px; } + .dataTables_length label {height: 21px !important;} +- | ' . $file['first_name'] . '' ?> | +' . $file['first_name'] . '' ?> | ||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| + |
Insurer
|
@@ -269,7 +279,7 @@
- by ' . $row['first_name'] ?> | +by ' . $row['first_name'] ?> |
@@ -1734,9 +1744,24 @@
"order": [], // Disable initial sorting if needed
"pageLength": 10,
// "dom": '<"top"lf>rt<"bottom"ip><"clear">', // This places length and filter controls at top
- "language": {
- "lengthMenu": "Show _MENU_ entries",
- "search": "Search:"
+ // "language": {
+ // "lengthMenu": "Show _MENU_ entries",
+ // "search": "Search:"
+ // }
+ language: {
+ lengthMenu: "Show _MENU_ entries",
+ search: `
+
-
+
+ _INPUT_
+
+
+
+
+ `,
+ searchPlaceholder: "Search",
+ emptyTable: 'No Data found '
}
});
diff --git a/app/Views/invoice_policy_mapping.php b/app/Views/invoice_policy_mapping.php
new file mode 100644
index 00000000..3491db49
--- /dev/null
+++ b/app/Views/invoice_policy_mapping.php
@@ -0,0 +1,1090 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/Views/invoice_policy_mapping_add.php b/app/Views/invoice_policy_mapping_add.php
new file mode 100755
index 00000000..d0160a1a
--- /dev/null
+++ b/app/Views/invoice_policy_mapping_add.php
@@ -0,0 +1,609 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/Views/invoice_template.php b/app/Views/invoice_template.php
new file mode 100644
index 00000000..865ab921
--- /dev/null
+++ b/app/Views/invoice_template.php
@@ -0,0 +1,430 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/Views/invoice_template_2.php b/app/Views/invoice_template_2.php
new file mode 100644
index 00000000..93946a38
--- /dev/null
+++ b/app/Views/invoice_template_2.php
@@ -0,0 +1,158 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ = $broker_company_name ?? 'Broker Company Name' ?>+= $broker_address ?? 'Company Address Line 1' ?>
+
+ Commission Statement +
+
+
+
+
+
+ Invoice Details+
+ Invoice Number:
+ = $invoice_number ?? 'INV-2024-0001' ?>
+
+
+ Invoice Date:
+ = $invoice_date ?? date('d-M-Y') ?>
+
+
+ Period:
+ = $period ?? 'January 2024' ?>
+
+
+
+ Agent Information+
+ Agent Name:
+ = $agent_name ?? 'Agent Name' ?>
+
+
+ Agent Code:
+ = $agent_code ?? 'AGT-0001' ?>
+
+
+ No. of Policies:
+ = $total_policies ?? '0' ?>
+
+
+ Policies Till Date:
+ = $policies_till_date ?? '0' ?>
+
+
+
+
+
+
+
+
+
+ Total Premium:
+ ₹ = number_format($total_premium, 2) ?>
+
+
+ Total Policies:
+ = count($policies) ?>
+
+
+ Total Commission:
+ ₹ = number_format($total_commission, 2) ?>
+
+
+
+
diff --git a/app/Views/irda_bap_client_report_list.php b/app/Views/irda_bap_client_report_list.php
index 78f89695..d260a3ab 100644
--- a/app/Views/irda_bap_client_report_list.php
+++ b/app/Views/irda_bap_client_report_list.php
@@ -34,6 +34,7 @@ table.dataTable tbody td {
#scroll-horizontal-datatable tfoot .right-align-input {
text-align: right !important;
}
+.dataTables_length label {height: 21px !important;}
@@ -206,9 +207,13 @@ $(document).ready(function() {
if (ticketsTable.length) {
ticketsTable.DataTable({
scrollX: true,
+ // dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
+ // "<'row'<'col-sm-12'tr>>" +
+ // "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
"<'row'<'col-sm-12'tr>>" +
- "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
+ "<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
+ lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
extend: 'collection',
diff --git a/app/Views/irda_bap_insurer_report_list.php b/app/Views/irda_bap_insurer_report_list.php
index b57a2912..d02891af 100644
--- a/app/Views/irda_bap_insurer_report_list.php
+++ b/app/Views/irda_bap_insurer_report_list.php
@@ -24,6 +24,7 @@ table.dataTable tbody td {
#scroll-horizontal-datatable tfoot .right-align-input {
text-align: right !important;
}
+.dataTables_length label {height: 21px !important;}
+ Amount Payable in words : = isset($invoice_no) && !empty($invoice_amount) ? numberToWords((int)$invoice_amount) . ' Only' : "-" ?>
+
+
+
+ BANK ACCOUNT DETAILS
+
+ + ACCOUNT NUMBER : = isset($agent_account_no) && !empty($agent_account_no) ? $agent_account_no : "-" ?> + IFSC CODE : = isset($agent_ifsc_code) && !empty($agent_ifsc_code) ? $agent_ifsc_code : "-" ?> + Bank NAME : = isset($agent_bank_name) && !empty($agent_bank_name) ? $agent_bank_name : "-" ?> +
+ Authorised Signatory
+
+
@@ -239,9 +240,9 @@ $(document).ready(function() {
if (ticketsTable.length) {
ticketsTable.DataTable({
scrollX: true,
- dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
- "<'row'<'col-sm-12'tr>>" +
- "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
+ // dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
+ // "<'row'<'col-sm-12'tr>>" +
+ // "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
// buttons: [{
// extend: 'csv',
// text: 'CSV',
@@ -295,6 +296,10 @@ $(document).ready(function() {
// }
// ],
+ dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
+ "<'row'<'col-sm-12'tr>>" +
+ "<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
+ lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
extend: 'collection',
diff --git a/app/Views/irda_client_report_list.php b/app/Views/irda_client_report_list.php
index 09df1196..468dc7c0 100644
--- a/app/Views/irda_client_report_list.php
+++ b/app/Views/irda_client_report_list.php
@@ -20,6 +20,7 @@ table.dataTable tbody td {
.right-align-input {
text-align: right;
}
+.dataTables_length label {height: 21px !important;}
@@ -75,9 +76,9 @@ $(document).ready(function() {
if (ticketsTable.length) {
ticketsTable.DataTable({
scrollX: true,
- dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
- "<'row'<'col-sm-12'tr>>" +
- "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
+ // dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
+ // "<'row'<'col-sm-12'tr>>" +
+ // "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
// buttons: [{
// extend: 'csv',
// text: 'CSV',
@@ -131,6 +132,10 @@ $(document).ready(function() {
// }
// ],
+ dom: "<'row'<'col-sm-6'f><'col-sm-6 text-right'B>>" + // Filter left, buttons right
+ "<'row'<'col-sm-12'tr>>" +
+ "<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
+ lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
extend: 'collection',
diff --git a/app/Views/kyc_list.php b/app/Views/kyc_list.php
index 2e346371..fff20bdc 100755
--- a/app/Views/kyc_list.php
+++ b/app/Views/kyc_list.php
@@ -38,7 +38,7 @@
color: white;
border:1px solid rgba(41, 139, 142, 1);
}
-
+.dataTables_length label {height: 21px !important;}
@@ -266,7 +266,7 @@
@@ -176,11 +176,13 @@
$('#tickets-table').DataTable({
+ // dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
+ // "<'row'<'col-sm-12'tr>>" +
+ // "<'row'<'col-sm-5'i><'col-sm-7'p>>" ,
dom: "<'row'<'col-12 d-flex justify-content-between align-items-center'<'datatable-search dataTables_filter'f><'datatable-buttons dt-buttons'B>>>" +
- "<'row'<'col-sm-12'tr>>" +
- "<'row'<'col-sm-5'i><'col-sm-7'p>>" ,
-
-
+ "<'row'<'col-sm-12'tr>>" +
+ "<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
+ lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
text: ' Add ',
diff --git a/app/Views/layout/header.php b/app/Views/layout/header.php
index d81c7f68..b9f0fd5f 100755
--- a/app/Views/layout/header.php
+++ b/app/Views/layout/header.php
@@ -1256,14 +1256,14 @@
/* Cancel Bootstrap's .form-control for file inputs */
/* input[type="file"].form-control { */
- /* height: auto !important;*/
- /* remove forced height */
- /* padding: initial !important;*/
- /* reset padding */
- /* font-size: inherit !important;*/
- /* reset font size */
- /* line-height: normal !important;*/
- /* reset line height */
+ /* height: auto !important;*/
+ /* remove forced height */
+ /* padding: initial !important;*/
+ /* reset padding */
+ /* font-size: inherit !important;*/
+ /* reset font size */
+ /* line-height: normal !important;*/
+ /* reset line height */
/* } */
@@ -1327,7 +1327,7 @@
@@ -458,9 +458,13 @@ table.dataTable tbody td {
if (ticketsTable.length) {
ticketsTable.DataTable({
scrollX: true,
+ // dom: "<'row'<'col-sm-7'f><'col-sm-5 text-right'B>>" + // Filter left, buttons right
+ // "<'row'<'col-sm-12'tr>>" +
+ // "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
dom: "<'row'<'col-sm-7'f><'col-sm-5 text-right'B>>" + // Filter left, buttons right
- "<'row'<'col-sm-12'tr>>" +
- "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
+ "<'row'<'col-sm-12'tr>>" +
+ "<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
+ lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
text: 'Add',
diff --git a/app/Views/mail_template.php b/app/Views/mail_template.php
index e4f6f20f..bead26fe 100644
--- a/app/Views/mail_template.php
+++ b/app/Views/mail_template.php
@@ -95,6 +95,7 @@ p{
background-image:url('= $client_logo ?>');
background-size:contain;
background-repeat:no-repeat;
+ background-position: center;
">
diff --git a/app/Views/mail_test.php b/app/Views/mail_test.php
index 776909d3..e7d19666 100755
--- a/app/Views/mail_test.php
+++ b/app/Views/mail_test.php
@@ -8,7 +8,7 @@
-
+
diff --git a/app/Views/nhance_branch_list.php b/app/Views/nhance_branch_list.php
index 32c7c09c..ba1536bf 100644
--- a/app/Views/nhance_branch_list.php
+++ b/app/Views/nhance_branch_list.php
@@ -2,6 +2,7 @@
.dataTables_filter {
position: absolute;
}
+.dataTables_length label {height: 21px !important;}
@@ -94,9 +95,13 @@
var ticketsTable = $('#user-table');
ticketsTable.DataTable({
scrollX: true,
+ // dom: "<'row'<'col-sm-7'f><'col-sm-5 text-right'B>>" + // Filter left, buttons right
+ // "<'row'<'col-sm-12'tr>>" +
+ // "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
dom: "<'row'<'col-sm-7'f><'col-sm-5 text-right'B>>" + // Filter left, buttons right
"<'row'<'col-sm-12'tr>>" +
- "<'row'<'col-sm-5'i><'col-sm-7'p>>", // Pagination at the bottom, without page length selector
+ "<'row align-items-center'<'col-5 text-start'i><'col-7 d-flex justify-content-end align-items-center'<'me-2'l>p>>",
+ lengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
buttons: [
{
text: 'Add',
diff --git a/app/Views/notification.php b/app/Views/notification.php
index b36d3845..ed1c2364 100755
--- a/app/Views/notification.php
+++ b/app/Views/notification.php
@@ -194,7 +194,7 @@
-
+
-
+
-
+
-
+
@@ -342,7 +342,7 @@
-
+
| |||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|