penjagaan limit realtime

This commit is contained in:
2024-06-25 13:29:40 +07:00
parent 150216fb87
commit 13d54063e4
6 changed files with 139 additions and 10 deletions

View File

@@ -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
];

View File

@@ -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 [];
}
}

View File

@@ -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`);
}
}
}

View File

@@ -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<BenefitSelected[]>([]);
// 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`);
}
}
}

View File

@@ -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('')

View File

@@ -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
},