diff --git a/Modules/Internal/Transformers/RequestLogShowResource.php b/Modules/Internal/Transformers/RequestLogShowResource.php index 88bd4c54..aab394a3 100644 --- a/Modules/Internal/Transformers/RequestLogShowResource.php +++ b/Modules/Internal/Transformers/RequestLogShowResource.php @@ -9,6 +9,7 @@ use App\Models\CorporateService; use App\Models\RequestLogBenefit; use App\Models\RequestLogMedicine; use App\Models\Organization; +use App\Models\Benefit; use App\Models\Exclusion; use App\Models\ClaimRequest; use App\Models\Icd; @@ -61,14 +62,15 @@ class RequestLogShowResource extends JsonResource $providerName = '-'; } + // Benefit Data $benefitData = []; - if (count($benefit)){ foreach($benefit as $data){ + $data['benefit']['limit_amount'] = $data['limit_amount']; + $data['benefit']['family_plan'] = $planId->family_plan; array_push($benefitData, $data['benefit']); } } - // Medicine $medicineData = []; if (count($medicineDetailLog)){ @@ -110,6 +112,7 @@ class RequestLogShowResource extends JsonResource ->get(); } + $memberLimit = Helper::getLimitMember($corporateId, $requestLog['member']['id'], $benefitData); $data = [ 'id' => $requestLog['id'], 'code' => $requestLog['code'], @@ -125,6 +128,7 @@ class RequestLogShowResource extends JsonResource 'gender' => $requestLog['member']['gender'], 'marital_status' => $requestLog['member']['status_marital'], 'member_type' => Helper::memberType($requestLog['member']['record_type']), + 'member_usage' => json_decode($memberLimit), 'principal_id' => $requestLog['member']['principal_id'] ? $requestLog['member']['principal_id'] : '-', 'principal_name' => $requestLog['member']['principal_id'] ? Helper::principalName($requestLog['member']['principal_id']) : '-', 'relation_with_principal' => Helper::relationWithPrincipal($requestLog['member']['relation_with_principal']), @@ -151,6 +155,7 @@ class RequestLogShowResource extends JsonResource 'reason' => $requestLog['reason'], 'diagnosis' => $icd, 'is_reversal' => $isReversal, // untuk penjagaan, jika true tidak bisa di edit/hapus lagi + ]; diff --git a/app/Helpers/Helper.php b/app/Helpers/Helper.php index ca123112..c2bb21a3 100644 --- a/app/Helpers/Helper.php +++ b/app/Helpers/Helper.php @@ -9,7 +9,9 @@ use Symfony\Component\HttpFoundation\Response; use PHPMailer\PHPMailer\PHPMailer; use Illuminate\Support\Facades\DB; use App\Models\Member; +use App\Models\RequestLogBenefit; use App\Models\User; +use App\Models\CorporatePolicy; use App\Models\Service; use App\Models\Icd; use DateTime; @@ -534,5 +536,64 @@ class Helper } } + public static function getLimitMember($corporateId, $id, $benefitData) { + // Menghitung jumlah total approved dan mengkategorikan berdasarkan benefit_id + $amountApprovedByBenefit = []; + foreach($benefitData as $benefit) { + if ($benefit['family_plan'] == 'S' || $benefit['family_plan'] == 'F'){ // Menghitung usage per family + $memberFamilys = Helper::getMemberFamily($id); + $usageLogs = RequestLogBenefit::query() + ->whereHas('requestLog', function ($query) use ($benefit, $memberFamilys) { + $query->where('benefit_id', $benefit['id']) + ->whereIn('member_id', $memberFamilys); + }) + ->sum('amount_approved'); + + // Mengkategorikan sum berdasarkan benefit_id + $amountApprovedByBenefit[$benefit['id']] = $usageLogs; + } else { // Menghitung usage permember + $usageLog = RequestLogBenefit::query() + ->whereHas('requestLog', function ($query) use ($benefit, $id) { + $query->where('benefit_id', $benefit['id']) + ->where('member_id', $id); + }) + ->sum('amount_approved'); + + // Mengkategorikan sum berdasarkan benefit_id + $amountApprovedByBenefit[$benefit['id']] = $usageLog; + } + } + + return json_encode($amountApprovedByBenefit); + + } + + public static function getMemberFamily($memberId){ + // Mengambil data member berdasarkan ID + $member = Member::where('id', $memberId)->first(); + + // Memastikan member ditemukan + if ($member) { + // Mengambil keluarga berdasarkan member_id atau principal_id + if (!$member->principal_id){ + $memberFamily = Member::where(function($query) use ($member) { + $query->where('principal_id', $member->member_id) + ->orWhere('member_id', $member->member_id); + })->pluck('id')->toArray(); + } else { + $memberFamily = Member::where(function($query) use ($member) { + $query->where('principal_id', $member->principal_id) + ->orWhere('member_id', $member->principal_id) + ->orWhere('member_id', $member->member_id); + })->pluck('id')->toArray(); + } + // Mengembalikan data keluarga + return $memberFamily; + } + + // Jika member tidak ditemukan, mengembalikan array kosong + return []; + } + } diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogBenefit.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogBenefit.tsx index b7855726..c4d527a2 100644 --- a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogBenefit.tsx +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogBenefit.tsx @@ -40,6 +40,8 @@ type BenefitSelected = { id: number, description: string, benefit_id: number, + family_plan: string, + limit_amount: number, } @@ -187,11 +189,34 @@ export default function DialogBenefit({requestLog, setOpenDialog, openDialog, cl } const handleOnChangeNominal = (key) => { - if (totalAll().totalAmountApproved > totalAll().totalAmountIncurred){ - // setValue(`benefit_data.${key}.amount_approved`, 0); - setError(`benefit_data.${key}.amount_approved`, {message: 'Amount Approve tidak boleh lebih dari Amount Incurred'}); + + if (benefitSelected[key].family_plan == 'S' || benefitSelected[key].family_plan == 'F'){ + if (requestLog?.member_usage && benefitSelected[key] && benefitData[key]) { + // Konversi nilai ke angka dengan aman + let memberUsage = Number(requestLog.member_usage[benefitSelected[key].id]) || 0; + let amountApproved = Number(benefitData[key].amount_approved) || 0; + let limitAmount = Number(benefitSelected[key].limit_amount) || 0; + + // Hitung penggunaan waktu nyata + let realTimeUsage = memberUsage + amountApproved; + + // Periksa apakah limitAmount lebih besar dari realTimeUsage + if (limitAmount < realTimeUsage) { + setError(`benefit_data.${key}.amount_approved`, { message: `Total Amount Approve sudah melebihi limit ${ fNumber(limitAmount) } , silakan isikan di Amount Excess` }); + } else if (totalAll().totalAmountApproved > totalAll().totalAmountIncurred) { + setError(`benefit_data.${key}.amount_approved`, { message: 'Total Amount Approve tidak boleh lebih dari Total Amount Incurred' }); + } else { + clearErrors(`benefit_data.${key}.amount_approved`); + } + } + } else { - clearErrors(`benefit_data.${key}.amount_approved`); + if (totalAll().totalAmountApproved > totalAll().totalAmountIncurred){ + // setValue(`benefit_data.${key}.amount_approved`, 0); + setError(`benefit_data.${key}.amount_approved`, {message: 'Amount Approve tidak boleh lebih dari Amount Incurred'}); + } else { + clearErrors(`benefit_data.${key}.amount_approved`); + } } } diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogEditBenefit.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogEditBenefit.tsx index 11f0b03f..deb87abd 100644 --- a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogEditBenefit.tsx +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogEditBenefit.tsx @@ -31,10 +31,19 @@ type DialogDeleteType = { total: any } +type BenefitSelected = { + id: number, + description: string, + benefit_id: number, + family_plan: string, + limit_amount: number, +} + export default function DialogEditBenefit({id, data, setOpenDialog, openDialog, onSubmit, total} : DialogDeleteType ) { const handleCloseDialog = () => { setOpenDialog(false); } + const [benefitSelected, setBenefitSelected] = useState([]); // setup form // ==================================== @@ -85,12 +94,37 @@ export default function DialogEditBenefit({id, data, setOpenDialog, openDialog, } } + const findItemById = (id) => { + return total.benefit.find(item => item.id === id); + } + const handleOnChangeNominal = (key) => { - if (totalAll().totalAmountApproved > totalAll().totalAmountIncurred){ - // setValue(`benefit_data.${key}.amount_approved`, 0); - setError(`amount_approved`, {message: 'Amount Approve tidak boleh lebih dari Amount Incurred'}); + let benefitData = findItemById(data?.benefit_id) + if (benefitData.family_plan == 'S' || benefitData.family_plan == 'F'){ + // Konversi nilai ke angka dengan aman + let memberUsage = Number(total.totalLimit[benefitData.id]) || 0; + let amountApproved = Number(parseFloat(watch('amount_approved'))) || 0; + let limitAmount = Number(benefitData.limit_amount) || 0; + // Hitung penggunaan waktu nyata + let realTimeUsage = memberUsage + amountApproved; + console.log(limitAmount, realTimeUsage) + // Periksa apakah limitAmount lebih besar dari realTimeUsage + if (limitAmount < realTimeUsage) { + setError(`amount_approved`, { message: `Total Amount Approve sudah melebihi limit ${ fNumber(limitAmount) } , silakan isikan di Amount Excess` }); + } else if (totalAll().totalAmountApproved > totalAll().totalAmountIncurred){ + // setValue(`benefit_data.${key}.amount_approved`, 0); + setError(`amount_approved`, {message: 'Amount Approve tidak boleh lebih dari Amount Incurred'}); + } else { + clearErrors(`amount_approved`); + } + } else { - clearErrors(`amount_approved`); + if (totalAll().totalAmountApproved > totalAll().totalAmountIncurred){ + // setValue(`benefit_data.${key}.amount_approved`, 0); + setError(`amount_approved`, {message: 'Amount Approve tidak boleh lebih dari Amount Incurred'}); + } else { + clearErrors(`amount_approved`); + } } } diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Detail.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Detail.tsx index 4380e2e6..c736f907 100644 --- a/frontend/dashboard/src/pages/CustomerService/FinalLog/Detail.tsx +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Detail.tsx @@ -140,6 +140,8 @@ export default function Detail() { totalAmountApproved : totalAmountApprove, totalAmountNotApproved : totalAmountNotApprove, totalExcessPaid : totalExcessPaid, + totalLimit : requestLog?.member_usage, + benefit : requestLog?.benefit, } // Handle Delete File LOG const [pathFile, setPathFile] = useState('') diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Model/Types.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Model/Types.tsx index 8b2a0a4f..74c027f7 100644 --- a/frontend/dashboard/src/pages/CustomerService/FinalLog/Model/Types.tsx +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Model/Types.tsx @@ -60,6 +60,7 @@ export type DetailFinalLogType = { exclusion : Exclusion[], medicine : Medicine[], files : file[], + member_usage : number } export type Diagnosis = { @@ -84,6 +85,7 @@ export type BenefitData = { export type BenefitConfigurationListType = { request_log_id: number|undefined, benefit_name: string, + benefit_id: number, benefit: { description: string },