diff --git a/app/Http/Controllers/Api/OLDLMS/ClaimController.php b/app/Http/Controllers/Api/OLDLMS/ClaimController.php index 46a6b21d..588cccf5 100644 --- a/app/Http/Controllers/Api/OLDLMS/ClaimController.php +++ b/app/Http/Controllers/Api/OLDLMS/ClaimController.php @@ -6,6 +6,7 @@ use App\Helpers\Helper; use App\Http\Controllers\Controller; use App\Models\Icd; use App\Models\Member; +use App\Models\Speciality; use App\Services\ClaimService; use Illuminate\Http\Request; @@ -16,19 +17,23 @@ class ClaimController extends Controller $request->validate([ 'member_id' => 'required', 'user_id' => 'required', - 'type' => 'required|in:consultation-gp,consultation-specialist,medicine', + 'type' => 'required|in:consultation,teleconsultation,medicine', + 'speciality_code' => 'required', 'total_claim' => 'required', 'detail' => 'required', ]); + + $currentSpeciality = Speciality::where('code', $request->speciality_code)->first(); - if ($request->type == 'consultation-gp') { - $benefitCode = 'OPCONS1'; - } - if ($request->type == 'consultation-specialist') { - $benefitCode = 'OPCONS2'; - } + $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'; } $member = Member::query() @@ -38,8 +43,7 @@ class ClaimController extends Controller ]) ->firstOrFail(); $benefit = $member->currentPlan->benefits()->where('code', $benefitCode)->first(); - // $diagnosis = Icd::first(); - + $claim = ClaimService::storeClaim($member, null, $request->total_claim, $benefit, 'requested'); $claim->status = 'approved'; $claim->save(); diff --git a/app/Http/Controllers/Api/OLDLMS/MembershipController.php b/app/Http/Controllers/Api/OLDLMS/MembershipController.php index 5d324459..d056534f 100644 --- a/app/Http/Controllers/Api/OLDLMS/MembershipController.php +++ b/app/Http/Controllers/Api/OLDLMS/MembershipController.php @@ -11,7 +11,7 @@ use Illuminate\Http\Request; class MembershipController extends Controller { // - public function check(Request $request) + public function check(Request $request) { $request->validate([ 'member_id' => 'required', @@ -25,7 +25,7 @@ class MembershipController extends Controller } if (!$member->active) { - return Helper::responseJson(statusCode: 406, message: 'The Member '.$request->member_id.' is Inactive.', status: 'error'); + return Helper::responseJson(statusCode: 406, message: 'The Member ' . $request->member_id . ' is Inactive.', status: 'error'); } return Helper::responseJson(data: $member, message: 'Member Found'); @@ -35,68 +35,30 @@ class MembershipController extends Controller { $request->validate([ 'member_id' => 'required', - 'type' => 'required|in:consultation-gp,consultation-specialist,medicine', + 'type' => 'required|in:consultation,teleconsultation,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::query() + ->where('member_id', $request->member_id) + ->with(['currentCorporate', 'currentPolicy', 'currentPlan', 'postponedClaims']) + ->first(); - $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'] = route('postpone-pay', $member->member_id); - $limits['postponed_claims_unpaid_total'] = $member->postponedClaims->sum('total_claim'); - - $corporateService = $member->currentCorporate - ->corporateServices() + $corporateService = $member->currentCorporate->corporateServices() ->active() ->where('service_code', 'OP') ->with([ 'configs', 'specialities' => function ($speciality) use ($request) { - $speciality->where('code', $request->speciality_code) - ->wherePivot('active', 1); - }]) + $speciality->where('code', $request->speciality_code ?? null) + ->wherePivot('active', 1); + } + ]) ->first(); - - $configs = $corporateService->configs->mapWithKeys(function ($config) { - return [$config->name => $config]; - }); - $coverage = [ - 'benefit' => false, - 'admin_fee' => false, - 'medicine_benefit' => true, // TODO Make this into setting ? - 'medicine_delivery_fee' => false - ]; - $coverage['medicine_delivery_fee'] = (($configs['delivery_fee']['value'] ?? 1) == 1); - $coverage['gp_benefit'] = (($configs['gp_internal_doctor_online']['value'] ?? 1) == 1); - $coverage['gp_admin_fee'] = (($configs['general_practitioner_fee']['value'] ?? 1) == 1); - $coverage['sp_benefit'] = (($configs['sp_internal_doctor_online']['value'] ?? 1) == 1); - $coverage['sp_admin_fee'] = (($configs['specialist_practitioner_fee']['value'] ?? 1) == 1); + $currentSpeciality = $corporateService->specialities->first(); - if ($request->has('speciality_code') && !empty($request->speciality_code)) { - - if (empty($corporateService) || empty($corporateService->specialities)) { - $coverage['benefit'] = false; - $coverage['admin_fee'] = false; - $limits['coverage'] = $coverage; - - return Helper::responseJson(data: $limits); - } - - $currentSpeciality = $corporateService->specialities->first(); - - // Load the Relation Data after speciality check is supported + if ($currentSpeciality) { $corporateService->load([ 'corporateServiceSpecialities' => function ($corporateServiceSpeciality) use ($currentSpeciality) { $corporateServiceSpeciality->where('speciality_id', $currentSpeciality->id); @@ -106,94 +68,101 @@ class MembershipController extends Controller }, 'corporateServiceSpecialities.exclusions.rules' ]); - - $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'); - - 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; - } - } - + + $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'] = $benefitCode == 'OPMEDI1'; // TODO Make this into setting ? + $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); } } diff --git a/frontend/dashboard/src/pages/Corporates/Services/Create.tsx b/frontend/dashboard/src/pages/Corporates/Services/Create.tsx index 26aa8e35..9a520516 100755 --- a/frontend/dashboard/src/pages/Corporates/Services/Create.tsx +++ b/frontend/dashboard/src/pages/Corporates/Services/Create.tsx @@ -88,7 +88,7 @@ export default function Divisions() { // console.log('specialities', specialities); useEffect(() => { - axios.get('/corporate/' + corporate_id + '/services/' + service_code).then((res) => { + axios.get('/corporates/' + corporate_id + '/services/' + service_code).then((res) => { setService(res.data.service); setPlans( res.data.corporate.plans.map((item: any) => ({ @@ -135,7 +135,7 @@ export default function Divisions() { const handleConfigChange = (event: ChangeEvent, service: any) => { axios .put(`/corporates/${corporate_id}/services`, { - service_code: service.service_code, + service_code: service_code, config_name: event.target.name, config_value: event.target.checked, })