penjagaan limit realtime
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
];
|
||||
|
||||
|
||||
@@ -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 [];
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -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`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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('')
|
||||
|
||||
@@ -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
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user