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-gp,consultation-specialist,medicine', // 'speciality_code' => 'sometimes' ]); if ($request->type == 'consultation-gp') { $benefitCode = 'OPCONS1'; } if ($request->type == 'consultation-specialist') { $benefitCode = 'OPCONS2'; } if ($request->type == 'medicine') { $benefitCode = 'OPMEDI1'; } $member = Member::where('member_id', $request->member_id)->with(['currentCorporate', 'currentPolicy', 'currentPlan', 'postponedClaims'])->first(); $limits = ClaimService::showMemberBenefitLimit($member, $benefitCode); $limits['postponed_claims'] = $member->postponedClaims; $limits['postponed_claims_payment_url'] = "http://google.com"; $limits['postponed_claims_unpaid_total'] = $member->postponedClaims->sum('total_claim'); if ($request->has('speciality_code') && !empty($request->speciality_code)) { $corporateService = $member->currentCorporate ->corporateServices() ->active() ->where('service_code', 'OP') ->with([ 'specialities' => function ($speciality) use ($request) { $speciality->where('code', $request->speciality_code) ->wherePivot('active', 1); }]) ->first(); // $rules = $corporateServiceConfigs-> // dd($corporateServiceConfigs->toArray()); if (empty($corporateService)) { $limit['coverage'] = [ 'benefit' => false, 'admin_fee' => false, 'delivery_fee' => false ]; return Helper::responseJson(data: $limits); } if (empty($corporateService->specialities)) { $limit['coverage'] = [ 'benefit' => false, 'admin_fee' => false, 'delivery_fee' => false ]; return Helper::responseJson(data: $limits); } $currentSpeciality = $corporateService->specialities->first(); // Load the Relation Data after speciality check is supported $corporateService->load([ 'configs', // 'configs.exclusions.rules', 'corporateServiceSpecialities' => function ($corporateServiceSpeciality) use ($currentSpeciality) { $corporateServiceSpeciality->where('speciality_id', $currentSpeciality->id); }, 'corporateServiceSpecialities.exclusions' => function ($exclusion) { $exclusion->where('service_code', 'OP'); }, 'corporateServiceSpecialities.exclusions.rules' ]); $configs = $corporateService->configs->mapWithKeys(function ($config) { return [$config->name => $config]; }); $serviceSpeciality = $corporateService->corporateServiceSpecialities->first() ?? null; $serviceSpecialityRules = $serviceSpeciality->exclusions->first()->rules ?? collect([]); $serviceSpecialityRules = $serviceSpecialityRules->mapWithKeys(function ($rule) { return [$rule->name => $rule]; }); $gpSpecialityName = config('aso.general_practitioner_speciality_name', 'Umum'); // dd($serviceSpecialityRules->toArray()); $coverage = [ 'benefit' => false, 'admin_fee' => false, 'delivery_fee' => false ]; // dd($configs->toArray()); // dd($gpSpecialityName, $currentSpeciality->name); if ($gpSpecialityName == $currentSpeciality->name) { // To General Practitioner if (($configs['gp_internal_doctor_online']['value'] ?? 1) == 1) { $coverage['benefit'] = true; } if (($configs['general_practitioner_fee']['value'] ?? 1) == 1) { $coverage['admin_fee'] = true; } if ($serviceSpeciality->active == 1) { $coverage['benefit'] = true; } } else { // To Specialist if (($configs['sp_internal_doctor_online']['value'] ?? 1) == 1) { $coverage['benefit'] = true; } // dd($configs['specialist_practitioner_fee']['value'], $configs['specialist_practitioner_fee']['value'] ?? 1, ($configs['specialist_practitioner_fee']['value'] ?? 1) == 1); if (($configs['specialist_practitioner_fee']['value'] ?? 1) == 1) { $coverage['admin_fee'] = true; } if ($serviceSpeciality->active == 1) { $coverage['benefit'] = true; } } // 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; } } } if ( count($excluded) ) { $coverage['benefit'] = false; $coverage['benefit_exclusion'] = $excluded; } else { $coverage['benefit'] = true; } $limits['coverage'] = $coverage; } else { $limits['coverage'] = [ 'benefit' => true, 'admin_fee' => true, 'delivery_fee' => true ]; } return Helper::responseJson(data: $limits); } }