From 17be27e4eae4d3cbdcc44aa969f6f1122091561d Mon Sep 17 00:00:00 2001 From: "venkatesh.r" Date: Thu, 29 Jan 2026 15:20:35 +0530 Subject: [PATCH 01/49] FEAT_CD_HR_MAIL_SENT_INSUFF_CD_BAL --- app/Config/Routes.php | 1 + app/Controllers/ClientController.php | 39 +- app/Controllers/EmpDataServiceController.php | 30 +- app/Controllers/EmployeeController.php | 45 + app/Controllers/LoginController.php | 2 +- app/Helpers/excel_util_helper.php | 7 + app/Helpers/utility_helper.php | 30 + app/Models/EmployeePolicyModel.php | 9 +- app/Views/insurer_or_tpa_data.php | 835 ++++++++++++++++++- 9 files changed, 973 insertions(+), 25 deletions(-) diff --git a/app/Config/Routes.php b/app/Config/Routes.php index 4bf4b954..061ef3c4 100755 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -428,6 +428,7 @@ $routes->group("/util", ["filter" => "authMVC"], function ($routes) { $routes->get('proceedExcelFileDataValidation', 'EmployeeController::proceedExcelFileDataValidation'); $routes->get('checkTpaApiEnable', 'EmployeeRestController::checkTpaApiEnable'); $routes->get('generateDemographyDataTable', 'LeadsController::generateDemographyDataTable'); + $routes->post('insufficientCdBalanceHrMailSend', 'EmployeeController::insufficientCdBalanceHrMailSend'); }); $routes->post("policy_tranction/sendInstallmentRemainderMail","PolicyTransactionController::sendInstallmentRemainderMail"); diff --git a/app/Controllers/ClientController.php b/app/Controllers/ClientController.php index 1bd71ed6..36b7cf7f 100755 --- a/app/Controllers/ClientController.php +++ b/app/Controllers/ClientController.php @@ -6638,23 +6638,23 @@ class ClientController extends AdminController // ----------EMP DATA SERVICE CONTROLLER-------------------------------------------------------------------------------- - $batch_data = [ - 'client_id' => 51, - 'client_branch_id' => 40, - 'client_policy_id' => 63, - 'insurer_or_tpa' => "insurer", - 'event_type' => "correction", - 'actions' => "export", - 'file_name' => "deletion_enhancement_test_file.xlsx", - ]; + // $batch_data = [ + // 'client_id' => 51, + // 'client_branch_id' => 40, + // 'client_policy_id' => 63, + // 'insurer_or_tpa' => "insurer", + // 'event_type' => "correction", + // 'actions' => "export", + // 'file_name' => "deletion_enhancement_test_file.xlsx", + // ]; // $batch_data = [ - // 'client_id' => 20, - // 'client_policy_id' => 77, - // 'client_branch_id' => 72, + // 'client_id' => 12, + // 'client_policy_id' => 8063, + // 'client_branch_id' => 1, // 'insurer_or_tpa' => "insurer", // // 'insurer_or_tpa' => "tpa", - // 'event_type' => "si_enhancement", + // 'event_type' => "inception", // 'file_name' => "si_enhancement_test_file.xlsx", // 'actions' => "export", // ]; @@ -6713,6 +6713,19 @@ class ClientController extends AdminController // $EmpDataServiceController->cashDepositCalculationForDeletion($array); // $result = $this->employeePolicyModel->getInceptionEmployeeDataForExportExcel($batch_data); + // $totals = 0; + // foreach ($result as $item) { + // $totals = $totals + $item->total; + // } + + // $data = [ + // session()->get('cd_balance'), + // session()->get('cd_amount'), + // session()->get('hr_data'), + // session()->has('cd_balance'), + // get_cd_balance() + // ]; + // dd($data); // $result = $this->employeePolicyModel->getCorrectionEmployeesDataForExportExcel($batch_data); // dd(db_connect()->getLastQuery()); diff --git a/app/Controllers/EmpDataServiceController.php b/app/Controllers/EmpDataServiceController.php index ff86177d..70709383 100755 --- a/app/Controllers/EmpDataServiceController.php +++ b/app/Controllers/EmpDataServiceController.php @@ -33,6 +33,8 @@ use App\Models\LeadsModel; use App\Models\LeadInstallmentPaymentDetails; use App\Models\PolicyTransactionModel; use App\Models\PTCOShareDetailsModel; +use App\Models\LevelContactModel; + use App\Controllers\Jobs; use App\Controllers\JobWorker; @@ -71,6 +73,8 @@ class EmpDataServiceController extends BaseController protected $leadInstallmentPaymentDetailesModel; protected $policyTransactionModel; protected $PTCOShareDetailsModel; + protected $LevelContactModel; + public function __construct() @@ -99,6 +103,7 @@ class EmpDataServiceController extends BaseController $this->leadInstallmentPaymentDetailesModel = new LeadInstallmentPaymentDetails(); $this->policyTransactionModel = new PolicyTransactionModel(); $this->PTCOShareDetailsModel = new PTCOShareDetailsModel(); + $this->LevelContactModel = new LevelContactModel(); } @@ -208,14 +213,19 @@ class EmpDataServiceController extends BaseController if ((int) $cash_balance['balance'] < (int) $totals) { $this->myLogger->logme('error', 'Inception export failed due to insufficient deposit amount.'); $this->myLogger->logme('error', 'Inception export failed due to insufficient deposit amount. CASH BALANCE : {balance} and TOTAL AMOUNT : {total}', ['balance' => $cash_balance['balance'], 'total' => $totals]); - session()->set('cd_balance', false); - session()->set('cd_amount', $cash_balance['balance']); - session()->set('excel_file_amt', $totals); + + $cd_session_data = json_encode(['cd_balance' => false, 'cd_amount' => $cash_balance['balance'], 'excel_file_amt' => $totals]); + session()->set('cd_balance_info', $cd_session_data); + session()->set('cd_balance', false); + + $hr_data = $this->getHrdataForInsufficientMailSend($export_data['client_branch_id']); + $session_data = json_encode(['client_id' => $export_data['client_id'], 'hr_data' => $hr_data]); + session()->set('hr_data', $session_data); + }else{ session()->set('cd_balance', true); session()->set('cd_amount', $cash_balance['balance']); session()->set('excel_file_amt', $totals); - } } } @@ -5858,4 +5868,16 @@ class EmpDataServiceController extends BaseController 'gst' => round($amount['gst'] ?? 0, 2) ]; } + + public function getHrdataForInsufficientMailSend($ref_id) + { + $data = $this->LevelContactModel + ->select('id, name, email') + ->where('ref_id', $ref_id) + ->where('is_active', 1) + ->where('contact_type', 'client') + ->findAll(); + + return $data; + } } diff --git a/app/Controllers/EmployeeController.php b/app/Controllers/EmployeeController.php index b662d8b1..f63052f4 100755 --- a/app/Controllers/EmployeeController.php +++ b/app/Controllers/EmployeeController.php @@ -8,6 +8,7 @@ use CodeIgniter\HTTP\ResponseInterface; use Psr\Log\LoggerInterface; use App\Helpers\DepositHelper; +use App\Helpers\MailHelper; use App\Models\EmployeeModel; @@ -29,6 +30,7 @@ use App\Models\AuditHistoryModel; use App\Models\UserModel; use App\Models\PartnerEndorsementRequestModel; use App\Models\TpaApiDataModel; +use App\Models\LevelContactModel; use App\Controllers\Jobs; @@ -74,6 +76,7 @@ class EmployeeController extends AdminController protected $auditHistory; protected $userModel; protected $partnerEndorsementRequestModel; + protected $LevelContactModel; public function __construct() { @@ -97,6 +100,7 @@ class EmployeeController extends AdminController $this->auditHistory = new AuditHistoryModel(); $this->userModel = new userModel(); $this->partnerEndorsementRequestModel = new PartnerEndorsementRequestModel(); + $this->LevelContactModel = new LevelContactModel(); } public function list() @@ -4453,5 +4457,46 @@ class EmployeeController extends AdminController } + public function insufficientCdBalanceHrMailSend() + { + $post_data = $this->request->getJson(true); + + if(empty($post_data) || (!isset($post_data['mails']) && !empty($post_data['mails'])) || (!isset($post_data['client_id']) && !empty($post_data['client_id']))){ + return $this->respond(['status' => false, 'code' => 404, 'message' => 'No data send mail'], 200); + } + + $client_data = $this->clientModel->where('is_active', 1)->where('id', $post_data['client_id'])->first(); + + $common['mail_type'] = "insufficient_cd_balance_by_hr"; + $common['client_id'] = $post_data['client_id']; + $subject = 'Insufficient CD Balance Notification'; + $mail_content = ' + Dear {{HR_NAME}}, + + Greetings from Nhance. + + We would like to inform you that the CD balance for {{CLIENT_NAME}} is currently low / insufficient, which may impact further processing of insurance-related activities. + + Kindly request you to credit the required amount at the earliest to avoid any service disruption. + + Please let us know once the amount is credited, or if you need any clarification from our end. + + Thank you for your support and cooperation. + '; + + + foreach ($post_data['mails'] as $hr_id => $hr_data) { + + $mail_content = str_ireplace('{{HR_NAME}}', $hr_data['name'], $mail_content); + $mail_content = str_ireplace('{{CLIENT_NAME}}', $client_data['client_name'], $mail_content); + + $res = MailHelper::send_email(['mail' => $hr_data['mail'], 'subject' => $subject, 'message' => $mail_content, 'common' => $common]); + } + + return $this->respond(['status' => true, 'code' => 200, 'message' => 'Mail send successfully'], 200); + + } + + } diff --git a/app/Controllers/LoginController.php b/app/Controllers/LoginController.php index fb073f21..0e118e10 100755 --- a/app/Controllers/LoginController.php +++ b/app/Controllers/LoginController.php @@ -62,7 +62,7 @@ class LoginController extends BaseController set_session_data($session_data); // Bind session to device - set_session_data(['fingerprint' => generateFingerprint()]); + // set_session_data(['fingerprint' => generateFingerprint()]); log_message('error', 'Set The UserId : `'. $user->id .'` in Session'); log_message('error', 'User Login Sucessfully'); diff --git a/app/Helpers/excel_util_helper.php b/app/Helpers/excel_util_helper.php index db769589..5b5d6b7b 100755 --- a/app/Helpers/excel_util_helper.php +++ b/app/Helpers/excel_util_helper.php @@ -3173,6 +3173,13 @@ if (!function_exists('check_rto_data')) { $vehicle_no = strtoupper(trim($row[2])); // Example: TN10AB1234 $new_vehicle = strtolower(trim($row[2])); + if(!validate_indian_vehicle_number($vehicle_no)['status']){ + return [ + 'status' => false, + 'error' => 'Invalid Vehicle Number. Format should be like TN82AX2024 (no spaces or special characters).' + ]; + }; + // BH Series: 22BH1234AA $bhPattern = '/^[0-9]{2}BH[0-9]{4}[A-Z]{2}$/'; diff --git a/app/Helpers/utility_helper.php b/app/Helpers/utility_helper.php index 79e4ddf9..12e54b6f 100755 --- a/app/Helpers/utility_helper.php +++ b/app/Helpers/utility_helper.php @@ -1101,3 +1101,33 @@ if (!function_exists('convertGoogleDriveToDownloadLink')) { } } +if (!function_exists('get_cd_balance')) { + function get_cd_balance(): array + { + $session = session(); + + return [ + 'has_cd_balance' => $session->has('cd_balance'), + 'hr_data' => $session->get('hr_data') ?? [], + 'cd_balance_info' => $session->get('cd_balance_info') ?? [], + ]; + } +} + +if (!function_exists('clear_cd_balance_session')) { + function clear_cd_balance_session(): void + { + $session = session(); + + $session->remove([ + 'cd_balance', + 'hr_data', + 'cd_balance_info' + ]); + } +} + + + + + diff --git a/app/Models/EmployeePolicyModel.php b/app/Models/EmployeePolicyModel.php index 70f0485c..7df0e021 100755 --- a/app/Models/EmployeePolicyModel.php +++ b/app/Models/EmployeePolicyModel.php @@ -494,7 +494,6 @@ class EmployeePolicyModel extends Model ) as batch_data ON employee_polices.id = batch_data.emp_policy_id WHERE employee_polices.client_policy_id = :client_policy_id: - AND (employee_polices.:id: IS NULL OR employee_polices.:id: = '') AND employees.client_branch_id = :client_branch_id: AND employee_polices.is_active = 1 AND employee_polices.status = 'active' @@ -502,6 +501,14 @@ class EmployeePolicyModel extends Model AND employees.emp_status = 'active' "; + if($insurer_or_tpa == 'insurer'){ + $sql .= "AND (employee_polices.uhid IS NULL OR employee_polices.uhid <> '')"; + } + + if($insurer_or_tpa == 'tpa'){ + $sql .= "AND (employee_polices.tpa_id IS NULL OR employee_polices.tpa_id <> '')"; + } + $binds = ["datas" => $datas,"event" => $event ,"insurer_or_tpa" => $insurer_or_tpa ,"client_policy_id" => $client_policy_id diff --git a/app/Views/insurer_or_tpa_data.php b/app/Views/insurer_or_tpa_data.php index 55c49153..2380d342 100755 --- a/app/Views/insurer_or_tpa_data.php +++ b/app/Views/insurer_or_tpa_data.php @@ -5,6 +5,513 @@ } + +
@@ -146,6 +653,10 @@
+ + + +
@@ -159,12 +670,57 @@ + + + + + \ No newline at end of file From 0ea12fb177d95c9d76ba088054ad6fe5720b7485 Mon Sep 17 00:00:00 2001 From: "sanjeev.p" Date: Thu, 29 Jan 2026 16:12:07 +0530 Subject: [PATCH 02/49] FIX_Lead Noneb R missing and Client toaster due H&F --- app/Controllers/ClientController.php | 3 +-- app/Controllers/LeadsController.php | 2 +- app/Views/leads_form.php | 13 ++++++------- app/Views/leads_non_eb.php | 13 ++++++------- app/Views/rfq/gmc.php | 18 ++++++++++++------ app/Views/rfq/gpa.php | 8 ++++++-- 6 files changed, 32 insertions(+), 25 deletions(-) diff --git a/app/Controllers/ClientController.php b/app/Controllers/ClientController.php index 1fe2264f..49f05145 100755 --- a/app/Controllers/ClientController.php +++ b/app/Controllers/ClientController.php @@ -1015,10 +1015,9 @@ class ClientController extends AdminController ] ], 'short_name' => [ - 'rules' => 'required|alpha', + 'rules' => 'required', 'errors' => [ 'required' => 'Client Short Name is required', - 'alpha' => 'Client Short Name can only contain alphabets.', ] ], 'pan' => [ diff --git a/app/Controllers/LeadsController.php b/app/Controllers/LeadsController.php index 8154fc82..c8413098 100644 --- a/app/Controllers/LeadsController.php +++ b/app/Controllers/LeadsController.php @@ -437,7 +437,7 @@ class LeadsController extends BaseController ]; $request_data = $this->request->getPost(); $data = sanitizeInputArrayAdvanced($request_data); - if($data['lead_form_type'] == 2){ + if (isset($data['lead_form_type']) && (int)$data['lead_form_type'] === 2) { $rules['client_type'] = [ 'rules' => 'required', 'errors' => ['required' => 'Client Type is required'] diff --git a/app/Views/leads_form.php b/app/Views/leads_form.php index 364a2da4..ede380ea 100644 --- a/app/Views/leads_form.php +++ b/app/Views/leads_form.php @@ -2156,10 +2156,9 @@ $('.btnDiv').show(); $('.claim-row').hide(); - - $('.emp_title').text('No of Employees') - $('.depnd_title').text('No of Dependents') - $('.total_title').text('Total Lives') + $('.emp_title_text').text('No of Employees') + $('.depnd_title_text').text('No of Dependents') + $('.total_title_text').text('Total Lives') $('.renewalFields').find('select, input').removeAttr('required'); $('.renewalFields').hide(); @@ -2193,9 +2192,9 @@ $('.btnDiv').hide(); $('.claim-row').show(); - $('.emp_title').text('No of Employees at Inception') - $('.depnd_title').text(' No of Dependents at Inception') - $('.total_title').text('Total Lives at Inception') + $('.emp_title_text').text('No of Employees at Inception') + $('.depnd_title_text').text(' No of Dependents at Inception') + $('.total_title_text').text('Total Lives at Inception') $('.freshFields').find('select, input').removeAttr('required'); $('.freshFields').hide(); diff --git a/app/Views/leads_non_eb.php b/app/Views/leads_non_eb.php index 2f59fe29..ebdf741b 100644 --- a/app/Views/leads_non_eb.php +++ b/app/Views/leads_non_eb.php @@ -738,9 +738,9 @@ $('.claim-row').hide(); - $('.emp_title').text('No of Employees') - $('.depnd_title').text('No of Dependents') - $('.total_title').text('Total Lives') + $('.emp_title_text').text('No of Employees') + $('.depnd_title_text').text('No of Dependents') + $('.total_title_text').text('Total Lives') $('.renewalFields').find('select, input').removeAttr('required'); $('.renewalFields').hide(); @@ -775,9 +775,9 @@ $('.btnDiv').hide(); $('.claim-row').show(); - $('.emp_title').text('No of Employees at Inception') - $('.depnd_title').text(' No of Dependents at Inception') - $('.total_title').text('Total Lives at Inception') + $('.emp_title_text').text('No of Employees at Inception') + $('.depnd_title_text').text(' No of Dependents at Inception') + $('.total_title_text').text('Total Lives at Inception') $('.freshFields').find('select, input').removeAttr('required'); $('.freshFields').hide(); @@ -812,7 +812,6 @@ } } - } var allContacts = ""; function getBranchData(input,inputType) { diff --git a/app/Views/rfq/gmc.php b/app/Views/rfq/gmc.php index 0f5bb4d0..4dd3e6d1 100644 --- a/app/Views/rfq/gmc.php +++ b/app/Views/rfq/gmc.php @@ -131,22 +131,28 @@
- +
- +
- +
diff --git a/app/Views/rfq/gpa.php b/app/Views/rfq/gpa.php index a9c74b6f..344d4b04 100644 --- a/app/Views/rfq/gpa.php +++ b/app/Views/rfq/gpa.php @@ -3,12 +3,16 @@
- +
- +
From b84d8d82d76c6396dc1803be1137a566760ecc4d Mon Sep 17 00:00:00 2001 From: "sanjeev.p" Date: Thu, 29 Jan 2026 17:27:25 +0530 Subject: [PATCH 03/49] Fix_clientnotificationvalidation --- app/Controllers/NotificationController.php | 1 + app/Views/notification.php | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/app/Controllers/NotificationController.php b/app/Controllers/NotificationController.php index 0d85df18..b0e5b4cf 100755 --- a/app/Controllers/NotificationController.php +++ b/app/Controllers/NotificationController.php @@ -52,6 +52,7 @@ class NotificationController extends AdminController // Create Or Update the Notification public function createNotification() { + $form_data['template_name'] = $this->camelCaseToSnakeCase($this->request->getPost('template_name')); $form_data['subject'] = $this->request->getPost('subject'); $form_data['mail_content'] = $this->request->getPost('mailContent'); diff --git a/app/Views/notification.php b/app/Views/notification.php index 5248c2bf..635ca440 100755 --- a/app/Views/notification.php +++ b/app/Views/notification.php @@ -1524,7 +1524,7 @@
-
- Date: Thu, 29 Jan 2026 17:50:27 +0530 Subject: [PATCH 04/49] FIX_ISSUE --- app/Controllers/ClientController.php | 30 ++-- app/Controllers/EmpDataServiceController.php | 8 +- app/Controllers/EmployeeController.php | 2 +- app/Helpers/utility_helper.php | 10 +- app/Views/insurer_or_tpa_data.php | 169 +------------------ 5 files changed, 31 insertions(+), 188 deletions(-) diff --git a/app/Controllers/ClientController.php b/app/Controllers/ClientController.php index 1fe2264f..66b74e0f 100755 --- a/app/Controllers/ClientController.php +++ b/app/Controllers/ClientController.php @@ -6703,16 +6703,16 @@ class ClientController extends AdminController // 'file_name' => "deletion_enhancement_test_file.xlsx", // ]; - // $batch_data = [ - // 'client_id' => 12, - // 'client_policy_id' => 8063, - // 'client_branch_id' => 1, - // 'insurer_or_tpa' => "insurer", - // // 'insurer_or_tpa' => "tpa", - // 'event_type' => "inception", - // 'file_name' => "si_enhancement_test_file.xlsx", - // 'actions' => "export", - // ]; + $batch_data = [ + 'client_id' => 12, + 'client_policy_id' => 8063, + 'client_branch_id' => 1, + 'insurer_or_tpa' => "insurer", + // 'insurer_or_tpa' => "tpa", + 'event_type' => "inception", + 'file_name' => "si_enhancement_test_file.xlsx", + 'actions' => "export", + ]; // $batch_data['insurer_or_tpa'] = 'insurer'; // $batch_data['insurer_or_tpa'] = 'tpa'; @@ -6773,13 +6773,15 @@ class ClientController extends AdminController // $totals = $totals + $item->total; // } + // clear_cd_balance_session(); + // $data = [ - // session()->get('cd_balance'), - // session()->get('cd_amount'), - // session()->get('hr_data'), - // session()->has('cd_balance'), + // 'cd_balance' => session()->get('cd_balance'), + // 'hr_data' => session()->get('hr_data'), + // 'cd_balance_info' => session()->get('cd_balance_info'), // get_cd_balance() // ]; + // dd($data); // $result = $this->employeePolicyModel->getCorrectionEmployeesDataForExportExcel($batch_data); // dd(db_connect()->getLastQuery()); diff --git a/app/Controllers/EmpDataServiceController.php b/app/Controllers/EmpDataServiceController.php index 70709383..8d75b095 100755 --- a/app/Controllers/EmpDataServiceController.php +++ b/app/Controllers/EmpDataServiceController.php @@ -204,13 +204,14 @@ class EmpDataServiceController extends BaseController $totals = $totals + $item->total; } - $totals = round($totals, 2); + $totals = round($totals); //check CD amt insufficient only insurer, not tpa // DO NOT REMOVE THIS if($export_data['insurer_or_tpa'] == 'insurer') { if (!empty($cash_balance)) { - if ((int) $cash_balance['balance'] < (int) $totals) { + clear_cd_balance_session(); + if ((int) $cash_balance['balance'] == (int) $totals) { $this->myLogger->logme('error', 'Inception export failed due to insufficient deposit amount.'); $this->myLogger->logme('error', 'Inception export failed due to insufficient deposit amount. CASH BALANCE : {balance} and TOTAL AMOUNT : {total}', ['balance' => $cash_balance['balance'], 'total' => $totals]); @@ -224,8 +225,7 @@ class EmpDataServiceController extends BaseController }else{ session()->set('cd_balance', true); - session()->set('cd_amount', $cash_balance['balance']); - session()->set('excel_file_amt', $totals); + } } } diff --git a/app/Controllers/EmployeeController.php b/app/Controllers/EmployeeController.php index 5b566530..71749ad4 100755 --- a/app/Controllers/EmployeeController.php +++ b/app/Controllers/EmployeeController.php @@ -4532,7 +4532,7 @@ class EmployeeController extends AdminController 'details' => $result ]; - } catch (Exception $e) { + } catch (\Exception $e) { // 5. Catch network or system exceptions $this->myLogger->logme('error', 'VISIT_OFFBOARD API Exception: ' . $e->getMessage()); return [ diff --git a/app/Helpers/utility_helper.php b/app/Helpers/utility_helper.php index 12e54b6f..efec7f1d 100755 --- a/app/Helpers/utility_helper.php +++ b/app/Helpers/utility_helper.php @@ -1119,11 +1119,11 @@ if (!function_exists('clear_cd_balance_session')) { { $session = session(); - $session->remove([ - 'cd_balance', - 'hr_data', - 'cd_balance_info' - ]); + $session->remove('cd_balance'); + $session->remove('hr_data'); + $session->remove('cd_balance_info'); + + log_message('error', 'clear_cd_balance_session clered'); } } diff --git a/app/Views/insurer_or_tpa_data.php b/app/Views/insurer_or_tpa_data.php index 2380d342..9635fb4b 100755 --- a/app/Views/insurer_or_tpa_data.php +++ b/app/Views/insurer_or_tpa_data.php @@ -7,7 +7,7 @@
@@ -1393,7 +1234,7 @@ messageShown = false; // Reset message flag submitInterval = setInterval(function() { checkCDBalance(); - }, 5000); + }, 10000); console.log("Checking CD balance started..."); } } From 83296fa4afbd914df90683ba6964e499c90174f4 Mon Sep 17 00:00:00 2001 From: "venkatesh.r" Date: Fri, 30 Jan 2026 09:16:27 +0530 Subject: [PATCH 05/49] FIX_HR_APIS_E_CARD_ATTACHMENTS_ISSUES --- app/Controllers/EmployeeRestController.php | 63 ++++++++++++++++++++-- app/Helpers/sendMailNotification.php | 17 +++++- app/Models/TicketMasterModel.php | 1 + 3 files changed, 77 insertions(+), 4 deletions(-) diff --git a/app/Controllers/EmployeeRestController.php b/app/Controllers/EmployeeRestController.php index fa58834a..ebf26139 100755 --- a/app/Controllers/EmployeeRestController.php +++ b/app/Controllers/EmployeeRestController.php @@ -2305,8 +2305,32 @@ class EmployeeRestController extends AdminController } + if($this->request->getGet('policy_status') == 0){ + $emp_policy_status = 'expired'; + }else{ + $emp_policy_status = 'active'; + } - $ClientPolicyData = $this->clientPolicyModel->select('client_policy.id as client_policy_id , client_policy.client_id as client_id, client_policy.policy_type_id as policy_type_id, client_policy.is_addon as is_addon , client_policy.open_for_enrollment as OpenForEnrollment , client_policy.inception_type as inception_type, client_policy.policy_no as policy_no, client_policy.insurer_id as insurer_id, DATE_FORMAT(client_policy.policy_end_date, "%d-%m-%Y") AS policy_expiry_date ') + $ClientPolicyData = $this->clientPolicyModel + ->select(" + client_policy.id as client_policy_id , + client_policy.client_id as client_id, + client_policy.policy_type_id as policy_type_id, + client_policy.is_addon as is_addon , + client_policy.open_for_enrollment as OpenForEnrollment , + client_policy.inception_type as inception_type, + client_policy.policy_no as policy_no, + client_policy.insurer_id as insurer_id, + DATE_FORMAT(client_policy.policy_start_date, '%d-%m-%Y') AS policy_start_date, + DATE_FORMAT(client_policy.policy_end_date, '%d-%m-%Y') AS policy_expiry_date, + ( + select round(sum(rata_premimum + gst)) + from employee_polices + where is_active = 1 + and status = $emp_policy_status + and client_policy_id = client_policy_id + ) as total_premium + ") ->where('md5(client_policy.client_id)', $this->request->getGet('client_id')) ->where('client_policy.client_branch_id', $this->request->getGet('client_branch_id')) ->where('client_policy.is_active', 1) @@ -2443,7 +2467,12 @@ class EmployeeRestController extends AdminController if ($this->request->is('get')) { - $data['claim_status'] = $this->claimStatusModel->select('id,ticket_type,claim_status')->where('is_active', 1)->findAll(); + $data['claim_status'] = $this->claimStatusModel + ->select('id,ticket_type, display_name as claim_status') + ->where('is_active', 1) + ->groupBy('display_name') + ->findAll(); + $data['ticket_type'] = [ ["ticket_type" => "1", "type_name" => "Claim-GMC"], ["ticket_type" => "2", "type_name" => "Claim-GPA"], @@ -2463,7 +2492,8 @@ class EmployeeRestController extends AdminController $from_date = isset($search_data['from_date']) ? $search_data['from_date'] : null; $to_date = isset($search_data['to_date']) ? $search_data['to_date'] : null; - unset($search_data['from_date'], $search_data['to_date']); + $claim_status_id = isset($search_data['claim_status_id']) ? $search_data['claim_status_id'] : null; + unset($search_data['from_date'], $search_data['to_date'], $search_data['claim_status_id']); $where = []; @@ -2474,6 +2504,11 @@ class EmployeeRestController extends AdminController } } + $claim_status_ids = []; + if(!empty($claim_status_id)){ + $claim_status_ids = $this->getTicketClaimStatusIdBasedOnTheDisplayName($claim_status_id); + } + $builder = $db->table('ticket_master tm'); $builder->select([ 'tm.id', @@ -2485,6 +2520,12 @@ class EmployeeRestController extends AdminController ELSE UPPER(tcs.display_name) END AS status ", + "CASE + WHEN tm.tpa_claim_type IS NOT NULL OR tm.tpa_claim_type != '' + THEN tm.tpa_claim_type + ELSE 'Reimbursement' + END AS cl_type + ", 'tm.claim_number AS claim_no', 'tm.claim_status_id', 'tm.is_head_approved', @@ -2568,6 +2609,10 @@ class EmployeeRestController extends AdminController $builder->where($where); } + if (!empty($claim_status_ids)) { + $builder->whereIn('claim_status_id', $claim_status_ids); + } + $builder->orderBy('tm.id', 'DESC'); $data = $builder->get()->getResultArray(); @@ -5305,6 +5350,18 @@ class EmployeeRestController extends AdminController return $this->respond(['status' => false, 'code' => 400, 'message' => 'Failed to upload the file'], 200); } } + + public function getTicketClaimStatusIdBasedOnTheDisplayName($claim_status_id) + { + $claim_status_data_display_name = $this->claimStatusModel->where('is_active', 1)->where('id', $claim_status_id)->first(); + $claim_status_data_id = $this->claimStatusModel + ->select('id') + ->where('is_active', 1) + ->where('display_name', $claim_status_data_display_name['display_name']) + ->findAll(); + return $claim_status_data_id; + } + } diff --git a/app/Helpers/sendMailNotification.php b/app/Helpers/sendMailNotification.php index cc46a3cd..5327f8d5 100755 --- a/app/Helpers/sendMailNotification.php +++ b/app/Helpers/sendMailNotification.php @@ -116,6 +116,21 @@ class sendMailNotification $tpa_id = $params['tpa_id']; $common = $params['common']; + $mailAttachmentModel = new MailAttachmentModel(); + $attachment_data = $mailAttachmentModel + ->select('file_path, file_name') + ->where('notification_id', $notification['id']) + ->where('is_active', 1) + ->findAll(); + + $attachments = []; + foreach ($attachment_data as $data) { + $attachments[] = [ + "filePath" => WRITEPATH . $data['file_path'], + "fileName" => $data['file_name'] + ]; + } + $mail_content = $notification['mail_content']; $mail = $get_emp_email_and_other_details['email_corporate']; @@ -160,7 +175,7 @@ class sendMailNotification $mail_content = view('mail_template', $data); - $wholeData = ['mail' => $mail, 'subject' => $subject,'message'=> $mail_content,'bcc'=> $client_data['common_mails'], 'reply_to' => $client_data['reply_to'], 'common' => $common]; + $wholeData = ['mail' => $mail, 'subject' => $subject,'message'=> $mail_content,'bcc'=> $client_data['common_mails'],'attachments' => $attachments, 'reply_to' => $client_data['reply_to'], 'common' => $common]; return $wholeData; diff --git a/app/Models/TicketMasterModel.php b/app/Models/TicketMasterModel.php index 845a6fe2..f2feb0d5 100644 --- a/app/Models/TicketMasterModel.php +++ b/app/Models/TicketMasterModel.php @@ -92,6 +92,7 @@ class TicketMasterModel extends Model 'claim_description', 'required_docs', 'policy_transaction_id', + 'tpa_claim_type', ]; From 66616b11b00045fff011980717b50a5471ba3deb Mon Sep 17 00:00:00 2001 From: Gowtham M Date: Fri, 30 Jan 2026 10:52:12 +0530 Subject: [PATCH 06/49] FHPl integration & setJson issue : GWM --- .env.sample | 9 +- app/Config/Routes.php | 4 +- app/Controllers/ApiServiceController.php | 36 +- app/Controllers/FhplApiController.php | 519 +++++++++++++++----- app/Controllers/JobWorker.php | 4 + app/Controllers/MediAssistApiController.php | 17 +- app/Controllers/VidalApiController.php | 23 +- 7 files changed, 457 insertions(+), 155 deletions(-) diff --git a/.env.sample b/.env.sample index 9c0f9e71..0b814c05 100755 --- a/.env.sample +++ b/.env.sample @@ -107,4 +107,11 @@ ABHI_PRIMARY_KEY_CONSTANT = R_CARE_PRIMARY_KEY_CONSTANT = -FHPL_PRIMARY_KEY_CONSTANT = \ No newline at end of file +FHPL_PRIMARY_KEY_CONSTANT = + + +FHPL_TOKEN_URL = +FHPL_BASE_URL = +FHPL_USER_NAME = +FHPL_PASSWORD = +FHPL_GRANT_TYPE = \ No newline at end of file diff --git a/app/Config/Routes.php b/app/Config/Routes.php index 4bf4b954..44fdb4fe 100755 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -771,11 +771,11 @@ $routes->get('fetchUHIDDetails','ICICILombardController::fetchUHIDDetails'); //Third party - testing route $routes->get('FhplGetBenefDetails','FhplApiController::FhplGetBenefDetails'); -$routes->get('EcardRequest','VidalApiController::EcardRequest'); +$routes->get('EcardRequest','FhplApiController::EcardRequest'); $routes->get('HospitalNetwork','MediAssistApiController::HospitalNetwork'); $routes->get('VidalGetBenefDetails','VidalApiController::VidalGetBenefDetails'); $routes->get('ClaimDetail','FhplApiController::ClaimDetail'); -$routes->get('SubmitClaim','FhplApiController::SubmitClaim'); +$routes->get('SubmitClaim','VidalApiController::SubmitClaim'); $routes->get('IntimateClaim','MediAssistApiController::IntimateClaim'); $routes->get('IRSubmission','MediAssistApiController::IRSubmission'); $routes->get('ClaimStatusUpdate','MediAssistApiController::ClaimStatusUpdate'); diff --git a/app/Controllers/ApiServiceController.php b/app/Controllers/ApiServiceController.php index 7c256f40..075a7e01 100644 --- a/app/Controllers/ApiServiceController.php +++ b/app/Controllers/ApiServiceController.php @@ -12,6 +12,7 @@ use App\Controllers\BaseController; use App\Controllers\VidalApiController; use App\Controllers\ICICILombardController; use App\Controllers\MediAssistApiController; +use App\Controllers\FhplApiController; use App\Models\BatchFileModel; use App\Models\FileModel; use App\Helpers\TPADataCompareHelper; @@ -26,6 +27,7 @@ class ApiServiceController extends BaseController protected $medi_assist_primary_key; protected $vidal_primary_key; protected $icici_primary_key; + protected $fhpl_primary_key; public function __construct() { @@ -34,6 +36,7 @@ class ApiServiceController extends BaseController $this->medi_assist_primary_key = getenv('MEDI_ASSIST_PRIMARY_KEY_CONSTANT'); $this->vidal_primary_key = getenv('VIDAL_PRIMARY_KEY_CONSTANT'); $this->icici_primary_key = getenv('ICICI_PRIMARY_KEY_CONSTANT'); + $this->fhpl_primary_key = getenv('FHPL_PRIMARY_KEY_CONSTANT'); } // Push Claims @@ -55,6 +58,10 @@ class ApiServiceController extends BaseController { // Vidal $vidalApiController = new VidalApiController; return $vidalApiController->SubmitClaim($claimId); + }else if ($tpaID == $this->fhpl_primary_key) + { // fhpl + $fhplApiController = new FhplApiController; + return $fhplApiController->SubmitClaim($claimId); }else{ log_message('error', "This ticket id ( {$claimId} ) TPA has no API service enabled. TPA ID : {$tpaID}"); } @@ -130,6 +137,12 @@ class ApiServiceController extends BaseController $vidalApiController = new VidalApiController; $data['eCardDownload'] = $vidalApiController->EcardRequest( $emp_code, $policy_no , $employee_policy[0]['tpa_id'] ); + }else if($employee_policy[0]['tpa_primary_id'] == $this->fhpl_primary_key)// Fhpl + { + + $fhplApiController = new FhplApiController; + $data['eCardDownload'] = $fhplApiController->EcardRequest( $emp_code, $policy_no , $employee_policy[0]['tpa_id'] ); + }else{ if($type == "download"){ @@ -266,6 +279,17 @@ class ApiServiceController extends BaseController return $this->respond(['status' => true, 'code' => 200, 'message' => 'Action Triggered','data' => [] ]); + }else if ($tpa_id == $this->fhpl_primary_key) // Fhpl + { + $file_id = $fileModel->insert($data); + log_message('error', "Files table inserted successfully, File id : {$file_id}"); + // $fhplApiController = new FhplApiController; + // $fhplApiController->FhplGetBenefDetails( [ 'polict_no' => $policy_no, 'file_id' =>$file_id ] ); + $r = Jobs::addJob(['job_name' => 'FhplGetBenefDetails', 'payload' => ['policy_no' => $policy_no, 'file_id' => $file_id, 'client_policy_id' => $policy_id, 'return_type' => 'job']]); + log_message('error', "FhplGetBenefDetails job pushed successfully."); + + return $this->respond(['status' => true, 'code' => 200, 'message' => 'Action Triggered','data' => [] ]); + }else{ return $this->respond(['status' => false, 'code' => 200,'message' => 'TPA not found ','data' => [] ]); } @@ -287,12 +311,20 @@ class ApiServiceController extends BaseController if ($tpaID == $this->medi_assist_primary_key) { // MediAssist $mediAssistController = new MediAssistApiController(); - return $mediAssistController->ClaimDetail($claimId); + $res = $mediAssistController->ClaimDetail($claimId); + return $this->response->setJSON(['status' => $res['status'],'message' => $res['message'] ]); }else if ($tpaID == $this->vidal_primary_key) { // vidal $vidalApiController = new VidalApiController; - return $vidalApiController->ClaimDetail($claimId); + $res = $vidalApiController->ClaimDetail($claimId); + return $this->response->setJSON(['status' => $res['status'],'message' => $res['message'] ]); + + }else if ($tpaID == $this->fhpl_primary_key) { // Fhpl + + $fhplApiController = new FhplApiController; + $res = $fhplApiController->ClaimDetail($claimId); + return $this->response->setJSON(['status' => $res['status'],'message' => $res['message'] ]); }else{ log_message('error', "This ticket id ( {$claimId} ) TPA has no API service enabled. TPA ID : {$tpaID}"); diff --git a/app/Controllers/FhplApiController.php b/app/Controllers/FhplApiController.php index 9497433c..f2ac8b17 100644 --- a/app/Controllers/FhplApiController.php +++ b/app/Controllers/FhplApiController.php @@ -69,7 +69,7 @@ class FhplApiController extends BaseController ]); } - public function SubmitClaim($claimId = 515) + public function SubmitClaim($claimId = null) // 515 { helper('api'); @@ -99,7 +99,7 @@ class FhplApiController extends BaseController if (count($data) && $data['filePath'] == null) { log_message('error', "TPA CLAIM PUSH FAILED FHPL | claimId: '.$claimId.' - Claim or File Missing"); - return $this->response->setJSON(['status' => false,'message' => 'Claim or File Missing', ]); + return; } // Build absolute file path @@ -108,7 +108,7 @@ class FhplApiController extends BaseController if (!file_exists($pdfPath)) { log_message('error', "TPA CLAIM PUSH FAILED FHPL | claimId: '.$claimId.' - PDF not found on server"); - return $this->response->setJSON(['status' => false,'message' => 'PDF not found on server']); + return; } // Convert PDF to Base64 @@ -117,7 +117,8 @@ class FhplApiController extends BaseController // Generate FHPL Token $tokenResponse = json_decode($this->generateAuthToken()->getBody(), true); if (empty($tokenResponse['data']['access_token'])) { - return $this->response->setJSON(['status' => false,'message' => 'FHPL Token generation failed']); + log_message('error', "TPA CLAIM PUSH FAILED FHPL | claimId: '.$claimId.' - FHPL Token generation failed"); + return; } $token = $tokenResponse['data']['access_token']; @@ -125,10 +126,10 @@ class FhplApiController extends BaseController $body = [ "IssueID" => $data['dependentUniqueId'], // this key added after seeing the error in responce have to click with fhpl team "Userid" => getenv('FHPL_USER_NAME'), - "PolicyNo" => "111700-TATAMTORS", // $data['policyNo'], - "UhidNo" => "OIC40830846", //$data['dependentUniqueId'], + "PolicyNo" => $data['policyNo'], // "111700-TATAMTORS", + "UhidNo" => $data['dependentUniqueId'], // "OIC40830846", "ClaimID" => (string) $data['id'], - "DOA" => "2025-10-11",//date('Y-m-d', strtotime($data['admissionDate'])), + "DOA" => date('Y-m-d', strtotime($data['admissionDate'])), //"2025-10-11", "DateofDischarge"=> $data['dischargeDate'] ? date('Y-m-d', strtotime($data['dischargeDate'])) : null, "ClaimedAmount" => (float) $data['requestedAmount'], "DocumentType" => 20, // Fresh Claim @@ -155,7 +156,7 @@ class FhplApiController extends BaseController $response = call_third_party_api($url, 'POST', $headers, $body); - log_message('error', 'FHPL RESPONSE | ' . json_encode($response)); + log_message('error', 'TPA CLAIM PUSH FHPL RESPONSE | ' . json_encode($response)); if($response['status'] != true){ log_message('error', 'TPA CLAIM PUSH FAILED FHPL | claimId: '.$claimId.' | response: '.json_encode($response)); @@ -185,14 +186,17 @@ class FhplApiController extends BaseController log_message('error', 'TPA CLAIM PUSH SUCCESS FHPL | claimId: '.$claimId.' | claimNO: '.$fhplClaimNo); + }else { + log_message('error', 'TPA CLAIM PUSH API SUCCESS BUT claimsInfo EMPTY | response: '.json_encode($response)); + return; } } - - return $this->response->setJSON($response); + return; + // return $this->response->setJSON($response); } - public function ClaimDetail($claimId = 515) + public function ClaimDetail($claimId = null) //515 { helper('api'); @@ -203,13 +207,13 @@ class FhplApiController extends BaseController ->get()->getRowArray(); - if(!$ticket) return $this->response->setJSON(['status'=>false,'message'=>'Invalid claim']); + if(!$ticket) return ['status'=>false,'message'=>'Invalid claim']; // Generate FHPL Token $tokenResponse = json_decode($this->generateAuthToken()->getBody(), true); if (empty($tokenResponse['data']['access_token'])) { - return $this->response->setJSON(['status' => false,'message' => 'FHPL Token generation failed']); + return ['status' => false,'message' => 'FHPL Token generation failed']; } $token = $tokenResponse['data']['access_token']; @@ -219,9 +223,9 @@ class FhplApiController extends BaseController $body = [ "UserName" => getenv('FHPL_USER_NAME'), "Password" => getenv('FHPL_PASSWORD'), - "PolicyNumber" => "GHI-81-25-00087313-000",//$ticket['policy_no'], - "Fromdate" => "2025-04-26",//$ticket['claimNo'], - "Todate" => "2025-04-27",//$ticket['claimNo'], + "PolicyNumber" => $ticket['policy_no'], //"GHI-81-25-00087313-000", + "Fromdate" => $ticket['policy_start_date'],//"2025-04-26", + "Todate" => $ticket['policy_end_date'],//"2025-04-27", ]; $headers = ["Authorization: Bearer ".$token,"Content-Type: application/json"]; @@ -232,12 +236,7 @@ class FhplApiController extends BaseController if (empty($response['data'][0])) { log_message('error', 'CLAIM STATUS FAILED | for ticket ID: ' . $claimId.' | response: '.json_encode($response)); - - return $this->response->setJSON([ - 'status' => false, - 'message' => 'API call failed.', - 'data' => $response - ]); + return ['status' => false,'message' => 'API call failed.','data' => $response ]; } @@ -263,18 +262,11 @@ class FhplApiController extends BaseController if( $status != null && isset($map[$status])) { $this->db->table('ticket_master')->where('id',$claimId)->update(['claim_status_id'=>$map[$status],'tpa_claim_status'=>$status]); - // LOG UPDATE log_message('error', "CLAIM STATUS SUCCESS | Updated ticket ID $claimId with claim status: $status"); } - - return $this->response->setJSON([ - 'status' => true, - 'message' => 'Claim status updated.', - 'updated_status' => $status, - 'api_response' => $response - ]); + return ['status' => true,'message' => 'Claim status updated.','updated_status' => $status,'api_response' => $response]; } @@ -298,24 +290,16 @@ class FhplApiController extends BaseController return $this->response->setJSON(['status'=>true,'updated'=>$count]); } - public function EcardRequest($employeeId,$policyNo,$uhid) + public function EcardRequest($employeeId = null,$policyNo = null,$uhid = null) { helper('api'); // Generate FHPL Token $tokenResponse = json_decode($this->generateAuthToken()->getBody(), true); - if (empty($tokenResponse['data']['access_token'])) { - return $this->response->setJSON(['status' => false,'message' => 'FHPL Token generation failed']); + log_message('error', 'Ecard Request FAILED | employeeId: '.$employeeId.' | policyNo: '.$policyNo.' | Message: FHPL Token generation failed'); + return null; } - - // Generate FHPL Token - $tokenResponse = json_decode($this->generateAuthToken()->getBody(), true); - - if (empty($tokenResponse['data']['access_token'])) { - return $this->response->setJSON(['status' => false,'message' => 'FHPL Token generation failed']); - } - $token = $tokenResponse['data']['access_token']; $url = getenv('FHPL_BASE_URL')."/api/GetEcard"; @@ -323,107 +307,402 @@ class FhplApiController extends BaseController $body = [ "UserName" => getenv('FHPL_USER_NAME'), "Password" => getenv('FHPL_PASSWORD'), - "PolicyNumber" => $policyNo, - "EmployeeID" => $employeeId + "PolicyNumber" => $policyNo, //'10/12/2025/16/17', + "EmployeeID" => $employeeId, //'101225', ]; $headers = ["Authorization: Bearer ".$token,"Content-Type: application/json"]; $response = call_third_party_api($url,'POST',$headers,$body); + // dd($response); - if(($response['data']['STATUS'] ?? '')=='SUCCESS'){ - return $response['data']['E_Card']; + if (($response['status'] ?? false) !== true) { + log_message('error', 'Ecard Request FAILED | response: ' . json_encode($response)); + return null; } + if (empty($response['data'][0])) { + log_message('error', 'Ecard Request FAILED | Empty data | response: ' . json_encode($response)); + return null; + } + + $apiData = $response['data'][0]; + + if (($apiData['STATUS'] ?? '') === 'SUCCESS') { + + $ecardUrl = $apiData['E_Card'] ?? ''; + + if (!empty($ecardUrl)) { + log_message( + 'info', + 'Ecard Request PUSH SUCCESS | employeeId: ' . $employeeId . + ' | policyNo: ' . $policyNo . + ' | ecardUrl: ' . $ecardUrl + ); + return $ecardUrl; + } + } + + log_message('error', 'Ecard Request FAILED | response: ' . json_encode($response)); return null; } public function FhplGetBenefDetails($requestData = null) { - helper('api'); - $policyNo = $requestData['policy_no'] ?? "10/12/2025/16/17"; - $client_policy_id = $requestData['client_policy_id'] ?? 0; + $function_calling_type = $requestData['return_type'] ?? 'job'; - // Generate FHPL Token - $tokenResponse = json_decode($this->generateAuthToken()->getBody(), true); - if (empty($tokenResponse['data']['access_token'])) { - return $this->response->setJSON(['status' => false,'message' => 'FHPL Token generation failed']); - } - $token = $tokenResponse['data']['access_token']; + try { + + helper('api'); - $url = getenv('FHPL_BASE_URL')."/api/GetEnrollmentDetailsPolicy"; + $policyNo = $requestData['policy_no'] ?? null; + $client_policy_id = $requestData['client_policy_id'] ?? null; - $headers = [ - "Authorization: Bearer ".$token, - "Content-Type: application/json" - ]; - - $startIndex = 0; - $range = 100; - $allMembers = []; - - do { - $body = [ - "UserName" => getenv('FHPL_USER_NAME'), - "Password" => getenv('FHPL_PASSWORD'), - "PolicyNumber" => $policyNo, - "StartIndex" => $startIndex, - "Range" => $range - ]; - - $response = call_third_party_api($url,'POST',$headers,$body); - - dd($response); - - if(empty($response['data']['Members'])){ - break; - } - - $allMembers = array_merge($allMembers,$response['data']['Members']); - - $startIndex += $range; - - } while($startIndex < ($response['data']['Total'] ?? 0)); - - - dd($allMembers); - - // Now same matching logic you already have - $employeePolicyModel = new EmployeePolicyModel(); - - $employeePolicyData = $employeePolicyModel - ->join('employees','employees.id=employee_polices.employee_id') - ->where('employee_polices.client_policy_id',$client_policy_id) - ->where('employee_polices.tpa_id IS NULL') - ->findAll(); - - $updated = 0; - - foreach($employeePolicyData as $policy){ - foreach($allMembers as $m){ - - if( - strtolower(trim($policy['name']))==strtolower(trim($m['Name'])) && - $policy['emp_code']==$m['MemberID'] && - strtolower($policy['relationship'])==strtolower($m['Relation']) - ){ - $this->db->table('employee_polices') - ->where('id',$policy['emp_policy_id']) - ->update(['tpa_id'=>$m['UHID']]); - - $updated++; + if (empty($policyNo)) { + log_message('error', 'TPA ID PULL | policy_no missing in request'); + if($function_calling_type == "job"){ + return ['status' => false, 'message' => 'policy_no required']; + }else{ + return $this->respond(['status' => false, 'message' => 'policy_no required']); } } - } - return [ - 'status'=>true, - 'total_fetched'=>count($allMembers), - 'updated'=>$updated - ]; + if (empty($client_policy_id)) { + log_message('error', 'TPA ID PULL | client_policy_id missing in request'); + if($function_calling_type == "job"){ + return ['status' => false, 'message' => 'client_policy_id required']; + }else{ + return $this->respond(['status' => false, 'message' => 'client_policy_id required']); + } + } + + log_message('error', "TPA ID PULL | called for policy_no: {$policyNo} , client_policy_id: {$client_policy_id}"); + + // Fetch file download dates + $batchFiles = $this->db->table('batch_files f') + ->select("f.created_at") + ->where('f.client_policy_id', $client_policy_id) + ->where('f.insurer_or_tpa', 'tpa') + ->where('f.actions', 'export') + ->get() + ->getResultArray(); + + if (empty($batchFiles)) { + log_message('error', 'TPA ID PULL FAILED | batchFiles is empty for this tpa id pull request'); + if($function_calling_type == "job"){ + return ['status' => false, 'message' => 'batchFiles not found']; + }else{ + return $this->respond(['status' => false, 'message' => 'batchFiles not found']); + } + } + + // Generate FHPL Token + $tokenResponse = json_decode($this->generateAuthToken()->getBody(), true); + if (empty($tokenResponse['data']['access_token'])) { + log_message('error', 'TPA ID PULL | FHPL Token generation failed'); + if($function_calling_type == "job"){ + return ['status' => false, 'message' => 'FHPL Token generation failed']; + }else{ + return $this->respond(['status' => false, 'message' => 'FHPL Token generation failed']); + } + } + $token = $tokenResponse['data']['access_token']; + + $url = getenv('FHPL_BASE_URL') . "/api/GetEnrollmentDetailsPolicy"; + + $headers = [ + "Authorization: Bearer " . $token, + "Content-Type: application/json" + ]; + + $startIndex = 0; + $range = 100; + $allMembers = []; + + while (true) { + + $body = [ + "UserName" => getenv('FHPL_USER_NAME'), + "Password" => getenv('FHPL_PASSWORD'), + "PolicyNumber" => $policyNo, + "StartIndex" => $startIndex, + "Range" => $range + ]; + + log_message('error', "TPA ID PULL | API parems " . json_encode([$url, 'POST', $headers, $body])); + + $response = call_third_party_api($url, 'POST', $headers, $body); + + if (($response['status'] ?? false) !== true) { + log_message('error', 'FHPL API FAILED | response: ' . json_encode($response)); + break; + } + + if ( + !isset($response['data']) || + !is_array($response['data']) || + count($response['data']) === 0 || + !array_is_list($response['data']) // PHP 8+ safe check + ) { + // STOP when data is not a valid list + break; + } + + $allMembers = array_merge($allMembers, $response['data']); + + // Move to next page + $startIndex += $range; + } + + if(empty($allMembers)) + { + + // update file table status after the tpa id failed to update + if (isset($requestData['file_id']) && !empty($requestData['file_id'])) { + $file_model = new BatchFileModel(); + $file_model->where('id', $requestData['file_id'])->set('status', 'failed-8')->update(); + log_message('error', "Files table status updated for the file id : {$requestData['file_id']}"); + } else { + log_message('error', "Failed to update file table status."); + } + + log_message('error', 'TPA ID PULL API FAILED | API failed: Empty menber data for this pull request'); + + if($function_calling_type == "job"){ + return ['status' => false, 'message' => 'API call failed', 'data' => 'Empty menber data for this pull request']; + }else{ + return $this->respond(['status' => false, 'message' => 'API call failed', 'data' => 'Empty menber data for this pull request']); + } + + } + + // dd($allMembers); + + //save API data as JSON for analysis + $json = json_encode($allMembers, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + // $filename = time() . '.json'; + $filePath = WRITEPATH . 'tmp/'.time().'_'.$requestData['file_id'].'.json'; + file_put_contents($filePath, $json); + + //call a job for dump JSON data to DB + $job_details = new Jobs(); + $r = Jobs::addJob(['job_name' => 'saveFhplAPIData', 'payload' => [ 'file_id' => $requestData['file_id'],'json_file_path' => $filePath ]]); + + // ================= MATCHING LOGIC ================= + + $employeePolicyModel = new EmployeePolicyModel(); + + $employeePolicyData = $employeePolicyModel + ->join('employees', 'employees.id = employee_polices.employee_id') + ->where('employee_polices.client_policy_id', $client_policy_id) + ->where('employee_polices.tpa_id IS NULL') + ->findAll(); + + $updated = 0; + + foreach ($employeePolicyData as $policy) { + $hasMatchForThisPolicy = false; + foreach ($allMembers as $m) { + + if ( + strtolower(trim($policy['name'])) === strtolower(trim($m['EMPLOYEE_NAME'] ?? '')) && + ($policy['emp_code'] ?? '') == ($m['EMPLOYEE_ID'] ?? '') && + strtolower($policy['relationship']) === strtolower($m['RELATION'] ?? '') + ) { + + $hasMatchForThisPolicy = true; + + + $sql = "UPDATE employee_polices SET tpa_id = ? WHERE id = ?"; + $this->db->query($sql, [$m['TPA_TPADETAIL_ID'], $policy['emp_policy_id']]); + + // for e-card send + if(strtolower(trim($policy['relationship'])) == 'self'){ + $employee_policy_ids[] = $policy['emp_policy_id']; + } + + if ($this->db->affectedRows() > 0) { + $updated++; + log_message('error', "✅ Updated tpa_id={$m['TPA_TPADETAIL_ID']} for emp_policy_id={$policy['emp_policy_id']} policy={$policyNo}"); + } else { + log_message('error', "⚠️ No update (already set or not matched) for emp_policy_id={$policy['emp_policy_id']} policy={$policyNo}"); + } + } + } + } + + // Handle NO MATCH for this policy + if (!$hasMatchForThisPolicy) { + + $nhanceSideData = [ + 'name' => $policy_data['name'] ?? null, + 'emp_code' => $policy_data['emp_code'] ?? null, + 'relationship' => $policy_data['relationship'] ?? null, + 'gender' => $policy_data['gender'] ?? null, + 'dob' => $policy_data['dob'] ?? null, + ]; + $batch_file_success = 'partially success'; + + log_message( + 'error', + "❌ No match for Nhance = " . json_encode($nhanceSideData) + ); + } + + // send e-card + if(!empty($employee_policy_ids)){ + log_message('error', "sendMailForDownloadingECard JOB PUSHED."); + Jobs::addJob(['job_name' => 'sendMailForDownloadingECard', 'payload' => ['ids' => $employee_policy_ids, 'client_policy_id' => $client_policy_id]]); + } + + // update file table status after the tpa id successfully updated + if (isset($requestData['file_id']) && !empty($requestData['file_id'])) { + $file_model = new BatchFileModel(); + + $file_model->where('id', $requestData['file_id'])->set('status', $batch_file_success)->update(); + log_message('error', "Files table status updated for the file id : {$requestData['file_id']}"); + } else { + log_message('error', "Failed to update file table status."); + } + + $totalCount = count($allMembers); + + log_message('error', "TPA ID PULL SUCCESS | completed. Total fetched={$totalCount}, updated={$updated}"); + + if($function_calling_type == "job"){ + return [ + 'status' => true, + 'message' => 'Updated successfully', + 'total_fetched' => $totalCount, + 'total_updated' => $updated + ]; + }else{ + return $this->respond([ + 'status' => true, + 'message' => 'Updated successfully', + 'total_fetched' => $totalCount, + 'total_updated' => $updated + ]); + } + } catch (\Throwable $th) { + + // update file table status after the tpa id failed to update + if (isset($requestData['file_id']) && !empty($requestData['file_id'])) { + $file_model = new BatchFileModel(); + $file_model->where('id', $requestData['file_id'])->set('status', 'failed-8')->update(); + log_message('error', "Files table status updated for the file id : {$requestData['file_id']}"); + } else { + log_message('error', "Failed to update file table status."); + } + + $errorData = [ + 'message' => $th->getMessage(), + 'file' => $th->getFile(), + 'line' => $th->getLine(), + 'code' => $th->getCode(), + 'trace' => $th->getTraceAsString(), + 'trace_array' => $th->getTrace(), // full array version (optional) + 'function' => $th->getTrace()[0]['function'] ?? null, + 'class' => $th->getTrace()[0]['class'] ?? null, + ]; + + log_message('error', 'Exception thrown while calling GetBenefDetails API: ' . json_encode($errorData)); + if($function_calling_type == "job"){ + return ['status' => false, 'message' => 'API call failed', 'data' => $errorData]; + }else{ + return $this->respond(['status' => false, 'message' => 'API call failed', 'data' => $errorData]); + } + } } + + // public function FhplGetBenefDetails($requestData = null) + // { + // helper('api'); + + // $policyNo = $requestData['policy_no'] ?? "10/12/2025/16/17"; + // $client_policy_id = $requestData['client_policy_id'] ?? 0; + + // // Generate FHPL Token + // $tokenResponse = json_decode($this->generateAuthToken()->getBody(), true); + // if (empty($tokenResponse['data']['access_token'])) { + // return $this->response->setJSON(['status' => false,'message' => 'FHPL Token generation failed']); + // } + // $token = $tokenResponse['data']['access_token']; + + // $url = getenv('FHPL_BASE_URL')."/api/GetEnrollmentDetailsPolicy"; + + // $headers = [ + // "Authorization: Bearer ".$token, + // "Content-Type: application/json" + // ]; + + // $startIndex = 0; + // $range = 100; + // $allMembers = []; + + // do { + // $body = [ + // "UserName" => getenv('FHPL_USER_NAME'), + // "Password" => getenv('FHPL_PASSWORD'), + // "PolicyNumber" => $policyNo, + // "StartIndex" => $startIndex, + // "Range" => $range + // ]; + + // $response = call_third_party_api($url,'POST',$headers,$body); + + // dd($response); + + // if(empty($response['data']['Members'])){ + // break; + // } + + // $allMembers = array_merge($allMembers,$response['data']['Members']); + + // $startIndex += $range; + + // } while($startIndex < ($response['data']['Total'] ?? 0)); + + + // dd($allMembers); + + // // Now same matching logic you already have + // $employeePolicyModel = new EmployeePolicyModel(); + + // $employeePolicyData = $employeePolicyModel + // ->join('employees','employees.id=employee_polices.employee_id') + // ->where('employee_polices.client_policy_id',$client_policy_id) + // ->where('employee_polices.tpa_id IS NULL') + // ->findAll(); + + // $updated = 0; + + // foreach($employeePolicyData as $policy){ + // foreach($allMembers as $m){ + + // if( + // strtolower(trim($policy['name']))==strtolower(trim($m['Name'])) && + // $policy['emp_code']==$m['MemberID'] && + // strtolower($policy['relationship'])==strtolower($m['Relation']) + // ){ + // $this->db->table('employee_polices') + // ->where('id',$policy['emp_policy_id']) + // ->update(['tpa_id'=>$m['UHID']]); + + // $updated++; + // } + // } + // } + + // return [ + // 'status'=>true, + // 'total_fetched'=>count($allMembers), + // 'updated'=>$updated + // ]; + // } + public function syncFhplClaimsToNhance() { helper('api'); diff --git a/app/Controllers/JobWorker.php b/app/Controllers/JobWorker.php index 160c6fe9..f2020755 100755 --- a/app/Controllers/JobWorker.php +++ b/app/Controllers/JobWorker.php @@ -191,6 +191,10 @@ class JobWorker extends AdminController 'type' => 'CC', // Handler Category 'handler' => 'App\Controllers\VidalApiController', ], + 'FhplGetBenefDetails' => [ + 'type' => 'CC', // Handler Category + 'handler' => 'App\Controllers\FhplApiController', + ], 'bdsDumpExcelFileFormatValidation' => [ 'type' => 'CC', // Handler Category 'handler' => 'App\Controllers\PolicyTransactionController', diff --git a/app/Controllers/MediAssistApiController.php b/app/Controllers/MediAssistApiController.php index 9ce9be18..0452c797 100644 --- a/app/Controllers/MediAssistApiController.php +++ b/app/Controllers/MediAssistApiController.php @@ -518,7 +518,7 @@ class MediAssistApiController extends BaseController ->getRowArray(); if (!$ticket) { - return $this->response->setJSON(['status' => false,'message' => 'Invalid Claim ID' ]); + return ['status' => false,'message' => 'Invalid Claim ID' ]; } // REQUEST BODY @@ -548,8 +548,6 @@ class MediAssistApiController extends BaseController } - - // $body = [ // "policyNo" => "97000063250400000031", // "startDate" => "01/11/2025", @@ -568,11 +566,7 @@ class MediAssistApiController extends BaseController if ($response['status'] != true || empty($response['data']['claimsData'][0])) { log_message('error', 'CLAIM STATUS FAILED | for ticket ID: ' . $claimId.' | response: '.json_encode($response)); - return $this->response->setJSON([ - 'status' => false, - 'message' => 'API call failed.', - 'data' => $response - ]); + return ['status' => false,'message' => 'API call failed.','data' => $response ]; } // Extract claim status @@ -634,12 +628,7 @@ class MediAssistApiController extends BaseController // LOG UPDATE log_message('error', "CLAIM STATUS SUCCESS | Updated ticket ID $claimId with claim status: $currentStatus"); - return $this->response->setJSON([ - 'status' => true, - 'message' => 'Claim status updated.', - 'updated_status' => $currentStatus, - 'api_response' => $response - ]); + return ['status' => true,'message' => 'Claim status updated.','updated_status' => $currentStatus,'api_response' => $response]; } public function IRSubmission($claimId = null) // 585 this id for test diff --git a/app/Controllers/VidalApiController.php b/app/Controllers/VidalApiController.php index 0c0bc293..f84364a9 100644 --- a/app/Controllers/VidalApiController.php +++ b/app/Controllers/VidalApiController.php @@ -254,8 +254,8 @@ class VidalApiController extends BaseController if($response['data']['status'] == 'SUCCESS') { - $claimNO = $response['data']['data']['claimNO'] ?? null; - $claimInwardNO = $response['data']['data']['claimInwardNO'] ?? null; + $claimNO = $response['data']['data']['claimNo'] ?? null; + $claimInwardNO = $response['data']['data']['claimInwardNo'] ?? null; if(!empty($claimNO) && !empty($claimInwardNO)){ @@ -263,7 +263,7 @@ class VidalApiController extends BaseController $this->db->table('ticket_master') ->where('id',$claimId) - ->update([ 'tpa_claim_push_reference_no' => $claimInwardNO , 'tpa_claim_id' => $claimNO ]); + ->update([ 'tpa_claim_push_reference_no' => $claimInwardNO , 'tpa_claim_id' => $claimNO , 'claim_number' => $claimNO ]); return; @@ -442,7 +442,7 @@ class VidalApiController extends BaseController ->getRowArray(); if (!$ticket) { - return $this->response->setJSON(['status' => false,'message' => 'Invalid Claim ID' ]); + return ['status' => false,'message' => 'Invalid Claim ID' ]; } $body = []; @@ -467,11 +467,7 @@ class VidalApiController extends BaseController if ($response['status'] != true || empty($response['data']['data']['claims'][0])) { log_message('error', 'CLAIM STATUS FAILED | for ticket ID: ' . $claimId.' | response: '.json_encode($response)); - return $this->response->setJSON([ - 'status' => false, - 'message' => 'API call failed.', - 'data' => $response - ]); + return ['status' => false, 'message' => 'API call failed.','data' => $response]; } // Extract claim status @@ -504,12 +500,7 @@ class VidalApiController extends BaseController // LOG UPDATE log_message('error', "CLAIM STATUS SUCCESS | Updated ticket ID $claimId with claim status: $currentStatus"); - return $this->response->setJSON([ - 'status' => true, - 'message' => 'Claim status updated.', - 'updated_status' => $currentStatus, - 'api_response' => $response - ]); + return ['status' => true,'message' => 'Claim status updated.','updated_status' => $currentStatus,'api_response' => $response]; } public function ClaimStatusUpdate() @@ -804,7 +795,7 @@ class VidalApiController extends BaseController //call a job for dump JSON data to DB $job_details = new Jobs(); - $r = Jobs::addJob(['job_name' => 'saveMediAssitAPIData', 'payload' => [ 'file_id' => $requestData['file_id'],'json_file_path' => $filePath ]]); + $r = Jobs::addJob(['job_name' => 'saveVidalAPIData', 'payload' => [ 'file_id' => $requestData['file_id'],'json_file_path' => $filePath ]]); // now update DB From 8b6cc7544c45079dc99d13994501f8c5054c660e Mon Sep 17 00:00:00 2001 From: "sanjeev.p" Date: Fri, 30 Jan 2026 10:53:34 +0530 Subject: [PATCH 07/49] FIX_ClientBranch --- app/Controllers/ClientController.php | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/app/Controllers/ClientController.php b/app/Controllers/ClientController.php index 56066c73..52b2a67f 100755 --- a/app/Controllers/ClientController.php +++ b/app/Controllers/ClientController.php @@ -1831,6 +1831,7 @@ class ClientController extends AdminController $this->myLogger->logme('error', 'Client branch EDIT function called'); $data = $this->request->getPost(); + $sanitized_post_data = sanitizeInputArrayAdvanced($data); $id = $sanitized_post_data['branch_id_primarykey'] ?? null; $client_id = $sanitized_post_data['client_id'] ?? null; @@ -1838,7 +1839,7 @@ class ClientController extends AdminController $data['pre_branch_id'] = $pre_branch_id; - $units = $sanitized_post_data['units'] ?? null; + $raw_units = $this->request->getPost('units'); $emp_unit_count = 0; $rr_unit_count = 0; @@ -1846,12 +1847,13 @@ class ClientController extends AdminController $total_count = 0; $list_of_branch_units = $this->clientBranchModel->find((int)$id); - $units = json_decode($list_of_branch_units['units']); + $units = !empty($list_of_branch_units['units']) ? json_decode($list_of_branch_units['units'], true) : []; if (!is_array($units) || empty($units)) { $client_data = $this->clientModel->where('id', $sanitized_post_data['client_id'])->first(); $default_unit = trim(($client_data['short_name'] ?? '') . '-' . ($sanitized_post_data['branch_code'] ?? ''), '-'); $sanitized_post_data['units'] = json_encode([$default_unit]); + $units = [$default_unit]; // Update local variable for counting } if (!empty($units)) { @@ -1866,17 +1868,21 @@ class ClientController extends AdminController $uncommonValues = []; + if ($total_count > 0) { - $units = (string) $sanitized_post_data('units'); // Assuming 'units' is an array + + $post_units_raw = $sanitized_post_data['units'] ?? '[]'; - $list_of_branch_units = $this->clientBranchModel->find((int)$id); - $branch_units = json_decode($list_of_branch_units['units'], true); - $units = json_decode($units); - - $uncommonValues = array_diff($branch_units, $units); + $branch_units = json_decode($list_of_branch_units['units'] ?? '[]', true); + + // Ensure we handle both string-json and array types + $incoming_units = is_array($post_units_raw) ? $post_units_raw : json_decode($post_units_raw, true); + + if (is_array($branch_units) && is_array($incoming_units)) { + $uncommonValues = array_diff($branch_units, $incoming_units); + } if (count($uncommonValues) > 0) { - $branchData = $this->clientBranchModel->where('client_id', $client_id)->findAll(); return $this->respond([ @@ -1888,7 +1894,7 @@ class ClientController extends AdminController ], 200); } } - + if (!isset($sanitized_post_data['sez'])) { $sanitized_post_data['sez'] = 0; } elseif ($sanitized_post_data['sez']) { From e5f0c34f8dc08ee0c7dd14614271881f19d0d734 Mon Sep 17 00:00:00 2001 From: "venkatesh.r" Date: Fri, 30 Jan 2026 11:23:58 +0530 Subject: [PATCH 08/49] FIX_ISSUE --- app/Controllers/EmployeeRestController.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app/Controllers/EmployeeRestController.php b/app/Controllers/EmployeeRestController.php index ebf26139..14cee4da 100755 --- a/app/Controllers/EmployeeRestController.php +++ b/app/Controllers/EmployeeRestController.php @@ -2311,6 +2311,9 @@ class EmployeeRestController extends AdminController $emp_policy_status = 'active'; } + $db = \Config\Database::connect(); + $emp_policy_status = $db->escape($emp_policy_status); + $ClientPolicyData = $this->clientPolicyModel ->select(" client_policy.id as client_policy_id , @@ -2327,10 +2330,10 @@ class EmployeeRestController extends AdminController select round(sum(rata_premimum + gst)) from employee_polices where is_active = 1 - and status = $emp_policy_status - and client_policy_id = client_policy_id + and status = $emp_policy_status + and client_policy_id = client_policy.id ) as total_premium - ") + ", false) ->where('md5(client_policy.client_id)', $this->request->getGet('client_id')) ->where('client_policy.client_branch_id', $this->request->getGet('client_branch_id')) ->where('client_policy.is_active', 1) @@ -2470,6 +2473,7 @@ class EmployeeRestController extends AdminController $data['claim_status'] = $this->claimStatusModel ->select('id,ticket_type, display_name as claim_status') ->where('is_active', 1) + ->where('display_name IS NOT NULL OR display_name <> ""') ->groupBy('display_name') ->findAll(); From 3d316a7ddaafd39b48c99a66428208f28447de2f Mon Sep 17 00:00:00 2001 From: "venkatesh.r" Date: Fri, 30 Jan 2026 11:30:03 +0530 Subject: [PATCH 09/49] FIX_ISSUE --- app/Controllers/EmployeeRestController.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Controllers/EmployeeRestController.php b/app/Controllers/EmployeeRestController.php index 14cee4da..ceef5447 100755 --- a/app/Controllers/EmployeeRestController.php +++ b/app/Controllers/EmployeeRestController.php @@ -2493,6 +2493,7 @@ class EmployeeRestController extends AdminController $client_id = isset($search_data['client_id']) ? (int) $search_data['client_id'] : 0; unset($search_data['client_id']); + unset($search_data['client_branch_id']); $from_date = isset($search_data['from_date']) ? $search_data['from_date'] : null; $to_date = isset($search_data['to_date']) ? $search_data['to_date'] : null; From fb12823c3f0cfba9129e72f173bcdfee128b01d2 Mon Sep 17 00:00:00 2001 From: "sanjeev.p" Date: Fri, 30 Jan 2026 11:41:45 +0530 Subject: [PATCH 10/49] FIX_ClientPolicies --- app/Controllers/ClientController.php | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/app/Controllers/ClientController.php b/app/Controllers/ClientController.php index 52b2a67f..5db200e0 100755 --- a/app/Controllers/ClientController.php +++ b/app/Controllers/ClientController.php @@ -1809,7 +1809,7 @@ class ClientController extends AdminController } if ($insert) { - $branchData = $this->clientBranchModel->where('client_id', $sanitized_post_data('client_id'))->findAll(); + $branchData = $this->clientBranchModel->where('client_id', $sanitized_post_data['client_id'])->findAll(); $branchData['role'] = get_role_id(); return $this->respond([ 'status' => true, @@ -2041,7 +2041,7 @@ class ClientController extends AdminController $this->myLogger->logme('error', 'Client policy CREATE function called'); $request_post_data = $this->request->getPost(); - $$sanitized_post_data = sanitizeInputArrayAdvanced($request_post_data); + $sanitized_post_data = sanitizeInputArrayAdvanced($request_post_data); $policy_type_id = $sanitized_post_data['policy_type_id'] ?? null; $client_branch_id = $sanitized_post_data['client_branch_id'] ?? null; @@ -2075,10 +2075,12 @@ class ClientController extends AdminController $sanitized_post_data['earned_premium_date'] = change_date_format($sanitized_post_data['earned_premium_date'] ?? null, 'd-m-Y', 'Y-m-d') ?? null; $sanitized_post_data['claims_incurred_date'] = change_date_format($sanitized_post_data['claims_incurred_date'] ?? null, 'd-m-Y', 'Y-m-d') ?? null; - $sanitized_post_dataa['base_policy'] = ($sanitized_post_data['base_policy'] === '' || $sanitized_post_data['base_policy'] == 0) ? null : $sanitized_post_data['base_policy']; - $sanitized_post_data['policy_status'] = 1; - $sanitized_post_data['inception_type'] = $sanitized_post_data['inception_type'] ? 2 : 1; - + $sanitized_post_data['base_policy'] = ($sanitized_post_data['base_policy'] === '' || $sanitized_post_data['base_policy'] == 0) ? null : $sanitized_post_data['base_policy']; + $sanitized_post_data['policy_status'] = 1; + $sanitized_post_data['inception_type'] = (isset($sanitized_post_data['inception_type']) && $sanitized_post_data['inception_type'] !== "") + ? $sanitized_post_data['inception_type'] + : 1; + @@ -2109,7 +2111,7 @@ class ClientController extends AdminController $sanitized_post_data['policy_start_date'] = change_date_format($sanitized_post_data['policy_start_date'] ?? null, 'd-m-Y', 'Y-m-d'); $sanitized_post_data['policy_end_date'] = change_date_format($sanitized_post_data['policy_end_date'] ?? null, 'd-m-Y', 'Y-m-d'); $sanitized_post_data['policy_no'] = $sanitized_post_data['policy_no'] ?? null; - if ($sanitized_post_data['inception_type'] == 2) { + if (isset($sanitized_post_data['inception_type']) && $sanitized_post_data['inception_type'] == 2) { $sanitized_post_data['open_date'] = change_date_format($sanitized_post_data['open_date'] ?? null, 'd-m-Y', 'Y-m-d'); $sanitized_post_data['close_date'] = change_date_format($sanitized_post_data['close_date'] ?? null, 'd-m-Y', 'Y-m-d'); // $data['reminder_date'] = change_date_format($this->request->getPost('reminder_date'), 'd-m-Y', 'Y-m-d'); @@ -2126,7 +2128,7 @@ class ClientController extends AdminController if ($insert) { $clientPoliceData = $this->clientPolicyModel->getClientPolicyByClientId($sanitized_post_data['client_id']); $clientPoliceData['role'] = get_role_id(); - return $this->respond(['status' => true, 'code' => 200, 'data' => $clientPoliceData, 'client_id' => $client_id, 'method' => 'CERATE', 'post_data' => $insert_data], 200); + return $this->respond(['status' => true, 'code' => 200, 'data' => $clientPoliceData, 'client_id' => $client_id, 'method' => 'CERATE', 'post_data' => $insert], 200); } else { return $this->respond(['status' => false, 'code' => 404, 'message' => 'no data found'], 200); } From 38179782136f9af3b4442d71af3b5ffd04c4d453 Mon Sep 17 00:00:00 2001 From: "venkatesh.r" Date: Fri, 30 Jan 2026 12:10:44 +0530 Subject: [PATCH 11/49] FIX_ISSUE --- app/Controllers/EmployeeRestController.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/Controllers/EmployeeRestController.php b/app/Controllers/EmployeeRestController.php index ceef5447..379fe023 100755 --- a/app/Controllers/EmployeeRestController.php +++ b/app/Controllers/EmployeeRestController.php @@ -2327,7 +2327,7 @@ class EmployeeRestController extends AdminController DATE_FORMAT(client_policy.policy_start_date, '%d-%m-%Y') AS policy_start_date, DATE_FORMAT(client_policy.policy_end_date, '%d-%m-%Y') AS policy_expiry_date, ( - select round(sum(rata_premimum + gst)) + select COALESCE(ROUND(SUM(rata_premimum + gst)), 0) from employee_polices where is_active = 1 and status = $emp_policy_status @@ -5364,6 +5364,8 @@ class EmployeeRestController extends AdminController ->where('is_active', 1) ->where('display_name', $claim_status_data_display_name['display_name']) ->findAll(); + + $claim_status_data_id = array_column($claim_status_data_id, 'id'); return $claim_status_data_id; } From e8542b26a5a68313c16057a1d8ba7559a5d54cdb Mon Sep 17 00:00:00 2001 From: "sanjeev.p" Date: Fri, 30 Jan 2026 12:20:50 +0530 Subject: [PATCH 12/49] FIX_ClientPolicies --- app/Controllers/ClientController.php | 13 +-- app/Controllers/MasterController.php | 130 ++++++++++++++------------- 2 files changed, 69 insertions(+), 74 deletions(-) diff --git a/app/Controllers/ClientController.php b/app/Controllers/ClientController.php index 5db200e0..c16c20eb 100755 --- a/app/Controllers/ClientController.php +++ b/app/Controllers/ClientController.php @@ -5621,32 +5621,25 @@ class ClientController extends AdminController ], 'type' => [ - 'rules' => 'required|is_natural_no_zero', + 'rules' => 'required', 'errors' => [ 'required' => 'Vehicle type is required' ] ], 'description' => [ - 'rules' => 'required|is_natural_no_zero', + 'rules' => 'required', 'errors' => [ 'required' => 'Vehicle description is required' ] ], 'owner' => [ - 'rules' => 'required|is_natural_no_zero', + 'rules' => 'required', 'errors' => [ 'required' => 'Owner is required' ] ], - 'old_onwer' => [ - 'rules' => 'permit_empty|alpha_space', - 'errors' => [ - 'alpha_space' => 'Old owner name can contain only letters and spaces' - ] - ], - ]; if (!$this->validate($rules)) { return $this->response->setStatusCode(400)->setJSON([ diff --git a/app/Controllers/MasterController.php b/app/Controllers/MasterController.php index 7c46bc9a..dc6538d4 100755 --- a/app/Controllers/MasterController.php +++ b/app/Controllers/MasterController.php @@ -449,7 +449,7 @@ class MasterController extends AdminController $insert = $this->insurerBranchModel->insert($sanitized_post_data); if($insert){ - for ($i = 0; $i < count($sanitized_post_data('name')); $i++) { + for ($i = 0; $i < count($sanitized_post_data['name']); $i++) { // Prepare data to insert $sanitized_post_data_for_level = [ 'contact_type' => 'insurer', @@ -465,7 +465,7 @@ class MasterController extends AdminController } if($insert){ - $branchData = $this->insurerBranchModel->where('insurer_id', $sanitized_post_data_for_level['insurer_id'])->findAll(); + $branchData = $this->insurerBranchModel->where('insurer_id', $sanitized_post_data['insurer_id'])->findAll(); echo json_encode(array("status" => true , 'data' => $branchData)); }else{ echo json_encode(array("status" => false)); @@ -2168,72 +2168,74 @@ class MasterController extends AdminController public function createCDMasterData() { $this->myLogger->logme("error", 'Create CD Master Data API called.'); - $rules = [ - - // ====================== - // Client / Insurer Mapping - // ====================== - 'client_id' => [ - 'rules' => 'required|is_natural_no_zero', - 'errors' => [ - 'required' => 'Client is required' - ] - ], - - 'insurer_id' => [ - 'rules' => 'required|is_natural_no_zero', - 'errors' => [ - 'required' => 'Insurer is required' - ] - ], - - 'insurer_branch_id' => [ - 'rules' => 'required|is_natural_no_zero', - 'errors' => [ - 'required' => 'Insurer branch is required' - ] - ], - - // ====================== - // CD Account Details - // ====================== - 'opening_date' => [ - 'rules' => 'required|valid_date[d-m-Y]', - 'errors' => [ - 'required' => 'Opening date is required', - 'valid_date' => 'Opening date must be in DD-MM-YYYY format' - ] - ], - - 'cd_ac_no' => [ - 'rules' => 'required|trim', - 'errors' => [ - 'required' => 'CD account number is required' - ] - ], - - 'opening_bal' => [ - 'rules' => 'required|numeric|greater_than_equal_to[0]', - 'errors' => [ - 'required' => 'Opening amount is required', - 'numeric' => 'Opening amount must be numeric', - 'greater_than_equal_to' => 'Opening amount cannot be negative' - ] - ], - ]; - if (!$this->validate($rules)) { - return $this->response->setStatusCode(400)->setJSON([ - 'status' => false, - 'message' => 'Input validation failed', - 'code' => 400, - 'errors' => $this->validator->getErrors() - ]); - } $data = $this->request->getPost(); $sanitized_post_data = sanitizeInputArrayAdvanced($data); + $id = $sanitized_post_data['PrimaryKey'] ?? null; + if($id === null){ + $rules = [ + + // ====================== + // Client / Insurer Mapping + // ====================== + 'client_id' => [ + 'rules' => 'required|is_natural_no_zero', + 'errors' => [ + 'required' => 'Client is required' + ] + ], + + 'insurer_id' => [ + 'rules' => 'required|is_natural_no_zero', + 'errors' => [ + 'required' => 'Insurer is required' + ] + ], + + 'insurer_branch_id' => [ + 'rules' => 'required|is_natural_no_zero', + 'errors' => [ + 'required' => 'Insurer branch is required' + ] + ], + + // ====================== + // CD Account Details + // ====================== + 'opening_date' => [ + 'rules' => 'required|valid_date[d-m-Y]', + 'errors' => [ + 'required' => 'Opening date is required', + 'valid_date' => 'Opening date must be in DD-MM-YYYY format' + ] + ], + + 'cd_ac_no' => [ + 'rules' => 'required|trim', + 'errors' => [ + 'required' => 'CD account number is required' + ] + ], + + 'opening_bal' => [ + 'rules' => 'required|numeric|greater_than_equal_to[0]', + 'errors' => [ + 'required' => 'Opening amount is required', + 'numeric' => 'Opening amount must be numeric', + 'greater_than_equal_to' => 'Opening amount cannot be negative' + ] + ], + ]; + if (!$this->validate($rules)) { + return $this->response->setStatusCode(400)->setJSON([ + 'status' => false, + 'message' => 'Input validation failed', + 'code' => 400, + 'errors' => $this->validator->getErrors() + ]); + } + } $this->myLogger->logme("error", 'Received POST data: ' . json_encode($data)); - $id = $sanitized_post_data['PrimaryKey'] ?? null; $date = (string) ($sanitized_post_data['opening_date'] ?? ''); $sanitized_post_data['opening_date'] = date('Y-m-d', strtotime($date)); $this->myLogger->logme("error", 'Formatted opening_date: ' . $data['opening_date']); From af4d23a377c119d8bf1d54bf881482dfb2265845 Mon Sep 17 00:00:00 2001 From: velz Date: Fri, 30 Jan 2026 15:26:39 +0530 Subject: [PATCH 13/49] FIX_ACL&VISIT_OFFBOARD --- app/Config/Acl.php | 4 ++++ app/Controllers/EmployeeController.php | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/Config/Acl.php b/app/Config/Acl.php index b89e53a9..371e1a21 100644 --- a/app/Config/Acl.php +++ b/app/Config/Acl.php @@ -17,6 +17,10 @@ class Acl '#^/swagger#' => ['roles' => [ADMIN_ROLE_ID]], '#^/fedeploy#' => ['roles' => [ADMIN_ROLE_ID]], '#^/visitOffBoardCheck#' => ['roles' => [ADMIN_ROLE_ID]], + '#^/logs#' => ['roles' => [ADMIN_ROLE_ID]], + '#^/util/log_list#' => ['roles' => [ADMIN_ROLE_ID]], + '#^/util/view_log#' => ['roles' => [ADMIN_ROLE_ID]], + '#^/util/download_log#' => ['roles' => [ADMIN_ROLE_ID]], // ===================== PUBLIC DOWNLOADS / FORMS ===================== '#^/download-#' => ['public' => true], diff --git a/app/Controllers/EmployeeController.php b/app/Controllers/EmployeeController.php index 6f3ab21d..ed60c502 100755 --- a/app/Controllers/EmployeeController.php +++ b/app/Controllers/EmployeeController.php @@ -4473,9 +4473,9 @@ class EmployeeController extends AdminController public function visitOffBoard(array $params) { // 1. Load credentials from .env - $apiUrl = env('WELLNESS_ONBOARD_ENDPOINT_URL'); + $apiUrl = env('WELLNESS_ONBOARD_ENDPOINT_URL').'delete-policy-with-dependents'; $apiToken = env('WELLNESS_ONBOARD_AUTHORIZATION'); - + // echo $apiUrl;die(); // 2. Initialize the CI4 CURL service $client = \Config\Services::curlrequest([ 'base_uri' => $apiUrl, From ff46f960dd31f980fade96ee9386a1ba71596475 Mon Sep 17 00:00:00 2001 From: "venkatesh.r" Date: Fri, 30 Jan 2026 16:05:38 +0530 Subject: [PATCH 14/49] FIX_NOTIFICATION_TEMPLATE_ISSUE_AND_FILTER_ISSUE --- app/Config/Filters.php | 2 +- app/Controllers/LoginController.php | 2 +- app/Filters/AuthMVC.php | 10 +- app/Views/notification.php | 156 +++++++++------------------- 4 files changed, 58 insertions(+), 112 deletions(-) diff --git a/app/Config/Filters.php b/app/Config/Filters.php index 36899e3a..b115e0ca 100755 --- a/app/Config/Filters.php +++ b/app/Config/Filters.php @@ -63,7 +63,7 @@ class Filters extends BaseConfig 'HttpRequestLog' => ['except' => 'cli/*'], 'Cors', // 'AclFilter' => ['except' => ['login', 'logout', 'auth/*', 'oauth2callback','claim-form-download', 'claims-feedback-form', 'autobookstackLogin','employeeRest/*','processjob','getCommission']], - 'SecurityInputFilter' => ['except' => ['notification/create','/ticket/crud_mail_template/*','test_mail','leads/sendMail'] ], + 'SecurityInputFilter' => ['except' => ['/client/notification/create','/ticket/crud_mail_template/*','test_mail','leads/sendMail'] ], 'GlobalPostFileUploadGuard' // 'csrf', // 'invalidchars', diff --git a/app/Controllers/LoginController.php b/app/Controllers/LoginController.php index 0e118e10..fb073f21 100755 --- a/app/Controllers/LoginController.php +++ b/app/Controllers/LoginController.php @@ -62,7 +62,7 @@ class LoginController extends BaseController set_session_data($session_data); // Bind session to device - // set_session_data(['fingerprint' => generateFingerprint()]); + set_session_data(['fingerprint' => generateFingerprint()]); log_message('error', 'Set The UserId : `'. $user->id .'` in Session'); log_message('error', 'User Login Sucessfully'); diff --git a/app/Filters/AuthMVC.php b/app/Filters/AuthMVC.php index 298a72b9..ef2da046 100755 --- a/app/Filters/AuthMVC.php +++ b/app/Filters/AuthMVC.php @@ -23,11 +23,11 @@ class AuthMVC implements FilterInterface // } // Fingerprint validation - // $fp = generateFingerprint(); - // // log_message('error',$fp); - // if (session()->get('fingerprint') !== $fp) { - // return AuthLogout::logout(); - // } + $fp = generateFingerprint(); + // log_message('error',$fp); + if (session()->get('fingerprint') !== $fp) { + return AuthLogout::logout(); + } } diff --git a/app/Views/notification.php b/app/Views/notification.php index 635ca440..93e8213e 100755 --- a/app/Views/notification.php +++ b/app/Views/notification.php @@ -1614,7 +1614,6 @@ const formData = new FormData(form); formData.append('template_name', template_name); formData.append('client_id', client_id); - console.log(formData.template_name); const fileInput = form.querySelector('input[type="file"]'); // Check if a file is selected @@ -1980,23 +1979,15 @@ // Use the editor instance instead of unlayer directly editor.exportHtml(function(data) { - var formData = $('#account_maneger_summary_mail_form').serializeArray(); - // Append Unlayer editor data - formData.push({ - name: 'mailContent', - value: data.html - }); - formData.push({ - name: 'client_id', - value: $('#general_PrimaryKey').val() - }); - formData.push({ - name: 'mailJson', - value: JSON.stringify(data.design) - }); + var formData = new FormData($('#account_maneger_summary_mail_form')[0]); - console.log(formData); + // Append Unlayer data + formData.append('mailContent', data.html); + formData.append('client_id', $('#general_PrimaryKey').val()); + formData.append('mailJson', JSON.stringify(data.design)); + + console.log([...formData.entries()]); // Show loading indicators $('.loader').fadeIn(); @@ -2042,23 +2033,15 @@ // Use the editor instance instead of unlayer directly editor.exportHtml(function(data) { - var formData = $('#member_welcome_mail_form').serializeArray(); - // Append Unlayer editor data - formData.push({ - name: 'mailContent', - value: data.html - }); - formData.push({ - name: 'client_id', - value: $('#general_PrimaryKey').val() - }); - formData.push({ - name: 'mailJson', - value: JSON.stringify(data.design) - }); + var formData = new FormData($('#member_welcome_mail_form')[0]); - console.log(formData); + // Append Unlayer data + formData.append('mailContent', data.html); + formData.append('client_id', $('#general_PrimaryKey').val()); + formData.append('mailJson', JSON.stringify(data.design)); + + console.log([...formData.entries()]); // Show loading indicators $('.loader').fadeIn(); @@ -2104,23 +2087,15 @@ // Use the editor instance instead of unlayer directly editor.exportHtml(function(data) { - var formData = $('#member_reminder_mail_form').serializeArray(); - // Append Unlayer editor data - formData.push({ - name: 'mailContent', - value: data.html - }); - formData.push({ - name: 'client_id', - value: $('#general_PrimaryKey').val() - }); - formData.push({ - name: 'mailJson', - value: JSON.stringify(data.design) - }); + var formData = new FormData($('#member_reminder_mail_form')[0]); - console.log(formData); + // Append Unlayer data + formData.append('mailContent', data.html); + formData.append('client_id', $('#general_PrimaryKey').val()); + formData.append('mailJson', JSON.stringify(data.design)); + + console.log([...formData.entries()]); // Show loading indicators $('.loader').fadeIn(); @@ -2166,23 +2141,15 @@ // Use the editor instance instead of unlayer directly editor.exportHtml(function(data) { - var formData = $('#member_ecard_mail_form').serializeArray(); - // Append Unlayer editor data - formData.push({ - name: 'mailContent', - value: data.html - }); - formData.push({ - name: 'client_id', - value: $('#general_PrimaryKey').val() - }); - formData.push({ - name: 'mailJson', - value: JSON.stringify(data.design) - }); + var formData = new FormData($('#member_ecard_mail_form')[0]); - console.log(formData); + // Append Unlayer data + formData.append('mailContent', data.html); + formData.append('client_id', $('#general_PrimaryKey').val()); + formData.append('mailJson', JSON.stringify(data.design)); + + console.log([...formData.entries()]); // Show loading indicators $('.loader').fadeIn(); @@ -2229,21 +2196,15 @@ // Use the editor instance instead of unlayer directly editor.exportHtml(function(data) { - var formData = $('#member_common_mail_form').serializeArray(); - // Append Unlayer editor data - formData.push({ - name: 'mailContent', - value: data.html - }); - formData.push({ - name: 'client_id', - value: $('#general_PrimaryKey').val() - }); - formData.push({ - name: 'mailJson', - value: JSON.stringify(data.design) - }); + var formData = new FormData($('#member_common_mail_form')[0]); + + // Append Unlayer data + formData.append('mailContent', data.html); + formData.append('client_id', $('#general_PrimaryKey').val()); + formData.append('mailJson', JSON.stringify(data.design)); + + console.log([...formData.entries()]); // Show loading indicators $('.loader').fadeIn(); @@ -2289,23 +2250,15 @@ // Use the editor instance instead of unlayer directly editor.exportHtml(function(data) { - var formData = $('#member_review_and_summary_mail_form').serializeArray(); - // Append Unlayer editor data - formData.push({ - name: 'mailContent', - value: data.html - }); - formData.push({ - name: 'client_id', - value: $('#general_PrimaryKey').val() - }); - formData.push({ - name: 'mailJson', - value: JSON.stringify(data.design) - }); + var formData = new FormData($('#member_review_and_summary_mail_form')[0]); - console.log(formData); + // Append Unlayer data + formData.append('mailContent', data.html); + formData.append('client_id', $('#general_PrimaryKey').val()); + formData.append('mailJson', JSON.stringify(data.design)); + + console.log([...formData.entries()]); // Show loading indicators $('.loader').fadeIn(); @@ -2351,23 +2304,16 @@ // Use the editor instance instead of unlayer directly editor.exportHtml(function(data) { - var formData = $('#client_hr_summary_mail_form').serializeArray(); - // Append Unlayer editor data - formData.push({ - name: 'mailContent', - value: data.html - }); - formData.push({ - name: 'client_id', - value: $('#general_PrimaryKey').val() - }); - formData.push({ - name: 'mailJson', - value: JSON.stringify(data.design) - }); + var formData = new FormData($('#client_hr_summary_mail_form')[0]); + + // Append Unlayer data + formData.append('mailContent', data.html); + formData.append('client_id', $('#general_PrimaryKey').val()); + formData.append('mailJson', JSON.stringify(data.design)); + + console.log([...formData.entries()]); - console.log(formData); // Show loading indicators $('.loader').fadeIn(); From 46d2303e6275c342fb7fc34429ce17f072e3b49f Mon Sep 17 00:00:00 2001 From: Gowtham M Date: Fri, 30 Jan 2026 18:17:08 +0530 Subject: [PATCH 15/49] HEalth cre controller : GWM --- app/Controllers/HealthindiaapiController.php | 751 +++++++++++++++++++ 1 file changed, 751 insertions(+) create mode 100644 app/Controllers/HealthindiaapiController.php diff --git a/app/Controllers/HealthindiaapiController.php b/app/Controllers/HealthindiaapiController.php new file mode 100644 index 00000000..253c97b3 --- /dev/null +++ b/app/Controllers/HealthindiaapiController.php @@ -0,0 +1,751 @@ +db = \Config\Database::connect(); + $this->healthIndiaTpaId = getenv('HEALTH_INDIA_PRIMARY_KEY_CONSTANT'); + } + + public function generateAuthToken() + { + $url = getenv('HEALTH_INDIA_TOKEN_URL'); // https://software.healthindiatpa.com/HIITPABROKERAPI/JWT/GenerateJWTAuth + + // Basic Authentication credentials + $username = getenv('HEALTH_INDIA_USERNAME'); // /MU4gwfBYC71M1QnczasegH0vPM5IMbESO4iy4wbUrQ= + $password = getenv('HEALTH_INDIA_PASSWORD'); // KoVi+w2WGA+ET6fHN3kdBamHNsDKbA+kUtuF++4jWcg= + + $ch = curl_init(); + + curl_setopt_array($ch, [ + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_CUSTOMREQUEST => 'POST', + CURLOPT_HTTPHEADER => [ + 'Authorization: Basic ' . base64_encode($username . ':' . $password), + 'Content-Type: application/json', + ], + CURLOPT_TIMEOUT => 30, + ]); + + $response = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + + if (curl_errno($ch)) { + log_message('error', 'HEALTH_INDIA TOKEN GENERATION FAILED | Error: ' . curl_error($ch)); + curl_close($ch); + return $this->response->setJSON([ + 'status' => false, + 'error' => curl_error($ch), + ]); + } + + curl_close($ch); + + $responseData = json_decode($response, true); + + if ($httpCode === 200 && isset($responseData['status']) && $responseData['status'] === true) { + log_message('error', 'HEALTH_INDIA TOKEN GENERATION SUCCESS | Token: ' . ($responseData['result'][0]['access_token'] ?? 'N/A')); + } else { + log_message('error', 'HEALTH_INDIA TOKEN GENERATION FAILED | Response: ' . $response); + } + + return $this->response->setJSON([ + 'status' => $httpCode === 200, + 'http_code' => $httpCode, + 'data' => $responseData, + ]); + } + + public function SubmitClaim($claimId = null) + { + helper('api'); + + log_message('error', 'TPA CLAIM PUSH HEALTH_INDIA | Started for claimId: ' . $claimId); + + $data = $this->db->table('ticket_master tm') + ->select(' + tm.id, + tm.emp_mobile as mobileNo, + tm.emp_mail as emailId, + tm.doa as admissionDate, + tm.dod as dischargeDate, + tm.hospital_name as hospitalName, + tm.claim_amount as claimedAmount, + tm.tpa_no as memberId, + tm.ailment as ailmentDescription, + cp.policy_no as policyNumber, + e.emp_code as employeeCode, + tn.note as disease, + cf.url as filePath, + tm.claim_type as claimType, + tm.claim_category as benefitType + ') + ->join('employees e', 'e.id = tm.emp_id', 'left') + ->join('client_policy cp', 'tm.client_policy_id = cp.id', 'left') + ->join('ticket_notes tn', 'tn.ticket_id = tm.id', 'left') + ->join('claim_files cf', "cf.ticket_id = tm.id AND cf.file_type = 2 AND cf.mime_type='application/pdf'", 'left') + ->where('tm.id', $claimId) + ->get() + ->getRowArray(); + + if (!$data) { + log_message('error', "TPA CLAIM PUSH FAILED HEALTH_INDIA | claimId: {$claimId} - Claim not found"); + return; + } + + if ($data['filePath'] == null) { + log_message('error', "TPA CLAIM PUSH FAILED HEALTH_INDIA | claimId: {$claimId} - File Missing"); + return; + } + + // Build absolute file path + $filename = basename($data['filePath']); + $pdfPath = WRITEPATH . 'uploads/claim_files/' . $filename; + + if (!file_exists($pdfPath)) { + log_message('error', "TPA CLAIM PUSH FAILED HEALTH_INDIA | claimId: {$claimId} - PDF not found on server at path: {$pdfPath}"); + return; + } + + // Convert PDF to Base64 + $fileContent = base64_encode(file_get_contents($pdfPath)); + + // Generate Health India Token + $tokenResponse = json_decode($this->generateAuthToken()->getBody(), true); + if (empty($tokenResponse['data']['result'][0]['access_token'])) { + log_message('error', "TPA CLAIM PUSH FAILED HEALTH_INDIA | claimId: {$claimId} - Token generation failed"); + return; + } + $token = $tokenResponse['data']['result'][0]['access_token']; + + // Map claim type: Reimbursement or Cashless + $claimTypeMap = [ + 'reimbursement' => 'Reimbursement', + 'cashless' => 'Cashless', + ]; + $mappedClaimType = $claimTypeMap[strtolower($data['claimType'] ?? 'reimbursement')] ?? 'Reimbursement'; + + // Map benefit type: IPD or OPD + $benefitTypeMap = [ + 'ipd' => 'IPD', + 'opd' => 'OPD', + ]; + $mappedBenefitType = $benefitTypeMap[strtolower($data['benefitType'] ?? 'ipd')] ?? 'IPD'; + + // Build Health India Claim Submission Request (API Section 5) + $body = [ + "policY_NUMBER" => $data['policyNumber'], + "employeE_CODE" => $data['employeeCode'], + "membeR_ID" => $data['memberId'], + "claiM_TYPE" => $mappedClaimType, + "benefiT_TYPE" => $mappedBenefitType, + "claimeD_AMOUNT" => (string) $data['claimedAmount'], + "datE_OF_ADMISSION" => date('Y-m-d', strtotime($data['admissionDate'])), + "ailmenT_DESCRIPTION" => $data['ailmentDescription'] ?? 'NA', + "hospitaL_CODE" => "", // Not available in your data + "hospitaL_NAME" => $data['hospitalName'] ?? '', + "hospitaL_ADDRESS" => "", // Not available + "hospitaL_NUMBER" => "", // Not available + "pdF_BYTES" => [$fileContent] + ]; + + $url = getenv('HEALTH_INDIA_BASE_URL') . "/Intimation/GetClaimIntimation"; + + $headers = [ + "Authorization: Bearer " . $token, + "Content-Type: application/json" + ]; + + log_message('error', 'TPA CLAIM PUSH HEALTH_INDIA | claimId: ' . $claimId . ' | URL: ' . $url . ' | payload: ' . json_encode($body)); + + $response = call_third_party_api($url, 'POST', $headers, $body); + + log_message('error', 'TPA CLAIM PUSH HEALTH_INDIA RESPONSE | claimId: ' . $claimId . ' | response: ' . json_encode($response)); + + if ($response['status'] != true) { + log_message('error', 'TPA CLAIM PUSH FAILED HEALTH_INDIA | claimId: ' . $claimId . ' | response: ' . json_encode($response)); + $this->db->table('ticket_master') + ->where('id', $claimId) + ->update(['tpa_push_response' => json_encode($response)]); + return; + } + + if ($response['status'] === true && !empty($response['data']['result'][0]['ccn'])) { + $ccn = $response['data']['result'][0]['ccn']; + $ccnExt = $response['data']['result'][0]['ccN_EXT'] ?? '0'; + + $this->db->table('ticket_master') + ->where('id', $claimId) + ->update([ + 'claim_number' => $ccn, + 'tpa_claim_id' => $ccn, + 'tpa_claim_push_reference_no' => $ccn . '(' . $ccnExt . ')', + 'updated_at' => date('Y-m-d H:i:s') + ]); + + log_message('error', 'TPA CLAIM PUSH SUCCESS HEALTH_INDIA | claimId: ' . $claimId . ' | CCN: ' . $ccn . ' | CCN_EXT: ' . $ccnExt); + } else { + log_message('error', 'TPA CLAIM PUSH HEALTH_INDIA API SUCCESS BUT CCN EMPTY | claimId: ' . $claimId . ' | response: ' . json_encode($response)); + return; + } + + return; + } + + public function ClaimDetail($claimId = null) + { + helper('api'); + + log_message('error', 'CLAIM STATUS HEALTH_INDIA | Started for claimId: ' . $claimId); + + $ticket = $this->db->table('ticket_master tm') + ->select("tm.id, tm.tpa_claim_id as ccn, cp.policy_no, cp.policy_start_date, cp.policy_end_date, tm.emp_code") + ->join('client_policy cp', 'tm.client_policy_id=cp.id') + ->where('tm.id', $claimId) + ->get()->getRowArray(); + + if (!$ticket) { + log_message('error', 'CLAIM STATUS FAILED HEALTH_INDIA | claimId: ' . $claimId . ' - Invalid claim'); + return ['status' => false, 'message' => 'Invalid claim']; + } + + // Generate Health India Token + $tokenResponse = json_decode($this->generateAuthToken()->getBody(), true); + + if (empty($tokenResponse['data']['result'][0]['access_token'])) { + log_message('error', 'CLAIM STATUS FAILED HEALTH_INDIA | claimId: ' . $claimId . ' - Token generation failed'); + return ['status' => false, 'message' => 'Token generation failed']; + } + + $token = $tokenResponse['data']['result'][0]['access_token']; + + $url = getenv('HEALTH_INDIA_BASE_URL') . "/Claims/GetClaims"; + + // Using claim number wise approach (Section 7.3 - option 3) + $body = [ + "policY_NUMBER" => $ticket['policy_no'], + "CCN" => $ticket['ccn'], + "CCN_EXT" => "0" + ]; + + $headers = [ + "Authorization: Bearer " . $token, + "Content-Type: application/json" + ]; + + log_message('error', 'CLAIM STATUS HEALTH_INDIA | claimId: ' . $claimId . ' | Request: ' . json_encode($body)); + + $response = call_third_party_api($url, 'POST', $headers, $body); + + log_message('error', 'CLAIM STATUS HEALTH_INDIA | claimId: ' . $claimId . ' | Response: ' . json_encode($response)); + + if (empty($response['data']['result'][0])) { + log_message('error', 'CLAIM STATUS FAILED HEALTH_INDIA | claimId: ' . $claimId . ' | Empty response data'); + return ['status' => false, 'message' => 'API call failed.', 'data' => $response]; + } + + $claimData = $response['data']['result'][0]; + $status = $claimData['claiM_STATUS'] ?? null; + + // Status mapping based on API documentation + $map = [ + "Under Process" => 5, + "Pending for Bill Entry" => 5, + "Query" => 4, + "Paid" => 11, + "Rejected" => 8, + "Approved" => 8, + "Outstanding" => 5, + ]; + + if ($status != null && isset($map[$status])) { + $this->db->table('ticket_master') + ->where('id', $claimId) + ->update([ + 'claim_status_id' => $map[$status], + 'tpa_claim_status' => $status + ]); + log_message('error', "CLAIM STATUS SUCCESS HEALTH_INDIA | Updated claimId: {$claimId} with status: {$status}"); + } else { + log_message('error', "CLAIM STATUS HEALTH_INDIA | claimId: {$claimId} | Unknown status: {$status}"); + } + + return [ + 'status' => true, + 'message' => 'Claim status updated.', + 'updated_status' => $status, + 'api_response' => $response + ]; + } + + public function ClaimStatusUpdate() + { + helper('api'); + + log_message('error', 'CLAIM STATUS UPDATE BULK HEALTH_INDIA | Started'); + + $tickets = $this->db->table('ticket_master tm') + ->select("tm.id, tm.tpa_claim_id, cp.policy_no") + ->join('client_policy cp', 'tm.client_policy_id=cp.id') + ->where('tm.tpa_claim_id IS NOT NULL') + ->where('cp.tpa_id', $this->healthIndiaTpaId) + ->get()->getResultArray(); + + $count = 0; + + foreach ($tickets as $t) { + $this->ClaimDetail($t['id']); + $count++; + } + + log_message('error', 'CLAIM STATUS UPDATE BULK HEALTH_INDIA | Completed | Updated: ' . $count); + + return $this->response->setJSON(['status' => true, 'updated' => $count]); + } + + public function EcardRequest($employeeId = null, $policyNo = null, $memberId = null) + { + helper('api'); + + log_message('error', "ECARD REQUEST HEALTH_INDIA | Started | employeeId: {$employeeId} | policyNo: {$policyNo} | memberId: {$memberId}"); + + // Generate Health India Token + $tokenResponse = json_decode($this->generateAuthToken()->getBody(), true); + if (empty($tokenResponse['data']['result'][0]['access_token'])) { + log_message('error', "ECARD REQUEST FAILED HEALTH_INDIA | employeeId: {$employeeId} | policyNo: {$policyNo} | Message: Token generation failed"); + return null; + } + $token = $tokenResponse['data']['result'][0]['access_token']; + + // API Section 3.3 - Individual member e-card + $url = getenv('HEALTH_INDIA_BASE_URL') . "/Member/GetMemberEcard"; + + $body = [ + "policY_NUMBER" => $policyNo, + "employeE_CODE" => $employeeId, + "membeR_ID" => $memberId + ]; + + $headers = [ + "Authorization: Bearer " . $token, + "Content-Type: application/json" + ]; + + log_message('error', 'ECARD REQUEST HEALTH_INDIA | Request: ' . json_encode($body)); + + $response = call_third_party_api($url, 'POST', $headers, $body); + + log_message('error', 'ECARD REQUEST HEALTH_INDIA | Response: ' . json_encode($response)); + + if (($response['status'] ?? false) !== true) { + log_message('error', 'ECARD REQUEST FAILED HEALTH_INDIA | response: ' . json_encode($response)); + return null; + } + + if (empty($response['data']['result'][0])) { + log_message('error', 'ECARD REQUEST FAILED HEALTH_INDIA | Empty data | response: ' . json_encode($response)); + return null; + } + + $apiData = $response['data']['result'][0]; + + if (($apiData['message'] ?? '') === 'SUCCESS') { + $ecardUrl = $apiData['membeR_ECARD'] ?? ''; + + if (!empty($ecardUrl)) { + log_message('error', "ECARD REQUEST SUCCESS HEALTH_INDIA | employeeId: {$employeeId} | policyNo: {$policyNo} | memberId: {$memberId} | ecardUrl: {$ecardUrl}"); + return $ecardUrl; + } + } + + log_message('error', 'ECARD REQUEST FAILED HEALTH_INDIA | response: ' . json_encode($response)); + return null; + } + + public function HealthIndiaGetBenefDetails($requestData = null) + { + $function_calling_type = $requestData['return_type'] ?? 'job'; + + try { + helper('api'); + + $policyNo = $requestData['policy_no'] ?? null; + $client_policy_id = $requestData['client_policy_id'] ?? null; + + if (empty($policyNo)) { + log_message('error', 'TPA ID PULL HEALTH_INDIA | policy_no missing in request'); + if ($function_calling_type == "job") { + return ['status' => false, 'message' => 'policy_no required']; + } else { + return $this->respond(['status' => false, 'message' => 'policy_no required']); + } + } + + if (empty($client_policy_id)) { + log_message('error', 'TPA ID PULL HEALTH_INDIA | client_policy_id missing in request'); + if ($function_calling_type == "job") { + return ['status' => false, 'message' => 'client_policy_id required']; + } else { + return $this->respond(['status' => false, 'message' => 'client_policy_id required']); + } + } + + log_message('error', "TPA ID PULL HEALTH_INDIA | called for policy_no: {$policyNo}, client_policy_id: {$client_policy_id}"); + + // Fetch file download dates + $batchFiles = $this->db->table('batch_files f') + ->select("f.created_at") + ->where('f.client_policy_id', $client_policy_id) + ->where('f.insurer_or_tpa', 'tpa') + ->where('f.actions', 'export') + ->get() + ->getResultArray(); + + if (empty($batchFiles)) { + log_message('error', 'TPA ID PULL FAILED HEALTH_INDIA | batchFiles is empty for this tpa id pull request'); + if ($function_calling_type == "job") { + return ['status' => false, 'message' => 'batchFiles not found']; + } else { + return $this->respond(['status' => false, 'message' => 'batchFiles not found']); + } + } + + // Generate Health India Token + $tokenResponse = json_decode($this->generateAuthToken()->getBody(), true); + if (empty($tokenResponse['data']['result'][0]['access_token'])) { + log_message('error', 'TPA ID PULL HEALTH_INDIA | Token generation failed'); + if ($function_calling_type == "job") { + return ['status' => false, 'message' => 'Token generation failed']; + } else { + return $this->respond(['status' => false, 'message' => 'Token generation failed']); + } + } + $token = $tokenResponse['data']['result'][0]['access_token']; + + // API Section 2.3 - Bulk Enrolment data Fetch + $url = getenv('HEALTH_INDIA_BASE_URL') . "/Enrollment/GetEnrollmentData"; + + $headers = [ + "Authorization: Bearer " . $token, + "Content-Type: application/json" + ]; + + $body = [ + "policY_NUMBER" => $policyNo + ]; + + log_message('error', "TPA ID PULL HEALTH_INDIA | API params: " . json_encode(['url' => $url, 'method' => 'POST', 'body' => $body])); + + $response = call_third_party_api($url, 'POST', $headers, $body); + + log_message('error', "TPA ID PULL HEALTH_INDIA | API Response: " . json_encode($response)); + + if (($response['status'] ?? false) !== true) { + log_message('error', 'HEALTH_INDIA API FAILED | response: ' . json_encode($response)); + + // update file table status after the tpa id failed to update + if (isset($requestData['file_id']) && !empty($requestData['file_id'])) { + $file_model = new BatchFileModel(); + $file_model->where('id', $requestData['file_id'])->set('status', 'failed-8')->update(); + log_message('error', "Files table status updated for the file id: {$requestData['file_id']}"); + } else { + log_message('error', "Failed to update file table status."); + } + + if ($function_calling_type == "job") { + return ['status' => false, 'message' => 'API call failed', 'data' => $response]; + } else { + return $this->respond(['status' => false, 'message' => 'API call failed', 'data' => $response]); + } + } + + if ( + !isset($response['data']['result']) || + !is_array($response['data']['result']) || + count($response['data']['result']) === 0 + ) { + log_message('error', 'TPA ID PULL API FAILED HEALTH_INDIA | Empty member data for this pull request'); + + // update file table status after the tpa id failed to update + if (isset($requestData['file_id']) && !empty($requestData['file_id'])) { + $file_model = new BatchFileModel(); + $file_model->where('id', $requestData['file_id'])->set('status', 'failed-8')->update(); + log_message('error', "Files table status updated for the file id: {$requestData['file_id']}"); + } else { + log_message('error', "Failed to update file table status."); + } + + if ($function_calling_type == "job") { + return ['status' => false, 'message' => 'API call failed', 'data' => 'Empty member data for this pull request']; + } else { + return $this->respond(['status' => false, 'message' => 'API call failed', 'data' => 'Empty member data for this pull request']); + } + } + + $allMembers = $response['data']['result']; + + // Save API data as JSON for analysis + $json = json_encode($allMembers, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + $filePath = WRITEPATH . 'tmp/' . time() . '_' . $requestData['file_id'] . '.json'; + file_put_contents($filePath, $json); + + log_message('error', "TPA ID PULL HEALTH_INDIA | Saved JSON to: {$filePath}"); + + // Call a job for dump JSON data to DB + $job_details = new Jobs(); + $r = Jobs::addJob([ + 'job_name' => 'saveHealthIndiaAPIData', + 'payload' => [ + 'file_id' => $requestData['file_id'], + 'json_file_path' => $filePath + ] + ]); + + log_message('error', "TPA ID PULL HEALTH_INDIA | Job added for saving API data"); + + // ================= MATCHING LOGIC ================= + + $employeePolicyModel = new EmployeePolicyModel(); + + $employeePolicyData = $employeePolicyModel + ->join('employees', 'employees.id = employee_polices.employee_id') + ->where('employee_polices.client_policy_id', $client_policy_id) + ->where('employee_polices.tpa_id IS NULL') + ->findAll(); + + $updated = 0; + $batch_file_success = 'success'; + $employee_policy_ids = []; + + foreach ($employeePolicyData as $policy) { + $hasMatchForThisPolicy = false; + + foreach ($allMembers as $m) { + // Match based on: employee name, employee code, and relation + if ( + strtolower(trim($policy['name'])) === strtolower(trim($m['insured_Name'] ?? '')) && + ($policy['emp_code'] ?? '') == ($m['employeeCode'] ?? '') && + strtolower($policy['relationship']) === strtolower($m['relation'] ?? '') + ) { + $hasMatchForThisPolicy = true; + + $sql = "UPDATE employee_polices SET tpa_id = ? WHERE id = ?"; + $this->db->query($sql, [$m['memberId'], $policy['emp_policy_id']]); + + // For e-card send + if (strtolower(trim($policy['relationship'])) == 'self') { + $employee_policy_ids[] = $policy['emp_policy_id']; + } + + if ($this->db->affectedRows() > 0) { + $updated++; + log_message('error', "✅ HEALTH_INDIA | Updated tpa_id={$m['memberId']} for emp_policy_id={$policy['emp_policy_id']} policy={$policyNo}"); + } else { + log_message('error', "⚠️ HEALTH_INDIA | No update (already set or not matched) for emp_policy_id={$policy['emp_policy_id']} policy={$policyNo}"); + } + } + } + + // Handle NO MATCH for this policy + if (!$hasMatchForThisPolicy) { + $nhanceSideData = [ + 'name' => $policy['name'] ?? null, + 'emp_code' => $policy['emp_code'] ?? null, + 'relationship' => $policy['relationship'] ?? null, + 'gender' => $policy['gender'] ?? null, + 'dob' => $policy['dob'] ?? null, + ]; + $batch_file_success = 'partially success'; + + log_message('error', "❌ HEALTH_INDIA | No match for Nhance = " . json_encode($nhanceSideData)); + } + } + + // Send e-card + if (!empty($employee_policy_ids)) { + log_message('error', "HEALTH_INDIA | sendMailForDownloadingECard JOB PUSHED."); + Jobs::addJob([ + 'job_name' => 'sendMailForDownloadingECard', + 'payload' => [ + 'ids' => $employee_policy_ids, + 'client_policy_id' => $client_policy_id + ] + ]); + } + + // Update file table status after the tpa id successfully updated + if (isset($requestData['file_id']) && !empty($requestData['file_id'])) { + $file_model = new BatchFileModel(); + $file_model->where('id', $requestData['file_id'])->set('status', $batch_file_success)->update(); + log_message('error', "Files table status updated for the file id: {$requestData['file_id']} with status: {$batch_file_success}"); + } else { + log_message('error', "Failed to update file table status."); + } + + $totalCount = count($allMembers); + + log_message('error', "TPA ID PULL SUCCESS HEALTH_INDIA | completed. Total fetched={$totalCount}, updated={$updated}"); + + if ($function_calling_type == "job") { + return [ + 'status' => true, + 'message' => 'Updated successfully', + 'total_fetched' => $totalCount, + 'total_updated' => $updated + ]; + } else { + return $this->respond([ + 'status' => true, + 'message' => 'Updated successfully', + 'total_fetched' => $totalCount, + 'total_updated' => $updated + ]); + } + } catch (\Throwable $th) { + // Update file table status after the tpa id failed to update + if (isset($requestData['file_id']) && !empty($requestData['file_id'])) { + $file_model = new BatchFileModel(); + $file_model->where('id', $requestData['file_id'])->set('status', 'failed-8')->update(); + log_message('error', "Files table status updated for the file id: {$requestData['file_id']}"); + } else { + log_message('error', "Failed to update file table status."); + } + + $errorData = [ + 'message' => $th->getMessage(), + 'file' => $th->getFile(), + 'line' => $th->getLine(), + 'code' => $th->getCode(), + 'trace' => $th->getTraceAsString(), + 'trace_array' => $th->getTrace(), + 'function' => $th->getTrace()[0]['function'] ?? null, + 'class' => $th->getTrace()[0]['class'] ?? null, + ]; + + log_message('error', 'Exception thrown while calling HealthIndiaGetBenefDetails API: ' . json_encode($errorData)); + + if ($function_calling_type == "job") { + return ['status' => false, 'message' => 'API call failed', 'data' => $errorData]; + } else { + return $this->respond(['status' => false, 'message' => 'API call failed', 'data' => $errorData]); + } + } + } + + public function syncHealthIndiaClaimsToNhance() + { + helper('api'); + + log_message('error', 'SYNC CLAIMS HEALTH_INDIA | Started'); + + // Generate Health India Token + $tokenResponse = json_decode($this->generateAuthToken()->getBody(), true); + + if (empty($tokenResponse['data']['result'][0]['access_token'])) { + log_message('error', 'SYNC CLAIMS FAILED HEALTH_INDIA | Token generation failed'); + return $this->response->setJSON(['status' => false, 'message' => 'Token generation failed']); + } + + $token = $tokenResponse['data']['result'][0]['access_token']; + + $url = getenv('HEALTH_INDIA_BASE_URL') . "/ClaimsMIS/GetClaimsMIS"; + + $headers = [ + "Authorization: Bearer " . $token, + "Content-Type: application/json" + ]; + + $policies = $this->db->table('client_policy') + ->where('tpa_id', $this->healthIndiaTpaId) + ->get()->getResultArray(); + + $finalResult = []; + + foreach ($policies as $policy) { + $body = [ + "policY_NUMBER" => $policy['policy_no'] + ]; + + log_message('error', 'SYNC CLAIMS HEALTH_INDIA | Fetching for policy: ' . $policy['policy_no']); + + $response = call_third_party_api($url, 'POST', $headers, $body); + + if (!empty($response['data']['result'])) { + $finalResult = array_merge($finalResult, $response['data']['result']); + log_message('error', 'SYNC CLAIMS HEALTH_INDIA | Fetched ' . count($response['data']['result']) . ' claims for policy: ' . $policy['policy_no']); + } + } + + log_message('error', 'SYNC CLAIMS HEALTH_INDIA | Total claims fetched: ' . count($finalResult)); + + // Insert / update ticket_master + $insertedCount = 0; + foreach ($finalResult as $row) { + $status = $row['Claim_Status'] ?? 'Under Process'; + + $map = [ + "Under Process" => 5, + "Pending for Bill Entry" => 5, + "Paid" => 11, + "Rejected" => 8, + "Approved" => 8, + "Outstanding" => 5, + ]; + + $claimStatus = $map[$status] ?? 1; + + // Check if claim already exists + $existing = $this->db->table('ticket_master') + ->where('tpa_claim_id', $row['CLAIM_NUMBER']) + ->get()->getRowArray(); + + if (!$existing) { + $this->db->table('ticket_master')->insert([ + 'policy_no' => $row['Policy_No'] ?? '', + 'claim_number' => $row['CLAIM_NUMBER'] ?? '', + 'tpa_claim_id' => $row['CLAIM_NUMBER'] ?? '', + 'emp_code' => $row['Employee_Code'] ?? '', + 'insured_name' => $row['PATIENT_NAME'] ?? '', + 'claim_amount' => $row['INTIMATED_AMOUNT'] ?? 0, + 'hospital_name' => $row['HOSPITAL_NAME'] ?? '', + 'doa' => !empty($row['DATEOF_ADMISSION']) ? date('Y-m-d', strtotime($row['DATEOF_ADMISSION'])) : null, + 'dod' => !empty($row['DATEOF_DISCHARGE']) ? date('Y-m-d', strtotime($row['DATEOF_DISCHARGE'])) : null, + 'claim_status_id' => $claimStatus, + 'tpa_id' => $this->healthIndiaTpaId, + 'created_at' => date('Y-m-d H:i:s') + ]); + $insertedCount++; + log_message('error', 'SYNC CLAIMS HEALTH_INDIA | Inserted claim: ' . ($row['CLAIM_NUMBER'] ?? 'N/A')); + } else { + log_message('error', 'SYNC CLAIMS HEALTH_INDIA | Skipped existing claim: ' . ($row['CLAIM_NUMBER'] ?? 'N/A')); + } + } + + log_message('error', 'SYNC CLAIMS HEALTH_INDIA | Completed | Total: ' . count($finalResult) . ' | Inserted: ' . $insertedCount); + + return $this->response->setJSON([ + 'status' => true, + 'total' => count($finalResult), + 'inserted' => $insertedCount + ]); + } +} \ No newline at end of file From f325fac331e7cdfd91001523ee42490fe0578b5b Mon Sep 17 00:00:00 2001 From: "sanjeev.p" Date: Sat, 31 Jan 2026 11:40:49 +0530 Subject: [PATCH 16/49] FIX_CI4validationUserControllerPart1 --- app/Controllers/UserController.php | 24 +++++-------- app/Views/UserList.php | 54 +++++++++++++++++++++++------- 2 files changed, 50 insertions(+), 28 deletions(-) diff --git a/app/Controllers/UserController.php b/app/Controllers/UserController.php index daaadb9f..d2a32ac1 100755 --- a/app/Controllers/UserController.php +++ b/app/Controllers/UserController.php @@ -114,13 +114,11 @@ class UserController extends AdminController // Employee Code // ====================== 'emp_code' => [ - 'rules' => 'required|alpha_numeric|min_length[3]|max_length[20]|is_unique[user_profiles.emp_code,id,{PrimaryKey}]', + 'rules' => 'required|min_length[3]|max_length[15]', 'errors' => [ 'required' => 'Employee Code is required', - 'alpha_numeric' => 'Employee Code must be alphanumeric', 'min_length' => 'Employee Code must be at least 3 characters', - 'max_length' => 'Employee Code cannot exceed 20 characters', - 'is_unique' => 'Employee Code already exists' + 'max_length' => 'Employee Code cannot exceed 15 characters', ] ], @@ -141,11 +139,10 @@ class UserController extends AdminController // Email // ====================== 'email' => [ - 'rules' => 'required|valid_email|is_unique[user_profiles.email,id,{PrimaryKey}]', + 'rules' => 'required|valid_email', 'errors' => [ 'required' => 'Email is required', 'valid_email' => 'Please enter a valid email address', - 'is_unique' => 'Email already exists' ] ], @@ -153,11 +150,10 @@ class UserController extends AdminController // Mobile // ====================== 'mobile' => [ - 'rules' => 'required|regex_match[/^[6-9][0-9]{9}$/]|is_unique[user_profiles.mobile,id,{PrimaryKey}]', + 'rules' => 'required|regex_match[/^[6-9][0-9]{9}$/]', 'errors' => [ 'required' => 'Mobile number is required', 'regex_match' => 'Enter a valid 10-digit mobile number starting with 6, 7, 8, or 9', - 'is_unique' => 'Mobile number already exists' ] ], @@ -302,13 +298,11 @@ class UserController extends AdminController // Employee Code // ====================== 'emp_code' => [ - 'rules' => 'required|alpha_numeric|min_length[3]|max_length[20]|is_unique[user_profiles.emp_code,id,{PrimaryKey}]', + 'rules' => 'required|min_length[3]|max_length[15]', 'errors' => [ 'required' => 'Employee Code is required', - 'alpha_numeric' => 'Employee Code must be alphanumeric', 'min_length' => 'Employee Code must be at least 3 characters', - 'max_length' => 'Employee Code cannot exceed 20 characters', - 'is_unique' => 'Employee Code already exists' + 'max_length' => 'Employee Code cannot exceed 15 characters', ] ], @@ -329,11 +323,10 @@ class UserController extends AdminController // Email // ====================== 'email' => [ - 'rules' => 'required|valid_email|is_unique[user_profiles.email,id,{PrimaryKey}]', + 'rules' => 'required|valid_email', 'errors' => [ 'required' => 'Email is required', 'valid_email' => 'Please enter a valid email address', - 'is_unique' => 'Email already exists' ] ], @@ -341,11 +334,10 @@ class UserController extends AdminController // Mobile // ====================== 'mobile' => [ - 'rules' => 'required|regex_match[/^[6-9][0-9]{9}$/]|is_unique[user_profiles.mobile,id,{PrimaryKey}]', + 'rules' => 'required|regex_match[/^[6-9][0-9]{9}$/]', 'errors' => [ 'required' => 'Mobile number is required', 'regex_match' => 'Enter a valid 10-digit mobile number starting with 6, 7, 8, or 9', - 'is_unique' => 'Mobile number already exists' ] ], diff --git a/app/Views/UserList.php b/app/Views/UserList.php index 28cde270..ca47296c 100755 --- a/app/Views/UserList.php +++ b/app/Views/UserList.php @@ -581,7 +581,7 @@ table.dataTable tbody td {
- +
@@ -884,7 +884,20 @@ table.dataTable tbody td {
+getFlashdata('error')) : ?> + getFlashdata('error') as $error) : ?> + + + + + + + + + + + + + + From 36d686f7a4644306c6f5f6ff86ac18299984a22b Mon Sep 17 00:00:00 2001 From: "venkatesh.r" Date: Mon, 2 Feb 2026 17:58:56 +0530 Subject: [PATCH 28/49] FIX_MD5 --- app/Controllers/EmployeeRestController.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/Controllers/EmployeeRestController.php b/app/Controllers/EmployeeRestController.php index e60cc86a..22b1b263 100755 --- a/app/Controllers/EmployeeRestController.php +++ b/app/Controllers/EmployeeRestController.php @@ -3625,6 +3625,12 @@ class EmployeeRestController extends AdminController $get_docs_name = $this->request->getPost('claim_doc_names') ?? []; $policy_transaction_id = $this->request->getPost('policy_transaction_id') ?? null; + + if (is_string($received_data['client_id']) && preg_match('/^[a-f0-9]{32}$/i', $received_data['client_id'])) { + $client_data = $this->clientModel->where('MD5(id)', $received_data['client_id'])->first(); + $received_data['client_id'] = $client_data['id'] ?? null; + } + $client_policy_data = $this->clientPolicyModel->where('id', $received_data['client_policy_id'] ?? null)->first(); $isduplicate = checkDuplicateClaim([ From e70245ff7791a919db91032539b9b312a0e81fb1 Mon Sep 17 00:00:00 2001 From: "venkatesh.r" Date: Mon, 2 Feb 2026 20:27:07 +0530 Subject: [PATCH 29/49] FEAT_CREATE_PT_AND_PCSD_ENTRY_WHILE_CLIENT_POLICY_CREATE --- app/Config/Routes.php | 6 +- app/Controllers/ClientController.php | 63 ++++++++----------- app/Controllers/EmployeeRestController.php | 2 +- .../policy_transaction_inception_list.php | 2 +- 4 files changed, 32 insertions(+), 41 deletions(-) diff --git a/app/Config/Routes.php b/app/Config/Routes.php index 1bc86af6..f830a3a3 100755 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -37,7 +37,6 @@ $routes->get("view", "EmployeeController::viewECard/$1"); $routes->get("checkWellnessOnboardStatus/(:any)", "EmployeeController::checkWellnessOnboardStatus/$1"); $routes->get("initiateWellnessOnboard/(:any)", "EmployeeController::initiateWellnessOnboard/$1"); $routes->get("exportQCRandRFQ/(:any)", "LeadsController::exportQCRandRFQ/$1"); -$routes->get("smapletest", "ClientController::smapletest"); $routes->get("testMailAttachments", "ClientController::testMailAttachments"); $routes->get("updatePolicyTermsKey", "ClientController::updatePolicyTermsKey"); $routes->get("updateRemainderDate", "ClientController::updateRemainderDate"); @@ -560,6 +559,8 @@ $routes->group("/api", ["filter" => "authJWT"], function ($routes) { $routes->get("getSSORedirectUrl", "ApiServiceController::getSSORedirectUrl"); $routes->get("getEmployeePolicy", "EmployeeRestController::getEmployeePolicy"); +$routes->get("downloadCdSplitUpFile", "EmployeeRestController::downloadCdSplitUpFile"); + $routes->group("employeeRest", ['filter' => ['appSignature'] ], function ($routes) { @@ -604,7 +605,7 @@ $routes->group("employeeRest", ['filter' => ['appSignature'] ], function ($route }); - $routes->group("employeeRest", ["filter" => ['GlobalPostFileUploadGuard', 'appSignature', 'authJWT']], function ($routes) { +$routes->group("employeeRest", ["filter" => ['GlobalPostFileUploadGuard', 'appSignature', 'authJWT']], function ($routes) { $routes->post('logout', 'RestAuthenticationController::logout'); @@ -686,7 +687,6 @@ $routes->group("employeeRest", ['filter' => ['appSignature'] ], function ($route // get insurer and policy type $routes->get("getPolicyTypeAndInsurer", "EmployeeRestController::getPolicyTypeAndInsurer"); - $routes->get("downloadCdSplitUpFile", "EmployeeRestController::downloadCdSplitUpFile"); $routes->get("getExcelFileErrors/(:any)", "EmployeeController::getExcelFileErrors/$1"); }); diff --git a/app/Controllers/ClientController.php b/app/Controllers/ClientController.php index 8ba51997..70f9ee8b 100755 --- a/app/Controllers/ClientController.php +++ b/app/Controllers/ClientController.php @@ -141,6 +141,7 @@ class ClientController extends AdminController $isDuplicate = $this->clientModel->isDuplicateByClientBranch($value, $field, $clientId, $branchId); return $this->response->setJSON(['isDuplicate' => $isDuplicate]); } + public function checkDuplicateTableFieldValue() { $table = $this->request->getPost('table'); @@ -162,35 +163,6 @@ class ClientController extends AdminController return $this->response->setJSON(['isDuplicate' => $isDuplicate]); } - public function smapletest() - { - $headers = [ - 'S.No', - 'NAME OF EMP/DEP', - 'EMP ID', - // 'EMP/DEP TYPE', - // 'RELATIONSHIP CODE', - 'DOB', - 'GENDER', - 'PRE EXISTING AILMENTS', - 'BASIC COVER SI', - 'DATE OF COVERAGE', - 'AGE', - 'RELATIONSHIP', - 'REMARKS', - 'POLICY END DATE', - 'NO OF DAYS', - 'TPA ID', - 'UHID', - // 'PREMIUM', - 'PRO RATA PREMIUM', - 'GST', - 'TOTAL AMOUNT' - ]; - $filePath = generateExcelWithHeader($headers); - echo "Excel file created at: $filePath"; - } - public function testMailAttachments($email = 'venkateshraman786@gmail.com') { $message = ''; @@ -510,7 +482,6 @@ class ClientController extends AdminController // $this->loadLayout('client_onboarding', $data); } - public function typeList($id = null) { try { @@ -547,7 +518,6 @@ class ClientController extends AdminController } } - public function updateEmpAndPolicyStatus() { $return = $this->clientPolicyModel->updateStatus(); @@ -2088,6 +2058,7 @@ class ClientController extends AdminController $sanitized_post_data['enrolment_visibility'] = $sanitized_post_data['enrolment_visibility'] ?? null ? 1 : 0; $sanitized_post_data['is_lgbtq'] = $sanitized_post_data['is_lgbtq'] ?? null ? 1 : 0; $sanitized_post_data['wellness_vendor_id'] = !empty($sanitized_post_data['wellness_vendor_id']) ? $sanitized_post_data['wellness_vendor_id'] : null; + $sanitized_post_data['cd_ac_pk'] = $sanitized_post_data['cd_ac_no'] ?? null; if ($policy_type_id == 1 || $policy_type_id == 2 || $policy_type_id == 6 || $policy_type_id == 7) { @@ -2126,6 +2097,8 @@ class ClientController extends AdminController $insert = $this->clientPolicyModel->insert($sanitized_post_data); if ($insert) { + // this function to create a policy transaction entry at the time of client policy create + $this->createPolicyTransactionInceptionEntry($insert, $sanitized_post_data); $clientPoliceData = $this->clientPolicyModel->getClientPolicyByClientId($sanitized_post_data['client_id']); $clientPoliceData['role'] = get_role_id(); return $this->respond(['status' => true, 'code' => 200, 'data' => $clientPoliceData, 'client_id' => $client_id, 'method' => 'CERATE', 'post_data' => $insert], 200); @@ -2310,6 +2283,28 @@ class ClientController extends AdminController } } + public function createPolicyTransactionInceptionEntry($client_policy_id, $data) + { + $data['action_type'] = 'inception'; + $data['client_policy_id'] = $client_policy_id; + $data['entry_from'] = 3; + $data['issuer_branch'] = 1; + $data['issuer'] = 2; + $data['status'] = 'completed'; + $data['renewal_date'] = $data['policy_end_date']; + $insert = $this->policyTransactionModel->insert($data); + + if($insert){ + + $pcsd_data['pt_id'] = $insert; + $pcsd_data['insurer_id'] = $data['insurer_id'] ?? null; + $pcsd_data['insurer_branch_id'] = $data['insurer_branch_id'] ?? null; + + $this->PTCOShareDetailsModel->insert($pcsd_data); + } + return $insert; + } + // Save Rack Rate function @@ -2843,7 +2838,6 @@ class ClientController extends AdminController } } - private function updatePTCoShareTableEntry($policy_transaction_data, $old_client_policy_data, $data) { $updated_ids = []; @@ -2889,9 +2883,6 @@ class ClientController extends AdminController ]; } - - - public function uploadVehicleFile($params = null) { $this->myLogger->logme('error', 'uploadVehicleFile function called'); @@ -6463,7 +6454,7 @@ class ClientController extends AdminController // $res = $EmpDataServiceController->importInceptionUpdateTPAandUHID(['file_id' => 310]); dd($res);//for live // $res = $EmpDataServiceController->getInceptionBasePremium(["13332","13333","13334","13335","13336"]); dd($res);//for live // $res = $EmpDataServiceController->getDeletionBasePremium(["13248","13250","13249","13247"], json_decode('{"employeeIds":["13248","13250","13249","13247"],"client_id":"3927","client_policy_id":"6183","client_branch_id":"1874","cd_ac_no":"CD9751909505","endorsement_no":"END1238","count":4,"event_name":"deletion","policy_name":"GMC","user_id":"48"}', true)); dd($res);//for live - // $res = $EmpDataServiceController->makeEntryForBDSPolicyTransaction(json_decode('{"client_policy_id":"6187","endorsement_no":null,"emp_count":5,"action_type":"inception","no_of_insured":3,"no_of_dependent":0}', true)); dd($res);//for live + // $res = $EmpDataServiceController->makeEntryForBDSPolicyTransaction(json_decode('{"client_policy_id":"6187","endorsement_no":"000000001","emp_count":5,"action_type":"addition","no_of_insured":3,"no_of_dependent":0, "base_premium" : "1000", "gst" : "180", "policy_issue_date" : "2025-12-31"}', true)); dd($res);//for live // $res = $EmpDataServiceController->sendMailForDownloadingECard(['ids' => $ids, 'client_policy_id' => $client_policy_id]); // $res = $this->employeePolicyModel->getDeletionEmployeeDataForExportExcel($batch_data, 1); dd($result); // $res = $this->employeePolicyModel->getSIEnhancementEmployeesDataForExportExcel($batch_data, 1); diff --git a/app/Controllers/EmployeeRestController.php b/app/Controllers/EmployeeRestController.php index 22b1b263..59c5224e 100755 --- a/app/Controllers/EmployeeRestController.php +++ b/app/Controllers/EmployeeRestController.php @@ -4854,7 +4854,7 @@ class EmployeeRestController extends AdminController THEN hr_file_upload.status ELSE CONCAT(UCASE(LEFT(f.status, 1)), LCASE(SUBSTRING(f.status, 2))) END AS status, - '1' as file_error_status + '0' as file_error_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') diff --git a/app/Views/policy_transaction_inception_list.php b/app/Views/policy_transaction_inception_list.php index 37166f8a..cc850c55 100644 --- a/app/Views/policy_transaction_inception_list.php +++ b/app/Views/policy_transaction_inception_list.php @@ -316,7 +316,7 @@ table.dataTable tbody td { $row){ ?> - + From 8f8b082f8cb78091ede0da8b38480a59a6c07197 Mon Sep 17 00:00:00 2001 From: "venkatesh.r" Date: Mon, 2 Feb 2026 21:47:41 +0530 Subject: [PATCH 30/49] FEAT_HR_NOTIFICATION --- app/Controllers/ClientController.php | 23 ++- app/Controllers/EmpDataServiceController.php | 52 +++--- app/Controllers/EmployeeController.php | 49 +++-- app/Controllers/NotificationController.php | 3 +- app/Views/notification.php | 178 ++++++++++++++++++- 5 files changed, 261 insertions(+), 44 deletions(-) diff --git a/app/Controllers/ClientController.php b/app/Controllers/ClientController.php index 70f9ee8b..9cf2030c 100755 --- a/app/Controllers/ClientController.php +++ b/app/Controllers/ClientController.php @@ -648,7 +648,7 @@ class ClientController extends AdminController // echo "
";
         // print_r($data); die;
-        $data['placeHolders'] = ['member_name', 'nhance_logo', 'tpa_id', 'ecard_download_link', 'client_logo', 'policy_no', 'member_summary', 'app_link', 'post_enrollment_app_link', 'client_name'];
+        $data['placeHolders'] = ['hr_name', 'member_name', 'nhance_logo', 'tpa_id', 'ecard_download_link', 'client_logo', 'policy_no', 'member_summary', 'app_link', 'post_enrollment_app_link', 'client_name'];
 
         // dd($data['placeHolders']);
 
@@ -952,7 +952,7 @@ class ClientController extends AdminController
                 }, $rawList)) : [];
         $editData['client_policy']['role'] = get_role_id();
         $editData['notification'] = $this->notificationModel->select('template_name,enabled')->where('client_id', $id)->findAll();
-        $editData['placeHolders'] = ['member_name', 'member_mobile', 'nhance_logo', 'tpa_id', 'ecard_download_link', 'client_logo', 'policy_no', 'member_summary', 'app_link', 'post_enrollment_app_link', 'client_name'];
+        $editData['placeHolders'] = ['hr_name', 'member_name', 'member_mobile', 'nhance_logo', 'tpa_id', 'ecard_download_link', 'client_logo', 'policy_no', 'member_summary', 'app_link', 'post_enrollment_app_link', 'client_name'];
         $editData['api_data'] = $this->clientApi->where("client_id", $id)->where("is_active", 1)->first();
         // dd($editData);
 
@@ -8728,6 +8728,8 @@ class ClientController extends AdminController
         $member_ecard_mail_template              = $this->notificationModel->where('client_id', NULL)->where('template_name', 'member_ecard_mail')->get()->getResultArray()[0] ?? [];
 
         $member_common_mail_template             = $this->notificationModel->where('client_id', NULL)->where('template_name', 'member_common_mail')->get()->getResultArray()[0] ?? [];
+        
+        $hr_cd_insufficient_balance_mail_template  = $this->notificationModel->where('client_id', NULL)->where('template_name', 'hr_cd_insufficient_balance_mail')->get()->getResultArray()[0] ?? [];
 
         $default_member_welcome_mail_template = [
             'client_id'        => $client_id,
@@ -8799,6 +8801,20 @@ class ClientController extends AdminController
             'mail_content_copy' => null
         ];
 
+        $hr_cd_insufficient_balance_mail_template = [
+            'client_id'        => $client_id,
+            'template_name'    => 'hr_cd_insufficient_balance_mail',
+            'subject'          => $hr_cd_insufficient_balance_mail_template['subject'] ?? '',
+            'mail_content'     => $hr_cd_insufficient_balance_mail_template['mail_content'] ?? '',
+            'mail_content_json' => $hr_cd_insufficient_balance_mail_template['mail_content_json'] ?? '',
+
+            'created_by'       => get_session_userid(),
+            'created_at'       => date('Y-m-d H:i:s'),
+            'updated_by'       => null,
+            'updated_at'       => date('Y-m-d H:i:s'),
+            'mail_content_copy' => null
+        ];
+
         $this->myLogger->logme('error', 'Default Mail Template Data ' . json_encode([
             $default_member_welcome_mail_template,
             $default_member_remainder_mail_template,
@@ -8812,7 +8828,8 @@ class ClientController extends AdminController
             $default_member_remainder_mail_template,
             $default_member_review_and_summary_mail_template,
             $default_member_ecard_mail_template,
-            $default_member_common_mail_template
+            $default_member_common_mail_template,
+            $hr_cd_insufficient_balance_mail_template,
         ]);
 
 
diff --git a/app/Controllers/EmpDataServiceController.php b/app/Controllers/EmpDataServiceController.php
index f6cfb67a..cff84df8 100755
--- a/app/Controllers/EmpDataServiceController.php
+++ b/app/Controllers/EmpDataServiceController.php
@@ -734,17 +734,23 @@ class EmpDataServiceController extends BaseController
         if($export_data['insurer_or_tpa'] == 'insurer')
         {
             if (!empty($cash_balance)) {
-                if ((int) $cash_balance['balance']  < (int) $rounded_totals) {
-                    $this->myLogger->logme('error', 'Inception export failed due to insufficient deposit amount.');
-                    $this->myLogger->logme('error', 'Inception export failed due to insufficient deposit amount.  CASH BALANCE : {balance}  and  TOTAL AMOUNT : {total}', ['balance' => $cash_balance['balance'], 'total' => $totals]);
-                    session()->set('cd_balance', false);
-                    session()->set('cd_amount', $cash_balance['balance']);
-                    session()->set('excel_file_amt', $rounded_totals);
+                if ((int) $cash_balance['balance'] < (int) $totals) {
+                    clear_cd_balance_session(); // Clear old junk first
+                    
+                    $cd_session_data = json_encode([
+                        'cd_balance' => false, 
+                        'cd_amount' => $cash_balance['balance'], 
+                        'excel_file_amt' => $totals
+                    ]);
+                    
+                    session()->set('cd_balance_info', $cd_session_data);
+                    session()->set('cd_balance', 'insufficient'); // Use a string status for clarity
+                    
+                    $hr_data = $this->getHrdataForInsufficientMailSend($export_data['client_branch_id']);
+                    session()->set('hr_data', json_encode(['client_id' => $export_data['client_id'], 'hr_data' => $hr_data]));
                 }else{
-                    session()->set('cd_balance', true);
-                    session()->set('cd_amount', $cash_balance['balance']);
-                    session()->set('excel_file_amt', $rounded_totals);
-
+                    session()->set('cd_balance', 'sufficient'); // Use a string status for clarity
+                    session()->set('cd_balance_info', null);
                 }
             }
         }
@@ -1065,17 +1071,23 @@ class EmpDataServiceController extends BaseController
             if($export_data['insurer_or_tpa'] != 'tpa')// check overal emp premium amt with cd balance only for insurer export, not tpa export
             { 
                 if (!empty($cash_balance)) {
-                    if ((int) $cash_balance['balance']  < (int) $totals) {
-                        $this->myLogger->logme('error', 'Inception export failed due to insufficient deposit amount.');
-                        $this->myLogger->logme('error', 'Inception export failed due to insufficient deposit amount.  CASH BALANCE : {balance}  and  TOTAL AMOUNT : {total}', ['balance' => $cash_balance['balance'], 'total' => $totals]);
-                        session()->set('cd_balance', false);
-                        session()->set('cd_amount', $cash_balance['balance']);
-                        session()->set('excel_file_amt', $totals);
+                    if ((int) $cash_balance['balance'] < (int) $totals) {
+                        clear_cd_balance_session(); // Clear old junk first
+                        
+                        $cd_session_data = json_encode([
+                            'cd_balance' => false, 
+                            'cd_amount' => $cash_balance['balance'], 
+                            'excel_file_amt' => $totals
+                        ]);
+                        
+                        session()->set('cd_balance_info', $cd_session_data);
+                        session()->set('cd_balance', 'insufficient'); // Use a string status for clarity
+                        
+                        $hr_data = $this->getHrdataForInsufficientMailSend($export_data['client_branch_id']);
+                        session()->set('hr_data', json_encode(['client_id' => $export_data['client_id'], 'hr_data' => $hr_data]));
                     }else{
-                        session()->set('cd_balance', true);
-                        session()->set('cd_amount', $cash_balance['balance']);
-                        session()->set('excel_file_amt', $totals);
-
+                        session()->set('cd_balance', 'sufficient'); // Use a string status for clarity
+                        session()->set('cd_balance_info', null);
                     }
                 }
             }
diff --git a/app/Controllers/EmployeeController.php b/app/Controllers/EmployeeController.php
index db0468ae..d3cd3d25 100755
--- a/app/Controllers/EmployeeController.php
+++ b/app/Controllers/EmployeeController.php
@@ -31,6 +31,7 @@ use App\Models\UserModel;
 use App\Models\PartnerEndorsementRequestModel;
 use App\Models\TpaApiDataModel;
 use App\Models\LevelContactModel;
+use App\Models\NotificationModel;
 
 
 use App\Controllers\Jobs;
@@ -4555,29 +4556,39 @@ class EmployeeController extends AdminController
 
         $client_data = $this->clientModel->where('is_active', 1)->where('id', $post_data['client_id'])->first();
 
-        $common['mail_type'] = "insufficient_cd_balance_by_hr";
+        if(empty($client_data)){
+            return $this->respond(['status' => false, 'code' => 404, 'message' => 'No client found'], 200);
+        }
+
+        $notificationModal = new NotificationModel();
+        $notification_data = $notificationModal
+                ->where('client_id', $post_data['client_id'])
+                ->where('template_name', 'hr_cd_insufficient_balance_mail')
+                ->where('is_active', 1)
+                ->first();
+
+        if(empty($notification_data)){
+            return $this->respond(['status' => false, 'code' => 404, 'message' => 'No template found'], 200);
+        }
+
+        if(empty($notification_data['subject']) || empty($notification_data['mail_content'])){
+            return $this->respond(['status' => false, 'code' => 404, 'message' => 'Template subject or mail content is empty'], 200);
+        }
+    
+        if(empty($notification_data['enabled']) || $notification_data['enabled'] != 1){
+            return $this->respond(['status' => false, 'code' => 404, 'message' => 'Template is disabled'], 200);
+
+        }
+
+        $common['mail_type'] = "hr_cd_insufficient_balance_mail";
         $common['client_id'] = $post_data['client_id'];
-        $subject = 'Insufficient CD Balance Notification';
-        $mail_content = '
-            Dear {{HR_NAME}},
-
-            Greetings from Nhance.
-
-            We would like to inform you that the CD balance for {{CLIENT_NAME}} is currently low / insufficient, which may impact further processing of insurance-related activities.
-
-            Kindly request you to credit the required amount at the earliest to avoid any service disruption.
-
-            Please let us know once the amount is credited, or if you need any clarification from our end.
-
-            Thank you for your support and cooperation.
-        ';
-
+        $subject = $notification_data['subject'];
+        $mail_content = $notification_data['mail_content'];
 
         foreach ($post_data['mails'] as $hr_id => $hr_data) {
 
-            $mail_content = str_ireplace('{{HR_NAME}}', $hr_data['name'], $mail_content);
-            $mail_content = str_ireplace('{{CLIENT_NAME}}', $client_data['client_name'], $mail_content);
-
+            $mail_content = str_ireplace('{{hr_name}}', $hr_data['name'], $mail_content);
+            $mail_content = str_ireplace('{{client_name}}', $client_data['client_name'], $mail_content);
             $res = MailHelper::send_email(['mail' => $hr_data['mail'], 'subject' => $subject, 'message' => $mail_content, 'common' => $common]);
         }
 
diff --git a/app/Controllers/NotificationController.php b/app/Controllers/NotificationController.php
index b0e5b4cf..8014f0c5 100755
--- a/app/Controllers/NotificationController.php
+++ b/app/Controllers/NotificationController.php
@@ -94,7 +94,8 @@ class NotificationController extends AdminController
             'member_ecard_mail_btn',
             'member_review_and_summary_mail_btn',
             'account_maneger_summary_mail_btn',
-            'client_hr_summary_mail_btn'
+            'client_hr_summary_mail_btn',
+            'hr_cd_insufficient_balance_mail_btn',
         ];
         $data = [];
         $emptyTemplate = [];
diff --git a/app/Views/notification.php b/app/Views/notification.php
index 93e8213e..7948a3a4 100755
--- a/app/Views/notification.php
+++ b/app/Views/notification.php
@@ -131,6 +131,8 @@
                 $member_review_and_summary_mail = 0;
                 $account_maneger_summary_mail = 0;
                 $client_hr_summary_mail = 0;
+                $hr_cd_insufficient_balance_mail = 0;
+
                 if (isset($notification)) {
                     foreach ($notification as $value) {
 
@@ -161,6 +163,10 @@
                         if ($value['template_name'] == 'client_hr_summary_mail') {
                             $client_hr_summary_mail = $value['enabled'];
                         }
+
+                        if ($value['template_name'] == 'hr_cd_insufficient_balance_mail') {
+                            $hr_cd_insufficient_balance_mail = $value['enabled'];
+                        }
                     }
                 }
                 ?>

@@ -265,6 +271,7 @@
+
@@ -283,6 +290,26 @@
+
+ + +
+
+
+ + HR CD Insufficient Balance Mail +
+
+ + + +
+
+ +
@@ -988,6 +1015,89 @@
+ + +