MERGE_TEST_BUG_FIXES

This commit is contained in:
Ubuntu 2026-08-07 15:50:01 +05:30
commit 3fe52985fc
2 changed files with 235 additions and 203 deletions

View File

@ -1714,9 +1714,9 @@ class EmployeeRestController extends AdminController
if ($value > 0 && $key != 'elders_count') { if ($value > 0 && $key != 'elders_count') {
if ($value != 0 && $key === 'childrens') { if ($value != 0 && $key === 'childrens') {
if ($value > 2) { // if ($value > 2) {
$value = 2; // $value = 2;
} // }
for ($i = 1; $i <= $value; $i++) { for ($i = 1; $i <= $value; $i++) {
$result[] = "child" . $i; $result[] = "child" . $i;
@ -7199,9 +7199,9 @@ class EmployeeRestController extends AdminController
} }
/** /**
* Policy-wise employee details API. * Policy-wise employee details API (chat context).
* Input: emp_code, client_id (numeric id or MD5 hash of id) * Input: emp_code, client_id (numeric id or MD5 hash of id)
* Returns one object per enrolled active policy with members, claims, premium and terms. * user_key format: {employee_id}_{client_id}
*/ */
public function getEmployeePolicyWiseDetails() public function getEmployeePolicyWiseDetails()
{ {
@ -7243,6 +7243,22 @@ class EmployeeRestController extends AdminController
], 200); ], 200);
} }
$selfEmployee = null;
foreach ($employeeRows as $row) {
$rel = strtolower(trim((string) ($row['relationship'] ?? '')));
$floater = strtolower(trim((string) ($row['family_floater_key'] ?? '')));
if ($rel === 'self' || $floater === 'self') {
$selfEmployee = $row;
break;
}
}
if ($selfEmployee === null) {
$selfEmployee = $employeeRows[0];
}
$employeeId = (string) $selfEmployee['id'];
$clientIdStr = (string) $client_id;
$userKey = $employeeId . '_' . $clientIdStr;
$employeeIds = array_column($employeeRows, 'id'); $employeeIds = array_column($employeeRows, 'id');
$dayInterval = 10; $dayInterval = 10;
@ -7283,11 +7299,10 @@ class EmployeeRestController extends AdminController
], 200); ], 200);
} }
$result = []; $policies = [];
foreach ($enrolledPolicies as $policy) { foreach ($enrolledPolicies as $policy) {
$clientPolicyId = (int) $policy['id']; $clientPolicyId = (int) $policy['id'];
$policyTypeId = (int) $policy['policy_type_id']; $policyTypeId = (int) $policy['policy_type_id'];
$ticketMeta = $this->getPolicyTicketMeta($policyTypeId); $ticketMeta = $this->getPolicyTicketMeta($policyTypeId);
$termsRaw = json_decode($policy['policy_terms'] ?? '{}'); $termsRaw = json_decode($policy['policy_terms'] ?? '{}');
$termsArray = json_decode($policy['policy_terms'] ?? '{}', true) ?: []; $termsArray = json_decode($policy['policy_terms'] ?? '{}', true) ?: [];
@ -7298,22 +7313,10 @@ class EmployeeRestController extends AdminController
employees.emp_code, employees.emp_code,
employees.name, employees.name,
employees.relationship, employees.relationship,
employees.relationship_code,
employees.family_floater_key, employees.family_floater_key,
employees.gender, employees.gender,
employees.dob, employees.dob,
employees.doj,
employees.email_personal,
employees.email_corporate,
employees.mobile,
employees.band,
employees.designation,
employees.unit,
employees.emp_status, employees.emp_status,
employees.basic_pay,
employees.client_id,
employees.client_branch_id,
employee_polices.id AS emp_policy_id,
employee_polices.uhid, employee_polices.uhid,
employee_polices.tpa_id, employee_polices.tpa_id,
employee_polices.rand_string, employee_polices.rand_string,
@ -7324,12 +7327,7 @@ class EmployeeRestController extends AdminController
employee_polices.payable_employee, employee_polices.payable_employee,
employee_polices.date_coverage, employee_polices.date_coverage,
employee_polices.policy_end_date AS member_policy_end_date, employee_polices.policy_end_date AS member_policy_end_date,
employee_polices.days, employee_polices.status AS emp_policy_status
employee_polices.status AS emp_policy_status,
employee_polices.pre_existing_alignments,
employee_polices.claim_status,
employee_polices.date_of_exit,
employee_polices.reason_for_exit
') ')
->join('employees', 'employees.id = employee_polices.employee_id', 'left') ->join('employees', 'employees.id = employee_polices.employee_id', 'left')
->whereIn('employee_polices.employee_id', $employeeIds) ->whereIn('employee_polices.employee_id', $employeeIds)
@ -7343,52 +7341,56 @@ class EmployeeRestController extends AdminController
continue; continue;
} }
$empDetails = $this->buildEmpDetailsByRelation($coveredMembers); $premiumSummary = $this->buildPremiumDetails($coveredMembers, $policyTypeId);
$premiumDetails = $this->buildPremiumDetails($coveredMembers, $policyTypeId); $claimsSummary = $this->getClaimsForPolicy($emp_code, $clientPolicyId);
$claimDetails = $this->getClaimsForPolicy($emp_code, $clientPolicyId); $sumInsured = $premiumSummary['sum_insured'];
$displayTerms = []; $benefits = [];
if (!empty($termsArray['enrollment_display_key'])) { if (!empty($termsArray['enrollment_display_key']) && is_array($termsArray['enrollment_display_key'])) {
$displayTerms = $termsArray['enrollment_display_key']; $benefits = $termsArray['enrollment_display_key'];
} else { } else {
$displayTerms = $this->policyTermsFiter($termsRaw, $ticketMeta['policy_group']); $benefits = $this->policyTermsFiter($termsRaw, $ticketMeta['policy_group']);
} }
$result[] = [ $policyTerms = [];
'policy_details' => [ if (!empty($termsArray['enrollment_display_key']) && is_array($termsArray['enrollment_display_key'])) {
'client_id' => (int) $policy['client_id'], $policyTerms = $termsArray['enrollment_display_key'];
'client_branch_id' => (int) $policy['client_branch_id'], }
'client_policy_id' => $clientPolicyId,
'policy_no' => $policy['policy_no'], $familyFloaters = $this->extractFamilyFloaters($termsArray);
'policy_type_id' => $policyTypeId, $isFamilyFloater = true;
if (isset($termsArray['family_floater']) && strpos(strtolower((string) $termsArray['family_floater']), 'no') !== false) {
$isFamilyFloater = false;
}
$policies[] = [
'policy_type' => $policy['policy_type'], 'policy_type' => $policy['policy_type'],
'policy_no' => $policy['policy_no'],
'policy_name' => $policy['policy_type'], 'policy_name' => $policy['policy_type'],
'heading' => $policy['policy_long_name'], 'heading' => $policy['policy_long_name'],
'insurer_name' => $policy['insurer_name'], 'insurer_name' => $policy['insurer_name'],
'tpa_name' => $policy['tpa_name'], 'tpa_name' => $policy['tpa_name'] ?: null,
'network_hospitals_url' => $policy['network_hospitals_url'], 'network_hospitals_url' => $policy['network_hospitals_url'] ?: null,
'policy_status' => ((int) $policy['policy_status'] === 1) ? 'Active' : 'Inactive',
'policy_start_date' => $this->convertDateFormatDisplay($policy['policy_start_date']), 'policy_start_date' => $this->convertDateFormatDisplay($policy['policy_start_date']),
'policy_end_date' => $this->convertDateFormatDisplay($policy['policy_end_date']), 'policy_end_date' => $this->convertDateFormatDisplay($policy['policy_end_date']),
'claims_grace_date' => $this->convertDateFormatDisplay($policy['claims_grace_date']), 'claims_grace_date' => $this->convertDateFormatDisplay($policy['claims_grace_date']),
'policy_status' => ((int) $policy['policy_status'] === 1) ? 'Active' : 'InActive',
'is_addon' => (int) $policy['is_addon'],
'open_for_enrollment' => (int) ($policy['open_for_enrollment'] ?? 0),
'inception_type' => $policy['inception_type'],
'disclaimer' => $policy['disclaimer'],
'sum_insured_label' => $ticketMeta['sum_insured_label'], 'sum_insured_label' => $ticketMeta['sum_insured_label'],
'sum_insured' => (string) $sumInsured,
'sum_insured_display' => $this->formatAmountDisplay($sumInsured),
'claim_subject' => $ticketMeta['claim_subject'], 'claim_subject' => $ticketMeta['claim_subject'],
'terms_and_conditions' => [ 'family_floater' => $isFamilyFloater,
'raw' => $termsArray, 'family_floaters' => $familyFloaters,
'display' => $displayTerms, 'age_limits' => $this->extractAgeLimits($termsRaw),
], 'members' => $this->buildPolicyMembersList($coveredMembers),
'premium_details' => $premiumDetails, 'benefits' => $benefits ?: new \stdClass(),
'claim_details' => $claimDetails, 'policy_terms' => $policyTerms ?: new \stdClass(),
'emp_details' => $empDetails, 'premium_summary' => $premiumSummary,
], 'claims_summary' => $claimsSummary,
]; ];
} }
if (empty($result)) { if (empty($policies)) {
return $this->respond([ return $this->respond([
'status' => 'failed', 'status' => 'failed',
'code' => 404, 'code' => 404,
@ -7400,9 +7402,22 @@ class EmployeeRestController extends AdminController
return $this->respond([ return $this->respond([
'status' => 'success', 'status' => 'success',
'code' => 200, 'code' => 200,
'message' => 'Employee policy-wise details fetched successfully', 'message' => 'Policy chat context fetched successfully',
'data' => [ 'data' => [
'policy_data' => $result, 'employee_id' => $employeeId,
'client_id' => $clientIdStr,
'user_key' => $userKey,
'employee_summary' => [
'name' => $selfEmployee['name'] ?? null,
'emp_code' => $selfEmployee['emp_code'] ?? $emp_code,
'designation' => $selfEmployee['designation'] ?? null,
'band' => $selfEmployee['band'] ?? null,
'unit' => $selfEmployee['unit'] ?? null,
'emp_status' => $selfEmployee['emp_status'] ?? null,
'email_corporate' => $selfEmployee['email_corporate'] ?? null,
'mobile' => $selfEmployee['mobile'] ?? null,
],
'policies' => $policies,
'support' => $this->getClientSupportContacts((int) $client_id), 'support' => $this->getClientSupportContacts((int) $client_id),
], ],
], 200); ], 200);
@ -7523,104 +7538,115 @@ class EmployeeRestController extends AdminController
]; ];
} }
/** private function extractFamilyFloaters(array $termsArray): array
* Group covered members as:
* self => object, spouse/child/parent/parent_in_law/... => array
*/
private function buildEmpDetailsByRelation(array $coveredMembers): array
{ {
$empDetails = [ $floaters = $termsArray['family_floaters'] ?? [];
'self' => new \stdClass(), if (!is_array($floaters)) {
$floaters = [];
}
return [
'self' => $floaters['self'] ?? 0,
'spouse' => $floaters['spouse'] ?? 0,
'childrens' => $floaters['childrens'] ?? 0,
'parents' => $floaters['parents'] ?? 0,
'parents-in-law' => $floaters['parents-in-law'] ?? ($floaters['parents_in_law'] ?? 0),
'either-parents-pil' => $floaters['either-parents-pil'] ?? 0,
'elders_count' => $floaters['elders_count'] ?? null,
];
}
private function extractAgeLimits($termsRaw): array
{
$defaults = [
'self' => ['min' => 18, 'max' => 60],
'spouse' => ['min' => 18, 'max' => 60],
'child' => ['min' => 0, 'max' => 25],
'elders' => ['min' => 18, 'max' => 60],
]; ];
foreach ($coveredMembers as $member) { if (is_object($termsRaw) && isset($termsRaw->age_ratio) && is_object($termsRaw->age_ratio)) {
$relationKey = $this->normalizeRelationKey($member); $ageRatio = $termsRaw->age_ratio;
$memberData = $this->formatMemberDetails($member); return [
'self' => [
if ($relationKey === 'self') { 'min' => $ageRatio->self->min ?? $defaults['self']['min'],
$empDetails['self'] = $memberData; 'max' => $ageRatio->self->max ?? $defaults['self']['max'],
continue; ],
'spouse' => [
'min' => $ageRatio->spouse->min ?? $defaults['spouse']['min'],
'max' => $ageRatio->spouse->max ?? $defaults['spouse']['max'],
],
'child' => [
'min' => $ageRatio->child->min ?? $defaults['child']['min'],
'max' => $ageRatio->child->max ?? $defaults['child']['max'],
],
'elders' => [
'min' => $ageRatio->elders->min ?? $defaults['elders']['min'],
'max' => $ageRatio->elders->max ?? $defaults['elders']['max'],
],
];
} }
if (!isset($empDetails[$relationKey]) || !is_array($empDetails[$relationKey])) { return $defaults;
$empDetails[$relationKey] = [];
}
$empDetails[$relationKey][] = $memberData;
} }
return $empDetails; private function buildPolicyMembersList(array $coveredMembers): array
}
private function normalizeRelationKey(array $member): string
{ {
$floaterKey = strtolower(trim((string) ($member['family_floater_key'] ?? ''))); $members = [];
$floaterKey = preg_replace('/\d+/', '', $floaterKey); foreach ($coveredMembers as $member) {
$members[] = $this->formatChatContextMember($member);
if (in_array($floaterKey, ['self', 'spouse', 'child', 'parent', 'parent_in_law'], true)) {
return $floaterKey;
} }
$relationship = trim((string) ($member['relationship'] ?? '')); usort($members, function ($a, $b) {
if (strcasecmp($relationship, 'Self') === 0) { $order = ['self' => 0, 'spouse' => 1, 'son' => 2, 'daughter' => 3];
return 'self'; $aKey = strtolower((string) ($a['relationship'] ?? ''));
$bKey = strtolower((string) ($b['relationship'] ?? ''));
return ($order[$aKey] ?? 99) <=> ($order[$bKey] ?? 99);
});
return $members;
} }
$mapped = $this->RelationshipMap($relationship); private function formatChatContextMember(array $member): array
if (!empty($mapped)) {
return $mapped;
}
$normalized = strtolower(str_replace([' ', '-'], '_', $relationship));
return $normalized !== '' ? $normalized : 'other';
}
private function formatMemberDetails(array $member): array
{ {
$eCardDownload = null; $eCardDownload = null;
if (!empty($member['tpa_id']) && !empty($member['rand_string'])) { if (!empty($member['tpa_id']) && !empty($member['rand_string'])) {
$eCardDownload = base_url('download-e-card/') . $member['rand_string'] . '/1'; $eCardDownload = base_url('download-e-card/') . $member['rand_string'] . '/1';
} }
$basicCoverSi = $member['basic_cover_si'] ?? 0;
return [ return [
'employee_id' => (int) ($member['employee_id'] ?? 0),
'emp_policy_id' => (int) ($member['emp_policy_id'] ?? 0),
'emp_code' => $member['emp_code'] ?? null,
'name' => $member['name'] ?? null, 'name' => $member['name'] ?? null,
'relationship' => $member['relationship'] ?? null, 'relationship' => $member['relationship'] ?? null,
'relationship_code' => $member['relationship_code'] ?? null,
'family_floater_key' => $member['family_floater_key'] ?? null,
'gender' => $member['gender'] ?? null, 'gender' => $member['gender'] ?? null,
'dob' => !empty($member['dob']) ? $this->convertDateFormatDMY($member['dob']) : null, 'dob' => !empty($member['dob']) ? $this->convertDateFormatDMY($member['dob']) : null,
'doj' => !empty($member['doj']) ? $this->convertDateFormatDMY($member['doj']) : null,
'email_personal' => $member['email_personal'] ?? null,
'email_corporate' => $member['email_corporate'] ?? null,
'mobile' => $member['mobile'] ?? null,
'band' => $member['band'] ?? null,
'designation' => $member['designation'] ?? null,
'unit' => $member['unit'] ?? null,
'emp_status' => $member['emp_status'] ?? null, 'emp_status' => $member['emp_status'] ?? null,
'basic_pay' => $member['basic_pay'] ?? null, 'basic_cover_si' => $basicCoverSi,
'client_id' => isset($member['client_id']) ? (int) $member['client_id'] : null, 'basic_cover_si_display' => $this->formatAmountDisplay($basicCoverSi),
'client_branch_id' => isset($member['client_branch_id']) ? (int) $member['client_branch_id'] : null, 'premium' => $member['premium'] ?? null,
'uhid' => $member['uhid'] ?? null, 'gst' => $member['gst'] ?? null,
'tpa_id' => $member['tpa_id'] ?? null,
'eCardDownload' => $eCardDownload,
'basic_cover_si' => $member['basic_cover_si'] ?? 0,
'premium' => $member['premium'] ?? 0,
'rata_premimum' => $member['rata_premimum'] ?? 0,
'gst' => $member['gst'] ?? 0,
'payable_employee' => isset($member['payable_employee']) ? (int) $member['payable_employee'] : 0, 'payable_employee' => isset($member['payable_employee']) ? (int) $member['payable_employee'] : 0,
'date_coverage' => !empty($member['date_coverage']) ? $this->convertDateFormatDMY($member['date_coverage']) : null, 'date_coverage' => !empty($member['date_coverage']) ? $this->convertDateFormatDMY($member['date_coverage']) : null,
'member_policy_end_date' => !empty($member['member_policy_end_date']) ? $this->convertDateFormatDMY($member['member_policy_end_date']) : null, 'member_policy_end_date' => !empty($member['member_policy_end_date']) ? $this->convertDateFormatDMY($member['member_policy_end_date']) : null,
'days' => $member['days'] ?? null,
'emp_policy_status' => $member['emp_policy_status'] ?? null, 'emp_policy_status' => $member['emp_policy_status'] ?? null,
'pre_existing_alignments' => $member['pre_existing_alignments'] ?? null, 'eCardDownload' => $eCardDownload,
'claim_status' => $member['claim_status'] ?? null,
'date_of_exit' => !empty($member['date_of_exit']) ? $this->convertDateFormatDMY($member['date_of_exit']) : null,
'reason_for_exit' => $member['reason_for_exit'] ?? null,
]; ];
} }
private function formatAmountDisplay($amount): string
{
if ($amount === null || $amount === '') {
return '0';
}
if (function_exists('formatIndianCurrency')) {
return (string) formatIndianCurrency($amount);
}
return number_format((float) $amount, 0, '.', ',');
}
private function buildPremiumDetails(array $coveredMembers, int $policyTypeId): array private function buildPremiumDetails(array $coveredMembers, int $policyTypeId): array
{ {
$siValue = 0; $siValue = 0;
@ -7637,7 +7663,6 @@ class EmployeeRestController extends AdminController
$rataTotal += (float) ($member['rata_premimum'] ?? 0); $rataTotal += (float) ($member['rata_premimum'] ?? 0);
} }
// Match existing app behaviour: hide premium/gst for base GPA/GMC in summary views
$hidePremium = in_array($policyTypeId, [1, 2], true); $hidePremium = in_array($policyTypeId, [1, 2], true);
return [ return [
@ -7657,8 +7682,6 @@ class EmployeeRestController extends AdminController
->select([ ->select([
'tm.id AS ticket_id', 'tm.id AS ticket_id',
'tm.claim_number AS claim_no', 'tm.claim_number AS claim_no',
'tm.ticket_type_id',
'tm.claim_status_id',
"CASE "CASE
WHEN tcs.display_name IS NULL OR tcs.display_name = '' WHEN tcs.display_name IS NULL OR tcs.display_name = ''
THEN tcs.claim_status THEN tcs.claim_status
@ -7669,25 +7692,14 @@ class EmployeeRestController extends AdminController
THEN tm.tpa_claim_type THEN tm.tpa_claim_type
ELSE 'Reimbursement' ELSE 'Reimbursement'
END AS claim_type", END AS claim_type",
'tm.emp_name',
'tm.emp_code',
'tm.relationship',
'tm.insured_name', 'tm.insured_name',
'tm.relationship',
'tm.hospital_name', 'tm.hospital_name',
'tm.doa', 'tm.doa',
'tm.dod', 'tm.dod',
'tm.claim_amount', 'tm.claim_amount',
'tm.approved_amount', 'tm.approved_amount',
'tm.si_amt',
'tm.policy_no',
'tm.tpa_no',
'tm.client_policy_id',
'DATE_FORMAT(tm.created_at, "%d-%m-%Y") AS ticket_created_date',
'tm.raised_date',
'tm.registration_date',
'tm.approved_date',
'tm.settled_date', 'tm.settled_date',
'tm.denial_date',
'tm.denial_reason', 'tm.denial_reason',
'tm.utr_details', 'tm.utr_details',
]) ])
@ -7699,18 +7711,37 @@ class EmployeeRestController extends AdminController
->get() ->get()
->getResultArray(); ->getResultArray();
$formattedClaims = [];
$totalClaimAmount = 0; $totalClaimAmount = 0;
$totalApprovedAmount = 0; $totalApprovedAmount = 0;
foreach ($claims as $claim) { foreach ($claims as $claim) {
$totalClaimAmount += (float) ($claim['claim_amount'] ?? 0); $totalClaimAmount += (float) ($claim['claim_amount'] ?? 0);
$totalApprovedAmount += (float) ($claim['approved_amount'] ?? 0); $totalApprovedAmount += (float) ($claim['approved_amount'] ?? 0);
$formattedClaims[] = [
'ticket_id' => (string) ($claim['ticket_id'] ?? ''),
'claim_no' => $claim['claim_no'] ?? null,
'status' => $claim['status'] ?? null,
'claim_type' => $claim['claim_type'] ?? null,
'insured_name' => $claim['insured_name'] ?? null,
'relationship' => $claim['relationship'] ?? null,
'hospital_name' => $claim['hospital_name'] ?? null,
'doa' => $claim['doa'] ?? null,
'dod' => $claim['dod'] ?? null,
'claim_amount' => $claim['claim_amount'] ?? null,
'approved_amount' => $claim['approved_amount'] ?? null,
'settled_date' => $claim['settled_date'] ?? null,
'denial_reason' => $claim['denial_reason'] ?? null,
'utr_details' => $claim['utr_details'] ?? null,
];
} }
return [ return [
'count' => count($claims), 'count' => count($formattedClaims),
'total_claim_amount' => round($totalClaimAmount, 2), 'total_claim_amount' => round($totalClaimAmount, 2),
'total_approved_amount' => round($totalApprovedAmount, 2), 'total_approved_amount' => round($totalApprovedAmount, 2),
'claims' => $claims, 'claims' => $formattedClaims,
]; ];
} }

View File

@ -252,6 +252,7 @@ class EmployeePolicyModel extends Model
$result = $this->select([ $result = $this->select([
'employee_polices.*', 'employee_polices.*',
'employee_polices.tpa_id as uhid',
'policy_type.policy_type as policy_name', 'policy_type.policy_type as policy_name',
'im.short_name as insurer_short_name', 'im.short_name as insurer_short_name',
'ib.branch_name as insurer_branch_name', 'ib.branch_name as insurer_branch_name',