import * as Yup from 'yup'; import { yupResolver } from '@hookform/resolvers/yup'; import { Autocomplete, Box, Button, Card, Collapse, Container, Divider, Grid, InputAdornment, Paper, Stack, Table, TableBody, TableCell, TableRow, TextField, Typography, } from '@mui/material'; import { useParams } from 'react-router-dom'; import HeaderBreadcrumbs from '../../components/HeaderBreadcrumbs'; import Page from '../../components/Page'; import useSettings from '../../hooks/useSettings'; import React, { useEffect, useMemo, useRef, useState } from 'react'; import { styled } from '@mui/system'; import axios from '../../utils/axios'; import { enqueueSnackbar } from 'notistack'; import { LoadingButton } from '@mui/lab'; import { fDate } from '@/utils/formatTime'; import Iconify from '../../components/Iconify'; import Documents from './components/Documents'; import DiagnosisHistory from './components/DiagnosisHistory'; import ClaimItems from './components/ClaimItems'; import DialogMemberBenefit from './components/DialogMemberBenefit'; import ClaimDetail from './components/ClaimDetail'; import DialogHistoryPerawatan from './components/DialogHistoryPerawatan'; import { IconButton } from '@mui/material'; import { Tooltip } from '@mui/material'; import { useSelector } from 'react-redux'; export default function ClaimsCreateUpdate() { const { themeStretch } = useSettings(); const { id } = useParams(); const isEdit = id ? true : false; const [currentClaim, setCurrentClaim] = useState(); const [documents, setDocuments] = useState([]); const claimsHistoryData = useSelector((state) => state.claimsHistory) console.log(claimsHistoryData) const Item = styled(Paper)(({ theme }) => ({ backgroundColor: theme.palette.mode === 'dark' ? '#1A2027' : '#fff', ...theme.typography.body2, padding: theme.spacing(1), textAlign: 'center', color: theme.palette.text.secondary, })); // -------------------------------------------------------------- // Claim Item const [claimItems, setClaimItems] = useState([]); const [dialogAddClaimItemOpen, setDialogAddClaimItemOpen] = useState(false); const [loadingClaimItems, setLoadingClaimItems] = useState(false); const handleAddClaimItems = (items) => { setClaimItems([...claimItems, ...items]); }; useEffect(() => { if(claimsHistoryData) { setClaimItems(claimsHistoryData) } },[claimsHistoryData]) const handleSaveClaimItems = () => { console.log('Storing ', claimItems); setLoadingClaimItems(true); axios .post(`claims/${id}/update-items`, { benefit_items: claimItems.map((benefit) => { return { id: benefit.id, biaya_diajukan: benefit.biaya_diajukan, biaya_disetujui: benefit.biaya_disetujui, }; }), }) .then((res) => { enqueueSnackbar(res.data.message, { variant: 'success' }); }) .catch((err) => { setLoadingClaimItems(false); enqueueSnackbar(err.response?.data?.message ?? err?.message, { variant: 'error' }); }) .then(() => { setLoadingClaimItems(false); }); }; const handlePrimaryDiagnosisChange = (diagnosisOption) => { console.log('handle', diagnosisOption); if (diagnosisOption) { const { title, value } = diagnosisOption; setPrimaryDiagnosis(value); } else { setPrimaryDiagnosis(null); } }; const handleSecondaryDiagnosisChange = ({ title, value }) => { setSecondaryDiagnosis(value); }; const handleDecline = () => { axios .post(`claims/${id}/decline`) .then((res) => { enqueueSnackbar(res.data.message, { variant: 'success' }); setCurrentClaim({ ...currentClaim, status: 'declined' }); }) .catch((err) => { // setLoadingDiagnosis(false) enqueueSnackbar(err.response?.data?.message ?? err?.message, { variant: 'error' }); }) .then(() => { // setLoadingDiagnosis(false) }); }; const handleApprove = () => { axios .post(`claims/${id}/approve`) .then((res) => { enqueueSnackbar(res.data.message, { variant: 'success' }); setCurrentClaim({ ...currentClaim, status: 'approved' }); }) .catch((err) => { // setLoadingDiagnosis(false) enqueueSnackbar(err.response?.data?.message ?? err?.message, { variant: 'error' }); }) .then(() => { // setLoadingDiagnosis(false) }); }; const handleReOpen = () => { axios .post(`claims/${id}/re-open`) .then((res) => { enqueueSnackbar(res.data.message, { variant: 'success' }); setCurrentClaim({ ...currentClaim, status: 'received' }); }) .catch((err) => { // setLoadingDiagnosis(false) enqueueSnackbar(err.response?.data?.message ?? err?.message, { variant: 'error' }); }) .then(() => { // setLoadingDiagnosis(false) }); }; // --------------------------------------------------------------- // Initial LOG const [loadingLog, setLoadingLog] = useState(false); const handleDownloadLog = (claim_id) => { setLoadingLog(true); axios .post(`generate-log/${claim_id}`, { responseType: 'blob', }) .then((response) => { window.open(URL.createObjectURL(response.data)); setLoadingLog(false); setOpenDialog(false); }) .catch((response) => { enqueueSnackbar(response.message, { variant: 'error' }); setLoadingLog(false); }); }; // ------------------------------------------------- // Final LOG const [loadingFinalLog, setLoadingFinalLog] = useState(false); const handleDownloadFinalLog = (claim_id) => { setLoadingFinalLog(true); axios .get(`final-log/${claim_id}`, { responseType: 'blob', }) .then((response) => { window.open(URL.createObjectURL(response.data)); setLoadingFinalLog(false); }) .catch((response) => { enqueueSnackbar(response.message, { variant: 'error' }); setLoadingFinalLog(false); }); }; // ---------------------------------------------------------------- // History Perawatan const [openDialogHistoryPerawatan, setOpenDialogHistoryPerawatan] = useState(false); useEffect(() => { axios.get('/claims/' + id).then(({ data }) => { const claim = data.data; const allFiles = [...(claim.claim_request ? claim.claim_request.files : []), ...claim.files]; setCurrentClaim(claim); setDocuments(allFiles); setClaimItems(claim.benefit_items); }); }, [id]); const handleSetFinalEncounter = (encounter) => { const tempLastFinalEncounterId = currentClaim.final_encounter_id axios.post(`/claims/${id}/set-final-encounter`, { encounter_id: encounter.id }) .then((res) => { setCurrentClaim({...currentClaim, ...{final_encounter_id: encounter.id}}) enqueueSnackbar(res.data.message, {variant: 'success'}) }) .catch((err) => { setCurrentClaim({...currentClaim, ...{final_encounter_id: tempLastFinalEncounterId}}) enqueueSnackbar(err.message, {variant: 'error'}) }) setCurrentClaim({...currentClaim, ...{final_encounter_id: encounter.id}}) } // ------------------------------------------------------------------ // Edit History Perawatan const [openDialogEditHistoryPerawatan, setOpenDialogEditHistoryPerawatan] = useState(false) const [editedEncounter, setEditedEncounter] = useState(null) const showEditEncounter = (encounter) => { setEditedEncounter(encounter) setOpenDialogEditHistoryPerawatan(true) } return ( {/* Action Button */} {(currentClaim?.status == 'requested' || currentClaim?.status == 'received') && ( <> { handleDecline(); }} > Decline { handleApprove(); }} > Approve )} {(currentClaim?.status == 'declined' || currentClaim?.status == 'approved') && ( { handleReOpen(); }} > Re-Open )} Status : {currentClaim?.status} {currentClaim?.status == 'approved' && ( { handleDownloadFinalLog(currentClaim.id); }} > Download Final LOG )} Admission Date : {currentClaim?.claim_request?.submission_date} {/* Dokumen Tambahan */} {/* Riwayat Diagnosa */} {/* Ringkasan Data Member */} Ringkasan Data Nasabah Nama Lengkap {currentClaim?.member?.full_name} Nomor Polis {currentClaim?.member?.current_policy?.code} Member ID {currentClaim?.member?.member_id} Tipe Claim {currentClaim?.claim_request?.payment_type_name} Tipe Nasabah {currentClaim?.member?.current_corporate?.name} {/* Claim Detail */} History Perawatan { setOpenDialogHistoryPerawatan(true); }} > + Tambah History Perawatan {/* For Creation History Perawatan / Encounter */} {}} claim={currentClaim} > {currentClaim?.encounters && currentClaim?.encounters.map((encounter, index) => ( {showEditEncounter(encounter)}}>{ encounter.class_name } ({ fDate(encounter.start) } - { fDate(encounter.end) }) Diagnosis: { encounter.primary_diagnosis ? (`(${encounter.primary_diagnosis.diagnosis?.code}) ${encounter.primary_diagnosis.diagnosis?.name}`) : '-'} Dokter: { encounter.primary_doctor ? (`${encounter.primary_doctor.name}`) : '-'} {handleSetFinalEncounter(encounter)}}> ))} {(!currentClaim?.encounters || currentClaim?.encounters.length == 0) && ( Belum ada History Perawatan )} {/* For Editing History Perawatan / Encounter */} {}} claim={currentClaim} encounter={editedEncounter} > {/* */} Client Benefit Configuration { setDialogAddClaimItemOpen(true); }} > + Add Benefit {(currentClaim?.status == 'requested' || currentClaim?.status == 'received') && ( { handleSaveClaimItems(); }} > Simpan Claim Item )} ); }