[WIP] Change Check Coverage Appointment
This commit is contained in:
@@ -6,6 +6,7 @@ use App\Helpers\Helper;
|
|||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
use App\Models\Icd;
|
use App\Models\Icd;
|
||||||
use App\Models\Member;
|
use App\Models\Member;
|
||||||
|
use App\Models\Speciality;
|
||||||
use App\Services\ClaimService;
|
use App\Services\ClaimService;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
@@ -16,19 +17,23 @@ class ClaimController extends Controller
|
|||||||
$request->validate([
|
$request->validate([
|
||||||
'member_id' => 'required',
|
'member_id' => 'required',
|
||||||
'user_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',
|
'total_claim' => 'required',
|
||||||
'detail' => 'required',
|
'detail' => 'required',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
if ($request->type == 'consultation-gp') {
|
$currentSpeciality = Speciality::where('code', $request->speciality_code)->first();
|
||||||
$benefitCode = 'OPCONS1';
|
|
||||||
}
|
$gpSpecialityName = config('aso.general_practitioner_speciality_name', 'Umum');
|
||||||
if ($request->type == 'consultation-specialist') {
|
$isGp = $gpSpecialityName == ($currentSpeciality ? $currentSpeciality->name : false);
|
||||||
$benefitCode = 'OPCONS2';
|
|
||||||
}
|
|
||||||
if ($request->type == 'medicine') {
|
if ($request->type == 'medicine') {
|
||||||
$benefitCode = 'OPMEDI1';
|
$benefitCode = 'OPMEDI1';
|
||||||
|
} else if ($isGp) {
|
||||||
|
$benefitCode = 'OPCONS1';
|
||||||
|
} else {
|
||||||
|
$benefitCode = 'OPCONS2';
|
||||||
}
|
}
|
||||||
|
|
||||||
$member = Member::query()
|
$member = Member::query()
|
||||||
@@ -38,7 +43,6 @@ class ClaimController extends Controller
|
|||||||
])
|
])
|
||||||
->firstOrFail();
|
->firstOrFail();
|
||||||
$benefit = $member->currentPlan->benefits()->where('code', $benefitCode)->first();
|
$benefit = $member->currentPlan->benefits()->where('code', $benefitCode)->first();
|
||||||
// $diagnosis = Icd::first();
|
|
||||||
|
|
||||||
$claim = ClaimService::storeClaim($member, null, $request->total_claim, $benefit, 'requested');
|
$claim = ClaimService::storeClaim($member, null, $request->total_claim, $benefit, 'requested');
|
||||||
$claim->status = 'approved';
|
$claim->status = 'approved';
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ class MembershipController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!$member->active) {
|
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');
|
return Helper::responseJson(data: $member, message: 'Member Found');
|
||||||
@@ -35,68 +35,30 @@ class MembershipController extends Controller
|
|||||||
{
|
{
|
||||||
$request->validate([
|
$request->validate([
|
||||||
'member_id' => 'required',
|
'member_id' => 'required',
|
||||||
'type' => 'required|in:consultation-gp,consultation-specialist,medicine',
|
'type' => 'required|in:consultation,teleconsultation,medicine',
|
||||||
// 'speciality_code' => 'sometimes'
|
// 'speciality_code' => 'sometimes'
|
||||||
]);
|
]);
|
||||||
|
|
||||||
if ($request->type == 'consultation-gp') {
|
$member = Member::query()
|
||||||
$benefitCode = 'OPCONS1';
|
->where('member_id', $request->member_id)
|
||||||
}
|
->with(['currentCorporate', 'currentPolicy', 'currentPlan', 'postponedClaims'])
|
||||||
if ($request->type == 'consultation-specialist') {
|
->first();
|
||||||
$benefitCode = 'OPCONS2';
|
|
||||||
}
|
|
||||||
if ($request->type == 'medicine') {
|
|
||||||
$benefitCode = 'OPMEDI1';
|
|
||||||
}
|
|
||||||
|
|
||||||
$member = Member::where('member_id', $request->member_id)->with(['currentCorporate', 'currentPolicy', 'currentPlan', 'postponedClaims'])->first();
|
$corporateService = $member->currentCorporate->corporateServices()
|
||||||
|
|
||||||
$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()
|
|
||||||
->active()
|
->active()
|
||||||
->where('service_code', 'OP')
|
->where('service_code', 'OP')
|
||||||
->with([
|
->with([
|
||||||
'configs',
|
'configs',
|
||||||
'specialities' => function ($speciality) use ($request) {
|
'specialities' => function ($speciality) use ($request) {
|
||||||
$speciality->where('code', $request->speciality_code)
|
$speciality->where('code', $request->speciality_code ?? null)
|
||||||
->wherePivot('active', 1);
|
->wherePivot('active', 1);
|
||||||
}])
|
}
|
||||||
|
])
|
||||||
->first();
|
->first();
|
||||||
|
|
||||||
$configs = $corporateService->configs->mapWithKeys(function ($config) {
|
$currentSpeciality = $corporateService->specialities->first();
|
||||||
return [$config->name => $config];
|
|
||||||
});
|
|
||||||
|
|
||||||
$coverage = [
|
if ($currentSpeciality) {
|
||||||
'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);
|
|
||||||
|
|
||||||
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
|
|
||||||
$corporateService->load([
|
$corporateService->load([
|
||||||
'corporateServiceSpecialities' => function ($corporateServiceSpeciality) use ($currentSpeciality) {
|
'corporateServiceSpecialities' => function ($corporateServiceSpeciality) use ($currentSpeciality) {
|
||||||
$corporateServiceSpeciality->where('speciality_id', $currentSpeciality->id);
|
$corporateServiceSpeciality->where('speciality_id', $currentSpeciality->id);
|
||||||
@@ -106,94 +68,101 @@ class MembershipController extends Controller
|
|||||||
},
|
},
|
||||||
'corporateServiceSpecialities.exclusions.rules'
|
'corporateServiceSpecialities.exclusions.rules'
|
||||||
]);
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
$serviceSpeciality = $corporateService->corporateServiceSpecialities->first() ?? null;
|
$corporateServiceSpeciality = $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');
|
$serviceSpecialityRules = $corporateServiceSpeciality->exclusions->first()->rules ?? collect([]);
|
||||||
|
$serviceSpecialityRules = $serviceSpecialityRules->mapWithKeys(function ($rule) {
|
||||||
|
return [$rule->name => $rule];
|
||||||
|
});
|
||||||
|
|
||||||
if ($gpSpecialityName == $currentSpeciality->name) {
|
$configs = $corporateService->configs->mapWithKeys(function ($config) {
|
||||||
// To General Practitioner
|
return [$config->name => $config];
|
||||||
if (($configs['gp_internal_doctor_online']['value'] ?? 1) == 1) {
|
});
|
||||||
$coverage['benefit'] = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (($configs['general_practitioner_fee']['value'] ?? 1) == 1) {
|
$gpSpecialityName = config('aso.general_practitioner_speciality_name', 'Umum');
|
||||||
$coverage['admin_fee'] = true;
|
$isGp = $gpSpecialityName == ($currentSpeciality ? $currentSpeciality->name : false);
|
||||||
}
|
|
||||||
|
|
||||||
if ($serviceSpeciality->active == 1) {
|
if ($request->type == 'medicine') {
|
||||||
$coverage['benefit'] = true;
|
$benefitCode = 'OPMEDI1';
|
||||||
}
|
} else if ($isGp) {
|
||||||
|
$benefitCode = 'OPCONS1';
|
||||||
|
} else {
|
||||||
|
$benefitCode = 'OPCONS2';
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
$limits = ClaimService::showMemberBenefitLimit($member, $benefitCode);
|
||||||
// To Specialist
|
$limits['postponed_claims'] = $member->postponedClaims;
|
||||||
if (($configs['sp_internal_doctor_online']['value'] ?? 1) == 1) {
|
$limits['postponed_claims_payment_url'] = route('postpone-pay', $member->member_id);
|
||||||
$coverage['benefit'] = true;
|
$limits['postponed_claims_unpaid_total'] = $member->postponedClaims->sum('total_claim');
|
||||||
}
|
|
||||||
// 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['medicine_benefit'] = $benefitCode == 'OPMEDI1'; // TODO Make this into setting ?
|
||||||
$coverage['admin_fee'] = true;
|
$coverage['medicine_delivery_fee'] = (($configs['delivery_fee']['value'] ?? 1) == 1);
|
||||||
}
|
|
||||||
|
|
||||||
if ($serviceSpeciality->active == 1) {
|
if ($currentSpeciality) {
|
||||||
$coverage['benefit'] = true;
|
$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)
|
||||||
// TODO THIS EXCLUSION IS USED AS INCLUSION NOW, MUST BE CHANGE TO USED AS EXCLUSION AND MAYBE MOVE THE TABLE
|
? $xCoverage['gp_consultation_benefit']
|
||||||
$excluded = [];
|
: $xCoverage['sp_consultation_benefit'];
|
||||||
foreach ($serviceSpecialityRules as $ruleName => $rule) {
|
$coverage['teleconsultation_benefit'] = ($isGp)
|
||||||
if ($ruleName == 'msc') {
|
? $xCoverage['gp_teleconsultation_benefit']
|
||||||
$values = explode(',', $rule->values);
|
: $xCoverage['sp_teleconsultation_benefit'];
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
$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;
|
$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);
|
return Helper::responseJson(data: $limits);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ export default function Divisions() {
|
|||||||
// console.log('specialities', specialities);
|
// console.log('specialities', specialities);
|
||||||
|
|
||||||
useEffect(() => {
|
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);
|
setService(res.data.service);
|
||||||
setPlans(
|
setPlans(
|
||||||
res.data.corporate.plans.map((item: any) => ({
|
res.data.corporate.plans.map((item: any) => ({
|
||||||
@@ -135,7 +135,7 @@ export default function Divisions() {
|
|||||||
const handleConfigChange = (event: ChangeEvent<HTMLInputElement>, service: any) => {
|
const handleConfigChange = (event: ChangeEvent<HTMLInputElement>, service: any) => {
|
||||||
axios
|
axios
|
||||||
.put(`/corporates/${corporate_id}/services`, {
|
.put(`/corporates/${corporate_id}/services`, {
|
||||||
service_code: service.service_code,
|
service_code: service_code,
|
||||||
config_name: event.target.name,
|
config_name: event.target.name,
|
||||||
config_value: event.target.checked,
|
config_value: event.target.checked,
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user