import * as Yup from 'yup'; import { yupResolver } from '@hookform/resolvers/yup'; import { NumericFormat } from "react-number-format"; import { Container, Grid, Stack, Typography, Card, Dialog, TableRow, Tab, TableCell, Collapse, AccordionSummary, AccordionDetails, IconButton, Divider, ButtonBase } from '@mui/material'; // components import Page from '../../../components/Page'; import Iconify from '@/components/Iconify'; import { FormProvider, RHFDatepicker, RHFSelect, RHFTextField } from '@/components/hook-form'; import RHFTextFieldMoney from '@/components/hook-form/v2/RHFTextFieldMoney'; import { DatePicker, LocalizationProvider, MobileDatePicker } from '@mui/x-date-pickers'; import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns'; // utils import useSettings from '../../../hooks/useSettings'; import { useFieldArray, useForm } from 'react-hook-form'; // react import { useNavigate, useParams, useLocation } from 'react-router-dom'; import { useEffect, useState, useRef, useMemo } from 'react'; import axios from '../../../utils/axios'; import { enqueueSnackbar } from 'notistack'; // pages import ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos'; import { DetailFinalLogType } from './Model/Types'; import { fDate, fDateTimesecond } from '@/utils/formatTime'; import { Button, Autocomplete, FormHelperText} from '@mui/material'; import DialogConfirmation from '../FinalLog/Components/DialogConfirmation'; import Label from '@/components/Label'; import { Box } from '@mui/system'; import { Accordion } from '@mui/material'; import { Delete, EditOutlined, ExpandMore } from '@mui/icons-material'; import {BenefitData } from '../FinalLog/Model/Types' import AddIcon from '@mui/icons-material/Add'; import { LoadingButton } from '@mui/lab'; import { makeFormData } from '@/utils/jsonToFormData'; import TextField from '@mui/material/TextField'; import { fPostFormat } from '@/utils/formatTime'; import { parse } from 'date-fns'; // Import Card Detail Final LOG import CardDetail from '../Components/CardDetail'; import CardService from '../Components/CardService'; import CardExclusion from '../Components/CardExclusion'; import CardBenefit from '../Components/CardBenefit'; // Import Dialog import DialogHospitalCare from './Components/DialogHospitalCare'; import DialogBenefit from './Components/DialogBenefit'; import DialogMedicine from './Components/DialogMedicine'; import DialogDeleteBenfit from './Components/DialogDeleteBenefit'; import DialogEditBenefit from './Components/DialogEditBenefit'; import DialogDeleteMedicine from './Components/DialogDeleteMedicine' import MoreMenu from '@/components/MoreMenu'; import { MenuItem } from '@mui/material'; import { fNumber } from '@/utils/formatNumber'; import palette from '@/theme/palette'; import CardMedicine from '../Components/CardMedicine'; import CardFile from '../Components/CardFile'; import DialogEditFinalLOG from './Components/DialogEditFinalLOG'; import DialogDeleteFileLog from './Components/DialogDeleteFileLog'; import DialogUploadFileFinalLog from './Components/DialogUploadFileFinalLog'; import DialogSendWa from './Components/DialogSendWa'; import { set } from 'nprogress'; import { format } from 'date-fns'; // ---------------------------------------------------------------------- export default function Detail() { //dari hospital portal // const [dischargeDate, setDischargeDate] = useState(format(new Date(), "yyyy MMM d HH:mm:ss")); const [dischargeDate, setDischargeDate] = useState(null) // const [serviceOptions, setServiceOptions] = useState([ // { value: '-', label: '-' } // ]); // const [specialisOptions, setSpecialisOptions] = useState([ // { value: '-', label: '-' } // ]); const [serviceOptions, setServiceOptions] = useState< { value: string; label: string }[] >([]) const [specialisOptions, setSpecialisOptions] = useState< { value: number; label: string }[] >([]) const [serviceCode, setServiceCode] = useState(""); const [idSpecialities, setIdSpecialities] = useState(null) const [inputDppj, setInputDppj] = useState(""); const [requestLog, setRequestLog] = useState(); function submitRequestFinalLog() { if(dischargeDate == '') { enqueueSnackbar('Tanggal Keluar', { variant: 'warning' }); return false; } //cek spesialis if(!idSpecialities) { enqueueSnackbar('Spesialis', { variant: 'warning' }); return false; } //cek dpjp if(!inputDppj) { enqueueSnackbar('DPJP', { variant: 'warning' }); return false; } setSubmitLoading(true); const formData = makeFormData({ // request_logs_id: member.id, // result_files: fileHasilPenunjangs, // diagnosa_files: fileDiagnosas, // kondisi_files: fileKondisis, request_logs_id: requestLog?.id, discharge_date: fPostFormat(dischargeDate, 'yyyy-MM-dd HH:mm:ss'), service_code: serviceCode, spescialis_id: idSpecialities, dppj: inputDppj, }); axios .post('/request-final-log', formData) .then((response) => { enqueueSnackbar(response.data.meta.message ?? 'Berhasil membuat data', { variant: 'success' }); // handleSubmitSuccess(); // onClose({ someData: 'example data' }, getData); }) .catch(({ response }) => { enqueueSnackbar(response.data.meta.message ?? 'Something Went Wrong', { variant: 'error' }); }) .then(() => { setSubmitLoading(false); }); } //end dari hospital portal const location = useLocation(); const queryParams = new URLSearchParams(location.search); const navigate = useNavigate(); const { themeStretch } = useSettings(); const [isReversal, setIsReversal] = useState(false); const [submitLoading, setSubmitLoading] = useState(false); const defaultValues: any = {nominal : 0}; const validationSchema = Yup.object().shape({nominal: Yup.number().typeError('Nominal harus berupa angka').required('Nominal harus diisi')}) const methods = useForm({ resolver: yupResolver(validationSchema), defaultValues }); const { handleSubmit, reset, watch, setValue, formState: { isDirty, isSubmitting, errors } } = methods; const onSubmit = async (data: any) => { setSubmitLoading(true); const formData = makeFormData({ request_logs_id: id, approval_files: fileApprovals, nominal: data.nominal, }); axios .post(`/customer-service/request/${id}/approval_files`, formData) .then((response) => { enqueueSnackbar('Berhasil membuat data', { variant: 'success' }); window.location.reload() }) .catch(({ response }) => { enqueueSnackbar('Something Went Wrong', { variant: 'error' }); }) .then(() => { setSubmitLoading(false); }); } useEffect(() => { if (!requestLog?.id_member) return axios.get('service-member/'+ (requestLog?.id_member ?? null)) .then((response) => { setServiceOptions(response.data); }).catch((error) => { console.error('Error fetching ICD options:', error); }); axios.get('specialis') .then((response) => { setSpecialisOptions(response.data); }).catch((error) => { console.error('Error fetching ICD options:', error); }); }, [requestLog?.id_member]); const updateApproval = async () => { setSubmitLoading(true); axios .put(`/customer-service/request/${id}`, { status_approval: 'approved', }) .then((response) => { enqueueSnackbar('Berhasil Approve', { variant: 'success' }); window.location.reload(); }) .catch(({ response }) => { enqueueSnackbar(response?.data?.message || 'Something Went Wrong', { variant: 'error' }); }) .finally(() => { setSubmitLoading(false); }); }; const updateDecline = async () => { setSubmitLoading(true); axios .put(`/customer-service/request/${id}`, { status_approval: 'declined', }) .then((response) => { enqueueSnackbar('Berhasil Approve', { variant: 'success' }); window.location.reload(); }) .catch(({ response }) => { enqueueSnackbar(response?.data?.message || 'Something Went Wrong', { variant: 'error' }); }) .finally(() => { setSubmitLoading(false); }); } const { id, approval } = useParams(); useEffect(() => { axios .get('customer-service/request/'+id) .then((response) => { setRequestLog(response.data.data) setIsReversal(response.data.data.is_reversal) }) .catch((error) => { console.error(error); }) }, [id]); const style1 = { color: '#919EAB', width: '30%' } const style3 = { color: '#919EAB', width: '35%' } const style2 = { width: '70%' } const marginBottom1 = { marginBottom: 1, } const marginBottom2 = { marginBottom: 2, } const [openDialogSubmit, setOpenDialogSubmit] = useState(false); const [openDialogEditDetail, setDialogDEditDetail] = useState(false); const [openDialogBenefit, setDialogBenefit] = useState(false); const [openDialogMedicine, setDialogMedicine] = useState(false); const [openDialogSendWa, setDialogSendWa] = useState(false); const [shareLink, setShareLink] = useState(false); // Handel Delete Detail Benefit const [idBenefitData, setIdBenefitData] = useState(); const [openDialogDeleteBenefit, setDialogDeleteBenefit] = useState(false) const [idMedicineData, setIdMedicineData] = useState(); const [openDialogDeleteMedicine, setDialogDeleteMedicine] = useState(false) const [approve, setApprove] = useState('') // Handle Edit Detail Benefit const [openDialogEditBenefit, setDialogEditBenefit] = useState(false) const [BenefitConfigurationData, setBenefitConfigurationData] = useState(); // Buat total data const totalAmountIncurred = (requestLog?.benefit_data || []).reduce((accumulator, item) => { return accumulator + (item.amount_incurred || 0); }, 0); const totalAmountApprove = (requestLog?.benefit_data || []).reduce((accumulator, item) => { return accumulator + (item.amount_approved || 0); }, 0); const totalAmountNotApprove = (requestLog?.benefit_data || []).reduce((accumulator, item) => { return accumulator + (item.amount_not_approved || 0); }, 0); const totalExcessPaid = (requestLog?.benefit_data || []).reduce((accumulator, item) => { return accumulator + (item.excess_paid || 0); }, 0); const total = { totalAmountIncurred : totalAmountIncurred, totalAmountApproved : totalAmountApprove, totalAmountNotApproved : totalAmountNotApprove, totalExcessPaid : totalExcessPaid, totalLimit : requestLog?.member_usage_benefit, benefit : requestLog?.benefit, } // Handle Delete File LOG const [pathFile, setPathFile] = useState('') const [dialogDeleteFIleLog, setDialogDeleteFileLog] = useState(false) // Handle Upload File LOG const [dialogUploadFileLog, setDialogUploadFileLog] = useState(false) const fileDiagnosaInput = useRef(null); const [fileApprovals, setFileApproval] = useState([]); const handleDiagnosaInputChange = (event:any) => { if (event.target.files[0]) { setFileApproval([...fileApprovals, ...event.target.files]); } else { console.log('NO FILE'); } }; const removeApprovalFiles = (filesState:any, index:any) => { setFileApproval( filesState.filter((file:any, fileIndex:any) => { return fileIndex != index; }) ); }; useEffect(() => { if (requestLog?.discharge_date) { setDischargeDate( parse( requestLog.discharge_date, 'yyyy-MM-dd HH:mm:ss', new Date() ) ) } }, [requestLog?.discharge_date]) useEffect(() => { if (!requestLog) return setServiceCode(requestLog.service_code ?? '') setIdSpecialities(requestLog.specialitiesID ?? null) setInputDppj(requestLog.dppj ?? '') }, [requestLog]) const selectedService = useMemo( () => serviceOptions.find( (o) => String(o.value) === String(serviceCode) ) || null, [serviceOptions, serviceCode] ) console.log(serviceOptions); console.log(serviceCode); const selectedSpecialis = useMemo( () => specialisOptions.find( (o) => Number(o.value) === Number(idSpecialities) ) || null, [specialisOptions, idSpecialities] ) return ( navigate(-1)} sx={{cursor:'pointer'}}/> {(requestLog && requestLog.code ? requestLog.code : '')} {/* Detail */} Detail {requestLog?.status_final_log != 'approved' ? ( { setDialogDEditDetail(true) }}> Edit } /> ) : null } Invoice Number {requestLog?.invoice_no ? requestLog?.invoice_no : '-'} Billing Number {requestLog?.billing_no ? requestLog?.billing_no : '-'} Provider {requestLog?.provider} Member ID {requestLog?.member_id} Type Of Member {requestLog?.type_of_member} Policy Number {requestLog?.policy_number} Name {requestLog?.name} Date Of Birth {requestLog?.date_of_birth ? fDate(requestLog?.date_of_birth) : '-'} Marital Status {requestLog?.marital_status} Submission Date {requestLog?.submission_date ? fDateTimesecond(requestLog?.submission_date) : '-'} Admission Date {requestLog?.admission_date ? fDateTimesecond(requestLog?.admission_date) : '-'} Discharge Date {requestLog?.discharge_date ? fDateTimesecond(requestLog?.discharge_date) : '-'} No KTP {requestLog?.no_identitas ? requestLog?.no_identitas : '-'} Keterangan {requestLog?.keterangan ? requestLog?.keterangan : '-'} Hak Kamar Pasien {requestLog?.hak_kamar_pasien ? requestLog?.hak_kamar_pasien : '-'} Penempatan Kamar {requestLog?.penempatan_kamar ? requestLog?.penempatan_kamar : '-'} Spesialis {requestLog?.specialities_id ? requestLog?.specialities_id : '-'} DPJP {requestLog?.dppj ? requestLog?.dppj : '-'} Catatan {requestLog?.catatan ? requestLog?.catatan : '-'} Diagnosis {requestLog?.diagnosis?.length > 0 ? (
    {requestLog.diagnosis.map((diagnosisItem, index) => (
  • {diagnosisItem.value} - {diagnosisItem.label}
  • // Replace 'name' with the property you want to display ))}
) : (

No diagnosis available.

)}
{/* */}
{/* Service */} {/* Exclusion */} {/* */} {/* Hospital Care */} {/* History of Hospital Care */} {/* Kolom Tanggal Discharge */} Tanggal Keluar { setDischargeDate(newValue); }} inputFormat="dd-MM-yyyy HH:mm" renderInput={(params) => } /> {/* Kolom Service Type */} Tipe Service {/* option.label || ""} value={serviceOptions.find((opt) => opt.value == serviceCode) || null} onChange={(event, newValue) => { setServiceCode(newValue?.value || ""); }} renderInput={(params) => ( )} /> */} o.label} isOptionEqualToValue={(o, v) => o.value === v.value} onChange={(_, v) => setServiceCode(v?.value ?? '')} renderInput={(params) => ( )} /> {/* Specialist */} Spesialis {/* option.label || ''} value={specialisOptions.find((opt) => opt.value === idSpecialities) || null} onChange={(event, newValue) => { setIdSpecialities(newValue?.value || 0); }} renderInput={(params) => ( )} /> */} o.label} isOptionEqualToValue={(o, v) => o.value === v.value} onChange={(_, v) => setIdSpecialities(v?.value ?? null)} renderInput={(params) => ( )} /> DPJP { setInputDppj(event.target.value); }} fullWidth /> { submitRequestFinalLog(); }} loading={submitLoading} > Simpan {/* Surat persetujuan Tindakan */} Tindakan Persetujuan {!isReversal && ( Upload Tindakan Persetujuan {fileApprovals?.map((file: any, index: number) => ( {file.name} removeApprovalFiles(fileApprovals, index)} /> ))} fileDiagnosaInput.current?.click()} > Upload Tindakan Persetujuan {/* Simpan */} {approval ? ( <> {/* GRUP TOMBOL DI KANAN */} {requestLog?.status_approval !== 'approved' && ( )} ) : ( <> {/* TOMBOL SIMPAN DI KIRI */} Simpan {/* Ini adalah spacer untuk mendorong tombol berikutnya ke kanan */} {/* GRUP TOMBOL DI KANAN */} )} )} {/* FILE YANG SUDAH TERUPLOAD */} {requestLog?.files ?.filter((document) => document.type === 'approval') ?.map((documentType, index) => ( {documentType.original_name || '-'} {!isReversal && ( { setDialogDeleteFileLog(true); setPathFile(documentType.path); }} size="small" > )} ))} {/* DIALOG */} {/* Benefit */} Benefit { !isReversal ? ( ) : null } {requestLog?.benefit_data?.map((item, index) => ( {item.benefit?.description} { !isReversal ? ( { setDialogEditBenefit(true) setIdBenefitData(item.id) setBenefitConfigurationData(item) }} > Edit { setIdBenefitData(item.id) setDialogDeleteBenefit(true) }} > Delete } /> ) : null } {/* Amount Incurred */} Amount Incurred {fNumber(item.amount_incurred)} {/* Amount Approved */} Amount Approved {fNumber(item.amount_approved)} {/* Amount Not Approved */} Amount Not Approved {fNumber(item.amount_not_approved)} {/* Excess Paid* */} Excess Paid* {fNumber(item.excess_paid)} {/* Keterangan* */} Keterangan* {item.keterangan} ))}

{requestLog?.benefit_data && requestLog.benefit_data.length > 0 ? ( Total Benefit {/* 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 )}
{/* PR Buat pindahin ke componen */} {/* */} {/* Dialog Edit */} {/* Dialog Delete */} {/* Dialog Edit Detai; */}
{/* Medicine */} Medicine {requestLog?.medicine.map((item, index) => ( {item.medicine} Rp. {fNumber(item.price)} { setIdMedicineData(item.id) setDialogDeleteMedicine(true) }}> ))} {/* File */} Files { !isReversal ? ( ) : null } {requestLog?.files ?.filter((document) => document.type !== 'approval') ?.map((documentType, index) => ( {documentType.original_name ? documentType.original_name : '-'} { !isReversal ? ( { setDialogDeleteFileLog(true) setPathFile(documentType.path) }} aria-label="delete" size="small" sx={{ marginLeft: 'auto' }}> ) : null } ))} {requestLog?.status_final_log == 'requested' ? ( <>
) : null}
); }