myLogger = \Config\Services::mylogger(); $this->employeeModel = new EmployeeModel(); $this->employeePolicyModel = new EmployeePolicyModel(); $this->clientModel = new ClientModel(); $this->clientBranchModel = new ClientBranchModel(); $this->fileModel = new FileModel(); $this->batchListModel = new BatchListModel(); $this->batchFileModel = new BatchFileModel(); $this->empEndorsementModel = new EmpEndorsementModel(); $this->clientPolicyModel = new ClientPolicyModel(); $this->TPAModel = new TPAModel(); $this->policiesModel = new PolicesModel(); $this->insurerModel = new InsurerModel(); $this->cashDepositModel = new ClientDepositModel(); } public function list() { // $model = new UserModel(); $data = []; $data['status'] = ['draft' => 'Draft', 'active' => 'Active', 'inactive' => 'In-Active', 'pending' => 'Pending']; if (count($this->request->getGet())) { $filterData = $this->request->getGet(); $data['employees'] = $this->employeePolicyModel->getEmployeePolicy( client_id: $filterData['client_id'], policy_id: $filterData['policy_id'], branch_id: $filterData['branch_id'], emp_code : $filterData['emp_code'], emp_name : $filterData['emp_name'], status : $filterData['status'], ); // dd($this->employeePolicyModel->getLastQuery()); $data['getData'] = $filterData; } // dd( $data['getData']); // dd($this->request->getGet()); $this->myLogger->logme('error', 'list called'); $this->loadLayout('employee_list', $data); } public function getClientWithPolicies() { //echo $this->request->isAJAX();die(); $result = $this->clientModel->clientsWithPolicies(); // dd($result); // print_r($result);die(); if (!count($result)) { return $this->respond(['dataStatus' => false, 'code' => 404, 'message' => 'no data found'], 200); } else { return $this->respond(['dataStatus' => true, 'code' => 200, 'data' => $result], 200); } } public function getUploadedFileError() { $file_id = $this->request->uri->getSegment(3); // dd($segments[2]); // die(); // $file_id = $this->request->getGet(); // echo $file_id;die(); $file = $this->fileModel->find($file_id); // print_r($result);die(); if (!isset($file)) { return $this->respond(['dataStatus' => false, 'code' => 404, 'message' => 'no data found'], 200); } else { return $this->respond(['dataStatus' => true, 'code' => 200, 'data' => $file['reason']], 200); } } //handles employee & dependent bulk upload with events like inception,addition,deletion, correction and SI enhancements public function employeesUplodWithEvents() { // $empDataServiceController = new EmpDataServiceController(); // !dd($empDataServiceController->importInceptionUpdateTPAandUHID(['file_id' => 79])); // $job_details = new Jobs(); // $r = Jobs::addJob(['job_name' => 'add','payload' => ['a' => 10, 'b' => 35]]); // print_r($r);//die(); // // $jobWorker = new JobWorker(); // JobWorker::processJob($r); // die(); // echo $this->request->getMethod();die(); // print_r($this->request->getFiles('emplist'));print_r($this->request->getPost('emplist')); // print_r($this->request->getPost('clients')); // print_r($this->request->getPost('policies')); // print_r($this->request->getPost('upload-action-type')); // die(); // $empServiceController = new EmployeeServiceController(); // $res = $empServiceController->excelFileFormatValidation(['file_id' => '42']); // dd($res); // $empServiceController = new EmployeeServiceController(); // $res = $empServiceController->employeeDisembark(['file_id' => '586']); // dd($res); // $existing_famility_details = $this->employeeModel->getEmpFamilybyEmpCode(client_policy_id: '2'); // dd($existing_famility_details); // $empServiceController = new EmployeeServiceController(); // $res = $empServiceController->employeesSIEnhanceProcess(['file_id' => '38']); // dd($res); // $empServiceController = new EmployeeServiceController(); // $res = $empServiceController->employeesCorrectionProcess(['file_id' => '37']); // // dd($res); // $empServiceController = new EmployeeServiceController(); // $res = $empServiceController->employeesOnboardPreprocess(['client_policy_id' => '3']); // dd($res); // $empServiceController = new EmployeeServiceController(); // $res = $empServiceController->employeeDisembark(['file_id' => '36']); // dd($res); // if(isset($res['error_summary']) && count($res['error_summary'])) // { // $res['error_summary'] = (array_count_values($res['error_summary'])); // $failure_reason = ((json_encode($res))); // // dd($failure_reason); // $this->fileModel->where('id', '12')->set(['status' => 'failed','reason' => $failure_reason])->update(); // dd($failure_reason); // } if ($this->request->getMethod() == 'post') { //validate uploaded file $filename = ''; $validated = $this->validate([ 'emplist' => [ 'uploaded[emplist]', 'mime_in[emplist,application/vnd.ms-excel,application/vnd,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.oasis.opendocument.spreadsheet]', 'max_size[emplist,16384]', ], ]); if ($validated) { $avatar = $this->request->getFile('emplist'); if (!$avatar) { $this->myLogger->logme("error", 'File not found'); return $this->respond(['dataStatus' => false, 'code' => 400, 'message' => 'File not found'], 400); } $is_moved = $avatar->move(WRITEPATH . 'uploads/excel/'); if ($is_moved) { $filename = $avatar->getName(); // Handle successful upload, e.g., log success or further processing $this->myLogger->logme("error", 'File move successful'); } else { $this->myLogger->logme("error", 'File move failed'); return $this->respond(['dataStatus' => false, 'code' => 500, 'message' => 'File move failed'], 500); } } else { $this->myLogger->logme("error", 'Upload failed Invalid file'); return $this->respond(['dataStatus' => false, 'code' => 404, 'message' => 'Invalid file'], 404); } //process post variable entry in file table $loggedInUserID = get_session_userid(); // dd($loggedInUserID); // $loggedInUserID = 8; $client_id = $this->request->getPost('client_id'); $policy_id = $this->request->getPost('policy_id'); $branch_id = $this->request->getPost('branch_id'); $action = $this->request->getPost('upload-action-type'); $status = 'inprogress'; $file_id = $this->fileModel->insert(['file_name' => $filename, 'client_id' => $client_id, 'policy_id' => $policy_id, 'created_by' => $loggedInUserID, 'status' => $status, 'action' => $action, 'client_branch_id' => $branch_id,'uploaded_by' => 1]); //here field policy_id have client_policy_id and not policy id from policy master $this->myLogger->logme("error", '{file_id} uploaded success', ['file_id' => $file_id]); //start validation process $empServiceController = new EmployeeServiceController(); $result = $empServiceController->excelFileFormatValidation(['file_id' => $file_id]); //endof validation process if (isset($result['error_summary']) && count($result['error_summary'])) { return $this->respond(['dataStatus' => false, 'code' => 404, 'message' => 'file rejected with errors'], 200); } return $this->respond(['dataStatus' => true, 'code' => 200, 'data' => 'file upload success'], 200); } $data['page_name'] = 'View Inception'; //for TPA/insurer upload $data['events'] = ['inception' => 'Inception (Employee + Dependents)', 'missed_inception' => 'Missed Inception (Employee + Dependents)', 'addition' => 'Addition (Employee + Dependents)', 'dependent_addition' => 'Dependent Addition (Only Dependents)', 'deletion' => 'Deletion', 'correction' => 'Correction', 'si_enhancement' => 'SI Enhancement']; //for inception upload $data['actions'] = ['inception' => 'Inception (Employee + Dependents)', 'missed_inception' => 'Missed Inception (Employee + Dependents)', 'addition' => 'Addition (Employee + Dependents)', 'dependent_addtion' => 'Dependent Addition (Only Dependents)', 'deletion' => 'Deletion', 'correction' => 'Correction', 'si_enhancement' => 'SI Enhancement','enrollment' => 'Enrolment']; $data['import_or_export'] = ['import' => 'Import', 'export' => 'Export']; $data['insurer_or_tpa'] = ['insurer' => 'Insurer', 'tpa' => 'TPA']; // $data['fileList'] = $this->fileModel // ->select(['files.*', 'up.emp_code', 'up.first_name', 'pm.name as policy_name', 'c.short_name', 'cp.id as client_policy_id']) // ->join('user_profiles up', 'files.created_by = up.id') // ->join('client_policy cp', 'files.policy_id = cp.id', 'left') // ->join('policies pm', 'cp.policy_id = pm.id', 'left') // ->join('clients c', 'files.client_id = c.id and files.client_id = cp.client_id', 'left') // ->where('files.created_by', get_session_userid())->orderBy('files.created_at', 'desc')->findAll(); // dd($this->fileModel->getLastQuery()); $data['fileList'] = $this->fileModel ->select([ 'files.*', 'up.emp_code', 'up.first_name', 'c.short_name', 'cb.branch_name', 'cp.id as client_policy_id', '(SELECT COUNT(*) FROM employees e JOIN employee_polices ep ON e.id = ep.employee_id WHERE e.file_id = files.id AND ep.client_policy_id = files.policy_id) as employee_count', '(SELECT SUM(ep.rata_premimum) + SUM(ep.gst) FROM employees e JOIN employee_polices ep ON e.id = ep.employee_id WHERE e.file_id = files.id AND ep.client_policy_id = files.policy_id) as total', 'policy_type.policy_type' , 'cp.policy_no' , ]) ->join('user_profiles up', 'files.created_by = up.id') ->join('client_policy cp', 'files.policy_id = cp.id', 'left') ->join('client_branch cb', 'files.client_branch_id = cb.id', 'left') ->join('policy_type', 'policy_type.id = cp.policy_type_id') ->join('clients c', 'files.client_id = c.id and files.client_id = cp.client_id', 'left') ->where('files.created_by', get_session_userid()) ->orderBy('files.created_at', 'desc') ->findAll(); // dd($data['fileList']); $data['batch_list'] = $this->batchFileModel->select( 'batch_files.*, clients.short_name as client_short_name, client_branch.branch_name, client_policy.policy_no, policy_type.policy_type ') ->join('client_policy', 'client_policy.id = batch_files.client_policy_id') ->join('client_branch', 'client_branch.id = batch_files.client_branch_id') ->join('policy_type', 'policy_type.id = client_policy.policy_type_id') ->join('clients', 'clients.id = client_policy.client_id') ->orderBy('batch_files.id', 'desc') ->findAll(); // dd($data['fileList']);die(); if ($this->request->getMethod() == "get") { $this->loadLayout('import_export', $data); } } public function getExcelFileErrors() { $file_id = $this->request->uri->getSegment(3); $empServiceController = new EmployeeServiceController(); // Render views and capture output $result = $empServiceController->getExcelErrorData($file_id); if ($result != 0) { $result['file_id'] = $file_id; echo view('excel_errors', $result); } else if ($result == 0) { $data['message'] = 'File Not Found Physically'; return view('errors/404', $data); } else { echo view('errors/html/production'); } } /** * The below function Downloads a sample Excel file based on the provided action type. * * @param string|null $actionType The type of action : * * - inception * - correction * - si_enhancement for selecting the appropriate sample Excel file. * * @return redirect back with an error message if the file is not found, otherwise sends the file to the user for download. */ public function downloadSampleExcelFile($actionType = null) { // $actionType = $this->request->getGet(); $filePath = ''; // Path to your file if ($actionType == 'inception') { $filePath = ROOTPATH . 'public/sample_excel/sample_inception.xls'; } else if ($actionType == 'correction') { $filePath = ROOTPATH . 'public/sample_excel/sample_correction .xls'; } else if ($actionType == 'si_enhancement') { $filePath = ROOTPATH . 'public/sample_excel/sample_si_enhancement.xls'; } else if ($actionType == 'dependent_addtion') { $filePath = ROOTPATH . 'public/sample_excel/sample_dependent_addition.xls'; } else if ($actionType == 'addition') { $filePath = ROOTPATH . 'public/sample_excel/sample_addition.xls'; } else if ($actionType == 'deletion') { $filePath = ROOTPATH . 'public/sample_excel/sample_deletion.xls'; } else if ($actionType == 'enrollment') { $filePath = ROOTPATH . 'public/sample_excel/enrollment.xlsx'; }else if ($actionType == 'missed_inception') { $filePath = ROOTPATH . 'public/sample_excel/sample_inception.xls'; } // Check if the file exists if (file_exists($filePath)) { // Set the appropriate MIME type $mimeType = mime_content_type($filePath); // Send the file to the client for download return $this->response->download($filePath, null, $mimeType); } else { // File not found, show an error message or redirect echo view('errors/html/production'); } } /** * The below function are Handles import and export operations based on the provided parameters. * * This function logs the call, retrieves necessary data, generates a filename, * and then either exports data to an Excel file or imports data from an Excel file * depending on the provided action type and event type. * * @return void Redirects the user to the appropriate page with flash messages indicating success or failure. */ public function importExport() { $array = $this->request->getPost('event_type'); if (is_array($array)) { $event_type = 'MultipleEvents'; } else { $event_type = $this->request->getPost('event_type'); } $this->myLogger->logme('error', 'Import Export -- Function called'); $empDataServiceController = new EmpDataServiceController(); $client_id = $this->request->getPost('client_id'); $client_policy_id = $this->request->getPost('client_policy_id'); $client_branch_id = $this->request->getPost('client_branch_id'); $insurer_or_tpa = $this->request->getPost('insurer_or_tpa'); $actions = $this->request->getPost('action_type'); $client_data = $this->clientPolicyModel->getCliendDataForExcelFileName($client_policy_id); $file_name = generate_filename($client_data['short_name'], $event_type, $actions, $insurer_or_tpa, $client_data['policy_type'], $client_data['branch_code']); // dd($client_data, $file_name); $batch_data = [ 'client_id' => $client_id, 'client_policy_id' => $client_policy_id, 'client_branch_id' => $client_branch_id, 'insurer_or_tpa' => $insurer_or_tpa, 'event_type' => $event_type, 'actions' => $actions, 'file_name' => $file_name, ]; if ($actions == 'export') { if ($event_type == 'inception' || $event_type == 'addition' || $event_type == 'dependent_addition' || $event_type == 'missed_inception') { $return = $empDataServiceController->generateExcelForAdditionandInception($batch_data); if ($return === 0) { session()->setFlashdata('error', "Insufficient deposit amount."); return redirect()->to(base_url('employee/upload')); }else if($return === 5){ session()->setFlashdata('error', "The policy does not have a CD account number."); return redirect()->to(base_url('employee/upload')); } else if($return === 6){ session()->setFlashdata('error', "The Insurer does not have an Excel export template format."); return redirect()->to(base_url('employee/upload')); } if (!$return) { if ($insurer_or_tpa == 'tpa') { session()->setFlashdata('error', "No data was found for this action."); return redirect()->to(base_url('employee/upload')); } else if ($insurer_or_tpa == 'insurer') { session()->setFlashdata('error', "No data was found for this action."); return redirect()->to(base_url('employee/upload')); } } else { $this->myLogger->logme('error', 'Successfully exported Excel file in {data}.', ['data' => $event_type]); } } else if ($event_type == 'correction') { $return = $empDataServiceController->generateExcelForCorrection($batch_data); if($return === 6){ session()->setFlashdata('error', "The Insurer does not have an Excel export template format."); return redirect()->to(base_url('employee/upload')); } if (!$return) { session()->setFlashdata('error', 'No data found about this action'); return redirect()->to(base_url('employee/upload')); } else { $this->myLogger->logme('error', 'Successfully exported Excel file in Correction.'); } } else if ($event_type == 'si_enhancement') { $return = $empDataServiceController->generateExcelForSIEnhancement($batch_data); if ($return === 0) { session()->setFlashdata('error', "Insufficient deposit amount."); return redirect()->to(base_url('employee/upload')); }else if($return === 5){ session()->setFlashdata('error', "The policy does not have a CD account number."); return redirect()->to(base_url('employee/upload')); }else if($return === 6){ session()->setFlashdata('error', "The Insurer does not have an Excel export template format."); return redirect()->to(base_url('employee/upload')); } if (!$return) { session()->setFlashdata('error', 'No data found about this action'); return redirect()->to(base_url('employee/upload')); } else { $this->myLogger->logme('error', 'Successfully exported Excel file in SI_Enhancement.'); } } else if ($event_type == 'deletion') { $return = $empDataServiceController->generateExcelForDeletion($batch_data); if($return === 6){ session()->setFlashdata('error', "The Insurer does not have an Excel export template format."); return redirect()->to(base_url('employee/upload')); } if (!$return) { session()->setFlashdata('error', 'No data found about this action'); return redirect()->to(base_url('employee/upload')); } else { $this->myLogger->logme('error', 'Successfully exported Excel file in Deletion.'); } } else if($event_type == 'MultipleEvents'){ $batch_data['event_type'] = $array; $return = $empDataServiceController->generateExcelForAllEventType($batch_data); if($return === 6){ session()->setFlashdata('error', "The Insurer does not have an Excel export template format."); return redirect()->to(base_url('employee/upload')); } if (!$return) { session()->setFlashdata('error', 'No data found about this action'); return redirect()->to(base_url('employee/upload')); } else { $this->myLogger->logme('error', 'Excel exported successfully.'); } } } else if ($actions == 'import') { $batch_data['file'] = $this->request->getFile('import_file_data'); $file = $this->request->getFile('import_file_data'); $is_moved = $file->move(WRITEPATH . 'uploads/import_excel'); $filename = $file->getName(); $this->myLogger->logme('error', 'Inception Import file name : {data}', ['data' => $filename]); $random_number_count = 4; $batch_data['batch_code'] = generate_random_string($random_number_count); $batch_data['created_by'] = get_session_userid(); $batch_data['status'] = 'pending'; $batch_data['file_name'] = $filename; if ($event_type == 'inception' || $event_type == 'addition' || $event_type == 'dependent_addition' || $event_type == 'missed_inception') { $file_id = $this->batchFileModel->insert($batch_data); $job_details = new Jobs(); $r = Jobs::addJob(['job_name' => 'importInceptionFileValidation', 'payload' => ['file_id' => $file_id]]); $return = 1; // $return = $empDataServiceController->importInceptionFileValidation(['file_id' => $file_id]); if ($return == 1) { session()->setFlashdata('success', 'File Uploaded Successfully File is being validated.'); return redirect()->to(base_url('employee/upload')); } else { session()->setFlashdata($return['status'], $return['message']); return redirect()->to(base_url('employee/upload')); } } else if ($event_type == 'correction') { $file_id = $this->batchFileModel->insert($batch_data); $job_details = new Jobs(); $r = Jobs::addJob(['job_name' => 'importCorrectionValidation', 'payload' => ['file_id' => $file_id]]); $return = 1; // $return = $empDataServiceController->importCorrectionValidation(['file_id' => $file_id]); if ($return == 1) { session()->setFlashdata('success', 'File Uploaded Successfully File is being validated.'); return redirect()->to(base_url('employee/upload')); } else { session()->setFlashdata('error', $return); return redirect()->to(base_url('employee/upload')); } } else if ($event_type == 'si_enhancement') { $file_id = $this->batchFileModel->insert($batch_data); $job_details = new Jobs(); $r = Jobs::addJob(['job_name' => 'importSIEnhancementValidation', 'payload' => ['file_id' => $file_id]]); $return = 1; // $return = $empDataServiceController->importSIEnhancementValidation(['file_id' => $file_id]); if ($return == 1) { session()->setFlashdata('success', 'File Uploaded Successfully File is being validated.'); return redirect()->to(base_url('employee/upload')); } else { session()->setFlashdata('error', $return); return redirect()->to(base_url('employee/upload')); } } else if ($event_type == 'deletion') { $file_id = $this->batchFileModel->insert($batch_data); $job_details = new Jobs(); $r = Jobs::addJob(['job_name' => 'importDeletionValidation', 'payload' => ['file_id' => $file_id]]); $return = 1; // $return = $empDataServiceController->importDeletionValidation(['file_id' => $file_id]); if ($return == 1) { session()->setFlashdata('success', 'File Uploaded Successfully File is being validated.'); return redirect()->to(base_url('employee/upload')); } else { session()->setFlashdata('error', $return); return redirect()->to(base_url('employee/upload')); } } } } // ------------------------------------------------------------------------------------------- /** * Below function displays the endorsement list page. * * This method retrieves filter data from the request and fetches the endorsement list * based on the provided filters such as client ID, policy ID, and status. */ public function endorsementList() { $data = []; $data['status'] = ['pending' => 'Pending', 'inprogress' => 'In-Progress', 'complete' => 'Complete']; if (count($this->request->getGet())) { $filterData = $this->request->getGet(); $data['employees'] = $this->employeePolicyModel->getEmployeeEndorsementList( client_id: $filterData['client_id'], policy_id: $filterData['policy_id'], status: $filterData['status'], branch_id: $filterData['branch_id'] ); $data['getData'] = $filterData; // echo "
";
            // print_r($data); die;
        }

        $this->myLogger->logme('error', 'list called');
        $this->loadLayout('endorsement_list', $data);
    }

    
    /**
     * Below function displays the Enrollment list page.
     * 
     * This method retrieves filter data from the request and fetches the Enrollment list
     * based on the provided filters such as client , client_branch , employee - ( Log-in-or-not , ENrolled-or-not).
     */

     public function enrollmentClientList()
     {
        $data = [];
        $client_list = $this->clientModel->findAll();
        $branch_list = $this->clientBranchModel->findAll();
        $data['client_list'] = $client_list;
        $data['branch_list'] = $branch_list;

        // Get session data if available
        $data['selected_client_id'] = session()->get('client_id');
        $data['selected_branch_id'] = session()->get('branch_id');
        $data['selected_type'] = session()->get('type');

        $this->myLogger->logme('error', 'list called');
        return $this->loadLayout('enrollment_list', $data);
    
     }

     public function empby_client_clientbranch($client_id, $branch_id)
     {
        
        $results = $this->clientModel->select('employees.id as employee_id, employees.name as employee_name, 
                                                employees.relationship, employees.emp_code, 
                                                employees.emp_status, auth_history.user_type')
                                    ->join('employees', $client_id .'= employees.client_id AND ' . $branch_id . '= employees.client_branch_id', 'left')
                                    ->join('auth_history', 'employees.id = auth_history.user_id AND "employee" = auth_history.user_type', 'left')
                                    ->findAll();
        
        $groupedData = [];
        $employeeId = '';
        foreach ($results as $row) {
            if($employeeId != $row['employee_id']){
                $employeeId = $row['employee_id'];
            }else{
                $employeeId = null;
            }
            $employeeName = $row['employee_name'] ;
            $employeeRelationship = $row['relationship'] ;
            $employeeEmpCode =  $row['emp_code'] ;
            $employeeEmpStatus = $row['emp_status'];
            $employeeUserType = $row['user_type'];
    
          
            if ($employeeId !== null && $employeeRelationship == 'Self') {
                // Append employee info to the branch's employees list
                $groupedData[] = [
                    'employee_id' => $employeeId,
                    'employee_name' => $employeeName,
                    'relationship' => $employeeRelationship,
                    'emp_code' => $employeeEmpCode,
                    'emp_status' => $employeeEmpStatus,
                    'user_type' => $employeeUserType
                ];
              
            }
            $employeeId = $row['employee_id'];
        }
                            
        
        return json_encode($groupedData);
     }

     


    /**
     * Beleo function retrieves employee endorsement (emp_endorsement table) data.
     *
     * This method fetches endorsement data based on the provided ID.
     * It determines the type of endorsement action (SI enhancement, deletion, or other),
     * formats the data accordingly, and returns it as a response.
     *
     * @param int|null $id The ID of the endorsement entry to retrieve.
     * @return \CodeIgniter\HTTP\Response Returns a JSON response containing the endorsement entry data.
     */
    public function getEmpEndoresmentEntry($id = null)
    {
        // Create instance of EmpDataServiceController
        $empDataServiceController = new EmpDataServiceController();

        // Check if $id is provided
        if ($id) {
            // Retrieve group key and actions based on $id
            $group_key_actions = $this->empEndorsementModel->select('group_key, actions')->where('id', $id)->first();
            $groupedData = $this->empEndorsementModel->where('group_key', $group_key_actions['group_key'])->findAll();

            // If group key and actions are found
            if ($group_key_actions) {
                // Retrieve endorsement data based on actions
                switch ($group_key_actions['actions']) {
                    case 'si':
                        $data = $this->empEndorsementModel->getDataForEnodrsementListinSIEnhancement($group_key_actions['group_key']);
                        $formatedData = $empDataServiceController->convertRowTColumnForSIEnhancement($data);
                        break;
                    case 'd':
                        $data = $this->empEndorsementModel->getDataForEnodrsementListinDeletion($group_key_actions['group_key']);
                        $formatedData = $empDataServiceController->convertRowTColumnForDeletion($data);
                        break;
                    default:
                        $formatedData = $groupedData;
                        $formatedData[0]['field_name'] = remove_underscore_capitalize_first_letter($formatedData[0]['field_name']);
                        $formatedData[0]['old_value'] = formatDateOrReturn($formatedData[0]['old_value']);
                        $formatedData[0]['new_value'] = formatDateOrReturn($formatedData[0]['new_value']);
                        break;
                }

                // Return response with data
                return $this->respond([
                    'dataStatus' => true,
                    'code' => 200,
                    'data' => $formatedData,
                    'data2' => $groupedData
                ], 200);
            } else {
                // Return response if group key and actions are not found
                return $this->respond(['dataStatus' => false, 'code' => 404, 'message' => 'no data found'], 200);
            }
        } else {
            // Return response if $id is not provided
            return $this->respond(['dataStatus' => false, 'code' => 404, 'message' => 'no data found'], 200);
        }
    }


    // @param int $client_policy_id
    // this funciton initiate Inception/adition/DA of employees data only form enrollment app when passing
    // client_policy_id pull draft and enrolled status employees and proceed to calculatin and make entry in DB
    public function initiateManualEmployeesOnboardProcess($client_policy_id)
    {
        $client_data = $this->clientPolicyModel->select('clients.client_name as client_name, policies.name as policy_name,client_branch_id')
            ->join('clients', 'clients.id = client_policy.client_id')
            ->join('policies', 'policies.id = client_policy.policy_id')
            ->where('client_policy.id', $client_policy_id)
            ->first();

        $empServiceController = new EmployeeServiceController();
        $res = $empServiceController->employeesOnboardPreprocess(['client_policy_id' => $client_policy_id,'client_branch_id' => $client_data['client_branch_id']]);
        // dd($res);

        $count = count($res);
        $message =  $count . ' Employees are Initiate Onboard Process againts Client ' . $client_data['client_name'] . ' and the Policy is ' . $client_data['policy_name'];
        session()->setFlashdata('success1',  $message);
        return redirect()->to(base_url('/employee/upload'));
    }

    public function downloadFileList($file_id = null)
    {
        // $actionType = $this->request->getGet();
        $file_data = $this->fileModel->where('id', $file_id)->first();
        $fileName = $file_data['file_name'];

        $error_data = json_decode($file_data['reason']);

        $filePath = WRITEPATH . '/uploads/excel/' . $fileName;

        try {

            // Check if the file exists
            if (file_exists($filePath)) {
                // Set the appropriate MIME type
                $mimeType = mime_content_type($filePath);

                // Send the file to the client for download
                return $this->response->download($filePath, null, $mimeType);
            } else {

                $data['message'] = 'The Physical File Not Found';
                echo view('errors/404', $data);
            }
        } catch (\Exception $e) {
            // Handle any exceptions
            $errorMessage = $e->getMessage();
            $this->myLogger->logme('error', $errorMessage);
            // You can return an error response here
            echo $errorMessage;
        }
    }

    public function featchEmpList()
    {
        $client_id = $this->request->getGet('client_id');
        $policy_id = $this->request->getGet('policy_id');

        $emp_data['employees'] = $this->employeePolicyModel->getEmployeePolicyForFileList($client_id, $policy_id);
        $html = view('employee_data_list', $emp_data);

        return $this->respond(['dataStatus' => true, 'code' => 200, 'data' =>  $html], 200);
    }

    public function viewUploadedEmployeeList()
    {

        $empDataServiceController = new EmpDataServiceController();

        $file_id = $this->request->getGet('file_id');
        // $emp_data['employees'] = $this->employeePolicyModel->getViewEmpSuccessList($file_id);
        // $html = view('view_file_upload_emp_list', $emp_data);
        $file_name = $this->fileModel
            ->select(['files.*', 'up.emp_code', 'up.first_name', 'pm.name as policy_name', 'c.short_name', 'cp.id as client_policy_id'])
            ->join('user_profiles up', 'files.created_by = up.id')
            ->join('client_policy cp', 'files.policy_id = cp.id', 'left')
            ->join('policies pm', 'cp.policy_id = pm.id', 'left')
            ->join('clients c', 'files.client_id = c.id and files.client_id = cp.client_id', 'left')
            ->where('files.id', $file_id)->first();

            // dd($file_name);

        try {

            $filePath = WRITEPATH . '/uploads/excel/' . $file_name['file_name'];

            if (file_exists($filePath)) {
                
                $excel_data = $empDataServiceController->readExcelFileToArray($filePath);
                $emp_data['thead'] = $excel_data[0];
                unset($excel_data[0]);
                $emp_data['tbody'] = $excel_data;
                $emp_data['count'] = count($excel_data);

                // dd($emp_data);

                $html = view('view_file_upload_emp_list', $emp_data);
            } else {

                $html = '
No Data Found
'; } return $this->respond(['dataStatus' => true, 'code' => 200, 'data' => $html, 'file_data' => $file_name, 'excel_data' => $excel_data], 200); } catch (\Exception $e) { // Handle exception $errorMessage = 'Error occurred: ' . $e->getMessage(); $this->myLogger->logme('error', $errorMessage); $html = '
No Data Found
'; return $this->respond(['dataStatus' => false, 'code' => 500, 'data' => $html, 'file_data' => $file_name], 500); } } public function getEmpCount($id = null) { $data = $this->employeePolicyModel->select('employee_polices.id') ->where('employee_polices.is_active', 1) ->where('employee_polices.client_policy_id', $id) ->findAll(); $emp_count = count($data); $events = ['inception' => 'Inception (Employee + Dependents)', 'addition' => 'Addition (Employee + Dependents)', 'dependent_addition' => 'Dependent Addition (Only Dependents)', 'deletion' => 'Deletion', 'correction' => 'Correction', 'si_enhancement' => 'SI Enhancement']; return $this->respond(['dataStatus' => true, 'code' => 200, 'emp_count' => $emp_count, 'events' => $events, 'client_policy_id' => $id], 200); } public function downloadFullExcelErrorFile($file_id, $rowIndex = 1, $colIndex = 1) { // Get file data from the database $file_data = $this->fileModel->find($file_id); $error = json_decode($file_data['reason']); // echo '
';
        //    print_r($error); die;
        //    dd($error);

        // Check if the file exists
        if (!$file_data) {
            $error_message = "File not found";
            $this->myLogger->logme('error', $error_message . ' for file id ' . $file_id);
            return $error_message;
        }

        $fileName = $file_data['file_name'];
        $filePath = WRITEPATH . '/uploads/excel/' . $fileName;

        // Check if the file exists
        if (!file_exists($filePath)) {
            $error_message = "File not found";
            $this->myLogger->logme('error', $error_message . ' for file id ' . $file_id);
            $data['message'] = 'Physical File Not Found';
            return view('errors/404', $data);
        }

        // Load the Excel file
        $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($filePath);
        $sheet = $spreadsheet->getActiveSheet();

        //  echo '
';

        foreach ($error->error_data as $index => $error_data) {

            $rowIndex = $index + 1;

            if ($error->error_type == 1) {

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

                    $colIndex = $value->col_idx + 1;

                    $originalValue = $sheet->getCell([$colIndex, $rowIndex])->getValue();

                    $newValue =  implode(', ', $value->error);
                    $val = $originalValue . ' ( ' . $newValue . ' )';
                    $sheet->setCellValue([$colIndex, $rowIndex],  $val);

                    $style = [
                        'fill' => [
                            'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID,
                            'startColor' => ['rgb' => 'ffad99'] // Red color
                        ]
                    ];

                    $sheet->getStyle([$colIndex, $rowIndex])->applyFromArray($style);
                }
            } else if ($error->error_type == 2) {


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


                    $originalValue = $sheet->getCell([1, $rowIndex])->getValue();

                    $newValue =  implode(', ', $value->error);
                    $val = $originalValue . ' ( ' . $newValue . ' )';
                    $sheet->setCellValue([$colIndex, $rowIndex],  $val);

                    $style = [
                        'fill' => [
                            'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID,
                            'startColor' => ['rgb' => 'ffad99'] // Red color
                        ]
                    ];
                    $sheet->getStyle([$colIndex, $rowIndex])->applyFromArray($style);
                }
            }
        }



        // Create a new filename for the modified Excel file
        $newFileName = 'error_with_highlight_' . $fileName;

        // Save the modified Excel file to a new location
        $newFilePath = WRITEPATH . '/uploads/excel/' . $newFileName;
        $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
        $writer->save($newFilePath);

        // Set headers to force download
        $response = service('response');
        $response->setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        $response->setHeader('Content-Disposition', 'attachment;filename="' . $newFileName . '"');
        $response->setHeader('Cache-Control', 'max-age=0');
        $response->setHeader('Content-Length', filesize($newFilePath));
        $response->setBody(file_get_contents($newFilePath));

        // Delete the temporary file
        unlink($newFilePath);

        // Return the response
        return $response;
    }

    public function generateIDCardForEmployee($rand_string, $people = 0)
    {    
        // dd($rand_string, $people);
        try {
            $this->myLogger->logme('error', 'generateIDCardForEmployee function started.');
        
            // Step 1: Attempt to fetch employee code and client policy ID
            $this->myLogger->logme('error', 'Fetching employee code and client policy ID.');
            $get_emp_code_and_client_policy_id = $this->employeePolicyModel
                ->select('employee_polices.client_policy_id, employees.emp_code, tpa.short_name,employees.client_id')
                ->join('client_policy', 'client_policy.id = employee_polices.client_policy_id')
                ->join('employees', 'employees.id = employee_polices.employee_id')
                ->join('tpa', 'tpa.id = client_policy.tpa_id')
                ->where('employees.emp_status', 'active')
                ->where('employees.is_active', '1')
                ->where("employee_polices.tpa_id IS NOT NULL AND employee_polices.tpa_id <> ''")
                ->where('employee_polices.status', 'active')
                ->where('employee_polices.is_active', '1')
                ->where('employee_polices.rand_string', $rand_string)
                ->first();
        
            if ($get_emp_code_and_client_policy_id == null || $get_emp_code_and_client_policy_id == "") {
                $this->myLogger->logme('error', 'Member not found in this rand_string: ' . $rand_string);
                $data['message'] = 'Record Not Found';
                return view('errors/404', $data);
            }
        
            $this->myLogger->logme('error', 'Member found. Client policy ID: ' . $get_emp_code_and_client_policy_id['client_policy_id']);
        
            $client_policy_id = $get_emp_code_and_client_policy_id['client_policy_id'];
            $emp_code = $get_emp_code_and_client_policy_id['emp_code'];
            $client_id = $get_emp_code_and_client_policy_id['client_id'];
        
            // Step 2: Fetch ECard data
            $this->myLogger->logme('error', 'Fetching ECard data using client_policy_id: ' . $client_policy_id . ' and emp_code: ' . $emp_code);
            $data = $this->employeePolicyModel->getECardDataUsingMd5($client_policy_id, $emp_code,$client_id);
        
            if ($people == 0) {
                $this->myLogger->logme('error', 'Fetching single ECard data using rand_string: ' . $rand_string . ' and emp_code: ' . $emp_code);
                $data = $this->employeePolicyModel->getECardSingleData($rand_string, $emp_code,$client_id);
            }
        
            // Step 3: Prepare template path
            $template_data_path = WRITEPATH . 'e_card_template/';
            $tpa_short_name = strtolower(str_replace(' ', '_', $get_emp_code_and_client_policy_id['short_name'])) . '.html';
            $final_path = $template_data_path . $tpa_short_name;
        
            $this->myLogger->logme('error', 'Checking if template file exists at: ' . $final_path);
        
            if (!file_exists($final_path)) {
                $this->myLogger->logme('error', 'Template file not found: ' . $final_path);
                $data['message'] = 'Template File Not Found';
                return view('errors/404', $data);
            }
        
            $this->myLogger->logme('error', 'Template file found. Reading template data.');
            $tmplt_data = file_get_contents($final_path);
        
            // Step 4: Generate HTML content
            $this->myLogger->logme('error', 'Generating HTML content from template.');
            $html = "";
            foreach ($data as $key => $value) {
                $htmlContent = $tmplt_data;
        
                $placeholders = [
                    '{TPA_ID}' => $value['tpa_id'],
                    '{NAME}' => $value['name'],
                    '{UHID}' => $value['uhid'],
                    '{GENDER}' => $value['gender'],
                    '{DOB}' => date('d-M-Y', strtotime($value['dob'])),
                    '{SELF_NAME}' => $value['self'] ?? $value['name'],
                    '{POLICY_DATE}' => date('d-M-Y', strtotime($value['policy_end_date'])),
                    '{POLICY_START_DATE}' => date('d-M-Y', strtotime($value['policy_start_date'])),
                    '{POLICY_NO}' => date('d-M-Y', strtotime($value['policy_start_date'])),
                    '{INSURER_NAME}' => strtoupper($value['insurer_name']),
                    '{INSURER_LOGO}' => base_url() . 'public/uploads/logo/' . $value['insurer_logo'],
                    '{FRONT_CARD}' => base_url() . 'public/uploads/template_bg/' . $value['front_card'],
                    '{BACK_CARD}' => base_url() . 'public/uploads/template_bg/' . $value['back_card'],
                    '{EMP_ID}' => $value['emp_code'],
                    '{CORPORATE_NAME}' => $value['client_name'],
                    '{AGE}' => $value['emp_age'],
                    '{TPA_NAME}' => $value['tpa_name'],
                    '{INSURER_BRANCH}' => $value['insurer_branch_city'],
                    '{RELATION}' => $value['relationship'],
                    '{TPA_LOGO}' => base_url() . 'public/uploads/logo/' . $value['tpa_logo'],
                    '{MEDI_USER}' => base_url() . 'public/e_card_imgs/medi_uesr.jpg',
                    '{MEDI_INSURER}' => base_url() . 'public/e_card_imgs/Magma.png',
                    '{MEDI_BARCODE}' => base_url() . 'public/e_card_imgs/borcode.jpeg',
                    '{QR_ANDROID}' => base_url() . 'public/e_card_imgs/android.png',
                    '{QR_IOS}' => base_url() . 'public/e_card_imgs/ios.png',
                    '{QR_ANDROID_2}' => base_url() . 'public/e_card_imgs/play_store.png',
                    '{QR_IOS_2}' => base_url() . 'public/e_card_imgs/appstore.png',
                ];
        
                foreach ($placeholders as $placeholder => $replaceValue) {
                    $htmlContent = str_replace($placeholder, $replaceValue, $htmlContent);
                }
        
                $html .= $htmlContent;
            }
        
            // Step 5: Output HTML and script for printing
            $this->myLogger->logme('error', 'Generating HTML output with print button.');
            echo '' . $html . '
                  ';
        
            $this->myLogger->logme('error', 'generateIDCardForEmployee function completed successfully.');
        
        } catch (\Exception $e) {
            $this->myLogger->logme('error', 'Exception occurred: ' . $e->getMessage());
            $data['message'] = 'Record Not Found';
            return view('errors/404', $data);
        }
        
    }

    public function viewECard()
    {

        // $this->loadLayout('ecard_template/default_ecard');

        $empDataServiceController = new EmpDataServiceController();
        $return = $empDataServiceController->importDeletionValidation(['file_id' => 130]);
        
    }
    
    //truncateFileDataIn DB (de activate rows)
    public function truncateFileData($file_id, $role_id = null) 
    {
        $file_id = $this->request->uri->getSegment(3);
        // $file_id = 112;
        $file = $this->fileModel->find($file_id);
        $client_id = $file['client_id'];
        $client_policy_id = $file['policy_id'];
        $loggedInUserID = get_session_userid();

        $policy_data = $this->clientPolicyModel->where('id', $client_policy_id)->first();
        $cd_tranction = $this->cashDepositModel
            ->where('client_id', $client_id)
            ->where('insurer_id', $policy_data['insurer_id'])
            ->where('event_name',$file['action'])
            ->where('client_policy_id', $client_policy_id)
            ->orderBy('id', 'desc')            
            ->first();

        // $file['action'] = 'si_enhancement';
        // $result = [];
        // !dd($file);
        if ($file['action'] == 'inception' || $file['action'] == 'dependent_addition' || $file['action'] == 'addition' || $file['action'] == 'enrollment') {

            if($file['action'] == 'enrollment'){
                $result = $this->employeeModel->getEmpListByFileId(file_id: $file_id, emp_status: ['draft','enrolled'], policy_status: ['draft','enrolled']);
            }else{
                $result = $this->employeeModel->getEmpListByFileId(file_id: $file_id, emp_status: ['active'], policy_status: ['active']);
            }
            
            // ~dd($result);
            if (count($result) && $role_id == null) {
                if(get_role_id() == 1 || get_role_id() == 5){
                    return $this->respond(['role' => get_role_id(), 'dataStatus' => false, 'code' => 404, 'message' => 'File data already processed. Do you want to truncate data from uploaded file?'], 200);
                }else{
                    return $this->respond(['role' => get_role_id(), 'dataStatus' => false, 'code' => 404, 'message' => 'File data already processed'], 200);
                }
            } else {

                //update emp and emp plocies
                $db = db_connect();
                $query = "UPDATE employees JOIN employee_polices ON employees.id = employee_polices.employee_id and employees.file_id = $file_id SET employees.emp_status = 'truncated', employee_polices.status = 'truncated', employees.is_active = 0,employee_polices.is_active = 0 WHERE employees.file_id = $file_id";
                $db->query($query);
                $affectedRows = $db->affectedRows();
                // print_r($db->getLastQuery()); die;
                // $affectedRows = 10;

                //update file status
                $this->fileModel->where('id', $file_id)->set(['status' => 'truncated'])->update();

                if($cd_tranction){

                    $cd_data = [
                        'amount' => $cd_tranction['amount'],
                        'sub_type_id' => 8,
                        'endorsement_no' => null,
                        'insurer_id' =>$policy_data['insurer_id'],
                        'description' => 'The policy Truncated by Admin or Head',
                        'transaction_type' => 'Credit',
                        'updated_by' => 1,
                        'client_id' => $client_id,
                        'client_policy_id' => $client_policy_id,
                        'cd_ac_no' => $policy_data['cd_ac_no'] ?? null,
                        'event_name' => $file['action'],
                    ];

                    $response = DepositHelper::saveDeposit($cd_data, $loggedInUserID);
                }

                return $this->respond(['dataStatus' => true, 'code' => 200, 'data' => round($affectedRows / 2)], 200);
            }

        } else if ($file['action'] == 'si_enhancement' || $file['action'] == 'correction' || $file['action'] == 'deletion') {
           
            $res = $this->empEndorsementModel->select(['count(id) as count'])
                ->where('emp_endorsement.file_id', $file_id)
                ->groupStart()
                ->where('emp_endorsement.endorsement_id is not null')
                ->orwhereIn('emp_endorsement.status', ['complete'])
                ->groupEnd()
                ->get()
                ->getResult();

            // print_r($this->empEndorsementModel->getLastQuery());
            // echo $res[0]->count;die();
            if ($res[0]->count == 0 || $role_id == 5 || $role_id == 1) {
                //update truncated status to db
                $this->empEndorsementModel->where('file_id', $file_id)
                    ->set(['status' => 'truncated'])
                    ->update();
                //update file status
                $this->fileModel->where('id', $file_id)->set(['status' => 'truncated'])->update();

                if($cd_tranction && $file['action'] != 'correction'){
                    
                    $transaction_type = 'Credit';
                    if($file['action'] == 'deletion'){
                        $transaction_type = 'Debit';
                    }

                    $cd_data = [
                        'amount' => $cd_tranction['amount'],
                        'sub_type_id' => 8,
                        'endorsement_no' => null,
                        'insurer_id' =>$policy_data['insurer_id'],
                        'description' => 'The policy Truncated by Admin or Head',
                        'transaction_type' => $transaction_type,
                        'updated_by' => 1,
                        'client_id' => $client_id,
                        'client_policy_id' => $client_policy_id,
                        'cd_ac_no' => $policy_data['cd_ac_no'] ?? null,
                        'event_name' => $file['action'],
                    ];

                    $response = DepositHelper::saveDeposit($cd_data, $loggedInUserID);
                }

                return $this->respond(['dataStatus' => true, 'code' => 200, 'data' => 'success'], 200);
            } else {
                if(get_role_id() == 1 || get_role_id() == 5){
                    return $this->respond(['role' => get_role_id(), 'dataStatus' => false, 'code' => 404, 'message' => 'File data already processed. Do you want to truncate data from uploaded file?'], 200);
                }else{
                    return $this->respond(['dataStatus' => false, 'code' => 404, 'message' => 'File data already processed'], 200);
                }
            }
        }
    }

    public function previewTemplate($id = null)
    {

        
        $value = [
            'tpa_id' => 'TPA12345',
            'name' => 'John Doe',
            'uhid' => 'UHID67890',
            'gender' => 'Male',
            'dob' => '1985-05-15',
            'self' => 'John Doe',
            'policy_end_date' => '2024-12-31',
            'policy_start_date' => '2023-01-01',
            'policy_no' => 'POL1234567890',
            'insurer_name' => 'Example Insurance Company',
            'emp_code' => 'EMP001122',
            'client_name' => 'Corporate Client Inc.',
            'emp_age' => 39,
            'tpa_name' => 'Example TPA',
            'insurer_branch_city' => 'New York',
            'relationship' => 'Self'
        ];
        

        $tpa_id = $this->TPAModel->where('id', $id)->first();

        $template_data_path =  WRITEPATH . 'e_card_template/';
        $tpa_short_name = strtolower(str_replace(' ', '_', $tpa_id['short_name'])) . '.html';
        $final_path =  $template_data_path . $tpa_short_name;

        if (!file_exists($final_path)) {

            $data['message'] = 'Record Not Found';
            return view('errors/404', $data);
        }

        $tmplt_data = file_get_contents($final_path);

        $placeholders = [
            '{TPA_ID}' => $value['tpa_id'],
            '{NAME}' => $value['name'],
            '{UHID}' => $value['uhid'],
            '{GENDER}' => $value['gender'],
            '{DOB}' => date('d-M-Y', strtotime($value['dob'])),
            '{SELF_NAME}' => $value['self'] ?? $value['name'],
            '{POLICY_DATE}' => date('d-M-Y', strtotime($value['policy_end_date'])),
            '{POLICY_START_DATE}' => date('d-M-Y', strtotime($value['policy_start_date'])),
            '{POLICY_NO}' => $value['policy_no'], 
            '{INSURER_NAME}' => strtoupper($value['insurer_name']),
            '{EMP_ID}' => $value['emp_code'],
            '{CORPORATE_NAME}' => $value['client_name'],
            '{AGE}' => $value['emp_age'],
            '{TPA_NAME}' => $value['tpa_name'],
            '{INSURER_BRANCH}' => $value['insurer_branch_city'],
            '{RELATION}' => $value['relationship'],
            '{FRONT_CARD}' => base_url() . 'public/uploads/template_bg/' . $tpa_id['front_card'],
            '{BACK_CARD}' => base_url() . 'public/uploads/template_bg/' . $tpa_id['back_card'],
            '{TPA_LOGO}' => base_url() . 'public/uploads/logo/' . $tpa_id['tpa_logo'],
            '{INSURER_LOGO}' => base_url() . 'public/assets/images/sample_logo_3.png',
            '{MEDI_USER}' => base_url() . 'public/e_card_imgs/medi_uesr.jpg',
            '{MEDI_INSURER}' => base_url() . 'public/e_card_imgs/Magma.png',
            '{MEDI_BARCODE}' => base_url() . 'public/e_card_imgs/borcode.jpeg',
            '{QR_ANDROID}' => base_url() . 'public/e_card_imgs/android.png',
            '{QR_IOS}' => base_url() . 'public/e_card_imgs/ios.png', 
            '{QR_ANDROID_2}' => base_url() . 'public/e_card_imgs/play_store.png',
            '{QR_IOS_2}' => base_url() . 'public/e_card_imgs/appstore.png',

        ];

        // Get the values to replace the placeholders
        $replaceValues = array_values($placeholders);

        // Get the placeholders to search for
        $searchPlaceholders = array_keys($placeholders);

        // Replace placeholders with values in HTML content
        $htmlContent = str_replace($searchPlaceholders, $replaceValues, $tmplt_data);


        echo $htmlContent;
    }

    public function errorListExportImport($file_id)
    {

        $empDataServiceController = new EmpDataServiceController();

        $file = $this->batchFileModel->where('id', $file_id)->first();
        $client_id = $file['client_id'];
        $client_policy_id = $file['client_policy_id'];
        $insurer_or_tpa = $file['insurer_or_tpa'];
        $event_type = $file['event_type'];

        $error_data = json_decode($file['error_data']);

        $file_name_with_path = WRITEPATH . "/uploads/import_excel/" . $file['file_name'];

        if (!file_exists($file_name_with_path)) {
            $error_message = "File not found";
            $this->myLogger->logme('error', ($error_message . ' for file id ' . $file_id));
            $data['message'] = 'Physical File Not Found';
            return view('errors/404', $data);
        }

        $excel_data = $empDataServiceController->readExcelFileToArray($file_name_with_path);
        $excelErrorData['excel_header'] = $excel_data[0];
        unset($excel_data[0]);

        if($event_type == 'inception' || $event_type == 'deletion'){
            array_pop($excel_data);
        }

        $finalArray = [];
        foreach ($error_data as $key => $values) {

            foreach ($values as $key2 => $value) {

                $row = $value->row;
                $column = $value->column;

                if(property_exists($value, 'db_data')){

                    $error = 'Expected value: ' . ($value->db_data == null ||  $value->db_data == "" ? 'NULL' : $value->db_data);

                }else{

                    if($event_type == 'inception'){

                        if ($insurer_or_tpa == 'tpa') {

                            $error = 'Expected value : TPA ID';
    
                        } else if ($insurer_or_tpa == 'insurer') {
            
                            $error = 'Expected value : UHID';
                        }

                    }else{
                        $error = 'Expected value : ENDORSEMENT ID';
                    }


                }
                $data = ['value' => $excel_data[$row][$column], 'error' => $error,];
                $excel_data[$row][$column] = $data;
            }

            array_push($finalArray, $excel_data[$key]);
        }


        foreach ($finalArray as $fkey => $value) {
            foreach ($value as $vkey => $arrayData) {
                if (!is_array($arrayData)) {
                    $data = ['value' => $arrayData];
                    $finalArray[$fkey][$vkey] =  $data;
                }
            }
        }

        $excelErrorData['excel_data'] = $finalArray;
        $excelErrorData['file_id'] = $file_id;

        // dd($finalArray);

        echo view('export_import_error_list', $excelErrorData);
    }

    public function hasPolicyConfigCompleted()
    {
        $client_policy_id = $this->request->uri->getSegment(3);
        $policy_details = $this->clientPolicyModel->find($client_policy_id);
        $insurer_details = $this->insurerModel->where('id', $policy_details['insurer_id'])->first();
        $policy_terms = isset($policy_details['policy_terms']) ? true : false;

        $si_enhancement_true_or_false = 1;
        if($policy_terms){
            $policyTermsData = json_decode($policy_details['policy_terms']);

            if (isset($policyTermsData->suminsuredenhancement) && $policyTermsData->suminsuredenhancement !== null) {
                $si_enhancement_true_or_false = $policyTermsData->suminsuredenhancement;
            }        
        }
        

        $slab_details = $this->policiesModel->getPolicySlabRatesForEmpOnboard($client_policy_id,$policy_details['client_id']);

        $message = null;

        if (!isset($policy_terms)) {
            $message  .= 'Policy terms';
        }

        if($slab_details['slab_rates'] == null && $slab_details['grid_master'] == null)
        {
            $message  = isset($message) ? ($message . ' and rack rates ') : ($message . ' Rack rates');
        }
        $message  = isset($message) ? ($message . ' not defined for choosed policy') : null;

        return $this->respond(['dataStatus' => true, 'code' => 200, 'message' => $message, 'si_enhancement' => $si_enhancement_true_or_false, 'insurer_multi_event' => $insurer_details['is_multi_event']], 200);
        
    }

    public function testRackRate()
    {
        helper('excel_util_helper');
        if ($this->request->getMethod() == 'get') {
        $filterData = $this->request->getGet('client_policy_id');
            //just load UI only
        $this->loadLayout('rack_rate_test');
        }


         if ($this->request->getMethod() == 'post') {
        $json = $this->request->getJSON();
         // return $this->respond(['dataStatus' => false, 'code' => 200, 'data' => $data], 200);
         // $data = (json_decode(json_encode($data),true));
         $client_id = $json->client_id;
         $policy_id = $json->policy_id;
         $branch_id = $json->branch_id;
         $unit_id = $json->unit_id;
         $action = $json->action;
         $family_code = $json->emp_code;
         $tabledata = $json->data;
         $existing_famility_details = [];
         if(count($tabledata))
         {
             $family_details = [];
             foreach($tabledata as $key => $row)
             {
                $row = (array)$row;
                if(!$row['column12'])
                {
                    
                    $temp[0] = $row['column1'];//sno
                    $temp[1] = $family_code != "" ? $family_code : $row['column2'];//emp code
                    $temp[2] = $row['column3'];//name
                    $temp[3] = $row['column4'];//DOB
                    $temp[4] = strtoupper($row['column5']);//Gender
                    $temp[5] = $row['column6'];//relation
                    $temp[6] = $row['column7'];//SI
                    $temp[7] = $row['column8'];//DOC
                    $temp[8] = '';//DOJ
                    $temp[9] = $row['column9'];//BP
                    $temp[10] = $row['column10'];//band
                    $temp[11] = '';//designation
                    $temp[12] = '';//mobile
                    $temp[13] = '';//EMail
                    $temp[14] = '';//CE
                    $temp[15] = '';//RFE
                    $temp[16] = '';//DOE
                    $temp[17] = '';//Unit
                    $temp[18] = $unit_id;//unit
                    $family_details[] = $temp;
                }
             }
         }

         if($action == 'dependent_addition')
            {
                $existing_famility_details = $this->employeeModel->getEmpFamilybyEmpCode(emp_code: $family_code,client_id: $client_id,client_policy_id: $policy_id,emp_status: ['active'],policy_status:['active'],client_branch_id: [ $branch_id ]);
               // ~dd($this->employeeModel->getLastQuery());

                if(!count($existing_famility_details))
                {
                    return $this->respond(['dataStatus' => false, 'code' => 404, 'data' => [],'messgae' => "No Data found for emp code $family_code"], 200);
                }
                //transsform familiy details from db columns to exxcel row with column indexs for checking remaining functionalitites
                $existing_famility_details = transform_db_data_to_excel($existing_famility_details,[]);
                            // Kint::dump($existing_famility_details);
                $family_details = array_merge($family_details,$existing_famility_details);
                $family_details = data_group_by_family($family_details)[ $family_code ];// reason to call this again is bring self to first index of the array
                // dd($family);
            }
        
        //get policy details
         $policy_details = $this->clientPolicyModel->getPolicyDetails($client_id,$policy_id);
         $policy_details = (array)$policy_details[0];
         // ~dd($policy_details[0]->policy_start_date);
        //get rack rates
          $slab_details = $this->policiesModel->getPolicySlabRatesForEmpOnboard($policy_id,$client_id);
        //get file array or construnct dummy file array here
          $file = ['id' => null,'client_id' => $client_id,'policy_id' => $policy_id,'action' => 'inception','client_branch_id' => $branch_id,'created_by' => 1];
         //get existing units in the current branch
        $existing_units = $this->clientBranchModel->getExisitingUnits(client_id: $client_id,client_branch_id: $branch_id);
        //get familiy details in inception file format array from post method
          $data = calculate_premium_new(family_data: $family_details,policy_terms:$policy_details,slab_details:$slab_details,fileArr: $file,existing_units: $existing_units);

          foreach($data as $key => $member )
          {
            // ~dd($member);
            if(is_array($member))
            {
                $data[$key]['policy_details']['no_of_days'] = $member['policy_details']['date_coverage'] ? (calculate_days_bw_dates($member['policy_details']['date_coverage'],$member['policy_details']['policy_end_date'])->days + 1) : '';
            }
          }

          return $this->respond(['dataStatus' => true, 'code' => 200, 'data' => ['new' => $data,'old' => $existing_famility_details], 200]);
         }
    }


    public function testCheckDependentConflict()
    {
        helper('excel_util_helper');
        if ($this->request->getMethod() == 'get') {
        $filterData = $this->request->getGet('client_policy_id');
            //just load UI only
        $this->loadLayout('rack_rate_test');
        }


         if ($this->request->getMethod() == 'post') {
        $json = $this->request->getJSON();
         // return $this->respond(['dataStatus' => false, 'code' => 200, 'data' => $data], 200);
         // $data = (json_decode(json_encode($data),true));
         $client_id = $json->client_id;
         $policy_id = $json->policy_id;
         $branch_id = $json->branch_id;
         $tabledata = $json->data;
         
         if(count($tabledata))
         {
             $family_details = [];
             foreach($tabledata as $key => $row)
             {
                $row = (array)$row;
                if(!$row['column12'])
                {
                    
                    $temp[0] = $row['column1'];//sno
                    $temp[1] = $row['column2'];//emp code
                    $temp[2] = $row['column3'];//name
                    $temp[3] = $row['column4'];//DOB
                    $temp[4] = strtoupper($row['column5']);//Gender
                    $temp[5] = $row['column6'];//relation
                    $temp[6] = $row['column7'];//SI
                    $temp[7] = $row['column8'];//DOC
                    $temp[8] = '';//DOJ
                    $temp[9] = $row['column9'];//BP
                    $temp[10] = $row['column10'];//band
                    $temp[11] = '';//designation
                    $temp[12] = '';//mobile
                    $temp[13] = '';//EMail
                    $temp[14] = '';//CE
                    $temp[15] = '';//RFE
                    $temp[16] = '';//DOE
                    $temp[17] = '';//Unit
                    $temp[18] = $row['column11'];//unit
                    $family_details[] = $temp;
                }
             }
         }

         // print_r($family_details);
                  // return $this->respond(['dataStatus' => true, 'code' => 200, 'data' => $family_details], 200);
        //get policy details
         $policy_details = $this->clientPolicyModel->getPolicyDetails($client_id,$policy_id);
         $policy_terms = (array)$policy_details[0];
        // dd($policy_terms);
         $policy_terms = json_decode($policy_terms['policy_terms']);
         $policy_terms = (array) $policy_terms;// convert obj to array
        
        //get file array or construnct dummy file array here
          $file = ['id' => null,'client_id' => $client_id,'policy_id' => $policy_id,'action' => 'inception','client_branch_id' => $branch_id,'created_by' => 1]; 
        //get familiy details in inception file format array from post method
          $result = check_dependent_conflict($family_details, $policy_terms, $file['action']);


          return $this->respond(['dataStatus' => true, 'code' => 200, 'data' => ['policy_terms' => $policy_terms['family_floaters'],'result' => $result] ], 200);
         }
    }


    public function get_client_policy_list_for_remainder($client_id, $client_branch_id)
    {
        $policies = $this->clientPolicyModel
                ->select('client_policy.*, policy_type.policy_type as policy_name')
                ->join('policy_type', 'policy_type.id = client_policy.policy_type_id')
                ->where('client_policy.client_id', $client_id)
                ->where('client_policy.client_branch_id', $client_branch_id)
                ->where('client_policy.is_active', 1)
                ->where('client_policy.policy_status', 1)
                ->whereIn('client_policy.policy_type_id', [2, 3])
                ->findAll();

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

    }
}