Update Generate Log

This commit is contained in:
R
2023-02-21 17:01:57 +07:00
parent 912edcdae7
commit bcf6662db6
5 changed files with 281 additions and 77 deletions

View File

@@ -10,6 +10,7 @@ use App\Models\Member;
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory; use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory; use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Box\Spout\Common\Entity\Row; use Box\Spout\Common\Entity\Row;
use Carbon\Carbon;
use Illuminate\Contracts\Support\Renderable; use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Controller; use Illuminate\Routing\Controller;
@@ -42,10 +43,10 @@ class CorporateMemberController extends Controller
'claims' => function ($claim) { 'claims' => function ($claim) {
// return $claim->whereBetween('requested_at', [now()->startOfYear(), now()->endOfYear()]); // return $claim->whereBetween('requested_at', [now()->startOfYear(), now()->endOfYear()]);
// return $claim->used(now()->startOfYear(), now()->endOfYear()); // return $claim->used(now()->startOfYear(), now()->endOfYear());
} },
'currentPlan',
'currentPlan.benefits'
]) ])
->with('currentPlan')
// ->with
->paginate() ->paginate()
->appends($request->all()); ->appends($request->all());
@@ -231,15 +232,23 @@ class CorporateMemberController extends Controller
} }
public function generateLog($member_id) public function generateLog(Request $request, $member_id)
{ {
$member = Member::findOrFail($member_id) $member = Member::findOrFail($member_id)
->load(['currentPlan', 'currentPolicy', 'currentPlan.corporateBenefits', 'currentPlan.corporateBenefits.benefit']); ->load([
'currentPlan',
'currentPolicy',
'currentPlan.corporateBenefits' => function ($benefit) use ($request) {
return $benefit->when($request->benefit_ids, function ($q, $ids) {
return $q->whereIn('id', $ids);
});
},
'currentPlan.corporateBenefits.benefit']);
// dd($member->currentPlan->corporateBenefits->toArray()); $dateOfAdmission = $request->date_of_admission ? Carbon::parse($request->date_of_admission) : now();
// return view('pdf.guaranted_leter', compact('member')); // return view('pdf.guaranted_leter', compact('member'));
$pdf = PDF::loadView('pdf.guaranted_leter', compact('member')); $pdf = PDF::loadView('pdf.guaranted_leter', compact(['member', 'dateOfAdmission']));
return $pdf->download('Guaranted Letter - '.$member->full_name.'.pdf'); return $pdf->download('Guaranted Letter - '.$member->full_name.'.pdf');
} }
} }

View File

@@ -130,8 +130,10 @@ Route::prefix('internal')->group(function () {
Route::resource('doctors', DoctorController::class); Route::resource('doctors', DoctorController::class);
Route::post('generate-log/{member_id}', [CorporateMemberController::class, 'generateLog']);
Route::get('generate-log/{member_id}', [CorporateMemberController::class, 'generateLog']);
Route::get('claim-requests', [ClaimRequestController::class, 'index'])->name('claim-requests.index');
Route::post('claim-requests/{id}/approve', [ClaimRequestController::class, 'approve'])->name('claim-requests.approve');
}); });
Route::get('province', [ProvinceController::class, 'index']); Route::get('province', [ProvinceController::class, 'index']);

View File

@@ -46,6 +46,7 @@ import { Member } from '../../../@types/member';
import BasePagination from '../../../components/BasePagination'; import BasePagination from '../../../components/BasePagination';
import { enqueueSnackbar } from 'notistack'; import { enqueueSnackbar } from 'notistack';
import { LoadingButton } from '@mui/lab'; import { LoadingButton } from '@mui/lab';
import DialogLog from './sections/DialogLog';
export default function CorporatePlanList() { export default function CorporatePlanList() {
const { themeStretch } = useSettings(); const { themeStretch } = useSettings();
@@ -198,19 +199,17 @@ export default function CorporatePlanList() {
enqueueSnackbar('No File Selected', { variant: 'warning' }); enqueueSnackbar('No File Selected', { variant: 'warning' });
} }
}; };
const handleGetTemplate = (type :string) => { const handleGetTemplate = (type: string) => {
axios.get('corporates/import-document-example/' + type) axios.get('corporates/import-document-example/' + type).then((response) => {
.then((response) => { const link = document.createElement('a');
const link = document.createElement('a'); link.href = response.data.data.file_url;
link.href = response.data.data.file_url; link.setAttribute('download', response.data.data.file_name);
link.setAttribute('download', response.data.data.file_name); document.body.appendChild(link);
document.body.appendChild(link); link.click();
link.click(); handleClose();
handleClose(); });
}) };
}
return ( return (
<div> <div>
@@ -248,7 +247,13 @@ export default function CorporatePlanList() {
}} }}
> >
<MenuItem onClick={handleImportButton}>Import</MenuItem> <MenuItem onClick={handleImportButton}>Import</MenuItem>
<MenuItem onClick={() => {handleGetTemplate('member')}}>Download Template</MenuItem> <MenuItem
onClick={() => {
handleGetTemplate('member');
}}
>
Download Template
</MenuItem>
</Menu> </Menu>
</Stack> </Stack>
)} )}
@@ -329,6 +334,15 @@ export default function CorporatePlanList() {
const { row } = props; const { row } = props;
const [open, setOpen] = React.useState(false); const [open, setOpen] = React.useState(false);
const [loadingLog, setLoadingLog] = React.useState(false); const [loadingLog, setLoadingLog] = React.useState(false);
const [dialogLogOpen, setDialogLogOpen] = React.useState(false);
// useEffect(function () {
// if (row.full_name == 'Pajri') {
// setDialogLogOpen(true);
// console.log('fuck');
// }
// }, []);
const handleActivate = (model: any, status: string) => { const handleActivate = (model: any, status: string) => {
axios axios
.put(`/members/${row.id}/activation`, { .put(`/members/${row.id}/activation`, {
@@ -355,33 +369,7 @@ export default function CorporatePlanList() {
); );
}); });
}; };
const handleDownloadLog = (row: ReturnType<typeof createData>) => {
setLoadingLog(true);
axios.get(`generate-log/${row.id}`, {
responseType: 'blob'
})
.then((response) => {
window.open(URL.createObjectURL(response.data));
// const content = response.headers['content-type'];
// download(response.data, file.file_name, content);
// const link = document.createElement('a');
// console.log(response.data);
// link.href = response.data.data.file_url;
// link.setAttribute('download', response.data.data.file_name);
// document.body.appendChild(link);
// link.click();
setLoadingLog(false);
})
// .then((blobFile) => {
// new File([blobFile], 'asdads.pdf', { type: blobFile.type })
// setLoadingLog(false);
// })
.catch((response) => {
enqueueSnackbar(response.message, {variant: 'error'})
setLoadingLog(false);
})
}
return ( return (
<React.Fragment> <React.Fragment>
<TableRow sx={{ '& > *': { borderBottom: 'unset' } }}> <TableRow sx={{ '& > *': { borderBottom: 'unset' } }}>
@@ -546,31 +534,29 @@ export default function CorporatePlanList() {
</Grid> </Grid>
<Grid> <Grid>
<LoadingButton <LoadingButton
id="upload-button" id="upload-button"
variant="outlined" variant="outlined"
startIcon={<InsertDriveFileIcon />} startIcon={<InsertDriveFileIcon />}
// sx={{ p: 1.8 }} // sx={{ p: 1.8 }}
onClick={() => {handleDownloadLog(row)}} // onClick={() => {handleDownloadLog(row)}}
loading={loadingLog} onClick={() => {
> setDialogLogOpen(true);
Download LOG }}
</LoadingButton> loading={loadingLog}
>
Download LOG
</LoadingButton>
</Grid> </Grid>
{/* <Typography sx={{ fontWeight: '600', mb: 1, mt: 2 }}>Sub Corporate</Typography> <DialogLog
<Grid container> title={{
<Grid item xs={12}> name: `Generate LOG - ${row.full_name}`,
<Grid container> }}
<Grid item xs={6}> openDialog={dialogLogOpen}
Sub Corporates (asdasdasdasd) setOpenDialog={setDialogLogOpen}
</Grid> data={{ member: row }}
<Grid item xs={6}> ></DialogLog>
: qweqweqweqwe
</Grid>
</Grid>
</Grid>
</Grid> */}
</Box> </Box>
</Collapse> </Collapse>
</TableCell> </TableCell>

View File

@@ -0,0 +1,203 @@
// react
import { ReactElement, useEffect, useState } from 'react';
// mui
import {
Card,
Checkbox,
Divider,
Grid,
Input,
Link,
Stack,
Table,
TableCell,
TableContainer,
TableRow,
Typography,
} from '@mui/material';
import { styled } from '@mui/material/styles';
// Component
import MuiDialog from '@/components/MuiDialog';
import { Box } from '@mui/material';
import { TextField } from '@mui/material';
import { DesktopDatePicker, LocalizationProvider } from '@mui/x-date-pickers';
import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns';
import { fPostFormat } from '@/utils/formatTime';
import { LoadingButton } from '@mui/lab';
import InsertDriveFileIcon from '@mui/icons-material/InsertDriveFile';
import axios from '@/utils/axios';
import { enqueueSnackbar } from 'notistack';
type DataContent = {
info: string;
date: string;
time: string;
};
type MuiDialogProps = {
title?: {
name?: string;
icon?: string;
};
openDialog: boolean;
setOpenDialog: Function;
content?: ReactElement;
data?: DataContent[];
};
const ItemNotificationStyle = styled(Card)(({ theme }) => ({
boxShadow: 'none',
padding: theme.spacing(1),
borderRadius: 0.5,
color: 'black',
}));
const DialogLog = ({ title, openDialog, setOpenDialog, data }: MuiDialogProps) => {
const [openDialogClaim, setOpenDialogClaim] = useState(false);
const [dialogTitleClaim, setDialogTitleClaim] = useState('');
const [dateOfAdmission, setDateOfAdmission] = useState(new Date());
const [checkedBenefitIds, setCheckedBenefitIds] = useState([]);
const [benefitIds, setBenefitIds] = useState([]);
const [loadingLog, setLoadingLog] = useState(false);
useEffect(() => {
setBenefitIds(data.member.current_plan?.benefits.map((benefit) => benefit.id))
setCheckedBenefitIds(benefitIds)
console.log('Check All', benefitIds, 'X', data.member.current_plan?.benefits.map((benefit) => benefit.id))
}, [])
const clickHandler = () => {
setDialogTitleClaim('Claim Details');
setOpenDialogClaim(true);
};
const handleCheckAll = (event) => {
if (event.target.checked) {
setCheckedBenefitIds(benefitIds)
} else {
setCheckedBenefitIds([])
}
}
const handleCheckChange = (event, benefit) => {
if ( event.target.checked ) {
setCheckedBenefitIds([...checkedBenefitIds, benefit.id])
} else {
// setCheckedBenefitIds([])
setCheckedBenefitIds(checkedBenefitIds.filter((benefitId) => benefitId !== benefit.id))
}
}
const handleDownloadLog = (row) => {
setLoadingLog(true);
axios
.post(`generate-log/${row.id}`, {
date_of_admission : dateOfAdmission,
benefit_ids : checkedBenefitIds
}, {
responseType: 'blob',
})
.then((response) => {
window.open(URL.createObjectURL(response.data));
setLoadingLog(false);
setOpenDialog(false);
})
.catch((response) => {
enqueueSnackbar(response.message, { variant: 'error' });
setLoadingLog(false);
});
}
const getContent = () => (
<Stack sx={{ marginTop: 2 }}>
<ItemNotificationStyle>
<Stack>
<Grid container spacing={2}>
<Grid item xs={12}>
<LocalizationProvider dateAdapter={AdapterDateFns}>
<DesktopDatePicker
inputFormat="dd/MM/Y"
value={dateOfAdmission}
onChange={(value) => {
setDateOfAdmission(new Date(fPostFormat(value)));
// console.log('value')
}}
renderInput={(params) => (
<TextField
{...params}
fullWidth
label="Date of Admission"
placeholder="dd/mm/yyyy"
/>
)}
/>
</LocalizationProvider>
</Grid>
<Grid item xs={12} sx={{marginTop: 2}}>
<Stack direction="row" alignItems="center" justifyContent={'space-between'}>
<Typography variant="body1" fontWeight={800}>List Of Benefit</Typography>
<Stack direction="row" alignItems="center">
<Typography>All</Typography>
<Checkbox onChange={handleCheckAll} checked={benefitIds.length == checkedBenefitIds.length}/>
</Stack>
</Stack>
</Grid>
<Grid item xs={12}>
<Stack divider={<Divider flexItem />}>
{ data.member.current_plan?.benefits && (
data.member.current_plan?.benefits.map((benefit, index) => (
<Stack direction="row" alignItems="center" key={index}>
<Box sx={{ width: '100%' }}>
<Typography>{benefit.code} {benefit.description ? ` - ${benefit.description} ` : ''}</Typography>
</Box>
<Checkbox checked={checkedBenefitIds.includes(benefit.id)} onClick={(event) => {handleCheckChange(event, benefit)} } />
</Stack>
))
)}
</Stack>
{/* <TableContainer>
<Table>
<TableRow>
<TableCell>
ASD
</TableCell>
<TableCell>
ASD
</TableCell>
</TableRow>
</Table>
</TableContainer> */}
</Grid>
<Grid item xs={12}>
<LoadingButton
id="upload-button"
variant="outlined"
fullWidth
startIcon={<InsertDriveFileIcon />}
onClick={() => {handleDownloadLog(data.member)}}
loading={loadingLog}
>
Download LOG
</LoadingButton>
</Grid>
</Grid>
</Stack>
</ItemNotificationStyle>
</Stack>
);
return (
<>
<MuiDialog
title={title}
openDialog={openDialog}
setOpenDialog={setOpenDialog}
content={getContent()}
/>
</>
);
};
export default DialogLog;

View File

@@ -124,7 +124,11 @@
<tr> <tr>
<td> <td>
<div class="text-sm text-gray">Date of Admission</div> <div class="text-sm text-gray">Date of Admission</div>
<div class="text-md">{{ !empty($member->endorsement_date) ? \Carbon\Carbon::parse($member->endorsement_date)->format('d/m/Y') : $member->created_at->format('d/m/Y') }}</div> @if (isset($claimRequest))
<div class="text-md">{{ !empty($claimRequest->submission_date) ? \Carbon\Carbon::parse($claimRequest->submission_date)->format('d/m/Y') : now()->format('d/m/Y') }}</div>
@else
<div class="text-md">{{ $dateOfAdmission->format('d/m/Y') }}</div>
@endif
</td> </td>
<td> <td>
<div class="text-sm text-gray">Plan</div> <div class="text-sm text-gray">Plan</div>
@@ -141,17 +145,17 @@
</tr> </tr>
<tr> {{-- <tr>
<td class="text-lg">Medical Check Up</td> <td class="text-lg">Medical Check Up</td>
<td class="text-lg">As Charged</td> <td class="text-lg">As Charged</td>
</tr> </tr> --}}
{{-- @foreach ($member->currentPlan->corporateBenefits as $corporateBenefit) @foreach ($member->currentPlan->corporateBenefits as $corporateBenefit)
<tr> <tr>
<td>{{ $corporateBenefit->corporate_benefit_code ?? '' }}</td> <td>{{ $corporateBenefit->corporate_benefit_code ?? '' }}</td>
<td style="align-right">IDR {{ number_format($corporateBenefit->limit_amount, 0, ',', '.') ?? '' }}</td> <td style="align-right">IDR {{ number_format($corporateBenefit->limit_amount, 0, ',', '.') ?? '' }}</td>
</tr> </tr>
@endforeach --}} @endforeach
</table> </table>
</div> </div>