// @mui import { Box, Grid, Button, Card, Collapse, IconButton, MenuItem, Table, TableBody, TableCell, TableRow, TextField, Typography, Stack, Menu, ButtonGroup, Tooltip, TableHead, Checkbox, InputAdornment, TableSortLabel, FormControl } from '@mui/material'; import { visuallyHidden } from '@mui/utils'; import { DesktopDatePicker, LocalizationProvider } from '@mui/x-date-pickers'; import { fDateOnly } from '@/utils/formatTime'; import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns'; import FindInPageOutlinedIcon from '@mui/icons-material/FindInPageOutlined'; import AssessmentIcon from '@mui/icons-material/Assessment'; // hooks import React, { ChangeEvent, useEffect, useRef, useState } from 'react'; import { Link, Navigate, useNavigate, useSearchParams } from 'react-router-dom'; import { LoadingButton } from '@mui/lab'; // components import axios from '../../utils/axios'; import { LaravelPaginatedData, LaravelPaginatedDataDefault } from '../../@types/paginated-data'; import DataTable from '../../components/LaravelTable'; import { fCurrency } from '../../utils/formatNumber'; import EditRoundedIcon from '@mui/icons-material/EditRounded'; import { Chip } from '@mui/material'; import Iconify from '@/components/Iconify'; import { enqueueSnackbar } from 'notistack'; import { fDate, fDateTime } from '../../utils/formatTime'; import { Claims } from '@/@types/claims'; import Label from '@/components/Label'; import { capitalizeFirstLetter } from '@/utils/formatString'; import TableMoreMenu from '@/components/table/TableMoreMenu'; import Edit from '@mui/icons-material/Edit'; import { Download } from '@mui/icons-material'; import { Add, Search } from '@mui/icons-material'; import Autocomplete from '@mui/material/Autocomplete'; import DownloadIcon from '@mui/icons-material/Download'; import UploadIcon from '@mui/icons-material/Upload'; import CancelIcon from '@mui/icons-material/Cancel'; import CheckCircleIcon from '@mui/icons-material/CheckCircle'; import { Dialog, DialogTitle, DialogContent, DialogActions } from '@mui/material'; import CloseIcon from '@mui/icons-material/Close'; export default function List() { const [selectAll, setSelectAll] = useState(false); const [selectedRows, setSelectedRows] = useState([]); const [providers, setProviders] = useState(null); // const [searchText, setSearchText] = useState(''); const [order, setOrder] = useState('desc'); const [orderBy, setOrderBy] = useState('created_at'); const [perPage, setPerPage] = useState(0); const handleChange = (event, newValue) => { // Jika newValue tidak undefined, atur nilai dataProvider if (newValue !== undefined) { setDataProvider(newValue.service_code); } else { // Jika tidak ada yang dipilih, set dataProvider menjadi string kosong setDataProvider(null); } }; // Dummy data const dummyServices = [ { service_code: '1', name: 'Service 1' }, { service_code: '2', name: 'Service 2' }, { service_code: '3', name: 'Service 3' }, // tambahkan data lain sesuai kebutuhan ]; const handleSelectAll = () => { setSelectAll(!selectAll); if (!selectAll) { const requestedIds = dataTableData.data .filter(row => row.status === 'received') // Memfilter baris dengan status 'requested' .map(row => row.id); // Mengambil hanya ID dari baris-baris yang memenuhi kondisi setSelectedRows(requestedIds); } else { setSelectedRows([]); } }; const handleRowSelect = (id) => { if (selectedRows.includes(id)) { setSelectedRows(selectedRows.filter(rowId => rowId !== id)); } else { setSelectedRows([...selectedRows, id]); } }; const [searchParams, setSearchParams] = useSearchParams(); const [startDate, setStartDate] = useState(null); const [searchText, setSearchText] = useState(''); const [endDate, setEndDate] = useState(null); const navigate = useNavigate(); const [dataProvider, setDataProvider] = useState(null); useEffect(() => { if (startDate !== null || endDate !== null || dataProvider !== null || order !== null || orderBy !== null || perPage !== 0) { loadDataTableData(); getProvider(); } }, [startDate, endDate, dataProvider, order, orderBy, perPage]); const [isLoading, setIsLoading] = useState(false); const [isLoadingImport, setIsLoadingImport] = useState(false); const handleExportReport = async () => { const year = startDate?.getFullYear(); const month = (startDate?.getMonth() + 1).toString().padStart(2, '0'); // Tambahkan 1 karena bulan dimulai dari 0, dan padStart untuk memastikan 2 digit const day = startDate?.getDate().toString().padStart(2, '0'); // padStart untuk memastikan 2 digit const formattedDate = year && month && day ? `${year}-${month}-${day}` : ''; const year1 = endDate?.getFullYear(); const month1 = (endDate?.getMonth() + 1).toString().padStart(2, '0'); // Tambahkan 1 karena bulan dimulai dari 0, dan padStart untuk memastikan 2 digit const day1 = endDate?.getDate().toString().padStart(2, '0'); // padStart untuk memastikan 2 digit const formattedDate1 = year1 && month1 && day1 ? `${year1}-${month1}-${day1}` : ''; var filter = Object.fromEntries([...searchParams.entries()]); setIsLoading(true) await axios .get('/claims/export-claim-management',{ params: { search: searchText, start_date: formattedDate ? formattedDate : null, end_date:formattedDate1, provider: dataProvider, order: order, orderBy: orderBy, page: perPage, } }) .then((res) => { enqueueSnackbar('Data berhasil di Export', { variant: 'success', anchorOrigin: { horizontal: 'right', vertical: 'top' }, }); setIsLoading(false) document.location.href = res.data.data.file_url; }) .catch((err) => enqueueSnackbar('Data Gagal di Export', { variant: 'error', anchorOrigin: { horizontal: 'right', vertical: 'top' }, }) ); }; function SearchInput(props: any) { // SEARCH const searchInput = useRef(null); const handleSearchChange = (event: any) => { const newSearchText = event.target.value ?? ''; setSearchText(newSearchText); }; const handleSearchSubmit = (event: any) => { event.preventDefault(); props.onSearch({ search: searchText }); // Trigger to Parent }; const handleGetData = (type :string) => { axios.get(`claims/1/data-claim`) .then((response) => { const link = document.createElement('a'); link.href = response.data.data.file_url; link.setAttribute('download', response.data.data.file_name); document.body.appendChild(link); link.click(); }) } useEffect(() => { // Trigger First Search // setSearchText(searchParams.get('search') ?? ''); }, []); return (
); } function ImportForm(props: any) { // IMPORT // Create Button Menu const [anchorEl, setAnchorEl] = React.useState(null); return (
{/* */}
); } const searchInput = useRef(null); //handle search const handleSearchChange = (event: any) => { const newSearchText = event.target.value ?? ''; setSearchText(newSearchText); }; const handleSearchSubmit = (event: any) => { event.preventDefault(); loadDataTableData(); }; useEffect(() => { // Trigger First Search //setSearchText(searchText); }, []); const item = [ { id: '', value: '', name: 'Semua', }, ]; // const handleClick = () => { // } // Dummy Default Data const [dataTableIsLoading, setDataTableLoading] = useState(true); const [dataTableData, setDataTableData] = useState( LaravelPaginatedDataDefault ); const loadDataTableData = async (appliedFilter: any | null = null) => { setDataTableLoading(true); const year = startDate?.getFullYear(); const month = (startDate?.getMonth() + 1).toString().padStart(2, '0'); // Tambahkan 1 karena bulan dimulai dari 0, dan padStart untuk memastikan 2 digit const day = startDate?.getDate().toString().padStart(2, '0'); // padStart untuk memastikan 2 digit const formattedDate = year && month && day ? `${year}-${month}-${day}` : ''; const year1 = endDate?.getFullYear(); const month1 = (endDate?.getMonth() + 1).toString().padStart(2, '0'); // Tambahkan 1 karena bulan dimulai dari 0, dan padStart untuk memastikan 2 digit const day1 = endDate?.getDate().toString().padStart(2, '0'); // padStart untuk memastikan 2 digit const formattedDate1 = year1 && month1 && day1 ? `${year1}-${month1}-${day1}` : ''; const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]); const response = await axios.get('/claims', { params: { search: searchText, start_date: formattedDate ? formattedDate : null, end_date:formattedDate1, provider: dataProvider, order: order, orderBy: orderBy, page: perPage, } }); setDataTableLoading(false); setDataTableData(response.data); }; const getProvider = async () => { const response = await axios.get('/claims/get-provider'); setProviders(response.data) } const applyFilter = async (searchFilter: { search: string }) => { await loadDataTableData(searchFilter); setSearchParams(searchFilter); }; const handlePageChange = (event: ChangeEvent, value: number): void => { setPerPage(value); }; const [openDialogSubmit, setOpenDialogSubmit] = useState(false); const handleCloseDialogSubmit = () => { setOpenDialogSubmit(false); } function toTitleCase(str: string | null) { return str.replace(/\w\S*/g, function(txt) { return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); }); } const [approve, setApprove] = useState(''); const [reasonDecline, setReasonDecline] = useState(''); const handleReasonDeclineChange = (event) => { setReasonDecline(event.target.value); // Tambahkan logika yang diperlukan di sini }; const handleSubmitData = () => { //approve or decline if (!reasonDecline && approve == 'decline') { enqueueSnackbar('Mohon isi alasan', { variant: 'warning' }); return false; } Promise.all(selectedRows.map(send_bulk)) .then(() => { enqueueSnackbar('All requests processed successfully', { variant: 'success' }); setOpenDialogSubmit(false); setTimeout(() => { window.location.reload(); }, 5000); // Reload the page after 5 seconds }) .catch((error) => { enqueueSnackbar(error.response?.data?.message ?? 'Something went wrong!', { variant: 'error' }); }); }; function send_bulk(id) { return axios.post(`claims/${id}/${approve}`, { reasonDecline: reasonDecline }); } const [anchorEl, setAnchorEl] = React.useState(null); const createMenu = Boolean(anchorEl); const importClaimManagement = useRef(null); const [currentImportFileName, setCurrentImportFileName] = useState(null); const [importLoading, setImportLoading] = useState(false); const [importResult, setImportResult] = useState(null); const handleClick = (event: React.MouseEvent) => { setAnchorEl(event.currentTarget); }; const handleClose = () => { setAnchorEl(null); }; const handleImportButton = () => { if (importClaimManagement?.current) { handleClose(); importClaimManagement.current ? importClaimManagement.current.click() : console.log('No File selected'); } else { alert('No file selected'); } }; const handleCancelImportButton = () => { if(importClaimManagement.current) { importClaimManagement.current.value = ''; importClaimManagement.current.dispatchEvent(new Event('change', { bubbles: true })); } }; const handleImportChange = (event: any) => { if (event.target.files[0]) { setCurrentImportFileName(event.target.files[0].name); } else { setCurrentImportFileName(null); } }; const handleUpload = () => { if(importClaimManagement.current && importClaimManagement.current.files) { if (importClaimManagement.current?.files.length) { const formData = new FormData(); formData.append('file', importClaimManagement.current?.files[0]); setImportLoading(true); axios .post('claims/import', formData) .then((response) => { handleCancelImportButton(); loadDataTableData(); setImportResult(response.data); setImportLoading(false); enqueueSnackbar('Success Import Claim Managemenet', { variant: 'success' }); }) .catch((response) => { enqueueSnackbar( 'Looks like something went wrong. Please check your data and try again. ' + response.message, { variant: 'error' } ); setImportLoading(false); }); } else { enqueueSnackbar('No File Selected', { variant: 'warning' }); } } }; const handleGetTemplate = () => { axios.get('claims/download-template').then((response) => { const link = document.createElement('a'); link.href = response.data.data.file_url; link.setAttribute('download', response.data.data.file_name); document.body.appendChild(link); link.click(); handleClose(); }); }; const handleExportReportFiled = async () => { await axios .post('claims/exportFiled', { params: importResult?.data.result_rows }) .then((res) => { enqueueSnackbar('Data berhasil di Export', { variant: 'success', anchorOrigin: { horizontal: 'right', vertical: 'top' }, }); setIsLoading(false) document.location.href = res.data.data.file_url; }) .catch((err) => enqueueSnackbar('Data Gagal di Export', { variant: 'error', anchorOrigin: { horizontal: 'right', vertical: 'top' }, }) ); }; // useEffect(() => { // loadDataTableData(); // getProvider(); // }, []); const headStyle = { fontWeight: 'bold', }; const headCells = [ { id: 'code', align: 'left', label: 'Code / Code LOG', isSort: true, }, { id: 'name', align: 'left', label: 'Name', isSort: false, }, { id: 'member_id', align: 'left', label: 'Member ID', isSort: false, }, { id: 'created_at', align: 'left', label: 'Date Submission', isSort: true, }, { id: 'plan_code', align: 'left', label: 'Plan ID', isSort: true, }, { id: 'service_code', align: 'left', label: 'Service', isSort: false, }, { id: 'corporate_policies', align: 'left', label: 'Policy Number', isSort: true, }, { id: 'provider', align: 'left', label: 'Provider', isSort: false, }, { id: 'tot_bill', align: 'left', label: 'Total Billing', isSort: false, }, { id: 'status', align: 'left', label: 'Status', isSort: false, }, { id: 'action', align: 'left', label: '', isSort: false, }, ]; const orders = { order: order, setOrder: setOrder, orderBy: orderBy, setOrderBy: setOrderBy, }; const createSortHandler = (property: string) => (event: React.MouseEvent) => { handleRequestSort(event, property); }; const handleRequestSort = async (event: React.MouseEvent, property: string) => { const isAsc = orders?.orderBy === property && orders?.order === 'asc'; orders?.setOrder(isAsc ? 'desc' : 'asc'); orders?.setOrderBy(property); }; // Called on every row to map the data to the columns function createData(data: Claims): Claims { return { ...data, }; } { /* ------------------ TABLE ROW ------------------ */ } function Row(props: { row: ReturnType, isSelected: boolean, onSelect: (id: string) => void }) { const { row, isSelected, onSelect } = props; // Memperbaiki destrukturisasi props const handleRowCheckboxChange = () => { onSelect(row.id); // Panggil fungsi onSelect dari komponen induk dengan id baris saat checkbox di baris diklik }; const [open, setOpen] = React.useState(false); const test = 1000; return ( *': { borderBottom: 'unset' } }}> {/* setOpen(!open)}> {open ? : } */} {row?.status == 'received' ? ( ):''} {row?.code} / {row.code_log} {/* {row.code} */} {row?.name} {row?.member_id} {row?.created_at ? fDateTime(row?.created_at) : ''} {row?.plan_code} {row?.service_code} {row?.corporate_policies} {row?.provider} Rp. {row?.tot_bill?.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ".")} {row.status == 'draft' && ()} {row.status == 'requested' && ()} {row.status == 'received' && ()} {row.status == 'approved' && ()} {row.status == 'postpone' && ()} {row.status == 'paid' && ()} {row.status == 'declined' && ()} navigate('/claims/detail/'+row.id_log+'/'+row.id+'') }> Detail } /> {/* COLLAPSIBLE ROW */} {/* Description : {row.description} */} ); } { /* ------------------ END TABLE ROW ------------------ */ } function TableContent() { return ( {/* ------------------ TABLE HEADER ------------------ */} {selectedRows.length > 0 ? ( <> {selectedRows.length > 0 ? selectedRows.length : '0'}  Selected ) : ( <> {headCells && headCells.map((headCell, index) => ( {headCell.isSort ? ( {headCell.label} {orders?.orderBy === headCell.id ? ( {orders.order === 'desc' ? 'sorted descending' : 'sorted ascending'} ) : null} ) : ( headCell.label )} ))} )} {/* ------------------ END TABLE HEADER ------------------ */} {/* ------------------ TABLE ROW ------------------ */} {dataTableIsLoading ? ( Loading ) : dataTableData.data.length === 0 ? ( No Data ) : ( {dataTableData.data.map((row) => ( ))} )} {/* ------------------ END TABLE ROW ------------------ */}
); } return (
{!currentImportFileName && ( <> { if (event.key === 'Enter') { handleSearchSubmit(event); } }} InputProps={{ startAdornment: ( ), placeholder: 'Search Code or Name', }} /> { // loadDataTableData(); setStartDate(value); }} renderInput={(params) => } /> { setEndDate(value); }} renderInput={(params) => ( )} /> { providers && ( option.name || ''} value={providers.find((item) => item.id === dataProvider) || null} onChange={(event, value) => { if (value) { setDataProvider(value.id); } else { setDataProvider(null); } }} renderInput={(params) => ( )} /> ) } } sx={{ p: 1.8 }} loading={isLoadingImport} onClick={handleClick} > Import Import { handleGetTemplate(); }} > Download Template } sx={{ p: 1.8 }} onClick={handleExportReport} loading={isLoading} > Export )} {currentImportFileName && ( } sx={{ p: 1.8 }} onClick={handleUpload} loading={importLoading} > Upload )} {importResult && ( Last Import Result :{' '} {importResult.data.total_success_row ?? 0} {' '} Row Processed,{' '} {importResult.data.total_failed_row} {' '} Failed, {/* {importResult.data.failed_rows.map((row, index) => ( [Code={row.code ? row.code : 'Required'}] ))} */}  Report:  Download Data Result Import )}
} /> Confirmation Are you sure to {toTitleCase(approve)} this claim ? {approve == "decline" ? ( ): ''}
); }