From 91ba718a501e09e09761af7e0cefd80bc69d9fc5 Mon Sep 17 00:00:00 2001 From: R Date: Fri, 3 Mar 2023 08:44:08 +0700 Subject: [PATCH] [WIP] Update --- .../Api/ClaimRequestController.php | 3 +- .../Api/ClaimRequestController.php | 2 +- Modules/Internal/Services/ClaimService.php | 11 -- .../Transformers/ClaimRequestResource.php | 4 +- .../GeneratedDocumentController.php | 2 + app/Models/Claim.php | 11 ++ app/Models/ClaimRequest.php | 36 ++++- app/Models/Member.php | 9 +- app/Services/ClaimRequestService.php | 7 +- ..._14_102144_create_claim_requests_table.php | 3 + .../components/dialogs/DialogDetailClaim.tsx | 28 ++++ .../layouts/dashboard/navbar/NavConfig.tsx | 2 +- .../src/pages/ClaimRequests/List.tsx | 125 +++++++++++------- .../dashboard/src/utils/getColorPresets.ts | 6 +- .../src/sections/dashboard/DialogMember.tsx | 4 +- .../sections/dashboard/FormRequestClaim.tsx | 20 ++- resources/views/pdf/guaranted_leter.blade.php | 2 +- 17 files changed, 197 insertions(+), 78 deletions(-) delete mode 100644 Modules/Internal/Services/ClaimService.php diff --git a/Modules/HospitalPortal/Http/Controllers/Api/ClaimRequestController.php b/Modules/HospitalPortal/Http/Controllers/Api/ClaimRequestController.php index 2a177d78..332bbbeb 100644 --- a/Modules/HospitalPortal/Http/Controllers/Api/ClaimRequestController.php +++ b/Modules/HospitalPortal/Http/Controllers/Api/ClaimRequestController.php @@ -62,10 +62,11 @@ class ClaimRequestController extends Controller { $request->validate([ 'member_id' => 'required', + 'service_code' => 'required|in:OP,IP' ]); $member = Member::find($request->member_id); - $newClaimRequest = ClaimRequestService::storeClaimRequest(member: $member); + $newClaimRequest = ClaimRequestService::storeClaimRequest(member: $member, paymentType: 'reimbursement', serviceCode: $request->service_code); ClaimRequested::dispatch($newClaimRequest); diff --git a/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php b/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php index 9dbe39fa..e8042da3 100644 --- a/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php +++ b/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php @@ -36,7 +36,7 @@ class ClaimRequestController extends Controller ->when($request->status, function($q, $status) { $q->where('status', $status); }) - ->with(['member', 'files']) + ->with(['member', 'files', 'service']) ->paginate(); return Helper::paginateResources(ClaimRequestResource::collection($claimRequests)); diff --git a/Modules/Internal/Services/ClaimService.php b/Modules/Internal/Services/ClaimService.php deleted file mode 100644 index ec1429ae..00000000 --- a/Modules/Internal/Services/ClaimService.php +++ /dev/null @@ -1,11 +0,0 @@ - $this->submission_date, 'member' => $this->member, 'status' => $this->status ?? 'unknown', - 'service_type' => $this->service_type, + 'service_name' => $this->service->name, + 'payment_type' => $this->payment_type, + 'payment_type_name' => $this->payment_type_name, 'files_by_type' => $filesGroupByType ]; diff --git a/app/Http/Controllers/GeneratedDocumentController.php b/app/Http/Controllers/GeneratedDocumentController.php index c634543a..cb07adf3 100644 --- a/app/Http/Controllers/GeneratedDocumentController.php +++ b/app/Http/Controllers/GeneratedDocumentController.php @@ -57,6 +57,8 @@ class GeneratedDocumentController extends Controller // $pdf = PDF::loadFile(route('generated-document.show', $id)); // return $pdf->inline(); + // $pdf = PDF::loadHtml('

Motherfucker

'); + // $snappy = App::make('snappy.pdf'); // $html = '

Bill

You owe me money, dude.

'; // // $snappy->generateFromHtml($html, '/tmp/bill-123.pdf'); diff --git a/app/Models/Claim.php b/app/Models/Claim.php index c8fc65c1..bb12ff7b 100644 --- a/app/Models/Claim.php +++ b/app/Models/Claim.php @@ -122,6 +122,17 @@ class Claim extends Model return (string) self::$code_prefix .'-'. str_pad($next_number, 5, 0, STR_PAD_LEFT); } + // Current ClaimRequest that refer to the claim + public function claimRequest() + { + return $this->belongsTo(ClaimRequest::class, 'claim_request_id'); + } + + // Possibilities of ClaimRequest that refer to the claim + public function claimRequests() + { + return $this->hasMany(ClaimRequest::class, 'claim_id'); + } public function files() { diff --git a/app/Models/ClaimRequest.php b/app/Models/ClaimRequest.php index dda5aa9a..39533f41 100644 --- a/app/Models/ClaimRequest.php +++ b/app/Models/ClaimRequest.php @@ -17,8 +17,12 @@ class ClaimRequest extends Model protected static $code_prefix = 'CRQ'; public $fillable = [ + 'uuid', 'submission_date', 'member_id', + 'payment_type', + 'service_code', + 'policy_id', 'status', 'claim_id' ]; @@ -35,13 +39,19 @@ class ClaimRequest extends Model public static $status = [ 'draft' => 'Draft', 'requested' => 'Requested', - 'received' => 'Received', 'approved' => 'Approved', - 'postpone' => 'Postpone', - 'paid' => 'Paid', 'declined' => 'Declined' ]; + public static $payment_types = [ + 'cashless' => 'Cashless', + 'reimbursement' => 'Reimbursement' + ]; + + public $appends = [ + 'payment_type_name' + ]; + protected static function boot() { parent::boot(); @@ -116,6 +126,11 @@ class ClaimRequest extends Model return (string) self::$code_prefix .'-'. str_pad($next_number, 5, 0, STR_PAD_LEFT); } + public function claim() + { + return $this->belongsTo(Claim::class, 'claim_id'); + } + public function claims() { return $this->hasMany(Claim::class, 'claim_request_id'); @@ -140,4 +155,19 @@ class ClaimRequest extends Model { return $this->belongsTo(Member::class, 'member_id', 'id'); } + + public function service() + { + return $this->belongsTo(Service::class, 'service_code', 'code'); + } + + public function getPaymentTypeNameAttribute() + { + return self::$payment_types[$this->payment_type] ?? $this->payment_type; + } + + public function getStatusAttribute($value) + { + return self::$payment_types[$value] ?? $value; + } } diff --git a/app/Models/Member.php b/app/Models/Member.php index 7c9f3b7a..b0f72a86 100755 --- a/app/Models/Member.php +++ b/app/Models/Member.php @@ -151,13 +151,20 @@ class Member extends Model } public function currentPolicy() + { + return $this->hasOneThrough(CorporatePolicy::class, MemberPolicy::class, 'member_id', 'code', 'member_id', 'policy_id') + ->where('status', 'active') + ->orderBy('end', 'DESC'); + // return $this->hasOne(MemberPolicy::class, 'member_id', 'member_id')->where('status', 'active')->latestOfMany(); + } + + public function currentActivePolicy() { return $this->hasOneThrough(CorporatePolicy::class, MemberPolicy::class, 'member_id', 'code', 'member_id', 'policy_id') ->where('corporate_policies.start', '<', now()) ->where('corporate_policies.end', '>', now()) ->where('member_policies.start', '<', now()) ->where('member_policies.end', '>', now()); - // return $this->hasOne(MemberPolicy::class, 'member_id', 'member_id')->where('status', 'active')->latestOfMany(); } public function getAgeAttribute() diff --git a/app/Services/ClaimRequestService.php b/app/Services/ClaimRequestService.php index 16e79772..08c31f1b 100644 --- a/app/Services/ClaimRequestService.php +++ b/app/Services/ClaimRequestService.php @@ -14,7 +14,7 @@ use Str; class ClaimRequestService{ - public static function storeClaimRequest($member, $submissionDate = null, $status = 'requested') + public static function storeClaimRequest($member, $paymentType, $serviceCode, $submissionDate = null, $status = 'requested') { try { DB::beginTransaction(); @@ -22,7 +22,10 @@ class ClaimRequestService{ $claimRequestData = [ 'member_id' => $member->id, 'submission_date' => $submissionDate ?? now(), - 'status' => $status + 'status' => $status, + 'payment_type' => $paymentType, + 'service_code' => $serviceCode, + 'policy_id' => $member->currentPolicy->id ?? null, ]; $claimRequest = ClaimRequest::create($claimRequestData); diff --git a/database/migrations/2023_02_14_102144_create_claim_requests_table.php b/database/migrations/2023_02_14_102144_create_claim_requests_table.php index 36564820..84c1cd49 100644 --- a/database/migrations/2023_02_14_102144_create_claim_requests_table.php +++ b/database/migrations/2023_02_14_102144_create_claim_requests_table.php @@ -19,6 +19,9 @@ return new class extends Migration $table->string('code')->index(); $table->dateTime('submission_date')->nullable(); $table->foreignId('member_id'); + $table->string('payment_type'); + $table->string('service_code'); + $table->foreignId('policy_id'); $table->string('status')->nullable(); $table->foreignId('claim_id')->nullable()->comment('After Claim is Created'); diff --git a/frontend/dashboard/src/components/dialogs/DialogDetailClaim.tsx b/frontend/dashboard/src/components/dialogs/DialogDetailClaim.tsx index 64495bef..960c0d11 100644 --- a/frontend/dashboard/src/components/dialogs/DialogDetailClaim.tsx +++ b/frontend/dashboard/src/components/dialogs/DialogDetailClaim.tsx @@ -135,6 +135,34 @@ const DialogDetailClaim = ({ title, openDialog, setOpenDialog, data }: MuiDialog )} */} + + + + + {/* ---------------------------------TYPE INFO------------------------------------ */} + + + + Pengajuan Penjaminan + + + + + + } + fullWidth + // sx={{ typography: 'subtitle2', borderColor: '#F5F5F5' }} + onClick={() => {}} + > + Upload Invoice + + + + + + {claim.histories_by_date && claim.histories_by_date.map((historiesByDate) => ( diff --git a/frontend/dashboard/src/layouts/dashboard/navbar/NavConfig.tsx b/frontend/dashboard/src/layouts/dashboard/navbar/NavConfig.tsx index 7e4ddb40..0b6534b0 100755 --- a/frontend/dashboard/src/layouts/dashboard/navbar/NavConfig.tsx +++ b/frontend/dashboard/src/layouts/dashboard/navbar/NavConfig.tsx @@ -59,7 +59,7 @@ const navConfig = [ ], }, { - title: 'LOG REQUEST', + title: 'CLAIM REQUEST', path: '/claim-requests', // children: [ // { title: 'Request', path: '/case-request' }, diff --git a/frontend/dashboard/src/pages/ClaimRequests/List.tsx b/frontend/dashboard/src/pages/ClaimRequests/List.tsx index 20b72dd4..e8489b62 100755 --- a/frontend/dashboard/src/pages/ClaimRequests/List.tsx +++ b/frontend/dashboard/src/pages/ClaimRequests/List.tsx @@ -26,6 +26,7 @@ import CancelIcon from '@mui/icons-material/Cancel'; // hooks import React, { ChangeEvent, useEffect, useRef, useState } from 'react'; import { Navigate, useNavigate, useSearchParams } from 'react-router-dom'; +import useSettings from '@/hooks/useSettings'; // components import axios from '../../utils/axios'; import { LaravelPaginatedData, LaravelPaginatedDataDefault } from '../../@types/paginated-data'; @@ -40,6 +41,7 @@ import DialogDetailClaim from '@/components/dialogs/DialogDetailClaim'; // import LoadingButton from '@/theme/overrides/LoadingButton'; export default function List() { + const { themeColorPresets } = useSettings(); const [searchParams, setSearchParams] = useSearchParams(); const [importResult, setImportResult] = useState(null); @@ -137,15 +139,16 @@ export default function List() { }; const handleApprove = (claimRequest) => { - axios.post(`claim-requests/${claimRequest.id}/approve`) + axios + .post(`claim-requests/${claimRequest.id}/approve`) .then((response) => { - enqueueSnackbar('Success Approve', {variant: 'success'}) - loadDataTableData() + enqueueSnackbar('Success Approve', { variant: 'success' }); + loadDataTableData(); }) - .catch(({response}) => { - enqueueSnackbar(response.data.message ?? 'Something went wrong!', {variant : "error"}) - }) - } + .catch(({ response }) => { + enqueueSnackbar(response.data.message ?? 'Something went wrong!', { variant: 'error' }); + }); + }; useEffect(() => { loadDataTableData(); @@ -178,13 +181,39 @@ export default function List() { {open ? : } - {row.code} + + { + handleShowClaim(row); + }} + color={themeColorPresets} + > + {row.code} + + + {row.member?.full_name} {row.member?.full_name} {row.submission_date} - {row.service_type} - - { row.status == 'requested' && ( {handleApprove(row)}}>Approve )} - + {row.service_name} + {row.payment_type_name} + + + + + {row.status == 'requested' && ( + { + handleApprove(row); + }} + > + Ajukan Claim + + )} + + {/* { @@ -193,32 +222,33 @@ export default function List() { > - + */} {/* COLLAPSIBLE ROW */} - } - spacing={1} - sx={{ marginY: 2 }} - > - - Berkas Hasil Penunjang - {row.files_by_type?.result && - row.files_by_type?.result.map((file, index) => ( - - - {file.name} - - ))} - - { !row.files_by_type?.result && ( - Tidak ada berkas - )} + } + spacing={1} + sx={{ marginY: 2 }} + > + + Berkas Hasil Penunjang + {row.files_by_type?.result && + row.files_by_type?.result.map((file, index) => ( + + -{' '} + + {file.name} + + + ))} + + {!row.files_by_type?.result && Tidak ada berkas} - + @@ -241,20 +271,24 @@ export default function List() { Code - Member Name + Name - Submission Date + Nomor Polis - Jenis Layanan + Tanggal Pengajuan + + + Service Type + + + Claim Type Status - - Action - + {/* ------------------ END TABLE HEADER ------------------ */} @@ -288,8 +322,6 @@ export default function List() { ); } - - // --------------------------------------------------------- // Dialog Detail Claim Request const [openDialogDetailClaim, setOpenDialogDetailClaim] = useState(false); @@ -300,20 +332,18 @@ export default function List() { setLoadingClaimDetail(true); setOpenDialogDetailClaim(true); - axios.get(`/claim-requests/${claimRequest.id}`) - .then(({data}) => { + axios + .get(`/claim-requests/${claimRequest.id}`) + .then(({ data }) => { setCurrentClaim(data.data); setLoadingClaimDetail(false); }) .catch((err) => { - enqueueSnackbar(err.message, {variant: 'error'}) - }) - } - - function handleDownloadLog() { - + enqueueSnackbar(err.message, { variant: 'error' }); + }); } + function handleDownloadLog() {} return ( @@ -327,7 +357,6 @@ export default function List() { TableContent={} /> - {corporateBenefit.benefit.description} - {corporateBenefit.benefit.code} + Member ID : {corporateBenefit.benefit.code} Yearly Limits {corporateBenefit.usage ?? 0} / diff --git a/frontend/hospital-portal/src/sections/dashboard/FormRequestClaim.tsx b/frontend/hospital-portal/src/sections/dashboard/FormRequestClaim.tsx index dad2281b..bdfb8e6f 100644 --- a/frontend/hospital-portal/src/sections/dashboard/FormRequestClaim.tsx +++ b/frontend/hospital-portal/src/sections/dashboard/FormRequestClaim.tsx @@ -2,7 +2,7 @@ import { styled } from '@mui/material/styles'; import Iconify from '@/components/Iconify'; import { fCurrency } from '@/utils/formatNumber'; import { LoadingButton } from '@mui/lab'; -import { Avatar, Divider, LinearProgress, linearProgressClasses } from '@mui/material'; +import { Avatar, Button, Divider, LinearProgress, linearProgressClasses } from '@mui/material'; import { Card } from '@mui/material'; import { Stack, Typography } from '@mui/material'; import { fPostFormat } from '@/utils/formatTime'; @@ -25,6 +25,8 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }) { }, })); + const [serviceCode, setServiceCode] = useState('IP'); + // ---------------------------------------------------------------------- // Files Diagnosa @@ -98,7 +100,8 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }) { member_id: member.id, result_files: fileHasilPenunjangs, diagnosa_files: fileDiagnosas, - kondisi_files: fileKondisis + kondisi_files: fileKondisis, + service_code: serviceCode }); axios .post('/claim-requests', formData) @@ -117,10 +120,21 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }) { return ( - + Submission Date :
{fPostFormat(new Date(), 'dd/MM/yyyy')}
+ + + + + + + + + + + - + {{-- --}}