From 35119ee8ecc31086fbe92eec316078448666b93d Mon Sep 17 00:00:00 2001 From: R Date: Mon, 6 Mar 2023 02:10:08 +0700 Subject: [PATCH] [WIP] Update Claim --- .../Http/Controllers/Api/ClaimController.php | 102 ++++- .../Api/ClaimRequestController.php | 40 +- .../Http/Controllers/Api/OptionController.php | 101 +++++ Modules/Internal/Routes/api.php | 7 + .../Transformers/ClaimShowResource.php | 42 ++ app/Models/Benefit.php | 5 + app/Models/Claim.php | 5 + app/Models/ClaimDiagnosis.php | 8 + app/Models/ClaimItem.php | 32 ++ app/Models/File.php | 2 + ..._03_04_173410_create_claim_items_table.php | 43 ++ .../autocomplete/AutocompleteDiagnosis.tsx | 49 +++ frontend/dashboard/src/pages/Claims/Show.tsx | 395 ++++++++++++++++++ .../pages/Claims/components/ClaimItems.tsx | 69 +++ .../Claims/components/DiagnosisHistory.tsx | 54 +++ .../Claims/components/DialogMemberBenefit.tsx | 59 +++ .../src/pages/Claims/components/Documents.tsx | 68 +++ frontend/dashboard/src/routes/index.tsx | 3 +- 18 files changed, 1066 insertions(+), 18 deletions(-) create mode 100644 Modules/Internal/Http/Controllers/Api/OptionController.php create mode 100644 Modules/Internal/Transformers/ClaimShowResource.php create mode 100644 app/Models/ClaimItem.php create mode 100644 database/migrations/2023_03_04_173410_create_claim_items_table.php create mode 100644 frontend/dashboard/src/components/autocomplete/AutocompleteDiagnosis.tsx create mode 100644 frontend/dashboard/src/pages/Claims/Show.tsx create mode 100644 frontend/dashboard/src/pages/Claims/components/ClaimItems.tsx create mode 100644 frontend/dashboard/src/pages/Claims/components/DiagnosisHistory.tsx create mode 100644 frontend/dashboard/src/pages/Claims/components/DialogMemberBenefit.tsx create mode 100644 frontend/dashboard/src/pages/Claims/components/Documents.tsx diff --git a/Modules/Internal/Http/Controllers/Api/ClaimController.php b/Modules/Internal/Http/Controllers/Api/ClaimController.php index 2abb36d2..e209ba5a 100644 --- a/Modules/Internal/Http/Controllers/Api/ClaimController.php +++ b/Modules/Internal/Http/Controllers/Api/ClaimController.php @@ -2,6 +2,7 @@ namespace Modules\Internal\Http\Controllers\Api; +use App\Helpers\Helper; use App\Models\Benefit; use App\Models\Claim; use App\Models\Icd; @@ -10,6 +11,7 @@ use App\Services\ClaimService; use Illuminate\Contracts\Support\Renderable; use Illuminate\Http\Request; use Illuminate\Routing\Controller; +use Modules\Internal\Transformers\ClaimShowResource; class ClaimController extends Controller { @@ -87,13 +89,21 @@ class ClaimController extends Controller ->with([ 'member', 'member.currentPlan', + 'member.currentPlan.benefits', + 'member.currentCorporate', + 'member.currentPolicy', 'diagnosis', + 'diagnoses', 'benefit', - 'files' + 'files', + 'claimRequest', + 'claimRequest.files', + 'items', + 'items.claim_itemable' ]) ->findOrFail($id); - return response()->json($claim); + return Helper::responseJson(ClaimShowResource::make($claim)); } /** @@ -131,4 +141,92 @@ class ClaimController extends Controller { return true; } + + + public function updateItems(Request $request, $id) + { + $request->validate([]); + $claim = Claim::findOrFail($id); + + $order = 1; + $data = []; + $claim->items()->forceDelete(); + foreach ($request->benefit_items as $benefitItem) { + $benefit = Benefit::find($benefitItem['id']); + if ($benefit) { + $benefit->claimItem()->create([ + 'claim_id' => $claim->id, + 'order' => $order, + 'name' => $benefit->code, + 'currency' => 'IDR', + 'nominal_ditagihkan' => $benefitItem['biaya_diajukan'] ?? 0, + 'nominal_dicover' => $benefitItem['biaya_disetujui'] ?? 0, + 'nominal_total' => $benefitItem['biaya_disetujui'] ?? 0, + ]); + } + + $order++; + } + return Helper::responseJson([], message: "Item Claim berhasil di update"); + } + + public function updateDiagnosis(Request $request, $id) + { + $request->validate([]); + $claim = Claim::findOrFail($id); + + $claim->diagnoses()->forceDelete(); + if ($request->primary) { + foreach ($request->primary as $diagnosisId) { + $claim->diagnoses()->create([ + 'claim_id' => $claim->id, + 'type' => 'primary', + 'diagnosis_id' => $diagnosisId, + 'note' => '', + 'description' => '', + ]); + } + } + + if ($request->secondary) { + foreach ($request->secondary as $diagnosisId) { + $claim->diagnoses()->create([ + 'claim_id' => $claim->id, + 'type' => 'secondary', + 'diagnosis_id' => $diagnosisId, + 'note' => '', + 'description' => '', + ]); + } + } + + return Helper::responseJson([], message: "Diagnosis berhasil di update"); + } + + public function decline($id) + { + $claim = Claim::findOrFail($id); + $claim->status = 'declined'; + $claim->save(); + + return Helper::responseJson($claim, message: "Claim berhasil di decline"); + } + + public function approve($id) + { + $claim = Claim::findOrFail($id); + $claim->status = 'approved'; + $claim->save(); + + return Helper::responseJson($claim, message: "Claim berhasil di approve"); + } + + public function reOpen($id) + { + $claim = Claim::findOrFail($id); + $claim->status = 'received'; + $claim->save(); + + return Helper::responseJson($claim, message: "Claim berhasil di approve"); + } } diff --git a/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php b/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php index e8042da3..d85e6e9e 100644 --- a/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php +++ b/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php @@ -4,12 +4,10 @@ namespace Modules\Internal\Http\Controllers\Api; use App\Helpers\Helper; use App\Models\ClaimRequest; -use App\Models\Member; -use Exception; +use App\Services\ClaimService; use Illuminate\Contracts\Support\Renderable; use Illuminate\Http\Request; use Illuminate\Routing\Controller; -use Knp\Snappy\Pdf; use Modules\Internal\Transformers\ClaimRequestResource; use Modules\Internal\Transformers\ClaimRequestShowResource; @@ -115,19 +113,31 @@ class ClaimRequestController extends Controller $claimRequest = ClaimRequest::findOrFail($id); $member = $claimRequest->member; - $claimRequest->status = 'approved'; - $claimRequest->save(); - - // Store Generated Documents - $logContent = view('pdf.guaranted_leter', compact('member', 'claimRequest')); - $claimRequest->generatedDocuments()->create([ - 'type' => 'guarantee_letter', - 'title' => 'Guarantee Letter for '. $member->full_name, - 'document_type' => 'type', - 'html_content' => $logContent, - 'system_origin' => 'primecenter' - ]); + 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([ + 'type' => 'guarantee_letter', + 'title' => 'Guarantee Letter for '. $member->full_name, + 'document_type' => 'type', + 'html_content' => $logContent, + 'system_origin' => 'primecenter' + ]); + + } catch (\Exception $e) { + + } return $claimRequest; } + } diff --git a/Modules/Internal/Http/Controllers/Api/OptionController.php b/Modules/Internal/Http/Controllers/Api/OptionController.php new file mode 100644 index 00000000..26040625 --- /dev/null +++ b/Modules/Internal/Http/Controllers/Api/OptionController.php @@ -0,0 +1,101 @@ +validate([ + 'type' => 'required', + 'search' => 'required' + ]); + + switch ($request->type) { + case 'diagnosis': + $icds = Icd::query() + ->where('code', 'LIKE', '%'.$request->search.'%') + ->orWhere('name', 'LIKE', '%'.$request->search.'%') + ->limit('10') + ->get(); + + return $icds; + break; + + default: + # code... + break; + } + + return view('internal::index'); + } + + /** + * Show the form for creating a new resource. + * @return Renderable + */ + public function create() + { + return view('internal::create'); + } + + /** + * Store a newly created resource in storage. + * @param Request $request + * @return Renderable + */ + public function store(Request $request) + { + // + } + + /** + * Show the specified resource. + * @param int $id + * @return Renderable + */ + public function show($id) + { + return view('internal::show'); + } + + /** + * Show the form for editing the specified resource. + * @param int $id + * @return Renderable + */ + public function edit($id) + { + return view('internal::edit'); + } + + /** + * Update the specified resource in storage. + * @param Request $request + * @param int $id + * @return Renderable + */ + public function update(Request $request, $id) + { + // + } + + /** + * Remove the specified resource from storage. + * @param int $id + * @return Renderable + */ + public function destroy($id) + { + // + } +} diff --git a/Modules/Internal/Routes/api.php b/Modules/Internal/Routes/api.php index 7947cf63..68dd2db2 100755 --- a/Modules/Internal/Routes/api.php +++ b/Modules/Internal/Routes/api.php @@ -23,6 +23,7 @@ use Modules\Internal\Http\Controllers\Api\DrugController; use Modules\Internal\Http\Controllers\Api\FormulariumController; use Modules\Internal\Http\Controllers\Api\LivechatController; use Modules\Internal\Http\Controllers\Api\MemberController; +use Modules\Internal\Http\Controllers\Api\OptionController; use Modules\Internal\Http\Controllers\Api\OrganizationController; use Modules\Internal\Http\Controllers\Api\PlanController; use Modules\Internal\Http\Controllers\Api\ProvinceController; @@ -119,6 +120,11 @@ Route::prefix('internal')->group(function () { Route::get('members/{member_id}/benefits', [MemberController::class, 'benefits']); Route::get('claims', [ClaimController::class, 'index']); + Route::post('claims/{id}/update-items', [ClaimController::class, 'updateItems'])->name('claim.update-items'); + Route::post('claims/{id}/update-diagnosis', [ClaimController::class, 'updateDiagnosis'])->name('claim.update-diagnosis'); + Route::post('claims/{id}/decline', [ClaimController::class, 'decline'])->name('claim.decline'); + Route::post('claims/{id}/approve', [ClaimController::class, 'approve'])->name('claim.approve'); + Route::post('claims/{id}/re-open', [ClaimController::class, 'reOpen'])->name('claim.re-open'); Route::post('claims', [ClaimController::class, 'store']); Route::get('claims/{id}', [ClaimController::class, 'show']); Route::post('check-limit', [ClaimController::class, 'checkLimit']); @@ -142,4 +148,5 @@ Route::prefix('internal')->group(function () { Route::get('city', [CityController::class, 'index']); Route::get('district', [DistrictController::class, 'index']); Route::get('village', [VillageController::class, 'index']); + Route::get('options', [OptionController::class, 'index']); }); diff --git a/Modules/Internal/Transformers/ClaimShowResource.php b/Modules/Internal/Transformers/ClaimShowResource.php new file mode 100644 index 00000000..6b399b97 --- /dev/null +++ b/Modules/Internal/Transformers/ClaimShowResource.php @@ -0,0 +1,42 @@ +items + ->filter(function ($item) { + return $item->claim_itemable_type == Benefit::class; + }) + ->map(function ($item) { + $itemData = $item->claim_itemable->toArray(); + $itemData['nominal_dicover'] = $item['nominal_dicover'] ?? 0; + $itemData['nominal_ditagihkan'] = $item['nominal_ditagihkan'] ?? 0; + $itemData['nominal_total'] = $item['nominal_total'] ?? 0; + + // For React Frotnend + $itemData['biaya_diajukan'] = $itemData['nominal_ditagihkan']; + $itemData['biaya_disetujui'] = $itemData['nominal_dicover']; + + return $itemData; + }); + + $data['primary_diagnosis'] = $this->diagnoses->filter(function($diagnosis){ return $diagnosis->type == 'primary';})->values(); + $data['secondary_diagnosis'] = $this->diagnoses->filter(function($diagnosis){ return $diagnosis->type == 'secondary';})->values(); + + return $data; + } +} diff --git a/app/Models/Benefit.php b/app/Models/Benefit.php index 1ab24372..5c0498af 100755 --- a/app/Models/Benefit.php +++ b/app/Models/Benefit.php @@ -44,6 +44,11 @@ class Benefit extends Model // return $this->belongsTo(Benefit::class, 'benefit_code', 'code'); // } + public function claimItem() + { + return $this->morphMany(ClaimItem::class, 'claim_itemable'); + } + public function plans() { return $this->belongsToMany(Plan::class, 'corporate_benefits', 'benefit_id', 'id') diff --git a/app/Models/Claim.php b/app/Models/Claim.php index bb12ff7b..455f069c 100644 --- a/app/Models/Claim.php +++ b/app/Models/Claim.php @@ -139,6 +139,11 @@ class Claim extends Model return $this->morphMany(File::class, 'fileable'); } + public function items() + { + return $this->hasMany(ClaimItem::class, 'claim_id'); + } + public function member() { return $this->belongsTo(Member::class, 'member_id'); diff --git a/app/Models/ClaimDiagnosis.php b/app/Models/ClaimDiagnosis.php index a95578cb..195089bb 100644 --- a/app/Models/ClaimDiagnosis.php +++ b/app/Models/ClaimDiagnosis.php @@ -10,4 +10,12 @@ class ClaimDiagnosis extends Model use HasFactory; protected $table = 'claim_diagnosis'; + + public $fillable = [ + 'claim_id', + 'type', + 'diagnosis_id', + 'note', + 'description', + ]; } diff --git a/app/Models/ClaimItem.php b/app/Models/ClaimItem.php new file mode 100644 index 00000000..273377a8 --- /dev/null +++ b/app/Models/ClaimItem.php @@ -0,0 +1,32 @@ +belongsTo(Claim::class, 'claim_id'); + } + + public function claim_itemable() + { + return $this->morphTo(); + } +} diff --git a/app/Models/File.php b/app/Models/File.php index 68f361ab..c7613dfd 100755 --- a/app/Models/File.php +++ b/app/Models/File.php @@ -28,6 +28,8 @@ class File extends Model 'created_by', 'updated_by', 'deleted_by', + 'fileable_type', + 'fileable_id' ]; public $appends = [ diff --git a/database/migrations/2023_03_04_173410_create_claim_items_table.php b/database/migrations/2023_03_04_173410_create_claim_items_table.php new file mode 100644 index 00000000..27e4dd4c --- /dev/null +++ b/database/migrations/2023_03_04_173410_create_claim_items_table.php @@ -0,0 +1,43 @@ +id(); + $table->foreignId('claim_id'); + $table->smallInteger('order')->default(0); + $table->morphs('claim_itemable'); + $table->string('currency'); + $table->string('nominal_ditagihkan')->nullable(); + $table->string('nominal_dicover')->nullable(); + $table->string('nominal_total')->nullable(); + + $table->timestamps(); + $table->softDeletes(); + $table->unsignedBigInteger('created_by')->nullable()->index(); + $table->unsignedBigInteger('updated_by')->nullable()->index(); + $table->unsignedBigInteger('deleted_by')->nullable()->index(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('claim_items'); + } +}; diff --git a/frontend/dashboard/src/components/autocomplete/AutocompleteDiagnosis.tsx b/frontend/dashboard/src/components/autocomplete/AutocompleteDiagnosis.tsx new file mode 100644 index 00000000..5fc38880 --- /dev/null +++ b/frontend/dashboard/src/components/autocomplete/AutocompleteDiagnosis.tsx @@ -0,0 +1,49 @@ +import axios from "@/utils/axios"; +import { Autocomplete, TextField, CircularProgress } from "@mui/material"; +import { useState } from "react"; + +export default function AutocompleteDiagnosis({ onChange, textLabel, currentValue = null }) +{ + const [options, setOptions] = useState([]) + const [loading, setLoading] = useState(false) + + return ( {onChange(value)}} + isOptionEqualToValue={(option, value) => option.title === value.title} + getOptionLabel={(option) => option.title} + options={options} + loading={loading} + renderInput={(params) => ( + { + setLoading(true); + axios.get('options?type=diagnosis&search='+event.target.value) + .then((res) => { + setOptions(res.data.map(function(icd) { + return { + title: icd.code + '-' + icd.name, + value: icd.id + } + })) + }) + .then(() => { + setLoading(false); + }) + }} + InputProps={{ + ...params.InputProps, + endAdornment: ( + <> + {loading ? : null} + {params.InputProps.endAdornment} + + ), + }} + /> + )} + /> + ) +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/Claims/Show.tsx b/frontend/dashboard/src/pages/Claims/Show.tsx new file mode 100644 index 00000000..d2c941fe --- /dev/null +++ b/frontend/dashboard/src/pages/Claims/Show.tsx @@ -0,0 +1,395 @@ +import * as Yup from 'yup'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { + Autocomplete, + Box, + Button, + Card, + Collapse, + Container, + Divider, + Grid, + InputAdornment, + Paper, + 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 HeaderBreadcrumbs from '../../components/HeaderBreadcrumbs'; +import { FormProvider, RHFCheckbox, RHFSelect, RHFTextField } from '../../components/hook-form'; +import Page from '../../components/Page'; +import useSettings from '../../hooks/useSettings'; +import { useEffect, useMemo, useRef, useState } from 'react'; +import MemberSelectDialog from '../../components/dialogs/MemberSelectDialog'; +import { styled } from '@mui/system'; +import axios from '../../utils/axios'; +import { enqueueSnackbar } from 'notistack'; +import { LoadingButton } from '@mui/lab'; +import { fCurrency } from '../../utils/formatNumber'; +import Iconify from '../../components/Iconify'; +import Form from './Form'; +import Documents from './components/Documents'; +import DiagnosisHistory from './components/DiagnosisHistory'; +import ClaimItems from './components/ClaimItems'; +import DialogMemberBenefit from './components/DialogMemberBenefit'; +import AutocompleteDiagnosis from '@/components/autocomplete/AutocompleteDiagnosis'; + +export default function ClaimsCreateUpdate() { + const { themeStretch } = useSettings(); + const { id } = useParams(); + + const isEdit = id ? true : false; + + const [currentClaim, setCurrentClaim] = useState(); + const [documents, setDocuments] = useState([]); + + const Item = styled(Paper)(({ theme }) => ({ + backgroundColor: theme.palette.mode === 'dark' ? '#1A2027' : '#fff', + ...theme.typography.body2, + padding: theme.spacing(1), + textAlign: 'center', + color: theme.palette.text.secondary, + })); + + // -------------------------------------------------------------- + // Claim Item + const [claimItems, setClaimItems] = useState([]); + const [dialogAddClaimItemOpen, setDialogAddClaimItemOpen] = useState(false); + const [loadingClaimItems, setLoadingClaimItems] = useState(false); + + const handleAddClaimItems = (items) => { + setClaimItems([...claimItems, ...items]); + }; + + const handleSaveClaimItems = () => { + console.log('Storing ', claimItems); + setLoadingClaimItems(true); + axios + .post(`claims/${id}/update-items`, { + benefit_items: claimItems.map((benefit) => { + return { + id: benefit.id, + biaya_diajukan: benefit.biaya_diajukan, + biaya_disetujui: benefit.biaya_disetujui, + }; + }), + }) + .then((res) => { + enqueueSnackbar(res.data.message, { variant: 'success' }); + }) + .catch((err) => { + setLoadingClaimItems(false); + enqueueSnackbar(err.response?.data?.message ?? err?.message, { variant: 'error' }); + }) + .then(() => { + setLoadingClaimItems(false); + }); + }; + + // -------------------------------------------------------------- + // Diagnosis + const [primaryDiagnosis, setPrimaryDiagnosis] = useState(null); + const [secondaryDiagnosis, setSecondaryDiagnosis] = useState(null); + const [loadingDiagnosis, setLoadingDiagnosis] = useState(false); + + const handlePrimaryDiagnosisChange = ({ title, value }) => { + setPrimaryDiagnosis(value); + }; + + const handleSecondaryDiagnosisChange = ({ title, value }) => { + setSecondaryDiagnosis(value); + }; + + const handleSaveDiagnosis = () => { + setLoadingDiagnosis(true); + + axios + .post(`claims/${id}/update-diagnosis`, { + primary: [primaryDiagnosis], + secondary: [secondaryDiagnosis], + }) + .then((res) => { + enqueueSnackbar(res.data.message, { variant: 'success' }); + }) + .catch((err) => { + setLoadingDiagnosis(false); + enqueueSnackbar(err.response?.data?.message ?? err?.message, { variant: 'error' }); + }) + .then(() => { + setLoadingDiagnosis(false); + }); + }; + + const handleDecline = () => { + axios + .post(`claims/${id}/decline`) + .then((res) => { + enqueueSnackbar(res.data.message, { variant: 'success' }); + setCurrentClaim({ ...currentClaim, status: 'declined' }); + }) + .catch((err) => { + // setLoadingDiagnosis(false) + enqueueSnackbar(err.response?.data?.message ?? err?.message, { variant: 'error' }); + }) + .then(() => { + // setLoadingDiagnosis(false) + }); + }; + + const handleApprove = () => { + axios + .post(`claims/${id}/approve`) + .then((res) => { + enqueueSnackbar(res.data.message, { variant: 'success' }); + setCurrentClaim({ ...currentClaim, status: 'approved' }); + }) + .catch((err) => { + // setLoadingDiagnosis(false) + enqueueSnackbar(err.response?.data?.message ?? err?.message, { variant: 'error' }); + }) + .then(() => { + // setLoadingDiagnosis(false) + }); + }; + + const handleReOpen = () => { + axios + .post(`claims/${id}/re-open`) + .then((res) => { + enqueueSnackbar(res.data.message, { variant: 'success' }); + setCurrentClaim({ ...currentClaim, status: 'received' }); + }) + .catch((err) => { + // setLoadingDiagnosis(false) + enqueueSnackbar(err.response?.data?.message ?? err?.message, { variant: 'error' }); + }) + .then(() => { + // setLoadingDiagnosis(false) + }); + }; + + useEffect(() => { + axios.get('/claims/' + id).then(({ data }) => { + const claim = data.data; + const allFiles = [...claim.claim_request.files, ...claim.files]; + + setCurrentClaim(claim); + setDocuments(allFiles); + setClaimItems(claim.benefit_items); + }); + }, [id]); + + return ( + + + + + + {/* Action Button */} + + {(currentClaim?.status == 'requested' || currentClaim?.status == 'received') && ( + <> + { + handleDecline(); + }} + > + Decline + + { + handleApprove(); + }} + > + Approve + + + )} + {(currentClaim?.status == 'declined' || currentClaim?.status == 'approved') && ( + { + handleReOpen(); + }} + > + Re-Open + + )} + + + + + + + Status : {currentClaim?.status} + + + + + + {/* Dokumen Tambahan */} + + + {/* Riwayat Diagnosa */} + + + {/* Ringkasan Data Member */} + + + + + + Ringkasan Data Nasabah + + + + + + + + + + + + + Nama Lengkap + + + {currentClaim?.member?.full_name} + + + + + + + Nomor Polis + + {currentClaim?.member?.full_name} + + + + + Member ID + + {currentClaim?.member?.member_id} + + + + + Tipe Claim + + + {currentClaim?.claim_request.payment_type_name} + + + + + + Tipe Nasabah + + + {currentClaim?.member?.current_corporate?.name} + + + + + + + + + + + {/* Diagnosis */} + + + + + + + + + { + handleSaveDiagnosis(); + }} + > + Simpan Claim Item + + + + + + Client Benefit Configuration + { + setDialogAddClaimItemOpen(true); + }} + > + + Add Benefit + + + + + { + handleSaveClaimItems(); + }} + > + Simpan Claim Item + + + + + + + + + + + ); +} diff --git a/frontend/dashboard/src/pages/Claims/components/ClaimItems.tsx b/frontend/dashboard/src/pages/Claims/components/ClaimItems.tsx new file mode 100644 index 00000000..9a803a9c --- /dev/null +++ b/frontend/dashboard/src/pages/Claims/components/ClaimItems.tsx @@ -0,0 +1,69 @@ +import Iconify from '@/components/Iconify'; +import { Divider, InputAdornment, Paper, Stack, TextField, Typography } from '@mui/material'; +import { useEffect, useState } from 'react'; + +export default function ClaimItems({ items, setItems }) { + + const handleChangeBiayaDiajukan = (event, itemIndex: Number) => { + setItems(items.map((item, index) => { + if (index == itemIndex) { + return {...item, biaya_diajukan : event.target.value} + } else { + return item; + } + })) + } + + const handleChangeBiayaDisetujui = (event, itemIndex: Number) => { + setItems(items.map((item, index) => { + if (index == itemIndex) { + return {...item, biaya_disetujui : event.target.value} + } else { + return item; + } + })) + } + + const calculateBiayaDitolak = (biayaDiajukan: Number | null, biayaDisetujui: Number | null) => { + return (biayaDiajukan ? biayaDiajukan : 0) - (biayaDisetujui ? biayaDisetujui : 0) + } + + const handleDeleteItem = (itemIndex: Number) => { + setItems(items.filter((item, index) => index != itemIndex)) + } + + return ( + + {items.length > 0 ? ( + items.map((item, index) => ( + + + #{index+1} ({item.code}) {item.description} + {handleDeleteItem(index)}}> + + } + > + {handleChangeBiayaDiajukan(event, index)}}> + IDR + {/* */} + + {handleChangeBiayaDisetujui(event, index)}}> + IDR + {/* */} + + + IDR + {/* */} + + + + )) + ) : ( + No Benefit Item + )} + + ); +} diff --git a/frontend/dashboard/src/pages/Claims/components/DiagnosisHistory.tsx b/frontend/dashboard/src/pages/Claims/components/DiagnosisHistory.tsx new file mode 100644 index 00000000..db44687f --- /dev/null +++ b/frontend/dashboard/src/pages/Claims/components/DiagnosisHistory.tsx @@ -0,0 +1,54 @@ +import Iconify from '@/components/Iconify'; +import { Paper, Stack, Typography } from '@mui/material'; +import { useState } from 'react'; + +export default function DiagnosisHistory({ diagnosis }) { + function DiagnosaItem({ item }) { + return ( + + + + Nama Penyakit + + Claim Terakhir : 23 Januari 2023 08:00 + + + + ); + } + + return ( + + + + + + Riwayat Diagnosa + + + { + setOpenDialogRequestDocument(true); + }} + > + View All + + + + + { diagnosis.length > 0 ? ( + + { diagnosis.map((diagnosa, index) => ( + + )) } + + ) : ( + + Belum ada History Perawatan + + ) } + + + ); +} diff --git a/frontend/dashboard/src/pages/Claims/components/DialogMemberBenefit.tsx b/frontend/dashboard/src/pages/Claims/components/DialogMemberBenefit.tsx new file mode 100644 index 00000000..757b3448 --- /dev/null +++ b/frontend/dashboard/src/pages/Claims/components/DialogMemberBenefit.tsx @@ -0,0 +1,59 @@ +import MuiDialog from "@/components/MuiDialog"; +import { Button, Checkbox, Typography } from "@mui/material"; +import { Paper } from "@mui/material"; +import { Stack } from '@mui/material'; +import { useState } from "react"; + + +export default function DialogMemberBenefit({member, setOpenDialog, openDialog, onSubmit}) { + + const benefits = member?.current_plan?.benefits ?? []; + const [selectedBenefits, setSelectedBenefits] = useState([]); + + const toggleBenefit = (benefit) => { + if (selectedBenefits.includes(benefit)) { + console.log('removing', benefit) + setSelectedBenefits(selectedBenefits.filter((throughBenefit) => benefit.id != throughBenefit.id)) + } else { + console.log('adding', benefit) + setSelectedBenefits([...selectedBenefits, benefit]) + } + } + + const handleSubmit = () => { + onSubmit(selectedBenefits); + console.log ('submitting') + setOpenDialog(false); + setSelectedBenefits([]); + } + + const getContent = () => ( + + { benefits.map((benefit, index) => ( + + + + + {benefit.description} + {benefit.code} + + { toggleBenefit(benefit) }}> + + + ))} + + + + ); + + + return ( + + ); +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/Claims/components/Documents.tsx b/frontend/dashboard/src/pages/Claims/components/Documents.tsx new file mode 100644 index 00000000..fefe2a94 --- /dev/null +++ b/frontend/dashboard/src/pages/Claims/components/Documents.tsx @@ -0,0 +1,68 @@ +import Iconify from '@/components/Iconify'; +import { Paper, Stack, Typography } from '@mui/material'; +import { useState } from 'react'; + +export default function Documents({ files }) { + // -------------------------------------------------------------- + // Dialog Request Document + const [openDialogRequestDocument, setOpenDialogRequestDocument] = useState(false); + + function FileItem({item}) { + function fileCategory(type: string) { + switch(type) { + case 'claim-result': + return 'Claim Result'; + case 'claim-diagnosis': + return 'Claim Diagnosis'; + case 'claim-condition': + return 'Claim Condition'; + default: + return 'Other File'; + } + } + + return ( + + + + { fileCategory(item.type) } + + { item.name } + + + + ); + } + + return ( + + + + Dokumen Tambahan + + { + setOpenDialogRequestDocument(true); + }} + > + + Request Document + + + + + { files.length > 0 ? ( + + { files.map((file, index) => ( + + )) } + + ) : ( + + Belum ada History Perawatan + + )} + + + ); +} diff --git a/frontend/dashboard/src/routes/index.tsx b/frontend/dashboard/src/routes/index.tsx index 52a79ce2..c5df9faf 100755 --- a/frontend/dashboard/src/routes/index.tsx +++ b/frontend/dashboard/src/routes/index.tsx @@ -280,7 +280,7 @@ export default function Router() { }, { path: 'claims/:id', - element: , + element: , }, { path: 'profile', @@ -402,5 +402,6 @@ const Profile = Loadable(lazy(() => import('../pages/Profile/Index'))); const Claims = Loadable(lazy(() => import('../pages/Claims/Index'))); const ClaimsCreate = Loadable(lazy(() => import('../pages/Claims/CreateUpdate'))); +const ClaimShow = Loadable(lazy(() => import('../pages/Claims/Show'))); const ClaimRequests = Loadable(lazy(() => import('../pages/ClaimRequests/Index'))); \ No newline at end of file