// mui import { Box, Tabs, Tab, Grid, Card, Stack, Typography, TableHead, TableCell, TableBody, Table, TableRow, MenuItem, Skeleton, List, ListSubheader, ListItem, ListItemText, ListItemButton, Divider, CardContent, LinearProgress } from '@mui/material'; import { styled } from '@mui/material/styles'; import { Download as DownloadIcon, Circle as CircleIcon, TableView } from '@mui/icons-material'; // components import Page from '../../components/Page'; import { fCurrency } from '../../utils/formatNumber'; // utils import { useState, SyntheticEvent, useContext, useEffect } from 'react'; import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate'; import { useNavigate, useParams } from 'react-router-dom'; import axios from '../../utils/axios'; import { fDateBirth, fDateSuffix, fDateTime } from '../../utils/formatTime'; import ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos'; import TimelineItem, { timelineItemClasses } from '@mui/lab/TimelineItem'; import { Timeline, TimelineConnector, TimelineContent, TimelineDot, TimelineSeparator, } from '@mui/lab'; import TableMoreMenu from '../../components/table/TableMoreMenu'; import Label from '../../components/Label'; import { fSplit } from '../../utils/formatNumber'; import useAuth from '../../hooks/useAuth'; interface TabPanelProps { children?: React.ReactNode; index: number; value: number; } function TabPanel(props: TabPanelProps) { const { children, value, index, ...other } = props; return ( ); } function a11yProps(index: number) { return { id: `simple-tab-${index}`, 'aria-controls': `simple-tabpanel-${index}`, }; } interface StyledTabsProps { children?: React.ReactNode; value: number; onChange: (event: React.SyntheticEvent, newValue: number) => void; } const StyledTabs = styled((props: StyledTabsProps) => )({ '& .MuiTabs-indicator': { display: 'flex', justifyContent: 'center', backgroundColor: '19BBBB', }, '& .MuiTabs-indicatorSpan': { maxWidth: 40, width: '100%', backgroundColor: '#635ee7', }, }); interface StyledTabProps { label: string; icon?: string | React.ReactElement; } const StyledTab = styled((props: StyledTabProps) => )( ({ theme }) => ({ fontWeight: 600, fontSize: '14px', color: theme.palette.grey[600], maxWidth: '15%', flex: 1, margin: '0 !important', '&.Mui-selected': { color: theme.palette.grey[900], }, '&:hover': { color: theme.palette.grey[900], opacity: 1, }, }) ); type ServiceMonitoringProps = { companyName: string; serviceCode: string; memberId: string; fullName: string; dateOfBirth: string; phoneNumber: string; email: string; symptoms: string; sign: string; mainDiagnose: string; comparativeDiagnosis: string; serviceName: string; files: { result: { type: string; original_name: string; url: string; }[]; diagnosis: { type: string; original_name: string; url: string; }[]; kondisi: { type: string; original_name: string; url: string; }[]; }; benefits: { amountIncurred: number; amountApproved: number; amountNotAprroved: number; excessPaid: number; description: string; name: string; }[]; benefitTotal: { totalIncurred: number; totalApprove: number; totalNotApprove: number; totalExcess: number; }; hospital: string; admissionDate: string; dischargeDate: string; dailyMonitorings: Record< string, Array<{ time: string; status: string; subject: string; object: string; bodyTemperature: number; sistole: number; diastole: number; respirationRate: number; analysis: string; complaints: string; plans: { type: number; plan: string; }[]; files: { type: string; name: string; original_name: string; path: string; }[]; }> >; laboratoriumResults: Record< string, Array<{ code: string; date: string; examination: string; location: string; files: { type: string; name: string; original_name: string; path: string; }[]; }> >; keterangan: string; catatan: string; }; export default function ServiceMonitoring() { const {user} = useAuth(); const checkIfNameExists = (name) => { return user.user.permissions.some(item => item.name === name); }; const nameToCheck = 'service-monitoring-limit-client-portal'; const fileBillingCheck = 'file-billing-client-portal'; const fileDiagnosisCheck = 'file-diagnosis-client-portal'; const filePendukungCheck = 'file-pendukung-medis-client-portal'; const benefitCheck = 'benefit-client-portal'; const doesNameExist = checkIfNameExists(nameToCheck); const viewfileBilling = checkIfNameExists(fileBillingCheck); const viewfileDiagnosis = checkIfNameExists(fileDiagnosisCheck); const viewfilePendukungCheck = checkIfNameExists(filePendukungCheck); const viewBenefitCheck = checkIfNameExists(benefitCheck); const navigate = useNavigate(); const controller = new AbortController(); const [value, setValue] = useState(0); const [loading, setLoading] = useState(false); const handleChange = (event: SyntheticEvent, newValue: number) => { setValue(newValue); }; const [data, setData] = useState(null); const { corporateValue } = useContext(UserCurrentCorporateContext); const { memberId, requestLogId } = useParams(); const [depositData, setDepositData] = useState({ deposit: 0, limit: 0, usage: 0 }); useEffect(() => { (async () => { try { setLoading(true); const response = await axios.get(`${corporateValue}/service-monitoring/${requestLogId}`, { signal: controller.signal, }); setData(response.data.data); if (response.data.data.serviceCode !== 'IP') { setValue(1); } var member_id = response.data.data.member_id; const fetchDepositData = async () => { try { const response = await axios.get(`${corporateValue}/get-limits/${member_id}`); setDepositData(response.data); } catch (error) { console.error('Failed to fetch deposit data:', error); } }; fetchDepositData(); } catch (error: any) { console.error('Error fetching data:', error.message); } finally { setLoading(false); } })(); return () => { controller.abort(); }; }, [corporateValue]); const renderHTML = (data:string) => { return (
); } const formatNumber = (number) => { return new Intl.NumberFormat('id-ID').format(number); }; console.log(viewfileBilling, 'test') const LimitPlanCard = ({ title, current, total }) => ( {title} Yearly Limits {formatNumber(current)} / {formatNumber(total)} ); const plans = [ { title: 'Outpatient', current: 200000, total: 1000000 }, { title: 'Inpatient', current: 1000000, total: 5000000 }, { title: 'Dental', current: 250000, total: 1000000 }, { title: 'Maternity', current: 0, total: 3000000 }, ]; return ( navigate(`/alarm-center/member/${memberId}}`)} sx={{ cursor: 'pointer' }} /> Service Monitoring {/* Item 1 */} {loading ? : 'Employee Profile'} {loading ? : 'Company Name'} {loading ? ( ) : data && data.companyName ? ( data.companyName ) : ( '-' )} {loading ? : 'Member ID'} {loading ? ( ) : data && data.memberId ? ( data.memberId ) : ( '-' )} {loading ? : 'Full Name'} {loading ? ( ) : data && data.fullName ? ( data.fullName ) : ( '-' )} {loading ? : 'Date of Birth'} {loading ? ( ) : data && data.dateOfBirth ? ( fDateBirth(data.dateOfBirth) ) : ( '-' )} {loading ? : 'Phone Number'} {loading ? ( ) : data && data.phoneNumber ? ( data.phoneNumber ) : ( '-' )} {loading ? : 'Email'} {loading ? ( ) : data && data.email ? ( data.email ) : ( '-' )} {doesNameExist ? ( Total Limit Yearly Limits {formatNumber(depositData.usage)} / {formatNumber(depositData.deposit)} Limit Plan {depositData.services?.map((plan) => ( ))} ) : ''} {loading ? : 'Detail Letter Of Guarante'} {loading ? : 'Diagnose Summary'} {/* {loading ? : 'Symptoms'} {loading ? ( ) : data && data.symptoms ? ( data.symptoms ) : ( '-' )} */} {/* {loading ? : 'Sign'} {loading ? ( ) : data && data.sign ? ( data.sign ) : ( '-' )} */} {loading ? : 'Main Diagnose'} {loading ? ( ) : data && data.mainDiagnose ? ( data.mainDiagnose ) : ( '-' )} {/* {loading ? ( ) : ( 'Comparative Diagnosis' )} {loading ? ( ) : data && data.comparativeDiagnosis ? ( data.comparativeDiagnosis ) : ( '-' )} */} {loading ? ( ) : ( 'Files Documentation' )} {loading ? ( ) : data && data.files && data.files.result.length > 0 ? ( data.files.result.map((file, index) => ( file.type == 'final-log-result' && viewfilePendukungCheck ? ( {file.original_name ? file.original_name : '-'} ) : file.type == 'final-log-diagnosis' && viewfileDiagnosis ? ( {file.original_name ? file.original_name : '-'} ) : file.type == 'final-log-kondisi' && viewfileBilling ? ( {file.original_name ? file.original_name : '-'} ) : '' ) ) ) : ( - )} {/* {loading ? ( ) : ( 'Files Diagnosis' )} {loading ? ( ) : data && data.files && data.files.diagnosis.length > 0 ? ( data.files.diagnosis.map((file, index) => ( ( {file.original_name ? file.original_name : '-'} ) ) ) ) : ( - )} */} {/* {loading ? ( ) : ( 'Files Kondisi' )} */} {/* {loading ? ( ) : data && data.files && data.files.kondisi.length > 0 ? ( data.files.kondisi.map((file, index) => ( ( {file.original_name ? file.original_name : '-'} ) ) ) ) : ( - )} */} {/* Keterangan */} {loading ? : 'Keterangan'} {loading ? ( ) : data && data.keterangan ? ( data.keterangan ) : ( '-' )} {/* Catatan */} {loading ? : 'Catatan'} {loading ? ( ) : data && data.catatan ? ( data.catatan ) : ( '-' )} {loading ? : 'Services'} {loading ? : 'Service Name'} {loading ? ( ) : data && data.serviceName ? ( data.serviceName ) : ( '-' )} {viewBenefitCheck ? ( {loading ? : 'Benefits'} {loading ? ( ) : data && data.benefits && data.benefits.length > 0 ? ( data.benefits.map((benefitValue, benefitIndex) => ( {benefitIndex + 1 + `. ` + benefitValue.name} } key={benefitIndex} > Amount Incurred : Rp {fSplit(benefitValue.amountApproved)} Amount Approved : Rp {fSplit(benefitValue.amountApproved)} Amount Not Approved : Rp {fSplit(benefitValue.amountNotAprroved)} Excess Paid : Rp {fSplit(benefitValue.excessPaid)} Description : {benefitValue.description} )) ) : ( - )} ) : ('') } {viewBenefitCheck ? ( {loading ? : 'Benefits Total'} {loading ? : 'Total Incurred : Rp. '} {loading ? ( ) : data && data.benefitTotal ? ( fSplit(data.benefitTotal.totalIncurred) ) : ( '-' )} {loading ? : 'Total Approve : Rp. '} {loading ? ( ) : data && data.benefitTotal ? ( fSplit(data.benefitTotal.totalApprove) ) : ( '-' )} {loading ? : 'Total Not Approve : Rp.'} {loading ? ( ) : data && data.benefitTotal ? ( fSplit(data.benefitTotal.totalNotApprove) ) : ( '-' )} {loading ? : 'Total Excess : Rp.'} {loading ? ( ) : data && data.benefitTotal ? ( fSplit(data.benefitTotal.totalExcess) ) : ( '-' )} ) : ('')} {loading ? : 'Hospital'} {loading ? ( ) : data && data.hospital ? ( data.hospital ) : ( '-' )} {loading ? : 'Admission Date'} {loading ? ( ) : data && data.admissionDate ? ( fDateSuffix(data.admissionDate) ) : ( '-' )} {loading ? : 'Discharge Date'} {loading ? ( ) : data && data.dischargeDate ? ( fDateSuffix(data.dischargeDate) ) : ( '-' )} {/* Benefit Item */} {data?.serviceCode === 'IP' ? ( {loading ? ( ) : ( {data && data.dailyMonitorings ? ( {data && data.dailyMonitorings && Object.keys(data.dailyMonitorings).length > 0 && Object.keys(data.dailyMonitorings).map((date, dateIndex) => ( {date ? date : '-'} {data.dailyMonitorings[date].map( (dailyMonitoring, dailyMonitoringIndex) => ( Subject {dailyMonitoring.subject ? renderHTML(dailyMonitoring.subject) : '-'} Objektif {dailyMonitoring.object ? renderHTML(dailyMonitoring.object) : '-'} Body Temperature {dailyMonitoring.bodyTemperature > 0 ? dailyMonitoring.bodyTemperature + ' Cel' : '-'} Sistole {dailyMonitoring.sistole > 0 ? dailyMonitoring.sistole + ' mm[Hg]' : '-'} Diastole {dailyMonitoring.diastole > 0 ? dailyMonitoring.diastole + ' mm[Hg]' : '-'} Respiration Rate {dailyMonitoring.respirationRate > 0 ? dailyMonitoring.respirationRate + ' / min' : '-'} {/* Complaints {dailyMonitoring.complaints ? dailyMonitoring.complaints : '-'} */} Analysis {dailyMonitoring.analysis ? renderHTML(dailyMonitoring.analysis) : '-'} Medical Plan : {data.dailyMonitorings ? (
    {dailyMonitoring.plans.length > 0 ? ( dailyMonitoring.plans.map((plan, planIndex) => plan.type === 1 ? (
  • {renderHTML(plan.plan)}
  • ) : null ) ) : (
  • No plans available
  • )}
) : ( '-' )}
Non Medikamentosa Plan : {data.dailyMonitorings ? (
    {dailyMonitoring.plans.length > 0 ? ( dailyMonitoring.plans.map((plan, planIndex) => plan.type === 2 ? (
  • {renderHTML(plan.plan)}
  • ) : null ) ) : (
  • No plans available
  • )}
) : ( '-' )}
File Documentation : {data.dailyMonitorings ? (
    {dailyMonitoring.files.length > 0 ? ( dailyMonitoring.files.map((file, fileIndex) => (
  • {file.original_name}
  • ) ) ) : (
  • -
  • )}
) : ( - )}
) )}
))}
) : ( No Data Found )}
{data && data.laboratoriumResults && Object.keys(data.laboratoriumResults).length > 0 ? ( Object.keys(data.laboratoriumResults).map((date, dateIndex) => ( {date ? date : '-'} {data.laboratoriumResults[date]?.map((laboratoriumResult, laboratoriumResultIndex) => ( Date Examination Location {laboratoriumResult.examination || '-'} {laboratoriumResult.location || '-'} {data.dailyMonitorings ? (
    {laboratoriumResult.files.length > 0 ? ( laboratoriumResult.files.map((file, fileIndex) => (
  • {file.original_name}
  • ) ) ) : (
  • -
  • )}
) : ( - )}
))}
)) ) : ( No Data Found )}
)}
) : null}
); }