calculate-benefit

This commit is contained in:
ivan-sim
2026-03-02 09:38:49 +07:00
parent 928cb37289
commit b0b34df1b0
2 changed files with 120 additions and 1 deletions

View File

@@ -84,7 +84,9 @@ class MemberController extends Controller
'benefits.description',
'benefits.code',
'corporate_benefits.corporate_id',
'plans.service_code'
'plans.service_code',
'corporate_benefits.cashless_percentage',
'corporate_benefits.reimbursement_percentage',
)
->get();
$res_data['benefits'] = $benefits;
@@ -203,4 +205,119 @@ class MemberController extends Controller
}
}
public function calculateBenefit(Request $request)
{
$request->validate([
'member_id' => 'required|integer',
'benefit_id' => 'required|integer',
'biaya' => 'required|numeric|min:0'
]);
$memberId = $request->member_id;
$benefitId = $request->benefit_id;
$biaya = $request->biaya;
// ===============================
// Ambil member
// ===============================
$member = DB::table('members')->where('id', $memberId)->first();
if (!$member) {
return ApiResponse::apiResponse("Data Not Found", [], "Member not found", 404);
}
// ===============================
// Ambil corporate employee
// ===============================
$corporateEmployee = DB::table('corporate_employees')
->where('member_id', $memberId)
->first();
if (!$corporateEmployee) {
return ApiResponse::apiResponse("Data Not Found", [], "Corporate not found", 404);
}
// ===============================
// Ambil Plan OP
// ===============================
$planMember = MemberPlan::where('member_id', $memberId)->pluck('plan_id');
$plan = Plan::whereIn('id', $planMember)
->where('service_code', 'OP')
->first();
if (!$plan) {
return ApiResponse::apiResponse("Data Not Found", [], "Plan OP not found", 404);
}
// ===============================
// Ambil Benefit
// ===============================
$corporateBenefit = CorporateBenefit::where('plan_id', $plan->id)
->where('benefit_id', $benefitId)
->first();
if (!$corporateBenefit) {
return ApiResponse::apiResponse("Data Not Found", [], "Benefit not found", 404);
}
// ===============================
// Hitung Used Limit (PAKAI HELPER)
// ===============================
$benefitData = [
[
'id' => $benefitId,
'limit_amount' => $corporateBenefit->limit_amount ?? 0,
'limit_amount_plan' => $plan->limit_rules ?? 0,
'family_plan' => $plan->family_plan ?? 'S',
'max_frequency_period' => $corporateBenefit->max_frequency_period ?? 0
]
];
$memberUsage = Helper::getUsageMember(
$corporateEmployee->corporate_id,
$memberId,
$benefitData
);
$usedLimitArray = json_decode($memberUsage, true);
$usedLimit = $usedLimitArray[$benefitId] ?? 0;
// ===============================
// Limit Logic
// ===============================
$limitPlan = $plan->limit_rules ?? 0;
$sisaLimit = $limitPlan - $usedLimit;
if ($sisaLimit < 0) {
$sisaLimit = 0;
}
// ===============================
// Percentage Logic
// ===============================
$cashlessPercentage = $corporateBenefit->cashless_percentage ?? 0;
$ditanggungPercentage = ($biaya * $cashlessPercentage) / 100;
$ditanggungFinal = min($ditanggungPercentage, $sisaLimit);
$sisaBayar = $biaya - $ditanggungFinal;
// ===============================
// Response
// ===============================
return ApiResponse::apiResponse("Success", [
'member_id' => $memberId,
'benefit_id' => $benefitId,
'biaya' => $biaya,
'cashless_percentage' => $cashlessPercentage,
'limit_plan' => $limitPlan,
'used_limit' => $usedLimit,
'sisa_limit' => $sisaLimit,
'ditanggung_asuransi' => $ditanggungFinal,
'sisa_bayar_member' => $sisaBayar
], "Calculation successful", 200);
}
}

View File

@@ -40,6 +40,8 @@ Route::prefix('v1')->group(function () {
Route::post('request-log', 'requestLog');
});
Route::post('calculate-benefit', [MemberController::class, 'calculateBenefit']);
Route::prefix('master')->group(function () {
Route::get('specialities', [MasterController::class, 'specialities']);