diff --git a/app/Config/Database.php b/app/Config/Database.php index dcc1c2dd..c0f91c65 100755 --- a/app/Config/Database.php +++ b/app/Config/Database.php @@ -134,6 +134,10 @@ class Database extends Config 'ssl_ca' => ROOTPATH . 'ca.pem', 'ssl_verify' => true, ]; + $this->preDB['encrypt'] = [ + 'ssl_ca' => ROOTPATH . 'ca.pem', + 'ssl_verify' => true, + ]; } } diff --git a/app/Config/Routes.php b/app/Config/Routes.php index 48c7fbb8..e88bbc81 100755 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -213,6 +213,8 @@ $routes->group("/employee", ["filter" => "authMVC"], function ($routes) { $routes->post('get_emp_history','EmployeeController::getEmpHistory'); $routes->get("retail-endorsement-list", "EmployeeController::retailendorsementlist"); $routes->post("retail-endorsement-save", "EmployeeController::retailendorsementsave"); + $routes->get("getTPADataVariationReport/(:num)", "EmployeeController::getTPADataVariationReport/$1"); + $routes->get("bulkGenerateEcardAndStoreinS3", "EmployeeController::bulkGenerateEcardAndStoreinS3"); }); @@ -508,6 +510,8 @@ $routes->get('cli/sendZeptoMail', 'MasterController::testZeptoSMTP'); $routes->cli('cli/processjob', 'JobWorker::processJob'); $routes->cli('cli/processjobs', 'JobWorker::processJobs'); +$routes->cli('cli/bulkGenerateEcardAndStoreinS3', 'EmployeeController::bulkGenerateEcardAndStoreinS3'); + $routes->get("processjob", "JobWorker::processJob"); $routes->cli('cli/new_gmail_token', 'MasterController::generateNewGmailAPIToken'); $routes->cli('cli/send_mail_cli', 'MasterController::testGmailAPIViaCLI'); @@ -766,11 +770,12 @@ $routes->get('claimStatus','VidalApiController::claimStatus'); $routes->get('EcardRequest','MediAssistApiController::EcardRequest'); $routes->get('HospitalNetwork','MediAssistApiController::HospitalNetwork'); $routes->get('GetBenefDetails','MediAssistApiController::GetBenefDetails'); -$routes->get('ClaimDetail','VidalApiController::ClaimDetail'); +$routes->get('ClaimDetail','MediAssistApiController::ClaimDetail'); $routes->get('SubmitClaim','MediAssistApiController::SubmitClaim'); $routes->get('IntimateClaim','MediAssistApiController::IntimateClaim'); $routes->get('IRSubmission','MediAssistApiController::IRSubmission'); $routes->get('ClaimStatusUpdate','MediAssistApiController::ClaimStatusUpdate'); +$routes->get('syncTpaClaimToNhance','MediAssistApiController::syncTpaClaimToNhance'); // API service diff --git a/app/Config/Services.php b/app/Config/Services.php index 5f982877..73d75683 100755 --- a/app/Config/Services.php +++ b/app/Config/Services.php @@ -9,6 +9,7 @@ use App\Libraries\GmailAPI; use App\Libraries\MyGoogleDrive; use App\Libraries\RuleImportService; use App\Libraries\DataServiceSqlite; +use App\Libraries\S3Service; use App\Controllers\Home; /** @@ -90,5 +91,14 @@ class Services extends BaseService return new RuleImportService(); } + + public static function getS3Service($getShared = true) + { + if ($getShared) { + return static::getSharedInstance('getS3Service'); + } + + return new S3Service(); + } } diff --git a/app/Controllers/ApiServiceController.php b/app/Controllers/ApiServiceController.php index 5f8f17e4..e1858c95 100644 --- a/app/Controllers/ApiServiceController.php +++ b/app/Controllers/ApiServiceController.php @@ -92,13 +92,25 @@ class ApiServiceController extends BaseController } + // $employee_policy = $this->employeePolicyModel + // ->select('employees.*, employee_polices.tpa_id , employee_polices.rand_string , employee_polices.uhid as uhid , client_policy.tpa_id as tpa_primary_id ') + // ->join('employees', 'employee_polices.employee_id = employees.id', 'left') + // ->join('client_policy', 'employee_polices.client_policy_id = client_policy.id', 'left') + // ->where('employee_polices.employee_id',$id) + // ->where('employee_polices.client_policy_id',$client_policy_id) + // ->where('employee_polices.is_active', 1 )->findAll(); + $employee_policy = $this->employeePolicyModel ->select('employees.*, employee_polices.tpa_id , employee_polices.rand_string , employee_polices.uhid as uhid , client_policy.tpa_id as tpa_primary_id ') ->join('employees', 'employee_polices.employee_id = employees.id', 'left') ->join('client_policy', 'employee_polices.client_policy_id = client_policy.id', 'left') - ->where('employee_polices.employee_id',$id) - ->where('employee_polices.client_policy_id',$client_policy_id) - ->where('employee_polices.is_active', 1 )->findAll(); + ->where('employees.emp_code', $emp_code) + ->where('employee_polices.client_policy_id', $client_policy_id) + ->where('employee_polices.is_active', 1) + ->where('employees.is_active', 1) + ->where('employee_polices.status', 'active') + ->where('employees.emp_status', 'active') + ->findAll(); if(count($employee_policy) > 0) diff --git a/app/Controllers/ClientController.php b/app/Controllers/ClientController.php index 039f6f99..db355961 100755 --- a/app/Controllers/ClientController.php +++ b/app/Controllers/ClientController.php @@ -2726,7 +2726,9 @@ class ClientController extends AdminController $search_term = 'GMC'; } else if (preg_match($gpa_pattern, $subject) || $policy_type_id == 6 || $policy_type_id == 7) { $search_term = 'GPA'; - } else { + } else if($policy_type_id == 72){ + $search_term = 'GMC'; + }else { $search_term = ""; } @@ -2736,7 +2738,7 @@ class ClientController extends AdminController if ($search_term === 'GPA' || $policy_type_id == 6 || $policy_type_id == 7) { $premiumData = $this->policyPremium1Model->where(['client_id' => $record['client_id'], 'client_policy_id' => $client_policy_id, 'is_active' => 1])->findAll(); - } else if ($search_term === 'GMC') { + } else if ($search_term === 'GMC' || $policy_type_id == 72) { $premiumData = $this->policyPremium2Model->where(['client_id' => $record['client_id'], 'client_policy_id' => $client_policy_id, 'is_active' => 1])->findAll(); @@ -2766,7 +2768,7 @@ class ClientController extends AdminController // echo '
';
// echo $family_floater;
- if ($search_term === 'GMC') {
+ if ($search_term === 'GMC' || $policy_type_id == 72 ) {
// $resultss = [];
$resultss = $results;
@@ -3400,6 +3402,7 @@ class ClientController extends AdminController
[
'Status' => true,
'code' => 200,
+ 'policy_type_id' => $record['policy_type_id'],
'data' => $record['policy_terms'],
'policy_addon' => $record['is_addon'],
'emp_count_by_policy' => $emp_count_by_policy
@@ -4225,40 +4228,147 @@ class ClientController extends AdminController
$client_policy_id = $this->request->getPost("client_policy_id");
$policy_terms = $this->request->getPost("policy_terms");
$policy_terms = json_decode($policy_terms, true);
-
- $data = [];
-
- foreach ($policy_terms as $key => $value) {
-
- if (str_ends_with($key, '_display')) {
-
- $original_key = substr($key, 0, -8);
-
- $newKey = implode(' ', array_map('ucfirst', explode('_', $original_key)));
-
- $data['enrollment_display_key'][$newKey] = $policy_terms[$original_key] ?? " ";
- } else {
-
- $data[$key] = $value;
- }
- }
-
- if (!empty($data)) {
- $policy_terms['is_payable_employee']['self'] = 0;
- $policy_terms = json_encode($data);
- }
-
-
$record = $this->clientPolicyModel->where('id', $client_policy_id)->first();
+ // print_r($policy_terms); die;
+
+ if (empty($policy_terms)) {
+ return $this->respond(['status' => false, 'code' => 404, 'message' => 'Policy terms data could not be empty', 'formdata' => $this->request->getPost()], 200);
+ }
if ($record) {
- $update = $this->clientPolicyModel->where('id', $client_policy_id)->set('policy_terms', $policy_terms)->update();
+ $data = [];
- if ($update) {
- return $this->respond(['status' => true, 'code' => 200, 'message' => 'Data updated successfully', 'client_policy_id' => $client_policy_id], 200);
+ if ($record['policy_type_id'] == 72) {
+
+ $data['sum_insured'] = $policy_terms['sum_insured'] ?? 0;
+ $data['multiple_sum_insured'] = $policy_terms['multiple_sum_insured'] ?? [];
+ $data['family_floater'] = $policy_terms['family_floater'] ?? 0;
+ $data['family_floaters'] = $policy_terms["family_floaters"] ?? [];
+
+ $data['age_ratio']['self']['min'] = $policy_terms["self_min_age"] ?? 0;
+ $data['age_ratio']['self']['max'] = $policy_terms["self_max_age"] ?? 0;
+ $data['age_ratio']['spouse']['min'] = $policy_terms["spouse_min_age"] ?? 0;
+ $data['age_ratio']['spouse']['max'] = $policy_terms["spouse_max_age"] ?? 0;
+ $data['age_ratio']['child']['min'] = $policy_terms["child_min_age"] ?? 0;
+ $data['age_ratio']['child']['max'] = $policy_terms["child_max_age"] ?? 0;
+ $data['age_ratio']['elders']['min'] = $policy_terms["other_member_min_age"] ?? 0;
+ $data['age_ratio']['elders']['max'] = $policy_terms["other_member_max_age"] ?? 0;
+
+ $temp_family_floaters = $data['family_floaters'];
+ $data['family_floaters'] = [];
+
+ if (in_array("self", $temp_family_floaters) == 1) {
+ $data['family_floaters']['self'] = 1;
+ } else {
+ $data['family_floaters']['self'] = 0;
+ }
+
+ if (in_array("spouse", $temp_family_floaters) == 1) {
+ $data['family_floaters']['spouse'] = 1;
+ } else {
+ $data['family_floaters']['spouse'] = 0;
+ }
+
+ if (count($temp_family_floaters)) {
+
+ $children_value = 0;
+ $value = 0;
+
+ if (count($temp_family_floaters) == 2) {
+ $children_value = 0;
+ $value = 1;
+ } else if (count($temp_family_floaters) == 3) {
+ $children_value = 1;
+ $value = 2;
+ } else {
+ $children_value = 2;
+ $value = 3;
+ }
+ $data['family_floaters']['childrens'] = (int)$temp_family_floaters[$children_value];
+
+ if ($temp_family_floaters[$value] == '1P') {
+ $data['family_floaters']['parents'] = 1;
+ $data['family_floaters']['parents-in-law'] = 0;
+ $data['family_floaters']['either-parents-pil'] = 0;
+ } else if ($temp_family_floaters[$value] == '2P') {
+ $data['family_floaters']['parents'] = 2;
+ $data['family_floaters']['parents-in-law'] = 0;
+ $data['family_floaters']['either-parents-pil'] = 0;
+ } else if ($temp_family_floaters[$value] == '1PIL') {
+ $data['family_floaters']['parents'] = 0;
+ $data['family_floaters']['parents-in-law'] = 1;
+ $data['family_floaters']['either-parents-pil'] = 0;
+ } else if ($temp_family_floaters[$value] == '2PIL') {
+ $data['family_floaters']['parents'] = 0;
+ $data['family_floaters']['parents-in-law'] = 2;
+ $data['family_floaters']['either-parents-pil'] = 0;
+ } else if ($temp_family_floaters[$value] == '2EPORPIL') {
+ //Parents or PIL (Any two of Father, Mother, MIl, FIL)
+ $data['family_floaters']['parents'] = 0;
+ $data['family_floaters']['parents-in-law'] = 0;
+ $data['family_floaters']['either-parents-pil'] = 2;
+ } else if ($temp_family_floaters[$value] == 'EPORPIL') {
+ //Either Parents or PIL (Parents or Parents In Law)
+ $data['family_floaters']['parents'] = 0;
+ $data['family_floaters']['parents-in-law'] = 0;
+ $data['family_floaters']['either-parents-pil'] = 1;
+ } else if ($temp_family_floaters[$value] == '4EPORPIL') {
+ $data['family_floaters']['parents'] = 2;
+ $data['family_floaters']['parents-in-law'] = 2;
+ $data['family_floaters']['either-parents-pil'] = 0;
+ } else {
+ $data['family_floaters']['parents'] = 0;
+ $data['family_floaters']['parents-in-law'] = 0;
+ $data['family_floaters']['either-parents-pil'] = 0;
+ }
+ }
+
+ $data['family_floaters']['elders_count'] = $this->request->getPost("elder_member_count") ? $this->request->getPost("elder_member_count") : 0;
+ $data['special_condition_label'] = $policy_terms['special_condition_label'] ?? [];
+ $data['special_condition_input'] = $policy_terms["special_condition_input"] ?? [];
+
+ $data['enrollment_display_key'] = $this->otherPolicyTermsDisplayKeyConstruct($policy_terms);
} else {
- return $this->respond(['status' => false, 'code' => 404, 'message' => 'Failed to update data', 'formdata' => $this->request->getPost()], 200);
+ foreach ($policy_terms as $key => $value) {
+
+ if (str_ends_with($key, '_display')) {
+
+ $original_key = substr($key, 0, -8);
+
+ $newKey = implode(' ', array_map('ucfirst', explode('_', $original_key)));
+
+ $data['enrollment_display_key'][$newKey] = $policy_terms[$original_key] ?? " ";
+ } else {
+
+ $data[$key] = $value;
+ }
+ }
+ }
+
+ if (!empty($data)) {
+
+ if ($record['policy_type_id'] == 72) {
+ $policy_terms['is_payable_employee']['self'] = 0;
+ $policy_terms['is_payable_employee']['spouse'] = 0;
+ $policy_terms['is_payable_employee']['childern'] = 0;
+ $policy_terms['is_payable_employee']['elders'] = 0;
+ } else {
+ $policy_terms['is_payable_employee']['self'] = 0;
+ }
+
+ $policy_terms = json_encode($data);
+
+ $update = $this->clientPolicyModel->where('id', $client_policy_id)->set('policy_terms', $policy_terms)->update();
+
+ if ($update) {
+ return $this->respond(['status' => true, 'code' => 200, 'message' => 'Data updated successfully', 'client_policy_id' => $client_policy_id], 200);
+ } else {
+ return $this->respond(['status' => false, 'code' => 404, 'message' => 'Failed to update data', 'formdata' => $this->request->getPost()], 200);
+ }
+
+ } else {
+ return $this->respond(['status' => false, 'code' => 404, 'message' => 'Failed to store data the policy therms.', 'formdata' => $this->request->getPost()], 200);
}
} else {
@@ -4266,6 +4376,27 @@ class ClientController extends AdminController
}
}
+ public function otherPolicyTermsDisplayKeyConstruct($data)
+ {
+ $labels = $data['special_condition_label'] ?? [];
+ $values = $data['special_condition_input'] ?? [];
+
+ $special_conditions = [];
+
+ foreach ($labels as $i => $label) {
+ $value = $values[$i] ?? '';
+
+ // skip if label or value is empty
+ if (trim($label) === '' || trim($value) === '') {
+ continue;
+ }
+
+ $special_conditions[$label] = $value;
+ }
+
+ return $special_conditions;
+ }
+
public function checkPolicyType($policy_type_id, $client_branch_id, $client_id)
{
@@ -5971,8 +6102,8 @@ class ClientController extends AdminController
// ---------- EMP SERVICE CONTROLLER --------------------------------------------------------------------------------
$empServiceController = new EmployeeServiceController();
- // $res = $empServiceController->excelFileFormatValidation(['file_id' => '1126']);
- // $res = $empServiceController->excelFileDataValidation(['file_id' => '865']);
+ // $res = $empServiceController->excelFileFormatValidation(['file_id' => '1248']);
+ // $res = $empServiceController->excelFileDataValidation(['file_id' => '1248']);
// $res = $empServiceController->employeesOnboardPreprocess(['file_id' => 1183]);
// $res = $empServiceController->employeesOnboardPreprocess(['file_id' => 1169]);
// $res = $empServiceController->employeesOnboardProcess(['file_id' => 835]);
diff --git a/app/Controllers/DashboardController.php b/app/Controllers/DashboardController.php
index 8958c26d..50a9e4c1 100755
--- a/app/Controllers/DashboardController.php
+++ b/app/Controllers/DashboardController.php
@@ -238,7 +238,7 @@ class DashboardController extends AdminController
$data['client_branch_emp_list'] = $results;
$session = \Config\Services::session();
- $session->set('enrollment_data', json_encode($data));
+ // $session->set('enrollment_data', json_encode($data));
$data['pendingActionsData'] = $pendingActionsData;
$data['businessTeamCount'] = count($businessTeamData) ?? 0;
diff --git a/app/Controllers/EmployeeController.php b/app/Controllers/EmployeeController.php
index dc72314e..fe377c2a 100755
--- a/app/Controllers/EmployeeController.php
+++ b/app/Controllers/EmployeeController.php
@@ -28,6 +28,7 @@ use App\Models\PolicyPremium2Model;
use App\Models\AuditHistoryModel;
use App\Models\UserModel;
use App\Models\PartnerEndorsementRequestModel;
+use App\Models\TpaApiDataModel;
use App\Controllers\Jobs;
@@ -42,6 +43,8 @@ use CodeIgniter\API\ResponseTrait;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
+use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
+use PhpOffice\PhpSpreadsheet\Style\Fill;
use Dompdf\Dompdf;
use Dompdf\Options;
@@ -98,6 +101,14 @@ class EmployeeController extends AdminController
public function list()
{
+
+ // $s3 = \Config\Services::getS3Service();
+ // $file = WRITEPATH.'uploads/excel/inception.ods';
+ // print_rr($s3->exists('inception_1766475604.ods'));
+ // print_rr($s3->getPresignedUrl('inception_1766.ods'));
+ // print_rr($s3->upload($file));
+ // print_rr($s3->download('inception_1766475604.ods',__DIR__));
+ // die();
// $model = new UserModel();
$data = [];
$data['status'] = ['draft' => 'Draft', 'enrolled' => 'Enrolled', 'active' => 'Active', 'inactive' => 'In-Active', 'pending' => 'Pending'];
@@ -1426,7 +1437,10 @@ class EmployeeController extends AdminController
//E-CARD DOWNLOAD FUNCTION USING DOM PDF ( CURRENTLY USING THIS ) Dompdf
public function generateIDCardForEmployee($rand_string, $people = 0, $mode = 0)
{
- // dd($rand_string, $people);
+ $mode = (int)$mode;
+
+
+ // dd($rand_string, $people,$mode);
$this->myLogger->logme('error', 'generateIDCardForEmployee params .' . json_encode(["rand_string" => $rand_string, "people" => $people, "mode" => $mode]));
try {
$this->myLogger->logme('error', 'generateIDCardForEmployee function started.');
@@ -1435,7 +1449,7 @@ class EmployeeController extends AdminController
$this->myLogger->logme('error', 'Fetching employee code and client policy ID.');
$get_emp_code_and_client_policy_id = $this->employeePolicyModel
- ->select('employee_polices.client_policy_id, employees.emp_code, tpa.short_name,employees.client_id')
+ ->select('employee_polices.client_policy_id, employees.emp_code,employees.name, employee_polices.tpa_id,tpa.short_name,employees.client_id')
->join('client_policy', 'client_policy.id = employee_polices.client_policy_id')
->join('employees', 'employees.id = employee_polices.employee_id')
->join('tpa', 'tpa.id = client_policy.tpa_id')
@@ -1462,7 +1476,44 @@ class EmployeeController extends AdminController
$client_policy_id = $get_emp_code_and_client_policy_id['client_policy_id'];
$emp_code = $get_emp_code_and_client_policy_id['emp_code'];
$client_id = $get_emp_code_and_client_policy_id['client_id'];
-
+
+ //new step check in S3 if yes then fetch from S3 bucket
+ $s3_key = 'ecard_'.$get_emp_code_and_client_policy_id['name'].'('.$get_emp_code_and_client_policy_id['emp_code'].')'.'_'.$get_emp_code_and_client_policy_id['tpa_id'].'.pdf';
+ // echo $s3_key;die();
+ $s3 = \Config\Services::getS3Service();
+ if($s3->exists($s3_key) && $mode != 2) //2 => for bulk generate so skip s3 check and generate PDF
+ {
+ //get pre signed url & make it download
+ $s3_url = $s3->getPresignedUrl($s3_key );
+
+ $pdf = file_get_contents($s3_url['url']);
+ if ($mode == 1) {
+ // Inline view
+ return $this->response
+ ->setHeader('Content-Type', 'application/pdf')
+ ->setHeader('Content-Disposition', 'inline; filename="' . $s3_key . '"')
+ ->setBody($pdf);
+ } else if($mode == 0){
+ // echo 'Force download';//die();
+ return $this->response
+ ->setHeader('Content-Type', 'application/pdf')
+ ->setHeader('Content-Disposition', 'attachment; filename="' . $s3_key . '"')
+ ->setBody($pdf);
+ }
+ // exit();
+ }
+ else
+ {
+ if($mode !== 2)
+ {
+ $data['message'] = 'Inprogress... Comeback later! or Contact support';
+ return view('errors/404', $data);
+ }
+ }
+
+ //in else generate PDF and upload it in s3
+ // echo 'else';
+ // exit();
// Step 2: Fetch ECard data
$this->myLogger->logme('error', 'Fetching ECard data using client_policy_id: ' . $client_policy_id . ' and emp_code: ' . $emp_code);
$data = $this->employeePolicyModel->getECardDataUsingMd5($client_policy_id, $emp_code,$client_id);
@@ -1559,6 +1610,7 @@ class EmployeeController extends AdminController
}
// return $html;
+ // echo $html;die();
// DomPdf
$options = new Options();
$options->set('isRemoteEnabled', true);
@@ -1582,28 +1634,34 @@ class EmployeeController extends AdminController
$dompdf->addInfo("Title", "E-Card");
$filename = 'ecard_' . date('Y-m-d_H-i-s') . '.pdf';
-
+ $temp_local_path = WRITEPATH.'/tmp/'.$s3_key;
+ file_put_contents(($temp_local_path),$dompdf->output());
// if($mode == 1){
// $dompdf->stream($filename, ['Attachment' => false]); // Inline view
// }else{
// $dompdf->stream($filename, ['Attachment' => true]); // Force download
// }
+ $aws_upload_res = $s3->upload(($temp_local_path));
+ // print_rr($aws_upload_res);
+ // echo '
PDF generated and uploaded to S3 successfully.
';
+ unlink($temp_local_path);
- if ($mode == 1) {
- // Inline view
- return $this->response
- ->setHeader('Content-Type', 'application/pdf')
- ->setHeader('Content-Disposition', 'inline; filename="' . $filename . '"')
- ->setBody($dompdf->output());
- } else {
- // Force download
- return $this->response
- ->setHeader('Content-Type', 'application/pdf')
- ->setHeader('Content-Disposition', 'attachment; filename="' . $filename . '"')
- ->setBody($dompdf->output());
- }
+ // exit();
+ // if ($mode == 1) {
+ // // Inline view
+ // return $this->response
+ // ->setHeader('Content-Type', 'application/pdf')
+ // ->setHeader('Content-Disposition', 'inline; filename="' . $filename . '"')
+ // ->setBody($dompdf->output());
+ // } else {
+ // // Force download
+ // return $this->response
+ // ->setHeader('Content-Type', 'application/pdf')
+ // ->setHeader('Content-Disposition', 'attachment; filename="' . $filename . '"')
+ // ->setBody($dompdf->output());
+ // }
- $this->myLogger->logme('error', 'generateIDCardForEmployee function completed successfully.');
+ // $this->myLogger->logme('error', 'generateIDCardForEmployee function completed successfully.');
} catch (\Exception $e) {
$this->myLogger->logme('error', 'Exception occurred: ' . $e->getMessage());
@@ -3579,5 +3637,571 @@ class EmployeeController extends AdminController
}
}
+ public function getTPADataVariationReport($file_id)
+ {
+ $file_info = $this->batchFileModel->where('id', $file_id)->find();
+ $client_id = $file_info[0]['client_id'];
+ $client_policy_id = $file_info[0]['client_policy_id'];
+ $TpaApiDataModel = new TpaApiDataModel();
+ $emp_data_wo_tpa_id = $this->employeePolicyModel->getTPADataVariationReport($client_id, $client_policy_id, $file_id);
+
+
+ //loop emp data with TPA data for matches
+ foreach ($emp_data_wo_tpa_id as $db_key => $db_row)
+ {
+ //get TPA API data from table for current DB ep code
+ $tpa_temp_data = $TpaApiDataModel->select('*')
+ ->where('emp_code', $db_row['emp_code'])
+ ->where('file_id', $file_id)
+ ->where('is_active', 1)
+ ->findAll();
+ $match= $this->reconcileDbWithTpa($db_row,$tpa_temp_data);
+ $emp_data_wo_tpa_id[$db_key]['match'] = $match;
+ }
+
+ // d($emp_data_wo_tpa_id);
+
+ // die();
+ //not_in_tpa
+ $tpa_emp_codes = $TpaApiDataModel->select('emp_code')
+ ->where('file_id', $file_id)
+ ->where('is_active', 1)
+ ->groupBy('emp_code')
+ ->findAll();
+ $tpa_emp_codes = array_column($tpa_emp_codes, 'emp_code');
+
+ $not_in_tpa = $this->employeePolicyModel->getTPADataVariationReport($client_id, $client_policy_id, $file_id,$tpa_emp_codes);
+ // d($not_in_tpa);die();
+
+ // not_in_nhance
+ $master_emp_codes = $this->employeePolicyModel->getTPADataVariationReport($client_id, $client_policy_id, $file_id,[],true);
+ $master_emp_codes = array_column($master_emp_codes, 'emp_code');
+
+ $not_in_nhance = $TpaApiDataModel->select('*')
+ ->where('is_active',1)
+ ->where('file_id',$file_id)
+ ->whereNotIn('emp_code',$master_emp_codes)
+ ->findAll();
+ // d($not_in_nhance);die();
+
+ if( !empty($not_in_tpa) || !empty($not_in_nhance) || !empty($emp_data_wo_tpa_id) )
+ {
+ $this->exportVariationReportExcel($not_in_tpa,$not_in_nhance,$emp_data_wo_tpa_id);
+ }
+ else
+ {
+ return false;
+ }
+ // $this->exportVariationReportExcel([],[],[]);
+
+
+ }
+
+
+ // not in use once all functionality workes well in this funciton then remvoe this function
+ function compareDbWithTpa(array $db, array $tpaRows): array
+ {
+ $partialMatches = [];
+
+ // Normalize helper
+ $normalizeName = function ($name) {
+ return strtolower(
+ preg_replace('/[.\s_]+/', '', trim($name))
+ );
+ };
+
+ foreach ($tpaRows as $tpa) {
+
+ // 0️⃣ emp_code must match
+ if (($db['emp_code'] ?? '') !== ($tpa['emp_code'] ?? '')) {
+ continue;
+ }
+
+ $relationMatch = strtolower($db['relation'] ?? '') === strtolower($tpa['relation'] ?? '');
+ $genderMatch = strtoupper($db['gender'] ?? '') === strtoupper($tpa['gender'] ?? '');
+ $dobMatch = ($db['dob'] ?? '') === ($tpa['dob'] ?? '');
+
+ $nameMatch = $normalizeName($db['name'] ?? '') ===
+ $normalizeName($tpa['name'] ?? '');
+
+ // ✅ FULL MATCH
+ if ($nameMatch && $relationMatch && $genderMatch && $dobMatch) {
+ return [
+ 'match' => 'full_match',
+ 'record'=> $tpa
+ ];
+ }
+
+ // ⚠️ PARTIAL MATCH
+ if ($relationMatch || $genderMatch || $dobMatch) {
+ $partialMatches[] = [
+ 'record' => $tpa,
+ 'matched_on' => [
+ 'relation' => $relationMatch,
+ 'gender' => $genderMatch,
+ 'dob' => $dobMatch
+ ]
+ ];
+ }
+ }
+
+ // If no full match but partial exists
+ if (!empty($partialMatches)) {
+ return [
+ 'match' => 'partial_match',
+ 'candidates' => $partialMatches
+ ];
+ }
+
+ // Nothing matched
+ return [
+ 'match' => 'no_match'
+ ];
+ }
+
+
+ function reconcileDbWithTpa(array $db, array $tpaRows): array
+ {
+ // Name normalization
+ $normalizeName = function ($name) {
+ return strtolower(
+ preg_replace('/[.\s_]+/', '', trim($name))
+ );
+ };
+
+ foreach ($tpaRows as $tpa) {
+
+ // 1️⃣ emp_code + relation must match
+ if (
+ // ($db['emp_code'] ?? '') !== ($tpa['emp_code'] ?? '') ||
+ strtolower($db['relationship']) !== strtolower($tpa['relation'])
+ ) {
+ continue;
+ }
+
+ // 2️⃣ Field comparison
+ $diff = [];
+
+ if (
+ ($db['name'] ?? '') !==
+ ($tpa['name'] ?? '')
+ ) {
+ $diff[] = 'name';
+ }
+
+ if (($db['dob'] ?? '') !== ($tpa['dob'] ?? '')) {
+ $diff[] = 'dob';
+ }
+
+ if (
+ strtoupper($db['gender'] ?? '') !==
+ strtoupper($tpa['gender'] ?? '')
+ ) {
+ $diff[] = 'gender';
+ }
+
+ // 3️⃣ Match found
+ return [
+ 'status' => 'matched',
+ 'tpa_record' => $tpa,
+ 'not_matching' => $diff // empty = perfect match
+ ];
+ }
+
+ // 4️⃣ No match found
+ return [
+ 'status' => 'no_match'
+ ];
+ }
+
+
+ function exportVariationReportExcel(
+ array $notInTPA,
+ array $notInNhance,
+ array $reviewNeeded,
+ string $filename = 'employee_review.xlsx')
+ {
+
+ function setCell($sheet, int $col, int $row, $value)
+ {
+ $cell = Coordinate::stringFromColumnIndex($col) . $row;
+ $sheet->setCellValue($cell, $value);
+ }
+
+ $EXPORT_COLUMNS = [
+
+ // Sheet 1 — Not in TPA
+ 'not_in_tpa' => [
+ 'emp_code' => 'Employee Code',
+ 'name' => 'Employee Name',
+ 'relationship' => 'Relation',
+ 'dob' => 'Date of Birth',
+ 'gender' => 'Gender',
+ 'mobile' => 'Mobile No',
+ 'email_corporate' => 'Corporate Email',
+ 'policy_no' => 'Policy No',
+ 'tpa_name' => 'TPA Name',
+ 'change_event' => 'Change Event',
+ ],
+
+ // Sheet 2 — Not in Nhance
+ 'not_in_nhance' => [
+ 'emp_code' => 'Employee Code',
+ 'name' => 'Employee Name',
+ 'relation' => 'Relation',
+ 'dob' => 'Date of Birth',
+ 'gender' => 'Gender',
+ 'age' => 'Age',
+ 'tpa_id' => 'TPA Member ID',
+ ],
+
+ // Sheet 3 — Review Needed (DB side)
+ 'review_main' => [
+ 'emp_code' => 'Employee Code',
+ 'name' => 'Employee Name',
+ 'relationship' => 'Relation',
+ 'dob' => 'Date of Birth',
+ 'gender' => 'Gender',
+ 'policy_no' => 'Policy No',
+ 'uhid' => 'UHID',
+ 'change_event' => 'Change event'
+ ],
+
+ // Sheet 3 — Review Needed (TPA side)
+ 'review_tpa' => [
+ 'emp_code' => 'TPA Employee Code',
+ 'name' => 'TPA Name',
+ 'relation' => 'TPA Relation',
+ 'dob' => 'TPA DOB',
+ 'gender' => 'TPA Gender',
+ 'tpa_id' => 'TPA Member ID',
+ 'age' => 'TPA Age',
+ ],
+ ];
+
+
+ $spreadsheet = new Spreadsheet();
+
+ /* =========================================================
+ * SHEET 1 — NOT IN TPA
+ * ========================================================= */
+ $sheet1 = $spreadsheet->getActiveSheet();
+ $sheet1->setTitle('Not in TPA');
+
+ $cols = $EXPORT_COLUMNS['not_in_tpa'];
+
+ $colNo = 1;
+ foreach ($cols as $label) {
+ setCell($sheet1, $colNo++, 1, $label);
+ }
+
+ $rowNo = 2;
+ foreach ($notInTPA as $row) {
+ $colNo = 1;
+ foreach ($cols as $key => $label) {
+ setCell($sheet1, $colNo++, $rowNo, $row[$key] ?? '');
+ }
+ $rowNo++;
+ }
+
+ foreach (range(1, count($cols)) as $c) {
+ $sheet1->getColumnDimension(Coordinate::stringFromColumnIndex($c))->setAutoSize(true);
+ }
+
+ /* =========================================================
+ * SHEET 2 — NOT IN NHANCE
+ * ========================================================= */
+ $sheet2 = $spreadsheet->createSheet();
+ $sheet2->setTitle('Not in Nhance');
+
+ $cols = $EXPORT_COLUMNS['not_in_nhance'];
+
+ $colNo = 1;
+ foreach ($cols as $label) {
+ setCell($sheet2, $colNo++, 1, $label);
+ }
+
+ $rowNo = 2;
+ foreach ($notInNhance as $row) {
+ $colNo = 1;
+ foreach ($cols as $key => $label) {
+ setCell($sheet2, $colNo++, $rowNo, $row[$key] ?? '');
+ }
+ $rowNo++;
+ }
+
+ foreach (range(1, count($cols)) as $c) {
+ $sheet2->getColumnDimension(Coordinate::stringFromColumnIndex($c))->setAutoSize(true);
+ }
+
+ /* =========================================================
+ * SHEET 3 — REVIEW NEEDED
+ * ========================================================= */
+ $sheet3 = $spreadsheet->createSheet();
+ $sheet3->setTitle('Review Needed');
+
+ $mainCols = $EXPORT_COLUMNS['review_main'];
+ $tpaCols = $EXPORT_COLUMNS['review_tpa'];
+
+ // headers
+ $colNo = 1;
+ foreach ($mainCols as $label) {
+ setCell($sheet3, $colNo++, 1, $label);
+ }
+ foreach ($tpaCols as $label) {
+ setCell($sheet3, $colNo++, 1, $label);
+ }
+
+ // rows
+ $rowNo = 2;
+ foreach ($reviewNeeded as $row) {
+
+ // main (DB)
+ $colNo = 1;
+ foreach ($mainCols as $key => $label) {
+ setCell($sheet3, $colNo++, $rowNo, $row[$key] ?? '');
+ }
+
+ $tpaData = [];
+ $notMatching = [];
+
+ if (($row['match']['status'] ?? '') === 'matched') {
+ $tpaData = $row['match']['tpa_record'] ?? [];
+ $notMatching = $row['match']['not_matching'] ?? [];
+ }
+
+ // TPA
+ foreach ($tpaCols as $key => $label) {
+ setCell($sheet3, $colNo++, $rowNo, $tpaData[$key] ?? '');
+ }
+
+ // highlight mismatches
+ foreach ($notMatching as $field) {
+
+ if (isset($mainCols[$field])) {
+ $idx = array_keys($mainCols);
+ $pos = array_search($field, $idx);
+ $cell = Coordinate::stringFromColumnIndex($pos + 1) . $rowNo;
+ $sheet3->getStyle($cell)->getFill()
+ ->setFillType(Fill::FILL_SOLID)
+ ->getStartColor()->setARGB('FFFFFF00');
+ }
+
+ if (isset($tpaCols[$field])) {
+ $idx = array_keys($tpaCols);
+ $pos = array_search($field, $idx);
+ $cell = Coordinate::stringFromColumnIndex(count($mainCols) + $pos + 1) . $rowNo;
+ $sheet3->getStyle($cell)->getFill()
+ ->setFillType(Fill::FILL_SOLID)
+ ->getStartColor()->setARGB('FFFFFF00');
+ }
+ }
+
+ $rowNo++;
+ }
+
+ foreach (range(1, count($mainCols) + count($tpaCols)) as $c) {
+ $sheet3->getColumnDimension(Coordinate::stringFromColumnIndex($c))->setAutoSize(true);
+ }
+
+ /* =========================================================
+ * OUTPUT
+ * ========================================================= */
+ $writer = new Xlsx($spreadsheet);
+
+ if (ob_get_length()) ob_end_clean();
+
+ header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
+ header('Content-Disposition: attachment; filename="' . $filename . '"');
+ header('Cache-Control: max-age=0');
+
+ $writer->save('php://output');
+ exit;
+ }
+
+ public function bulkGenerateEcardAndStoreinS3(array $params = [])
+ {
+ /**
+ * ---------------------------
+ * 1. Detect mode + collect inputs
+ * ---------------------------
+ */
+
+ $client_policy_id = $params['client_policy_id'] ?? null;
+ $emp_code = $params['emp_code'] ?? null;
+ $emp_pk = $params['emp_pk'] ?? null;
+ $batch_size = $params['batch_size'] ?? null;
+ $batch_no = $params['batch_no'] ?? null;
+ $execution_mode = $params['execution_mode'] ?? 'sequential';//parallel
+ $total_batches = $params['total_batches'] ?? 0;//parallel
+
+ if (is_cli()) {
+ $mode = 'CLI';
+
+
+ } elseif (empty($params) && $this->request->getMethod() === 'get') {
+ $mode = 'WEB';
+
+ $client_policy_id = $this->request->getGet('client_policy_id');
+ $emp_code = $this->request->getGet('emp_code');
+ $emp_pk = $this->request->getGet('emp_pk');
+ $execution_mode = $this->request->getGet('execution_mode') ?? 'sequential';
+ $batch_size = (int) ($this->request->getGet('batch_size') ?? 100);
+ if($client_policy_id == null || empty($client_policy_id) || $client_policy_id == '')
+ {
+ return $this->respond(['status' => false, 'code' => 200, 'message' => 'client_policy_id is necessary'], 200);
+ }
+ /**
+ * ---------------------------
+ * 2. Calculate total records
+ * ---------------------------
+ */
+ $total = $this->employeePolicyModel
+ ->join('employees', 'employees.id = employee_polices.employee_id')
+ ->where('employees.emp_status', 'active')
+ ->where('employees.is_active', '1')
+ ->where("employee_polices.tpa_id IS NOT NULL AND employee_polices.tpa_id <> ''")
+ ->where('employee_polices.status', 'active')
+ ->where('employee_polices.is_active', '1')
+ ->where('employee_polices.client_policy_id', $client_policy_id)
+ ->countAllResults();
+
+ $total_batches = (int) ceil($total / $batch_size);
+ // echo $total_batches;die();
+
+
+
+ /**
+ * ---------------------------
+ * 3. Push JOB per batch
+ * ---------------------------
+ */
+ if ($execution_mode === 'parallel') {
+ for ($batch_no = 1; $batch_no <= $total_batches; $batch_no++) {
+ Jobs::addJob([
+ 'job_name' => 'bulkGenerateEcardAndStoreinS3',
+ 'payload' => [
+ 'client_policy_id' => $client_policy_id,
+ 'emp_code' => $emp_code,
+ 'emp_pk' => $emp_pk,
+ 'batch_size' => $batch_size,
+ 'batch_no' => $batch_no,
+ 'total_batches' => $total_batches,
+ 'execution_mode' => 'parallel',
+ ],
+ ]);
+ }
+ }
+
+ if ($execution_mode === 'sequential') {
+ Jobs::addJob([
+ 'job_name' => 'bulkGenerateEcardAndStoreinS3',
+ 'payload' => [
+ 'client_policy_id' => $client_policy_id,
+ 'batch_size' => $batch_size,
+ 'batch_no' => $batch_no ?? 1,
+ 'total_batches' => $total_batches,
+ 'execution_mode' => 'sequential',
+ ],
+ ]);
+ }
+
+ return $this->respond(['status' => true, 'code' => 200, 'message' => 'E-card generation started',
+ 'total' => $total,
+ 'batches' => $total_batches,], 200);
+ // return [
+ // 'status' => true,
+ // 'message' => 'E-card generation started',
+ // 'total' => $total,
+ // 'batches' => $total_batches,
+ // ];
+ }
+ //else {
+ // return true;
+ // }
+
+ /**
+ * ---------------------------
+ * 4. Build query (CLI execution)
+ * ---------------------------
+ */
+ $builder = $this->employeePolicyModel
+ ->select('
+ employee_polices.client_policy_id,
+ employees.emp_code,
+ tpa.short_name,
+ employees.client_id,
+ employee_polices.rand_string,
+ employees.id as emp_id
+ ')
+ ->join('client_policy', 'client_policy.id = employee_polices.client_policy_id')
+ ->join('employees', 'employees.id = employee_polices.employee_id')
+ ->join('tpa', 'tpa.id = client_policy.tpa_id')
+ ->where('employees.emp_status', 'active')
+ ->where('employees.is_active', '1')
+ ->where("employee_polices.tpa_id IS NOT NULL AND employee_polices.tpa_id <> ''")
+ ->where('employee_polices.status', 'active')
+ ->where('employee_polices.is_active', '1')
+ ->where('employee_polices.client_policy_id', $client_policy_id);
+
+ if (!empty($emp_code)) {
+ $builder->where('employees.emp_code', $emp_code);
+ }
+
+ if (!empty($emp_pk)) {
+ $builder->where('employees.id', $emp_pk);
+ }
+
+ /**
+ * ---------------------------
+ * 5. Apply batching (only if provided)
+ * ---------------------------
+ */
+ if (!empty($batch_size) && !empty($batch_no)) {
+ $offset = ($batch_no - 1) * $batch_size;
+ $builder->limit($batch_size, $offset);
+ }
+
+ $res = $builder->findAll();
+
+ /**
+ * ---------------------------
+ * 6. Process batch
+ * ---------------------------
+ */
+ foreach ($res as $row) {
+ $ecard_gen_res = $this->generateIDCardForEmployee(
+ $row['rand_string'],
+ 0,
+ 2 // skip S3 check, force regenerate
+ );
+
+ // print_rr([
+ // 'batch' => $batch_no,
+ // 'emp' => $row['emp_code'],
+ // 'res' => $ecard_gen_res,
+ // ]);
+
+ // echo date('Y-m-d H:i:s') . PHP_EOL;
+ }
+
+ if ($execution_mode === 'sequential' && $batch_no < $total_batches) {
+ Jobs::addJob([
+ 'job_name' => 'bulkGenerateEcardAndStoreinS3',
+ 'payload' => [
+ 'client_policy_id' => $client_policy_id,
+ 'batch_size' => $batch_size,
+ 'batch_no' => ($batch_no + 1),
+ 'total_batches' => $total_batches,
+ 'execution_mode' => 'sequential',
+ ],
+ ]);
+ }
+
+ // echo "BATCH {$batch_no} COMPLETED @ " . date('Y-m-d H:i:s') . PHP_EOL;
+ return array($batch_no);
+ }
+
+
}
diff --git a/app/Controllers/EmployeeMultiEventServiceController.php b/app/Controllers/EmployeeMultiEventServiceController.php
index 782a189b..3c8846e9 100644
--- a/app/Controllers/EmployeeMultiEventServiceController.php
+++ b/app/Controllers/EmployeeMultiEventServiceController.php
@@ -1029,7 +1029,7 @@ class EmployeeMultiEventServiceController extends BaseController
//check physical file
if (!file_exists($file_name_with_path)) {
//file not found update status and reason
- $message = "Physcial file not found";
+ $message = "Physcial file not found - " . $file_name_with_path;
// echo $message;
$this->myLogger->logme('error', ($message . ' for file id ' . $file_id));
$this->fileModel->where('id', $file_id)->set(['status' => 'failed', 'reason' => json_encode(['error_summary' => array_count_values([5]), 'error_data' => $message])])->update();
@@ -1402,7 +1402,7 @@ class EmployeeMultiEventServiceController extends BaseController
//check physical file
if (!file_exists($file_name_with_path)) {
//file not found update status and reason
- $message = "Physcial file not found";
+ $message = "Physcial file not found - " . $file_name_with_path;
$this->myLogger->logme('error', ($message . ' for file id ' . $file_id));
$this->fileModel->where('id', $file_id)->set(['status' => 'failed', 'reason' => json_encode(['error_summary' => array_count_values([5]), 'error_data' => $message])])->update();
return array('error_summary' => [5], 'error_data' => $message);
diff --git a/app/Controllers/JobWorker.php b/app/Controllers/JobWorker.php
index c32da5e6..4a52fc54 100755
--- a/app/Controllers/JobWorker.php
+++ b/app/Controllers/JobWorker.php
@@ -194,6 +194,10 @@ class JobWorker extends AdminController
'type' => 'CC', // Handler Category
'handler' => 'App\Controllers\MediAssistApiController',
],
+ 'bulkGenerateEcardAndStoreinS3' => [
+ 'type' => 'CC', // Handler Category
+ 'handler' => 'App\Controllers\EmployeeController',
+ ]
];
@@ -253,6 +257,8 @@ class JobWorker extends AdminController
// print_r($jobdata);
// echo 'listen';
// die();
+ // $jobdata = ['id' => 11954,'uuid' => '001700c2-8127-4d02-80b3-ea26e7603ccf'];
+ // dd($job);
$query = "
SELECT id, name, payload, uuid
FROM jobs
diff --git a/app/Controllers/MediAssistApiController.php b/app/Controllers/MediAssistApiController.php
index d2b40c67..df595bb5 100644
--- a/app/Controllers/MediAssistApiController.php
+++ b/app/Controllers/MediAssistApiController.php
@@ -6,6 +6,7 @@ use App\Controllers\BaseController;
use App\Models\BatchFileModel;
use App\Models\EmployeePolicyModel;
use App\Models\TpaApiDataModel;
+use App\Models\ClientPolicyModel;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\HTTP\IncomingRequest;
use CodeIgniter\HTTP\RequestInterface;
@@ -25,6 +26,7 @@ class MediAssistApiController extends BaseController
}
+
public function SubmitClaim ($claimId = null)
{
@@ -353,6 +355,7 @@ class MediAssistApiController extends BaseController
// now update DB
+ $batch_file_success = 'success';
$updated = 0;
$employee_policy_ids = [];
foreach ($employeePolicyData as $policy_data) {
@@ -403,6 +406,7 @@ class MediAssistApiController extends BaseController
'gender' => $policy_data['gender'] ?? null,
'dob' => $policy_data['dob'] ?? null,
];
+ $batch_file_success = 'partially success';
log_message(
'error',
@@ -423,7 +427,8 @@ class MediAssistApiController extends BaseController
// 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', 'success')->update();
+
+ $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.");
@@ -540,21 +545,23 @@ class MediAssistApiController extends BaseController
}
- // dd($body);
+
// $body = [
// "policyNo" => "97000063250400000031",
- // "startDate" => "31/08/2025",
- // "endDate" => "01/09/2025",
- // "employeeCode" => "CITPL120193",
+ // "startDate" => "01/11/2025",
+ // "endDate" => "05/11/2025",
+ // "employeeCode" => "",
// "memberID" => "",
// "claimNo" => "",
- // "claimRefNo" => "HOSP4078102577_16092025111030"
+ // "claimRefNo" => ""
// ];
// CALL API
$response = call_third_party_api($url, $method, $headers, $body);
+
+
if ($response['status'] != true || empty($response['data']['claimsData'][0])) {
log_message('error', 'CLAIM STATUS FAILED | for ticket ID: ' . $claimId.' | response: '.json_encode($response));
@@ -613,9 +620,9 @@ class MediAssistApiController extends BaseController
// Maping tpa claim status with local claim Status
if (isset($validStatuses[$currentStatus]))
{
- $updateArray = ['claim_status_id' => $validStatuses[$currentStatus] , 'tpa_claim_status' => $currentStatus , 'tpa_claim_id' => $tpa_claim_no , 'updated_at' => date('Y-m-d H:i:s')];
+ $updateArray = ['claim_status_id' => $validStatuses[$currentStatus] , 'tpa_claim_status' => $currentStatus , 'tpa_claim_id' => $tpa_claim_no, 'claim_number' => $tpa_claim_no, 'updated_at' => date('Y-m-d H:i:s')];
}else{
- $updateArray = ['tpa_claim_status' => $currentStatus , 'tpa_claim_id' => $tpa_claim_no , 'updated_at' => date('Y-m-d H:i:s')];
+ $updateArray = ['tpa_claim_status' => $currentStatus , 'tpa_claim_id' => $tpa_claim_no, 'claim_number' => $tpa_claim_no , 'updated_at' => date('Y-m-d H:i:s')];
}
// UPDATE ticket_master
@@ -794,7 +801,6 @@ class MediAssistApiController extends BaseController
// unlink($file_array['json_file_path']); // delete temp json file
}
-
public function ClaimStatusUpdate()
{
helper('api');
@@ -925,9 +931,9 @@ class MediAssistApiController extends BaseController
// Maping tpa claim status with local claim Status
if (isset($validStatuses[$currentStatus]))
{
- $updateArray = ['claim_status_id' => $validStatuses[$currentStatus] , 'tpa_claim_status' => $currentStatus , 'tpa_claim_id' => $tpa_claim_no , 'updated_at' => date('Y-m-d H:i:s')];
+ $updateArray = ['claim_status_id' => $validStatuses[$currentStatus] , 'tpa_claim_status' => $currentStatus , 'tpa_claim_id' => $tpa_claim_no , 'claim_number' => $tpa_claim_no , 'updated_at' => date('Y-m-d H:i:s')];
}else{
- $updateArray = ['tpa_claim_status' => $currentStatus , 'tpa_claim_id' => $tpa_claim_no , 'updated_at' => date('Y-m-d H:i:s')];
+ $updateArray = ['tpa_claim_status' => $currentStatus , 'tpa_claim_id' => $tpa_claim_no , 'claim_number' => $tpa_claim_no, 'updated_at' => date('Y-m-d H:i:s')];
}
// UPDATE ticket_master
@@ -949,6 +955,328 @@ class MediAssistApiController extends BaseController
]);
}
+ public function syncTpaClaimToNhance()
+ {
+ helper(['api', 'date']);
+
+ $url = getenv('MEDI_ASSIST_API_BASE_URL_CLAIMSTATUS');
+ $method = 'POST';
+
+ $headers = [
+ 'Content-Type: application/json',
+ 'Username:' . getenv('MEDI_ASSIST_API_USERNAME'),
+ 'Password:' . getenv('MEDI_ASSIST_API_PASSWORD'),
+ ];
+
+ // REQUEST DATES
+ $reqStartDate = $this->request->getGet('start_date');
+ $reqEndDate = $this->request->getGet('end_date');
+
+ // If start_date OR end_date is missing → last 7 days
+ if (empty($reqStartDate) || empty($reqEndDate)) {
+
+ $endDateObj = new \DateTime(); // today
+ $startDateObj = (clone $endDateObj)->modify('-6 days');
+
+ } else {
+
+ $startDateObj = new \DateTime($reqStartDate);
+ $endDateObj = new \DateTime($reqEndDate);
+ }
+
+ // Final usable variables
+ $reqStartDate = $startDateObj->format('Y-m-d');
+ $reqEndDate = $endDateObj->format('Y-m-d');
+
+ // Final usable variables
+ $reqStartDate = new \DateTime($reqStartDate);
+ $reqEndDate = new \DateTime($reqEndDate);
+
+
+
+ // FETCH POLICY DATA
+ $policies = $this->db->table('client_policy cp')
+ ->select("
+ cp.policy_no AS policyNo,
+ cp.policy_start_date AS policyStartDate,
+ cp.policy_end_date AS policyEndDate
+ ")
+ ->where('cp.is_active', 1)
+ ->where('cp.policy_type_id', 2)
+ ->where('cp.policy_status', 1)
+ // ->where('cp.policy_no', '97000063250400000031')
+ ->where('cp.tpa_id', $this->mediAssistTpaId)
+ ->get()
+ ->getResultArray();
+
+ if (empty($policies)) {
+ log_message('error', 'No policies found for claim sync');
+ return $this->response->setJSON([
+ 'status' => false,
+ 'message' => 'Policies not found'
+ ]);
+ }
+
+
+
+ $finalResult = [];
+ $errorData = [];
+
+
+ // LOOP POLICIES
+
+ foreach ($policies as $policy) {
+
+ $policyStart = new \DateTime($policy['policyStartDate']);
+ $policyEnd = new \DateTime($policy['policyEndDate']);
+
+
+ // ADJUST DATE RANGE (inside policy period)
+
+ $startDate = max($reqStartDate, $policyStart);
+ $endDate = min($reqEndDate, $policyEnd);
+
+
+ if ($startDate > $endDate) {
+ continue; // No valid range for this policy
+ }
+
+
+ // SPLIT INTO 7-DAY CHUNKS
+
+ $chunkStart = clone $startDate;
+
+ while ($chunkStart <= $endDate) {
+
+ $chunkEnd = clone $chunkStart;
+ $chunkEnd->modify('+6 days');
+
+ if ($chunkEnd > $endDate) {
+ $chunkEnd = clone $endDate;
+ }
+
+
+ // PREPARE BODY
+
+ $body = [
+ "policyNo" => $policy['policyNo'],
+ "startDate" => $chunkStart->format('d/m/Y'),
+ "endDate" => $chunkEnd->format('d/m/Y'),
+ "employeeCode" => "",
+ "memberID" => "",
+ "claimNo" => "",
+ "claimRefNo" => "",
+ ];
+
+
+ // CALL TPA API
+
+ $response = call_third_party_api($url, $method, $headers, $body);
+
+ if (empty($response['status']) || empty($response['data']['claimsData'])) {
+
+ log_message('error','CLAIM STATUS FAILED | ' .'policyNo: ' . $policy['policyNo'] .' | ' . $chunkStart->format('Y-m-d') .' to ' . $chunkEnd->format('Y-m-d') .' | response: ' . json_encode($response) );
+
+ $errorData[] = [
+ 'policy_no' => $policy['policyNo'],
+ 'start' => $chunkStart->format('Y-m-d'),
+ 'end' => $chunkEnd->format('Y-m-d'),
+ ];
+
+ } else {
+
+ $finalResult = array_merge($finalResult,$response['data']['claimsData']);
+ }
+
+ // Move to next chunk
+ $chunkStart->modify('+7 days');
+ }
+ }
+
+
+ // 5️⃣ FINAL RESPONSE
+ foreach ($finalResult as $key => $value) {
+
+ $relationship = strtolower(trim($value['relation'] ?? ''));
+
+ if ($relationship === 'employee') {
+ $relationship = 'self';
+ }
+
+ $ticket = $this->db->table('ticket_master tm')->select("tm.id")
+ ->where('tm.policy_no', $value['policY_NUMBER'])
+ ->where('tm.emp_code', $value['employeE_NO'])
+ ->where('tm.claim_number', $value['tpA_CLAIM_NO'])
+ ->get()
+ ->getRowArray();
+
+ if(!$ticket)
+ {
+
+ // VALID STATUS LIST
+ $validStatuses = [
+
+ "Claim Received" => 1,
+ "In Progress" => 5,
+ "Processed" => 11,
+ "Claim Paid" => 11,
+ "Denied" => 13,
+ "Cancelled" => 13,
+
+ "Information Awaited" => 4,
+ "Confirmation Awaited" => 4,
+ "Information Awaited Reminder" => 4,
+ "Information Awaited Final Reminder" => 4,
+ "Insurer Concurrence Awaited" => 6,
+ "Closed" => 12,
+
+ "Physical Documents Awaited" => 9,
+ "Processed - Payment Initiated" => 10,
+ "Processed - Transaction Failed" => 10,
+ "Processed - Account Details Updated" => 10,
+ "Processed - Debit Note Raised With Insurer for Payment"=> 10,
+ "Processed - Payment Initiated by Insurer" => 10,
+ "Payment - Refunded to Insurer" => 14,
+ "Processed - Processing Payment" => 10,
+ "Processed - Physical Documents Awaited" => 9,
+
+ // Extra Mappings (based on your DB list)
+ "NON ID" => 1,
+ "ID NOT GENERATED" => 2,
+ "CDA" => 3,
+ "REJECTED" => 8,
+ "APPROVED" => 9,
+ "PAYMENT INITIATED" => 10,
+ "SETTLED" => 11,
+ "RETURNED" => 14,
+ "UNDER PROCESS - TPA" => 61,
+ "DENIAL REVIEW AWAITED" => 66,
+ ];
+
+ $currentStatus = trim($value['claim_Current_Status'] ?? '');
+
+ $claimStatusId = $validStatuses[$currentStatus] ?? null;
+
+ if (!$claimStatusId) {
+ log_message('error', 'Unknown claim status: '.$currentStatus);
+ continue;
+ }
+
+ $clientpolicy = $this->db->table('client_policy cp')
+ ->select("
+ cp.id as client_policy_id,
+ cp.client_id ,
+ cp.insurer_id ,
+ cp.tpa_id ,
+ client_rm.id as acm_id
+ ")
+ ->join('client_rm', 'client_rm.client_id = cp.client_id AND client_rm.level = 3', 'left')
+ ->where('cp.policy_no', $value['policY_NUMBER'])
+ ->get()
+ ->getRowArray();
+
+ $employee = $this->db->table('employees e')
+ ->select("
+ e.id as emp_id,
+ e.emp_code ,
+ e2.id as insured_emp_id,
+ ")
+ ->join(
+ 'employees e2',
+ "e2.emp_code = e.emp_code AND e2.relationship = ".$this->db->escape($relationship),
+ 'left'
+ )
+ ->where('e.emp_code', $value['employeE_NO'])
+ ->where('e.relationship', 'self')
+ ->get()
+ ->getRowArray();
+
+
+
+ $claimData = [
+ // Core
+ 'ticket_type_id' => 1,
+ 'claim_status_id' => $claimStatusId,
+ 'policy_no' => $value['policY_NUMBER'] ?? null,
+ 'claim_number' => $value['tpA_CLAIM_NO'] ?? null,
+ 'tpa_claim_id' => $value['tpA_CLAIM_NO'] ?? null,
+
+ // local promary id
+ 'tpa_id' => $clientpolicy['tpa_id'] ?? null,
+ 'insurer_id' => $clientpolicy['insurer_id'] ?? null,
+ 'client_policy_id' => $clientpolicy['client_policy_id'] ?? null,
+ 'client_id' => $clientpolicy['client_id'] ?? null,
+ 'acm_id' => $clientpolicy['acm_id'] ?? null,
+
+ // Employee / Insured
+ 'emp_id' => $employee['emp_id'] ?? null,
+ 'insured_emp_id' => $employee['insured_emp_id'] ?? null,
+ 'emp_code' => $value['employeE_NO'] ?? null,
+ 'emp_name' => $value['employeE_NAME'] ?? null,
+ 'insured_name' => $value['beneficiarY_NAME'] ?? null,
+ 'relationship' => $relationship,
+ 'emp_mobile' => $value['mobile'] ?? null,
+ 'emp_mail' => $value['email'] ?? null,
+
+ // Claim info
+ 'claim_type' => 1,
+ 'mode_of_intimation' => 5,
+ 'claim_amount' => $value['estimateD_CLAIM_AMOUNT']
+ ?? $value['finaL_BILL_AMOUNT']
+ ?? null,
+ 'approved_amount' => $value['claiM_APPROVED_AMOUNT'] ?? null,
+
+ // Dates
+ 'dob' => $this->mediDate($value['datE_OF_BIRTH'] ?? null),
+ 'doa' => $this->mediDate($value['datE_OF_ADMISSION'] ?? null),
+ 'dod' => $this->mediDate($value['datE_OF_DISCHARGE'] ?? null),
+ 'raised_date' => $this->mediDate($value['claiM_REGISTERED_DATE'] ?? null),
+ 'approved_date' => $this->mediDate($value['approved_Date'] ?? null),
+ 'settled_date' => $this->mediDate($value['paiD_DATE'] ?? null),
+
+ // Hospital
+ 'hospital_name' => $value['hospitaL_NAME'] ?? null,
+ 'hospital_address' => $value['hospitaL_ADDRESS'] ?? null,
+ 'hospital_state' => $value['hospitaL_STATE'] ?? null,
+ 'hospital_city' => $value['hospitaL_CITY'] ?? null,
+ 'hospital_pin_code'=> $value['hosP_PINCODE'] ?? null,
+
+ // Payment
+ 'utr_details' => $value['banK_CHEQUE_NO'] ?? null,
+ 'settle_letter' => $value['settlement_LetterLink'] ?? null,
+ ];
+
+ $this->db->table('ticket_master')->insert($claimData);
+
+ log_message(
+ 'info',
+ 'New claim created | Policy: '.$claimData['policy_no'].
+ ' | Claim: '.$claimData['claim_number']
+ );
+
+ }
+
+ }
+
+
+ return $this->response->setJSON([
+ 'status' => true,
+ 'message' => 'TPA claim status sync completed',
+ 'total_records' => count($finalResult),
+ 'result' => $finalResult,
+ 'errors' => $errorData
+ ]);
+ }
+
+
+ public function mediDate($date)
+ {
+ if (empty($date)) return null;
+ $dt = \DateTime::createFromFormat('d/m/Y H:i:s', $date);
+ return $dt ? $dt->format('Y-m-d') : null;
+ }
+
+
diff --git a/app/Controllers/PolicyTransactionController.php b/app/Controllers/PolicyTransactionController.php
index 385a4bff..f106f274 100644
--- a/app/Controllers/PolicyTransactionController.php
+++ b/app/Controllers/PolicyTransactionController.php
@@ -732,6 +732,11 @@
// dd($data);
+ //Fetch POS
+ $data['pos_data'] = db_connect()->table('partner_pos')
+ ->where('is_active', 1)
+ ->get()
+ ->getResultArray();
// Load view
$this->loadLayout('policy_transaction_inception_list', $data);
@@ -985,11 +990,11 @@
$data['co_share'] = 1;
}
- if (!isset($data['bro_payable_by'])) {
- $data['bro_payable_by'] = 0;
- } elseif ($data['bro_payable_by']) {
- $data['bro_payable_by'] = 1;
- }
+ // if (!isset($data['bro_payable_by'])) {
+ // $data['bro_payable_by'] = 0;
+ // } elseif ($data['bro_payable_by']) {
+ // $data['bro_payable_by'] = 1;
+ // }
if (!isset($data['same_as_proposer'])) {
$data['same_as_proposer'] = 0;
@@ -2382,6 +2387,7 @@
'service_person_branch_id' => $issue_type['service_person_branch_id'] ?? null,
'agent_id' => $issue_type['agent_id'] ?? null,
'agent_code' => $issue_type['agent_code'] ?? null,
+ 'pos_id' => $issue_type['pos_id'] ?? null,
];
$data['client_branch_id'] = $client_branch_id;
diff --git a/app/Helpers/utility_helper.php b/app/Helpers/utility_helper.php
index 9095986c..0a6d9e51 100755
--- a/app/Helpers/utility_helper.php
+++ b/app/Helpers/utility_helper.php
@@ -238,7 +238,7 @@ if (!function_exists('generate_download_link')) {
}
if (!function_exists('generate_random_alphanumeric')) {
- function generate_random_alphanumeric($length = 6) {
+ function generate_random_alphanumeric($length = 12) {
$random_string = '';
for ($i = 0; $i < $length; $i++) {
$random_ascii = rand(0, 61);
diff --git a/app/Libraries/S3Service.php b/app/Libraries/S3Service.php
new file mode 100644
index 00000000..872b13ab
--- /dev/null
+++ b/app/Libraries/S3Service.php
@@ -0,0 +1,268 @@
+bucket = getenv('AWS_BUCKET');
+ $this->region = getenv('AWS_DEFAULT_REGION');
+
+ $this->s3Client = new S3Client([
+ 'version' => 'latest',
+ 'region' => $this->region,
+ 'credentials' => [
+ 'key' => getenv('AWS_ACCESS_KEY_ID'),
+ 'secret' => getenv('AWS_SECRET_ACCESS_KEY'),
+ ],
+ ]);
+
+ $this->baseUrl = "https://{$this->bucket}.s3.{$this->region}.amazonaws.com/";
+ // echo $this->baseUrl;die();
+ }
+
+ /**
+ * Upload file to S3
+ *
+ * @param mixed $file File object or file path
+ * @param string $folder Folder path in S3 bucket (optional)
+ * @param string $fileName Custom file name (optional)
+ * @return array ['success' => bool, 'url' => string, 'key' => string, 'message' => string]
+ */
+ public function upload($file, string $folder = '', string $fileName = null): array
+ {
+ try {
+ // Handle CodeIgniter file upload object
+ if (is_object($file) && method_exists($file, 'isValid')) {
+ if (!$file->isValid()) {
+ return [
+ 'success' => false,
+ 'message' => 'Invalid file upload',
+ 'url' => null,
+ 'key' => null
+ ];
+ }
+ $filePath = $file->getTempName();
+ $originalName = $fileName ?? $file->getClientName();
+ } else {
+ // Handle file path string
+ $filePath = $file;
+ $originalName = $fileName ?? basename($file);
+ }
+
+ // Generate unique file name
+ $extension = pathinfo($originalName, PATHINFO_EXTENSION);
+ // $uniqueName = pathinfo($originalName, PATHINFO_FILENAME) . '_' . time() . '.' . $extension;
+ $uniqueName = pathinfo($originalName, PATHINFO_FILENAME) . '.' . $extension;
+
+ // Build S3 key (path)
+ $key = $folder ? rtrim($folder, '/') . '/' . $uniqueName : $uniqueName;
+
+ // Upload to S3
+ // NEW - Faster with streaming and proper content type
+ $finfo = finfo_open(FILEINFO_MIME_TYPE);
+ $mimeType = finfo_file($finfo, $filePath);
+ finfo_close($finfo);
+
+ $result = $this->s3Client->putObject([
+ 'Bucket' => $this->bucket,
+ 'Key' => $key,
+ 'Body' => fopen($filePath, 'rb'), // Stream instead of loading into memory
+ 'ContentType' => $mimeType,
+ // 'ACL' => 'public-read',
+ ]);
+
+ return [
+ 'success' => true,
+ 'url' => $this->baseUrl . $key,
+ 'key' => $key,
+ 'message' => 'File uploaded successfully'
+ ];
+
+ } catch (AwsException $e) {
+ log_message('error', 'S3 Upload Error: ' . $e->getMessage());
+ return [
+ 'success' => false,
+ 'message' => 'Upload failed: ' . $e->getMessage(),
+ 'url' => null,
+ 'key' => null
+ ];
+ }
+ }
+
+ /**
+ * Download file from S3
+ *
+ * @param string $key S3 object key (file path in bucket)
+ * @param string $savePath Local path to save the file (optional)
+ * @return array ['success' => bool, 'path' => string, 'content' => string, 'message' => string]
+ */
+ public function download(string $key, string $savePath = null): array
+ {
+ try {
+ $result = $this->s3Client->getObject([
+ 'Bucket' => $this->bucket,
+ 'Key' => $key,
+ ]);
+
+ $content = (string) $result['Body'];
+
+ // If save path is provided, save to local file
+ if ($savePath) {
+ $directory = dirname($savePath);
+ if (!is_dir($directory)) {
+ mkdir($directory, 0755, true);
+ }
+ file_put_contents($savePath, $content);
+
+ return [
+ 'success' => true,
+ 'path' => $savePath,
+ 'content' => $content,
+ 'message' => 'File downloaded successfully'
+ ];
+ }
+
+ return [
+ 'success' => true,
+ 'path' => null,
+ 'content' => $content,
+ 'message' => 'File content retrieved successfully'
+ ];
+
+ } catch (AwsException $e) {
+ log_message('error', 'S3 Download Error: ' . $e->getMessage());
+ return [
+ 'success' => false,
+ 'path' => null,
+ 'content' => null,
+ 'message' => 'Download failed: ' . $e->getMessage()
+ ];
+ }
+ }
+
+ /**
+ * Get a pre-signed URL for temporary access to a private file
+ *
+ * @param string $key S3 object key
+ * @param int $expiration Expiration time in minutes (default: 60)
+ * @return array ['success' => bool, 'url' => string, 'message' => string]
+ */
+ public function getPresignedUrl(string $key, int $expiration = 60): array
+ {
+ try {
+ $cmd = $this->s3Client->getCommand('GetObject', [
+ 'Bucket' => $this->bucket,
+ 'Key' => $key
+ ]);
+
+ $request = $this->s3Client->createPresignedRequest($cmd, "+{$expiration} minutes");
+ $presignedUrl = (string) $request->getUri();
+
+ return [
+ 'success' => true,
+ 'url' => $presignedUrl,
+ 'message' => 'Pre-signed URL generated successfully'
+ ];
+
+ } catch (AwsException $e) {
+ log_message('error', 'S3 Presigned URL Error: ' . $e->getMessage());
+ return [
+ 'success' => false,
+ 'url' => null,
+ 'message' => 'Failed to generate URL: ' . $e->getMessage()
+ ];
+ }
+ }
+
+ /**
+ * Delete file from S3
+ *
+ * @param string $key S3 object key
+ * @return array ['success' => bool, 'message' => string]
+ */
+ public function delete(string $key): array
+ {
+ try {
+ $this->s3Client->deleteObject([
+ 'Bucket' => $this->bucket,
+ 'Key' => $key,
+ ]);
+
+ return [
+ 'success' => true,
+ 'message' => 'File deleted successfully'
+ ];
+
+ } catch (AwsException $e) {
+ log_message('error', 'S3 Delete Error: ' . $e->getMessage());
+ return [
+ 'success' => false,
+ 'message' => 'Delete failed: ' . $e->getMessage()
+ ];
+ }
+ }
+
+ /**
+ * Check if file exists in S3
+ *
+ * @param string $key S3 object key
+ * @return bool
+ */
+ public function exists(string $key): bool
+ {
+ return $this->s3Client->doesObjectExist($this->bucket, $key);
+ }
+
+ /**
+ * List files in S3 bucket
+ *
+ * @param string $prefix Folder prefix (optional)
+ * @return array ['success' => bool, 'files' => array, 'message' => string]
+ */
+ public function listFiles(string $prefix = ''): array
+ {
+ try {
+ $result = $this->s3Client->listObjectsV2([
+ 'Bucket' => $this->bucket,
+ 'Prefix' => $prefix,
+ ]);
+
+ $files = [];
+ if (isset($result['Contents'])) {
+ foreach ($result['Contents'] as $object) {
+ $files[] = [
+ 'key' => $object['Key'],
+ 'size' => $object['Size'],
+ 'last_modified' => $object['LastModified']->format('Y-m-d H:i:s'),
+ 'url' => $this->baseUrl . $object['Key']
+ ];
+ }
+ }
+
+ return [
+ 'success' => true,
+ 'files' => $files,
+ 'message' => 'Files retrieved successfully'
+ ];
+
+ } catch (AwsException $e) {
+ log_message('error', 'S3 List Error: ' . $e->getMessage());
+ return [
+ 'success' => false,
+ 'files' => [],
+ 'message' => 'Failed to list files: ' . $e->getMessage()
+ ];
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/Models/EmployeePolicyModel.php b/app/Models/EmployeePolicyModel.php
index 16d4a815..0e86d94a 100755
--- a/app/Models/EmployeePolicyModel.php
+++ b/app/Models/EmployeePolicyModel.php
@@ -2139,5 +2139,60 @@ class EmployeePolicyModel extends Model
return $data;
}
+ public function getTPADataVariationReport($client_id, $client_policy_id, $file_id,$emp_codes = [],$all = false)
+ {
+ $result = $this->select([
+ 'employee_polices.*',
+ 'tpam.name as tpa_name',
+ 'tpam.short_name as tpa_short_name',
+ 'emp.relationship',
+ 'emp.relationship_code',
+ 'emp.change_event',
+ 'emp.emp_code',
+ 'emp.name',
+ 'emp.email_corporate',
+ 'emp.dob',
+ 'emp.gender',
+ 'emp.emp_status',
+ 'emp.is_active as emp_is_active',
+ 'emp.mobile as mobile',
+ 'emp.doj',
+ 'emp.basic_pay',
+ 'emp.band as grade',
+ 'cp.policy_no',
+ 'cp.policy_type_id',
+
+ ])
+ ->join('employees emp', 'employee_polices.employee_id = emp.id')
+ ->join('client_policy cp', 'employee_polices.client_policy_id = cp.id')
+ ->join('tpa tpam', 'cp.tpa_id = tpam.id', 'left') //tpam - tpa master
+ // ->orderBy('emp.emp_code', 'ASC')
+ // ->orderBy('employee_polices.employee_id', 'ASC');
+ ->where('employee_polices.status', 'active')
+ ->where('employee_polices.is_active', 1)
+ ->where('emp.is_active', 1)
+ ->where('employee_polices.status !=', 'inactive')
+ ->where('cp.id', $client_policy_id)
+ ->where('employee_polices.client_policy_id', $client_policy_id)
+ ->where('emp.client_id', $client_id);
+
+ if(count($emp_codes) == 0 && $all == false)
+ {
+ $result->where('employee_polices.tpa_id IS NULL');
+ }
+ else if(count($emp_codes) > 0 && $all == false)
+ {
+ $result->whereNotIn('emp.emp_code',$emp_codes);
+ }
+ else if(count($emp_codes) == 0 && $all == true)
+ {
+ $result->groupBy('emp.emp_code');
+ }
+
+ return $result->findAll();
+ // print_r($result);
+ // return $result;
+ }
+
}
\ No newline at end of file
diff --git a/app/Models/PolicyTransactionModel.php b/app/Models/PolicyTransactionModel.php
index 05a734c1..92ab47d8 100644
--- a/app/Models/PolicyTransactionModel.php
+++ b/app/Models/PolicyTransactionModel.php
@@ -88,6 +88,7 @@
'salse_person_manager_id',
'service_person_manager_id',
'service_person_branch_id',
+ 'pos_id',
];
@@ -616,9 +617,9 @@
policy_transaction.*,
DATE_FORMAT(policy_transaction.policy_issue_date, '%d %b %Y') AS policy_issue_date,
DATE_FORMAT(
- IF(policy_transaction.month IS NULL,
+ IF(pt_co_share_details.pt_policy_issue_date IS NULL,
policy_transaction.policy_issue_date,
- policy_transaction.month),
+ pt_co_share_details.pt_policy_issue_date),
'%b %Y') AS policy_issue_month,
CASE
WHEN clients.client_type = 1 THEN 'Group'
diff --git a/app/Views/batch_list.php b/app/Views/batch_list.php
index 123950fb..aa2aa0da 100755
--- a/app/Views/batch_list.php
+++ b/app/Views/batch_list.php
@@ -176,6 +176,12 @@
Download
+
+ Download TPA Variation report
+
+
+
+
diff --git a/app/Views/employee_list.php b/app/Views/employee_list.php
index 45ad39a0..6f6d74dc 100755
--- a/app/Views/employee_list.php
+++ b/app/Views/employee_list.php
@@ -355,11 +355,54 @@
// }
});
+
+ var client_list = ''; // local variable for storing the client branch list
+ var branch_list = ''; // local variable for storing the client branch list
+ var policy_list = ''; // local variable for storing the client policy list
+ var branch_policy = '';
+ var policy_list_by_client = '';
+
+ $(document).ready(function() {
+ getClientAndBranchAndPolicy();
+ })
+
+ //featch client and branch and policy
+ function getClientAndBranchAndPolicy() {
+ $.ajax({
+ url: '= base_url("/util/getClientAndBranchAndPolicy") ?>',
+ type: "GET",
+ dataType: 'json',
+ success: function(res) {
+
+ console.log('getClientAndBranchAndPolicy', res);
+ if (res.status == true) {
+
+ client_list = res.client_data;
+ branch_list = res.branch_data;
+ policy_list = res.policy_data;
+ policy_list_by_client = res.policyListByClient;
+
+ appendClients(client_list);
+ // appendBranch(branch_list);
+ // appendPolicies(policy_list);
+
+ } else {
+ console.log('No data found');
+ }
+
+ },
+ error: function(xhr, status, error) {
+ console.error(xhr.responseText);
+ console.error(status, error);
+ }
+ });
+ }
+
// Declare a global variable to store API response data
- var clientPolicies = [];
- var clientPoliciesWithBranch = {
- policies: []
- };
+ // var clientPolicies = [];
+ // var clientPoliciesWithBranch = {
+ // policies: []
+ // };
var client_id = '= isset($getData) ? $getData['client_id'] : '0' ?>';
var client_branch_id = '= isset($getData) ? $getData['branch_id'] : '0' ?>';
@@ -376,91 +419,91 @@
});
- $(document).ready(function() {
- console.log("document loaded");
- //fetchClientPolicies();
- });
+ // $(document).ready(function() {
+ // console.log("document loaded");
+ // //fetchClientPolicies();
+ // });
- $(window).on("load", function() {
- console.log("window loaded");
- fetchClientPolicies();
- });
+ // $(window).on("load", function() {
+ // console.log("window loaded");
+ // fetchClientPolicies();
+ // });
- function fetchClientPolicies() {
- $('#loader').show();
- var apiURL = '' + 'util/clients-with-policies';
- console.log('fetchClientPolicies');
- // console.log(apiURL);
- $.ajax({
- url: apiURL,
- method: 'GET',
- headers: {
- "Content-Type": "application/json",
- "X-Requested-With": "XMLHttpRequest"
- },
- success: function(response) {
- // console.log(response.code);
- // console.log(response.dataStatus);
- // console.log(response.data);
- if (response.code === 200 && response.dataStatus === true && response.data !== "") {
- try {
- clientPolicies = (response.data);
+ // function fetchClientPolicies() {
+ // $('#loader').show();
+ // var apiURL = '' + 'util/clients-with-policies';
+ // console.log('fetchClientPolicies');
+ // // console.log(apiURL);
+ // $.ajax({
+ // url: apiURL,
+ // method: 'GET',
+ // headers: {
+ // "Content-Type": "application/json",
+ // "X-Requested-With": "XMLHttpRequest"
+ // },
+ // success: function(response) {
+ // // console.log(response.code);
+ // // console.log(response.dataStatus);
+ // // console.log(response.data);
+ // if (response.code === 200 && response.dataStatus === true && response.data !== "") {
+ // try {
+ // clientPolicies = (response.data);
- response.data.forEach(policy => {
- // console.log('policies', policy.policies);
- policy.policies.forEach(p => {
- clientPoliciesWithBranch.policies.push(p);
- });
- });
+ // response.data.forEach(policy => {
+ // // console.log('policies', policy.policies);
+ // policy.policies.forEach(p => {
+ // clientPoliciesWithBranch.policies.push(p);
+ // });
+ // });
- // console.log('1',clientPolicies);
- appendClients(clientPolicies);
+ // // console.log('1',clientPolicies);
+ // appendClients(clientPolicies);
- //this function for reselect the policy
- setTimeout(function() {
- if (client_id != 0) {
- var foundPolicies = clientPolicies.find(function(item) {
- // console.log(typeof item.id)
- return item.id == client_id;
- });
- appendBranch(foundPolicies.branchs);
- }
- }, 500);
+ // //this function for reselect the policy
+ // setTimeout(function() {
+ // if (client_id != 0) {
+ // var foundPolicies = clientPolicies.find(function(item) {
+ // // console.log(typeof item.id)
+ // return item.id == client_id;
+ // });
+ // appendBranch(foundPolicies.branchs);
+ // }
+ // }, 500);
- setTimeout(function() {
- if (client_branch_id != 0) {
+ // setTimeout(function() {
+ // if (client_branch_id != 0) {
- var foundPolicies = clientPoliciesWithBranch.policies.filter(function(item) {
- // console.log('item', item);
- return item.branch_id === client_branch_id;
- });
+ // var foundPolicies = clientPoliciesWithBranch.policies.filter(function(item) {
+ // // console.log('item', item);
+ // return item.branch_id === client_branch_id;
+ // });
- if (foundPolicies) {
- // console.log('foundPolicies', foundPolicies);
- appendPolicies(foundPolicies);
- } else {
- console.log('No policies found for the selected client');
- }
- }
- }, 500);
- //end
+ // if (foundPolicies) {
+ // // console.log('foundPolicies', foundPolicies);
+ // appendPolicies(foundPolicies);
+ // } else {
+ // console.log('No policies found for the selected client');
+ // }
+ // }
+ // }, 500);
+ // //end
- } catch (error) {
- console.error('Error parsing API response data:', error);
- }
- } else if (response.code === 404 && response.dataStatus === false) {
- console.error('no data found', response);
- } else {
- console.error('Something went wrong!');
- }
- },
- error: function(xhr, status, error) {
- console.error('Error fetching data from API:', error);
- }
- });
+ // } catch (error) {
+ // console.error('Error parsing API response data:', error);
+ // }
+ // } else if (response.code === 404 && response.dataStatus === false) {
+ // console.error('no data found', response);
+ // } else {
+ // console.error('Something went wrong!');
+ // }
+ // },
+ // error: function(xhr, status, error) {
+ // console.error('Error fetching data from API:', error);
+ // }
+ // });
- $('#loader').hide();
- }
+ // $('#loader').hide();
+ // }
function appendClients(data) {
var clientID = = isset($getData) ? $getData['client_id'] : '0' ?>;
@@ -507,8 +550,9 @@
// console.log(PolicyID)
$.each(data, function(index, item) {
var option = $('