import * as Yup from 'yup'; import { yupResolver } from '@hookform/resolvers/yup'; import MuiDialog from "@/components/MuiDialog"; import { Checkbox, Typography, FormControl, Card, Grid, DialogActions, IconButton, Autocomplete } from "@mui/material"; import { Paper } from "@mui/material"; import { Stack } from '@mui/material'; import React, { useEffect, useState } from 'react'; import { DetailFinalLogType } from "../Model/Types"; import { BenefitConfigurationListType } from "../Model/Types"; import { InputLabel, Select, FormHelperText } from "@mui/material"; import FormGroup from '@mui/material/FormGroup'; import FormControlLabel from '@mui/material/FormControlLabel'; import Button from '@mui/material/Button'; import { fNumber } from "@/utils/formatNumber"; import palette from "@/theme/palette"; import { Box } from "@mui/material"; import { FormProvider, RHFTextField } from "@/components/hook-form"; import RHFTextFieldMoney from '@/components/hook-form/v2/RHFTextFieldMoney'; import { useFieldArray, useForm, useWatch } from 'react-hook-form'; import { LoadingButton } from '@mui/lab'; import { postAddBenefit } from '../Model/Functions'; import { useNavigate } from 'react-router'; import { description } from '@/_mock/text'; import { Delete } from '@mui/icons-material'; import { TextField } from '@mui/material'; import RHFAutocomplete from '@/components/hook-form/RHFAutocomplete'; type DialogConfirmationType = { openDialog: boolean; setOpenDialog: any; onSubmit?: void; requestLog: DetailFinalLogType|undefined; claimInput:boolean } type BenefitSelected = { id: number, description: string, benefit_id: number, family_plan: string, limit_amount: number, } export default function DialogBenefit({requestLog, setOpenDialog, openDialog, claimInput = false } : DialogConfirmationType ) { // Add Benefit const [addBenefit, setAddBenefit] = useState(false) const navigate = useNavigate() //Benefit Name const [valBenefitNames, setValBenefitNames] = useState([]); const [valBenefitNameError, setValBenefitNameError] = useState(''); const benefitNameData = requestLog?.benefit; const [benefitSelected, setBenefitSelected] = useState([]); const handleConditionChangeService = (event) => { const selectedItem = event.target.value; if (valBenefitNames.includes(selectedItem)) { // Item is already selected, remove it setValBenefitNames(valBenefitNames.filter(item => item !== selectedItem)); } else { // Item is not selected, add it setValBenefitNames([...valBenefitNames, selectedItem]); } }; const reasons = [ { value: 'Wrong Setting', label: 'Wrong Setting' }, { value: 'Hospital Request', label: 'Hospital Request' } ]; useEffect(() => { const datax: any[] = [] valBenefitNames.map((data) => { benefitNameData?.map((row) => { if(row.id == data) { datax.push(row) } }) }) // for data information let temp = datax.map((item, indx) => { return { benefit_id: item.id, description: item.description, request_log_id: requestLog?.id, amount_incurred: 0, amount_approved: 0, amount_not_approved: 0, excess_paid: 0, keterangan: '', reason: null } }) reset({benefit_data: temp}) setBenefitSelected(datax) }, [valBenefitNames]) const handleCloseDialogBenefit = () => { // setOpenDialog(false); setAddBenefit(false) setBenefitSelected([]) setValBenefitNames([]) } const handleAddDialogBenefit = () => { setAddBenefit(true) } const defaultValues: BenefitConfigurationListType = { request_log_id: requestLog?.id, benefit_name: '', amount_incurred: 0, amount_approved: 0, amount_not_approved: 0, excess_paid: 0, reason: null }; const validationSchema = Yup.object().shape({ benefit_data: Yup.array().of( claimInput ? Yup.object().shape({ amount_incurred : Yup.number().typeError('').required(''), amount_approved : Yup.number().typeError('').required(''), amount_not_approved : Yup.number().typeError('').required(''), excess_paid : Yup.number().typeError('').required(''), // reason : Yup.string().required(''), }) : Yup.object().shape({ amount_incurred : Yup.number().typeError('').required(''), amount_approved : Yup.number().typeError('').required(''), amount_not_approved : Yup.number().typeError('').required(''), excess_paid : Yup.number().typeError('').required(''), }) ) }) const methods = useForm({ resolver: yupResolver(validationSchema), defaultValues, reValidateMode: "onChange" }); let width = claimInput ? 2 : 2.36; const {fields, append, remove} = useFieldArray({name: 'benefit_data',control: methods.control,}); const { handleSubmit, reset, watch, setValue, setError, clearErrors, formState: { isDirty, isSubmitting, errors,isValid } } = methods const errorsExist = errors ? Object.keys(errors).length > 0 : false; // Calculate const benefitData = watch('benefit_data'); const totalAll = () => { let totalAmountIncurred = (requestLog?.benefit_data || []).reduce((accumulator, item) => { return accumulator + (item.amount_incurred || 0); }, 0); let totalAmountApproved = (requestLog?.benefit_data || []).reduce((accumulator, item) => { return accumulator + (item.amount_approved || 0); }, 0); let totalAmountNotApproved = (requestLog?.benefit_data || []).reduce((accumulator, item) => { return accumulator + (item.amount_not_approved || 0); }, 0); let totalExcessPaid = (requestLog?.benefit_data || []).reduce((accumulator, item) => { return accumulator + (item.excess_paid || 0); }, 0); benefitData?.map((item, index) => { totalAmountIncurred += parseFloat(item.amount_incurred); totalAmountApproved += parseFloat(item.amount_approved); totalAmountNotApproved += parseFloat(item.amount_not_approved); totalExcessPaid += parseFloat(item.excess_paid); }); return { totalAmountIncurred, totalAmountApproved, totalAmountNotApproved, totalExcessPaid } } const handleOnChangeNominal = (key) => { 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 { 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`); } } } // Submit Form // ===================================== const submitHandler = async (data: BenefitConfigurationListType) => { const mapData = data.benefit_data.map((item) => ({ ...item, reason: item.reason ? item.reason.value : null })); const newData = { ...data, benefit_data: mapData }; const response = await postAddBenefit(newData); if (response == true) { reset(); // navigate('custormer-service/final-log/detail/'+requestLog?.id); window.location.reload() } } const getContent = () => !addBenefit ? ( Benefit Name* Benefit Name {valBenefitNameError} ) : ( {/* */} {fields?.map((item, index) => ( {item.description} Amount Incurred* { setValue(`benefit_data.${index}.amount_incurred`, event.target.value) handleOnChangeNominal(index)} } /> Amount Approved* append({amount_approved: ''}) } id='amount_approved' key={item.id} name={`benefit_data.${index}.amount_approved`} placeholder='Amount Approved' required onChange={(event) => { setValue(`benefit_data.${index}.amount_approved`, event.target.value) handleOnChangeNominal(index)} } /> Amount Not Approved* append({amount_not_approved: ''}) } id='amount_not_approved' key={item.id} name={`benefit_data.${index}.amount_not_approved`} placeholder='Amount Not Approved' required /> Excess Paid* append({excess_paid: ''}) } id='excess_paid' key={item.id} name={`benefit_data.${index}.excess_paid`} placeholder='Excess Paid' required /> Keterangan append({keterangan: ''}) } id='keterangan' key={item.id} name={`benefit_data.${index}.keterangan`} placeholder='Keterangan' /> {claimInput ? ( Reason* option.label} fullWidth value={benefitData[index]?.reason} // Use find to match the default value onChange={(event, newValue) => { // Update the value in the form data setValue(`benefit_data.${index}.reason`, newValue); }} renderInput={(params) => ( )} /> ) : null} { fields.length > 1 ? ( remove(index)}> ) : null } ))}


Total Benefit {/* Amount Incurred */} Amount Incurred {fNumber(totalAll().totalAmountIncurred)} {/* Amount Approved */} Amount Approved {fNumber(totalAll().totalAmountApproved)} {/* Amount Not Approved */} Amount Not Approved {fNumber(totalAll().totalAmountNotApproved)} {/* Excess Paid* */} Excess Paid {fNumber(totalAll().totalExcessPaid)} {/*
*/} Save
); const getAction = () => !addBenefit ? ( ) : null; return ( ); }