myLogger = \Config\Services::mylogger(); $this->clientModel = new ClientModel(); $this->userModel = new UserModel(); $this->clientBranchModel = new ClientBranchModel(); $this->clientKYCDocsModel = new ClientKYCDocsModel(); $this->clientDepositModel = new ClientDepositModel(); $this->clientPolicyModel = new ClientPolicyModel(); $this->clientRMModel = new ClientRMModel(); $this->insurerBranchModel = new InsurerBranchModel(); $this->insurerModel = new InsurerModel(); $this->kycDocsModel = new KYCDocsModel(); $this->kycEntityTypeModel = new KYCEntityTypeModel(); $this->levelContactModel = new LevelContactModel(); $this->policesModel = new PolicesModel(); $this->tpaBranchModel = new TPABranchModel(); $this->tpaModel = new TPAModel(); $this->stateModel = new StateModel(); $this->policyGridModel = new PolicyGridModel(); $this->policyPremium1Model = new PolicyPremium1Model(); $this->policyPremium2Model = new PolicyPremium2Model(); $this->employeeModel = new EmployeeModel(); $this->employeePolicyModel = new EmployeePolicyModel(); $this->notificationModel = new NotificationModel(); $this->CDMasterModel = new CDMasterModel(); } public function index() { $this->myLogger->logme('error','Client list function called'); $headerData['page_name'] = 'Client List'; $data['clientList'] = $this->clientModel->getCreatedByUserName(); $data['client_rm'] = $this->clientRMModel->getAllClientRM(); // dd($data); echo view('layout/header', $headerData); echo view('client_list', $data); echo view('layout/footer'); // $this->loadLayout('client_onboarding', $data); } public function updateEmpAndPolicyStatus(){ $return = $this->clientPolicyModel->updateStatus(); $this->myLogger->logme('error', 'Client Policy Status Update Count: {data}', ['data' => $return['client']]); $this->myLogger->logme('error', 'Employee Policy Status Update Count: {data}', ['data' => $return['emp']]); } public function removeClient($id = null) { $this->myLogger->logme('error','Client Remove function called'); // $data = $this->request->getPost(); $data['updated_by'] = get_session_userid(); $data['is_active'] = 0; $update = $this->clientModel->update($id,$data); if($update){ return $this->respond(['status' => true,'code' => 200], 200); }else{ return $this->respond(['status' => false,'code' => 404], 200); } } public function removeClientBranch($id = null) { $this->myLogger->logme('error','Client Branch Remove function called'); // $id = $this->request->getPost('PrimaryKey'); // $data = $this->request->getPost(); $data['updated_by'] = get_session_userid(); $data['is_active'] = 0; $update = $this->clientBranchModel->update($id,$data); if($update){ return $this->respond(['status' => true,'code' => 200], 200); }else{ return $this->respond(['status' => false,'code' => 404], 200); } } public function clientOnboarding() { $this->myLogger->logme('error','Client Onboarding function called'); $headerData['page_name'] = 'Client Onboarding'; $data['entity'] = $this->kycEntityTypeModel->findAll(); $data['kyc_docs'] = $this->kycDocsModel->findAll(); $data['police'] = $this->policesModel->findAll(); $data['insurer'] = $this->insurerBranchModel ->getInsurerBranchesWithInsurerNames(); $data['tpa'] = $this->tpaBranchModel ->getTpaBranchesWithTpaNames(); $data['state'] = $this->stateModel->getAllStates(); $data['RM'] = $this->userModel->findAll(); $data['policyGridData'] = $this->policyGridModel->findAll(); $data['policy_type'] = ['1'=>'Base Policy', '2' => 'SI Topup', '3' => 'Dependent Addon']; // echo "
";
        // print_r($data); die;
        $data['placeHolders'] = ['member_name','nhance_logo','tpa_id','ecard_download_link', 'client_logo', 'policy_no', 'member_summary', 'app_link', 'post_enrollment_app_link', 'client_name'];

        // dd($data['placeHolders']);

        echo view('layout/header', $headerData);
        echo view('client_onboarding', $data);
        echo view('layout/footer');

    }   

    // In your controller
    public function deposit($id = null)
    {
        $headerData['page_name'] = 'Client Deposit';

        $data['clientName'] = $this->clientModel->where('id',$id)->find();
        $data['clientData'] = $this->clientPolicyModel->getinsurerswithclientid($id);
        $data['depositsummary'] = $this->clientPolicyModel->getDepositlistsummary($id);

        // Fetch associated insurer names and balances
        $balances = $this->clientPolicyModel->getBalances($id);
        $data['balances'] = $balances;

        echo view('layout/header', $headerData);
        echo view('client_deposit_list', $data);
        echo view('layout/footer');
    }
   
    public function view_Deposit($insurerId) 
    {
        // Load your model to fetch data based on $clientId and $insurerId
        // $subTypeOptions = [
        //     1 => 'Deposit',
        //     2 => 'Adjustment',
        //     3 => 'Refund',
        //     4 => 'Debit',
        // ];
        $subTypeOptions = [
            1 => 'Replenishment',
            2 => 'Adjustment',
            3 => 'Refund From Deletion',
            4 => 'Debit',
        ];

        $data['subTypeOptions'] = $subTypeOptions;
        $headerData['page_name'] = 'Client Deposit';
        $data['insurerName']= $this->insurerModel->getInsurerName($insurerId);
        $loggedInUserID = get_session_userid();
        // $data['clientData']= $this->clientPolicyModel->getinsurerswithinsurenceid($insurerId);
        $clientId = $this->request->getGet('client_id');
        $data['depositdata']= $this->clientPolicyModel->getdepositData($clientId,$insurerId); 
        $data['clientData'] = $this->clientPolicyModel->getClientById($clientId);
        $data['deposiamount'] = $this->clientPolicyModel->getDepositSummary($clientId, $insurerId);  
        
        
        // print_r($data['depositdata'] );die;
        // Load the view for the new list page
        echo view('layout/header', $headerData);
        echo view('view_deposit',$data);
        echo view('layout/footer');
    }


    public function saveDeposit()
    {
        // Retrieve form data from POST request
        $loggedInUserID = get_session_userid();

        $client_id = $this->request->getPost('client_id');
        $insurer_id = $this->request->getPost('insurer_id');

        $CD_Account_Number = $this->CDMasterModel
                ->where('client_id', $client_id)
                ->where('insurer_id', $insurer_id)
                ->first();

        // Prepare the array with data
        $data = [
            'amount' => $this->request->getPost('amount'),
            'sub_type_id' => $this->request->getPost('sub_type_id'),
            'client_id' => $this->request->getPost('client_id'),
            'client_policy_id' => null,
            'cd_ac_no' => $CD_Account_Number['cd_ac_no'] ?? null,
            'endorsement_no' => null,
            'insurer_id' => $this->request->getPost('insurer_id'),
            'description' => $this->request->getPost('description'),
            'transaction_type' => $this->request->getPost('transaction_type') ?: 'Credit',
            'updated_by' => 1,
        ];


        // Call the saveDeposit function from DepositHelper
        $response = DepositHelper::saveDeposit($data, $loggedInUserID);


        // Return a boolean value based on success
        return $this->response->setJSON(['success' => $response['success']]);
    }


    public function editClientOnboarding($id = null)
    {    

        $this->myLogger->logme('error','Edit Client Onboarding function called');
        $headerData['page_name'] = 'Edit Client Onboarding';

        $editData['RM']             = $this->userModel->findAll();
        $editData['tpa']            = $this->tpaBranchModel ->getTpaBranchesWithTpaNames();
        $editData['state']          = $this->stateModel->getAllStates();
        $editData['police']         = $this->policesModel->findAll();
        $editData['entity']         = $this->kycEntityTypeModel->findAll();
        $editData['insurer']        = $this->insurerBranchModel ->getInsurerBranchesWithInsurerNames();
        $editData['kyc_docs']       = $this->kycDocsModel->findAll();
        $editData['policyGridData'] = $this->policyGridModel->findAll();
        $editData['policy_type'] = ['1'=>'Base Policy', '2' => 'SI Topup', '3' => 'Dependent Addon'];


        $editData['client']           = $this->clientModel->where(['id' => $id])->first();
        $editData['client_kyc']       = $this->clientKYCDocsModel->where('client_id', $id)->findAll();
        $editData['client_branch']    = $this->clientBranchModel->where(['client_id' => $id, 'is_active' => 1])->findAll();
        $editData['client_relation']  = $this->clientRMModel->where(['client_id' => $id, 'is_active' => 1])->findAll();
        // dd('Hi');
        $clientPoliceData = $this->clientPolicyModel->getClientPolicyByClientId($id);
        // dd($this->clientPolicyModel->getLastQuery());
        foreach ($clientPoliceData as $key => $value) {
            
            $clientPoliceData[$key]->policy_start_date = date('d-M-Y', strtotime($value->policy_start_date));
            $clientPoliceData[$key]->policy_end_date = date('d-M-Y', strtotime($value->policy_end_date));
        }

        $editData['client_policy']    = $clientPoliceData;
        

        $editData['notification'] =$this->notificationModel->select('template_name,enabled')->where('client_id',$id)->findAll();
        $editData['placeHolders'] = ['member_name','nhance_logo','tpa_id','ecard_download_link', 'client_logo', 'policy_no', 'member_summary', 'app_link', 'post_enrollment_app_link', 'client_name'];


        echo view('layout/header', $headerData);
        echo view('client_onboarding', $editData);
        echo view('layout/footer');

    }
     
    public function createClientGeneralInfo()
    {

        $this->myLogger->logme('error','Client general info function called');
        $uploadFilePath = ROOTPATH . 'public/uploads/logo/';
        $file_name = file_Upload($this->request->getFile('client_logo'), $uploadFilePath);
        $data   = $this->request->getPost();
        $data['created_by'] = get_session_userid();
        $data['client_logo'] = $file_name;


        if (!isset($data['is_download_btn'])) {
            $data['is_download_btn'] = 0;
        } elseif ($data['is_download_btn']) {
            $data['is_download_btn'] = 1;
        }

        $insert = $this->clientModel->insert($data);
        if($insert){
            $client_data = $this->clientModel->where(['id' => $insert, 'is_active' => 1])->first();
            return $this->respond(['status' => true,'code' => 200,'data' => $client_data], 200);

        }else{
            return $this->respond(['status' => false,'code' => 404,'message' => 'no data found'], 200);

        }
    }

    public function editClientGeneralInfo()
    {
        $this->myLogger->logme('error','edit client general info function called');
        $uploadFilePath = ROOTPATH . 'public/uploads/logo/';
        // print_r($this->request->getFile('client_logo'));die;
        $file_name = file_Upload($this->request->getFile('client_logo'), $uploadFilePath);
        $id                 = $this->request->getPost('PrimaryKey');

        $data               = $this->request->getPost();
        $data['updated_by'] = get_session_userid();
        
        if(!empty($file_name)){
            $data['client_logo'] = $file_name;
        }

        if (!isset($data['is_download_btn'])) {
            $data['is_download_btn'] = 0;
        } elseif ($data['is_download_btn']) {
            $data['is_download_btn'] = 1;
        }
        
        // print_r($data);die;

        $update             = $this->clientModel->update($id,$data);


        if($update){
            return $this->respond(['status' => true,'code' => 200,'data' => $data], 200);
        }else{
            return $this->respond(['status' => false,'code' => 404,'message' => 'no data found'], 200);
        }
    }
    
    public function createClientKYCInfo()
    {
        $this->myLogger->logme('error','create Client kyc function called');  
        $data = $this->request->getPost();     
        unset($data['file_name']); 
        $uploadFilePath = WRITEPATH . 'uploads/client_kyc_documents';
        $File = file_Upload($this->request->getFile('file_name'), $uploadFilePath);
        if(!empty($File)){
            $data['file_name'] = $File;
        }

        $data['created_by'] = get_session_userid();
        $insert = $this->clientKYCDocsModel->insert($data);
        if($insert){

            $kycDocs = $this->clientKYCDocsModel->where('client_id',$this->request->getPost('client_id'))->findAll();
            return $this->respond(['status' => true,'code' => 200,'data' => $kycDocs, 'file_name' => $File], 200);
        }else{
            return $this->respond(['status' => false,'code' => 404,'message' => 'no data found'], 200);
        }
    }

    public function editClientKYCInfo()
    {
       
        $this->myLogger->logme('error','edit client kyc function called');        
        $uploadFilePath = WRITEPATH . 'uploads/client_kyc_documents';
        $File = file_Upload($this->request->getFile('file_name'), $uploadFilePath);
        if(!empty($File)){
            $data['file_name'] = $File;
        }
        $id                 = $this->request->getPost('PrimaryKey');
        $data['client_id']  = $id;
        $data['kyc_doc_type_id'] = $this->request->getPost('kyc_doc_id');
        $data['updated_by'] = get_session_userid();
        $insert = $this->clientKYCDocsModel->insert($data);
        if($insert){
            $kycDocs = $this->clientKYCDocsModel->getKycDocsName($id);
            return $this->respond(['status' => true,'code' => 200,'data' => $kycDocs], 200);
        }else{
            return $this->respond(['status' => false,'code' => 404,'message' => 'no data found'], 200);

        }
    }

    public function deleteClientKycDocs($id=null)
    {
        
        $delete = $this->clientKYCDocsModel->where('kyc_doc_type_id', $id)->delete();
        if($delete){
            return $this->respond(['status' => true,'code' => 200,'id' => $id], 200);
        }else{
            return $this->respond(['status' => false,'code' => 404,'message' => 'no data found'], 200);
        }
    }

    public function deleteClientKycOtherDocs($id=null)
    {
        
        $delete = $this->clientKYCDocsModel->where('id', $id)->delete();
        if($delete){
            return $this->respond(['status' => true,'code' => 200,'id' => $id], 200);
        }else{
            return $this->respond(['status' => false,'code' => 404,'message' => 'no data found'], 200);
        }
    }

    public function createClientRelation()
    {

        $this->myLogger->logme('error','Client relation function called');

        $data['client_id'] = $this->request->getPost('client_id');
        $data['created_by'] = get_session_userid();
        $inserted = false; 
        
        if ($this->request->getPost('head')) {
            $data['level'] = "1";
            $data['user_id'] = $this->request->getPost('head');
            $inserted = $this->clientRMModel->insert($data);
        }
        
        if ($this->request->getPost('manager')) {
            $data['level'] = "2";
            $data['user_id'] = $this->request->getPost('manager');
            $inserted = $this->clientRMModel->insert($data);
        }
        
        if ($this->request->getPost('account_manager')) {
            $data['level'] = "3";
            foreach ($this->request->getPost('account_manager') as $value) {
                $data['user_id'] = $value;
                $inserted = $this->clientRMModel->insert($data);
            }
        }
        
        if ($inserted) {
            return $this->respond(['status' => true,'code' => 200,'data' => $this->request->getPost()], 200);
        } else {
            return $this->respond(['status' => false,'code' => 404,'message' => 'no data found'], 200);
        }
    }

    public function editClientRelation()
    {
        $this->myLogger->logme('error','Client relation function called');
        
        $id                 = $this->request->getPost('PrimaryKey');
        $data['client_id']  = $this->request->getPost('client_id');
        $data['updated_by'] = get_session_userid();
        $inserted = false; 
        
        if ($this->request->getPost('head')) {
            $data['user_id'] = $this->request->getPost('head');
            $checkHead = $this->clientRMModel->checkExistenceOfClientRelation($id, $this->request->getPost('head'), 1);
            if($checkHead){
                $inserted = $this->clientRMModel->where('client_id', $id )->where('level', 1)->set($data)->update();
            }else{
                $data['level'] = "1";
                $data['user_id'] = $this->request->getPost('head');
                $inserted = $this->clientRMModel->insert($data);
            }
        }
        
        if ($this->request->getPost('manager')) {
            $data['user_id'] = $this->request->getPost('manager');
            $checkHead = $this->clientRMModel->checkExistenceOfClientRelation($id, $this->request->getPost('manager'), 2);
            if($checkHead){
                $inserted = $this->clientRMModel->where('client_id', $id )->where('level', 2)->set($data)->update();
            }else{
                $data['level'] = "2";
                $data['user_id'] = $this->request->getPost('manager');
                $inserted = $this->clientRMModel->insert($data);
            }
        }
        
        if ($this->request->getPost('account_manager')) {

            $this->clientRMModel->where('client_id', $id)->where('level', 3)->delete();
            $data['level'] = "3";
            foreach ($this->request->getPost('account_manager') as $value) {
                $data['user_id'] = $value;
                $inserted = $this->clientRMModel->insert($data);
            }
        }
        
        $lastQuery = $this->clientRMModel->getLastQuery();

        if ($inserted) {
            return $this->respond(['status' => true,'code' => 200,'data' => $this->request->getPost(), "place" => 'edit'], 200);
        } else {
            return $this->respond(['status' => false,'code' => 404,"place" => 'edit', 'message' => 'no data found'], 200);
        }
    }

    public function createClientBranch()
    {

        $this->myLogger->logme('error','Client branch CREATE function called');
        $data   = $this->request->getPost();
        $data['created_by'] = get_session_userid();
        $insert = $this->clientBranchModel->insert($data);
        
        if($insert){
            for ($i = 0; $i < count($this->request->getPost('name')); $i++) {
                // Prepare data to insert
                $data = [
                    'contact_type' => 'client',
                    'ref_id'       => $insert,
                    'created_by'   => get_session_userid(),
                    'name'         => $this->request->getPost('name')[$i],
                    'email'        => $this->request->getPost('email')[$i],
                    'mobile'       => $this->request->getPost('mobile')[$i],
                    'designation'  => $this->request->getPost('designation')[$i]
                ];
                $contacts = $this->levelContactModel->insert($data);
            }
        }

        if($insert){
            $branchData = $this->clientBranchModel->where('client_id', $this->request->getPost('client_id'))->findAll();
            return $this->respond(['status' => true,'code' => 200,'data' => $branchData], 200);
        }else{
            return $this->respond(['status' => false,'code' => 404, 'message' => 'no data found'], 200);
        }
    }

    public function editClientBranch()
    {

        $this->myLogger->logme('error','Client branch EDIT function called');
        $id     = $this->request->getPost('branch_id_primarykey');
        $client_id     = $this->request->getPost('client_id');
        $data   = $this->request->getPost();
        $data['updated_by'] = get_session_userid();
        $insert = $this->clientBranchModel->update($id, $data);
        $this->myLogger->logme('error','Client branch EDITED by {data}', ['data' => get_session_userid()]);


        if($insert){

            $this->levelContactModel->where('ref_id', $id)->where('contact_type', 'client')->delete();
            for ($i = 0; $i < count($this->request->getPost('name')); $i++) {
                $data = [
                    'contact_type' => 'client',
                    'ref_id'       => $id,
                    'updated_by'   => get_session_userid(),
                    'name'         => $this->request->getPost('name')[$i],
                    'email'        => $this->request->getPost('email')[$i],
                    'mobile'       => $this->request->getPost('mobile')[$i],
                    'designation'  => $this->request->getPost('designation')[$i]
                ];
                $contacts = $this->levelContactModel->insert($data);
            }
        }

        if($insert){
            $branchData = $this->clientBranchModel->where('client_id', $client_id)->findAll();
            return $this->respond(['status' => true,'code' => 200,'data' => $branchData], 200);
        }else{
            return $this->respond(['status' => false,'code' => 404, 'message' => 'no data found'], 200);
        }
    }

    public function createClientPolicy()
    {

        // print_r($this->request->getPost()); die;


        $this->myLogger->logme('error','Client policy CREATE function called');

        $policy_type_id = $this->request->getPost('policy_type_id');
        $client_branch_id = $this->request->getPost('client_branch_id');
        $client_id = $this->request->getPost('client_id');


        $insurerValue                      = (string) $this->request->getPost('insurer');
        list($insurerBranchId, $insurerId) = explode('-', $insurerValue);
        

        $data['insurer_branch_id'] = $insurerBranchId;
        $data['insurer_id']        = $insurerId;

        $tpaValue = (string) $this->request->getPost('tpa');

        if ($tpaValue === null || $tpaValue === '') {
            $tpaBranchId = null;
            $tpaId = null;
        } else {
            list($tpaBranchId, $tpaId) = explode('-', $tpaValue);
        }
        

        $data['client_id']         = $client_id;
        $data['tpa_branch_id']     = $tpaBranchId;
        $data['tpa_id']            = $tpaId;
        $data['policy_id']         = $this->request->getPost('policy_id');
        $data['policy_type_id']    = $this->request->getPost('policy_type_id');

        $data['no_of_lives']                        = $this->request->getPost('no_of_lives');
        $data['policy_status']                      = $this->request->getPost('policy_status');
        $data['no_of_employees']                    = $this->request->getPost('no_of_employees');
        $data['earned_premium_date']                = change_date_format($this->request->getPost('earned_premium_date'), 'd-m-Y', 'Y-m-d');
        $data['claims_incurred_date']               = change_date_format($this->request->getPost('claims_incurred_date'), 'd-m-Y', 'Y-m-d');        
        $data['incurred_claims_ratio']              = $this->request->getPost('incurred_claims_ratio');
        $data['no_lives_at_inception']              = $this->request->getPost('no_lives_at_inception');
        $data['premium_paid_at_inception']          = $this->request->getPost('premium_paid_at_inception');
        $data['claims_experience_for_last_3_years'] = $this->request->getPost('claims_experience_for_last_3_years');
        $data['earned_premium_amount']              = $this->request->getPost('earned_premium_amount');
        $data['claims_incurred_amount']             = $this->request->getPost('claims_incurred_amount');
        $data['is_addon']                           = $this->request->getPost('is_addon');
        $data['base_policy']                        = $this->request->getPost('base_policy');
        $data['policy_status']                      = 1;
        $data['inception_type']                     = $this->request->getPost('inception_type') ? 2 : 1;
        $data['client_branch_id']                   = $this->request->getPost('client_branch_id');
        $data['cd_ac_no']                           = $this->request->getPost('cd_ac_no');




        $policy_terms =  $this->clientPolicyModel->where('id', $this->request->getPost('base_policy'))->first();

        if ($this->request->getPost('is_addon') == 2 || $this->request->getPost('is_addon') == 3) {

            if ($this->request->getPost('is_addon') == 3) {
                $policyTerm = $policy_terms['policy_terms'];
                $decoded_policyTerm = json_decode($policyTerm, true);
                $decoded_policyTerm['family_floater'] = 0;
                $decoded_policyTerm['family_floaters']['self'] = 0;
                $decoded_policyTerm['family_floaters']['spouse'] = 0;
                $decoded_policyTerm['family_floaters']['childrens'] = 0;
                $decoded_policyTerm['family_floaters']['parents'] = 0;
                $decoded_policyTerm['family_floaters']['parents-in-law'] = 0;
                $decoded_policyTerm['family_floaters']['either-parents-pil'] = 0;

                $data['policy_terms'] =  json_encode($decoded_policyTerm);
            } else {

                if ($this->request->getPost('policy_type_id') != 3) {

                    $data['policy_terms'] =  $policy_terms['policy_terms'];
                }
            }
        } 


        $data['policy_no'] = $this->request->getPost('policy_no');
        $data['policy_start_date'] = change_date_format($this->request->getPost('policy_start_date'), 'd-m-Y', 'Y-m-d');
        $data['policy_end_date']   = change_date_format($this->request->getPost('policy_end_date'), 'd-m-Y', 'Y-m-d');
        $data['created_by']        = get_session_userid();

        $insert = $this->clientPolicyModel->insert($data);
        if($insert){
            $clientPoliceData =  $this->clientPolicyModel->getClientPolicyByClientId($this->request->getPost('client_id'));
            // foreach ($clientPoliceData as $key => $value) {
            
            //     $clientPoliceData[$key]->policy_start_date = date('d-M-Y', strtotime($value->policy_start_date));
            //     $clientPoliceData[$key]->policy_end_date = date('d-M-Y', strtotime($value->policy_end_date));
            // }
            return $this->respond(['status' => true,'code' => 200,'data' => $clientPoliceData, 'method' => 'CERATE'], 200);
        }else{
            return $this->respond(['status' => false,'code' => 404, 'message' => 'no data found'], 200);
        }
    }

    public function editClientPolicy()
    {

        $this->myLogger->logme('error','Client policy function called');


        $id        = $this->request->getPost('PrimaryKey');
        $client_id = $this->request->getPost('client_id');



        $insurerValue                      = (string) $this->request->getPost('insurer');
        list($insurerBranchId, $insurerId) = explode('-', $insurerValue);

        $data['insurer_branch_id'] = $insurerBranchId;
        $data['insurer_id']        = $insurerId;

        $tpaValue                  = (string) $this->request->getPost('tpa');
        list($tpaBranchId, $tpaId) = explode('-', $tpaValue);

        $data['tpa_branch_id']     = $tpaBranchId;
        $data['client_id']         = $client_id;
        $data['tpa_id']            = $tpaId;
        $data['policy_id']         = $this->request->getPost('policy_id');
        $data['policy_type_id']    = $this->request->getPost('policy_type_id');
        $data['policy_no'] = $this->request->getPost('policy_no');
        $data['policy_start_date'] = change_date_format($this->request->getPost('policy_start_date'), 'd-m-Y', 'Y-m-d');
        $data['policy_end_date']   = change_date_format($this->request->getPost('policy_end_date'), 'd-m-Y', 'Y-m-d');

        $data['insured']                            = $this->request->getPost('insured');
        $data['no_of_lives']                        = $this->request->getPost('no_of_lives');
        $data['policy_status']                      = $this->request->getPost('policy_status');
        $data['no_of_employees']                    = $this->request->getPost('no_of_employees');
        $data['earned_premium_date']                = change_date_format($this->request->getPost('earned_premium_date'), 'd-m-Y', 'Y-m-d');
        $data['claims_incurred_date']               = change_date_format($this->request->getPost('claims_incurred_date'), 'd-m-Y', 'Y-m-d');
        $data['incurred_claims_ratio']              = $this->request->getPost('incurred_claims_ratio');
        $data['no_lives_at_inception']              = $this->request->getPost('no_lives_at_inception');
        $data['premium_paid_at_inception']          = $this->request->getPost('premium_paid_at_inception');
        $data['claims_experience_for_last_3_years'] = $this->request->getPost('claims_experience_for_last_3_years');
        $data['earned_premium_amount']              = $this->request->getPost('earned_premium_amount');
        $data['claims_incurred_amount']             = $this->request->getPost('claims_incurred_amount');
        $data['is_addon']                           = $this->request->getPost('is_addon');
        $data['base_policy']                        = $this->request->getPost('base_policy');
        $data['policy_status']                      = 1;
        $data['inception_type']                     = $this->request->getPost('inception_type') ? 2 : 1;
        $data['client_branch_id']                   = $this->request->getPost('client_branch_id');
        $data['cd_ac_no']                           = $this->request->getPost('cd_ac_no');



        $policy_terms =  $this->clientPolicyModel->where('id', $this->request->getPost('base_policy'))->first();

        if ( $this->request->getPost('is_addon') == 2 || $this->request->getPost('is_addon') == 3) {
            if ($this->request->getPost('is_addon') == 3) {
                $policyTerm = $policy_terms['policy_terms'];
                $decoded_policyTerm = json_decode($policyTerm, true);
                $decoded_policyTerm['family_floater'] =0;
                $decoded_policyTerm['family_floaters']['self'] =0;
                $decoded_policyTerm['family_floaters']['spouse'] =0;
                $decoded_policyTerm['family_floaters']['childrens'] =0;
                $decoded_policyTerm['family_floaters']['parents'] =0;
                $decoded_policyTerm['family_floaters']['parents-in-law'] =0;
                $decoded_policyTerm['family_floaters']['either-parents-pil'] =0;

                $data['policy_terms'] =  json_encode($decoded_policyTerm);
            } else {
                $data['policy_terms'] =  $policy_terms['policy_terms'];
            }
            
           
        } 

        // dd($data);
        $data['updated_by'] = get_session_userid();
        // print_r($data);die;
        $insert = $this->clientPolicyModel->update($id,$data);
        $lastQuery = $this->clientPolicyModel->getLastQuery();
        
        // echo '
';
        // print_r($data); die;

        if($insert){
            $clientPoliceData =  $this->clientPolicyModel->getClientPolicyByClientId($client_id);

            // foreach ($clientPoliceData as $key => $value) {
            
            //     $clientPoliceData[$key]->policy_start_date = date('d-M-Y', strtotime($value->policy_start_date));
            //     $clientPoliceData[$key]->policy_end_date = date('d-M-Y', strtotime($value->policy_end_date));
            // }
            return $this->respond(['status' => true,'code' => 200,'data' => $clientPoliceData, 'method' => 'EDIT'], 200);
        }else{
            return $this->respond(['status' => false,'code' => 404, 'message' => 'no data found'], 200);
        }
    }

    public function createClientPolicyPremium()
    {

        // echo json_encode(['key' => $this->request->getPost()]); die;

        try {
            $policy_type = $this->request->getPost('policy_type');
            $client_id = $this->request->getPost('client_id');
            $client_policy_id = $this->request->getPost('client_policy_id');
            $premium_type = $this->request->getPost('premium_type');
            if (!empty($client_id) && $client_id != null) {
                $client_policy_data = $this->clientPolicyModel->where('id', $client_policy_id)->first();
                $client_id =  $client_policy_data['client_id'];
            }
            $policy_grid_id = $this->request->getPost('policy_grid_id');
            $rack_rate_type = $this->request->getPost('rack_rate_type');

            $self = $this->request->getPost('self') ? 1 : 0;
            $spouse = $this->request->getPost('spouse')? 1 : 0;
            $childrens = $this->request->getPost('childrens')? 1 : 0;
            $parents = $this->request->getPost('parents')? 1 : 0;
            $parents_in_law = $this->request->getPost('parents-in-law')? 1 : 0;
            $either_parents_pil = $this->request->getPost('either-parents-pil')? 1 : 0;

            $relation_data['self'] = $self;
            $relation_data['spouse'] = $spouse;
            $relation_data['childrens'] = $childrens;
            $relation_data['parents'] = $parents;
            $relation_data['parents-in-law'] = $parents_in_law;
            $relation_data['either-parents-pil'] = $either_parents_pil;


            $jsonDataForRelation = json_encode($relation_data);

            // if($policy_grid_id == 10 || $policy_grid_id == 11){
            //     $premium_type = 1;
            // }else{
            //     $premium_type = 2;
            // }

            $si_or_bp = $this->request->getPost('si_or_bp');
            $basic_multiplier = str_replace(',', '', $this->request->getPost('basic_multiplier'));
            $premium_multiplier = str_replace(',', '', $this->request->getPost('premium_multiplier'));
            $multiplier = str_replace(',', '', $this->request->getPost('multiplier'));
            $basic_pay = str_replace(',', '', $this->request->getPost('basic_pay'));

            $data = [];
            $data['client_id'] = $client_id;
            $data['client_policy_id'] = $client_policy_id;
            $data['policy_grid_id'] = $policy_grid_id;
            $data['premium_type'] = $premium_type;
            $data['rack_rate_type'] = $rack_rate_type;

            if($rack_rate_type == 1){
                $data['additional_relationship'] = $jsonDataForRelation;
            }


            $premium = [];

            if ($policy_grid_id == '1' || $policy_grid_id == '2') {
                $this->policyPremium1Model->where('client_id', $client_id)->where('client_policy_id', $client_policy_id)->set('is_active', 0)->update();
            } else {
                $this->policyPremium2Model->where('client_id', $client_id)->where('client_policy_id', $client_policy_id)->where('rack_rate_type', $rack_rate_type)->set('is_active', 0)->update();
            }


            if ($policy_grid_id == '1') {


                if ($si_or_bp == '1') {

                    $premium = str_replace(',', '', $this->request->getPost('gpa_sum_premium[]'));
                    $sum_insure = str_replace(',', '', $this->request->getPost('gpa_sum_si[]'));
                    $multiplier = $this->request->getPost('gpa_sum_multiplier');

                    for ($i = 0; $i < count($premium); $i++) {
                        $data['si'] = $sum_insure[$i];
                        $data['premium'] = $premium[$i];
                        $data['multiplier'] = $multiplier;
                        $data['si_or_bp'] = $this->request->getPost('si_or_bp');

                        $policyPremium = $this->policyPremium1Model->insert($data);
                    }

                } else if ($si_or_bp == '3') {

                    $premium = str_replace(',', '', $this->request->getPost('gpa_sum_premium2[]'));
                    $sum_insure = str_replace(',', '', $this->request->getPost('gpa_sum_si2[]'));
                    $multiplier = $this->request->getPost('gpa_sum_multiplier2');
                    $grade = $this->request->getPost('gpa_band[]');

                    for ($i = 0; $i < count($premium); $i++) {
                        $data['si'] = $sum_insure[$i];
                        $data['premium'] = $premium[$i];
                        $data['grade'] = $grade[$i];
                        $data['multiplier'] = $multiplier;
                        $data['si_or_bp'] = $this->request->getPost('si_or_bp');

                        $policyPremium = $this->policyPremium1Model->insert($data);
                    }

                }else if ($si_or_bp == '2') {

                    $premium = str_replace(',', '', $this->request->getPost('gpa_basic_premium[]'));
                    $sum_insure = str_replace(',', '', $this->request->getPost('gpa_basic_si[]'));
                    $basic_pay = str_replace(',', '', $this->request->getPost('basic_pay[]'));

                    for ($i = 0; $i < count($premium); $i++) {

                        $data['si_or_bp'] = $this->request->getPost('si_or_bp');
                        $data['basic_multiplier'] = str_replace(',', '', $this->request->getPost('basic_multiplier'));
                        $data['multiplier'] = $this->request->getPost('premium_multiplier');
                        $data['basic_pay'] = $basic_pay[$i];
                        $data['si'] = $sum_insure[$i];
                        $data['premium'] = $premium[$i];

                        $policyPremium = $this->policyPremium1Model->insert($data);
                    }

                }else {

                    $data['premium'] = str_replace(',', '', $this->request->getPost('gpa_basic_premium'));
                    $data['si'] = str_replace(',', '', $this->request->getPost('gpa_basic_si'));
                    $data['basic_multiplier'] = str_replace(',', '', $this->request->getPost('basic_multiplier'));
                    $data['multiplier'] = $this->request->getPost('premium_multiplier');
                    $data['basic_pay'] = str_replace(',', '', $this->request->getPost('basic_pay'));
                    $data['si_or_bp'] = $this->request->getPost('si_or_bp');

                    $policyPremium = $this->policyPremium1Model->insert($data);
                }

                $data = $this->request->getPost();
                $insert = true;
            } else if ($policy_grid_id == '2') {
                $data['premium'] = str_replace(',', '', $this->request->getPost('gpa_premium'));
                $data['si'] = str_replace(',', '', $this->request->getPost('gpa_si'));

                $policyPremium = $this->policyPremium1Model->insert($data);

                $data = $this->request->getPost();
                $insert = true;
            } else if ($policy_grid_id == '3') {
                $premium = $this->request->getPost('3_premium[]');
                $sum_insure = $this->request->getPost('3_si[]');
                for ($i = 0; $i < count($premium); $i++) {
                    $data['premium'] = str_replace(',', '', $premium[$i]);
                    $data['si'] = str_replace(',', '', $sum_insure[$i]);
                    $dataa = $this->policyPremium2Model->insert($data);
                }
                $data = $this->request->getPost();
                $insert = true;
            } else if ($policy_grid_id == '4') {


                $premium = $this->request->getPost('4_premium[]');
                $sum_insure = $this->request->getPost('4_si');
                $age_from = $this->request->getPost('4_age_from[]');
                $age_to = $this->request->getPost('4_age_to[]');
                for ($i = 0; $i < count($premium); $i++) {
                    $data['premium'] = str_replace(',', '', $premium[$i]);
                    $data['si'] = str_replace(',', '', $sum_insure);
                    $data['age_from'] = $age_from[$i];
                    $data['age_to'] = $age_to[$i];
                    $dataa = $this->policyPremium2Model->insert($data);
                }
                $data = $this->request->getPost();
                $insert = true;


            } else if ($policy_grid_id == '5') {
                $premium = $this->request->getPost('5_premium[]');
                $sum_insure = $this->request->getPost('5_si[]');
                $age_from = $this->request->getPost('5_age_from[]');
                $age_to = $this->request->getPost('5_age_to[]');
                for ($i = 0; $i < count($premium); $i++) {
                    $data['premium'] = str_replace(',', '', $premium[$i]);
                    $data['si'] = str_replace(',', '', $sum_insure[$i]);
                    $data['age_from'] = $age_from[$i];
                    $data['age_to'] = $age_to[$i];
                    $dataa = $this->policyPremium2Model->insert($data);
                }
                $data = $this->request->getPost();
                $insert = true;
            } else if ($policy_grid_id == '6') {


                $premium = $this->request->getPost('6_premium[]');

                print_r($premium);

                $sum_insure = $this->request->getPost('6_si');
                $age_from = $this->request->getPost('6_age_from[]');
                $age_to = $this->request->getPost('6_age_to[]');
                for ($i = 0; $i < count($premium); $i++) {
                    $data['premium'] = str_replace(',', '', $premium[$i]);
                    $data['si'] = str_replace(',', '', $sum_insure);
                    $data['age_from'] = $age_from[$i];
                    $data['age_to'] = $age_to[$i];
                    $dataa = $this->policyPremium2Model->insert($data);
                }
                $data = $this->request->getPost();
                $insert = true;


            } else if ($policy_grid_id == '7') {
                $premium = $this->request->getPost('7_premium[]');
                $sum_insure = $this->request->getPost('7_si[]');
                $age_from = $this->request->getPost('7_age_from[]');
                $age_to = $this->request->getPost('7_age_to[]');
                for ($i = 0; $i < count($premium); $i++) {
                    $data['premium'] = str_replace(',', '', $premium[$i]);
                    $data['si'] = str_replace(',', '', $sum_insure[$i]);
                    $data['age_from'] = $age_from[$i];
                    $data['age_to'] = $age_to[$i];
                    $dataa = $this->policyPremium2Model->insert($data);
                }
                $data = $this->request->getPost();
                $insert = true;
            } else if ($policy_grid_id == '8') {
                $premium = $this->request->getPost('8_premium[]');
                $sum_insure = $this->request->getPost('8_si[]');
                $grade = $this->request->getPost('8_grade[]');
                for ($i = 0; $i < count($premium); $i++) {
                    $data['premium'] = str_replace(',', '', $premium[$i]);
                    $data['si'] = str_replace(',', '', $sum_insure[$i]);
                    $data['grade'] = $grade[$i];
                    $dataa = $this->policyPremium2Model->insert($data);
                }
                $data = $this->request->getPost();
                $insert = true;
            } else if ($policy_grid_id == '9') {

                $data['premium'] = str_replace(',', '', $this->request->getPost('gpa_premium'));
                $data['si'] = str_replace(',', '', $this->request->getPost('gpa_si'));

                $policyPremium = $this->policyPremium2Model->insert($data);
                // $premium = $this->request->getPost('9_premium[]');
                // $sum_insure = $this->request->getPost('9_si[]');
                // $grade = $this->request->getPost('9_grade[]');
                // for ($i = 0; $i < count($premium); $i++) {
                //     $data['premium'] = str_replace(',', '', $premium[$i]);
                //     $data['si'] = str_replace(',', '', $sum_insure[$i]);
                //     // $data['grade'] = $grade[$i];
                //     $dataa = $this->policyPremium2Model->insert($data);
                // }
                $data = $this->request->getPost();
                $insert = true;
            } else if ($policy_grid_id == '10') {
                $premium = $this->request->getPost('10_premium[]');
                $sum_insure = $this->request->getPost('10_si[]');
                $age_from = $this->request->getPost('10_age_from[]');
                $age_to = $this->request->getPost('10_age_to[]');
                for ($i = 0; $i < count($premium); $i++) {
                    $data['premium'] = str_replace(',', '', $premium[$i]);
                    $data['si'] = str_replace(',', '', $sum_insure[$i]);
                    $data['age_from'] = $age_from[$i];
                    $data['age_to'] = $age_to[$i];
                    $policyPremium = $this->policyPremium2Model->insert($data);
                }
                $data = $this->request->getPost();
                $insert = true;
            } else if ($policy_grid_id == '11') {

                $premium = $this->request->getPost('11_premium[]');
                $sum_insure = $this->request->getPost('11_si[]');
                $grade = $this->request->getPost('11_grade[]');
                $max_sum_insure = $this->request->getPost('11_max_si[]');
                for ($i = 0; $i < count($premium); $i++) {
                    $data['premium'] = str_replace(',', '', $premium[$i]);
                    $data['si'] = str_replace(',', '', $sum_insure[$i]);
                    $data['grade'] = $grade[$i];
                    $data['max_si'] = str_replace(',', '', $max_sum_insure[$i]);
                    $dataa = $this->policyPremium2Model->insert($data);
                }
                $data = $this->request->getPost();
                $insert = true;
            } else if ($policy_grid_id == '12') {

                $premium = $this->request->getPost('12_premium[]');
                $sum_insure = $this->request->getPost('12_si[]');
                $relationship = $this->request->getPost('12_relationship[]');
                for ($i = 0; $i < count($premium); $i++) {
                    $data['premium'] = str_replace(',', '', $premium[$i]);
                    $data['si'] = str_replace(',', '', $sum_insure[$i]);
                    $data['relationship'] = $relationship[$i];

                    $dataa = $this->policyPremium2Model->insert($data);
                }
                $data = $this->request->getPost();
                $insert = true;
            } else if ($policy_grid_id == '13') {

                $premium = $this->request->getPost('13_premium[]');
                $sum_insure = $this->request->getPost('13_si[]');
                $age_from = $this->request->getPost('13_age_from[]');
                $age_to = $this->request->getPost('13_age_to[]');
                $relationship = $this->request->getPost('13_relationship[]');

                for ($i = 0; $i < count($premium); $i++) {
                    $data['premium'] = str_replace(',', '', $premium[$i]);
                    $data['si'] = str_replace(',', '', $sum_insure[$i]);
                    $data['age_from'] = $age_from[$i];
                    $data['age_to'] = $age_to[$i];
                    $data['relationship'] = $relationship[$i];

                    $dataa = $this->policyPremium2Model->insert($data);
                }
                $data = $this->request->getPost();
                $insert = true;
            }

            if ($insert) {
                return $this->respond(['status' => true, 'code' => 200, 'data' => $data], 200);
            } else {
                return $this->respond(['status' => false, 'code' => 404, 'data' => $data, 'message' => 'no data found'], 200);
            }
        } catch (\Exception $e) {
            // Handle exceptions here
            echo 'Error: ' . $e->getMessage();
        }
    }



    public function getKycDocsById($id=null)
    {

        $this->myLogger->logme('error','getKycDocsById function called');
        if($id){
            $kyc_docs_data = $this->kycDocsModel->where(['kyc_type_id' => $id, 'is_active' => 1])->findAll();
            $this->myLogger->logme('error','getKycDocs status TRUE');
            return $this->respond(['status' => true,'code' => 200,'data' => $kyc_docs_data], 200);
        }else{
            $this->myLogger->logme('error','getKycDocs status FALSE');
            return $this->respond(['status' => false,'code' => 404, 'message' => 'no data found'], 200);
        }
    }

    public function getPolicesByInsurerId($id = null)
    {
        $this->myLogger->logme('error','getPolicesByInsurerId function called');
        if($id){
            $police_data = $this->policesModel
            ->select('policies.*, policy_type.policy_type')
            ->join('policy_type', 'policy_type.id = policies.policy_type_id')
            ->where(['insurer_id' => $id, 'policies.is_active' => 1])->findAll();
            return $this->respond(['status' => true,'code' => 200,'data' => $police_data], 200);
        }else{
            return $this->respond(['status' => false,'code' => 404, 'message' => 'no data found'], 200);
        }
    }

    public function getSingleBranchDataById($id=null)
    {

        $this->myLogger->logme('error','getSingleBranchDataById function called');
        if($id){
            $branch_data = $this->clientBranchModel->where(['id' => $id, 'is_active' => 1])->first();
            $branch_contact_data = $this->levelContactModel->where(['ref_id' => $id, 'contact_type'=>'client', 'is_active' => 1])->findAll();
            return $this->respond(['status' => true,'code' => 200,'data' => $branch_data, 'contact' => $branch_contact_data], 200);
        }else{
            return $this->respond(['status' => false,'code' => 404, 'message' => 'no data found'], 200);
        }

    }

    public function getClientPolicyById($id=null)
    {
        $this->myLogger->logme('error','getClientPolicyById function called');
        if($id){
            $client_policy_data = $this->clientPolicyModel->where(['id' => $id, 'is_active' => 1])->first();
            $insurer_id = $client_policy_data['insurer_id'];
            $client_id = $client_policy_data['client_id'];
            $polices = $this->policesModel->where(['insurer_id' => $insurer_id, 'is_active' => 1])->findAll();
            $client_policy_list = $this->clientPolicyModel->getpolicyWithPattern( $client_id );
            $cd_data = $this->CDMasterModel->where('client_id', $client_id)->where('insurer_id', $insurer_id)->findAll();
                                   
        
            return $this->respond(['status' => true,'code' => 200, 'client_policy_list' => $client_policy_list, 'data' => $client_policy_data, 'cd_data' => $cd_data, "insurer_id" => $client_policy_data['insurer_id'], 'policy' => $polices], 200);
        }else{
            return $this->respond(['status' => false,'code' => 404, 'message' => 'no data found'], 200);
        }

    }

    public function getpolicyGridData()
    {

        $client_policy_id = $this->request->getGet('client_policy_id');
        $record    = $this->clientPolicyModel->where('id', $client_policy_id)->first();
        $family_floater = '';
        if (isset(json_decode($record['policy_terms'])->family_floater)) {
            $family_floater = json_decode($record['policy_terms'])->family_floater;
        }

        $policy_terms_data = json_decode($record['policy_terms']);
        $self = "";
        if ($policy_terms_data !== null && isset($policy_terms_data->family_floaters)) {
            $self = $policy_terms_data->family_floaters;
        }

        // $emp_count = $this->employeeModel
        // ->join('client_policy cp', "employees.client_id = cp.client_id")
        // ->join('employee_polices ep', "cp.id = ep.client_policy_id AND employees.id = ep.employee_id")
        // ->where("employees.client_id", $record['client_id'])
        // ->where("employees.emp_status", 'active')
        // ->where("ep.status", 'active')
        // ->where("employees.is_active", 1)
        // ->where("ep.is_active", 1)
        // ->countAllResults();


        $emp_count = $this->employeePolicyModel
            ->join('client_policy cp', "cp.id = employee_polices.client_policy_id")
            ->where("employee_polices.client_policy_id", $client_policy_id)
            ->where("employee_polices.status", 'active')
            ->where("employee_polices.is_active", 1)
            ->countAllResults();


        $data = $this->policesModel->getPolicyPremium($record['policy_id']);
        $policy_name = $data[0]->policy_name;
        $gmc_pattern = '/gmc/i';
        $gpa_pattern = '/gpa/i';
        $subject = $data[0]->policy_type;
        $policy_type_id = $data[0]->id;

        if (preg_match($gmc_pattern, $subject)) {
            $search_term = 'GMC';
        } else if (preg_match($gpa_pattern, $subject)  || $policy_type_id == 6 || $policy_type_id == 7) {
            $search_term = 'GPA';
        } else {
            $search_term = "";
        }

        $results = $this->policyGridModel->like('policy_type', $search_term)->findAll();

        if ($search_term === 'GPA' || $policy_type_id == 6 || $policy_type_id == 7) {

            $premiumData = $this->policyPremium1Model->where(['client_id' => $record['client_id'], 'client_policy_id' => $client_policy_id, 'is_active' => 1])->findAll();
        } else if ($search_term === 'GMC') {

            $premiumData = $this->policyPremium2Model->where(['client_id' => $record['client_id'], 'client_policy_id' => $client_policy_id, 'is_active' => 1])->findAll();
        } else {

            $premiumData = "";
        }

        
        // echo '
';
        // print_r($premiumData); die;

        // echo $record['client_id'];
        // echo "-----";
        // echo $client_policy_id;
        // print_r($premiumData);die;
        // echo '
';
        // echo $family_floater;

        if ($search_term === 'GMC') {

            // $resultss = [];
            $resultss = $results;

            // try {
            //     foreach ($results as $index => $record) {
            //         // if ($self->self == 1 &&  $self->spouse == 0 &&  $self->childrens == 0 &&  $self->parents == 0 &&  $self->{'parents-in-law'} == 0 && $self->{'either-parents-pil'} == 0 && $family_floater == 0) {
            //         if ($family_floater == 1) {
            //             if ($index == '7' || $index == '8' || $index == '9' || $index == '10') {
            //                 $resultss[$index] = $record;
            //             }
            //         } else {
            //             if ($index == '0' || $index == '1' || $index == '2' || $index == '3' || $index == '4' || $index == '5' || $index == '6') {
            //                 $resultss[$index] = $record;
            //             }
            //         }
            //     }
            // } catch (\Exception $e) {
            //     $resultss = $results; // Reset $resultss to an empty array if an exception occurs
            // }



            $premiumDataa = '';
            if ($family_floater == 0) {
                // print_r($premiumData);die;
                if (count($premiumData) == 0) {
                    $premiumDataa = $premiumData;
                } else if ($premiumData[0]['policy_grid_id'] == '3' || $premiumData[0]['policy_grid_id'] == '4' || $premiumData[0]['policy_grid_id'] == '5' || $premiumData[0]['policy_grid_id'] == '6' || $premiumData[0]['policy_grid_id'] == '7' || $premiumData[0]['policy_grid_id'] == '8' || $premiumData[0]['policy_grid_id'] == '9') {
                    $premiumDataa = $premiumData;
                }
            } else if ($family_floater == 1) {
                if (count($premiumData) == 0) {
                    $premiumDataa = $premiumData;
                } else if ($premiumData[0]['policy_grid_id'] == '10' || $premiumData[0]['policy_grid_id'] == '11') {
                    $premiumDataa = $premiumData;
                }
            } else {
                $premiumDataa = $premiumData;
            }

            if ($premiumDataa  == "") {
                $premiumDataa = $premiumData;
            }

            // $premium1 = [];
            // $premium2 = [];

            // foreach ($premiumDataa as $key => $item) {
            //     if ($item['rack_rate_type'] == 0) {
            //         $premium1[] = $item;
            //     } elseif ($item['rack_rate_type'] == 1) {
            //         $premium2[] = $item;
            //     }
            // }

            // print_r($premium1);
            // print_r($premium2); die;

            return $this->respond(['status' => true, 'code' => 200, 'data' => $resultss, 'premiumData' => json_encode($premiumDataa), 'count' => $emp_count, 'policy_name' => $policy_name, 'family_floater' => $family_floater, 'self' => $self, 'client_policy_id' => $client_policy_id], 200);

        } else if ($search_term === 'GPA' || $policy_type_id == 6 || $policy_type_id == 7) {

            return $this->respond(['status' => true, 'code' => 200, 'data' => $results, 'premiumData' => json_encode($premiumData), 'count' => $emp_count, 'policy_name' => $policy_name, 'family_floater' => $family_floater, 'self' => $self, 'client_policy_id' => $client_policy_id], 200);
        } else {

            return $this->respond(['status' => false, 'code' => 200, 'data' => $results, 'premiumData' => json_encode($premiumData), 'count' => $emp_count, 'policy_name' => $policy_name, 'family_floater' => $family_floater, 'self' => $self, 'client_policy_id' => $client_policy_id], 200);
        }
    }

    public function policyGMCTerms()
    {
        try {
            // echo "
";
            // print_r($this->request->getPost());die;
            $this->myLogger->logme('error','Terms CREATE function called');
            
            /*** Client Policy Table Primary Key(ID) ***/
            $client_policy_id = $this->request->getPost("client_policy_id");

            $data['sum_insured']   =str_replace(',', '',$this->request->getPost("sum_insured"));
            $data['family_floater']   =$this->request->getPost("family_floater") ? $this->request->getPost("family_floater") : 0;
            // $data['corporatebuffer'] = $this->request->getPost("corporatebuffer") ? $this->request->getPost("corporatebuffer") : 0;
            $data['family_floaters'] = $this->request->getPost("family_floaters") ?? [];        
            
            $data['age_ratio']['self']['min'] =  $this->request->getPost("self_min_age") ? $this->request->getPost("self_min_age") :0;
            $data['age_ratio']['self']['max'] = $this->request->getPost("self_max_age") ? $this->request->getPost("self_max_age") : 0;
            $data['age_ratio']['spouse']['min'] = $this->request->getPost("spouse_min_age") ? $this->request->getPost("spouse_min_age") : 0;
            $data['age_ratio']['spouse']['max'] = $this->request->getPost("spouse_max_age") ? $this->request->getPost("spouse_max_age") : 0;
            $data['age_ratio']['child']['min'] = $this->request->getPost("child_min_age") ? $this->request->getPost("child_min_age") : 0;
            $data['age_ratio']['child']['max'] = $this->request->getPost("child_max_age") ? $this->request->getPost("child_max_age") : 0;
            $data['age_ratio']['elders']['min'] = $this->request->getPost("other_member_min_age") ? $this->request->getPost("other_member_min_age") :0;
            $data['age_ratio']['elders']['max'] = $this->request->getPost("other_member_max_age") ? $this->request->getPost("other_member_max_age") : 0;



                // if (!in_array("self", $data['family_floaters'])) {
                //     array_unshift($data['family_floaters'], "self");
                // }
                $temp_family_floaters = $data['family_floaters'];
                $data['family_floaters'] =[];
                    if (in_array("self",$temp_family_floaters) == 1) {
                        $data['family_floaters']['self'] =1;
                    }else{
                        $data['family_floaters']['self'] =0;
                    }

                    if (in_array("spouse",$temp_family_floaters) == 1) {
                        $data['family_floaters']['spouse'] =1;
                    }else{
                        $data['family_floaters']['spouse'] =0;
                    }

                    // $data['family_floaters']['either-parents-pil'] =0;

                    if (count($temp_family_floaters)) {
                        $children_value = 0;
                        $value = 0;

                        if(count($temp_family_floaters) == 2){
                            $children_value = 0;
                            $value = 1;
                        }else if(count($temp_family_floaters) == 3){
                            $children_value = 1;
                            $value = 2;
                        }else{
                            $children_value = 2;
                            $value = 3;
                        }
                        $data['family_floaters']['childrens'] =(int)$temp_family_floaters[$children_value];

                        if ($temp_family_floaters[$value] == '1P') {
                            $data['family_floaters']['parents'] =1;
                            $data['family_floaters']['parents-in-law'] =0;
                            $data['family_floaters']['either-parents-pil'] =0;
                        }else if($temp_family_floaters[$value] == '2P'){
                            $data['family_floaters']['parents'] =2;
                            $data['family_floaters']['parents-in-law'] =0;
                            $data['family_floaters']['either-parents-pil'] =0;
                        }else if($temp_family_floaters[$value] == '1PIL'){
                            $data['family_floaters']['parents'] =0;
                            $data['family_floaters']['parents-in-law'] =1;
                            $data['family_floaters']['either-parents-pil'] =0;
                        }else if($temp_family_floaters[$value] == '2PIL'){
                            $data['family_floaters']['parents'] =0;
                            $data['family_floaters']['parents-in-law'] =2;
                            $data['family_floaters']['either-parents-pil'] =0;
                        }else if($temp_family_floaters[$value] == '2EPORPIL'){
                            $data['family_floaters']['parents'] =1;
                            $data['family_floaters']['parents-in-law'] =1;
                            $data['family_floaters']['either-parents-pil'] =0;
                        }else if($temp_family_floaters[$value] == 'EPORPIL'){
                            $data['family_floaters']['parents'] =0;
                            $data['family_floaters']['parents-in-law'] =0;
                            $data['family_floaters']['either-parents-pil'] =1;
                        }else if($temp_family_floaters[$value] == '4EPORPIL'){
                            $data['family_floaters']['parents'] =2;
                            $data['family_floaters']['parents-in-law'] =2;
                            $data['family_floaters']['either-parents-pil'] =0;
                        }else{
                            $data['family_floaters']['parents'] =0;
                            $data['family_floaters']['parents-in-law'] =0;
                            $data['family_floaters']['either-parents-pil'] =0;
                        }
                    }

                    $data['family_floaters']['elders_count'] =$this->request->getPost("member_count") ? $this->request->getPost("member_count") : 0;

                    // print_r($data);die;

            $data['waiverofpreexistingdiseases']   =$this->request->getPost("waiverofpreexistingdiseases");
            if ($data['waiverofpreexistingdiseases'] == 1) {
                $data['maternitycoverage']   =str_replace(',', '',$this->request->getPost("maternitycoverage"));
                $data['twindelivery']   =str_replace(',', '',$this->request->getPost("twindelivery"));
                $data['preandpostnatal']   =str_replace(',', '',$this->request->getPost("preandpostnatal"));
                $data['babyday1cover']   =str_replace(',', '',$this->request->getPost("babyday1cover"));
            }else{
                $data['maternitycoverage']   ="";
                $data['twindelivery']   ="";
                $data['preandpostnatal']   ="";
                $data['babyday1cover']   ="";
            }
            $data['9monthwaitingperiodwaived'] =str_replace(',', '',$this->request->getPost("9monthwaitingperiodwaived"));
            $data['coverfromthedateofjoining'] =str_replace(',', '',$this->request->getPost("coverfromthedateofjoining"));
            $data['waiverof1,2,3&4thyearexclusions'] =$this->request->getPost("waiverof1,2,3&4thyearexclusions");
            $data['waiverof30dayswaitingperiod'] =$this->request->getPost("waiverof30dayswaitingperiod");
            $data['prehospitalizationcover'] =str_replace(',', '',$this->request->getPost("prehospitalizationcover"));
            // $data['posthospitalizationcover'] =$this->request->getPost("posthospitalizationcover");
            $data['congenitaldiseasesinternal'] =str_replace(',', '',$this->request->getPost("congenitaldiseasesinternal"));
            // $data['congenitaldiseasesexternal'] =$this->request->getPost("congenitaldiseasesexternal");
            $data['copayzonewisecopay'] =$this->request->getPost("copayzonewisecopay");
            $data['bioabsorbablestenttoriclensmultifocallens'] =$this->request->getPost("bioabsorbablestenttoriclensmultifocallens");
            $data['roomrentlimit'] =str_replace(',', '',$this->request->getPost("roomrentlimit"));
            $data['proportionatedeductionclause'] =str_replace(',', '',$this->request->getPost("proportionatedeductionclause"));
            // $data['nursingallowance'] =str_replace(',', '',$this->request->getPost("nursingallowance"));
            $data['ailmentcapping'] =str_replace(',', '',$this->request->getPost("ailmentcapping"));
            $data['ambulancecharges'] =str_replace(',', '',$this->request->getPost("ambulancecharges"));
            $data['airambulance'] =str_replace(',', '',$this->request->getPost("airambulance"));
            $data['familytransportationbenefit'] =str_replace(',', '',$this->request->getPost("familytransportationbenefit"));
            $data['reasonableandcustomarycharges'] =str_replace(',', '',$this->request->getPost("reasonableandcustomarycharges"));
            $data['ayudhtreatmentcover'] =str_replace(',', '',$this->request->getPost("ayudhtreatmentcover"));

            $data['congenitaldiseasesexternal'] =str_replace(',', '',$this->request->getPost("congenitaldiseasesexternal"));
            $data['optionalparentalcopay'] =str_replace(',', '',$this->request->getPost("optionalparentalcopay"));
            $data['posthospitalizationcover'] =str_replace(',', '',$this->request->getPost("posthospitalizationcover"));
            $data['corporatebuffer'] =str_replace(',', '',$this->request->getPost("corporatebuffer"));
            $data['sublimitofcorporatebuffer'] =str_replace(',', '',$this->request->getPost("sublimitofcorporatebuffer"));

            if ($data['ayudhtreatmentcover'] == 1) {
                $data['ayushTreatmentCoverData']   = str_replace(',', '',$this->request->getPost("ayushTreatmentCoverData"));
            }else{
                $data['ayushTreatmentCoverData']   ="";
            }

            $data['armdcovered'] =str_replace(',', '',$this->request->getPost("armdcovered"));
            $data['suminsuredenhancement'] =str_replace(',', '',$this->request->getPost("suminsuredenhancement"));
            $data['automaticsuminsuredreinstatement'] =str_replace(',', '',$this->request->getPost("automaticsuminsuredreinstatement"));
            $data['additionalsicknessbenefit'] =str_replace(',', '',$this->request->getPost("additionalsicknessbenefit"));
            $data['lasiksurgery'] =str_replace(',', '',$this->request->getPost("lasiksurgery"));
            $data['midterminclusion'] =str_replace(',', '',$this->request->getPost("midterminclusion"));
            $data['capd'] =str_replace(',', '',$this->request->getPost("capd"));
            $data['organdonorexpenses'] =str_replace(',', '',$this->request->getPost("organdonorexpenses"));
            $data['moderntreatmentsasperirdai'] =str_replace(',', '',$this->request->getPost("moderntreatmentsasperirdai"));
            $data['Wellness'] =str_replace(',', '',$this->request->getPost("Wellness"));
            $data['days_of_discharge'] =str_replace(',', '',$this->request->getPost("days_of_discharge"));
            $data['days_from_dod'] =str_replace(',', '',$this->request->getPost("days_from_dod"));
            $data['special_condition_label'] = str_replace(',', '',$this->request->getPost("special_condition_label")) ?? [];
            $data['special_condition_input'] = str_replace(',', '',$this->request->getPost("special_condition_input")) ?? [];
            $data['multiple_sum_insured'] = str_replace(',', '',$this->request->getPost("multiple_sum_insured")) ?? [];

            $data['cataract'] =str_replace(',', '',$this->request->getPost("cataract"));

            if ($data['cataract'] == 1) {
                $data['cataractData']   = str_replace(',', '',$this->request->getPost("cataractData"));
            }else{
                $data['cataractData']   ="";
            }


                $jsonData = json_encode($data);
                $dataa = array(
                    'policy_terms' => $jsonData,
                );

            $record = $this->clientPolicyModel->where('id', $client_policy_id)->first();

            // print_r($data);die;
            if ($record) {
                $update = $this->clientPolicyModel->update($client_policy_id, $dataa);
                if ($update) {
                    return $this->respond(['status' => true,'code' => 200,'message' => 'Data updated successfully'], 200);
                } else {
                    return $this->respond(['status' => false,'code' => 404, 'message' => 'Failed to update data'], 200);
                }
            }else{
                $insert = $this->clientPolicyModel->insert($dataa);        
                if ($insert) {
                    return $this->respond(['status' => true,'code' => 200,'message' => 'Data stored successfully'], 200);
                } else {
                    return $this->respond(['status' => false,'code' => 404, 'message' => 'Failed to store data'], 200);
                }
            }
        } catch (\Exception $e) {

            echo "Failed to insert data: " . $e->getMessage();
            // Log the error
            log_message('error', 'Failed to insert data: ' . $e->getMessage());
        }
        
    }
    
    public function getterms()
    {
        $client_policy_id = $this->request->getVar('client_policy_id');
        $record    = $this->clientPolicyModel->where('id', $client_policy_id)->first();
        $policy_name = $this->policesModel->select('name')->where('id', $record['policy_id'])->first();

        // $emp_count = $this->employeeModel ->join('client_policy cp',"employees.client_id = cp.client_id")
        //     ->join('employee_polices ep',"cp.id = ep.client_policy_id AND employees.id = ep.employee_id")
        //     ->where("employees.client_id", $record['client_id'])
        //     ->where("employees.emp_status",'active')
        //     ->countAllResults();

        $emp_count_by_policy = $this->employeePolicyModel
                        ->where('client_policy_id',$client_policy_id)
                        ->where("status", 'active')
                        ->where('is_active',1)
                        ->countAllResults();
        

        if ($record) {
            return $this->respond([
                'Status' => true,
                'code' => 200,        
                'data' => $record['policy_terms'],  
                'policy_name' => $policy_name,
                'policy_addon' => $record['is_addon'], 
                'emp_count_by_policy'=>$emp_count_by_policy],
            200);
        } else {
            return $this->respond(['Status' => false,'code' => 200,'message' => 'Record not found.',  'policy_name' => $policy_name], 200);
        }

    }

    public function policyGPATerms()
    {   
        try {
            $this->myLogger->logme('error','Policy GPA Terms CREATE function called');

            /*** Client Policy Table Primary Key(ID) ***/
            $client_policy_id = $this->request->getPost("client_policy_id");

            $data['sumInsured2']   =str_replace(',', '', $this->request->getPost("sumInsured2"));
            $data['totalSumInsured'] =str_replace(',', '',$this->request->getPost("totalSumInsured"));
            $data['age_ratio']['self']['min'] = $this->request->getPost("self_min_age");
            $data['age_ratio']['self']['max'] = $this->request->getPost("self_max_age");
            $data['accidentalDeathBenefit'] =str_replace(',', '',$this->request->getPost("accidentalDeathBenefit"));
            $data['permanentTotalDisablement'] =str_replace(',', '',$this->request->getPost("permanentTotalDisablement"));
            $data['permanentPartialDisablement'] =$this->request->getPost("permanentPartialDisablement");
            $data['temporaryTotalDisablementBenefit'] =$this->request->getPost("temporaryTotalDisablementBenefit");
            $data['accidentalHospitalizationExpenses'] =str_replace(',', '',$this->request->getPost("accidentalHospitalizationExpenses"));
            $data['childrenEducationWelfareFund'] =str_replace(',', '',$this->request->getPost("childrenEducationWelfareFund"));

            $data['compassionateVisitExpenses']   =$this->request->getPost("compassionateVisitExpenses");
            if ($data['compassionateVisitExpenses'] == 1) {
                $data['compassionateVisitExpensesData']   =$this->request->getPost("compassionateVisitExpensesData");
            }else{
                $data['compassionateVisitExpensesData']   ="";
            }

            $data['brokenBoneExpenses']   = str_replace(',', '',$this->request->getPost("brokenBoneExpenses"));
            if ($data['brokenBoneExpenses'] == 1) {
                $data['brokenBoneExpensesData']   = str_replace(',', '',$this->request->getPost("brokenBoneExpensesData"));
            }else{
                $data['brokenBoneExpensesData']   ="";
            }

            $data['ambulanceCharges']   =str_replace(',', '',$this->request->getPost("ambulanceCharges"));
            if ($data['ambulanceCharges'] == 1) {
                $data['ambulanceChargesData']   =str_replace(',', '',$this->request->getPost("ambulanceChargesData"));
            }else{
                $data['ambulanceChargesData']   ="";
            }

            $data['burnExpenses']   = $this->request->getPost("burnExpenses");
            if ($data['burnExpenses'] == 1) {
                $data['burnExpensesData']   = $this->request->getPost("burnExpensesData");
            }else{
                $data['burnExpensesData']   = "";
            }

            $data['carriageOfDeadBody']   = $this->request->getPost("carriageOfDeadBody");
            if ($data['carriageOfDeadBody'] == 1) {
                $data['carriageOfDeadBodyData']   = $this->request->getPost("carriageOfDeadBodyData");
            }else{
                $data['carriageOfDeadBodyData']   = "";
            }

            $data['animalSnakeInsectBite'] = $this->request->getPost("animalSnakeInsectBite");
            $data['terrorism']             = $this->request->getPost("terrorism");
            $data['worldwideCover']        = $this->request->getPost("worldwideCover");
            $data['gpa_special_condition_label'] = str_replace(',', '',$this->request->getPost("gpa_special_condition_label")) ?? [];
            $data['gpa_special_condition_input'] = str_replace(',', '',$this->request->getPost("gpa_special_condition_input")) ?? [];
            $data['multiple_sum_insured'] = str_replace(',', '',$this->request->getPost("multiple_sum_insured")) ?? [];



            $jsonData = json_encode($data);
            $dataa = array(
                'policy_terms' => $jsonData,
            );

            $record = $this->clientPolicyModel->where('id', $client_policy_id)->first();
            if ($record) {
                $update = $this->clientPolicyModel->update($client_policy_id, $dataa);
                if ($update) {
                    return $this->respond(['status' => true, 'code' => 200, 'message' => 'Data updated successfully', 'client_policy_id' => $client_policy_id], 200);
                } else {
                    return $this->respond(['status' => false,'code' => 404, 'message' => 'Failed to update data'], 200);
                }
            }else{
                $insert = $this->clientPolicyModel->insert($dataa);        
                if ($insert) {
                    return $this->respond(['status' => true,'code' => 200,'message' => 'Data stored successfully', 'client_policy_id' => $client_policy_id], 200);
                } else {
                    return $this->respond(['status' => false,'code' => 404, 'message' => 'Failed to store data'], 200);
                }
            }
        } catch (\Exception $e) {

            echo "Failed to insert data: " . $e->getMessage();
            log_message('error', 'Failed to insert data: ' . $e->getMessage());
        }
        
    }

    public function getPolicyGPATerms(){

        $client_id = $this->request->getVar('client_id');
        $policy_id = $this->request->getVar('policy_id');
        $record = $this->clientPolicyModel->where(['client_id' => $client_id, 'policy_id' => $policy_id])->first();

        if ($record) {
            echo $record['policy_terms'];
            
        } else {
            echo "Record not found.";
        }

    }

    public function updateClientPolicyStatus()
    {

        $client_policy_id = $this->request->getGet('client_policy_id');
        $message = 'Policy updated Successfully';


            $record    = $this->clientPolicyModel->where('id', $client_policy_id)->first();

            if ($record['open_for_enrollment'] == 0) {
                $open_for_enrollment_update_value = 1;
                $message = 'Enrollment Opened  Successfully';
            } else if ($record['open_for_enrollment'] == 1) {
                $open_for_enrollment_update_value = 0;
                $message = 'Enrollment Closed Successfully';
            }

            $data = $this->policesModel->getPolicyPremium($record['policy_id']);
            $pattern = '/gmc/i';
            $subject = $data[0]->policy_type;
            if (preg_match($pattern, $subject)) {
                $search_term = 'GMC';
            } else {
                $search_term = 'GPA';
            }

            if ($search_term === 'GPA') {
                $racRate = $this->policyPremium1Model->where(['client_id' => $record['client_id'], 'client_policy_id' => $client_policy_id, 'is_active' => 1])->countAllResults();
            } else if ($search_term === 'GMC') {
                $racRate = $this->policyPremium2Model->where(['client_id' => $record['client_id'], 'client_policy_id' => $client_policy_id, 'is_active' => 1])->countAllResults();
            }

            $termsData = $this->clientPolicyModel->where(['id' => $client_policy_id, 'is_active' => 1])->first();
            if (empty($termsData['policy_terms'])) {
                return $this->respond(['status' => false, 'code' => 200, 'message' => 'Please define policy terms '], 200);
            }


            $termsData = json_decode($termsData['policy_terms']);

            if (isset($termsData->sum_insured) && empty($termsData->sum_insured)) {
                return $this->respond(['status' => false, 'code' => 200, 'message' => 'The Policy terms Sum Insured field is empty', 'data' => $record], 200);
            }

            if (isset($termsData->SumInsured) && empty($termsData->sum_insured)) {
                return $this->respond(['status' => false, 'code' => 200, 'message' => 'The Policy terms Sum Insured field is empty'], 200);
            }

            // Check if 'family_floater' key exists and has a value
            if (isset($termsData->family_floater) && $termsData->family_floater == null) {
                return $this->respond(['status' => false, 'code' => 200, 'message' => 'The Policy terms Family Floater field is empty'], 200);
            }

            // Check if 'family_floaters' key exists and has a value
            if (isset($termsData->family_floaters) && is_array($termsData->family_floaters) && count($termsData->family_floaters) <= 0) {
                return $this->respond(['status' => false, 'code' => 200, 'message' => 'The Policy terms Family Members field is empty'], 200);
                $familyFloatersCount = count($termsData->family_floaters);
            }

            if ($racRate == 0) {

                return $this->respond(['status' => false, 'code' => 200, 'message' => 'Please define  policy premium'], 200);
            }

            // $policy_status = $this->clientPolicyModel->where('id', $client_policy_id )->set('policy_status', 1)->update();

            $json_data = '';
            $open_for_enrollment = $this->clientPolicyModel->where('id', $client_policy_id)->set('open_for_enrollment', $open_for_enrollment_update_value)->update();
            if ($open_for_enrollment) {
                $open_for_enrollment_1 = $this->clientPolicyModel->where('id', $client_policy_id)->find();
                $open_for_enrollment_value = $open_for_enrollment_1[0]['open_for_enrollment'];
                $client_policy_id_value = $client_policy_id;

                $json_data = json_encode(['open_for_enrollment' => $open_for_enrollment_value, 'client_policy_id' => $client_policy_id_value]);
            }



        return $this->respond(['status' => true, 'code' => 200, 'message' => $message, 'data' => $termsData, 'racRate' => $racRate, 'open_for_enrollment' => $json_data, 'client_policy_data' => $record], 200);
    }


    public function getClientPolicyList($client_id = null)
    {

        $record = $this->clientPolicyModel->getpolicyWithPattern( $client_id);

        if ($record) {
            return $this->respond(['Status' => true,'code' => 200,'data' => $record], 200);
        } else {
            return $this->respond(['Status' => false,'code' => 200,'message' => 'Record not found.'], 200);
        }

    }


    public function fetchPolicyDataForPolicyType($client_policy_id){

        $client_policy_id = $this->request->getGet('client_policy_id');
        $policy_type = $this->request->getGet('policy_type');

        $client_id = $this->clientPolicyModel->where('id', $client_policy_id)->first();
        $insurer_id = $client_id['insurer_id'];

        if( $policy_type == 2 ){

            $polices = $this->policesModel
                            ->select('policies.*')
                            ->join('policy_type', 'policy_type.id = policies.policy_type_id')
                            ->where('policy_type.policy_type', 'GMC - Top-up')
                            ->where(['policies.insurer_id' => $insurer_id, 'policies.is_active' => 1])->findAll();
        }else  if( $policy_type == 3 ){

            $polices = $this->policesModel
                            ->select('policies.*')
                            ->join('policy_type', 'policy_type.id = policies.policy_type_id')
                            ->whereIn('policy_type.policy_type', ['GMC - Parents', 'GMC - Top-up(Parents)'])
                            ->where(['policies.insurer_id' => $insurer_id, 'policies.is_active' => 1])->findAll();

        }


        $data = $this->clientPolicyModel->getClientPolicyByPolicyType($client_id['client_id'], $policy_type);

        return $this->respond(['Status' => true,'code' => 200,'data' => $data, 'client_policy_id' => $client_policy_id, 'policy' => $polices], 200);


    }


    public function downloadKYCDocument($file_name)
    {

        $file = WRITEPATH . 'uploads/client_kyc_documents/' . $file_name; // Example file path

        if (file_exists($file)) {
            return $this->response->download($file, null)->setFileName($file_name);
        } else {
            return "File not found.";
        }
    }


    public function getClientBranch($client_id){

         $branchs = $this->clientBranchModel
                ->select('*')
                ->where('client_id',$client_id)
                ->findAll();

        return $this->respond(['status' => true,'code' => 200, 'data' => $branchs], 200);


    }

    public function getClientAllDetailsByUsingClientID($client_id)
    {

        $db = \Config\Database::connect();

        $builder = $db->table('clients');
        $builder->select('
            policies.name as policy_name,
            policy_type.policy_type,
            insurers.name as insurer_name,
            insurers.short_name as insurer_short_name,
            tpa.name as tpa_name,
            tpa.short_name as tpa_short_name,
            client_policy.policy_terms,

            DATE_FORMAT(client_policy.policy_start_date, "%d-%b-%Y") as policy_start_date,
            DATE_FORMAT(client_policy.policy_end_date, "%d-%b-%Y") as policy_end_date,

            CASE
            WHEN client_policy.base_policy IS NULL THEN "Not Appear"
            WHEN client_policy.base_policy = 0 THEN "Not Appear"
            ELSE (SELECT policies.name 
                  FROM client_policy AS base_client_policy 
                  JOIN policies ON policies.id = base_client_policy.policy_id 
                  WHERE base_client_policy.id = client_policy.base_policy)
            END as base_policy_name,

            CASE
                WHEN client_policy.is_addon = 1 THEN "Base Policy"
                WHEN client_policy.is_addon = 2 THEN "SI Topup"
                WHEN client_policy.is_addon = 3 THEN "Dependent Addon"
                ELSE "n/a"
            END as is_addon,

            CASE
                WHEN client_policy.policy_status = 1 THEN "Active"
                WHEN client_policy.policy_status = 0 THEN "Expired"
                ELSE "n/a"
            END as policy_status,

            CASE
                WHEN client_policy.inception_type = 1 THEN "File Upload"
                WHEN client_policy.inception_type = 2 THEN "Enrollment"
                ELSE "n/a"
            END as inception_type,

            CASE
                WHEN client_policy.open_for_enrollment = 1 THEN "Open"
                WHEN client_policy.open_for_enrollment = 0 THEN "Closed"
                ELSE "n/a"
            END as open_for_enrollment,
            client_branch.branch_name 

        ', false);
        $builder->join('client_policy', 'client_policy.client_id = clients.id');
        $builder->join('client_branch', 'client_policy.client_branch_id = client_branch.id');
        $builder->join('policies', 'policies.id = client_policy.policy_id');
        $builder->join('policy_type', 'policy_type.id = policies.policy_type_id');
        $builder->join('insurers', 'insurers.id = client_policy.insurer_id');
        $builder->join('tpa', 'tpa.id = client_policy.tpa_id');
        $builder->where('clients.is_active', 1);
        $builder->where('client_policy.is_active', 1);
        $builder->where('policies.is_active', 1);
        $builder->where('policy_type.is_active', 1);
        $builder->where('client_policy.policy_status', 1);
        $builder->where('clients.id', $client_id);
        
        $query = $builder->get();
        $client_policy = $query->getResultArray();

        $gmc_keys = [
            "sum_insured" => "Sum Insured",
            "family_floater" => "Family Floater",
            "family_floaters" => "Family Floaters",
            "member_count" => "Elders Count:",
            "other_member_min_age" => "Min Age:",
            "other_member_max_age" => "Min Age:",
            "waiverofpreexistingdiseases" => "Waiver of Pre-existing Diseases",
            "9monthwaitingperiodwaived" => "9-month waiting Period –waived",
            "coverfromthedateofjoining" => "Cover from the date of Joining",
            "waiverof1,2,3&4thyearexclusions" => "Waiver of 1, 2, 3 & 4th year Exclusions",
            "waiverof30dayswaitingperiod" => "Waiver of 30 days waiting period",
            "prehospitalizationcover" => "Pre Hospitalization Cover",
            "congenitaldiseasesinternal" => "Congenital Diseases - Internal",
            "copayzonewisecopay" => "Co-Pay/Zone wise Co Pay",
            "bioabsorbablestenttoriclensmultifocallens" => "Bio absorbable stent / Toric lens/ Multi Focal lens",
            "roomrentlimit" => "Room Rent Limit",
            "proportionatedeductionclause" => "Proportionate Deduction Clause",
            "nursingallowance" => "Nursing Allowance",
            "ailmentcapping" => "Ailment capping",
            "ambulancecharges" => "Ambulance Charges",
            "airambulance" => "Air Ambulance",
            "familytransportationbenefit" => "Family Transportation Benefit",
            "reasonableandcustomarycharges" => "Reasonable and Customary Charges",
            "daycaretreatment" => "Day Care Treatment",
            "ayudhtreatmentcover" => "AYUSH treatment cover",
            "armdcovered" => "ARMD Covered",
            "suminsuredenhancement" => "Sum Insured enhancement",
            "automaticsuminsuredreinstatement" => "Automatic Sum Insured reinstatement",
            "additionalsicknessbenefit" => "Additional Sickness Benefit",
            "lasiksurgery" => "Lasik Surgery",
            "midterminclusion" => "Mid Term inclusion",
            "capd" => "CAPD",
            "organdonorexpenses" => "Organ donor expenses",
            "moderntreatmentsasperirdai" => "Modern treatments as per IRDAI",
            "Wellness" => "Wellness",
            "days_of_discharge" => "Claim Intimation Clause",
            "days_from_dod" => "Claim Submission",
            "cataract" => "Cataract"
        ];

        $gpa_keys = [
            "sumInsured2" => "Sum Insured",
            "totalSumInsured" => "Total Sum Assured",
            "self" => "Self",
            "self_min_age" => "Min Age",
            "self_max_age" => "Max Age",
            "accidentalDeathBenefit" => "Accidental Death Benefit",
            "permanentTotalDisablement" => "Permanent Total Disablement",
            "permanentPartialDisablement" => "Permanent Partial Disablement",
            "temporaryTotalDisablementBenefit" => "Temporary Total Disablement benefit",
            "accidentalHospitalizationExpenses" => "Accidental Hospitalization Expenses",
            "childrenEducationWelfareFund" => "Children Education Welfare Fund",
            "compassionateVisitExpenses" => "Compassionate Visit Expenses",
            "compassionateVisitExpensesData" => "Compassionate Visit Expenses Data",
            "brokenBoneExpenses" => "Broken Bone Expenses",
            "brokenBoneExpensesData" => "Broken Bone Expenses Data",
            "ambulanceCharges" => "Ambulance charges",
            "ambulanceChargesData" => "Ambulance charges Data",
            "burnExpenses" => "Burn Expenses",
            "burnExpensesData" => "Burn Expenses Data",
            "carriageOfDeadBody" => "Carriage of Dead Body",
            "carriageOfDeadBodyData" => "Carriage of Dead Body Data",
            "animalSnakeInsectBite" => "Animal/Snake/Insect bite",
            "terrorism" => "Terrorism",
            "worldwideCover" => "Worldwide Cover"
        ];
          



        foreach ($client_policy as $key => $value) {

            $policy_terms = json_decode($value['policy_terms'], true);
       
            $mapping = $gmc_keys;
            if ($value['policy_type'] == 'GPA') {
                $mapping = $gpa_keys;
            }
        
            $client_policy[$key]['policy_terms'] = $this->transformArray($policy_terms, $mapping);
        }




        $data['client_policy'] = $client_policy;
        $data['client_branch'] = $this->clientModel

            ->select('

                    client_branch.branch_name,
                    client_branch.branch_code,
                    client_branch.city,
                    level_contacts.name as hr_name,
                    level_contacts.designation,
                    level_contacts.mobile,
                    level_contacts.email
            ')
            ->join('client_branch', 'client_branch.client_id = clients.id')
            ->join('level_contacts', 'level_contacts.ref_id = client_branch.id')
            ->where('clients.is_active', 1)
            ->where('client_branch.is_active', 1)
            ->where('level_contacts.is_active', 1)
            ->where('level_contacts.contact_type', 'client')
            ->where('clients.id', $client_id)
            ->get()->getResultArray();


       $data['client'] = $this->clientModel
       ->select('clients.*, states.state as state')
       ->join('states', 'states.id = clients.state')
        ->where('clients.id', $client_id)->first();   
        
        
       $client_rm = $this->clientRMModel
       ->select('client_rm.*, user_profiles.first_name as user_name')
       ->join('user_profiles', 'user_profiles.id = client_rm.user_id')
       ->where('client_id', $client_id)->get()->getResultArray();   
       
       
       $account_managers = [];
       $managers = [];
       $heads = [];
       
       foreach ($client_rm as $key => $value) {
           if ($value['level'] == 3) {
               $account_managers[] = $value['user_name'];
           } elseif ($value['level'] == 2) {
               $managers[] = $value['user_name'];
           } elseif ($value['level'] == 1) {
               $heads[] = $value['user_name'];
           }
       }

       $data['account_managers'] = $account_managers;
       $data['managers'] = $managers;
       $data['heads'] = $heads;

        // dd($data);
        //$this->loadLayout('client_info', $data);


       $html = view('client_info', $data);
       return $this->respond(['status' => true,'code' => 200, 'data' => $html], 200);

    }



    public function transformArray($data, $mapping)
    {

        // dd($data);
        $transformedData = [];

        if (!is_array($data)) {
            return json_encode($transformedData, JSON_PRETTY_PRINT);
        }

        foreach ($data as $key => $value) {
            if ($key == 'family_floaters') {
                $transformedData[$key] = $this->transformFamilyFloaters($value, $data);
            } else if (array_key_exists($key, $mapping)) {
                $transformedData[$mapping[$key]] = $value;
            } else if ($key == 'special_condition_label') {

                foreach ($value as $key => $value) {
                    $transformedData[$value] = $data['special_condition_input'][$key];
                }
            } else if ($key == 'gpa_special_condition_label') {

                foreach ($value as $key => $value) {
                    $transformedData[$value] = $data['gpa_special_condition_input'][$key];
                }
            } else if ($key == 'age_ratio') {

                if (isset($data['sumInsured2'])) {

                    $transformedData['Self'] = "(Min: " . $data['age_ratio']['self']['min'] . ", Max: " . $data['age_ratio']['self']['max'] . ")";
                }
            } else {
                $transformedData[$key] = $value;
            }
        }

        return json_encode($transformedData, JSON_PRETTY_PRINT);
    }


    public function transformFamilyFloaters($familyFloaters, $json)
    {
        $result = [];

        $min = $json['age_ratio']['self'];
        $max = $json['age_ratio']['self'];

        $spouse_min = $json['age_ratio']['spouse'];
        $spouse_max = $json['age_ratio']['spouse'];

        $child_min = $json['age_ratio']['child'];
        $child_max = $json['age_ratio']['child'];

        $elders_min = $json['age_ratio']['elders'];
        $elders_max = $json['age_ratio']['elders'];

        foreach ($familyFloaters as $key => $value) {
            if ($value !== 0) {
                switch ($key) {
                    case 'self':
                        $result[] = "Self (Min: {$min['min']}, Max: {$max['max']})";
                        break;
                    case 'spouse':
                        $result[] = "Spouse (Min: {$spouse_min['min']}, Max: {$spouse_max['max']})";
                        break;
                    case 'childrens':
                        $result[] = "Children(s) - $value  (Min: {$child_min['min']}, Max: {$child_max['max']})";
                        break;
                    case 'parents':
                        $result[] = "Parent(s) - $value (Min: {$elders_min['min']}, Max: {$elders_max['max']})";
                        break;
                    case 'parents-in-law':
                        $result[] = "Parents-in-Law - $value  (Min: {$elders_min['min']}, Max: {$elders_max['max']})";
                        break;
                    case 'either-parents-pil':
                        $result[] = "Either Parents Nor Parents-in-Law - $value  (elders_min: {$elders_min['min']}, Max: {$elders_max['max']})";
                        break;
                }
            }
        }

        return implode(", ", $result);
    }


    public function deleteAdditionalRackRate($client_id, $client_policy_id, $rack_rate_type)
    {
        try {
            $result = $this->policyPremium2Model
                ->where('client_id', $client_id)
                ->where('client_policy_id', $client_policy_id)
                ->where('rack_rate_type', $rack_rate_type)
                ->set('is_active', 0)
                ->update();
    
            if (!$result) {

                return $this->respond(['status' => false,'code' => 200, 'message' => 'Failed to update the record.'], 200);
            }
        } catch (\Exception $e) {

            log_message('error', $e->getMessage());
            return $this->respond(['status' => false,'code' => 200, 'message' => 'Failed to update the record.'], 200);

        }
    
        return $this->respond(['status' => true,'code' => 200, 'message' => 'Additionaly Rack Rate Data Remove Successfully'], 200);
    }
    


    public function get_cd_ac($client_id, $insurer_id){

        $cd_data = $this->CDMasterModel->where('client_id', $client_id)->where('insurer_id', $insurer_id)->findAll();

        if($cd_data){
            return $this->respond(['status' => true, 'code' => 200, 'data' => $cd_data], 200);
        }else{
            return $this->respond(['status' => false, 'code' => 404, 'insurer_id' => $insurer_id, 'client_id' => $client_id], 200);
        }

    }


    public function otherPolicyTermsFormSubmit()
    {

        $client_policy_id = $this->request->getPost("client_policy_id");
        $policy_terms = $this->request->getPost("policy_terms");

        $record = $this->clientPolicyModel->where('id', $client_policy_id)->first();

        if ($record) {

            $update = $this->clientPolicyModel->where('id', $client_policy_id)->set('policy_terms',  $policy_terms)->update();

            if ($update) {
                return $this->respond(['status' => true, 'code' => 200, 'message' => 'Data updated successfully', 'client_policy_id' => $client_policy_id], 200);
            } else {
                return $this->respond(['status' => false, 'code' => 404, 'message' => 'Failed to update data', 'formdata' => $this->request->getPost()], 200);
            }
        } else {

            return $this->respond(['status' => false, 'code' => 404, 'message' => 'Failed to store data. The client policy does not exist', 'formdata' => $this->request->getPost()], 200);
        }
    }


    public function checkPolicyType($client_policy_id, $policy_type_id, $client_branch_id, $client_id){

        $policyCount = $this->clientPolicyModel
        ->where('policy_type_id', $policy_type_id) 
        ->where('client_branch_id', $client_branch_id)
        ->where('client_id', $client_id)
        ->countAllResults(); 

        if($policyCount > 0 ){
            $clientPoliceData =  $this->clientPolicyModel->getClientPolicyByClientId($client_id);
            return $this->respond(['status' => true,'code' => 200, 'count' =>  $policyCount, 'data' => $clientPoliceData, 'method' => 'CERATE' ,'client_id' => $client_id, 'client_branch_id' => $client_branch_id, 'policy_type_id' => $policy_type_id], 200);
        }else{
            return $this->respond(['status' => false,'code' => 200,'client_id' => $client_id, 'client_branch_id' => $client_branch_id, 'policy_type_id' => $policy_type_id], 200);
        }

    }


    public function getPolicyTerms($client_policy_id){

        $policy_terms = $this->clientPolicyModel->where('id', $client_policy_id)->first();

        if(isset($policy_terms['policy_terms']) && $policy_terms['policy_terms'] != null){

            $JSON = json_decode($policy_terms['policy_terms']);
            $si = $JSON->sum_insured ?? $JSON->sumInsured2;
            $multi_si = $JSON->multiple_sum_insured;
            $multi_si[] = $si;
        }else{
            $$multi_si = [];
        }

        return $this->respond(['status' => true, 'data'=>$multi_si], 200);
    }

}