diff --git a/app/Config/Routes.php b/app/Config/Routes.php index c402419a..8b70f14d 100755 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -770,12 +770,12 @@ $routes->get('fetchUHIDDetails','ICICILombardController::fetchUHIDDetails'); //Third party - testing route - +$routes->get('FhplGetBenefDetails','FhplApiController::FhplGetBenefDetails'); $routes->get('EcardRequest','VidalApiController::EcardRequest'); $routes->get('HospitalNetwork','MediAssistApiController::HospitalNetwork'); $routes->get('VidalGetBenefDetails','VidalApiController::VidalGetBenefDetails'); -$routes->get('ClaimDetail','VidalApiController::ClaimDetail'); -$routes->get('SubmitClaim','MediAssistApiController::SubmitClaim'); +$routes->get('ClaimDetail','FhplApiController::ClaimDetail'); +$routes->get('SubmitClaim','FhplApiController::SubmitClaim'); $routes->get('IntimateClaim','MediAssistApiController::IntimateClaim'); $routes->get('IRSubmission','MediAssistApiController::IRSubmission'); $routes->get('ClaimStatusUpdate','MediAssistApiController::ClaimStatusUpdate'); diff --git a/app/Controllers/FhplApiController.php b/app/Controllers/FhplApiController.php index 33037652..9497433c 100644 --- a/app/Controllers/FhplApiController.php +++ b/app/Controllers/FhplApiController.php @@ -27,13 +27,13 @@ class FhplApiController extends BaseController public function generateAuthToken() { - $url = env('FHPL_TOKEN_URL'); // example: https://uat.fhpl.net/token + $url = env('FHPL_TOKEN_URL'); // x-www-form-urlencoded body $postData = http_build_query([ - 'UserName' => 'TestApi@fhpl', - 'Password' => 'Fhpl@12345', - 'grant_type' => 'password', + 'UserName' => env('FHPL_USER_NAME'), + 'Password' => env('FHPL_PASSWORD'), + 'grant_type' => env('FHPL_GRANT_TYPE'), ]); $ch = curl_init(); @@ -65,9 +65,447 @@ class FhplApiController extends BaseController return $this->response->setJSON([ 'status' => $httpCode === 200, 'http_code' => $httpCode, - 'response' => json_decode($response, true), + 'data' => json_decode($response, true), ]); } + public function SubmitClaim($claimId = 515) + { + helper('api'); + + $data = $this->db->table('ticket_master tm') + ->select(' + tm.id, + tm.emp_mobile as mobileNo, + tm.emp_mail as emailId, + tm.doa as admissionDate, + tm.dod as dischargeDate, + tm.hospital_name as hospitalName, + tm.claim_amount as requestedAmount, + tm.tpa_no as dependentUniqueId, + cp.policy_no as policyNo, + e.emp_code as memberId, + tn.note as disease, + cf.url as filePath + ') + ->join('employees e', 'e.id = tm.emp_id', 'left') + ->join('client_policy cp', 'tm.client_policy_id = cp.id', 'left') + ->join('ticket_notes tn', 'tn.ticket_id = tm.id', 'left') + ->join('claim_files cf', "cf.ticket_id = tm.id AND cf.file_type = 2 AND cf.mime_type='application/pdf'", 'left') + ->where('tm.id', $claimId) + ->get() + ->getRowArray(); + + + if (count($data) && $data['filePath'] == null) { + log_message('error', "TPA CLAIM PUSH FAILED FHPL | claimId: '.$claimId.' - Claim or File Missing"); + return $this->response->setJSON(['status' => false,'message' => 'Claim or File Missing', ]); + } + + // Build absolute file path + $filename = basename($data['filePath']); + $pdfPath = WRITEPATH . 'uploads/claim_files/' . $filename; + + if (!file_exists($pdfPath)) { + log_message('error', "TPA CLAIM PUSH FAILED FHPL | claimId: '.$claimId.' - PDF not found on server"); + return $this->response->setJSON(['status' => false,'message' => 'PDF not found on server']); + } + + // Convert PDF to Base64 + $fileContent = base64_encode(file_get_contents($pdfPath)); + + // Generate FHPL Token + $tokenResponse = json_decode($this->generateAuthToken()->getBody(), true); + if (empty($tokenResponse['data']['access_token'])) { + return $this->response->setJSON(['status' => false,'message' => 'FHPL Token generation failed']); + } + $token = $tokenResponse['data']['access_token']; + + // Build FHPL Request + $body = [ + "IssueID" => $data['dependentUniqueId'], // this key added after seeing the error in responce have to click with fhpl team + "Userid" => getenv('FHPL_USER_NAME'), + "PolicyNo" => "111700-TATAMTORS", // $data['policyNo'], + "UhidNo" => "OIC40830846", //$data['dependentUniqueId'], + "ClaimID" => (string) $data['id'], + "DOA" => "2025-10-11",//date('Y-m-d', strtotime($data['admissionDate'])), + "DateofDischarge"=> $data['dischargeDate'] ? date('Y-m-d', strtotime($data['dischargeDate'])) : null, + "ClaimedAmount" => (float) $data['requestedAmount'], + "DocumentType" => 20, // Fresh Claim + "PayeeName" => $data['memberId'], + "HospitalName" => $data['hospitalName'], + "MobileNo" => $data['mobileNo'], + "Documents" => [ + [ + "documentName" => $filename, + "documentCategory" => "IRR", + "filecontent" => $fileContent + ] + ] + ]; + + $url = getenv('FHPL_BASE_URL') . "/api/ClaimSubmission"; + + $headers = [ + "Authorization: Bearer " . $token, + "Content-Type: application/json" + ]; + + log_message('error', 'TPA CLAIM PUSH FHPL | claimId: '.$claimId.' | payload: '.json_encode($body)); + + $response = call_third_party_api($url, 'POST', $headers, $body); + + log_message('error', 'FHPL RESPONSE | ' . json_encode($response)); + + if($response['status'] != true){ + log_message('error', 'TPA CLAIM PUSH FAILED FHPL | claimId: '.$claimId.' | response: '.json_encode($response)); + $this->db->table('ticket_master') + ->where('id',$claimId) + ->update([ 'tpa_push_response' => json_encode($response) ]); + return; + } + + + if ($response['status'] === true && !empty($response['data'][0]['ClaimsInfo'])) + { + $claimsInfo = json_decode($response['data'][0]['ClaimsInfo'], true); + + if (!empty($claimsInfo[0]['ClaimID'])) { + + $fhplClaimNo = $claimsInfo[0]['ClaimID']; + + $this->db->table('ticket_master') + ->where('id', $claimId) + ->update([ + 'claim_number' => $fhplClaimNo, + 'tpa_claim_id' => $fhplClaimNo, + 'tpa_claim_push_reference_no' => $fhplClaimNo, + 'updated_at' => date('Y-m-d H:i:s') + ]); + + log_message('error', 'TPA CLAIM PUSH SUCCESS FHPL | claimId: '.$claimId.' | claimNO: '.$fhplClaimNo); + + } + } + + + return $this->response->setJSON($response); + } + + public function ClaimDetail($claimId = 515) + { + helper('api'); + + $ticket = $this->db->table('ticket_master tm') + ->select("tm.id, tm.tpa_claim_id as claimNo, cp.policy_no , cp.policy_start_date , cp.policy_end_date") + ->join('client_policy cp','tm.client_policy_id=cp.id') + ->where('tm.id',$claimId) + ->get()->getRowArray(); + + + if(!$ticket) return $this->response->setJSON(['status'=>false,'message'=>'Invalid claim']); + + // Generate FHPL Token + $tokenResponse = json_decode($this->generateAuthToken()->getBody(), true); + + if (empty($tokenResponse['data']['access_token'])) { + return $this->response->setJSON(['status' => false,'message' => 'FHPL Token generation failed']); + } + + $token = $tokenResponse['data']['access_token']; + + $url = getenv('FHPL_BASE_URL')."/api/GetTPA_ClaimsDetails"; + + $body = [ + "UserName" => getenv('FHPL_USER_NAME'), + "Password" => getenv('FHPL_PASSWORD'), + "PolicyNumber" => "GHI-81-25-00087313-000",//$ticket['policy_no'], + "Fromdate" => "2025-04-26",//$ticket['claimNo'], + "Todate" => "2025-04-27",//$ticket['claimNo'], + ]; + + $headers = ["Authorization: Bearer ".$token,"Content-Type: application/json"]; + + $response = call_third_party_api($url,'POST',$headers,$body); + + // dd($response); + + if (empty($response['data'][0])) { + log_message('error', 'CLAIM STATUS FAILED | for ticket ID: ' . $claimId.' | response: '.json_encode($response)); + + return $this->response->setJSON([ + 'status' => false, + 'message' => 'API call failed.', + 'data' => $response + ]); + } + + + $status = null; + + // find this claim + foreach($response['data'] as $row){ + if($row['CLAIM_ID']==$ticket['claimNo']){ + $status = $row['CLAIM_STATUS']; + } + } + + $map = [ + "In-Progress" => 5, + "Under Process" => 5, + "Query" => 4, + "Paid" => 11, + "Rejected" => 8, + "Approved" => 8, + "Required Information" => 4, + ]; + + if( $status != null && isset($map[$status])) + { + $this->db->table('ticket_master')->where('id',$claimId)->update(['claim_status_id'=>$map[$status],'tpa_claim_status'=>$status]); + // LOG UPDATE + log_message('error', "CLAIM STATUS SUCCESS | Updated ticket ID $claimId with claim status: $status"); + } + + + + return $this->response->setJSON([ + 'status' => true, + 'message' => 'Claim status updated.', + 'updated_status' => $status, + 'api_response' => $response + ]); + + } + + public function ClaimStatusUpdate() + { + helper('api'); + + $tickets = $this->db->table('ticket_master tm') + ->select("tm.id,tm.tpa_claim_id,cp.policy_no") + ->join('client_policy cp','tm.client_policy_id=cp.id') + ->where('tm.tpa_claim_id IS NOT NULL') + ->get()->getResultArray(); + + $count=0; + + foreach($tickets as $t){ + $this->ClaimDetail($t['id']); + $count++; + } + + return $this->response->setJSON(['status'=>true,'updated'=>$count]); + } + + public function EcardRequest($employeeId,$policyNo,$uhid) + { + helper('api'); + + // Generate FHPL Token + $tokenResponse = json_decode($this->generateAuthToken()->getBody(), true); + + if (empty($tokenResponse['data']['access_token'])) { + return $this->response->setJSON(['status' => false,'message' => 'FHPL Token generation failed']); + } + + // Generate FHPL Token + $tokenResponse = json_decode($this->generateAuthToken()->getBody(), true); + + if (empty($tokenResponse['data']['access_token'])) { + return $this->response->setJSON(['status' => false,'message' => 'FHPL Token generation failed']); + } + + $token = $tokenResponse['data']['access_token']; + + $url = getenv('FHPL_BASE_URL')."/api/GetEcard"; + + $body = [ + "UserName" => getenv('FHPL_USER_NAME'), + "Password" => getenv('FHPL_PASSWORD'), + "PolicyNumber" => $policyNo, + "EmployeeID" => $employeeId + ]; + + $headers = ["Authorization: Bearer ".$token,"Content-Type: application/json"]; + + $response = call_third_party_api($url,'POST',$headers,$body); + + if(($response['data']['STATUS'] ?? '')=='SUCCESS'){ + return $response['data']['E_Card']; + } + + return null; + } + + public function FhplGetBenefDetails($requestData = null) + { + helper('api'); + + $policyNo = $requestData['policy_no'] ?? "10/12/2025/16/17"; + $client_policy_id = $requestData['client_policy_id'] ?? 0; + + // Generate FHPL Token + $tokenResponse = json_decode($this->generateAuthToken()->getBody(), true); + if (empty($tokenResponse['data']['access_token'])) { + return $this->response->setJSON(['status' => false,'message' => 'FHPL Token generation failed']); + } + $token = $tokenResponse['data']['access_token']; + + $url = getenv('FHPL_BASE_URL')."/api/GetEnrollmentDetailsPolicy"; + + $headers = [ + "Authorization: Bearer ".$token, + "Content-Type: application/json" + ]; + + $startIndex = 0; + $range = 100; + $allMembers = []; + + do { + $body = [ + "UserName" => getenv('FHPL_USER_NAME'), + "Password" => getenv('FHPL_PASSWORD'), + "PolicyNumber" => $policyNo, + "StartIndex" => $startIndex, + "Range" => $range + ]; + + $response = call_third_party_api($url,'POST',$headers,$body); + + dd($response); + + if(empty($response['data']['Members'])){ + break; + } + + $allMembers = array_merge($allMembers,$response['data']['Members']); + + $startIndex += $range; + + } while($startIndex < ($response['data']['Total'] ?? 0)); + + + dd($allMembers); + + // Now same matching logic you already have + $employeePolicyModel = new EmployeePolicyModel(); + + $employeePolicyData = $employeePolicyModel + ->join('employees','employees.id=employee_polices.employee_id') + ->where('employee_polices.client_policy_id',$client_policy_id) + ->where('employee_polices.tpa_id IS NULL') + ->findAll(); + + $updated = 0; + + foreach($employeePolicyData as $policy){ + foreach($allMembers as $m){ + + if( + strtolower(trim($policy['name']))==strtolower(trim($m['Name'])) && + $policy['emp_code']==$m['MemberID'] && + strtolower($policy['relationship'])==strtolower($m['Relation']) + ){ + $this->db->table('employee_polices') + ->where('id',$policy['emp_policy_id']) + ->update(['tpa_id'=>$m['UHID']]); + + $updated++; + } + } + } + + return [ + 'status'=>true, + 'total_fetched'=>count($allMembers), + 'updated'=>$updated + ]; + } + + public function syncFhplClaimsToNhance() + { + helper('api'); + + // Generate FHPL Token + $tokenResponse = json_decode($this->generateAuthToken()->getBody(), true); + + if (empty($tokenResponse['data']['access_token'])) { + return $this->response->setJSON(['status' => false,'message' => 'FHPL Token generation failed']); + } + + $token = $tokenResponse['data']['access_token']; + + $url = getenv('FHPL_BASE_URL')."/api/GetTPA_ClaimsDetails"; + + $headers = [ + "Authorization: Bearer ".$token, + "Content-Type: application/json" + ]; + + $policies = $this->db->table('client_policy') + ->where('tpa_id',$this->fhplTpaId) + ->get()->getResultArray(); + + $finalResult=[]; + + foreach($policies as $policy){ + + $body = [ + "UserName" => getenv('FHPL_USER_NAME'), + "Password" => getenv('FHPL_PASSWORD'), + "PolicyNumber" => $policy['policy_no'], + "Fromdate" => $policy['policy_start_date'], + "Todate" => $policy['policy_end_date'] + ]; + + $response = call_third_party_api($url,'POST',$headers,$body); + + if(!empty($response['data'])){ + $finalResult = array_merge($finalResult,$response['data']); + } + } + + // Insert / update ticket_master same way you already do for MediAssist + foreach($finalResult as $row){ + + $status = $row['CLAIM_STATUS']; + + $map = [ + "Under Process"=>5, + "Paid"=>11, + "Rejected"=>8, + "Approved"=>8 + ]; + + $claimStatus = $map[$status] ?? 1; + + $this->db->table('ticket_master')->insert([ + 'policy_no'=>$row['POLICY_NO'], + 'claim_number'=>$row['CLAIM_ID'], + 'tpa_claim_id'=>$row['CLAIM_ID'], + 'emp_code'=>$row['EMPLOYEE_NO'], + 'insured_name'=>$row['PATIENT_NAME'], + 'claim_amount'=>$row['CLAIM_AMOUNT'], + 'hospital_name'=>$row['HOSPITAL_NAME'], + 'doa'=>$row['DATE_OF_ADMISSION'], + 'dod'=>$row['DATE_OF_DISCHARGE'], + 'claim_status_id'=>$claimStatus, + 'tpa_id'=>$this->fhplTpaId + ]); + } + + return ['status'=>true,'total'=>count($finalResult)]; + } + + + + + + + + + } diff --git a/app/Controllers/VidalApiController.php b/app/Controllers/VidalApiController.php index a6c45242..0c0bc293 100644 --- a/app/Controllers/VidalApiController.php +++ b/app/Controllers/VidalApiController.php @@ -112,7 +112,7 @@ class VidalApiController extends BaseController ]; } - public function SubmitClaim ($claimId = 515) + public function SubmitClaim ($claimId = null) //515 { helper('api'); diff --git a/app/Helpers/JWTToken.php b/app/Helpers/JWTToken.php index 73978ddb..311182d4 100755 --- a/app/Helpers/JWTToken.php +++ b/app/Helpers/JWTToken.php @@ -38,6 +38,7 @@ class JWTToken }else{ $models = new LevelContactModel(); + $id = $request_data['post_hr_id']; $models->update($id, $data); }