From b934fb0727afc8ffa4b6cb0e1b47f119e33a9e52 Mon Sep 17 00:00:00 2001 From: korospace Date: Tue, 31 Oct 2023 18:29:05 +0700 Subject: [PATCH 1/3] progress 1 dashboard-create-claim-request --- .../Api/ClaimRequestController.php | 65 ++++++++--- Modules/Internal/Routes/api.php | 1 + .../src/pages/ClaimSubmit/Index.tsx | 4 +- .../claim-submit/DialogClaimSubmitMember.tsx | 2 +- frontend/dashboard/pnpm-lock.yaml | 10 ++ .../dashboard/src/hooks/useLoadOnScroll.ts | 98 ++++++++++++++++ .../src/pages/ClaimRequests/CreateUpdate.tsx | 66 ++++++----- .../src/pages/ClaimRequests/FormCreate.tsx | 110 ++++++++++++++++++ .../ClaimRequests/FormCreateListChoose.tsx | 78 +++++++++++++ .../pages/ClaimRequests/FormCreateSearch.tsx | 70 +++++++++++ .../src/pages/ClaimRequests/List.tsx | 18 +-- .../pages/ClaimRequests/Model/Functions.tsx | 22 ++++ .../src/pages/ClaimRequests/Model/Types.tsx | 15 +++ frontend/dashboard/src/routes/index.tsx | 28 +++-- frontend/dashboard/src/theme/palette.ts | 10 +- 15 files changed, 526 insertions(+), 71 deletions(-) create mode 100644 frontend/dashboard/src/hooks/useLoadOnScroll.ts create mode 100644 frontend/dashboard/src/pages/ClaimRequests/FormCreate.tsx create mode 100644 frontend/dashboard/src/pages/ClaimRequests/FormCreateListChoose.tsx create mode 100644 frontend/dashboard/src/pages/ClaimRequests/FormCreateSearch.tsx create mode 100644 frontend/dashboard/src/pages/ClaimRequests/Model/Functions.tsx create mode 100644 frontend/dashboard/src/pages/ClaimRequests/Model/Types.tsx diff --git a/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php b/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php index 1d70f809..85cae6d7 100644 --- a/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php +++ b/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php @@ -129,7 +129,7 @@ class ClaimRequestController extends Controller } $updateClaimRequest = ClaimRequestService::updateClaimRequest(organization_id: $organization->id, claim_request_id: $id); - + ClaimRequested::dispatch($updateClaimRequest); // Log History $updateClaimRequest->histories()->create([ @@ -185,9 +185,9 @@ class ClaimRequestController extends Controller } return response()->json([ - 'error' => false, - 'message' => 'Update succses', - 'data' => $updateClaimRequest], + 'error' => false, + 'message' => 'Update succses', + 'data' => $updateClaimRequest], 200); } @@ -206,17 +206,17 @@ class ClaimRequestController extends Controller { $claimRequest = ClaimRequest::findOrFail($id); $member = $claimRequest->member; - + try { // Create New Claim $newClaim = ClaimService::storeClaim(member: $member, status: 'received', claimRequest: $claimRequest); - + // Update Claim Request Status & Link with Claim $claimRequest->status = 'approved'; $claimRequest->claim_id = $newClaim->id; $claimRequest->save(); - + // Store Generated Documents LOG $logContent = view('pdf.guaranted_leter', compact('member', 'claimRequest')); $claimRequest->generatedDocuments()->create([ @@ -269,7 +269,7 @@ class ClaimRequestController extends Controller { return Helper::responseJson(data: $request->toArray(), message: 'Tidak ada file member yang ditambahkan'); } - + } public function importClaim(Request $request) @@ -323,24 +323,24 @@ class ClaimRequestController extends Controller $claimRequestService = new ClaimRequestService(); $claimRequestService->handleClaimRequestRow($row_data); - + // Write Success Result to File // $import->read($fileRead); // $import->write($fileWrite, 'xsls'); $result_headers = array_merge($row_data, ['Ingest Code' =>200, 'Ingest Note' => 'Success']); - + $import->addArrayToRow($result_headers, $sheet->getName()); - + } catch (ImportRowException $e) { // Write Data Validation Error to File // $import->read($fileRead); // $import->write($fileWrite, 'xsls'); - + $import->addArrayToRow(array_merge($row_data, [ 'Ingest Code' => $e->getCode(), 'Ingest Note' => $e->getMessage(), ]), $sheet->getName()); - } + } // catch (\Exception $e) { // // throw new \Exception($e); // // Write Server Error to File @@ -380,16 +380,16 @@ class ClaimRequestController extends Controller ->where('claim_requests.id', '=', $claimRequestId) ->select( 'claim_requests.submission_date', - 'claim_requests.code', + 'claim_requests.code', DB::raw(' - CASE + CASE WHEN claim_requests.status = "requested" THEN "requested" WHEN claim_requests.status = "approved" AND claims.status = "approved" THEN "approved" WHEN claim_requests.status = "approved" AND claims.status = "declined" THEN "declined" WHEN claim_requests.status = "approved" AND claims.status = "disbrusmented" THEN "disbrusmented" /*WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "pending"*/ WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "reviewed" - ELSE "" + ELSE "" END AS status ') ) @@ -477,4 +477,37 @@ class ClaimRequestController extends Controller } return Helper::responseJson(data: $request->toArray(), message: 'Invoice Success Uploaded'); } + + /** + * Get Claim Member - Infinite Scroll + * + * Bagaskoro, BSD 31 Oktober 2023 + */ + public function getClaimMemberInfiniteScroll(Request $request) + { + $offset = 0; + $limit = 10; + $page = $request->get('page'); + $keyword = $request->get('keyword'); + + if ($page > 1) { + $offset = ($page*$limit)-$limit; + } + + $memberList = DB::table('members') + ->select('id','member_id','name') + ->where("name", "like", "%$keyword%") + ->orderBy('created_at', 'asc') + ->offset($offset) + ->limit($limit) + ->get(); + + return response()->json([ + 'error' => false, + 'message' => "success", + 'data' => [ + 'member_list'=> $memberList, + ] + ],200); + } } diff --git a/Modules/Internal/Routes/api.php b/Modules/Internal/Routes/api.php index b74e7fd4..17b2095d 100644 --- a/Modules/Internal/Routes/api.php +++ b/Modules/Internal/Routes/api.php @@ -245,6 +245,7 @@ Route::prefix('internal')->group(function () { Route::post('files-mcu', 'filesMcu'); }); Route::get('claim-requests', [ClaimRequestController::class, 'index'])->name('claim-requests.index'); + Route::get('claim-requests/list-member', [ClaimRequestController::class, 'getClaimMemberInfiniteScroll']); // Bagaskoro, BSD 31 Oktober 2023 Route::post('claim-requests/{id}/approve', [ClaimRequestController::class, 'approve'])->name('claim-requests.approve'); Route::get('claim-requests/{id}', [ClaimRequestController::class, 'show'])->name('claim-requests.show'); Route::put('claim-requests/{id}', [ClaimRequestController::class, 'update'])->name('claim-requests.update'); diff --git a/frontend/client-portal/src/pages/ClaimSubmit/Index.tsx b/frontend/client-portal/src/pages/ClaimSubmit/Index.tsx index a6226041..26f9764a 100644 --- a/frontend/client-portal/src/pages/ClaimSubmit/Index.tsx +++ b/frontend/client-portal/src/pages/ClaimSubmit/Index.tsx @@ -95,7 +95,7 @@ export default function Drugs() { setIsLoading: setIsLoading, }; - + /* ------------------------------ handle params ----------------------------- */ const [searchParams, setSearchParams] = useSearchParams(); @@ -121,7 +121,7 @@ export default function Drugs() { setOrderBy: setOrderBy, }; - + /* ---------------------------- Get Current Date ---------------------------- */ const current = new Date(); const date = fDateSuffix(current); diff --git a/frontend/client-portal/src/sections/claim-submit/DialogClaimSubmitMember.tsx b/frontend/client-portal/src/sections/claim-submit/DialogClaimSubmitMember.tsx index c452c50d..97b8c279 100644 --- a/frontend/client-portal/src/sections/claim-submit/DialogClaimSubmitMember.tsx +++ b/frontend/client-portal/src/sections/claim-submit/DialogClaimSubmitMember.tsx @@ -147,7 +147,7 @@ export default function DialogClaimSubmitMember({ {data.map((row: DataContentType, key) => ( { return selectedData.some((item) => item.memberId === row.memberId) ? theme.palette.primary.lighter : theme.palette.background.default diff --git a/frontend/dashboard/pnpm-lock.yaml b/frontend/dashboard/pnpm-lock.yaml index 1ba3e3ec..54e4fb31 100644 --- a/frontend/dashboard/pnpm-lock.yaml +++ b/frontend/dashboard/pnpm-lock.yaml @@ -149,6 +149,9 @@ dependencies: vite-plugin-svgr: specifier: ^2.4.0 version: 2.4.0(rollup@2.79.1)(vite@3.2.7) + yarn: + specifier: ^1.22.19 + version: 1.22.19 yup: specifier: ^0.32.11 version: 0.32.11 @@ -7889,6 +7892,13 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} + /yarn@1.22.19: + resolution: {integrity: sha512-/0V5q0WbslqnwP91tirOvldvYISzaqhClxzyUKXYxs07yUILIs5jx/k6CFe8bvKSkds5w+eiOqta39Wk3WxdcQ==} + engines: {node: '>=4.0.0'} + hasBin: true + requiresBuild: true + dev: false + /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} diff --git a/frontend/dashboard/src/hooks/useLoadOnScroll.ts b/frontend/dashboard/src/hooks/useLoadOnScroll.ts new file mode 100644 index 00000000..a43ed6f7 --- /dev/null +++ b/frontend/dashboard/src/hooks/useLoadOnScroll.ts @@ -0,0 +1,98 @@ +import { RefObject, useEffect, useRef, useState } from 'react'; + +interface FetchFunction { + (page: number): Promise; +} + +const useLoadOnScroll = (executeFetch: FetchFunction) => { + const [data, setData] = useState([]); + const [isLoading, setIsLoading] = useState(false); + const [page, setPage] = useState(1); + const [listener, setListener] = useState(1); + const [lastPage, setLastPage] = useState(false); + + const fetchData = async (isSearch?: boolean) => { + if (!lastPage || isSearch === true) + if (isLoading === false) { + setIsLoading(true); + if (isSearch === true) { + const newData = await executeFetch(1); + if (newData.length > 0) { + setData(newData); + setPage((prevPage) => 2); + } else { + setLastPage(true); + setData([]); + } + } else { + const newData = await executeFetch(page); + if (newData.length > 0) { + setData((prevData) => [...prevData, ...newData]); + setPage((prevPage) => prevPage + 1); + } else { + setLastPage(true); + } + } + + setIsLoading(false); + } + }; + + const refetchData = () => { + setPage(1); + setListener((prev) => prev + 1); + }; + + const resetLastPage = () => { + setLastPage(false); + }; + + useEffect(() => { + fetchData(); + }, [listener]); + + // useEffect(() => { + // if (data.length === 0) { + // fetchData(); + // } + // }, [data]); + + const handleScroll = () => { + const { scrollTop, clientHeight, scrollHeight } = document.documentElement; + + if (scrollTop + clientHeight >= scrollHeight - 1) { + setListener((prevListener) => prevListener + 1); + } + }; + + const resetSearch = () => { + console.log('reset search'); + fetchData(true); + resetLastPage(); + }; + + useEffect(() => { + window.addEventListener('scroll', handleScroll); + + return () => { + window.removeEventListener('scroll', handleScroll); + }; + }, []); + + const onClose = () => { + setData([]); + setPage(1); + setLastPage(false); + }; + + const onOpen = () => { + setData([]); + setLastPage(false); + fetchData(true); + }; + + // setData and setPage to reset when the dialog closed + return { data, isLoading, setPage, setData, resetSearch, resetLastPage, onClose, onOpen, refetchData }; +}; + +export default useLoadOnScroll; diff --git a/frontend/dashboard/src/pages/ClaimRequests/CreateUpdate.tsx b/frontend/dashboard/src/pages/ClaimRequests/CreateUpdate.tsx index 12e5885d..fa6b83b3 100644 --- a/frontend/dashboard/src/pages/ClaimRequests/CreateUpdate.tsx +++ b/frontend/dashboard/src/pages/ClaimRequests/CreateUpdate.tsx @@ -1,4 +1,6 @@ import * as Yup from 'yup'; +import { Box, IconButton } from '@mui/material'; +import { ArrowBackIosNew } from '@mui/icons-material'; import { yupResolver } from '@hookform/resolvers/yup'; import { Autocomplete, Button, Card, Collapse, Container, Divider, Grid, Stack, Table, TableBody, TableCell, TableRow, TextField, Typography } from '@mui/material'; import { Controller, useForm } from 'react-hook-form'; @@ -17,45 +19,57 @@ import { fCurrency } from '../../utils/formatNumber'; import Iconify from '../../components/Iconify'; import { ClaimRequest } from '@/@types/claims'; import Form from './Form'; +import FormCreate from './FormCreate'; export default function ClaimsCreateUpdate() { - - const { themeStretch } = useSettings(); - const { id } = useParams(); + const navigate = useNavigate() + const { themeStretch } = useSettings(); + const { id } = useParams(); - const isEdit = id ? true : false; + const isEdit = id ? true : false; - const [currentClaim, setCurrentClaim] = useState(); + const [currentClaim, setCurrentClaim] = useState(); - useEffect(() => { - if (isEdit) { - axios.get('/claim-requests/' + id).then((res) => { - console.log('Yeet', res.data); - setCurrentClaim(res.data.data); - }); + useEffect(() => { + if (isEdit) { + axios.get('/claim-requests/' + id).then((res) => { + console.log('Yeet', res.data); + setCurrentClaim(res.data.data); + }); + + console.log(currentClaim) + } + }, [id]); - console.log(currentClaim) - } - }, [id]); - return ( - - + + + navigate(`/claim-requests`)} > + + + + + {id == undefined ? 'Create Claim Requests' : 'Edit Claim Requests'} + + -
+ { + id == undefined + ? + ( + + ) + : + ( + + ) + } + ); diff --git a/frontend/dashboard/src/pages/ClaimRequests/FormCreate.tsx b/frontend/dashboard/src/pages/ClaimRequests/FormCreate.tsx new file mode 100644 index 00000000..0f7c936f --- /dev/null +++ b/frontend/dashboard/src/pages/ClaimRequests/FormCreate.tsx @@ -0,0 +1,110 @@ +/** + * Core + * ============================================ + */ +import { useEffect, useState } from 'react'; +import { Box, FormControlLabel, Grid, Checkbox, Typography, CircularProgress , Button, styled} from '@mui/material'; + +/** + * Components + * ============================================ +*/ +// - Global - +import Label from '@/components/Label'; +// - Local - +import FormCreateSearch from './FormCreateSearch'; + +/** + * Icon, Utils, Types, Functions, theme, hook + * ============================================ + */ +import { MemberListType } from './Model/Types'; +import { getMemberList } from './Model/Functions'; +import useLoadOnScroll from '@/hooks/useLoadOnScroll'; +import FormCreateListChoose from './FormCreateListChoose'; + +/** + * Custom Style + * ============================================ +*/ +const DivCustom1 = styled('div')(({ theme }) => ({ + left: '350px', + [theme.breakpoints.between('sm', 'lg')]: { + left: '0px', + }, +})); + +export default function FormCreate() { + // State + // ------------------------- + const [keyword, setKeyword] = useState(''); + const [listChoosed, setListChoosed] = useState([]); + const [isChoosed, setIsChoosed] = useState(false); + + // List Choose - auto Scroll + // ------------------------- + const fetchFunction = async (page: number): Promise => getMemberList(page, keyword) + const {data: MemberList, isLoading, setData, resetLastPage, refetchData} = useLoadOnScroll(fetchFunction); + + // List Choose - Search + // ------------------------- + const handleSearch = (keyword: string) => { + setData([]) + resetLastPage() + setKeyword(keyword) + refetchData() + } + + return ( + + {/* Choose Section */} + + {/* Search */} + + handleSearch('')} onSubmit={(keyword) => handleSearch(keyword)} /> + + + + + {/* List */} + + + { + MemberList.map((row, index) => { + return ( + { + checked ? setListChoosed((prevData) => [...prevData, data]) : setListChoosed((items) => items.filter(item => item.id != data.id)) + }} + /> + ) + }) + } + + + + {/* Loading */} + + + + + {/* Submit List */} + + + + + + + + + + {/* Input Section */} + + + ) +} diff --git a/frontend/dashboard/src/pages/ClaimRequests/FormCreateListChoose.tsx b/frontend/dashboard/src/pages/ClaimRequests/FormCreateListChoose.tsx new file mode 100644 index 00000000..ce4c6747 --- /dev/null +++ b/frontend/dashboard/src/pages/ClaimRequests/FormCreateListChoose.tsx @@ -0,0 +1,78 @@ +/** + * Core + * ============================================ + */ +import { useEffect, useState } from 'react'; +import { Box, FormControlLabel, Grid, Checkbox, Typography, Card} from '@mui/material'; + +/** + * Components + * ============================================ +*/ +// - Global - +import Label from '@/components/Label'; +// - Local - + +/** + * Icon, Utils, Types, Functions, theme, hook + * ============================================ + */ +import { fDateTimesecond } from '@/utils/formatTime'; +import { MemberListType } from './Model/Types'; +import palette from '@/theme/palette'; + +/** + * Props + * ===================================================== + */ +type Props = { + data: MemberListType, + ListChoosed: MemberListType[], + handleCheckedProp: (checked: boolean, data: MemberListType) => void, +}; + +export default function FormCreateListChoose({data, ListChoosed, handleCheckedProp}: Props) { + const [isChoosed, setIsChoosed] = useState(false) + + useEffect(() => { + setIsChoosed(false); + + ListChoosed.forEach(list => { + if (list.id == data.id) { + setIsChoosed(true); + } + }) + }, [ListChoosed]) + + return ( + + { + return isChoosed ? palette.light.primary.lighter : palette.light.background.default + } + }}> + + handleCheckedProp(checked, data)} />} + checked={isChoosed} + /> + + + + {data.name} + + + {data.member_id} + + + + + + + + ) +} diff --git a/frontend/dashboard/src/pages/ClaimRequests/FormCreateSearch.tsx b/frontend/dashboard/src/pages/ClaimRequests/FormCreateSearch.tsx new file mode 100644 index 00000000..f21b78d6 --- /dev/null +++ b/frontend/dashboard/src/pages/ClaimRequests/FormCreateSearch.tsx @@ -0,0 +1,70 @@ +/** + * Core + * ============================================ + */ +import { useEffect } from 'react'; +import { useForm } from 'react-hook-form'; +import { Grid } from '@mui/material'; + +/** + * Components + * ============================================ +*/ +// - Global - +import { FormProvider, RHFTextField } from '@/components/hook-form'; +// - Local - + +/** + * Icon, Utils, Types, Functions + * ============================================ + */ +import { Search } from '@mui/icons-material'; +import { SearchType } from './Model/Types'; + +type Props = { + onSubmit: (keyword: string) => void, + onEmpty: () => void, +}; + +const FormCreateSearch = ({ onSubmit, onEmpty }: Props) => { + const defaultValuesSearchForm = { + keyword: '' + }; + + const methodsSearchForm = useForm({ + defaultValues: defaultValuesSearchForm + }); + + const { handleSubmit, formState: { isDirty } } = methodsSearchForm; + + // search on submit + const onSubmitSearch = (data: SearchType ) => { + onSubmit(data.keyword); + } + + // search on empty + useEffect(() => { + if (isDirty === false) { + onEmpty() + } + },[isDirty]) + + return ( + + + + }} + sx={{ input: { paddingLeft: '14px' } }} + /> + + + + ) +} + +export default FormCreateSearch diff --git a/frontend/dashboard/src/pages/ClaimRequests/List.tsx b/frontend/dashboard/src/pages/ClaimRequests/List.tsx index c04f8d04..98e193f4 100644 --- a/frontend/dashboard/src/pages/ClaimRequests/List.tsx +++ b/frontend/dashboard/src/pages/ClaimRequests/List.tsx @@ -135,7 +135,7 @@ export default function List() { if (importForm.current?.files.length) { const formData = new FormData(); formData.append('file', importForm.current?.files[0]); - + setImportLoading(true); axios .post(`claim-requests/import`, formData) @@ -222,7 +222,7 @@ export default function List() { startIcon={} sx={{ p: 1.8 }} onClick={() => { - navigate('/claims/create'); + navigate('/claim-requests/create'); }} > Create @@ -356,8 +356,8 @@ export default function List() { {row.service_name} {row.payment_type_name} - { row.status == "requested" ? - () : + { row.status == "requested" ? + () : () } @@ -376,7 +376,7 @@ export default function List() { } /> {/* - + { handleShowClaim(row); @@ -398,7 +398,7 @@ export default function List() { > Berkas Hasil Penunjang - {/* {row.files_by_type?.claim_kondisi && + {/* {row.files_by_type?.claim_kondisi && row.files_by_type?.claim_kondisi.map((file, index) => ( -{' '} @@ -412,7 +412,7 @@ export default function List() { <> - Kondisi {row.files_by_type?.claim_kondisi.map((file, index) => ( - + {file.name} @@ -426,7 +426,7 @@ export default function List() { <> - Diagnosa {row.files_by_type?.claim_diagnosis.map((file, index) => ( - + {file.name} @@ -440,7 +440,7 @@ export default function List() { <> - Hasil {row.files_by_type?.claim_result.map((file, index) => ( - + {file.name} diff --git a/frontend/dashboard/src/pages/ClaimRequests/Model/Functions.tsx b/frontend/dashboard/src/pages/ClaimRequests/Model/Functions.tsx new file mode 100644 index 00000000..4d64f49a --- /dev/null +++ b/frontend/dashboard/src/pages/ClaimRequests/Model/Functions.tsx @@ -0,0 +1,22 @@ +import axios from '@/utils/axios'; +import { enqueueSnackbar } from 'notistack'; +import { MemberListType } from './Types'; + +/** + * Listing Member + */ +export const getMemberList = async ( page: number, keyword: string ): Promise => { + const response = await axios.get(`/claim-requests/list-member?page=${page}&keyword=${keyword}`) + .then((res) =>{ + return res.data.data.member_list; + }) + .catch((res) => { + enqueueSnackbar("server error !", { + variant: 'error', + }); + + return []; + }); + + return response; +}; diff --git a/frontend/dashboard/src/pages/ClaimRequests/Model/Types.tsx b/frontend/dashboard/src/pages/ClaimRequests/Model/Types.tsx new file mode 100644 index 00000000..d82acdf9 --- /dev/null +++ b/frontend/dashboard/src/pages/ClaimRequests/Model/Types.tsx @@ -0,0 +1,15 @@ +/** + * Search Type + */ +export type SearchType = { + keyword: string, +} + +/** + * Member List + */ +export type MemberListType = { + id : string, + member_id : string, + name : string, +} diff --git a/frontend/dashboard/src/routes/index.tsx b/frontend/dashboard/src/routes/index.tsx index aec83214..51910bb3 100644 --- a/frontend/dashboard/src/routes/index.tsx +++ b/frontend/dashboard/src/routes/index.tsx @@ -430,18 +430,6 @@ export default function Router() { path: 'claims', element: , }, - { - path: 'claim-requests', - element: , - }, - { - path: 'claim-requests/edit/:id', - element: , - }, - { - path: 'claim-requests/detail/:id', - element: , - }, { path: 'claims/create', element: , @@ -458,6 +446,22 @@ export default function Router() { path: 'claims/:id', element: , }, + { + path: 'claim-requests', + element: , + }, + { + path: 'claim-requests/create', + element: , + }, + { + path: 'claim-requests/edit/:id', + element: , + }, + { + path: 'claim-requests/detail/:id', + element: , + }, { path: 'profile', element: , diff --git a/frontend/dashboard/src/theme/palette.ts b/frontend/dashboard/src/theme/palette.ts index 38249bc1..f2ca22ce 100644 --- a/frontend/dashboard/src/theme/palette.ts +++ b/frontend/dashboard/src/theme/palette.ts @@ -62,11 +62,11 @@ declare module '@mui/material' { // SETUP COLORS const PRIMARY = { - lighter: '#D0FBEC', - light: '#70EAD5', - main: '#19BBBB', - dark: '#0C7186', - darker: '#043C59', + lighter: '#D1F1F1', + light: '#70EAD5', + main: '#19BBBB', + dark: '#0C7186', + darker: '#043C59', }; const SECONDARY = { lighter: '#D6E4FF', From 22e30615648a3eb88276dd396b9b49a8d5639b3d Mon Sep 17 00:00:00 2001 From: korospace Date: Thu, 2 Nov 2023 17:40:33 +0700 Subject: [PATCH 2/3] progress 2 feature/dashboard-create-claim-request --- .../Api/ClaimRequestController.php | 20 +- .../Api/ClaimRequestController.php | 141 ++++++- .../Api/DailyMonitoringController.php | 2 +- Modules/Internal/Routes/api.php | 3 +- frontend/client-portal/.env.development | 4 +- .../CaseManagement/DailyMonitoring/Claim.tsx | 10 +- .../Components/DailyMonitoringList.tsx | 10 +- .../ClaimRequests/Components/FormCreate.tsx | 361 ++++++++++++++++++ .../Components/FormCreateBtnChoose.tsx | 39 ++ .../Components/FormCreateBtnUpload.tsx | 39 ++ .../Components/FormCreateFilesUpload.tsx | 25 ++ .../{ => Components}/FormCreateListChoose.tsx | 2 +- .../{ => Components}/FormCreateSearch.tsx | 2 +- .../{Form.tsx => Components/FormEdit.tsx} | 40 +- .../src/pages/ClaimRequests/CreateUpdate.tsx | 21 +- .../src/pages/ClaimRequests/FormCreate.tsx | 110 ------ .../pages/ClaimRequests/Model/Functions.tsx | 51 +++ .../src/pages/ClaimRequests/Model/Types.tsx | 10 +- 18 files changed, 712 insertions(+), 178 deletions(-) create mode 100644 frontend/dashboard/src/pages/ClaimRequests/Components/FormCreate.tsx create mode 100644 frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateBtnChoose.tsx create mode 100644 frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateBtnUpload.tsx create mode 100644 frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateFilesUpload.tsx rename frontend/dashboard/src/pages/ClaimRequests/{ => Components}/FormCreateListChoose.tsx (98%) rename frontend/dashboard/src/pages/ClaimRequests/{ => Components}/FormCreateSearch.tsx (97%) rename frontend/dashboard/src/pages/ClaimRequests/{Form.tsx => Components/FormEdit.tsx} (92%) delete mode 100644 frontend/dashboard/src/pages/ClaimRequests/FormCreate.tsx diff --git a/Modules/Client/Http/Controllers/Api/ClaimRequestController.php b/Modules/Client/Http/Controllers/Api/ClaimRequestController.php index 23dd68f1..3a4d5abf 100644 --- a/Modules/Client/Http/Controllers/Api/ClaimRequestController.php +++ b/Modules/Client/Http/Controllers/Api/ClaimRequestController.php @@ -48,17 +48,17 @@ class ClaimRequestController extends Controller ]); if ($request->member_id){ foreach($request->member_id as $key => $member_id){ - - $code = $this->getNextCode(); + + $code = $this->getNextCode(); $member = Member::find($member_id); $newClaimRequest = ClaimRequestService::storeClaimRequest( - row: [], - code: $code, - member: $member, - paymentType: 'reimbursement', - serviceCode: $request->service_code[$key], + row: [], + code: $code, + member: $member, + paymentType: 'reimbursement', + serviceCode: $request->service_code[$key], ); - + ClaimRequested::dispatch($newClaimRequest); // Log History $newClaimRequest->histories()->create([ @@ -127,9 +127,9 @@ class ClaimRequestController extends Controller } } } - - + + return Helper::responseJson(data: $request->toArray(), message: 'Claim Request berhasil ajukan!'); } diff --git a/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php b/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php index 85cae6d7..6b311ed5 100644 --- a/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php +++ b/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php @@ -25,6 +25,8 @@ use App\Models\Member; class ClaimRequestController extends Controller { + private static $code_prefix = 'CRQ-C'; + /** * Display a listing of the resource. * @return Renderable @@ -64,14 +66,109 @@ class ClaimRequestController extends Controller return view('internal::create'); } - /** - * Store a newly created resource in storage. - * @param Request $request - * @return Renderable - */ - public function store(Request $request) + public function createNew(Request $request) { - // + $request->validate([ + 'member_id' => 'required|array', + 'member_id.*' => 'required', + 'service_code.*' => 'required|in:OP,IP' + ]); + + if ($request->member_id){ + foreach($request->member_id as $key => $member_id){ + + $code = $this->getNextCode(); + $member = Member::find($member_id); + + DB::beginTransaction(); + + try { + $newClaimRequest = ClaimRequestService::storeClaimRequest( + row: [], + code: $code, + member: $member, + paymentType: 'reimbursement', + serviceCode: $request->service_code[$key], + ); + + ClaimRequested::dispatch($newClaimRequest); + + // Log History + $newClaimRequest->histories()->create([ + 'title' => 'New Claim Requested', + 'description' => "Claim Requested for Member : {$member->member_id} - ({$member->full_name})", + 'type' => 'info', + 'system_origin' => 'client-portal' + ]); + + // Claim Log + DB::table('claim_logs') ->insert([ + 'claim_request_id' => $newClaimRequest->id, + 'status' => 'requested', + 'date' => date('Y-m-d H:i:s'), + 'description' => "Claim Requested for Member : {$member->member_id} - ({$member->full_name})", + 'system_origin' => 'hospital-portal', + 'created_by' => auth()->user()->id, + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at'=> date('Y-m-d H:i:s'), + ]); + + if ($request->hasFile('laboratorium')) { + foreach ($request->laboratorium[$key] as $file) { + $pathFile = File::storeFile('claim-result', $newClaimRequest->id, $file); + $newClaimRequest->files()->updateOrCreate([ + 'type' => 'claim-result', + 'name' => File::getFileName('claim-result', $newClaimRequest->id, $file), + 'original_name' => $file->getClientOriginalName(), + 'extension' => $file->getClientOriginalExtension(), + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + + if ($request->hasFile('prescription')) { + foreach ($request->prescription[$key] as $file) { + $pathFile = File::storeFile('claim-diagnosis', $newClaimRequest->id, $file); + $newClaimRequest->files()->updateOrCreate([ + 'type' => 'claim-diagnosis', + 'name' => File::getFileName('claim-diagnosis', $newClaimRequest->id, $file), + 'original_name' => $file->getClientOriginalName(), + 'extension' => $file->getClientOriginalExtension(), + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + + if ($request->hasFile('invoice')) { + foreach ($request->invoice[$key] as $file) { + $pathFile = File::storeFile('claim-kondisi', $newClaimRequest->id, $file); + $newClaimRequest->files()->updateOrCreate([ + 'type' => 'claim-kondisi', + 'name' => File::getFileName('claim-kondisi', $newClaimRequest->id, $file), + 'original_name' => $file->getClientOriginalName(), + 'extension' => $file->getClientOriginalExtension(), + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } + + DB::commit(); + } + catch (\Throwable $th) { + DB::rollBack(); + + return Helper::responseJson(status: 'failed', statusCode: 500, message: $th->getMessage()); + } + } + } + + return Helper::responseJson(status: 'success', statusCode: 201, message: 'Claim Request berhasil ajukan!', data: $request->toArray()); } /** @@ -510,4 +607,34 @@ class ClaimRequestController extends Controller ] ],200); } + + public static function getNextCode() + { + // $last_number = ClaimRequest::max('code'); + // $next_number = empty($last_number) ? 1 : ((int) explode('-', $last_number)[2] + 1); + // return self::makeCode($next_number); + + $last_numeric_code = ClaimRequest::select(DB::raw('MAX(CAST(SUBSTRING_INDEX(code, "-", -1) AS SIGNED)) as max_numeric_code')) + ->whereRaw('SUBSTRING_INDEX(code, "-", -1) REGEXP "^[0-9]+$"') + ->value('max_numeric_code'); + // $next_number = 1; + if ($last_numeric_code) { + // // Jika ada kode sebelumnya, pecah kode dan tambahkan 1 ke angka terakhir + // $parts = explode('-', $last_code); + // $last_number = (int) end($parts); + $next_number = $last_numeric_code + 1; + } + + return self::makeCode($next_number); + } + + + public static function makeCode($next_number) + { + // Pastikan $next_number adalah integer positif + $next_number = max(1, (int) $next_number); + + // Menghasilkan kode dengan format yang diinginkan + return self::$code_prefix . '-' . str_pad($next_number, 5, '0', STR_PAD_LEFT); + } } diff --git a/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php b/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php index b6573618..fc13caaa 100644 --- a/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php +++ b/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php @@ -66,7 +66,7 @@ class DailyMonitoringController extends Controller ->leftJoin('claim_requests', 'claims.claim_request_id', '=', 'claim_requests.id') ->leftJoin('services', 'claim_requests.service_code', '=', 'services.code') ->leftJoin('members', 'claims.member_id', '=', 'members.id') - ->select('claims.id AS claim_id','claims.admission_dates','claims.discharge_dates','claim_requests.code AS claim_code','services.name AS service_type','claims.status AS claim_status','members.member_id',) + ->select('claims.id AS claim_id','claim_requests.code AS claim_code','services.name AS service_type','claims.status AS claim_status','members.member_id',) ->where("claims.member_id", "=", $memberDetail->id) ->orderBy("claims.created_at", "desc") ->get(); diff --git a/Modules/Internal/Routes/api.php b/Modules/Internal/Routes/api.php index 17b2095d..68f70101 100644 --- a/Modules/Internal/Routes/api.php +++ b/Modules/Internal/Routes/api.php @@ -245,9 +245,10 @@ Route::prefix('internal')->group(function () { Route::post('files-mcu', 'filesMcu'); }); Route::get('claim-requests', [ClaimRequestController::class, 'index'])->name('claim-requests.index'); - Route::get('claim-requests/list-member', [ClaimRequestController::class, 'getClaimMemberInfiniteScroll']); // Bagaskoro, BSD 31 Oktober 2023 + Route::get('claim-requests/list-member', [ClaimRequestController::class, 'getClaimMemberInfiniteScroll']); // Bagaskoro, BSD 31 Oktober 2023 Route::post('claim-requests/{id}/approve', [ClaimRequestController::class, 'approve'])->name('claim-requests.approve'); Route::get('claim-requests/{id}', [ClaimRequestController::class, 'show'])->name('claim-requests.show'); + Route::post('claim-requests', [ClaimRequestController::class, 'createNew']); // Bagaskoro, BSD 2 November 2023 Route::put('claim-requests/{id}', [ClaimRequestController::class, 'update'])->name('claim-requests.update'); Route::post('claim-requests/import', [ClaimRequestController::class, 'importClaim'])->name('claim-requests.importClaim'); Route::get('claim-requests/detail/{id}', [ClaimRequestController::class, 'claimRequestDetail']); diff --git a/frontend/client-portal/.env.development b/frontend/client-portal/.env.development index d7d23df0..1292c8a9 100644 --- a/frontend/client-portal/.env.development +++ b/frontend/client-portal/.env.development @@ -4,4 +4,6 @@ PORT=8083 REACT_APP_HOST_API_URL="https://aso-api.linksehat.dev/api/client" -VITE_API_URL="https://aso-api.linksehat.dev/api/client" +# VITE_API_URL="https://aso-api.linksehat.dev/api/client" +VITE_API_URL="http://localhost:8000/api/client" + diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Claim.tsx b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Claim.tsx index b77d578e..7e753b93 100644 --- a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Claim.tsx +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Claim.tsx @@ -32,12 +32,6 @@ export default function Claim() { const [memberDetail, setMemberDetail] = useState(); const [claimList, setClaimList] = useState(); - // Use Effect - // -------------------- - useEffect(() => { - loadDataTableData(); - }, []) - // Load Data // ------------------- const loadDataTableData = async () => { @@ -47,6 +41,10 @@ export default function Claim() { setClaimList(response.claim_list); } + useEffect(() => { + loadDataTableData(); + }, [loadDataTableData]) + return ( diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DailyMonitoringList.tsx b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DailyMonitoringList.tsx index 500b4f9f..0c1bc81f 100644 --- a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DailyMonitoringList.tsx +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DailyMonitoringList.tsx @@ -25,12 +25,6 @@ export default function DailyMonitoringList() { fontWeight: 'bold', }; - // Use Effect - // -------------------- - useEffect(() => { - loadDataTableData(); - }, []) - // Load Data // ------------------- const loadDataTableData = async () => { @@ -42,6 +36,10 @@ export default function DailyMonitoringList() { setDataTableData(response); } + useEffect(() => { + loadDataTableData(); + }, []) + return ( diff --git a/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreate.tsx b/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreate.tsx new file mode 100644 index 00000000..a36259a6 --- /dev/null +++ b/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreate.tsx @@ -0,0 +1,361 @@ +/** + * Core + * ============================================ + */ +import { useEffect, useState } from 'react'; +import { useNavigate } from 'react-router'; +import { Box, FormControlLabel, Grid, Checkbox, Typography, CircularProgress , Button, styled, Stack, IconButton, Card} from '@mui/material'; +import { LoadingButton } from '@mui/lab'; + +/** + * Components + * ============================================ +*/ +// - Global - +import Label from '@/components/Label'; +// - Local - +import FormCreateSearch from './FormCreateSearch'; +import FormCreateListChoose from './FormCreateListChoose'; +import FormCreateBtnUpload from './FormCreateBtnUpload'; + +/** + * Icon, Utils, Types, Functions, theme, hook + * ============================================ + */ +import { ArrowBackIosNew } from '@mui/icons-material'; +import { fDateTimesecond } from '@/utils/formatTime'; +import { MemberListType } from '../Model/Types'; +import { addClaimRequest, getMemberList } from '../Model/Functions'; +import palette from '@/theme/palette'; +import FormCreateFilesUpload from './FormCreateFilesUpload'; +import useLoadOnScroll from '@/hooks/useLoadOnScroll'; +import useCollapseDrawer from '@/hooks/useCollapseDrawer'; +import FormCreateBtnChoose from './FormCreateBtnChoose'; + +export default function FormCreate() { + const navigate = useNavigate() + const defaultListChoosed:MemberListType[] = []; + + // State + // ------------------------- + const [keyword, setKeyword] = useState(''); + const [listChoosed, setListChoosed] = useState([]); + const [isChoosed, setIsChoosed] = useState(false); + const [formIsLoading, setFormIsLoading] = useState(false); + + // List Choose - auto Scroll + // ------------------------- + const fetchFunction = async (page: number): Promise => getMemberList(page, keyword) + + const {data: MemberList, isLoading: scrollIsLoading, setData, resetLastPage, refetchData} = useLoadOnScroll(fetchFunction); + + // List Choose - Search + // ------------------------- + const handleSearch = (keyword: string) => { + setData([]) + resetLastPage() + setKeyword(keyword) + refetchData() + } + + // Function - Clear Form + // ----------------------------- + const clearForm = () => { + setListChoosed(defaultListChoosed); + setIsChoosed(false); + } + + // Function - Choose Patien Type + // ----------------------------- + const handleChoosePatienType = (data: MemberListType, type: string) => { + let newListChoosed = listChoosed.map((list) => { + if (data.id == list.id) { + list.patien_type = type + } + + return list; + }) + + setListChoosed(newListChoosed) + } + + // Function - Handle Btn Upload + // ----------------------------- + const handleChangeInput = (data: MemberListType, type_file: 'invoice'|'prescription'|'laboratorium', file: any) => { + let newListChoosed = listChoosed.map((list) => { + if (data.id == list.id) { + if (type_file == 'invoice') { + if (list.invoice_files == undefined) { + list.invoice_files = [file]; + } + else { + list.invoice_files.push(file); + } + } + + if (type_file == 'prescription') { + if (list.prescription_files == undefined) { + list.prescription_files = [file]; + } + else { + list.prescription_files.push(file); + } + } + + if (type_file == 'laboratorium') { + if (list.laboratorium_files == undefined) { + list.laboratorium_files = [file]; + } + else { + list.laboratorium_files.push(file); + } + } + } + + return list; + }) + + setListChoosed(newListChoosed) + } + + // Function - Handle Remove Fle + // ----------------------------- + const handleRemoveFile = (data: MemberListType, type_file: 'invoice'|'prescription'|'laboratorium', target_index: number) => { + let newListChoosed = listChoosed.map((list) => { + if (data.id == list.id) { + if (type_file == 'invoice') { + list.invoice_files = list.invoice_files?.filter((file: any, index: number) =>{ + if (target_index !== index) { + return file; + } + }); + } + + if (type_file == 'prescription') { + list.prescription_files = list.prescription_files?.filter((file: any, index: number) =>{ + if (target_index !== index) { + return file; + } + }); + } + + if (type_file == 'laboratorium') { + list.laboratorium_files = list.laboratorium_files?.filter((file: any, index: number) =>{ + if (target_index !== index) { + return file; + } + }); + } + } + + return list; + }) + + setListChoosed(newListChoosed) + } + + // Function - Handle Submit Form + // ----------------------------- + const handleSubmit = async () => { + setFormIsLoading(true) + let response = await addClaimRequest(listChoosed) + setFormIsLoading(false) + + if (response == true) { + clearForm() + } + } + + let isDirty = listChoosed.some((row) => { + if (row.patien_type == undefined) { + return true + } + }) + + return ( + + {/* Back Button */} + + isChoosed==false ? navigate(`/claim-requests`) : setIsChoosed(false)} > + + + + + {'Create Claim Requests'} + + + + {/* Choose Section */} + + {/* Search */} + + handleSearch('')} onSubmit={(keyword) => handleSearch(keyword)} /> + + + + + {/* List */} + + + { + MemberList.map((row, index) => { + return ( + { + checked ? setListChoosed((prevData) => [...prevData, data]) : setListChoosed((items) => items.filter(item => item.id != data.id)) + }} + /> + ) + }) + } + + + + {/* Loading */} + + + + + {/* Submit List */} + + setIsChoosed(true)} /> + + + + + + {/* Input Section */} + + { + listChoosed.map((row, index) => { + return ( + + + {/* Patien Name */} + + + + + {row.name} + + + {row.member_id} + + + + + + + + {/* Patien Type */} + + + + + + + + + + + + {/* Invoice */} + + + + Real Invoice + + + {row.invoice_files && row.invoice_files.map((file, index) => ( + + handleRemoveFile(row, 'invoice', index)} /> + + ))} + + + handleChangeInput(row, 'invoice', file)} /> + + + + + {/* Prescription */} + + + + Doctor's Prescription and Another Documents + + + {row.prescription_files && row.prescription_files.map((file, index) => ( + + handleRemoveFile(row, 'prescription', index)} /> + + ))} + + + handleChangeInput(row, 'prescription', file)} /> + + + + + {/* Laboratorium */} + + + + Laboratory Results + + + {row.laboratorium_files && row.laboratorium_files.map((file, index) => ( + + handleRemoveFile(row, 'laboratorium', index)} /> + + ))} + + + handleChangeInput(row, 'laboratorium', file)} /> + + + + + + + ) + }) + } + + + + + handleSubmit()}> + Save Changes + + + + + + ) +} diff --git a/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateBtnChoose.tsx b/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateBtnChoose.tsx new file mode 100644 index 00000000..cffd3bc3 --- /dev/null +++ b/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateBtnChoose.tsx @@ -0,0 +1,39 @@ +import { styled, Button } from "@mui/material"; +import useCollapseDrawer from "@/hooks/useCollapseDrawer"; + +/** + * Custom Style + * ============================================ +*/ +const DivCustom1 = styled('div')(({ theme }) => ({ + background: 'white', + position: 'fixed', + left: '350px', + right: 0, + bottom: 0, + paddingLeft: '32px', + paddingRight: '32px', + paddingTop: '32px', + paddingBottom: '48px', + [theme.breakpoints.between('sm', 'lg')]: { + left: '0px', + }, +})); + +type Props = { + disabled: boolean, + title : string, + handleClickProp: () => void +} + +export default function FormCreateBtnChoose ({disabled, title, handleClickProp}: Props) { + const { collapseClick } = useCollapseDrawer(); + + return ( + + + + ) +} diff --git a/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateBtnUpload.tsx b/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateBtnUpload.tsx new file mode 100644 index 00000000..ac40b098 --- /dev/null +++ b/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateBtnUpload.tsx @@ -0,0 +1,39 @@ +import { useRef } from "react"; +import { Box, ButtonBase, Typography } from "@mui/material"; +import Iconify from "@/components/Iconify"; + +type Props = { + handleChangeInputProp: (event: any) => void +} + +export default function FormCreateBtnUpload ({handleChangeInputProp}: Props) { + const fileInput = useRef(null); + + return ( + fileInput.current?.click()}> + + + + Upload Result + + + handleChangeInputProp(event.target.files ? event.target.files[0] : {})} + accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel, text/plain, application/pdf" + /> + + ) +} diff --git a/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateFilesUpload.tsx b/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateFilesUpload.tsx new file mode 100644 index 00000000..7ab9d7bd --- /dev/null +++ b/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateFilesUpload.tsx @@ -0,0 +1,25 @@ +import Iconify from "@/components/Iconify"; +import { ArrowBackIosNew, InsertDriveFile } from '@mui/icons-material'; +import { Stack, Typography } from "@mui/material"; + +type Props = { + file: any, + handleRemoveFileProp: () => void, +} + +export default function FormCreateFilesUpload({ file, handleRemoveFileProp }: Props) { + return ( + + + + {file.name ? file.name : '-'} + + {handleRemoveFileProp()}} + sx={{cursor: 'pointer'}} + > + + ) +} diff --git a/frontend/dashboard/src/pages/ClaimRequests/FormCreateListChoose.tsx b/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateListChoose.tsx similarity index 98% rename from frontend/dashboard/src/pages/ClaimRequests/FormCreateListChoose.tsx rename to frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateListChoose.tsx index ce4c6747..03c8d0b1 100644 --- a/frontend/dashboard/src/pages/ClaimRequests/FormCreateListChoose.tsx +++ b/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateListChoose.tsx @@ -18,7 +18,7 @@ import Label from '@/components/Label'; * ============================================ */ import { fDateTimesecond } from '@/utils/formatTime'; -import { MemberListType } from './Model/Types'; +import { MemberListType } from '../Model/Types'; import palette from '@/theme/palette'; /** diff --git a/frontend/dashboard/src/pages/ClaimRequests/FormCreateSearch.tsx b/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateSearch.tsx similarity index 97% rename from frontend/dashboard/src/pages/ClaimRequests/FormCreateSearch.tsx rename to frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateSearch.tsx index f21b78d6..026b886b 100644 --- a/frontend/dashboard/src/pages/ClaimRequests/FormCreateSearch.tsx +++ b/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreateSearch.tsx @@ -19,7 +19,7 @@ import { FormProvider, RHFTextField } from '@/components/hook-form'; * ============================================ */ import { Search } from '@mui/icons-material'; -import { SearchType } from './Model/Types'; +import { SearchType } from '../Model/Types'; type Props = { onSubmit: (keyword: string) => void, diff --git a/frontend/dashboard/src/pages/ClaimRequests/Form.tsx b/frontend/dashboard/src/pages/ClaimRequests/Components/FormEdit.tsx similarity index 92% rename from frontend/dashboard/src/pages/ClaimRequests/Form.tsx rename to frontend/dashboard/src/pages/ClaimRequests/Components/FormEdit.tsx index 6aaf56e1..faa95bf0 100644 --- a/frontend/dashboard/src/pages/ClaimRequests/Form.tsx +++ b/frontend/dashboard/src/pages/ClaimRequests/Components/FormEdit.tsx @@ -4,8 +4,8 @@ import { useNavigate } from 'react-router-dom'; import { yupResolver } from '@hookform/resolvers/yup'; import { Controller, useForm } from 'react-hook-form'; import React, { useRef, useEffect, useMemo, useState } from 'react'; -import axios from '../../utils/axios'; -import { FormProvider, RHFTextField } from '../../components/hook-form'; +import axios from '../../../utils/axios'; +import { FormProvider, RHFTextField } from '../../../components/hook-form'; import { makeFormData } from '@/utils/jsonToFormData'; import { @@ -32,12 +32,12 @@ import { ButtonBase, Box, } from '@mui/material'; -import Iconify from '../../components/Iconify'; +import Iconify from '../../../components/Iconify'; import CalendarTodayIcon from '@mui/icons-material/CalendarToday'; import { LoadingButton } from '@mui/lab'; -import { fCurrency } from '../../utils/formatNumber'; -import MemberSelectDialog from '../../components/dialogs/MemberSelectDialog'; -import { Add, DeleteOutline } from '@mui/icons-material'; +import { fCurrency } from '../../../utils/formatNumber'; +import MemberSelectDialog from '../../../components/dialogs/MemberSelectDialog'; +import { Add, ArrowBackIosNew, DeleteOutline } from '@mui/icons-material'; import { ClaimRequest, Files } from '@/@types/claims'; import { fDateTimesecond } from '@/utils/formatTime'; @@ -51,7 +51,7 @@ type Props = { currentClaim?: ClaimRequest; }; -export default function ClaimForm({ isEdit, currentClaim }: Props) { +export default function FormEdit({ isEdit, currentClaim }: Props) { const navigate = useNavigate(); const { enqueueSnackbar } = useSnackbar(); @@ -90,7 +90,7 @@ export default function ClaimForm({ isEdit, currentClaim }: Props) { resolver: yupResolver(EditClaimSchema), defaultValues, }); - + const { reset, watch, @@ -188,8 +188,8 @@ export default function ClaimForm({ isEdit, currentClaim }: Props) { _method: 'PUT' }); - const response = await axios.post(`/claim-requests/${data.id}`, formData); - + const response = await axios.put(`/claim-requests/${data.id}`, formData); + reset(); enqueueSnackbar('Claim Request Updated Successfully!', { variant: 'success' }); navigate('/claim-requests'); @@ -208,6 +208,18 @@ export default function ClaimForm({ isEdit, currentClaim }: Props) { return ( + + + navigate(`/claim-requests`)} > + + + + + {'Edit Claim Requests'} + + + + @@ -224,7 +236,7 @@ export default function ClaimForm({ isEdit, currentClaim }: Props) { {/* */} - + @@ -246,7 +258,7 @@ export default function ClaimForm({ isEdit, currentClaim }: Props) { - ), }} + ), }} name="date" label="Date of Submission" disabled/> @@ -310,7 +322,7 @@ export default function ClaimForm({ isEdit, currentClaim }: Props) { - {/* -------------------------------Upload Dokumen Diagnosa------------------------------- */} + {/* -------------------------------Upload Dokumen Diagnosa------------------------------- */} Diagnosis Document @@ -360,7 +372,7 @@ export default function ClaimForm({ isEdit, currentClaim }: Props) { - {/* -------------------------------Upload Result Hasil Penunjang------------------------------- */} + {/* -------------------------------Upload Result Hasil Penunjang------------------------------- */} Supporting Result Document diff --git a/frontend/dashboard/src/pages/ClaimRequests/CreateUpdate.tsx b/frontend/dashboard/src/pages/ClaimRequests/CreateUpdate.tsx index fa6b83b3..c710deaa 100644 --- a/frontend/dashboard/src/pages/ClaimRequests/CreateUpdate.tsx +++ b/frontend/dashboard/src/pages/ClaimRequests/CreateUpdate.tsx @@ -4,7 +4,7 @@ import { ArrowBackIosNew } from '@mui/icons-material'; import { yupResolver } from '@hookform/resolvers/yup'; import { Autocomplete, Button, Card, Collapse, Container, Divider, Grid, Stack, Table, TableBody, TableCell, TableRow, TextField, Typography } from '@mui/material'; import { Controller, useForm } from 'react-hook-form'; -import { useParams, useNavigate } from 'react-router-dom'; +import { useParams } from 'react-router-dom'; import HeaderBreadcrumbs from '../../components/HeaderBreadcrumbs'; import { FormProvider, RHFCheckbox, RHFSelect, RHFTextField } from '../../components/hook-form'; import Page from '../../components/Page'; @@ -18,12 +18,11 @@ import { LoadingButton } from '@mui/lab'; import { fCurrency } from '../../utils/formatNumber'; import Iconify from '../../components/Iconify'; import { ClaimRequest } from '@/@types/claims'; -import Form from './Form'; -import FormCreate from './FormCreate'; +import FormEdit from './Components/FormEdit'; +import FormCreate from './Components/FormCreate'; export default function ClaimsCreateUpdate() { - const navigate = useNavigate() const { themeStretch } = useSettings(); const { id } = useParams(); @@ -46,18 +45,6 @@ export default function ClaimsCreateUpdate() { return ( - - - navigate(`/claim-requests`)} > - - - - - {id == undefined ? 'Create Claim Requests' : 'Edit Claim Requests'} - - - - { id == undefined ? @@ -66,7 +53,7 @@ export default function ClaimsCreateUpdate() { ) : ( - + ) } diff --git a/frontend/dashboard/src/pages/ClaimRequests/FormCreate.tsx b/frontend/dashboard/src/pages/ClaimRequests/FormCreate.tsx deleted file mode 100644 index 0f7c936f..00000000 --- a/frontend/dashboard/src/pages/ClaimRequests/FormCreate.tsx +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Core - * ============================================ - */ -import { useEffect, useState } from 'react'; -import { Box, FormControlLabel, Grid, Checkbox, Typography, CircularProgress , Button, styled} from '@mui/material'; - -/** - * Components - * ============================================ -*/ -// - Global - -import Label from '@/components/Label'; -// - Local - -import FormCreateSearch from './FormCreateSearch'; - -/** - * Icon, Utils, Types, Functions, theme, hook - * ============================================ - */ -import { MemberListType } from './Model/Types'; -import { getMemberList } from './Model/Functions'; -import useLoadOnScroll from '@/hooks/useLoadOnScroll'; -import FormCreateListChoose from './FormCreateListChoose'; - -/** - * Custom Style - * ============================================ -*/ -const DivCustom1 = styled('div')(({ theme }) => ({ - left: '350px', - [theme.breakpoints.between('sm', 'lg')]: { - left: '0px', - }, -})); - -export default function FormCreate() { - // State - // ------------------------- - const [keyword, setKeyword] = useState(''); - const [listChoosed, setListChoosed] = useState([]); - const [isChoosed, setIsChoosed] = useState(false); - - // List Choose - auto Scroll - // ------------------------- - const fetchFunction = async (page: number): Promise => getMemberList(page, keyword) - const {data: MemberList, isLoading, setData, resetLastPage, refetchData} = useLoadOnScroll(fetchFunction); - - // List Choose - Search - // ------------------------- - const handleSearch = (keyword: string) => { - setData([]) - resetLastPage() - setKeyword(keyword) - refetchData() - } - - return ( - - {/* Choose Section */} - - {/* Search */} - - handleSearch('')} onSubmit={(keyword) => handleSearch(keyword)} /> - - - - - {/* List */} - - - { - MemberList.map((row, index) => { - return ( - { - checked ? setListChoosed((prevData) => [...prevData, data]) : setListChoosed((items) => items.filter(item => item.id != data.id)) - }} - /> - ) - }) - } - - - - {/* Loading */} - - - - - {/* Submit List */} - - - - - - - - - - {/* Input Section */} - - - ) -} diff --git a/frontend/dashboard/src/pages/ClaimRequests/Model/Functions.tsx b/frontend/dashboard/src/pages/ClaimRequests/Model/Functions.tsx index 4d64f49a..8a94db2a 100644 --- a/frontend/dashboard/src/pages/ClaimRequests/Model/Functions.tsx +++ b/frontend/dashboard/src/pages/ClaimRequests/Model/Functions.tsx @@ -1,6 +1,7 @@ import axios from '@/utils/axios'; import { enqueueSnackbar } from 'notistack'; import { MemberListType } from './Types'; +import { makeFormData } from '@/utils/jsonToFormData'; /** * Listing Member @@ -20,3 +21,53 @@ export const getMemberList = async ( page: number, keyword: string ): Promise => { + // Mapping + const formData = new FormData(); + + data.map((row, index) => { + formData.append(`member_id[${index}]`, row.id.toString()); + formData.append(`service_code[${index}]`, row.patien_type??''); + + if (row.invoice_files != undefined) { + row.invoice_files.forEach((file, file_index) => { + formData.append(`invoice[${index}][${file_index}]`, file); + }); + } + + if (row.prescription_files != undefined) { + row.prescription_files.forEach((file, file_index) => { + formData.append(`prescription[${index}][${file_index}]`, file); + }); + } + + if (row.laboratorium_files != undefined) { + row.laboratorium_files.forEach((file, file_index) => { + formData.append(`laboratorium[${index}][${file_index}]`, file); + }); + } + }) + + // Axios + const response = await axios.post(`/claim-requests`, formData) + .then((res) =>{ + enqueueSnackbar("Berhasil membuat data !", { + variant: 'success', + }); + + return true; + }) + .catch((res) => { + enqueueSnackbar("server error !", { + variant: 'error', + }); + + return false; + }); + + return response; +}; diff --git a/frontend/dashboard/src/pages/ClaimRequests/Model/Types.tsx b/frontend/dashboard/src/pages/ClaimRequests/Model/Types.tsx index d82acdf9..963abd1b 100644 --- a/frontend/dashboard/src/pages/ClaimRequests/Model/Types.tsx +++ b/frontend/dashboard/src/pages/ClaimRequests/Model/Types.tsx @@ -9,7 +9,11 @@ export type SearchType = { * Member List */ export type MemberListType = { - id : string, - member_id : string, - name : string, + id : string, + member_id : string, + name : string, + patien_type? : string, + invoice_files? : any[], + laboratorium_files? : any[], + prescription_files? : any[] } From bf8bb86857f030f9ebd4df616ec637d326b91b14 Mon Sep 17 00:00:00 2001 From: korospace Date: Thu, 2 Nov 2023 20:05:12 +0700 Subject: [PATCH 3/3] finishing feature/dashboard-create-claim-request --- .../Api/ClaimRequestController.php | 107 ++++++++++++------ .../Api/DailyMonitoringController.php | 3 +- .../CaseManagement/DailyMonitoring/Claim.tsx | 2 +- .../Components/ClaimListRow.tsx | 8 +- .../DailyMonitoring/Model/Types.ts | 4 +- .../Components/ClaimListRow.tsx | 8 +- .../LaboratoriumResult/Model/Types.ts | 4 +- .../ClaimRequests/Components/FormCreate.tsx | 70 ++++++------ .../pages/ClaimRequests/Model/Functions.tsx | 24 ++-- .../src/pages/ClaimRequests/Model/Types.tsx | 8 +- 10 files changed, 140 insertions(+), 98 deletions(-) diff --git a/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php b/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php index 6b311ed5..64f7bf7e 100644 --- a/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php +++ b/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php @@ -113,48 +113,83 @@ class ClaimRequestController extends Controller 'updated_at'=> date('Y-m-d H:i:s'), ]); - if ($request->hasFile('laboratorium')) { - foreach ($request->laboratorium[$key] as $file) { - $pathFile = File::storeFile('claim-result', $newClaimRequest->id, $file); - $newClaimRequest->files()->updateOrCreate([ - 'type' => 'claim-result', - 'name' => File::getFileName('claim-result', $newClaimRequest->id, $file), - 'original_name' => $file->getClientOriginalName(), - 'extension' => $file->getClientOriginalExtension(), - 'path' => $pathFile, - 'created_by' => auth()->user()->id, - 'updated_by' => auth()->user()->id, - ]); + $storage_path = storage_path() . "/app/public"; + + if (isset($_FILES['file_penunjang'])) { + foreach ($_FILES['file_penunjang']['error']["member_" .$member_id] as $key => $value) { + if ($value == 0) { + $folder = "claim/"; + $new_file_name = "claim-result-" . time() . "-" . uniqid(); + $ekstension = "." . explode("/", $_FILES['file_penunjang']['type']["member_" .$member_id][$key])[1]; + $pathFile = $folder . $new_file_name . $ekstension; + + $tmp_name = $_FILES['file_penunjang']['tmp_name']["member_" .$member_id][$key]; + $full_path = $_FILES['file_penunjang']['full_path']["member_" .$member_id][$key]; + + if (move_uploaded_file($tmp_name, $storage_path . "/" . $pathFile)) { + $newClaimRequest->files()->updateOrCreate([ + 'type' => 'claim-result', + 'name' => $new_file_name, + 'original_name' => $full_path, + 'extension' => $ekstension, + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } } } - if ($request->hasFile('prescription')) { - foreach ($request->prescription[$key] as $file) { - $pathFile = File::storeFile('claim-diagnosis', $newClaimRequest->id, $file); - $newClaimRequest->files()->updateOrCreate([ - 'type' => 'claim-diagnosis', - 'name' => File::getFileName('claim-diagnosis', $newClaimRequest->id, $file), - 'original_name' => $file->getClientOriginalName(), - 'extension' => $file->getClientOriginalExtension(), - 'path' => $pathFile, - 'created_by' => auth()->user()->id, - 'updated_by' => auth()->user()->id, - ]); + if (isset($_FILES['file_diagnosa'])) { + foreach ($_FILES['file_diagnosa']['error']["member_" .$member_id] as $key => $value) { + if ($value == 0) { + $folder = "claim/"; + $new_file_name = "claim-diagnosis-" . time() . "-" . uniqid(); + $ekstension = "." . explode("/", $_FILES['file_diagnosa']['type']["member_" .$member_id][$key])[1]; + $pathFile = $folder . $new_file_name . $ekstension; + + $tmp_name = $_FILES['file_diagnosa']['tmp_name']["member_" .$member_id][$key]; + $full_path = $_FILES['file_diagnosa']['full_path']["member_" .$member_id][$key]; + + if (move_uploaded_file($tmp_name, $storage_path . "/" . $pathFile)) { + $newClaimRequest->files()->updateOrCreate([ + 'type' => 'claim-diagnosis', + 'name' => $new_file_name, + 'original_name' => $full_path, + 'extension' => $ekstension, + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } } } - if ($request->hasFile('invoice')) { - foreach ($request->invoice[$key] as $file) { - $pathFile = File::storeFile('claim-kondisi', $newClaimRequest->id, $file); - $newClaimRequest->files()->updateOrCreate([ - 'type' => 'claim-kondisi', - 'name' => File::getFileName('claim-kondisi', $newClaimRequest->id, $file), - 'original_name' => $file->getClientOriginalName(), - 'extension' => $file->getClientOriginalExtension(), - 'path' => $pathFile, - 'created_by' => auth()->user()->id, - 'updated_by' => auth()->user()->id, - ]); + if (isset($_FILES['file_kondisi'])) { + foreach ($_FILES['file_kondisi']['error']["member_" .$member_id] as $key => $value) { + if ($value == 0) { + $folder = "claim/"; + $new_file_name = "claim-kondisi-" . time() . "-" . uniqid(); + $ekstension = "." . explode("/", $_FILES['file_kondisi']['type']["member_" .$member_id][$key])[1]; + $pathFile = $folder . $new_file_name . $ekstension; + + $tmp_name = $_FILES['file_kondisi']['tmp_name']["member_" .$member_id][$key]; + $full_path = $_FILES['file_kondisi']['full_path']["member_" .$member_id][$key]; + + if (move_uploaded_file($tmp_name, $storage_path . "/" . $pathFile)) { + $newClaimRequest->files()->updateOrCreate([ + 'type' => 'claim-kondisi', + 'name' => $new_file_name, + 'original_name' => $full_path, + 'extension' => $ekstension, + 'path' => $pathFile, + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + ]); + } + } } } diff --git a/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php b/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php index fc13caaa..c2997022 100644 --- a/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php +++ b/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php @@ -64,9 +64,10 @@ class DailyMonitoringController extends Controller $claimList = DB::table('claims') ->leftJoin('claim_requests', 'claims.claim_request_id', '=', 'claim_requests.id') + ->leftJoin('claim_history_cares', 'claims.id', '=', 'claim_history_cares.claim_id') ->leftJoin('services', 'claim_requests.service_code', '=', 'services.code') ->leftJoin('members', 'claims.member_id', '=', 'members.id') - ->select('claims.id AS claim_id','claim_requests.code AS claim_code','services.name AS service_type','claims.status AS claim_status','members.member_id',) + ->select('claims.id AS claim_id','claim_history_cares.admission_date','claim_history_cares.discharge_date','claim_requests.code AS claim_code','services.name AS service_type','claims.status AS claim_status','members.member_id',) ->where("claims.member_id", "=", $memberDetail->id) ->orderBy("claims.created_at", "desc") ->get(); diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Claim.tsx b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Claim.tsx index 7e753b93..dde524ea 100644 --- a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Claim.tsx +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Claim.tsx @@ -43,7 +43,7 @@ export default function Claim() { useEffect(() => { loadDataTableData(); - }, [loadDataTableData]) + }, []) return ( diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/ClaimListRow.tsx b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/ClaimListRow.tsx index 2b07815d..d89c0ef7 100644 --- a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/ClaimListRow.tsx +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/ClaimListRow.tsx @@ -37,7 +37,7 @@ export default function ClaimListRow ({ ...props }: Props) { td': { borderBottom: '1' } }}> - {props.row.admission_dates == "0000-00-00 00:00:00" ? + {props.row.admission_date == "0000-00-00 00:00:00" ? ('-') : ( @@ -45,12 +45,12 @@ export default function ClaimListRow ({ ...props }: Props) { variant="ghost" color="default" > - {fDate(props.row.admission_dates)} + {fDate(props.row.admission_date)} )} - {props.row.discharge_dates == "0000-00-00 00:00:00" ? + {props.row.discharge_date == "0000-00-00 00:00:00" ? ('-') : ( @@ -58,7 +58,7 @@ export default function ClaimListRow ({ ...props }: Props) { variant="ghost" color="default" > - {fDate(props.row.discharge_dates)} + {fDate(props.row.discharge_date)} )} diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Types.ts b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Types.ts index fc5fc9ac..45aa43f6 100644 --- a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Types.ts +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Types.ts @@ -30,8 +30,8 @@ export type MemberDetailType = { */ export type ClaimListType = { claim_id : number, - admission_dates : string, - discharge_dates : string, + admission_date : string, + discharge_date : string, claim_code : string, claim_status : string, service_type : string, diff --git a/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Components/ClaimListRow.tsx b/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Components/ClaimListRow.tsx index 60b633ff..28289118 100644 --- a/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Components/ClaimListRow.tsx +++ b/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Components/ClaimListRow.tsx @@ -37,7 +37,7 @@ export default function ClaimListRow ({ ...props }: Props) { td': { borderBottom: '1' } }}> - {props.row.admission_dates == "0000-00-00 00:00:00" ? + {props.row.admission_date == "0000-00-00 00:00:00" ? ('-') : ( @@ -45,12 +45,12 @@ export default function ClaimListRow ({ ...props }: Props) { variant="ghost" color="default" > - {fDate(props.row.admission_dates)} + {fDate(props.row.admission_date)} )} - {props.row.discharge_dates == "0000-00-00 00:00:00" ? + {props.row.discharge_date == "0000-00-00 00:00:00" ? ('-') : ( @@ -58,7 +58,7 @@ export default function ClaimListRow ({ ...props }: Props) { variant="ghost" color="default" > - {fDate(props.row.discharge_dates)} + {fDate(props.row.discharge_date)} )} diff --git a/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Model/Types.ts b/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Model/Types.ts index de83a151..2ddf9dbe 100644 --- a/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Model/Types.ts +++ b/frontend/dashboard/src/pages/CaseManagement/LaboratoriumResult/Model/Types.ts @@ -30,8 +30,8 @@ export type MemberDetailType = { */ export type ClaimListType = { claim_id : number, - admission_dates : string, - discharge_dates : string, + admission_date : string, + discharge_date : string, claim_code : string, claim_status : string, service_type : string, diff --git a/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreate.tsx b/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreate.tsx index a36259a6..8d25671e 100644 --- a/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreate.tsx +++ b/frontend/dashboard/src/pages/ClaimRequests/Components/FormCreate.tsx @@ -81,33 +81,33 @@ export default function FormCreate() { // Function - Handle Btn Upload // ----------------------------- - const handleChangeInput = (data: MemberListType, type_file: 'invoice'|'prescription'|'laboratorium', file: any) => { + const handleChangeInput = (data: MemberListType, type_file: 'kondisi'|'diagnosa'|'penunjang', file: any) => { let newListChoosed = listChoosed.map((list) => { if (data.id == list.id) { - if (type_file == 'invoice') { - if (list.invoice_files == undefined) { - list.invoice_files = [file]; + if (type_file == 'kondisi') { + if (list.file_kondisi == undefined) { + list.file_kondisi = [file]; } else { - list.invoice_files.push(file); + list.file_kondisi.push(file); } } - if (type_file == 'prescription') { - if (list.prescription_files == undefined) { - list.prescription_files = [file]; + if (type_file == 'diagnosa') { + if (list.file_diagnosa == undefined) { + list.file_diagnosa = [file]; } else { - list.prescription_files.push(file); + list.file_diagnosa.push(file); } } - if (type_file == 'laboratorium') { - if (list.laboratorium_files == undefined) { - list.laboratorium_files = [file]; + if (type_file == 'penunjang') { + if (list.file_penunjang == undefined) { + list.file_penunjang = [file]; } else { - list.laboratorium_files.push(file); + list.file_penunjang.push(file); } } } @@ -120,27 +120,27 @@ export default function FormCreate() { // Function - Handle Remove Fle // ----------------------------- - const handleRemoveFile = (data: MemberListType, type_file: 'invoice'|'prescription'|'laboratorium', target_index: number) => { + const handleRemoveFile = (data: MemberListType, type_file: 'kondisi'|'diagnosa'|'penunjang', target_index: number) => { let newListChoosed = listChoosed.map((list) => { if (data.id == list.id) { - if (type_file == 'invoice') { - list.invoice_files = list.invoice_files?.filter((file: any, index: number) =>{ + if (type_file == 'kondisi') { + list.file_kondisi = list.file_kondisi?.filter((file: any, index: number) =>{ if (target_index !== index) { return file; } }); } - if (type_file == 'prescription') { - list.prescription_files = list.prescription_files?.filter((file: any, index: number) =>{ + if (type_file == 'diagnosa') { + list.file_diagnosa = list.file_diagnosa?.filter((file: any, index: number) =>{ if (target_index !== index) { return file; } }); } - if (type_file == 'laboratorium') { - list.laboratorium_files = list.laboratorium_files?.filter((file: any, index: number) =>{ + if (type_file == 'penunjang') { + list.file_penunjang = list.file_penunjang?.filter((file: any, index: number) =>{ if (target_index !== index) { return file; } @@ -282,59 +282,59 @@ export default function FormCreate() { - {/* Invoice */} + {/* File Kondisi */} - Real Invoice + Condition Document - {row.invoice_files && row.invoice_files.map((file, index) => ( + {row.file_kondisi && row.file_kondisi.map((file, index) => ( - handleRemoveFile(row, 'invoice', index)} /> + handleRemoveFile(row, 'kondisi', index)} /> ))} - handleChangeInput(row, 'invoice', file)} /> + handleChangeInput(row, 'kondisi', file)} /> - {/* Prescription */} + {/* File Diagnosa */} - Doctor's Prescription and Another Documents + Diagnosis Document - {row.prescription_files && row.prescription_files.map((file, index) => ( + {row.file_diagnosa && row.file_diagnosa.map((file, index) => ( - handleRemoveFile(row, 'prescription', index)} /> + handleRemoveFile(row, 'diagnosa', index)} /> ))} - handleChangeInput(row, 'prescription', file)} /> + handleChangeInput(row, 'diagnosa', file)} /> - {/* Laboratorium */} + {/* File Penunjang */} - Laboratory Results + Supporting Result Document - {row.laboratorium_files && row.laboratorium_files.map((file, index) => ( + {row.file_penunjang && row.file_penunjang.map((file, index) => ( - handleRemoveFile(row, 'laboratorium', index)} /> + handleRemoveFile(row, 'penunjang', index)} /> ))} - handleChangeInput(row, 'laboratorium', file)} /> + handleChangeInput(row, 'penunjang', file)} /> diff --git a/frontend/dashboard/src/pages/ClaimRequests/Model/Functions.tsx b/frontend/dashboard/src/pages/ClaimRequests/Model/Functions.tsx index 8a94db2a..da72ff60 100644 --- a/frontend/dashboard/src/pages/ClaimRequests/Model/Functions.tsx +++ b/frontend/dashboard/src/pages/ClaimRequests/Model/Functions.tsx @@ -33,21 +33,27 @@ export const addClaimRequest = async ( data: MemberListType[] ): Promise { - formData.append(`invoice[${index}][${file_index}]`, file); + if (row.file_kondisi != undefined) { + row.file_kondisi.forEach((file, file_index) => { + console.log(file); + + formData.append(`file_kondisi[member_${row.id}][${file_index}]`, file); }); } - if (row.prescription_files != undefined) { - row.prescription_files.forEach((file, file_index) => { - formData.append(`prescription[${index}][${file_index}]`, file); + if (row.file_diagnosa != undefined) { + row.file_diagnosa.forEach((file, file_index) => { + console.log(file); + + formData.append(`file_diagnosa[member_${row.id}][${file_index}]`, file); }); } - if (row.laboratorium_files != undefined) { - row.laboratorium_files.forEach((file, file_index) => { - formData.append(`laboratorium[${index}][${file_index}]`, file); + if (row.file_penunjang != undefined) { + row.file_penunjang.forEach((file, file_index) => { + console.log(file); + + formData.append(`file_penunjang[member_${row.id}][${file_index}]`, file); }); } }) diff --git a/frontend/dashboard/src/pages/ClaimRequests/Model/Types.tsx b/frontend/dashboard/src/pages/ClaimRequests/Model/Types.tsx index 963abd1b..41b4d18c 100644 --- a/frontend/dashboard/src/pages/ClaimRequests/Model/Types.tsx +++ b/frontend/dashboard/src/pages/ClaimRequests/Model/Types.tsx @@ -12,8 +12,8 @@ export type MemberListType = { id : string, member_id : string, name : string, - patien_type? : string, - invoice_files? : any[], - laboratorium_files? : any[], - prescription_files? : any[] + patien_type? : string, + file_kondisi? : any[], + file_diagnosa? : any[], + file_penunjang? : any[] }