diff --git a/app/Config/Routes.php b/app/Config/Routes.php index ea9c7fc0..acb156bd 100755 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -183,6 +183,8 @@ $routes->group("/employee", ["filter" => "authMVC"], function ($routes) { $routes->post('get_emp_history','EmployeeController::getEmpHistory'); }); + + $routes->group("/master", ["filter" => "authMVC"], function ($routes) { $routes->group("insurer", ["filter" => "authMVC"], function ($routes) { @@ -370,6 +372,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"); @@ -558,7 +563,15 @@ $routes->group("employeeRest", ["filter" => "authJWT"], function ($routes) { $routes->post("ticketConversationSave", "ThzController::ticketConversationSave"); $routes->get("ticketConversationList", "ThzController::ticketConversationList"); + $routes->get("hrFileList", "EmployeeRestController::hrFileList"); + $routes->get("hrFileUploadMasters", "EmployeeRestController::hrFileUploadMasters"); + $routes->get("hrFileDownload", "EmployeeRestController::hrFileDownload"); + $routes->post("hrFileUpload", "EmployeeRestController::hrFileUpload"); + $routes->post("updateHrFileUploadData", "EmployeeRestController::updateHrFileUploadData"); + }); +$routes->get("hrFileDownload", "EmployeeRestController::hrFileDownload"); +$routes->post("hrFileList", "EmployeeRestController::hrFileList"); $routes->get("getEmployeeActiveOrInactivePolicy", "EmployeeRestController::getEmployeeActiveOrInactivePolicy"); $routes->get("sendPushNotification", "EmployeeRestController::sendPushNotification"); $routes->post("sendEmail", "EmployeeRestController::send_email"); @@ -646,4 +659,5 @@ $routes->post("ticketSave", "ThzController::ticketSave"); $routes->get("ticketList", "ThzController::ticketList"); $routes->post("ticketConversationSave", "ThzController::ticketConversationSave"); $routes->get("ticketConversationList", "ThzController::ticketConversationList"); -$routes->get('ticketAssigning',"ThzController::ticketAssigning"); \ No newline at end of file +$routes->post('ticketAutoFetchDetails',"ThzController::ticketAutoFetchDetails"); +// $routes->match(['get','post','put'], 'ticketType', 'ThzController::ticketType'); \ No newline at end of file diff --git a/app/Controllers/ClientController.php b/app/Controllers/ClientController.php index d4bfa5d8..98b2a821 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]); @@ -4051,10 +4055,25 @@ class ClientController extends AdminController { // ---------for client----------------------------------------------------------------------------- + $role_id = get_role_id(); + $user_id = get_session_userid(); + + + if ($role_id == 2 || $role_id == 3) { + $clients = $this->clientModel - ->select("*, DATE_FORMAT(dob, '%d-%m-%Y') as dob") - ->where('is_active', 1) - ->findAll(); + ->select("clients.*, DATE_FORMAT(clients.dob, '%d-%m-%Y') as dob") + ->join('client_rm', 'client_rm.client_id = clients.id') + ->where('client_rm.user_id', $user_id) + ->where('clients.is_active', 1) + ->findAll(); + } else { + + $clients = $this->clientModel + ->select("*, DATE_FORMAT(dob, '%d-%m-%Y') as dob") + ->where('is_active', 1) + ->findAll(); + } $clientIds = array_column($clients, 'id'); @@ -5037,7 +5056,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(); @@ -5051,21 +5079,25 @@ class ClientController extends AdminController // $res = $empServiceController->employeesCorrectionProcess(['file_id' => '1681']); // dd( $res); + // $EmployeeMultiEventServiceController = new EmployeeMultiEventServiceController(); + // $res = $EmployeeMultiEventServiceController->constructMultiEventData(['file_id' => '1056']); + // dd($res); + // ---------- 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 +5164,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--------------------------------------------------------------------------------- @@ -5163,6 +5200,7 @@ class ClientController extends AdminController // $data['data'] = $BDSReportController->getBAPClientData(); // return $this->loadLayout('irda_bap_client_report_list', $data); + // $data['data'] = $BDSReportController->getClientData(1); // return $this->loadLayout('irda_client_report_list', $data); diff --git a/app/Controllers/EmployeeController.php b/app/Controllers/EmployeeController.php index dd80cd05..40e8af2b 100755 --- a/app/Controllers/EmployeeController.php +++ b/app/Controllers/EmployeeController.php @@ -270,10 +270,11 @@ class EmployeeController extends AdminController $client_id = $this->request->getPost('client_id'); $policy_id = $this->request->getPost('policy_id'); $branch_id = $this->request->getPost('branch_id'); + $hr_file_id = $this->request->getPost('hr_file_id') ?? null; $action = $this->request->getPost('upload-action-type'); $status = 'inprogress'; - $file_id = $this->fileModel->insert(['file_name' => $filename, 'client_id' => $client_id, 'policy_id' => $policy_id, 'created_by' => $loggedInUserID, 'status' => $status, 'action' => $action, 'client_branch_id' => $branch_id,'uploaded_by' => 1]); //here field policy_id have client_policy_id and not policy id from policy master + $file_id = $this->fileModel->insert(['file_name' => $filename, 'client_id' => $client_id, 'policy_id' => $policy_id, 'created_by' => $loggedInUserID, 'status' => $status, 'action' => $action, 'client_branch_id' => $branch_id,'uploaded_by' => 1, 'hr_file_id' => $hr_file_id]); //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 diff --git a/app/Controllers/EmployeeRestController.php b/app/Controllers/EmployeeRestController.php index d8ec8b0e..4fc7d1c4 100755 --- a/app/Controllers/EmployeeRestController.php +++ b/app/Controllers/EmployeeRestController.php @@ -34,6 +34,7 @@ use App\Models\TicketMasterModel; use App\Models\TicketMessageModel; use App\Models\HRAccessControlModel; use App\Models\InsurerModel; +use App\Models\HrFileUploadModel; @@ -87,6 +88,7 @@ class EmployeeRestController extends AdminController protected $ticketController; protected $hrAccessControlModel; protected $insurerModel; + protected $hrFileUploadModel; public function __construct() @@ -118,6 +120,7 @@ class EmployeeRestController extends AdminController $this->ticketController = new TicketController(); $this->hrAccessControlModel = new HRAccessControlModel(); $this->insurerModel = new InsurerModel(); + $this->hrFileUploadModel = new HrFileUploadModel(); } @@ -3781,4 +3784,272 @@ class EmployeeRestController extends AdminController return $response->getBody(); } + + + //-------------------------------------------------------------------------------------------- + public function hrFileUpload() + { + try { + // Check file + $file = $this->request->getFile('file_name'); + if (!$file) { + return $this->response->setJSON([ + 'status' => false, + 'message' => "Invalid file or file not uploaded.", + 'data' => "No Data" + ]); + } + + // Upload folder path + $uploadPath = WRITEPATH . 'uploads/hr_files/'; + + // If directory not exists, create it + if (!is_dir($uploadPath)) { + mkdir($uploadPath, 0777, true); + } + + // New file name with timestamp + $newFileName = time() . '_' . $file->getRandomName(); + + // Move file + $file->move($uploadPath, $newFileName); + + // Prepare data + $data = [ + 'client_id' => $this->request->getPost('client_id'), + 'client_branch_id' => $this->request->getPost('client_branch_id'), + 'policy_id' => $this->request->getPost('policy_id'), + 'policy_no' => $this->request->getPost('policy_no'), + 'file_name' => $newFileName, + 'file_action' => $this->request->getPost('file_action'), + 'status' => 'Yet to start', + 'created_by' => $this->request->getPost('created_by'), + 'updated_by' => $this->request->getPost('created_by'), + ]; + + // Save into DB + $this->hrFileUploadModel->insert($data); + + return $this->respondCreated([ + 'status' => true, + 'message' => 'File uploaded successfully', + 'data' => $data + ]); + + } catch (\Exception $e) { + return $this->failServerError($e->getMessage()); + } + + } + + public function updateHrFileUploadData() + { + try { + $id = $this->request->getPost('id'); + + if (!$id) { + return $this->failValidationErrors('ID is required for update.'); + } + + // Prepare data + $data = [ + 'client_id' => $this->request->getPost('client_id'), + 'client_branch_id' => $this->request->getPost('client_branch_id'), + 'policy_id' => $this->request->getPost('policy_id'), + 'policy_no' => $this->request->getPost('policy_no'), + 'file_action' => $this->request->getPost('file_action'), + 'status' => $this->request->getPost('status'), + 'updated_by' => $this->request->getPost('updated_by'), + ]; + + // Check if record exists + $record = $this->hrFileUploadModel->find($id); + if (!$record) { + return $this->failNotFound("Record with ID {$id} not found."); + } + + // Update record + $this->hrFileUploadModel->update($id, $data); + + return $this->respond([ + 'status' => true, + 'message' => 'File record updated successfully', + 'data' => $data + ], 200); + + } catch (\Exception $e) { + return $this->failServerError($e->getMessage()); + } + } + + + public function hrFileDownload($id = null) + { + try { + + $file_id = $this->request->getGet('id') ?? $id; + + // Find record + $record = $this->hrFileUploadModel->where('id',$file_id)->find(); + + // print_rr( $record);die; + + if (!$record) { + return $this->failNotFound("File record not found"); + } + + $uploadPath = WRITEPATH . 'uploads/hr_files/'; + $filePath = $uploadPath . $record[0]['file_name']; + + if (!file_exists($filePath)) { + // return $this->failNotFound("File not found on server"); + $data['message'] = 'The Physical File Not Found'; + return view('errors/404', $data); + } + + // Force file download + return $this->response->download($filePath, null) + ->setFileName($record[0]['file_name']); + } catch (\Exception $e) { + return $this->failServerError($e->getMessage()); + } + } + + // public function hrFileList() + // { + // try { + // $request = service('request'); + // $builder = $this->hrFileUploadModel + // ->select('hr_file_upload.* , c.short_name , cb.branch_name , lc.name as first_name '); + + // // Allowed filter keys + // $filters = [ + // 'client_id', + // 'client_branch_id', + // 'policy_no', + // 'file_action', + // 'status', + // 'created_by' + // ]; + + // // Apply filters dynamically + // foreach ($filters as $key) { + // $value = $request->getGetPost($key); // supports both GET and POST + // if (!empty($value)) { + // $builder->where($key, $value); + // } + // } + + // // Fetch results + // $builder->join('clients c', 'c.id = hr_file_upload.client_id AND c.is_active = 1', 'left'); + // $builder->join('client_branch cb', 'cb.id = hr_file_upload.client_branch_id AND cb.is_active = 1', 'left'); + // $builder->join('level_contacts lc', 'lc.id = hr_file_upload.created_by AND lc.contact_type = "client" AND lc.is_active = 1', 'left'); + // $data = $builder->findAll(); + + // return $this->respond([ + // 'status' => true, + // 'message' => 'File list fetched successfully', + // 'data' => $data + // ]); + // } catch (\Exception $e) { + // return $this->failServerError($e->getMessage()); + // } + // } + + public function hrFileList() + { + try { + $request = service('request'); + + // Start builder from model + // $builder = $this->hrFileUploadModel + // ->select('hr_file_upload.* , c.short_name , cb.branch_name , lc.name as first_name') + // ->join('clients c', 'c.id = hr_file_upload.client_id AND c.is_active = 1', 'left') + // ->join('client_branch cb', 'cb.id = hr_file_upload.client_branch_id AND cb.is_active = 1', 'left') + // ->join('level_contacts lc', 'lc.id = hr_file_upload.created_by AND lc.contact_type = "client" AND lc.is_active = 1', 'left'); + + $builder = $this->hrFileUploadModel + ->select(' + hr_file_upload.id, + hr_file_upload.client_id, + hr_file_upload.client_branch_id, + hr_file_upload.policy_id, + hr_file_upload.policy_no, + hr_file_upload.file_name, + hr_file_upload.file_action, + hr_file_upload.created_at, + hr_file_upload.created_by, + hr_file_upload.updated_at, + hr_file_upload.updated_by, + c.short_name, + cb.branch_name, + lc.name as first_name, + CASE + WHEN f.status IS NULL + THEN hr_file_upload.status + ELSE CONCAT(UCASE(LEFT(f.status, 1)), LCASE(SUBSTRING(f.status, 2))) + END AS status + ', false) + ->join('clients c', 'c.id = hr_file_upload.client_id AND c.is_active = 1', 'left') + ->join('client_branch cb', 'cb.id = hr_file_upload.client_branch_id AND cb.is_active = 1', 'left') + ->join('level_contacts lc', 'lc.id = hr_file_upload.created_by AND lc.contact_type = "client" AND lc.is_active = 1', 'left') + ->join( + '(SELECT f1.* + FROM files f1 + WHERE f1.is_active = 1 + ORDER BY f1.id DESC + LIMIT 1) f', + 'f.hr_file_id = hr_file_upload.id', + 'left' + ); + + // Allowed filter keys + $filters = [ + 'client_id', + 'client_branch_id', + 'policy_id', + 'policy_no', + 'file_action', + 'status', + 'created_by' + ]; + + // Apply filters dynamically + foreach ($filters as $key) { + $value = $request->getGetPost($key); // supports both GET and POST + if (!empty($value)) { + $builder->where("hr_file_upload.$key", $value); + } + } + + // Execute query + $data = $builder->get()->getResultArray(); + + return $this->respond([ + 'status' => "success", + 'message' => 'File list fetched successfully', + 'data' => $data + ]); + } catch (\Exception $e) { + return $this->failServerError($e->getMessage()); + } + } + + + public function hrFileUploadMasters() + { + try { + //for inception upload + $data['actions'] = ['addition' => 'Addition (Employee + Dependents)', 'missed_inception' => 'Missed Inception (Employee + Dependents)', 'dependent_addition' => 'Dependent Addition (Only Dependents)', 'deletion' => 'Deletion', 'correction' => 'Correction', 'si_enhancement' => 'SI Enhancement']; + + return $this->respond([ + 'status' => true, + 'message' => 'File inception upload masters', + 'data' => $data + ]); + } catch (\Exception $e) { + return $this->failServerError($e->getMessage()); + } + } + } \ No newline at end of file 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..cada5a8f 100644 --- a/app/Controllers/PolicyTransactionController.php +++ b/app/Controllers/PolicyTransactionController.php @@ -248,12 +248,14 @@ class PolicyTransactionController extends BaseController // policy Transaction Create function start public function createInceptionPolicy() - { - // print_r($this->request->getPost()); die; + { + $post_data = $this->request->getPost() ?? []; + $this->myLogger->logme('error', 'Policy Trancaction form data : '. json_encode($post_data)); + $id = $this->request->getPost('id'); $data = $this->preparePolicyData(); $data['cd_ac_pk'] = $this->request->getPost('cd_ac_no'); - // print_r($this->request->getPost()); die; + $this->myLogger->logme('error', 'Policy Trancaction modified form data ( insert data ) : '. json_encode($data)); if (!$id) { @@ -995,8 +997,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(); + $this->policyTransactionModel->where('client_policy_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/ThzController.php b/app/Controllers/ThzController.php index fd2f424f..e286d651 100644 --- a/app/Controllers/ThzController.php +++ b/app/Controllers/ThzController.php @@ -3,12 +3,18 @@ namespace App\Controllers; use App\Controllers\BaseController; +use App\Helpers\MailHelper; use CodeIgniter\HTTP\ResponseInterface; use App\Models\ThzMasterModel; use App\Models\ThzMasterNotesModel; use App\ControllerCleaners\ThzControllerCleaner; use App\Models\UserModel; +use App\Models\ClientPolicyModel; +use App\Models\ClientModel; +use App\Models\TicketMailTemplateModel; +// use App\Models\TicketTypesModel; + class ThzController extends BaseController { @@ -19,13 +25,21 @@ class ThzController extends BaseController protected $thzControllerCleaner; protected $userModel; + protected $clientPolicyModel; + protected $clientModel; + + protected $ticketMailTemplateModel; + // protected $ticketTypesModel; public function __construct() { - $this->thzMasterModel = new ThzMasterModel(); - $this->thzMasterNotesModel = new ThzMasterNotesModel(); - $this->thzControllerCleaner = new ThzControllerCleaner(); - $this->userModel = new UserModel(); + $this->thzMasterModel = new ThzMasterModel(); + $this->thzMasterNotesModel = new ThzMasterNotesModel(); + $this->thzControllerCleaner = new ThzControllerCleaner(); + $this->userModel = new UserModel(); + $this->clientPolicyModel = new ClientPolicyModel(); + $this->clientModel = new ClientModel(); + $this->ticketMailTemplateModel = new TicketMailTemplateModel(); } public function index() @@ -36,19 +50,29 @@ class ThzController extends BaseController public function ticketSave(){ $data = $this->request->getPost(); - // $data = $this->request->getJSON(true); - // $return_type = isset($data['return_type']) ? $data['return_type'] : 'api'; + if (!empty($data['thz_id'])) { - $text = "update"; + + $text = "update"; $result = $this->updateTicket($data); + $updateID = $data['thz_id']; + } else { - $text = "create"; - $result = $this->insertTicket($data); + + $text = "create"; + $insertID = $this->insertTicket($data); + $result = true; + } + $id = isset($insertID) && !empty($insertID) ? $insertID : $updateID ; + + $emailNotificationResult = $this->ticketSaveNotification($data , $insertOrUpdate = $text , $id); + return $this->response->setJSON([ 'status' => $result ? 'success' : 'error', - 'message' => $result ? "Ticket {$text}d successfully" : "Unable to {$text} ticket. Please try again." + 'message' => $result ? "Ticket {$text}d successfully " : "Unable to {$text} ticket. Please try again." , + 'notification' => $emailNotificationResult ? 'Email Notification Success..!!' : 'Email Notification Failed..!!' ])->setStatusCode($result ? 200 : 400); } @@ -57,9 +81,14 @@ class ThzController extends BaseController $returnType = strtolower($this->request->getGet('return_type') ?? 'api'); + $data = $this->request->getGet(); + if ($returnType === 'web' && in_array(get_role_id(), [2,3,4])) { + $data['assign_to'] = $data['assign_to'] ?? get_session_userid(); + } $tickets = $this->fetchTicketsBasedOnrole($data); + if ($returnType === 'api') { if (empty($tickets)) { @@ -67,9 +96,12 @@ class ThzController extends BaseController } }else{ - $data['page_name'] = "Ticket List"; + $data['page_name'] = "Tickets"; $data['ticket_data'] = $tickets; - $data['assignee'] = $this->userModel->where('is_active', 1)->whereIn('role', ['1', '5'])->findAll(); // enga 5-"head" and 1-"admin" role person thaan assignee.. + $data['assignee'] = $this->userModel->where('is_active', 1)->whereIn('role', ['2', '3','4'])->findAll(); // enga 5-"head" and 1-"admin" assign pannvaga so dropdown la varakudhathu + // 2,3,4 remain person varannum. + $data['client_list'] = $this->clientModel->getCreatedByUserName(); + return $this->loadLayout('thz_list', $data); } @@ -81,7 +113,9 @@ class ThzController extends BaseController public function ticketConversationSave(){ - $data = $this->request->getJSON(true); + $data = $this->request->getPost(); + + $data['notes_type'] = $data['notes_type'] ?? 'External' ; $result = $this->thzMasterNotesModel->insert($data); @@ -89,78 +123,149 @@ class ThzController extends BaseController return $this->response->setJSON((['status' => 'error', 'message' => 'No tickets found']))->setStatusCode(404); } + if($data['notes_type'] == "External"){ + $emailNotificationResult = $this->ticketConversationSaveNotification($data); + }else{ + $emailNotificationResult = false ; + } + + return $this->response->setJSON([ 'status' => $result ? 'success' : 'error', - 'message' => $result ? "Ticket Notes created successfully" : "Unable to create ticket notes. Please try again." + 'message' => $result ? "Ticket Notes created successfully" : "Unable to create ticket notes. Please try again." , + 'notification' => $emailNotificationResult ? 'Email Notification Success..!!' : 'Email Notification Failed Or No Need..!!' ])->setStatusCode($result ? 200 : 400); } - public function ticketConversationList(){ + public function ticketAutoFetchDetails(){ + $data = $this->request->getPost(); - $data = $this->request->getGet(); + $client_id = $data['client_id']; + $mobile = $data['mobile']; - $thz_id = $data['thz_id'] ?? null; + if($client_id && $mobile){ + + $details = $this->thzMasterModel->ticketAutoFetchDetails($client_id ,$mobile); + + if(empty($details)){ + return $this->response->setJSON((['status' => 'error', 'message' => 'No Data found']))->setStatusCode(400); + }else{ + + $policyIds = array_column($details, 'policy_id'); + $policyIds = array_filter($policyIds); + $clientPolicy = $this->clientPolicyModel->whereIn('id', $policyIds)->where('is_active', 1)->get()->getResultArray(); + $result['client_details'] = $details; + $result['policy_details'] = empty($clientPolicy) ? [] : $clientPolicy ; + + } + }else{ + return $this->response->setJSON((['status' => 'error', 'message' => 'Client and Mobile Not found']))->setStatusCode(400); + } + + return $this->response->setJSON((['status' => 'success', 'data' => $result]))->setStatusCode(200); + + + } + + public function ticketConversationList(){ + + $data = $this->request->getGet(); + + $returnType = strtolower($this->request->getGet('return_type') ?? 'api'); + + $thz_id = $data['thz_id'] ?? null; + + $ticketType = $data['notes_type'] ?? 'External' ; if($thz_id){ $result['master'] = $this->thzMasterModel ->select('thz_master.*, CONCAT(user_profiles.first_name, " ", user_profiles.last_name) as assignee_name') ->join('user_profiles', 'user_profiles.id = thz_master.assign_to', 'left') - ->where('thz_master.thz_id', $thz_id) + ->where('thz_master.thz_id', $thz_id) ->findAll(); - $notes = $this->thzMasterNotesModel->ticketConversationList($thz_id); - $result['notes'] = !empty($notes) ? $notes : []; - + if(!empty($result['master'])){ + $notes = $this->thzMasterNotesModel->ticketConversationList($thz_id, $returnType ); + $result['notes'] = !empty($notes) ? $notes : []; + }else{ + return $this->response->setJSON((['status' => 'error', 'message' => 'No tickets found']))->setStatusCode(400); + } }else{ return $this->response->setJSON((['status' => 'error', 'message' => 'No tickets found']))->setStatusCode(404); } - - return $this->response->setJSON((['status' => 'success', 'data' => $result]))->setStatusCode(400); - - } - - public function ticketSaveNotification($data){ - - } - - public function ticketConversationSaveNotification($data){ - - } - - public function ticketAssigning(){ - - $returnType = strtolower($this->request->getGet('return_type') ?? 'api'); - - $data = $this->request->getVar(); - - $assignee_id = $data['assignee_id']; - - $thz_id = $data['thz_id']; - - $result = $this->thzMasterModel->set('assign_to',$assignee_id)->where('thz_id',$thz_id)->update(); - - if($returnType === 'api'){ - - if(empty($result)){ - return $this->response->setJSON((['status' => 'error', 'message' => 'No tickets found'])); - } - - return $this->response->setJSON((['status' => 'success', 'data' => $result])); - - }else{ + + if ($returnType === 'api') { + return $this->response->setJSON((['status' => 'success', 'data' => $result]))->setStatusCode(200); + }else{ - } - - + $assign_to = $result['master'][0]['assign_to']; + $mobile = $result['master'][0]['mobile']; + $toGetPolicyId = (!empty($result['master'][0]['policy_id']) && strtolower($result['master'][0]['policy_id']) !== 'null') + ? $result['master'][0]['policy_id'] + : ''; + $result['related_tickets'] = $this->thzMasterModel + ->select('thz_master.*, CONCAT(user_profiles.first_name, " ", user_profiles.last_name) as assignee_name') + ->join('user_profiles', 'user_profiles.id = thz_master.assign_to', 'left') + ->where('thz_master.assign_to', $assign_to) + ->where('thz_master.mobile',$mobile) + ->where('thz_master.thz_id !=',$thz_id) + ->where('thz_master.status !=','Closed') + ->where('thz_master.status !=','Resolved') + ->findAll(); + + $result['assignee'] = $this->userModel->where('is_active', 1)->whereIn('role', ['2', '3','4'])->findAll(); // enga 5-"head" and 1-"admin" assign pannvaga so dropdown la varakudhathu + // 2,3,4 remain person varannum. + $result['policy_terms'] = $toGetPolicyId ? $this->getPolicyTerms($toGetPolicyId) : ''; + + return $this->loadLayout('thz_notes', $result); + } } + // public function ticketType() + // { + // $method = $this->request->getMethod(); // get, post + + // if ($method === 'get') { + + // $types = $this->ticketTypesModel->where('is_active', 1)->findAll(); + // if (empty($types)) { + // return $this->response->setJSON(['status' => 'error','message' => 'No ticket types found'])->setStatusCode(404); + // } + // return $this->response->setJSON(['status' => 'success','data' => $types])->setStatusCode(200); + + // } + + // if ($method === 'post') { + + // $data = $this->request->getPost(); + // if (!empty($data['id'])) { + // $text = "update"; + // $result = $this->ticketTypesModel->update($data['id'], $data); + // $updateID = $data['id']; + // } else { + // $text = "create"; + // $insertID = $this->ticketTypesModel->insert($data); + // $result = true; + // } + + // $id = isset($insertID) && !empty($insertID) ? $insertID : $updateID ; + + // return $this->response->setJSON([ + // 'status' => $id ? 'success' : 'error', + // 'message' => $id ? "Ticket Type {$text}d successfully " : "Unable to {$text} ticket type. Please try again." , + // 'id' => $id + // ])->setStatusCode($id ? 200 : 400); + // } + // return $this->response->setJSON(['status' => 'error','message' => 'No ticket types found'])->setStatusCode(404); + // } + /************************************************** PRIVATE FUNCTIONS ********************************************************/ @@ -177,6 +282,7 @@ class ThzController extends BaseController ->select('thz_master.*, CONCAT(user_profiles.first_name, " ", user_profiles.last_name) as assignee_name') ->join('user_profiles', 'user_profiles.id = thz_master.assign_to', 'left') ->where('thz_master.assign_to', $assign_to) + ->orderBy('thz_master.created_at','desc') ->findAll(); } @@ -188,6 +294,7 @@ class ThzController extends BaseController ->join('user_profiles', 'user_profiles.id = thz_master.assign_to', 'left') // ->where('thz_id', $id) ->where('thz_master.mobile', $mobile) + ->orderBy('thz_master.created_at','desc') ->findAll(); } @@ -195,23 +302,154 @@ class ThzController extends BaseController return $this->thzMasterModel ->select('thz_master.*, CONCAT(user_profiles.first_name, " ", user_profiles.last_name) as assignee_name') ->join('user_profiles', 'user_profiles.id = thz_master.assign_to', 'left') + ->orderBy('thz_master.created_at','desc') ->findAll(); } - private function notificationBasedOnRole($data){ - $id = $data['thz_id'] ?? null; - $assign_to = $data['assign_to'] ?? null; - $mobile = $data['mobile'] ?? null; - if (!empty($assign_to)) { + private function ticketSaveNotification( $data , $insertOrUpdate , $id){ + + $user_email = $data['email'] ?? null; + + $assignee_id = $data['assign_to'] ?? null; + + $assignee_email = $this->findAssigneeEmail($assignee_id); + + $emailToNotified = [ + 'user_email' => $user_email, + 'assignee_email' => $assignee_email + ]; + + $ticketId = $id; + + $result = $this->ticketSaveEmailNotificationBasedOnRole($emailToNotified , $insertOrUpdate , $ticketId , $data); + + return $result; + + } + + private function ticketConversationSaveNotification($data){ + + $thz_id = $data['thz_id'] ; // thz is alias of ticket + + $data['subject'] = $this->findSubject($data['thz_id']); + + $assignee_id = $this->findAssigneeId($data['thz_id']) ; + + $user_email = $this->findUserEmail($data['thz_id']) ; + + $assignee_email = $this->findAssigneeEmail($assignee_id) ?? ''; + + $sender_mail = $data['notes_by'] == "User" ? $user_email : $assignee_email ; + $receiver_mail = $data['notes_by'] == "User" ? $assignee_email : $user_email ; + + $templateName = "ticket_conversation_save_notification"; + + $to_email = $receiver_mail; + + $ticketId = $thz_id; + + $message = $data['notes'] ?? ''; + + $this->sendEmail( $templateName, $data , $to_email , $ticketId , $message); + + return true; + + } + + + private function findAssigneeEmail($assignee_id){ + + $row = $this->userModel->where('id', $assignee_id)->get()->getRow(); + $assigneeEmail = $row ? $row->email : null; + return $assigneeEmail ? $assigneeEmail : ""; + + } + + private function findAssigneeId($ticketId){ + $row = $this->thzMasterModel->where('thz_id', $ticketId)->get()->getRow(); + $assigneeId = $row ? $row->assign_to : null; + return $assigneeId ? $assigneeId : 0 ; + } + + private function findUserEmail($ticket_id){ + $row = $this->thzMasterModel->where('thz_id', $ticket_id)->get()->getRow(); + $email = $row ? $row->email : null; + return $email ? $email : " " ; + } + + private function findSubject($ticketId){ + $row = $this->thzMasterModel->where('thz_id', $ticketId)->get()->getRow(); + $subject = $row ? $row->subject : null; + return $subject ? $subject : " " ; + } + + private function ticketSaveEmailNotificationBasedOnRole($emailToNotified , $insertOrUpdate , $ticketId , $data){ + + $user_email = $emailToNotified['user_email'] ?? null; + $assignee_email = $emailToNotified['assignee_email'] ?? null; + + + if (!empty($assignee_email)) { + + switch ($insertOrUpdate) { + + case 'update': + + $this->sendEmail( 'ticket_save_update_assignee', $data ,$assignee_email , $ticketId ) ; + + break; + + case 'create': + + $this->sendEmail( 'ticket_save_create_assignee', $data ,$assignee_email , $ticketId ) ; + + break; + + default: + # code... + break; + } } - if (!empty($id) && !empty($mobile)) { + if (!empty($user_email)) { + + switch ($insertOrUpdate) { + + case 'update': + + if(empty($assignee_email)){ + $data['assigneeAndStatus'] = "Not Yet Assigned"; + $this->sendEmail( 'ticket_save_update_user', $data ,$user_email , $ticketId ) ; + }else{ + $data['assigneeAndStatus'] = "Assigned With {$assignee_email}"; + $this->sendEmail( 'ticket_save_update_user', $data ,$user_email , $ticketId ) ; + } + + break; + + case 'create': + + if(empty($assignee_email)){ + $this->sendEmail( 'ticket_save_create_user_unassigned', $data ,$user_email , $ticketId ) ; + }else{ + $data['assignee_email'] = $assignee_email ; + $this->sendEmail( 'ticket_save_create_user_assigned', $data , $user_email , $ticketId ) ; + } + + break; + + default: + # code... + break; + } } + return true; + } @@ -225,16 +463,66 @@ class ThzController extends BaseController } - private function insertTicket($data){ - + private function insertTicket($data) + { $data['created_by'] = get_session_userid(); - $result = $this->thzMasterModel->insert($data); + $this->thzMasterModel->insert($data); - return $result; + return $this->thzMasterModel->insertID(); // returns the inserted row's ID + } + + + private function sendEmail( $templateName, $data , $to_email , $ticketId , $message = ""){ + + $mailTemplate = $this->ticketMailTemplateModel->where('template_name',$templateName )->findAll()[0] ?? []; + + if(empty($mailTemplate)){ + return ; + } + + $mailTemplate['subject'] = str_replace('%subject%', $data['subject'] ?? '', $mailTemplate['subject']); + + $mailTemplate['mail_content'] = str_replace('%subject%', $data['subject'] ?? '', $mailTemplate['mail_content']); + + $mailTemplate['mail_content'] = str_replace('%ticketId%', $ticketId ?? '', $mailTemplate['mail_content']); + + $mailTemplate['mail_content'] = str_replace('%message%', $message ?? '', $mailTemplate['mail_content']); + + $mailTemplate['mail_content'] = str_replace('%assignee_email%', $data['assignee_email'] ?? '', $mailTemplate['mail_content']); + + $mailTemplate['mail_content'] = str_replace('%assigneeAndStatus%',$data['assigneeAndStatus'] ?? '' ,$mailTemplate['mail_content']); + + $from_mail = ""; + $to_mail = $to_email; + $cc_string = ""; + $subject = $mailTemplate['subject'] ; + $message = $mailTemplate['mail_content'] ; + $attachments = ""; + $reply_to = ""; + $bcc_string = ""; + + $res = MailHelper::send_email(['from_mail' => $from_mail, 'mail' => $to_mail , 'cc' => $cc_string, 'subject' => $subject, 'message' => $message, 'attachments' => $attachments, 'reply_to' => $reply_to, 'bcc' => $bcc_string]); } + public function getPolicyTerms($client_policy_id) + { + $policy_data = $this->clientPolicyModel->where('is_active', 1)->where('id', $client_policy_id)->first(); + + $policy_terms = []; + if(isset($policy_data['policy_terms']) && !empty($policy_data['policy_terms'])){ + + $raw_terms = json_decode($policy_data['policy_terms'] ?? [] , true) ?? []; + + $ticketController = new TicketController(); + $policy_terms = $ticketController->convertTermsToDisplay($raw_terms); + } + + $data['policy_terms'] = $policy_terms; + return view('view_policy_terms', $data); + } + } diff --git a/app/Controllers/TicketController.php b/app/Controllers/TicketController.php index 4c344c28..53ab6586 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() @@ -2383,17 +2386,20 @@ class TicketController extends BaseController } // 5. Merge the Sum Insured value if the multiple sum insured exists - if(isset($data['multiple_sum_insured'])){ - if(isset($data['sumInsured2'])){ - $data['sumInsured2'] = $data['sumInsured2'] . ", " . implode(", ", $data['multiple_sum_insured']); - }else{ - $data['sum_insured'] = $data['sum_insured'] . ", " . implode(", ", $data['multiple_sum_insured']); + if (isset($data['multiple_sum_insured'])) { + + $multipleSumInsured = is_array($data['multiple_sum_insured']) ? $data['multiple_sum_insured'] : [$data['multiple_sum_insured']]; // force into array if string + + if (isset($data['sumInsured2'])) { + $data['sumInsured2'] .= ", " . implode(", ", $multipleSumInsured); + } else { + $data['sum_insured'] .= ", " . implode(", ", $multipleSumInsured); } + unset($data['multiple_sum_insured']); } // 6. Add the special condition to key value pair - if(!empty($data['special_condition_label'])){ foreach ($data['special_condition_label'] as $key => $value) { if($value != "" && $value != null) { @@ -2445,6 +2451,155 @@ 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) + ->orderBy('claim_dump_files.id', 'desc') + ->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..d2265378 --- /dev/null +++ b/app/Controllers/TicketServiceController.php @@ -0,0 +1,1823 @@ +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' => null, + 'allowed_values' => null + ], + "emp_email" => [ + 'col_idx' => 14, + 'col_cell_name' => 'O', + 'col_name' => 'Emp mail id', + 'is_mandatory' => true, + 'data_type' => 'string', + 'format' => null, + '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' => 'd/m/Y', + 'allowed_values' => null + ], + "dod" => [ + 'col_idx' => 20, + 'col_cell_name' => 'U', + 'col_name' => 'DOD', + 'is_mandatory' => false, + 'data_type' => 'date', + 'format' => 'd/m/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' => 'd/m/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' => 'd/m/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' => 'd/m/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' => 'd/m/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' => 'd/m/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' => 'd/m/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); + + //if upload the unwanted file upload handle + if(count($columns_to_check) == 0){ + $message = "Wrong file was uploaded"; + $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); + } + + //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"; + $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); + } + + //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); + } + + $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(); + + //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' => 1, '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; + // var_dump($excel_acm_data); die; + + $acm_name = null; + $acm_mobile = null; + + //seperate the Account Manager Name and Mobile No + if (!empty($excel_acm_data)) { + $excel_acm_data = str_replace(['–', '—'], '-', $excel_acm_data); + $parts = array_map('trim', explode('-', $excel_acm_data, 2)); + $acm_name = $parts[0] ?? null; + $acm_mobile = $parts[1] ?? null; + + // ensure mobile number is digits only + if ($acm_mobile !== null) { + $acm_mobile = preg_replace('/\D/', '', $acm_mobile); + } + } + + // dd($acm_name, $acm_mobile); + + $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][$acm_column_index]['col_name'] = $columns_to_check['acm']['col_name']; //push column name + $result['error_data'][$row_key][$acm_column_index]['col_idx'] = $acm_column_index; //push column index + $result['error_data'][$row_key][$acm_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); + // dd($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) + { + // dd($db_data); + $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) ?? []; + // dd($acm_data); + + //get the claim status id from the database + $claim_status_data = $this->ticketClaimStatusModel + ->select('id, claim_status, ticket_type') + ->where('is_active', 1) + ->where('ticket_type', $db_data['ticket_type_id']) + ->where('LOWER(claim_status)', strtolower($excel_status_data)) + ->first(); + + // dd($claim_status_data); + + $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'] = $excel_data[$insured_name_column_index] ?? null; + //get Insured emp name and Insured emp id + $insured_data = $ticketMasterModal->getInsuredDetails($db_data); + // dd($insured_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' => $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' => $excel_tpa_id_data ?? $db_data['tpa_no'] ?? null, + 'emp_name' => $db_data['emp_name'] ?? null, + 'relationship' => strtolower($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'] ?? $excel_data[$insured_name_column_index] ?? 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 + ]; + + // dd($ticketMaster); + 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/Helpers/header.php b/app/Helpers/header.php index 2ade2b0b..fb9e215c 100755 --- a/app/Helpers/header.php +++ b/app/Helpers/header.php @@ -267,7 +267,6 @@ .right-bar { - width: 300px; /* Adjust as needed */ overflow: hidden; } @@ -616,7 +615,7 @@
| SNO | +File name | +User/Time | +Status | +Action | +
|---|---|---|---|---|
| + + | ' . $file['user_name'] . '' ?> | ++ + = $file['status'] ?> + + + + + = $file['status'] ?> + + = $file['status'] ?> + + | ++ + | +
| Field | -Change | -User | -Date/Time | -
|---|---|---|---|
| ${row.field_name} | -${row.old_value} => ${row.new_value} | -${row.created_by} | -${row.created_at} | -
| Field | +Change | +User | +Date/Time | +
|---|
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/employee_upload.php b/app/Views/employee_upload.php index 7f1ae499..ab566571 100755 --- a/app/Views/employee_upload.php +++ b/app/Views/employee_upload.php @@ -129,7 +129,6 @@ option:disabled {