From f2414e6577e935974a7924109b1c23cfac7dae2b Mon Sep 17 00:00:00 2001 From: Muhammad Fajar Date: Fri, 29 Sep 2023 14:17:38 +0700 Subject: [PATCH 1/2] Update Claim Request --- .../Controllers/Api/ClaimReportController.php | 24 +- Modules/Client/Routes/api.php | 1 + .../ClaimReportFileShowResources.php | 24 ++ .../ClaimReport/MemberResources.php | 2 +- .../ClaimReport/ShowResources.php | 31 ++ app/Models/ClaimRequest.php | 17 +- app/Services/CorporateMemberService.php | 9 +- .../pages/ClaimReport/DialogDetailClaim.tsx | 282 ++++++++++-------- .../src/pages/ClaimReport/Index.tsx | 143 +-------- .../src/pages/ClaimReport/List.tsx | 3 +- frontend/client-portal/src/routes/index.tsx | 6 +- 11 files changed, 259 insertions(+), 283 deletions(-) create mode 100644 Modules/Client/Transformers/ClaimReport/ClaimReportFileShowResources.php create mode 100644 Modules/Client/Transformers/ClaimReport/ShowResources.php diff --git a/Modules/Client/Http/Controllers/Api/ClaimReportController.php b/Modules/Client/Http/Controllers/Api/ClaimReportController.php index 599dcd13..b3edd3a6 100644 --- a/Modules/Client/Http/Controllers/Api/ClaimReportController.php +++ b/Modules/Client/Http/Controllers/Api/ClaimReportController.php @@ -5,14 +5,10 @@ namespace Modules\Client\Http\Controllers\Api; use App\Helpers\Helper; use App\Http\Controllers\Controller; use App\Models\ClaimRequest; +use Modules\Client\Transformers\ClaimReport\ShowResources; class ClaimReportController extends Controller { - /** - * Display a listing of the resource. - * - * @return \Illuminate\Http\Response - */ public function claimStatus($corporateId) { $requesteds = ClaimRequest::query() @@ -48,4 +44,22 @@ class ClaimReportController extends Controller 'rejecteds' => count($rejecteds) ]); } + + public function show($corporateId, $claimRequestId) + { + $data = ClaimRequest::query() + ->with([ + 'histories:historiable_type,historiable_id,title,description,created_at', + 'member:id,person_id,name_prefix,name,name_suffix' => [ + 'person:id,name_prefix,name,name_suffix,gender' + ], + 'claim:id,status', + 'claimResults', + 'claimConditions', + 'claimDiagnosis' + ]) + ->find($claimRequestId, ['id', 'submission_date', 'member_id', 'claim_id', 'status']); + + return Helper::responseJson(new ShowResources($data)); + } } diff --git a/Modules/Client/Routes/api.php b/Modules/Client/Routes/api.php index a83ee008..68bcee74 100644 --- a/Modules/Client/Routes/api.php +++ b/Modules/Client/Routes/api.php @@ -54,6 +54,7 @@ Route::prefix('client')->group(function () { // Route::get('topup', [TopUpController::class, 'get']); Route::post('topup', [TopUpController::class, 'store']); Route::get('claim-report/claim-status', [ClaimReportController::class, 'claimStatus']); + Route::get('claim-report/{claim_request_id}', [ClaimReportController::class, 'show']); }); Route::get('claims/{id}', [ClaimController::class, 'show']); diff --git a/Modules/Client/Transformers/ClaimReport/ClaimReportFileShowResources.php b/Modules/Client/Transformers/ClaimReport/ClaimReportFileShowResources.php new file mode 100644 index 00000000..5ad24d34 --- /dev/null +++ b/Modules/Client/Transformers/ClaimReport/ClaimReportFileShowResources.php @@ -0,0 +1,24 @@ + $this->id, + 'fileName' => $this->name, + 'fileUrl' => url(Storage::url($this->path)) + ]; + } +} diff --git a/Modules/Client/Transformers/ClaimReport/MemberResources.php b/Modules/Client/Transformers/ClaimReport/MemberResources.php index 91839ba4..f5b79680 100644 --- a/Modules/Client/Transformers/ClaimReport/MemberResources.php +++ b/Modules/Client/Transformers/ClaimReport/MemberResources.php @@ -21,7 +21,7 @@ class MemberResources extends JsonResource 'fullName' => $this->full_name, 'division' => $this->division_name ?? '', 'status' => $this->status, - 'submissionDate' => $this->submission_date, + 'claimRequestId' => $this->claim_request_id, ]; } } diff --git a/Modules/Client/Transformers/ClaimReport/ShowResources.php b/Modules/Client/Transformers/ClaimReport/ShowResources.php new file mode 100644 index 00000000..d00c15f9 --- /dev/null +++ b/Modules/Client/Transformers/ClaimReport/ShowResources.php @@ -0,0 +1,31 @@ + $this->id, + 'claimId' => $this->claim_id, + 'submissionDate' => $this->submission_date, + 'histories' => $this->whenLoaded('histories'), + 'fullName' => $this->whenLoaded('member', $this->member->full_name), + 'status' => $this->status, + 'files' => [ + 'claimResults' => ClaimReportFileShowResources::collection($this->whenLoaded('claimResults')), + 'claimConditions' => ClaimReportFileShowResources::collection($this->whenLoaded('claimConditions')), + 'claimDiagnosis' => ClaimReportFileShowResources::collection($this->whenLoaded('claimDiagnosis')) + ] + ]; + } +} diff --git a/app/Models/ClaimRequest.php b/app/Models/ClaimRequest.php index e2bc8194..d1b7772a 100644 --- a/app/Models/ClaimRequest.php +++ b/app/Models/ClaimRequest.php @@ -114,7 +114,7 @@ class ClaimRequest extends Model } }); } - + // public static function getNextCode() // { // $last_number = self::withTrashed()->max('code'); @@ -143,6 +143,21 @@ class ClaimRequest extends Model return $this->morphMany(File::class, 'fileable'); } + public function claimResults() + { + return $this->files()->where('type', 'claim-result')->whereNull('deleted_at'); + } + + public function claimConditions() + { + return $this->files()->where('type', 'claim-kondisi')->whereNull('deleted_at'); + } + + public function claimDiagnosis() + { + return $this->files()->where('type', 'claim-diagnosis')->whereNull('deleted_at'); + } + public function generatedDocuments() { return $this->morphMany(GeneratedDocument::class, 'generated_documentable'); diff --git a/app/Services/CorporateMemberService.php b/app/Services/CorporateMemberService.php index f2fad762..ab07efeb 100644 --- a/app/Services/CorporateMemberService.php +++ b/app/Services/CorporateMemberService.php @@ -51,6 +51,7 @@ class CorporateMemberService ->joinClaimRequests('right') ->joinCorporateEmployees('left') ->joinCorporateDivisions('left') + ->with('person:id,name_prefix,name_suffix,gender,name,birth_date') ->withSum('claims', 'total_claim') ->whereHas('employeds', function (Builder $corporateEmployee) use ($corporateId) { $corporateEmployee->where('corporate_id', $corporateId); @@ -80,7 +81,7 @@ class CorporateMemberService $query->getQuery()->orderBy('corporate_divisions.name', $request->order); } }) - ->select(['members.id', 'members.person_id', 'members.member_id', 'members.name', 'corporate_divisions.name AS division_name', 'claim_requests.status', 'claim_requests.code','claim_requests.submission_date']) + ->select(['members.id', 'members.person_id', 'members.member_id', 'members.name', 'corporate_divisions.name AS division_name', 'claim_requests.status', 'claim_requests.code', 'claim_requests.id AS claim_request_id']) ->paginate($limit); } @@ -89,7 +90,7 @@ class CorporateMemberService $limit = $request->has('perPage') ? $request->input('perPage') : 10; return Member::query() - // ->joinClaimRequests('right') + // ->joinClaimRequests('right') ->joinCorporateEmployees('left') ->joinCorporateDivisions('left') ->with('currentPlan') @@ -121,8 +122,8 @@ class CorporateMemberService $query->getQuery()->orderBy('corporate_divisions.name', $request->order); } }) - // ->select(['members.id', 'members.person_id', 'members.member_id', 'members.name', 'corporate_divisions.name AS division_name', 'members.active', 'claim_requests.id', 'claim_requests.member_id', 'claim_requests.submission_date']) - ->select(['members.id', 'members.person_id', 'members.member_id', 'members.name', 'corporate_divisions.name AS division_name', 'members.active']) + // ->select(['members.id', 'members.person_id', 'members.member_id', 'members.name', 'corporate_divisions.name AS division_name', 'members.active', 'claim_requests.id', 'claim_requests.member_id', 'claim_requests.submission_date']) + ->select(['members.id', 'members.person_id', 'members.member_id', 'members.name', 'corporate_divisions.name AS division_name', 'members.active']) ->paginate($limit); } diff --git a/frontend/client-portal/src/pages/ClaimReport/DialogDetailClaim.tsx b/frontend/client-portal/src/pages/ClaimReport/DialogDetailClaim.tsx index 01df6b98..c0fd6eb8 100644 --- a/frontend/client-portal/src/pages/ClaimReport/DialogDetailClaim.tsx +++ b/frontend/client-portal/src/pages/ClaimReport/DialogDetailClaim.tsx @@ -1,50 +1,67 @@ // @mui -import { - Button, - Box, - Stepper, - Step, - StepLabel, - Card, - Typography, - Divider, - Stack, -} from '@mui/material'; -import { Add } from '@mui/icons-material'; -// components -import MuiDialog from '../../components/MuiDialog'; -// theme -import palette from '../../theme/palette'; +import { Box, Stepper, Step, StepLabel, Card, Typography, Divider, Stack } from '@mui/material'; // React -import { ReactElement } from 'react'; - -type DataContent = { - info: string; - date: string; - time: string; -}; - -type MuiDialogProps = { - title?: { - name?: string; - icon?: string; - }; - openDialog: boolean; - setOpenDialog: Function; - content?: ReactElement; - data?: DataContent[]; -}; +import { useContext, useEffect, useState } from 'react'; +import { useNavigate, useParams } from 'react-router'; +// axios +import axios from '../../utils/axios'; +import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate'; +import { fDate, fPostFormat } from '../../utils/formatTime'; +import Iconify from '../../components/Iconify'; const steps = ['Review', 'Approval', 'Disbursement']; -const DialogDetailClaim = ({ title, openDialog, setOpenDialog, data }: MuiDialogProps) => { - function clickHandler(arg0: string) { - throw new Error('Function not implemented.'); - } +interface DataHistoriesClaimRequest { + title: string; + description: string; + created_at: string; +} - // const getContent = () => ( +interface DataFilesClaimRequest { + id: number; + fileName: string; + fileUrl: string; +} - // ); +interface DataClaimRequest { + claimId: number; + claimRequestId: number; + fullName: string; + histories: DataHistoriesClaimRequest[]; + status: string; + submissionDate: string | Date; + files: { + claimConditions: DataFilesClaimRequest[]; + claimResults: DataFilesClaimRequest[]; + claimDiagnosis: DataFilesClaimRequest[]; + }; +} + +const DialogDetailClaim = () => { + const { id } = useParams(); + const navigate = useNavigate(); + const { corporateValue } = useContext(UserCurrentCorporateContext); + const [corporateValueBefore, setCorporateValueBefore] = useState(corporateValue); + const [data, setData] = useState(null); + + // inisialisasi pertama + useEffect(() => { + axios + .get(`${corporateValue}/claim-report/${id}`) + .then((response) => { + setData(response.data.data); + }) + .catch((error) => { + console.error('Terjadi kesalahan:', error); + }); + }, []); + + // Navigasi ke claim-report ketika corporateValue berubah + useEffect(() => { + if (corporateValueBefore !== corporateValue) { + navigate(`/claim-report`); + } + }, [corporateValue]); return ( <> @@ -55,15 +72,20 @@ const DialogDetailClaim = ({ title, openDialog, setOpenDialog, data }: MuiDialog sx={{ marginTop: 1 }} > - Claim Request + Claim Request for {data?.fullName} Submission date - 15 / 05 / 2022 + + {fPostFormat(data ? data.submissionDate : new Date(), 'dd / MM / yyyy')} + - + {steps.map((label) => ( {label} @@ -73,108 +95,116 @@ const DialogDetailClaim = ({ title, openDialog, setOpenDialog, data }: MuiDialog - 17 Mei 2022 + {fDate(data ? data?.histories[0].created_at : new Date())} - {/* Item 1 */} + {data?.histories.map((history, index) => ( + + + + {fPostFormat(history.created_at, 'HH:mm')} WIB + + + + + + Details : {history.description} + + + {history.title} + + + + ))} - 09:10 WIB - - Approval + + Dokumen Kelengkapan + + Kondisi - - Details : mohon melengkapi kekurangan dokumen - - - Lab pemeriksaan darah - - - - - {/* Item 2 */} - - - 09:00 WIB - ( + + + + - {file.fileName} + + + + ))} + + + Diagnosa + } + spacing={1} + sx={{ marginY: 2 }} > - Approval - - - - - - Details : Penilaian Dokter - - - - {/* Item 3 */} - - - 08:00 WIB - ( + + + + - {file.fileName} + + + + ))} + + + Hasil + } + spacing={1} + sx={{ marginY: 2 }} > - Review - - - - - - Details : Klaim Diajukan - + {data && + data.files.claimResults.map((file, index) => ( + + + + - {file.fileName} + + + + ))} + - // ); }; diff --git a/frontend/client-portal/src/pages/ClaimReport/Index.tsx b/frontend/client-portal/src/pages/ClaimReport/Index.tsx index af64d2e4..fc83c0e9 100644 --- a/frontend/client-portal/src/pages/ClaimReport/Index.tsx +++ b/frontend/client-portal/src/pages/ClaimReport/Index.tsx @@ -4,7 +4,6 @@ import { useContext, useEffect, useState } from 'react'; import { Container, Grid } from '@mui/material'; /* ------------------------------- components ------------------------------- */ import Page from '../../components/Page'; -import TableList from '../../components/Table'; /* ---------------------------------- hooks --------------------------------- */ import useSettings from '../../hooks/useSettings'; /* -------------------------------- sections -------------------------------- */ @@ -13,13 +12,7 @@ import CardClaimStatus from '../../sections/claim-report/CardClaimStatus'; import axios from '../../utils/axios'; /* --------------------------------- context -------------------------------- */ import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate'; -/* --------------------------------- orders --------------------------------- */ -import { HeadCell, Order, PaginationTableProps } from '../../@types/table'; -import { useSearchParams } from 'react-router-dom'; import List from './List'; -import ClaimItems from '../Claims/components/ClaimItems'; -import DiagnosisHistory from '../Claims/components/DiagnosisHistory'; -import Documents from '../Claims/components/Documents'; // theme import palette from '../../theme/palette'; @@ -32,115 +25,10 @@ interface ClaimStatusType { export default function Drugs() { const { themeStretch } = useSettings(); const { corporateValue } = useContext(UserCurrentCorporateContext); - const [listClaimStatusItems, setListClaimStatusItems] = useState([]); - const [listAllMemberByClaimStatus, setListAllMemberByClaimStatus] = useState([]); - - /* -------------------------------------------------------------------------- */ - /* setTable */ - /* -------------------------------------------------------------------------- */ - - const [isLoading, setIsLoading] = useState(true); - - const loadings = { - isLoading: isLoading, - setIsLoading: setIsLoading, - }; - - /* ------------------------------ handle params ----------------------------- */ - const [searchParams, setSearchParams] = useSearchParams(); - const [appliedParams, setAppliedParams] = useState({}); - - const params = { - searchParams: searchParams, - setSearchParams: setSearchParams, - appliedParams: appliedParams, - setAppliedParams: setAppliedParams, - }; - /* -------------------------------------------------------------------------- */ - - /* ------------------------------ handle order ------------------------------ */ - const [order, setOrder] = useState('asc'); - const [orderBy, setOrderBy] = useState('fullName'); - - const orders = { - order: order, - setOrder: setOrder, - orderBy: orderBy, - setOrderBy: setOrderBy, - }; - /* -------------------------------------------------------------------------- */ - - /* ---------------------------- handle pagination --------------------------- */ - const [page, setPage] = useState(0); - const [rowsPerPage, setRowsPerPage] = useState(10); - - const [paginationTable, setPaginationTable] = useState({ - current_page: 0, - from: 0, - last_page: 0, - links: [], - path: '', - per_page: 0, - to: 0, - total: 0, - }); - - const paginations = { - page: page, - setPage: setPage, - rowsPerPage: rowsPerPage, - setRowsPerPage: setRowsPerPage, - paginationTable: paginationTable, - setPaginationTable: setPaginationTable, - }; - /* -------------------------------------------------------------------------- */ - - /* -------------------------------- headCell -------------------------------- */ - const headCells: HeadCell[] = [ - { - id: 'memberId', - align: 'left', - label: 'Member ID', - isSort: true, - }, - { - id: 'codeRequest', - align: 'left', - label: 'Code Request', - isSort: true, - }, - { - id: 'fullName', - align: 'center', - label: 'Name', - isSort: true, - }, - { - id: 'division', - align: 'center', - label: 'Divisi', - isSort: true, - }, - { - id: 'submissionDate', - align: 'center', - label: 'Submission Date', - isSort: true, - }, - { - id: 'status', - align: 'center', - label: 'Status', - isSort: true, - }, - ]; - /* -------------------------------------------------------------------------- */ useEffect(() => { (async () => { - setIsLoading(true); - const claimStatus = await axios.get(`${corporateValue}/claim-report/claim-status`); setListClaimStatusItems([ @@ -160,28 +48,8 @@ export default function Drugs() { color: palette.dark.error.dark, }, ]); - - const parameters = - Object.keys(appliedParams).length !== 0 - ? appliedParams - : Object.fromEntries([ - ...searchParams.entries(), - ['order', orders.order], - ['orderBy', orders.orderBy], - ]); - - const claim = await axios.get(`${corporateValue}/members`, { - params: { ...parameters, type: 'claim-report' }, - }); - - setSearchParams(parameters); - - setListAllMemberByClaimStatus(claim.data.data.allMembersByClaimStatus.data); - setPaginationTable(claim.data.data.allMembersByClaimStatus); - - setIsLoading(false); })(); - }, [appliedParams, searchParams, order, orderBy, setSearchParams, corporateValue]); + }, [corporateValue]); return ( @@ -192,15 +60,6 @@ export default function Drugs() { - - {/* */} diff --git a/frontend/client-portal/src/pages/ClaimReport/List.tsx b/frontend/client-portal/src/pages/ClaimReport/List.tsx index 6da864b9..6c9ca65a 100644 --- a/frontend/client-portal/src/pages/ClaimReport/List.tsx +++ b/frontend/client-portal/src/pages/ClaimReport/List.tsx @@ -173,7 +173,7 @@ export default function List() { status: obj.status === 'requested' ? ( ) : obj.status === 'approved' ? (