diff --git a/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php b/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php index 584b7264..b74a79be 100644 --- a/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php +++ b/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php @@ -231,13 +231,13 @@ class ClaimRequestController extends Controller { $claimRequest = ClaimRequest::findOrFail($id); $claimRequest->load([ - 'histories' => function ($history) { - $history->latest(); + 'requestLog', + 'requestLog.organization', + 'requestLog.member', + 'member.currentPlan' => function($memberPlan) { + $memberPlan->join('claim_requests', 'claim_requests.service_code', '=', 'plans.service_code'); }, - 'files', - 'member', - 'claim', - 'organization', + 'requestLog.files', ]); return Helper::responseJson(data: ClaimRequestShowResource::make($claimRequest)); diff --git a/Modules/Internal/Http/Controllers/Api/RequestLogBenefitController.php b/Modules/Internal/Http/Controllers/Api/RequestLogBenefitController.php index 928c690b..4d32cfa2 100644 --- a/Modules/Internal/Http/Controllers/Api/RequestLogBenefitController.php +++ b/Modules/Internal/Http/Controllers/Api/RequestLogBenefitController.php @@ -74,6 +74,7 @@ class RequestLogBenefitController extends Controller 'excess_paid' => $value['excess_paid'], 'keterangan' => $value['keterangan'], 'created_by' => auth()->user()->id, + 'reason' => $value['reason'] ? $value['reason'] : null , ]; // Insert Data @@ -121,6 +122,7 @@ class RequestLogBenefitController extends Controller $requestLogBenefit->keterangan = $request->keterangan; $requestLogBenefit->updated_by = auth()->user()->id; $requestLogBenefit->updated_at = Carbon::now(); + $requestLogBenefit->reason = $request->reason; $requestLogBenefit->save(); @@ -136,10 +138,14 @@ class RequestLogBenefitController extends Controller * @param int $id * @return Renderable */ - public function destroy($id) + public function destroy(Request $request, $id) { $requestLogBenefit = RequestLogBenefit::findOrFail($id); - $requestLogBenefit->delete(); + $requestLogBenefit->reason = 'Reason Delete ' .$request->reason; + $requestLogBenefit->deleted_at = Carbon::now(); + $requestLogBenefit->deleted_by = auth()->user()->id; + + $requestLogBenefit->save(); } } diff --git a/Modules/Internal/Routes/api.php b/Modules/Internal/Routes/api.php index 303a75dc..20541d8a 100644 --- a/Modules/Internal/Routes/api.php +++ b/Modules/Internal/Routes/api.php @@ -278,7 +278,7 @@ Route::prefix('internal')->group(function () { // insert benefit Route::post('customer-service/request/insert-benefit', [RequestLogBenefitController::class, 'store']); - Route::delete('customer-service/request/benefit_data/{id}', [RequestLogBenefitController::class, 'destroy']); + Route::post('customer-service/request/benefit_data/{id}', [RequestLogBenefitController::class, 'destroy']); Route::put('customer-service/request/benefit_data/{id}', [RequestLogBenefitController::class, 'update']); // insert medicine diff --git a/Modules/Internal/Transformers/ClaimRequestShowResource.php b/Modules/Internal/Transformers/ClaimRequestShowResource.php index e982b4f1..39923a97 100644 --- a/Modules/Internal/Transformers/ClaimRequestShowResource.php +++ b/Modules/Internal/Transformers/ClaimRequestShowResource.php @@ -35,23 +35,50 @@ class ClaimRequestShowResource extends JsonResource $benefitData = []; + $total_amount_incurred = 0; + $total_amount_approved = 0; + $total_amount_not_approved = 0; + $total_excess_paid = 0; + if (count($benefit)){ foreach($benefit as $row){ array_push($benefitData, $row['benefit']); } } + if (count($benefitDetailLog)){ + foreach($benefitDetailLog as $row){ + $total_amount_incurred += $row['amount_incurred']; + $total_amount_approved += $row['amount_approved']; + $total_amount_not_approved += $row['amount_not_approved']; + $total_excess_paid += $row['excess_paid']; + } + } + // Policy Number $policyNumber = CorporatePolicy::query() ->where('corporate_id', $corporateId) ->first(); + $requestLogData = [ + 'id' => $data['request_log_id'], + 'benefit' => $benefitData, + 'benefit_data' => $benefitDetailLog, + 'total_amount_incurred' => $total_amount_incurred, + 'total_amount_approved' => $total_amount_approved, + 'total_amount_not_approved' => $total_amount_not_approved, + 'total_amount_incurred' => $total_amount_incurred, + 'total_excess_paid' => $total_excess_paid, + ]; + $response = [ 'id' => $data['id'], 'code' => $data['code'], 'request_log_id' => $data['request_log_id'], + 'request_log' => $requestLogData, 'provider' => $data['request_log']['organization']['name'], + 'provider_code' => $data['request_log']['organization']['code'], 'member_id' => $data['request_log']['member']['member_id'], 'policy_number' => $policyNumber->code ? $policyNumber->code : '-', 'name' => $data['request_log']['member']['name'], @@ -71,8 +98,7 @@ class ClaimRequestShowResource extends JsonResource 'service_type' => Helper::serviceName( $data['request_log']['service_code']), 'claim_method' => $data['request_log']['payment_type'], 'files' => $data['request_log']['files'], - 'benefit' => $benefitData, - 'benefit_data' => $benefitDetailLog, + // 'benefit_data' => $benefitDetailLog, ]; diff --git a/database/migrations/2024_02_21_152813_add_coloumn_to_request_log_benefit_table.php b/database/migrations/2024_02_21_152813_add_coloumn_to_request_log_benefit_table.php new file mode 100644 index 00000000..2d523b4d --- /dev/null +++ b/database/migrations/2024_02_21_152813_add_coloumn_to_request_log_benefit_table.php @@ -0,0 +1,32 @@ +string('reason')->nullable()->after('keterangan'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('request_log_benefits', function (Blueprint $table) { + $table->dropColumn('reason'); + }); + } +}; diff --git a/database/migrations/2024_02_22_151335_add_coloumn_to_request_log_benefit_table.php b/database/migrations/2024_02_22_151335_add_coloumn_to_request_log_benefit_table.php new file mode 100644 index 00000000..354eed08 --- /dev/null +++ b/database/migrations/2024_02_22_151335_add_coloumn_to_request_log_benefit_table.php @@ -0,0 +1,32 @@ +softDeletes(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('request_log_benefits', function (Blueprint $table) { + $table->dropSoftDeletes(); + }); + } +}; diff --git a/frontend/dashboard/src/@types/claims.ts b/frontend/dashboard/src/@types/claims.ts index d1938af7..40e282a0 100644 --- a/frontend/dashboard/src/@types/claims.ts +++ b/frontend/dashboard/src/@types/claims.ts @@ -17,6 +17,7 @@ export type ClaimRequest = { claim: { organization: Organizations } + provider_code: string, organization: { code: string } diff --git a/frontend/dashboard/src/pages/ClaimRequests/Components/FormEdit.tsx b/frontend/dashboard/src/pages/ClaimRequests/Components/FormEdit.tsx index f91d3284..80811203 100644 --- a/frontend/dashboard/src/pages/ClaimRequests/Components/FormEdit.tsx +++ b/frontend/dashboard/src/pages/ClaimRequests/Components/FormEdit.tsx @@ -68,11 +68,11 @@ export default function FormEdit({ isEdit, currentClaim }: Props) { () => ({ id: currentClaim?.id || '-', code: currentClaim?.code || '-', - member_name: currentClaim?.member?.name || '-', + member_name: currentClaim?.name || '-', date: currentClaim?.submission_date ? fDateTimesecond(currentClaim?.submission_date) : '-', - claim_method: currentClaim?.payment_type || '-', - service_type: currentClaim?.service_code || '-', - organization_id: currentClaim?.organization?.code || '-', + claim_method: currentClaim?.claim_method || '-', + service_type: currentClaim?.service_type || '-', + organization_id: currentClaim?.provider_code || '-', }), [currentClaim] ); @@ -197,7 +197,7 @@ export default function FormEdit({ isEdit, currentClaim }: Props) { Name - {currentClaim?.member?.name} + {currentClaim?.name} Date of Submission @@ -205,15 +205,15 @@ export default function FormEdit({ isEdit, currentClaim }: Props) { Claim Method - {currentClaim?.payment_type} + {currentClaim?.claim_method} Service Type - {currentClaim?.service_name || '-'} + {currentClaim?.service_type || '-'} Code Provider - {currentClaim?.organization?.code || '-'} + {currentClaim?.provider_code || '-'} diff --git a/frontend/dashboard/src/pages/ClaimRequests/Detail.tsx b/frontend/dashboard/src/pages/ClaimRequests/Detail.tsx index c9607120..a4d31d16 100644 --- a/frontend/dashboard/src/pages/ClaimRequests/Detail.tsx +++ b/frontend/dashboard/src/pages/ClaimRequests/Detail.tsx @@ -28,13 +28,17 @@ import { fDateTimesecond } from '@/utils/formatTime'; import { makeFormData } from '@/utils/jsonToFormData'; import { enqueueSnackbar } from 'notistack'; -import { DetailClaimRequest } from './Model/Types'; +import { BenefitData, DetailClaimRequest } from './Model/Types'; import { Delete, EditOutlined } from '@mui/icons-material'; import { fNumber } from '@/utils/formatNumber'; import palette from '@/theme/palette'; import MoreMenu from '@/components/MoreMenu'; import DialogUploadFileFinalLog from './Components/DialogUploadFileFinalLog'; import DialogDeleteFileLog from './Components/DialogDeleteFileLog'; +import DialogBenefit from '../CustomerService/FinalLog/Components/DialogBenefit'; +import DialogDeleteBenefit from '../CustomerService/FinalLog/Components/DialogDeleteBenefit'; +import DialogEditBenefit from '../CustomerService/FinalLog/Components/DialogEditBenefit'; + // ---------------------------------------------------------------------- @@ -80,10 +84,10 @@ export default function Detail() { marginBottom: 1, } - const [openDialogSubmit, setOpenDialogSubmit] = useState(false); - const handleCloseDialogSubmit = () => { - setOpenDialogSubmit(false); - } + + // Handle Add Benefit + const [openDialogBenefit, setDialogBenefit] = useState(false); + const [approve, setApprove] = useState(''); // Handle Delete File LOG @@ -94,19 +98,28 @@ export default function Detail() { const [dialogUploadFileLog, setDialogUploadFileLog] = useState(false) // Buat total data - const totalAmountIncurred = (claimRequests?.benefit_data || []).reduce((accumulator, item) => { - return accumulator + (item.amount_incurred || 0); - }, 0); - const totalAmountApprove = (claimRequests?.benefit_data || []).reduce((accumulator, item) => { - return accumulator + (item.amount_approved || 0); - }, 0); - const totalAmountNotApprove = (claimRequests?.benefit_data || []).reduce((accumulator, item) => { - return accumulator + (item.amount_not_approved || 0); - }, 0); - const totalExcessPaid = (claimRequests?.benefit_data || []).reduce((accumulator, item) => { - return accumulator + (item.excess_paid || 0); - }, 0); - + // const totalAmountIncurred = (claimRequests?.benefit_data || []).reduce((accumulator, item) => { + // return accumulator + (item.amount_incurred || 0); + // }, 0); + const totalAmountIncurred = claimRequests?.request_log?.total_amount_incurred; + const totalAmountApproved = claimRequests?.request_log?.total_amount_approved; + const totalAmountNotApproved = claimRequests?.request_log?.total_amount_not_approved + const totalExcessPaid = claimRequests?.request_log?.total_excess_paid + + // Handle Delete Detail Benefit + const [idBenefitData, setIdBenefitData] = useState(); + const [openDialogDeleteBenefit, setDialogDeleteBenefit] = useState(false) + + // Handle Edit Detail Benefit + const [openDialogEditBenefit, setDialogEditBenefit] = useState(false) + const [BenefitConfigurationData, setBenefitConfigurationData] = useState(); + + const total = { + totalAmountIncurred : totalAmountIncurred, + totalAmountApproved : totalAmountApproved, + totalAmountNotApproved : totalAmountNotApproved, + totalExcessPaid : totalExcessPaid, + } return ( @@ -269,14 +282,14 @@ export default function Detail() { Benefit - {claimRequests?.benefit_data?.map((item, index) => ( + {claimRequests?.request_log?.benefit_data?.map((item, index) => ( @@ -289,17 +302,17 @@ export default function Detail() { { - // setDialogEditBenefit(true) - // setIdBenefitData(item.id) - // setBenefitConfigurationData(item) + setDialogEditBenefit(true) + setIdBenefitData(item.id) + setBenefitConfigurationData(item) }} > Edit { - // setIdBenefitData(item.id) - // setDialogDeleteBenefit(true) + setIdBenefitData(item.id) + setDialogDeleteBenefit(true) }} > @@ -367,7 +380,7 @@ export default function Detail() { - Excess Paid* + Excess Paid @@ -383,7 +396,7 @@ export default function Detail() { - Keterangan* + Keterangan @@ -402,95 +415,95 @@ export default function Detail() { ))}

- {claimRequests?.benefit_data && claimRequests.benefit_data.length > 0 ? ( - - - - - - - Total Benefit - + {claimRequests?.request_log?.benefit_data && claimRequests?.request_log?.benefit_data.length > 0 ? ( + + + + + + + Total Benefit + + + - + + + + + {/* Amount Incurred */} + + + + + Amount Incurred + + + + + {totalAmountIncurred ? fNumber(totalAmountIncurred) : '0'} + + + + + + {/* Amount Approved */} + + + + + Amount Approved + + + + + {totalAmountApproved ? fNumber(totalAmountApproved) : '0'} + + + + + + {/* Amount Not Approved */} + + + + + Amount Not Approved + + + + + {totalAmountNotApproved ? fNumber(totalAmountNotApproved) : 0} + + + + + + {/* Excess Paid* */} + + + + + Excess Paid + + + + + {totalExcessPaid ? fNumber(totalExcessPaid) : 0} + + + + + + + + - - - - - {/* Amount Incurred */} - - - - - Amount Incurred - - - - - {fNumber(totalAmountIncurred)} - - - - - - {/* Amount Approved */} - - - - - Amount Approved - - - - - {fNumber(totalAmountApprove)} - - - - - - {/* Amount Not Approved */} - - - - - Amount Not Approved - - - - - {fNumber(totalAmountNotApprove)} - - - - - - {/* Excess Paid* */} - - - - - Excess Paid - - - - - {fNumber(totalExcessPaid)} - - - - - - - - - - ) - : ( - null - )} + ) + : ( + null + )}
@@ -500,26 +513,28 @@ export default function Detail() { > */} - {/* {/* Dialog Edit */} - {/* */} + total={total} + /> {/* Dialog Delete */} - {/* */} + /> {/* Dialog Edit Detai; */} {/* => { + const response = await axios.post(`customer-service/request/insert-benefit`, { + ...data + }) + .then((res) =>{ + enqueueSnackbar(res.data.message, { + variant: 'success', + }); + + return true; + }) + .catch((res) => { + if (res.response.status == 400) { + let arr_message = res.response.data.message; + + // for (const key in arr_message) { + enqueueSnackbar(arr_message, { + variant: 'warning', + }); + // } + } + else { + enqueueSnackbar("server error !", { + variant: 'error', + }); + } + + return false; + }); + + return response; +} + +/** + * Edit Benefit + */ +export const postEditBenefit = async (id:number|undefined, data: BenefitConfigurationListType):Promise => { + const response = await axios.put(`customer-service/request/benefit_data/${id}`, { + ...data + }) + .then((res) =>{ + enqueueSnackbar(res.data.message, { + variant: 'success', + }); + + return true; + }) + .catch((res) => { + if (res.response.status == 400) { + let arr_message = res.response.data.message; + + // for (const key in arr_message) { + enqueueSnackbar(arr_message, { + variant: 'warning', + }); + // } + } + else { + enqueueSnackbar("server error !", { + variant: 'error', + }); + } + + return false; + }); + + return response; +} diff --git a/frontend/dashboard/src/pages/ClaimRequests/Model/Types.tsx b/frontend/dashboard/src/pages/ClaimRequests/Model/Types.tsx index cf9295eb..e62ad097 100644 --- a/frontend/dashboard/src/pages/ClaimRequests/Model/Types.tsx +++ b/frontend/dashboard/src/pages/ClaimRequests/Model/Types.tsx @@ -1,3 +1,5 @@ +import { Member } from "@/@types/member" + /** * Search Type */ @@ -48,6 +50,45 @@ export type DetailClaimRequest = { files : file[], benefit_data : BenefitData[], diagnosis : Diagnosis[], + request_log : RequestLogType | undefined, +} + +export type RequestLogType = { + id : number, + code : string, + member : Member, + submission_date : string, + admission_date : string, + service_name : string, + provider : string, + member_name : string, + payment_type_name : string, + status_final_log : string, + status : string, + files_by_type : files_by_type, + total_amount_incurred : number | undefined, + total_amount_approved : number | undefined, + total_amount_not_approved : number | undefined, + total_excess_paid : number | undefined, + benefit_data : benefit_data[] | undefined +} + +export type benefit_data = { + benefit : { + description : string + }, + id : number, + amount_incurred : number, + amount_approved : number, + amount_not_approved : number, + excess_paid : number, + keterangan : string, +} + +export type files_by_type = { + claim_diagnosis : file[], + claim_kondisi : file[], + claim_result : file[], } export type Benefit = { diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogBenefit.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogBenefit.tsx index 353b61c8..c2e82765 100644 --- a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogBenefit.tsx +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogBenefit.tsx @@ -2,7 +2,7 @@ import * as Yup from 'yup'; import { yupResolver } from '@hookform/resolvers/yup'; import MuiDialog from "@/components/MuiDialog"; -import { Checkbox, Typography, FormControl, Card, Grid, DialogActions } from "@mui/material"; +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'; @@ -18,11 +18,14 @@ import { Box } from "@mui/material"; import { FormProvider, RHFTextField } from "@/components/hook-form"; import RHFTextFieldMoney from '@/components/hook-form/v2/RHFTextFieldMoney'; -import { useFieldArray, useForm } from 'react-hook-form'; +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 = { @@ -30,6 +33,7 @@ type DialogConfirmationType = { setOpenDialog: any; onSubmit?: void; requestLog: DetailFinalLogType|undefined; + claimInput:boolean } type BenefitSelected = { @@ -40,7 +44,7 @@ type BenefitSelected = { -export default function DialogBenefit({requestLog, setOpenDialog, openDialog } : DialogConfirmationType ) { +export default function DialogBenefit({requestLog, setOpenDialog, openDialog, claimInput = false } : DialogConfirmationType ) { // Add Benefit const [addBenefit, setAddBenefit] = useState(false) @@ -63,9 +67,13 @@ export default function DialogBenefit({requestLog, setOpenDialog, openDialog } : } }; + 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) { @@ -85,15 +93,16 @@ export default function DialogBenefit({requestLog, setOpenDialog, openDialog } : amount_not_approved: 0, excess_paid: 0, keterangan: '', + reason: null } }) reset({benefit_data: temp}) setBenefitSelected(datax) - }, [valBenefitNames]) + const handleCloseDialogBenefit = () => { // setOpenDialog(false); setAddBenefit(false) @@ -112,10 +121,19 @@ export default function DialogBenefit({requestLog, setOpenDialog, openDialog } : 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(''), @@ -130,14 +148,56 @@ export default function DialogBenefit({requestLog, setOpenDialog, openDialog } : defaultValues }); - const {fields, append, remove} = useFieldArray({name: 'benefit_data',control: methods.control}) + let width = claimInput ? 2 : 2.36; + + const {fields, append, remove} = useFieldArray({name: 'benefit_data',control: methods.control}); + const { handleSubmit, reset, watch, setValue, formState: { isDirty, isSubmitting, errors } } = methods + + // Buat total data + 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); + const benefitData = watch('benefit_data'); + const [isDisableSave, setDisableSave] = useState(false) + + 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); + + if (totalAmountApproved != 0 && totalAmountIncurred != 0) { + if (totalAmountApproved > totalAmountIncurred){ + setValue(`benefit_data.${index}.amount_approved`, 0) + alert('Total Amount Approved tidak boleh lebih dari Total Incurred') + } + } + + }); - const { handleSubmit, reset, watch, setValue, formState: { isDirty, isSubmitting, errors } } = methods; // Submit Form // ===================================== const submitHandler = async (data: BenefitConfigurationListType) => { - - const response = await postAddBenefit(data); + const mapData = data.benefit_data.map((item) => ({ + ...item, + reason: item.reason.value + })); + + const newData = { + ...data, + benefit_data: mapData + }; + + const response = await postAddBenefit(newData); if (response == true) { reset(); @@ -146,6 +206,8 @@ export default function DialogBenefit({requestLog, setOpenDialog, openDialog } : } } + // Calculate + const getContent = () => !addBenefit ? ( @@ -198,14 +260,14 @@ export default function DialogBenefit({requestLog, setOpenDialog, openDialog } : {fields?.map((item, index) => ( - + {item.description} - + @@ -224,7 +286,7 @@ export default function DialogBenefit({requestLog, setOpenDialog, openDialog } : - + @@ -244,7 +306,7 @@ export default function DialogBenefit({requestLog, setOpenDialog, openDialog } : - + @@ -264,7 +326,7 @@ export default function DialogBenefit({requestLog, setOpenDialog, openDialog } : - + @@ -288,7 +350,7 @@ export default function DialogBenefit({requestLog, setOpenDialog, openDialog } : - Keterangan* + Keterangan @@ -298,21 +360,146 @@ export default function DialogBenefit({requestLog, setOpenDialog, openDialog } : key={item.id} name={`benefit_data.${index}.keterangan`} placeholder='Keterangan' - required /> + {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(totalAmountIncurred)} + + + + + + {/* Amount Approved */} + + + + + Amount Approved + + + + + {fNumber(totalAmountApproved)} + + + + + + {/* Amount Not Approved */} + + + + + Amount Not Approved + + + + + {fNumber(totalAmountNotApproved)} + + + + + + {/* Excess Paid* */} + + + + + Excess Paid + + + + + {fNumber(totalExcessPaid)} + + + + + + + + + + + {/* */} - + Save diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogDeleteBenefit.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogDeleteBenefit.tsx index 1705cdb3..6ff116d9 100644 --- a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogDeleteBenefit.tsx +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogDeleteBenefit.tsx @@ -1,8 +1,8 @@ import MuiDialog from "@/components/MuiDialog"; -import { Button, Card, Checkbox, DialogActions, Grid, Typography } from "@mui/material"; +import { Autocomplete, Button, Card, Checkbox, DialogActions, Grid, TextField, Typography } from "@mui/material"; import { Paper } from "@mui/material"; import { Stack } from '@mui/material'; -import React, { useState } from 'react'; +import React, { useEffect, useState } from 'react'; import { DetailFinalLogType } from "../Model/Types"; import { fDateTimesecond, toTitleCase } from "@/utils/formatTime"; import axios from "@/utils/axios"; @@ -18,9 +18,39 @@ type DialogDeleteType = { } export default function DialogDeleteBenefit({id, setOpenDialog, openDialog,onSubmit} : DialogDeleteType ) { + + const [formData, setFormData] = useState({ + reason: null + }); + + const resetForm = () => { + setFormData({ + reason: null, + }); + }; + + useEffect(() => { + // Update formData setiap kali approve berubah + setFormData(prevData => ({ + ...prevData, + })); + }, []); + + const handleChange = (field, value) => { + setFormData((prevData) => ({ + ...prevData, + [field]: value, + })); + if (field === 'reason') { + setIsReasonSelected(!!value); + } + + }; + const handleSubmit = () => { - axios - .delete(`customer-service/request/benefit_data/${id}`) + if (isReasonSelected && formData.reason !== '') { + axios + .post(`customer-service/request/benefit_data/${id}`, formData) .then((response) => { enqueueSnackbar('Benefit Data has Deleted', { variant: 'success' }); setOpenDialog(false); @@ -29,6 +59,11 @@ export default function DialogDeleteBenefit({id, setOpenDialog, openDialog,onSub .catch(({ response }) => { enqueueSnackbar(response.data.message ?? 'Something went wrong!', { variant: 'error' }); }); + } else { + setIsReasonSelected(false); + alert('Silakan pilih alasan sebelum menghapus data.'); + } + } const style1 = { @@ -38,10 +73,19 @@ export default function DialogDeleteBenefit({id, setOpenDialog, openDialog,onSub const style2 = { width: '70%' } - const marginBottom1 = { - marginBottom: 1, + const marginBottom2 = { + marginBottom: 2, } + const [isReasonSelected, setIsReasonSelected] = useState(false); + + const reasons = [ + { value: 'agreement', label: 'Agreement changed' }, + { value: 'endorsement', label: 'Endorsement' }, + { value: 'renewal', label: 'Renewal' }, + { value: 'wrong_setting', label: 'Wrong Setting' }, + // Add more options as needed + ]; const handleCloseDialog = () => { setOpenDialog(false); } @@ -49,10 +93,35 @@ export default function DialogDeleteBenefit({id, setOpenDialog, openDialog,onSub const getContent = () => ( Are you sure to delete this detail benefit ? - - - - + + + + Reason* + option.label} + fullWidth + value={reasons.find((r) => r.value === formData.reason) || null} // Use find to match the default value + onChange={(e, newValue) => handleChange('reason', newValue?.value)} + renderInput={(params) => ( + + )} + /> + + + + + + + ); diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogEditBenefit.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogEditBenefit.tsx index 57063b87..bbd99c7f 100644 --- a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogEditBenefit.tsx +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogEditBenefit.tsx @@ -2,7 +2,7 @@ import * as Yup from 'yup'; import { yupResolver } from '@hookform/resolvers/yup'; import MuiDialog from "@/components/MuiDialog"; -import { Box, Button, Card, Checkbox, DialogActions, Grid, Typography } from "@mui/material"; +import { Autocomplete, Box, Button, Card, Checkbox, DialogActions, Grid, TextField, Typography } from "@mui/material"; import { Paper } from "@mui/material"; import { Stack } from '@mui/material'; import React, { useEffect, useState } from 'react'; @@ -17,6 +17,9 @@ import { useForm } from 'react-hook-form'; import { FormProvider, RHFTextField } from "@/components/hook-form"; import RHFTextFieldMoney from "@/components/hook-form/v2/RHFTextFieldMoney"; import { LoadingButton } from "@mui/lab"; +import { find } from 'lodash'; +import { fNumber } from '@/utils/formatNumber'; +import palette from '@/theme/palette'; type DialogDeleteType = { @@ -25,9 +28,10 @@ type DialogDeleteType = { onSubmit?: void; data: BenefitConfigurationListType|undefined; id: number|undefined; + total: any } -export default function DialogEditBenefit({id, data, setOpenDialog, openDialog,onSubmit} : DialogDeleteType ) { +export default function DialogEditBenefit({id, data, setOpenDialog, openDialog, onSubmit, total} : DialogDeleteType ) { const handleCloseDialog = () => { setOpenDialog(false); } @@ -42,7 +46,8 @@ export default function DialogEditBenefit({id, data, setOpenDialog, openDialog,o amount_not_approved: 0, excess_paid: 0, keterangan: '-', - description: '-' + description: '-', + reason: null }; const validationSchema = Yup.object().shape({ @@ -59,6 +64,28 @@ export default function DialogEditBenefit({id, data, setOpenDialog, openDialog,o const { handleSubmit, reset, watch, setValue, formState: { isDirty, isSubmitting, errors } } = methods; + // Ambil nilai dari form menggunakan watch + const amountIncurred = parseFloat(watch('amount_incurred')); + const amountApproved = parseFloat(watch('amount_approved')); + const amountNotApproved = parseFloat(watch('amount_not_approved')); + const excessPaid = parseFloat(watch('excess_paid')); + + // Hitung total baru + const totalAmountIncurred = total.totalAmountIncurred - data?.amount_incurred + amountIncurred; + const totalAmountApproved = total.totalAmountApproved - data?.amount_approved + amountApproved; + const totalAmountNotApproved = total.totalAmountNotApproved - data?.amount_not_approved + amountNotApproved; + const totalExcessPaid = total.totalExcessPaid - data?.excess_paid + excessPaid; + + if (totalAmountApproved > totalAmountIncurred) { + alert('Total Approve tidak boleh melebihi Total Incurred') + setValue('amount_approved', data?.amount_approved) + } + + // if (totalAmountIncurred !== (totalAmountApproved+totalAmountNotApproved)){ + // // alert('Total Incurred tidak sama dengan Total Approve + Total Not Approve') + // // setValue('amount_approved', data?.amount_approved) + // } + // Submit Form // ===================================== const submitHandler = async (data: BenefitConfigurationListType) => { @@ -72,6 +99,11 @@ export default function DialogEditBenefit({id, data, setOpenDialog, openDialog,o } } + const reasons = [ + { value: 'Wrong Setting', label: 'Wrong Setting' }, + { value: 'Hospital Request', label: 'Hospital Request' } + ]; + // Set Value Form // ===================================== useEffect(() => { @@ -80,8 +112,10 @@ export default function DialogEditBenefit({id, data, setOpenDialog, openDialog,o setValue('amount_not_approved', data?.amount_not_approved) setValue('excess_paid', data?.excess_paid) setValue('keterangan', data?.keterangan) + setValue('reason', data?.reason) }, [data]) - + + const getContent = () => ( @@ -94,7 +128,7 @@ export default function DialogEditBenefit({id, data, setOpenDialog, openDialog,o - + @@ -113,7 +147,7 @@ export default function DialogEditBenefit({id, data, setOpenDialog, openDialog,o - + @@ -133,7 +167,7 @@ export default function DialogEditBenefit({id, data, setOpenDialog, openDialog,o - + @@ -153,7 +187,7 @@ export default function DialogEditBenefit({id, data, setOpenDialog, openDialog,o - + @@ -177,7 +211,7 @@ export default function DialogEditBenefit({id, data, setOpenDialog, openDialog,o - Keterangan* + Keterangan @@ -187,11 +221,116 @@ export default function DialogEditBenefit({id, data, setOpenDialog, openDialog,o key={id} name={`keterangan`} placeholder='Keterangan' - required /> + + + + + Reason* + + + + option.label} + fullWidth + value={reasons.find((r) => r.value === watch('reason')) || null}// Use find to match the default value + onChange={(event, newValue) => { + setValue(`reason`, newValue?.value); + }} + renderInput={(params) => ( + + )} + /> + + + + + + + + Total Current Benefit + + + + + + + + {/* Amount Incurred */} + + + + + Amount Incurred + + + + + {totalAmountIncurred ? fNumber(totalAmountIncurred) : 0} + + + + + + {/* Amount Approved */} + + + + + Amount Approved + + + + + {fNumber(totalAmountApproved)} + + + + + + {/* Amount Not Approved */} + + + + + Amount Not Approved + + + + + {fNumber(totalAmountNotApproved)} + + + + + + {/* Excess Paid* */} + + + + + Excess Paid + + + + + {fNumber(totalExcessPaid)} + + + + + + + {/* */} diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Detail.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Detail.tsx index 8c29cb89..b9497245 100644 --- a/frontend/dashboard/src/pages/CustomerService/FinalLog/Detail.tsx +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Detail.tsx @@ -133,6 +133,12 @@ export default function Detail() { return accumulator + (item.excess_paid || 0); }, 0); + const total = { + totalAmountIncurred : totalAmountIncurred, + totalAmountApproved : totalAmountApprove, + totalAmountNotApproved : totalAmountNotApprove, + totalExcessPaid : totalExcessPaid, + } // Handle Delete File LOG const [pathFile, setPathFile] = useState('') const [dialogDeleteFIleLog, setDialogDeleteFileLog] = useState(false) @@ -522,6 +528,7 @@ export default function Detail() { data={BenefitConfigurationData} openDialog={openDialogEditBenefit} setOpenDialog={setDialogEditBenefit} + total={total} /> {/* Dialog Delete */} diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Model/Types.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Model/Types.tsx index 9e6b8861..f0eaa9f0 100644 --- a/frontend/dashboard/src/pages/CustomerService/FinalLog/Model/Types.tsx +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Model/Types.tsx @@ -89,6 +89,10 @@ export type BenefitConfigurationListType = { excess_paid: number, keterangan: string, description: string, + reason: { + value:string, + label:string + } | null } export type Benefit = { diff --git a/frontend/dashboard/src/pages/Master/Hospitals/Form.tsx b/frontend/dashboard/src/pages/Master/Hospitals/Form.tsx index 62d07198..81084fa0 100644 --- a/frontend/dashboard/src/pages/Master/Hospitals/Form.tsx +++ b/frontend/dashboard/src/pages/Master/Hospitals/Form.tsx @@ -237,7 +237,6 @@ export default function OrganizationsForm({ isEdit, currentOrganizations }: Prop navigate('/master/hospitals'); } catch (error: any) { if (error && error.response.status === 422) { - console.log('error', error.response.data.errors); for (const [key, value] of Object.entries(error.response.data.errors)) { setError(key, { message: value[0] }); enqueueSnackbar(value[0] ?? 'Failed Processing Request', { variant: 'error' }); @@ -276,8 +275,6 @@ export default function OrganizationsForm({ isEdit, currentOrganizations }: Prop setSelectedCorporateID(corporate_selected) }, [defaultValues]) - console.log(corporate_selected, 'test') - const handleSelectChange = (event, selectedOptions:any) => { const selectedValues = selectedOptions.map(option => option.value); setSelectedCorporateID(selectedValues);