penjagaan limit realtime
This commit is contained in:
@@ -9,6 +9,7 @@ use App\Models\CorporateService;
|
|||||||
use App\Models\RequestLogBenefit;
|
use App\Models\RequestLogBenefit;
|
||||||
use App\Models\RequestLogMedicine;
|
use App\Models\RequestLogMedicine;
|
||||||
use App\Models\Organization;
|
use App\Models\Organization;
|
||||||
|
use App\Models\Benefit;
|
||||||
use App\Models\Exclusion;
|
use App\Models\Exclusion;
|
||||||
use App\Models\ClaimRequest;
|
use App\Models\ClaimRequest;
|
||||||
use App\Models\Icd;
|
use App\Models\Icd;
|
||||||
@@ -61,14 +62,15 @@ class RequestLogShowResource extends JsonResource
|
|||||||
$providerName = '-';
|
$providerName = '-';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Benefit Data
|
||||||
$benefitData = [];
|
$benefitData = [];
|
||||||
|
|
||||||
if (count($benefit)){
|
if (count($benefit)){
|
||||||
foreach($benefit as $data){
|
foreach($benefit as $data){
|
||||||
|
$data['benefit']['limit_amount'] = $data['limit_amount'];
|
||||||
|
$data['benefit']['family_plan'] = $planId->family_plan;
|
||||||
array_push($benefitData, $data['benefit']);
|
array_push($benefitData, $data['benefit']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Medicine
|
// Medicine
|
||||||
$medicineData = [];
|
$medicineData = [];
|
||||||
if (count($medicineDetailLog)){
|
if (count($medicineDetailLog)){
|
||||||
@@ -110,6 +112,7 @@ class RequestLogShowResource extends JsonResource
|
|||||||
->get();
|
->get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$memberLimit = Helper::getLimitMember($corporateId, $requestLog['member']['id'], $benefitData);
|
||||||
$data = [
|
$data = [
|
||||||
'id' => $requestLog['id'],
|
'id' => $requestLog['id'],
|
||||||
'code' => $requestLog['code'],
|
'code' => $requestLog['code'],
|
||||||
@@ -125,6 +128,7 @@ class RequestLogShowResource extends JsonResource
|
|||||||
'gender' => $requestLog['member']['gender'],
|
'gender' => $requestLog['member']['gender'],
|
||||||
'marital_status' => $requestLog['member']['status_marital'],
|
'marital_status' => $requestLog['member']['status_marital'],
|
||||||
'member_type' => Helper::memberType($requestLog['member']['record_type']),
|
'member_type' => Helper::memberType($requestLog['member']['record_type']),
|
||||||
|
'member_usage' => json_decode($memberLimit),
|
||||||
'principal_id' => $requestLog['member']['principal_id'] ? $requestLog['member']['principal_id'] : '-',
|
'principal_id' => $requestLog['member']['principal_id'] ? $requestLog['member']['principal_id'] : '-',
|
||||||
'principal_name' => $requestLog['member']['principal_id'] ? Helper::principalName($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']),
|
'relation_with_principal' => Helper::relationWithPrincipal($requestLog['member']['relation_with_principal']),
|
||||||
@@ -151,6 +155,7 @@ class RequestLogShowResource extends JsonResource
|
|||||||
'reason' => $requestLog['reason'],
|
'reason' => $requestLog['reason'],
|
||||||
'diagnosis' => $icd,
|
'diagnosis' => $icd,
|
||||||
'is_reversal' => $isReversal, // untuk penjagaan, jika true tidak bisa di edit/hapus lagi
|
'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 PHPMailer\PHPMailer\PHPMailer;
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
use App\Models\Member;
|
use App\Models\Member;
|
||||||
|
use App\Models\RequestLogBenefit;
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
|
use App\Models\CorporatePolicy;
|
||||||
use App\Models\Service;
|
use App\Models\Service;
|
||||||
use App\Models\Icd;
|
use App\Models\Icd;
|
||||||
use DateTime;
|
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,
|
id: number,
|
||||||
description: string,
|
description: string,
|
||||||
benefit_id: number,
|
benefit_id: number,
|
||||||
|
family_plan: string,
|
||||||
|
limit_amount: number,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -187,11 +189,34 @@ export default function DialogBenefit({requestLog, setOpenDialog, openDialog, cl
|
|||||||
}
|
}
|
||||||
|
|
||||||
const handleOnChangeNominal = (key) => {
|
const handleOnChangeNominal = (key) => {
|
||||||
if (totalAll().totalAmountApproved > totalAll().totalAmountIncurred){
|
|
||||||
// setValue(`benefit_data.${key}.amount_approved`, 0);
|
if (benefitSelected[key].family_plan == 'S' || benefitSelected[key].family_plan == 'F'){
|
||||||
setError(`benefit_data.${key}.amount_approved`, {message: 'Amount Approve tidak boleh lebih dari Amount Incurred'});
|
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 {
|
} 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
|
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 ) {
|
export default function DialogEditBenefit({id, data, setOpenDialog, openDialog, onSubmit, total} : DialogDeleteType ) {
|
||||||
const handleCloseDialog = () => {
|
const handleCloseDialog = () => {
|
||||||
setOpenDialog(false);
|
setOpenDialog(false);
|
||||||
}
|
}
|
||||||
|
const [benefitSelected, setBenefitSelected] = useState<BenefitSelected[]>([]);
|
||||||
|
|
||||||
// setup form
|
// 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) => {
|
const handleOnChangeNominal = (key) => {
|
||||||
if (totalAll().totalAmountApproved > totalAll().totalAmountIncurred){
|
let benefitData = findItemById(data?.benefit_id)
|
||||||
// setValue(`benefit_data.${key}.amount_approved`, 0);
|
if (benefitData.family_plan == 'S' || benefitData.family_plan == 'F'){
|
||||||
setError(`amount_approved`, {message: 'Amount Approve tidak boleh lebih dari Amount Incurred'});
|
// 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 {
|
} 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,
|
totalAmountApproved : totalAmountApprove,
|
||||||
totalAmountNotApproved : totalAmountNotApprove,
|
totalAmountNotApproved : totalAmountNotApprove,
|
||||||
totalExcessPaid : totalExcessPaid,
|
totalExcessPaid : totalExcessPaid,
|
||||||
|
totalLimit : requestLog?.member_usage,
|
||||||
|
benefit : requestLog?.benefit,
|
||||||
}
|
}
|
||||||
// Handle Delete File LOG
|
// Handle Delete File LOG
|
||||||
const [pathFile, setPathFile] = useState('')
|
const [pathFile, setPathFile] = useState('')
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ export type DetailFinalLogType = {
|
|||||||
exclusion : Exclusion[],
|
exclusion : Exclusion[],
|
||||||
medicine : Medicine[],
|
medicine : Medicine[],
|
||||||
files : file[],
|
files : file[],
|
||||||
|
member_usage : number
|
||||||
}
|
}
|
||||||
|
|
||||||
export type Diagnosis = {
|
export type Diagnosis = {
|
||||||
@@ -84,6 +85,7 @@ export type BenefitData = {
|
|||||||
export type BenefitConfigurationListType = {
|
export type BenefitConfigurationListType = {
|
||||||
request_log_id: number|undefined,
|
request_log_id: number|undefined,
|
||||||
benefit_name: string,
|
benefit_name: string,
|
||||||
|
benefit_id: number,
|
||||||
benefit: {
|
benefit: {
|
||||||
description: string
|
description: string
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user