From e889eaadbf0b06a5f1401e54e4071474eb166ddc Mon Sep 17 00:00:00 2001 From: ivan-sim Date: Fri, 27 Feb 2026 15:39:31 +0700 Subject: [PATCH 1/9] update --- .../Http/Controllers/Api/MemberController.php | 169 ++++++++++-------- .../Controllers/Api/RequestLogController.php | 6 +- app/Services/AuthService.php | 17 +- 3 files changed, 113 insertions(+), 79 deletions(-) diff --git a/Modules/Primaya/Http/Controllers/Api/MemberController.php b/Modules/Primaya/Http/Controllers/Api/MemberController.php index 2ea07dcc..e21e8ae8 100644 --- a/Modules/Primaya/Http/Controllers/Api/MemberController.php +++ b/Modules/Primaya/Http/Controllers/Api/MemberController.php @@ -3,7 +3,10 @@ namespace Modules\Primaya\Http\Controllers\Api; use App\Helpers\Helper; +use App\Models\CorporateBenefit; use App\Models\Member; +use App\Models\MemberPlan; +use App\Models\Plan; use Illuminate\Contracts\Support\Renderable; use Illuminate\Http\Request; use Illuminate\Routing\Controller; @@ -38,6 +41,7 @@ class MemberController extends Controller { $members = DB::table('members') ->leftJoin('member_policies', 'member_policies.member_id','=', 'members.member_id') + ->leftJoin('corporate_employees', 'corporate_employees.member_id','=', 'members.member_id') ->leftJoin('persons', 'persons.id', '=', 'members.person_id') ->where('members.member_id', '=', $request->no_polis) ->where('members.birth_date', '=', $request->birth_date) @@ -59,13 +63,24 @@ class MemberController extends Controller { $res_data['members'] = $members; + // $services = DB::table('member_plans') + // ->leftJoin('plans', 'plans.id', '=', 'member_plans.plan_id') + // ->leftJoin('services', 'services.code', '=', 'plans.service_code') + // ->where('member_plans.member_id', $members->id) + // ->whereNull('member_plans.deleted_at') + // ->select('plans.service_code', 'services.name') + // ->get(); + // $res_data['services'] = $services; + $benefits = DB::table('member_plans') ->leftJoin('corporate_benefits','corporate_benefits.plan_id', '=', 'member_plans.plan_id') ->leftJoin('benefits', 'benefits.id', '=', 'corporate_benefits.benefit_id') ->leftJoin('plans', 'plans.id', '=', 'member_plans.plan_id') ->leftJoin('services', 'services.code', '=', 'plans.service_code') ->where('member_plans.member_id', '=', $members->id) + ->where('plans.service_code','=', 'OP') ->select( + 'benefits.id', 'benefits.description', 'benefits.code', 'corporate_benefits.corporate_id', @@ -74,96 +89,108 @@ class MemberController extends Controller ->get(); $res_data['benefits'] = $benefits; - $services = DB::table('member_plans') - ->leftJoin('plans', 'plans.id', '=', 'member_plans.plan_id') - ->leftJoin('services', 'services.code', '=', 'plans.service_code') - ->where('member_plans.member_id', $members->id) - ->whereNull('member_plans.deleted_at') - ->select('plans.service_code', 'services.name') - ->get(); - $res_data['services'] = $services; - // Group Services - $groupServices = []; - foreach ($res_data['benefits'] as $benefit) { - $serviceCode = $benefit->service_code; - $groupServices[$serviceCode][] = [ - 'description' => $benefit->description, - 'code' => $benefit->code, - ]; - } + // $groupServices = []; + // foreach ($res_data['benefits'] as $benefit) { + // $serviceCode = $benefit->service_code; + // $groupServices[$serviceCode][] = [ + // 'description' => $benefit->description, + // 'code' => $benefit->code, + // ]; + // } - $res_data['groupServices'] = $groupServices; + // $res_data['groupServices'] = $groupServices; - $res_data['type'] = $request->type; + // $res_data['type'] = $request->type; // Provider - $providers = DB::table('organizations') - ->where('organizations.type', '=', 'hospital') - ->where('organizations.corporate_id_partner', '!=', 8) - ->orWhere('organizations.corporate_id_partner', NULL) - ->where('status', '=', 'active') - ->orderBy('organizations.name','asc') - ->select( - 'organizations.id', - 'organizations.name' - ) - ->get(); + // $providers = DB::table('organizations') + // ->where('organizations.type', '=', 'hospital') + // ->where('organizations.corporate_id_partner', '!=', 8) + // ->orWhere('organizations.corporate_id_partner', NULL) + // ->where('status', '=', 'active') + // ->orderBy('organizations.name','asc') + // ->select( + // 'organizations.id', + // 'organizations.name' + // ) + // ->get(); - $res_data['providers'] = $providers; + // $res_data['providers'] = $providers; //company - $companies = DB::table('corporates') - ->where('corporates.active', '=', 1) + // $companies = DB::table('corporates') + // ->where('corporates.active', '=', 1) + // ->select( + // 'corporates.id', + // 'corporates.name' + // ) + // ->get(); + + // $res_data['companies'] = $companies; + + $corporateEmployee = DB::table('corporate_employees') + ->leftJoin('corporates', 'corporates.id', '=', 'corporate_employees.corporate_id') + ->leftJoin('corporate_policies', 'corporate_policies.corporate_id', '=', 'corporates.id') + ->where('corporate_employees.status', 'ACTIVE') + ->where('corporates.active', 1) + ->where('corporate_policies.active', 1) + ->where('corporate_employees.member_id', $members->id) ->select( - 'corporates.id', - 'corporates.name' + 'corporate_policies.total_premi', + 'corporate_employees.corporate_id' ) - ->get(); + ->first(); - $res_data['companies'] = $companies; - - //company - $companies = DB::table('corporates') - ->where('corporates.active', '=', 1) - ->select( - 'corporates.id', - 'corporates.name' - ) - ->get(); - - $res_data['companies'] = $companies; - - $corporateEmployeePremi = DB::table('corporate_employees') - ->leftJoin('corporates', 'corporates.id', '=', 'corporate_employees.corporate_id') - ->leftJoin('corporate_policies', 'corporate_policies.corporate_id', '=', 'corporates.id') - ->where('corporate_employees.status', 'ACTIVE') - ->where('corporates.active', 1) - ->where('corporate_policies.active', 1) - ->where('corporate_employees.member_id', $members->id) - ->value('corporate_policies.total_premi'); - - $res_data['total_premi'] = $corporateEmployeePremi ?? 0; - - $limitRules = DB::table('member_plans') + $res_data['total_premi'] = $corporateEmployee->total_premi ?? 0; + $res_data['limit_rules'] = DB::table('member_plans') ->leftJoin('plans', 'plans.id', '=', 'member_plans.plan_id') ->where('member_plans.member_id', $members->id) ->where('member_plans.status', 'active') ->where('plans.active', 1) - ->value('plans.limit_rules'); + ->value('plans.limit_rules') ?? 0; - $res_data['limit_rules'] = $limitRules ?? 0; + $planMember = MemberPlan::where('member_id', $members->id)->get('plan_id'); + + $planId = Plan::whereIn('id', $planMember)->where('service_code', 'OP')->first(); + $benefit = CorporateBenefit::with(['benefit', 'plan'])->where('plan_id', $planId->id)->get()->toArray(); + $benefitData = []; + if (count($benefit)){ + foreach($benefit as $data){ + $data['benefit']['plan_id'] = $data['plan_id']; + $data['benefit']['limit_amount'] = $data['limit_amount']; + $data['benefit']['family_plan'] = $planId->family_plan; + $data['benefit']['max_frequency_period'] = $data['max_frequency_period']; + $data['benefit']['limit_amount_plan'] = $data['plan']['limit_rules']; + $data['benefit']['family_plan_plans'] = $data['plan']['family_plan']; + array_push($benefitData, $data['benefit']); + } + } + $memberUsage = Helper::getUsageMember($corporateEmployee->corporate_id, $members->id, $benefitData);; + + $res_data['used_limit'] = json_decode($memberUsage); + // company + $companies = DB::table('corporates') + ->where('corporates.active', 1) + ->where('corporates.id', $corporateEmployee->corporate_id ?? null) + ->select( + 'corporates.id', + 'corporates.name' + ) + ->get(); + + $res_data['companies'] = $companies; // specialities - $specialities = DB::table('specialities') - ->select( - 'specialities.id', - 'specialities.name' - ) - ->orderBy('specialities.name','asc') - ->get(); + // $specialities = DB::table('specialities') + // ->select( + // 'specialities.id', + // 'specialities.name' + // ) + // ->orderBy('specialities.name','asc') + // ->get(); - $res_data['specialities'] = $specialities; + // $res_data['specialities'] = $specialities; return ApiResponse::apiResponse("Success", $res_data, trans('Message.success'), 200); diff --git a/Modules/Primaya/Http/Controllers/Api/RequestLogController.php b/Modules/Primaya/Http/Controllers/Api/RequestLogController.php index 81e090e7..5056b784 100644 --- a/Modules/Primaya/Http/Controllers/Api/RequestLogController.php +++ b/Modules/Primaya/Http/Controllers/Api/RequestLogController.php @@ -109,7 +109,7 @@ class RequestLogController extends Controller 'type' => 'hospital', 'corporate_id_partner' => $request->corporate_id_partner ? implode(',', $request->corporate_id_partner) : null, 'created_at' => now(), - 'created_by' => auth()->user()->id + // 'created_by' => auth()->user()->id ]); // Insert data ke tabel addresses @@ -120,7 +120,7 @@ class RequestLogController extends Controller 'addressable_id' => $organization_id, 'type' => 'hospital', 'created_at' => now(), - 'created_by' => auth()->user()->id + // 'created_by' => auth()->user()->id ]); // Update main_address_id di tabel organizations @@ -235,7 +235,7 @@ class RequestLogController extends Controller 'amount_not_approved' => $value['amount_not_approved'], 'excess_paid' => $value['excess_paid'], 'keterangan' => $value['keterangan'] ?? '', - 'created_by' => auth()->user()->id, + // 'created_by' => auth()->user()->id, ]; RequestLogBenefit::create($data); diff --git a/app/Services/AuthService.php b/app/Services/AuthService.php index b72e7836..9dd5fe3a 100644 --- a/app/Services/AuthService.php +++ b/app/Services/AuthService.php @@ -20,7 +20,7 @@ class AuthService exec($cmd); } } - + /** * Issue JWT access token for the given client */ @@ -90,23 +90,30 @@ class AuthService { try { $parts = explode('.', $token); + + if (count($parts) !== 3) { return false; } - $payload = json_decode(base64_decode(strtr($parts[1], '-_', '+/'))); + // $payload = json_decode(base64_decode(strtr($parts[1], '-_', '+/'))); + $payloadRaw = $parts[1]; + $payloadRaw = strtr($payloadRaw, '-_', '+/'); + $padding = strlen($payloadRaw) % 4; + if ($padding) { + $payloadRaw .= str_repeat('=', 4 - $padding); + } + $payload = json_decode(base64_decode($payloadRaw)); $clientId = $payload->sub ?? null; - if (!$clientId) { return false; } $clients = config('api_clients.clients'); - $client = collect($clients)->where('api_key', $clientId)->first(); + $client = collect($clients)->where('api_key', $clientId)->first(); if (!$client || !isset($client['api_secret'])) { return false; } - return \Firebase\JWT\JWT::decode($token, new \Firebase\JWT\Key($client['api_secret'], 'HS256')); } catch (\Exception $e) { return false; From ba4fba8380d376a7e9907b48184bd5515a59bfa4 Mon Sep 17 00:00:00 2001 From: ivan-sim Date: Fri, 27 Feb 2026 16:05:11 +0700 Subject: [PATCH 2/9] update --- Modules/Primaya/Http/Controllers/Api/MemberController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Primaya/Http/Controllers/Api/MemberController.php b/Modules/Primaya/Http/Controllers/Api/MemberController.php index e21e8ae8..aa75487d 100644 --- a/Modules/Primaya/Http/Controllers/Api/MemberController.php +++ b/Modules/Primaya/Http/Controllers/Api/MemberController.php @@ -132,7 +132,7 @@ class MemberController extends Controller $corporateEmployee = DB::table('corporate_employees') ->leftJoin('corporates', 'corporates.id', '=', 'corporate_employees.corporate_id') ->leftJoin('corporate_policies', 'corporate_policies.corporate_id', '=', 'corporates.id') - ->where('corporate_employees.status', 'ACTIVE') + // ->where('corporate_employees.status', 'ACTIVE') ->where('corporates.active', 1) ->where('corporate_policies.active', 1) ->where('corporate_employees.member_id', $members->id) From 928cb372893aa38b465f90bc2f7a09b5d4bd4ae6 Mon Sep 17 00:00:00 2001 From: ivan-sim Date: Fri, 27 Feb 2026 16:08:57 +0700 Subject: [PATCH 3/9] update hospital --- .../Http/Controllers/Api/MemberController.php | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/Modules/Primaya/Http/Controllers/Api/MemberController.php b/Modules/Primaya/Http/Controllers/Api/MemberController.php index aa75487d..19cee3f0 100644 --- a/Modules/Primaya/Http/Controllers/Api/MemberController.php +++ b/Modules/Primaya/Http/Controllers/Api/MemberController.php @@ -104,19 +104,20 @@ class MemberController extends Controller // $res_data['type'] = $request->type; // Provider - // $providers = DB::table('organizations') - // ->where('organizations.type', '=', 'hospital') - // ->where('organizations.corporate_id_partner', '!=', 8) - // ->orWhere('organizations.corporate_id_partner', NULL) - // ->where('status', '=', 'active') - // ->orderBy('organizations.name','asc') - // ->select( - // 'organizations.id', - // 'organizations.name' - // ) - // ->get(); + $providers = DB::table('organizations') + ->where('organizations.type', '=', 'hospital') + ->where('organizations.corporate_id_partner', '!=', 8) + ->orWhere('organizations.corporate_id_partner', NULL) + ->where('status', '=', 'active') + ->where('type', '=', 'hospital') + ->orderBy('organizations.name','asc') + ->select( + 'organizations.id', + 'organizations.name' + ) + ->get(); - // $res_data['providers'] = $providers; + $res_data['providers'] = $providers; //company // $companies = DB::table('corporates') From b0b34df1b06cd01125df51bdcbf8c25af09285d2 Mon Sep 17 00:00:00 2001 From: ivan-sim Date: Mon, 2 Mar 2026 09:38:49 +0700 Subject: [PATCH 4/9] calculate-benefit --- .../Http/Controllers/Api/MemberController.php | 119 +++++++++++++++++- Modules/Primaya/Routes/api.php | 2 + 2 files changed, 120 insertions(+), 1 deletion(-) diff --git a/Modules/Primaya/Http/Controllers/Api/MemberController.php b/Modules/Primaya/Http/Controllers/Api/MemberController.php index 19cee3f0..f27a2075 100644 --- a/Modules/Primaya/Http/Controllers/Api/MemberController.php +++ b/Modules/Primaya/Http/Controllers/Api/MemberController.php @@ -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); + } } diff --git a/Modules/Primaya/Routes/api.php b/Modules/Primaya/Routes/api.php index a90a9e7b..7af136b3 100644 --- a/Modules/Primaya/Routes/api.php +++ b/Modules/Primaya/Routes/api.php @@ -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']); From 0370302fe660aa9658a45b70f7eded3e01d81721 Mon Sep 17 00:00:00 2001 From: ivan-sim Date: Mon, 2 Mar 2026 11:01:35 +0700 Subject: [PATCH 5/9] Update Organitation --- Modules/Primaya/Http/Controllers/Api/MemberController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/Primaya/Http/Controllers/Api/MemberController.php b/Modules/Primaya/Http/Controllers/Api/MemberController.php index f27a2075..73393f83 100644 --- a/Modules/Primaya/Http/Controllers/Api/MemberController.php +++ b/Modules/Primaya/Http/Controllers/Api/MemberController.php @@ -108,10 +108,10 @@ class MemberController extends Controller // Provider $providers = DB::table('organizations') ->where('organizations.type', '=', 'hospital') + ->where('organizations.code', '=', 'LMS') ->where('organizations.corporate_id_partner', '!=', 8) - ->orWhere('organizations.corporate_id_partner', NULL) + // ->orWhere('organizations.corporate_id_partner', NULL) ->where('status', '=', 'active') - ->where('type', '=', 'hospital') ->orderBy('organizations.name','asc') ->select( 'organizations.id', From 48bd2af8474051173d778e0136b66d71f49f7897 Mon Sep 17 00:00:00 2001 From: ivan-sim Date: Tue, 31 Mar 2026 10:02:13 +0700 Subject: [PATCH 6/9] hide persetujuan tindakan --- .../src/sections/dashboard/DetailRequestFinalLog.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/hospital-portal/src/sections/dashboard/DetailRequestFinalLog.tsx b/frontend/hospital-portal/src/sections/dashboard/DetailRequestFinalLog.tsx index 5075a24d..4149596b 100644 --- a/frontend/hospital-portal/src/sections/dashboard/DetailRequestFinalLog.tsx +++ b/frontend/hospital-portal/src/sections/dashboard/DetailRequestFinalLog.tsx @@ -666,7 +666,8 @@ export default function DetailRequestFinalLog() { {/* Surat persetujuan Tindakan */} - + From 765d1a5ef3a525ed1a319496c90d8d49e204010b Mon Sep 17 00:00:00 2001 From: ivan-sim Date: Tue, 31 Mar 2026 10:02:29 +0700 Subject: [PATCH 7/9] Update ENV --- frontend/dashboard/.env.development | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/dashboard/.env.development b/frontend/dashboard/.env.development index 1e59ea7f..f210d357 100755 --- a/frontend/dashboard/.env.development +++ b/frontend/dashboard/.env.development @@ -5,4 +5,6 @@ PORT=8000 REACT_APP_HOST_API_URL="http://lms.test" # VITE_API_URL="https://aso-api.linksehat.dev/api/internal" +# VITE_API_URL="https://primecenter-api.linksehat.com/api/internal" VITE_API_URL="http://localhost:8000/api/internal" + From 20fa3fbc020e3ed783d4c75e7b10874e3ec9b098 Mon Sep 17 00:00:00 2001 From: ivan-sim Date: Tue, 31 Mar 2026 11:43:34 +0700 Subject: [PATCH 8/9] update Hide Approve dan Persetujuan --- .../Http/Controllers/Api/MemberController.php | 73 ++++++++++++++++--- .../dashboard/Components/DialogBenefit.tsx | 8 +- .../Components/DialogEditBenefit.tsx | 32 ++++---- .../src/sections/dashboard/DialogMember.tsx | 30 +++++--- 4 files changed, 101 insertions(+), 42 deletions(-) diff --git a/Modules/HospitalPortal/Http/Controllers/Api/MemberController.php b/Modules/HospitalPortal/Http/Controllers/Api/MemberController.php index 8992f346..83d72587 100755 --- a/Modules/HospitalPortal/Http/Controllers/Api/MemberController.php +++ b/Modules/HospitalPortal/Http/Controllers/Api/MemberController.php @@ -10,6 +10,9 @@ use Illuminate\Routing\Controller; use Illuminate\Support\Facades\Validator; use Modules\HospitalPortal\Helpers\ApiResponse; use Illuminate\Support\Facades\DB; +use App\Models\CorporateBenefit; +use App\Models\MemberPlan; +use App\Models\Plan; class MemberController extends Controller { @@ -134,26 +137,74 @@ class MemberController extends Controller $res_data['companies'] = $companies; - $corporateEmployeePremi = DB::table('corporate_employees') - ->leftJoin('corporates', 'corporates.id', '=', 'corporate_employees.corporate_id') - ->leftJoin('corporate_policies', 'corporate_policies.corporate_id', '=', 'corporates.id') - ->where('corporate_employees.status', 'ACTIVE') - ->where('corporates.active', 1) - ->where('corporate_policies.active', 1) - ->where('corporate_employees.member_id', $members->id) - ->value('corporate_policies.total_premi'); + $corporateEmployee = DB::table('corporate_employees') + ->leftJoin('corporates', 'corporates.id', '=', 'corporate_employees.corporate_id') + ->leftJoin('corporate_policies', 'corporate_policies.corporate_id', '=', 'corporates.id') + // ->where('corporate_employees.status', 'ACTIVE') + ->where('corporates.active', 1) + ->where('corporate_policies.active', 1) + ->where('corporate_employees.member_id', $members->id) + ->select( + 'corporate_policies.total_premi', + 'corporate_employees.corporate_id' + ) + ->first(); - $res_data['total_premi'] = $corporateEmployeePremi ?? 0; + $res_data['total_premi'] = $corporateEmployee ?? 0; $limitRules = DB::table('member_plans') ->leftJoin('plans', 'plans.id', '=', 'member_plans.plan_id') ->where('member_plans.member_id', $members->id) ->where('member_plans.status', 'active') ->where('plans.active', 1) - ->value('plans.limit_rules'); + ->value('plans.limit_rules'); $res_data['limit_rules'] = $limitRules ?? 0; - + + $planMember = MemberPlan::where('member_id', $members->id)->get('plan_id'); + + $planId = Plan::whereIn('id', $planMember)->where('service_code', 'OP')->first(); + $benefit = CorporateBenefit::with(['benefit', 'plan'])->where('plan_id', $planId->id)->get()->toArray(); + $benefitData = []; + if (count($benefit)){ + foreach($benefit as $data){ + $data['benefit']['plan_id'] = $data['plan_id']; + $data['benefit']['limit_amount'] = $data['limit_amount']; + $data['benefit']['family_plan'] = $planId->family_plan; + $data['benefit']['max_frequency_period'] = $data['max_frequency_period']; + $data['benefit']['limit_amount_plan'] = $data['plan']['limit_rules']; + $data['benefit']['family_plan_plans'] = $data['plan']['family_plan']; + array_push($benefitData, $data['benefit']); + } + } + $memberUsage = Helper::getUsageMember($corporateEmployee->corporate_id, $members->id, $benefitData);; + + $res_data['used_limit'] = json_decode($memberUsage); + + $usedLimit = json_decode($memberUsage, true); // jadi array + + $totalUsed = 0; + + if (is_array($usedLimit)) { + foreach ($usedLimit as $value) { + $totalUsed += (int) $value; + } + } + + $limitRules = (int) $limitRules; + + // hitung sisa + $remainingLimit = $limitRules - $totalUsed; + + // biar gak minus + if ($remainingLimit < 0) { + $remainingLimit = 0; + } + + // set ke response + $res_data['remaining_limit'] = $remainingLimit; + $res_data['total_used_limit'] = $totalUsed; + // specialities $specialities = DB::table('specialities') ->select( diff --git a/frontend/hospital-portal/src/sections/dashboard/Components/DialogBenefit.tsx b/frontend/hospital-portal/src/sections/dashboard/Components/DialogBenefit.tsx index b19297c3..460de048 100644 --- a/frontend/hospital-portal/src/sections/dashboard/Components/DialogBenefit.tsx +++ b/frontend/hospital-portal/src/sections/dashboard/Components/DialogBenefit.tsx @@ -415,7 +415,7 @@ export default function DialogBenefit({requestLog, setOpenDialog, openDialog, cl - + @@ -440,7 +440,7 @@ export default function DialogBenefit({requestLog, setOpenDialog, openDialog, cl - + @@ -464,7 +464,7 @@ export default function DialogBenefit({requestLog, setOpenDialog, openDialog, cl - + @@ -484,7 +484,7 @@ export default function DialogBenefit({requestLog, setOpenDialog, openDialog, cl - + diff --git a/frontend/hospital-portal/src/sections/dashboard/Components/DialogEditBenefit.tsx b/frontend/hospital-portal/src/sections/dashboard/Components/DialogEditBenefit.tsx index 8af53a7e..372e753a 100644 --- a/frontend/hospital-portal/src/sections/dashboard/Components/DialogEditBenefit.tsx +++ b/frontend/hospital-portal/src/sections/dashboard/Components/DialogEditBenefit.tsx @@ -26,7 +26,7 @@ type DialogDeleteType = { openDialog: boolean; setOpenDialog: any; onSubmit?: void; - data: BenefitConfigurationListType|undefined; + data: BenefitConfigurationListType|undefined; id: number|undefined; total: any } @@ -39,7 +39,7 @@ type BenefitSelected = { limit_amount: number, } -export default function DialogEditBenefit({id, data, setOpenDialog, openDialog, onSubmit, total} : DialogDeleteType ) { +export default function DialogEditBenefit({id, data, setOpenDialog, openDialog, onSubmit, total} : DialogDeleteType ) { const handleCloseDialog = () => { setOpenDialog(false); } @@ -79,7 +79,7 @@ export default function DialogEditBenefit({id, data, setOpenDialog, openDialog, const amountApproved = parseFloat(watch('amount_approved')); const amountNotApproved = parseFloat(watch('amount_not_approved')); const excessPaid = parseFloat(watch('excess_paid')); - + // Hitung total baru const totalAmountIncurred = total.totalAmountIncurred - data?.amount_incurred + amountIncurred; const totalAmountApproved = total.totalAmountApproved - data?.amount_approved + amountApproved; @@ -104,8 +104,8 @@ export default function DialogEditBenefit({id, data, setOpenDialog, openDialog, // Konversi nilai ke angka dengan aman let limitAmount = Number(benefitData.limit_amount) || 0; let limitAmountPlan = Number(benefitData.limit_amount_plan) || 0; - - if (limitAmountPlan != 999999999){ + + if (limitAmountPlan != 999999999){ let realTimeUsage = totalAll().totalAmountApproved; console.log(limitAmountPlan, 'test') if (limitAmountPlan < realTimeUsage) { @@ -162,11 +162,11 @@ export default function DialogEditBenefit({id, data, setOpenDialog, openDialog, // // alert('Total Incurred tidak sama dengan Total Approve + Total Not Approve') // // setValue('amount_approved', data?.amount_approved) // } - + // Submit Form // ===================================== const submitHandler = async (data: BenefitConfigurationListType) => { - + const response = await postEditBenefit(id, data); if (response == true) { @@ -191,19 +191,19 @@ export default function DialogEditBenefit({id, data, setOpenDialog, openDialog, setValue('keterangan', data?.keterangan) setValue('reason', data?.reason) }, [data]) - - + + const getContent = () => ( {/* */} - + {data?.benefit?.description} - + @@ -213,7 +213,7 @@ export default function DialogEditBenefit({id, data, setOpenDialog, openDialog, - - + @@ -252,7 +252,7 @@ export default function DialogEditBenefit({id, data, setOpenDialog, openDialog, - + @@ -276,7 +276,7 @@ export default function DialogEditBenefit({id, data, setOpenDialog, openDialog, - + @@ -296,7 +296,7 @@ export default function DialogEditBenefit({id, data, setOpenDialog, openDialog, - + diff --git a/frontend/hospital-portal/src/sections/dashboard/DialogMember.tsx b/frontend/hospital-portal/src/sections/dashboard/DialogMember.tsx index ac449934..91161033 100755 --- a/frontend/hospital-portal/src/sections/dashboard/DialogMember.tsx +++ b/frontend/hospital-portal/src/sections/dashboard/DialogMember.tsx @@ -1,14 +1,14 @@ // mui import { styled } from '@mui/material/styles'; import { LoadingButton, TabPanel } from "@mui/lab"; -import { - Button, - Card, - Divider, - Grid, - LinearProgress, - linearProgressClasses, - Typography, +import { + Button, + Card, + Divider, + Grid, + LinearProgress, + linearProgressClasses, + Typography, Paper, Table, TableBody, @@ -34,7 +34,7 @@ import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; export default function DialogMember(member:any, handleSubmitSuccess:() => void) { const { localeData }: any = useContext(LanguageContext); const [currentTab, setCurrentTab] = useState('request'); - + // ---------------------------------------------------------------------- useEffect(() => { @@ -77,7 +77,7 @@ export default function DialogMember(member:any, handleSubmitSuccess:() => void) ); } - + const [openRows, setOpenRows] = useState({}); const handleRowToggle = (index:number) => { @@ -120,6 +120,14 @@ export default function DialogMember(member:any, handleSubmitSuccess:() => void) Limit Peserta { member?.limit_rules ? fCurrency(member?.limit_rules) : '-'} + + Limit Terpakai + { member?.total_used_limit ? fCurrency(member?.total_used_limit) : '-'} + + + Sisa Limit + { member?.remaining_limit ? fCurrency(member?.remaining_limit) : '-'} + NRIC {member?.members.nik ?? '-'} @@ -193,7 +201,7 @@ export default function DialogMember(member:any, handleSubmitSuccess:() => void) ))} - + From 36653c4751252c95d241a0ec4438876f5874cd7b Mon Sep 17 00:00:00 2001 From: ivan-sim Date: Tue, 31 Mar 2026 13:15:57 +0700 Subject: [PATCH 9/9] update sisa limit --- .../Http/Controllers/Api/MemberController.php | 61 ++++++++++++++++--- 1 file changed, 51 insertions(+), 10 deletions(-) diff --git a/Modules/Primaya/Http/Controllers/Api/MemberController.php b/Modules/Primaya/Http/Controllers/Api/MemberController.php index 73393f83..6cef0400 100644 --- a/Modules/Primaya/Http/Controllers/Api/MemberController.php +++ b/Modules/Primaya/Http/Controllers/Api/MemberController.php @@ -146,12 +146,13 @@ class MemberController extends Controller ->first(); $res_data['total_premi'] = $corporateEmployee->total_premi ?? 0; - $res_data['limit_rules'] = DB::table('member_plans') + $limitRules = DB::table('member_plans') ->leftJoin('plans', 'plans.id', '=', 'member_plans.plan_id') ->where('member_plans.member_id', $members->id) ->where('member_plans.status', 'active') ->where('plans.active', 1) ->value('plans.limit_rules') ?? 0; + $res_data['limit_rules'] = $limitRules ?? 0; $planMember = MemberPlan::where('member_id', $members->id)->get('plan_id'); @@ -172,6 +173,31 @@ class MemberController extends Controller $memberUsage = Helper::getUsageMember($corporateEmployee->corporate_id, $members->id, $benefitData);; $res_data['used_limit'] = json_decode($memberUsage); + + $usedLimit = json_decode($memberUsage, true); + + $totalUsed = 0; + + if (is_array($usedLimit)) { + foreach ($usedLimit as $value) { + $totalUsed += (int) $value; + } + } + + $limitRules = (int) $limitRules; + + // hitung sisa + $remainingLimit = $limitRules - $totalUsed; + + // biar gak minus + if ($remainingLimit < 0) { + $remainingLimit = 0; + } + + // set ke response + $res_data['remaining_limit'] = $remainingLimit; + $res_data['total_used_limit'] = $totalUsed; + // company $companies = DB::table('corporates') ->where('corporates.active', 1) @@ -265,15 +291,21 @@ class MemberController extends Controller // =============================== // Hitung Used Limit (PAKAI HELPER) // =============================== - $benefitData = [ - [ - 'id' => $benefitId, - 'limit_amount' => $corporateBenefit->limit_amount ?? 0, + $allBenefits = CorporateBenefit::with(['benefit', 'plan']) + ->where('plan_id', $plan->id) + ->get(); + + $benefitData = []; + + foreach ($allBenefits as $data) { + $benefitData[] = [ + 'id' => $data->benefit_id, + 'limit_amount' => $data->limit_amount ?? 0, 'limit_amount_plan' => $plan->limit_rules ?? 0, 'family_plan' => $plan->family_plan ?? 'S', - 'max_frequency_period' => $corporateBenefit->max_frequency_period ?? 0 - ] - ]; + 'max_frequency_period' => $data->max_frequency_period ?? 0 + ]; + } $memberUsage = Helper::getUsageMember( $corporateEmployee->corporate_id, @@ -282,13 +314,22 @@ class MemberController extends Controller ); $usedLimitArray = json_decode($memberUsage, true); - $usedLimit = $usedLimitArray[$benefitId] ?? 0; + + // total semua benefit (INI YANG BENAR) + $totalUsedLimit = is_array($usedLimitArray) ? array_sum($usedLimitArray) : 0; + + // tetap ambil per benefit (kalau mau ditampilkan) + $usedLimit = $totalUsedLimit; // =============================== // Limit Logic // =============================== $limitPlan = $plan->limit_rules ?? 0; - $sisaLimit = $limitPlan - $usedLimit; + $sisaLimit = $limitPlan - $totalUsedLimit; + + if ($sisaLimit < 0) { + $sisaLimit = 0; + } if ($sisaLimit < 0) { $sisaLimit = 0;