validate([ 'member_id' => 'required', // 'birth_date' => 'required', ]); $member = Member::where('member_id', $request->member_id)->first(); if (!$member) { return Helper::responseJson(statusCode: 404, message: 'Member not found.', status: 'error'); } if (!$member->active) { return Helper::responseJson(statusCode: 406, message: 'The Member ' . $request->member_id . ' is Inactive.', status: 'error'); } return Helper::responseJson(data: $member, message: 'Member Found'); } public function checkLimit(Request $request) { $request->validate([ 'member_id' => 'required', 'type' => 'required|in:consultation,teleconsultation,medicine', // 'speciality_code' => 'sometimes' ]); $member = Member::query() ->where('member_id', $request->member_id) ->with(['currentCorporate', 'currentPolicy', 'currentPlan', 'postponedClaims']) ->first(); $corporateService = $member->currentCorporate->corporateServices() ->active() ->where('service_code', 'OP') ->with([ 'configs', 'specialities' => function ($speciality) use ($request) { $speciality->where('code', $request->speciality_code ?? null) ->wherePivot('active', 1); } ]) ->first(); $currentSpeciality = $corporateService->specialities->first(); if ($currentSpeciality) { $corporateService->load([ 'corporateServiceSpecialities' => function ($corporateServiceSpeciality) use ($currentSpeciality) { $corporateServiceSpeciality->where('speciality_id', $currentSpeciality->id); }, 'corporateServiceSpecialities.exclusions' => function ($exclusion) { $exclusion->where('service_code', 'OP'); }, 'corporateServiceSpecialities.exclusions.rules' ]); } $corporateServiceSpeciality = $corporateService->corporateServiceSpecialities->first() ?? null; $serviceSpecialityRules = $corporateServiceSpeciality->exclusions->first()->rules ?? collect([]); $serviceSpecialityRules = $serviceSpecialityRules->mapWithKeys(function ($rule) { return [$rule->name => $rule]; }); $configs = $corporateService->configs->mapWithKeys(function ($config) { return [$config->name => $config]; }); $gpSpecialityName = config('aso.general_practitioner_speciality_name', 'Umum'); $isGp = $gpSpecialityName == ($currentSpeciality ? $currentSpeciality->name : false); if ($request->type == 'medicine') { $benefitCode = 'OPMEDI1'; } else if ($isGp) { $benefitCode = 'OPCONS1'; } else { $benefitCode = 'OPCONS2'; } $limits = ClaimService::showMemberBenefitLimit($member, $benefitCode); $limits['postponed_claims'] = $member->postponedClaims; $limits['postponed_claims_payment_url'] = route('postpone-pay', $member->member_id); $limits['postponed_claims_unpaid_total'] = $member->postponedClaims->sum('total_claim'); $coverage['medicine_benefit'] = false; if ($benefitCode = 'OPMEDI1') { $medicineBenefit = $member->currentPlan->benefits()->where('code', $benefitCode)->wherePivot('active', 1)->first(); $coverage['medicine_benefit'] = !empty($medicineBenefit); } $coverage['medicine_delivery_fee'] = (($configs['delivery_fee']['value'] ?? 1) == 1); if ($currentSpeciality) { $xCoverage['sp_consultation_benefit'] = (($configs['sp_internal_doctor_offline']['value'] ?? 1) == 1); $xCoverage['sp_teleconsultation_benefit'] = (($configs['sp_internal_doctor_online']['value'] ?? 1) == 1); $xCoverage['gp_consultation_benefit'] = (($configs['gp_internal_doctor_offline']['value'] ?? 1) == 1); $xCoverage['gp_teleconsultation_benefit'] = (($configs['gp_internal_doctor_online']['value'] ?? 1) == 1); $coverage['consultation_benefit'] = ($isGp) ? $xCoverage['gp_consultation_benefit'] : $xCoverage['sp_consultation_benefit']; $coverage['teleconsultation_benefit'] = ($isGp) ? $xCoverage['gp_teleconsultation_benefit'] : $xCoverage['sp_teleconsultation_benefit']; $xCoverage['sp_admin_fee'] = (($configs['specialist_practitioner_fee']['value'] ?? 1) == 1); $xCoverage['gp_admin_fee'] = (($configs['general_practitioner_fee']['value'] ?? 1) == 1); $coverage['admin_fee'] = ($isGp) ? $xCoverage['gp_admin_fee'] : $xCoverage['sp_admin_fee']; } else { // Not Supported $coverage['consultation_benefit'] = false; $coverage['teleconsultation_benefit'] = false; $coverage['admin_fee'] = false; } $limits['coverage'] = $coverage; // TODO THIS EXCLUSION IS USED AS INCLUSION NOW, MUST BE CHANGE TO USED AS EXCLUSION AND MAYBE MOVE THE TABLE $excluded = []; foreach ($serviceSpecialityRules as $ruleName => $rule) { if ($ruleName == 'msc') { $values = explode(',', $rule->values); if (!in_array(strtolower($member->marital_status), $values)) { $excluded[] = $rule; } } if ($ruleName == 'gender') { $values = explode(',', $rule->values); if (!in_array(strtolower($member->gender), $values)) { $excluded[] = $rule; } } if ($ruleName == 'min_age') { if (!empty($rule->values) && $member->age < $rule->values) { $excluded[] = $rule; } } if ($ruleName == 'max_age') { if (!empty($rule->values) && $member->age > $rule->values) { $excluded[] = $rule; } } if ($ruleName == 'plan') { $values = explode(',', $rule->values); if (!in_array($member->currentPlan->code, $values)) { $excluded[] = $rule; } } } return Helper::responseJson(data: $limits); } }