myLogger = \Config\Services::mylogger();
$this->ClientPolicyModel = new ClientPolicyModel();
}
public function saveForm()
{
// Get JSON input
$data = $this->request->getPost();
// For testing: just return the received data
return $this->respond([
'status' => 'success',
'message' => 'Form data received successfully!',
'data' => $data
]);
}
/**
* Get latest job status by job name.
* Supports:
* - GET -> ?job_name=...
* - POST -> job_name in form/json payload
*/
public function jobStatus()
{
$jobName = trim((string) ($this->request->getGet('job_name') ?? ''));
if ($jobName === '') {
$jobName = trim((string) ($this->request->getPost('job_name') ?? ''));
}
if ($jobName === '') {
$jsonPayload = $this->request->getJSON(true);
if (is_array($jsonPayload)) {
$jobName = trim((string) ($jsonPayload['job_name'] ?? ''));
}
}
$service = new JobStatusService();
$result = $service->getJobStatusByName($jobName);
$httpCode = 200;
if (($result['success'] ?? false) !== true) {
if ($jobName === '') {
$httpCode = 422;
} elseif (($result['message'] ?? '') === 'No job record found for given name.') {
$httpCode = 404;
} else {
$httpCode = 500;
}
}
return $this->response->setStatusCode($httpCode)->setJSON($result);
}
/**
* QA-only: invokes EmployeeController::updateTpaIdForNotInNhance.
* Routed under /util with authMVC — must be logged into the admin app.
*
* GET or POST: batch_file_id (required), file_id (optional, omit or 0 to skip file_id filter).
*/
public function qaUpdateTpaIdForNotInNhance()
{
$batchFileId = $this->request->getGet('batch_file_id');
if ($batchFileId === null || $batchFileId === '') {
$batchFileId = $this->request->getPost('batch_file_id');
}
$fileId = $this->request->getGet('file_id');
if ($fileId === null || $fileId === '') {
$fileId = $this->request->getPost('file_id');
}
if ($batchFileId === null || $batchFileId === '') {
return $this->response->setStatusCode(422)->setJSON([
'success' => false,
'message' => 'batch_file_id is required (query string or POST).',
]);
}
$params = [
'batch_file_id' => (int) $batchFileId,
'file_id' => ($fileId !== null && $fileId !== '') ? (int) $fileId : 0,
];
$employeeController = new EmployeeController();
$employeeController->initController($this->request, $this->response, service('logger'));
$result = $employeeController->updateTpaIdForNotInNhance($params);
return $this->response->setJSON(array_merge($result, ['params' => $params]));
}
/**
* QA-only: invokes EmployeeController::updateEmployeeDataFromTpa (Need to Review → DB updates, no Excel).
* Routed under /util with authMVC.
*
* GET or POST: batch_file_id (required).
*/
public function qaUpdateEmployeeDataFromTpa()
{
$batchFileId = $this->request->getGet('batch_file_id');
if ($batchFileId === null || $batchFileId === '') {
$batchFileId = $this->request->getPost('batch_file_id');
}
if ($batchFileId === null || $batchFileId === '') {
return $this->response->setStatusCode(422)->setJSON([
'success' => false,
'message' => 'batch_file_id is required (query string or POST).',
]);
}
$employeeController = new EmployeeController();
$employeeController->initController($this->request, $this->response, service('logger'));
$result = $employeeController->updateEmployeeDataFromTpa([
'batch_file_id' => (int) $batchFileId,
]);
return $this->response->setJSON($result);
}
public function testcli()
{
echo "hi";
$this->myLogger->logme('error', "test log");
echo "hi 2";
log_message('error', 'test message for log_message_function');
echo "hi 3";
}
public function generatePDF()
{
// Sample data - replace with your actual data source
$data = [
'NAME' => 'John Doe',
'GENDER' => 'Male',
'DOB' => '01/01/1990',
'RELATION' => 'Self',
'POLICY_NO' => 'POL123456789',
'TPA_ID' => 'TPA987654321',
'POLICY_START_DATE' => '01/01/2024',
'POLICY_DATE' => '31/12/2024',
'INSURER_NAME' => 'ABC Insurance Co.',
'TPA_NAME' => 'XYZ TPA Ltd.',
'FRONT_CARD' => base_url('assets/images/front-card.jpg'), // Your card images
'BACK_CARD' => base_url('assets/images/back-card.jpg'),
'LEVELS' => 'Level 1: 1800-XXX-XXXX
Level 2: support@company.com'
];
// Load the HTML template
$html = $this->loadTemplate($data);
// Configure DomPDF options
$options = new Options();
$options->set('isRemoteEnabled', true); // Enable loading of remote images
$options->set('isHtml5ParserEnabled', true);
$options->set('isPhpEnabled', true);
$options->set('debugPng', false);
$options->set('debugKeepTemp', false);
$options->set('debugCss', false);
$options->set('debugLayout', false);
$options->set('debugLayoutLines', false);
$options->set('debugLayoutBlocks', false);
$options->set('debugLayoutInline', false);
$options->set('debugLayoutPaddingBox', false);
// Initialize DomPDF
$dompdf = new Dompdf($options);
// Load HTML content
$dompdf->loadHtml($html);
// Set paper size and orientation
$dompdf->setPaper('A4', 'landscape'); // or 'portrait'
// Render PDF
$dompdf->render();
// Output PDF to browser
$filename = 'ecard_' . date('Y-m-d_H-i-s') . '.pdf';
$dompdf->stream($filename, ['Attachment' => true]); // Set to false for inline view
}
public function viewPDF()
{
// Same as generatePDF but with inline view
$data = [
'NAME' => 'Korukonda Naga Venkata Ramalinga Satya Swarna Kumari',
'GENDER' => 'Male',
'DOB' => '01/01/1990',
'RELATION' => 'Self',
'POLICY_NO' => '97000034230400000109_EX_Parental',
'TPA_ID' => 'TPA987654321',
'POLICY_START_DATE' => '01/01/2024',
'POLICY_DATE' => '31/12/2024',
'INSURER_NAME' => 'ZURICH KOTAK GTNERAL INSURANCE COIIPANY lNDlA LIMITED',
'TPA_NAME' => 'HealthIndia Insurance TPA Services Pvt. Ltd.',
'FRONT_CARD' => base_url() . ('public/uploads/template_bg/Nhance_Ecard_working_1_front_3.png'),
'BACK_CARD' => base_url() . ('public/uploads/template_bg/Nhance_Ecard_working_1_Back_3.png'),
'LEVELS' => 'Level 1: 1800-XXX-XXXX
Level 2: support@company.com'
];
$data2 = [
'NAME' => 'John Doe',
'GENDER' => 'Male',
'DOB' => '01/01/1990',
'RELATION' => 'Self',
'POLICY_NO' => 'POL123456789',
'TPA_ID' => 'TPA987654321',
'POLICY_START_DATE' => '01/01/2024',
'POLICY_DATE' => '31/12/2024',
'INSURER_NAME' => 'ABC Insurance Co.',
'TPA_NAME' => 'XYZ TPA Ltd.',
'FRONT_CARD' => base_url() . ('public/uploads/template_bg/Nhance_Ecard_working_1_front_3.png'),
'BACK_CARD' => base_url() . ('public/uploads/template_bg/Nhance_Ecard_working_1_Back_3.png'),
'LEVELS' => 'Level 1: 1800-XXX-XXXX
Level 2: support@company.com'
];
$employeeController = new EmployeeController();
// $html = $employeeController->generateIDCardForEmployeeUsingDom('LfpH3R');
$html = $this->loadTemplate($data2);
// print_r($html); die;
$options = new Options();
$options->set('isRemoteEnabled', true);
$options->set('isHtml5ParserEnabled', true);
$dompdf = new Dompdf($options);
// $dompdf->loadHtml($html);
$dompdf->loadHtml('' . $html);
$dompdf->setPaper('A4', 'portrait');
// $dompdf->setPaper('A4', 'landscape');
$dompdf->render();
$filename = 'ecard_' . date('Y-m-d_H-i-s') . '.pdf';
// $dompdf->stream($filename, ['Attachment' => true]); // Inline view
$dompdf->stream($filename, ['Attachment' => false]); // Force download
}
private function loadTemplate($data)
{
// Load your HTML template
$template = file_get_contents(WRITEPATH . 'e_card_template/common.html');
// Replace placeholders with actual data
foreach ($data as $key => $value) {
$template = str_replace('{' . $key . '}', $value, $template);
}
return $template;
}
// not using and not working
public function viewPdfUsingMpdf()
{
$data = [
'NAME' => 'Korukonda Naga Venkata Ramalinga Satya Swarna Kumari',
'GENDER' => 'Male',
'DOB' => '01/01/1990',
'RELATION' => 'Self',
'POLICY_NO' => '97000034230400000109_EX_Parental',
'TPA_ID' => 'TPA987654321',
'POLICY_START_DATE' => '01/01/2024',
'POLICY_DATE' => '31/12/2024',
'INSURER_NAME' => 'ZURICH KOTAK GTNERAL INSURANCE COIIPANY lNDlA LIMITED',
'TPA_NAME' => 'HealthIndia Insurance TPA Services Pvt. Ltd.',
'FRONT_CARD' => base_url('public/uploads/template_bg/Nhance_Ecard_working_1_front_3.png'),
'BACK_CARD' => base_url('public/uploads/template_bg/Nhance_Ecard_working_1_Back_3.png'),
'LEVELS' => 'Level 1: 1800-XXX-XXXX
Level 2: support@company.com'
];
$html = $this->loadTemplate($data);
// Load mPDF
$mpdf = "";
// $mpdf = new \Mpdf\Mpdf([
// 'mode' => 'utf-8',
// 'format' => 'A4',
// 'margin_left' => 0,
// 'margin_right' => 0,
// 'margin_top' => 0,
// 'margin_bottom' => 0,
// 'tempDir' => __DIR__ . '/writable/mpdf'
// ]);
// Optional: Stretch background or images fully
// $html = '
// ' . $html;
// $mpdf->WriteHTML($html);
// // Output inline (no download prompt)
// $filename = 'ecard_' . date('Y-m-d_H-i-s') . '.pdf';
// $mpdf->Output($filename, 'D');
/*
'I' = inline view in browser (no download prompt).
'D' = force download.
'F' = save to file.
'S' = return as string.
*/
}
public function getEmployeePolicyTypes($client_id, $emp_code, $emp_id)
{
$employeePolicy = new EmployeePolicyModel();
$data = $employeePolicy
->select('client_policy.policy_type_id')
->join('employees', 'employee_polices.employee_id = employees.id')
->join('client_policy', 'employee_polices.client_policy_id = client_policy.id')
->where('employees.is_active', 1)
->where('employees.emp_status', ['active', 'expired'])
->where('employee_polices.is_active', 1)
->where('employee_polices.status', ['active', 'expired'])
->where('employees.client_id', $client_id)
->where('employees.emp_code', $emp_code)
->groupBy('employee_polices.client_policy_id')
->findAll();
}
public function ptedfitdata($id)
{
$policy_transaction = new PolicyTransactionController();
$data = $policy_transaction->getInceptionDataForEdit($id);
// dd($data);
$insurerBranchModel = new InsurerBranchModel();
$insurer_branch = $insurerBranchModel->getInsurerBranchesWithInsurerNames();
$dataArray = $data['pt_co_share_details'] ?? []; // Example
$cd_ac_pk = 'CD12345';
$role_id = 1;
$team_id = ['6'];
$insurer_branch = $insurer_branch;
return view('pt_calc_table', [
'dataArray' => $dataArray,
'cd_ac_pk' => $cd_ac_pk,
'role_id' => $role_id,
'team_id' => $team_id,
'insurer_branch' => $insurer_branch
]);
}
function generateInsurerTable($dataArray, $cd_ac_pk, $role_id, $team_id, $insurer_branch)
{
$html = '
';
return $html;
}
public function viewRFQNonEb()
{
$insurerBranchModel = new InsurerBranchModel();
$data['page_name'] = "RFQ NON EB";
$data['insurer'] = $insurerBranchModel->getInsurerBranchesWithInsurerNames();
// dd($data);
return $this->loadLayout('view_rfq_non_eb_new', $data);
}
public function saverfq()
{
$json = $this->request->getPost('json');
$json = json_encode($json);
print_r($json);
// $data['lead_id'] = 10000;
// $data['json'] = $json;
// $rfq = new RFQModel();
// $rfq->insert($data);
}
public function exportExcel()
{
$rfq = new RFQModel();
$policy_data = $rfq->where('lead_id', 10000)->first();
// print_rr($policy_data['json']); die;
$policy_data = json_decode($policy_data['json'], true);
$policy_data = array_slice($policy_data, 0, -2);
print_rr($policy_data);
die;
dd($policy_data);
}
public function mapping_client_id_and_branch_id()
{
$post_clients_list = $this->getNonDuplicatePostClients();
$pre_clients_list = $this->getNonDuplicatePreClients();
$log_post_clients_list = $post_clients_list;
$log_pre_clients_list = $pre_clients_list;
log_message('error', 'Post Clients to be processed: ' . count($log_post_clients_list));
log_message('error', 'Pre Clients to be processed: ' . count($log_pre_clients_list));
$matched_Count = 0;
$expected_match_count = min(count($post_clients_list), count($pre_clients_list));
if (
!empty($pre_clients_list) &&
!empty($post_clients_list)
) {
$postDB = \Config\Database::connect();
$preDB = \Config\Database::connect('preDB');
foreach ($post_clients_list as $index => $post_client) {
foreach ($pre_clients_list as $index => $pre_client) {
if (trim($post_client['short_name']) == trim($pre_client['short_name'])) {
unset($log_post_clients_list[$index]);
unset($log_pre_clients_list[$index]);
$matched_Count++;
$postDB->table('clients')->where('id', $post_client['id'])->update(['pre_client_id' => $pre_client['id']]);
$preDB->table('clients')->where('id', $pre_client['id'])->update(['post_client_id' => $post_client['id']]);
// upto here we updated client_id in both dbs.
$post_branches = $postDB->table('client_branch')
->where('client_id', $post_client['id'])
->get()
->getResultArray() ?? [];
$pre_branches = $preDB->table('client_branch')
->where('client_id', $pre_client['id'])
->get()
->getResultArray() ?? [];
if (!empty($post_branches) && !empty($pre_branches)) {
foreach ($post_branches as $post_branch) {
$pre_branch = $preDB->table('client_branch')
->where('client_id', $pre_client['id'])
->where('branch_code', $post_branch['branch_code'])
->get()
->getRowArray() ?? [];
if (!empty($pre_branch)) {
$postDB->table('client_branch')->where('id', $post_branch['id'])->update(['pre_branch_id' => $pre_branch['id']]);
}
}
foreach ($pre_branches as $pre_branch) {
$post_branch = $postDB->table('client_branch')
->where('client_id', $post_client['id'])
->where('branch_code', $pre_branch['branch_code'])
->get()
->getRowArray() ?? [];
if (!empty($post_branch)) {
$preDB->table('client_branch')->where('id', $pre_branch['id'])->update(['post_branch_id' => $post_branch['id']]);
}
}
}
}
}
}
log_message('error', 'Expected Match Count : ' . $expected_match_count);
log_message('error', 'Total Matched Count: ' . $matched_Count);
log_message('error', 'Total UnMatched Count: ' . $expected_match_count - $matched_Count);
log_message('error', 'unmatched_reocrds');
$log_post_clients_list = array_values($log_post_clients_list);
$log_pre_clients_list = array_values($log_pre_clients_list);
if ((count($log_pre_clients_list) < count($log_post_clients_list))) {
log_message('error', "unmatched records count from pre- " . count($log_pre_clients_list));
log_message('error', print_r($log_pre_clients_list, true));
} else {
log_message('error', "unmatched records count from post - " . count($log_post_clients_list));
log_message('error', print_r($log_post_clients_list, true));
}
}
return $this->response->setJSON(['status' => 'success', 'message' => 'Client and Branch mapping completed.'])->setStatusCode(200);
}
private function getNonDuplicatePostClients()
{
$postDB = \Config\Database::connect();
$sql = "SELECT *
FROM clients AS post_clients
WHERE post_clients.client_type = 1
AND post_clients.is_active = 1
AND (post_clients.short_name NOT IN
(
SELECT ir_post_clients.short_name
FROM clients as ir_post_clients
WHERE ir_post_clients.client_type = 1
AND ir_post_clients.short_name IS NOT NULL
AND TRIM(ir_post_clients.short_name) <> ''
AND ir_post_clients.is_active = 1
GROUP BY ir_post_clients.short_name
HAVING COUNT(*) > 1)
)
ORDER BY post_clients.short_name";
$binds = [];
$query = $postDB->query($sql, $binds);
$results = $query->getResultArray() ?? [];
return $results;
}
private function getNonDuplicatePreClients()
{
$preDB = \Config\Database::connect('preDB');
$sql = "SELECT *
FROM clients AS pre_clients
WHERE pre_clients.client_type = 1
AND pre_clients.is_active = 1
AND (pre_clients.short_name NOT IN
(
SELECT ir_pre_clients.short_name
FROM clients as ir_pre_clients
WHERE ir_pre_clients.client_type = 1
AND ir_pre_clients.short_name IS NOT NULL
AND TRIM(ir_pre_clients.short_name) <> ''
AND ir_pre_clients.is_active = 1
GROUP BY ir_pre_clients.short_name
HAVING COUNT(*) > 1)
)
ORDER BY pre_clients.short_name";
$binds = [];
$query = $preDB->query($sql, $binds);
$results = $query->getResultArray() ?? [];
return $results;
}
public function membervalidation($lead_id = 329)
{
$lead_controll = new LeadsController();
// $lead_controll->getMemberDataExcelFileErrors();
$res = $lead_controll->memberDataListExcelFileFormatValidation(['lead_id' => $lead_id]);
dd($res);
}
private $firstNames = [
'Rajesh',
'Priya',
'Amit',
'Sneha',
'Vikram',
'Anjali',
'Rahul',
'Deepika',
'Sanjay',
'Kavita',
'Arun',
'Pooja',
'Manoj',
'Nisha',
'Suresh',
'Meera',
'Karthik',
'Divya',
'Ravi',
'Lakshmi',
'Anand',
'Swathi',
'Vijay',
'Rekha',
'Ashok',
'Sangeetha',
'Prakash',
'Uma',
'Ramesh',
'Vani',
'Kumar',
'Radha',
'Dinesh',
'Shanti',
'Ganesh',
'Parvati',
'Mohan',
'Sita',
'Arjun',
'Geetha'
];
private $lastNames = [
'Kumar',
'Sharma',
'Singh',
'Patel',
'Reddy',
'Nair',
'Iyer',
'Krishnan',
'Rao',
'Gupta',
'Verma',
'Agarwal',
'Joshi',
'Mehta',
'Desai',
'Pillai',
'Menon',
'Bhat',
'Naidu',
'Varma',
'Malhotra',
'Kapoor',
'Chopra',
'Saxena',
'Pandey',
'Mishra',
'Tiwari',
'Dubey',
'Sinha',
'Jain',
'Shah',
'Thakur'
];
private $relationships = ['Self', 'Spouse', 'Son', 'Daughter', 'Father', 'Mother'];
private $genders = ['M', 'F'];
private $domains = ['gmail.com', 'yahoo.com', 'outlook.com', 'company.com', 'example.com'];
public function generateExcel()
{
// Increase execution time and memory for large files
ini_set('max_execution_time', 600);
ini_set('memory_limit', '1024M');
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// Define headers
$headers = [
'Sl no',
'Emp Code',
'Name',
'Relationship',
'Gender',
'DOB',
'Age',
'Email',
'Mobile',
'SI',
'SI Enhancement',
'Proposed Sum Insured 1',
'Proposed Sum Insured 2',
'Proposed Sum Insured 3',
'Proposed Sum Insured 4'
];
// Set headers in row 1
$col = 'A';
foreach ($headers as $header) {
$sheet->setCellValue($col . '1', $header);
$col++;
}
// Style the header row
$headerStyle = [
'font' => ['bold' => true, 'color' => ['rgb' => 'FFFFFF']],
'fill' => ['fillType' => Fill::FILL_SOLID, 'startColor' => ['rgb' => '4472C4']],
'alignment' => ['horizontal' => Alignment::HORIZONTAL_CENTER, 'vertical' => Alignment::VERTICAL_CENTER],
'borders' => ['allBorders' => ['borderStyle' => Border::BORDER_THIN]]
];
$sheet->getStyle('A1:O1')->applyFromArray($headerStyle);
// Generate 70,000 sample records
$totalRecords = 1000;
$batchSize = 1000;
for ($i = 1; $i <= $totalRecords; $i++) {
$row = $i + 1; // Start from row 2 (row 1 is header)
$record = $this->generateSampleRecord($i);
$sheet->setCellValue('A' . $row, $record['sl_no']);
$sheet->setCellValue('B' . $row, $record['emp_code']);
$sheet->setCellValue('C' . $row, $record['name']);
$sheet->setCellValue('D' . $row, $record['relationship']);
$sheet->setCellValue('E' . $row, $record['gender']);
$sheet->setCellValue('F' . $row, $record['dob']);
$sheet->setCellValue('G' . $row, $record['age']);
$sheet->setCellValue('H' . $row, $record['email']);
$sheet->setCellValue('I' . $row, $record['mobile']);
$sheet->setCellValue('J' . $row, $record['si']);
$sheet->setCellValue('K' . $row, $record['si_enhancement']);
$sheet->setCellValue('L' . $row, $record['proposed_si_1']);
$sheet->setCellValue('M' . $row, $record['proposed_si_2']);
$sheet->setCellValue('N' . $row, $record['proposed_si_3']);
$sheet->setCellValue('O' . $row, $record['proposed_si_4']);
// Clear memory every batch
if ($i % $batchSize == 0) {
$sheet->garbageCollect();
}
}
// Auto-size columns
foreach (range('A', 'O') as $col) {
$sheet->getColumnDimension($col)->setAutoSize(true);
}
// Generate filename
$filename = 'employee_data_70k_' . date('Y-m-d_His') . '.xlsx';
// Set headers for download
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="' . $filename . '"');
header('Cache-Control: max-age=0');
// Write file to output
$writer = new Xlsx($spreadsheet);
$writer->save('php://output');
// Clean up
$spreadsheet->disconnectWorksheets();
unset($spreadsheet);
exit;
}
private function generateSampleRecord($index)
{
$firstName = $this->firstNames[array_rand($this->firstNames)];
$lastName = $this->lastNames[array_rand($this->lastNames)];
$name = $firstName . ' ' . $lastName;
$relationship = $this->relationships[array_rand($this->relationships)];
$gender = $this->genders[array_rand($this->genders)];
// Generate random age between 18 and 65
$age = rand(18, 65);
// Calculate DOB based on age
$year = date('Y') - $age;
$month = str_pad(rand(1, 12), 2, '0', STR_PAD_LEFT);
$day = str_pad(rand(1, 28), 2, '0', STR_PAD_LEFT);
$dob = "{$day}-{$month}-{$year}";
// Generate employee code
$empCode = 'EMP' . str_pad($index, 6, '0', STR_PAD_LEFT);
// Generate email
$email = strtolower($firstName . '.' . $lastName . $index) . '@' . $this->domains[array_rand($this->domains)];
// Generate mobile number (Indian format)
$mobile = '+91' . rand(7000000000, 9999999999);
// Generate insurance amounts
$siOptions = [100000, 200000, 300000, 500000, 1000000];
$si = $siOptions[array_rand($siOptions)];
$si_enhancement = rand(0, 1) ? rand(50000, 200000) : 0;
$proposed_si_1 = $si + rand(100000, 500000);
$proposed_si_2 = $proposed_si_1 + rand(100000, 500000);
$proposed_si_3 = $proposed_si_2 + rand(100000, 500000);
$proposed_si_4 = $proposed_si_3 + rand(100000, 500000);
return [
'sl_no' => $index,
'emp_code' => $empCode,
'name' => $name,
'relationship' => $relationship,
'gender' => $gender,
'dob' => $dob,
'age' => $age,
'email' => $email,
'mobile' => $mobile,
'si' => $si,
'si_enhancement' => $si_enhancement,
'proposed_si_1' => $proposed_si_1,
'proposed_si_2' => $proposed_si_2,
'proposed_si_3' => $proposed_si_3,
'proposed_si_4' => $proposed_si_4
];
}
public function logo_renaming()
{
$directory = ROOTPATH . 'public/uploads/logo/';
if (!is_dir($directory)) {
die("Directory not found: $directory");
}
$files = scandir($directory);
$client_logo_files = $this->get_client_logo_files();
$rename_files = "";
$failed_rename_files = "";
foreach ($files as $file) {
// Skip system entries
if ($file === '.' || $file === '..') {
continue;
}
$oldPath = $directory . $file;
if (is_file($oldPath) && in_array(trim($file), $client_logo_files)) {
// Remove all spaces from filename
$newFileName = preg_replace('/\s+|\x{00A0}|\x{200B}|\x{200C}|\x{200D}|\x{FEFF}/u', '', $file);
$newPath = $directory . $newFileName;
// Only rename if the name changed
if ($oldPath !== $newPath) {
if (rename($oldPath, $newPath)) {
$rename_files .= "\n Renamed: $file → $newFileName \n";
} else {
$failed_rename_files .= "\n Failed file: $file \n";
}
}
}
}
$dbUpdated = $this->update_client_logo_files();
log_message('error', 'Renamed Files: ' . $rename_files);
log_message('error', 'Failed Renames: ' . $failed_rename_files);
log_message('error', 'Database Update Status: ' . ($dbUpdated ? 'Success' : 'No changes made'));
return $this->response->setJSON([
'status' => 'success',
'message' => 'Logo renaming completed. kindly check backend logs for details',
'data' => [
'renamed_files' => $rename_files,
'failed_renames' => $failed_rename_files
]
])->setStatusCode(200);
}
public function get_client_logo_files()
{
$db = \Config\Database::connect();
$sql = "SELECT client_logo FROM clients WHERE client_logo IS NOT NULL AND TRIM(client_logo) <> '' ";
$query = $db->query($sql);
$results = $query->getResultArray() ?? [];
$files = array_map(function ($item) {
return trim($item['client_logo']);
}, $results);
return $files;
}
public function update_client_logo_files()
{
$db = \Config\Database::connect();
$sql = "UPDATE clients
SET client_logo = REPLACE(REPLACE(REPLACE(client_logo, CHAR(160), ''), ' ', ''), '\t', '')
WHERE client_logo IS NOT NULL
AND TRIM(client_logo) <> ''
";
$query = $db->query($sql);
return $db->affectedRows() > 0;
}
public function createDefaultMailTempalteInCrossDB()
{
$postDB = \Config\Database::connect(); // target DB
$preDB = \Config\Database::connect('preDB'); // source DB
// Templates to copy
$templateNames = [
'member_welcome_mail',
'member_reminder_mail',
'member_review_and_summary_mail'
];
foreach ($templateNames as $template) {
$exists = $postDB->table('notifications')
->where('client_id', NULL)
->where('template_name', $template)
->countAllResults();
if ($exists > 0) {
continue; // Skip if already inserted
}
// Fetch template from preDB
$templateData = $preDB->table('notifications')
->where('client_id', NULL)
->where('template_name', $template)
->get()
->getRowArray();
if (!empty($templateData)) {
// Remove ID to avoid duplicate primary key issues
unset($templateData['id']);
// Set created_by and timestamps if needed
$templateData['client_id'] = NULL;
$templateData['created_by'] = 1;
$templateData['cretaed_at'] = date('Y-m-d H:i:s');
$templateData['updated_by'] = NULL;
$templateData['updated_at'] = NULL;
// Insert into postDB
$postDB->table('notifications')->insert($templateData);
}
}
return $this->response->setJSON(['message'=>"Created Default Mail Tempalte In Cross DB "])->setStatusCode(200);
}
public function createDefaultMailTempalteInSameDB()
{
$postDB = \Config\Database::connect();
// Templates to copy
$templateNames = [
'member_welcome_mail',
'member_reminder_mail',
'member_review_and_summary_mail',
'member_common_mail',
'member_ecard_mail'
];
foreach ($templateNames as $template) {
$exists = $postDB->table('notifications')
->where('client_id', NULL)
->where('template_name', $template)
->countAllResults();
if ($exists > 0 ) {
continue; // Skip if already inserted
}
// Fetch template from preDB
$templateData = $postDB->table('notifications')
// this is where we want to replace 0 with the client id we want to replace
->where('client_id', 0)
// template_name from which you want to create a common template from templateNames array.
->where('template_name', $template)
->get()
->getRowArray();
if (!empty($templateData)) {
// Remove ID to avoid duplicate primary key issues
unset($templateData['id']);
// Set created_by and timestamps if needed
$templateData['client_id'] = NULL;
$templateData['created_by'] = 1;
$templateData['cretaed_at'] = date('Y-m-d H:i:s');
$templateData['updated_by'] = NULL;
$templateData['updated_at'] = NULL;
// Insert into postDB
$postDB->table('notifications')->insert($templateData);
}
}
return $this->response->setJSON(['message'=>"Created Default Mail Tempalte In Same DB "])->setStatusCode(200);
}
public function metaDashboardDemo()
{
// 🔐 Move this to .env in real projects
$METABASE_SECRET_KEY = getenv('METABASE_SECRET_KEY');
$database_id = (int) ($this->request->getGet('database_id') ?? 2);
$policy_id = $this->request->getGet('client_policy') ?? null;
$payload = [
'resource' => [
// 'dashboard' => 1
'dashboard' => $database_id
],
'exp' => time() + (10 * 60), // 10 minutes
];
if(!empty($policy_id)){
$payload['params'] = (object)['client_policy' => $policy_id]; // MUST be object for Metabase
}else{
$payload['params'] = (object)[]; // MUST be object for Metabase
}
// dd($payload);
$token = JWT::encode($payload, $METABASE_SECRET_KEY, 'HS256');
// // You can either return token only
// return $this->response->setJSON([
// 'token' => $token,
// 'iframe_url' => "https://your-metabase-domain/embed/dashboard/{$token}#bordered=true&titled=true"
// ]);
if ($this->request->getGet('api') == 1) {
if (empty($policy_id)) {
return $this->respond([
'status' => 'failed',
'message' => 'Client policy is required.',
'data' => [],
]);
}
return $this->respond([
'status' => 'success',
'message' => 'Dashboard token generated.',
'data' => [
'metabaseToken' => $token,
'metabaseUrl' => 'https://nsights.nhanceindia.in',
],
]);
}
$data = [
'tab_name' => 'Metabase Dashboard',
'page_name' => 'Metabase Dashboard',
'metabaseUrl' => 'https://nsights.nhanceindia.in',
'dashboardApiUrl' => base_url('/metaDashboardDemo'),
];
return $this->loadLayout('meta_dashboard_demo_one', $data);
}
public function apacheSuperSetDemo()
{
// echo 'Dta';die;
// 🔐 Move this to .env in real projects
$METABASE_SECRET_KEY = getenv('METABASE_SECRET_KEY');
$database_id = (int)$this->request->getGet('database_id') ?? 2;
$policy_id = $this->request->getGet('client_policy') ?? null;
$tpa_url = 'https://nsights.nhanceindia.in/public/dashboard/4babf324-6c1e-4c5a-adbb-1c80a0f545b1';
$policy_id = $policy_id ? $policy_id : 4687;
$payload = [
'resource' => [
// 'dashboard' => 1
'dashboard' => 2
],
'exp' => time() + (10 * 60), // 10 minutes
];
if(!empty($policy_id)){
$payload['params'] = (object)['client_policy' => $policy_id]; // MUST be object for Metabase
}else{
$payload['params'] = (object)[]; // MUST be object for Metabase
}
// dd($payload);
$token = JWT::encode($payload, $METABASE_SECRET_KEY, 'HS256');
// // You can either return token only
// return $this->response->setJSON([
// 'token' => $token,
// 'iframe_url' => "https://your-metabase-domain/embed/dashboard/{$token}#bordered=true&titled=true"
// ]);
if($this->request->getGet('api') == 1)
{
return $this->respond([
'status' => 'success',
'message' => 'Form data received successfully!',
'data' => [
'metabaseToken' => $token,
'metabaseUrl' => 'https://nsights.nhanceindia.in']
]);
}
return view('apache_dashboard_demo_one', [
'metabaseToken' => $token,
'metabaseUrl' => 'https://nsights.nhanceindia.in',
]);
}
public function testingquerys()
{
$calendar = new \App\Libraries\GoogleCalendarService();
// Check if user is authenticated without passing tokens manually
if (!$calendar->isReady()) {
return $this->respond(['status' => 'failed', 'code' => '404' , 'message' => 'Google Access Token Expired'], 200);
}
$data = [
'summary' => 'Client Follow up',
'meeting_date' => '2026-02-22 10:00:00',
'description' => 'Visit Client place',
'emails' => ['surendarsuri30@gmail.com', 'vitvelz@gmail.com', 'venbalap2026@gmail.com', 'gowthamceline46@gmail.com']
];
try {
$response = $calendar->createEvent($data);
return $this->respond(['status' => 'success', 'code' => '200' , 'message' => 'Follow-up Saved', 'response' => $response], 200);
} catch (\Exception $e) {
return $this->respond(['status' => 'failed', 'code' => '500' , 'message' => 'Error: ' . $e->getMessage()], 200);
}
}
public function metaTpaDashboardDemo()
{
$METABASE_SECRET_KEY = getenv('METABASE_SECRET_KEY');
$policy_id = $this->request->getGet('client_policy') ?? null;
if ($this->request->getGet('api') != 1) {
$data = [
'tab_name' => 'TPA Reports',
'page_name' => 'TPA Reports',
'metabaseUrl' => 'https://nsights.nhanceindia.in',
'dashboardApiUrl' => base_url('/metaTpaDashboardDemo'),
];
return $this->loadLayout('meta_dashboard_demo_one', $data);
}
if (empty($policy_id)) {
return $this->respond([
'status' => 'failed',
'message' => 'Client policy is required.',
'data' => [],
]);
}
$client_policy_data = $this->ClientPolicyModel
->select('tpa.dashboard_id')
->join('tpa', 'client_policy.tpa_id = tpa.id')
->where('client_policy.id', $policy_id)
->first();
$database_id = isset($client_policy_data['dashboard_id']) ? (int) $client_policy_data['dashboard_id'] : null;
if (empty($database_id)) {
if ($this->request->getGet('api') == 1) {
return $this->respond([
'status' => 'failed',
'message' => 'There is no dashboard for this TPA.',
'data' => []
]);
}
return view('errors/404', [
'message' => 'There is no dashboard for this TPA.'
]);
}
$payload = [
'resource' => [
'dashboard' => $database_id
],
'exp' => time() + (10 * 60), // 10 minutes
'params' => (object) ['client_policy' => $policy_id ], // MUST be object for Metabase
];
$token = JWT::encode($payload, $METABASE_SECRET_KEY, 'HS256');
// dd($token);
return $this->respond([
'status' => 'success',
'message' => 'Form data received successfully!',
'data' => [
'metabaseToken' => $token,
'metabaseUrl' => 'https://nsights.nhanceindia.in',
],
]);
}
/**
* Insert sample data into tpa_api_data for testing variance report (Not in NHANCE, Not in TPA, Need to Review).
* Uses client_policy (policy_status=1, is_active=1), employee_policies (active), and employees.
*
* @param int|null $client_policy_id Optional. If not provided, first eligible policy is used.
* @return \CodeIgniter\HTTP\ResponseInterface
*/
public function insertSampleTpaApiData($client_policy_id = null)
{
$db = \Config\Database::connect();
$clientPolicyModel = new ClientPolicyModel();
$employeePolicyModel = new EmployeePolicyModel();
$employeeModel = new EmployeeModel();
$tpaApiDataModel = new TpaApiDataModel();
$batchFileModel = new BatchFileModel();
// 1. Get policies: policy_status = 1, is_active = 1
$policyBuilder = $clientPolicyModel
->where('policy_status', 1)
->where('is_active', 1);
if ($client_policy_id !== null && $client_policy_id !== '') {
$policyBuilder->where('id', (int) $client_policy_id);
}
$policies = $policyBuilder->orderBy('id', 'ASC')->findAll();
if (empty($policies)) {
return $this->respond([
'status' => false,
'message' => 'No active client policy found (policy_status=1, is_active=1).',
'data' => [],
], 400);
}
$policy = $policies[0];
$client_policy_id = (int) $policy['id'];
$client_id = (int) $policy['client_id'];
$client_branch_id = !empty($policy['client_branch_id']) ? (int) $policy['client_branch_id'] : 0;
// 2. Get related employees from employee_policies (active) + employees
$empPolicies = $db->table('employee_polices ep')
->select('ep.id AS emp_policy_id, ep.employee_id, ep.tpa_id, e.emp_code, e.name, e.dob, e.gender, e.relationship')
->join('employees e', 'e.id = ep.employee_id')
->where('ep.client_policy_id', $client_policy_id)
->where('ep.is_active', 1)
->whereIn('ep.status', ['active', 'expired'])
->where('e.is_active', 1)
->get()
->getResultArray();
if (empty($empPolicies)) {
return $this->respond([
'status' => false,
'message' => 'No active employee policies found for this client policy.',
'data' => ['client_policy_id' => $client_policy_id],
], 400);
}
// 3. Create a test batch file so we have a file_id for tpa_api_data
$createdBy = function_exists('get_session_userid') ? get_session_userid() : 1;
$batchCode = 'TPA_SAMPLE_' . date('YmdHis') . '_' . bin2hex(random_bytes(4));
$batchFileId = $batchFileModel->insert([
'client_id' => $client_id,
'client_policy_id' => $client_policy_id,
'client_branch_id' => $client_branch_id,
'batch_code' => $batchCode,
'file_name' => 'sample_tpa_data_test_' . date('Y-m-d_His') . '.xlsx',
'insurer_or_tpa' => 'tpa',
'event_type' => 'api',
'actions' => 'fetch',
'status' => 'partially success',
'count' => 0,
'created_by' => $createdBy,
'is_active' => 1,
]);
if (!$batchFileId) {
return $this->respond([
'status' => false,
'message' => 'Failed to create test batch file.',
'data' => [],
], 500);
}
$file_id = (int) $batchFileId;
$tpaApiDataModel->skipValidation(true);
$inserted = ['not_in_nhance' => 0, 'need_to_review' => 0];
$toInsert = [];
// 4. Not in NHANCE: insert TPA records with emp_codes that do NOT exist in NHANCE for this policy
$fakeEmpCodes = ['TPA_SAMPLE_NOTINNHANCE_1', 'TPA_SAMPLE_NOTINNHANCE_2'];
foreach ($fakeEmpCodes as $i => $empCode) {
$toInsert[] = [
'file_id' => $file_id,
'emp_code' => $empCode,
'name' => 'Sample TPA Only ' . ($i + 1),
'dob' => '1990-01-' . str_pad((string)(15 + $i), 2, '0', STR_PAD_LEFT),
'relation' => 'Self',
'gender' => ($i % 2 === 0) ? 'M' : 'F',
'self' => 'Sample TPA Only ' . ($i + 1),
'tpa_id' => 'TPA' . (1000 + $i),
'age' => 32 + $i,
'is_active' => 1,
'desc' => 'Sample data – Not in NHANCE',
'created_by'=> $createdBy,
];
$inserted['not_in_nhance']++;
}
// 5. Need to Review: same employee as in NHANCE but with different name/dob/gender
$needReview = array_slice($empPolicies, 0, min(2, count($empPolicies)));
foreach ($needReview as $emp) {
$dob = $emp['dob'];
if (is_string($dob) && preg_match('/^(\d{4})-(\d{2})-(\d{2})/', $dob, $m)) {
$altDob = $m[1] . '-' . $m[2] . '-' . str_pad((string)((int)$m[3] + 1), 2, '0', STR_PAD_LEFT);
} else {
$altDob = '1995-06-15';
}
$toInsert[] = [
'file_id' => $file_id,
'emp_code' => $emp['emp_code'],
'name' => '[TPA Altered] ' . ($emp['name'] ?? 'Unknown'),
'dob' => $altDob,
'relation' => $emp['relationship'] ?? 'Self',
'gender' => (strtoupper($emp['gender'] ?? 'M') === 'M') ? 'F' : 'M',
'self' => $emp['name'] ?? 'Unknown',
'tpa_id' => $emp['tpa_id'] ?? ('T' . $emp['employee_id']),
'age' => 30,
'is_active' => 1,
'desc' => 'Sample data – Need to Review (mismatch)',
'created_by'=> $createdBy,
];
$inserted['need_to_review']++;
}
foreach ($toInsert as $row) {
$tpaApiDataModel->insert($row);
}
// Not in TPA: we do NOT insert those into tpa_api_data; NHANCE already has employees. So any employee
// we did not add to tpa_api_data will appear as "Not in TPA". We added only "Need to Review" and
// "Not in NHANCE" rows; the rest of NHANCE employees remain without TPA rows => they show as Not in TPA.
return $this->respond([
'status' => true,
'message' => 'Sample TPA API data inserted successfully.',
'data' => [
'file_id' => $file_id,
'client_policy_id' => $client_policy_id,
'client_id' => $client_id,
'batch_code' => $batchCode,
'inserted' => $inserted,
'not_in_tpa_note' => 'Employees in NHANCE that were not added to TPA data will appear as "Not in TPA" when you run the variance report for this file.',
],
], 200);
}
/**
* List employee count per client policy.
* No input parameters. Checks all client_policy records and counts linked employee_policies per policy.
*
* @return \CodeIgniter\HTTP\ResponseInterface
*/
public function listEmployeeCountByClientPolicy()
{
$db = \Config\Database::connect();
$rows = $db->table('client_policy cp')
->select('cp.id AS client_policy_id, COUNT(ep.id) AS employee_policy_count', false)
->join('employee_polices ep', 'ep.client_policy_id = cp.id', 'left')
->groupBy('cp.id')
->orderBy('cp.id', 'ASC')
->get()
->getResultArray();
$list = array_map(function ($row) {
return [
'client_policy_id' => (int) $row['client_policy_id'],
'employee_policy_count' => (int) $row['employee_policy_count'],
];
}, $rows);
return $this->respond([
'status' => true,
'message' => 'Employee count per client policy.',
'data' => $list,
], 200);
}
/**
* Test Wellness SSO token generation for Medi Assist (MediBuddy).
*
* This uses the token-based authentication details shared by Medi Assist:
* - Cipher: AES-256-CBC
* - Padding: PKCS7 (OpenSSL default)
* - Login URL: https://login.mediassist.in/SSOLogon.aspx?PartnerCorpId={0}&EncryptedSSO={1}
*
* Environment variables (recommended):
* - MEDIASSIST_WELLNESS_KEY
* - MEDIASSIST_WELLNESS_IV
* - MEDIASSIST_WELLNESS_PARTNER_CORP_ID
* - MEDIASSIST_WELLNESS_LOGIN_URL
*
* If env values are not present, sensible dummy defaults are used so that
* the function can still be exercised.
*/
public function testMediAssistWellnessOld()
{
// Configuration – prefer environment variables, fall back to demo values
$keyString = env('MEDIASSIST_WELLNESS_KEY');
$ivString = env('MEDIASSIST_WELLNESS_IV');
$loginUrlTemplate = env('MEDIASSIST_WELLNESS_LOGIN_URL' );
$partnerCorpId = '15963';
$cipher_algorithm = 'AES-256-CBC';
// Plain SSO JSON payload, as per Medi Assist sample
$payload = [
'Id' => '15022',
'expiryTime' => time() + (10 * 60), // 10 minutes
'CPartnerId' => $partnerCorpId,
];
$plainJson = json_encode($payload, JSON_UNESCAPED_SLASHES);
// Derive a 32‑byte key (AES‑256) and 16‑byte IV from the provided strings
// $key = substr(hash('sha256', $keyString, true), 0, 32);
// $iv = substr(hash('md5', $ivString, true), 0, 16);
// Encrypt with AES‑256‑CBC + PKCS7 padding (OpenSSL default)
$cipherTextRaw = openssl_encrypt( $plainJson, $cipher_algorithm, $keyString, OPENSSL_RAW_DATA, $ivString);
if ($cipherTextRaw === false) {
return $this->respond([
'status' => false,
'message' => 'Encryption failed while generating Medi Assist wellness token.',
], 500);
}
// Base64 encode and URL‑encode for use as EncryptedSSO
$encryptedSSO = urlencode(base64_encode($cipherTextRaw));
// $encryptedSSO = rtrim(strtr(base64_encode($cipherTextRaw), '+/', '-_'), '=');
// Build the final login URL
$loginUrl = str_replace(['{0}', '{1}'], [$partnerCorpId, $encryptedSSO], $loginUrlTemplate);
return $this->respond([
'status' => true,
'message' => 'Medi Assist wellness test URL generated successfully.',
'data' => [
'loginUrl' => $loginUrl,
'encryptedSSO' => $encryptedSSO,
'plainPayload' => $payload,
],
], 200);
}
public function chartbrewDashboardDemo()
{
// 1. Configuration - Use a Chartbrew-specific Secret Key from .env
$chartbrew_base_url = "https://analytics.nhanceindia.in/report/my-first-dashboard-oHbWNWH0";
$chartbrew_secret = getenv('METABASE_SECRET_KEY'); // Ensure this is set in your .env
// 2. Get dynamic parameters (matching your screenshot's naming convention)
$policy_id = $this->request->getGet('client_policy_id') ?? 4687;
// 3. Define the Payload
// Note: 'sub' (Subject) should usually be the user ID or a unique identifier
// depending on Chartbrew's specific JWT requirements.
$payload = [
"sub" => [
"type" => "Project",
"id" => 4, // Integer type usually preferred
"sharePolicyId" => 4
],
"iat" => time(),
"exp" => time() + (10 * 60), // 10 minute expiration
];
// 4. Encode the JWT
// Make sure you have 'use Firebase\JWT\JWT;' at the top of your controller
$token = JWT::encode($payload, $chartbrew_secret, 'HS256');
// 5. Construct the URL
// We use http_build_query to ensure special characters are handled correctly
$params = [
'token' => $token,
'theme' => 'light',
'client_policy_id' => $policy_id
];
$url = $chartbrew_base_url . '?' . http_build_query($params);
// 6. Optional API response
if ($this->request->getGet('api') == 1) {
return $this->response->setJSON([
'status' => 'success',
'data' => [
'chartbrewUrl' => $url,
'policy_id' => $policy_id
]
]);
}
// 7. Return the View
return view('chartbrew_dashboard_view', [
'iframe_url' => $url,
'policy_id' => $policy_id
]);
}
public function testMediAssistWellness2()
{
// Config
$keyString = env('MEDIASSIST_WELLNESS_KEY');
$ivString = env('MEDIASSIST_WELLNESS_IV');
$loginUrlTemplate = env('MEDIASSIST_WELLNESS_LOGIN_URL');
$partnerCorpId = '15963';
$cipher_algorithm = 'AES-256-CBC';
// Payload (MATCH EXACT CASE from doc)
$payload = [
'Id' => '15022',
'expiryTime' => (string)(time() + 600), // string format safer
'CPartnerId' => $partnerCorpId,
];
$plainJson = json_encode($payload, JSON_UNESCAPED_SLASHES);
// ✅ IMPORTANT: Ensure correct key + IV length (ASCII based)
$key = substr(str_pad($keyString, 32, '0'), 0, 32); // 32 bytes
$iv = substr(str_pad($ivString, 16, '0'), 0, 16); // 16 bytes
// Encrypt
$cipherTextRaw = openssl_encrypt(
$plainJson,
$cipher_algorithm,
$key,
OPENSSL_RAW_DATA,
$iv
);
if ($cipherTextRaw === false) {
return $this->respond([
'status' => false,
'message' => 'Encryption failed.',
], 500);
}
// ✅ Use ONLY Base64 (NO urlencode unless explicitly required)
$encryptedSSO = base64_encode($cipherTextRaw);
// Build URL
$loginUrl = str_replace(
['{0}', '{1}'],
[$partnerCorpId, $encryptedSSO],
$loginUrlTemplate
);
return $this->respond([
'status' => true,
'data' => [
'loginUrl' => $loginUrl,
'encryptedSSO' => $encryptedSSO,
'plainPayload' => $payload,
'decryptMediAssistWellness' => $this->decryptMediAssistWellness($encryptedSSO),
],
], 200);
}
public function testMediAssistWellness()
{
try {
// Config
$keyString = env('MEDIASSIST_WELLNESS_KEY');
$ivString = env('MEDIASSIST_WELLNESS_IV');
$loginUrlTemplate = env('MEDIASSIST_WELLNESS_LOGIN_URL');
$partnerCorpId = '15963';
$cipher_algorithm = 'AES-256-CBC';
// Payload
$payload = [
'Id' => '15022',
'expiryTime' => (string)(time() + 600),
'CPartnerId' => $partnerCorpId,
];
$plainJson = json_encode($payload, JSON_UNESCAPED_SLASHES);
// ✅ EXACT same as C#
$key = substr(str_pad($keyString, 32, '0'), 0, 32);
$iv = substr(str_pad($ivString, 16, '0'), 0, 16);
// Encrypt
$cipherTextRaw = openssl_encrypt($plainJson,$cipher_algorithm,$key,OPENSSL_RAW_DATA,$iv);
if ($cipherTextRaw === false) {
throw new \Exception('Encryption failed.');
}
// ✅ Step 1: Base64 encode
$base64Cipher = base64_encode($cipherTextRaw);
// ✅ Step 2: PREFIX IV (CRITICAL — matches C#)
$encryptedSSO = $iv . $base64Cipher;
// ⚠️ URL encode (VERY IMPORTANT for this format)
$finalSSO = urlencode($encryptedSSO);
// Build URL
$loginUrl = str_replace(
['{0}', '{1}'],
[$partnerCorpId, $finalSSO],
$loginUrlTemplate
);
return $this->respond([
'status' => true,
'data' => [
'loginUrl' => $loginUrl,
'encryptedSSO' => $encryptedSSO,
'base64Only' => $base64Cipher,
'ivUsed' => $iv,
'plainPayload' => $payload,
],
], 200);
} catch (\Throwable $e) {
log_message('error', 'MediAssist SSO Error: ' . $e->getMessage());
return $this->respond([
'status' => false,
'message' => $e->getMessage(),
], 500);
}
}
public function decryptMediAssistWellness($encryptedSSO)
{
// Config
$keyString = env('MEDIASSIST_WELLNESS_KEY');
$ivString = env('MEDIASSIST_WELLNESS_IV');
$cipher_algorithm = 'AES-256-CBC';
// Ensure same key + IV format used in encryption
$key = substr(str_pad($keyString, 32, '0'), 0, 32); // 32 bytes
$iv = substr(str_pad($ivString, 16, '0'), 0, 16); // 16 bytes
// Decode Base64
$cipherTextRaw = base64_decode($encryptedSSO, true);
if ($cipherTextRaw === false) {
return [
'status' => false,
'message' => 'Invalid Base64 string.',
];
}
// Decrypt
$decrypted = openssl_decrypt(
$cipherTextRaw,
$cipher_algorithm,
$key,
OPENSSL_RAW_DATA,
$iv
);
if ($decrypted === false) {
return [
'status' => false,
'message' => 'Decryption failed.',
];
}
// Convert JSON to array
$data = json_decode($decrypted, true);
return [
'status' => true,
'data' => [
'decryptedRaw' => $decrypted,
'decoded' => $data
],
];
}
public function getVidalEnrollmentInfo()
{
helper('api');
$url = 'https://devapigw.vidalhealthtpa.com/partner-integration/enrollment/info';
$subscriptionKey = getenv('VIDAL_API_SUBSCRIPTION_KEY');
if (empty($subscriptionKey)) {
return $this->response->setStatusCode(500)->setJSON([
'error' => 'Missing VIDAL_API_SUBSCRIPTION_KEY in env',
]);
}
$policyNo = '000/VZXSY';
$startIndex = 1;
$endIndex = 5;
$body = [
'policyNo' => $policyNo,
'startIndex' => $startIndex,
'endIndex' => $endIndex,
];
$headers = [
'Content-Type: application/json',
'ocp-apim-subscription-key: ' . $subscriptionKey,
];
$method = "POST";
$rawResponse = call_third_party_api($url, $method, $headers, $body);
return $this->response->setStatusCode(200)->setJSON([
'request' => [
'url' => $url,
'method' => $method,
'headers' => $headers,
'body' => $body,
],
'raw_response' => $rawResponse,
]);
}
}