From 66112a637ca6b98c67ad4fab68fad7f54bc85404 Mon Sep 17 00:00:00 2001 From: velz Date: Fri, 8 Mar 2024 14:04:06 +0530 Subject: [PATCH] FEAT_COND_EMP_PREMIMUM_CALC --- app/Controllers/EmployeeController.php | 13 +- app/Controllers/EmployeeServiceController.php | 66 +++++++++- app/Helpers/excel_util_helper.php | 123 +++++++++++++++++- app/Models/ClientPolicyModel.php | 4 +- app/Models/EmployeeModel.php | 1 + app/Models/PolicesModel.php | 40 ++++++ app/Views/employee_upload.php | 49 ++++++- 7 files changed, 288 insertions(+), 8 deletions(-) diff --git a/app/Controllers/EmployeeController.php b/app/Controllers/EmployeeController.php index 531eeb86..38109249 100644 --- a/app/Controllers/EmployeeController.php +++ b/app/Controllers/EmployeeController.php @@ -110,12 +110,16 @@ class EmployeeController extends AdminController // print_r($this->request->getPost('upload-action-type')); // die(); // $empServiceController = new EmployeeServiceController(); - // $res = $empServiceController->excelFileFormatValidation(['file_id' => '34']); + // $res = $empServiceController->excelFileFormatValidation(['file_id' => '12']); // dd($res); // $empServiceController = new EmployeeServiceController(); // $res = $empServiceController->excelFileDataValidation(['file_id' => '12']); // dd($res); + + // $empServiceController = new EmployeeServiceController(); + // $res = $empServiceController->employeesOnboard(['file_id' => '34']); + // dd($res); // if(isset($res['error_summary']) && count($res['error_summary'])) // { @@ -158,7 +162,7 @@ class EmployeeController extends AdminController $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]); + $file_id = $this->fileModel->insert(['file_name' => $filename,'client_id' => $client_id,'policy_id' => $policy_id,'created_by' => $loggedInUserID,'status' => $status,'action' => $action]);//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 @@ -179,8 +183,9 @@ class EmployeeController extends AdminController $data['fileList'] = $this->fileModel ->select(['files.*','up.emp_code','up.first_name','pm.name as policy_name','c.short_name']) ->join('user_profiles up','files.created_by = up.id') - ->join('policies pm','files.policy_id = pm.id') - ->join('clients c','files.client_id = c.id') + ->join('client_policy cp','files.policy_id = cp.id') + ->join('policies pm','cp.policy_id = pm.id') + ->join('clients c','files.client_id = c.id and files.client_id = cp.client_id') ->where('files.created_by',8)->orderBy('files.created_at','desc')->findAll(); // dd($data['fileList']);die(); if($this->request->getMethod() == "get") diff --git a/app/Controllers/EmployeeServiceController.php b/app/Controllers/EmployeeServiceController.php index 5d97f51b..a64812fa 100644 --- a/app/Controllers/EmployeeServiceController.php +++ b/app/Controllers/EmployeeServiceController.php @@ -12,6 +12,7 @@ use App\Models\EmployeeModel; use App\Models\EmployeePolicyModel; use App\Models\ClientModel; use App\Models\ClientPolicyModel; +use App\Models\PolicesModel; use App\Models\FileModel; use App\Controllers\Jobs ; @@ -27,6 +28,7 @@ class EmployeeServiceController extends AdminController protected $clientModel; protected $fileModel; protected $clientPolicyModel; + protected $policiesModel; protected $general_relationships = ['self' => ['name' => 'Self', 'gender' => 'M','age_min' => 18,'age_max' => null], 'spouse' => ['name' => 'Spouse', 'gender' => 'F','age_min' => 18,'age_max' => null], 'son' => ['name' => 'Son', 'gender' => 'M','age_min' => null,'age_max' => 25], 'daughter' => ['name' => 'Daughter', 'gender' => 'F','age_min' => null,'age_max' => 25], 'father' => ['name' => 'Father', 'gender' => 'M','age_min' => 18,'age_max' => null], 'mother' => ['name' => 'Mother', 'gender' => 'F','age_min' => 18,'age_max' => null], 'father-in-law' => ['name' => 'Father in Law', 'gender' => 'M','age_min' => 18,'age_max' => null], 'mother-in-law' => ['name' => 'Mother in Law', 'gender' => 'F','age_min' => 18,'age_max' => null]]; protected $inception_excel_columns = ['sno' => ['col_idx' => 0,'col_cell_name' => 'A','col_name' => 'S.No','is_mandatory' => true,'data_type' => 'str','format' => null,'allowed_values' => null],'emp_id' => ['col_idx' => 1,'col_cell_name' => 'B','col_name' => 'EMP ID','is_mandatory' => true,'data_type' => 'str','format' => null,'allowed_values' => null],'name_of_emp_dep' => ['col_idx' => 2,'col_cell_name' => 'C','col_name' => 'NAME OF EMP/DEP','is_mandatory' => true,'data_type' => 'str','format' => null,'allowed_values' => null],'dob' => ['col_idx' => 3,'col_cell_name' => 'D','col_name' => 'DOB','is_mandatory' => ['I','A','DA'],'data_type' => 'str','format' => 'd-M-Y','allowed_values' => null,'custom' => 'check_dob_diff','params' => ['row','relationship']],'gender' => ['col_idx' => 4,'col_cell_name' => 'E','col_name' => 'Gender','is_mandatory' => ['I','A','DA'],'data_type' => 'str','format' => null,'allowed_values' => ['M','F']],'relationship' => ['col_idx' => 5,'col_cell_name' => 'F','col_name' => 'RELATIONSHIP','is_mandatory' => ['I','A','DA'],'data_type' => 'str','format' => null,'allowed_values' => null,'custom' => 'check_relationship','params' => ['row','relationship']],'basic_cover_si' => ['col_idx' => 6,'col_cell_name' => 'G','col_name' => 'BASIC COVER SI','is_mandatory' => ['I','A','DA'],'data_type' => 'str','format' => null,'allowed_values' => null],'doj' => ['col_idx' => 7,'col_cell_name' => 'H','col_name' => 'DOJ','is_mandatory' => false,'data_type' => 'str','format' => 'd-M-Y','allowed_values' => null,'custom' => 'check_doj','params' => ['row']],'basic_pay' => ['col_idx' => 8,'col_cell_name' => 'I','col_name' => 'Basic Pay','is_mandatory' => false,'data_type' => 'str','format' => null,'allowed_values' => null,'custom' => 'check_basic_pay','params' => ['row']],'band_grade' => ['col_idx' => 9,'col_cell_name' => 'J','col_name' => 'Band/Grade','is_mandatory' => false,'data_type' => 'str','format' => null,'allowed_values' => null,'custom' => 'check_employee_band','params' => ['row']],'designation' => ['col_idx' => 10,'col_cell_name' => 'K','col_name' => 'Designation','is_mandatory' => false,'data_type' => 'str','format' => null,'allowed_values' => null],'phone' => ['col_idx' => 11,'col_cell_name' => 'L','col_name' => 'Phone','is_mandatory' => false,'data_type' => 'str','format' => null,'allowed_values' => null],'email' => ['col_idx' => 12,'col_cell_name' => 'M','col_name' => 'Email','is_mandatory' => false,'data_type' => 'str','format' => null,'allowed_values' => null],'pre_existing_ailments' => ['col_idx' => 13,'col_cell_name' => 'N','col_name' => 'PRE EXISTING AILMENTS','is_mandatory' => ['I','A','DA'],'data_type' => 'str','format' => null,'allowed_values' => ['0','1']],'change_event' => ['col_idx' => 14,'col_cell_name' => 'O','col_name' => 'Change event','is_mandatory' => ['A','DA','D'],'data_type' => 'str','format' => null,'allowed_values' => null],'date_of_exit' => ['col_idx' => 15,'col_cell_name' => 'P','col_name' => 'Date of exit','is_mandatory' => ['D'],'data_type' => 'str','format' => 'd-M-Y','allowed_values' => null],'reason_for_exit' => ['col_idx' => 16,'col_cell_name' => 'Q','col_name' => 'Reason for exit','is_mandatory' => ['D'],'data_type' => 'str','format' => null,'allowed_values' => null],'action' => ['col_idx' => 17,'col_cell_name' => 'R','col_name' => 'Action','is_mandatory' => true,'data_type' => 'str','format' => null,'allowed_values' => ['I','A','D','DA'] ]]; @@ -40,6 +42,7 @@ class EmployeeServiceController extends AdminController $this->clientModel = new ClientModel(); $this->fileModel = new FileModel(); $this->clientPolicyModel = new ClientPolicyModel(); + $this->policiesModel = new PolicesModel(); } public function excelFileFormatValidation($params) @@ -332,7 +335,7 @@ class EmployeeServiceController extends AdminController { foreach($res['error_data'] as $key => $value) { - array_push($result['error_summary'],$value['code']); //record not avail for deletion + array_push($result['error_summary'],$value['code']); $result['error_data'][$rowid][($value['col_name'])]['error'][] = $value['msg']; } } @@ -379,5 +382,66 @@ class EmployeeServiceController extends AdminController } + + + public function employeesOnboard($params) + { + helper('excel_util_helper'); + //get file name + $file_id = $params['file_id']; + $file = $this->fileModel->find($file_id); + // dd($file); + $return = []; + if(!isset($file)) + { + //file not found in DB + return array('status' => false, 'msg' => 'file not found in DB'); + } + $file_name_with_path = WRITEPATH."/uploads/excel/".$file['file_name']; + + //check physical file + if(!file_exists($file_name_with_path)) + { + //file not found update status and reason + $message = "Physical file not found"; + // echo $message; + $this->myLogger->logme('error',($message . ' for file id ' . $file_id)); + $this->fileModel->where('id', $file_id)->set(['status' => 'failed','reason' => json_encode(['error_summary' => array_count_values([5]),'error_data' => $message])])->update(); + return array('error_summary' => [5], 'error_data' => $message); + } + + $columns_to_check = []; + if($file['action'] == 'inception'){ $columns_to_check = $this->inception_excel_columns; } + + // get policy and rack details + $policy_terms = $this->clientPolicyModel->getPolicyTermsJson($file['client_id'],$file['policy_id']); + // dd($policy_terms); + $policy_terms = json_decode($policy_terms[0]->policy_terms); + $policy_terms = (array) $policy_terms;// convert obj to array + // dd($policy_terms); + //get excel data + $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file_name_with_path); + $sheet = $spreadsheet->getActiveSheet(); + + $highestRowAndColumn = $sheet->getHighestRowAndColumn(); + $excel_data = $sheet->rangeToArray('A1:' . $highestRowAndColumn['column'] . $highestRowAndColumn['row']); + unset($excel_data[0]); + + + //get policy slab rates + $slab_details = $this->policiesModel->getPolicySlabRatesForEmpOnboard($file['policy_id'],$file['client_id']); + dd($slab_details); + + $employee_data_group_by_family = data_group_by_family($excel_data); + dd($employee_data_group_by_family); + foreach ($employee_data_group_by_family as $emp_id => $family) + { + calculate_premimum($family,$policy_terms,$slab_details,$file); + } + + + } + + } diff --git a/app/Helpers/excel_util_helper.php b/app/Helpers/excel_util_helper.php index 1f1e9b47..ce67373e 100644 --- a/app/Helpers/excel_util_helper.php +++ b/app/Helpers/excel_util_helper.php @@ -225,8 +225,9 @@ if (!function_exists('name_and_empid_check_in_db')) $res = $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("cp.policy_id",$policy_id) + ->where("cp.client_policy",$policy_id) ->where("employees.client_id",$client_id) + ->where("ep.client_id",$client_id) ->like('name',$row[2],'both')->like('emp_code',$row[1],'both') ->findAll(); @@ -363,5 +364,125 @@ if (!function_exists('check_dependent_conflict')) } } +if (!function_exists('generate_relationship_code')) +{ + function generate_relationship_code($arr) + { + + } +} + +if (!function_exists('calculate_premimum')) +{ + function calculate_premimum($family_data,$policy_terms,$slab_details,$fileArr) + { + // grid type + // 1 = premium => si + $grid_type = $slab_details['grid_master']['ui_type']; + + if($grid_type != 10 && $grid_type != 11) // 10 & 11 for overall + { + foreach($family_data as $fkey => $member) + { + //transform as db row column + $transformed_familiy_member_data = transform_excel_data_to_db($member); + //generate relationship code + $transformed_familiy_member_data = generate_relationship_code($transformed_familiy_member_data); + //calculate primimum based on grid type + $transformed_familiy_member_data = calculation_manager($transformed_familiy_member_data,$policy_terms,$slab_details); + } + } + } +} + + +if (!function_exists('transform_excel_data_to_db')) +{ + function transform_excel_data_to_db($familyArr,$actionArr) + { + if($action == 'inception' || $action == 'addition') + { + + $policy['basic_cover_si'] = $arr[6]; + $policy['pre_existing_alignments'] = $arr[13]; + $policy['date_of_exit'] = isset($arr[15]) ? change_date_format($arr[15],'d-M-Y','Y-m-d') : NULL; + $policy['reason_for_exit'] = $arr[16]; + $policy['client_policy_id'] = $actionArr['policy_id']; + + + $result['emp_code'] = $arr[1]; + $result['name'] = $arr[2]; + $result['dob'] = isset($arr[3]) ? change_date_format($arr[3],'d-M-Y','Y-m-d') : NULL; + $result['gender'] = $arr[4]; + $result['relationship'] = $arr[5]; + $result['doj'] = isset($arr[7]) ? change_date_format($arr[7],'d-M-Y','Y-m-d') : NULL; + $result['basic_pay'] = $arr[8]; + $result['band'] = $arr[9]; + $result['designation'] = $arr[10]; + $result['mobile'] = $arr[11]; + $result['email_corporate'] = $arr[12]; + $result['file_id'] = $actionArr['id']; + $result['client_id'] = $actionArr['client_id']; + $result['change_event'] = $arr[14]; + $result['action'] = $arr[17]; + $result['policy_details'] = $policy; + + return $result; + + } + } +} + + +if (!function_exists('calculation_manager')) +{ + function calculation_manager($emp_data,$policy_terms,$slab_details) + { + // grid type + // 1 = premium => si + $grid_type = $slab_details['grid_master']['ui_type']; + + switch ($grid_type) { + case "1": + //GPA - Sum Insured (SI) * Multiplier + + break; + case "2": + //GPA - Flat Rate for all SI + break; + case "3": + //GMC - SI + break; + case "4": + //GMC - Employees Age band + break; + case "5": + //GMC - Employees Age + SI + break; + case "6": + //GMC - Employees + Dependent Age band + break; + case "7": + //GMC - Employees + Dependent Age + SI + break; + case "8": + //GMC - SI as per Grade or Band + break; + case "9": + //GMC - Flat Rate for all + break; + case "10": + //GMC - Maximum age of Dependents + break; + case "11": + //GMC - Maximum count per Family + break; + + default: + echo "Not a valid day"; +} + + } +} diff --git a/app/Models/ClientPolicyModel.php b/app/Models/ClientPolicyModel.php index e6955601..de91ab5e 100644 --- a/app/Models/ClientPolicyModel.php +++ b/app/Models/ClientPolicyModel.php @@ -35,6 +35,8 @@ class ClientPolicyModel extends Model "created_by", "updated_by", "Is_active", + "date_of_exit", + "reason_for_exit" ]; public function getClientPolicyById($id){ @@ -101,7 +103,7 @@ class ClientPolicyModel extends Model { return $this->select('policy_terms') ->where('client_id',$client_id) - ->where('policy_id',$policy_id) + ->where('id',$policy_id) ->get() ->getResult(); diff --git a/app/Models/EmployeeModel.php b/app/Models/EmployeeModel.php index 78cd79f4..8176101f 100644 --- a/app/Models/EmployeeModel.php +++ b/app/Models/EmployeeModel.php @@ -25,5 +25,6 @@ class EmployeeModel extends Model "created_by", "updated_by", "is_active", + "file_id" ]; } diff --git a/app/Models/PolicesModel.php b/app/Models/PolicesModel.php index c9dc0015..779def89 100644 --- a/app/Models/PolicesModel.php +++ b/app/Models/PolicesModel.php @@ -3,6 +3,9 @@ namespace App\Models; use CodeIgniter\Model; +use App\Models\policyGridModel; +use App\Models\policyPremium1Model; +use App\Models\policyPremium2Model; class PolicesModel extends Model { @@ -27,4 +30,41 @@ class PolicesModel extends Model ->get() ->getResult(); } + + + public function getPolicySlabRatesForEmpOnboard($policy_id,$client_id){ + + + // $data = $this->getPolicyPremium($policy_id); + // $pattern = '/gmc/i'; + // $subject = $data[0]->policy_type; + // if (preg_match($pattern, $subject)) { + // $search_term = 'GMC'; + // } else { + // $search_term = 'GPA'; + // } + + + $premium_slab_data = null; + // echo !isset($premium_slab_data);die(); + // if($search_term === 'GPA'){ + $policyPremium1Model = new policyPremium1Model(); + $premium_slab_data = $policyPremium1Model->where(['client_id' => $client_id, 'client_policy_id' => $policy_id, 'is_active' => 1])->findAll(); + if((isset($premium_slab_data))) + { + echo '2'; + $policyPremium2Model = new policyPremium2Model(); + $premium_slab_data = $policyPremium2Model->where(['client_id' => $client_id, 'client_policy_id' => $policy_id, 'is_active' => 1])->findAll(); + } + // }else{ + ; + // } + // dd($premium_slab_data); + // dd($policyPremium1Model->getLastQuery()); + //get policy id + $grid_id = $premium_slab_data[0]['policy_grid_id']; + $policyGridModel = new policyGridModel(); + $results = $policyGridModel->find($grid_id); + return ['slab_rates' => $premium_slab_data,'grid_master' => $results]; + } } diff --git a/app/Views/employee_upload.php b/app/Views/employee_upload.php index 3fe85db6..8131a280 100644 --- a/app/Views/employee_upload.php +++ b/app/Views/employee_upload.php @@ -281,7 +281,54 @@ // for (var ckey in col) // { - file_error_html += (err_id == 1 ? "Mandatory values missing "+err_count+"" : (err_id == 2 ? "Values not in expected format "+err_count+"" : (err_id == 3 ? "Field contains not allowed values "+err_count+"" : (err_id == 4 ? "Rule Conflict "+err_count+"" : (err_id == 5 ? ""+file_error_data['error_data']+"" : (err_id == 6 ? ""+file_error_data['error_data']+"" : "")))))); + // file_error_html += (err_id == 1 ? "Mandatory values missing "+err_count+"" : (err_id == 2 ? "Values not in expected format "+err_count+"" : (err_id == 3 ? "Field contains not allowed values "+err_count+"" : (err_id == 4 ? "Rule Conflict "+err_count+"" : (err_id == 5 ? ""+file_error_data['error_data']+"" : (err_id == 6 ? ""+file_error_data['error_data']+"" : "")))))); + // var message; + switch (err_id) { + case 1: + file_error_html += "Mandatory values missing " + err_count + ""; + break; + case 2: + file_error_html += "Values not in expected format " + err_count + ""; + break; + case 3: + file_error_html += "Field contains not allowed values " + err_count + ""; + break; + case 4: + file_error_html += "Rule Conflict " + err_count + ""; + break; + case 5: + file_error_html += "" + file_error_data['error_data'] + ""; + break; + case 6: + file_error_html += "" + file_error_data['error_data'] + ""; + break; + case 7: + file_error_html += "Duplicate entry in file " + err_count + ""; + break; + case 8: + file_error_html += "to be config"; + break; + case 9: + file_error_html += "Duplicate entry " + err_count + ""; + break; + case 10: + file_error_html += "Duplicate entry in file " + err_count + ""; + break; + case 11: + file_error_html += "Rule conflict: Dependents not allowed " + err_count + ""; + break; + case 12: + file_error_html += "Rule conflict: Dependent count greater than allowed dependent count " + err_count + ""; + break; + case 13: + file_error_html += "Rule conflict: Twofold relationship found within family " + err_count + ""; + break; + + default: + file_error_html += ""; + break; + } + file_error_html += '
'; // }