From f387af204b8519b86739c1ec096292d97105c611 Mon Sep 17 00:00:00 2001 From: "venkatesh.r" Date: Fri, 13 Feb 2026 11:56:16 +0530 Subject: [PATCH 1/9] FIX_FORM_VALIDATION --- .../PolicyTransactionController.php | 11596 ++++++++-------- 1 file changed, 5802 insertions(+), 5794 deletions(-) diff --git a/app/Controllers/PolicyTransactionController.php b/app/Controllers/PolicyTransactionController.php index 4a5d3d04..c122e7ae 100644 --- a/app/Controllers/PolicyTransactionController.php +++ b/app/Controllers/PolicyTransactionController.php @@ -1,1050 +1,2638 @@ myLogger = \Config\Services::mylogger(); - protected $myLogger; - protected $policyTransactionModel; - protected $policyTransactionStatusModel; - protected $clientModel; - protected $clientPolicyModel; - protected $clientBranchModel; - protected $clientDepositModel; - protected $policyTypeModel; - protected $insurerBranchModel; - protected $insurerModel; - protected $kycEntityTypeModel; - protected $clientKYCDocsModel; - protected $tpaBranchModel; - protected $tpaModel; - protected $PTFileModel; - protected $PTCOShareDetailsModel; - protected $employeeModel; - protected $userTeamsModel; - protected $userModel; - protected $employeePolicyModel; - protected $insurerStatements; - protected $invoiceStatus; - protected $invPaymentDetailsModel; - protected $batchFileModel; - protected $filesModel; - protected $coShareStmtDetailsModel; - protected $BdsPlacementModel; - protected $nhanceBranchModel; - protected $bdsDumpModel; - protected $vehicleModel; - protected $bds_bulk_upload_excel_file_column; + $this->clientModel = new ClientModel(); + $this->clientBranchModel = new ClientBranchModel(); + $this->policyTypeModel = new PolicyTypeModel(); + $this->clientDepositModel = new ClientDepositModel(); + $this->clientPolicyModel = new ClientPolicyModel(); + $this->insurerBranchModel = new InsurerBranchModel(); + $this->insurerModel = new InsurerModel(); + $this->policyTransactionModel = new PolicyTransactionModel(); + $this->policyTransactionStatusModel = new PolicyTransactionStatusModel(); + $this->kycEntityTypeModel = new KYCEntityTypeModel(); + $this->clientKYCDocsModel = new ClientKYCDocsModel(); + $this->tpaBranchModel = new TPABranchModel(); + $this->tpaModel = new TPAModel(); + $this->PTFileModel = new PTFileModel(); + $this->PTCOShareDetailsModel = new PTCOShareDetailsModel(); + $this->employeeModel = new EmployeeModel(); + $this->userTeamsModel = new UserTeamsModel(); + $this->userModel = new UserModel(); + $this->employeePolicyModel = new EmployeePolicyModel(); + $this->insurerStatements = new InsurerStatements(); + $this->invPaymentDetailsModel = new InvPaymentDetailsModel(); + $this->batchFileModel = new BatchFileModel(); + $this->filesModel = new FileModel(); + $this->coShareStmtDetailsModel = new COShareStmtDetailsModel(); + $this->BdsPlacementModel = new BdsPlacementModel(); + $this->nhanceBranchModel = new NhanceBranchModel(); + $this->bdsDumpModel = new BDSDumpModel(); + $this->vehicleModel = new VehicleModel(); + $this->invoiceStatus = [ + 'pending' => 'Pending', + 'generated' => 'Generated', + 'sent' => 'Sent', + 'payment_received' => 'Payment
Received', + ]; + + $this->bds_bulk_upload_excel_file_column = [ + + 'sno' => [ + 'col_idx' => 0, + 'col_cell_name' => 'A', + 'col_name' => 'S.No.', + 'is_mandatory' => false, + 'data_type' => '', + 'format' => null, + 'allowed_values' => null, + 'custom' => null, + 'params' => null + ], + + 'nhance_branch' => [ + 'col_idx' => 1, + 'col_cell_name' => 'B', + 'col_name' => 'Nhance Branch', + 'is_mandatory' => true, + 'data_type' => '', + 'format' => null, + 'allowed_values' => null, + 'custom' => 'check_nhance_branch', + 'params' => ['row', 'nhance_branch_data'] + ], + + 'vehicle_no' => [ + 'col_idx' => 2, + 'col_cell_name' => 'C', + 'col_name' => 'Vehicle No', + 'is_mandatory' => true, + 'data_type' => 'vehicle', + 'format' => null, + 'allowed_values' => null, + 'custom' => 'check_rto_data', + 'params' => ['row', 'rto_master'] + ], + + 'vehicle_type' => [ + 'col_idx' => 3, + 'col_cell_name' => 'D', + 'col_name' => 'Vehicle Type', + 'is_mandatory' => true, + 'data_type' => '', + 'format' => null, + 'allowed_values' => null, + 'custom' => 'check_vehicle_type', + 'params' => ['row', 'vehicle_type'] + ], + + 'policy_no' => [ + 'col_idx' => 4, + 'col_cell_name' => 'E', + 'col_name' => 'Policy No', + 'is_mandatory' => true, + 'data_type' => '', + 'format' => null, + 'allowed_values' => null, + 'custom' => 'check_policy_no', + 'params' => ['row', 'pt_data'] + ], + + 'insured_name' => [ + 'col_idx' => 5, + 'col_cell_name' => 'F', + 'col_name' => 'Insured Name', + 'is_mandatory' => true, + 'data_type' => '', + 'format' => null, + 'allowed_values' => null, + 'custom' => null, + 'params' => null + ], + + 'insured_email' => [ + 'col_idx' => 6, + 'col_cell_name' => 'G', + 'col_name' => 'Insured Email', + 'is_mandatory' => true, + 'data_type' => 'email', + 'format' => null, + 'allowed_values' => null, + 'custom' => null, + 'params' => null + ], + + 'insurer' => [ + 'col_idx' => 7, + 'col_cell_name' => 'H', + 'col_name' => 'Insurer', + 'is_mandatory' => true, + 'data_type' => '', + 'format' => null, + 'allowed_values' => null, + 'custom' => 'check_insurer_exist', + 'params' => ['row', 'insurer_data'] + ], + + 'insurer_branch' => [ + 'col_idx' => 8, + 'col_cell_name' => 'I', + 'col_name' => 'Insurer Branch', + 'is_mandatory' => true, + 'data_type' => '', + 'format' => null, + 'allowed_values' => null, + 'custom' => 'check_insurer_branch_exist', + 'params' => ['row', 'insurer_branch_data', 'insurers'] + ], + + 'policy_issue_date' => [ + 'col_idx' => 9, + 'col_cell_name' => 'J', + 'col_name' => 'Policy Issue Date', + 'is_mandatory' => true, + 'data_type' => 'date', + 'format' => 'd/M/Y', + 'allowed_values' => null, + 'custom' => null, + 'params' => null + ], + + 'policy_start_date' => [ + 'col_idx' => 10, + 'col_cell_name' => 'K', + 'col_name' => 'Policy Start Date', + 'is_mandatory' => true, + 'data_type' => 'date', + 'format' => 'd/M/Y', + 'allowed_values' => null, + 'custom' => null, + 'params' => null + ], + + 'policy_end_date' => [ + 'col_idx' => 11, + 'col_cell_name' => 'L', + 'col_name' => 'Policy End Date', + 'is_mandatory' => true, + 'data_type' => 'date', + 'format' => 'd/M/Y', + 'allowed_values' => null, + 'custom' => null, + 'params' => null + ], + + 'revenue_type' => [ + 'col_idx' => 12, + 'col_cell_name' => 'M', + 'col_name' => 'Revenue Type', + 'is_mandatory' => true, + 'data_type' => '', + 'format' => null, + 'allowed_values' => ['NA', 'EA', 'EANR'], + 'custom' => null, + 'params' => null + ], + + 'sales_generated_by' => [ + 'col_idx' => 13, + 'col_cell_name' => 'N', + 'col_name' => 'Sales Generated By', + 'is_mandatory' => true, + 'data_type' => '', + 'format' => null, + 'allowed_values' => null, + 'custom' => 'check_user_exist', + 'params' => ['row', 'col_key', 'user_data'] + ], + + 'serviced_by' => [ + 'col_idx' => 14, + 'col_cell_name' => 'O', + 'col_name' => 'Serviced By', + 'is_mandatory' => true, + 'data_type' => '', + 'format' => null, + 'allowed_values' => null, + 'custom' => 'check_user_exist', + 'params' => ['row', 'col_key', 'user_data'] + ], + + 'agent_code' => [ + 'col_idx' => 15, + 'col_cell_name' => 'P', + 'col_name' => 'Agent Code', + 'is_mandatory' => true, + 'data_type' => '', + 'format' => null, + 'allowed_values' => null, + 'custom' => 'check_agent_exist', + 'params' => ['row', 'pos_data'] + ], + + 'base_premium' => [ + 'col_idx' => 16, + 'col_cell_name' => 'Q', + 'col_name' => 'Base Premium', + 'is_mandatory' => false, + 'data_type' => '', + 'format' => null, + 'allowed_values' => null, + 'custom' => null, + 'params' => null + ], + + 'non_commission_premium_amount' => [ + 'col_idx' => 17, + 'col_cell_name' => 'R', + 'col_name' => 'Non commission permium Amount', + 'is_mandatory' => false, + 'data_type' => '', + 'format' => null, + 'allowed_values' => null, + 'custom' => null, + 'params' => null + ], + + 'tp_premium' => [ + 'col_idx' => 18, + 'col_cell_name' => 'S', + 'col_name' => 'TP Premium', + 'is_mandatory' => false, + 'data_type' => '', + 'format' => null, + 'allowed_values' => null, + 'custom' => null, + 'params' => null + ], + + 'igst' => [ + 'col_idx' => 19, + 'col_cell_name' => 'T', + 'col_name' => 'IGST', + 'is_mandatory' => false, + 'data_type' => '', + 'format' => null, + 'allowed_values' => null, + 'custom' => 'check_gst_percentage', + 'params' => ['row'] + ], + + 'cgst' => [ + 'col_idx' => 20, + 'col_cell_name' => 'U', + 'col_name' => 'CGST', + 'is_mandatory' => false, + 'data_type' => '', + 'format' => null, + 'allowed_values' => null, + 'custom' => 'check_gst_percentage', + 'params' => ['row'] + ], + + 'sgst' => [ + 'col_idx' => 21, + 'col_cell_name' => 'V', + 'col_name' => 'SGST', + 'is_mandatory' => false, + 'data_type' => '', + 'format' => null, + 'allowed_values' => null, + 'custom' => 'check_gst_percentage', + 'params' => ['row'] + + ], + + 'stamp_duty' => [ + 'col_idx' => 22, + 'col_cell_name' => 'W', + 'col_name' => 'Stamp Duty', + 'is_mandatory' => false, + 'data_type' => '', + 'format' => null, + 'allowed_values' => null, + 'custom' => null, + 'params' => null + ], + + // 'total' => [ + // 'col_idx' => 23, + // 'col_cell_name' => 'X', + // 'col_name' => 'Total', + // 'is_mandatory' => false, + // 'data_type' => '', + // 'format' => null, + // 'allowed_values' => null, + // 'custom' => null, + // 'params' => null + // ], + + 'agreed_amount' => [ + 'col_idx' => 23, + 'col_cell_name' => 'X', + 'col_name' => 'Agreed Amount', + 'is_mandatory' => false, + 'data_type' => '', + 'format' => null, + 'allowed_values' => null, + 'custom' => null, + 'params' => null + ], + + 'agreed_bp_percentage' => [ + 'col_idx' => 24, + 'col_cell_name' => 'Y', + 'col_name' => 'Agreed BP Percentage', + 'is_mandatory' => false, + 'data_type' => '', + 'format' => null, + 'allowed_values' => null, + 'custom' => null, + 'params' => null + ], + + 'agreed_tp_percentage' => [ + 'col_idx' => 25, + 'col_cell_name' => 'Z', + 'col_name' => 'Agreed TP Percentage', + 'is_mandatory' => false, + 'data_type' => '', + 'format' => null, + 'allowed_values' => null, + 'custom' => null, + 'params' => null + ], + + // 'actual_bp_amount' => [ + // 'col_idx' => 27, + // 'col_cell_name' => 'AB', + // 'col_name' => 'Actual BP Amount', + // 'is_mandatory' => false, + // 'data_type' => '', + // 'format' => null, + // 'allowed_values' => null, + // 'custom' => null, + // 'params' => null + // ], + + // 'actual_tp_amount' => [ + // 'col_idx' => 28, + // 'col_cell_name' => 'AC', + // 'col_name' => 'Actual TP Amount', + // 'is_mandatory' => false, + // 'data_type' => '', + // 'format' => null, + // 'allowed_values' => null, + // 'custom' => null, + // 'params' => null + // ], + + // 'actual_bp_percentage' => [ + // 'col_idx' => 29, + // 'col_cell_name' => 'AD', + // 'col_name' => 'Actual BP Percentage', + // 'is_mandatory' => false, + // 'data_type' => '', + // 'format' => null, + // 'allowed_values' => null, + // 'custom' => null, + // 'params' => null + // ], + + // 'actual_tp_percentage' => [ + // 'col_idx' => 30, + // 'col_cell_name' => 'AE', + // 'col_name' => 'Actual TP Percentage', + // 'is_mandatory' => false, + // 'data_type' => '', + // 'format' => null, + // 'allowed_values' => null, + // 'custom' => null, + // 'params' => null + // ], + + // 'actual_bp_brokerage_amount' => [ + // 'col_idx' => 31, + // 'col_cell_name' => 'AF', + // 'col_name' => 'Actual BP Brokerage Amount', + // 'is_mandatory' => false, + // 'data_type' => '', + // 'format' => null, + // 'allowed_values' => null, + // 'custom' => null, + // 'params' => null + // ], + + // 'actual_tp_brokerage_amount' => [ + // 'col_idx' => 32, + // 'col_cell_name' => 'AG', + // 'col_name' => 'Actual TP Brokerage Amount', + // 'is_mandatory' => false, + // 'data_type' => '', + // 'format' => null, + // 'allowed_values' => null, + // 'custom' => null, + // 'params' => null + // ], + + // 'expected_amount' => [ + // 'col_idx' => 33, + // 'col_cell_name' => 'AH', + // 'col_name' => 'Expected Amount', + // 'is_mandatory' => true, + // 'data_type' => '', + // 'format' => null, + // 'allowed_values' => null, + // 'custom' => null, + // 'params' => null + // ], + + // 'rewards' => [ + // 'col_idx' => 34, + // 'col_cell_name' => 'AI', + // 'col_name' => 'Rewards', + // 'is_mandatory' => false, + // 'data_type' => '', + // 'format' => null, + // 'allowed_values' => null, + // 'custom' => null, + // 'params' => null + // ], + + ]; + + } + + // Policy Transaction Inception + public function viewInception() + { + $bds_edit_pt_id = $this->request->getGet('pt_id') ?? null; + $data['tab_name'] = 'Policies'; + $data['page_name'] = 'Policies'; + + // Static arrays for dropdowns + $data['issuer'] = [1 => 'JIBS', 2 => 'Nhance']; + $data['issuer_branch'] = $this->nhanceBranchModel->where('is_active', 1)->findAll(); + $data['client_type'] = [1 => 'Group', 2 => 'Individual']; + $data['issuing_type'] = [1 => 'Fresh', 2 => 'Renewal', 3 => 'Roll Over']; + $data['policy_status'] = [ + 'under_process' => 'Under Process', + 'client_pending' => 'Client Pending', + 'insurer_pending' => 'Insurer Pending', + 'co_insurer_pending' => 'Co-Insurer Pending', + 'tpa_pending' => 'TPA Pending', + 'validated' => 'Validated', + 'cancelled' => 'Cancelled', + 'instalment_pending' => 'Instalment Pending', + 'completed' => 'Completed', + 'lost' => 'Lost', + ]; + $data['invoice_status_array'] = [ + 'yet_to_generate' => 'Pending', + 'generated' => 'Generated', + 'send' => 'Sent', + 'recived' => 'Payment Received', + ]; + // $data['vehicle_type'] = [ + // 'two_wheeler' => 'Two Wheeler', + // 'four_wheeler' => 'Four Wheeler', + // 'truck' => 'Truck', + // 'bus' => 'Bus', + // 'van' => 'Van', + // 'suv' => 'SUV', + // 'motorcycle' => 'Motorcycle', + // 'bicycle' => 'Bicycle' + // ]; + $data['vehicle_type'] = db_connect()->table('vehicle_type')->where('is_active', 1)->get()->getResultArray(); + $data['rto_details'] = db_connect()->table('rto_master')->where('is_active', 1)->get()->getResultArray(); + + $data['vehicle_des'] = [ + 'commercial' => 'Commercial', + 'private' => 'Private', + ]; + $data['date_type'] = [ + 'policy_issue_date' => 'Policy Issue Date', + 'policy_start_date' => 'Policy Start Date', + 'policy_end_date' => 'Policy End Date', + ]; + + // Filter data + $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'); + $status = $this->request->getGet('status'); + + // Handle null or empty values + $start_date = empty($start_date) ? 0 : $start_date; + $end_date = empty($end_date) ? 0 : $end_date; + $client_id = empty($client_id) ? 0 : $client_id; + $insurer_id = empty($insurer_id) ? 0 : $insurer_id; + $policy_type_id = empty($policy_type_id) ? 0 : $policy_type_id; + $date_type = empty($date_type) ? 0 : $date_type; + $issuer = empty($issuer) ? 0 : $issuer; + $status = empty($status) ? 0 : $status; // Corrected from `$issuer` + + if(empty($bds_edit_pt_id)){ + if ($this->request->is('get')) { + + // Fetch inception data list + $data['inception_data_list'] = $this->policyTransactionModel->getInceptionTranctionListData( + $start_date, + $end_date, + $client_id, + $insurer_id, + $policy_type_id, + $date_type, + $issuer, + $status + ); + } else { + + $ids = $this->request->getPost('ids'); + $ids = array_filter(explode(',', $ids)); + $data['inception_data_list'] = $this->policyTransactionModel->getInceptionTranctionListData( + $start_date = 0, + $end_date = 0, + $client_id = 0, + $insurer_id = 0, + $policy_type_id = 0, + $date_type = 0, + $issuer = 0, + $status = 0, + $ids + ); + } + }else{ + $data['inception_data_list'] = []; + } - public function __construct() - { - set_session_context('Policy Tranction'); - $this->myLogger = \Config\Services::mylogger(); - $this->clientModel = new ClientModel(); - $this->clientBranchModel = new ClientBranchModel(); - $this->policyTypeModel = new PolicyTypeModel(); - $this->clientDepositModel = new ClientDepositModel(); - $this->clientPolicyModel = new ClientPolicyModel(); - $this->insurerBranchModel = new InsurerBranchModel(); - $this->insurerModel = new InsurerModel(); - $this->policyTransactionModel = new PolicyTransactionModel(); - $this->policyTransactionStatusModel = new PolicyTransactionStatusModel(); - $this->kycEntityTypeModel = new KYCEntityTypeModel(); - $this->clientKYCDocsModel = new ClientKYCDocsModel(); - $this->tpaBranchModel = new TPABranchModel(); - $this->tpaModel = new TPAModel(); - $this->PTFileModel = new PTFileModel(); - $this->PTCOShareDetailsModel = new PTCOShareDetailsModel(); - $this->employeeModel = new EmployeeModel(); - $this->userTeamsModel = new UserTeamsModel(); - $this->userModel = new UserModel(); - $this->employeePolicyModel = new EmployeePolicyModel(); - $this->insurerStatements = new InsurerStatements(); - $this->invPaymentDetailsModel = new InvPaymentDetailsModel(); - $this->batchFileModel = new BatchFileModel(); - $this->filesModel = new FileModel(); - $this->coShareStmtDetailsModel = new COShareStmtDetailsModel(); - $this->BdsPlacementModel = new BdsPlacementModel(); - $this->nhanceBranchModel = new NhanceBranchModel(); - $this->bdsDumpModel = new BDSDumpModel(); - $this->vehicleModel = new VehicleModel(); - $this->invoiceStatus = [ - 'pending' => 'Pending', - 'generated' => 'Generated', - 'sent' => 'Sent', - 'payment_received' => 'Payment
Received', - ]; + // Fetch additional data + $data['client'] = $this->clientModel->where('is_active', 1)->findAll(); + $data['client_branch'] = $this->clientBranchModel->where('is_active', 1)->findAll(); + $data['policy_type'] = $this->policyTypeModel->where('is_active', 1)->findAll(); + $data['insurer'] = $this->insurerModel->where('is_active', 1)->findAll(); + $data['entity'] = $this->kycEntityTypeModel->where('is_active', 1)->findAll(); + $data['policy_types'] = $this->policyTypeModel->where('is_active', 1)->findAll(); + $data['insurer_branch'] = $this->insurerBranchModel->getInsurerBranchesWithInsurerNames(); + $data['tpa'] = $this->tpaBranchModel->getTpaBranchesWithTpaNames(); - $this->bds_bulk_upload_excel_file_column = [ + // Fetch PP Teams Data + $data['ppTeamsData'] = $this->userModel + ->where('is_active', 1) + ->findAll(); - 'sno' => [ - 'col_idx' => 0, - 'col_cell_name' => 'A', - 'col_name' => 'S.No.', - 'is_mandatory' => false, - 'data_type' => '', - 'format' => null, - 'allowed_values' => null, - 'custom' => null, - 'params' => null + // // Fetch Sales Team + // $data['salse_team'] = $this->userModel + // ->select('user_profiles.*,nhance_branch.id as nhance_branch_id, nhance_branch.branch_name as nhance_branch_name') + // ->join('user_teams', 'user_profiles.id = user_teams.user_id') + // ->join('nhance_branch', 'user_profiles.nhance_branch_id = nhance_branch.id','left') + // ->where('user_teams.team_id', 5) + // ->where('user_teams.is_active', 1) + // ->where('user_profiles.is_active', 1) + // ->findAll(); + + // // Fetch Partner Agent + // $data['partner_agent'] = db_connect()->table('partner_agent') + // ->where('is_active', 1) + // ->get() + // ->getResultArray(); + + // // Fetch ACM + // $data['ACM'] = $this->userModel + // ->where('role', 3) // Assuming `role` is in `user_profiles` + // ->where('is_active', 1) + // ->findAll(); + + // Fetch Sales Team + $data['salse_team'] = $this->userModel + ->select(' + user_profiles.*, + nhance_branch.id as nhance_branch_id, + nhance_branch.branch_name as nhance_branch_name, + rm.first_name AS rm_name + ') + ->join('user_teams', 'user_profiles.id = user_teams.user_id') + ->join('nhance_branch', 'user_profiles.nhance_branch_id = nhance_branch.id','left') + ->join('user_profiles AS rm', 'user_profiles.rm_id = rm.id', 'left') + ->where('user_teams.team_id', 5) + ->where('user_teams.is_active', 1) + ->where('user_profiles.is_active', 1) + ->groupBy('user_profiles.id', 'asc') + ->findAll(); + + // Fetch Partner Agent + $data['partner_agent'] = db_connect()->table('partner_agent') + ->where('is_active', 1) + ->get() + ->getResultArray(); + + // Fetch ACM + $data['ACM'] = $this->userModel + ->select(' + user_profiles.*, + nhance_branch.id AS nhance_branch_id, + nhance_branch.branch_name AS nhance_branch_name, + rm.first_name AS rm_name + ') + ->join('user_teams', 'user_profiles.id = user_teams.user_id') + ->join('nhance_branch', 'user_profiles.nhance_branch_id = nhance_branch.id', 'left') + ->join('user_profiles AS rm', 'user_profiles.rm_id = rm.id', 'left') + ->where('user_profiles.role', 3) + ->where('user_profiles.is_active', 1) + ->groupBy('user_profiles.id', 'asc') + ->findAll(); + + + // dd($data); + //Fetch POS + $data['pos_data'] = db_connect()->table('partner_pos') + ->where('is_active', 1) + ->get() + ->getResultArray(); + + // Load view + $this->loadLayout('policy_transaction_inception_list', $data); + } + + public function viewInception2() + { + $bds_edit_pt_id = $this->request->getGet('pt_id') ?? null; + $data['tab_name'] = 'Policies'; + $data['page_name'] = 'Policies'; + + // Static arrays for dropdowns + $data['issuer'] = [1 => 'JIBS', 2 => 'Nhance']; + $data['issuer_branch'] = $this->nhanceBranchModel->where('is_active', 1)->findAll(); + $data['client_type'] = [1 => 'Group', 2 => 'Individual']; + $data['issuing_type'] = [1 => 'Fresh', 2 => 'Renewal', 3 => 'Roll Over']; + $data['policy_status'] = [ + 'under_process' => 'Under Process', + 'client_pending' => 'Client Pending', + 'insurer_pending' => 'Insurer Pending', + 'co_insurer_pending' => 'Co-Insurer Pending', + 'tpa_pending' => 'TPA Pending', + 'validated' => 'Validated', + 'cancelled' => 'Cancelled', + 'instalment_pending' => 'Instalment Pending', + 'completed' => 'Completed', + 'lost' => 'Lost', + ]; + $data['invoice_status_array'] = [ + 'yet_to_generate' => 'Pending', + 'generated' => 'Generated', + 'send' => 'Sent', + 'recived' => 'Payment Received', + ]; + // $data['vehicle_type'] = [ + // 'two_wheeler' => 'Two Wheeler', + // 'four_wheeler' => 'Four Wheeler', + // 'truck' => 'Truck', + // 'bus' => 'Bus', + // 'van' => 'Van', + // 'suv' => 'SUV', + // 'motorcycle' => 'Motorcycle', + // 'bicycle' => 'Bicycle' + // ]; + $data['vehicle_type'] = db_connect()->table('vehicle_type')->where('is_active', 1)->get()->getResultArray(); + $data['rto_details'] = db_connect()->table('rto_master')->where('is_active', 1)->get()->getResultArray(); + + $data['vehicle_des'] = [ + 'commercial' => 'Commercial', + 'private' => 'Private', + ]; + $data['date_type'] = [ + 'policy_issue_date' => 'Policy Issue Date', + 'policy_start_date' => 'Policy Start Date', + 'policy_end_date' => 'Policy End Date', + ]; + + // Filter data + $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'); + $status = $this->request->getGet('status'); + + // Handle null or empty values + $start_date = empty($start_date) ? 0 : $start_date; + $end_date = empty($end_date) ? 0 : $end_date; + $client_id = empty($client_id) ? 0 : $client_id; + $insurer_id = empty($insurer_id) ? 0 : $insurer_id; + $policy_type_id = empty($policy_type_id) ? 0 : $policy_type_id; + $date_type = empty($date_type) ? 0 : $date_type; + $issuer = empty($issuer) ? 0 : $issuer; + $status = empty($status) ? 0 : $status; // Corrected from `$issuer` + + if(empty($bds_edit_pt_id)){ + if ($this->request->is('get')) { + + // Fetch inception data list + $data['inception_data_list'] = $this->policyTransactionModel->getInceptionTranctionListData( + $start_date, + $end_date, + $client_id, + $insurer_id, + $policy_type_id, + $date_type, + $issuer, + $status + ); + } else { + + $ids = $this->request->getPost('ids'); + $ids = array_filter(explode(',', $ids)); + $data['inception_data_list'] = $this->policyTransactionModel->getInceptionTranctionListData( + $start_date = 0, + $end_date = 0, + $client_id = 0, + $insurer_id = 0, + $policy_type_id = 0, + $date_type = 0, + $issuer = 0, + $status = 0, + $ids + ); + } + }else{ + $data['inception_data_list'] = []; + } + + + + // Fetch additional data + $data['client'] = $this->clientModel->where('is_active', 1)->findAll(); + $data['client_branch'] = $this->clientBranchModel->where('is_active', 1)->findAll(); + $data['policy_type'] = $this->policyTypeModel->where('is_active', 1)->findAll(); + $data['insurer'] = $this->insurerModel->where('is_active', 1)->findAll(); + $data['entity'] = $this->kycEntityTypeModel->where('is_active', 1)->findAll(); + $data['policy_types'] = $this->policyTypeModel->where('is_active', 1)->findAll(); + $data['insurer_branch'] = $this->insurerBranchModel->getInsurerBranchesWithInsurerNames(); + $data['tpa'] = $this->tpaBranchModel->getTpaBranchesWithTpaNames(); + + // Fetch PP Teams Data + $data['ppTeamsData'] = $this->userModel + ->where('is_active', 1) + ->findAll(); + + // Fetch Sales Team + $data['salse_team'] = $this->userModel + ->select(' + user_profiles.*, + nhance_branch.id as nhance_branch_id, + nhance_branch.branch_name as nhance_branch_name, + rm.first_name AS rm_name + ') + ->join('user_teams', 'user_profiles.id = user_teams.user_id') + ->join('nhance_branch', 'user_profiles.nhance_branch_id = nhance_branch.id','left') + ->join('user_profiles AS rm', 'user_profiles.rm_id = rm.id', 'left') + ->where('user_teams.team_id', 5) + ->where('user_teams.is_active', 1) + ->where('user_profiles.is_active', 1) + ->groupBy('user_profiles.id', 'asc') + ->findAll(); + + // Fetch Partner Agent + $data['partner_agent'] = db_connect()->table('partner_agent') + ->where('is_active', 1) + ->get() + ->getResultArray(); + + // Fetch ACM + $data['ACM'] = $this->userModel + ->select(' + user_profiles.*, + nhance_branch.id AS nhance_branch_id, + nhance_branch.branch_name AS nhance_branch_name, + rm.first_name AS rm_name + ') + ->join('user_teams', 'user_profiles.id = user_teams.user_id') + ->join('nhance_branch', 'user_profiles.nhance_branch_id = nhance_branch.id', 'left') + ->join('user_profiles AS rm', 'user_profiles.rm_id = rm.id', 'left') + ->where('user_profiles.role', 3) + ->where('user_profiles.is_active', 1) + ->groupBy('user_profiles.id', 'asc') + ->findAll(); + + // echo '
';
+        
+        // print_r($data['ppTeamsData']); die;
+
+        // dd($data);
+
+        // Load view
+        $this->loadLayout('policy_transaction_inception_list_2', $data);
+    }
+
+    // policy Transaction Create function start
+    public function createInceptionPolicy()
+    {
+        $post_data = $this->request->getPost();
+
+        $rules = [
+            // ==========================================
+            // 1. CLIENT SECTION (5 Fields)
+            // ==========================================
+            'client_type'       => ['label'  => 'Client Type', 'rules'  => 'required', 'errors' => ['required' => 'Client Type must be selected.']],
+            'client_id'     => ['label'  => 'Client', 'rules'  => 'required', 'errors' => ['required' => 'Please select a Client.']],
+            'client_branch_id'  => ['label'  => 'Client Branch', 'rules'  => 'required', 'errors' => ['required' => 'Client branch is required']],
+            'issue_type'  => ['label'  => 'Business Type', 'rules'  => 'required', 'errors' => ['required' => 'Please select a Business Type.']],
+            'ref'   => ['label' => 'Reference', 'rules' => 'permit_empty|regex_match[/^[a-zA-Z0-9 _-]+$/]', 'errors' => [
+                'regex_match' => 'The {field} can only contain letters, numbers, spaces, dashes, and underscores.'
+            ]],
+
+            // ==========================================
+            // 5. SALES SECTION (12 Fields)
+            // ==========================================
+            'base_policy'        => ['label' => 'Base Policy', 'rules' => 'permit_empty', 'errors' => []],
+            'policy_no'          => [
+                'label' => 'Policy Number',
+                'rules'  => 'required|regex_match[/^[a-zA-Z0-9\/_-]+$/]',
+                'errors' => [
+                    'required'    => 'Policy Number is Must.',
+                    'regex_match' => 'Policy Number can only contain letters, numbers, and symbols like / - or _'
+                ]
+            ],
+            'policy_issue_date'  => [
+                'label' => 'Issue Date',
+                'rules'  => 'required|valid_date[Y-m-d]|regex_match[/^\d{4}-\d{2}-\d{2}$/]',
+                'errors' => [
+                    'required'    => 'Policy Issue Date is required.',
+                    'valid_date'  => 'Please provide a valid Policy Issue Date.',
+                    'regex_match' => 'The Policy Issue Date format is incorrect. '
+                ]
+            ],
+            'month'              => ['label' => 'Issue Month', 'rules' => 'required', 'errors' => [
+                'required' => 'Please select or enter the Policy Issue Month.'
+            ]],
+            'policy_start_date'  => [
+                'label' => 'D.O.C',
+                'rules'  => 'required|valid_date[Y-m-d]|regex_match[/^\d{4}-\d{2}-\d{2}$/]',
+                'errors' => [
+                    'required'   => 'D.O.C (Start Date) is required.',
+                    'valid_date'  => 'Please provide a valid D.O.C date.',
+                    'regex_match' => 'The D.O.C date format is incorrect. '
+                ]
+            ],
+            'policy_end_date'    => ['label' => 'D.O.E', 'rules' => 'required|valid_date[Y-m-d]|regex_match[/^\d{4}-\d{2}-\d{2}$/]', 'errors' => [
+                'required'   => 'D.O.E (Expiry Date) is required.',
+                'valid_date'  => 'Please provide a valid D.O.E date.',
+                'regex_match' => 'The D.O.E date format is incorrect. '
+            ]],
+            'emp_count'          => ['label' => 'No of Insured', 'rules' => 'permit_empty|numeric', 'errors' => [
+                'numeric' => 'No of Insured must contain only numbers.'
+            ]],
+            'dependent_count'    => ['label' => 'No of Dependents', 'rules' => 'permit_empty|numeric', 'errors' => [
+                'numeric' => 'No of Dependents must contain only numbers.'
+            ]],
+            'installment'        => ['label' => 'Installment', 'rules' => 'permit_empty|regex_match[/^[a-zA-Z0-9 _-]+$/]', 'errors' => [
+                'regex_match' => 'The {field} can only contain letters, numbers, spaces, dashes, and underscores.'
+            ]],
+            'installment_data'   => ['label' => 'Installment Data', 'rules' => 'permit_empty|regex_match[/^[a-zA-Z0-9 _-]+$/]', 'errors' => [
+                'regex_match' => 'The {field} can only contain letters, numbers, spaces, dashes, and underscores.'
+            ]],
+            'co_share'           => ['label' => 'CoP Yes', 'rules' => 'permit_empty', 'errors' => []],
+            'bro_payable_by'     => ['label' => 'Remuneration Pay By', 'rules' => 'permit_empty', 'errors' => []],
+            'renewal_date'       => ['label' => 'Renewal Date', 'rules' => 'required|valid_date[Y-m-d]|regex_match[/^\d{4}-\d{2}-\d{2}$/]', 'errors' => [
+                'required'   => 'Renewal Date is required.',
+                'valid_date'  => 'Please provide a valid Renewal Date.',
+                'regex_match' => 'The Renewal Date format is incorrect. '
+            ]],
+            'sales_generated_by' => ['label' => 'Sales Generated By', 'rules' => 'permit_empty', 'errors' => [
+                // 'required' => 'Please select the person who generated this sale.'
+            ]],
+            'serviced_by'        => ['label' => 'Serviced By', 'rules' => 'permit_empty', 'errors' => [
+                // 'required' => 'Please select the service person for this policy.'
+            ]],
+            'pos_id'             => ['label' => 'POS', 'rules' => 'permit_empty', 'errors' => []],
+            'doc_name.*' => [
+                'label'  => 'Policy Document Name',
+                'rules'  => 'permit_empty|regex_match[/^[a-zA-Z0-9 _-]+$/]|min_length[2]|max_length[100]',
+                'errors' => [
+                    'regex_match' => 'The {field} can only contain letters, numbers, spaces, dashes, and underscores.'
+                ]
+            ],
+            'other_docs_name.*' => [
+                'label'  => 'Vehicle Document Name',
+                'rules'  => 'permit_empty|regex_match[/^[a-zA-Z0-9 _-]+$/]|min_length[2]|max_length[100]',
+                'errors' => [
+                    'regex_match' => 'The {field} can only contain letters, numbers, spaces, dashes, and underscores.'
+                ]
+            ],
+
+            // ==========================================
+            // 6. PREMIUM DETAILS (Array Fields - 25 Fields)
+            // Use .* because these come from the dynamic table
+            // ==========================================
+            'follow_insurer_id.*'      => ['label' => 'Insurer', 'rules' => 'required', 'errors' => ['required' => 'Please select an Insurer.']],
+            'co_share_type.*'          => ['label' => 'Is Leader', 'rules' => 'permit_empty', 'errors' => []],
+            'cd_ac_no_for_child.*'     => ['label' => 'CD Acc No', 'rules' => 'permit_empty', 'errors' => []],
+            'cd_current_balance.*'     => ['label' => 'CD Amount', 'rules' => 'permit_empty', 'errors' => []],
+            'follower_policy_no.*'     => ['label' => 'Follower Policy No', 'rules' => 'permit_empty|regex_match[/^[a-zA-Z0-9\/_-]+$/]', 'errors' => [
+                'regex_match' => 'The {field} can only contain letters, numbers, spaces, dashes, and underscores.'
+            ]],
+            'calc_policy_issue_date.*' => ['label' => 'Policy Issue Date', 'rules' => 'required', 'errors' => ['required' => 'Policy Issue Date is required']],
+            'co_share_per.*'           => ['label' => 'Co-Share %', 'rules' => 'permit_empty|decimal', 'errors' => ['decimal' => 'Co-Share % must be a valid decimal.']],
+            'non_comm_per_amt.*'       => ['label' => 'Non-Comm Premium', 'rules' => 'permit_empty|decimal', 'errors' => ['decimal' => 'Amount must be numeric.']],
+            'base_premium.*'           => ['label' => 'Base Premium','rules' => 'permit_empty|decimal', 'errors' => ['decimal' => 'Base Premium must be numeric.']],
+            'tp_premium.*'             => ['label' => 'TP Premium', 'rules' => 'permit_empty|decimal', 'errors' => ['decimal' => 'TP Premium must be numeric.']],
+            'ter_premium.*'            => ['label' => 'TEP Premium', 'rules' => 'permit_empty|decimal', 'errors' => ['decimal' => 'TEP Premium must be numeric.']],
+            'co_premium.*'             => ['label' => 'Co-Premium', 'rules' => 'permit_empty|decimal', 'errors' => ['decimal' => 'Co-Premium must be numeric.']],
+            'co_tp_premium.*'          => ['label' => 'Co-TP Premium', 'rules' => 'permit_empty|decimal', 'errors' => ['decimal' => 'Co-TP Premium must be numeric.']],
+            'co_ter_premium.*'         => ['label' => 'Co-TEP Premium', 'rules' => 'permit_empty|decimal', 'errors' => ['decimal' => 'Co-TEP Premium must be numeric.']],
+            'cgst.*'                   => ['label' => 'CGST', 'rules' => 'permit_empty|decimal', 'errors' => ['decimal' => 'CGST must be numeric.']],
+            'sgst.*'                   => ['label' => 'SGST', 'rules' => 'permit_empty|decimal', 'errors' => ['decimal' => 'SGST must be numeric.']],
+            'igst.*'                   => ['label' => 'IGST', 'rules' => 'permit_empty|decimal', 'errors' => ['decimal' => 'IGST must be numeric.']],
+            'gst_amount.*'             => ['label' => 'GST Amount', 'rules'  => 'permit_empty|decimal', 'errors' => ['decimal' => 'GST Amount must be numeric.']],
+            'stamp_duty.*'             => ['label' => 'Stamp Duty', 'rules' => 'permit_empty|decimal', 'errors' => ['decimal' => 'Stamp Duty must be numeric.']],
+            'total.*'                  => ['label' => 'Total', 'rules' => 'permit_empty|decimal', 'errors' => ['decimal'  => 'Total must be a numeric value.']],
+            'agreed_bp.*'              => ['label' => 'Agreed BP %', 'rules' => 'permit_empty|decimal', 'errors' => ['decimal' => 'Agreed BP % must be numeric.']],
+            'agreed_tp.*'              => ['label' => 'Agreed TP %', 'rules' => 'permit_empty|decimal', 'errors' => ['decimal' => 'Agreed TP % must be numeric.']],
+            'agreed_ter.*'             => ['label' => 'Agreed TEP %', 'rules' => 'permit_empty|decimal', 'errors' => ['decimal' => 'Agreed TEP % must be numeric.']],
+            'agreed_amount.*'          => ['label' => 'Agreed Amount', 'rules' => 'permit_empty|decimal', 'errors' => ['decimal' => 'Agreed Amount must be numeric.']],
+            'actual_bp_amt.*'          => ['label' => 'Actual BP Amount', 'rules' => 'permit_empty|decimal', 'errors' => ['decimal' => 'Actual BP Amount must be numeric.']],
+            'actual_tp_amt.*'          => ['label' => 'Actual TP Amount', 'rules' => 'permit_empty|decimal', 'errors' => ['decimal' => 'Actual TP Amount must be numeric.']],
+            'actual_tep_amt.*'         => ['label' => 'Actual TEP Amount', 'rules' => 'permit_empty|decimal', 'errors' => ['decimal' => 'Actual TEP Amount must be numeric.']],
+            'actual_bp_per.*'          => ['label' => 'Actual BP %', 'rules' => 'permit_empty|decimal', 'errors' => ['decimal' => 'Actual BP % must be numeric.']],
+            'actual_tp_per.*'          => ['label' => 'Actual TP %', 'rules' => 'permit_empty|decimal', 'errors' => ['decimal' => 'Actual TP % must be numeric.']],
+            'actual_tep_per.*'         => ['label' => 'Actual TEP %', 'rules' => 'permit_empty|decimal', 'errors' => ['decimal' => 'Actual TEP % must be numeric.']],
+            'actual_bp_brokerage_amt.*' => ['label' => 'BP Remuneration', 'rules' => 'permit_empty|decimal', 'errors' => ['decimal' => 'BP Remuneration must be numeric.']],
+            'actual_tp_brokerage_amt.*' => ['label' => 'TP Remuneration', 'rules' => 'permit_empty|decimal', 'errors' => ['decimal' => 'TP Remuneration must be numeric.']],
+            'actual_tep_brokerage_amt.*' => ['label' => 'TEP Remuneration', 'rules' => 'permit_empty|decimal', 'errors' => ['decimal' => 'TEP Remuneration must be numeric.']],
+            'exp_amt.*'                => ['label' => 'Expected Amount', 'rules' => 'permit_empty|decimal', 'errors' => ['decimal' => 'The Expected Amount field must contain a valid number.']]
+        ];
+
+        if (!$this->validate($rules)) {
+            return $this->response->setStatusCode(400)->setJSON([
+                'status' => false,
+                'message' => 'Input validation failed',
+                'code' => 400,
+                'errors' => $this->validator->getErrors()
+            ]);
+        }
+
+        $post_data = $post_data ? sanitizeInputArrayAdvanced($post_data) : [];
+
+        $this->myLogger->logme('error', 'Policy Trancaction form data : ' . json_encode($post_data));
+
+        $id = $post_data['id'] ?? null;
+        $data = $this->preparePolicyData();
+        $data['cd_ac_pk'] = $post_data['cd_ac_no'];
+        $data['issuer'] = 2;
+        $data['status'] = 'completed';
+        $this->myLogger->logme('error', 'Policy Trancaction modified form data ( insert data ) : ' . json_encode($data));
+
+
+        if (!$id) {
+            return $this->insertInceptionPolicy($data);
+        } else {
+            return $this->updateInceptionPolicy($id, $data);
+        }
+    }
+
+    private function preparePolicyData()
+    {
+        $request_data = $this->request->getPost();
+        $data = sanitizeInputArrayAdvanced($request_data);
+
+        $file_data = $this->request->getFiles() ?? null;
+        $data['file_data'] = $file_data ?? null;
+
+        $vehicle_file_data = $this->request->getFiles() ?? null;
+        $data['vehicle_file_data'] = $vehicle_file_data ?? null;
+
+        // print_r($data); die;
+
+        if (empty($data['policy_issue_date'])) {
+            $data['policy_issue_date'] = null;
+        }
+
+        if (empty($data['policy_start_date'])) {
+            $data['policy_start_date'] = null;
+        }
+
+        if (empty($data['policy_end_date'])) {
+            $data['policy_end_date'] = null;
+        }
+
+        if (empty($data['renewal_date'])) {
+            $data['renewal_date'] = null;
+        }
+
+        if (empty($data['rollover_date'])) {
+            $data['rollover_date'] = null;
+        }
+
+        if (empty($data['last_action_date'])) {
+            $data['last_action_date'] = null;
+        } else {
+            $data['last_action_date'] = change_date_format($data['last_action_date']);
+        }
+
+        // Separate Insurer and TPA Branch IDs and IDs
+        if (isset($data['insurer_id']) && !empty($data['insurer_id'])) {
+            list($data['insurer_branch_id'], $data['insurer_id']) = explode('-', $data['insurer_id']);
+            if (isset($data['tpa']) && !empty($data['tpa'])) {
+                list($data['tpa_branch_id'], $data['tpa_id']) = explode('-', $data['tpa']);
+            }
+        }
+
+        $data['tsi'] = generate_tsi_code($data['issue_type']);
+        $data['action_type'] = 'inception';
+
+        if (!isset($data['co_share'])) {
+            $data['co_share'] = 0;
+        } elseif ($data['co_share']) {
+            $data['co_share'] = 1;
+        }
+
+        // if (!isset($data['bro_payable_by'])) {
+        //     $data['bro_payable_by'] = 0;
+        // } elseif ($data['bro_payable_by']) {
+        //     $data['bro_payable_by'] = 1;
+        // }
+
+        if (!isset($data['same_as_proposer'])) {
+            $data['same_as_proposer'] = 0;
+        } elseif ($data['same_as_proposer']) {
+            $data['same_as_proposer'] = 1;
+        }
+
+        if (!isset($data['policy_with_corr'])) {
+            $data['policy_with_corr'] = 0;
+        } elseif ($data['policy_with_corr']) {
+            $data['policy_with_corr'] = 1;
+        }
+
+        $data['is_cd_reduce_from_bds'] = ($data['policy_type_id'] > 7 && $data['client_type'] == 1) ? 1 : 0;
+
+
+        if ($data['ct_type'] == "") {
+            $data['ct_type'] = 1;
+        }
+
+        // $month = '01-'.(string)$this->request->getPost('month');
+        // $data['month'] = empty($data['month']) ? null : date('Y-m-d', strtotime($month));    
+
+        // Determine $is_addon value
+        $data['is_addon'] = in_array($data['policy_type_id'], [1, 2, 6, 7]) ? 1 : (in_array($data['policy_type_id'], [4, 5]) ? 2 : ($data['policy_type_id'] == 3 && isset($data['base_policy']) ? 3 : 1));
+
+        // print_r($data); die;
+
+        return $data;
+    }
+
+    private function insertInceptionPolicy($data)
+    {
+        // print_r($data); die;
+
+        $insert = $this->policyTransactionModel->insert($data);
+
+        if ($insert) {
+
+            $this->insertTransactionStatus($insert, $data, 1);
+            $emp_data = $this->processInsertIndividualMemberInEmpTable($data);
+
+            if (isset($data['follow_insurer_id']) && !empty($data['follow_insurer_id'][0])) {
+
+                $pt_co_share_details = $this->insertOrUpdateCoShareDetails($data, $insert);
+
+                $client_policy_id = null;
+                if ($data['ct_type'] == 2) {
+                    $client_policy_insert_data = $this->prepareClientPolicyInsertData($data);
+                    $client_policy_id = $this->clientPolicyModel->insert($client_policy_insert_data);
+                    $this->policyTransactionModel->update($insert, ['client_policy_id' => $client_policy_id]);
+                    $emp_policy_insert = $this->InsertIndividualEmpPolicyTable($emp_data, $client_policy_id);
+                }
+
+                if ($data['client_type'] == 1 && $data['status'] == 'completed' && $data['is_cd_reduce_from_bds'] == 1) {
+                    $this->processCompletedStatus($data, $client_policy_id, $data['insurer_id'], $insert);
+                }
+            }
+
+            // policy file upload 
+            if(isset($data['doc_name']) && isset($data['file_data']) && !empty($data['doc_name']) && !empty($data['file_data'])){
+                $this->uploadFile($data['doc_name'], $data['file_data'], $insert);
+            }
+
+            // policy file upload 
+            if(
+                isset($data['other_docs_name']) && isset($data['vehicle_file_data']) && isset($data['client_id']) && isset($data['vehicle_id']) && 
+                !empty($data['other_docs_name']) && !empty($data['vehicle_file_data']) && !empty($data['client_id']) && !empty($data['vehicle_id'])
+            )
+            {
+                $vdd = [
+                    'other_docs_name' => $data['other_docs_name'],
+                    'file_data' => $data['vehicle_file_data'],
+                    'client_id' => $data['client_id'],
+                    'vehicle_id' => $data['vehicle_id'],
+                ];
+                $clientController = new ClientController();
+                $clientController->uploadVehicleFile($vdd);
+            }
+            
+
+            $client_data = $this->clientModel->where('id', $data['client_id'])->first();
+            $data['client_kyc'] = $this->clientKYCDocsModel->where('client_id',  $data['client_id'])->findAll();
+            
+            $clientController = new ClientController();
+            $data['client_kyc_primary_table']  =  $clientController->generateKycPrimaryTable($data['client_id']);
+            $data['client_kyc_other_table']  =  $clientController->generateKycOthersTable($data['client_id']);
+            // $data['client_kyc_single_table']  =  $clientController->generateKycSingleTable($data['client_id']);
+            $data['entity_type_id'] =  $client_data['entity_type_id'];
+
+            return $this->respondSuccess($insert, "Policy transaction created successfully", $data);
+        }
+
+        return $this->respondError("Failed to create policy transaction");
+    }
+
+    private function updateInceptionPolicy($id, $data)
+    {
+        // print_r($data); die;
+        $data['updated_by']  = get_session_userid();
+        $old_pt_data = $this->policyTransactionModel->where('is_active', 1)->where("id", $id)->first();
+        $old_pt_co_share_data = $this->PTCOShareDetailsModel->where('is_active', 1)->where("id", $id)->first();
+        if ($this->policyTransactionModel->update($id, $data)) {
+
+            $this->insertTransactionStatus($id, $data, 1);
+            $emp_data = $this->processInsertIndividualMemberInEmpTable($data);
+
+            if (isset($data['follow_insurer_id']) && !empty($data['follow_insurer_id'][0])) {
+
+                $this->insertOrUpdateCoShareDetails($data, $id);
+
+                if ($data['ct_type'] == 1) {
+                    $this->policyTransactionModel->update($id, ['client_policy_id' => $data['client_policy_id']]);
+                }
+
+                if (empty($data['client_policy_id']) || $data['client_policy_id'] == 0) {
+
+                    if ($data['ct_type'] == 2) {
+                        $client_policy_insert_data = $this->prepareClientPolicyInsertData($data);
+                        $client_policy_id = $this->clientPolicyModel->insert($client_policy_insert_data);
+                        $this->policyTransactionModel->update($id, ['client_policy_id' => $client_policy_id]);
+                        $this->InsertIndividualEmpPolicyTable($emp_data, $client_policy_id);
+                    }
+                } else {
+                    if (isset($data['emp_policy_id']) && !empty($data['emp_policy_id'][0])) {
+                        $this->InsertIndividualEmpPolicyTable($emp_data, $data['client_policy_id']);
+                    }
+                }
+
+                // if($old_pt_data['status'] != "completed"){
+                //     if ($data['status'] == 'completed' && $data['ct_type'] == 2) {
+                //         if ($data['client_type'] == 1 && $data['is_cd_reduce_from_bds'] == 1) {
+                //             $this->processCompletedStatus($data, $data['client_policy_id'], $data['insurer_id'], $id);
+                //         }
+                //     }
+                // }
+
+                $data['pt_co_share_details'] = $this->PTCOShareDetailsModel->where('pt_id', $id)->where('is_active', 1)->findAll();
+            }
+
+            if(isset($data['cd_amt_changed']) && !empty($data['cd_amt_changed'])){
+                $policy_data = $this->policyTransactionModel->where('is_active', 1)->where('id', $id)->first();
+                $this->cdCorrection($policy_data, $data['cd_amt_changed'], $id);
+            }
+
+            $client_data = $this->clientModel->where('id', $data['client_id'])->first();
+            $data['client_kyc']       = $this->clientKYCDocsModel->where('client_id',  $data['client_id'])->findAll();
+            
+            $clientController = new ClientController();
+            $data['client_kyc_primary_table']  =  $clientController->generateKycPrimaryTable($data['client_id']);
+            $data['client_kyc_other_table']  =  $clientController->generateKycOthersTable($data['client_id']);
+            // $data['client_kyc_single_table']  =  $clientController->generateKycSingleTable($data['client_id']);
+
+            $data['entity_type_id'] =  $client_data['entity_type_id'];
+
+            return $this->respondSuccess($id, "Policy transaction updated successfully", $data);
+        }
+
+        return $this->respondError("Failed to update policy transaction");
+    }
+
+    private function insertOrUpdateCoShareDetails($data, $pt_id)
+    {
+        // Prepare data for insertion and updating
+        $coShareDetails = [];
+        if (isset($data['co_share_id']) && !empty($data['co_share_id'])) {
+            $this->removePtCoShareRecords($data['co_share_id'], $pt_id);
+        }
+
+        if (isset($data['follow_insurer_id'])) {
+
+            foreach ($data['follow_insurer_id'] as $index => $insurer) {
+
+                // Separate the insurer and insurer branch
+                if (isset($insurer) && !empty($insurer)) {
+                    list($insurer_branch_id, $insurer_id) = explode('-', $insurer);
+                } else {
+                    $insurer_branch_id = null;
+                    $insurer_id = null;
+                }
+
+                if ($data['bro_payable_by'] == 1) {
+                    $cop_amt = isset($data['co_premium'][$index]) && ($data['co_premium'][$index] != "0.00" && !empty($data['co_premium'][$index])) ? $data['co_premium'][$index] : ($data['base_premium'][$index] ?? 0);
+                    // print_r($cop_amt);die();
+                } else {
+                    $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'] ?? 0) == 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' => $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,
+                    'bp_igst' => $data['igst'][$index] ?? 0,
+                    'bp_sgst' => $data['sgst'][$index] ?? 0,
+                    'bp_cgst' => $data['cgst'][$index] ?? 0,
+                    'tp_amt' => $data['tp_premium'][$index] ?? 0,
+                    'tep_amt' => $data['ter_premium'][$index] ?? 0,
+                    'cotp_amt' => $data['co_tp_premium'][$index] ?? 0,
+                    'cotep_amt' => $data['co_ter_premium'][$index] ?? 0,
+                    'agreed_amt' => $data['agreed_amount'][$index] ?? 0,
+                    'agreed_bp_per' => $data['agreed_bp'][$index] ?? 0,
+                    'agreed_tp_per' => $data['agreed_tp'][$index] ?? 0,
+                    'agreed_tep_per' => $data['agreed_ter'][$index] ?? 0,
+                    'standerd_bp_per' => $data['standard_bp'][$index] ?? 0,
+                    'standerd_tp_per' => $data['standard_tp'][$index] ?? 0,
+                    'standerd_tep_per' => $data['standard_ter'][$index] ?? 0,
+                    'actual_bp_amt' => $data['actual_bp_amt'][$index] ?? 0,
+                    'actual_tp_amt' => $data['actual_tp_amt'][$index] ?? 0,
+                    'actual_tep_amt' => $data['actual_tep_amt'][$index] ?? 0,
+                    'actual_bp_per' => $data['actual_bp_per'][$index] ?? 0,
+                    'actual_tp_per' => $data['actual_tp_per'][$index] ?? 0,
+                    'actual_tep_per' => $data['actual_tep_per'][$index] ?? 0,
+                    'actual_bp_brokerage_amt' => $data['actual_bp_brokerage_amt'][$index] ?? 0,
+                    'actual_tp_brokerage_amt' => $data['actual_tp_brokerage_amt'][$index] ?? 0,
+                    'actual_tep_brokerage_amt' => $data['actual_tep_brokerage_amt'][$index] ?? 0,
+                    'exp_amt' => isset($data['exp_amt'][$index]) && !empty($data['exp_amt'][$index]) ? $data['exp_amt'][$index] : expected_amount_calc($data, $index),
+                    'amount' => $data['total'][$index] ?? 0,
+                    'stamp_duty' => $data['stamp_duty'][$index] ?? 0,
+                    'cop_amt' => $cop_amt,
+                    'variance' => $data['variance'][$index] ?? 0,
+                    'reward' => $data['reward'][$index] ?? null,
+                    'created_by' => get_session_userid() ?? null,
+                    'updated_by' => get_session_userid() ?? null,
+                    '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,
+                ];
+            }
+
+            // print_r($pt_id); 
+            // print_r($coShareDetails); 
+            // die;
+
+            // Separate data into insert and update batches
+            $insertData = array_filter($coShareDetails, function ($detail) {
+                return empty($detail['id']); // Only insert new records
+            });
+
+            $updateData = array_filter($coShareDetails, function ($detail) {
+                return !empty($detail['id']); // Only update existing records
+            });
+
+            // Insert new records
+            if (!empty($insertData)) {
+                $this->PTCOShareDetailsModel->insertBatch($insertData);
+            }
+
+            // Update existing records
+            if (!empty($updateData)) {
+                $this->PTCOShareDetailsModel->updateBatch($updateData, 'id'); // Assuming 'id' is the unique identifier
+            }
+
+            // print_r($this->PTCOShareDetailsModel->getLastQuery()); die;
+            // print_r($coShareDetails); 
+            // die;
+
+            return true;
+        }
+
+        // print_r($data); 
+        // die;
+    }
+
+    private function prepareClientPolicyInsertData($data)
+    {
+        return [
+            'client_id' => $data['client_id'] ?? null,
+            'insurer_id' => $data['insurer_id'] ?? null,
+            'insurer_branch_id' => $data['insurer_branch_id'] ?? null,
+            'tpa_id' => $data['tpa_id'] ?? null,
+            'tpa_branch_id' => $data['tpa_branch_id'] ?? null,
+            'policy_type_id' => $data['policy_type_id'] ?? null,
+            'policy_start_date' => $data['policy_start_date'] ?? null,
+            'policy_end_date' => $data['policy_end_date'] ?? null,
+            'policy_status' => 1,
+            'is_addon' => $data['is_addon'] ?? null,
+            'base_policy' => $data['base_policy'] ?? 0,
+            'created_by' => get_session_userid(),
+            'policy_no' => $data['policy_no'] ?? null,
+            'client_branch_id' => $data['client_branch_id'] ?? 0,
+            'cd_ac_pk' => $data['cd_ac_no'] ?? null,
+            'gst' => 18,
+            'policy_entry_from' => 2,
+        ];
+    }
+
+    private function insertTransactionStatus($policyTranId, $data, $statusType)
+    {
+        $statusData = [
+            'policy_tran_id' => $policyTranId,
+            'status' => $data['status'],
+            'last_action_date' => $data['last_action_date'],
+            'status_type' => $statusType,
+            'created_by' => get_session_userid(),
+        ];
+        $this->policyTransactionStatusModel->insert($statusData);
+    }
+
+    private function processCompletedStatus($data, $client_policy_id, $insurer_id, $policyTranId)
+    {
+        $totalAmount = (int)$data['total'][0] ?? 0;
+        $description = 'The following amount of Rs. ' . $totalAmount . '/- has been debited for the ' . $data['emp_count'] . ' employees at Inception (BDS).';
+
+        $cdTransactionData = [
+            'amount' => $totalAmount,
+            'sub_type_id' => 4,
+            'client_id' => $data['client_id'],
+            'client_policy_id' => $client_policy_id ?? 0,
+            'endorsement_no' => null,
+            'cd_ac_no' => $data['cd_ac_no'] ?? null,
+            'insurer_id' => $insurer_id,
+            'description' => $description,
+            'transaction_type' => 'Debit',
+            'updated_by' => get_session_userid(),
+            'event_name' => 'inception',
+            'is_active' => 1,
+            'cd_ac_pk'  => $data['cd_ac_pk'],
+            'pt_id' => $policyTranId ?? null,
+        ];
+
+        $result = DepositHelper::saveDeposit($cdTransactionData, get_session_userid());
+
+        if(isset($result) && $result['success'] == true){
+            $update_data['ct_tran_id'] = $result['insert_id'];
+            $this->policyTransactionModel->where('id', $policyTranId)->set($update_data)->update();
+        }
+    }
+
+    private function cdCorrection($data, $amt, $policyTranId)
+    {
+        $totalAmount = (int)($amt ?? 0);
+        $description = 'The following amount of Rs. ' . $totalAmount . '/- has been debited towards the difference arising from the change in the BDS base premium.';
+
+        $cdTransactionData = [
+            'amount' => abs($totalAmount),
+            'sub_type_id' => 4,
+            'client_id' => $data['client_id'],
+            'client_policy_id' => $data['client_policy_id'] ?? 0,
+            'endorsement_no' => null,
+            'cd_ac_no' => $data['cd_ac_no'] ?? null,
+            'insurer_id' => $data['insurer_id'],
+            'description' => $description,
+            'transaction_type' => $totalAmount < 0 ? 'Credit' : 'Debit',
+            'updated_by' => get_session_userid(),
+            'event_name' => 'inception',
+            'is_active' => 1,
+            'cd_ac_pk'  => $data['cd_ac_pk'],
+            'pt_id' => $policyTranId ?? null,
+        ];
+
+        DepositHelper::saveDeposit($cdTransactionData, get_session_userid());
+    }
+
+    private function processInsertIndividualMemberInEmpTable($data)
+    {
+        // print_r($data);
+        if (isset($data['family_name']) && !empty($data['family_name'])) {
+
+            $emp_data = [];
+            $emp_ids = [];
+            $random_code = generateRandomCode(); // Generate random code once
+
+            foreach ($data['family_name'] as $index => $val) {
+
+                // Determine the gender based on the relationship
+                $relationship = $data['relationship'][$index] ?? '';
+                $gender = 'M'; // Default to Male
+
+                // Set gender based on relationship
+                if (in_array($relationship, ['Mother', 'Daughter', 'Mother in law', 'Spouse'])) {
+                    $gender = 'F';
+                }
+
+                $emp_data[] = [
+                    'client_id' => $data['client_id'] ?? 0,
+                    'client_branch_id' => $data['client_branch_id'] ?? 0,
+                    'name' => $val,
+                    'relationship' => $relationship,
+                    'gender' => $gender,
+                    'emp_status' => 'active',
+                    'created_by' => get_session_userid(),
+                    'emp_code' => $random_code, // Use the same random code for all
+                    'id' => $data['emp_id'][$index] ?? null
+                ];
+
+                $emp_ids[] = $data['emp_id'][$index] ?? 0;
+            }
+
+
+            // print_r($emp_data); die;
+
+            // Separate data into insert and update batches
+            $insertData = array_filter($emp_data, function ($detail) {
+                return empty($detail['id']); // Only insert new records
+            });
+
+            $updateData = array_filter($emp_data, function ($detail) {
+                return !empty($detail['id']); // Only update existing records
+            });
+
+            // Insert new records
+            if (!empty($insertData)) {
+                $this->employeeModel->insertBatch($insertData);
+            }
+
+            // Update existing records
+            if (!empty($updateData)) {
+                $this->employeeModel->updateBatch($updateData, 'id'); // Assuming 'id' is the unique identifier
+            }
+
+            return $emp_ids;
+        }
+    }
+
+    private function InsertIndividualEmpPolicyTable($emp_ids, $client_policy_id)
+    {
+        if (!empty($emp_ids)) {
+
+            $emp_policy_data = [];
+
+            foreach ($emp_ids as $index => $emp_id) {
+
+                $emp_policy_data[] = [
+                    'employee_id' => $emp_id ?? 0,
+                    'client_policy_id' => $client_policy_id ?? 0,
+                    'created_by' => get_session_userid(),
+                    'status' => 'active',
+                ];
+            }
+
+            // print_r($emp_policy_data); die;
+
+            // Insert new records
+            if (!empty($emp_policy_data)) {
+                $this->employeePolicyModel->insertBatch($emp_policy_data);
+            }
+
+
+            return true;
+        }
+    }
+
+    private function respondSuccess($id, $message, $data)
+    {
+        return $this->respond(['status' => true, 'pt_id' => $id, 'message' => $message, 'data' => $data], 200);
+    }
+
+    private function respondError($message)
+    {
+        return $this->respond(['status' => false, 'message' => $message], 200);
+    }
+    // policy Transaction Create function End
+
+    // Get the Single Inception Tranction data for edit
+    public function getInceptionDataForEdit($id)
+    {
+        $data = $this->policyTransactionModel
+            ->select('
+                        policy_transaction.*, 
+                        clients.short_name as client_short_name, 
+                        clients.client_type, 
+                        clients.entity_type_id, 
+                        policy_type.policy_type,
+                        client_policy.tpa_id as master_tpa_id,
+                        client_policy.tpa_branch_id as master_tpa_branch_id,
+                        client_policy.policy_type_id as master_policy_type_id,
+                        client_policy.is_addon,
+                        client_policy.base_policy,
+                        ( 
+                            select last_action_date
+                            from policy_transaction_status
+                            where policy_tran_id = policy_transaction.id
+                            and status = policy_transaction.status
+                            order by id desc
+                            limit 1
+
+                        ) as last_action_date
+                    ')
+            ->join('clients', 'clients.id = policy_transaction.client_id')
+            ->join('client_policy', 'policy_transaction.client_policy_id = client_policy.id', 'left')
+            ->join('policy_type', 'client_policy.policy_type_id = policy_type.id', 'left')
+            ->where('policy_transaction.id', $id)
+            ->where('policy_transaction.is_active', 1)
+            ->first();
+
+        $data['created_at'] = (isset($data['created_at']) && $data['created_at'] !== null && $data['created_at'] !== '')
+            ? date('d/m/Y h:i:s A', strtotime($data['created_at']))
+            : null;
+
+        $data['updated_at'] = (isset($data['updated_at']) && $data['updated_at'] !== null && $data['updated_at'] !== '')
+            ? date('d/m/Y h:i:s A', strtotime($data['updated_at']))
+            : null;
+
+
+        if (!empty($data['policy_issue_date'])) {
+            $data['policy_issue_date'] =  change_date_format($data['policy_issue_date'], 'Y-m-d', 'd/m/Y');
+        }
+
+        if (!empty($data['policy_start_date'])) {
+            $data['policy_start_date'] =  change_date_format($data['policy_start_date'], 'Y-m-d', 'd/m/Y');
+        }
+
+        if (!empty($data['policy_end_date'])) {
+            $data['policy_end_date'] =  change_date_format($data['policy_end_date'], 'Y-m-d', 'd/m/Y');
+        }
+
+        if (!empty($data['renewal_date'])) {
+            $data['renewal_date'] =  change_date_format($data['renewal_date'], 'Y-m-d', 'd/m/Y');
+        }
+
+        if (!empty($data['rollover_date'])) {
+            $data['rollover_date'] =  change_date_format($data['rollover_date'], 'Y-m-d', 'd/m/Y');
+        }
+
+        if (!empty($data['endorse_eff_date'])) {
+            $data['endorse_eff_date'] =  change_date_format($data['endorse_eff_date'], 'Y-m-d', 'd/m/Y');
+        }
+
+        if (!empty($data['last_action_date'])) {
+            $data['last_action_date'] =  change_date_format($data['last_action_date'], 'Y-m-d', 'd/m/Y');
+        }
+
+        if (!empty($data['month'])) {
+            $data['month'] =  change_date_format($data['month'], 'Y-m-d', 'M/Y');
+        } else {
+            $data['month'] = null;
+        }
+
+        // print_r($data); die;
+
+        $data['renewal_policy'] = $this->clientPolicyModel
+            ->select('client_policy.*, policy_type.policy_type')
+            ->join('policy_type', 'policy_type.id = client_policy.policy_type_id')
+            ->where('client_policy.client_id', $data['client_id'])
+            ->where('client_policy.client_branch_id', $data['client_branch_id'])
+            ->where('client_policy.is_active', 1)
+            ->findAll();
+
+        $data['base_policy_data'] = $this->clientPolicyModel
+            ->select('client_policy.*, policy_type.policy_type')
+            ->join('policy_type', 'policy_type.id = client_policy.policy_type_id')
+            ->where('client_policy.client_id', $data['client_id'])
+            ->where('client_policy.client_branch_id', $data['client_branch_id'])
+            ->whereIn('client_policy.policy_type_id', [2, 3])
+            ->where('client_policy.is_active', 1)
+            ->findAll();
+
+        $pt_bp_amt = $this->PTCOShareDetailsModel
+            ->select('bp_amt, amount')
+            ->where('pt_id', $id)
+            ->where('co_share_type', 1)
+            ->where('is_active', 1)
+            ->first();
+
+        // dd(db_connect()->getLastQuery() ,$pt_bp_amt);
+        $data['base_cd_amount'] = $pt_bp_amt['amount'] ?? null;
+
+
+        $ptFileQuery = $this->PTFileModel
+            ->join('policy_transaction', 'pt_files.pt_id = policy_transaction.id')
+            ->where('pt_files.pt_id', $id)
+            ->where('pt_files.is_active', 1);
+
+        if (!in_array(get_role_id(), [1, 5]) && empty(array_intersect(user_team(), [MANAGEMENT_TEAM_ID, FINANCE_TEAM_ID, BUSINESS_TEAM_ID]))) {
+
+            if (get_role_id() == 4 && in_array(POS_TEAM_ID, user_team())) {
+                $ptFileQuery->where('pt_files.created_by', get_session_userid());
+            }
+        }
+
+        $data['pt_files'] = $ptFileQuery->findAll();
+
+
+
+        $data['pt_co_share_details'] = $this->PTCOShareDetailsModel
+            ->select("
+                    pt_co_share_details.*,
+            
+                    (
+                        SELECT
+                            COUNT(*)
+                        FROM
+                            co_share_stmt_details
+                        WHERE
+                            co_share_stmt_details.co_share_id = pt_co_share_details.id
+                            AND co_share_stmt_details.is_active = 1
+                    ) AS record_count,
+
+                        (
+                            SELECT 
+                                SUM(actual_bp_amt) 
+                            FROM 
+                                co_share_stmt_details 
+                            WHERE 
+                                co_share_id = pt_co_share_details.id 
+                                AND is_active = 1
+                                
+                        ) AS actual_bp_amount,
+                        
+                        (
+                            SELECT 
+                                SUM(actual_tp_amt) 
+                            FROM 
+                                co_share_stmt_details 
+                            WHERE 
+                                co_share_id = pt_co_share_details.id 
+                                AND is_active = 1
+                                
+                        ) AS actual_tp_amount,
+                        
+                        (
+                            SELECT 
+                                SUM(actual_tep_amt) 
+                            FROM 
+                                co_share_stmt_details 
+                            WHERE 
+                                co_share_id = pt_co_share_details.id 
+                                AND is_active = 1
+                                
+                        ) AS actual_tep_amount,
+                        
+                        (
+                            SELECT 
+                                SUM(actual_bp_per) 
+                            FROM 
+                                co_share_stmt_details 
+                            WHERE 
+                                co_share_id = pt_co_share_details.id 
+                                AND is_active = 1
+                                
+                        ) AS actual_bp_percentage,
+                        
+                        (
+                            SELECT 
+                                SUM(actual_tp_per) 
+                            FROM 
+                                co_share_stmt_details 
+                            WHERE 
+                                co_share_id = pt_co_share_details.id 
+                                AND is_active = 1
+                                
+                        ) AS actual_tp_percentage,
+                        
+                        (
+                            SELECT 
+                                SUM(actual_tep_per) 
+                            FROM 
+                                co_share_stmt_details 
+                            WHERE 
+                                co_share_id = pt_co_share_details.id 
+                                AND is_active = 1
+                                
+                        ) AS actual_tep_percentage,
+                        
+                        
+                        (
+                            SELECT 
+                                SUM(actual_bp_brokerage_amt) 
+                            FROM 
+                                co_share_stmt_details 
+                            WHERE 
+                                co_share_id = pt_co_share_details.id 
+                                AND is_active = 1
+                                
+                        ) AS actual_bp_brokerage_amount,
+                        
+                        
+                        (
+                            SELECT 
+                                SUM(actual_tp_brokerage_amt) 
+                            FROM 
+                                co_share_stmt_details 
+                            WHERE 
+                                co_share_id = pt_co_share_details.id 
+                                AND is_active = 1
+                                
+                        ) AS actual_tp_brokerage_amount,
+                        
+                        
+                        (
+                            SELECT 
+                                SUM(actual_tep_brokerage_amt) 
+                            FROM 
+                                co_share_stmt_details 
+                            WHERE 
+                                co_share_id = pt_co_share_details.id 
+                                AND is_active = 1
+                                
+                        ) AS actual_tep_brokerage_amount,
+
+                        DATE_FORMAT(pt_policy_issue_date, '%d/%m/%Y') AS pt_policy_issue_date
+
+                ")
+            ->where('pt_id', $id)
+            ->where('is_active', 1)
+            ->orderBy('id', 'asc')
+            ->findAll();
+
+        $data['emp_data'] = $this->employeeModel
+            ->select('employees.*, employee_polices.id as emp_policy_id')
+            ->join('employee_polices', 'employees.id = employee_polices.employee_id', 'left')
+            ->where('employees.client_id', $data['client_id'])
+            ->where('employees.is_active', 1)->findAll();
+        // $data['client_kyc']   = $this->clientKYCDocsModel->where('client_id',  $data['client_id'])->findAll();
+
+        $clientController = new ClientController();
+        $data['client_kyc_primary_table']  =  $clientController->generateKycPrimaryTable($data['client_id']);
+        $data['client_kyc_other_table']  =  $clientController->generateKycOthersTable($data['client_id']);
+        $data['client_kyc_single_table']  =  $clientController->generateKycSingleTable($data['client_id']);
+        $data['client_kyc_dd_data']  = $clientController->fetch_dropdown($data['client_id']);
+
+        $data['vehicle_docs'] = $this->clientKYCDocsModel
+            ->where('client_id',  $data['client_id'])
+            ->where('vehicle_id', $data['vehicle_id'])
+            ->findAll();
+
+        // print_r( $data['pt_co_share_details']); die;
+        // return $data;
+        if ($data) {
+            return $this->respond(['status' => true, 'data' => $data], 200);
+        } else {
+            return $this->respond(['status' => false], 200);
+        }
+    }
+
+    // Get the Single Inception Tranction data for edit
+    public function getInceptionDataForEdit2($id)
+    {
+        $data = $this->policyTransactionModel
+            ->select('
+                        policy_transaction.*, 
+                        clients.short_name as client_short_name, 
+                        clients.client_type, 
+                        clients.entity_type_id, 
+                        policy_type.policy_type,
+                        client_policy.tpa_id as master_tpa_id,
+                        client_policy.tpa_branch_id as master_tpa_branch_id,
+                        client_policy.policy_type_id as master_policy_type_id,
+                        client_policy.is_addon,
+                        client_policy.base_policy,
+                        ( 
+                            select last_action_date
+                            from policy_transaction_status
+                            where policy_tran_id = policy_transaction.id
+                            and status = policy_transaction.status
+                            order by id desc
+                            limit 1
+
+                        ) as last_action_date
+                    ')
+            ->join('clients', 'clients.id = policy_transaction.client_id')
+            ->join('client_policy', 'policy_transaction.client_policy_id = client_policy.id', 'left')
+            ->join('policy_type', 'client_policy.policy_type_id = policy_type.id', 'left')
+            ->where('policy_transaction.id', $id)
+            ->where('policy_transaction.is_active', 1)
+            ->first();
+
+        $data['created_at'] = (isset($data['created_at']) && $data['created_at'] !== null && $data['created_at'] !== '')
+            ? date('d/m/Y h:i:s A', strtotime($data['created_at']))
+            : null;
+
+        $data['updated_at'] = (isset($data['updated_at']) && $data['updated_at'] !== null && $data['updated_at'] !== '')
+            ? date('d/m/Y h:i:s A', strtotime($data['updated_at']))
+            : null;
+
+
+        if (!empty($data['policy_issue_date'])) {
+            $data['policy_issue_date'] =  change_date_format($data['policy_issue_date'], 'Y-m-d', 'd/m/Y');
+        }
+
+        if (!empty($data['policy_start_date'])) {
+            $data['policy_start_date'] =  change_date_format($data['policy_start_date'], 'Y-m-d', 'd/m/Y');
+        }
+
+        if (!empty($data['policy_end_date'])) {
+            $data['policy_end_date'] =  change_date_format($data['policy_end_date'], 'Y-m-d', 'd/m/Y');
+        }
+
+        if (!empty($data['renewal_date'])) {
+            $data['renewal_date'] =  change_date_format($data['renewal_date'], 'Y-m-d', 'd/m/Y');
+        }
+
+        if (!empty($data['rollover_date'])) {
+            $data['rollover_date'] =  change_date_format($data['rollover_date'], 'Y-m-d', 'd/m/Y');
+        }
+
+        if (!empty($data['endorse_eff_date'])) {
+            $data['endorse_eff_date'] =  change_date_format($data['endorse_eff_date'], 'Y-m-d', 'd/m/Y');
+        }
+
+        if (!empty($data['last_action_date'])) {
+            $data['last_action_date'] =  change_date_format($data['last_action_date'], 'Y-m-d', 'd/m/Y');
+        }
+
+        if (!empty($data['month'])) {
+            $data['month'] =  change_date_format($data['month'], 'Y-m-d', 'M/Y');
+        } else {
+            $data['month'] = null;
+        }
+
+        // print_r($data); die;
+
+        $data['renewal_policy'] = $this->clientPolicyModel
+            ->select('client_policy.*, policy_type.policy_type')
+            ->join('policy_type', 'policy_type.id = client_policy.policy_type_id')
+            ->where('client_policy.client_id', $data['client_id'])
+            ->where('client_policy.client_branch_id', $data['client_branch_id'])
+            ->where('client_policy.is_active', 1)
+            ->findAll();
+
+        $data['base_policy_data'] = $this->clientPolicyModel
+            ->select('client_policy.*, policy_type.policy_type')
+            ->join('policy_type', 'policy_type.id = client_policy.policy_type_id')
+            ->where('client_policy.client_id', $data['client_id'])
+            ->where('client_policy.client_branch_id', $data['client_branch_id'])
+            ->whereIn('client_policy.policy_type_id', [2, 3])
+            ->where('client_policy.is_active', 1)
+            ->findAll();
+
+        $pt_bp_amt = $this->PTCOShareDetailsModel
+            ->select('bp_amt, amount')
+            ->where('pt_id', $id)
+            ->where('co_share_type', 1)
+            ->where('is_active', 1)
+            ->first();
+
+        // dd(db_connect()->getLastQuery() ,$pt_bp_amt);
+        $data['base_cd_amount'] = $pt_bp_amt['amount'] ?? null;
+
+
+        $ptFileQuery = $this->PTFileModel
+            ->join('policy_transaction', 'pt_files.pt_id = policy_transaction.id')
+            ->where('pt_files.pt_id', $id)
+            ->where('pt_files.is_active', 1);
+
+        if (!in_array(get_role_id(), [1, 5]) && empty(array_intersect(user_team(), [MANAGEMENT_TEAM_ID, FINANCE_TEAM_ID, BUSINESS_TEAM_ID]))) {
+
+            if (get_role_id() == 4 && in_array(POS_TEAM_ID, user_team())) {
+                $ptFileQuery->where('pt_files.created_by', get_session_userid());
+            }
+        }
+
+        $data['pt_files'] = $ptFileQuery->findAll();
+
+
+
+        $data['pt_co_share_details'] = $this->PTCOShareDetailsModel
+            ->select("
+                    pt_co_share_details.*,
+            
+                    (
+                        SELECT
+                            COUNT(*)
+                        FROM
+                            co_share_stmt_details
+                        WHERE
+                            co_share_stmt_details.co_share_id = pt_co_share_details.id
+                            AND co_share_stmt_details.is_active = 1
+                    ) AS record_count,
+
+                        (
+                            SELECT 
+                                SUM(actual_bp_amt) 
+                            FROM 
+                                co_share_stmt_details 
+                            WHERE 
+                                co_share_id = pt_co_share_details.id 
+                                AND is_active = 1
+                                
+                        ) AS actual_bp_amount,
+                        
+                        (
+                            SELECT 
+                                SUM(actual_tp_amt) 
+                            FROM 
+                                co_share_stmt_details 
+                            WHERE 
+                                co_share_id = pt_co_share_details.id 
+                                AND is_active = 1
+                                
+                        ) AS actual_tp_amount,
+                        
+                        (
+                            SELECT 
+                                SUM(actual_tep_amt) 
+                            FROM 
+                                co_share_stmt_details 
+                            WHERE 
+                                co_share_id = pt_co_share_details.id 
+                                AND is_active = 1
+                                
+                        ) AS actual_tep_amount,
+                        
+                        (
+                            SELECT 
+                                SUM(actual_bp_per) 
+                            FROM 
+                                co_share_stmt_details 
+                            WHERE 
+                                co_share_id = pt_co_share_details.id 
+                                AND is_active = 1
+                                
+                        ) AS actual_bp_percentage,
+                        
+                        (
+                            SELECT 
+                                SUM(actual_tp_per) 
+                            FROM 
+                                co_share_stmt_details 
+                            WHERE 
+                                co_share_id = pt_co_share_details.id 
+                                AND is_active = 1
+                                
+                        ) AS actual_tp_percentage,
+                        
+                        (
+                            SELECT 
+                                SUM(actual_tep_per) 
+                            FROM 
+                                co_share_stmt_details 
+                            WHERE 
+                                co_share_id = pt_co_share_details.id 
+                                AND is_active = 1
+                                
+                        ) AS actual_tep_percentage,
+                        
+                        
+                        (
+                            SELECT 
+                                SUM(actual_bp_brokerage_amt) 
+                            FROM 
+                                co_share_stmt_details 
+                            WHERE 
+                                co_share_id = pt_co_share_details.id 
+                                AND is_active = 1
+                                
+                        ) AS actual_bp_brokerage_amount,
+                        
+                        
+                        (
+                            SELECT 
+                                SUM(actual_tp_brokerage_amt) 
+                            FROM 
+                                co_share_stmt_details 
+                            WHERE 
+                                co_share_id = pt_co_share_details.id 
+                                AND is_active = 1
+                                
+                        ) AS actual_tp_brokerage_amount,
+                        
+                        
+                        (
+                            SELECT 
+                                SUM(actual_tep_brokerage_amt) 
+                            FROM 
+                                co_share_stmt_details 
+                            WHERE 
+                                co_share_id = pt_co_share_details.id 
+                                AND is_active = 1
+                                
+                        ) AS actual_tep_brokerage_amount,
+
+                        DATE_FORMAT(pt_policy_issue_date, '%d/%m/%Y') AS pt_policy_issue_date
+
+                ")
+            ->where('pt_id', $id)
+            ->where('is_active', 1)
+            ->orderBy('id', 'asc')
+            ->findAll();
+
+        $data['emp_data'] = $this->employeeModel
+            ->select('employees.*, employee_polices.id as emp_policy_id')
+            ->join('employee_polices', 'employees.id = employee_polices.employee_id', 'left')
+            ->where('employees.client_id', $data['client_id'])
+            ->where('employees.is_active', 1)->findAll();
+        // $data['client_kyc']   = $this->clientKYCDocsModel->where('client_id',  $data['client_id'])->findAll();
+
+        $clientController = new ClientController();
+        $data['client_kyc_primary_table']  =  $clientController->generateKycPrimaryTable($data['client_id']);
+        $data['client_kyc_other_table']  =  $clientController->generateKycOthersTable($data['client_id']);
+        $data['client_kyc_single_table']  =  $clientController->generateKycSingleTable($data['client_id']);
+        $data['client_kyc_dd_data']  = $clientController->fetch_dropdown($data['client_id']);
+
+        $data['vehicle_docs'] = $this->clientKYCDocsModel
+            ->where('client_id',  $data['client_id'])
+            ->where('vehicle_id', $data['vehicle_id'])
+            ->findAll();
+
+        // print_r( $data['pt_co_share_details']); die;
+        // return $data;
+        if ($data) {
+            return $this->respond(['status' => true, 'data' => $data], 200);
+        } else {
+            return $this->respond(['status' => false], 200);
+        }
+    }
+
+    public function removePolicyTransaction($id, $type = 0)
+    {   
+        if ($id) {
+            $data['is_active']  = 0;
+            $data['updated_by']  = get_session_userid();
+            $policy_transaction_data = $this->policyTransactionModel->where('id', $id)->first();
+            if($policy_transaction_data['policy_type_id'] > 7 && $type == 0){
+
+                $this->policyTransactionModel->where('id', $id)->set($data)->update();
+                $this->PTCOShareDetailsModel->where('pt_id', $id)->set($data)->update();
+                $this->clientPolicyModel->where('id', $policy_transaction_data['client_policy_id'])->set($data)->update();
+                $this->policyTransactionModel->where('client_policy_id', $policy_transaction_data['client_policy_id'])->set($data)->update();
+
+                $cd_transaction_model = new ClientDepositModel();
+                $cd_transaction_model->where('policy_transaction_id', $id)->set($data)->update();
+
+            }else{
+                $this->policyTransactionModel->where('id', $id)->set($data)->update();
+                $this->PTCOShareDetailsModel->where('pt_id', $id)->set($data)->update();
+                
+                $cd_transaction_model = new ClientDepositModel();
+                $cd_transaction_model->where('policy_transaction_id', $id)->set($data)->update();
+
+            }
+            return $this->respond(['status' => true, 'code' => 200, 'message' => 'Policy Transaction removed successfully'], 200);
+        } else {
+
+            return $this->respond(['status' => false, 'code' => 404, 'message' => 'Failed to remove policy transaction'], 200);
+        }
+    }
+
+    //function for soft delete for pt_co_share_details records
+    public function removePtCoShareRecords($primaryKeys, $pt_id)
+    {
+        if (empty($primaryKeys)) {
+            return false;
+        }
+
+        // Convert array to a comma-separated string of placeholders for query binding
+        $placeholders = implode(',', array_fill(0, count($primaryKeys), '?'));
+
+        // Prepare the query with proper binding
+        $sql = "UPDATE pt_co_share_details SET is_active = 0 WHERE pt_id = ? AND id NOT IN ($placeholders)";
+
+        // Merge pt_id with primary keys for binding
+        $params = array_merge([$pt_id], $primaryKeys);
+
+        // Execute the query with bound parameters
+        return db_connect()->query($sql, $params);
+    }
+
+
+    //------------------------------------------------------------------------------------------------
+
+    // Policy Transaction Endorsement
+    public function viewEndorsement()
+    {
+        // echo '
';
+        // !dd($this->getEndorsementDataForEdit(17));
+        $bds_edit_pt_id = $this->request->getGet('pt_id') ?? null;
+        $data['tab_name'] = 'Endorsement';
+        $data['page_name'] = 'Endorsement';
+        $data['issuer'] = [1 => 'JIBS', 2 => 'Nhance'];
+        $data['issuer_branch'] = $this->nhanceBranchModel->where('is_active', 1)->findAll();
+        $data['client_type'] = [1 => 'Group', 2 => 'Individual'];
+
+        $data['policy_status'] = [
+            'under_process' => 'Under Process',
+            'client_pending' => 'Client Pending',
+            'insurer_pending' => 'Insurer Pending',
+            'co_insurer_pending' => 'Co-Insurer Pending',
+            'tpa_pending' => 'TPA Pending',
+            'validated' => 'Validated',
+            'cancelled' => 'Cancelled',
+            'instalment_pending' => 'Instalment Pending',
+            'completed' => 'Completed',
+        ];
+
+        $data['invoice_status'] = [
+            'yet_to_generate' => 'Pending',
+            'generated' => 'Generated',
+            'send' => 'Sent',
+            'recived' => 'Payment Received',
+        ];
+
+        $data['action_type'] = [
+            'addition' => 'Addition',
+            'deletion' => 'Deletion',
+            'addition_deletion' => 'Addition & Deletion',
+            'si_enhancement' => 'SI Enhancement',
+            'combo_a_d_si' => 'Combo A, D & SI',
+            'correction' => 'Correction',
+            'baby_addition' => 'Baby Addition',
+            'policy_instalment' => 'Policy Instalment',
+            'addition_inception' => 'Addition-Inception',
+            'bds_correction' => 'BDS Correction',
+            'policy_correction' => 'Policy Correction',
+            'policy_cancellation' => 'Policy Cancellation',
+        ];
+
+        $data['date_type'] = [
+            'policy_issue_date' => 'Policy Issue Date',
+            'policy_start_date' => 'Policy Start Date',
+            'policy_end_date' => 'Policy End Date',
+        ];
+
+        //filter datas
+        $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');
+        $status = $this->request->getGet('status');
+
+        $start_date = (!isset($start_date) || $start_date === '' || $start_date === null) ? 0 : $start_date;
+        $end_date = (!isset($end_date) || $end_date === '' || $end_date === null) ? 0 : $end_date;
+
+        $client_id = (!isset($client_id) || $client_id === '' || $client_id === null) ? 0 : $client_id;
+        $insurer_id = (!isset($insurer_id) || $insurer_id === '' || $insurer_id === null) ? 0 : $insurer_id;
+        $policy_type_id = (!isset($policy_type_id) || $policy_type_id === '' || $policy_type_id === null) ? 0 : $policy_type_id;
+        $date_type = (!isset($date_type) || $date_type === '' || $date_type === null) ? 0 : $date_type;
+        $issuer = (!isset($issuer) || $issuer === '' || $issuer === null) ? 0 : $issuer;
+        $status = (!isset($issuer) || $status === '' || $status === null) ? 0 : $status;
+
+        if($bds_edit_pt_id == null){
+            $data['endorsement_data_list'] = $this->policyTransactionModel->getEndorsementTranctionListData($start_date, $end_date, $client_id, $insurer_id, $policy_type_id, $date_type, $issuer, $status);
+        }else{
+            $data['endorsement_data_list'] = [];
+        }
+        $data['client'] = $this->clientModel->where('is_active', 1)->findAll();
+        $data['policy_types'] = $this->policyTypeModel->where('is_active', 1)->findAll();
+
+        $data['insurer'] = $this->insurerModel->where('is_active', 1)->findAll();
+        // $data['tpa']           = $this->tpaModel->where('is_active', 1)->findAll();
+        $data['insurer_branch']      = $this->insurerBranchModel->getInsurerBranchesWithInsurerNames();
+        $data['tpa']           = $this->tpaBranchModel->getTpaBranchesWithTpaNames();
+        list($policyList, $policyListByClient) = $this->getPolicyForEndorsment();
+
+        $data['endorsementPolicies'] = $policyList;
+        $data['endorsementPolicyListByClient'] = $policyListByClient;
+
+        // dd($data);
+        // print_r($data['endorsementPolicies']);die();
+
+        $this->loadLayout('policy_transaction_endorsement_list', $data);
+    }
+
+    public function viewEndorsement2()
+    {
+        // echo '
';
+        // !dd($this->getEndorsementDataForEdit(17));
+        $bds_edit_pt_id = $this->request->getGet('pt_id') ?? null;
+        $data['tab_name'] = 'Endorsements';
+        $data['page_name'] = 'Endorsements';
+        $data['issuer'] = [1 => 'JIBS', 2 => 'Nhance'];
+        $data['issuer_branch'] = $this->nhanceBranchModel->where('is_active', 1)->findAll();
+        $data['client_type'] = [1 => 'Group', 2 => 'Individual'];
+
+        $data['policy_status'] = [
+            'under_process' => 'Under Process',
+            'client_pending' => 'Client Pending',
+            'insurer_pending' => 'Insurer Pending',
+            'co_insurer_pending' => 'Co-Insurer Pending',
+            'tpa_pending' => 'TPA Pending',
+            'validated' => 'Validated',
+            'cancelled' => 'Cancelled',
+            'instalment_pending' => 'Instalment Pending',
+            'completed' => 'Completed',
+        ];
+
+        $data['invoice_status'] = [
+            'yet_to_generate' => 'Pending',
+            'generated' => 'Generated',
+            'send' => 'Sent',
+            'recived' => 'Payment Received',
+        ];
+
+        $data['action_type'] = [
+            'addition' => 'Addition',
+            'deletion' => 'Deletion',
+            'addition_deletion' => 'Addition & Deletion',
+            'si_enhancement' => 'SI Enhancement',
+            'combo_a_d_si' => 'Combo A, D & SI',
+            'correction' => 'Correction',
+            'baby_addition' => 'Baby Addition',
+            'policy_instalment' => 'Policy Instalment',
+            'addition_inception' => 'Addition-Inception',
+            'bds_correction' => 'BDS Correction',
+            'policy_correction' => 'Policy Correction',
+            'policy_cancellation' => 'Policy Cancellation',
+        ];
+
+        $data['date_type'] = [
+            'policy_issue_date' => 'Policy Issue Date',
+            'policy_start_date' => 'Policy Start Date',
+            'policy_end_date' => 'Policy End Date',
+        ];
+
+        //filter datas
+        $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');
+        $status = $this->request->getGet('status');
+
+        $start_date = (!isset($start_date) || $start_date === '' || $start_date === null) ? 0 : $start_date;
+        $end_date = (!isset($end_date) || $end_date === '' || $end_date === null) ? 0 : $end_date;
+
+        $client_id = (!isset($client_id) || $client_id === '' || $client_id === null) ? 0 : $client_id;
+        $insurer_id = (!isset($insurer_id) || $insurer_id === '' || $insurer_id === null) ? 0 : $insurer_id;
+        $policy_type_id = (!isset($policy_type_id) || $policy_type_id === '' || $policy_type_id === null) ? 0 : $policy_type_id;
+        $date_type = (!isset($date_type) || $date_type === '' || $date_type === null) ? 0 : $date_type;
+        $issuer = (!isset($issuer) || $issuer === '' || $issuer === null) ? 0 : $issuer;
+        $status = (!isset($issuer) || $status === '' || $status === null) ? 0 : $status;
+
+        if($bds_edit_pt_id == null){
+            $data['endorsement_data_list'] = $this->policyTransactionModel->getEndorsementTranctionListData($start_date, $end_date, $client_id, $insurer_id, $policy_type_id, $date_type, $issuer, $status);
+        }else{
+            $data['endorsement_data_list'] = [];
+        }
+        $data['client'] = $this->clientModel->where('is_active', 1)->findAll();
+        $data['policy_types'] = $this->policyTypeModel->where('is_active', 1)->findAll();
+
+        $data['insurer'] = $this->insurerModel->where('is_active', 1)->findAll();
+        // $data['tpa']           = $this->tpaModel->where('is_active', 1)->findAll();
+        $data['insurer_branch']      = $this->insurerBranchModel->getInsurerBranchesWithInsurerNames();
+        $data['tpa']           = $this->tpaBranchModel->getTpaBranchesWithTpaNames();
+        list($policyList, $policyListByClient) = $this->getPolicyForEndorsment();
+
+        $data['endorsementPolicies'] = $policyList;
+        $data['endorsementPolicyListByClient'] = $policyListByClient;
+
+        // dd($data);
+        // print_r($data['endorsementPolicies']);die();
+
+        $this->loadLayout('policy_transaction_endorsement_list_2', $data);
+    }
+
+    public function createEndorsementPolicy()
+    {
+        // $id = $this->request->getPost('id');
+        $rules = [
+                // ==========================================
+                // 1. CLIENT SECTION
+                // ==========================================
+                'client_id' => [
+                    'label'  => 'Client',
+                    'rules'  => 'required',
+                    'errors' => ['required' => 'Client selection is mandatory.']
                 ],
-
-                'nhance_branch' => [
-                    'col_idx' => 1,
-                    'col_cell_name' => 'B',
-                    'col_name' => 'Nhance Branch',
-                    'is_mandatory' => true,
-                    'data_type' => '',
-                    'format' => null,
-                    'allowed_values' => null,
-                    'custom' => 'check_nhance_branch',
-                    'params' => ['row', 'nhance_branch_data']
+                'client_policy_id' => [
+                    'label'  => 'Policy',
+                    'rules'  => 'required',
+                    'errors' => ['required' => 'Please select the policy to endorse.']
                 ],
+                'client_type'      => ['rules' => 'permit_empty','errors' => []],
+                'client_branch_id' => ['rules' => 'permit_empty','errors' => []],
 
-                'vehicle_no' => [
-                    'col_idx' => 2,
-                    'col_cell_name' => 'C',
-                    'col_name' => 'Vehicle No',
-                    'is_mandatory' => true,
-                    'data_type' => 'vehicle',
-                    'format' => null,
-                    'allowed_values' => null,
-                    'custom' => 'check_rto_data',
-                    'params' => ['row', 'rto_master']
+                // ==========================================
+                // 2. ENDORSEMENT SECTION
+                // ==========================================
+                'action_type' => [
+                    'label'  => 'Endorsement Type',
+                    'rules'  => 'required',
+                    'errors' => ['required' => 'Select an Endorsement Type.']
                 ],
-
-                'vehicle_type' => [
-                    'col_idx' => 3,
-                    'col_cell_name' => 'D',
-                    'col_name' => 'Vehicle Type',
-                    'is_mandatory' => true,
-                    'data_type' => '',
-                    'format' => null,
-                    'allowed_values' => null,
-                    'custom' => 'check_vehicle_type',
-                    'params' => ['row', 'vehicle_type']
+                'endorsement_no' => ['label'  => 'Endorsement No','rules'  => 'permit_empty|regex_match[/^[a-zA-Z0-9\/_-]+$/]',
+                                        'errors' => [ 'regex_match' => 'Endorsement No can only contain letters, numbers, and symbols like / - or _' ]],
+                'data_received_date' => [
+                    'label'  => 'Data Received Date',
+                    'rules'  => 'required|valid_date[d/m/Y]',
+                    'errors' => ['required' => 'Data Received Date is required.', 'valid_date'  => 'Please provide a valid Data Received Date.']
                 ],
-
-                'policy_no' => [
-                    'col_idx' => 4,
-                    'col_cell_name' => 'E',
-                    'col_name' => 'Policy No',
-                    'is_mandatory' => true,
-                    'data_type' => '',
-                    'format' => null,
-                    'allowed_values' => null,
-                    'custom' => 'check_policy_no',
-                    'params' => ['row', 'pt_data']
-                ],
-
-                'insured_name' => [
-                    'col_idx' => 5,
-                    'col_cell_name' => 'F',
-                    'col_name' => 'Insured Name',
-                    'is_mandatory' => true,
-                    'data_type' => '',
-                    'format' => null,
-                    'allowed_values' => null,
-                    'custom' => null,
-                    'params' => null
-                ],
-
-                'insured_email' => [
-                    'col_idx' => 6,
-                    'col_cell_name' => 'G',
-                    'col_name' => 'Insured Email',
-                    'is_mandatory' => true,
-                    'data_type' => 'email',
-                    'format' => null,
-                    'allowed_values' => null,
-                    'custom' => null,
-                    'params' => null
-                ],
-
-                'insurer' => [
-                    'col_idx' => 7,
-                    'col_cell_name' => 'H',
-                    'col_name' => 'Insurer',
-                    'is_mandatory' => true,
-                    'data_type' => '',
-                    'format' => null,
-                    'allowed_values' => null,
-                    'custom' => 'check_insurer_exist',
-                    'params' => ['row', 'insurer_data']
-                ],
-
-                'insurer_branch' => [
-                    'col_idx' => 8,
-                    'col_cell_name' => 'I',
-                    'col_name' => 'Insurer Branch',
-                    'is_mandatory' => true,
-                    'data_type' => '',
-                    'format' => null,
-                    'allowed_values' => null,
-                    'custom' => 'check_insurer_branch_exist',
-                    'params' => ['row', 'insurer_branch_data', 'insurers']
-                ],
-
                 'policy_issue_date' => [
-                    'col_idx' => 9,
-                    'col_cell_name' => 'J',
-                    'col_name' => 'Policy Issue Date',
-                    'is_mandatory' => true,
-                    'data_type' => 'date',
-                    'format' => 'd/M/Y',
-                    'allowed_values' => null,
-                    'custom' => null,
-                    'params' => null
+                    'label'  => 'Endorsement Issue Date',
+                    'rules'  => 'required|valid_date[d/m/Y]',
+                    'errors' => ['required' => 'Endorsement Issue Date is required.', 'valid_date'  => 'Please provide a valid Endorsement Issue Date.']
                 ],
-
-                'policy_start_date' => [
-                    'col_idx' => 10,
-                    'col_cell_name' => 'K',
-                    'col_name' => 'Policy Start Date',
-                    'is_mandatory' => true,
-                    'data_type' => 'date',
-                    'format' => 'd/M/Y',
-                    'allowed_values' => null,
-                    'custom' => null,
-                    'params' => null
-                ],
-
-                'policy_end_date' => [
-                    'col_idx' => 11,
-                    'col_cell_name' => 'L',
-                    'col_name' => 'Policy End Date',
-                    'is_mandatory' => true,
-                    'data_type' => 'date',
-                    'format' => 'd/M/Y',
-                    'allowed_values' => null,
-                    'custom' => null,
-                    'params' => null
-                ],
-
-                'revenue_type' => [
-                    'col_idx' => 12,
-                    'col_cell_name' => 'M',
-                    'col_name' => 'Revenue Type',
-                    'is_mandatory' => true,
-                    'data_type' => '',
-                    'format' => null,
-                    'allowed_values' => ['NA', 'EA', 'EANR'],
-                    'custom' => null,
-                    'params' => null
-                ],
-
-                'sales_generated_by' => [
-                    'col_idx' => 13,
-                    'col_cell_name' => 'N',
-                    'col_name' => 'Sales Generated By',
-                    'is_mandatory' => true,
-                    'data_type' => '',
-                    'format' => null,
-                    'allowed_values' => null,
-                    'custom' => 'check_user_exist',
-                    'params' => ['row', 'col_key', 'user_data']
-                ],
-
-                'serviced_by' => [
-                    'col_idx' => 14,
-                    'col_cell_name' => 'O',
-                    'col_name' => 'Serviced By',
-                    'is_mandatory' => true,
-                    'data_type' => '',
-                    'format' => null,
-                    'allowed_values' => null,
-                    'custom' => 'check_user_exist',
-                    'params' => ['row', 'col_key', 'user_data']
-                ],
-
-                'agent_code' => [
-                    'col_idx' => 15,
-                    'col_cell_name' => 'P',
-                    'col_name' => 'Agent Code',
-                    'is_mandatory' => true,
-                    'data_type' => '',
-                    'format' => null,
-                    'allowed_values' => null,
-                    'custom' => 'check_agent_exist',
-                    'params' => ['row', 'pos_data']
-                ],
-
-                'base_premium' => [
-                    'col_idx' => 16,
-                    'col_cell_name' => 'Q',
-                    'col_name' => 'Base Premium',
-                    'is_mandatory' => false,
-                    'data_type' => '',
-                    'format' => null,
-                    'allowed_values' => null,
-                    'custom' => null,
-                    'params' => null
-                ],
-
-                'non_commission_premium_amount' => [
-                    'col_idx' => 17,
-                    'col_cell_name' => 'R',
-                    'col_name' => 'Non commission permium Amount',
-                    'is_mandatory' => false,
-                    'data_type' => '',
-                    'format' => null,
-                    'allowed_values' => null,
-                    'custom' => null,
-                    'params' => null
-                ],
-
-                'tp_premium' => [
-                    'col_idx' => 18,
-                    'col_cell_name' => 'S',
-                    'col_name' => 'TP Premium',
-                    'is_mandatory' => false,
-                    'data_type' => '',
-                    'format' => null,
-                    'allowed_values' => null,
-                    'custom' => null,
-                    'params' => null
-                ],
-
-                'igst' => [
-                    'col_idx' => 19,
-                    'col_cell_name' => 'T',
-                    'col_name' => 'IGST',
-                    'is_mandatory' => false,
-                    'data_type' => '',
-                    'format' => null,
-                    'allowed_values' => null,
-                    'custom' => 'check_gst_percentage',
-                    'params' => ['row']
-                ],
-
-                'cgst' => [
-                    'col_idx' => 20,
-                    'col_cell_name' => 'U',
-                    'col_name' => 'CGST',
-                    'is_mandatory' => false,
-                    'data_type' => '',
-                    'format' => null,
-                    'allowed_values' => null,
-                    'custom' => 'check_gst_percentage',
-                    'params' => ['row']
-                ],
-
-                'sgst' => [
-                    'col_idx' => 21,
-                    'col_cell_name' => 'V',
-                    'col_name' => 'SGST',
-                    'is_mandatory' => false,
-                    'data_type' => '',
-                    'format' => null,
-                    'allowed_values' => null,
-                    'custom' => 'check_gst_percentage',
-                    'params' => ['row']
-
-                ],
-
-                'stamp_duty' => [
-                    'col_idx' => 22,
-                    'col_cell_name' => 'W',
-                    'col_name' => 'Stamp Duty',
-                    'is_mandatory' => false,
-                    'data_type' => '',
-                    'format' => null,
-                    'allowed_values' => null,
-                    'custom' => null,
-                    'params' => null
-                ],
-
-                // 'total' => [
-                //     'col_idx' => 23,
-                //     'col_cell_name' => 'X',
-                //     'col_name' => 'Total',
-                //     'is_mandatory' => false,
-                //     'data_type' => '',
-                //     'format' => null,
-                //     'allowed_values' => null,
-                //     'custom' => null,
-                //     'params' => null
-                // ],
-
-                'agreed_amount' => [
-                    'col_idx' => 23,
-                    'col_cell_name' => 'X',
-                    'col_name' => 'Agreed Amount',
-                    'is_mandatory' => false,
-                    'data_type' => '',
-                    'format' => null,
-                    'allowed_values' => null,
-                    'custom' => null,
-                    'params' => null
-                ],
-
-                'agreed_bp_percentage' => [
-                    'col_idx' => 24,
-                    'col_cell_name' => 'Y',
-                    'col_name' => 'Agreed BP Percentage',
-                    'is_mandatory' => false,
-                    'data_type' => '',
-                    'format' => null,
-                    'allowed_values' => null,
-                    'custom' => null,
-                    'params' => null
-                ],
-
-                'agreed_tp_percentage' => [
-                    'col_idx' => 25,
-                    'col_cell_name' => 'Z',
-                    'col_name' => 'Agreed TP Percentage',
-                    'is_mandatory' => false,
-                    'data_type' => '',
-                    'format' => null,
-                    'allowed_values' => null,
-                    'custom' => null,
-                    'params' => null
-                ],
-
-                // 'actual_bp_amount' => [
-                //     'col_idx' => 27,
-                //     'col_cell_name' => 'AB',
-                //     'col_name' => 'Actual BP Amount',
-                //     'is_mandatory' => false,
-                //     'data_type' => '',
-                //     'format' => null,
-                //     'allowed_values' => null,
-                //     'custom' => null,
-                //     'params' => null
-                // ],
-
-                // 'actual_tp_amount' => [
-                //     'col_idx' => 28,
-                //     'col_cell_name' => 'AC',
-                //     'col_name' => 'Actual TP Amount',
-                //     'is_mandatory' => false,
-                //     'data_type' => '',
-                //     'format' => null,
-                //     'allowed_values' => null,
-                //     'custom' => null,
-                //     'params' => null
-                // ],
-
-                // 'actual_bp_percentage' => [
-                //     'col_idx' => 29,
-                //     'col_cell_name' => 'AD',
-                //     'col_name' => 'Actual BP Percentage',
-                //     'is_mandatory' => false,
-                //     'data_type' => '',
-                //     'format' => null,
-                //     'allowed_values' => null,
-                //     'custom' => null,
-                //     'params' => null
-                // ],
-
-                // 'actual_tp_percentage' => [
-                //     'col_idx' => 30,
-                //     'col_cell_name' => 'AE',
-                //     'col_name' => 'Actual TP Percentage',
-                //     'is_mandatory' => false,
-                //     'data_type' => '',
-                //     'format' => null,
-                //     'allowed_values' => null,
-                //     'custom' => null,
-                //     'params' => null
-                // ],
-
-                // 'actual_bp_brokerage_amount' => [
-                //     'col_idx' => 31,
-                //     'col_cell_name' => 'AF',
-                //     'col_name' => 'Actual BP Brokerage Amount',
-                //     'is_mandatory' => false,
-                //     'data_type' => '',
-                //     'format' => null,
-                //     'allowed_values' => null,
-                //     'custom' => null,
-                //     'params' => null
-                // ],
-
-                // 'actual_tp_brokerage_amount' => [
-                //     'col_idx' => 32,
-                //     'col_cell_name' => 'AG',
-                //     'col_name' => 'Actual TP Brokerage Amount',
-                //     'is_mandatory' => false,
-                //     'data_type' => '',
-                //     'format' => null,
-                //     'allowed_values' => null,
-                //     'custom' => null,
-                //     'params' => null
-                // ],
-
-                // 'expected_amount' => [
-                //     'col_idx' => 33,
-                //     'col_cell_name' => 'AH',
-                //     'col_name' => 'Expected Amount',
-                //     'is_mandatory' => true,
-                //     'data_type' => '',
-                //     'format' => null,
-                //     'allowed_values' => null,
-                //     'custom' => null,
-                //     'params' => null
-                // ],
-
-                // 'rewards' => [
-                //     'col_idx' => 34,
-                //     'col_cell_name' => 'AI',
-                //     'col_name' => 'Rewards',
-                //     'is_mandatory' => false,
-                //     'data_type' => '',
-                //     'format' => null,
-                //     'allowed_values' => null,
-                //     'custom' => null,
-                //     'params' => null
-                // ],
-
-            ];
-
-        }
-
-        // Policy Transaction Inception
-        public function viewInception()
-        {   
-            $bds_edit_pt_id = $this->request->getGet('pt_id') ?? null;
-            $data['tab_name']  = 'Policies';
-            $data['page_name'] = 'Policies';
-
-            // Static arrays for dropdowns
-            $data['issuer'] = [1 => 'JIBS', 2 => 'Nhance'];
-            $data['issuer_branch'] = $this->nhanceBranchModel->where('is_active', 1)->findAll();
-            $data['client_type'] = [1 => 'Group', 2 => 'Individual'];
-            $data['issuing_type'] = [1 => 'Fresh', 2 => 'Renewal', 3 => 'Roll Over'];
-            $data['policy_status'] = [
-                'under_process' => 'Under Process',
-                'client_pending' => 'Client Pending',
-                'insurer_pending' => 'Insurer Pending',
-                'co_insurer_pending' => 'Co-Insurer Pending',
-                'tpa_pending' => 'TPA Pending',
-                'validated' => 'Validated',
-                'cancelled' => 'Cancelled',
-                'instalment_pending' => 'Instalment Pending',
-                'completed' => 'Completed',
-                'lost' => 'Lost',
-            ];
-            $data['invoice_status_array'] = [
-                'yet_to_generate' => 'Pending',
-                'generated' => 'Generated',
-                'send' => 'Sent',
-                'recived' => 'Payment Received',
-            ];
-            // $data['vehicle_type'] = [
-            //     'two_wheeler' => 'Two Wheeler',
-            //     'four_wheeler' => 'Four Wheeler',
-            //     'truck' => 'Truck',
-            //     'bus' => 'Bus',
-            //     'van' => 'Van',
-            //     'suv' => 'SUV',
-            //     'motorcycle' => 'Motorcycle',
-            //     'bicycle' => 'Bicycle'
-            // ];
-            $data['vehicle_type'] = db_connect()->table('vehicle_type')->where('is_active', 1)->get()->getResultArray();
-            $data['rto_details'] = db_connect()->table('rto_master')->where('is_active', 1)->get()->getResultArray();
-
-            $data['vehicle_des'] = [
-                'commercial' => 'Commercial',
-                'private' => 'Private',
-            ];
-            $data['date_type'] = [
-                'policy_issue_date' => 'Policy Issue Date',
-                'policy_start_date' => 'Policy Start Date',
-                'policy_end_date' => 'Policy End Date',
-            ];
-
-            // Filter data
-            $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');
-            $status = $this->request->getGet('status');
-
-            // Handle null or empty values
-            $start_date = empty($start_date) ? 0 : $start_date;
-            $end_date = empty($end_date) ? 0 : $end_date;
-            $client_id = empty($client_id) ? 0 : $client_id;
-            $insurer_id = empty($insurer_id) ? 0 : $insurer_id;
-            $policy_type_id = empty($policy_type_id) ? 0 : $policy_type_id;
-            $date_type = empty($date_type) ? 0 : $date_type;
-            $issuer = empty($issuer) ? 0 : $issuer;
-            $status = empty($status) ? 0 : $status;  // Corrected from `$issuer`
-
-            if(empty($bds_edit_pt_id)){
-                if ($this->request->is('get')) {
-
-                    // Fetch inception data list
-                    $data['inception_data_list'] = $this->policyTransactionModel->getInceptionTranctionListData(
-                        $start_date,
-                        $end_date,
-                        $client_id,
-                        $insurer_id,
-                        $policy_type_id,
-                        $date_type,
-                        $issuer,
-                        $status
-                    );
-                } else {
-
-                    $ids = $this->request->getPost('ids');
-                    $ids = array_filter(explode(',', $ids));
-                    $data['inception_data_list'] = $this->policyTransactionModel->getInceptionTranctionListData(
-                        $start_date = 0,
-                        $end_date = 0,
-                        $client_id = 0,
-                        $insurer_id = 0,
-                        $policy_type_id = 0,
-                        $date_type = 0,
-                        $issuer = 0,
-                        $status = 0,
-                        $ids
-                    );
-                }
-            }else{
-                $data['inception_data_list'] = [];
-            }
-
-
-
-            // Fetch additional data
-            $data['client'] = $this->clientModel->where('is_active', 1)->findAll();
-            $data['client_branch'] = $this->clientBranchModel->where('is_active', 1)->findAll();
-            $data['policy_type'] = $this->policyTypeModel->where('is_active', 1)->findAll();
-            $data['insurer'] = $this->insurerModel->where('is_active', 1)->findAll();
-            $data['entity'] = $this->kycEntityTypeModel->where('is_active', 1)->findAll();
-            $data['policy_types'] = $this->policyTypeModel->where('is_active', 1)->findAll();
-            $data['insurer_branch'] = $this->insurerBranchModel->getInsurerBranchesWithInsurerNames();
-            $data['tpa'] = $this->tpaBranchModel->getTpaBranchesWithTpaNames();
-
-            // Fetch PP Teams Data
-            $data['ppTeamsData'] = $this->userModel
-                ->where('is_active', 1)
-                ->findAll();
-
-            // // Fetch Sales Team
-            // $data['salse_team'] = $this->userModel
-            //     ->select('user_profiles.*,nhance_branch.id as nhance_branch_id, nhance_branch.branch_name as nhance_branch_name')
-            //     ->join('user_teams', 'user_profiles.id = user_teams.user_id')
-            //     ->join('nhance_branch', 'user_profiles.nhance_branch_id = nhance_branch.id','left')
-            //     ->where('user_teams.team_id', 5)
-            //     ->where('user_teams.is_active', 1)
-            //     ->where('user_profiles.is_active', 1)
-            //     ->findAll();
-
-            // // Fetch Partner Agent
-            // $data['partner_agent'] = db_connect()->table('partner_agent')
-            //                                 ->where('is_active', 1)
-            //                                 ->get()
-            //                                 ->getResultArray();
-            
-            // // Fetch ACM
-            // $data['ACM'] = $this->userModel
-            //     ->where('role', 3)  // Assuming `role` is in `user_profiles`
-            //     ->where('is_active', 1)
-            //     ->findAll();
-
-            // Fetch Sales Team
-            $data['salse_team'] = $this->userModel
-                ->select('
-                    user_profiles.*,
-                    nhance_branch.id as nhance_branch_id, 
-                    nhance_branch.branch_name as nhance_branch_name,
-                    rm.first_name AS rm_name
-                ')
-                ->join('user_teams', 'user_profiles.id = user_teams.user_id')
-                ->join('nhance_branch', 'user_profiles.nhance_branch_id = nhance_branch.id','left')
-                ->join('user_profiles AS rm', 'user_profiles.rm_id = rm.id', 'left')
-                ->where('user_teams.team_id', 5)
-                ->where('user_teams.is_active', 1)
-                ->where('user_profiles.is_active', 1)
-                ->groupBy('user_profiles.id', 'asc')
-                ->findAll();
-
-            // Fetch Partner Agent
-            $data['partner_agent'] = db_connect()->table('partner_agent')
-                                            ->where('is_active', 1)
-                                            ->get()
-                                            ->getResultArray();
-            
-            // Fetch ACM
-            $data['ACM'] = $this->userModel
-                    ->select('
-                        user_profiles.*, 
-                        nhance_branch.id AS nhance_branch_id, 
-                        nhance_branch.branch_name AS nhance_branch_name, 
-                        rm.first_name AS rm_name
-                    ')
-                    ->join('user_teams', 'user_profiles.id = user_teams.user_id')
-                    ->join('nhance_branch', 'user_profiles.nhance_branch_id = nhance_branch.id', 'left')
-                    ->join('user_profiles AS rm', 'user_profiles.rm_id = rm.id', 'left')
-                    ->where('user_profiles.role', 3)  
-                    ->where('user_profiles.is_active', 1)
-                    ->groupBy('user_profiles.id', 'asc')
-                    ->findAll();
-            
-
-            // dd($data);
-            //Fetch POS
-            $data['pos_data'] = db_connect()->table('partner_pos')
-                                            ->where('is_active', 1)
-                                            ->get()
-                                            ->getResultArray();
-
-            // Load view
-            $this->loadLayout('policy_transaction_inception_list', $data);
-        }
-
-        public function viewInception2()
-        {   
-            $bds_edit_pt_id = $this->request->getGet('pt_id') ?? null;
-            $data['tab_name']  = 'Policies';
-            $data['page_name'] = 'Policies';
-
-            // Static arrays for dropdowns
-            $data['issuer'] = [1 => 'JIBS', 2 => 'Nhance'];
-            $data['issuer_branch'] = $this->nhanceBranchModel->where('is_active', 1)->findAll();
-            $data['client_type'] = [1 => 'Group', 2 => 'Individual'];
-            $data['issuing_type'] = [1 => 'Fresh', 2 => 'Renewal', 3 => 'Roll Over'];
-            $data['policy_status'] = [
-                'under_process' => 'Under Process',
-                'client_pending' => 'Client Pending',
-                'insurer_pending' => 'Insurer Pending',
-                'co_insurer_pending' => 'Co-Insurer Pending',
-                'tpa_pending' => 'TPA Pending',
-                'validated' => 'Validated',
-                'cancelled' => 'Cancelled',
-                'instalment_pending' => 'Instalment Pending',
-                'completed' => 'Completed',
-                'lost' => 'Lost',
-            ];
-            $data['invoice_status_array'] = [
-                'yet_to_generate' => 'Pending',
-                'generated' => 'Generated',
-                'send' => 'Sent',
-                'recived' => 'Payment Received',
-            ];
-            // $data['vehicle_type'] = [
-            //     'two_wheeler' => 'Two Wheeler',
-            //     'four_wheeler' => 'Four Wheeler',
-            //     'truck' => 'Truck',
-            //     'bus' => 'Bus',
-            //     'van' => 'Van',
-            //     'suv' => 'SUV',
-            //     'motorcycle' => 'Motorcycle',
-            //     'bicycle' => 'Bicycle'
-            // ];
-            $data['vehicle_type'] = db_connect()->table('vehicle_type')->where('is_active', 1)->get()->getResultArray();
-            $data['rto_details'] = db_connect()->table('rto_master')->where('is_active', 1)->get()->getResultArray();
-
-            $data['vehicle_des'] = [
-                'commercial' => 'Commercial',
-                'private' => 'Private',
-            ];
-            $data['date_type'] = [
-                'policy_issue_date' => 'Policy Issue Date',
-                'policy_start_date' => 'Policy Start Date',
-                'policy_end_date' => 'Policy End Date',
-            ];
-
-            // Filter data
-            $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');
-            $status = $this->request->getGet('status');
-
-            // Handle null or empty values
-            $start_date = empty($start_date) ? 0 : $start_date;
-            $end_date = empty($end_date) ? 0 : $end_date;
-            $client_id = empty($client_id) ? 0 : $client_id;
-            $insurer_id = empty($insurer_id) ? 0 : $insurer_id;
-            $policy_type_id = empty($policy_type_id) ? 0 : $policy_type_id;
-            $date_type = empty($date_type) ? 0 : $date_type;
-            $issuer = empty($issuer) ? 0 : $issuer;
-            $status = empty($status) ? 0 : $status;  // Corrected from `$issuer`
-
-            if(empty($bds_edit_pt_id)){
-                if ($this->request->is('get')) {
-
-                    // Fetch inception data list
-                    $data['inception_data_list'] = $this->policyTransactionModel->getInceptionTranctionListData(
-                        $start_date,
-                        $end_date,
-                        $client_id,
-                        $insurer_id,
-                        $policy_type_id,
-                        $date_type,
-                        $issuer,
-                        $status
-                    );
-                } else {
-
-                    $ids = $this->request->getPost('ids');
-                    $ids = array_filter(explode(',', $ids));
-                    $data['inception_data_list'] = $this->policyTransactionModel->getInceptionTranctionListData(
-                        $start_date = 0,
-                        $end_date = 0,
-                        $client_id = 0,
-                        $insurer_id = 0,
-                        $policy_type_id = 0,
-                        $date_type = 0,
-                        $issuer = 0,
-                        $status = 0,
-                        $ids
-                    );
-                }
-            }else{
-                $data['inception_data_list'] = [];
-            }
-
-
-
-            // Fetch additional data
-            $data['client'] = $this->clientModel->where('is_active', 1)->findAll();
-            $data['client_branch'] = $this->clientBranchModel->where('is_active', 1)->findAll();
-            $data['policy_type'] = $this->policyTypeModel->where('is_active', 1)->findAll();
-            $data['insurer'] = $this->insurerModel->where('is_active', 1)->findAll();
-            $data['entity'] = $this->kycEntityTypeModel->where('is_active', 1)->findAll();
-            $data['policy_types'] = $this->policyTypeModel->where('is_active', 1)->findAll();
-            $data['insurer_branch'] = $this->insurerBranchModel->getInsurerBranchesWithInsurerNames();
-            $data['tpa'] = $this->tpaBranchModel->getTpaBranchesWithTpaNames();
-
-            // Fetch PP Teams Data
-            $data['ppTeamsData'] = $this->userModel
-                ->where('is_active', 1)
-                ->findAll();
-
-            // Fetch Sales Team
-            $data['salse_team'] = $this->userModel
-                ->select('
-                    user_profiles.*,
-                    nhance_branch.id as nhance_branch_id, 
-                    nhance_branch.branch_name as nhance_branch_name,
-                    rm.first_name AS rm_name
-                ')
-                ->join('user_teams', 'user_profiles.id = user_teams.user_id')
-                ->join('nhance_branch', 'user_profiles.nhance_branch_id = nhance_branch.id','left')
-                ->join('user_profiles AS rm', 'user_profiles.rm_id = rm.id', 'left')
-                ->where('user_teams.team_id', 5)
-                ->where('user_teams.is_active', 1)
-                ->where('user_profiles.is_active', 1)
-                ->groupBy('user_profiles.id', 'asc')
-                ->findAll();
-
-            // Fetch Partner Agent
-            $data['partner_agent'] = db_connect()->table('partner_agent')
-                                            ->where('is_active', 1)
-                                            ->get()
-                                            ->getResultArray();
-            
-            // Fetch ACM
-            $data['ACM'] = $this->userModel
-                    ->select('
-                        user_profiles.*, 
-                        nhance_branch.id AS nhance_branch_id, 
-                        nhance_branch.branch_name AS nhance_branch_name, 
-                        rm.first_name AS rm_name
-                    ')
-                    ->join('user_teams', 'user_profiles.id = user_teams.user_id')
-                    ->join('nhance_branch', 'user_profiles.nhance_branch_id = nhance_branch.id', 'left')
-                    ->join('user_profiles AS rm', 'user_profiles.rm_id = rm.id', 'left')
-                    ->where('user_profiles.role', 3)  
-                    ->where('user_profiles.is_active', 1)
-                    ->groupBy('user_profiles.id', 'asc')
-                    ->findAll();
-
-                // echo '
';
-            
-            // print_r($data['ppTeamsData']); die;
-
-            // dd($data);
-
-            // Load view
-            $this->loadLayout('policy_transaction_inception_list_2', $data);
-        }
-
-        // policy Transaction Create function start
-        public function createInceptionPolicy()
-        {   
-            $post_data = $this->request->getPost();
-
-            $rules = [
                 // ==========================================
-                // 1. CLIENT SECTION (5 Fields)
+                // ENDORSEMENT SECTION
                 // ==========================================
-                'client_id'     => ['label'  => 'Client','rules'  => 'required','errors' => ['required' => 'Please select a Client.']],
-                'client_type'   => ['label'  => 'Client Type','rules'  => 'required','errors' => ['required' => 'Client Type must be selected.']],
-                'industry_type' => ['label'  => 'Industry','rules'  => 'permit_empty','errors' => []], // No errors needed for permit_empty unless adding other rules
-                'gst_no'        => ['label'  => 'GST Number','rules'  => 'permit_empty|regex_match[/^[0-9]{2}[A-Z]{5}[0-9]{4}[A-Z]{1}[1-9A-Z]{1}Z[0-9A-Z]{1}$/]','errors' => ['alpha_numeric' => 'GST Number should only contain letters and numbers.','regex_match' => 'Invalid GST format. (Example: 22AAAAA0000A1Z5)']],
-                'pan_no'        => ['label'  => 'PAN Number','rules'  => 'permit_empty|regex_match[/^[A-Z]{5}[0-9]{4}[A-Z]{1}$/]','errors' => ['alpha_numeric' => 'PAN Number should only contain letters and numbers.','regex_match' => 'Invalid PAN format. (Example: ABCDE1234F)']],
-                // ==========================================
-                // 2. PRE-SALES SECTION (3 Fields)
-                // ==========================================
-                'lead_source'       => ['label' => 'Lead Source', 'rules' => 'permit_empty', 'errors' => []],
-                'opportunity_id'    => ['label' => 'Opportunity', 'rules' => 'permit_empty', 'errors' => []],
-                'quotation_ref'     => ['label' => 'Quotation Ref', 'rules' => 'permit_empty', 'errors' => []],
+                'month' => [
+                    'label'  => 'Endorsement Issue Month',
+                    'rules'  => 'required',
+                    'errors' => ['required' => 'Endorsement Issue Month (MM/YYYY) is required.']
+                ],
+                'endorse_eff_date' => [
+                    'label'  => 'Endorsement Effective Date',
+                    'rules'  => 'permit_empty|valid_date[d/m/Y]',
+                    'errors' => ['valid_date'  => 'Please provide a valid Endorsement Effective Date.']
+                ],
+                'emp_count' => [
+                    'label'  => 'No of Insured',
+                    'rules'  => 'permit_empty|numeric',
+                    'errors' => ['numeric' => 'No of Insured must be a number.']
+                ],
+                'dependent_count' => [
+                    'label'  => 'No of Dependents',
+                    'rules'  => 'permit_empty|numeric',
+                    'errors' => ['numeric' => 'No of Dependents must be a number.']
+                ],
+                'last_action_date' => [
+                    'label'  => 'Latest Action Date',
+                    'rules'  => 'permit_empty|valid_date[d/m/Y]',
+                    'errors' => ['valid_date'  => 'Please provide a valid Latest Action Date.']
+                ],
+                'install_due_date' => [
+                    'label'  => 'Installment Due Date',
+                    'rules'  => 'permit_empty|valid_date[d/m/Y]',
+                    'errors' => ['valid_date'  => 'Please provide a valid Installment Due Date.']
+                ],
 
                 // ==========================================
-                // 3. POLICY DOCUMENT (2 Fields)
+                // PREMIUM DETAILS (ARRAY FIELDS .*)
                 // ==========================================
-                'policy_copy'       => ['label' => 'Policy Copy', 'rules' => 'permit_empty', 'errors' => []],
-                'proposal_form'     => ['label' => 'Proposal Form', 'rules' => 'permit_empty', 'errors' => []],
+                'follow_insurer_id.*' => [
+                    'label'  => 'Insurer',
+                    'rules'  => 'required',
+                    'errors' => ['required' => 'Please select an Insurer.']
+                ],
+                'calc_policy_issue_date.*' => [
+                    'label' => 'Premium Endorsement Issue Date', 
+                    'rules'  => 'required',
+                    'errors' => ['required' => 'Endorsement Issue Date is required.']
+                ],
+                'co_share_per.*' => [
+                    'label'  => 'Co-Share %',
+                    'rules'  => 'permit_empty|decimal',
+                    'errors' => ['decimal' => 'Co-Share % must be a valid decimal.']
+                ],
+                'base_premium.*' => [
+                    'label'  => 'Base Premium',
+                    'rules' => 'permit_empty|decimal','errors' => ['decimal'  => 'Base Premium must be a valid amount.']
+                ],
+                'total.*' => [
+                    'label'  => 'Total Premium',
+                    'rules'  => 'permit_empty|decimal',
+                    'errors' => ['decimal'  => 'Total Premium must be a valid amount.'],
+                ],
 
-                // ==========================================
-                // 4. VEHICLE DOCUMENT (2 Fields)
-                // ==========================================
-                'rc_copy'           => ['label' => 'RC Copy', 'rules' => 'permit_empty', 'errors' => []],
-                'inspection_report' => ['label' => 'Inspection Report', 'rules' => 'permit_empty', 'errors' => []],
+                // Decimal validation with Labels
+                'non_comm_per_amt.*' => [
+                    'label' => 'Non-Comm Premium',
+                    'rules' => 'permit_empty|decimal',
+                    'errors' => ['decimal' => 'Non-Comm Premium must be numeric.']
+                ],
+                'tp_premium.*' => [
+                    'label' => 'TP Premium',
+                    'rules' => 'permit_empty|decimal',
+                    'errors' => ['decimal' => 'TP Premium must be numeric.']
+                ],
+                'ter_premium.*' => [
+                    'label' => 'TEP Premium',
+                    'rules' => 'permit_empty|decimal',
+                    'errors' => ['decimal' => 'TEP Premium must be numeric.']
+                ],
+                'co_premium.*' => [
+                    'label' => 'Co-Premium',
+                    'rules' => 'permit_empty|decimal',
+                    'errors' => ['decimal' => 'Co-Premium must be numeric.']
+                ],
+                'co_tp_premium.*' => [
+                    'label' => 'Co-TP Premium',
+                    'rules' => 'permit_empty|decimal',
+                    'errors' => ['decimal' => 'Co-TP Premium must be numeric.']
+                ],
+                'co_ter_premium.*' => [
+                    'label' => 'Co-TEP Premium',
+                    'rules' => 'permit_empty|decimal',
+                    'errors' => ['decimal' => 'Co-TEP Premium must be numeric.']
+                ],
+                'cgst.*' => [
+                    'label' => 'CGST',
+                    'rules' => 'permit_empty|decimal',
+                    'errors' => ['decimal' => 'CGST must be numeric.']
+                ],
+                'sgst.*' => [
+                    'label' => 'SGST',
+                    'rules' => 'permit_empty|decimal',
+                    'errors' => ['decimal' => 'SGST must be numeric.']
+                ],
+                'igst.*' => [
+                    'label' => 'IGST',
+                    'rules' => 'permit_empty|decimal',
+                    'errors' => ['decimal' => 'IGST must be numeric.']
+                ],
+                'gst_amount.*' => [
+                    'label' => 'GST Amount',
+                    'rules' => 'permit_empty|decimal',
+                    'errors' => ['decimal' => 'GST Amount must be numeric.']
+                ],
+                'stamp_duty.*' => [
+                    'label' => 'Stamp Duty',
+                    'rules' => 'permit_empty|decimal',
+                    'errors' => ['decimal' => 'Stamp Duty must be numeric.']
+                ],
+                'agreed_bp.*' => [
+                    'label' => 'Agreed BP %',
+                    'rules' => 'permit_empty|decimal',
+                    'errors' => ['decimal' => 'Agreed BP % must be numeric.']
+                ],
+                'agreed_tp.*' => [
+                    'label' => 'Agreed TP %',
+                    'rules' => 'permit_empty|decimal',
+                    'errors' => ['decimal' => 'Agreed TP % must be numeric.']
+                ],
+                'agreed_ter.*' => [
+                    'label' => 'Agreed TEP %',
+                    'rules' => 'permit_empty|decimal',
+                    'errors' => ['decimal' => 'Agreed TEP % must be numeric.']
+                ],
+                'agreed_amount.*' => [
+                    'label' => 'Agreed Amount',
+                    'rules' => 'permit_empty|decimal',
+                    'errors' => ['decimal' => 'Agreed Amount must be numeric.']
+                ],
 
-                // ==========================================
-                // 5. SALES SECTION (12 Fields)
-                // ==========================================
-                'base_policy'        => ['label' => 'Base Policy', 'rules' => 'permit_empty','errors' => []],
-                'policy_no'          => ['label' => 'Policy Number', 'rules'  => 'required|regex_match[/^[a-zA-Z0-9\/_-]+$/]',
-                                        'errors' => [
-                                            'required'    => 'Policy Number is Must.',
-                                            'regex_match' => 'Policy Number can only contain letters, numbers, and symbols like / - or _'
-                                        ]],
-                'policy_issue_date'  => ['label' => 'Issue Date', 'rules'  => 'required|valid_date[Y-m-d]|regex_match[/^\d{4}-\d{2}-\d{2}$/]',
-                                        'errors' => [
-                                            'required'    => 'Policy Issue Date is required.',
-                                            'valid_date'  => 'Please provide a valid Policy Issue Date.',
-                                            'regex_match' => 'The Policy Issue Date format is incorrect. '
-                                        ]],
-                'month'              => ['label' => 'Issue Month', 'rules' => 'required','errors' => [
-                        'required' => 'Please select or enter the Policy Issue Month.'
-                    ]],
-                'policy_start_date'  => ['label' => 'D.O.C', 
-                            'rules'  => 'required|valid_date[Y-m-d]|regex_match[/^\d{4}-\d{2}-\d{2}$/]',
-                            'errors' => [
-                                'required'   => 'D.O.C (Start Date) is required.',
-                                'valid_date'  => 'Please provide a valid D.O.C date.',
-                                'regex_match' => 'The D.O.C date format is incorrect. '
-                ]],
-                'policy_end_date'    => ['label' => 'D.O.E', 'rules' => 'required|valid_date[Y-m-d]|regex_match[/^\d{4}-\d{2}-\d{2}$/]','errors' => [
-                        'required'   => 'D.O.E (Expiry Date) is required.',
-                        'valid_date'  => 'Please provide a valid D.O.E date.',
-                        'regex_match' => 'The D.O.E date format is incorrect. '
-                    ]],
-                'emp_count'          => ['label' => 'No of Insured', 'rules' => 'permit_empty|numeric','errors' => [
-                        'numeric' => 'No of Insured must contain only numbers.'
-                    ]],
-                'dependent_count'    => ['label' => 'No of Dependents', 'rules' => 'permit_empty|numeric','errors' => [
-                        'numeric' => 'No of Dependents must contain only numbers.'
-                    ]],
-                'installment'        => ['label' => 'Installment', 'rules' => 'permit_empty','errors' => []],
-                'installment_data'   => ['label' => 'Installment Data', 'rules' => 'permit_empty','errors' => []],
-                'co_share'           => ['label' => 'CoP Yes', 'rules' => 'permit_empty','errors' => []],
-                'bro_payable_by'     => ['label' => 'Remuneration Pay By', 'rules' => 'permit_empty','errors' => []],
-                'renewal_date'       => ['label' => 'Renewal Date', 'rules' => 'required|valid_date[Y-m-d]|regex_match[/^\d{4}-\d{2}-\d{2}$/]','errors' => [
-                        'required'   => 'Renewal Date is required.',
-                        'valid_date'  => 'Please provide a valid Renewal Date.',
-                        'regex_match' => 'The Renewal Date format is incorrect. '
-                    ]],
-                'sales_generated_by' => ['label' => 'Sales Generated By', 'rules' => 'permit_empty','errors' => [
-                        // 'required' => 'Please select the person who generated this sale.'
-                    ]],
-                'serviced_by'        => ['label' => 'Serviced By', 'rules' => 'permit_empty','errors' => [
-                        // 'required' => 'Please select the service person for this policy.'
-                    ]],
-                'pos_id'             => ['label' => 'POS', 'rules' => 'permit_empty','errors' => []],
-
-                    // ==========================================
-                    // 6. PREMIUM DETAILS (Array Fields - 25 Fields)
-                    // Use .* because these come from the dynamic table
-                    // ==========================================
-                    'follow_insurer_id.*'      => ['label' => 'Insurer', 'rules' => 'required','errors' => ['required' => 'Please select an Insurer.']],
-                    'co_share_type.*'          => ['label' => 'Is Leader', 'rules' => 'permit_empty','errors' => []],
-                    'cd_ac_no_for_child.*'     => ['label' => 'CD Acc No', 'rules' => 'permit_empty','errors' => []],
-                    'cd_current_balance.*'     => ['label' => 'CD Amount', 'rules' => 'permit_empty','errors' => []],
-                    'follower_policy_no.*'     => ['label' => 'Follower Policy No', 'rules' => 'permit_empty','errors' => []],
-                    'calc_policy_issue_date.*' => ['label' => 'Policy Issue Date', 'rules' => 'required','errors' => [ 'required' => 'Policy Issue Date is required' ]],
-                    'co_share_per.*'           => ['label' => 'Co-Share %', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Co-Share % must be a valid decimal.']],
-                    'non_comm_per_amt.*'       => ['label' => 'Non-Comm Premium', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Amount must be numeric.']],
-                    'base_premium.*'           => ['label' => 'Base Premium', 'rules' => 'permit_empty|regex_match[/^-?\d+(\.\d+)?$/]|differs[0]',
-                                                'errors' => [
-                                                    'regex_match' => 'Base Premium must be a valid positive or negative number.',
-                                                    'differs'     => 'Base Premium cannot be zero.'
-                                                ]],
-                    'tp_premium.*'             => ['label' => 'TP Premium', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'TP Premium must be numeric.']],
-                    'ter_premium.*'            => ['label' => 'TEP Premium', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'TEP Premium must be numeric.']],
-                    'co_premium.*'             => ['label' => 'Co-Premium', 'rules' => 'permit_empty|decimal','errors'=> ['decimal' => 'Co-Premium must be numeric.']],
-                    'co_tp_premium.*'          => ['label' => 'Co-TP Premium', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Co-TP Premium must be numeric.']],
-                    'co_ter_premium.*'         => ['label' => 'Co-TEP Premium', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Co-TEP Premium must be numeric.']],
-                    'cgst.*'                   => ['label' => 'CGST', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'CGST must be numeric.']],
-                    'sgst.*'                   => ['label' => 'SGST', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'SGST must be numeric.']],
-                    'igst.*'                   => ['label' => 'IGST', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'IGST must be numeric.']],
-                    'gst_amount.*'             => ['label' => 'GST Amount', 'rules'  => 'permit_empty|decimal|greater_than[0]','errors' => [
-                        'decimal'      => 'GST Amount must be a valid numeric value.',
-                        'greater_than' => 'GST Amount cannot be zero; please enter a value greater than 0.'
-                    ]],
-                    'stamp_duty.*'             => ['label' => 'Stamp Duty', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Stamp Duty must be numeric.']],
-                    'total.*'                  => ['label' => 'Total', 'rules' => 'permit_empty|decimal','errors' => ['decimal'  => 'Total must be a numeric value.']],
-                    'agreed_bp.*'              => ['label' => 'Agreed BP %', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Agreed BP % must be numeric.']],
-                    'agreed_tp.*'              => ['label' => 'Agreed TP %', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Agreed TP % must be numeric.']],
-                    'agreed_ter.*'             => ['label' => 'Agreed TEP %', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Agreed TEP % must be numeric.']],
-                    'agreed_amount.*'          => ['label' => 'Agreed Amount', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Agreed Amount must be numeric.']],
-                    'actual_bp_amt.*'          => ['label' => 'Actual BP Amount', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Actual BP Amount must be numeric.']],
-                    'actual_tp_amt.*'          => ['label' => 'Actual TP Amount', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Actual TP Amount must be numeric.']],
-                    'actual_tep_amt.*'         => ['label' => 'Actual TEP Amount', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Actual TEP Amount must be numeric.']],
-                    'actual_bp_per.*'          => ['label' => 'Actual BP %', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Actual BP % must be numeric.']],
-                    'actual_tp_per.*'          => ['label' => 'Actual TP %', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Actual TP % must be numeric.']],
-                    'actual_tep_per.*'         => ['label' => 'Actual TEP %', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'Actual TEP % must be numeric.']],
-                    'actual_bp_brokerage_amt.*'=> ['label' => 'BP Remuneration', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'BP Remuneration must be numeric.']],
-                    'actual_tp_brokerage_amt.*'=> ['label' => 'TP Remuneration', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'TP Remuneration must be numeric.']],
-                    'actual_tep_brokerage_amt.*'=>['label' => 'TEP Remuneration', 'rules' => 'permit_empty|decimal','errors' => ['decimal' => 'TEP Remuneration must be numeric.']],
-                    'exp_amt.*'                => ['label' => 'Expected Amount', 'rules' => 'permit_empty|decimal','errors' => ['decimal'=> 'The Expected Amount field must contain a valid number.']]
+                // Finance/Management Specific Labels
+                'actual_bp_amt.*' => [
+                    'label' => 'Actual BP Amount',
+                    'rules' => 'permit_empty|decimal',
+                    'errors' => ['decimal' => 'Actual BP Amount must be numeric.']
+                ],
+                'actual_tp_amt.*' => [
+                    'label' => 'Actual TP Amount',
+                    'rules' => 'permit_empty|decimal',
+                    'errors' => ['decimal' => 'Actual TP Amount must be numeric.']
+                ],
+                'actual_tep_amt.*' => [
+                    'label' => 'Actual TEP Amount',
+                    'rules' => 'permit_empty|decimal',
+                    'errors' => ['decimal' => 'Actual TEP Amount must be numeric.']
+                ],
+                'actual_bp_per.*' => [
+                    'label' => 'Actual BP %',
+                    'rules' => 'permit_empty|decimal',
+                    'errors' => ['decimal' => 'Actual BP % must be numeric.']
+                ],
+                'actual_tp_per.*' => [
+                    'label' => 'Actual TP %',
+                    'rules' => 'permit_empty|decimal',
+                    'errors' => ['decimal' => 'Actual TP % must be numeric.']
+                ],
+                'actual_tep_per.*' => [
+                    'label' => 'Actual TEP %',
+                    'rules' => 'permit_empty|decimal',
+                    'errors' => ['decimal' => 'Actual TEP % must be numeric.']
+                ],
+                'actual_bp_brokerage_amt.*' => [
+                    'label' => 'BP Remuneration',
+                    'rules' => 'permit_empty|decimal',
+                    'errors' => ['decimal' => 'BP Remuneration must be numeric.']
+                ],
+                'actual_tp_brokerage_amt.*' => [
+                    'label' => 'TP Remuneration',
+                    'rules' => 'permit_empty|decimal',
+                    'errors' => ['decimal' => 'TP Remuneration must be numeric.']
+                ],
+                'actual_tep_brokerage_amt.*' => [
+                    'label' => 'TEP Remuneration',
+                    'rules' => 'permit_empty|decimal',
+                    'errors' => ['decimal' => 'TEP Remuneration must be numeric.']
+                ],
+                'exp_amt.*' => [
+                    'label' => 'Expected Amount',
+                    'rules' => 'permit_empty|decimal',
+                    'errors' => ['decimal' => 'Expected Amount must be numeric.']
+                ],
+                'co_share_type.*'      => ['label' => 'Is Leader', 'rules' => 'permit_empty','errors' => []],
+                'follower_policy_no.*' => ['label' => 'Follower Policy No', 'rules' => 'permit_empty|regex_match[/^[a-zA-Z0-9 _-]+$/]','errors' => ['regex_match' => 'The {field} can only contain letters, numbers, spaces, dashes, and underscores.']],
+                'co_share_id.*'        => ['label' => 'Record ID', 'rules' => 'permit_empty','errors' => []],
+                'doc_name.*' => [
+                    'label'  => 'Policy Document Name',
+                    'rules'  => 'permit_empty|regex_match[/^[a-zA-Z0-9 _-]+$/]|min_length[2]|max_length[100]',
+                    'errors' => [
+                        'regex_match' => 'The {field} can only contain letters, numbers, spaces, dashes, and underscores.'
+                    ]
+                ],
             ];
 
             if (!$this->validate($rules)) {
@@ -1056,3007 +2644,1546 @@
                 ]);
             }
 
-            $post_data = $post_data ? sanitizeInputArrayAdvanced($post_data) : [];
+        $data = $this->preparePolicyTransactionData();
 
-            $this->myLogger->logme('error', 'Policy Trancaction form data : '. json_encode($post_data));
+        $id = (isset($data['id']) && !empty($data['id'])) ? $data['id'] : null;
 
-            $id = $post_data['id'] ?? null;
-            $data = $this->preparePolicyData();
-            $data['cd_ac_pk'] = $post_data['cd_ac_no'];
-            $data['issuer'] = 2;
-            $data['status'] = 'completed';
-            $this->myLogger->logme('error', 'Policy Trancaction modified form data ( insert data ) : '. json_encode($data));
+        $data['status'] = 'completed';
 
-
-            if (!$id) {
-                return $this->insertInceptionPolicy($data);
-            } else {
-                return $this->updateInceptionPolicy($id, $data);
-            }
+        if (!$id) {
+            return $this->insertEndorsementTransaction($data);
+        } else {
+            return $this->updateEndorsementTransaction($id, $data);
         }
 
-        private function preparePolicyData()
-        {
-            $request_data = $this->request->getPost();
-            $data = sanitizeInputArrayAdvanced($request_data);
+    }
 
-            $file_data = $this->request->getFiles() ?? null;
-            $data['file_data'] = $file_data ?? null;
+    private function preparePolicyTransactionData()
+    {
+        $request_post_data   = $this->request->getPost();
+        $data = sanitizeInputArrayAdvanced($request_post_data);
+        // echo '
';
+        // print_r($data); 
+        // die;
 
-            $vehicle_file_data = $this->request->getFiles() ?? null;
-            $data['vehicle_file_data'] = $vehicle_file_data ?? null;
+        $file_data = $this->request->getFiles() ?? null;
+        $data['file_data'] = $file_data ?? null;
 
-            // print_r($data); die;
-
-            if (empty($data['policy_issue_date'])) {
-                $data['policy_issue_date'] = null;
-            }
-
-            if (empty($data['policy_start_date'])) {
-                $data['policy_start_date'] = null;
-            }
-
-            if (empty($data['policy_end_date'])) {
-                $data['policy_end_date'] = null;
-            }
-
-            if (empty($data['renewal_date'])) {
-                $data['renewal_date'] = null;
-            }
-
-            if (empty($data['rollover_date'])) {
-                $data['rollover_date'] = null;
-            }
-
-            if (empty($data['last_action_date'])) {
-                $data['last_action_date'] = null;
-            } else {
-                $data['last_action_date'] = change_date_format($data['last_action_date']);
-            }
-
-            // Separate Insurer and TPA Branch IDs and IDs
-            if (isset($data['insurer_id']) && !empty($data['insurer_id'])) {
-                list($data['insurer_branch_id'], $data['insurer_id']) = explode('-', $data['insurer_id']);
-                if (isset($data['tpa']) && !empty($data['tpa'])) {
-                    list($data['tpa_branch_id'], $data['tpa_id']) = explode('-', $data['tpa']);
-                }
-            }
-
-            $data['tsi'] = generate_tsi_code($data['issue_type']);
-            $data['action_type'] = 'inception';
-
-            if (!isset($data['co_share'])) {
-                $data['co_share'] = 0;
-            } elseif ($data['co_share']) {
-                $data['co_share'] = 1;
-            }
-
-            // if (!isset($data['bro_payable_by'])) {
-            //     $data['bro_payable_by'] = 0;
-            // } elseif ($data['bro_payable_by']) {
-            //     $data['bro_payable_by'] = 1;
-            // }
-
-            if (!isset($data['same_as_proposer'])) {
-                $data['same_as_proposer'] = 0;
-            } elseif ($data['same_as_proposer']) {
-                $data['same_as_proposer'] = 1;
-            }
-
-            if (!isset($data['policy_with_corr'])) {
-                $data['policy_with_corr'] = 0;
-            } elseif ($data['policy_with_corr']) {
-                $data['policy_with_corr'] = 1;
-            }
-
-            $data['is_cd_reduce_from_bds'] = ($data['policy_type_id'] > 7 && $data['client_type'] == 1) ? 1 : 0;
-
-
-            if ($data['ct_type'] == "") {
-                $data['ct_type'] = 1;
-            }
-
-            // $month = '01-'.(string)$this->request->getPost('month');
-            // $data['month'] = empty($data['month']) ? null : date('Y-m-d', strtotime($month));    
-
-            // Determine $is_addon value
-            $data['is_addon'] = in_array($data['policy_type_id'], [1, 2, 6, 7]) ? 1 : (in_array($data['policy_type_id'], [4, 5]) ? 2 : ($data['policy_type_id'] == 3 && isset($data['base_policy']) ? 3 : 1));
-
-            // print_r($data); die;
-
-            return $data;
+        if (!isset($data['policy_with_corr'])) {
+            $data['policy_with_corr'] = 0;
+        } elseif ($data['policy_with_corr']) {
+            $data['policy_with_corr'] = 1;
         }
 
-        private function insertInceptionPolicy($data)
-        {
-            // print_r($data); die;
-
-            $insert = $this->policyTransactionModel->insert($data);
-
-            if ($insert) {
-
-                $this->insertTransactionStatus($insert, $data, 1);
-                $emp_data = $this->processInsertIndividualMemberInEmpTable($data);
-
-                if (isset($data['follow_insurer_id']) && !empty($data['follow_insurer_id'][0])) {
-
-                    $pt_co_share_details = $this->insertOrUpdateCoShareDetails($data, $insert);
-
-                    $client_policy_id = null;
-                    if ($data['ct_type'] == 2) {
-                        $client_policy_insert_data = $this->prepareClientPolicyInsertData($data);
-                        $client_policy_id = $this->clientPolicyModel->insert($client_policy_insert_data);
-                        $this->policyTransactionModel->update($insert, ['client_policy_id' => $client_policy_id]);
-                        $emp_policy_insert = $this->InsertIndividualEmpPolicyTable($emp_data, $client_policy_id);
-                    }
-
-                    if ($data['client_type'] == 1 && $data['status'] == 'completed' && $data['is_cd_reduce_from_bds'] == 1) {
-                        $this->processCompletedStatus($data, $client_policy_id, $data['insurer_id'], $insert);
-                    }
-                }
-
-                // policy file upload 
-                if(isset($data['doc_name']) && isset($data['file_data']) && !empty($data['doc_name']) && !empty($data['file_data'])){
-                    $this->uploadFile($data['doc_name'], $data['file_data'], $insert);
-                }
-
-                // policy file upload 
-                if(
-                    isset($data['other_docs_name']) && isset($data['vehicle_file_data']) && isset($data['client_id']) && isset($data['vehicle_id']) && 
-                    !empty($data['other_docs_name']) && !empty($data['vehicle_file_data']) && !empty($data['client_id']) && !empty($data['vehicle_id'])
-                )
-                {
-                    $vdd = [
-                        'other_docs_name' => $data['other_docs_name'],
-                        'file_data' => $data['vehicle_file_data'],
-                        'client_id' => $data['client_id'],
-                        'vehicle_id' => $data['vehicle_id'],
-                    ];
-                    $clientController = new ClientController();
-                    $clientController->uploadVehicleFile($vdd);
-                }
-                
-
-                $client_data = $this->clientModel->where('id', $data['client_id'])->first();
-                $data['client_kyc'] = $this->clientKYCDocsModel->where('client_id',  $data['client_id'])->findAll();
-                
-                $clientController = new ClientController();
-                $data['client_kyc_primary_table']  =  $clientController->generateKycPrimaryTable($data['client_id']);
-                $data['client_kyc_other_table']  =  $clientController->generateKycOthersTable($data['client_id']);
-                // $data['client_kyc_single_table']  =  $clientController->generateKycSingleTable($data['client_id']);
-                $data['entity_type_id'] =  $client_data['entity_type_id'];
-
-                return $this->respondSuccess($insert, "Policy transaction created successfully", $data);
-            }
-
-            return $this->respondError("Failed to create policy transaction");
-        }
-
-        private function updateInceptionPolicy($id, $data)
-        {
-            // print_r($data); die;
-            $data['updated_by']  = get_session_userid();
-            $old_pt_data = $this->policyTransactionModel->where('is_active', 1)->where("id", $id)->first();
-            $old_pt_co_share_data = $this->PTCOShareDetailsModel->where('is_active', 1)->where("id", $id)->first();
-            if ($this->policyTransactionModel->update($id, $data)) {
-
-                $this->insertTransactionStatus($id, $data, 1);
-                $emp_data = $this->processInsertIndividualMemberInEmpTable($data);
-
-                if (isset($data['follow_insurer_id']) && !empty($data['follow_insurer_id'][0])) {
-
-                    $this->insertOrUpdateCoShareDetails($data, $id);
-
-                    if ($data['ct_type'] == 1) {
-                        $this->policyTransactionModel->update($id, ['client_policy_id' => $data['client_policy_id']]);
-                    }
-
-                    if (empty($data['client_policy_id']) || $data['client_policy_id'] == 0) {
-
-                        if ($data['ct_type'] == 2) {
-                            $client_policy_insert_data = $this->prepareClientPolicyInsertData($data);
-                            $client_policy_id = $this->clientPolicyModel->insert($client_policy_insert_data);
-                            $this->policyTransactionModel->update($id, ['client_policy_id' => $client_policy_id]);
-                            $this->InsertIndividualEmpPolicyTable($emp_data, $client_policy_id);
-                        }
-                    } else {
-                        if (isset($data['emp_policy_id']) && !empty($data['emp_policy_id'][0])) {
-                            $this->InsertIndividualEmpPolicyTable($emp_data, $data['client_policy_id']);
-                        }
-                    }
-
-                    // if($old_pt_data['status'] != "completed"){
-                    //     if ($data['status'] == 'completed' && $data['ct_type'] == 2) {
-                    //         if ($data['client_type'] == 1 && $data['is_cd_reduce_from_bds'] == 1) {
-                    //             $this->processCompletedStatus($data, $data['client_policy_id'], $data['insurer_id'], $id);
-                    //         }
-                    //     }
-                    // }
-
-                    $data['pt_co_share_details'] = $this->PTCOShareDetailsModel->where('pt_id', $id)->where('is_active', 1)->findAll();
-                }
-
-                if(isset($data['cd_amt_changed']) && !empty($data['cd_amt_changed'])){
-                    $policy_data = $this->policyTransactionModel->where('is_active', 1)->where('id', $id)->first();
-                    $this->cdCorrection($policy_data, $data['cd_amt_changed'], $id);
-                }
-
-                $client_data = $this->clientModel->where('id', $data['client_id'])->first();
-                $data['client_kyc']       = $this->clientKYCDocsModel->where('client_id',  $data['client_id'])->findAll();
-                
-                $clientController = new ClientController();
-                $data['client_kyc_primary_table']  =  $clientController->generateKycPrimaryTable($data['client_id']);
-                $data['client_kyc_other_table']  =  $clientController->generateKycOthersTable($data['client_id']);
-                // $data['client_kyc_single_table']  =  $clientController->generateKycSingleTable($data['client_id']);
-
-                $data['entity_type_id'] =  $client_data['entity_type_id'];
-
-                return $this->respondSuccess($id, "Policy transaction updated successfully", $data);
-            }
-
-            return $this->respondError("Failed to update policy transaction");
-        }
-
-        private function insertOrUpdateCoShareDetails($data, $pt_id)
-        {
-            // Prepare data for insertion and updating
-            $coShareDetails = [];
-            if (isset($data['co_share_id']) && !empty($data['co_share_id'])) {
-                $this->removePtCoShareRecords($data['co_share_id'], $pt_id);
-            }
-
-            if (isset($data['follow_insurer_id'])) {
-
-                foreach ($data['follow_insurer_id'] as $index => $insurer) {
-
-                    // Separate the insurer and insurer branch
-                    if (isset($insurer) && !empty($insurer)) {
-                        list($insurer_branch_id, $insurer_id) = explode('-', $insurer);
-                    } else {
-                        $insurer_branch_id = null;
-                        $insurer_id = null;
-                    }
-
-                    if ($data['bro_payable_by'] == 1) {
-                        $cop_amt = isset($data['co_premium'][$index]) && ($data['co_premium'][$index] != "0.00" && !empty($data['co_premium'][$index])) ? $data['co_premium'][$index] : ($data['base_premium'][$index] ?? 0);
-                        // print_r($cop_amt);die();
-                    } else {
-                        $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'] ?? 0) == 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' => $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,
-                        'bp_igst' => $data['igst'][$index] ?? 0,
-                        'bp_sgst' => $data['sgst'][$index] ?? 0,
-                        'bp_cgst' => $data['cgst'][$index] ?? 0,
-                        'tp_amt' => $data['tp_premium'][$index] ?? 0,
-                        'tep_amt' => $data['ter_premium'][$index] ?? 0,
-                        'cotp_amt' => $data['co_tp_premium'][$index] ?? 0,
-                        'cotep_amt' => $data['co_ter_premium'][$index] ?? 0,
-                        'agreed_amt' => $data['agreed_amount'][$index] ?? 0,
-                        'agreed_bp_per' => $data['agreed_bp'][$index] ?? 0,
-                        'agreed_tp_per' => $data['agreed_tp'][$index] ?? 0,
-                        'agreed_tep_per' => $data['agreed_ter'][$index] ?? 0,
-                        'standerd_bp_per' => $data['standard_bp'][$index] ?? 0,
-                        'standerd_tp_per' => $data['standard_tp'][$index] ?? 0,
-                        'standerd_tep_per' => $data['standard_ter'][$index] ?? 0,
-                        'actual_bp_amt' => $data['actual_bp_amt'][$index] ?? 0,
-                        'actual_tp_amt' => $data['actual_tp_amt'][$index] ?? 0,
-                        'actual_tep_amt' => $data['actual_tep_amt'][$index] ?? 0,
-                        'actual_bp_per' => $data['actual_bp_per'][$index] ?? 0,
-                        'actual_tp_per' => $data['actual_tp_per'][$index] ?? 0,
-                        'actual_tep_per' => $data['actual_tep_per'][$index] ?? 0,
-                        'actual_bp_brokerage_amt' => $data['actual_bp_brokerage_amt'][$index] ?? 0,
-                        'actual_tp_brokerage_amt' => $data['actual_tp_brokerage_amt'][$index] ?? 0,
-                        'actual_tep_brokerage_amt' => $data['actual_tep_brokerage_amt'][$index] ?? 0,
-                        'exp_amt' => isset($data['exp_amt'][$index]) && !empty($data['exp_amt'][$index]) ? $data['exp_amt'][$index] : expected_amount_calc($data, $index),
-                        'amount' => $data['total'][$index] ?? 0,
-                        'stamp_duty' => $data['stamp_duty'][$index] ?? 0,
-                        'cop_amt' => $cop_amt,
-                        'variance' => $data['variance'][$index] ?? 0,
-                        'reward' => $data['reward'][$index] ?? null,
-                        'created_by' => get_session_userid() ?? null,
-                        'updated_by' => get_session_userid() ?? null,
-                        '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,
-                    ];
-                }
-
-                // print_r($pt_id); 
-                // print_r($coShareDetails); 
-                // die;
-
-                // Separate data into insert and update batches
-                $insertData = array_filter($coShareDetails, function ($detail) {
-                    return empty($detail['id']); // Only insert new records
-                });
-
-                $updateData = array_filter($coShareDetails, function ($detail) {
-                    return !empty($detail['id']); // Only update existing records
-                });
-
-                // Insert new records
-                if (!empty($insertData)) {
-                    $this->PTCOShareDetailsModel->insertBatch($insertData);
-                }
-
-                // Update existing records
-                if (!empty($updateData)) {
-                    $this->PTCOShareDetailsModel->updateBatch($updateData, 'id'); // Assuming 'id' is the unique identifier
-                }
-
-                // print_r($this->PTCOShareDetailsModel->getLastQuery()); die;
-                // print_r($coShareDetails); 
-                // die;
-
-                return true;
-            }
-
-            // print_r($data); 
-            // die;
-        }
-
-        private function prepareClientPolicyInsertData($data)
-        {
-            return [
-                'client_id' => $data['client_id'] ?? null,
-                'insurer_id' => $data['insurer_id'] ?? null,
-                'insurer_branch_id' => $data['insurer_branch_id'] ?? null,
-                'tpa_id' => $data['tpa_id'] ?? null,
-                'tpa_branch_id' => $data['tpa_branch_id'] ?? null,
-                'policy_type_id' => $data['policy_type_id'] ?? null,
-                'policy_start_date' => $data['policy_start_date'] ?? null,
-                'policy_end_date' => $data['policy_end_date'] ?? null,
-                'policy_status' => 1,
-                'is_addon' => $data['is_addon'] ?? null,
-                'base_policy' => $data['base_policy'] ?? 0,
-                'created_by' => get_session_userid(),
-                'policy_no' => $data['policy_no'] ?? null,
-                'client_branch_id' => $data['client_branch_id'] ?? 0,
-                'cd_ac_pk' => $data['cd_ac_no'] ?? null,
-                'gst' => 18,
-                'policy_entry_from' => 2,
-            ];
-        }
-
-        private function insertTransactionStatus($policyTranId, $data, $statusType)
-        {
-            $statusData = [
-                'policy_tran_id' => $policyTranId,
-                'status' => $data['status'],
-                'last_action_date' => $data['last_action_date'],
-                'status_type' => $statusType,
-                'created_by' => get_session_userid(),
-            ];
-            $this->policyTransactionStatusModel->insert($statusData);
-        }
-
-        private function processCompletedStatus($data, $client_policy_id, $insurer_id, $policyTranId)
-        {
-            $totalAmount = (int)$data['total'][0] ?? 0;
-            $description = 'The following amount of Rs. ' . $totalAmount . '/- has been debited for the ' . $data['emp_count'] . ' employees at Inception (BDS).';
-
-            $cdTransactionData = [
-                'amount' => $totalAmount,
-                'sub_type_id' => 4,
-                'client_id' => $data['client_id'],
-                'client_policy_id' => $client_policy_id ?? 0,
-                'endorsement_no' => null,
-                'cd_ac_no' => $data['cd_ac_no'] ?? null,
-                'insurer_id' => $insurer_id,
-                'description' => $description,
-                'transaction_type' => 'Debit',
-                'updated_by' => get_session_userid(),
-                'event_name' => 'inception',
-                'is_active' => 1,
-                'cd_ac_pk'  => $data['cd_ac_pk'],
-                'pt_id' => $policyTranId ?? null,
-            ];
-
-            $result = DepositHelper::saveDeposit($cdTransactionData, get_session_userid());
-
-            if(isset($result) && $result['success'] == true){
-                $update_data['ct_tran_id'] = $result['insert_id'];
-                $this->policyTransactionModel->where('id', $policyTranId)->set($update_data)->update();
-            }
-        }
-
-        private function cdCorrection($data, $amt, $policyTranId)
-        {
-            $totalAmount = (int)($amt ?? 0);
-            $description = 'The following amount of Rs. ' . $totalAmount . '/- has been debited towards the difference arising from the change in the BDS base premium.';
-
-            $cdTransactionData = [
-                'amount' => abs($totalAmount),
-                'sub_type_id' => 4,
-                'client_id' => $data['client_id'],
-                'client_policy_id' => $data['client_policy_id'] ?? 0,
-                'endorsement_no' => null,
-                'cd_ac_no' => $data['cd_ac_no'] ?? null,
-                'insurer_id' => $data['insurer_id'],
-                'description' => $description,
-                'transaction_type' => $totalAmount < 0 ? 'Credit' : 'Debit',
-                'updated_by' => get_session_userid(),
-                'event_name' => 'inception',
-                'is_active' => 1,
-                'cd_ac_pk'  => $data['cd_ac_pk'],
-                'pt_id' => $policyTranId ?? null,
-            ];
-
-            DepositHelper::saveDeposit($cdTransactionData, get_session_userid());
-        }
-
-        private function processInsertIndividualMemberInEmpTable($data)
-        {
-            // print_r($data);
-            if (isset($data['family_name']) && !empty($data['family_name'])) {
-
-                $emp_data = [];
-                $emp_ids = [];
-                $random_code = generateRandomCode(); // Generate random code once
-
-                foreach ($data['family_name'] as $index => $val) {
-
-                    // Determine the gender based on the relationship
-                    $relationship = $data['relationship'][$index] ?? '';
-                    $gender = 'M'; // Default to Male
-
-                    // Set gender based on relationship
-                    if (in_array($relationship, ['Mother', 'Daughter', 'Mother in law', 'Spouse'])) {
-                        $gender = 'F';
-                    }
-
-                    $emp_data[] = [
-                        'client_id' => $data['client_id'] ?? 0,
-                        'client_branch_id' => $data['client_branch_id'] ?? 0,
-                        'name' => $val,
-                        'relationship' => $relationship,
-                        'gender' => $gender,
-                        'emp_status' => 'active',
-                        'created_by' => get_session_userid(),
-                        'emp_code' => $random_code, // Use the same random code for all
-                        'id' => $data['emp_id'][$index] ?? null
-                    ];
-
-                    $emp_ids[] = $data['emp_id'][$index] ?? 0;
-                }
-
-
-                // print_r($emp_data); die;
-
-                // Separate data into insert and update batches
-                $insertData = array_filter($emp_data, function ($detail) {
-                    return empty($detail['id']); // Only insert new records
-                });
-
-                $updateData = array_filter($emp_data, function ($detail) {
-                    return !empty($detail['id']); // Only update existing records
-                });
-
-                // Insert new records
-                if (!empty($insertData)) {
-                    $this->employeeModel->insertBatch($insertData);
-                }
-
-                // Update existing records
-                if (!empty($updateData)) {
-                    $this->employeeModel->updateBatch($updateData, 'id'); // Assuming 'id' is the unique identifier
-                }
-
-                return $emp_ids;
-            }
-        }
-
-        private function InsertIndividualEmpPolicyTable($emp_ids, $client_policy_id)
-        {
-            if (!empty($emp_ids)) {
-
-                $emp_policy_data = [];
-
-                foreach ($emp_ids as $index => $emp_id) {
-
-                    $emp_policy_data[] = [
-                        'employee_id' => $emp_id ?? 0,
-                        'client_policy_id' => $client_policy_id ?? 0,
-                        'created_by' => get_session_userid(),
-                        'status' => 'active',
-                    ];
-                }
-
-                // print_r($emp_policy_data); die;
-
-                // Insert new records
-                if (!empty($emp_policy_data)) {
-                    $this->employeePolicyModel->insertBatch($emp_policy_data);
-                }
-
-
-                return true;
-            }
-        }
-
-        private function respondSuccess($id, $message, $data)
-        {
-            return $this->respond(['status' => true, 'pt_id' => $id, 'message' => $message, 'data' => $data], 200);
-        }
-
-        private function respondError($message)
-        {
-            return $this->respond(['status' => false, 'message' => $message], 200);
-        }
-        // policy Transaction Create function End
-
-        // Get the Single Inception Tranction data for edit
-        public function getInceptionDataForEdit($id)
-        {
-            $data = $this->policyTransactionModel
-                ->select('
-                            policy_transaction.*, 
-                            clients.short_name as client_short_name, 
-                            clients.client_type, 
-                            clients.entity_type_id, 
-                            policy_type.policy_type,
-                            client_policy.tpa_id as master_tpa_id,
-                            client_policy.tpa_branch_id as master_tpa_branch_id,
-                            client_policy.policy_type_id as master_policy_type_id,
-                            client_policy.is_addon,
-                            client_policy.base_policy,
-                            ( 
-                                select last_action_date
-                                from policy_transaction_status
-                                where policy_tran_id = policy_transaction.id
-                                and status = policy_transaction.status
-                                order by id desc
-                                limit 1
-
-                            ) as last_action_date
-                        ')
-                ->join('clients', 'clients.id = policy_transaction.client_id')
-                ->join('client_policy', 'policy_transaction.client_policy_id = client_policy.id', 'left')
-                ->join('policy_type', 'client_policy.policy_type_id = policy_type.id', 'left')
-                ->where('policy_transaction.id', $id)
-                ->where('policy_transaction.is_active', 1)
-                ->first();
-
-            $data['created_at'] = (isset($data['created_at']) && $data['created_at'] !== null && $data['created_at'] !== '')
-                ? date('d/m/Y h:i:s A', strtotime($data['created_at']))
-                : null;
-
-            $data['updated_at'] = (isset($data['updated_at']) && $data['updated_at'] !== null && $data['updated_at'] !== '')
-                ? date('d/m/Y h:i:s A', strtotime($data['updated_at']))
-                : null;
-
-
-            if (!empty($data['policy_issue_date'])) {
-                $data['policy_issue_date'] =  change_date_format($data['policy_issue_date'], 'Y-m-d', 'd/m/Y');
-            }
-
-            if (!empty($data['policy_start_date'])) {
-                $data['policy_start_date'] =  change_date_format($data['policy_start_date'], 'Y-m-d', 'd/m/Y');
-            }
-
-            if (!empty($data['policy_end_date'])) {
-                $data['policy_end_date'] =  change_date_format($data['policy_end_date'], 'Y-m-d', 'd/m/Y');
-            }
-
-            if (!empty($data['renewal_date'])) {
-                $data['renewal_date'] =  change_date_format($data['renewal_date'], 'Y-m-d', 'd/m/Y');
-            }
-
-            if (!empty($data['rollover_date'])) {
-                $data['rollover_date'] =  change_date_format($data['rollover_date'], 'Y-m-d', 'd/m/Y');
-            }
-
-            if (!empty($data['endorse_eff_date'])) {
-                $data['endorse_eff_date'] =  change_date_format($data['endorse_eff_date'], 'Y-m-d', 'd/m/Y');
-            }
-
-            if (!empty($data['last_action_date'])) {
-                $data['last_action_date'] =  change_date_format($data['last_action_date'], 'Y-m-d', 'd/m/Y');
-            }
-
-            if (!empty($data['month'])) {
-                $data['month'] =  change_date_format($data['month'], 'Y-m-d', 'M/Y');
-            } else {
-                $data['month'] = null;
-            }
-
-            // print_r($data); die;
-
-            $data['renewal_policy'] = $this->clientPolicyModel
-                ->select('client_policy.*, policy_type.policy_type')
-                ->join('policy_type', 'policy_type.id = client_policy.policy_type_id')
-                ->where('client_policy.client_id', $data['client_id'])
-                ->where('client_policy.client_branch_id', $data['client_branch_id'])
-                ->where('client_policy.is_active', 1)
-                ->findAll();
-
-            $data['base_policy_data'] = $this->clientPolicyModel
-                ->select('client_policy.*, policy_type.policy_type')
-                ->join('policy_type', 'policy_type.id = client_policy.policy_type_id')
-                ->where('client_policy.client_id', $data['client_id'])
-                ->where('client_policy.client_branch_id', $data['client_branch_id'])
-                ->whereIn('client_policy.policy_type_id', [2, 3])
-                ->where('client_policy.is_active', 1)
-                ->findAll();
-
-            $pt_bp_amt = $this->PTCOShareDetailsModel
-                ->select('bp_amt, amount')
-                ->where('pt_id', $id)
-                ->where('co_share_type', 1)
-                ->where('is_active', 1)
-                ->first();
-
-            // dd(db_connect()->getLastQuery() ,$pt_bp_amt);
-            $data['base_cd_amount'] = $pt_bp_amt['amount'] ?? null;
-
-
-            $ptFileQuery = $this->PTFileModel
-                ->join('policy_transaction', 'pt_files.pt_id = policy_transaction.id')
-                ->where('pt_files.pt_id', $id)
-                ->where('pt_files.is_active', 1);
-
-            if (!in_array(get_role_id(), [1, 5]) && empty(array_intersect(user_team(), [MANAGEMENT_TEAM_ID, FINANCE_TEAM_ID, BUSINESS_TEAM_ID]))) {
-
-                if (get_role_id() == 4 && in_array(POS_TEAM_ID, user_team())) {
-                    $ptFileQuery->where('pt_files.created_by', get_session_userid());
-                }
-            }
-
-            $data['pt_files'] = $ptFileQuery->findAll();
-
-
-
-            $data['pt_co_share_details'] = $this->PTCOShareDetailsModel
-                ->select("
-                        pt_co_share_details.*,
-                
-                        (
-                            SELECT
-                                COUNT(*)
-                            FROM
-                                co_share_stmt_details
-                            WHERE
-                                co_share_stmt_details.co_share_id = pt_co_share_details.id
-                                AND co_share_stmt_details.is_active = 1
-                        ) AS record_count,
-
-                            (
-                                SELECT 
-                                    SUM(actual_bp_amt) 
-                                FROM 
-                                    co_share_stmt_details 
-                                WHERE 
-                                    co_share_id = pt_co_share_details.id 
-                                    AND is_active = 1
-                                    
-                            ) AS actual_bp_amount,
-                            
-                            (
-                                SELECT 
-                                    SUM(actual_tp_amt) 
-                                FROM 
-                                    co_share_stmt_details 
-                                WHERE 
-                                    co_share_id = pt_co_share_details.id 
-                                    AND is_active = 1
-                                    
-                            ) AS actual_tp_amount,
-                            
-                            (
-                                SELECT 
-                                    SUM(actual_tep_amt) 
-                                FROM 
-                                    co_share_stmt_details 
-                                WHERE 
-                                    co_share_id = pt_co_share_details.id 
-                                    AND is_active = 1
-                                    
-                            ) AS actual_tep_amount,
-                            
-                            (
-                                SELECT 
-                                    SUM(actual_bp_per) 
-                                FROM 
-                                    co_share_stmt_details 
-                                WHERE 
-                                    co_share_id = pt_co_share_details.id 
-                                    AND is_active = 1
-                                    
-                            ) AS actual_bp_percentage,
-                            
-                            (
-                                SELECT 
-                                    SUM(actual_tp_per) 
-                                FROM 
-                                    co_share_stmt_details 
-                                WHERE 
-                                    co_share_id = pt_co_share_details.id 
-                                    AND is_active = 1
-                                    
-                            ) AS actual_tp_percentage,
-                            
-                            (
-                                SELECT 
-                                    SUM(actual_tep_per) 
-                                FROM 
-                                    co_share_stmt_details 
-                                WHERE 
-                                    co_share_id = pt_co_share_details.id 
-                                    AND is_active = 1
-                                    
-                            ) AS actual_tep_percentage,
-                            
-                            
-                            (
-                                SELECT 
-                                    SUM(actual_bp_brokerage_amt) 
-                                FROM 
-                                    co_share_stmt_details 
-                                WHERE 
-                                    co_share_id = pt_co_share_details.id 
-                                    AND is_active = 1
-                                    
-                            ) AS actual_bp_brokerage_amount,
-                            
-                            
-                            (
-                                SELECT 
-                                    SUM(actual_tp_brokerage_amt) 
-                                FROM 
-                                    co_share_stmt_details 
-                                WHERE 
-                                    co_share_id = pt_co_share_details.id 
-                                    AND is_active = 1
-                                    
-                            ) AS actual_tp_brokerage_amount,
-                            
-                            
-                            (
-                                SELECT 
-                                    SUM(actual_tep_brokerage_amt) 
-                                FROM 
-                                    co_share_stmt_details 
-                                WHERE 
-                                    co_share_id = pt_co_share_details.id 
-                                    AND is_active = 1
-                                    
-                            ) AS actual_tep_brokerage_amount,
-
-                            DATE_FORMAT(pt_policy_issue_date, '%d/%m/%Y') AS pt_policy_issue_date
-
-                    ")
-                ->where('pt_id', $id)
-                ->where('is_active', 1)
-                ->orderBy('id', 'asc')
-                ->findAll();
-
-            $data['emp_data'] = $this->employeeModel
-                ->select('employees.*, employee_polices.id as emp_policy_id')
-                ->join('employee_polices', 'employees.id = employee_polices.employee_id', 'left')
-                ->where('employees.client_id', $data['client_id'])
-                ->where('employees.is_active', 1)->findAll();
-            // $data['client_kyc']   = $this->clientKYCDocsModel->where('client_id',  $data['client_id'])->findAll();
-
-            $clientController = new ClientController();
-            $data['client_kyc_primary_table']  =  $clientController->generateKycPrimaryTable($data['client_id']);
-            $data['client_kyc_other_table']  =  $clientController->generateKycOthersTable($data['client_id']);
-            $data['client_kyc_single_table']  =  $clientController->generateKycSingleTable($data['client_id']);
-            $data['client_kyc_dd_data']  = $clientController->fetch_dropdown($data['client_id']);
-
-            $data['vehicle_docs'] = $this->clientKYCDocsModel
-                ->where('client_id',  $data['client_id'])
-                ->where('vehicle_id', $data['vehicle_id'])
-                ->findAll();
-
-            // print_r( $data['pt_co_share_details']); die;
-            // return $data;
-            if ($data) {
-                return $this->respond(['status' => true, 'data' => $data], 200);
-            } else {
-                return $this->respond(['status' => false], 200);
-            }
-        }
-
-        // Get the Single Inception Tranction data for edit
-        public function getInceptionDataForEdit2($id)
-        {
-            $data = $this->policyTransactionModel
-                ->select('
-                            policy_transaction.*, 
-                            clients.short_name as client_short_name, 
-                            clients.client_type, 
-                            clients.entity_type_id, 
-                            policy_type.policy_type,
-                            client_policy.tpa_id as master_tpa_id,
-                            client_policy.tpa_branch_id as master_tpa_branch_id,
-                            client_policy.policy_type_id as master_policy_type_id,
-                            client_policy.is_addon,
-                            client_policy.base_policy,
-                            ( 
-                                select last_action_date
-                                from policy_transaction_status
-                                where policy_tran_id = policy_transaction.id
-                                and status = policy_transaction.status
-                                order by id desc
-                                limit 1
-
-                            ) as last_action_date
-                        ')
-                ->join('clients', 'clients.id = policy_transaction.client_id')
-                ->join('client_policy', 'policy_transaction.client_policy_id = client_policy.id', 'left')
-                ->join('policy_type', 'client_policy.policy_type_id = policy_type.id', 'left')
-                ->where('policy_transaction.id', $id)
-                ->where('policy_transaction.is_active', 1)
-                ->first();
-
-            $data['created_at'] = (isset($data['created_at']) && $data['created_at'] !== null && $data['created_at'] !== '')
-                ? date('d/m/Y h:i:s A', strtotime($data['created_at']))
-                : null;
-
-            $data['updated_at'] = (isset($data['updated_at']) && $data['updated_at'] !== null && $data['updated_at'] !== '')
-                ? date('d/m/Y h:i:s A', strtotime($data['updated_at']))
-                : null;
-
-
-            if (!empty($data['policy_issue_date'])) {
-                $data['policy_issue_date'] =  change_date_format($data['policy_issue_date'], 'Y-m-d', 'd/m/Y');
-            }
-
-            if (!empty($data['policy_start_date'])) {
-                $data['policy_start_date'] =  change_date_format($data['policy_start_date'], 'Y-m-d', 'd/m/Y');
-            }
-
-            if (!empty($data['policy_end_date'])) {
-                $data['policy_end_date'] =  change_date_format($data['policy_end_date'], 'Y-m-d', 'd/m/Y');
-            }
-
-            if (!empty($data['renewal_date'])) {
-                $data['renewal_date'] =  change_date_format($data['renewal_date'], 'Y-m-d', 'd/m/Y');
-            }
-
-            if (!empty($data['rollover_date'])) {
-                $data['rollover_date'] =  change_date_format($data['rollover_date'], 'Y-m-d', 'd/m/Y');
-            }
-
-            if (!empty($data['endorse_eff_date'])) {
-                $data['endorse_eff_date'] =  change_date_format($data['endorse_eff_date'], 'Y-m-d', 'd/m/Y');
-            }
-
-            if (!empty($data['last_action_date'])) {
-                $data['last_action_date'] =  change_date_format($data['last_action_date'], 'Y-m-d', 'd/m/Y');
-            }
-
-            if (!empty($data['month'])) {
-                $data['month'] =  change_date_format($data['month'], 'Y-m-d', 'M/Y');
-            } else {
-                $data['month'] = null;
-            }
-
-            // print_r($data); die;
-
-            $data['renewal_policy'] = $this->clientPolicyModel
-                ->select('client_policy.*, policy_type.policy_type')
-                ->join('policy_type', 'policy_type.id = client_policy.policy_type_id')
-                ->where('client_policy.client_id', $data['client_id'])
-                ->where('client_policy.client_branch_id', $data['client_branch_id'])
-                ->where('client_policy.is_active', 1)
-                ->findAll();
-
-            $data['base_policy_data'] = $this->clientPolicyModel
-                ->select('client_policy.*, policy_type.policy_type')
-                ->join('policy_type', 'policy_type.id = client_policy.policy_type_id')
-                ->where('client_policy.client_id', $data['client_id'])
-                ->where('client_policy.client_branch_id', $data['client_branch_id'])
-                ->whereIn('client_policy.policy_type_id', [2, 3])
-                ->where('client_policy.is_active', 1)
-                ->findAll();
-
-            $pt_bp_amt = $this->PTCOShareDetailsModel
-                ->select('bp_amt, amount')
-                ->where('pt_id', $id)
-                ->where('co_share_type', 1)
-                ->where('is_active', 1)
-                ->first();
-
-            // dd(db_connect()->getLastQuery() ,$pt_bp_amt);
-            $data['base_cd_amount'] = $pt_bp_amt['amount'] ?? null;
-
-
-            $ptFileQuery = $this->PTFileModel
-                ->join('policy_transaction', 'pt_files.pt_id = policy_transaction.id')
-                ->where('pt_files.pt_id', $id)
-                ->where('pt_files.is_active', 1);
-
-            if (!in_array(get_role_id(), [1, 5]) && empty(array_intersect(user_team(), [MANAGEMENT_TEAM_ID, FINANCE_TEAM_ID, BUSINESS_TEAM_ID]))) {
-
-                if (get_role_id() == 4 && in_array(POS_TEAM_ID, user_team())) {
-                    $ptFileQuery->where('pt_files.created_by', get_session_userid());
-                }
-            }
-
-            $data['pt_files'] = $ptFileQuery->findAll();
-
-
-
-            $data['pt_co_share_details'] = $this->PTCOShareDetailsModel
-                ->select("
-                        pt_co_share_details.*,
-                
-                        (
-                            SELECT
-                                COUNT(*)
-                            FROM
-                                co_share_stmt_details
-                            WHERE
-                                co_share_stmt_details.co_share_id = pt_co_share_details.id
-                                AND co_share_stmt_details.is_active = 1
-                        ) AS record_count,
-
-                            (
-                                SELECT 
-                                    SUM(actual_bp_amt) 
-                                FROM 
-                                    co_share_stmt_details 
-                                WHERE 
-                                    co_share_id = pt_co_share_details.id 
-                                    AND is_active = 1
-                                    
-                            ) AS actual_bp_amount,
-                            
-                            (
-                                SELECT 
-                                    SUM(actual_tp_amt) 
-                                FROM 
-                                    co_share_stmt_details 
-                                WHERE 
-                                    co_share_id = pt_co_share_details.id 
-                                    AND is_active = 1
-                                    
-                            ) AS actual_tp_amount,
-                            
-                            (
-                                SELECT 
-                                    SUM(actual_tep_amt) 
-                                FROM 
-                                    co_share_stmt_details 
-                                WHERE 
-                                    co_share_id = pt_co_share_details.id 
-                                    AND is_active = 1
-                                    
-                            ) AS actual_tep_amount,
-                            
-                            (
-                                SELECT 
-                                    SUM(actual_bp_per) 
-                                FROM 
-                                    co_share_stmt_details 
-                                WHERE 
-                                    co_share_id = pt_co_share_details.id 
-                                    AND is_active = 1
-                                    
-                            ) AS actual_bp_percentage,
-                            
-                            (
-                                SELECT 
-                                    SUM(actual_tp_per) 
-                                FROM 
-                                    co_share_stmt_details 
-                                WHERE 
-                                    co_share_id = pt_co_share_details.id 
-                                    AND is_active = 1
-                                    
-                            ) AS actual_tp_percentage,
-                            
-                            (
-                                SELECT 
-                                    SUM(actual_tep_per) 
-                                FROM 
-                                    co_share_stmt_details 
-                                WHERE 
-                                    co_share_id = pt_co_share_details.id 
-                                    AND is_active = 1
-                                    
-                            ) AS actual_tep_percentage,
-                            
-                            
-                            (
-                                SELECT 
-                                    SUM(actual_bp_brokerage_amt) 
-                                FROM 
-                                    co_share_stmt_details 
-                                WHERE 
-                                    co_share_id = pt_co_share_details.id 
-                                    AND is_active = 1
-                                    
-                            ) AS actual_bp_brokerage_amount,
-                            
-                            
-                            (
-                                SELECT 
-                                    SUM(actual_tp_brokerage_amt) 
-                                FROM 
-                                    co_share_stmt_details 
-                                WHERE 
-                                    co_share_id = pt_co_share_details.id 
-                                    AND is_active = 1
-                                    
-                            ) AS actual_tp_brokerage_amount,
-                            
-                            
-                            (
-                                SELECT 
-                                    SUM(actual_tep_brokerage_amt) 
-                                FROM 
-                                    co_share_stmt_details 
-                                WHERE 
-                                    co_share_id = pt_co_share_details.id 
-                                    AND is_active = 1
-                                    
-                            ) AS actual_tep_brokerage_amount,
-
-                            DATE_FORMAT(pt_policy_issue_date, '%d/%m/%Y') AS pt_policy_issue_date
-
-                    ")
-                ->where('pt_id', $id)
-                ->where('is_active', 1)
-                ->orderBy('id', 'asc')
-                ->findAll();
-
-            $data['emp_data'] = $this->employeeModel
-                ->select('employees.*, employee_polices.id as emp_policy_id')
-                ->join('employee_polices', 'employees.id = employee_polices.employee_id', 'left')
-                ->where('employees.client_id', $data['client_id'])
-                ->where('employees.is_active', 1)->findAll();
-            // $data['client_kyc']   = $this->clientKYCDocsModel->where('client_id',  $data['client_id'])->findAll();
-
-            $clientController = new ClientController();
-            $data['client_kyc_primary_table']  =  $clientController->generateKycPrimaryTable($data['client_id']);
-            $data['client_kyc_other_table']  =  $clientController->generateKycOthersTable($data['client_id']);
-            $data['client_kyc_single_table']  =  $clientController->generateKycSingleTable($data['client_id']);
-            $data['client_kyc_dd_data']  = $clientController->fetch_dropdown($data['client_id']);
-
-            $data['vehicle_docs'] = $this->clientKYCDocsModel
-                ->where('client_id',  $data['client_id'])
-                ->where('vehicle_id', $data['vehicle_id'])
-                ->findAll();
-
-            // print_r( $data['pt_co_share_details']); die;
-            // return $data;
-            if ($data) {
-                return $this->respond(['status' => true, 'data' => $data], 200);
-            } else {
-                return $this->respond(['status' => false], 200);
-            }
-        }
-
-        public function removePolicyTransaction($id, $type = 0)
-        {   
-            if ($id) {
-                $data['is_active']  = 0;
-                $data['updated_by']  = get_session_userid();
-                $policy_transaction_data = $this->policyTransactionModel->where('id', $id)->first();
-                if($policy_transaction_data['policy_type_id'] > 7 && $type == 0){
-
-                    $this->policyTransactionModel->where('id', $id)->set($data)->update();
-                    $this->PTCOShareDetailsModel->where('pt_id', $id)->set($data)->update();
-                    $this->clientPolicyModel->where('id', $policy_transaction_data['client_policy_id'])->set($data)->update();
-                    $this->policyTransactionModel->where('client_policy_id', $policy_transaction_data['client_policy_id'])->set($data)->update();
-
-                    $cd_transaction_model = new ClientDepositModel();
-                    $cd_transaction_model->where('policy_transaction_id', $id)->set($data)->update();
-
-                }else{
-                    $this->policyTransactionModel->where('id', $id)->set($data)->update();
-                    $this->PTCOShareDetailsModel->where('pt_id', $id)->set($data)->update();
-                    
-                    $cd_transaction_model = new ClientDepositModel();
-                    $cd_transaction_model->where('policy_transaction_id', $id)->set($data)->update();
-
-                }
-                return $this->respond(['status' => true, 'code' => 200, 'message' => 'Policy Transaction removed successfully'], 200);
-            } else {
-
-                return $this->respond(['status' => false, 'code' => 404, 'message' => 'Failed to remove policy transaction'], 200);
-            }
-        }
-
-        //function for soft delete for pt_co_share_details records
-        public function removePtCoShareRecords($primaryKeys, $pt_id)
-        {
-            if (empty($primaryKeys)) {
-                return false;
-            }
-
-            // Convert array to a comma-separated string of placeholders for query binding
-            $placeholders = implode(',', array_fill(0, count($primaryKeys), '?'));
-
-            // Prepare the query with proper binding
-            $sql = "UPDATE pt_co_share_details SET is_active = 0 WHERE pt_id = ? AND id NOT IN ($placeholders)";
-
-            // Merge pt_id with primary keys for binding
-            $params = array_merge([$pt_id], $primaryKeys);
-
-            // Execute the query with bound parameters
-            return db_connect()->query($sql, $params);
-        }
-
-
-        //------------------------------------------------------------------------------------------------
-
-        // Policy Transaction Endorsement
-        public function viewEndorsement()
-        {
-            // echo '
';
-            // !dd($this->getEndorsementDataForEdit(17));
-            $bds_edit_pt_id = $this->request->getGet('pt_id') ?? null;
-            $data['tab_name'] = 'Endorsement';
-            $data['page_name'] = 'Endorsement';
-            $data['issuer'] = [1 => 'JIBS', 2 => 'Nhance'];
-            $data['issuer_branch'] = $this->nhanceBranchModel->where('is_active', 1)->findAll();
-            $data['client_type'] = [1 => 'Group', 2 => 'Individual'];
-
-            $data['policy_status'] = [
-                'under_process' => 'Under Process',
-                'client_pending' => 'Client Pending',
-                'insurer_pending' => 'Insurer Pending',
-                'co_insurer_pending' => 'Co-Insurer Pending',
-                'tpa_pending' => 'TPA Pending',
-                'validated' => 'Validated',
-                'cancelled' => 'Cancelled',
-                'instalment_pending' => 'Instalment Pending',
-                'completed' => 'Completed',
-            ];
-
-            $data['invoice_status'] = [
-                'yet_to_generate' => 'Pending',
-                'generated' => 'Generated',
-                'send' => 'Sent',
-                'recived' => 'Payment Received',
-            ];
-
-            $data['action_type'] = [
-                'addition' => 'Addition',
-                'deletion' => 'Deletion',
-                'addition_deletion' => 'Addition & Deletion',
-                'si_enhancement' => 'SI Enhancement',
-                'combo_a_d_si' => 'Combo A, D & SI',
-                'correction' => 'Correction',
-                'baby_addition' => 'Baby Addition',
-                'policy_instalment' => 'Policy Instalment',
-                'addition_inception' => 'Addition-Inception',
-                'bds_correction' => 'BDS Correction',
-                'policy_correction' => 'Policy Correction',
-                'policy_cancellation' => 'Policy Cancellation',
-            ];
-
-            $data['date_type'] = [
-                'policy_issue_date' => 'Policy Issue Date',
-                'policy_start_date' => 'Policy Start Date',
-                'policy_end_date' => 'Policy End Date',
-            ];
-
-            //filter datas
-            $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');
-            $status = $this->request->getGet('status');
-
-            $start_date = (!isset($start_date) || $start_date === '' || $start_date === null) ? 0 : $start_date;
-            $end_date = (!isset($end_date) || $end_date === '' || $end_date === null) ? 0 : $end_date;
-
-            $client_id = (!isset($client_id) || $client_id === '' || $client_id === null) ? 0 : $client_id;
-            $insurer_id = (!isset($insurer_id) || $insurer_id === '' || $insurer_id === null) ? 0 : $insurer_id;
-            $policy_type_id = (!isset($policy_type_id) || $policy_type_id === '' || $policy_type_id === null) ? 0 : $policy_type_id;
-            $date_type = (!isset($date_type) || $date_type === '' || $date_type === null) ? 0 : $date_type;
-            $issuer = (!isset($issuer) || $issuer === '' || $issuer === null) ? 0 : $issuer;
-            $status = (!isset($issuer) || $status === '' || $status === null) ? 0 : $status;
-
-            if($bds_edit_pt_id == null){
-                $data['endorsement_data_list'] = $this->policyTransactionModel->getEndorsementTranctionListData($start_date, $end_date, $client_id, $insurer_id, $policy_type_id, $date_type, $issuer, $status);
-            }else{
-                $data['endorsement_data_list'] = [];
-            }
-            $data['client'] = $this->clientModel->where('is_active', 1)->findAll();
-            $data['policy_types'] = $this->policyTypeModel->where('is_active', 1)->findAll();
-
-            $data['insurer'] = $this->insurerModel->where('is_active', 1)->findAll();
-            // $data['tpa']           = $this->tpaModel->where('is_active', 1)->findAll();
-            $data['insurer_branch']      = $this->insurerBranchModel->getInsurerBranchesWithInsurerNames();
-            $data['tpa']           = $this->tpaBranchModel->getTpaBranchesWithTpaNames();
-            list($policyList, $policyListByClient) = $this->getPolicyForEndorsment();
-
-            $data['endorsementPolicies'] = $policyList;
-            $data['endorsementPolicyListByClient'] = $policyListByClient;
-
-            // dd($data);
-            // print_r($data['endorsementPolicies']);die();
-
-            $this->loadLayout('policy_transaction_endorsement_list', $data);
-        }
-
-        public function viewEndorsement2()
-        {
-            // echo '
';
-            // !dd($this->getEndorsementDataForEdit(17));
-            $bds_edit_pt_id = $this->request->getGet('pt_id') ?? null;
-            $data['tab_name'] = 'Endorsements';
-            $data['page_name'] = 'Endorsements';
-            $data['issuer'] = [1 => 'JIBS', 2 => 'Nhance'];
-            $data['issuer_branch'] = $this->nhanceBranchModel->where('is_active', 1)->findAll();
-            $data['client_type'] = [1 => 'Group', 2 => 'Individual'];
-
-            $data['policy_status'] = [
-                'under_process' => 'Under Process',
-                'client_pending' => 'Client Pending',
-                'insurer_pending' => 'Insurer Pending',
-                'co_insurer_pending' => 'Co-Insurer Pending',
-                'tpa_pending' => 'TPA Pending',
-                'validated' => 'Validated',
-                'cancelled' => 'Cancelled',
-                'instalment_pending' => 'Instalment Pending',
-                'completed' => 'Completed',
-            ];
-
-            $data['invoice_status'] = [
-                'yet_to_generate' => 'Pending',
-                'generated' => 'Generated',
-                'send' => 'Sent',
-                'recived' => 'Payment Received',
-            ];
-
-            $data['action_type'] = [
-                'addition' => 'Addition',
-                'deletion' => 'Deletion',
-                'addition_deletion' => 'Addition & Deletion',
-                'si_enhancement' => 'SI Enhancement',
-                'combo_a_d_si' => 'Combo A, D & SI',
-                'correction' => 'Correction',
-                'baby_addition' => 'Baby Addition',
-                'policy_instalment' => 'Policy Instalment',
-                'addition_inception' => 'Addition-Inception',
-                'bds_correction' => 'BDS Correction',
-                'policy_correction' => 'Policy Correction',
-                'policy_cancellation' => 'Policy Cancellation',
-            ];
-
-            $data['date_type'] = [
-                'policy_issue_date' => 'Policy Issue Date',
-                'policy_start_date' => 'Policy Start Date',
-                'policy_end_date' => 'Policy End Date',
-            ];
-
-            //filter datas
-            $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');
-            $status = $this->request->getGet('status');
-
-            $start_date = (!isset($start_date) || $start_date === '' || $start_date === null) ? 0 : $start_date;
-            $end_date = (!isset($end_date) || $end_date === '' || $end_date === null) ? 0 : $end_date;
-
-            $client_id = (!isset($client_id) || $client_id === '' || $client_id === null) ? 0 : $client_id;
-            $insurer_id = (!isset($insurer_id) || $insurer_id === '' || $insurer_id === null) ? 0 : $insurer_id;
-            $policy_type_id = (!isset($policy_type_id) || $policy_type_id === '' || $policy_type_id === null) ? 0 : $policy_type_id;
-            $date_type = (!isset($date_type) || $date_type === '' || $date_type === null) ? 0 : $date_type;
-            $issuer = (!isset($issuer) || $issuer === '' || $issuer === null) ? 0 : $issuer;
-            $status = (!isset($issuer) || $status === '' || $status === null) ? 0 : $status;
-
-            if($bds_edit_pt_id == null){
-                $data['endorsement_data_list'] = $this->policyTransactionModel->getEndorsementTranctionListData($start_date, $end_date, $client_id, $insurer_id, $policy_type_id, $date_type, $issuer, $status);
-            }else{
-                $data['endorsement_data_list'] = [];
-            }
-            $data['client'] = $this->clientModel->where('is_active', 1)->findAll();
-            $data['policy_types'] = $this->policyTypeModel->where('is_active', 1)->findAll();
-
-            $data['insurer'] = $this->insurerModel->where('is_active', 1)->findAll();
-            // $data['tpa']           = $this->tpaModel->where('is_active', 1)->findAll();
-            $data['insurer_branch']      = $this->insurerBranchModel->getInsurerBranchesWithInsurerNames();
-            $data['tpa']           = $this->tpaBranchModel->getTpaBranchesWithTpaNames();
-            list($policyList, $policyListByClient) = $this->getPolicyForEndorsment();
-
-            $data['endorsementPolicies'] = $policyList;
-            $data['endorsementPolicyListByClient'] = $policyListByClient;
-
-            // dd($data);
-            // print_r($data['endorsementPolicies']);die();
-
-            $this->loadLayout('policy_transaction_endorsement_list_2', $data);
-        }
-
-        public function createEndorsementPolicy()
-        {
-            // $id = $this->request->getPost('id');
-            $rules = [
-                    // ==========================================
-                    // 1. CLIENT SECTION
-                    // ==========================================
-                    'client_id' => [
-                        'label'  => 'Client',
-                        'rules'  => 'required',
-                        'errors' => ['required' => 'Client selection is mandatory.']
-                    ],
-                    'client_policy_id' => [
-                        'label'  => 'Policy',
-                        'rules'  => 'required',
-                        'errors' => ['required' => 'Please select the policy to endorse.']
-                    ],
-                    'client_type'      => ['rules' => 'permit_empty','errors' => []],
-                    'client_branch_id' => ['rules' => 'permit_empty','errors' => []],
-
-                    // ==========================================
-                    // 2. ENDORSEMENT SECTION
-                    // ==========================================
-                    'action_type' => [
-                        'label'  => 'Endorsement Type',
-                        'rules'  => 'required',
-                        'errors' => ['required' => 'Select an Endorsement Type.']
-                    ],
-                    'endorsement_no' => ['label'  => 'Endorsement No','rules'  => 'permit_empty|regex_match[/^[a-zA-Z0-9\/_-]+$/]',
-                                         'errors' => [ 'regex_match' => 'Endorsement No can only contain letters, numbers, and symbols like / - or _' ]],
-                    'data_received_date' => [
-                        'label'  => 'Data Received Date',
-                        'rules'  => 'required|valid_date[d/m/Y]',
-                        'errors' => ['required' => 'Data Received Date is required.', 'valid_date'  => 'Please provide a valid Data Received Date.']
-                    ],
-                    'policy_issue_date' => [
-                        'label'  => 'Endorsement Issue Date',
-                        'rules'  => 'required|valid_date[d/m/Y]',
-                        'errors' => ['required' => 'Endorsement Issue Date is required.', 'valid_date'  => 'Please provide a valid Endorsement Issue Date.']
-                    ],
-                    // ==========================================
-                    // ENDORSEMENT SECTION
-                    // ==========================================
-                    'month' => [
-                        'label'  => 'Endorsement Issue Month',
-                        'rules'  => 'required',
-                        'errors' => ['required' => 'Endorsement Issue Month (MM/YYYY) is required.']
-                    ],
-                    'endorse_eff_date' => [
-                        'label'  => 'Endorsement Effective Date',
-                        'rules'  => 'permit_empty|valid_date[d/m/Y]',
-                        'errors' => ['valid_date'  => 'Please provide a valid Endorsement Effective Date.']
-                    ],
-                    'emp_count' => [
-                        'label'  => 'No of Insured',
-                        'rules'  => 'permit_empty|numeric',
-                        'errors' => ['numeric' => 'No of Insured must be a number.']
-                    ],
-                    'dependent_count' => [
-                        'label'  => 'No of Dependents',
-                        'rules'  => 'permit_empty|numeric',
-                        'errors' => ['numeric' => 'No of Dependents must be a number.']
-                    ],
-                    'last_action_date' => [
-                        'label'  => 'Latest Action Date',
-                        'rules'  => 'permit_empty|valid_date[d/m/Y]',
-                        'errors' => ['valid_date'  => 'Please provide a valid Latest Action Date.']
-                    ],
-                    'install_due_date' => [
-                        'label'  => 'Installment Due Date',
-                        'rules'  => 'permit_empty|valid_date[d/m/Y]',
-                        'errors' => ['valid_date'  => 'Please provide a valid Installment Due Date.']
-                    ],
-
-                    // ==========================================
-                    // PREMIUM DETAILS (ARRAY FIELDS .*)
-                    // ==========================================
-                    'follow_insurer_id.*' => [
-                        'label'  => 'Insurer',
-                        'rules'  => 'required',
-                        'errors' => ['required' => 'Please select an Insurer.']
-                    ],
-                    'calc_policy_issue_date.*' => [
-                        'label' => 'Premium Endorsement Issue Date', 
-                        'rules'  => 'required',
-                        'errors' => ['required' => 'Endorsement Issue Date is required.']
-                    ],
-                    'co_share_per.*' => [
-                        'label'  => 'Co-Share %',
-                        'rules'  => 'permit_empty|decimal',
-                        'errors' => ['decimal' => 'Co-Share % must be a valid decimal.']
-                    ],
-                    'base_premium.*' => [
-                        'label'  => 'Base Premium',
-                        'rules' => 'permit_empty|regex_match[/^-?\d+(\.\d+)?$/]|differs[0]',
-                                                'errors' => [
-                                                    'regex_match' => 'Base Premium must be a valid positive or negative number.',
-                                                    'differs'     => 'Base Premium cannot be zero.'
-                        ]
-                    ],
-                    'total.*' => [
-                        'label'  => 'Total Premium',
-                        'rules'  => 'permit_empty|decimal',
-                        'errors' => ['decimal'  => 'Total Premium must be a valid amount.'],
-                    ],
-
-                    // Decimal validation with Labels
-                    'non_comm_per_amt.*' => [
-                        'label' => 'Non-Comm Premium',
-                        'rules' => 'permit_empty|decimal',
-                        'errors' => ['decimal' => 'Non-Comm Premium must be numeric.']
-                    ],
-                    'tp_premium.*' => [
-                        'label' => 'TP Premium',
-                        'rules' => 'permit_empty|decimal',
-                        'errors' => ['decimal' => 'TP Premium must be numeric.']
-                    ],
-                    'ter_premium.*' => [
-                        'label' => 'TEP Premium',
-                        'rules' => 'permit_empty|decimal',
-                        'errors' => ['decimal' => 'TEP Premium must be numeric.']
-                    ],
-                    'co_premium.*' => [
-                        'label' => 'Co-Premium',
-                        'rules' => 'permit_empty|decimal',
-                        'errors' => ['decimal' => 'Co-Premium must be numeric.']
-                    ],
-                    'co_tp_premium.*' => [
-                        'label' => 'Co-TP Premium',
-                        'rules' => 'permit_empty|decimal',
-                        'errors' => ['decimal' => 'Co-TP Premium must be numeric.']
-                    ],
-                    'co_ter_premium.*' => [
-                        'label' => 'Co-TEP Premium',
-                        'rules' => 'permit_empty|decimal',
-                        'errors' => ['decimal' => 'Co-TEP Premium must be numeric.']
-                    ],
-                    'cgst.*' => [
-                        'label' => 'CGST',
-                        'rules' => 'permit_empty|decimal',
-                        'errors' => ['decimal' => 'CGST must be numeric.']
-                    ],
-                    'sgst.*' => [
-                        'label' => 'SGST',
-                        'rules' => 'permit_empty|decimal',
-                        'errors' => ['decimal' => 'SGST must be numeric.']
-                    ],
-                    'igst.*' => [
-                        'label' => 'IGST',
-                        'rules' => 'permit_empty|decimal',
-                        'errors' => ['decimal' => 'IGST must be numeric.']
-                    ],
-                    'gst_amount.*' => [
-                        'label' => 'GST Amount',
-                        'rules' => 'permit_empty|decimal|greater_than[0]',
-                        'errors' => ['decimal' => 'GST Amount must be numeric.','greater_than' => 'GST Amount cannot be zero; please enter a value greater than 0.']
-                    ],
-                    'stamp_duty.*' => [
-                        'label' => 'Stamp Duty',
-                        'rules' => 'permit_empty|decimal',
-                        'errors' => ['decimal' => 'Stamp Duty must be numeric.']
-                    ],
-                    'agreed_bp.*' => [
-                        'label' => 'Agreed BP %',
-                        'rules' => 'permit_empty|decimal',
-                        'errors' => ['decimal' => 'Agreed BP % must be numeric.']
-                    ],
-                    'agreed_tp.*' => [
-                        'label' => 'Agreed TP %',
-                        'rules' => 'permit_empty|decimal',
-                        'errors' => ['decimal' => 'Agreed TP % must be numeric.']
-                    ],
-                    'agreed_ter.*' => [
-                        'label' => 'Agreed TEP %',
-                        'rules' => 'permit_empty|decimal',
-                        'errors' => ['decimal' => 'Agreed TEP % must be numeric.']
-                    ],
-                    'agreed_amount.*' => [
-                        'label' => 'Agreed Amount',
-                        'rules' => 'permit_empty|decimal',
-                        'errors' => ['decimal' => 'Agreed Amount must be numeric.']
-                    ],
-
-                    // Finance/Management Specific Labels
-                    'actual_bp_amt.*' => [
-                        'label' => 'Actual BP Amount',
-                        'rules' => 'permit_empty|decimal',
-                        'errors' => ['decimal' => 'Actual BP Amount must be numeric.']
-                    ],
-                    'actual_tp_amt.*' => [
-                        'label' => 'Actual TP Amount',
-                        'rules' => 'permit_empty|decimal',
-                        'errors' => ['decimal' => 'Actual TP Amount must be numeric.']
-                    ],
-                    'actual_tep_amt.*' => [
-                        'label' => 'Actual TEP Amount',
-                        'rules' => 'permit_empty|decimal',
-                        'errors' => ['decimal' => 'Actual TEP Amount must be numeric.']
-                    ],
-                    'actual_bp_per.*' => [
-                        'label' => 'Actual BP %',
-                        'rules' => 'permit_empty|decimal',
-                        'errors' => ['decimal' => 'Actual BP % must be numeric.']
-                    ],
-                    'actual_tp_per.*' => [
-                        'label' => 'Actual TP %',
-                        'rules' => 'permit_empty|decimal',
-                        'errors' => ['decimal' => 'Actual TP % must be numeric.']
-                    ],
-                    'actual_tep_per.*' => [
-                        'label' => 'Actual TEP %',
-                        'rules' => 'permit_empty|decimal',
-                        'errors' => ['decimal' => 'Actual TEP % must be numeric.']
-                    ],
-                    'actual_bp_brokerage_amt.*' => [
-                        'label' => 'BP Remuneration',
-                        'rules' => 'permit_empty|decimal',
-                        'errors' => ['decimal' => 'BP Remuneration must be numeric.']
-                    ],
-                    'actual_tp_brokerage_amt.*' => [
-                        'label' => 'TP Remuneration',
-                        'rules' => 'permit_empty|decimal',
-                        'errors' => ['decimal' => 'TP Remuneration must be numeric.']
-                    ],
-                    'actual_tep_brokerage_amt.*' => [
-                        'label' => 'TEP Remuneration',
-                        'rules' => 'permit_empty|decimal',
-                        'errors' => ['decimal' => 'TEP Remuneration must be numeric.']
-                    ],
-                    'exp_amt.*' => [
-                        'label' => 'Expected Amount',
-                        'rules' => 'permit_empty|decimal',
-                        'errors' => ['decimal' => 'Expected Amount must be numeric.']
-                    ],
-                    'co_share_type.*'      => ['label' => 'Is Leader', 'rules' => 'permit_empty','errors' => []],
-                    'follower_policy_no.*' => ['label' => 'Follower Policy No', 'rules' => 'permit_empty','errors' => []],
-                    'co_share_id.*'        => ['label' => 'Record ID', 'rules' => 'permit_empty','errors' => []],
-                ];
-
-                if (!$this->validate($rules)) {
-                    return $this->response->setStatusCode(400)->setJSON([
-                        'status' => false,
-                        'message' => 'Input validation failed',
-                        'code' => 400,
-                        'errors' => $this->validator->getErrors()
-                    ]);
-                }
-
-            $data = $this->preparePolicyTransactionData();
-    
-            $id = (isset($data['id']) && !empty($data['id'])) ? $data['id'] : null;
-
-            $data['status'] = 'completed';
-
-            if (!$id) {
-                return $this->insertEndorsementTransaction($data);
-            } else {
-                return $this->updateEndorsementTransaction($id, $data);
-            }
-
-        }
-
-        private function preparePolicyTransactionData()
-        {
-            $request_post_data   = $this->request->getPost();
-            $data = sanitizeInputArrayAdvanced($request_post_data);
-            // echo '
';
-            // print_r($data); 
-            // die;
-
-            $file_data = $this->request->getFiles() ?? null;
-            $data['file_data'] = $file_data ?? null;
-
-            if (!isset($data['policy_with_corr'])) {
-                $data['policy_with_corr'] = 0;
-            } elseif ($data['policy_with_corr']) {
-                $data['policy_with_corr'] = 1;
-            }
-
-            // if (!isset($data['is_cd_reduce_from_bds'])) {
-            //     $data['is_cd_reduce_from_bds'] = 0;
-            // } elseif ($data['is_cd_reduce_from_bds']) {
-            //     $data['is_cd_reduce_from_bds'] = 1;
-            // }
-
-            if (empty($data['data_received_date'])) {
-                $data['data_received_date'] = null;
-            } else {
-                $data['data_received_date'] =  change_date_format($data['data_received_date'], 'd/m/Y', 'Y-m-d');
-            }
-
-            if (empty($data['policy_issue_date'])) {
-                $data['policy_issue_date'] = null;
-            } else {
-                $data['policy_issue_date'] =  change_date_format($data['policy_issue_date'], 'd/m/Y', 'Y-m-d');
-            }
-
-            if (empty($data['endorse_eff_date'])) {
-                $data['endorse_eff_date'] = null;
-            } else {
-                $data['endorse_eff_date'] =  change_date_format($data['endorse_eff_date'], 'd/m/Y', 'Y-m-d');
-            }
-
-            if (empty($data['install_due_date'])) {
-                $data['install_due_date'] = null;
-            } else {
-                $data['install_due_date'] =  change_date_format($data['install_due_date'], 'd/m/Y', 'Y-m-d');
-            }
-
-            if (!empty($data['month'])) {
-                $month = '01/' . $data['month'];
-                $data['month'] =  change_date_format($month, 'd/M/Y', 'Y-m-d');
-            }
-
-            if (empty($data['last_action_date'])) {
-                $data['last_action_date'] = null;
-            } else {
-                $data['last_action_date'] = change_date_format($data['last_action_date']);
-            }
-
-            // print_r($data); die;   
-
-            // Separate Insurer and TPA Branch IDs and IDs
-            if (isset($data['insurer_id']) && !empty($data['insurer_id'])) {
-                list($data['insurer_branch_id'], $data['insurer_id']) = explode('-', $data['insurer_id']);
-                if (isset($data['tpa']) && !empty($data['tpa'])) {
-                    list($data['tpa_branch_id'], $data['tpa_id']) = explode('-', $data['tpa']);
-                }
-            }
-
-            $issue_type = $this->policyTransactionModel
-                ->where('action_type', 'inception')
-                ->where('client_id', $this->request->getPost('client_id'))
-                // ->where('client_policy_id', $this->request->getPost('client_policy_id'))
-                ->where('id', $this->request->getPost('client_policy_id'))
-                ->where('policy_transaction.is_active', 1)
-                ->first();
-
-            $data['tsi'] = generate_tsi_code($issue_type['issue_type'] ?? 1);
-
-            if (!isset($data['client_branch_id']) || $data['client_branch_id'] == "") {
-                $client_branch_id = $issue_type['client_branch_id'];
-            }else{
-                $client_branch_id = $data['client_branch_id'];
-            }
-
-            $data['is_cd_reduce_from_bds'] = (isset($issue_type['policy_type_id']) && $issue_type['policy_type_id'] > 7 && $data['client_type'] == 1) ? 1 : 0;
-
-            // if($data['bro_payable_by'] == ""){
-            //     $data['bro_payable_by'] = $issue_type['bro_payable_by'];
-            // }
-
-            if (!$data['id']) {
-
-                $data += [
-                    'issuer' => 2,
-                    'issuer_branch' => $data['issuer_branch'] ?? 1,
-                    'client_type' => $data['client_type'] ?? $issue_type['client_type'] ?? null,
-                    'policy_type_id' => $issue_type['policy_type_id'] ?? null,
-                    'issue_type' => $issue_type['issue_type'] ?? null,
-                    'source_client_policy_id' => $issue_type['source_client_policy_id'] ?? null,
-                    'cd_ac_no' => isset($data['cd_ac_no']) && !empty($data['cd_ac_no']) ? $data['cd_ac_no'] : $issue_type['cd_ac_no'] ?? null,
-                    'cd_ac_pk' => isset($data['cd_ac_pk']) && !empty($data['cd_ac_pk']) ? $data['cd_ac_pk'] : $issue_type['cd_ac_pk'] ?? null,
-                    // 'policy_issue_date' => $issue_type['policy_issue_date'] ?? null,
-                    'policy_start_date' => $issue_type['policy_start_date'] ?? null,
-                    'policy_end_date' => $issue_type['policy_end_date'] ?? null,
-                    'revenue_type' =>  $issue_type['revenue_type'] ?? null,
-                    'co_share' => $issue_type['co_share'] ?? 0,
-                    'bro_payable_by' =>  $data['bro_payable_by'] == "" ? $issue_type['bro_payable_by'] ?? 0 :  $data['bro_payable_by'],
-                    'installment' => $issue_type['installment'] ?? null,
-                    'installment_data' => $issue_type['installment_data'] ?? null,
-                    'location' => $issue_type['location'] ?? null,
-                    'links' =>  $issue_type['links'] ?? null,
-                    'stage' => $issue_type['stage'] ?? null,
-                    'etat' => $issue_type['etat'] ?? null,
-                    'etat_band' => $issue_type['etat_band'] ?? null,
-                    'edate' => $issue_type['edate'] ?? null,
-                    'renewal_date' => $issue_type['renewal_date'] ?? null,
-                    'rollover_date' => $issue_type['rollover_date'] ?? null,
-                    'policy_holder_name' => $issue_type['policy_holder_name'] ?? null,
-                    'same_as_proposer' => $issue_type['same_as_proposer'] ?? 1,
-                    'ref' => $issue_type['ref'] ?? null,
-                    'spl' => $issue_type['spl'] ?? null,
-                    'fund_received' => $issue_type['fund_received'] ?? null,
-                    'listed_insurers' => $issue_type['listed_insurers'] ?? null,
-                    'ppteam' => $issue_type['ppteam'] ?? null,
-                    'sales_generated_by' => $issue_type['sales_generated_by'] ?? null,
-                    'serviced_by' => $issue_type['serviced_by'] ?? null,
-                    'salse_person_manager_id' => $issue_type['salse_person_manager_id'] ?? null,
-                    'service_person_manager_id' => $issue_type['service_person_manager_id'] ?? null,
-                    'service_person_branch_id' => $issue_type['service_person_branch_id'] ?? null,
-                    'agent_id' => $issue_type['agent_id'] ?? null,
-                    'agent_code' => $issue_type['agent_code'] ?? null,
-                    'pos_id' => $issue_type['pos_id'] ?? null,
-                ];
-
-                $data['client_branch_id'] = $client_branch_id;
-            }
-
-            // print_r($issue_type); 
-            // print_r($data); 
-            // die;
-
-            return $data;
-        }
-
-        private function insertEndorsementTransaction($data)
-        {
-            $insert = $this->policyTransactionModel->insert($data);
-
-            if ($insert) {
-
-                $this->insertTransactionStatus($insert, $data, 1);
-                $this->handleCompletedStatus($data, $insert);
-                $this->insertOrUpdateCoShareDetails($data, $insert);
-
-                // policy file upload 
-                if(isset($data['doc_name']) && isset($data['file_data']) && !empty($data['doc_name']) && !empty($data['file_data'])){
-                    $this->uploadFile($data['doc_name'], $data['file_data'], $insert);
-                }
-
-                return $this->respond(['status' => true, 'message' => 'Endorsement transaction created successfully'], 200);
-            }
-
-            return $this->respond(['status' => false, 'message' => 'Endorsement transaction creation failed'], 400);
-        }
-
-        private function updateEndorsementTransaction($id, $data)
-        {   
-            $data['updated_by']  = get_session_userid();
-            $old_endorse_data =  $this->policyTransactionModel->where('id', $id)->where('is_active', 1)->first();
-            $update = $this->policyTransactionModel->where('id', $id)->set($data)->update();
-
-            if ($update) {
-
-                $this->insertTransactionStatus($id, $data, 1);
-                // if($old_endorse_data['status'] != "completed"){
-                //     $this->handleCompletedStatus($data, $id);
-                // }
-                $this->insertOrUpdateCoShareDetails($data, $id);
-
-
-                return $this->respond(['status' => true, 'message' => 'Endorsement transaction updated successfully'], 200);
-            }
-
-            return $this->respond(['status' => false, 'message' => 'Endorsement transaction update failed'], 400);
-        }
-
-        private function handleCompletedStatus($data, $policy_tran_id)
-        {   
-            if ($data['client_type'] == 1 && $data['status'] == 'completed' && $data['is_cd_reduce_from_bds'] == 1) {
-
-                $tolamt = (int) $data['total'][0] ?? 0;
-
-                if(!empty($tolamt)){
-                    $description = 'The following amount of Rs. ' . round($tolamt, 2) . '/- has been' .
-                        ($data['action_type'] == 'deletion' ? ' Credit ' : ' Debit ') . 'from the policy transaction (BDS)';
-                    
-                    $cd_tranction_data = [
-                        'amount' => abs($tolamt),
-                        'sub_type_id' => $data['action_type'] == 'deletion' ? 3 : 4,
-                        'client_id' => $data['client_id'],
-                        'client_policy_id' => $data['client_policy_id'],
-                        'endorsement_no' => null,
-                        'cd_ac_no' => $data['cd_ac_no'] ?? null,
-                        'insurer_id' => $data['insurer_id'],
-                        'description' => $description,
-                        'transaction_type' => $data['action_type'] == 'deletion' ? 'Credit' : 'Debit',
-                        'updated_by' => get_session_userid(),
-                        'event_name' => $data['action_type'],
-                        'is_active' => 1,
-                        'cd_ac_pk' => $data['cd_ac_pk'] ?? null,
-                        'pt_id' => $policy_tran_id ?? null,
-                    ];
-
-                    $result = DepositHelper::saveDeposit($cd_tranction_data, get_session_userid());
-
-                    if(isset($result['success']) && $result['success']){
-                        $update_data['ct_tran_id'] = $result['insert_id'];
-                        $this->policyTransactionModel->where('id', $policy_tran_id)->set($update_data)->update();
-                    }
-                }
-
-            }
-        }
-
-        public function getEndorsementDataForEdit($id)
-        {
-            $data = $this->policyTransactionModel
-                ->select('
-                            policy_transaction.*, 
-                            clients.short_name as client_short_name, 
-                            clients.client_type, 
-                            ( 
-                                select last_action_date
-                                from policy_transaction_status
-                                where policy_tran_id = policy_transaction.id
-                                and status = policy_transaction.status
-                                order by id desc
-                                limit 1
-
-                            ) as last_action_date
-                        ')
-                ->join('clients', 'clients.id = policy_transaction.client_id')
-                ->join('client_policy', 'policy_transaction.client_policy_id = client_policy.id', 'left')
-                ->where('policy_transaction.id', $id)
-                ->where('policy_transaction.is_active', 1)
-                ->orderBy('id', 'asc')
-                ->first();
-
-            $pt_id = null;   
-
-            if(!empty($data)){
-                $inception_data = $this->policyTransactionModel
-                        ->where('policy_no', $data['policy_no'])
-                        ->where('client_id', $data['client_id'])
-                        ->where('action_type', 'inception')
-                        ->first();
-                $pt_id = $inception_data['id'];
-            }    
-
-            if (!empty($data['policy_start_date'])) {
-                $data['policy_start_date'] =  change_date_format($data['policy_start_date'], 'Y-m-d', 'd/m/Y');
-            }
-
-            if (!empty($data['policy_end_date'])) {
-                $data['policy_end_date'] =  change_date_format($data['policy_end_date'], 'Y-m-d', 'd/m/Y');
-            }
-
-            if (!empty($data['data_received_date'])) {
-                $data['data_received_date'] =  change_date_format($data['data_received_date'], 'Y-m-d', 'd/m/Y');
-            }
-
-            if (!empty($data['policy_issue_date'])) {
-                $data['policy_issue_date'] =  change_date_format($data['policy_issue_date'], 'Y-m-d', 'd/m/Y');
-            }
-
-            if (!empty($data['endorse_eff_date'])) {
-                $data['endorse_eff_date'] =  change_date_format($data['endorse_eff_date'], 'Y-m-d', 'd/m/Y');
-            }
-
-            if (!empty($data['install_due_date'])) {
-                $data['install_due_date'] =  change_date_format($data['install_due_date'], 'Y-m-d', 'd/m/Y');
-            }
-
-            if (!empty($data['last_action_date'])) {
-                $data['last_action_date'] =  change_date_format($data['last_action_date'], 'Y-m-d', 'd/m/Y');
-            }
-
-            if (!empty($data['month'])) {
-                $data['month'] =  change_date_format($data['month'], 'Y-m-d', 'M/Y');
-            }
-
-            // print_r($data); die;
-
-            //get PT Co-Share Details
-            $data['pt_co_share_details'] = $this->PTCOShareDetailsModel
-
-                ->select("
-                            pt_co_share_details.*,
-                    
-                            (
-                                SELECT
-                                    COUNT(*)
-                                FROM
-                                    co_share_stmt_details
-                                WHERE
-                                    co_share_stmt_details.co_share_id = pt_co_share_details.id
-                                    AND co_share_stmt_details.is_active = 1
-                            ) AS record_count,
-        
-                                (
-                                    SELECT 
-                                        SUM(actual_bp_amt) 
-                                    FROM 
-                                        co_share_stmt_details 
-                                    WHERE 
-                                        co_share_id = pt_co_share_details.id 
-                                        AND is_active = 1
-                                        
-                                ) AS actual_bp_amount,
-                                
-                                (
-                                    SELECT 
-                                        SUM(actual_tp_amt) 
-                                    FROM 
-                                        co_share_stmt_details 
-                                    WHERE 
-                                        co_share_id = pt_co_share_details.id 
-                                        AND is_active = 1
-                                        
-                                ) AS actual_tp_amount,
-                                
-                                (
-                                    SELECT 
-                                        SUM(actual_tep_amt) 
-                                    FROM 
-                                        co_share_stmt_details 
-                                    WHERE 
-                                        co_share_id = pt_co_share_details.id 
-                                        AND is_active = 1
-                                        
-                                ) AS actual_tep_amount,
-                                
-                                (
-                                    SELECT 
-                                        SUM(actual_bp_per) 
-                                    FROM 
-                                        co_share_stmt_details 
-                                    WHERE 
-                                        co_share_id = pt_co_share_details.id 
-                                        AND is_active = 1
-                                        
-                                ) AS actual_bp_percentage,
-                                
-                                (
-                                    SELECT 
-                                        SUM(actual_tp_per) 
-                                    FROM 
-                                        co_share_stmt_details 
-                                    WHERE 
-                                        co_share_id = pt_co_share_details.id 
-                                        AND is_active = 1
-                                        
-                                ) AS actual_tp_percentage,
-                                
-                                (
-                                    SELECT 
-                                        SUM(actual_tep_per) 
-                                    FROM 
-                                        co_share_stmt_details 
-                                    WHERE 
-                                        co_share_id = pt_co_share_details.id 
-                                        AND is_active = 1
-                                        
-                                ) AS actual_tep_percentage,
-                                
-                                
-                                (
-                                    SELECT 
-                                        SUM(actual_bp_brokerage_amt) 
-                                    FROM 
-                                        co_share_stmt_details 
-                                    WHERE 
-                                        co_share_id = pt_co_share_details.id 
-                                        AND is_active = 1
-                                        
-                                ) AS actual_bp_brokerage_amount,
-                                
-                                
-                                (
-                                    SELECT 
-                                        SUM(actual_tp_brokerage_amt) 
-                                    FROM 
-                                        co_share_stmt_details 
-                                    WHERE 
-                                        co_share_id = pt_co_share_details.id 
-                                        AND is_active = 1
-                                        
-                                ) AS actual_tp_brokerage_amount,
-                                
-                                
-                                (
-                                    SELECT 
-                                        SUM(actual_tep_brokerage_amt) 
-                                    FROM 
-                                        co_share_stmt_details 
-                                    WHERE 
-                                        co_share_id = pt_co_share_details.id 
-                                        AND is_active = 1
-                                        
-                                ) AS actual_tep_brokerage_amount, 
-                                 
-                                DATE_FORMAT(pt_policy_issue_date, '%d/%m/%Y') AS pt_policy_issue_date
-        
-                        ")
-                ->where('pt_id', $id)
-                ->where('is_active', 1)
-                ->orderBy('id', 'asc')
-                ->findAll();
-
-            // print_r($data['endorse_eff_date']); die;
-
-            $pt_bp_amt = $this->PTCOShareDetailsModel
-                ->select('bp_amt, amount')
-                ->where('pt_id', $id)
-                ->where('co_share_type', 1)
-                ->where('is_active', 1)
-                ->first();
-
-            // dd(db_connect()->getLastQuery() ,$pt_bp_amt);
-            $data['base_cd_amount'] = $pt_bp_amt['amount'] ?? null;
-
-            $ptFileQuery = $this->PTFileModel
-                ->join('policy_transaction', 'pt_files.pt_id = policy_transaction.id')
-                ->where('pt_files.pt_id', $id)
-                ->where('pt_files.is_active', 1);
-
-            if (!in_array(get_role_id(), [1, 5]) && empty(array_intersect(user_team(), [MANAGEMENT_TEAM_ID, FINANCE_TEAM_ID, BUSINESS_TEAM_ID]))) {
-
-                if (get_role_id() == 4 && in_array(POS_TEAM_ID, user_team())) {
-                    $ptFileQuery->where('pt_files.created_by', get_session_userid());
-                }
-            }
-
-            $data['pt_files'] = $ptFileQuery->findAll();
-
-            if ($data) {
-                return $this->respond(['status' => true, 'data' => $data, 'pt_id' => $pt_id], 200);
-            } else {
-                return $this->respond(['status' => false], 200);
-            }
-        }
-
-        public function getEndorsementDataForEdit2($id)
-        {
-            $data = $this->policyTransactionModel
-                ->select('
-                            policy_transaction.*, 
-                            clients.short_name as client_short_name, 
-                            clients.client_type, 
-                            ( 
-                                select last_action_date
-                                from policy_transaction_status
-                                where policy_tran_id = policy_transaction.id
-                                and status = policy_transaction.status
-                                order by id desc
-                                limit 1
-
-                            ) as last_action_date
-                        ')
-                ->join('clients', 'clients.id = policy_transaction.client_id')
-                ->join('client_policy', 'policy_transaction.client_policy_id = client_policy.id', 'left')
-                ->where('policy_transaction.id', $id)
-                ->where('policy_transaction.is_active', 1)
-                ->orderBy('id', 'asc')
-                ->first();
-
-            $pt_id = null;   
-
-            if(!empty($data)){
-                $inception_data = $this->policyTransactionModel
-                        ->where('policy_no', $data['policy_no'])
-                        ->where('client_id', $data['client_id'])
-                        ->where('action_type', 'inception')
-                        ->first();
-                $pt_id = $inception_data['id'];
-            }    
-
-            if (!empty($data['policy_start_date'])) {
-                $data['policy_start_date'] =  change_date_format($data['policy_start_date'], 'Y-m-d', 'd/m/Y');
-            }
-
-            if (!empty($data['policy_end_date'])) {
-                $data['policy_end_date'] =  change_date_format($data['policy_end_date'], 'Y-m-d', 'd/m/Y');
-            }
-
-            if (!empty($data['data_received_date'])) {
-                $data['data_received_date'] =  change_date_format($data['data_received_date'], 'Y-m-d', 'd/m/Y');
-            }
-
-            if (!empty($data['policy_issue_date'])) {
-                $data['policy_issue_date'] =  change_date_format($data['policy_issue_date'], 'Y-m-d', 'd/m/Y');
-            }
-
-            if (!empty($data['endorse_eff_date'])) {
-                $data['endorse_eff_date'] =  change_date_format($data['endorse_eff_date'], 'Y-m-d', 'd/m/Y');
-            }
-
-            if (!empty($data['install_due_date'])) {
-                $data['install_due_date'] =  change_date_format($data['install_due_date'], 'Y-m-d', 'd/m/Y');
-            }
-
-            if (!empty($data['last_action_date'])) {
-                $data['last_action_date'] =  change_date_format($data['last_action_date'], 'Y-m-d', 'd/m/Y');
-            }
-
-            if (!empty($data['month'])) {
-                $data['month'] =  change_date_format($data['month'], 'Y-m-d', 'M/Y');
-            }
-
-            // print_r($data); die;
-
-            //get PT Co-Share Details
-            $data['pt_co_share_details'] = $this->PTCOShareDetailsModel
-
-                ->select("
-                            pt_co_share_details.*,
-                    
-                            (
-                                SELECT
-                                    COUNT(*)
-                                FROM
-                                    co_share_stmt_details
-                                WHERE
-                                    co_share_stmt_details.co_share_id = pt_co_share_details.id
-                                    AND co_share_stmt_details.is_active = 1
-                            ) AS record_count,
-        
-                                (
-                                    SELECT 
-                                        SUM(actual_bp_amt) 
-                                    FROM 
-                                        co_share_stmt_details 
-                                    WHERE 
-                                        co_share_id = pt_co_share_details.id 
-                                        AND is_active = 1
-                                        
-                                ) AS actual_bp_amount,
-                                
-                                (
-                                    SELECT 
-                                        SUM(actual_tp_amt) 
-                                    FROM 
-                                        co_share_stmt_details 
-                                    WHERE 
-                                        co_share_id = pt_co_share_details.id 
-                                        AND is_active = 1
-                                        
-                                ) AS actual_tp_amount,
-                                
-                                (
-                                    SELECT 
-                                        SUM(actual_tep_amt) 
-                                    FROM 
-                                        co_share_stmt_details 
-                                    WHERE 
-                                        co_share_id = pt_co_share_details.id 
-                                        AND is_active = 1
-                                        
-                                ) AS actual_tep_amount,
-                                
-                                (
-                                    SELECT 
-                                        SUM(actual_bp_per) 
-                                    FROM 
-                                        co_share_stmt_details 
-                                    WHERE 
-                                        co_share_id = pt_co_share_details.id 
-                                        AND is_active = 1
-                                        
-                                ) AS actual_bp_percentage,
-                                
-                                (
-                                    SELECT 
-                                        SUM(actual_tp_per) 
-                                    FROM 
-                                        co_share_stmt_details 
-                                    WHERE 
-                                        co_share_id = pt_co_share_details.id 
-                                        AND is_active = 1
-                                        
-                                ) AS actual_tp_percentage,
-                                
-                                (
-                                    SELECT 
-                                        SUM(actual_tep_per) 
-                                    FROM 
-                                        co_share_stmt_details 
-                                    WHERE 
-                                        co_share_id = pt_co_share_details.id 
-                                        AND is_active = 1
-                                        
-                                ) AS actual_tep_percentage,
-                                
-                                
-                                (
-                                    SELECT 
-                                        SUM(actual_bp_brokerage_amt) 
-                                    FROM 
-                                        co_share_stmt_details 
-                                    WHERE 
-                                        co_share_id = pt_co_share_details.id 
-                                        AND is_active = 1
-                                        
-                                ) AS actual_bp_brokerage_amount,
-                                
-                                
-                                (
-                                    SELECT 
-                                        SUM(actual_tp_brokerage_amt) 
-                                    FROM 
-                                        co_share_stmt_details 
-                                    WHERE 
-                                        co_share_id = pt_co_share_details.id 
-                                        AND is_active = 1
-                                        
-                                ) AS actual_tp_brokerage_amount,
-                                
-                                
-                                (
-                                    SELECT 
-                                        SUM(actual_tep_brokerage_amt) 
-                                    FROM 
-                                        co_share_stmt_details 
-                                    WHERE 
-                                        co_share_id = pt_co_share_details.id 
-                                        AND is_active = 1
-                                        
-                                ) AS actual_tep_brokerage_amount, 
-                                 
-                                DATE_FORMAT(pt_policy_issue_date, '%d/%m/%Y') AS pt_policy_issue_date
-        
-                        ")
-                ->where('pt_id', $id)
-                ->where('is_active', 1)
-                ->orderBy('id', 'asc')
-                ->findAll();
-
-            // print_r($data['endorse_eff_date']); die;
-
-            $pt_bp_amt = $this->PTCOShareDetailsModel
-                ->select('bp_amt, amount')
-                ->where('pt_id', $id)
-                ->where('co_share_type', 1)
-                ->where('is_active', 1)
-                ->first();
-
-            // dd(db_connect()->getLastQuery() ,$pt_bp_amt);
-            $data['base_cd_amount'] = $pt_bp_amt['amount'] ?? null;
-
-            if ($data) {
-                return $this->respond(['status' => true, 'data' => $data, 'pt_id' => $pt_id], 200);
-            } else {
-                return $this->respond(['status' => false], 200);
-            }
-        }
-
-        //------------------------------------------------------------------------------------------------
-
-        //file upload function 
-        public function uploadFile($docs_name = null, $files = null, $pt_id = null)
-        {
-            $GoogleDriveController = new GoogleDriveController();
-
-
-            if(empty($docs_name) && empty($files) && empty($pt_id) && $this->request){
-                $files = $this->request->getFiles();
-                $docs_name = $this->request->getPost('doc_name');
-                $pt_id = $this->request->getPost('pt_id');
-                $client_policy_id = $this->request->getPost('client_policy_id');
-            }
-
-            $uploadFilePath = WRITEPATH . 'uploads/client_kyc_documents';
-
-            $uploadData = [];
-
-            foreach ($docs_name as $key => $docName) {
-
-                // Get the corresponding file for this document name
-                $file = $files['file'][$key];
-
-                if (!empty($docName) && $file->isValid() && !$file->hasMoved()) {
-
-                    // Upload the file
-                    $uploadedFileName = file_Upload_for_lead($file, $uploadFilePath);
-
-                    if ($uploadedFileName) {
-                        // Prepare data for each document upload
-                        $docData = [
-                            'pt_id' => $pt_id,
-                            'doc_name' => $docName,
-                            'file_name' => $uploadedFileName,
-                            'created_by' => get_session_userid(),
-                        ];
-
-                        // $uploadFilePath = $uploadFilePath . '/' . $uploadedFileName;
-
-                        // $GoogleDriveController->uploadFiletoGdrive(client_policy_id: $client_policy_id, doc_type: 'POLICY', file_path: $uploadFilePath, file_name: $uploadedFileName);
-
-                        // Insert into database
-                        $insert = $this->PTFileModel->insert($docData);
-
-                        if ($insert) {
-                            $uploadData[] = $docData;
-                        }
-                    }
-                }
-            }
-
-            if(!empty($docs_name) && !empty($files) && !empty($pt_id) && !$this->request){
-                return true;
-            }
-
-            // print_r($uploadData); die;
-
-            // $uploadData = uploadFilesToGoogleDrive($files['file'], $doc_name, $pt_id);
-
-            if (!empty($uploadData)) {
-
-                $ptFileQuery = $this->PTFileModel
-                    ->join('policy_transaction', 'pt_files.pt_id = policy_transaction.id')
-                    ->where('pt_files.pt_id', $pt_id)
-                    ->where('pt_files.is_active', 1);
-
-                if (!in_array(get_role_id(), [1, 5]) && empty(array_intersect(user_team(), [MANAGEMENT_TEAM_ID, FINANCE_TEAM_ID, BUSINESS_TEAM_ID]))) {
-
-                    if (get_role_id() == 4 && in_array(POS_TEAM_ID, user_team())) {
-                        $ptFileQuery->where('pt_files.created_by', get_session_userid());
-                    }
-                }
-
-                $data['pt_files'] = $ptFileQuery->findAll();
-
-                return $this->respond(['status' => true, 'message' => 'File uploaded successfully in G-Drive', 'data' => $data]);
-            } else {
-                return $this->respond(['status' => false, 'message' => 'Failed to upload file in G-Drive']);
-            }
-        }
-
-        // update Invoice Status 
-        public function updateInvoiceStatus()
-        {
-            $ids = $this->request->getPost('ids');
-            $ids = json_decode($ids);
-
-            // var_dump($ids); die;
-
-            $data['invoice_status'] = $this->request->getPost('invoice_status');
-            if ($this->request->getPost('invoice_status') == 'generated') {
-                $data['invoice_no'] = $this->request->getPost('invoice_no');
-            }
-
-
-            $update = $this->policyTransactionModel
-                ->whereIn('id', $ids)
-                ->set($data)
-                ->update();
-
-
-            if ($update) {
-
-                return $this->respond(['status' => true, 'data' => $ids, 'message' => 'Invoice status updated successfully'], 200);
-            } else {
-                return $this->respond(['status' => true, 'data' => $ids, 'message' => 'Failed to update invoice status'], 200);
-            }
-        }
-
-        public function removeCoShareData($id)
-        {
-            $this->myLogger->logme('error', 'PT Co Share Detailes Remove function called');
-
-            $data = [
-                'updated_by' => get_session_userid(),
-                'is_active' => 0
-            ];
-
-            $update = $this->PTCOShareDetailsModel->where('id', $id)->set($data)->update();
-
-            if ($update) {
-                return $this->respond(['status' => true, 'code' => 200, 'message' => 'Data removed successfully'], 200);
-            } else {
-                return $this->respond(['status' => false, 'code' => 404, 'message' => 'Failed to remove data'], 200);
-            }
-        }
-
-        public function getPTCOShareCount($client_id, $client_policy_id)
-        {
-            $totalCount = $this->PTCOShareDetailsModel
-                ->select("
-                        pt_co_share_details.*,
-                        policy_transaction.bro_payable_by,
-                        policy_transaction.cd_ac_pk,
-                        (
-                            select cd_ac_no
-                            from cd_master
-                            where id = policy_transaction.cd_ac_pk
-                        ) as cd_account_no,
-                        (
-                            select balance
-                            from cash_deposit
-                            where cd_ac_pk = policy_transaction.cd_ac_pk
-                            and is_active = 1
-                            order by id desc
-                            limit 1
-                        ) as cd_amount,
-                    ")
-                ->join('policy_transaction', 'policy_transaction.id = pt_co_share_details.pt_id')
-                ->where('policy_transaction.client_id', $client_id)
-                // ->where('policy_transaction.client_policy_id', $client_policy_id)
-                ->where('policy_transaction.id', $client_policy_id)
-                ->where('policy_transaction.action_type', 'inception')
-                ->where('policy_transaction.is_active', 1)
-                ->findAll();
-
-            $is_copay_yes = $this->policyTransactionModel
-                ->where('client_id', $client_id)
-                // ->where('client_policy_id', $client_policy_id)
-                ->where('id', $client_policy_id)
-                ->where('action_type', 'inception')
-                ->where('is_active', 1)
-                ->first();
-
-            $cd_ac_no = db_connect()->table('cd_master')->where('id', $is_copay_yes['cd_ac_pk'] ?? null)->get()->getRowArray();
-
-            if ($totalCount) {
-                return $this->respond(['status' => true, 'code' => 200, 'data' => $totalCount, 'is_copay_yes' => $is_copay_yes, "cd_master_data" => $cd_ac_no], 200);
-            } else {
-                $insurer_data = $this->clientPolicyModel->where('id', $client_policy_id)->where('is_active', 1)->first();
-                return $this->respond(['status' => false, 'code' => 404, 'message' => 'There is no policy inception data.'], 200);
-            }
-        }
-
-        public function checkInvoiceStatus($pt_id)
-        {
-            $data = $this->policyTransactionModel
-                ->join('pt_co_share_details', 'policy_transaction.id = pt_co_share_details.pt_id')
-                ->join('insurer_statements', 'pt_co_share_details.statement_id = insurer_statements.id')
-                ->where('policy_transaction.id', $pt_id)
-                ->where('policy_transaction.is_active', 1)
-                ->where('pt_co_share_details.is_active', 1)
-                ->where('pt_co_share_details.statement_id IS NOT NULL')
-                ->where('insurer_statements.invoice_no IS NOT NULL')
-                ->countAllResults();
-
-            if ($data) {
-                return $this->respond(['status' => true, 'count' => $data,  'code' => 200], 200);
-            } else {
-                return $this->respond(['status' => false, 'count' => 0, 'message' => 'No Data Found', 'code' => 404], 200);
-            }
-        }
-
-        public function getBasePolicy($client_id, $client_branch_id)
-        {
-            $data = $this->clientPolicyModel
-                ->select('client_policy.*, policy_type.policy_type')
-                ->join('policy_type', 'policy_type.id = client_policy.policy_type_id')
-                ->where('client_policy.client_id', $client_id)
-                ->where('client_policy.client_branch_id', $client_branch_id)
-                ->whereIn('client_policy.policy_type_id', [2, 3])
-                ->where('client_policy.is_active', 1)
-                ->findAll();
-
-            if ($data) {
-                return $this->respond(['status' => true, 'data' => $data,  'code' => 200], 200);
-            } else {
-                return $this->respond(['status' => false, 'count' => 0, 'message' => 'No Data Found', 'code' => 404], 200);
-            }
-        }
-
-        //---------------------------------------------------------------------------------------------------
-
-        //get BDS Reports data old function
-        public function reportBDSOld()
-        {
-            $data['tab_name'] = 'BDS Report';
-            $data['page_name'] = 'BDS Report';
-
-            $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',
-            ];
-
-            $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();
-
-            //filter datas
-            $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');
-
-            $start_date = (!isset($start_date) || $start_date === '' || $start_date === null) ? 0 : $start_date;
-            $end_date = (!isset($end_date) || $end_date === '' || $end_date === null) ? 0 : $end_date;
-
-            $client_id = (!isset($client_id) || $client_id === '' || $client_id === null) ? 0 : $client_id;
-            $insurer_id = (!isset($insurer_id) || $insurer_id === '' || $insurer_id === null) ? 0 : $insurer_id;
-            $policy_type_id = (!isset($policy_type_id) || $policy_type_id === '' || $policy_type_id === null) ? 0 : $policy_type_id;
-            $date_type = (!isset($date_type) || $date_type === '' || $date_type === null) ? 0 : $date_type;
-            $issuer = (!isset($issuer) || $issuer === '' || $issuer === null) ? 0 : $issuer;
-
-
-            //Actual data for the list
-            $data['report_list'] = $this->policyTransactionModel->getBDSReportList($start_date, $end_date, $client_id, $insurer_id, $policy_type_id, $date_type, $issuer);
-            // dd($data);
-
-            $this->loadLayout('report_bds_filter', $data);
-        }
-
-        //get BDS Reports data New Function
-        public function reportBDS()
-        {
-
-            $data['tab_name'] = 'BDS Report';
-            $data['page_name'] = 'BDS Report';
-
-            $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',
-            ];
-
-            $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();
-
-
-            //filter datas
-            $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');
-
-            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));
-            }
-
-            // dd($start_date, $end_date, $date_type);
-
-            $start_date = (!isset($start_date) || $start_date === '' || $start_date === null) ? 0 : $start_date;
-            $end_date = (!isset($end_date) || $end_date === '' || $end_date === null) ? 0 : $end_date;
-
-            $client_id = (!isset($client_id) || $client_id === '' || $client_id === null) ? 0 : $client_id;
-            $insurer_id = (!isset($insurer_id) || $insurer_id === '' || $insurer_id === null) ? 0 : $insurer_id;
-            $policy_type_id = (!isset($policy_type_id) || $policy_type_id === '' || $policy_type_id === null) ? 0 : $policy_type_id;
-            $date_type = (!isset($date_type) || $date_type === '' || $date_type === null) ? 0 : $date_type;
-            $issuer = (!isset($issuer) || $issuer === '' || $issuer === null) ? 0 : $issuer;
-            $client_branch_id = (!isset($client_branch_id) || $client_branch_id === '' || $client_branch_id === null) ? 0 : $client_branch_id;
-            $insurer_branch_id = (!isset($insurer_branch_id) || $insurer_branch_id === '' || $insurer_branch_id === null) ? 0 : $insurer_branch_id;
-            $client_policy_id = (!isset($client_policy_id) || $client_policy_id === '' || $client_policy_id === null) ? 0 : $client_policy_id;
-            $user_id = (!isset($user_id) || $user_id === '' || $user_id === null) ? 0 : $user_id;
-            if ($this->request->is('post')) {
-                $request_post_data   = $this->request->getPost();
-                $sanitized_post_data = sanitizeInputArrayAdvanced($request_post_data);
-                $isFromDashboard = $sanitized_post_data["is_dashboard"];
-
-                if (isset($isFromDashboard) && !empty($isFromDashboard) && $isFromDashboard == 1) {
-                    $ids = $sanitized_post_data['ids'];
-
-                    $ids = array_filter(explode(',', $ids));
-
-                    if (!empty($ids)) {
-                        $idsStr = implode(',', array_map('intval', $ids)); // sanitize IDs to be integers
-                        $where = "policy_transaction.id IN ($idsStr)";
-                    } else {
-                        $where = []; // No valid IDs, return empty result
-                    }
-                }
-                // dd($ids);
-            }
-            //Actual data for the list
-            $data['report_list'] = $this->policyTransactionModel->getBDSReportList($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, isset($where) ? $where : '');
-            // dd($data);
-
-            $this->loadLayout('report_bds_filter', $data);
-        }
-
-        public function reportVarience()
-        {
-            $data['tab_name'] = 'Variance Report';
-            $data['page_name'] = 'Variance Report';
-
-            $data['issuer'] = [1 => 'JIBS', 2 => 'Nhance'];
-            $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['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',
-            ];
-
-            //filter datas
-            $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');
-
-
-            $start_date = (!isset($start_date) || $start_date === '' || $start_date === null) ? 0 : $start_date;
-            $end_date = (!isset($end_date) || $end_date === '' || $end_date === null) ? 0 : $end_date;
-
-            $client_id = (!isset($client_id) || $client_id === '' || $client_id === null) ? 0 : $client_id;
-            $insurer_id = (!isset($insurer_id) || $insurer_id === '' || $insurer_id === null) ? 0 : $insurer_id;
-            $policy_type_id = (!isset($policy_type_id) || $policy_type_id === '' || $policy_type_id === null) ? 0 : $policy_type_id;
-            $date_type = (!isset($date_type) || $date_type === '' || $date_type === null) ? 0 : $date_type;
-            $issuer = (!isset($issuer) || $issuer === '' || $issuer === null) ? 0 : $issuer;
-
-            $client_branch_id = (!isset($client_branch_id) || $client_branch_id === '' || $client_branch_id === null) ? 0 : $client_branch_id;
-            $insurer_branch_id = (!isset($insurer_branch_id) || $insurer_branch_id === '' || $insurer_branch_id === null) ? 0 : $insurer_branch_id;
-            $client_policy_id = (!isset($client_policy_id) || $client_policy_id === '' || $client_policy_id === null) ? 0 : $client_policy_id;
-
-
-            $data['varience_list'] = $this->policyTransactionModel->getVarienceReportLIst($start_date, $end_date, $client_id, $insurer_id, $policy_type_id, $date_type, $issuer, $client_branch_id, $insurer_branch_id, $client_policy_id);
-            // !dd($data['varience_list']);
-            $this->loadLayout('variance_report_list', $data);
-        }
-
-
-        public function reportBusinessList()
-        {
-            $data['tab_name'] = 'Business Report';
-            $data['page_name'] = 'Business Report';
-
-            $data['issuer'] = [1 => 'JIBS', 2 => 'Nhance'];
-            $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['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',
-            ];
-
-            //filter datas
-            $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');
-
-            $start_date = (!isset($start_date) || $start_date === '' || $start_date === null) ? 0 : $start_date;
-            $end_date = (!isset($end_date) || $end_date === '' || $end_date === null) ? 0 : $end_date;
-
-            $client_id = (!isset($client_id) || $client_id === '' || $client_id === null) ? 0 : $client_id;
-            $insurer_id = (!isset($insurer_id) || $insurer_id === '' || $insurer_id === null) ? 0 : $insurer_id;
-            $policy_type_id = (!isset($policy_type_id) || $policy_type_id === '' || $policy_type_id === null) ? 0 : $policy_type_id;
-            $date_type = (!isset($date_type) || $date_type === '' || $date_type === null) ? 0 : $date_type;
-            $issuer = (!isset($issuer) || $issuer === '' || $issuer === null) ? 0 : $issuer;
-
-
-            $data['business_list'] = $this->policyTransactionModel->getBusinessReportList($start_date, $end_date, $client_id, $insurer_id, $policy_type_id, $date_type, $issuer);
-            $this->loadLayout('business_team_list', $data);
-        }
-
-
-        public function reportFinanceList()
-        {
-            $data['tab_name'] = 'Finance Report';
-            $data['page_name'] = 'Finance Report';
-
-            $data['issuer'] = [1 => 'JIBS', 2 => 'Nhance'];
-            $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['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',
-            ];
-
-            //filter datas
-            $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');
-
-            $start_date = (!isset($start_date) || $start_date === '' || $start_date === null) ? 0 : $start_date;
-            $end_date = (!isset($end_date) || $end_date === '' || $end_date === null) ? 0 : $end_date;
-
-            $client_id = (!isset($client_id) || $client_id === '' || $client_id === null) ? 0 : $client_id;
-            $insurer_id = (!isset($insurer_id) || $insurer_id === '' || $insurer_id === null) ? 0 : $insurer_id;
-            $policy_type_id = (!isset($policy_type_id) || $policy_type_id === '' || $policy_type_id === null) ? 0 : $policy_type_id;
-            $date_type = (!isset($date_type) || $date_type === '' || $date_type === null) ? 0 : $date_type;
-            $issuer = (!isset($issuer) || $issuer === '' || $issuer === null) ? 0 : $issuer;
-
-
-
-            $data['finance_list'] = $this->policyTransactionModel->getFinanceReportList($start_date, $end_date, $client_id, $insurer_id, $policy_type_id, $date_type, $issuer);
-            $this->loadLayout('finance_team_list', $data);
-        }
-
-        public function reportOutstanding()
-        {
-            $data['tab_name'] = 'Outstanding Report';
-            $data['page_name'] = 'Outstanding Report';
-
-            $data['issuer'] = [1 => 'JIBS', 2 => 'Nhance'];
-            $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['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',
-            ];
-
-            //filter datas
-            $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');
-            $insurer_branch_id = $this->request->getGet('insurer_branch_id');
-
-            $start_date = (!isset($start_date) || $start_date === '' || $start_date === null) ? 0 : change_date_format($start_date, 'd-m-Y', 'Y-m-01');
-            $end_date = (!isset($end_date) || $end_date === '' || $end_date === null) ? 0 : change_date_format($end_date, 'd-m-Y', 'Y-m-31');
-            // dd([$start_date,$end_date]);
-
-
-            $insurer_id = (!isset($insurer_id) || $insurer_id === '' || $insurer_id === null) ? 0 : $insurer_id;
-            $insurer_branch_id = (!isset($insurer_branch_id) || $insurer_branch_id === '' || $insurer_branch_id === null) ? 0 : $insurer_branch_id;
-
-            $data['outstanting_list'] = $this->policyTransactionModel->getOutstandingReportLIst($start_date, $end_date, $insurer_id, $insurer_branch_id);
-            // dd($this->policyTransactionModel->getLastQuery());
-            // dd($data);
-            $this->loadLayout('outstanding_report_list', $data);
-        }
-
-        //---------------------------------------------------------------------------------------------------
-
-        //insurer statement list page
-        public function statementList()
-        {
-            // dd($this->updateInsurerStatement(['file_id' => 133])); // for check validateInsurerStatementfunction with hard coded file id always un command
-            $data['insurers'] = $this->insurerModel->where('is_active',1)->findAll();
-            $today = date('Y-m-d');
-            $fromday = $from_date = date('Y-m-d', strtotime('-180 days', strtotime($today)));
-            // echo $fromday;die();
-            $data['invoice_status_array'] = $this->invoiceStatus;
-            $data['insurers'] = $this->insurerBranchModel->getInsurerBranchesWithInsurerNames();
-
-            // dd( $data['insurers']);
-            $data['insurer_statement_list'] = $this->insurerStatements
-                ->select(
-                    'insurer_statements.*, 
-                                                            insurers.name AS insurer_name, 
-                                                            insurers.short_name, 
-                                                            user_profiles.first_name, 
-                                                            insurer_branch.branch_code,
-                                                            (SELECT SUM(pt_co_share_details.exp_amt) 
-                                                            FROM pt_co_share_details 
-                                                            WHERE pt_co_share_details.is_active = 1 
-                                                                AND pt_co_share_details.statement_id = insurer_statements.id
-                                                            ) AS exp_inv_amt,
-                                                            (SELECT SUM(inv_payment_details.inv_amt) + SUM(inv_payment_details.tds)  + SUM(inv_payment_details.gst)
-                                                            FROM inv_payment_details 
-                                                            WHERE inv_payment_details.is_active = 1 
-                                                                AND inv_payment_details.statement_id = insurer_statements.id
-                                                            ) AS received_inv_amt'
-                )
-                ->join('insurers', 'insurer_statements.insurer_id = insurers.id')
-                ->join('insurer_branch', 'insurer_statements.branch_id = insurer_branch.id')
-                ->join('user_profiles', 'insurer_statements.created_by = user_profiles.id')
-                ->where('insurer_statements.is_active', 1)
-                ->where('insurers.is_active', 1)
-                ->where('insurer_branch.is_active', 1)
-                // ->where('insurer_statements.file_status','success')
-                ->where('date(insurer_statements.created_at) >= ', $from_date)
-                ->where('date(insurer_statements.created_at) <= ', $today)
-                ->orderBy('insurer_statements.id', 'DESC')
-                ->findAll();
-
-            // dd( $this->insurerStatements->getLastQuery());
-            $data['tab_name'] = 'Statement Upload';
-            $data['page_name'] = 'Statement Upload';
-
-            $this->loadLayout('insurer_statement_list',  $data);
-        }
-
-        // public function failedStatementList(){
-        //     $today = date('Y-m-d');
-        //     $fromday = $from_date = date('Y-m-d', strtotime('-180 days', strtotime($today)));
-        //     // echo $fromday;die();
-        //      $data['invoice_status_array'] = $this->invoiceStatus;
-        //      $data['insurers'] = $this->insurerBranchModel ->getInsurerBranchesWithInsurerNames();
-
-        //      // dd( $data['insurers']);
-        //      $data['insurer_statement_list'] = $this->insurerStatements
-        //                                             ->select('insurer_statements.*, 
-        //                                                       insurers.name AS insurer_name, 
-        //                                                       insurers.short_name, 
-        //                                                       user_profiles.first_name, 
-        //                                                       insurer_branch.branch_code,
-        //                                                       (SELECT SUM(pt_co_share_details.exp_amt) 
-        //                                                        FROM pt_co_share_details 
-        //                                                        WHERE pt_co_share_details.is_active = 1 
-        //                                                          AND pt_co_share_details.statement_id = insurer_statements.id
-        //                                                       ) AS exp_inv_amt,
-        //                                                       (SELECT SUM(inv_payment_details.inv_amt) + SUM(inv_payment_details.tds)  + SUM(inv_payment_details.gst)
-        //                                                        FROM inv_payment_details 
-        //                                                        WHERE inv_payment_details.is_active = 1 
-        //                                                          AND inv_payment_details.statement_id = insurer_statements.id
-        //                                                       ) AS received_inv_amt'
-        //                                             )
-        //                                             ->join('insurers', 'insurer_statements.insurer_id = insurers.id')
-        //                                             ->join('insurer_branch', 'insurer_statements.branch_id = insurer_branch.id')
-        //                                             ->join('user_profiles', 'insurer_statements.created_by = user_profiles.id')
-        //                                             ->where('insurer_statements.is_active', 1)
-        //                                             ->where('insurer_statements.file_status','failed')
-        //                                             ->where('date(insurer_statements.created_at) >= ', $from_date)
-        //                                             ->where('date(insurer_statements.created_at) <= ', $today)
-        //                                             ->orderBy('insurer_statements.id', 'DESC')
-        //                                             ->findAll();
-        //         if($data['insurer_statement_list']){
-        //             return $this->respond(['status' => true, 'code' => 200,'data'=>$data ], 200);
-        //         }else{
-        //             return $this->respond(['status'=>false,'message'=>'Data Not Fount'],404);
-        //         }
-
+        // if (!isset($data['is_cd_reduce_from_bds'])) {
+        //     $data['is_cd_reduce_from_bds'] = 0;
+        // } elseif ($data['is_cd_reduce_from_bds']) {
+        //     $data['is_cd_reduce_from_bds'] = 1;
         // }
 
-        public function uploadInsurerStatement()
-        {
-
-            //validate uploaded file
-            $filename = '';
-            $validated = $this->validate([
-                'statement' => [
-                    'uploaded[statement]',
-                    'mime_in[statement,application/vnd.ms-excel,application/vnd,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.oasis.opendocument.spreadsheet]',
-                    'max_size[statement,16384]',
-                ],
-            ]);
-            // $this->createStatementFolder();
-            if ($validated) {
-                $avatar = $this->request->getFile('statement');
-                if (!$avatar) {
-                    $this->myLogger->logme("error", 'Statement File not found');
-                    return $this->respond(['dataStatus' => false, 'code' => 400, 'message' => 'File not found'], 400);
-                }
-
-                $is_moved = $avatar->move(WRITEPATH . 'uploads/statements/');
-                if ($is_moved) {
-                    $filename = $avatar->getName();
-                    // Handle successful upload, e.g., log success or further processing
-                    $this->myLogger->logme("error", 'Statement File moved successful');
-                } else {
-                    $this->myLogger->logme("error", 'Statement File move failed');
-                    return $this->respond(['dataStatus' => false, 'code' => 500, 'message' => 'File move failed'], 500);
-                }
-            } else {
-                $this->myLogger->logme("error", 'Statement Upload failed Invalid file');
-                return $this->respond(['dataStatus' => false, 'code' => 404, 'message' => 'Invalid file'], 404);
-            }
-
-            //process post variable entry in file table
-            $loggedInUserID = get_session_userid();
-            // dd($loggedInUserID);
-            // $loggedInUserID = 8;
-
-            $insurer = $this->request->getPost('insurer');
-
-            $insurer_id = explode('-', $insurer)[0];
-            $branch_id = explode('-', $insurer)[1];
-            // print_r($insurer_id);
-            // print_r($branch_id);
-            // die();
-            $month = $this->request->getPost('statement_month');
-            $month = $month . '-01';
-            // print_r($month);die;
-            $month = change_date_format($month, 'Y-M-d', 'Y-m-d');
-            $stmt_sno = $this->request->getPost('statement_no');
-            // print_r($month);die;
-
-            $file_id = $this->insurerStatements->insert(['insurer_id' => $insurer_id, 'branch_id' => $branch_id, 'file_name' => $filename, 'month' => $month, 'created_by' => $loggedInUserID, 'stmt_sno' => $stmt_sno]); //here field policy_id have client_policy_id and not policy id from policy master
-            $this->myLogger->logme("error", '{file_id} statement uploaded success', ['file_id' => $file_id]);
-
-            //validate file
-            $validation_result = $this->validateInsurerStatement(['file_id' => $file_id]);
-            //update file content to DB
-            if ($validation_result['status']) {
-                $this->updateInsurerStatement(['file_id' => $file_id]);
-            }
-
-            if (!isset($file_id) || !$validation_result['status']) {
-                return $this->respond(['dataStatus' => false, 'code' => 404, 'message' => 'file not uploaded', 'error_data' => $validation_result['error_data'], 'error_code' =>   $validation_result['error_code']], 200);
-            }
-
-            if (isset($file_id) || $validation_result['status']) {
-                $this->insurerStatements->where('id', $file_id)->set(['invoice_status' => 'pending'])->update();
-            }
-
-
-
-            return $this->respond(['dataStatus' => true, 'code' => 200, 'data' => 'file upload success'], 200);
+        if (empty($data['data_received_date'])) {
+            $data['data_received_date'] = null;
+        } else {
+            $data['data_received_date'] =  change_date_format($data['data_received_date'], 'd/m/Y', 'Y-m-d');
         }
 
-        public function createStatementFolder()
-        {
-            $folderPath = WRITEPATH . 'uploads/statements/';
+        if (empty($data['policy_issue_date'])) {
+            $data['policy_issue_date'] = null;
+        } else {
+            $data['policy_issue_date'] =  change_date_format($data['policy_issue_date'], 'd/m/Y', 'Y-m-d');
+        }
 
-            // Check if the folder doesn't exist
-            if (!file_exists($folderPath)) {
-                // Create the folder
-                if (mkdir($folderPath, 0777, true)) {
-                    $this->myLogger->logme('error', 'statement upload folder created successfully');
+        if (empty($data['endorse_eff_date'])) {
+            $data['endorse_eff_date'] = null;
+        } else {
+            $data['endorse_eff_date'] =  change_date_format($data['endorse_eff_date'], 'd/m/Y', 'Y-m-d');
+        }
 
-                    // Set permissions to a+rwx (read, write, execute for all)
-                    chmod($folderPath, 0777);
-                    $this->myLogger->logme('error', 'Permissions set to a+rwx.');
-                } else {
-                    // echo "Failed to create folder.";
-                    $this->myLogger->logme('error', 'Failed to create statement upload folder.');
-                }
-            } else {
-                $this->myLogger->logme('error', 'upload folder exists.');
+        if (empty($data['install_due_date'])) {
+            $data['install_due_date'] = null;
+        } else {
+            $data['install_due_date'] =  change_date_format($data['install_due_date'], 'd/m/Y', 'Y-m-d');
+        }
+
+        if (!empty($data['month'])) {
+            $month = '01/' . $data['month'];
+            $data['month'] =  change_date_format($month, 'd/M/Y', 'Y-m-d');
+        }
+
+        if (empty($data['last_action_date'])) {
+            $data['last_action_date'] = null;
+        } else {
+            $data['last_action_date'] = change_date_format($data['last_action_date']);
+        }
+
+        // print_r($data); die;   
+
+        // Separate Insurer and TPA Branch IDs and IDs
+        if (isset($data['insurer_id']) && !empty($data['insurer_id'])) {
+            list($data['insurer_branch_id'], $data['insurer_id']) = explode('-', $data['insurer_id']);
+            if (isset($data['tpa']) && !empty($data['tpa'])) {
+                list($data['tpa_branch_id'], $data['tpa_id']) = explode('-', $data['tpa']);
             }
         }
 
-        public function validateInsurerStatementOld($params)
-        {
-            helper('excel_util_helper');
+        $issue_type = $this->policyTransactionModel
+            ->where('action_type', 'inception')
+            ->where('client_id', $this->request->getPost('client_id'))
+            // ->where('client_policy_id', $this->request->getPost('client_policy_id'))
+            ->where('id', $this->request->getPost('client_policy_id'))
+            ->where('policy_transaction.is_active', 1)
+            ->first();
+
+        $data['tsi'] = generate_tsi_code($issue_type['issue_type'] ?? 1);
+
+        if (!isset($data['client_branch_id']) || $data['client_branch_id'] == "") {
+            $client_branch_id = $issue_type['client_branch_id'];
+        }else{
+            $client_branch_id = $data['client_branch_id'];
+        }
+
+        $data['is_cd_reduce_from_bds'] = (isset($issue_type['policy_type_id']) && $issue_type['policy_type_id'] > 7 && $data['client_type'] == 1) ? 1 : 0;
+
+        // if($data['bro_payable_by'] == ""){
+        //     $data['bro_payable_by'] = $issue_type['bro_payable_by'];
+        // }
+
+        if (!$data['id']) {
+
+            $data += [
+                'issuer' => 2,
+                'issuer_branch' => $data['issuer_branch'] ?? 1,
+                'client_type' => $data['client_type'] ?? $issue_type['client_type'] ?? null,
+                'policy_type_id' => $issue_type['policy_type_id'] ?? null,
+                'issue_type' => $issue_type['issue_type'] ?? null,
+                'source_client_policy_id' => $issue_type['source_client_policy_id'] ?? null,
+                'cd_ac_no' => isset($data['cd_ac_no']) && !empty($data['cd_ac_no']) ? $data['cd_ac_no'] : $issue_type['cd_ac_no'] ?? null,
+                'cd_ac_pk' => isset($data['cd_ac_pk']) && !empty($data['cd_ac_pk']) ? $data['cd_ac_pk'] : $issue_type['cd_ac_pk'] ?? null,
+                // 'policy_issue_date' => $issue_type['policy_issue_date'] ?? null,
+                'policy_start_date' => $issue_type['policy_start_date'] ?? null,
+                'policy_end_date' => $issue_type['policy_end_date'] ?? null,
+                'revenue_type' =>  $issue_type['revenue_type'] ?? null,
+                'co_share' => $issue_type['co_share'] ?? 0,
+                'bro_payable_by' =>  $data['bro_payable_by'] == "" ? $issue_type['bro_payable_by'] ?? 0 :  $data['bro_payable_by'],
+                'installment' => $issue_type['installment'] ?? null,
+                'installment_data' => $issue_type['installment_data'] ?? null,
+                'location' => $issue_type['location'] ?? null,
+                'links' =>  $issue_type['links'] ?? null,
+                'stage' => $issue_type['stage'] ?? null,
+                'etat' => $issue_type['etat'] ?? null,
+                'etat_band' => $issue_type['etat_band'] ?? null,
+                'edate' => $issue_type['edate'] ?? null,
+                'renewal_date' => $issue_type['renewal_date'] ?? null,
+                'rollover_date' => $issue_type['rollover_date'] ?? null,
+                'policy_holder_name' => $issue_type['policy_holder_name'] ?? null,
+                'same_as_proposer' => $issue_type['same_as_proposer'] ?? 1,
+                'ref' => $issue_type['ref'] ?? null,
+                'spl' => $issue_type['spl'] ?? null,
+                'fund_received' => $issue_type['fund_received'] ?? null,
+                'listed_insurers' => $issue_type['listed_insurers'] ?? null,
+                'ppteam' => $issue_type['ppteam'] ?? null,
+                'sales_generated_by' => $issue_type['sales_generated_by'] ?? null,
+                'serviced_by' => $issue_type['serviced_by'] ?? null,
+                'salse_person_manager_id' => $issue_type['salse_person_manager_id'] ?? null,
+                'service_person_manager_id' => $issue_type['service_person_manager_id'] ?? null,
+                'service_person_branch_id' => $issue_type['service_person_branch_id'] ?? null,
+                'agent_id' => $issue_type['agent_id'] ?? null,
+                'agent_code' => $issue_type['agent_code'] ?? null,
+                'pos_id' => $issue_type['pos_id'] ?? null,
+            ];
+
+            $data['client_branch_id'] = $client_branch_id;
+        }
+
+        // print_r($issue_type); 
+        // print_r($data); 
+        // die;
+
+        return $data;
+    }
+
+    private function insertEndorsementTransaction($data)
+    {
+        $insert = $this->policyTransactionModel->insert($data);
+
+        if ($insert) {
+
+            $this->insertTransactionStatus($insert, $data, 1);
+            $this->handleCompletedStatus($data, $insert);
+            $this->insertOrUpdateCoShareDetails($data, $insert);
+
+            // policy file upload 
+            if(isset($data['doc_name']) && isset($data['file_data']) && !empty($data['doc_name']) && !empty($data['file_data'])){
+                $this->uploadFile($data['doc_name'], $data['file_data'], $insert);
+            }
+
+            return $this->respond(['status' => true, 'message' => 'Endorsement transaction created successfully'], 200);
+        }
+
+        return $this->respond(['status' => false, 'message' => 'Endorsement transaction creation failed'], 400);
+    }
+
+    private function updateEndorsementTransaction($id, $data)
+    {   
+        $data['updated_by']  = get_session_userid();
+        $old_endorse_data =  $this->policyTransactionModel->where('id', $id)->where('is_active', 1)->first();
+        $update = $this->policyTransactionModel->where('id', $id)->set($data)->update();
+
+        if ($update) {
+
+            $this->insertTransactionStatus($id, $data, 1);
+            // if($old_endorse_data['status'] != "completed"){
+            //     $this->handleCompletedStatus($data, $id);
+            // }
+            $this->insertOrUpdateCoShareDetails($data, $id);
+
+
+            return $this->respond(['status' => true, 'message' => 'Endorsement transaction updated successfully'], 200);
+        }
+
+        return $this->respond(['status' => false, 'message' => 'Endorsement transaction update failed'], 400);
+    }
+
+    private function handleCompletedStatus($data, $policy_tran_id)
+    {   
+        if ($data['client_type'] == 1 && $data['status'] == 'completed' && $data['is_cd_reduce_from_bds'] == 1) {
+
+            $tolamt = (int) $data['total'][0] ?? 0;
+
+            if(!empty($tolamt)){
+                $description = 'The following amount of Rs. ' . round($tolamt, 2) . '/- has been' .
+                    ($data['action_type'] == 'deletion' ? ' Credit ' : ' Debit ') . 'from the policy transaction (BDS)';
+                
+                $cd_tranction_data = [
+                    'amount' => abs($tolamt),
+                    'sub_type_id' => $data['action_type'] == 'deletion' ? 3 : 4,
+                    'client_id' => $data['client_id'],
+                    'client_policy_id' => $data['client_policy_id'],
+                    'endorsement_no' => null,
+                    'cd_ac_no' => $data['cd_ac_no'] ?? null,
+                    'insurer_id' => $data['insurer_id'],
+                    'description' => $description,
+                    'transaction_type' => $data['action_type'] == 'deletion' ? 'Credit' : 'Debit',
+                    'updated_by' => get_session_userid(),
+                    'event_name' => $data['action_type'],
+                    'is_active' => 1,
+                    'cd_ac_pk' => $data['cd_ac_pk'] ?? null,
+                    'pt_id' => $policy_tran_id ?? null,
+                ];
+
+                $result = DepositHelper::saveDeposit($cd_tranction_data, get_session_userid());
+
+                if(isset($result['success']) && $result['success']){
+                    $update_data['ct_tran_id'] = $result['insert_id'];
+                    $this->policyTransactionModel->where('id', $policy_tran_id)->set($update_data)->update();
+                }
+            }
+
+        }
+    }
+
+    public function getEndorsementDataForEdit($id)
+    {
+        $data = $this->policyTransactionModel
+            ->select('
+                        policy_transaction.*, 
+                        clients.short_name as client_short_name, 
+                        clients.client_type, 
+                        ( 
+                            select last_action_date
+                            from policy_transaction_status
+                            where policy_tran_id = policy_transaction.id
+                            and status = policy_transaction.status
+                            order by id desc
+                            limit 1
+
+                        ) as last_action_date
+                    ')
+            ->join('clients', 'clients.id = policy_transaction.client_id')
+            ->join('client_policy', 'policy_transaction.client_policy_id = client_policy.id', 'left')
+            ->where('policy_transaction.id', $id)
+            ->where('policy_transaction.is_active', 1)
+            ->orderBy('id', 'asc')
+            ->first();
+
+        $pt_id = null;   
+
+        if(!empty($data)){
+            $inception_data = $this->policyTransactionModel
+                    ->where('policy_no', $data['policy_no'])
+                    ->where('client_id', $data['client_id'])
+                    ->where('action_type', 'inception')
+                    ->first();
+            $pt_id = $inception_data['id'];
+        }    
+
+        if (!empty($data['policy_start_date'])) {
+            $data['policy_start_date'] =  change_date_format($data['policy_start_date'], 'Y-m-d', 'd/m/Y');
+        }
+
+        if (!empty($data['policy_end_date'])) {
+            $data['policy_end_date'] =  change_date_format($data['policy_end_date'], 'Y-m-d', 'd/m/Y');
+        }
+
+        if (!empty($data['data_received_date'])) {
+            $data['data_received_date'] =  change_date_format($data['data_received_date'], 'Y-m-d', 'd/m/Y');
+        }
+
+        if (!empty($data['policy_issue_date'])) {
+            $data['policy_issue_date'] =  change_date_format($data['policy_issue_date'], 'Y-m-d', 'd/m/Y');
+        }
+
+        if (!empty($data['endorse_eff_date'])) {
+            $data['endorse_eff_date'] =  change_date_format($data['endorse_eff_date'], 'Y-m-d', 'd/m/Y');
+        }
+
+        if (!empty($data['install_due_date'])) {
+            $data['install_due_date'] =  change_date_format($data['install_due_date'], 'Y-m-d', 'd/m/Y');
+        }
+
+        if (!empty($data['last_action_date'])) {
+            $data['last_action_date'] =  change_date_format($data['last_action_date'], 'Y-m-d', 'd/m/Y');
+        }
+
+        if (!empty($data['month'])) {
+            $data['month'] =  change_date_format($data['month'], 'Y-m-d', 'M/Y');
+        }
+
+        // print_r($data); die;
+
+        //get PT Co-Share Details
+        $data['pt_co_share_details'] = $this->PTCOShareDetailsModel
+
+            ->select("
+                        pt_co_share_details.*,
+                
+                        (
+                            SELECT
+                                COUNT(*)
+                            FROM
+                                co_share_stmt_details
+                            WHERE
+                                co_share_stmt_details.co_share_id = pt_co_share_details.id
+                                AND co_share_stmt_details.is_active = 1
+                        ) AS record_count,
+    
+                            (
+                                SELECT 
+                                    SUM(actual_bp_amt) 
+                                FROM 
+                                    co_share_stmt_details 
+                                WHERE 
+                                    co_share_id = pt_co_share_details.id 
+                                    AND is_active = 1
+                                    
+                            ) AS actual_bp_amount,
+                            
+                            (
+                                SELECT 
+                                    SUM(actual_tp_amt) 
+                                FROM 
+                                    co_share_stmt_details 
+                                WHERE 
+                                    co_share_id = pt_co_share_details.id 
+                                    AND is_active = 1
+                                    
+                            ) AS actual_tp_amount,
+                            
+                            (
+                                SELECT 
+                                    SUM(actual_tep_amt) 
+                                FROM 
+                                    co_share_stmt_details 
+                                WHERE 
+                                    co_share_id = pt_co_share_details.id 
+                                    AND is_active = 1
+                                    
+                            ) AS actual_tep_amount,
+                            
+                            (
+                                SELECT 
+                                    SUM(actual_bp_per) 
+                                FROM 
+                                    co_share_stmt_details 
+                                WHERE 
+                                    co_share_id = pt_co_share_details.id 
+                                    AND is_active = 1
+                                    
+                            ) AS actual_bp_percentage,
+                            
+                            (
+                                SELECT 
+                                    SUM(actual_tp_per) 
+                                FROM 
+                                    co_share_stmt_details 
+                                WHERE 
+                                    co_share_id = pt_co_share_details.id 
+                                    AND is_active = 1
+                                    
+                            ) AS actual_tp_percentage,
+                            
+                            (
+                                SELECT 
+                                    SUM(actual_tep_per) 
+                                FROM 
+                                    co_share_stmt_details 
+                                WHERE 
+                                    co_share_id = pt_co_share_details.id 
+                                    AND is_active = 1
+                                    
+                            ) AS actual_tep_percentage,
+                            
+                            
+                            (
+                                SELECT 
+                                    SUM(actual_bp_brokerage_amt) 
+                                FROM 
+                                    co_share_stmt_details 
+                                WHERE 
+                                    co_share_id = pt_co_share_details.id 
+                                    AND is_active = 1
+                                    
+                            ) AS actual_bp_brokerage_amount,
+                            
+                            
+                            (
+                                SELECT 
+                                    SUM(actual_tp_brokerage_amt) 
+                                FROM 
+                                    co_share_stmt_details 
+                                WHERE 
+                                    co_share_id = pt_co_share_details.id 
+                                    AND is_active = 1
+                                    
+                            ) AS actual_tp_brokerage_amount,
+                            
+                            
+                            (
+                                SELECT 
+                                    SUM(actual_tep_brokerage_amt) 
+                                FROM 
+                                    co_share_stmt_details 
+                                WHERE 
+                                    co_share_id = pt_co_share_details.id 
+                                    AND is_active = 1
+                                    
+                            ) AS actual_tep_brokerage_amount, 
+                                
+                            DATE_FORMAT(pt_policy_issue_date, '%d/%m/%Y') AS pt_policy_issue_date
+    
+                    ")
+            ->where('pt_id', $id)
+            ->where('is_active', 1)
+            ->orderBy('id', 'asc')
+            ->findAll();
+
+        // print_r($data['endorse_eff_date']); die;
+
+        $pt_bp_amt = $this->PTCOShareDetailsModel
+            ->select('bp_amt, amount')
+            ->where('pt_id', $id)
+            ->where('co_share_type', 1)
+            ->where('is_active', 1)
+            ->first();
+
+        // dd(db_connect()->getLastQuery() ,$pt_bp_amt);
+        $data['base_cd_amount'] = $pt_bp_amt['amount'] ?? null;
+
+        $ptFileQuery = $this->PTFileModel
+            ->join('policy_transaction', 'pt_files.pt_id = policy_transaction.id')
+            ->where('pt_files.pt_id', $id)
+            ->where('pt_files.is_active', 1);
+
+        if (!in_array(get_role_id(), [1, 5]) && empty(array_intersect(user_team(), [MANAGEMENT_TEAM_ID, FINANCE_TEAM_ID, BUSINESS_TEAM_ID]))) {
+
+            if (get_role_id() == 4 && in_array(POS_TEAM_ID, user_team())) {
+                $ptFileQuery->where('pt_files.created_by', get_session_userid());
+            }
+        }
+
+        $data['pt_files'] = $ptFileQuery->findAll();
+
+        if ($data) {
+            return $this->respond(['status' => true, 'data' => $data, 'pt_id' => $pt_id], 200);
+        } else {
+            return $this->respond(['status' => false], 200);
+        }
+    }
+
+    public function getEndorsementDataForEdit2($id)
+    {
+        $data = $this->policyTransactionModel
+            ->select('
+                        policy_transaction.*, 
+                        clients.short_name as client_short_name, 
+                        clients.client_type, 
+                        ( 
+                            select last_action_date
+                            from policy_transaction_status
+                            where policy_tran_id = policy_transaction.id
+                            and status = policy_transaction.status
+                            order by id desc
+                            limit 1
+
+                        ) as last_action_date
+                    ')
+            ->join('clients', 'clients.id = policy_transaction.client_id')
+            ->join('client_policy', 'policy_transaction.client_policy_id = client_policy.id', 'left')
+            ->where('policy_transaction.id', $id)
+            ->where('policy_transaction.is_active', 1)
+            ->orderBy('id', 'asc')
+            ->first();
+
+        $pt_id = null;   
+
+        if(!empty($data)){
+            $inception_data = $this->policyTransactionModel
+                    ->where('policy_no', $data['policy_no'])
+                    ->where('client_id', $data['client_id'])
+                    ->where('action_type', 'inception')
+                    ->first();
+            $pt_id = $inception_data['id'];
+        }    
+
+        if (!empty($data['policy_start_date'])) {
+            $data['policy_start_date'] =  change_date_format($data['policy_start_date'], 'Y-m-d', 'd/m/Y');
+        }
+
+        if (!empty($data['policy_end_date'])) {
+            $data['policy_end_date'] =  change_date_format($data['policy_end_date'], 'Y-m-d', 'd/m/Y');
+        }
+
+        if (!empty($data['data_received_date'])) {
+            $data['data_received_date'] =  change_date_format($data['data_received_date'], 'Y-m-d', 'd/m/Y');
+        }
+
+        if (!empty($data['policy_issue_date'])) {
+            $data['policy_issue_date'] =  change_date_format($data['policy_issue_date'], 'Y-m-d', 'd/m/Y');
+        }
+
+        if (!empty($data['endorse_eff_date'])) {
+            $data['endorse_eff_date'] =  change_date_format($data['endorse_eff_date'], 'Y-m-d', 'd/m/Y');
+        }
+
+        if (!empty($data['install_due_date'])) {
+            $data['install_due_date'] =  change_date_format($data['install_due_date'], 'Y-m-d', 'd/m/Y');
+        }
+
+        if (!empty($data['last_action_date'])) {
+            $data['last_action_date'] =  change_date_format($data['last_action_date'], 'Y-m-d', 'd/m/Y');
+        }
+
+        if (!empty($data['month'])) {
+            $data['month'] =  change_date_format($data['month'], 'Y-m-d', 'M/Y');
+        }
+
+        // print_r($data); die;
+
+        //get PT Co-Share Details
+        $data['pt_co_share_details'] = $this->PTCOShareDetailsModel
+
+            ->select("
+                        pt_co_share_details.*,
+                
+                        (
+                            SELECT
+                                COUNT(*)
+                            FROM
+                                co_share_stmt_details
+                            WHERE
+                                co_share_stmt_details.co_share_id = pt_co_share_details.id
+                                AND co_share_stmt_details.is_active = 1
+                        ) AS record_count,
+    
+                            (
+                                SELECT 
+                                    SUM(actual_bp_amt) 
+                                FROM 
+                                    co_share_stmt_details 
+                                WHERE 
+                                    co_share_id = pt_co_share_details.id 
+                                    AND is_active = 1
+                                    
+                            ) AS actual_bp_amount,
+                            
+                            (
+                                SELECT 
+                                    SUM(actual_tp_amt) 
+                                FROM 
+                                    co_share_stmt_details 
+                                WHERE 
+                                    co_share_id = pt_co_share_details.id 
+                                    AND is_active = 1
+                                    
+                            ) AS actual_tp_amount,
+                            
+                            (
+                                SELECT 
+                                    SUM(actual_tep_amt) 
+                                FROM 
+                                    co_share_stmt_details 
+                                WHERE 
+                                    co_share_id = pt_co_share_details.id 
+                                    AND is_active = 1
+                                    
+                            ) AS actual_tep_amount,
+                            
+                            (
+                                SELECT 
+                                    SUM(actual_bp_per) 
+                                FROM 
+                                    co_share_stmt_details 
+                                WHERE 
+                                    co_share_id = pt_co_share_details.id 
+                                    AND is_active = 1
+                                    
+                            ) AS actual_bp_percentage,
+                            
+                            (
+                                SELECT 
+                                    SUM(actual_tp_per) 
+                                FROM 
+                                    co_share_stmt_details 
+                                WHERE 
+                                    co_share_id = pt_co_share_details.id 
+                                    AND is_active = 1
+                                    
+                            ) AS actual_tp_percentage,
+                            
+                            (
+                                SELECT 
+                                    SUM(actual_tep_per) 
+                                FROM 
+                                    co_share_stmt_details 
+                                WHERE 
+                                    co_share_id = pt_co_share_details.id 
+                                    AND is_active = 1
+                                    
+                            ) AS actual_tep_percentage,
+                            
+                            
+                            (
+                                SELECT 
+                                    SUM(actual_bp_brokerage_amt) 
+                                FROM 
+                                    co_share_stmt_details 
+                                WHERE 
+                                    co_share_id = pt_co_share_details.id 
+                                    AND is_active = 1
+                                    
+                            ) AS actual_bp_brokerage_amount,
+                            
+                            
+                            (
+                                SELECT 
+                                    SUM(actual_tp_brokerage_amt) 
+                                FROM 
+                                    co_share_stmt_details 
+                                WHERE 
+                                    co_share_id = pt_co_share_details.id 
+                                    AND is_active = 1
+                                    
+                            ) AS actual_tp_brokerage_amount,
+                            
+                            
+                            (
+                                SELECT 
+                                    SUM(actual_tep_brokerage_amt) 
+                                FROM 
+                                    co_share_stmt_details 
+                                WHERE 
+                                    co_share_id = pt_co_share_details.id 
+                                    AND is_active = 1
+                                    
+                            ) AS actual_tep_brokerage_amount, 
+                                
+                            DATE_FORMAT(pt_policy_issue_date, '%d/%m/%Y') AS pt_policy_issue_date
+    
+                    ")
+            ->where('pt_id', $id)
+            ->where('is_active', 1)
+            ->orderBy('id', 'asc')
+            ->findAll();
+
+        // print_r($data['endorse_eff_date']); die;
+
+        $pt_bp_amt = $this->PTCOShareDetailsModel
+            ->select('bp_amt, amount')
+            ->where('pt_id', $id)
+            ->where('co_share_type', 1)
+            ->where('is_active', 1)
+            ->first();
+
+        // dd(db_connect()->getLastQuery() ,$pt_bp_amt);
+        $data['base_cd_amount'] = $pt_bp_amt['amount'] ?? null;
+
+        if ($data) {
+            return $this->respond(['status' => true, 'data' => $data, 'pt_id' => $pt_id], 200);
+        } else {
+            return $this->respond(['status' => false], 200);
+        }
+    }
+
+    //------------------------------------------------------------------------------------------------
+
+    //file upload function 
+    public function uploadFile($docs_name = null, $files = null, $pt_id = null)
+    {
+        $GoogleDriveController = new GoogleDriveController();
+
+
+        if(empty($docs_name) && empty($files) && empty($pt_id) && $this->request){
+            $files = $this->request->getFiles();
+            $docs_name = $this->request->getPost('doc_name');
+            $pt_id = $this->request->getPost('pt_id');
+            $client_policy_id = $this->request->getPost('client_policy_id');
+        }
+
+        $uploadFilePath = WRITEPATH . 'uploads/client_kyc_documents';
+
+        $uploadData = [];
+
+        foreach ($docs_name as $key => $docName) {
+
+            // Get the corresponding file for this document name
+            $file = $files['file'][$key];
+
+            if (!empty($docName) && $file->isValid() && !$file->hasMoved()) {
+
+                // Upload the file
+                $uploadedFileName = file_Upload_for_lead($file, $uploadFilePath);
+
+                if ($uploadedFileName) {
+                    // Prepare data for each document upload
+                    $docData = [
+                        'pt_id' => $pt_id,
+                        'doc_name' => $docName,
+                        'file_name' => $uploadedFileName,
+                        'created_by' => get_session_userid(),
+                    ];
+
+                    // $uploadFilePath = $uploadFilePath . '/' . $uploadedFileName;
+
+                    // $GoogleDriveController->uploadFiletoGdrive(client_policy_id: $client_policy_id, doc_type: 'POLICY', file_path: $uploadFilePath, file_name: $uploadedFileName);
+
+                    // Insert into database
+                    $insert = $this->PTFileModel->insert($docData);
+
+                    if ($insert) {
+                        $uploadData[] = $docData;
+                    }
+                }
+            }
+        }
+
+        if(!empty($docs_name) && !empty($files) && !empty($pt_id) && !$this->request){
+            return true;
+        }
+
+        // print_r($uploadData); die;
+
+        // $uploadData = uploadFilesToGoogleDrive($files['file'], $doc_name, $pt_id);
+
+        if (!empty($uploadData)) {
+
+            $ptFileQuery = $this->PTFileModel
+                ->join('policy_transaction', 'pt_files.pt_id = policy_transaction.id')
+                ->where('pt_files.pt_id', $pt_id)
+                ->where('pt_files.is_active', 1);
+
+            if (!in_array(get_role_id(), [1, 5]) && empty(array_intersect(user_team(), [MANAGEMENT_TEAM_ID, FINANCE_TEAM_ID, BUSINESS_TEAM_ID]))) {
+
+                if (get_role_id() == 4 && in_array(POS_TEAM_ID, user_team())) {
+                    $ptFileQuery->where('pt_files.created_by', get_session_userid());
+                }
+            }
+
+            $data['pt_files'] = $ptFileQuery->findAll();
+
+            return $this->respond(['status' => true, 'message' => 'File uploaded successfully in G-Drive', 'data' => $data]);
+        } else {
+            return $this->respond(['status' => false, 'message' => 'Failed to upload file in G-Drive']);
+        }
+    }
+
+    // update Invoice Status 
+    public function updateInvoiceStatus()
+    {
+        $ids = $this->request->getPost('ids');
+        $ids = json_decode($ids);
+
+        // var_dump($ids); die;
+
+        $data['invoice_status'] = $this->request->getPost('invoice_status');
+        if ($this->request->getPost('invoice_status') == 'generated') {
+            $data['invoice_no'] = $this->request->getPost('invoice_no');
+        }
+
+
+        $update = $this->policyTransactionModel
+            ->whereIn('id', $ids)
+            ->set($data)
+            ->update();
+
+
+        if ($update) {
+
+            return $this->respond(['status' => true, 'data' => $ids, 'message' => 'Invoice status updated successfully'], 200);
+        } else {
+            return $this->respond(['status' => true, 'data' => $ids, 'message' => 'Failed to update invoice status'], 200);
+        }
+    }
+
+    public function removeCoShareData($id)
+    {
+        $this->myLogger->logme('error', 'PT Co Share Detailes Remove function called');
+
+        $data = [
+            'updated_by' => get_session_userid(),
+            'is_active' => 0
+        ];
+
+        $update = $this->PTCOShareDetailsModel->where('id', $id)->set($data)->update();
+
+        if ($update) {
+            return $this->respond(['status' => true, 'code' => 200, 'message' => 'Data removed successfully'], 200);
+        } else {
+            return $this->respond(['status' => false, 'code' => 404, 'message' => 'Failed to remove data'], 200);
+        }
+    }
+
+    public function getPTCOShareCount($client_id, $client_policy_id)
+    {
+        $totalCount = $this->PTCOShareDetailsModel
+            ->select("
+                    pt_co_share_details.*,
+                    policy_transaction.bro_payable_by,
+                    policy_transaction.cd_ac_pk,
+                    (
+                        select cd_ac_no
+                        from cd_master
+                        where id = policy_transaction.cd_ac_pk
+                    ) as cd_account_no,
+                    (
+                        select balance
+                        from cash_deposit
+                        where cd_ac_pk = policy_transaction.cd_ac_pk
+                        and is_active = 1
+                        order by id desc
+                        limit 1
+                    ) as cd_amount,
+                ")
+            ->join('policy_transaction', 'policy_transaction.id = pt_co_share_details.pt_id')
+            ->where('policy_transaction.client_id', $client_id)
+            // ->where('policy_transaction.client_policy_id', $client_policy_id)
+            ->where('policy_transaction.id', $client_policy_id)
+            ->where('policy_transaction.action_type', 'inception')
+            ->where('policy_transaction.is_active', 1)
+            ->findAll();
+
+        $is_copay_yes = $this->policyTransactionModel
+            ->where('client_id', $client_id)
+            // ->where('client_policy_id', $client_policy_id)
+            ->where('id', $client_policy_id)
+            ->where('action_type', 'inception')
+            ->where('is_active', 1)
+            ->first();
+
+        $cd_ac_no = db_connect()->table('cd_master')->where('id', $is_copay_yes['cd_ac_pk'] ?? null)->get()->getRowArray();
+
+        if ($totalCount) {
+            return $this->respond(['status' => true, 'code' => 200, 'data' => $totalCount, 'is_copay_yes' => $is_copay_yes, "cd_master_data" => $cd_ac_no], 200);
+        } else {
+            $insurer_data = $this->clientPolicyModel->where('id', $client_policy_id)->where('is_active', 1)->first();
+            return $this->respond(['status' => false, 'code' => 404, 'message' => 'There is no policy inception data.'], 200);
+        }
+    }
+
+    public function checkInvoiceStatus($pt_id)
+    {
+        $data = $this->policyTransactionModel
+            ->join('pt_co_share_details', 'policy_transaction.id = pt_co_share_details.pt_id')
+            ->join('insurer_statements', 'pt_co_share_details.statement_id = insurer_statements.id')
+            ->where('policy_transaction.id', $pt_id)
+            ->where('policy_transaction.is_active', 1)
+            ->where('pt_co_share_details.is_active', 1)
+            ->where('pt_co_share_details.statement_id IS NOT NULL')
+            ->where('insurer_statements.invoice_no IS NOT NULL')
+            ->countAllResults();
+
+        if ($data) {
+            return $this->respond(['status' => true, 'count' => $data,  'code' => 200], 200);
+        } else {
+            return $this->respond(['status' => false, 'count' => 0, 'message' => 'No Data Found', 'code' => 404], 200);
+        }
+    }
+
+    public function getBasePolicy($client_id, $client_branch_id)
+    {
+        $data = $this->clientPolicyModel
+            ->select('client_policy.*, policy_type.policy_type')
+            ->join('policy_type', 'policy_type.id = client_policy.policy_type_id')
+            ->where('client_policy.client_id', $client_id)
+            ->where('client_policy.client_branch_id', $client_branch_id)
+            ->whereIn('client_policy.policy_type_id', [2, 3])
+            ->where('client_policy.is_active', 1)
+            ->findAll();
+
+        if ($data) {
+            return $this->respond(['status' => true, 'data' => $data,  'code' => 200], 200);
+        } else {
+            return $this->respond(['status' => false, 'count' => 0, 'message' => 'No Data Found', 'code' => 404], 200);
+        }
+    }
+
+    //---------------------------------------------------------------------------------------------------
+
+    //get BDS Reports data old function
+    public function reportBDSOld()
+    {
+        $data['tab_name'] = 'BDS Report';
+        $data['page_name'] = 'BDS Report';
+
+        $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',
+        ];
+
+        $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();
+
+        //filter datas
+        $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');
+
+        $start_date = (!isset($start_date) || $start_date === '' || $start_date === null) ? 0 : $start_date;
+        $end_date = (!isset($end_date) || $end_date === '' || $end_date === null) ? 0 : $end_date;
+
+        $client_id = (!isset($client_id) || $client_id === '' || $client_id === null) ? 0 : $client_id;
+        $insurer_id = (!isset($insurer_id) || $insurer_id === '' || $insurer_id === null) ? 0 : $insurer_id;
+        $policy_type_id = (!isset($policy_type_id) || $policy_type_id === '' || $policy_type_id === null) ? 0 : $policy_type_id;
+        $date_type = (!isset($date_type) || $date_type === '' || $date_type === null) ? 0 : $date_type;
+        $issuer = (!isset($issuer) || $issuer === '' || $issuer === null) ? 0 : $issuer;
+
+
+        //Actual data for the list
+        $data['report_list'] = $this->policyTransactionModel->getBDSReportList($start_date, $end_date, $client_id, $insurer_id, $policy_type_id, $date_type, $issuer);
+        // dd($data);
+
+        $this->loadLayout('report_bds_filter', $data);
+    }
+
+    //get BDS Reports data New Function
+    public function reportBDS()
+    {
+
+        $data['tab_name'] = 'BDS Report';
+        $data['page_name'] = 'BDS Report';
+
+        $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',
+        ];
+
+        $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();
+
+
+        //filter datas
+        $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');
+
+        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));
+        }
+
+        // dd($start_date, $end_date, $date_type);
+
+        $start_date = (!isset($start_date) || $start_date === '' || $start_date === null) ? 0 : $start_date;
+        $end_date = (!isset($end_date) || $end_date === '' || $end_date === null) ? 0 : $end_date;
+
+        $client_id = (!isset($client_id) || $client_id === '' || $client_id === null) ? 0 : $client_id;
+        $insurer_id = (!isset($insurer_id) || $insurer_id === '' || $insurer_id === null) ? 0 : $insurer_id;
+        $policy_type_id = (!isset($policy_type_id) || $policy_type_id === '' || $policy_type_id === null) ? 0 : $policy_type_id;
+        $date_type = (!isset($date_type) || $date_type === '' || $date_type === null) ? 0 : $date_type;
+        $issuer = (!isset($issuer) || $issuer === '' || $issuer === null) ? 0 : $issuer;
+        $client_branch_id = (!isset($client_branch_id) || $client_branch_id === '' || $client_branch_id === null) ? 0 : $client_branch_id;
+        $insurer_branch_id = (!isset($insurer_branch_id) || $insurer_branch_id === '' || $insurer_branch_id === null) ? 0 : $insurer_branch_id;
+        $client_policy_id = (!isset($client_policy_id) || $client_policy_id === '' || $client_policy_id === null) ? 0 : $client_policy_id;
+        $user_id = (!isset($user_id) || $user_id === '' || $user_id === null) ? 0 : $user_id;
+        if ($this->request->is('post')) {
+            $request_post_data   = $this->request->getPost();
+            $sanitized_post_data = sanitizeInputArrayAdvanced($request_post_data);
+            $isFromDashboard = $sanitized_post_data["is_dashboard"];
+
+            if (isset($isFromDashboard) && !empty($isFromDashboard) && $isFromDashboard == 1) {
+                $ids = $sanitized_post_data['ids'];
+
+                $ids = array_filter(explode(',', $ids));
+
+                if (!empty($ids)) {
+                    $idsStr = implode(',', array_map('intval', $ids)); // sanitize IDs to be integers
+                    $where = "policy_transaction.id IN ($idsStr)";
+                } else {
+                    $where = []; // No valid IDs, return empty result
+                }
+            }
+            // dd($ids);
+        }
+        //Actual data for the list
+        $data['report_list'] = $this->policyTransactionModel->getBDSReportList($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, isset($where) ? $where : '');
+        // dd($data);
+
+        $this->loadLayout('report_bds_filter', $data);
+    }
+
+    public function reportVarience()
+    {
+        $data['tab_name'] = 'Variance Report';
+        $data['page_name'] = 'Variance Report';
+
+        $data['issuer'] = [1 => 'JIBS', 2 => 'Nhance'];
+        $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['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',
+        ];
+
+        //filter datas
+        $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');
+
+
+        $start_date = (!isset($start_date) || $start_date === '' || $start_date === null) ? 0 : $start_date;
+        $end_date = (!isset($end_date) || $end_date === '' || $end_date === null) ? 0 : $end_date;
+
+        $client_id = (!isset($client_id) || $client_id === '' || $client_id === null) ? 0 : $client_id;
+        $insurer_id = (!isset($insurer_id) || $insurer_id === '' || $insurer_id === null) ? 0 : $insurer_id;
+        $policy_type_id = (!isset($policy_type_id) || $policy_type_id === '' || $policy_type_id === null) ? 0 : $policy_type_id;
+        $date_type = (!isset($date_type) || $date_type === '' || $date_type === null) ? 0 : $date_type;
+        $issuer = (!isset($issuer) || $issuer === '' || $issuer === null) ? 0 : $issuer;
+
+        $client_branch_id = (!isset($client_branch_id) || $client_branch_id === '' || $client_branch_id === null) ? 0 : $client_branch_id;
+        $insurer_branch_id = (!isset($insurer_branch_id) || $insurer_branch_id === '' || $insurer_branch_id === null) ? 0 : $insurer_branch_id;
+        $client_policy_id = (!isset($client_policy_id) || $client_policy_id === '' || $client_policy_id === null) ? 0 : $client_policy_id;
+
+
+        $data['varience_list'] = $this->policyTransactionModel->getVarienceReportLIst($start_date, $end_date, $client_id, $insurer_id, $policy_type_id, $date_type, $issuer, $client_branch_id, $insurer_branch_id, $client_policy_id);
+        // !dd($data['varience_list']);
+        $this->loadLayout('variance_report_list', $data);
+    }
+
+
+    public function reportBusinessList()
+    {
+        $data['tab_name'] = 'Business Report';
+        $data['page_name'] = 'Business Report';
+
+        $data['issuer'] = [1 => 'JIBS', 2 => 'Nhance'];
+        $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['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',
+        ];
+
+        //filter datas
+        $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');
+
+        $start_date = (!isset($start_date) || $start_date === '' || $start_date === null) ? 0 : $start_date;
+        $end_date = (!isset($end_date) || $end_date === '' || $end_date === null) ? 0 : $end_date;
+
+        $client_id = (!isset($client_id) || $client_id === '' || $client_id === null) ? 0 : $client_id;
+        $insurer_id = (!isset($insurer_id) || $insurer_id === '' || $insurer_id === null) ? 0 : $insurer_id;
+        $policy_type_id = (!isset($policy_type_id) || $policy_type_id === '' || $policy_type_id === null) ? 0 : $policy_type_id;
+        $date_type = (!isset($date_type) || $date_type === '' || $date_type === null) ? 0 : $date_type;
+        $issuer = (!isset($issuer) || $issuer === '' || $issuer === null) ? 0 : $issuer;
+
+
+        $data['business_list'] = $this->policyTransactionModel->getBusinessReportList($start_date, $end_date, $client_id, $insurer_id, $policy_type_id, $date_type, $issuer);
+        $this->loadLayout('business_team_list', $data);
+    }
+
+
+    public function reportFinanceList()
+    {
+        $data['tab_name'] = 'Finance Report';
+        $data['page_name'] = 'Finance Report';
+
+        $data['issuer'] = [1 => 'JIBS', 2 => 'Nhance'];
+        $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['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',
+        ];
+
+        //filter datas
+        $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');
+
+        $start_date = (!isset($start_date) || $start_date === '' || $start_date === null) ? 0 : $start_date;
+        $end_date = (!isset($end_date) || $end_date === '' || $end_date === null) ? 0 : $end_date;
+
+        $client_id = (!isset($client_id) || $client_id === '' || $client_id === null) ? 0 : $client_id;
+        $insurer_id = (!isset($insurer_id) || $insurer_id === '' || $insurer_id === null) ? 0 : $insurer_id;
+        $policy_type_id = (!isset($policy_type_id) || $policy_type_id === '' || $policy_type_id === null) ? 0 : $policy_type_id;
+        $date_type = (!isset($date_type) || $date_type === '' || $date_type === null) ? 0 : $date_type;
+        $issuer = (!isset($issuer) || $issuer === '' || $issuer === null) ? 0 : $issuer;
+
+
+
+        $data['finance_list'] = $this->policyTransactionModel->getFinanceReportList($start_date, $end_date, $client_id, $insurer_id, $policy_type_id, $date_type, $issuer);
+        $this->loadLayout('finance_team_list', $data);
+    }
+
+    public function reportOutstanding()
+    {
+        $data['tab_name'] = 'Outstanding Report';
+        $data['page_name'] = 'Outstanding Report';
+
+        $data['issuer'] = [1 => 'JIBS', 2 => 'Nhance'];
+        $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['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',
+        ];
+
+        //filter datas
+        $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');
+        $insurer_branch_id = $this->request->getGet('insurer_branch_id');
+
+        $start_date = (!isset($start_date) || $start_date === '' || $start_date === null) ? 0 : change_date_format($start_date, 'd-m-Y', 'Y-m-01');
+        $end_date = (!isset($end_date) || $end_date === '' || $end_date === null) ? 0 : change_date_format($end_date, 'd-m-Y', 'Y-m-31');
+        // dd([$start_date,$end_date]);
+
+
+        $insurer_id = (!isset($insurer_id) || $insurer_id === '' || $insurer_id === null) ? 0 : $insurer_id;
+        $insurer_branch_id = (!isset($insurer_branch_id) || $insurer_branch_id === '' || $insurer_branch_id === null) ? 0 : $insurer_branch_id;
+
+        $data['outstanting_list'] = $this->policyTransactionModel->getOutstandingReportLIst($start_date, $end_date, $insurer_id, $insurer_branch_id);
+        // dd($this->policyTransactionModel->getLastQuery());
+        // dd($data);
+        $this->loadLayout('outstanding_report_list', $data);
+    }
+
+    //---------------------------------------------------------------------------------------------------
+
+    //insurer statement list page
+    public function statementList()
+    {
+        // dd($this->updateInsurerStatement(['file_id' => 133])); // for check validateInsurerStatementfunction with hard coded file id always un command
+        $data['insurers'] = $this->insurerModel->where('is_active',1)->findAll();
+        $today = date('Y-m-d');
+        $fromday = $from_date = date('Y-m-d', strtotime('-180 days', strtotime($today)));
+        // echo $fromday;die();
+        $data['invoice_status_array'] = $this->invoiceStatus;
+        $data['insurers'] = $this->insurerBranchModel->getInsurerBranchesWithInsurerNames();
+
+        // dd( $data['insurers']);
+        $data['insurer_statement_list'] = $this->insurerStatements
+            ->select(
+                'insurer_statements.*, 
+                                                        insurers.name AS insurer_name, 
+                                                        insurers.short_name, 
+                                                        user_profiles.first_name, 
+                                                        insurer_branch.branch_code,
+                                                        (SELECT SUM(pt_co_share_details.exp_amt) 
+                                                        FROM pt_co_share_details 
+                                                        WHERE pt_co_share_details.is_active = 1 
+                                                            AND pt_co_share_details.statement_id = insurer_statements.id
+                                                        ) AS exp_inv_amt,
+                                                        (SELECT SUM(inv_payment_details.inv_amt) + SUM(inv_payment_details.tds)  + SUM(inv_payment_details.gst)
+                                                        FROM inv_payment_details 
+                                                        WHERE inv_payment_details.is_active = 1 
+                                                            AND inv_payment_details.statement_id = insurer_statements.id
+                                                        ) AS received_inv_amt'
+            )
+            ->join('insurers', 'insurer_statements.insurer_id = insurers.id')
+            ->join('insurer_branch', 'insurer_statements.branch_id = insurer_branch.id')
+            ->join('user_profiles', 'insurer_statements.created_by = user_profiles.id')
+            ->where('insurer_statements.is_active', 1)
+            ->where('insurers.is_active', 1)
+            ->where('insurer_branch.is_active', 1)
+            // ->where('insurer_statements.file_status','success')
+            ->where('date(insurer_statements.created_at) >= ', $from_date)
+            ->where('date(insurer_statements.created_at) <= ', $today)
+            ->orderBy('insurer_statements.id', 'DESC')
+            ->findAll();
+
+        // dd( $this->insurerStatements->getLastQuery());
+        $data['tab_name'] = 'Statement Upload';
+        $data['page_name'] = 'Statement Upload';
+
+        $this->loadLayout('insurer_statement_list',  $data);
+    }
+
+    // public function failedStatementList(){
+    //     $today = date('Y-m-d');
+    //     $fromday = $from_date = date('Y-m-d', strtotime('-180 days', strtotime($today)));
+    //     // echo $fromday;die();
+    //      $data['invoice_status_array'] = $this->invoiceStatus;
+    //      $data['insurers'] = $this->insurerBranchModel ->getInsurerBranchesWithInsurerNames();
+
+    //      // dd( $data['insurers']);
+    //      $data['insurer_statement_list'] = $this->insurerStatements
+    //                                             ->select('insurer_statements.*, 
+    //                                                       insurers.name AS insurer_name, 
+    //                                                       insurers.short_name, 
+    //                                                       user_profiles.first_name, 
+    //                                                       insurer_branch.branch_code,
+    //                                                       (SELECT SUM(pt_co_share_details.exp_amt) 
+    //                                                        FROM pt_co_share_details 
+    //                                                        WHERE pt_co_share_details.is_active = 1 
+    //                                                          AND pt_co_share_details.statement_id = insurer_statements.id
+    //                                                       ) AS exp_inv_amt,
+    //                                                       (SELECT SUM(inv_payment_details.inv_amt) + SUM(inv_payment_details.tds)  + SUM(inv_payment_details.gst)
+    //                                                        FROM inv_payment_details 
+    //                                                        WHERE inv_payment_details.is_active = 1 
+    //                                                          AND inv_payment_details.statement_id = insurer_statements.id
+    //                                                       ) AS received_inv_amt'
+    //                                             )
+    //                                             ->join('insurers', 'insurer_statements.insurer_id = insurers.id')
+    //                                             ->join('insurer_branch', 'insurer_statements.branch_id = insurer_branch.id')
+    //                                             ->join('user_profiles', 'insurer_statements.created_by = user_profiles.id')
+    //                                             ->where('insurer_statements.is_active', 1)
+    //                                             ->where('insurer_statements.file_status','failed')
+    //                                             ->where('date(insurer_statements.created_at) >= ', $from_date)
+    //                                             ->where('date(insurer_statements.created_at) <= ', $today)
+    //                                             ->orderBy('insurer_statements.id', 'DESC')
+    //                                             ->findAll();
+    //         if($data['insurer_statement_list']){
+    //             return $this->respond(['status' => true, 'code' => 200,'data'=>$data ], 200);
+    //         }else{
+    //             return $this->respond(['status'=>false,'message'=>'Data Not Fount'],404);
+    //         }
+
+    // }
+
+    public function uploadInsurerStatement()
+    {
+
+        //validate uploaded file
+        $filename = '';
+        $validated = $this->validate([
+            'statement' => [
+                'uploaded[statement]',
+                'mime_in[statement,application/vnd.ms-excel,application/vnd,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.oasis.opendocument.spreadsheet]',
+                'max_size[statement,16384]',
+            ],
+        ]);
+        // $this->createStatementFolder();
+        if ($validated) {
+            $avatar = $this->request->getFile('statement');
+            if (!$avatar) {
+                $this->myLogger->logme("error", 'Statement File not found');
+                return $this->respond(['dataStatus' => false, 'code' => 400, 'message' => 'File not found'], 400);
+            }
+
+            $is_moved = $avatar->move(WRITEPATH . 'uploads/statements/');
+            if ($is_moved) {
+                $filename = $avatar->getName();
+                // Handle successful upload, e.g., log success or further processing
+                $this->myLogger->logme("error", 'Statement File moved successful');
+            } else {
+                $this->myLogger->logme("error", 'Statement File move failed');
+                return $this->respond(['dataStatus' => false, 'code' => 500, 'message' => 'File move failed'], 500);
+            }
+        } else {
+            $this->myLogger->logme("error", 'Statement Upload failed Invalid file');
+            return $this->respond(['dataStatus' => false, 'code' => 404, 'message' => 'Invalid file'], 404);
+        }
+
+        //process post variable entry in file table
+        $loggedInUserID = get_session_userid();
+        // dd($loggedInUserID);
+        // $loggedInUserID = 8;
+
+        $insurer = $this->request->getPost('insurer');
+
+        $insurer_id = explode('-', $insurer)[0];
+        $branch_id = explode('-', $insurer)[1];
+        // print_r($insurer_id);
+        // print_r($branch_id);
+        // die();
+        $month = $this->request->getPost('statement_month');
+        $month = $month . '-01';
+        // print_r($month);die;
+        $month = change_date_format($month, 'Y-M-d', 'Y-m-d');
+        $stmt_sno = $this->request->getPost('statement_no');
+        // print_r($month);die;
+
+        $file_id = $this->insurerStatements->insert(['insurer_id' => $insurer_id, 'branch_id' => $branch_id, 'file_name' => $filename, 'month' => $month, 'created_by' => $loggedInUserID, 'stmt_sno' => $stmt_sno]); //here field policy_id have client_policy_id and not policy id from policy master
+        $this->myLogger->logme("error", '{file_id} statement uploaded success', ['file_id' => $file_id]);
+
+        //validate file
+        $validation_result = $this->validateInsurerStatement(['file_id' => $file_id]);
+        //update file content to DB
+        if ($validation_result['status']) {
+            $this->updateInsurerStatement(['file_id' => $file_id]);
+        }
+
+        if (!isset($file_id) || !$validation_result['status']) {
+            return $this->respond(['dataStatus' => false, 'code' => 404, 'message' => 'file not uploaded', 'error_data' => $validation_result['error_data'], 'error_code' =>   $validation_result['error_code']], 200);
+        }
+
+        if (isset($file_id) || $validation_result['status']) {
+            $this->insurerStatements->where('id', $file_id)->set(['invoice_status' => 'pending'])->update();
+        }
+
+
+
+        return $this->respond(['dataStatus' => true, 'code' => 200, 'data' => 'file upload success'], 200);
+    }
+
+    public function createStatementFolder()
+    {
+        $folderPath = WRITEPATH . 'uploads/statements/';
+
+        // Check if the folder doesn't exist
+        if (!file_exists($folderPath)) {
+            // Create the folder
+            if (mkdir($folderPath, 0777, true)) {
+                $this->myLogger->logme('error', 'statement upload folder created successfully');
+
+                // Set permissions to a+rwx (read, write, execute for all)
+                chmod($folderPath, 0777);
+                $this->myLogger->logme('error', 'Permissions set to a+rwx.');
+            } else {
+                // echo "Failed to create folder.";
+                $this->myLogger->logme('error', 'Failed to create statement upload folder.');
+            }
+        } else {
+            $this->myLogger->logme('error', 'upload folder exists.');
+        }
+    }
+
+    public function validateInsurerStatementOld($params)
+    {
+        helper('excel_util_helper');
+        //get file info
+        $file_id = $params['file_id'];
+        $file = $this->insurerStatements->find((int)$file_id);
+        // dd($file);
+        $date = new \DateTime($file['month']);
+
+        $month = $date->format('m');
+        $year = $date->format('Y');
+
+        $error_data = ['error_code' => '', 'error_data' => []];
+        $status = 'success';
+        $ret_status = true;
+        // dd($month.'-'.$year);
+        $return = [];
+        if (!isset($file)) {
+            //file not found in DB
+            return array('status' => false, 'msg' => 'statement file not found in DB');
+        }
+        $file_name_with_path = WRITEPATH . "/uploads/statements/" . $file['file_name'];
+
+        //check physical file
+        if (!file_exists($file_name_with_path)) {
+            //file not found  update status and reason 
+            $message = "Physcial file not found";
+            // echo $message;
+            $this->myLogger->logme('error', ($message . ' for statement file id ' . $file_id));
+            $this->insurerStatements->where('id', $file_id)->set(['file_status' => 'failed', 'reason' => json_encode(['error_code' => 0, 'error_data' => $message])])->update();
+            return  array('status' => false, 'error_code' => 0); //0 - Physcial file not found
+        }
+
+        //get excel data to php array
+        $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file_name_with_path);
+        $sheet = $spreadsheet->getActiveSheet();
+
+        $highestRowAndColumn = $sheet->getHighestRowAndColumn();
+        // dd($highestRowAndColumn);
+        $excel_data = $sheet->rangeToArray('A1:' . $highestRowAndColumn['column'] . $highestRowAndColumn['row']);
+        unset($excel_data[0]);
+        $excel_data = ExcelSanitizeHelper::sanitizeArrayData($excel_data);
+        // Kint::dump($excel_data); // die();
+        //get no of line items and update in DB
+        $line_items = 0;
+        // get uploaded month transactions data
+        $source_data = $this->PTCOShareDetailsModel->getNonReconcileredPolicyTransactions(insurer_id: $file['insurer_id'], insurer_branch_id: $file['branch_id']);
+        // var_dump($source_data);die();
+        // Kint::dump($source_data);die();
+
+
+        // check policy no,insurer and etc in DB for this month
+        // if all good return true, otherwise return false with messssage 
+        foreach ($excel_data as $excel_key => $excel_row) {
+            $is_row_empty = check_row_is_empty_or_null($excel_row);
+
+            if (!$is_row_empty) {
+
+                // $excel_row = ExcelSanitizeHelper::sanitizeArrayData($excel_row);
+                $is_source_found = 0;
+                // Kint::dump($excel_key,$excel_row[1],$excel_row[2]);
+                // $policy_start_date = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[4]); //policy_start_date from excel
+                // $policy_end_date = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[5]); //policy_end_date from excel
+                
+                $policy_no = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[1]); //policy_end_date from excel
+                $policy_no = preg_replace(  '/[\x{200B}\x{200C}\x{200D}\x{FEFF}\x{00A0}\x{200E}\x{200F}\x{202A}-\x{202E}]/u', '',  $excel_row[1]); //policy_end_date from excel
+                
+                // $client_name = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[3]); //clientname from excel
+                
+                $endorsement_no = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[2]??''); //policy_end_date from excel
+                $endorsement_no = preg_replace(  '/[\x{200B}\x{200C}\x{200D}\x{FEFF}\x{00A0}\x{200E}\x{200F}\x{202A}-\x{202E}]/u', '',  $excel_row[2]??''); //policy_end_date from excel
+
+                // Kint::dump($excel_key,$policy_no,$endorsement_no,$policy_start_date,$policy_end_date);//die();
+                foreach ($source_data as $source_key => $source_row) {
+                    $source_endorsement_no = $source_row['endorsement_no'] !== null ? $source_row['endorsement_no'] : null;
+                    // Kint::dump($source_row, $source_endorsement_no, $policy_no, $endorsement_no);
+                    
+                    // if (($policy_no == $source_row['policy_no']) && $endorsement_no == $source_endorsement_no  && change_date_format($policy_start_date, 'd-m-Y', 'Y-m-d') == $source_row['policy_start_date'] &&  change_date_format($policy_end_date, 'd-m-Y', 'Y-m-d') == $source_row['policy_end_date'] && $client_name == $source_row['client_name']) 
+                    // {
+                    //     $is_source_found = 1;
+                    //     $line_items = $line_items + 1;
+                    //     unset($source_data[$source_key]);
+                    //     continue 2;
+                    // }  
+                    
+                    if (($policy_no == $source_row['policy_no']) && $endorsement_no == $source_endorsement_no) 
+                    {
+                        $is_source_found = 1;
+                        $line_items = $line_items + 1;
+                        unset($source_data[$source_key]);
+                        continue 2;
+                    }
+                }
+
+                if ($is_source_found == 0) {
+                    // echo $excel_key.'-'.$excel_row[1] . '- not found
'; + $error_data['error_code'] = 1; //match not found + // $error_data['error_data'] = ($error_data['error_data'] ?? []); + $error_data['error_data'] = array_merge($error_data['error_data'], [$excel_row[0]]); //match not found + } + } + } + + // dd($error_data); + + if ($error_data['error_code']) { + $status = 'failed'; + $ret_status = false; + } + //update in DB + $this->insurerStatements->where('id', $file_id)->set(['line_items' => $line_items, 'file_status' => $status, 'reason' => json_encode($error_data)])->update(); + return array('status' => $ret_status, 'error_code' => $error_data['error_code'], 'error_data' => $error_data['error_data']); + } + + public function validateInsurerStatement($params) + { + helper('excel_util_helper'); + + $file_id = $params['file_id']; + + try { + //get file info - $file_id = $params['file_id']; $file = $this->insurerStatements->find((int)$file_id); // dd($file); + $date = new \DateTime($file['month']); $month = $date->format('m'); @@ -4065,10 +4192,11 @@ $error_data = ['error_code' => '', 'error_data' => []]; $status = 'success'; $ret_status = true; - // dd($month.'-'.$year); + $return = []; if (!isset($file)) { //file not found in DB + $this->insurerStatements->where('id', $file_id)->set(['file_status' => 'failed', 'reason' => json_encode(['error_code' => 0, 'error_data' => 'statement file not found in DB'])])->update(); return array('status' => false, 'msg' => 'statement file not found in DB'); } $file_name_with_path = WRITEPATH . "/uploads/statements/" . $file['file_name']; @@ -4080,1943 +4208,1823 @@ // echo $message; $this->myLogger->logme('error', ($message . ' for statement file id ' . $file_id)); $this->insurerStatements->where('id', $file_id)->set(['file_status' => 'failed', 'reason' => json_encode(['error_code' => 0, 'error_data' => $message])])->update(); - return array('status' => false, 'error_code' => 0); //0 - Physcial file not found + return array('status' => false, 'error_code' => 0, 'error_data' => $message); //0 - Physcial file not found } //get excel data to php array $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file_name_with_path); $sheet = $spreadsheet->getActiveSheet(); - $highestRowAndColumn = $sheet->getHighestRowAndColumn(); - // dd($highestRowAndColumn); - $excel_data = $sheet->rangeToArray('A1:' . $highestRowAndColumn['column'] . $highestRowAndColumn['row']); + $highestRow = $sheet->getHighestRow(); + $highestColumn = $sheet->getHighestColumn(); + + $excel_data = $sheet->rangeToArray('A1:' . $highestColumn . $highestRow); unset($excel_data[0]); $excel_data = ExcelSanitizeHelper::sanitizeArrayData($excel_data); - // Kint::dump($excel_data); // die(); + // dd($excel_data); + //get no of line items and update in DB $line_items = 0; + // get uploaded month transactions data $source_data = $this->PTCOShareDetailsModel->getNonReconcileredPolicyTransactions(insurer_id: $file['insurer_id'], insurer_branch_id: $file['branch_id']); - // var_dump($source_data);die(); - // Kint::dump($source_data);die(); - + // dd($source_data); // check policy no,insurer and etc in DB for this month // if all good return true, otherwise return false with messssage + $matched_entry = []; + $error_messages = []; // row-wise error storage + foreach ($excel_data as $excel_key => $excel_row) { + + $row_number = $excel_key; $is_row_empty = check_row_is_empty_or_null($excel_row); + $policy_source_found = 0; + $endorsement_source_found = 0; + $dublicate_found = 0; if (!$is_row_empty) { - // $excel_row = ExcelSanitizeHelper::sanitizeArrayData($excel_row); - $is_source_found = 0; - // Kint::dump($excel_key,$excel_row[1],$excel_row[2]); - // $policy_start_date = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[4]); //policy_start_date from excel - // $policy_end_date = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[5]); //policy_end_date from excel - - $policy_no = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[1]); //policy_end_date from excel - $policy_no = preg_replace( '/[\x{200B}\x{200C}\x{200D}\x{FEFF}\x{00A0}\x{200E}\x{200F}\x{202A}-\x{202E}]/u', '', $excel_row[1]); //policy_end_date from excel - - // $client_name = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[3]); //clientname from excel - - $endorsement_no = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[2]??''); //policy_end_date from excel - $endorsement_no = preg_replace( '/[\x{200B}\x{200C}\x{200D}\x{FEFF}\x{00A0}\x{200E}\x{200F}\x{202A}-\x{202E}]/u', '', $excel_row[2]??''); //policy_end_date from excel + $policy_no = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[1]); //policy_number from excel + $policy_no = preg_replace('/[\x{200B}\x{200C}\x{200D}\x{FEFF}\x{00A0}\x{200E}\x{200F}\x{202A}-\x{202E}]/u', '', $excel_row[1]); //policy_number from excel + + $endorsement_no = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[2] ?? ''); //endorsement number from excel + $endorsement_no = preg_replace('/[\x{200B}\x{200C}\x{200D}\x{FEFF}\x{00A0}\x{200E}\x{200F}\x{202A}-\x{202E}]/u', '', $excel_row[2] ?? ''); //endorsement number from excel - // Kint::dump($excel_key,$policy_no,$endorsement_no,$policy_start_date,$policy_end_date);//die(); foreach ($source_data as $source_key => $source_row) { + $source_endorsement_no = $source_row['endorsement_no'] !== null ? $source_row['endorsement_no'] : null; - // Kint::dump($source_row, $source_endorsement_no, $policy_no, $endorsement_no); + + if (($policy_no == $source_row['policy_no']) ){ + $policy_source_found = 1; + } - // if (($policy_no == $source_row['policy_no']) && $endorsement_no == $source_endorsement_no && change_date_format($policy_start_date, 'd-m-Y', 'Y-m-d') == $source_row['policy_start_date'] && change_date_format($policy_end_date, 'd-m-Y', 'Y-m-d') == $source_row['policy_end_date'] && $client_name == $source_row['client_name']) - // { - // $is_source_found = 1; - // $line_items = $line_items + 1; - // unset($source_data[$source_key]); - // continue 2; - // } - - if (($policy_no == $source_row['policy_no']) && $endorsement_no == $source_endorsement_no) - { - $is_source_found = 1; + if( $endorsement_no == $source_endorsement_no) { + $endorsement_source_found = 1; + } + + // Duplicate check + if (isset($matched_entry[$policy_no . '|' . $endorsement_no])) { + $dublicate_found = 1; + continue 2; + } + + if (($policy_no == $source_row['policy_no']) && $endorsement_no == $source_endorsement_no) { $line_items = $line_items + 1; + $matched_entry[] = $policy_no . '|' . $endorsement_no; unset($source_data[$source_key]); continue 2; } } - if ($is_source_found == 0) { - // echo $excel_key.'-'.$excel_row[1] . '- not found
'; - $error_data['error_code'] = 1; //match not found - // $error_data['error_data'] = ($error_data['error_data'] ?? []); - $error_data['error_data'] = array_merge($error_data['error_data'], [$excel_row[0]]); //match not found + // Policy number mismatch + if ($policy_source_found == 0) { + $error_messages[$row_number]['policy_no_mismatch'] = + "Policy number ({$policy_no}) not in NHance."; + } + + // Endorsement number mismatch + if (!empty($endorsement_no) && $endorsement_source_found == 0) { + $error_messages[$row_number]['endorsement_no_mismatch'] = + "Endorsement number ({$endorsement_no}) not in NHance."; + } + + // Duplicate check + if ($dublicate_found == 1) { + $error_messages[$row_number]['duplicate'] = + "Duplicate entry found. This policy and endorsement ({$policy_no} '|' {$endorsement_no}) combination has already been matched."; } } + } + // print_rr($error_messages);die; - // dd($error_data); - - if ($error_data['error_code']) { + if (!empty($error_messages)) { + $error_data['error_code'] = 2; + $error_data['error_data'] = $error_messages; $status = 'failed'; $ret_status = false; } + //update in DB $this->insurerStatements->where('id', $file_id)->set(['line_items' => $line_items, 'file_status' => $status, 'reason' => json_encode($error_data)])->update(); return array('status' => $ret_status, 'error_code' => $error_data['error_code'], 'error_data' => $error_data['error_data']); + } catch (\Throwable $th) { + + $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, + ]; + + $this->myLogger->logme("error", "POLICY-TRANSACTION-CONTROLLER - validateInsurerStatement: Exception: " . json_encode($errorData ?? [])); + $this->insurerStatements->where('id', $file_id)->set(['line_items' => 0, 'file_status' => 'failed', 'reason' => json_encode($errorData)])->update(); + return array('status' => false, 'error_code' => [], 'error_data' => $errorData); + } + } + + + public function updateInsurerStatement($params) + { + helper('excel_util_helper'); + //get file info + $file_id = $params['file_id']; + $file = $this->insurerStatements->find((int)$file_id); + // dd($file); + $date = new \DateTime($file['month']); + + $month = $date->format('m'); + $year = $date->format('Y'); + + $error_data = ['error_code' => '', 'error_data' => []]; + $status = 'success'; + $ret_status = true; + // dd($month.'-'.$year); + $return = []; + if (!isset($file)) { + //file not found in DB + return array('status' => false, 'msg' => 'statement file not found in DB'); + } + $file_name_with_path = WRITEPATH . "/uploads/statements/" . $file['file_name']; + + //check physical file + if (!file_exists($file_name_with_path)) { + //file not found update status and reason + $message = "Physcial file not found"; + // echo $message; + $this->myLogger->logme('error', ($message . ' for statement file id ' . $file_id)); + $this->insurerStatements->where('id', $file_id)->set(['file_status' => 'failed', 'reason' => json_encode(['error_code' => 0, 'error_data' => $message])])->update(); + return array('status' => false, 'error_code' => 0); //0 - Physcial file not found } - public function validateInsurerStatement($params) - { - helper('excel_util_helper'); + //get excel data to php array + $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file_name_with_path); + $sheet = $spreadsheet->getActiveSheet(); - $file_id = $params['file_id']; + $highestRowAndColumn = $sheet->getHighestRowAndColumn(); + // dd($highestRowAndColumn); + $excel_data = $sheet->rangeToArray('A1:' . $highestRowAndColumn['column'] . $highestRowAndColumn['row']); + unset($excel_data[0]); + $excel_data = ExcelSanitizeHelper::sanitizeArrayData($excel_data); + // dd($excel_data); + //get no of line items and update in DB + $line_items = count($excel_data); + // get uploaded month transactions data + $source_data = $this->PTCOShareDetailsModel->getNonReconcileredPolicyTransactions(insurer_id: $file['insurer_id'], insurer_branch_id: $file['branch_id']); + // Kint::dump($source_data);//die; + // Kint::dump($excel_data); + // die; + // check policy no,insurer and etc in DB for this month + // if all good return true, otherwise return false with messssage + $data_to_update = []; + try{ + foreach ($excel_data as $excel_key => $excel_row) { + $is_row_empty = check_row_is_empty_or_null($excel_row); + if (!$is_row_empty) { + + $is_source_found = 0; + // $policy_start_date = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[4]); //policy_start_date from excel + // $policy_end_date = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[5]); //policy_end_date from excel + $policy_no = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[1]); //policy_end_date from excel + $policy_no = preg_replace('/[\x{200C}\x{200B}]/u', '', $excel_row[1]); // + // $client_name = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[3]); //clientname from excel + $endorsement_no = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[2]); //policy_end_date from excel + + foreach ($source_data as $source_key => $source_row) { + // Kint::dump(change_date_format($excel_row[3],'d-m-Y','Y-m-d')); + $source_endorsement_no = $source_row['endorsement_no'] !== null ? $source_row['endorsement_no'] : null; + // if (($policy_no == $source_row['policy_no']) && $endorsement_no == $source_endorsement_no && change_date_format($policy_start_date, 'd-m-Y', 'Y-m-d') == $source_row['policy_start_date'] && change_date_format($policy_end_date, 'd-m-Y', 'Y-m-d') == $source_row['policy_end_date'] && $client_name == $source_row['client_name']) { + if (($policy_no == $source_row['policy_no']) && $endorsement_no == $source_endorsement_no) { + $is_source_found = 1; + + //calculate percentage first + $total_amt = 0; + + // $actual_bp_per = trim($excel_row[9]); //commented becoz this filed removed tfrom excel file + $actual_bp_per = 0; //set default value 0 for maintaining existing code flow + $actual_bp_brokerage = (int) trim($excel_row[5]); + $actual_bp_amt = (int) trim($excel_row[3]); + + if (($actual_bp_brokerage && $actual_bp_brokerage != 0 && $actual_bp_brokerage != "")) { + $total_amt += $actual_bp_brokerage; + //percentage reverse calculation + if (($actual_bp_per == 0 || $actual_bp_per == 0) && !empty($actual_bp_amt)) { + $actual_bp_per = (int) round(($actual_bp_brokerage / $actual_bp_amt) * 100, 2); + } + } else { + $actual_bp_brokerage = $actual_bp_amt * ($actual_bp_per / 100); + $total_amt += $actual_bp_brokerage; + } + + // $actual_tp_per = trim($excel_row[10]);//commented becoz this filed removed tfrom excel file + $actual_tp_per = 0;//set default value 0 for maintaining existing code flow + $actual_tp_brokerage = (int) trim($excel_row[6]); + $actual_tp_amt = (int) trim($excel_row[4]); + + if ($actual_tp_brokerage && $actual_tp_brokerage != 0 && $actual_tp_brokerage != "") { + $total_amt += $actual_tp_brokerage; + //percentage reverse calculation + if (($actual_tp_per == 0 || $actual_tp_per == "") && !empty($actual_tp_amt)) { + $actual_tp_per = (int) round(($actual_tp_brokerage / $actual_tp_amt) * 100, 2); + } + } else { + $actual_tp_brokerage = $actual_tp_amt * ($actual_tp_per / 100); + $total_amt += $actual_tp_brokerage; + } + + // $actual_tep_per = trim($excel_row[11]); + // $actual_tep_brokerage = trim($excel_row[14]); + // $actual_tep_amt = trim($excel_row[8]); + + $actual_tep_per = 0; + $actual_tep_brokerage = 0; + $actual_tep_amt = 0; + + if ($actual_tep_brokerage && $actual_tep_brokerage != 0 && $actual_tep_brokerage != "") { + $total_amt += $actual_tep_brokerage; + //percentage reverse calculation + if (($actual_tep_per == 0 || $actual_tep_per == "") && !empty($actual_tep_amt)) { + $actual_tep_per = ($actual_tep_brokerage / $actual_tep_amt) * 100; + } + } else { + $actual_tep_brokerage = $actual_tep_amt * ($actual_tep_per / 100); + $total_amt += $actual_tep_brokerage; + } + + //find variance + $variance_amt = $source_row['exp_amt'] - $total_amt; + + $data_to_update[] = ['co_share_id' => $source_row['id'], 'actual_bp_amt' => $actual_bp_amt, 'actual_tp_amt' => $actual_tp_amt, 'actual_tep_amt' => $actual_tep_amt, 'actual_bp_per' => $actual_bp_per, 'actual_tp_per' => $actual_tp_per, 'actual_tep_per' => $actual_tep_per, 'variance' => $variance_amt, 'actual_tep_brokerage_amt' => $actual_tep_brokerage, 'actual_tp_brokerage_amt' => $actual_tp_brokerage, 'actual_bp_brokerage_amt' => $actual_bp_brokerage, 'reward' => trim($excel_row[7]), 'statement_id' => $file_id]; + + unset($source_data[$source_key]); + continue 2; + } + } + } + } + }catch (\Throwable $th) { + + $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - updateInsurerStatement: 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, + ]; + return ['status' => 'failed', 'code' => 500, 'message' => $th->getMessage(), 'error_data' => $errorData]; + } + // dd($data_to_update); + $this->coShareStmtDetailsModel->insertBatch($data_to_update, 'id'); + // dd($data_to_update); + // if($error_data['error_code']) + // { + // $status = 'failed'; + // $ret_status = false; + // } + //update in DB + $this->insurerStatements->where('id', $file_id)->set(['file_status' => $status, 'reason' => json_encode($error_data), 'invoice_status' => 'pending'])->update(); + return array('status' => $ret_status, 'error_code' => $error_data['error_code'], 'error_data' => $error_data['error_data']); + } + + public function getInvoicePaymentDetails() + { + $statement_id = $this->request->getUri()->getSegment(4); + + $inv_details = $this->insurerStatements->find((int)$statement_id); + $inv_payment_details = $this->invPaymentDetailsModel + ->where('statement_id', $statement_id) + ->where('is_active', 1) + ->get() + ->getResultArray(); + if (!$inv_details['invoice_value']) { + $stmt_level_value = $this->coShareStmtDetailsModel->select('sum(actual_tep_brokerage_amt) + sum(actual_tp_brokerage_amt) + sum(actual_bp_brokerage_amt) + sum(reward) as invoice_value') + ->where('statement_id', $statement_id) + ->groupBy('statement_id') + ->get() + ->getResultArray(); + // print_r($stmt_level_value); + if ($stmt_level_value && count($stmt_level_value) && isset($stmt_level_value[0])) { + $inv_details['invoice_value'] = $stmt_level_value[0]['invoice_value']; + } + } + // ~dd($inv_details); + $data = [ + 'invoice_status' => $inv_details['invoice_status'], + 'gst_per' => isset($inv_details['gst_per']) ? $inv_details['gst_per'] : 18, + 'invoice_value' => $inv_details['invoice_value'], + 'gst_value' => $inv_details['gst_value'], + 'invoice_no' => $inv_details['invoice_no'], + 'invoice_amount' => $inv_details['invoice_amount'], + 'invoice_date' => isset($inv_details['invoice_date']) ? change_date_format($inv_details['invoice_date'], 'Y-m-d', 'd/m/Y') : null + ]; + $data['payments'] = $inv_payment_details; + return $this->respond(['dataStatus' => true, 'code' => 200, 'data' => $data], 200); + } + + public function saveInvoicePaymentDetails() + { + $jsonData = $this->request->getJSON(); + $jsonData = (array)$jsonData; + // echo 'Hi'; + // print_r($jsonData);die(); + + $invoiceStatus = $jsonData['invoice_status']; + $hiddenStatementId = $jsonData['hidden_statement_id']; + $invoiceNo = $jsonData['invoice_no']; + $invoiceDate = change_date_format($jsonData['invoice_date'], 'd/m/Y', 'Y-m-d'); + $invoice_amount = $jsonData['invoice_amount']; + $invoice_value = $jsonData['invoice_value']; + $gst_per = $jsonData['invoice_gst_per']; + $gst_value = $jsonData['invoice_gst']; + + //Update statement table + $parentData = [ + 'invoice_status' => $invoiceStatus, + 'invoice_no' => $invoiceNo, + 'invoice_date' => $invoiceDate, + 'invoice_amount' => $invoice_amount, + 'gst_per' => $gst_per, + 'gst_value' => $gst_value, + 'invoice_value' => $invoice_value, + 'updated_by' => get_session_userid() + ]; + + + + $this->insurerStatements->update($hiddenStatementId, $parentData); + + // Process child data + $receivedAmounts = $jsonData['received_amount']; + $utrNos = $jsonData['utr_no']; + $tdsTotal = $jsonData['tds']; + $gstTotal = $jsonData['gst_amount']; + $paymentDates = $jsonData['payment_date']; + $pks = $jsonData['pk']; + + foreach ($receivedAmounts as $index => $receivedAmount) { + $pk = $pks[$index]; // Get the pk for the current record + $utrNo = $utrNos[$index]; + $tds = $tdsTotal[$index]; + $gst = $gstTotal[$index]; + $paymentDate = $paymentDates[$index]; + + if($utrNo == "" && $tds == "" && $gst == "" && $receivedAmount == "") + { + continue; + } + // Prepare data for insert/update + $childData = [ + 'inv_amt' => $receivedAmount, + 'utr_no' => $utrNo, + 'tds' => $tds, + 'gst' => $gst, + 'received_date' => change_date_format($paymentDate, 'd/m/Y', 'Y-m-d'), + 'statement_id' => $hiddenStatementId + ]; + if ($pk) { + $childData['updated_by'] = get_session_userid(); + $childData['id'] = (int)$pk; + } else { + $childData['created_by'] = get_session_userid(); + } + // print_r($childData); + // Insert or update + $this->invPaymentDetailsModel->save($childData); + // print_r($this->invPaymentDetailsModel->errors()); + + } + + return $this->respond(['dataStatus' => true, 'code' => 200], 200); + //return $this->response->setJSON(['dataStatus' => 'true']); + } + + public function deletePaymentEntry() + { + $payment_id = $this->request->getUri()->getSegment(4); + //echo $payment_id; + $this->invPaymentDetailsModel->update($payment_id, ['is_active' => 0]); + return $this->respond(['dataStatus' => true, 'code' => 200], 200); + } + + public function downloadSampleInsurerStatement() + { + + $filePath = ROOTPATH . 'public/sample_excel/insurer_stament_sample.xlsx'; + // 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 getFileErr() + { + $file_id = $this->request->getUri()->getSegment(4); + $file = $this->insurerStatements->find((int)$file_id); + return $this->respond(['dataStatus' => true, 'code' => 200, 'data' => $file['reason']], 200); + } + + public function dmsSearch() + { + // echo 'scbsc';die(); + if ($this->request->is('post')) { + // $jsonData = (array)$this->request->getJSON(); + $request_data = $this->request->getPost(); + $data = sanitizeInputArrayAdvanced($request_data); + $customer_id = $data['customer_id']; + $policy_id = $data['policy_id']; + $cus_doc_name = $data['cus_doc_name']; + $policy_doc_name = $data['policy_doc_name']; + $pt_files = []; + $kyc_files = []; + $batch_files = []; + $files = []; + // print_r($jsonData);die(); + if ($policy_id != "") { + //get policy docs from policy transation related tables + $pt_files = $this->PTFileModel->getPolicyDriveFilesIndex($policy_id, $policy_doc_name); + $batch_files = $this->batchFileModel->getBatchFilesDataForDocumentSearch($policy_id, $policy_doc_name); + $files = $this->filesModel->getFilesDataForDocumentSearch($policy_id, $policy_doc_name); + // dd($files); + // dd($this->PTFileModel->getLastQuery()); + // ~dd($pt_files); + } + if ($customer_id != "") { + $kyc_files = $this->clientKYCDocsModel->getClientKYCDriveFilesIndex($customer_id, $cus_doc_name); + // dd($this->clientKYCDocsModel->getLastQuery()); + // !dd($kyc_files); + } + + $data['files'] = array_merge($pt_files, $kyc_files, $batch_files, $files); + // dd($data['files']); + } + $data['tab_name'] = 'Documents Search'; + $data['page_name'] = 'Documents'; + + $data['customers'] = $this->clientModel->select('id,client_name,short_name as display_value')->where('is_active', 1)->get()->getResultarray(); + $data['policies'] = $this->clientPolicyModel->select("client_policy.id,client_policy.policy_no,policy_type.policy_type,concat(policy_type.policy_type,' - ',client_policy.policy_no) as display_value") + ->join('policy_type', 'client_policy.policy_type_id = policy_type.id') + ->where('client_policy.is_active', 1)->get()->getResultarray(); + // dd($data); + $this->loadLayout('dms_search', $data); + } + + //--------------------------------------------------------------------------------------------------- + + public function getCoShareStatementDetails($pt_id) + { + if (!$pt_id) { + return $this->respond([ + 'status' => false, + 'code' => 400, + 'message' => 'No data found' + ], 200); + } + + // Fetch data from the database + $data = db_connect()->table("co_share_stmt_details") + ->select(" + co_share_stmt_details.*, + insurer_statements.month, + insurer_statements.invoice_status, + insurer_statements.invoice_date, + insurer_statements.invoice_no, + insurer_statements.invoice_amount, + insurer_statements.stmt_sno, + (co_share_stmt_details.actual_bp_amt + co_share_stmt_details.actual_tp_amt + co_share_stmt_details.actual_tep_amt) AS sum_of_actual_amt + ") + ->join('insurer_statements', 'co_share_stmt_details.statement_id = insurer_statements.id') + ->where([ + 'co_share_stmt_details.is_active' => 1, + 'insurer_statements.is_active' => 1, + 'co_share_stmt_details.co_share_id' => $pt_id + ]) + ->get() + ->getResultArray(); + + // Check if data exists before formatting + if ($data) { + + foreach ($data as &$row) { + // Check if invoice_date is not null before formatting + $row['invoice_date'] = $row['invoice_date'] ? change_date_format($row['invoice_date'], 'Y-m-d', 'd/m/Y') : null; + + // Check if month is not null before formatting + $row['month'] = $row['month'] ? change_date_format($row['month'], 'Y-m-d', 'M-Y') : null; + } + + return $this->respond([ + 'status' => true, + 'code' => 200, + 'data' => $data + ], 200); + } else { + return $this->respond([ + 'status' => false, + 'code' => 400, + 'message' => 'No data found' + ], 200); + } + } + + public function getClientPolicyDataBasedOnClientAndInsuer() + { + + $client_id = $this->request->getGet('client_id') ?? 0; + $client_branch_id = $this->request->getGet('client_branch_id') ?? 0; + $insurer_id = $this->request->getGet('insurer_id') ?? 0; + $insurer_branch_id = $this->request->getGet('insurer_branch_id') ?? 0; + $policy_type_id = $this->request->getGet('policy_type_id') ?? 0; + + $builder = db_connect()->table("client_policy") + ->select(" + client_policy.*, + policy_type.policy_type, + ") + ->join('policy_type', 'client_policy.policy_type_id = policy_type.id') + ->where([ + 'client_policy.is_active' => 1, + ]); + + if (!empty($client_id)) { + $builder->where('client_policy.client_id', $client_id); + } + if (!empty($client_branch_id)) { + $builder->where('client_policy.client_branch_id', $client_branch_id); + } + if (!empty($insurer_id)) { + $builder->where('client_policy.insurer_id', $insurer_id); + } + if (!empty($insurer_branch_id)) { + $builder->where('client_policy.insurer_branch_id', $insurer_branch_id); + } + if (!empty($policy_type_id)) { + $builder->where('client_policy.policy_type_id', $policy_type_id); + } + + $result = $builder->get()->getResultArray(); + + if ($result) { + return $this->respond(['status' => true, 'code' => 200, 'data' => $result, 'getData' => $this->request->getGet()], 200); + } else { + return $this->respond(['status' => false, 'code' => 400, 'message' => 'No data found'], 200); + } + } + + public function checkCDAmountForBasePremium() + { + $base_premium = $this->request->getGet('base_premium') ?? 0; + $cd_ac_no = $this->request->getGet('cd_ac_no') ?? 0; + + // Validate inputs + if (empty($cd_ac_no)) { + return $this->respond(['status' => false, 'code' => 400, 'message' => 'CD Account Number is required'], 200); + } + + // Build query + $db = db_connect(); + $builder = $db->table("cash_deposit") + ->where('cd_ac_pk', $cd_ac_no) + ->where('is_active', 1) + ->orderBy('id', 'desc') + ->limit(1); + + $result = $builder->get()->getRowArray(); + + if ($result) { + // Check if base premium exceeds balance + $base_premium_greater_than_balance = $base_premium > $result['balance']; + + return $this->respond([ + 'status' => true, + 'code' => 200, + 'data' => $result, + 'base_premium' => $base_premium, + 'cd_ac_no' => $cd_ac_no, + 'base_premium_greater_than_balance' => $base_premium_greater_than_balance, + ], 200); + } + + return $this->respond(['status' => false, 'code' => 400, 'message' => 'No data found for this CD'], 200); + } + + public function getInsurerStatementMonth() + { + $insurer_id = $this->request->getGet('insurer_id'); + $month = $this->request->getGet('month'); + // echo $month; + $insurer_branch_id = explode('-', $insurer_id)[1]; + $insurer_id = explode('-', $insurer_id)[0]; + $month = $month . '-01'; + $month = change_date_format($month, 'Y-M-d', 'Y-m-d'); + // echo $month; + + $res_data = $this->insurerStatements + ->where('insurer_id', $insurer_id) + ->where('branch_id', $insurer_branch_id) + ->where('month', $month) + ->where('is_active', 1) + ->where('file_status', 'success') + ->findAll(); + + return $this->respond(['dataStatus' => true, 'code' => 200, 'data' => $res_data], 200); + } + + public function deleteStatement($id) + { + // echo $id;die(); + $this->coShareStmtDetailsModel->where('statement_id', $id) + ->set(['is_active' => 0]) + ->update(); + $this->invPaymentDetailsModel->where('statement_id', $id) + ->set(['is_active' => 0]) + ->update(); + $this->insurerStatements->where('id', $id) + ->set(['is_active' => 0]) + ->update(); + return $this->respond(['dataStatus' => true, 'code' => 200], 200); + } + + public function sendInstallmentRemainderMail() + { + + $this->myLogger->logme("error", "Cron Job For Send Installment Remainder Mail Started"); + + try { try { - //get file info - $file = $this->insurerStatements->find((int)$file_id); - // dd($file); + $bdsInstallmentData = $this->BdsPlacementModel->getClientInstallmentDetails(); + } catch (Exception $e) { - $date = new \DateTime($file['month']); - - $month = $date->format('m'); - $year = $date->format('Y'); - - $error_data = ['error_code' => '', 'error_data' => []]; - $status = 'success'; - $ret_status = true; - - $return = []; - if (!isset($file)) { - //file not found in DB - $this->insurerStatements->where('id', $file_id)->set(['file_status' => 'failed', 'reason' => json_encode(['error_code' => 0, 'error_data' => 'statement file not found in DB'])])->update(); - return array('status' => false, 'msg' => 'statement file not found in DB'); - } - $file_name_with_path = WRITEPATH . "/uploads/statements/" . $file['file_name']; - - //check physical file - if (!file_exists($file_name_with_path)) { - //file not found update status and reason - $message = "Physcial file not found"; - // echo $message; - $this->myLogger->logme('error', ($message . ' for statement file id ' . $file_id)); - $this->insurerStatements->where('id', $file_id)->set(['file_status' => 'failed', 'reason' => json_encode(['error_code' => 0, 'error_data' => $message])])->update(); - return array('status' => false, 'error_code' => 0, 'error_data' => $message); //0 - Physcial file not found - } - - //get excel data to php array - $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file_name_with_path); - $sheet = $spreadsheet->getActiveSheet(); - - $highestRow = $sheet->getHighestRow(); - $highestColumn = $sheet->getHighestColumn(); - - $excel_data = $sheet->rangeToArray('A1:' . $highestColumn . $highestRow); - unset($excel_data[0]); - $excel_data = ExcelSanitizeHelper::sanitizeArrayData($excel_data); - // dd($excel_data); - - //get no of line items and update in DB - $line_items = 0; - - // get uploaded month transactions data - $source_data = $this->PTCOShareDetailsModel->getNonReconcileredPolicyTransactions(insurer_id: $file['insurer_id'], insurer_branch_id: $file['branch_id']); - // dd($source_data); - - // check policy no,insurer and etc in DB for this month - // if all good return true, otherwise return false with messssage - $matched_entry = []; - $error_messages = []; // row-wise error storage - - foreach ($excel_data as $excel_key => $excel_row) { - - $row_number = $excel_key; - $is_row_empty = check_row_is_empty_or_null($excel_row); - $policy_source_found = 0; - $endorsement_source_found = 0; - $dublicate_found = 0; - - if (!$is_row_empty) { - - $policy_no = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[1]); //policy_number from excel - $policy_no = preg_replace('/[\x{200B}\x{200C}\x{200D}\x{FEFF}\x{00A0}\x{200E}\x{200F}\x{202A}-\x{202E}]/u', '', $excel_row[1]); //policy_number from excel - - $endorsement_no = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[2] ?? ''); //endorsement number from excel - $endorsement_no = preg_replace('/[\x{200B}\x{200C}\x{200D}\x{FEFF}\x{00A0}\x{200E}\x{200F}\x{202A}-\x{202E}]/u', '', $excel_row[2] ?? ''); //endorsement number from excel - - foreach ($source_data as $source_key => $source_row) { - - $source_endorsement_no = $source_row['endorsement_no'] !== null ? $source_row['endorsement_no'] : null; - - if (($policy_no == $source_row['policy_no']) ){ - $policy_source_found = 1; - } - - if( $endorsement_no == $source_endorsement_no) { - $endorsement_source_found = 1; - } - - // Duplicate check - if (isset($matched_entry[$policy_no . '|' . $endorsement_no])) { - $dublicate_found = 1; - continue 2; - } - - if (($policy_no == $source_row['policy_no']) && $endorsement_no == $source_endorsement_no) { - $line_items = $line_items + 1; - $matched_entry[] = $policy_no . '|' . $endorsement_no; - unset($source_data[$source_key]); - continue 2; - } - } - - // Policy number mismatch - if ($policy_source_found == 0) { - $error_messages[$row_number]['policy_no_mismatch'] = - "Policy number ({$policy_no}) not in NHance."; - } - - // Endorsement number mismatch - if (!empty($endorsement_no) && $endorsement_source_found == 0) { - $error_messages[$row_number]['endorsement_no_mismatch'] = - "Endorsement number ({$endorsement_no}) not in NHance."; - } - - // Duplicate check - if ($dublicate_found == 1) { - $error_messages[$row_number]['duplicate'] = - "Duplicate entry found. This policy and endorsement ({$policy_no} '|' {$endorsement_no}) combination has already been matched."; - } - } - - } - // print_rr($error_messages);die; - - if (!empty($error_messages)) { - $error_data['error_code'] = 2; - $error_data['error_data'] = $error_messages; - $status = 'failed'; - $ret_status = false; - } - - //update in DB - $this->insurerStatements->where('id', $file_id)->set(['line_items' => $line_items, 'file_status' => $status, 'reason' => json_encode($error_data)])->update(); - return array('status' => $ret_status, 'error_code' => $error_data['error_code'], 'error_data' => $error_data['error_data']); - } catch (\Throwable $th) { - - $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, - ]; - - $this->myLogger->logme("error", "POLICY-TRANSACTION-CONTROLLER - validateInsurerStatement: Exception: " . json_encode($errorData ?? [])); - $this->insurerStatements->where('id', $file_id)->set(['line_items' => 0, 'file_status' => 'failed', 'reason' => json_encode($errorData)])->update(); - return array('status' => false, 'error_code' => [], 'error_data' => $errorData); + $this->myLogger->logme('error', 'Exception: ' . $e->getMessage() . 'Page: ' . $e->getFile() . ' Line: ' . $e->getLine()); } - } + $this->myLogger->logme("error", "Data for BDS Installment " . json_encode($bdsInstallmentData)); + // dd($bdsInstallmentData); + if (empty($bdsInstallmentData)) { - public function updateInsurerStatement($params) - { - helper('excel_util_helper'); - //get file info - $file_id = $params['file_id']; - $file = $this->insurerStatements->find((int)$file_id); - // dd($file); - $date = new \DateTime($file['month']); + $this->myLogger->logme("error", "No Client Installment is Due in the 15th Day"); - $month = $date->format('m'); - $year = $date->format('Y'); - - $error_data = ['error_code' => '', 'error_data' => []]; - $status = 'success'; - $ret_status = true; - // dd($month.'-'.$year); - $return = []; - if (!isset($file)) { - //file not found in DB - return array('status' => false, 'msg' => 'statement file not found in DB'); - } - $file_name_with_path = WRITEPATH . "/uploads/statements/" . $file['file_name']; - - //check physical file - if (!file_exists($file_name_with_path)) { - //file not found update status and reason - $message = "Physcial file not found"; - // echo $message; - $this->myLogger->logme('error', ($message . ' for statement file id ' . $file_id)); - $this->insurerStatements->where('id', $file_id)->set(['file_status' => 'failed', 'reason' => json_encode(['error_code' => 0, 'error_data' => $message])])->update(); - return array('status' => false, 'error_code' => 0); //0 - Physcial file not found + return false; } - //get excel data to php array - $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file_name_with_path); - $sheet = $spreadsheet->getActiveSheet(); + foreach ($bdsInstallmentData as $installmentData) { - $highestRowAndColumn = $sheet->getHighestRowAndColumn(); - // dd($highestRowAndColumn); - $excel_data = $sheet->rangeToArray('A1:' . $highestRowAndColumn['column'] . $highestRowAndColumn['row']); - unset($excel_data[0]); - $excel_data = ExcelSanitizeHelper::sanitizeArrayData($excel_data); - // dd($excel_data); - //get no of line items and update in DB - $line_items = count($excel_data); - // get uploaded month transactions data - $source_data = $this->PTCOShareDetailsModel->getNonReconcileredPolicyTransactions(insurer_id: $file['insurer_id'], insurer_branch_id: $file['branch_id']); - // Kint::dump($source_data);//die; - // Kint::dump($excel_data); - // die; - // check policy no,insurer and etc in DB for this month - // if all good return true, otherwise return false with messssage - $data_to_update = []; - try{ - foreach ($excel_data as $excel_key => $excel_row) { - $is_row_empty = check_row_is_empty_or_null($excel_row); - if (!$is_row_empty) { + $mailData = $this->PrepareBDSMailData($installmentData); + $to_mail = $mailData['to_mail']; + $message = $mailData['message']; + $subject = $mailData['subject']; - $is_source_found = 0; - // $policy_start_date = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[4]); //policy_start_date from excel - // $policy_end_date = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[5]); //policy_end_date from excel - $policy_no = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[1]); //policy_end_date from excel - $policy_no = preg_replace('/[\x{200C}\x{200B}]/u', '', $excel_row[1]); // - // $client_name = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[3]); //clientname from excel - $endorsement_no = preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $excel_row[2]); //policy_end_date from excel + $this->myLogger->logme("error", "Installment Pending for" . $subject); - foreach ($source_data as $source_key => $source_row) { - // Kint::dump(change_date_format($excel_row[3],'d-m-Y','Y-m-d')); - $source_endorsement_no = $source_row['endorsement_no'] !== null ? $source_row['endorsement_no'] : null; - // if (($policy_no == $source_row['policy_no']) && $endorsement_no == $source_endorsement_no && change_date_format($policy_start_date, 'd-m-Y', 'Y-m-d') == $source_row['policy_start_date'] && change_date_format($policy_end_date, 'd-m-Y', 'Y-m-d') == $source_row['policy_end_date'] && $client_name == $source_row['client_name']) { - if (($policy_no == $source_row['policy_no']) && $endorsement_no == $source_endorsement_no) { - $is_source_found = 1; + $common = ['mail_type' => 'installment_amount_due_remainder_mail']; - //calculate percentage first - $total_amt = 0; + $res = MailHelper::send_email(['mail' => $to_mail, 'subject' => $subject, 'message' => $message, 'common' => $common]); - // $actual_bp_per = trim($excel_row[9]); //commented becoz this filed removed tfrom excel file - $actual_bp_per = 0; //set default value 0 for maintaining existing code flow - $actual_bp_brokerage = (int) trim($excel_row[5]); - $actual_bp_amt = (int) trim($excel_row[3]); + $res = json_decode($res); + $this->myLogger->logme('error', 'res: ' . json_encode($res)); - if (($actual_bp_brokerage && $actual_bp_brokerage != 0 && $actual_bp_brokerage != "")) { - $total_amt += $actual_bp_brokerage; - //percentage reverse calculation - if (($actual_bp_per == 0 || $actual_bp_per == 0) && !empty($actual_bp_amt)) { - $actual_bp_per = (int) round(($actual_bp_brokerage / $actual_bp_amt) * 100, 2); - } - } else { - $actual_bp_brokerage = $actual_bp_amt * ($actual_bp_per / 100); - $total_amt += $actual_bp_brokerage; - } - - // $actual_tp_per = trim($excel_row[10]);//commented becoz this filed removed tfrom excel file - $actual_tp_per = 0;//set default value 0 for maintaining existing code flow - $actual_tp_brokerage = (int) trim($excel_row[6]); - $actual_tp_amt = (int) trim($excel_row[4]); - - if ($actual_tp_brokerage && $actual_tp_brokerage != 0 && $actual_tp_brokerage != "") { - $total_amt += $actual_tp_brokerage; - //percentage reverse calculation - if (($actual_tp_per == 0 || $actual_tp_per == "") && !empty($actual_tp_amt)) { - $actual_tp_per = (int) round(($actual_tp_brokerage / $actual_tp_amt) * 100, 2); - } - } else { - $actual_tp_brokerage = $actual_tp_amt * ($actual_tp_per / 100); - $total_amt += $actual_tp_brokerage; - } - - // $actual_tep_per = trim($excel_row[11]); - // $actual_tep_brokerage = trim($excel_row[14]); - // $actual_tep_amt = trim($excel_row[8]); - - $actual_tep_per = 0; - $actual_tep_brokerage = 0; - $actual_tep_amt = 0; - - if ($actual_tep_brokerage && $actual_tep_brokerage != 0 && $actual_tep_brokerage != "") { - $total_amt += $actual_tep_brokerage; - //percentage reverse calculation - if (($actual_tep_per == 0 || $actual_tep_per == "") && !empty($actual_tep_amt)) { - $actual_tep_per = ($actual_tep_brokerage / $actual_tep_amt) * 100; - } - } else { - $actual_tep_brokerage = $actual_tep_amt * ($actual_tep_per / 100); - $total_amt += $actual_tep_brokerage; - } - - //find variance - $variance_amt = $source_row['exp_amt'] - $total_amt; - - $data_to_update[] = ['co_share_id' => $source_row['id'], 'actual_bp_amt' => $actual_bp_amt, 'actual_tp_amt' => $actual_tp_amt, 'actual_tep_amt' => $actual_tep_amt, 'actual_bp_per' => $actual_bp_per, 'actual_tp_per' => $actual_tp_per, 'actual_tep_per' => $actual_tep_per, 'variance' => $variance_amt, 'actual_tep_brokerage_amt' => $actual_tep_brokerage, 'actual_tp_brokerage_amt' => $actual_tp_brokerage, 'actual_bp_brokerage_amt' => $actual_bp_brokerage, 'reward' => trim($excel_row[7]), 'statement_id' => $file_id]; - - unset($source_data[$source_key]); - continue 2; - } - } - } - } - }catch (\Throwable $th) { - - $this->myLogger->logme("error", "REST-AUTH-CONTROLLER - updateInsurerStatement: 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, - ]; - return ['status' => 'failed', 'code' => 500, 'message' => $th->getMessage(), 'error_data' => $errorData]; - } - // dd($data_to_update); - $this->coShareStmtDetailsModel->insertBatch($data_to_update, 'id'); - // dd($data_to_update); - // if($error_data['error_code']) - // { - // $status = 'failed'; - // $ret_status = false; - // } - //update in DB - $this->insurerStatements->where('id', $file_id)->set(['file_status' => $status, 'reason' => json_encode($error_data), 'invoice_status' => 'pending'])->update(); - return array('status' => $ret_status, 'error_code' => $error_data['error_code'], 'error_data' => $error_data['error_data']); - } - - public function getInvoicePaymentDetails() - { - $statement_id = $this->request->getUri()->getSegment(4); - - $inv_details = $this->insurerStatements->find((int)$statement_id); - $inv_payment_details = $this->invPaymentDetailsModel - ->where('statement_id', $statement_id) - ->where('is_active', 1) - ->get() - ->getResultArray(); - if (!$inv_details['invoice_value']) { - $stmt_level_value = $this->coShareStmtDetailsModel->select('sum(actual_tep_brokerage_amt) + sum(actual_tp_brokerage_amt) + sum(actual_bp_brokerage_amt) + sum(reward) as invoice_value') - ->where('statement_id', $statement_id) - ->groupBy('statement_id') - ->get() - ->getResultArray(); - // print_r($stmt_level_value); - if ($stmt_level_value && count($stmt_level_value) && isset($stmt_level_value[0])) { - $inv_details['invoice_value'] = $stmt_level_value[0]['invoice_value']; - } - } - // ~dd($inv_details); - $data = [ - 'invoice_status' => $inv_details['invoice_status'], - 'gst_per' => isset($inv_details['gst_per']) ? $inv_details['gst_per'] : 18, - 'invoice_value' => $inv_details['invoice_value'], - 'gst_value' => $inv_details['gst_value'], - 'invoice_no' => $inv_details['invoice_no'], - 'invoice_amount' => $inv_details['invoice_amount'], - 'invoice_date' => isset($inv_details['invoice_date']) ? change_date_format($inv_details['invoice_date'], 'Y-m-d', 'd/m/Y') : null - ]; - $data['payments'] = $inv_payment_details; - return $this->respond(['dataStatus' => true, 'code' => 200, 'data' => $data], 200); - } - - public function saveInvoicePaymentDetails() - { - $jsonData = $this->request->getJSON(); - $jsonData = (array)$jsonData; - // echo 'Hi'; - // print_r($jsonData);die(); - - $invoiceStatus = $jsonData['invoice_status']; - $hiddenStatementId = $jsonData['hidden_statement_id']; - $invoiceNo = $jsonData['invoice_no']; - $invoiceDate = change_date_format($jsonData['invoice_date'], 'd/m/Y', 'Y-m-d'); - $invoice_amount = $jsonData['invoice_amount']; - $invoice_value = $jsonData['invoice_value']; - $gst_per = $jsonData['invoice_gst_per']; - $gst_value = $jsonData['invoice_gst']; - - //Update statement table - $parentData = [ - 'invoice_status' => $invoiceStatus, - 'invoice_no' => $invoiceNo, - 'invoice_date' => $invoiceDate, - 'invoice_amount' => $invoice_amount, - 'gst_per' => $gst_per, - 'gst_value' => $gst_value, - 'invoice_value' => $invoice_value, - 'updated_by' => get_session_userid() - ]; - - - - $this->insurerStatements->update($hiddenStatementId, $parentData); - - // Process child data - $receivedAmounts = $jsonData['received_amount']; - $utrNos = $jsonData['utr_no']; - $tdsTotal = $jsonData['tds']; - $gstTotal = $jsonData['gst_amount']; - $paymentDates = $jsonData['payment_date']; - $pks = $jsonData['pk']; - - foreach ($receivedAmounts as $index => $receivedAmount) { - $pk = $pks[$index]; // Get the pk for the current record - $utrNo = $utrNos[$index]; - $tds = $tdsTotal[$index]; - $gst = $gstTotal[$index]; - $paymentDate = $paymentDates[$index]; - - if($utrNo == "" && $tds == "" && $gst == "" && $receivedAmount == "") - { - continue; - } - // Prepare data for insert/update - $childData = [ - 'inv_amt' => $receivedAmount, - 'utr_no' => $utrNo, - 'tds' => $tds, - 'gst' => $gst, - 'received_date' => change_date_format($paymentDate, 'd/m/Y', 'Y-m-d'), - 'statement_id' => $hiddenStatementId - ]; - if ($pk) { - $childData['updated_by'] = get_session_userid(); - $childData['id'] = (int)$pk; + if ($res->status == 'success') { + return true; } else { - $childData['created_by'] = get_session_userid(); + return false; } - // print_r($childData); - // Insert or update - $this->invPaymentDetailsModel->save($childData); - // print_r($this->invPaymentDetailsModel->errors()); + } + } catch (Exception $e) { + $this->myLogger->logme('error', 'Exception: ' . $e->getMessage() . 'Page: ' . $e->getFile() . ' Line: ' . $e->getLine()); + } + } + + protected function PrepareBDSMailData($data) + { + + try { + + $installment_amount = $data['installment_amount']; + $payment_date = date('d-m-Y', strtotime($data['payment_date'])); + $client = $data['client_name']; + $branch = $data['branch_name']; + $sales_person_mail = $data['sales_person']; + $heads = $data['heads']; + $admins = $data['admins']; + $buisness_team = $data['buisness_team']; + $policy_no = $data['policy_no']; + $client_short_name = isset($data['short_name']) && $data['short_name'] != null ? $data['short_name'] : $data['client_name']; + + $subject = "Installment Amount Due For Client - {$client_short_name} - Policy NO({$policy_no}) is Due On - {$payment_date}"; + + $message = "Policy Installment for Client - {$client}, Branch - {$branch} is Due on {$payment_date} + with amount of {$installment_amount}.
+ Policy No : {$policy_no}"; + + + $to_mail = array_merge( + array_column($heads, 'email'), + array_column($admins, 'email'), + array_column($buisness_team, 'email'), + [$sales_person_mail] + ); + + $to_mail = array_unique($to_mail); + + $this->myLogger->logme("error", "Selected To Address : " . json_encode($to_mail)); + + // dd($to_mail); + return [ + 'to_mail' => $to_mail, + 'message' => $message, + 'subject' => $subject + ]; + } catch (Exception $e) { + + $this->myLogger->logme('error', 'Exception: ' . $e->getMessage() . 'Page: ' . $e->getFile() . ' Line: ' . $e->getLine()); + } + } + + public function getMoreInfo() + { + + $pt_id = $this->request->getPost("pt_id"); + $data_to_send['bds_data'] = $this->BdsPlacementModel->where("is_active", 1)->where("pt_id", $pt_id)->findAll(); + + foreach ($data_to_send['bds_data'] as &$data) { + + $data['payment_date'] = (new \DateTime($data['payment_date']))->format('d-m-Y'); + } + + if (!empty($data_to_send)) { + + return $this->respond(['status' => true, "data" => $data_to_send], 200); + } else { + + return $this->respond(['status' => false, "No Data Found For the Policy Transaction"], 404); + } + } + + public function saveInstallment() + { + + $installments = $this->request->getPost('installments'); + + if (!$installments || !is_array($installments)) { + return $this->respond(['status' => false, 'message' => 'No data received'], 400); + } + + $this->myLogger->logme("error", json_encode($installments)); + // die(); + + foreach ($installments as &$row) { + // Convert date from d-m-Y to Y-m-d + if (!empty($row['payment_date'])) { + $date = \DateTime::createFromFormat('d-m-Y', $row['payment_date']); + if ($date) { + $row['payment_date'] = $date->format('Y-m-d'); + } + } + $this->BdsPlacementModel->save($row); + } + + return $this->respond(['status' => true, 'message' => 'Data saved successfully'], 200); + } + + protected function getPolicyForEndorsment() + { + + $policyList = []; + $policyListByClient = []; + + + $clients = $this->clientModel + ->select("*, DATE_FORMAT(dob, '%d-%m-%Y') as dob") + ->where('is_active', 1) + ->findAll(); + + $clientIds = array_column($clients, 'id'); + + // $policies = $this->clientPolicyModel + // ->select(" + // client_policy.*, + // policy_type.policy_type, + // policy_type.ebp, + // policy_type.etp, + // policy_type.iep, + // policy_type.itp, + // policy_type.bap, + // policy_type.allocg, + // DATE_FORMAT(client_policy.policy_start_date, '%d/%m/%Y') as policy_start_date, + // DATE_FORMAT(client_policy.policy_end_date, '%d/%m/%Y') as policy_end_date + // ") + // ->join('policy_type', 'policy_type.id = client_policy.policy_type_id') + // ->join('policy_transaction pt', 'pt.client_policy_id = client_policy.id and pt.action_type = "inception" and pt.is_active = 1 and pt.client_policy_id is not null') + // ->whereIn('client_policy.client_id', $clientIds) + // ->where('client_policy.is_active', 1) + // ->findAll(); + + $policies = $this->policyTransactionModel + ->select(" + policy_transaction.*, + policy_type.policy_type, + policy_type.ebp, + policy_type.etp, + policy_type.iep, + policy_type.itp, + policy_type.bap, + policy_type.allocg, + DATE_FORMAT(policy_transaction.policy_start_date, '%d/%m/%Y') as policy_start_date, + DATE_FORMAT(policy_transaction.policy_end_date, '%d/%m/%Y') as policy_end_date + ") + ->join('policy_type', 'policy_type.id = policy_transaction.policy_type_id') + ->whereIn('policy_transaction.client_id', $clientIds) + ->where('policy_transaction.is_active', 1) + ->where('policy_transaction.action_type', "inception") + ->findAll(); + + foreach ($policies as $policy) { + $policyList[$policy['client_branch_id']][] = $policy; + $policyListByClient[$policy['client_id']][] = $policy; + if (isset($policyCount[$policy['client_id']])) { + $policyCount[$policy['client_id']]++; + } else { + $policyCount[$policy['client_id']] = 1; + } + } + + return [$policyList, $policyListByClient]; + } + + 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', + ]; + + // 🏢 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'); + + // 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; + + // 🧾 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($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); + } + + // ------------ BDS BULK MOTER POLICY UPLOAD ----------------------------------------------------------------------------------------------- + + public function policyBulkUpload() + { + $data['page_name'] = "BDS Bulk File Upload"; + $data['tab_name'] = "BDS File Upload"; + + // $response = $this->insertBulkBdsData(['file_id' => 17]); + // dd($response); + + + if ($this->request->is('get')) { + + $data['bds_dump_file_data'] = $this->bdsDumpModel + ->select(' + bds_dump_files.id as file_id, + bds_dump_files.file_name, + bds_dump_files.status, + bds_dump_files.created_at, + up.first_name as user_name + ') + ->join('user_profiles as up', 'bds_dump_files.created_by = up.id', 'left') + ->where('bds_dump_files.is_active', 1) + ->orderBy('bds_dump_files.id', 'desc') + ->findAll(); + + return $this->loadLayout('bds_dump_file_list', $data); + } else { + + $filename = ''; + $fileSize = ''; + + //validate uploaded file + $validated = $this->validate([ + 'bds_dump_list' => [ + 'uploaded[bds_dump_list]', + 'mime_in[bds_dump_list,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.oasis.opendocument.spreadsheet]', + 'max_size[bds_dump_list,16384]', + ], + ]); + + if ($validated) { + $avatar = $this->request->getFile('bds_dump_list'); + if (!$avatar) { + $this->myLogger->logme("error", 'File not found'); + return $this->respond(['status' => false, 'code' => 400, 'message' => 'File not found'], 400); + } + + $is_moved = $avatar->move(WRITEPATH . 'uploads/bds_dump_excel/'); + + if ($is_moved) { + $filename = $avatar->getName(); + $fileSize = $avatar->getSize(); // File size in bytes + $fileSize = $fileSize / (1024 * 1024); // Convert to MB + + $this->myLogger->logme("error", 'File move successful'); + } else { + $this->myLogger->logme("error", 'File move failed'); + return $this->respond(['status' => false, 'code' => 500, 'message' => 'File move failed'], 500); + } + } else { + $this->myLogger->logme("error", 'Upload failed Invalid file'); + return $this->respond(['status' => false, 'code' => 404, 'message' => 'Invalid file'], 404); } - return $this->respond(['dataStatus' => true, 'code' => 200], 200); - //return $this->response->setJSON(['dataStatus' => 'true']); + + $status = 'inprogress'; + $insert_data = [ + 'file_name' => $filename, + 'status' => $status + ]; + + $file_id = $this->bdsDumpModel->insert($insert_data); + $this->myLogger->logme("error", 'claim_dumb_file_id : {file_id}, uploaded success', ['file_id' => $file_id]); + + //after file upload success than call the file formate validation + // $response = $this->bdsDumpExcelFileFormatValidation(["file_id" => $file_id]); + $r = Jobs::addJob(['job_name' => 'bdsDumpExcelFileFormatValidation', 'payload' => ['file_id' => $file_id]]); + + return $this->respond(['status' => true, 'code' => 200, 'message' => 'File uploaded successfully. File being validated'], 200); } + } - public function deletePaymentEntry() - { - $payment_id = $this->request->getUri()->getSegment(4); - //echo $payment_id; - $this->invPaymentDetailsModel->update($payment_id, ['is_active' => 0]); - return $this->respond(['dataStatus' => true, 'code' => 200], 200); - } + public function downloadBDSDumpFile($file_id) + { + // $actionType = $this->request->getGet(); + $file_data = $this->bdsDumpModel->where('id', $file_id)->first(); + $fileName = $file_data['file_name']; - public function downloadSampleInsurerStatement() - { + $filePath = WRITEPATH . '/uploads/bds_dump_excel/' . $fileName; + + try { - $filePath = ROOTPATH . 'public/sample_excel/insurer_stament_sample.xlsx'; // 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'); + + $data['message'] = 'The Physical File Not Found'; + echo view('errors/404', $data); } + } catch (\Exception $e) { + // Handle any exceptions + $errorMessage = $e->getMessage(); + $this->myLogger->logme('error', $errorMessage); + // You can return an error response here + echo $errorMessage; + } + } + + public function bdsDumpExcelFileFormatValidation($params) + { + helper('excel_util_helper'); + $file_id = $params['file_id']; + $file = $this->bdsDumpModel->where("id", $file_id)->first(); + + $return = []; + if (empty($file)) { + return array('status' => false, 'message' => 'File not found in Database'); } - public function getFileErr() + $file_name_with_path = WRITEPATH . "/uploads/bds_dump_excel/" . $file['file_name']; + + //check physical file exist + if (!file_exists($file_name_with_path)) { + $message = "Physcial file not found"; + $this->myLogger->logme('error', ($message . ' for file id : ' . $file_id)); + $this->bdsDumpModel->where('id', $file_id)->set(['status' => 'failed', 'reason' => json_encode(['error_summary' => array_count_values([5]), 'error_data' => $message])])->update(); + return array('error_summary' => [5], 'error_data' => $message); + } + + // get the BDS dump excel colums + $columns_to_check = $this->bds_bulk_upload_excel_file_column; + $keys = array_keys($columns_to_check); + $allowedHighestColumn = end($columns_to_check); + + // Read the excel file + $excel_data = $this->extractExcelData($file['file_name'], $allowedHighestColumn['col_cell_name']); + $excel_columns = ($excel_data[0]); + // echo '
'; var_dump($excel_columns);
+
+
+        //check no of columns in excel
+        $total_defined_columns = count($columns_to_check);
+        $excel_columns_count = count($excel_columns);
+
+        if($total_defined_columns != $excel_columns_count)
         {
-            $file_id = $this->request->getUri()->getSegment(4);
-            $file = $this->insurerStatements->find((int)$file_id);
-            return $this->respond(['dataStatus' => true, 'code' => 200, 'data' => $file['reason']], 200);
+            //columns count mismatch
+            $message = "File columns count mismatch. Expected - $total_defined_columns and received - $excel_columns_count";
+            $this->myLogger->logme('error',($message . ' for file id ' . $file_id));
+            $this->bdsDumpModel->where('id', $file_id)->set(['status' => 'failed','reason' => json_encode(['error_summary' => array_count_values([5]),'error_data' => $message])])->update();
+            return  array('error_summary' => [5], 'error_data' => $message);
         }
 
-        public function dmsSearch()
-        {
-            // echo 'scbsc';die();
-            if ($this->request->is('post')) {
-                // $jsonData = (array)$this->request->getJSON();
-                $request_data   = $this->request->getPost();
-                $data = sanitizeInputArrayAdvanced($request_data);
-                $customer_id = $data['customer_id'];
-                $policy_id = $data['policy_id'];
-                $cus_doc_name = $data['cus_doc_name'];
-                $policy_doc_name = $data['policy_doc_name'];
-                $pt_files = [];
-                $kyc_files = [];
-                $batch_files = [];
-                $files = [];
-                // print_r($jsonData);die();
-                if ($policy_id != "") {
-                    //get policy docs from policy transation related tables
-                    $pt_files = $this->PTFileModel->getPolicyDriveFilesIndex($policy_id, $policy_doc_name);
-                    $batch_files = $this->batchFileModel->getBatchFilesDataForDocumentSearch($policy_id, $policy_doc_name);
-                    $files = $this->filesModel->getFilesDataForDocumentSearch($policy_id, $policy_doc_name);
-                    // dd($files);
-                    // dd($this->PTFileModel->getLastQuery());
-                    // ~dd($pt_files);
-                }
-                if ($customer_id != "") {
-                    $kyc_files = $this->clientKYCDocsModel->getClientKYCDriveFilesIndex($customer_id, $cus_doc_name);
-                    // dd($this->clientKYCDocsModel->getLastQuery());
-                    // !dd($kyc_files);
-                }
+        //check columns order in excel
+        $column_count_res = check_columns_name($columns_to_check, $excel_columns);
 
-                $data['files'] = array_merge($pt_files, $kyc_files, $batch_files, $files);
-                //  dd($data['files']);
-            }
-            $data['tab_name'] = 'Documents Search';
-            $data['page_name'] = 'Documents';
-
-            $data['customers'] = $this->clientModel->select('id,client_name,short_name as display_value')->where('is_active', 1)->get()->getResultarray();
-            $data['policies'] = $this->clientPolicyModel->select("client_policy.id,client_policy.policy_no,policy_type.policy_type,concat(policy_type.policy_type,' - ',client_policy.policy_no) as display_value")
-                ->join('policy_type', 'client_policy.policy_type_id = policy_type.id')
-                ->where('client_policy.is_active', 1)->get()->getResultarray();
-            // dd($data);
-            $this->loadLayout('dms_search', $data);
-        }
-
-        //---------------------------------------------------------------------------------------------------
-
-        public function getCoShareStatementDetails($pt_id)
-        {
-            if (!$pt_id) {
-                return $this->respond([
-                    'status' => false,
-                    'code' => 400,
-                    'message' => 'No data found'
-                ], 200);
-            }
-
-            // Fetch data from the database
-            $data = db_connect()->table("co_share_stmt_details")
-                ->select("
-                    co_share_stmt_details.*, 
-                    insurer_statements.month,
-                    insurer_statements.invoice_status,
-                    insurer_statements.invoice_date,
-                    insurer_statements.invoice_no,
-                    insurer_statements.invoice_amount,
-                    insurer_statements.stmt_sno,
-                    (co_share_stmt_details.actual_bp_amt + co_share_stmt_details.actual_tp_amt + co_share_stmt_details.actual_tep_amt) AS sum_of_actual_amt
-                ")
-                ->join('insurer_statements', 'co_share_stmt_details.statement_id = insurer_statements.id')
-                ->where([
-                    'co_share_stmt_details.is_active' => 1,
-                    'insurer_statements.is_active' => 1,
-                    'co_share_stmt_details.co_share_id' => $pt_id
-                ])
-                ->get()
-                ->getResultArray();
-
-            // Check if data exists before formatting
-            if ($data) {
-
-                foreach ($data as &$row) {
-                    // Check if invoice_date is not null before formatting
-                    $row['invoice_date'] = $row['invoice_date'] ? change_date_format($row['invoice_date'], 'Y-m-d', 'd/m/Y') : null;
-
-                    // Check if month is not null before formatting
-                    $row['month'] = $row['month'] ? change_date_format($row['month'], 'Y-m-d', 'M-Y') : null;
-                }
-
-                return $this->respond([
-                    'status' => true,
-                    'code' => 200,
-                    'data' => $data
-                ], 200);
-            } else {
-                return $this->respond([
-                    'status' => false,
-                    'code' => 400,
-                    'message' => 'No data found'
-                ], 200);
-            }
-        }
-
-        public function getClientPolicyDataBasedOnClientAndInsuer()
-        {
-
-            $client_id = $this->request->getGet('client_id') ?? 0;
-            $client_branch_id = $this->request->getGet('client_branch_id') ?? 0;
-            $insurer_id = $this->request->getGet('insurer_id') ?? 0;
-            $insurer_branch_id = $this->request->getGet('insurer_branch_id') ?? 0;
-            $policy_type_id = $this->request->getGet('policy_type_id') ?? 0;
-
-            $builder = db_connect()->table("client_policy")
-                ->select("
-                            client_policy.*, 
-                            policy_type.policy_type,
-                        ")
-                ->join('policy_type', 'client_policy.policy_type_id = policy_type.id')
-                ->where([
-                    'client_policy.is_active' => 1,
-                ]);
-
-            if (!empty($client_id)) {
-                $builder->where('client_policy.client_id', $client_id);
-            }
-            if (!empty($client_branch_id)) {
-                $builder->where('client_policy.client_branch_id', $client_branch_id);
-            }
-            if (!empty($insurer_id)) {
-                $builder->where('client_policy.insurer_id', $insurer_id);
-            }
-            if (!empty($insurer_branch_id)) {
-                $builder->where('client_policy.insurer_branch_id', $insurer_branch_id);
-            }
-            if (!empty($policy_type_id)) {
-                $builder->where('client_policy.policy_type_id', $policy_type_id);
-            }
-
-            $result = $builder->get()->getResultArray();
-
-            if ($result) {
-                return $this->respond(['status' => true, 'code' => 200, 'data' => $result, 'getData' => $this->request->getGet()], 200);
-            } else {
-                return $this->respond(['status' => false, 'code' => 400, 'message' => 'No data found'], 200);
-            }
-        }
-
-        public function checkCDAmountForBasePremium()
-        {
-            $base_premium = $this->request->getGet('base_premium') ?? 0;
-            $cd_ac_no = $this->request->getGet('cd_ac_no') ?? 0;
-
-            // Validate inputs
-            if (empty($cd_ac_no)) {
-                return $this->respond(['status' => false, 'code' => 400, 'message' => 'CD Account Number is required'], 200);
-            }
-
-            // Build query
-            $db = db_connect();
-            $builder = $db->table("cash_deposit")
-                ->where('cd_ac_pk', $cd_ac_no)
-                ->where('is_active', 1)
-                ->orderBy('id', 'desc')
-                ->limit(1);
-
-            $result = $builder->get()->getRowArray();
-
-            if ($result) {
-                // Check if base premium exceeds balance
-                $base_premium_greater_than_balance = $base_premium > $result['balance'];
-
-                return $this->respond([
-                    'status' => true,
-                    'code' => 200,
-                    'data' => $result,
-                    'base_premium' => $base_premium,
-                    'cd_ac_no' => $cd_ac_no,
-                    'base_premium_greater_than_balance' => $base_premium_greater_than_balance,
-                ], 200);
-            }
-
-            return $this->respond(['status' => false, 'code' => 400, 'message' => 'No data found for this CD'], 200);
-        }
-
-        public function getInsurerStatementMonth()
-        {
-            $insurer_id = $this->request->getGet('insurer_id');
-            $month = $this->request->getGet('month');
-            // echo $month;
-            $insurer_branch_id = explode('-', $insurer_id)[1];
-            $insurer_id = explode('-', $insurer_id)[0];
-            $month = $month . '-01';
-            $month = change_date_format($month, 'Y-M-d', 'Y-m-d');
-            // echo $month;
-
-            $res_data = $this->insurerStatements
-                ->where('insurer_id', $insurer_id)
-                ->where('branch_id', $insurer_branch_id)
-                ->where('month', $month)
-                ->where('is_active', 1)
-                ->where('file_status', 'success')
-                ->findAll();
-
-            return $this->respond(['dataStatus' => true, 'code' => 200, 'data' => $res_data], 200);
-        }
-
-        public function deleteStatement($id)
-        {
-            // echo $id;die();
-            $this->coShareStmtDetailsModel->where('statement_id', $id)
-                ->set(['is_active' => 0])
-                ->update();
-            $this->invPaymentDetailsModel->where('statement_id', $id)
-                ->set(['is_active' => 0])
-                ->update();
-            $this->insurerStatements->where('id', $id)
-                ->set(['is_active' => 0])
-                ->update();
-            return $this->respond(['dataStatus' => true, 'code' => 200], 200);
-        }
-
-        public function sendInstallmentRemainderMail()
-        {
-
-            $this->myLogger->logme("error", "Cron Job For Send Installment Remainder Mail Started");
-
-            try {
-
-                try {
-
-                    $bdsInstallmentData = $this->BdsPlacementModel->getClientInstallmentDetails();
-                } catch (Exception $e) {
-
-                    $this->myLogger->logme('error', 'Exception: ' . $e->getMessage() . 'Page: ' . $e->getFile() . ' Line: ' . $e->getLine());
-                }
-                $this->myLogger->logme("error", "Data for BDS Installment " . json_encode($bdsInstallmentData));
-                // dd($bdsInstallmentData);
-
-                if (empty($bdsInstallmentData)) {
-
-                    $this->myLogger->logme("error", "No Client Installment is Due in the 15th Day");
-
-                    return false;
-                }
-
-                foreach ($bdsInstallmentData as $installmentData) {
-
-                    $mailData = $this->PrepareBDSMailData($installmentData);
-                    $to_mail = $mailData['to_mail'];
-                    $message = $mailData['message'];
-                    $subject = $mailData['subject'];
-
-                    $this->myLogger->logme("error", "Installment Pending for" . $subject);
-
-                    $common = ['mail_type' => 'installment_amount_due_remainder_mail'];
-
-                    $res = MailHelper::send_email(['mail' => $to_mail, 'subject' => $subject, 'message' => $message, 'common' => $common]);
-
-                    $res = json_decode($res);
-                    $this->myLogger->logme('error', 'res: ' . json_encode($res));
-
-                    if ($res->status == 'success') {
-                        return true;
-                    } else {
-                        return false;
-                    }
-                }
-            } catch (Exception $e) {
-
-                $this->myLogger->logme('error', 'Exception: ' . $e->getMessage() . 'Page: ' . $e->getFile() . ' Line: ' . $e->getLine());
-            }
-        }
-
-        protected function PrepareBDSMailData($data)
-        {
-
-            try {
-
-                $installment_amount =   $data['installment_amount'];
-                $payment_date       =   date('d-m-Y', strtotime($data['payment_date']));
-                $client             =   $data['client_name'];
-                $branch             =   $data['branch_name'];
-                $sales_person_mail  =   $data['sales_person'];
-                $heads              =   $data['heads'];
-                $admins             =   $data['admins'];
-                $buisness_team      =   $data['buisness_team'];
-                $policy_no          =   $data['policy_no'];
-                $client_short_name  =   isset($data['short_name']) && $data['short_name'] != null ? $data['short_name'] : $data['client_name'];
-
-                $subject = "Installment Amount Due For Client - {$client_short_name} - Policy NO({$policy_no}) is Due On - {$payment_date}";
-
-                $message = "Policy Installment for Client - {$client}, Branch - {$branch} is Due on {$payment_date} 
-                with amount of {$installment_amount}.
- Policy No : {$policy_no}"; - - - $to_mail = array_merge( - array_column($heads, 'email'), - array_column($admins, 'email'), - array_column($buisness_team, 'email'), - [$sales_person_mail] - ); - - $to_mail = array_unique($to_mail); - - $this->myLogger->logme("error", "Selected To Address : " . json_encode($to_mail)); - - // dd($to_mail); - return [ - 'to_mail' => $to_mail, - 'message' => $message, - 'subject' => $subject - ]; - } catch (Exception $e) { - - $this->myLogger->logme('error', 'Exception: ' . $e->getMessage() . 'Page: ' . $e->getFile() . ' Line: ' . $e->getLine()); - } - } - - public function getMoreInfo() - { - - $pt_id = $this->request->getPost("pt_id"); - $data_to_send['bds_data'] = $this->BdsPlacementModel->where("is_active", 1)->where("pt_id", $pt_id)->findAll(); - - foreach ($data_to_send['bds_data'] as &$data) { - - $data['payment_date'] = (new \DateTime($data['payment_date']))->format('d-m-Y'); - } - - if (!empty($data_to_send)) { - - return $this->respond(['status' => true, "data" => $data_to_send], 200); - } else { - - return $this->respond(['status' => false, "No Data Found For the Policy Transaction"], 404); - } - } - - public function saveInstallment() - { - - $installments = $this->request->getPost('installments'); - - if (!$installments || !is_array($installments)) { - return $this->respond(['status' => false, 'message' => 'No data received'], 400); - } - - $this->myLogger->logme("error", json_encode($installments)); - // die(); - - foreach ($installments as &$row) { - // Convert date from d-m-Y to Y-m-d - if (!empty($row['payment_date'])) { - $date = \DateTime::createFromFormat('d-m-Y', $row['payment_date']); - if ($date) { - $row['payment_date'] = $date->format('Y-m-d'); - } - } - $this->BdsPlacementModel->save($row); - } - - return $this->respond(['status' => true, 'message' => 'Data saved successfully'], 200); - } - - protected function getPolicyForEndorsment() - { - - $policyList = []; - $policyListByClient = []; - - - $clients = $this->clientModel - ->select("*, DATE_FORMAT(dob, '%d-%m-%Y') as dob") - ->where('is_active', 1) - ->findAll(); - - $clientIds = array_column($clients, 'id'); - - // $policies = $this->clientPolicyModel - // ->select(" - // client_policy.*, - // policy_type.policy_type, - // policy_type.ebp, - // policy_type.etp, - // policy_type.iep, - // policy_type.itp, - // policy_type.bap, - // policy_type.allocg, - // DATE_FORMAT(client_policy.policy_start_date, '%d/%m/%Y') as policy_start_date, - // DATE_FORMAT(client_policy.policy_end_date, '%d/%m/%Y') as policy_end_date - // ") - // ->join('policy_type', 'policy_type.id = client_policy.policy_type_id') - // ->join('policy_transaction pt', 'pt.client_policy_id = client_policy.id and pt.action_type = "inception" and pt.is_active = 1 and pt.client_policy_id is not null') - // ->whereIn('client_policy.client_id', $clientIds) - // ->where('client_policy.is_active', 1) - // ->findAll(); - - $policies = $this->policyTransactionModel - ->select(" - policy_transaction.*, - policy_type.policy_type, - policy_type.ebp, - policy_type.etp, - policy_type.iep, - policy_type.itp, - policy_type.bap, - policy_type.allocg, - DATE_FORMAT(policy_transaction.policy_start_date, '%d/%m/%Y') as policy_start_date, - DATE_FORMAT(policy_transaction.policy_end_date, '%d/%m/%Y') as policy_end_date - ") - ->join('policy_type', 'policy_type.id = policy_transaction.policy_type_id') - ->whereIn('policy_transaction.client_id', $clientIds) - ->where('policy_transaction.is_active', 1) - ->where('policy_transaction.action_type', "inception") - ->findAll(); - - foreach ($policies as $policy) { - $policyList[$policy['client_branch_id']][] = $policy; - $policyListByClient[$policy['client_id']][] = $policy; - if (isset($policyCount[$policy['client_id']])) { - $policyCount[$policy['client_id']]++; - } else { - $policyCount[$policy['client_id']] = 1; - } - } - - return [$policyList, $policyListByClient]; - } - - 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', - ]; - - // 🏢 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'); - - // 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; - - // 🧾 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($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); - } - - // ------------ BDS BULK MOTER POLICY UPLOAD ----------------------------------------------------------------------------------------------- - - public function policyBulkUpload() - { - $data['page_name'] = "BDS Bulk File Upload"; - $data['tab_name'] = "BDS File Upload"; - - // $response = $this->insertBulkBdsData(['file_id' => 17]); - // dd($response); - - - if ($this->request->is('get')) { - - $data['bds_dump_file_data'] = $this->bdsDumpModel - ->select(' - bds_dump_files.id as file_id, - bds_dump_files.file_name, - bds_dump_files.status, - bds_dump_files.created_at, - up.first_name as user_name - ') - ->join('user_profiles as up', 'bds_dump_files.created_by = up.id', 'left') - ->where('bds_dump_files.is_active', 1) - ->orderBy('bds_dump_files.id', 'desc') - ->findAll(); - - return $this->loadLayout('bds_dump_file_list', $data); - } else { - - $filename = ''; - $fileSize = ''; - - //validate uploaded file - $validated = $this->validate([ - 'bds_dump_list' => [ - 'uploaded[bds_dump_list]', - 'mime_in[bds_dump_list,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.oasis.opendocument.spreadsheet]', - 'max_size[bds_dump_list,16384]', - ], - ]); - - if ($validated) { - $avatar = $this->request->getFile('bds_dump_list'); - if (!$avatar) { - $this->myLogger->logme("error", 'File not found'); - return $this->respond(['status' => false, 'code' => 400, 'message' => 'File not found'], 400); - } - - $is_moved = $avatar->move(WRITEPATH . 'uploads/bds_dump_excel/'); - - if ($is_moved) { - $filename = $avatar->getName(); - $fileSize = $avatar->getSize(); // File size in bytes - $fileSize = $fileSize / (1024 * 1024); // Convert to MB - - $this->myLogger->logme("error", 'File move successful'); - } else { - $this->myLogger->logme("error", 'File move failed'); - return $this->respond(['status' => false, 'code' => 500, 'message' => 'File move failed'], 500); - } - } else { - $this->myLogger->logme("error", 'Upload failed Invalid file'); - return $this->respond(['status' => false, 'code' => 404, 'message' => 'Invalid file'], 404); - } - - - $status = 'inprogress'; - $insert_data = [ - 'file_name' => $filename, - 'status' => $status - ]; - - $file_id = $this->bdsDumpModel->insert($insert_data); - $this->myLogger->logme("error", 'claim_dumb_file_id : {file_id}, uploaded success', ['file_id' => $file_id]); - - //after file upload success than call the file formate validation - // $response = $this->bdsDumpExcelFileFormatValidation(["file_id" => $file_id]); - $r = Jobs::addJob(['job_name' => 'bdsDumpExcelFileFormatValidation', 'payload' => ['file_id' => $file_id]]); - - return $this->respond(['status' => true, 'code' => 200, 'message' => 'File uploaded successfully. File being validated'], 200); - } - } - - public function downloadBDSDumpFile($file_id) - { - // $actionType = $this->request->getGet(); - $file_data = $this->bdsDumpModel->where('id', $file_id)->first(); - $fileName = $file_data['file_name']; - - $filePath = WRITEPATH . '/uploads/bds_dump_excel/' . $fileName; - - try { - - // 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 { - - $data['message'] = 'The Physical File Not Found'; - echo view('errors/404', $data); - } - } catch (\Exception $e) { - // Handle any exceptions - $errorMessage = $e->getMessage(); - $this->myLogger->logme('error', $errorMessage); - // You can return an error response here - echo $errorMessage; - } - } - - public function bdsDumpExcelFileFormatValidation($params) + if(isset($column_count_res) && count($column_count_res)) { - helper('excel_util_helper'); - $file_id = $params['file_id']; - $file = $this->bdsDumpModel->where("id", $file_id)->first(); - - $return = []; - if (empty($file)) { - return array('status' => false, 'message' => 'File not found in Database'); - } - - $file_name_with_path = WRITEPATH . "/uploads/bds_dump_excel/" . $file['file_name']; - - //check physical file exist - if (!file_exists($file_name_with_path)) { - $message = "Physcial file not found"; - $this->myLogger->logme('error', ($message . ' for file id : ' . $file_id)); - $this->bdsDumpModel->where('id', $file_id)->set(['status' => 'failed', 'reason' => json_encode(['error_summary' => array_count_values([5]), 'error_data' => $message])])->update(); - return array('error_summary' => [5], 'error_data' => $message); - } - - // get the BDS dump excel colums - $columns_to_check = $this->bds_bulk_upload_excel_file_column; - $keys = array_keys($columns_to_check); - $allowedHighestColumn = end($columns_to_check); - - // Read the excel file - $excel_data = $this->extractExcelData($file['file_name'], $allowedHighestColumn['col_cell_name']); - $excel_columns = ($excel_data[0]); - // echo '
'; var_dump($excel_columns);
-
-
-            //check no of columns in excel
-            $total_defined_columns = count($columns_to_check);
-            $excel_columns_count = count($excel_columns);
-
-            if($total_defined_columns != $excel_columns_count)
-            {
-                //columns count mismatch
-                $message = "File columns count mismatch. Expected - $total_defined_columns and received - $excel_columns_count";
-                $this->myLogger->logme('error',($message . ' for file id ' . $file_id));
-                $this->bdsDumpModel->where('id', $file_id)->set(['status' => 'failed','reason' => json_encode(['error_summary' => array_count_values([5]),'error_data' => $message])])->update();
-                return  array('error_summary' => [5], 'error_data' => $message);
-            }
-
-            //check columns order in excel
-            $column_count_res = check_columns_name($columns_to_check, $excel_columns);
-
-            if(isset($column_count_res) && count($column_count_res))
-            {   
-                //columns count mismatch
-                $message = implode("\n", $column_count_res);
-                $this->myLogger->logme('error',($message . ' for file id ' . $file_id));
-                $this->bdsDumpModel->where('id', $file_id)->set(['status' => 'failed','reason' => json_encode(['error_summary' => array_count_values([6]), 'error_data' => $message])])->update();
-                return  array('error_summary' => [6], 'error_data' => $message);
-            }
-
-            //Store the error data by this structure
-            $result = ['error_type' => 1, 'error_summary' => [], 'error_data' => []];
-
-            $insurer_data = $this->insurerModel->where('is_active', 1)->findAll();
-            $insurer_branch_data = $this->insurerBranchModel->where('is_active', 1)->findAll();
-            $pt_data = $this->policyTransactionModel->where('is_active', 1)->findAll();
-            $user_data = $this->userModel->where('is_active', 1)->findAll();
-            $agent_data = db_connect()->table('partner_agent')->where('is_active', 1)->get()->getResultArray();
-            $pos_data = db_connect()->table('partner_pos')->where('is_active', 1)->get()->getResultArray();
-            $rto_master = db_connect()->table('rto_master')->where('is_active', 1)->get()->getResultArray();
-            $vehicle_type = db_connect()->table('vehicle_type')->where('is_active', 1)->get()->getResultArray();
-            $nhance_branch_data = db_connect()->table('nhance_branch')->where('is_active', 1)->get()->getResultArray();
-
-
-            //remove header
-            unset($excel_data[0]);
-
-            try {
-                foreach ($excel_data as $row_key => $row) {
-
-                    //avoid empty rows
-                    if (check_row_is_empty_or_null($row)) {
-                        break;
-                    }
-
-                    $insurers = [];
-                    foreach ($row as $col_key => $col) 
-                    {
-                        $is_mandatory = $columns_to_check[$keys[$col_key]]['is_mandatory'];
-                        $format = $columns_to_check[$keys[$col_key]]['format'];
-                        $data_type = $columns_to_check[$keys[$col_key]]['data_type'];
-                        $allowed_values = $columns_to_check[$keys[$col_key]]['allowed_values'];
-                        $custom_function = isset($columns_to_check[$keys[$col_key]]['custom']) ? $columns_to_check[$keys[$col_key]]['custom'] : null;
-                        $binding_params = isset($columns_to_check[$keys[$col_key]]['params']) ? $columns_to_check[$keys[$col_key]]['params'] : null;
-                        
-                        $column_dispaly_name = $columns_to_check[$keys[$col_key]]['col_name'];
-                        $column_index = $columns_to_check[$keys[$col_key]]['col_idx'];
-                        $column_cell = $columns_to_check[$keys[$col_key]]['col_cell_name'];
-
-
-                        //mandatory check
-                        if(is_bool($is_mandatory) && $is_mandatory === true)
-                        {
-                            if($col == "" || $col == NULL) 
-                            {
-                                array_push($result['error_summary'],1); //push error code for summary
-                                $result['error_data'][$row_key][$keys[$col_key]]['col_name'] = $column_dispaly_name; //push column name
-                                $result['error_data'][$row_key][$keys[$col_key]]['col_idx'] = $column_index; //push column index
-                                $result['error_data'][$row_key][$keys[$col_key]]['error'][] = 'Value is mandatory'; //push exact error desc
-                            }
-                        }
-
-                        //format check
-                        if(isset($format))
-                        {
-                            $validation = validate_excel_value($col, $data_type, $format, $allowed_values);
-                            if (!$validation['status']) {
-                                array_push($result['error_summary'], 2);
-
-                                $result['error_data'][$row_key][$keys[$col_key]]['col_name'] = $column_dispaly_name;
-                                $result['error_data'][$row_key][$keys[$col_key]]['col_idx'] = $column_index;
-                                $result['error_data'][$row_key][$keys[$col_key]]['error'][] = $validation['error'];
-                            }
-                        }
-
-                        //allowed values check
-                        if(($is_mandatory === true && isset($allowed_values) && is_array($allowed_values)) || (is_array($is_mandatory) && (isset($allowed_values) && is_array($allowed_values))))
-                        {
-                            if(!in_array((trim($col)),$allowed_values))
-                            {
-                                array_push($result['error_summary'],3); 
-                                $result['error_data'][$row_key][$keys[$col_key]]['col_name'] = $column_dispaly_name; //push column name
-                                $result['error_data'][$row_key][$keys[$col_key]]['col_idx'] = $column_index; //push column index
-                                $result['error_data'][$row_key][$keys[$col_key]]['error'][] = "Value not allowed: Expected ".implode(",",$allowed_values)." and received $col";
-                            }
-                        }
-
-                        //custom function check
-                        if(isset($custom_function))
-                        {
-                            //convert string params into PHP variables
-                            // Create an array of variables to pass custom helper funcitons 
-                            $param_values = [];
-                            foreach($binding_params as $bkey => $bparam) { $param_values[] = ($$bparam); }
-                            $res = call_user_func_array($custom_function,$param_values);
-                            if($res['status'] === false) { 
-                                array_push($result['error_summary'],4);
-                                $result['error_data'][$row_key][$keys[$col_key]]['col_name'] = $column_dispaly_name; //push column name
-                                $result['error_data'][$row_key][$keys[$col_key]]['col_idx'] = $column_index; //push column index
-                                $result['error_data'][$row_key][$keys[$col_key]]['error'][] = $res['error']; 
-                            }
-
-                            if($res['status'] == true && isset($res['insurer'])){
-                                $insurers = $res['insurer'];
-                            }
-                            
-                        }
-
-                    }//col foreach
-
-                }
-            } catch (\Exception $e) {
-                $errorDetails = [
-                    'error_message' => $e->getMessage(),
-                    'file'          => $e->getFile(),
-                    'line'          => $e->getLine(),
-                    'stack_trace'   => $e->getTraceAsString(),
-                ];
-                $message = "Contact system admin";
-                $this->bdsDumpModel->where('id', $file_id)->set(['status' => 'failed', 'reason' => json_encode(['error_summary' => array_count_values([5]), 'error_data' => $message])])->update();
-                $this->myLogger->logme("error", 'Claim dump file format validation failed due to : ' . json_encode($errorDetails ?? []));
-                return $errorDetails;
-            }
-
-            // return $result;
-
-            if (isset($result['error_summary']) && count($result['error_summary'])) {
-                $result['error_summary'] = array_count_values($result['error_summary']);
-                $status = 'failed';
-                $failure_reason = ((json_encode($result)));
-                $this->bdsDumpModel->where('id', $file_id)->set(['status' => $status, 'reason' => $failure_reason])->update();
-                $this->myLogger->logme("error", '{file_id} uploaded failed', ['file_id' => $file_id]);
-            } else { //trigger next data validation via job queue server
-                //proceed next data level validation in JOB queue
-                $r = Jobs::addJob(['job_name' => 'insertBulkBdsData', 'payload' => ['file_id' => $file_id]]);
-                // $response = $this->insertBulkBdsData(['file_id' => $file_id]);
-            }
-
-            return $result;
+            //columns count mismatch
+            $message = implode("\n", $column_count_res);
+            $this->myLogger->logme('error',($message . ' for file id ' . $file_id));
+            $this->bdsDumpModel->where('id', $file_id)->set(['status' => 'failed','reason' => json_encode(['error_summary' => array_count_values([6]), 'error_data' => $message])])->update();
+            return  array('error_summary' => [6], 'error_data' => $message);
         }
 
-        public function insertBulkBdsData($params)
-        {   
-            helper('excel_util_helper');
-            $file_id = $params['file_id'];
-            $file = $this->bdsDumpModel->where("id", $file_id)->first();
+        //Store the error data by this structure
+        $result = ['error_type' => 1, 'error_summary' => [], 'error_data' => []];
 
-            $return = [];
-            if (empty($file)) {
-                return array('status' => false, 'message' => 'File not found in Database');
-            }
+        $insurer_data = $this->insurerModel->where('is_active', 1)->findAll();
+        $insurer_branch_data = $this->insurerBranchModel->where('is_active', 1)->findAll();
+        $pt_data = $this->policyTransactionModel->where('is_active', 1)->findAll();
+        $user_data = $this->userModel->where('is_active', 1)->findAll();
+        $agent_data = db_connect()->table('partner_agent')->where('is_active', 1)->get()->getResultArray();
+        $pos_data = db_connect()->table('partner_pos')->where('is_active', 1)->get()->getResultArray();
+        $rto_master = db_connect()->table('rto_master')->where('is_active', 1)->get()->getResultArray();
+        $vehicle_type = db_connect()->table('vehicle_type')->where('is_active', 1)->get()->getResultArray();
+        $nhance_branch_data = db_connect()->table('nhance_branch')->where('is_active', 1)->get()->getResultArray();
 
-            $file_name_with_path = WRITEPATH . "/uploads/bds_dump_excel/" . $file['file_name'];
 
-            //check physical file exist
-            if (!file_exists($file_name_with_path)) {
-                $message = "Physcial file not found";
-                $this->myLogger->logme('error', ($message . ' for file id : ' . $file_id));
-                $this->bdsDumpModel->where('id', $file_id)->set(['status' => 'failed', 'reason' => json_encode(['error_summary' => array_count_values([5]), 'error_data' => $message])])->update();
-                return  array('error_summary' => [5], 'error_data' => $message);
-            }
+        //remove header
+        unset($excel_data[0]);
 
-            // get the BDS dump excel colums
-            $columns_to_check = $this->bds_bulk_upload_excel_file_column;
-            $keys = array_keys($columns_to_check);
-            $allowedHighestColumn = end($columns_to_check);
+        try {
+            foreach ($excel_data as $row_key => $row) {
 
-            // Read the excel file
-            $excel_data = $this->extractExcelData($file['file_name'], $allowedHighestColumn['col_cell_name']);
-            $excel_columns = ($excel_data[0]);
+                //avoid empty rows
+                if (check_row_is_empty_or_null($row)) {
+                    break;
+                }
 
-            //remove header
-            unset($excel_data[0]);
-            // dd($excel_data);
-
-            //Store the error data by this structure
-            $result = ['error_type' => 1, 'error_summary' => [], 'error_data' => []];
-
-            $client_data = $this->clientModel->where('is_active', 1)->where('client_type', 1)->findAll();
-            $insurer_data = $this->insurerModel->where('is_active', 1)->findAll();
-            $insurer_branch_data = $this->insurerBranchModel->where('is_active', 1)->findAll();
-            $vehicle_data = $this->vehicleModel->where('is_active', 1)->findAll();
-            $user_data = $this->userModel->where('is_active', 1)->findAll();
-            $agent_data = db_connect()->table('partner_agent')->where('is_active', 1)->get()->getResultArray();
-            $pos_data = db_connect()->table('partner_pos')->where('is_active', 1)->get()->getResultArray();
-            $rto_master = db_connect()->table('rto_master')->where('is_active', 1)->get()->getResultArray();
-            $vehicle_type_data = db_connect()->table('vehicle_type')->where('is_active', 1)->get()->getResultArray();
-            $nhance_branch_data = db_connect()->table('nhance_branch')->where('is_active', 1)->get()->getResultArray();
-
-            try {
-
-                $pt_ids = [];
-                foreach ($excel_data as $row_key => $row) {
-
-                    //avoid empty rows
-                    if (check_row_is_empty_or_null($row)) {
-                        break;
-                    }
-
-                    $vehicle_number = trim($row[2]);
-                    $vehicle_type = trim($row[3]);
-                    $client_name = trim($row[5]);
-                    $client_email = trim($row[6]);
-
-                    $insurer_short_name = trim($row[7]);
-                    $insurer_branch_code = trim($row[8]);
-                    $salse_generated_by = trim($row[13]);
-                    $serviced_by = trim($row[14]);
-                    $agent_code = trim($row[15]);
-                    $nhance_branch                     = trim($row[1]);
+                $insurers = [];
+                foreach ($row as $col_key => $col) 
+                {
+                    $is_mandatory = $columns_to_check[$keys[$col_key]]['is_mandatory'];
+                    $format = $columns_to_check[$keys[$col_key]]['format'];
+                    $data_type = $columns_to_check[$keys[$col_key]]['data_type'];
+                    $allowed_values = $columns_to_check[$keys[$col_key]]['allowed_values'];
+                    $custom_function = isset($columns_to_check[$keys[$col_key]]['custom']) ? $columns_to_check[$keys[$col_key]]['custom'] : null;
+                    $binding_params = isset($columns_to_check[$keys[$col_key]]['params']) ? $columns_to_check[$keys[$col_key]]['params'] : null;
                     
-                    $policy_no                         = trim($row[4]);
-                    $policy_issue_date                 = trim($row[9]);
-                    $policy_start_date                 = trim($row[10]);
-                    $policy_end_date                   = trim($row[11]);
-                    $revenue_type                      = trim($row[12]);
-
-                    $base_premium                      = trim($row[16]);
-                    $non_commission_premium_amount     = trim($row[17]);
-                    $tp_premium                        = trim($row[18]);
-                    $igst                              = trim($row[19]);
-                    $cgst                              = trim($row[20]);
-                    $sgst                              = trim($row[21]);
-                    $stamp_duty                        = trim($row[22]);
-                    // $total                             = trim($row[23]);
-                    $agreed_amount                     = trim($row[23]);
-                    $agreed_bp_percentage              = trim($row[24]);
-                    $agreed_tp_percentage              = trim($row[25]);
-                    // $actual_bp_amount                  = trim($row[27]);
-                    // $actual_tp_amount                  = trim($row[28]);
-                    // $actual_bp_percentage              = trim($row[29]);
-                    // $actual_tp_percentage              = trim($row[30]);
-                    // $actual_bp_brokerage_amount        = trim($row[31]);
-                    // $actual_tp_brokerage_amount        = trim($row[32]);
-                    // $expected_amount                   = trim($row[33]);
-                    // $rewards                           = trim($row[34]);
-                    $actual_bp_amount                  = 0;
-                    $actual_tp_amount                  = 0;
-                    $actual_bp_percentage              = 0;
-                    $actual_tp_percentage              = 0;
-                    $actual_bp_brokerage_amount        = 0;
-                    $actual_tp_brokerage_amount        = 0;
-                    $expected_amount                   = 0;
-                    $rewards                           = 0;
-
-                    $calculation = calculateMotorPolicyAmounts([
-                        'base_premium' => trim($row[16]),
-                        'non_commission_premium_amount' => trim($row[17]),
-                        'tp_premium' => trim($row[18]),
-                        'igst' => trim($row[19]),
-                        'cgst' => trim($row[20]),
-                        'sgst' => trim($row[21]),
-                        'stamp_duty' => trim($row[22]),
-                        'agreed_amount' => trim($row[23]),
-                        'agreed_bp_percentage' => trim($row[24]),
-                        'agreed_tp_percentage' => trim($row[25]),
-                        'standard_bp_percentage' => 15.00, 
-                        'standard_tp_percentage' => 2.5 
-                    ]);
-
-                    log_message('error', 'Motor Policy Calculation: ' . json_encode($calculation));
+                    $column_dispaly_name = $columns_to_check[$keys[$col_key]]['col_name'];
+                    $column_index = $columns_to_check[$keys[$col_key]]['col_idx'];
+                    $column_cell = $columns_to_check[$keys[$col_key]]['col_cell_name'];
 
 
-                    $current_insurer_data = check_insurer_exist($row, $insurer_data)['insurer'] ?? null;
-                    $current_insurer_branch_data = check_insurer_branch_exist($row, $insurer_branch_data, $current_insurer_data)['branch'] ?? null;
-
-                    $current_nhance_branch = check_nhance_branch($row, $nhance_branch_data)['branch'] ?? null;
-                    // $current_agent_data = check_agent_exist($row, $agent_data)['agent'] ?? null;
-                    $current_agent_data = check_agent_exist($row, $pos_data)['agent'] ?? null;
-
-                    $salse = check_user_exist($row, 13, $user_data)['user'] ?? null;
-                    $service = check_user_exist($row, 14, $user_data)['user'] ?? null;
-
-                    $gst_amt = calculate_gst_amount($row) ?? null;
-
-                    // get the client and vehicle id
-                    $vehicle_and_client_ids = $this->getClientAndVehicleId($row, $vehicle_data, $client_data, $rto_master, $vehicle_type_data);
-                    $vehicle_id = $vehicle_and_client_ids['vehicle_id'] ?? null;
-                    $client_id = $vehicle_and_client_ids['client_id'] ?? null;
-
-                    $policy_transaction_data = [
-
-                        'issuer'                => 2,
-                        'issuer_branch'         => $salse['nhance_branch_id'] ?? null,
-                        'client_id'             => $client_id,
-                        'policy_type_id'        => 8,
-                        'insurer_id'            => $current_insurer_branch_data['insurer_id'] ?? null,
-                        'insurer_branch_id'     => $current_insurer_branch_data['id'] ?? null,
-                        'policy_no'             => $policy_no,
-                        'vehicle_id'            => $vehicle_id,
-                        'issue_type'            => 1,
-                        'policy_issue_date'     => change_date_format($policy_issue_date, 'd/M/Y', 'Y-m-d'),
-                        'policy_start_date'     => change_date_format($policy_start_date, 'd/M/Y', 'Y-m-d'),
-                        'policy_end_date'       => change_date_format($policy_end_date, 'd/M/Y', 'Y-m-d'),
-                        'action_type'           => 'inception',
-                        'revenue_type'          => $revenue_type,
-                        'co_share'              => 0,
-                        'status'                => 'completed',
-                        'renewal_date'          => change_date_format($policy_end_date, 'd/M/Y', 'Y-m-d'),
-                        'policy_holder_name'    => $client_name,
-                        'month'                 => change_date_format($policy_issue_date, 'd/M/Y', 'Y-m-d'),
-                        'sales_generated_by'    => $salse['id'] ?? null,
-                        'serviced_by'           => $service['id'] ?? null,
-                        'salse_person_manager_id'   => $salse['rm_id'] ?? null,
-                        'service_person_manager_id' => $service['rm_id'] ?? null,
-                        'service_person_branch_id'  => $service['nhance_branch_id'] ?? null,
-                        // 'agent_id'              => $current_agent_data['id'] ?? null,
-                        // 'agent_code'            => $current_agent_data['agent_code'] ?? null,
-                        'pos_id'                => $current_agent_data['id'] ?? null,
-                        'file_id'               => $params['file_id'],
-                        'endorsement_no'        => null,
-                        'client_branch_id'      => null,
-                        'client_policy_id'      => null,
-                        'ct_type'               => null,
-                        'remarks'               => null,
-
-                    ];
-
-                    $co_share_data = [
-
-                        'pt_id'                     => null,
-                        'insurer_id'                => $current_insurer_branch_data['insurer_id'] ?? null,
-                        'insurer_branch_id'         => $current_insurer_branch_data['id'] ?? null,
-                        'co_share_type'             => 1,  
-                        'co_share_per'              => 100,
-
-                        'bp_amt'                    => $base_premium,
-                        'bp_gst_amt'                => $calculation['gst_amount'] ?? $gst_amt,
-                        'bp_igst'                   => $igst ,
-                        'bp_sgst'                   => $sgst,
-                        'bp_cgst'                   => $cgst,
-
-                        'tp_amt'                    => $tp_premium,
-                        'tp_gst_amt'                => 0,
-                        'tp_igst'                   => 0,
-                        'tp_sgst'                   => 0,
-                        'tp_cgst'                   => 0,
-
-                        'tep_amt'                   => 0,
-                        'tep_gst_amt'               => 0,
-                        'tep_igst'                  => 0,
-                        'tep_sgst'                  => 0,
-                        'tep_cgst'                  => 0,
-
-                        'agreed_amt'                => $agreed_amount,
-                        'agreed_bp_per'             => $agreed_bp_percentage,
-                        'agreed_tp_per'             => $agreed_tp_percentage,
-                        'agreed_tep_per'            => 0,
-
-                        'actual_bp_amt'             => $actual_bp_amount,
-                        'actual_tp_amt'             => $actual_tp_amount,
-                        'actual_tep_amt'            => 0,
-
-                        'actual_bp_per'             => $actual_bp_percentage,
-                        'actual_tp_per'             => $actual_tp_percentage,
-                        'actual_tep_per'            => 0,
-
-                        'actual_bp_brokerage_amt'   => $actual_bp_brokerage_amount,
-                        'actual_tp_brokerage_amt'   => $actual_tp_brokerage_amount,
-                        'actual_tep_brokerage_amt'  => 0,
-
-                        'standerd_bp_per'           => 15.00,
-                        'standerd_tp_per'           => 2.50,
-                        'agreed_tep_per'            => 0,
-
-                        'reward'                    => $rewards,
-                        'variance'                  => 0,
-
-                        'remark'                    => null,
-                        'amount'                    => $calculation['total_amount'] ?? 0,
-                        'stamp_duty'                => $stamp_duty,
-
-                        'cop_amt'                   => $base_premium,
-                        'cotp_amt'                  => $tp_premium,
-                        'cotep_amt'                 => 0.00,
-
-                        'exp_amt'                   => $calculation['expected_amount'] ?? $expected_amount,
-                        'statement_id'              => null,
-
-                        'follower_policy_no'        => null,
-                        'non_comm_per_amt'          => $non_commission_premium_amount,
-
-                        'pt_policy_issue_date'      => change_date_format($policy_issue_date, 'd/M/Y', 'Y-m-d'),
-
-                        'file_id'                   => $params['file_id']
-                    ];
-
-                    if(!empty($vehicle_id) && !empty($client_id)){
-                        $pt_id = $this->policyTransactionModel->insert($policy_transaction_data);
-                        if($pt_id){
-                            $co_share_data['pt_id'] = $pt_id;
-                            $pt_co_share_id = $this->PTCOShareDetailsModel->insert($co_share_data);
-
-                            $client_policy_insert_data = $this->prepareClientPolicyInsertData($policy_transaction_data);
-                            $client_policy_id = $this->clientPolicyModel->insert($client_policy_insert_data);
-                            $this->policyTransactionModel->update($pt_id, ['client_policy_id' => $client_policy_id]);
-                            $pt_ids[] = $pt_id;
-                            $this->myLogger->logme('error', "BDS entry successfully added with pt_id : $pt_id, pt_co_share_id : $pt_co_share_id, client_policy_id :$client_policy_id");
-
+                    //mandatory check
+                    if(is_bool($is_mandatory) && $is_mandatory === true)
+                    {
+                        if($col == "" || $col == NULL) 
+                        {
+                            array_push($result['error_summary'],1); //push error code for summary
+                            $result['error_data'][$row_key][$keys[$col_key]]['col_name'] = $column_dispaly_name; //push column name
+                            $result['error_data'][$row_key][$keys[$col_key]]['col_idx'] = $column_index; //push column index
+                            $result['error_data'][$row_key][$keys[$col_key]]['error'][] = 'Value is mandatory'; //push exact error desc
                         }
-                    }else{
-                        $this->myLogger->logme('error', 'Skipped......... , vehicle id and client id missing');
                     }
 
+                    //format check
+                    if(isset($format))
+                    {
+                        $validation = validate_excel_value($col, $data_type, $format, $allowed_values);
+                        if (!$validation['status']) {
+                            array_push($result['error_summary'], 2);
+
+                            $result['error_data'][$row_key][$keys[$col_key]]['col_name'] = $column_dispaly_name;
+                            $result['error_data'][$row_key][$keys[$col_key]]['col_idx'] = $column_index;
+                            $result['error_data'][$row_key][$keys[$col_key]]['error'][] = $validation['error'];
+                        }
+                    }
+
+                    //allowed values check
+                    if(($is_mandatory === true && isset($allowed_values) && is_array($allowed_values)) || (is_array($is_mandatory) && (isset($allowed_values) && is_array($allowed_values))))
+                    {
+                        if(!in_array((trim($col)),$allowed_values))
+                        {
+                            array_push($result['error_summary'],3); 
+                            $result['error_data'][$row_key][$keys[$col_key]]['col_name'] = $column_dispaly_name; //push column name
+                            $result['error_data'][$row_key][$keys[$col_key]]['col_idx'] = $column_index; //push column index
+                            $result['error_data'][$row_key][$keys[$col_key]]['error'][] = "Value not allowed: Expected ".implode(",",$allowed_values)." and received $col";
+                        }
+                    }
+
+                    //custom function check
+                    if(isset($custom_function))
+                    {
+                        //convert string params into PHP variables
+                        // Create an array of variables to pass custom helper funcitons 
+                        $param_values = [];
+                        foreach($binding_params as $bkey => $bparam) { $param_values[] = ($$bparam); }
+                        $res = call_user_func_array($custom_function,$param_values);
+                        if($res['status'] === false) { 
+                            array_push($result['error_summary'],4);
+                            $result['error_data'][$row_key][$keys[$col_key]]['col_name'] = $column_dispaly_name; //push column name
+                            $result['error_data'][$row_key][$keys[$col_key]]['col_idx'] = $column_index; //push column index
+                            $result['error_data'][$row_key][$keys[$col_key]]['error'][] = $res['error']; 
+                        }
+
+                        if($res['status'] == true && isset($res['insurer'])){
+                            $insurers = $res['insurer'];
+                        }
+                        
+                    }
+
+                }//col foreach
+
+            }
+        } catch (\Exception $e) {
+            $errorDetails = [
+                'error_message' => $e->getMessage(),
+                'file'          => $e->getFile(),
+                'line'          => $e->getLine(),
+                'stack_trace'   => $e->getTraceAsString(),
+            ];
+            $message = "Contact system admin";
+            $this->bdsDumpModel->where('id', $file_id)->set(['status' => 'failed', 'reason' => json_encode(['error_summary' => array_count_values([5]), 'error_data' => $message])])->update();
+            $this->myLogger->logme("error", 'Claim dump file format validation failed due to : ' . json_encode($errorDetails ?? []));
+            return $errorDetails;
+        }
+
+        // return $result;
+
+        if (isset($result['error_summary']) && count($result['error_summary'])) {
+            $result['error_summary'] = array_count_values($result['error_summary']);
+            $status = 'failed';
+            $failure_reason = ((json_encode($result)));
+            $this->bdsDumpModel->where('id', $file_id)->set(['status' => $status, 'reason' => $failure_reason])->update();
+            $this->myLogger->logme("error", '{file_id} uploaded failed', ['file_id' => $file_id]);
+        } else { //trigger next data validation via job queue server
+            //proceed next data level validation in JOB queue
+            $r = Jobs::addJob(['job_name' => 'insertBulkBdsData', 'payload' => ['file_id' => $file_id]]);
+            // $response = $this->insertBulkBdsData(['file_id' => $file_id]);
+        }
+
+        return $result;
+    }
+
+    public function insertBulkBdsData($params)
+    {   
+        helper('excel_util_helper');
+        $file_id = $params['file_id'];
+        $file = $this->bdsDumpModel->where("id", $file_id)->first();
+
+        $return = [];
+        if (empty($file)) {
+            return array('status' => false, 'message' => 'File not found in Database');
+        }
+
+        $file_name_with_path = WRITEPATH . "/uploads/bds_dump_excel/" . $file['file_name'];
+
+        //check physical file exist
+        if (!file_exists($file_name_with_path)) {
+            $message = "Physcial file not found";
+            $this->myLogger->logme('error', ($message . ' for file id : ' . $file_id));
+            $this->bdsDumpModel->where('id', $file_id)->set(['status' => 'failed', 'reason' => json_encode(['error_summary' => array_count_values([5]), 'error_data' => $message])])->update();
+            return  array('error_summary' => [5], 'error_data' => $message);
+        }
+
+        // get the BDS dump excel colums
+        $columns_to_check = $this->bds_bulk_upload_excel_file_column;
+        $keys = array_keys($columns_to_check);
+        $allowedHighestColumn = end($columns_to_check);
+
+        // Read the excel file
+        $excel_data = $this->extractExcelData($file['file_name'], $allowedHighestColumn['col_cell_name']);
+        $excel_columns = ($excel_data[0]);
+
+        //remove header
+        unset($excel_data[0]);
+        // dd($excel_data);
+
+        //Store the error data by this structure
+        $result = ['error_type' => 1, 'error_summary' => [], 'error_data' => []];
+
+        $client_data = $this->clientModel->where('is_active', 1)->where('client_type', 1)->findAll();
+        $insurer_data = $this->insurerModel->where('is_active', 1)->findAll();
+        $insurer_branch_data = $this->insurerBranchModel->where('is_active', 1)->findAll();
+        $vehicle_data = $this->vehicleModel->where('is_active', 1)->findAll();
+        $user_data = $this->userModel->where('is_active', 1)->findAll();
+        $agent_data = db_connect()->table('partner_agent')->where('is_active', 1)->get()->getResultArray();
+        $pos_data = db_connect()->table('partner_pos')->where('is_active', 1)->get()->getResultArray();
+        $rto_master = db_connect()->table('rto_master')->where('is_active', 1)->get()->getResultArray();
+        $vehicle_type_data = db_connect()->table('vehicle_type')->where('is_active', 1)->get()->getResultArray();
+        $nhance_branch_data = db_connect()->table('nhance_branch')->where('is_active', 1)->get()->getResultArray();
+
+        try {
+
+            $pt_ids = [];
+            foreach ($excel_data as $row_key => $row) {
+
+                //avoid empty rows
+                if (check_row_is_empty_or_null($row)) {
+                    break;
                 }
 
-            } catch (\Exception $e) {
-                $errorDetails = [
-                    'error_message' => $e->getMessage(),
-                    'file'          => $e->getFile(),
-                    'line'          => $e->getLine(),
-                    'stack_trace'   => $e->getTraceAsString(),
+                $vehicle_number = trim($row[2]);
+                $vehicle_type = trim($row[3]);
+                $client_name = trim($row[5]);
+                $client_email = trim($row[6]);
+
+                $insurer_short_name = trim($row[7]);
+                $insurer_branch_code = trim($row[8]);
+                $salse_generated_by = trim($row[13]);
+                $serviced_by = trim($row[14]);
+                $agent_code = trim($row[15]);
+                $nhance_branch                     = trim($row[1]);
+                
+                $policy_no                         = trim($row[4]);
+                $policy_issue_date                 = trim($row[9]);
+                $policy_start_date                 = trim($row[10]);
+                $policy_end_date                   = trim($row[11]);
+                $revenue_type                      = trim($row[12]);
+
+                $base_premium                      = trim($row[16]);
+                $non_commission_premium_amount     = trim($row[17]);
+                $tp_premium                        = trim($row[18]);
+                $igst                              = trim($row[19]);
+                $cgst                              = trim($row[20]);
+                $sgst                              = trim($row[21]);
+                $stamp_duty                        = trim($row[22]);
+                // $total                             = trim($row[23]);
+                $agreed_amount                     = trim($row[23]);
+                $agreed_bp_percentage              = trim($row[24]);
+                $agreed_tp_percentage              = trim($row[25]);
+                // $actual_bp_amount                  = trim($row[27]);
+                // $actual_tp_amount                  = trim($row[28]);
+                // $actual_bp_percentage              = trim($row[29]);
+                // $actual_tp_percentage              = trim($row[30]);
+                // $actual_bp_brokerage_amount        = trim($row[31]);
+                // $actual_tp_brokerage_amount        = trim($row[32]);
+                // $expected_amount                   = trim($row[33]);
+                // $rewards                           = trim($row[34]);
+                $actual_bp_amount                  = 0;
+                $actual_tp_amount                  = 0;
+                $actual_bp_percentage              = 0;
+                $actual_tp_percentage              = 0;
+                $actual_bp_brokerage_amount        = 0;
+                $actual_tp_brokerage_amount        = 0;
+                $expected_amount                   = 0;
+                $rewards                           = 0;
+
+                $calculation = calculateMotorPolicyAmounts([
+                    'base_premium' => trim($row[16]),
+                    'non_commission_premium_amount' => trim($row[17]),
+                    'tp_premium' => trim($row[18]),
+                    'igst' => trim($row[19]),
+                    'cgst' => trim($row[20]),
+                    'sgst' => trim($row[21]),
+                    'stamp_duty' => trim($row[22]),
+                    'agreed_amount' => trim($row[23]),
+                    'agreed_bp_percentage' => trim($row[24]),
+                    'agreed_tp_percentage' => trim($row[25]),
+                    'standard_bp_percentage' => 15.00, 
+                    'standard_tp_percentage' => 2.5 
+                ]);
+
+                log_message('error', 'Motor Policy Calculation: ' . json_encode($calculation));
+
+
+                $current_insurer_data = check_insurer_exist($row, $insurer_data)['insurer'] ?? null;
+                $current_insurer_branch_data = check_insurer_branch_exist($row, $insurer_branch_data, $current_insurer_data)['branch'] ?? null;
+
+                $current_nhance_branch = check_nhance_branch($row, $nhance_branch_data)['branch'] ?? null;
+                // $current_agent_data = check_agent_exist($row, $agent_data)['agent'] ?? null;
+                $current_agent_data = check_agent_exist($row, $pos_data)['agent'] ?? null;
+
+                $salse = check_user_exist($row, 13, $user_data)['user'] ?? null;
+                $service = check_user_exist($row, 14, $user_data)['user'] ?? null;
+
+                $gst_amt = calculate_gst_amount($row) ?? null;
+
+                // get the client and vehicle id
+                $vehicle_and_client_ids = $this->getClientAndVehicleId($row, $vehicle_data, $client_data, $rto_master, $vehicle_type_data);
+                $vehicle_id = $vehicle_and_client_ids['vehicle_id'] ?? null;
+                $client_id = $vehicle_and_client_ids['client_id'] ?? null;
+
+                $policy_transaction_data = [
+
+                    'issuer'                => 2,
+                    'issuer_branch'         => $salse['nhance_branch_id'] ?? null,
+                    'client_id'             => $client_id,
+                    'policy_type_id'        => 8,
+                    'insurer_id'            => $current_insurer_branch_data['insurer_id'] ?? null,
+                    'insurer_branch_id'     => $current_insurer_branch_data['id'] ?? null,
+                    'policy_no'             => $policy_no,
+                    'vehicle_id'            => $vehicle_id,
+                    'issue_type'            => 1,
+                    'policy_issue_date'     => change_date_format($policy_issue_date, 'd/M/Y', 'Y-m-d'),
+                    'policy_start_date'     => change_date_format($policy_start_date, 'd/M/Y', 'Y-m-d'),
+                    'policy_end_date'       => change_date_format($policy_end_date, 'd/M/Y', 'Y-m-d'),
+                    'action_type'           => 'inception',
+                    'revenue_type'          => $revenue_type,
+                    'co_share'              => 0,
+                    'status'                => 'completed',
+                    'renewal_date'          => change_date_format($policy_end_date, 'd/M/Y', 'Y-m-d'),
+                    'policy_holder_name'    => $client_name,
+                    'month'                 => change_date_format($policy_issue_date, 'd/M/Y', 'Y-m-d'),
+                    'sales_generated_by'    => $salse['id'] ?? null,
+                    'serviced_by'           => $service['id'] ?? null,
+                    'salse_person_manager_id'   => $salse['rm_id'] ?? null,
+                    'service_person_manager_id' => $service['rm_id'] ?? null,
+                    'service_person_branch_id'  => $service['nhance_branch_id'] ?? null,
+                    // 'agent_id'              => $current_agent_data['id'] ?? null,
+                    // 'agent_code'            => $current_agent_data['agent_code'] ?? null,
+                    'pos_id'                => $current_agent_data['id'] ?? null,
+                    'file_id'               => $params['file_id'],
+                    'endorsement_no'        => null,
+                    'client_branch_id'      => null,
+                    'client_policy_id'      => null,
+                    'ct_type'               => null,
+                    'remarks'               => null,
+
                 ];
-                $message = "Contact system admin";
-                $this->bdsDumpModel->where('id', $file_id)->set(['status' => 'failed', 'reason' => json_encode(['error_summary' => array_count_values([5]), 'error_data' => $message])])->update();
-                $this->myLogger->logme("error", 'Claim dump file format validation failed due to : ' . json_encode($errorDetails ?? []));
-                return $errorDetails;
-            }
 
-            // return $result;
+                $co_share_data = [
 
-            if (isset($result['error_summary']) && count($result['error_summary'])) {
-                $result['error_summary'] = array_count_values($result['error_summary']);
-                $status = 'failed';
-                $failure_reason = ((json_encode($result)));
-                $this->bdsDumpModel->where('id', $file_id)->set(['status' => $status, 'reason' => $failure_reason])->update();
-                $this->myLogger->logme("error", '{file_id} uploaded failed', ['file_id' => $file_id]);
-            } else{
-                $result = count($pt_ids);
-                $status = 'success';
-                $failure_reason = ((json_encode($result)));
-                $this->bdsDumpModel->where('id', $file_id)->set(['status' => $status, 'reason' => $failure_reason])->update();
-                $this->myLogger->logme("error", '{file_id} uploaded success', ['file_id' => $file_id]);
-            }
+                    'pt_id'                     => null,
+                    'insurer_id'                => $current_insurer_branch_data['insurer_id'] ?? null,
+                    'insurer_branch_id'         => $current_insurer_branch_data['id'] ?? null,
+                    'co_share_type'             => 1,  
+                    'co_share_per'              => 100,
 
-            return $result;
-        }
+                    'bp_amt'                    => $base_premium,
+                    'bp_gst_amt'                => $calculation['gst_amount'] ?? $gst_amt,
+                    'bp_igst'                   => $igst ,
+                    'bp_sgst'                   => $sgst,
+                    'bp_cgst'                   => $cgst,
 
-        public function extractExcelData($file_name, $highestColumn)
-        {
-            // $file_name = "claims_dump_form_client.xlsx";
-            // Load the Excel file
-            $file_name_with_path = WRITEPATH . "/uploads/bds_dump_excel/" . $file_name;
-            $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file_name_with_path);
-            $worksheet = $spreadsheet->getActiveSheet();
+                    'tp_amt'                    => $tp_premium,
+                    'tp_gst_amt'                => 0,
+                    'tp_igst'                   => 0,
+                    'tp_sgst'                   => 0,
+                    'tp_cgst'                   => 0,
 
-            // Get the highest row and column numbers
-            $highestRow = $worksheet->getHighestDataRow();
-            // $highestColumn = $worksheet->getHighestDataColumn();
-            // dd($highestRow, $highestColumn);
+                    'tep_amt'                   => 0,
+                    'tep_gst_amt'               => 0,
+                    'tep_igst'                  => 0,
+                    'tep_sgst'                  => 0,
+                    'tep_cgst'                  => 0,
 
-            // Get header row (assuming headers are in row 1)
-            // $headerRow = $worksheet->rangeToArray('A1:' . $highestColumn . '1', null, true, false)[0];
-            $excel_data = $worksheet->rangeToArray('A1:' . $highestColumn . $highestRow);
-            // print_rr($excel_data); die;
+                    'agreed_amt'                => $agreed_amount,
+                    'agreed_bp_per'             => $agreed_bp_percentage,
+                    'agreed_tp_per'             => $agreed_tp_percentage,
+                    'agreed_tep_per'            => 0,
 
-            //Sanitize the excel data
-            $excel_data = ExcelSanitizeHelper::sanitizeArrayData($excel_data);
-            // dd($excel_data);
+                    'actual_bp_amt'             => $actual_bp_amount,
+                    'actual_tp_amt'             => $actual_tp_amount,
+                    'actual_tep_amt'            => 0,
 
-            // dd($data);
-            return $excel_data;
-        }
+                    'actual_bp_per'             => $actual_bp_percentage,
+                    'actual_tp_per'             => $actual_tp_percentage,
+                    'actual_tep_per'            => 0,
 
-        public function getBdsBulkUploadExcelErrorData($file_id)
-        {
-            try {
+                    'actual_bp_brokerage_amt'   => $actual_bp_brokerage_amount,
+                    'actual_tp_brokerage_amt'   => $actual_tp_brokerage_amount,
+                    'actual_tep_brokerage_amt'  => 0,
 
-                $file = $this->bdsDumpModel->where('id', $file_id)->first();
-                $error_data = json_decode($file['reason']);
-                // dd($error_data);
+                    'standerd_bp_per'           => 15.00,
+                    'standerd_tp_per'           => 2.50,
+                    'agreed_tep_per'            => 0,
 
-                $file_name_with_path = WRITEPATH . "/uploads/bds_dump_excel/" . $file['file_name'];
-                // Kint::dump(file_exists($file_name_with_path)); die;
+                    'reward'                    => $rewards,
+                    'variance'                  => 0,
 
-                //check the file exist or not
-                if (!file_exists($file_name_with_path)) {
-                    $error_message = "File not found";
-                    $this->myLogger->logme('error', ($error_message . ' for file id ' . $file_id));
-                    return 0;
+                    'remark'                    => null,
+                    'amount'                    => $calculation['total_amount'] ?? 0,
+                    'stamp_duty'                => $stamp_duty,
+
+                    'cop_amt'                   => $base_premium,
+                    'cotp_amt'                  => $tp_premium,
+                    'cotep_amt'                 => 0.00,
+
+                    'exp_amt'                   => $calculation['expected_amount'] ?? $expected_amount,
+                    'statement_id'              => null,
+
+                    'follower_policy_no'        => null,
+                    'non_comm_per_amt'          => $non_commission_premium_amount,
+
+                    'pt_policy_issue_date'      => change_date_format($policy_issue_date, 'd/M/Y', 'Y-m-d'),
+
+                    'file_id'                   => $params['file_id']
+                ];
+
+                if(!empty($vehicle_id) && !empty($client_id)){
+                    $pt_id = $this->policyTransactionModel->insert($policy_transaction_data);
+                    if($pt_id){
+                        $co_share_data['pt_id'] = $pt_id;
+                        $pt_co_share_id = $this->PTCOShareDetailsModel->insert($co_share_data);
+
+                        $client_policy_insert_data = $this->prepareClientPolicyInsertData($policy_transaction_data);
+                        $client_policy_id = $this->clientPolicyModel->insert($client_policy_insert_data);
+                        $this->policyTransactionModel->update($pt_id, ['client_policy_id' => $client_policy_id]);
+                        $pt_ids[] = $pt_id;
+                        $this->myLogger->logme('error', "BDS entry successfully added with pt_id : $pt_id, pt_co_share_id : $pt_co_share_id, client_policy_id :$client_policy_id");
+
+                    }
+                }else{
+                    $this->myLogger->logme('error', 'Skipped......... , vehicle id and client id missing');
                 }
 
-                $columns_to_check = $this->bds_bulk_upload_excel_file_column;
-                $allowedHighestColumn = end($columns_to_check);
-                // Kint::dump($columns_to_check); die;
-
-                $excel_data = $this->extractExcelData($file['file_name'], $allowedHighestColumn['col_cell_name']);
-                $excelErrorData['excel_header'] = $excel_data[0];
-                unset($excel_data[0]);
-
-                // Kint::dump($excel_data); die;
-                if ($error_data->error_type == 1) {
-
-                    $finalArray = [];
-                    foreach ($error_data->error_data as $key => $value) {
-                        foreach ($value as $key2 => $value2) {
-                            $error_data = $value2->error;
-                            $data = ['value' => $excel_data[$key][$value2->col_idx], 'error' => $error_data,];
-                            $excel_data[$key][$value2->col_idx] = $data;
-                        }
-                        array_push($finalArray, $excel_data[$key]);
-                    }
-
-                    foreach ($finalArray as $fkey => $value) {
-                        foreach ($value as $vkey => $arrayData) {
-                            if (!is_array($arrayData)) {
-                                $data = ['value' => $arrayData];
-                                $finalArray[$fkey][$vkey] =  $data;
-                            }
-                        }
-                    }
-
-                    $excelErrorData['excel_data'] = $finalArray;
-                    return $excelErrorData;
-                } else if ($error_data->error_type == 2) {
-
-
-                    $allErrors = [];
-                    $typeTowArray = [];
-
-                    foreach ($error_data->error_data as $index => $item) {
-
-                        foreach ($item as $field) {
-                            if (!isset($allErrors[$index])) {
-                                $allErrors[$index] = [];
-                            }
-                            $allErrors[$index] = array_merge($allErrors[$index], $field->error);
-                        }
-                    }
-
-                    // dd(array_keys($allErrors));
-                    foreach ($allErrors as $key => $value) {
-                        // echo $key;
-                        // print_r($value);
-                        foreach ($excel_data as $excel_data_index => $excel_data_value) {
-                            if ($excel_data_value[0] == $key) {
-                                $data = ['value' => $excel_data[$excel_data_index][1], 'error' => $value,];
-                                $excel_data[$excel_data_index][1] = $data;
-                                array_push($typeTowArray, $excel_data[$excel_data_index]);
-                                break;
-                            }
-                        }
-                    }
-                    // dd($data);
-                    foreach ($typeTowArray as $fkey => $value) {
-                        foreach ($value as $vkey => $arrayData) {
-                            if (!is_array($arrayData)) {
-                                $data = ['value' => $arrayData];
-                                $typeTowArray[$fkey][$vkey] =  $data;
-                            }
-                        }
-                    }
-
-                    $excelErrorData['excel_data'] = $typeTowArray;
-                    return $excelErrorData;
-                }
-
-            } catch (\Exception $e) {
-                // Handle any exceptions
-                $errorMessage = $e->getMessage(); //die();
-                $this->myLogger->logme('error', $errorMessage);
-                return false; // You can return an error response here
             }
+
+        } catch (\Exception $e) {
+            $errorDetails = [
+                'error_message' => $e->getMessage(),
+                'file'          => $e->getFile(),
+                'line'          => $e->getLine(),
+                'stack_trace'   => $e->getTraceAsString(),
+            ];
+            $message = "Contact system admin";
+            $this->bdsDumpModel->where('id', $file_id)->set(['status' => 'failed', 'reason' => json_encode(['error_summary' => array_count_values([5]), 'error_data' => $message])])->update();
+            $this->myLogger->logme("error", 'Claim dump file format validation failed due to : ' . json_encode($errorDetails ?? []));
+            return $errorDetails;
         }
 
-        public function getBdsdumpFileErrorData()
-        {
-            $file_id = $this->request->getGet('file_id');
+        // return $result;
+
+        if (isset($result['error_summary']) && count($result['error_summary'])) {
+            $result['error_summary'] = array_count_values($result['error_summary']);
+            $status = 'failed';
+            $failure_reason = ((json_encode($result)));
+            $this->bdsDumpModel->where('id', $file_id)->set(['status' => $status, 'reason' => $failure_reason])->update();
+            $this->myLogger->logme("error", '{file_id} uploaded failed', ['file_id' => $file_id]);
+        } else{
+            $result = count($pt_ids);
+            $status = 'success';
+            $failure_reason = ((json_encode($result)));
+            $this->bdsDumpModel->where('id', $file_id)->set(['status' => $status, 'reason' => $failure_reason])->update();
+            $this->myLogger->logme("error", '{file_id} uploaded success', ['file_id' => $file_id]);
+        }
+
+        return $result;
+    }
+
+    public function extractExcelData($file_name, $highestColumn)
+    {
+        // $file_name = "claims_dump_form_client.xlsx";
+        // Load the Excel file
+        $file_name_with_path = WRITEPATH . "/uploads/bds_dump_excel/" . $file_name;
+        $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file_name_with_path);
+        $worksheet = $spreadsheet->getActiveSheet();
+
+        // Get the highest row and column numbers
+        $highestRow = $worksheet->getHighestDataRow();
+        // $highestColumn = $worksheet->getHighestDataColumn();
+        // dd($highestRow, $highestColumn);
+
+        // Get header row (assuming headers are in row 1)
+        // $headerRow = $worksheet->rangeToArray('A1:' . $highestColumn . '1', null, true, false)[0];
+        $excel_data = $worksheet->rangeToArray('A1:' . $highestColumn . $highestRow);
+        // print_rr($excel_data); die;
+
+        //Sanitize the excel data
+        $excel_data = ExcelSanitizeHelper::sanitizeArrayData($excel_data);
+        // dd($excel_data);
+
+        // dd($data);
+        return $excel_data;
+    }
+
+    public function getBdsBulkUploadExcelErrorData($file_id)
+    {
+        try {
+
             $file = $this->bdsDumpModel->where('id', $file_id)->first();
-            if (!isset($file)) {
-                return $this->respond(['status' => false, 'code' => 404, 'message' => 'No data found'], 200);
-            } else {
-                return $this->respond(['status' => true, 'code' => 200, 'data' => $file['reason']], 200);
+            $error_data = json_decode($file['reason']);
+            // dd($error_data);
+
+            $file_name_with_path = WRITEPATH . "/uploads/bds_dump_excel/" . $file['file_name'];
+            // Kint::dump(file_exists($file_name_with_path)); die;
+
+            //check the file exist or not
+            if (!file_exists($file_name_with_path)) {
+                $error_message = "File not found";
+                $this->myLogger->logme('error', ($error_message . ' for file id ' . $file_id));
+                return 0;
             }
-        }
 
-        public function getBdsDumpExcelFileErrors($file_id)
-        {
-            // Render views and capture output
-            $result = $this->getBdsBulkUploadExcelErrorData($file_id) ?? [];
-            // dd($result);
+            $columns_to_check = $this->bds_bulk_upload_excel_file_column;
+            $allowedHighestColumn = end($columns_to_check);
+            // Kint::dump($columns_to_check); die;
 
-            if ($result != 0) {
+            $excel_data = $this->extractExcelData($file['file_name'], $allowedHighestColumn['col_cell_name']);
+            $excelErrorData['excel_header'] = $excel_data[0];
+            unset($excel_data[0]);
 
-                $result['file_id'] = $file_id;
-                echo view('excel_errors', $result);
-            } else if ($result == 0) {
+            // Kint::dump($excel_data); die;
+            if ($error_data->error_type == 1) {
 
-                $data['message'] = 'File Not Found Physically';
-                return view('errors/404', $data);
-            } else {
-
-                echo view('errors/html/production');
-            }
-        }
-
-        public function getClientAndVehicleId($row, $vehicle_data, $client_data, $rto_master, $vehicle_type_data)
-        {
-            $vehicle_number = trim($row[2]);
-            $client_name = trim($row[5]);
-            $client_email = trim($row[6]);
-
-            $vehicle_id = null;
-            $client_id  = null;
-
-            // -------------------------------------------
-            // 1. First Stage: Check if vehicle already exists
-            // -------------------------------------------
-
-            if(strtolower(trim($vehicle_number)) != 'new'){
-                foreach ($vehicle_data as $v) {
-                    if (strcasecmp(trim($v['vehicle_no']), $vehicle_number) === 0) {
-                        $vehicle_id = $v['id'];
-                        $client_id  = $v['owner'];
-                        break;
+                $finalArray = [];
+                foreach ($error_data->error_data as $key => $value) {
+                    foreach ($value as $key2 => $value2) {
+                        $error_data = $value2->error;
+                        $data = ['value' => $excel_data[$key][$value2->col_idx], 'error' => $error_data,];
+                        $excel_data[$key][$value2->col_idx] = $data;
                     }
+                    array_push($finalArray, $excel_data[$key]);
                 }
-            }
 
-            // -------------------------------------------
-            // 2. Second Stage: Vehicle not found -> check client by email
-            // -------------------------------------------
-            $second_stage_client_id = null;
-
-            if (empty($vehicle_id) && empty($client_id)) {
-
-                foreach ($client_data as $c) {
-                    if (strcasecmp(trim($c['email']), $client_email) === 0) {
-                        $second_stage_client_id = $c['id'];
-                        break;
+                foreach ($finalArray as $fkey => $value) {
+                    foreach ($value as $vkey => $arrayData) {
+                        if (!is_array($arrayData)) {
+                            $data = ['value' => $arrayData];
+                            $finalArray[$fkey][$vkey] =  $data;
+                        }
                     }
                 }
 
-                if (!empty($second_stage_client_id)) {
+                $excelErrorData['excel_data'] = $finalArray;
+                return $excelErrorData;
+            } else if ($error_data->error_type == 2) {
+
+
+                $allErrors = [];
+                $typeTowArray = [];
+
+                foreach ($error_data->error_data as $index => $item) {
+
+                    foreach ($item as $field) {
+                        if (!isset($allErrors[$index])) {
+                            $allErrors[$index] = [];
+                        }
+                        $allErrors[$index] = array_merge($allErrors[$index], $field->error);
+                    }
+                }
+
+                // dd(array_keys($allErrors));
+                foreach ($allErrors as $key => $value) {
+                    // echo $key;
+                    // print_r($value);
+                    foreach ($excel_data as $excel_data_index => $excel_data_value) {
+                        if ($excel_data_value[0] == $key) {
+                            $data = ['value' => $excel_data[$excel_data_index][1], 'error' => $value,];
+                            $excel_data[$excel_data_index][1] = $data;
+                            array_push($typeTowArray, $excel_data[$excel_data_index]);
+                            break;
+                        }
+                    }
+                }
+                // dd($data);
+                foreach ($typeTowArray as $fkey => $value) {
+                    foreach ($value as $vkey => $arrayData) {
+                        if (!is_array($arrayData)) {
+                            $data = ['value' => $arrayData];
+                            $typeTowArray[$fkey][$vkey] =  $data;
+                        }
+                    }
+                }
+
+                $excelErrorData['excel_data'] = $typeTowArray;
+                return $excelErrorData;
+            }
+
+        } catch (\Exception $e) {
+            // Handle any exceptions
+            $errorMessage = $e->getMessage(); //die();
+            $this->myLogger->logme('error', $errorMessage);
+            return false; // You can return an error response here
+        }
+    }
+
+    public function getBdsdumpFileErrorData()
+    {
+        $file_id = $this->request->getGet('file_id');
+        $file = $this->bdsDumpModel->where('id', $file_id)->first();
+        if (!isset($file)) {
+            return $this->respond(['status' => false, 'code' => 404, 'message' => 'No data found'], 200);
+        } else {
+            return $this->respond(['status' => true, 'code' => 200, 'data' => $file['reason']], 200);
+        }
+    }
+
+    public function getBdsDumpExcelFileErrors($file_id)
+    {
+        // Render views and capture output
+        $result = $this->getBdsBulkUploadExcelErrorData($file_id) ?? [];
+        // dd($result);
+
+        if ($result != 0) {
+
+            $result['file_id'] = $file_id;
+            echo view('excel_errors', $result);
+        } else if ($result == 0) {
+
+            $data['message'] = 'File Not Found Physically';
+            return view('errors/404', $data);
+        } else {
+
+            echo view('errors/html/production');
+        }
+    }
+
+    public function getClientAndVehicleId($row, $vehicle_data, $client_data, $rto_master, $vehicle_type_data)
+    {
+        $vehicle_number = trim($row[2]);
+        $client_name = trim($row[5]);
+        $client_email = trim($row[6]);
+
+        $vehicle_id = null;
+        $client_id  = null;
+
+        // -------------------------------------------
+        // 1. First Stage: Check if vehicle already exists
+        // -------------------------------------------
+
+        if(strtolower(trim($vehicle_number)) != 'new'){
+            foreach ($vehicle_data as $v) {
+                if (strcasecmp(trim($v['vehicle_no']), $vehicle_number) === 0) {
+                    $vehicle_id = $v['id'];
+                    $client_id  = $v['owner'];
+                    break;
+                }
+            }
+        }
+
+        // -------------------------------------------
+        // 2. Second Stage: Vehicle not found -> check client by email
+        // -------------------------------------------
+        $second_stage_client_id = null;
+
+        if (empty($vehicle_id) && empty($client_id)) {
+
+            foreach ($client_data as $c) {
+                if (strcasecmp(trim($c['email']), $client_email) === 0) {
+                    $second_stage_client_id = $c['id'];
+                    break;
+                }
+            }
+
+            if (!empty($second_stage_client_id)) {
+
+                // Existing client – Insert vehicle
+                $matched_rto_id  = check_rto_data($row, $rto_master);
+                $vehicle_type_id = check_vehicle_type($row, $vehicle_type_data);
+
+                $vehicle_insert = [
+                    'vehicle_no'   => $vehicle_number,
+                    'vehicle_type' => $vehicle_type_id['vehicle_type']['id'] ?? null,
+                    'owner'        => $second_stage_client_id,
+                    'rto_id'       => $matched_rto_id['rto_data']['id'] ?? null,
+                ];
+
+                $vehicle_id = $this->vehicleModel->insert($vehicle_insert);
+                $client_id  = $second_stage_client_id;
+            } else {
+
+                // -------------------------------------------
+                // 3. Third Stage: No existing client → Insert new client then insert vehicle
+                // -------------------------------------------
+                $client_insert = [
+                    'client_name'    => $client_name,
+                    'short_name'     => $client_name,
+                    'email'          => $client_email,
+                    'entity_type_id' => 7,
+                    'client_type'    => 2,
+                ];
+
+                $client_id = $this->clientModel->insert($client_insert);
+
+                if ($client_id) {
 
-                    // Existing client – Insert vehicle
                     $matched_rto_id  = check_rto_data($row, $rto_master);
                     $vehicle_type_id = check_vehicle_type($row, $vehicle_type_data);
 
                     $vehicle_insert = [
                         'vehicle_no'   => $vehicle_number,
                         'vehicle_type' => $vehicle_type_id['vehicle_type']['id'] ?? null,
-                        'owner'        => $second_stage_client_id,
+                        'owner'        => $client_id,
                         'rto_id'       => $matched_rto_id['rto_data']['id'] ?? null,
                     ];
 
                     $vehicle_id = $this->vehicleModel->insert($vehicle_insert);
-                    $client_id  = $second_stage_client_id;
-                } else {
-
-                    // -------------------------------------------
-                    // 3. Third Stage: No existing client → Insert new client then insert vehicle
-                    // -------------------------------------------
-                    $client_insert = [
-                        'client_name'    => $client_name,
-                        'short_name'     => $client_name,
-                        'email'          => $client_email,
-                        'entity_type_id' => 7,
-                        'client_type'    => 2,
-                    ];
-
-                    $client_id = $this->clientModel->insert($client_insert);
-
-                    if ($client_id) {
-
-                        $matched_rto_id  = check_rto_data($row, $rto_master);
-                        $vehicle_type_id = check_vehicle_type($row, $vehicle_type_data);
-
-                        $vehicle_insert = [
-                            'vehicle_no'   => $vehicle_number,
-                            'vehicle_type' => $vehicle_type_id['vehicle_type']['id'] ?? null,
-                            'owner'        => $client_id,
-                            'rto_id'       => $matched_rto_id['rto_data']['id'] ?? null,
-                        ];
-
-                        $vehicle_id = $this->vehicleModel->insert($vehicle_insert);
-                    }
                 }
             }
-
-            return [
-                'client_id'  => $client_id,
-                'vehicle_id' => $vehicle_id,
-            ];
         }
 
+        return [
+            'client_id'  => $client_id,
+            'vehicle_id' => $vehicle_id,
+        ];
     }
+
+}

From e2a93aeb2e212bfef087655dca3b452a8150bcb5 Mon Sep 17 00:00:00 2001
From: "venkatesh.r" 
Date: Fri, 13 Feb 2026 13:03:33 +0530
Subject: [PATCH 2/9] FIX_ISSUE

---
 app/Controllers/UserController.php            | 22 +++++++------------
 app/Views/UserList.php                        | 16 +++++++++-----
 .../policy_transaction_inception_form.php     |  4 ++--
 3 files changed, 21 insertions(+), 21 deletions(-)

diff --git a/app/Controllers/UserController.php b/app/Controllers/UserController.php
index 8e3c702b..3659369b 100755
--- a/app/Controllers/UserController.php
+++ b/app/Controllers/UserController.php
@@ -178,13 +178,10 @@ class UserController extends AdminController
                     ]
                 ],
             ];
-            if (!$this->validate($rules)) {
-                return $this->response->setStatusCode(400)->setJSON([
-                    'status' => false,
-                    'message' => 'Input validation failed',
-                    'code' => 400,
-                    'errors' => $this->validator->getErrors()
-                ]);
+           if (!$this->validate($rules)) {
+                return redirect()->to(base_url('/user/list'))
+                    ->withInput()
+                    ->with('errors', $this->validator->getErrors());
             }
 
             $userData['created_by'] =  get_session_userid();
@@ -363,12 +360,9 @@ class UserController extends AdminController
                 ],
             ];
             if (!$this->validate($rules)) {
-                return $this->response->setStatusCode(400)->setJSON([
-                    'status' => false,
-                    'message' => 'Input validation failed',
-                    'code' => 400,
-                    'errors' => $this->validator->getErrors()
-                ]);
+                return redirect()->to(base_url('/user/list'))
+                    ->withInput()
+                    ->with('errors', $this->validator->getErrors());
             }
             
             $data      = $this->request->getPost();
@@ -845,7 +839,7 @@ class UserController extends AdminController
         ],
         'errors' => [
             'required'    => 'Retention Rate is required',
-            'regex_match' => 'Retention Rate must be between 0 and 100 with up to 2 decimal places'
+            'regex_match' => 'Retention Rate must be between 0 to 100 with up to 2 decimal places'
         ]
         ],
                     // ======================
diff --git a/app/Views/UserList.php b/app/Views/UserList.php
index 571ddda9..919e7de1 100755
--- a/app/Views/UserList.php
+++ b/app/Views/UserList.php
@@ -884,12 +884,18 @@ table.dataTable tbody td {
         
     
 
+
+getFlashdata('errors')): ?>
+    
+
+
 getFlashdata('error')) : ?>
-    getFlashdata('error') as $error) : ?>
-        
-    
 
     
\ No newline at end of file

From 5bd2a1066dfbc0916fabbc33eff1563f8afad803 Mon Sep 17 00:00:00 2001
From: "venkatesh.r" 
Date: Fri, 13 Feb 2026 15:12:15 +0530
Subject: [PATCH 4/9] FIX_CLAIM_FILE_UPLOAD_ISSUE

---
 app/Controllers/TicketController.php | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/app/Controllers/TicketController.php b/app/Controllers/TicketController.php
index 7b4ef595..32e2cf34 100644
--- a/app/Controllers/TicketController.php
+++ b/app/Controllers/TicketController.php
@@ -3138,11 +3138,12 @@ class TicketController extends BaseController
                 ],
                 'url.*' => [
                     'label'  => 'URL',
-                    'rules'  => 'required',
+                    'rules'  => 'if_exist|required|regex_match[/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/]',
                     'errors' => [
-                        'required'    => 'URL is required',
+                        'required'    => 'URL is required.',
+                        'regex_match' => 'The URL format is invalid. Example: www.google.com or https://google.com'
                     ]
-                ]
+                ],
             ];
 
         if (!$this->validate($rules)) {

From 68edb80f5d310d9d4d23710fa0089446e70e4144 Mon Sep 17 00:00:00 2001
From: "sanjeev.p" 
Date: Fri, 13 Feb 2026 16:28:04 +0530
Subject: [PATCH 5/9] FIX_TrackerIssuesFixes

---
 app/Controllers/ClientController.php | 100 ++++++++++++++++-----------
 app/Controllers/TicketController.php |  52 +++++++-------
 2 files changed, 89 insertions(+), 63 deletions(-)

diff --git a/app/Controllers/ClientController.php b/app/Controllers/ClientController.php
index 2d86b540..468e0864 100755
--- a/app/Controllers/ClientController.php
+++ b/app/Controllers/ClientController.php
@@ -2689,7 +2689,7 @@ class ClientController extends AdminController
                 'errors' => ['required' => 'Please select a Client Branch.']
             ],
             'policy_type_id' => [
-                'rules'  => 'required|is_natural_no_zero',
+                'rules'  => ['required', 'is_natural_no_zero'],
                 'errors' => [
                     'required'            => 'Policy Type is required.',
                     'is_natural_no_zero'  => 'Please select a valid Policy Type.'
@@ -2707,11 +2707,16 @@ class ClientController extends AdminController
                 'rules'  => ['required', 'regex_match[/^[a-zA-Z0-9\s_\-\/\\\]+$/]'],
                 'errors' => [
                     'required'    => 'Policy No is required.',
-                    'regex_match' => 'Policy No Only letters, numbers, spaces, underscores, hyphens, forward slashes, and backslashes are allowed.'
+                    'regex_match' => 'Invalid characters in Policy No.'
                 ]
             ],
             'gst' => [
-                'rules'  => 'required|numeric|greater_than_equal_to[0]|less_than_equal_to[100]',
+                'rules'  => [
+                    'required', 
+                    'numeric', 
+                    'greater_than_equal_to[0]', 
+                    'less_than_equal_to[100]'
+                ],
                 'errors' => [
                     'required'              => 'GST percentage is required.',
                     'numeric'               => 'GST must be a valid number.',
@@ -2735,16 +2740,31 @@ class ClientController extends AdminController
                 'rules' => 'permit_empty'
             ],
             'disclaimer' => [
-                'rules'  => 'permit_empty|string|min_length[5]',
+                'rules'  => ['permit_empty', 'string', 'min_length[5]'],
                 'errors' => ['min_length' => 'Disclaimer should be at least 5 characters long if provided.']
             ],
-
-            // --- CHECKBOXES (Permit Empty) ---
             'enrolment_visibility' => ['rules' => 'permit_empty'],
             'is_lgbtq'             => ['rules' => 'permit_empty']
         ];
 
-        if (!$this->validate($rules)) {
+        // 2. Run the initial validation
+        $isValid = $this->validate($rules);
+
+        // 3. Perform manual date comparison
+        $start = $this->request->getPost('policy_start_date');
+        $end   = $this->request->getPost('policy_end_date');
+
+        $startDate = change_date_format($start ?? null, 'd-m-Y', 'Y-m-d') ?? null;
+        $endDate   = change_date_format($end ?? null, 'd-m-Y', 'Y-m-d') ?? null;
+
+        if ($startDate && $endDate && ($endDate < $startDate)) {
+            // Manually push the error into the validator
+            $this->validator->setError('policy_end_date', 'Policy start and end date are mismatched (End date cannot be before Start date).');
+            $isValid = false; 
+        }
+
+        // 4. Check final status
+        if (!$isValid) {
             return $this->response->setStatusCode(400)->setJSON([
                 'status' => false,
                 'message' => 'Input validation failed',
@@ -2851,13 +2871,12 @@ class ClientController extends AdminController
     public function editClientPolicy()
     {
         $rules = [
-            // --- BASIC SELECTS (Required) ---
             'client_branch_id' => [
                 'rules'  => 'required',
                 'errors' => ['required' => 'Please select a Client Branch.']
             ],
             'policy_type_id' => [
-                'rules'  => 'required|is_natural_no_zero',
+                'rules'  => ['required', 'is_natural_no_zero'],
                 'errors' => [
                     'required'            => 'Policy Type is required.',
                     'is_natural_no_zero'  => 'Please select a valid Policy Type.'
@@ -2871,17 +2890,20 @@ class ClientController extends AdminController
                 'rules'  => 'required',
                 'errors' => ['required' => 'Please select a TPA.']
             ],
-
-            // --- TEXT FIELDS (Required & Specific Format) ---
             'policy_no' => [
-                'rules'  => 'required|regex_match[/^[a-zA-Z0-9\s_\-\/\\\]+$/]',
+                'rules'  => ['required', 'regex_match[/^[a-zA-Z0-9\s_\-\/\\\]+$/]'],
                 'errors' => [
-                    'required'    => 'This field is required.',
-                    'regex_match' => 'Only letters, numbers, spaces, _, -, /, and \ are allowed.'
+                    'required'    => 'Policy No is required.',
+                    'regex_match' => 'Invalid characters in Policy No.'
                 ]
             ],
             'gst' => [
-                'rules'  => 'required|numeric|greater_than_equal_to[0]|less_than_equal_to[100]',
+                'rules'  => [
+                    'required', 
+                    'numeric', 
+                    'greater_than_equal_to[0]', 
+                    'less_than_equal_to[100]'
+                ],
                 'errors' => [
                     'required'              => 'GST percentage is required.',
                     'numeric'               => 'GST must be a valid number.',
@@ -2889,47 +2911,47 @@ class ClientController extends AdminController
                     'less_than_equal_to'    => 'GST percentage cannot exceed 100%.'
                 ]
             ],
-
-            // --- DATE FIELDS (Required) ---
             'policy_start_date' => [
-                'rules'  => 'required|valid_date',
-                'errors' => [
-                    'required'   => 'Start date is required.',
-                    'valid_date' => 'Enter a valid date format (YYYY-MM-DD).'
-                ]
+                'rules'  => 'required',
+                'errors' => ['required' => 'Start date is required.']
             ],
             'policy_end_date' => [
-                'rules'  => 'required|valid_date',
-                'errors' => [
-                    'required'   => 'End date is required.',
-                    'valid_date' => 'Enter a valid date format (YYYY-MM-DD).'
-                ]
-            ],
-
-            // --- PERMIT EMPTY FIELDS (Optional) ---
-            'base_policy' => [
-                'rules' => 'permit_empty'
+                'rules'  => 'required',
+                'errors' => ['required' => 'End date is required.']
             ],
             'wellness_plan_id' => [
                 'rules'  => 'permit_empty|alpha_numeric',
-                'errors' => [
-                    'alpha_numeric' => 'Wellness Plan ID can only contain letters and numbers (no spaces or special characters).'
-                ]
+                'errors' => ['alpha_numeric' => 'Wellness Plan ID can only contain letters and numbers.']
             ],
             'wellness_vendor_id' => [
                 'rules' => 'permit_empty'
             ],
             'disclaimer' => [
-                'rules'  => 'permit_empty|string|min_length[5]',
+                'rules'  => ['permit_empty', 'string', 'min_length[5]'],
                 'errors' => ['min_length' => 'Disclaimer should be at least 5 characters long if provided.']
             ],
-
-            // --- CHECKBOXES (Permit Empty) ---
             'enrolment_visibility' => ['rules' => 'permit_empty'],
             'is_lgbtq'             => ['rules' => 'permit_empty']
         ];
 
-        if (!$this->validate($rules)) {
+        // 2. Run the initial validation
+        $isValid = $this->validate($rules);
+
+        // 3. Perform manual date comparison
+        $start = $this->request->getPost('policy_start_date');
+        $end   = $this->request->getPost('policy_end_date');
+
+        $startDate = change_date_format($start ?? null, 'd-m-Y', 'Y-m-d') ?? null;
+        $endDate   = change_date_format($end ?? null, 'd-m-Y', 'Y-m-d') ?? null;
+
+        if ($startDate && $endDate && ($endDate < $startDate)) {
+            // Manually push the error into the validator
+            $this->validator->setError('policy_end_date', 'Policy start and end date are mismatched (End date cannot be before Start date).');
+            $isValid = false; 
+        }
+
+        // 4. Check final status
+        if (!$isValid) {
             return $this->response->setStatusCode(400)->setJSON([
                 'status' => false,
                 'message' => 'Input validation failed',
diff --git a/app/Controllers/TicketController.php b/app/Controllers/TicketController.php
index 32e2cf34..93ddee10 100644
--- a/app/Controllers/TicketController.php
+++ b/app/Controllers/TicketController.php
@@ -1216,36 +1216,31 @@ class TicketController extends BaseController
                 'claim_type' => ['label'  => 'Claim Type','rules'  => 'required',
                     'errors' => ['required' => 'Claim Type is required']
                 ],
-                'hospital_name' => ['label'  => 'Hospital Name','rules'  => 'required',
-                    'errors' => ['required' => 'Hospital Name is required']
-                ],
-                'hospital_address' => ['label'  => 'Hospital Address','rules'  => 'required',
-                    'errors' => ['required' => 'Hospital Address is required']
+                'hospital_name' => ['label'  => 'Hospital Name','rules'  => 'required|regex_match[/^[a-zA-Z0-9\s\-]+$/]',
+                    'errors' => ['required' => 'Hospital Name is required','regex_match' => 'Hospital Name can contain letters, numbers, spaces, and hyphens.']
                 ],
+                'hospital_address' => ['label'  => 'Hospital Address','rules'  => 'permit_empty','errors' => []],
                     'hospital_state' => [
                         'label'  => 'hospital_State',
-                        'rules'  => 'required|regex_match[/^[a-zA-Z\s\-]+$/]',
+                        'rules'  => 'permit_empty|regex_match[/^[a-zA-Z\s\-]+$/]',
                         'errors' => [
-                            'required'    => 'Hospital State is required.',
                             'regex_match' => 'Hospital State name can only contain letters, spaces, and hyphens.'
                         ]
                     ],
                     'hospital_city' => [
-                        'rules'  => 'required|regex_match[/^[a-zA-Z0-9\s\-]+$/]',
+                        'rules'  => 'permit_empty|regex_match[/^[a-zA-Z0-9\s\-]+$/]',
                         'errors' => [
-                            'required' => 'Hospital City is required',
                             'regex_match' => 'Hospital City can contain letters, numbers, spaces, and hyphens.'
                         ]
                     ],
                     'hospital_pin_code' => [
-                        'rules'  => 'required|numeric|exact_length[6]',
+                        'rules'  => 'permit_empty|numeric|exact_length[6]',
                         'errors' => [
-                            'required' => 'Hospital Pincode is required.',
                             'numeric'      => 'Hospital Pincode must be digits only.',
                             'exact_length' => 'Hospital Pincode must be exactly 6 digits.'
                         ]
                     ],
-                'hospital_phone_no' => ['label'  => 'Hospital Phone','rules'  => 'required|numeric|min_length[10]',
+                'hospital_phone_no' => ['label'  => 'Hospital Phone','rules'  => 'permit_empty|numeric|min_length[10]',
                     'errors' => ['min_length' => 'Phone number too short']
                 ],
                 'doa' => ['label'  => 'DOA', 'rules'  => 'required',
@@ -1551,22 +1546,31 @@ class TicketController extends BaseController
                 'claim_type' => ['label'  => 'Claim Type','rules'  => 'required',
                     'errors' => ['required' => 'Claim Type is required']
                 ],
-                'hospital_name' => ['label'  => 'Hospital Name','rules'  => 'required',
-                    'errors' => ['required' => 'Hospital Name is required']
+                'hospital_name' => ['label'  => 'Hospital Name','rules'  => 'required|regex_match[/^[a-zA-Z0-9\s\-]+$/]',
+                    'errors' => ['required' => 'Hospital Name is required','regex_match' => 'Hospital Name can contain letters, numbers, spaces, and hyphens.']
                 ],
-                'hospital_address' => ['label'  => 'Hospital Address','rules'  => 'required',
-                    'errors' => ['required' => 'Hospital Address is required']
+                'hospital_address' => ['label'  => 'Hospital Address','rules'  => 'permit_empty','errors' => []],
+                'hospital_state' => [
+                        'label'  => 'hospital_State',
+                        'rules'  => 'permit_empty|regex_match[/^[a-zA-Z\s\-]+$/]',
+                        'errors' => [
+                            'regex_match' => 'Hospital State name can only contain letters, spaces, and hyphens.'
+                        ]
                 ],
-                'hospital_city' => ['label'  => 'Hospital City','rules'  => 'required',
-                    'errors' => ['required' => 'City is required']
+                'hospital_city' => [
+                        'rules'  => 'permit_empty|regex_match[/^[a-zA-Z0-9\s\-]+$/]',
+                        'errors' => [
+                            'regex_match' => 'Hospital City can contain letters, numbers, spaces, and hyphens.'
+                        ]
                 ],
-                'hospital_state' => ['label'  => 'Hospital State','rules'  => 'required',
-                    'errors' => ['required' => 'State is required']
+                'hospital_pin_code' => [
+                        'rules'  => 'permit_empty|numeric|exact_length[6]',
+                        'errors' => [
+                            'numeric'      => 'Hospital Pincode must be digits only.',
+                            'exact_length' => 'Hospital Pincode must be exactly 6 digits.'
+                        ]
                 ],
-                'hospital_pin_code' => ['label'  => 'Hospital Pincode','rules'  => 'required|numeric|exact_length[6]',
-                    'errors' => ['exact_length' => 'Pincode must be 6 digits']
-                ],
-                'hospital_phone_no' => ['label'  => 'Hospital Phone','rules'  => 'required|numeric|min_length[10]',
+                'hospital_phone_no' => ['label'  => 'Hospital Phone','rules'  => 'permit_empty|numeric|min_length[10]',
                     'errors' => ['min_length' => 'Phone number too short']
                 ],
                 'doa' => ['label'  => 'DOA', 'rules'  => 'required',

From 082671d81500301a646a548cf077e7fd393263e7 Mon Sep 17 00:00:00 2001
From: "sanjeev.p" 
Date: Fri, 13 Feb 2026 16:34:01 +0530
Subject: [PATCH 6/9] FIX_RevertedTicketControllerBecozAssignerchanged.

---
 app/Controllers/TicketController.php | 59 +++++++++++++---------------
 1 file changed, 27 insertions(+), 32 deletions(-)

diff --git a/app/Controllers/TicketController.php b/app/Controllers/TicketController.php
index 93ddee10..7b4ef595 100644
--- a/app/Controllers/TicketController.php
+++ b/app/Controllers/TicketController.php
@@ -1216,31 +1216,36 @@ class TicketController extends BaseController
                 'claim_type' => ['label'  => 'Claim Type','rules'  => 'required',
                     'errors' => ['required' => 'Claim Type is required']
                 ],
-                'hospital_name' => ['label'  => 'Hospital Name','rules'  => 'required|regex_match[/^[a-zA-Z0-9\s\-]+$/]',
-                    'errors' => ['required' => 'Hospital Name is required','regex_match' => 'Hospital Name can contain letters, numbers, spaces, and hyphens.']
+                'hospital_name' => ['label'  => 'Hospital Name','rules'  => 'required',
+                    'errors' => ['required' => 'Hospital Name is required']
+                ],
+                'hospital_address' => ['label'  => 'Hospital Address','rules'  => 'required',
+                    'errors' => ['required' => 'Hospital Address is required']
                 ],
-                'hospital_address' => ['label'  => 'Hospital Address','rules'  => 'permit_empty','errors' => []],
                     'hospital_state' => [
                         'label'  => 'hospital_State',
-                        'rules'  => 'permit_empty|regex_match[/^[a-zA-Z\s\-]+$/]',
+                        'rules'  => 'required|regex_match[/^[a-zA-Z\s\-]+$/]',
                         'errors' => [
+                            'required'    => 'Hospital State is required.',
                             'regex_match' => 'Hospital State name can only contain letters, spaces, and hyphens.'
                         ]
                     ],
                     'hospital_city' => [
-                        'rules'  => 'permit_empty|regex_match[/^[a-zA-Z0-9\s\-]+$/]',
+                        'rules'  => 'required|regex_match[/^[a-zA-Z0-9\s\-]+$/]',
                         'errors' => [
+                            'required' => 'Hospital City is required',
                             'regex_match' => 'Hospital City can contain letters, numbers, spaces, and hyphens.'
                         ]
                     ],
                     'hospital_pin_code' => [
-                        'rules'  => 'permit_empty|numeric|exact_length[6]',
+                        'rules'  => 'required|numeric|exact_length[6]',
                         'errors' => [
+                            'required' => 'Hospital Pincode is required.',
                             'numeric'      => 'Hospital Pincode must be digits only.',
                             'exact_length' => 'Hospital Pincode must be exactly 6 digits.'
                         ]
                     ],
-                'hospital_phone_no' => ['label'  => 'Hospital Phone','rules'  => 'permit_empty|numeric|min_length[10]',
+                'hospital_phone_no' => ['label'  => 'Hospital Phone','rules'  => 'required|numeric|min_length[10]',
                     'errors' => ['min_length' => 'Phone number too short']
                 ],
                 'doa' => ['label'  => 'DOA', 'rules'  => 'required',
@@ -1546,31 +1551,22 @@ class TicketController extends BaseController
                 'claim_type' => ['label'  => 'Claim Type','rules'  => 'required',
                     'errors' => ['required' => 'Claim Type is required']
                 ],
-                'hospital_name' => ['label'  => 'Hospital Name','rules'  => 'required|regex_match[/^[a-zA-Z0-9\s\-]+$/]',
-                    'errors' => ['required' => 'Hospital Name is required','regex_match' => 'Hospital Name can contain letters, numbers, spaces, and hyphens.']
+                'hospital_name' => ['label'  => 'Hospital Name','rules'  => 'required',
+                    'errors' => ['required' => 'Hospital Name is required']
                 ],
-                'hospital_address' => ['label'  => 'Hospital Address','rules'  => 'permit_empty','errors' => []],
-                'hospital_state' => [
-                        'label'  => 'hospital_State',
-                        'rules'  => 'permit_empty|regex_match[/^[a-zA-Z\s\-]+$/]',
-                        'errors' => [
-                            'regex_match' => 'Hospital State name can only contain letters, spaces, and hyphens.'
-                        ]
+                'hospital_address' => ['label'  => 'Hospital Address','rules'  => 'required',
+                    'errors' => ['required' => 'Hospital Address is required']
                 ],
-                'hospital_city' => [
-                        'rules'  => 'permit_empty|regex_match[/^[a-zA-Z0-9\s\-]+$/]',
-                        'errors' => [
-                            'regex_match' => 'Hospital City can contain letters, numbers, spaces, and hyphens.'
-                        ]
+                'hospital_city' => ['label'  => 'Hospital City','rules'  => 'required',
+                    'errors' => ['required' => 'City is required']
                 ],
-                'hospital_pin_code' => [
-                        'rules'  => 'permit_empty|numeric|exact_length[6]',
-                        'errors' => [
-                            'numeric'      => 'Hospital Pincode must be digits only.',
-                            'exact_length' => 'Hospital Pincode must be exactly 6 digits.'
-                        ]
+                'hospital_state' => ['label'  => 'Hospital State','rules'  => 'required',
+                    'errors' => ['required' => 'State is required']
                 ],
-                'hospital_phone_no' => ['label'  => 'Hospital Phone','rules'  => 'permit_empty|numeric|min_length[10]',
+                'hospital_pin_code' => ['label'  => 'Hospital Pincode','rules'  => 'required|numeric|exact_length[6]',
+                    'errors' => ['exact_length' => 'Pincode must be 6 digits']
+                ],
+                'hospital_phone_no' => ['label'  => 'Hospital Phone','rules'  => 'required|numeric|min_length[10]',
                     'errors' => ['min_length' => 'Phone number too short']
                 ],
                 'doa' => ['label'  => 'DOA', 'rules'  => 'required',
@@ -3142,12 +3138,11 @@ class TicketController extends BaseController
                 ],
                 'url.*' => [
                     'label'  => 'URL',
-                    'rules'  => 'if_exist|required|regex_match[/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/]',
+                    'rules'  => 'required',
                     'errors' => [
-                        'required'    => 'URL is required.',
-                        'regex_match' => 'The URL format is invalid. Example: www.google.com or https://google.com'
+                        'required'    => 'URL is required',
                     ]
-                ],
+                ]
             ];
 
         if (!$this->validate($rules)) {

From 289edeb219fcc0dd64431d3d03d4adcda929cdba Mon Sep 17 00:00:00 2001
From: "venkatesh.r" 
Date: Fri, 13 Feb 2026 16:56:14 +0530
Subject: [PATCH 7/9] FIX_VALIDATION_ISSUE

---
 app/Controllers/LeadsController.php  |  18 +++-
 app/Controllers/TicketController.php | 124 ++++++++++++++++++---------
 app/Controllers/UserController.php   |  20 +++--
 3 files changed, 112 insertions(+), 50 deletions(-)

diff --git a/app/Controllers/LeadsController.php b/app/Controllers/LeadsController.php
index 0f96da92..c09b0e43 100644
--- a/app/Controllers/LeadsController.php
+++ b/app/Controllers/LeadsController.php
@@ -365,6 +365,7 @@ class LeadsController extends BaseController
     {
         // print_r($this->request->getPost()); die;
         $id = $this->request->getPost('id');
+        $postData = $this->request->getPost();
         $data = $this->prepareLeadData();
         $rules = [
 
@@ -449,6 +450,21 @@ class LeadsController extends BaseController
             ]
         ];
 
+        foreach ($postData as $key => $value) {
+            // Check if the key starts with 'docs_name_'
+            if (strpos($key, 'docs_name_') === 0) {
+                $rules[$key . '.*'] = [
+                    'label'  => 'Document Name',
+                    'rules'  => 'permit_empty|regex_match[/^[a-zA-Z0-9_\- ]+$/]',
+                    'errors' => [
+                        'regex_match' => 'Document Name in {field} can only contain letters, numbers, hyphens, and underscores.'
+                    ]
+                ];
+            }
+        }
+
+        // print_r($rules); die;
+
         if (isset($data['lead_form_type']) && (int)$data['lead_form_type'] === 2) {
             $rules['client_type'] = [
                 'rules'  => 'required',
@@ -793,7 +809,7 @@ class LeadsController extends BaseController
                 'source_policy_end_date'    => $data['source_policy_end_date'] ?? null,
                 'claim_history'             => $data['claim_history'] ?? 0,
 
-                'next_reminder_date'        => $data['next_reminder_date'] ?? 0,
+                'next_reminder_date'        => $data['next_reminder_date'] ?? null,
                 'is_insurer_auto_mail'      => $data['is_insurer_auto_mail'] ?? 0
             ];
         }
diff --git a/app/Controllers/TicketController.php b/app/Controllers/TicketController.php
index 32e2cf34..56842b57 100644
--- a/app/Controllers/TicketController.php
+++ b/app/Controllers/TicketController.php
@@ -1216,37 +1216,51 @@ class TicketController extends BaseController
                 'claim_type' => ['label'  => 'Claim Type','rules'  => 'required',
                     'errors' => ['required' => 'Claim Type is required']
                 ],
-                'hospital_name' => ['label'  => 'Hospital Name','rules'  => 'required',
-                    'errors' => ['required' => 'Hospital Name is required']
+                'hospital_name' => [
+                    'label'  => 'Hospital Name',
+                    'rules'  => 'required|regex_match[/^[a-zA-Z0-9\s\-_.\']+$/]',
+                    'errors' => [
+                        'required'    => 'Hospital Name is required',
+                        'regex_match' => 'The {field} can only contain letters, numbers, spaces, dashes, underscores, dots, and apostrophes.'
+                    ]
                 ],
-                'hospital_address' => ['label'  => 'Hospital Address','rules'  => 'required',
-                    'errors' => ['required' => 'Hospital Address is required']
+                'hospital_address' => [
+                    'label'  => 'Hospital Address',
+                    'rules'  => 'permit_empty|regex_match[/^[a-zA-Z0-9\s\-_.,#\/]+$/]',
+                    'errors' => [
+                        'regex_match' => 'The {field} contains invalid characters (Allowed: letters, numbers, spaces, dashes, commas, dots, # and /).'
+                    ],
                 ],
-                    'hospital_state' => [
-                        'label'  => 'hospital_State',
-                        'rules'  => 'required|regex_match[/^[a-zA-Z\s\-]+$/]',
-                        'errors' => [
-                            'required'    => 'Hospital State is required.',
-                            'regex_match' => 'Hospital State name can only contain letters, spaces, and hyphens.'
-                        ]
-                    ],
-                    'hospital_city' => [
-                        'rules'  => 'required|regex_match[/^[a-zA-Z0-9\s\-]+$/]',
-                        'errors' => [
-                            'required' => 'Hospital City is required',
-                            'regex_match' => 'Hospital City can contain letters, numbers, spaces, and hyphens.'
-                        ]
-                    ],
-                    'hospital_pin_code' => [
-                        'rules'  => 'required|numeric|exact_length[6]',
-                        'errors' => [
-                            'required' => 'Hospital Pincode is required.',
-                            'numeric'      => 'Hospital Pincode must be digits only.',
-                            'exact_length' => 'Hospital Pincode must be exactly 6 digits.'
-                        ]
-                    ],
-                'hospital_phone_no' => ['label'  => 'Hospital Phone','rules'  => 'required|numeric|min_length[10]',
-                    'errors' => ['min_length' => 'Phone number too short']
+                'hospital_state' => [
+                    'label'  => 'Hospital State',
+                    'rules'  => 'permit_empty|regex_match[/^[a-zA-Z\s\-]+$/]',
+                    'errors' => [
+                        'regex_match' => 'Hospital State name can only contain letters, spaces, and hyphens.'
+                    ]
+                ],
+                'hospital_city' => [
+                    'label'  => 'Hospital City', // Added label for consistency
+                    'rules'  => 'permit_empty|regex_match[/^[a-zA-Z\s\-]+$/]',
+                    'errors' => [
+                        'regex_match' => 'Hospital City can only contain letters, spaces, and hyphens.'
+                    ]
+                ],
+                'hospital_pin_code' => [
+                    'label'  => 'Hospital Pincode',
+                    'rules'  => 'permit_empty|numeric|exact_length[6]',
+                    'errors' => [
+                        'numeric'      => 'Hospital Pincode must be digits only.',
+                        'exact_length' => 'Hospital Pincode must be exactly 6 digits.'
+                    ]
+                ],
+                'hospital_phone_no' => [
+                    'label'  => 'Hospital Phone',
+                    'rules'  => 'permit_empty|numeric|min_length[10]|max_length[15]',
+                    'errors' => [
+                        'numeric'    => 'Phone number must contain only digits.',
+                        'min_length' => 'Phone number is too short.',
+                        'max_length' => 'Phone number is too long.'
+                    ]
                 ],
                 'doa' => ['label'  => 'DOA', 'rules'  => 'required',
                     'errors' => ['required' => 'Date of Admission is required']
@@ -1551,23 +1565,51 @@ class TicketController extends BaseController
                 'claim_type' => ['label'  => 'Claim Type','rules'  => 'required',
                     'errors' => ['required' => 'Claim Type is required']
                 ],
-                'hospital_name' => ['label'  => 'Hospital Name','rules'  => 'required',
-                    'errors' => ['required' => 'Hospital Name is required']
+               'hospital_name' => [
+                    'label'  => 'Hospital Name',
+                    'rules'  => 'required|regex_match[/^[a-zA-Z0-9\s\-_.\']+$/]',
+                    'errors' => [
+                        'required'    => 'Hospital Name is required',
+                        'regex_match' => 'The {field} can only contain letters, numbers, spaces, dashes, underscores, dots, and apostrophes.'
+                    ]
                 ],
-                'hospital_address' => ['label'  => 'Hospital Address','rules'  => 'required',
-                    'errors' => ['required' => 'Hospital Address is required']
+                'hospital_address' => [
+                    'label'  => 'Hospital Address',
+                    'rules'  => 'permit_empty|regex_match[/^[a-zA-Z0-9\s\-_.,#\/]+$/]',
+                    'errors' => [
+                        'regex_match' => 'The {field} contains invalid characters (Allowed: letters, numbers, spaces, dashes, commas, dots, # and /).'
+                    ],
                 ],
-                'hospital_city' => ['label'  => 'Hospital City','rules'  => 'required',
-                    'errors' => ['required' => 'City is required']
+                'hospital_state' => [
+                    'label'  => 'Hospital State',
+                    'rules'  => 'permit_empty|regex_match[/^[a-zA-Z\s\-]+$/]',
+                    'errors' => [
+                        'regex_match' => 'Hospital State name can only contain letters, spaces, and hyphens.'
+                    ]
                 ],
-                'hospital_state' => ['label'  => 'Hospital State','rules'  => 'required',
-                    'errors' => ['required' => 'State is required']
+                'hospital_city' => [
+                    'label'  => 'Hospital City', // Added label for consistency
+                    'rules'  => 'permit_empty|regex_match[/^[a-zA-Z\s\-]+$/]',
+                    'errors' => [
+                        'regex_match' => 'Hospital City can only contain letters, spaces, and hyphens.'
+                    ]
                 ],
-                'hospital_pin_code' => ['label'  => 'Hospital Pincode','rules'  => 'required|numeric|exact_length[6]',
-                    'errors' => ['exact_length' => 'Pincode must be 6 digits']
+                'hospital_pin_code' => [
+                    'label'  => 'Hospital Pincode',
+                    'rules'  => 'permit_empty|numeric|exact_length[6]',
+                    'errors' => [
+                        'numeric'      => 'Hospital Pincode must be digits only.',
+                        'exact_length' => 'Hospital Pincode must be exactly 6 digits.'
+                    ]
                 ],
-                'hospital_phone_no' => ['label'  => 'Hospital Phone','rules'  => 'required|numeric|min_length[10]',
-                    'errors' => ['min_length' => 'Phone number too short']
+                'hospital_phone_no' => [
+                    'label'  => 'Hospital Phone',
+                    'rules'  => 'permit_empty|numeric|min_length[10]|max_length[15]',
+                    'errors' => [
+                        'numeric'    => 'Phone number must contain only digits.',
+                        'min_length' => 'Phone number is too short.',
+                        'max_length' => 'Phone number is too long.'
+                    ]
                 ],
                 'doa' => ['label'  => 'DOA', 'rules'  => 'required',
                     'errors' => ['required' => 'Date of Admission is required']
diff --git a/app/Controllers/UserController.php b/app/Controllers/UserController.php
index 3659369b..97ed35bd 100755
--- a/app/Controllers/UserController.php
+++ b/app/Controllers/UserController.php
@@ -114,11 +114,13 @@ class UserController extends AdminController
                 // Employee Code
                 // ======================
                 'emp_code' => [
-                    'rules'  => 'required|min_length[3]|max_length[15]',
+                    'label'  => 'Employee Code',
+                    'rules'  => 'required|min_length[3]|max_length[15]|regex_match[/^[a-zA-Z0-9_\-\/]+$/]',
                     'errors' => [
-                        'required'      => 'Employee Code is required',
-                        'min_length'    => 'Employee Code must be at least 3 characters',
-                        'max_length'    => 'Employee Code cannot exceed 15 characters',
+                        'required'    => 'Employee Code is required',
+                        'min_length'  => 'Employee Code must be at least 3 characters',
+                        'max_length'  => 'Employee Code cannot exceed 15 characters',
+                        'regex_match' => 'Employee Code can only contain letters, numbers, underscores, hyphens, and forward slashes (/).'
                     ]
                 ],
 
@@ -295,11 +297,13 @@ class UserController extends AdminController
                 // Employee Code
                 // ======================
                 'emp_code' => [
-                    'rules'  => 'required|min_length[3]|max_length[15]',
+                    'label'  => 'Employee Code',
+                    'rules'  => 'required|min_length[3]|max_length[15]|regex_match[/^[a-zA-Z0-9_\-\/]+$/]',
                     'errors' => [
-                        'required'      => 'Employee Code is required',
-                        'min_length'    => 'Employee Code must be at least 3 characters',
-                        'max_length'    => 'Employee Code cannot exceed 15 characters',
+                        'required'    => 'Employee Code is required',
+                        'min_length'  => 'Employee Code must be at least 3 characters',
+                        'max_length'  => 'Employee Code cannot exceed 15 characters',
+                        'regex_match' => 'Employee Code can only contain letters, numbers, underscores, hyphens, and forward slashes (/).'
                     ]
                 ],
 

From 6234177cd49be8121074954daad891b3aaf10605 Mon Sep 17 00:00:00 2001
From: "venkatesh.r" 
Date: Fri, 13 Feb 2026 17:41:11 +0530
Subject: [PATCH 8/9] FIX_ISSUE_PT_FILE_UPLOAD

---
 .../PolicyTransactionController.php           | 20 ++++++++++++
 app/Views/drive_file_upload.php               | 31 +++++++++++++++++--
 app/Views/leads_form_handler.php              |  6 ++--
 3 files changed, 52 insertions(+), 5 deletions(-)

diff --git a/app/Controllers/PolicyTransactionController.php b/app/Controllers/PolicyTransactionController.php
index c122e7ae..838c646e 100644
--- a/app/Controllers/PolicyTransactionController.php
+++ b/app/Controllers/PolicyTransactionController.php
@@ -3337,6 +3337,26 @@ class PolicyTransactionController extends BaseController
             $docs_name = $this->request->getPost('doc_name');
             $pt_id = $this->request->getPost('pt_id');
             $client_policy_id = $this->request->getPost('client_policy_id');
+
+            $rules = [
+                'doc_name.*' => [
+                    'label'  => 'Policy Document Name',
+                    'rules'  => 'permit_empty|required|regex_match[/^[a-zA-Z0-9 _-]+$/]|min_length[2]|max_length[100]',
+                    'errors' => [
+                        'required' => "Policy Document Name is required",
+                        'regex_match' => 'The {field} can only contain letters, numbers, spaces, dashes, and underscores.'
+                    ]
+                ],
+            ];
+
+            if (!$this->validate($rules)) {
+                return $this->response->setStatusCode(400)->setJSON([
+                    'status' => false,
+                    'message' => 'Input validation failed',
+                    'code' => 400,
+                    'errors' => $this->validator->getErrors()
+                ]);
+            }
         }
 
         $uploadFilePath = WRITEPATH . 'uploads/client_kyc_documents';
diff --git a/app/Views/drive_file_upload.php b/app/Views/drive_file_upload.php
index c7759622..33f2a6db 100644
--- a/app/Views/drive_file_upload.php
+++ b/app/Views/drive_file_upload.php
@@ -108,11 +108,36 @@ $("#drive_file_upload_form").submit(function(event) {
             $('#drive_file_upload_form')[0].reset();
 
         },
-        error: function (xhr, status, error) {
-            console.error(xhr.responseText);
-            console.error(status, error);
+        error:function (xhr) {
+
+            if (xhr.status === 400) {
+                let response = JSON.parse(xhr.responseText);
+                let errorMessages = "";
+                let seenMessages = []; // Array to store unique messages
+                if (response.errors) {
+                    $.each(response.errors, function (field, message) {
+                        if (!seenMessages.includes(message)) {
+                            errorMessages += `• ${message}
`; + seenMessages.push(message); // Mark this message as "seen" + } + }); + toastr.error(errorMessages, 'Validation Error', { "allowHtml": true }); + } else { + toastr.warning(response.message || 'Validation failed', 'Warning'); + } + + } else if (xhr.status === 403) { + let response = JSON.parse(xhr.responseText); + toastr.error(response.message, 'Security Policy'); + } else if (xhr.status === 500) { + toastr.error('Something went wrong . Please try again later.', 'Server Error'); + } else { + toastr.error('An unexpected error occurred. Please try again later.', 'Error'); + } + $('.loader').fadeOut(); $('.loader-mask').delay(350).fadeOut('slow'); + } }); }); diff --git a/app/Views/leads_form_handler.php b/app/Views/leads_form_handler.php index 2773b0e2..6677520d 100644 --- a/app/Views/leads_form_handler.php +++ b/app/Views/leads_form_handler.php @@ -573,7 +573,8 @@ if (isset($selected_lead_type)) {
- +
+ PDF | Excel (XLSX, XLS) | Images (PNG, JPG)
@@ -638,7 +639,8 @@ if (isset($selected_lead_type)) {
- +
+ PDF | Excel (XLSX, XLS) | Images (PNG, JPG)
From 415c272bdf50072bb62defef1fee0b4ce5cac406 Mon Sep 17 00:00:00 2001 From: "venkatesh.r" Date: Fri, 13 Feb 2026 17:48:08 +0530 Subject: [PATCH 9/9] FIX_ISSUE --- app/Controllers/TicketController.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/Controllers/TicketController.php b/app/Controllers/TicketController.php index d93a7b81..56842b57 100644 --- a/app/Controllers/TicketController.php +++ b/app/Controllers/TicketController.php @@ -3180,11 +3180,12 @@ class TicketController extends BaseController ], 'url.*' => [ 'label' => 'URL', - 'rules' => 'required', + 'rules' => 'if_exist|required|regex_match[/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/]', 'errors' => [ - 'required' => 'URL is required', + 'required' => 'URL is required.', + 'regex_match' => 'The URL format is invalid. Example: www.google.com or https://google.com' ] - ] + ], ]; if (!$this->validate($rules)) {