diff --git a/app/Config/Routes.php b/app/Config/Routes.php index 2377fc38..8cde4f3a 100755 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -369,6 +369,9 @@ $routes->group("/util", ["filter" => "authMVC"], function ($routes) { $routes->get('viewHrAccessData', 'ClientController::viewHrAccessData'); $routes->post('saveHrAccessData', 'ClientController::saveHrAccessData'); $routes->get('removeLevelContacts', 'ClientController::removeLevelContacts'); + $routes->get('getClaimDumpFileErrorData', 'TicketController::getClaimDumpFileErrorData'); + $routes->get("claim_dump_excel_error/(:any)", "TicketController::getClaimDumpExcelFileErrors/$1"); + $routes->get("download_claim_dump_file/(:any)", "TicketController::downloadClaimDumpFile/$1"); }); $routes->post("policy_tranction/sendInstallmentRemainderMail","PolicyTransactionController::sendInstallmentRemainderMail"); diff --git a/app/Controllers/ClientController.php b/app/Controllers/ClientController.php index d4bfa5d8..7126cd69 100755 --- a/app/Controllers/ClientController.php +++ b/app/Controllers/ClientController.php @@ -143,7 +143,11 @@ class ClientController extends AdminController // Perform the query $builder = $db->table($table); - $isDuplicate = $builder->where($field, $value)->where('is_active', 1)->countAllResults() > 0; + if(is_array($value)){ + $isDuplicate = $builder->where($value)->where('is_active', 1)->countAllResults() > 0; + }else{ + $isDuplicate = $builder->where($field, $value)->where('is_active', 1)->countAllResults() > 0; + } // Return the result return $this->response->setJSON(['isDuplicate' => $isDuplicate]); @@ -5037,7 +5041,16 @@ class ClientController extends AdminController // $employeeController = new EmployeeController(); // $employeeController->truncateFileData('633'); - + + // ---------- TICKET SERVICE CONTROLLER -------------------------------------------------------------------------------- + + $ticketServiceController = new TicketServiceController(); + // $response = $ticketServiceController->claimDumpExcelFileFormatValidation(["file_id" => 3]); + // $response = $ticketServiceController->claimDumpExcelFileDataValidation(["file_id" => 3]); + // $response = $ticketServiceController->claimDumpOnBoardProcess(["file_id" => 3]); + // $response = $ticketServiceController->extractExcelData("claims_dump_form_client.xlsx"); + // dd($response); + // ---------- EMP SERVICE CONTROLLER -------------------------------------------------------------------------------- $empServiceController = new EmployeeServiceController(); @@ -5054,18 +5067,18 @@ class ClientController extends AdminController // ---------- POLICY TRANSACTION CONTROLLER -------------------------------------------------------------------------------- $policyTransactionController = new PolicyTransactionController(); - // $res = $policyTransactionController->validateInsurerStatement(['file_id' => '17']); + // $res = $policyTransactionController->validateInsurerStatement(['file_id' => '57']); // $res = $policyTransactionController->updateInsurerStatement(['file_id' => '22']); // dd('-----', $res); // ----------EMP DATA SERVICE CONTROLLER-------------------------------------------------------------------------------- $batch_data = [ - 'client_id' => 20, - 'client_branch_id' => 72, - 'client_policy_id' => 127, + 'client_id' => 51, + 'client_branch_id' => 40, + 'client_policy_id' => 63, 'insurer_or_tpa' => "insurer", - 'event_type' => "deletion", + 'event_type' => "correction", 'actions' => "export", 'file_name' => "deletion_enhancement_test_file.xlsx", ]; @@ -5132,25 +5145,30 @@ class ClientController extends AdminController // $EmpDataServiceController->cashDepositCalculationForDeletion($array); // $result = $this->employeePolicyModel->getInceptionEmployeeDataForExportExcel($batch_data); + // $result = $this->employeePolicyModel->getCorrectionEmployeesDataForExportExcel($batch_data); // dd(db_connect()->getLastQuery()); // ------------- LEADS CONTROLLER ---------------------------------------------------------- $LeadsController = new LeadsController(); - // $RFQModel = new RFQModel(); + $RFQModel = new RFQModel(); - // $data = $RFQModel->where('is_active', 1)->where('lead_id', 40)->first(); - // // dd($data); + // $data = $RFQModel->where('is_active', 1)->where('lead_id', 323)->orderBy('id', 'desc')->first(); + // $data = db_connect()->table('leads')->where('is_active', 1)->where('id', 326)->orderBy('id', 'desc')->get()->getResultArray(); + // dd($data); // $policy_type = 2; // $proposel_name = "Proposal 2"; // $insurer_name = "ICICI-P-ICICI002-V1"; // $jsonArray = json_decode($data['json'], true); - // // dd($jsonArray); + // dd($jsonArray); - // $returndata = $LeadsController->convertQCRJsonToPolicyTerms($jsonArray, $policy_type, $proposel_name, $insurer_name); - // dd($returndata); - - // $LeadsController->handleMemberDataGPATotalSumInsurerFromExcel(['lead_id' => 169]); + // $res = $LeadsController->convertQCRJsonToPolicyTerms($jsonArray, $policy_type, $proposel_name, $insurer_name); + // $res = $LeadsController->handleMemberDataGPATotalSumInsurerFromExcel(['lead_id' => 169]); + // $res = $LeadsController->reorderProposalsByInsurerTotal($jsonArray); + // $res = $LeadsController->calculateMembersDemography(['lead_id' => 326]); + // $res = $LeadsController->generateDemographyDataTable(['lead_id' => 326]); + // echo $res; + // dd($res); // -----------BDS REPORT CONTROLLER--------------------------------------------------------------------------------- diff --git a/app/Controllers/JobWorker.php b/app/Controllers/JobWorker.php index 4cbf5350..7136c017 100755 --- a/app/Controllers/JobWorker.php +++ b/app/Controllers/JobWorker.php @@ -143,6 +143,18 @@ class JobWorker extends AdminController 'type' => 'CC', // Handler Category 'handler' => 'App\Controllers\ClientController', ], + 'claimDumpExcelFileFormatValidation' => [ + 'type' => 'CC', // Handler Category + 'handler' => 'App\Controllers\TicketServiceController', + ], + 'claimDumpExcelFileDataValidation' => [ + 'type' => 'CC', // Handler Category + 'handler' => 'App\Controllers\TicketServiceController', + ], + 'claimDumpOnBoardProcess' => [ + 'type' => 'CC', // Handler Category + 'handler' => 'App\Controllers\TicketServiceController', + ], ]; diff --git a/app/Controllers/PolicyTransactionController.php b/app/Controllers/PolicyTransactionController.php index d6bc5167..9f7d7341 100644 --- a/app/Controllers/PolicyTransactionController.php +++ b/app/Controllers/PolicyTransactionController.php @@ -995,8 +995,16 @@ class PolicyTransactionController extends BaseController if ($id) { $data['is_active'] = 0; - $this->policyTransactionModel->where('id', $id)->set($data)->update(); - $this->PTCOShareDetailsModel->where('pt_id', $id)->set($data)->update(); + $policy_transaction_data = $this->policyTransactionModel->where('id', $id)->first(); + if($policy_transaction_data['policy_type_id'] > 7){ + + $this->policyTransactionModel->where('id', $id)->set($data)->update(); + $this->PTCOShareDetailsModel->where('pt_id', $id)->set($data)->update(); + $this->clientPolicyModel->where('id', $policy_transaction_data['client_policy_id'])->set($data)->update(); + }else{ + $this->policyTransactionModel->where('id', $id)->set($data)->update(); + $this->PTCOShareDetailsModel->where('pt_id', $id)->set($data)->update(); + } return $this->respond(['status' => true, 'code' => 200, 'message' => 'Policy Transaction removed successfully'], 200); } else { diff --git a/app/Controllers/TicketController.php b/app/Controllers/TicketController.php index 4c344c28..a50b55be 100644 --- a/app/Controllers/TicketController.php +++ b/app/Controllers/TicketController.php @@ -21,6 +21,7 @@ use App\Models\InsurerModel; use App\Models\EmployeeModel; use App\Models\TPAModel; use App\Models\ClaimFilesModel; +use App\Models\ClaimDumpFileModel; use DOMDocument; use Psr\Log\LoggerInterface; @@ -60,6 +61,7 @@ class TicketController extends BaseController protected $insurerModel; protected $TPAModel; protected $claimFilesModel; + protected $claimDumpFileModel; public function __construct() { @@ -345,6 +347,7 @@ class TicketController extends BaseController $this->insurerModel = new InsurerModel(); $this->TPAModel = new TPAModel(); $this->claimFilesModel = new ClaimFilesModel(); + $this->claimDumpFileModel = new ClaimDumpFileModel(); } public function ticketList() @@ -2445,6 +2448,154 @@ class TicketController extends BaseController } + // -------- CLAIM DUMP UPLOAD ---------------------------------------------------------------------------------------------- + + public function claimDumpUpload() + { + $data['page_name'] = "Claim Dupm Upload"; + + if($this->request->is('get')){ + + $data['claim_dump_file_data'] = $this->claimDumpFileModel + ->select(' + claim_dump_files.id as file_id, + claim_dump_files.file_name, + claim_dump_files.status, + claim_dump_files.created_at, + up.first_name as user_name + ') + ->join('user_profiles as up', 'claim_dump_files.created_by = up.id', 'left') + ->where('claim_dump_files.is_active', 1) + ->findAll(); + + return $this->loadLayout('claim_dump_file_list', $data); + + }else{ + + // print_r($this->request->getFile('claim_dump_list')); die; + $filename = ''; + $fileSize = ''; + + //validate uploaded file + $validated = $this->validate([ + 'claim_dump_list' => [ + 'uploaded[claim_dump_list]', + 'mime_in[claim_dump_list,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.oasis.opendocument.spreadsheet]', + 'max_size[claim_dump_list,16384]', + ], + ]); + + if ($validated) + { + $avatar = $this->request->getFile('claim_dump_list'); + if (!$avatar) { + $this->myLogger->logme("error", 'File not found'); + return $this->respond(['status' => false, 'code' => 400, 'message' => 'File not found'], 400); + } + + $is_moved = $avatar->move(WRITEPATH . 'uploads/claim_dump_excel/'); + + if ($is_moved) { + $filename = $avatar->getName(); + $fileSize = $avatar->getSize(); // File size in bytes + $fileSize = $fileSize / (1024 * 1024); // Convert to MB + + $this->myLogger->logme("error", 'File move successful'); + + } else { + $this->myLogger->logme("error", 'File move failed'); + return $this->respond(['status' => false, 'code' => 500, 'message' => 'File move failed'], 500); + } + + } else { + $this->myLogger->logme("error", 'Upload failed Invalid file'); + return $this->respond(['status' => false, 'code' => 404, 'message' => 'Invalid file'], 404); + } + + + $status = 'inprogress'; + $insert_data = [ + 'file_name' => $filename, + 'status' => $status + ]; + + $file_id = $this->claimDumpFileModel->insert($insert_data); + $this->myLogger->logme("error", 'claim_dumb_file_id : {file_id}, uploaded success', ['file_id' => $file_id]); + + //after file upload success than call the file formate validation in service controller + $ticketServiceController = new TicketServiceController(); + // $response = $ticketServiceController->claimDumpExcelFileFormatValidation(["file_id" => $file_id]); + $r = Jobs::addJob(['job_name' => 'claimDumpExcelFileFormatValidation', 'payload' => ['file_id' => $file_id]]); + + return $this->respond(['status' => true, 'code' => 200, 'message' => 'File uploaded successfully. File being validated'], 200); + + } + } + + public function getClaimDumpFileErrorData() + { + $file_id = $this->request->getGet('file_id'); + $file = $this->claimDumpFileModel->where('id', $file_id)->first(); + if (!isset($file)) { + return $this->respond(['status' => false, 'code' => 404, 'message' => 'No data found'], 200); + } else { + return $this->respond(['status' => true, 'code' => 200, 'data' => $file['reason']], 200); + } + } + + public function getClaimDumpExcelFileErrors($file_id) + { + // $file_id = $this->request->getGet('file_id'); + $ticketServiceController = new TicketServiceController(); + + // Render views and capture output + $result = $ticketServiceController->getClaimExcelErrorData($file_id) ?? []; + // dd($result); + + if ($result != 0) { + + $result['file_id'] = $file_id; + echo view('excel_errors', $result); + } else if ($result == 0) { + + $data['message'] = 'File Not Found Physically'; + return view('errors/404', $data); + } else { + + echo view('errors/html/production'); + } + } + + public function downloadClaimDumpFile($file_id) + { + // $actionType = $this->request->getGet(); + $file_data = $this->claimDumpFileModel->where('id', $file_id)->first(); + $fileName = $file_data['file_name']; + + $filePath = WRITEPATH . '/uploads/claim_dump_excel/' . $fileName; + + try { + + // Check if the file exists + if (file_exists($filePath)) { + // Set the appropriate MIME type + $mimeType = mime_content_type($filePath); + + // Send the file to the client for download + return $this->response->download($filePath, null, $mimeType); + } else { + + $data['message'] = 'The Physical File Not Found'; + echo view('errors/404', $data); + } + } catch (\Exception $e) { + // Handle any exceptions + $errorMessage = $e->getMessage(); + $this->myLogger->logme('error', $errorMessage); + // You can return an error response here + echo $errorMessage; + } + } } diff --git a/app/Controllers/TicketServiceController.php b/app/Controllers/TicketServiceController.php new file mode 100644 index 00000000..e6c137f4 --- /dev/null +++ b/app/Controllers/TicketServiceController.php @@ -0,0 +1,1800 @@ +myLogger = \Config\Services::mylogger(); + set_session_context('Ticket Service Controller'); + + $this->claimDumpFileModel = new ClaimDumpFileModel(); + $this->clientModel = new ClientModel(); + $this->insurerModel = new InsurerModel(); + $this->TPAModel = new TPAModel(); + $this->ticketClaimStatusModel = new TicketClaimStatusModel(); + $this->clientPolicyModel = new ClientPolicyModel(); + + $this->claim_dump_excel_columns = [ + + // Mandatory Fields + 'sno' => [ + 'col_idx' => 0, + 'col_cell_name' => 'A', + 'col_name' => 'S.No.', + 'is_mandatory' => true, + 'data_type' => 'int', + 'format' => null, + 'allowed_values' => null + ], + + 'policy_type' => [ + 'col_idx' => 1, + 'col_cell_name' => 'B', + 'col_name' => 'Policy Type', + 'is_mandatory' => true, + 'data_type' => 'str', + 'format' => null, + 'allowed_values' => ['GMC', 'GPA', 'EDLI', 'GTLI'] + ], + + 'status' => [ + 'col_idx' => 2, + 'col_cell_name' => 'C', + 'col_name' => 'Status', + 'is_mandatory' => true, + 'data_type' => 'str', + 'format' => null, + 'allowed_values' => null + ], + + 'client_short_name' => [ + 'col_idx' => 3, + 'col_cell_name' => 'D', + 'col_name' => 'Corporate Name', + 'is_mandatory' => true, + 'data_type' => 'str', + 'format' => null, + 'allowed_values' => null + ], + + 'insurer' => [ + 'col_idx' => 4, + 'col_cell_name' => 'E', + 'col_name' => 'Insurer', + 'is_mandatory' => true, + 'data_type' => 'str', + 'format' => null, + 'allowed_values' => null + ], + + 'tpa' => [ + 'col_idx' => 5, + 'col_cell_name' => 'F', + 'col_name' => 'TPA', + 'is_mandatory' => true, + 'data_type' => 'str', + 'format' => null, + 'allowed_values' => null + ], + + 'policy_no' => [ + 'col_idx' => 6, + 'col_cell_name' => 'G', + 'col_name' => 'Policy No', + 'is_mandatory' => true, + 'data_type' => 'str', + 'format' => null, + 'allowed_values' => null + ], + + 'employee_code' => [ + 'col_idx' => 7, + 'col_cell_name' => 'H', + 'col_name' => 'Employee Code', + 'is_mandatory' => true, + 'data_type' => 'str', + 'format' => null, + 'allowed_values' => null + ], + + 'employee_name' => [ + 'col_idx' => 8, + 'col_cell_name' => 'I', + 'col_name' => 'Employee Name', + 'is_mandatory' => true, + 'data_type' => 'str', + 'format' => null, + 'allowed_values' => null + ], + + 'insured_name' => [ + 'col_idx' => 9, + 'col_cell_name' => 'J', + 'col_name' => 'Insured Name', + 'is_mandatory' => true, + 'data_type' => 'str', + 'format' => null, + 'allowed_values' => null + ], + + 'relationship' => [ + 'col_idx' => 10, + 'col_cell_name' => 'K', + 'col_name' => 'Relationship', + 'is_mandatory' => true, + 'data_type' => 'str', + 'format' => null, + 'allowed_values' => ['Self', 'Spouse', 'Child', 'Parent', 'Other'] + ], + + 'mode_of_intimation' => [ + 'col_idx' => 11, + 'col_cell_name' => 'L', + 'col_name' => 'Mode of Intimation', + 'is_mandatory' => true, + 'data_type' => 'str', + 'format' => null, + 'allowed_values' => ['Email', 'Phone', 'Portal', 'Physical'] + ], + + 'acm' => [ + 'col_idx' => 12, + 'col_cell_name' => 'M', + 'col_name' => 'ACM', + 'is_mandatory' => false, + 'data_type' => 'str', + 'format' => null, + 'allowed_values' => null + ], + + 'claim_type' => [ + 'col_idx' => 13, + 'col_cell_name' => 'N', + 'col_name' => 'Claim Type', + 'is_mandatory' => true, + 'data_type' => 'str', + 'format' => null, + 'allowed_values' => null + ], + + 'priority' => [ + 'col_idx' => 14, + 'col_cell_name' => 'O', + 'col_name' => 'Priority', + 'is_mandatory' => true, + 'data_type' => 'str', + 'format' => null, + 'allowed_values' => ['Critical', 'Emergency', 'Urgent', 'High', 'Medium', 'Low'] + ], + + // Common Fields + 'date_of_birth' => [ + 'col_idx' => 15, + 'col_cell_name' => 'P', + 'col_name' => 'Date of Birth', + 'is_mandatory' => false, + 'data_type' => 'date', + 'format' => 'd-m-Y', + 'allowed_values' => null + ], + + 'employee_mobile' => [ + 'col_idx' => 16, + 'col_cell_name' => 'Q', + 'col_name' => 'Employee Mobile', + 'is_mandatory' => false, + 'data_type' => 'str', + 'format' => '/^[0-9]{10}$/', + 'allowed_values' => null + ], + + 'employee_email' => [ + 'col_idx' => 17, + 'col_cell_name' => 'R', + 'col_name' => 'Employee Email', + 'is_mandatory' => false, + 'data_type' => 'str', + 'format' => 'email', + 'allowed_values' => null + ], + + 'employee_personal_email' => [ + 'col_idx' => 18, + 'col_cell_name' => 'S', + 'col_name' => 'Employee Personal Email', + 'is_mandatory' => false, + 'data_type' => 'str', + 'format' => 'email', + 'allowed_values' => null + ], + + // GMC Specific Fields + 'hospital_name' => [ + 'col_idx' => 19, + 'col_cell_name' => 'T', + 'col_name' => 'Hospital Name', + 'is_mandatory' => false, + 'data_type' => 'str', + 'format' => null, + 'allowed_values' => null + ], + + 'doa' => [ + 'col_idx' => 20, + 'col_cell_name' => 'U', + 'col_name' => 'DOA (Date of Admission)', + 'is_mandatory' => false, + 'data_type' => 'date', + 'format' => 'd-m-Y', + 'allowed_values' => null + ], + + 'dod' => [ + 'col_idx' => 21, + 'col_cell_name' => 'V', + 'col_name' => 'DOD (Date of Discharge)', + 'is_mandatory' => false, + 'data_type' => 'date', + 'format' => 'd-m-Y', + 'allowed_values' => null + ], + + 'claim_amount' => [ + 'col_idx' => 22, + 'col_cell_name' => 'W', + 'col_name' => 'Claim Amount', + 'is_mandatory' => false, + 'data_type' => 'decimal', + 'format' => '2', + 'allowed_values' => null + ], + + 'pod_no' => [ + 'col_idx' => 23, + 'col_cell_name' => 'X', + 'col_name' => 'POD No.', + 'is_mandatory' => false, + 'data_type' => 'str', + 'format' => null, + 'allowed_values' => null + ], + + 'tpa_id' => [ + 'col_idx' => 24, + 'col_cell_name' => 'Y', + 'col_name' => 'TPA ID', + 'is_mandatory' => false, + 'data_type' => 'str', + 'format' => null, + 'allowed_values' => null + ], + + 'claim_number' => [ + 'col_idx' => 25, + 'col_cell_name' => 'Z', + 'col_name' => 'Claim Number', + 'is_mandatory' => false, + 'data_type' => 'str', + 'format' => null, + 'allowed_values' => null + ], + + // GPA Specific Fields + 'sum_insured' => [ + 'col_idx' => 26, + 'col_cell_name' => 'AA', + 'col_name' => 'Sum Insured', + 'is_mandatory' => false, + 'data_type' => 'decimal', + 'format' => '2', + 'allowed_values' => null + ], + + 'date_of_join' => [ + 'col_idx' => 27, + 'col_cell_name' => 'AB', + 'col_name' => 'Date of Join', + 'is_mandatory' => false, + 'data_type' => 'date', + 'format' => 'd-m-Y', + 'allowed_values' => null + ], + + 'date_of_inception' => [ + 'col_idx' => 28, + 'col_cell_name' => 'AC', + 'col_name' => 'Date of Inception', + 'is_mandatory' => false, + 'data_type' => 'date', + 'format' => 'd-m-Y', + 'allowed_values' => null + ], + + 'date_of_accident' => [ + 'col_idx' => 29, + 'col_cell_name' => 'AD', + 'col_name' => 'Date of Accident', + 'is_mandatory' => false, + 'data_type' => 'date', + 'format' => 'd-m-Y', + 'allowed_values' => null + ], + + 'date_of_death' => [ + 'col_idx' => 30, + 'col_cell_name' => 'AE', + 'col_name' => 'Date of Death', + 'is_mandatory' => false, + 'data_type' => 'date', + 'format' => 'd-m-Y', + 'allowed_values' => null + ], + + 'date_of_intimate' => [ + 'col_idx' => 31, + 'col_cell_name' => 'AF', + 'col_name' => 'Date of Intimate', + 'is_mandatory' => false, + 'data_type' => 'date', + 'format' => 'd-m-Y', + 'allowed_values' => null + ], + + // Status Wise Column Mandatory + 'raised_date' => [ + 'col_idx' => 32, + 'col_cell_name' => 'AG', + 'col_name' => 'Raised Date', + 'is_mandatory' => false, + 'data_type' => 'date', + 'format' => 'd-m-Y', + 'allowed_values' => null + ], + + 'registration_date' => [ + 'col_idx' => 33, + 'col_cell_name' => 'AH', + 'col_name' => 'Registration Date', + 'is_mandatory' => false, + 'data_type' => 'date', + 'format' => 'd-m-Y', + 'allowed_values' => null + ], + + 'query_received_date' => [ + 'col_idx' => 34, + 'col_cell_name' => 'AI', + 'col_name' => 'Query Received Date', + 'is_mandatory' => false, + 'data_type' => 'date', + 'format' => 'd-m-Y', + 'allowed_values' => null + ], + + 'payment_initiate_date' => [ + 'col_idx' => 35, + 'col_cell_name' => 'AJ', + 'col_name' => 'Payment Initiate Date', + 'is_mandatory' => false, + 'data_type' => 'date', + 'format' => 'd-m-Y', + 'allowed_values' => null + ], + + 'denial_reason' => [ + 'col_idx' => 36, + 'col_cell_name' => 'AK', + 'col_name' => 'Denial Reason', + 'is_mandatory' => false, + 'data_type' => 'str', + 'format' => null, + 'allowed_values' => null + ], + + 'denial_date' => [ + 'col_idx' => 37, + 'col_cell_name' => 'AL', + 'col_name' => 'Denial Date', + 'is_mandatory' => false, + 'data_type' => 'date', + 'format' => 'd-m-Y', + 'allowed_values' => null + ], + + 'approved_date' => [ + 'col_idx' => 38, + 'col_cell_name' => 'AM', + 'col_name' => 'Approved Date', + 'is_mandatory' => false, + 'data_type' => 'date', + 'format' => 'd-m-Y', + 'allowed_values' => null + ], + + 'approved_letter' => [ + 'col_idx' => 39, + 'col_cell_name' => 'AN', + 'col_name' => 'Approved Letter', + 'is_mandatory' => false, + 'data_type' => 'str', + 'format' => null, + 'allowed_values' => null + ], + + 'approved_amount' => [ + 'col_idx' => 40, + 'col_cell_name' => 'AO', + 'col_name' => 'Approved Amount', + 'is_mandatory' => false, + 'data_type' => 'decimal', + 'format' => '2', + 'allowed_values' => null + ], + + 'approved_description' => [ + 'col_idx' => 41, + 'col_cell_name' => 'AP', + 'col_name' => 'Approved Description', + 'is_mandatory' => false, + 'data_type' => 'str', + 'format' => null, + 'allowed_values' => null + ], + + 'utr_details' => [ + 'col_idx' => 42, + 'col_cell_name' => 'AQ', + 'col_name' => 'UTR Details', + 'is_mandatory' => false, + 'data_type' => 'str', + 'format' => null, + 'allowed_values' => null + ], + + 'settle_letter' => [ + 'col_idx' => 43, + 'col_cell_name' => 'AR', + 'col_name' => 'Settle Letter', + 'is_mandatory' => false, + 'data_type' => 'str', + 'format' => null, + 'allowed_values' => null + ], + + 'settled_date' => [ + 'col_idx' => 44, + 'col_cell_name' => 'AS', + 'col_name' => 'Settled Date', + 'is_mandatory' => false, + 'data_type' => 'date', + 'format' => 'd-m-Y', + 'allowed_values' => null + ], + + 'return_remark' => [ + 'col_idx' => 45, + 'col_cell_name' => 'AT', + 'col_name' => 'Return Remark', + 'is_mandatory' => false, + 'data_type' => 'str', + 'format' => null, + 'allowed_values' => null + ], + + 'cancel_remark' => [ + 'col_idx' => 46, + 'col_cell_name' => 'AU', + 'col_name' => 'Cancel Remark', + 'is_mandatory' => false, + 'data_type' => 'str', + 'format' => null, + 'allowed_values' => null + ], + + 'awb_courier' => [ + 'col_idx' => 47, + 'col_cell_name' => 'AV', + 'col_name' => 'AWB No. and Courier Name', + 'is_mandatory' => false, + 'data_type' => 'str', + 'format' => null, + 'allowed_values' => null + ], + + 'non_id_reason' => [ + 'col_idx' => 48, + 'col_cell_name' => 'AW', + 'col_name' => 'Non ID Reason', + 'is_mandatory' => false, + 'data_type' => 'str', + 'format' => null, + 'allowed_values' => null + ] + ]; + + $this->tableHeaders = [ + "S NO", + "POLICY #", + "Status", + "Account manager", + "Insurer", + "TPA", + "Corporate", + "Emp ID", + "TPA ID", + "Claim ID", + "Employee Name", + "Insured Name", + "Relationship", + "Emp. Mobile", + "Emp mail id", + "Claim Collection", + "Source Detail", + "Claim Type", + "Hospital", + "DOA", + "DOD", + "Claim Amount", + "Date of Claim Receipt", + "Date sent to TPA", + "Date of Claim Registration", + "Date - Latest Query Raise", + "Date - Latest Query Resolution", + "Approved Amt", + "Date of Approval", + "UTR - Settlement", + "Date of Settlement", + "Reason", + "Remarks", + "Approval Letter", + "Settlement Letter", + "Denial Letter", + ]; + + $this->actualHeaders = [ + + "sno" => [ + 'col_idx' => 0, + 'col_cell_name' => 'A', + 'col_name' => 'S NO', + 'is_mandatory' => true, + 'data_type' => 'int', + 'format' => null, + 'allowed_values' => null + ], + "corporate" => [ + 'col_idx' => 6, + 'col_cell_name' => 'G', + 'col_name' => 'Corporate', + 'is_mandatory' => true, + 'data_type' => 'string', + 'format' => null, + 'allowed_values' => null, + 'custom' => 'check_client', + 'params' => ['client_excel_name'] + ], + "policy_no" => [ + 'col_idx' => 1, + 'col_cell_name' => 'B', + 'col_name' => 'POLICY #', + 'is_mandatory' => true, + 'data_type' => 'string', + 'format' => null, + 'allowed_values' => null, + ], + "status" => [ + 'col_idx' => 2, + 'col_cell_name' => 'C', + 'col_name' => 'Status', + 'is_mandatory' => true, + 'data_type' => 'string', + 'format' => null, + 'allowed_values' => null, + 'custom' => 'check_status', + 'params' => ['excel_status_data'] + ], + "acm" => [ + 'col_idx' => 3, + 'col_cell_name' => 'D', + 'col_name' => 'Account manager', + 'is_mandatory' => false, + 'data_type' => 'string', + 'format' => null, + 'allowed_values' => null + ], + "insurer" => [ + 'col_idx' => 4, + 'col_cell_name' => 'E', + 'col_name' => 'Insurer', + 'is_mandatory' => true, + 'data_type' => 'string', + 'format' => null, + 'allowed_values' => null, + 'custom' => 'check_insurer', + 'params' => ['insurer_excel_name'] + ], + "tpa" => [ + 'col_idx' => 5, + 'col_cell_name' => 'F', + 'col_name' => 'TPA', + 'is_mandatory' => false, + 'data_type' => 'string', + 'format' => null, + 'allowed_values' => null, + 'custom' => 'check_tpa', + 'params' => ['tpa_excel_name'] + ], + "emp_id" => [ + 'col_idx' => 7, + 'col_cell_name' => 'H', + 'col_name' => 'Emp ID', + 'is_mandatory' => true, + 'data_type' => 'string', + 'format' => null, + 'allowed_values' => null + ], + "tpa_id" => [ + 'col_idx' => 8, + 'col_cell_name' => 'I', + 'col_name' => 'TPA ID', + 'is_mandatory' => false, + 'data_type' => 'string', + 'format' => null, + 'allowed_values' => null + ], + "claim_id" => [ + 'col_idx' => 9, + 'col_cell_name' => 'J', + 'col_name' => 'Claim ID', + 'is_mandatory' => false, + 'data_type' => 'string', + 'format' => null, + 'allowed_values' => null + ], + "employee_name" => [ + 'col_idx' => 10, + 'col_cell_name' => 'K', + 'col_name' => 'Employee Name', + 'is_mandatory' => true, + 'data_type' => 'string', + 'format' => null, + 'allowed_values' => null + ], + "insured_name" => [ + 'col_idx' => 11, + 'col_cell_name' => 'L', + 'col_name' => 'Insured Name', + 'is_mandatory' => true, + 'data_type' => 'string', + 'format' => null, + 'allowed_values' => null + ], + "relationship" => [ + 'col_idx' => 12, + 'col_cell_name' => 'M', + 'col_name' => 'Relationship', + 'is_mandatory' => true, + 'data_type' => 'string', + 'format' => null, + 'allowed_values' => ['self', 'spouse', 'son', 'daughter', 'father', 'mother', 'father-in-law', 'mother-in-law'] + ], + "emp_mobile" => [ + 'col_idx' => 13, + 'col_cell_name' => 'N', + 'col_name' => 'Emp. Mobile', + 'is_mandatory' => false, + 'data_type' => 'string', + 'format' => 'phone', + 'allowed_values' => null + ], + "emp_email" => [ + 'col_idx' => 14, + 'col_cell_name' => 'O', + 'col_name' => 'Emp mail id', + 'is_mandatory' => false, + 'data_type' => 'string', + 'format' => 'email', + 'allowed_values' => null + ], + "claim_collection" => [ + 'col_idx' => 15, + 'col_cell_name' => 'P', + 'col_name' => 'Claim Collection', + 'is_mandatory' => true, + 'data_type' => 'string', + 'format' => null, + 'allowed_values' => ["In Person", "Courier", "Online Mode - Email", "Smart Service Desk", "Direct to TPA"] + ], + "source_detail" => [ + 'col_idx' => 16, + 'col_cell_name' => 'Q', + 'col_name' => 'Source Detail', + 'is_mandatory' => false, + 'data_type' => 'string', + 'format' => null, + 'allowed_values' => null + ], + "claim_type" => [ + 'col_idx' => 17, + 'col_cell_name' => 'R', + 'col_name' => 'Claim Type', + 'is_mandatory' => true, + 'data_type' => 'string', + 'format' => null, + 'allowed_values' => ["Claim", "Main Hospitalization", "Pre / Post", "OPD", "ReOpen", "TTD", "PTD", "PPD", "Death"] + ], + "hospital" => [ + 'col_idx' => 18, + 'col_cell_name' => 'S', + 'col_name' => 'Hospital', + 'is_mandatory' => false, + 'data_type' => 'string', + 'format' => null, + 'allowed_values' => null + ], + "doa" => [ + 'col_idx' => 19, + 'col_cell_name' => 'T', + 'col_name' => 'DOA', + 'is_mandatory' => false, + 'data_type' => 'date', + 'format' => 'm/d/Y', + 'allowed_values' => null + ], + "dod" => [ + 'col_idx' => 20, + 'col_cell_name' => 'U', + 'col_name' => 'DOD', + 'is_mandatory' => false, + 'data_type' => 'date', + 'format' => 'm/d/Y', + 'allowed_values' => null + ], + "claim_amount" => [ + 'col_idx' => 21, + 'col_cell_name' => 'V', + 'col_name' => 'Claim Amount', + 'is_mandatory' => false, + 'data_type' => 'str', + 'format' => null, + 'allowed_values' => null + ], + "date_claim_receipt" => [ + 'col_idx' => 22, + 'col_cell_name' => 'W', + 'col_name' => 'Date of Claim Receipt', + 'is_mandatory' => false, + 'data_type' => 'date', + 'format' => 'm/d/Y', + 'allowed_values' => null + ], + "date_claim_registration" => [ + 'col_idx' => 24, + 'col_cell_name' => 'Y', + 'col_name' => 'Date of Claim Registration', + 'is_mandatory' => false, + 'data_type' => 'date', + 'format' => 'm/d/Y', + 'allowed_values' => null + ], + "date_latest_query_raise" => [ + 'col_idx' => 25, + 'col_cell_name' => 'Z', + 'col_name' => 'Date - Latest Query Raise', + 'is_mandatory' => false, + 'data_type' => 'date', + 'format' => 'm/d/Y', + 'allowed_values' => null + ], + "date_latest_query_resolution" => [ + 'col_idx' => 26, + 'col_cell_name' => 'AA', + 'col_name' => 'Date - Latest Query Resolution', + 'is_mandatory' => false, + 'data_type' => 'date', + 'format' => 'm/d/Y', + 'allowed_values' => null + ], + "approved_amt" => [ + 'col_idx' => 27, + 'col_cell_name' => 'AB', + 'col_name' => 'Approved Amt', + 'is_mandatory' => false, + 'data_type' => 'str', + 'format' => null, + 'allowed_values' => null + ], + "date_approval" => [ + 'col_idx' => 28, + 'col_cell_name' => 'AC', + 'col_name' => 'Date of Approval', + 'is_mandatory' => false, + 'data_type' => 'date', + 'format' => 'm/d/Y', + 'allowed_values' => null + ], + "utr_settlement" => [ + 'col_idx' => 29, + 'col_cell_name' => 'AD', + 'col_name' => 'UTR - Settlement', + 'is_mandatory' => false, + 'data_type' => 'string', + 'format' => null, + 'allowed_values' => null + ], + "date_settlement" => [ + 'col_idx' => 30, + 'col_cell_name' => 'AE', + 'col_name' => 'Date of Settlement', + 'is_mandatory' => false, + 'data_type' => 'date', + 'format' => 'm/d/Y', + 'allowed_values' => null + ], + "reason" => [ + 'col_idx' => 31, + 'col_cell_name' => 'AF', + 'col_name' => 'Reason', + 'is_mandatory' => false, + 'data_type' => 'text', + 'format' => null, + 'allowed_values' => null + ], + "remarks" => [ + 'col_idx' => 32, + 'col_cell_name' => 'AG', + 'col_name' => 'Remarks', + 'is_mandatory' => false, + 'data_type' => 'text', + 'format' => null, + 'allowed_values' => null + ], + "approval_letter" => [ + 'col_idx' => 33, + 'col_cell_name' => 'AH', + 'col_name' => 'Approval Letter', + 'is_mandatory' => false, + 'data_type' => 'string', + 'format' => null, + 'allowed_values' => null + ], + "settlement_letter" => [ + 'col_idx' => 34, + 'col_cell_name' => 'AI', + 'col_name' => 'Settlement Letter', + 'is_mandatory' => false, + 'data_type' => 'string', + 'format' => null, + 'allowed_values' => null + ], + "denial_letter" => [ + 'col_idx' => 35, + 'col_cell_name' => 'AJ', + 'col_name' => 'Denial Letter', + 'is_mandatory' => false, + 'data_type' => 'string', + 'format' => null, + 'allowed_values' => null + ] + ]; + + } + + //create a sample excel for development + public function createSampleClaimDumpExcelFileWithHeaderOnly() + { + + // create a sample file + $headers = []; + foreach ($this->claim_dump_excel_columns as $key => $value) { + $headers[] = $value['col_name']; + } + generateExcelWithHeader($headers, 'claim_dump_sample.xlsx'); + dd($headers); + } + + // --------------------------------------------------------------------------------------------------------- + + public function claimDumpExcelFileFormatValidation($params) + { + $file_id = $params['file_id']; + $file = $this->claimDumpFileModel->where("id", $file_id)->first(); + $this->myLogger->logme('error', "Start the claim dump file format validataion with the file id : " . $file_id); + // dd($file); + + $return = []; + if (empty($file)) { + return array('status' => false, 'message' => 'File not found in Database'); + } + + $file_name_with_path = WRITEPATH . "/uploads/claim_dump_excel/" . $file['file_name']; + + //check physical file exist + if (!file_exists($file_name_with_path)) { + + $message = "Physcial file not found"; + $this->myLogger->logme('error', ($message . ' for file id : ' . $file_id)); + $this->claimDumpFileModel->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); + } + + //Read the excel file + try { + $excel_data_and_headers = $this->extractExcelData($file['file_name']); + $excel_data = $excel_data_and_headers['excel_data']; + } catch (\Exception $e) { + $errorDetails = [ + 'error_message' => $e->getMessage(), + 'file' => $e->getFile(), + 'line' => $e->getLine(), + 'stack_trace' => $e->getTraceAsString(), + ]; + $message = "Contact system admin"; + $this->claimDumpFileModel->where('id', $file_id)->set(['status' => 'failed', 'reason' => json_encode(['error_summary' => array_count_values([5]), 'error_data' => $message])])->update(); + $this->myLogger->logme("error", 'Excel data extraction failed due to : ' . json_encode($errorDetails ?? [])); + return $errorDetails; + } + // dd($excel_data_and_headers); + + //Claim dump excel colums + $columns_to_check = $excel_data_and_headers['claim_dump_excel_columns']; + // dd($columns_to_check); + + $client_data = $this->clientModel->where('is_active', 1)->where('client_type', 1)->findAll(); + $insurer_data = $this->insurerModel->where('is_active', 1)->findAll(); + $tpa_data = $this->TPAModel->where('is_active', 1)->findAll(); + $claim_status_data = $this->ticketClaimStatusModel->select('id, claim_status')->where('is_active', 1)->orderBy('id', 'asc')->groupBy('claim_status')->findAll(); + + + //Store the error data by this structure + $result = ['error_type' => 1, 'error_summary' => [], 'error_data' => []]; + + //excel data is empty than through the error + if(count($excel_data ?? []) <= 1){ + $message = "Uploaded file is empty"; + return array('error_summary' => [5], 'error_data' => $message); + } + + //check no of columns in excel + $excel_columns = ($excel_data[0]); + // $keys = array_keys($columns_to_check); + + //check columns order in excel + $column_count_res = check_columns_name($columns_to_check, $excel_columns); + // dd($column_count_res); + + if (isset($column_count_res) && count($column_count_res)) { + //columns count mismatch + $message = implode("\n", $column_count_res); + $this->myLogger->logme('error', ($message . ' for file id ' . $file_id)); + $this->claimDumpFileModel->where('id', $file_id)->set(['status' => 'failed', 'reason' => json_encode(['error_summary' => array_count_values([6]), 'error_data' => $message])])->update(); + return array('error_summary' => [6], 'error_data' => $message); + } + + //remove header + unset($excel_data[0]); + + try { + foreach ($excel_data as $row_key => $row) { + + //avoid empty rows + if (check_row_is_empty_or_null($row)) { + break; + } + + //iterate each row for columns validations + foreach ($row as $col_key => $col) { + + if (!isset($columns_to_check[$col_key])) { + continue; + } + + $is_mandatory = $columns_to_check[$col_key]['is_mandatory']; + $format = $columns_to_check[$col_key]['format']; + $allowed_values = $columns_to_check[$col_key]['allowed_values']; + $custom_function = isset($columns_to_check[$col_key]['custom']) ? $columns_to_check[$col_key]['custom'] : null; + $binding_params = isset($columns_to_check[$col_key]['params']) ? $columns_to_check[$col_key]['params'] : null; + + + $column_dispaly_name = $columns_to_check[$col_key]['col_name']; + $column_index = $columns_to_check[$col_key]['col_idx']; + $column_cell = $columns_to_check[$col_key]['col_cell_name']; + + + if ($column_dispaly_name == "Corporate") { + $client_excel_name = ["client_name" => $col, "client_data" => $client_data]; + } + + if ($column_dispaly_name == "Insurer") { + $insurer_excel_name = ["insurer_name" => $col, "insurer_data" => $insurer_data]; + } + + if ($column_dispaly_name == "TPA") { + $tpa_excel_name = ["tpa_name" => $col, "tpa_data" => $tpa_data]; + } + + if ($column_dispaly_name == "Status") { + $excel_status_data = ["value" => $col, "data" => $claim_status_data]; + } + + //mandatory check + if (is_bool($is_mandatory) && $is_mandatory === true) { + if ($col == "" || $col == NULL) { + array_push($result['error_summary'], 1); //push error code for summary + $result['error_data'][$row_key][$col_key]['col_name'] = $column_dispaly_name; //push column name + $result['error_data'][$row_key][$col_key]['col_idx'] = $column_index; //push column index + $result['error_data'][$row_key][$col_key]['error'][] = 'Value is mandatory'; //push exact error desc + } + } + + //format check + if (isset($format)) { + $format_error = dynamic_check_excel_date_format($col, $format); + if (!$format_error['status']) { + array_push($result['error_summary'], 2); + $result['error_data'][$row_key][$col_key]['col_name'] = $column_dispaly_name; //push column name + $result['error_data'][$row_key][$col_key]['col_idx'] = $column_index; //push column index + $result['error_data'][$row_key][$col_key]['error'][] = $format_error['error']; + } + } + + //allowed values check + if (($is_mandatory === true && isset($allowed_values) && is_array($allowed_values)) || (is_array($is_mandatory) && (isset($allowed_values) && is_array($allowed_values)))) { + if (!in_array((trim($col)), $allowed_values)) { + array_push($result['error_summary'], 3); + $result['error_data'][$row_key][$col_key]['col_name'] = $column_dispaly_name; //push column name + $result['error_data'][$row_key][$col_key]['col_idx'] = $column_index; //push column index + $result['error_data'][$row_key][$col_key]['error'][] = "Value not allowed: Expected " . implode(",", $allowed_values) . " and received $col"; + } + } + + //custom function check + if (isset($custom_function)) { + + // convert string params into PHP variables + // Create an array of variables to pass custom helper funcitons + $param_values = []; + foreach ($binding_params as $bkey => $bparam) { + $param_values[] = ($$bparam); + } + + $res = call_user_func_array($custom_function, $param_values); + + if ($res['status'] === false) { + array_push($result['error_summary'], 4); + $result['error_data'][$row_key][$col_key]['col_name'] = $column_dispaly_name; //push column name + $result['error_data'][$row_key][$col_key]['col_idx'] = $column_index; //push column index + $result['error_data'][$row_key][$col_key]['error'][] = $res['error']; + } + } + } + } + } catch (\Exception $e) { + $errorDetails = [ + 'error_message' => $e->getMessage(), + 'file' => $e->getFile(), + 'line' => $e->getLine(), + 'stack_trace' => $e->getTraceAsString(), + ]; + $message = "Contact system admin"; + $this->claimDumpFileModel->where('id', $file_id)->set(['status' => 'failed', 'reason' => json_encode(['error_summary' => array_count_values([5]), 'error_data' => $message])])->update(); + $this->myLogger->logme("error", 'Claim dump file format validation failed due to : ' . json_encode($errorDetails ?? [])); + return $errorDetails; + } + + if (isset($result['error_summary']) && count($result['error_summary'])) { + $result['error_summary'] = array_count_values($result['error_summary']); + $status = 'failed'; + $failure_reason = ((json_encode($result))); + $this->claimDumpFileModel->where('id', $file_id)->set(['status' => $status, 'reason' => $failure_reason])->update(); + $this->myLogger->logme("error", '{file_id} uploaded failed', ['file_id' => $file_id]); + } else { //trigger next data validation via job queue server + //proceed next data level validation in JOB queue + $r = Jobs::addJob(['job_name' => 'claimDumpExcelFileDataValidation', 'payload' => ['file_id' => $file_id]]); + // $response = $this->claimDumpExcelFileDataValidation(['file_id' => $file_id]); + } + + return $result; + } + + public function claimDumpExcelFileDataValidation($params) + { + //get file name + $file_id = $params['file_id']; + $file = $this->claimDumpFileModel->find($file_id); + $this->myLogger->logme('error', "Start the claim dump File Data Validataion with the file id : " . $file_id); + // dd($file); + + if (!isset($file)) { + return array('status' => false, 'message' => 'File not found in Database'); + } + + $file_name_with_path = WRITEPATH . "/uploads/claim_dump_excel/" . $file['file_name']; + + //check physical file + if (!file_exists($file_name_with_path)) { + $message = "Physical file not found"; + $this->myLogger->logme('error', ($message . ' for file id ' . $file_id)); + $this->claimDumpFileModel->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); + } + + //Read the excel file + try { + $excel_data_and_headers = $this->extractExcelData($file['file_name'], "modified_column"); + $excel_data = $excel_data_and_headers['excel_data']; + } catch (\Exception $e) { + $errorDetails = [ + 'error_message' => $e->getMessage(), + 'file' => $e->getFile(), + 'line' => $e->getLine(), + 'stack_trace' => $e->getTraceAsString(), + ]; + $message = "Contact system admin"; + $this->claimDumpFileModel->where('id', $file_id)->set(['status' => 'failed', 'reason' => json_encode(['error_summary' => array_count_values([5]), 'error_data' => $message])])->update(); + $this->myLogger->logme("error", 'Excel data extraction failed due to : ' . json_encode($errorDetails ?? [])); + return $errorDetails; + } + // dd($excel_data_and_headers); + // print_rr($excel_data); + + //Claim dump excel colums + $columns_to_check = $excel_data_and_headers['claim_dump_excel_columns']; + // dd($columns_to_check); + + $result = ['error_type' => 2, 'error_summary' => [], 'error_data' => []]; + + //remove header + unset($excel_data[0]); + + try { + foreach ($excel_data as $row_key => $row) { + + //avoid empty rows + if (check_row_is_empty_or_null($row)) { + break; + } + + $client_column_index = $columns_to_check['corporate']['col_idx']; + $policy_no_column_index = $columns_to_check['policy_no']['col_idx']; + $insurer_column_index = $columns_to_check['insurer']['col_idx']; + $tpa_column_index = $columns_to_check['tpa']['col_idx']; + + $emp_id_column_index = $columns_to_check['emp_id']['col_idx']; + $emp_name_column_index = $columns_to_check['employee_name']['col_idx']; + $insured_name_column_index = $columns_to_check['insured_name']['col_idx']; + $claim_no_column_index = $columns_to_check['claim_id']['col_idx']; + $tpa_no_column_index = $columns_to_check['tpa_id']['col_idx']; + $relation_column_index = $columns_to_check['relationship']['col_idx']; + $acm_column_index = $columns_to_check['acm']['col_idx']; + + //excel file Account Manager Details like Name and Mobile Number + $excel_acm_data = $row[$acm_column_index] ?? null; + + $acm_name = null; + $acm_mobile = null; + + //seperate the Account Manager Name and Mobile No + if (!empty($excel_acm_data)) { + $parts = array_map('trim', explode('-', $excel_acm_data, 2)); + $acm_name = $parts[0] ?? null; + $acm_mobile = $parts[1] ?? null; + } + + $params = [ + 'client_name' => $row[$client_column_index] ?? null, + 'policy_no' => $row[$policy_no_column_index] ?? null, + 'insurer_short_name' => $row[$insurer_column_index] ?? null, + 'tpa_short_name' => $row[$tpa_column_index] ?? null, + 'emp_code' => $row[$emp_id_column_index] ?? null, + 'emp_name' => $row[$emp_name_column_index] ?? null, + 'insured_name' => $row[$insured_name_column_index] ?? null, + 'claim_no' => $row[$claim_no_column_index] ?? null, + 'tpa_no' => $row[$tpa_no_column_index] ?? null, + 'relationship' => $row[$relation_column_index] ?? null, + 'acm_mobile' => $acm_mobile ?? null, + 'acm_name' => $acm_name ?? null, + ]; + + $ticketMasterModal = new TicketMasterModel(); + + //check the Claim + $claim_data = $ticketMasterModal->getTheClaimDetails($params); + // dd($claim_data); + if (count($claim_data) != 0) { + + array_push($result['error_summary'], 7); + $result['error_data'][$row_key][$policy_no_column_index]['col_name'] = $columns_to_check['policy_no']['col_name']; //push column name + $result['error_data'][$row_key][$policy_no_column_index]['col_idx'] = $policy_no_column_index; //push column index + $result['error_data'][$row_key][$policy_no_column_index]['error'][] = "This claim already exist in the system"; + + } else { + + //check the policy + $policy_data = $ticketMasterModal->getPolicyData($params); + // dd($policy_data); + if (count($policy_data) == 0) { + + array_push($result['error_summary'], 8); + $result['error_data'][$row_key][$policy_no_column_index]['col_name'] = $columns_to_check['policy_no']['col_name']; //push column name + $result['error_data'][$row_key][$policy_no_column_index]['col_idx'] = $policy_no_column_index; //push column index + $result['error_data'][$row_key][$policy_no_column_index]['error'][] = "The combination of Client, Insurer, TPA and Policy No. does not exist in the system"; + + } else { + + //check the employee and insured + $employee_data = $ticketMasterModal->getEmployeeAndEmployeePolicyDetails($params) ?? []; + // dd($employee_data); + if (count($employee_data) == 0) { + array_push($result['error_summary'], 9); + $result['error_data'][$row_key][$emp_name_column_index]['col_name'] = $columns_to_check['employee_name']['col_name']; //push column name + $result['error_data'][$row_key][$emp_name_column_index]['col_idx'] = $emp_name_column_index; //push column index + $result['error_data'][$row_key][$emp_name_column_index]['error'][] = "This employee not exist in the system"; + } + } + + //check the Account Manager exist + $acm_data = $ticketMasterModal->getAcmUserDetails($params) ?? []; + // dd($acm_data); + if (count($acm_data) == 0) { + array_push($result['error_summary'], 10); + $result['error_data'][$row_key][$emp_name_column_index]['col_name'] = $columns_to_check['employee_name']['col_name']; //push column name + $result['error_data'][$row_key][$emp_name_column_index]['col_idx'] = $emp_name_column_index; //push column index + $result['error_data'][$row_key][$emp_name_column_index]['error'][] = "This Acount Manager not exist in the system"; + } + } + + } + } catch (\Exception $e) { + $errorDetails = [ + 'error_message' => $e->getMessage(), + 'file' => $e->getFile(), + 'line' => $e->getLine(), + 'stack_trace' => $e->getTraceAsString(), + ]; + $message = "Contact system admin"; + $this->claimDumpFileModel->where('id', $file_id)->set(['status' => 'failed', 'reason' => json_encode(['error_summary' => array_count_values([5]), 'error_data' => $message])])->update(); + $this->myLogger->logme("error", 'Claim dump file data validation failed due to : ' . json_encode($errorDetails ?? [])); + return $errorDetails; + } + + if (isset($result['error_summary']) && count($result['error_summary'])) { + + $result['error_summary'] = array_count_values($result['error_summary']); + $status = 'failed'; + $failure_reason = ((json_encode($result))); + $this->claimDumpFileModel->where('id', $file_id)->set(['status' => $status, 'reason' => $failure_reason])->update(); + $this->myLogger->logme("error", '{file_id} uploaded failed', ['file_id' => $file_id]); + + } else { + $r = Jobs::addJob(['job_name' => 'claimDumpOnBoardProcess', 'payload' => ['file_id' => $file_id]]); + } + + return $result; + } + + public function claimDumpOnBoardProcess($params) + { + //get file name + $file_id = $params['file_id']; + $file = $this->claimDumpFileModel->find($file_id); + $this->myLogger->logme('error', "Start the claim dump OnBoard Process with the file id : " . $file_id); + // dd($file); + + if (!isset($file)) { + return array('status' => false, 'message' => 'File not found in Database'); + } + + $file_name_with_path = WRITEPATH . "/uploads/claim_dump_excel/" . $file['file_name']; + + //check physical file + if (!file_exists($file_name_with_path)) { + $message = "Physical file not found"; + $this->myLogger->logme('error', ($message . ' for file id ' . $file_id)); + $this->claimDumpFileModel->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); + } + + //Read the excel file + try { + $excel_data_and_headers = $this->extractExcelData($file['file_name'], "modified_column"); + $excel_data = $excel_data_and_headers['excel_data']; + unset($excel_data[0]); //remove header + } catch (\Exception $e) { + $errorDetails = [ + 'error_message' => $e->getMessage(), + 'file' => $e->getFile(), + 'line' => $e->getLine(), + 'stack_trace' => $e->getTraceAsString(), + ]; + $message = "Contact system admin"; + $this->claimDumpFileModel->where('id', $file_id)->set(['status' => 'failed', 'reason' => json_encode(['error_summary' => array_count_values([5]), 'error_data' => $message])])->update(); + $this->myLogger->logme("error", 'Excel data extraction failed due to : ' . json_encode($errorDetails ?? [])); + return $errorDetails; + } + // dd($excel_data_and_headers); + + //Claim dump excel colums + $columns_to_check = $excel_data_and_headers['claim_dump_excel_columns']; + + //create the instance of the ticket master modal + $ticketMasterModal = new TicketMasterModel(); + + $inserted_claim_list = []; + //loop the excel data to be insert the ticket master modal + + try{ + foreach ($excel_data as $row_key => $row) { + + //avoid empty rows + if (check_row_is_empty_or_null($row)) { + break; + } + + $client_column_index = $columns_to_check['corporate']['col_idx']; + $policy_no_column_index = $columns_to_check['policy_no']['col_idx']; + $insurer_column_index = $columns_to_check['insurer']['col_idx']; + $tpa_column_index = $columns_to_check['tpa']['col_idx']; + $emp_id_column_index = $columns_to_check['emp_id']['col_idx']; + $emp_name_column_index = $columns_to_check['employee_name']['col_idx']; + $insured_name_column_index = $columns_to_check['insured_name']['col_idx']; + $claim_no_column_index = $columns_to_check['claim_id']['col_idx']; + $tpa_no_column_index = $columns_to_check['tpa_id']['col_idx']; + $relation_column_index = $columns_to_check['relationship']['col_idx']; + + $params = [ + 'client_name' => $row[$client_column_index] ?? null, + 'policy_no' => $row[$policy_no_column_index] ?? null, + 'insurer_short_name' => $row[$insurer_column_index] ?? null, + 'tpa_short_name' => $row[$tpa_column_index] ?? null, + 'emp_code' => $row[$emp_id_column_index] ?? null, + 'emp_name' => $row[$emp_name_column_index] ?? null, + 'insured_name' => $row[$insured_name_column_index] ?? null, + 'claim_no' => $row[$claim_no_column_index] ?? null, + 'tpa_no' => $row[$tpa_no_column_index] ?? null, + 'relationship' => $row[$relation_column_index] ?? null, + ]; + + // get the policy data + $policy_data = $ticketMasterModal->getEmployeeAndEmployeePolicyDetails($params); + // dd($policy_data); + + //construct the claim data to be insert + $data = $this->constructClaimData($row, $policy_data, $columns_to_check); + // dd($data); + + if(!empty($data)){ + + $data['file_id'] = $file_id; + //insert the claim data to ticket master table + $insert = $ticketMasterModal->insert($data); + $inserted_claim_list[] = $insert; + + $str = implode(', ', array_map(fn($k, $v) => "$k=$v", array_keys($params), $params)) ?? ""; + $this->myLogger->logme("error",'Claim insert success --- :' . $str); + + }else{ + $str = implode(', ', array_map(fn($k, $v) => "$k=$v", array_keys($params), $params)) ?? ""; + $this->myLogger->logme("error",'This employee claim dose not insert --- :' . $str); + } + + + } + }catch(\Exception $e){ + $errorDetails = [ + 'error_message' => $e->getMessage(), + 'file' => $e->getFile(), + 'line' => $e->getLine(), + 'stack_trace' => $e->getTraceAsString(), + ]; + $message = "Contact system admin"; + $this->claimDumpFileModel->where('id', $file_id)->set(['status' => 'failed', 'reason' => json_encode(['error_summary' => array_count_values([5]), 'error_data' => $message])])->update(); + $this->myLogger->logme("error", 'Claim dump file Onboard Process failed due to : ' . json_encode( $errorDetails ?? [])); + return $errorDetails; + } + + $this->claimDumpFileModel->where('id', $file_id)->set(['status' => 'success','reason' => ''])->update(); + $this->myLogger->logme("error",'{file_id} claim dump uploaded success',['file_id' => $file_id]); + return $inserted_claim_list; + } + + public function extractExcelData($file_name, $returnType = null) + { + // $file_name = "claims_dump_form_client.xlsx"; + // Load the Excel file + $file_name_with_path = WRITEPATH . "/uploads/claim_dump_excel/" . $file_name; + $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file_name_with_path); + $worksheet = $spreadsheet->getActiveSheet(); + + // Get the highest row and column numbers + $highestRow = $worksheet->getHighestDataRow(); + $highestColumn = $worksheet->getHighestDataColumn(); + // dd($highestRow, $highestColumn); + + // Get header row (assuming headers are in row 1) + // $headerRow = $worksheet->rangeToArray('A1:' . $highestColumn . '1', null, true, false)[0]; + $excel_data = $worksheet->rangeToArray('A1:' . $highestColumn . $highestRow); + // print_rr($excel_data); die; + + $header_with_column_index = $this->getTheColumnIndex($excel_data[0], $this->actualHeaders, $returnType); + + //Sanitize the excel data + // $excel_data = ExcelSanitizeHelper::sanitizeArrayData($excel_data); + + $data = [ + 'claim_dump_excel_columns' => $header_with_column_index, + 'excel_data' => $excel_data, + ]; + + // dd($data); + return $data; + } + + private function getTheColumnIndex($headerRow, $definedColumns, $returnType = null) + { + $result = []; + foreach ($definedColumns as $key => $value) { + foreach ($headerRow as $col_index => $col_name) { + + if($returnType == null){ + if(trim($col_name) == trim($value['col_name'])){ + $columnLetter = Coordinate::stringFromColumnIndex(($col_index + 1)); + $result[$col_index] = $value; + $result[$col_index]["col_idx"] = $col_index; + $result[$col_index]["col_cell_name"] = $columnLetter; + } + }else{ + if(trim($col_name) == trim($value['col_name'])){ + $columnLetter = Coordinate::stringFromColumnIndex(($col_index + 1)); + $definedColumns[$key]["col_idx"] = $col_index; + $definedColumns[$key]["col_cell_name"] = $columnLetter; + } + } + } + } + + // dd($result); + if($returnType == null){ + return $result; + } + + return $definedColumns; + + } + + private function constructClaimData($excel_data, $db_data, $columns_to_check) + { + $client_column_index = $columns_to_check['corporate']['col_idx']; + $policy_no_column_index = $columns_to_check['policy_no']['col_idx']; + $insurer_column_index = $columns_to_check['insurer']['col_idx']; + $tpa_column_index = $columns_to_check['tpa']['col_idx']; + + $emp_id_column_index = $columns_to_check['emp_id']['col_idx']; + $emp_name_column_index = $columns_to_check['employee_name']['col_idx']; + $insured_name_column_index = $columns_to_check['insured_name']['col_idx']; + $claim_no_column_index = $columns_to_check['claim_id']['col_idx']; + $tpa_no_column_index = $columns_to_check['tpa_id']['col_idx']; + $relation_column_index = $columns_to_check['relationship']['col_idx']; + + $status_column_index = $columns_to_check['status']['col_idx']; + $acm_column_index = $columns_to_check['acm']['col_idx']; + $tpa_id_column_index = $columns_to_check['tpa_id']['col_idx']; + $claim_id_column_index = $columns_to_check['claim_id']['col_idx']; + $emp_mobile_column_index = $columns_to_check['emp_mobile']['col_idx']; + $emp_email_column_index = $columns_to_check['emp_email']['col_idx']; + $claim_collection_column_index = $columns_to_check['claim_collection']['col_idx']; + $source_detail_column_index = $columns_to_check['source_detail']['col_idx']; + $claim_type_column_index = $columns_to_check['claim_type']['col_idx']; + $hospital_column_index = $columns_to_check['hospital']['col_idx']; + $doa_column_index = $columns_to_check['doa']['col_idx']; + $dod_column_index = $columns_to_check['dod']['col_idx']; + $claim_amount_column_index = $columns_to_check['claim_amount']['col_idx']; + $date_claim_receipt_column_index = $columns_to_check['date_claim_receipt']['col_idx']; + $date_claim_registration_column_index = $columns_to_check['date_claim_registration']['col_idx']; + $date_latest_query_raise_column_index = $columns_to_check['date_latest_query_raise']['col_idx']; + $date_latest_query_resolution_index = $columns_to_check['date_latest_query_resolution']['col_idx']; + $approved_amt_column_index = $columns_to_check['approved_amt']['col_idx']; + $date_approval_column_index = $columns_to_check['date_approval']['col_idx']; + $utr_settlement_column_index = $columns_to_check['utr_settlement']['col_idx']; + $date_settlement_column_index = $columns_to_check['date_settlement']['col_idx']; + $reason_column_index = $columns_to_check['reason']['col_idx']; + $remarks_column_index = $columns_to_check['remarks']['col_idx']; + $approval_letter_column_index = $columns_to_check['approval_letter']['col_idx']; + $settlement_letter_column_index = $columns_to_check['settlement_letter']['col_idx']; + $denial_letter_column_index = $columns_to_check['denial_letter']['col_idx']; + + $excel_status_data = $excel_data[$status_column_index] ?? null; + $excel_relationship_data = $excel_data[$relation_column_index] ?? null; + $excel_acm_data = $excel_data[$acm_column_index] ?? null; + $excel_tpa_id_data = $excel_data[$tpa_id_column_index] ?? null; + $excel_claim_id_data = $excel_data[$claim_id_column_index] ?? null; + $excel_emp_mobile_data = $excel_data[$emp_mobile_column_index] ?? null; + $excel_emp_email_data = $excel_data[$emp_email_column_index] ?? null; + $excel_claim_collection_data = $excel_data[$claim_collection_column_index] ?? null; + $excel_source_detail_data = $excel_data[$source_detail_column_index] ?? null; + $excel_claim_type_data = $excel_data[$claim_type_column_index] ?? null; + $excel_hospital_data = $excel_data[$hospital_column_index] ?? null; + $excel_doa_data = $excel_data[$doa_column_index] ?? null; + $excel_dod_data = $excel_data[$dod_column_index] ?? null; + $excel_claim_amount_data = $excel_data[$claim_amount_column_index] ?? null; + $excel_date_claim_receipt_data = $excel_data[$date_claim_receipt_column_index] ?? null; + $excel_date_claim_registration_data = $excel_data[$date_claim_registration_column_index] ?? null; + $excel_date_latest_query_raise_data = $excel_data[$date_latest_query_raise_column_index] ?? null; + $excel_date_latest_query_resolution_data = $excel_data[$date_latest_query_resolution_index] ?? null; + $excel_approved_amt_data = $excel_data[$approved_amt_column_index] ?? null; + $excel_date_approval_data = $excel_data[$date_approval_column_index] ?? null; + $excel_utr_settlement_data = $excel_data[$utr_settlement_column_index] ?? null; + $excel_date_settlement_data = $excel_data[$date_settlement_column_index] ?? null; + $excel_reason_data = $excel_data[$reason_column_index] ?? null; + $excel_remarks_data = $excel_data[$remarks_column_index] ?? null; + $excel_approval_letter_data = $excel_data[$approval_letter_column_index] ?? null; + $excel_settlement_letter_data = $excel_data[$settlement_letter_column_index] ?? null; + $excel_denial_letter_data = $excel_data[$denial_letter_column_index] ?? null; + + + //create the instance of the ticket master modal + $ticketMasterModal = new TicketMasterModel(); + + //excel file Account Manager Details like Name and Mobile Number + $excel_acm_data = $excel_data[$acm_column_index] ?? null; + + $acm_name = null; + $acm_mobile = null; + + //seperate the Account Manager Name and Mobile No + if (!empty($excel_acm_data)) { + $parts = array_map('trim', explode('-', $excel_acm_data, 2)); + $acm_name = $parts[0] ?? null; + $acm_mobile = $parts[1] ?? null; + } + + $params = [ + "acm_name" => $acm_name, + "acm_mobile" => $acm_mobile, + ]; + + //get the acountmanager data + $acm_data = $ticketMasterModal->getAcmUserDetails($params) ?? []; + + //get the claim status id from the database + $claim_status_data = $this->ticketClaimStatusModel + ->select('id, claim_status') + ->where('is_active', 1) + ->where('ticket_type', $db_data['ticket_type_id']) + ->where('LOWER(claim_status)', strtolower($excel_status_data)) + ->first(); + + $claim_status_id = $claim_status_data['id'] ?? null; + + //initialize Ticket controller for the other data + $ticketController = new TicketController(); + $mode_of_intimation = array_flip($ticketController->modeOFIntimate); + + //handle the Claim Type data key + $cliam_type_id = 1; + if(isset($db_data['ticket_type_id'])){ + if($db_data['ticket_type_id'] == 2){ + $claim_type = array_flip($ticketController->claimType[1]); + $cliam_type_id = $claim_type[$excel_claim_type_data] ?? 1; + }else{ + $claim_type = array_flip($ticketController->claimType[2]); + $cliam_type_id = $claim_type[$excel_claim_type_data] ?? 1; + } + } + + $db_data['insured_name'] = $db_data['insured_emp_id'] ?? null; + //get Insured emp name and Insured emp id + $insured_data = $ticketMasterModal->getInsuredDetails($db_data); + + //handle remarks based on the status + $return_remarks = null; + $cancel_remarks = null; + $denial_reason = null; + if(strtolower($excel_status_data) == strtolower('RETURNED')){ + $return_remarks = $excel_remarks_data ?? null; + }else if(strtolower($excel_status_data) == strtolower('CANCELLED')){ + $cancel_remarks = $excel_remarks_data ?? null; + }else if(strtolower($excel_status_data) == strtolower('REJECTED')){ + $denial_reason = $excel_reason_data ?? null; + } + + $ticketMaster = [ + 'ticket_type_id' => $db_data['ticket_type_id'] ?? null, + 'claim_status_id' => $claim_status_id ?? null, + 'acm_id' => $acm_data['id'] ?? null, + 'insurer_id' => $db_data['insurer_id'] ?? null, + 'tpa_id' => $excel_tpa_id_data ?? $db_data['tpa_id'] ?? null, + 'client_id' => $db_data['client_id'] ?? null, + 'emp_id' => $db_data['emp_id'] ?? null, + 'client_policy_id' => $db_data['client_policy_id'] ?? null, + 'policy_no' => $db_data['policy_no'] ?? null, + 'emp_code' => $db_data['emp_code'] ?? null, + 'tpa_no' => $db_data['tpa_no'] ?? null, + 'emp_name' => $db_data['emp_name'] ?? null, + 'relationship' => $excel_relationship_data ?? null, + 'emp_mobile' => $excel_emp_mobile_data ?? $db_data['emp_mobile'] ?? null, + 'emp_mail' => $excel_emp_email_data ?? $db_data['emp_mail'] ?? null, + + 'mode_of_intimation' => $mode_of_intimation[$excel_claim_collection_data] ?? null, + 'claim_type' => $cliam_type_id ?? null, + + 'insured_emp_id' => $insured_data['emp_id'] ?? null, + 'insured_name' => $insured_data['name'] ?? $db_data['insured_emp_id'] ?? null, + + 'hospital_name' => $excel_hospital_data ?? null, + 'claim_amount' => $excel_claim_amount_data ?? null, + 'claim_number' => $excel_claim_id_data ?? null, + 'approved_letter' => $excel_approval_letter_data ?? null, + 'approved_amount' => $excel_approved_amt_data ?? null, + 'utr_details' => $excel_utr_settlement_data ?? null, + 'settle_letter' => $excel_settlement_letter_data ?? null, + 'return_remark' => $return_remarks, + 'cancel_remark' => $cancel_remarks, + 'denial_reason' => $denial_reason ?? null, + + 'doa' => normalizeDate($excel_doa_data), + 'dod' => normalizeDate($excel_dod_data), + 'raised_date' => normalizeDate($excel_date_latest_query_raise_data), + 'registration_date' => normalizeDate($excel_date_claim_registration_data), + 'query_received_date' => normalizeDate($excel_date_latest_query_resolution_data), + 'approved_date' => normalizeDate($excel_date_approval_data), + 'settled_date' => normalizeDate($excel_date_settlement_data), + + 'priority' => null, + 'emp_personal_mail' => null, + 'pod_no' => null, + 'dob' => null, + 'date_of_join' => null, + 'date_of_incep' => null, + 'date_of_accident' => null, + 'date_of_death' => null, + 'date_of_intimat' => null, + 'si_amt' => null, + 'denial_date' => null, + 'awb_no_courier_name' => null, + 'non_id_reason' => null, + 'pay_initiate_date' => null, + 'approved_description' => null + ]; + + return $ticketMaster; + } + + public function getClaimExcelErrorData($file_id) + { + try { + + $file = $this->claimDumpFileModel->where('id', $file_id)->first(); + $error_data = json_decode($file['reason']); + // dd($error_data); + + $file_name_with_path = WRITEPATH . "/uploads/claim_dump_excel/" . $file['file_name']; + + //check the file exist or not + if (!file_exists($file_name_with_path)) { + $error_message = "File not found"; + $this->myLogger->logme('error', ($error_message . ' for file id ' . $file_id)); + return 0; + } + + $excel_data_and_headers = $this->extractExcelData($file['file_name']); + $excel_data = $excel_data_and_headers['excel_data']; + $excelErrorData['excel_header'] = $excel_data[0]; + unset($excel_data[0]); + + // Kint::dump($excel_data); + if ($error_data->error_type == 1) { + + $finalArray = []; + foreach ($error_data->error_data as $key => $value) { + foreach ($value as $key2 => $value2) { + $error_data = $value2->error; + $data = ['value' => $excel_data[$key][$value2->col_idx], 'error' => $error_data,]; + $excel_data[$key][$value2->col_idx] = $data; + } + array_push($finalArray, $excel_data[$key]); + } + + foreach ($finalArray as $fkey => $value) { + foreach ($value as $vkey => $arrayData) { + if (!is_array($arrayData)) { + $data = ['value' => $arrayData]; + $finalArray[$fkey][$vkey] = $data; + } + } + } + + $excelErrorData['excel_data'] = $finalArray; + return $excelErrorData; + } else if ($error_data->error_type == 2) { + + + $allErrors = []; + $typeTowArray = []; + + foreach ($error_data->error_data as $index => $item) { + + foreach ($item as $field) { + if (!isset($allErrors[$index])) { + $allErrors[$index] = []; + } + $allErrors[$index] = array_merge($allErrors[$index], $field->error); + } + } + + // dd(array_keys($allErrors)); + foreach ($allErrors as $key => $value) { + // echo $key; + // print_r($value); + foreach ($excel_data as $excel_data_index => $excel_data_value) { + if ($excel_data_value[0] == $key) { + $data = ['value' => $excel_data[$excel_data_index][1], 'error' => $value,]; + $excel_data[$excel_data_index][1] = $data; + array_push($typeTowArray, $excel_data[$excel_data_index]); + break; + } + } + } + // dd($data); + foreach ($typeTowArray as $fkey => $value) { + foreach ($value as $vkey => $arrayData) { + if (!is_array($arrayData)) { + $data = ['value' => $arrayData]; + $typeTowArray[$fkey][$vkey] = $data; + } + } + } + + $excelErrorData['excel_data'] = $typeTowArray; + return $excelErrorData; + } + } catch (\Exception $e) { + // Handle any exceptions + $errorMessage = $e->getMessage(); //die(); + $this->myLogger->logme('error', $errorMessage); + return false; // You can return an error response here + } + } + + public function truncateClaimDumpFile($file_id) + { + + } + +} diff --git a/app/Helpers/claim_dump_helper.php b/app/Helpers/claim_dump_helper.php new file mode 100644 index 00000000..6f740e8a --- /dev/null +++ b/app/Helpers/claim_dump_helper.php @@ -0,0 +1,179 @@ + $value) { + // Kint::dump($value['client_name'], $client_name); + if(trim($value['client_name']) === trim($client_name)){ + return array('status' => true, 'client_id' => $value['id'], 'error' => ''); + } + } + } + + return array('status' => false, 'error' => 'This Client Name does not exist in the system'); + } +} + +if (!function_exists('check_insurer')) { + function check_insurer($params) + { + $insurer_data = $params['insurer_data'] ?? []; + $insurer_name = $params['insurer_name'] ?? ""; + if (!empty($insurer_data)) { + foreach ($insurer_data as $key => $value) { + if(trim($value['short_name']) === trim($insurer_name)){ + return array('status' => true, 'insuer_id' => $value['id'], 'error' => ''); + } + } + } + + return array('status' => false, 'error' => 'This Insurer does not exist in the system'); + + } +} + +if (!function_exists('check_tpa')) { + function check_tpa($params) + { + $tpa_data = $params['tpa_data'] ?? []; + $tpa_name = $params['tpa_name'] ?? ""; + if (!empty($tpa_data)) { + foreach ($tpa_data as $key => $value) { + if(trim($value['short_name']) === trim($tpa_name)){ + return array('status' => true, 'tpa_id' => $value['id'], 'error' => ''); + } + } + } + + return array('status' => false, 'error' => 'This TPA does not exist in the system'); + } +} + +if (!function_exists('check_status')) { + function check_status($params) + { + $data = $params['data'] ?? []; + $check_value = $params['value'] ?? ""; + if (!empty($data)) { + foreach ($data as $key => $value) { + // Kint::dump(strtolower(trim($value['claim_status'])), strtolower(trim($check_value))); + if(strtolower(trim($value['claim_status'])) === strtolower(trim($check_value))){ + return array('status' => true, 'status_id' => $value['id'], 'error' => ''); + } + } + } + + return array('status' => false, 'error' => "This Status ('{$check_value}') does not exist in the system"); + } +} + +if (!function_exists('check_policy')) { + function check_policy($params) + { + $data = $params['data'] ?? []; + $client_id = $params['client_id'] ?? ""; + $check_value = $params['value'] ?? ""; + if (!empty($data)) { + foreach ($data as $key => $value) { + if($value['client_id'] === $client_id && trim($value['policy_no']) === trim($check_value)){ + return array('status' => true, 'status_id' => $value['id'], 'error' => ''); + } + } + } + + return array('status' => false, 'error' => "This Policy Number does not exist in the Client"); + } +} + +if (!function_exists('check_emp_and_insured')) { + function check_emp_and_insured($params) + { + + $employee_modal = new EmployeeModel(); + $tpa_data = $employee_modal + ->join('employee_polices', 'employees.id = employee_polices.employee_id') + ->where('employees.client', $params['client_id']) + ->where('employees.name', $params['emp_name']) + ->where('employees.emp_code', $params['emp_code']) + ->where('employees.is_active', 1) + ->where('employees.emp_status !=', "truncated") + ->where('employee_polices.is_active', 1) + ->where('employees.status !=', "truncated") + ->first(); + + if (empty($tpa_data)) { + return false; + } + + return $tpa_data['id']; + } +} + +if (!function_exists('dynamic_check_excel_date_format')) { + + function dynamic_check_excel_date_format($dateString, $format = 'd/m/Y') + { + + if ($dateString == "") { + return array('status' => true); + } + $date = DateTime::createFromFormat($format, $dateString); + + if ($date && $date->format($format) == $dateString) { + return array('status' => true); + } else { + + $res = validate_date_flexible($dateString, $format); + if (!$res) { + return array('status' => false, 'error' => "wrong date format: Expected {$format}({$res}) and received $dateString"); + } else { + return array('status' => true); + } + } + } +} + +if (!function_exists('validate_date_flexible')) { + function validate_date_flexible($date, $format = 'm/d/Y') + { + // Create a DateTime from the given format + $d = DateTime::createFromFormat($format, $date); + if (!$d) return false; + + // Compare normalized values (remove leading zeros) + $original = preg_replace('/\b0+/', '', $date); + $normalized = preg_replace('/\b0+/', '', $d->format($format)); + + return $original === $normalized; + } +} + +if (!function_exists('normalizeDate')) { + function normalizeDate($dateString, $formats = ['d-m-Y', 'd/m/Y', 'm-d-Y', 'm/d/Y', 'Y-m-d']) + { + if (empty($dateString)) { + return null; // keep null if no value + } + + foreach ($formats as $format) { + $dt = DateTime::createFromFormat($format, trim($dateString)); + if ($dt && $dt->format($format) === trim($dateString)) { + return $dt->format('Y-m-d'); // ✅ return in DB format + } + } + + return null; // if no valid format found + } +} + +?> \ No newline at end of file diff --git a/app/Models/ClaimDumpFileModel.php b/app/Models/ClaimDumpFileModel.php new file mode 100644 index 00000000..224adafc --- /dev/null +++ b/app/Models/ClaimDumpFileModel.php @@ -0,0 +1,56 @@ + null]); } + // ---------- CLAIM DUMP UPLOAD------------------------------------------------------------------------------------------- + + public function getPolicyData($params) + { + $client_name = $params['client_name'] ?? null; + $insurer_short_name = $params['insurer_short_name'] ?? null; + $tpa_short_name = $params['tpa_short_name'] ?? null; + $policy_no = $params['policy_no'] ?? null; + $builder = $this->db->table('client_policy'); + $builder->select('client_policy.*'); + $builder->join('clients c', 'client_policy.client_id = c.id'); + $builder->join('insurers i', 'client_policy.insurer_id = i.id'); + $builder->join('tpa', 'client_policy.tpa_id = tpa.id and tpa.is_active = 1', 'left'); + $builder->where('c.is_active', 1); + $builder->where('client_policy.is_active', 1); + $builder->where('i.is_active', 1); + $builder->where('c.client_name', trim($client_name)); + $builder->where('i.short_name', trim($insurer_short_name)); + if(!empty($tpa_short_name)){ + $builder->where('tpa.short_name', trim($tpa_short_name)); + } + $builder->where('client_policy.policy_no', trim($policy_no)); + + $query = $builder->get(); + $result = $query->getResultArray(); + // dd($this->db->getLastQuery()); + return $result; + } + + public function getTheClaimDetails($params) + { + $client_name = $params['client_name'] ?? null; + $policy_no = $params['policy_no'] ?? null; + $insurer_short_name = $params['insurer_short_name'] ?? null; + $tpa_short_name = $params['tpa_short_name'] ?? null; + $emp_code = $params['emp_code'] ?? null; + $emp_name = $params['emp_name'] ?? null; + $insured_name = $params['insured_name'] ?? null; + $claim_no = $params['claim_no'] ?? null; + $tpa_no = $params['tpa_no'] ?? null; + $relationship = $params['relationship'] ?? null; + + $builder = $this->table('ticket_master'); + $builder->select('ticket_master.*'); + $builder->join('clients c', 'ticket_master.client_id = c.id'); + $builder->join('insurers i', 'ticket_master.insurer_id = i.id'); + $builder->join('tpa', 'ticket_master.tpa_id = tpa.id', 'left'); + $builder->where('c.is_active', 1); + $builder->where('i.is_active', 1); + $builder->where('tpa.is_active', 1); + $builder->where('ticket_master.is_active', 1); + + $builder->where('c.client_name', trim($client_name)); + $builder->where('i.short_name', trim($insurer_short_name)); + $builder->where('ticket_master.policy_no', trim($policy_no)); + $builder->where('ticket_master.emp_code', trim($emp_code)); + $builder->where('ticket_master.emp_name', trim($emp_name)); + $builder->where('ticket_master.insured_name', trim($insured_name)); + $builder->where('ticket_master.tpa_no', trim($tpa_no)); + $builder->where('ticket_master.claim_number', trim($claim_no)); + $builder->where('ticket_master.relationship', trim($relationship)); + + if(!empty($tpa_short_name)){ + $builder->where('tpa.short_name', trim($tpa_short_name)); + } + + $query = $builder->get(); + $result = $query->getResultArray(); + + return $result; + + } + + public function getEmployeeAndEmployeePolicyDetails($params) + { + $client_name = $params['client_name'] ?? null; + $emp_code = $params['emp_code'] ?? null; + $emp_name = $params['emp_name'] ?? null; + $policy_no = $params['policy_no'] ?? null; + $relationship = $params['relationship'] ?? null; + $insured_name = $params['insured_name'] ?? null; + + $client_name = "6-Eleven"; + $emp_code = "EMP0020K12"; + $emp_name = "Lokesh"; + $policy_no = "GMC-1999/2000/2021/2022"; + + + $builder = $this->db->table('employees e'); + $builder->select(" + e.id as emp_id, + e.client_id, + e.client_branch_id, + e.emp_code, + e.name as emp_name, + e.mobile as emp_mobile, + e.email_corporate as emp_mail, + e.email_personal as emp_mail_personal, + + ep.id as emp_policy_id, + ep.tpa_id as tpa_no, + + cp.id as client_policy_id, + cp.insurer_id, + cp.tpa_id, + cp.policy_no, + CASE + WHEN cp.policy_type_id = 2 THEN 1 + WHEN cp.policy_type_id = 1 THEN 2 + WHEN cp.policy_type_id = 6 THEN 3 + WHEN cp.policy_type_id = 7 THEN 4 + ELSE NULL + END AS ticket_type_id + ", false); + $builder->join('employee_polices ep', 'e.id = ep.employee_id'); + $builder->join('clients c', 'e.client_id = c.id'); + $builder->join('client_policy cp', 'ep.client_policy_id = cp.id'); + + $builder->where('e.is_active', 1); + $builder->where('ep.is_active', 1); + $builder->where('c.is_active', 1); + $builder->where('cp.is_active', 1); + $builder->where('e.emp_code', trim($emp_code)); + $builder->where('e.name', trim($emp_name)); + $builder->where('c.client_name', trim($client_name)); + $builder->where('cp.policy_no', trim($policy_no)); + $builder->where('LOWER(e.relationship)', strtolower('self')); + + $query = $builder->get(); + $result = $query->getResultArray(); + + return $result; + } + + public function getAcmUserDetails($params) + { + $acm_name = $params['acm_name'] ?? null; + $acm_mobile = $params['acm_mobile'] ?? null; + + if ($acm_mobile != null) { + + $builder = $this->db->table('user_profiles'); + $builder->select("user_profiles.*"); + $builder->where('user_profiles.is_active', 1); + $builder->where('user_profiles.mobile', trim($acm_mobile)); + $query = $builder->get(); + $result = $query->getResultArray(); + + return $result; + } + + return []; + } + + public function getInsuredDetails($params) + { + $client_id = $params['client_id'] ?? null; + $emp_code = $params['emp_code'] ?? null; + $policy_id = $params['client_policy_id'] ?? null; + $insured_name = $params['insured_name'] ?? null; + + $builder = $this->db->table('employees e'); + $builder->select(" + e.id as emp_id, + e.client_id, + e.client_branch_id, + e.emp_code, + e.name as emp_name, + e.mobile as emp_mobile, + e.email_corporate as emp_mail, + e.email_personal as emp_mail_personal, + + ep.id as emp_policy_id, + ep.tpa_id as tpa_no, + "); + $builder->join('employee_polices ep', 'e.id = ep.employee_id'); + $builder->where('e.is_active', 1); + $builder->where('ep.is_active', 1); + $builder->where('e.emp_code', trim($emp_code)); + $builder->where('e.name', trim($insured_name)); + $builder->where('e.client_id', trim($client_id)); + $builder->where('ep.client_policy_id', trim($policy_id)); + + $query = $builder->get(); + $result = $query->getResultArray(); + + return $result; + + } + + // ----------------------------------------------------------------------------------------------------- } diff --git a/app/Views/claim_dump_file_list.php b/app/Views/claim_dump_file_list.php new file mode 100644 index 00000000..3caeb6a5 --- /dev/null +++ b/app/Views/claim_dump_file_list.php @@ -0,0 +1,330 @@ + + +
+
+
+
+
+ + + +
+
+
+
+
+
+
+ + + +
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+

Files

+
+ +
+ + + + + + + + + + + + + $file) { + ?> + + + + + + + + + + + +
SNOFile nameUser/TimeStatusAction
+ + ' . $file['user_name'] . '' ?> + + + + + + + + + + + + +
+
+
+
+ + + + + \ No newline at end of file diff --git a/app/Views/employee_data_list.php b/app/Views/employee_data_list.php index feefb665..08d47835 100755 --- a/app/Views/employee_data_list.php +++ b/app/Views/employee_data_list.php @@ -287,12 +287,12 @@
- +
- +
@@ -570,21 +570,53 @@ }); } - function validateInput(input, table, field){ + // function validateInput(input, table, field){ + + // let value = $(input).val(); + // let label = $(input).closest('.form-group').find('label').text().replace('*', '').trim(); + + // let message = "Value is duplicate!"; + // if(label){ + // message = label + " already exists!"; + // } + + // checkDuplicateTableFieldValue(table, field, value, function(isDuplicate) { + // if (isDuplicate) { + // toastr.warning(message, 'WARNING'); + // $(input).val('') + // } + // }); + + // } + + function validateInput(input, table, field) { + + let emp_code = $('#emp_code_for_edit').val(); + let client_id = $('#clients').val(); + console.log("emp_code", emp_code); + console.log("client_id", client_id); let value = $(input).val(); let label = $(input).closest('.form-group').find('label').text().replace('*', '').trim(); let message = "Value is duplicate!"; - if(label){ + if (label) { message = label + " already exists!"; } - checkDuplicateTableFieldValue(table, field, value, function(isDuplicate) { + let data = {}; + data["emp_code !="] = emp_code; + data[field] = value; + + console.log(data); + + checkDuplicateTableFieldValue(table, field, data, function(isDuplicate) { if (isDuplicate) { toastr.warning(message, 'WARNING'); - $(input).val('') - } + $("#btnSubmit").prop('disabled', true); + }else{ + $("#btnSubmit").prop('disabled', false); + } }); } @@ -597,108 +629,106 @@ } var modalInstance; // Store the modal instance globally -function showModal() { - var myModalEl = document.getElementById('emp_history_modal'); - modalInstance = new bootstrap.Modal(myModalEl, { - backdrop: true, // Ensures the backdrop is shown - keyboard: true // Allows closing with the Escape key - }); - modalInstance.show(); -} - -function closeModal() { - if (modalInstance) { - modalInstance.hide(); // Hide the modal and its backdrop - // Manually remove backdrop if it's still visible - setTimeout(function () { - document.querySelector('.modal-backdrop').classList.remove('show'); - }, 150); // Wait for animation to finish + function showModal() { + var myModalEl = document.getElementById('emp_history_modal'); + modalInstance = new bootstrap.Modal(myModalEl, { + backdrop: true, // Ensures the backdrop is shown + keyboard: true // Allows closing with the Escape key + }); + modalInstance.show(); } -} - + function closeModal() { + if (modalInstance) { + modalInstance.hide(); // Hide the modal and its backdrop + // Manually remove backdrop if it's still visible + setTimeout(function () { + document.querySelector('.modal-backdrop').classList.remove('show'); + }, 150); // Wait for animation to finish + } + } function get_emp_history(input, emp_id) { - $('.loader').fadeIn(); - $('.loader-mask').fadeIn(); + $('.loader').fadeIn(); + $('.loader-mask').fadeIn(); - let url = ''; - let requestData = { emp_id: emp_id }; + let url = ''; + let requestData = { emp_id: emp_id }; - sendAjaxRequestForGlobal(url, 'POST', requestData, function(response) { - $('.loader').fadeOut(); - $('.loader-mask').delay(350).fadeOut('slow'); + sendAjaxRequestForGlobal(url, 'POST', requestData, function(response) { + $('.loader').fadeOut(); + $('.loader-mask').delay(350).fadeOut('slow'); - if (response.status === true) { - console.log('response data length', response.data.emp_history.length); + if (response.status === true) { + console.log('response data length', response.data.emp_history.length); - // **Clear old data** - $('#emp_history_content').html(''); + // **Clear old data** + $('#emp_history_content').html(''); - // **Check if data exists** - if (response.data.emp_history.length > 0) { - let historyTable = ` -
-
- - - - - - - - - - - `; - - // **Loop through the data dynamically** - response.data.emp_history.forEach(row => { - historyTable += ` - - - - - - + // **Check if data exists** + if (response.data.emp_history.length > 0) { + let historyTable = ` +
+
+
FieldChangeUserDate/Time
${row.field_name}${row.old_value} => ${row.new_value}${row.created_by}${row.created_at}
+ + + + + + + + + `; - }); - historyTable += ` - -
FieldChangeUserDate/Time
+ // **Loop through the data dynamically** + response.data.emp_history.forEach(row => { + historyTable += ` + + ${row.field_name} + ${row.old_value} => ${row.new_value} + ${row.created_by} + ${row.created_at} + + `; + }); + + historyTable += ` + + +
- - `; + `; - // **Append to modal** - $('#emp_history_content').append(historyTable); + // **Append to modal** + $('#emp_history_content').append(historyTable); + } else { + $('#emp_history_content').html('

No history available.

'); + } + + // **Show the modal** + showModal(); } else { - $('#emp_history_content').html('

No history available.

'); + let message = response.message; + toastr.error(message, 'ERROR'); } + }, function(xhr, status, error) { + console.error('Error fetching data:', error); + console.error(xhr.responseText); + toastr.error('An error occurred while fetching the report page.', 'ERROR'); - // **Show the modal** - showModal(); - } else { - let message = response.message; - toastr.error(message, 'ERROR'); - } - }, function(xhr, status, error) { - console.error('Error fetching data:', error); - console.error(xhr.responseText); - toastr.error('An error occurred while fetching the report page.', 'ERROR'); + $('.loader').fadeOut(); + $('.loader-mask').delay(350).fadeOut('slow'); + }); + } - $('.loader').fadeOut(); - $('.loader-mask').delay(350).fadeOut('slow'); - }); -} - -// function closeModal(){ -// var myModalEl = document.getElementById('emp_history_modal'); -// var modalInstance = bootstrap.Modal.getInstance(myModalEl); -// if (modalInstance) { -// modalInstance.hide(); -// } -// } + // function closeModal(){ + // var myModalEl = document.getElementById('emp_history_modal'); + // var modalInstance = bootstrap.Modal.getInstance(myModalEl); + // if (modalInstance) { + // modalInstance.hide(); + // } + // } diff --git a/app/Views/layout/header.php b/app/Views/layout/header.php index 6ac2e4ee..4df21f21 100755 --- a/app/Views/layout/header.php +++ b/app/Views/layout/header.php @@ -689,6 +689,9 @@
  • Claim Feedback List
  • +
  • + Claim Dump Upload +
  • diff --git a/app/Views/policy_transaction_inception_list.php b/app/Views/policy_transaction_inception_list.php index cec7a681..c2cf5253 100644 --- a/app/Views/policy_transaction_inception_list.php +++ b/app/Views/policy_transaction_inception_list.php @@ -321,7 +321,7 @@ table.dataTable tbody td { Edit - + Delete @@ -1668,9 +1668,14 @@ function hideDateField(input = null) } } -function removePolicyTransaction(input, pt_id) { +function removePolicyTransaction(input, pt_id, policy_type_id) { - confirmActionSweertAlert("Do you want to delete this transaction?", "Yes, Proceed!", "No, Cancel").then((confirmed) => { + let string = "Do you want to delete this transaction?"; + if(policy_type_id > 7){ + string = "Do you want to delete this transaction? Deleting this will also remove the linked CRM policy entry."; + } + + confirmActionSweertAlert(string, "Yes, Proceed!", "No, Cancel").then((confirmed) => { if (confirmed) { let url = '' + pt_id; @@ -1694,6 +1699,4 @@ function removePolicyTransaction(input, pt_id) { }); } - - \ No newline at end of file