diff --git a/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php b/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php index ef25abe9..584b7264 100644 --- a/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php +++ b/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php @@ -516,89 +516,102 @@ class ClaimRequestController extends Controller public function claimRequestDetail($claimRequestId) { - $status = DB::table('claim_requests') - ->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id') - ->leftJoin('members', 'claim_requests.member_id', '=', 'members.id') - ->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id') - ->leftJoin('corporate_divisions', 'corporate_employees.division_id', '=', 'corporate_divisions.id') - ->where('claim_requests.id', '=', $claimRequestId) - ->select( - 'claim_requests.submission_date', - 'claim_requests.code', - DB::raw(' - 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 "" - END AS status - ') - ) - ->first(); - $results['status'] = $status; - $timeline = DB::table('claim_logs') - ->where('claim_logs.claim_request_id', '=', $claimRequestId) - ->select( - DB::raw(' - CASE - WHEN claim_logs.status = "requested" THEN "Request" - WHEN claim_logs.status = "reviewed" THEN "Review" - WHEN claim_logs.status = "approved" THEN "Approval" - WHEN claim_logs.status = "declined" THEN "Decline" - ELSE "-" - END AS txt_status - '), - DB::raw(' - CASE - WHEN claim_logs.status = "requested" THEN "#159C9C" - WHEN claim_logs.status = "reviewed" THEN "#0C53B7" - WHEN claim_logs.status = "approved" THEN "#229A16" - WHEN claim_logs.status = "declined" THEN "#FF4842" - ELSE "-" - END AS txt_status_color - '), - DB::raw(' - CASE - WHEN claim_logs.status = "requested" THEN "#00AB5529" - WHEN claim_logs.status = "reviewed" THEN "#1890FF29" - WHEN claim_logs.status = "approved" THEN "#54D62C29" - WHEN claim_logs.status = "declined" THEN "#FF48427A" - ELSE "-" - END AS txt_status_backgroundColor - '), - 'claim_logs.date', - 'claim_logs.description', - 'claim_logs.status' - ) - ->orderBy('claim_logs.id', 'desc') - ->get(); - $results['timeline'] = $timeline; - $request_files = DB::table('claim_request_files') - ->where('claim_request_files.claim_request_id', '=', $claimRequestId) - ->select( - 'claim_request_files.*', - DB::raw('(SELECT files.fileable_id FROM files WHERE files.fileable_id = claim_request_files.claim_request_id AND files.type = claim_request_files.type LIMIT 1) AS check_files'), - ) - ->get(); - $results['request_files'] = $request_files; - $documents = DB::table('files') - ->where('fileable_type', 'App\Models\ClaimRequest') - ->where('fileable_id', $claimRequestId) - ->select('original_name', \DB::raw("CONCAT('" . env('APP_URL') . "/storage/', path) as path"), 'type') - ->orderBy('id', 'desc') - ->get(); - $results['documents'] = $documents; - $dialog_submits = DB::table('claim_requests') - ->leftJoin('members', 'claim_requests.member_id','=', 'members.id') - ->where('claim_requests.id', $claimRequestId) - ->select('claim_requests.code', 'members.name', 'claim_requests.submission_date', 'claim_requests.service_code','claim_requests.status') - ->first(); - $results['dialog_submits'] = $dialog_submits; + // $status = DB::table('claim_requests') + // ->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id') + // ->leftJoin('members', 'claim_requests.member_id', '=', 'members.id') + // ->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id') + // ->leftJoin('corporate_divisions', 'corporate_employees.division_id', '=', 'corporate_divisions.id') + // ->where('claim_requests.id', '=', $claimRequestId) + // ->select( + // 'claim_requests.submission_date', + // 'claim_requests.code', + // DB::raw(' + // 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 "" + // END AS status + // ') + // ) + // ->first(); + // $results['status'] = $status; + // $timeline = DB::table('claim_logs') + // ->where('claim_logs.claim_request_id', '=', $claimRequestId) + // ->select( + // DB::raw(' + // CASE + // WHEN claim_logs.status = "requested" THEN "Request" + // WHEN claim_logs.status = "reviewed" THEN "Review" + // WHEN claim_logs.status = "approved" THEN "Approval" + // WHEN claim_logs.status = "declined" THEN "Decline" + // ELSE "-" + // END AS txt_status + // '), + // DB::raw(' + // CASE + // WHEN claim_logs.status = "requested" THEN "#159C9C" + // WHEN claim_logs.status = "reviewed" THEN "#0C53B7" + // WHEN claim_logs.status = "approved" THEN "#229A16" + // WHEN claim_logs.status = "declined" THEN "#FF4842" + // ELSE "-" + // END AS txt_status_color + // '), + // DB::raw(' + // CASE + // WHEN claim_logs.status = "requested" THEN "#00AB5529" + // WHEN claim_logs.status = "reviewed" THEN "#1890FF29" + // WHEN claim_logs.status = "approved" THEN "#54D62C29" + // WHEN claim_logs.status = "declined" THEN "#FF48427A" + // ELSE "-" + // END AS txt_status_backgroundColor + // '), + // 'claim_logs.date', + // 'claim_logs.description', + // 'claim_logs.status' + // ) + // ->orderBy('claim_logs.id', 'desc') + // ->get(); + // $results['timeline'] = $timeline; + // $request_files = DB::table('claim_request_files') + // ->where('claim_request_files.claim_request_id', '=', $claimRequestId) + // ->select( + // 'claim_request_files.*', + // DB::raw('(SELECT files.fileable_id FROM files WHERE files.fileable_id = claim_request_files.claim_request_id AND files.type = claim_request_files.type LIMIT 1) AS check_files'), + // ) + // ->get(); + // $results['request_files'] = $request_files; + // $documents = DB::table('files') + // ->where('fileable_type', 'App\Models\ClaimRequest') + // ->where('fileable_id', $claimRequestId) + // ->select('original_name', \DB::raw("CONCAT('" . env('APP_URL') . "/storage/', path) as path"), 'type') + // ->orderBy('id', 'desc') + // ->get(); + // $results['documents'] = $documents; + // $dialog_submits = DB::table('claim_requests') + // ->leftJoin('members', 'claim_requests.member_id','=', 'members.id') + // ->where('claim_requests.id', $claimRequestId) + // ->select('claim_requests.code', 'members.name', 'claim_requests.submission_date', 'claim_requests.service_code','claim_requests.status') + // ->first(); + // $results['dialog_submits'] = $dialog_submits; - return Helper::responseJson($results); + // return Helper::responseJson($results); + + $claimRequest = ClaimRequest::findOrFail($claimRequestId); + $claimRequest->load([ + 'requestLog', + 'requestLog.organization', + 'requestLog.member', + 'member.currentPlan' => function($memberPlan) { + $memberPlan->join('claim_requests', 'claim_requests.service_code', '=', 'plans.service_code'); + }, + 'requestLog.files', + ]); + + return Helper::responseJson(data: ClaimRequestShowResource::make($claimRequest)); } public function invoiceFiles(Request $request, $claim_id) diff --git a/Modules/Internal/Http/Controllers/Api/ReportLogController.php b/Modules/Internal/Http/Controllers/Api/ReportLogController.php index 2fecc3c2..420a8c43 100644 --- a/Modules/Internal/Http/Controllers/Api/ReportLogController.php +++ b/Modules/Internal/Http/Controllers/Api/ReportLogController.php @@ -104,8 +104,8 @@ class ReportLogController extends Controller */ public function show($id) { - $claimRequest = RequestLog::findOrFail($id); - $claimRequest->load([ + $requestLog = RequestLog::findOrFail($id); + $requestLog->load([ 'histories' => function ($history) { $history->latest(); }, @@ -120,7 +120,7 @@ class ReportLogController extends Controller ]); - return Helper::responseJson(data: RequestLogShowResource::make($claimRequest)); + return Helper::responseJson(data: RequestLogShowResource::make($requestLog)); } /** diff --git a/Modules/Internal/Http/Controllers/Api/RequestLogController.php b/Modules/Internal/Http/Controllers/Api/RequestLogController.php index a2efae0b..c434befc 100644 --- a/Modules/Internal/Http/Controllers/Api/RequestLogController.php +++ b/Modules/Internal/Http/Controllers/Api/RequestLogController.php @@ -439,6 +439,7 @@ class RequestLogController extends Controller 'path' => $pathFile, 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, + 'reason' => $request->reason, ]); } } @@ -876,6 +877,7 @@ class RequestLogController extends Controller 'path' => $pathFile, 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, + 'reason' => $request->reason, ]); } } @@ -891,6 +893,7 @@ class RequestLogController extends Controller 'path' => $pathFile, 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, + 'reason' => $request->reason, ]); } } @@ -906,6 +909,7 @@ class RequestLogController extends Controller 'path' => $pathFile, 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, + 'reason' => $request->reason, ]); } } diff --git a/Modules/Internal/Transformers/ClaimRequestShowResource.php b/Modules/Internal/Transformers/ClaimRequestShowResource.php index 0e07c0bf..e982b4f1 100644 --- a/Modules/Internal/Transformers/ClaimRequestShowResource.php +++ b/Modules/Internal/Transformers/ClaimRequestShowResource.php @@ -5,6 +5,14 @@ namespace Modules\Internal\Transformers; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Str; use App\Models\Service; +use App\Models\MemberPlan; +use App\Models\Plan; +use App\Models\CorporateBenefit; +use App\Models\RequestLogBenefit; +use App\Models\CorporatePolicy; +use App\Models\RequestLogMedicine; +use App\Models\Organization; +use App\Helpers\Helper; class ClaimRequestShowResource extends JsonResource { @@ -17,34 +25,57 @@ class ClaimRequestShowResource extends JsonResource public function toArray($request) { $data = parent::toArray($request); + $corporateId = $data['member']['current_plan']['corporate_id'] ?? 0; + $planMember = MemberPlan::where('member_id', $data['member_id'])->get('plan_id'); - $service = Service::where('code',$data['service_code'])->first(); - if($service){ - $serviceName = $service->name; - } else { - $serviceName = '-'; + $planId = Plan::whereIn('id', $planMember)->where('service_code', $data['service_code'])->first(); + $benefit = CorporateBenefit::with('benefit')->where('plan_id', $planId->id)->get()->toArray(); + $benefitDetailLog = RequestLogBenefit::with('benefit')->where('request_log_id', $data['request_log_id'])->get()->toArray(); + $medicineDetailLog = RequestLogMedicine::where('request_log_id', $data['request_log_id'])->get()->toArray(); + + $benefitData = []; + + if (count($benefit)){ + foreach($benefit as $row){ + array_push($benefitData, $row['benefit']); + } } - $data['service_name'] = $serviceName; + // Policy Number + $policyNumber = CorporatePolicy::query() + ->where('corporate_id', $corporateId) + ->first(); - // Map Histories to Group by Dates - $historiesGroupByDate = $this->histories->mapToGroups(function($history) { - return [$history->created_at->format('Y-m-d') => $history]; - }); - $data['histories_by_date'] = []; - foreach ($historiesGroupByDate as $date => $histories) { - $data['histories_by_date'][] = [ - 'date' => $date, - 'histories' => $histories - ]; - } + + $response = [ + 'id' => $data['id'], + 'code' => $data['code'], + 'request_log_id' => $data['request_log_id'], + 'provider' => $data['request_log']['organization']['name'], + 'member_id' => $data['request_log']['member']['member_id'], + 'policy_number' => $policyNumber->code ? $policyNumber->code : '-', + 'name' => $data['request_log']['member']['name'], + 'date_of_birth' => $data['request_log']['member']['birth_date'], + 'gender' => $data['request_log']['member']['gender'], + 'marital_status' => $data['request_log']['member']['status_marital'], + 'member_type' => Helper::memberType($data['request_log']['member']['record_type']), + 'principal_id' => $data['request_log']['member']['principal_id'] ? $data['request_log']['member']['principal_id'] : '-', + 'principal_name' => $data['request_log']['member']['principal_id'] ? Helper::principalName($data['request_log']['member']['principal_id']) : '-', + 'relation_with_principal' => Helper::relationWithPrincipal($data['request_log']['member']['relation_with_principal']), + 'submission_date' => $data['submission_date'], + 'no_identitas' => $data['request_log']['member']['nric'], + 'keterangan' => $data['request_log']['keterangan'], + 'hak_kamar_pasien' => $data['request_log']['hak_kamar_pasien'], + 'penempatan_kamar' => $data['request_log']['penempatan_kamar'], + 'catatan' => $data['request_log']['catatan'], + 'service_type' => Helper::serviceName( $data['request_log']['service_code']), + 'claim_method' => $data['request_log']['payment_type'], + 'files' => $data['request_log']['files'], + 'benefit' => $benefitData, + 'benefit_data' => $benefitDetailLog, + ]; - // Map Files by type - $filesGroupByType = $this->files->mapToGroups(function($file) { - return [Str::slug($file->type, '_') => $file]; - }); - $data['files_by_type'] = $filesGroupByType; - return $data; + return $response; } } diff --git a/app/Models/ClaimRequest.php b/app/Models/ClaimRequest.php index a46b36c8..cfed961a 100644 --- a/app/Models/ClaimRequest.php +++ b/app/Models/ClaimRequest.php @@ -209,6 +209,11 @@ class ClaimRequest extends Model return $this->hasMany(Claim::class, 'claim_request_id'); } + public function requestLog() + { + return $this->hasOne(RequestLog::class, 'id', 'request_log_id'); + } + public function files() { return $this->morphMany(File::class, 'fileable'); diff --git a/frontend/dashboard/src/pages/ClaimRequests/Components/DialogDeleteFileLog.tsx b/frontend/dashboard/src/pages/ClaimRequests/Components/DialogDeleteFileLog.tsx new file mode 100644 index 00000000..b893a9a4 --- /dev/null +++ b/frontend/dashboard/src/pages/ClaimRequests/Components/DialogDeleteFileLog.tsx @@ -0,0 +1,140 @@ +import MuiDialog from "@/components/MuiDialog"; +import { Autocomplete, Button, Card, Checkbox, DialogActions, Grid, Typography } from "@mui/material"; +import { Paper } from "@mui/material"; +import { Stack } from '@mui/material'; +import React, { useEffect, useState } from 'react'; +import { fDateTimesecond, toTitleCase } from "@/utils/formatTime"; +import axios from "@/utils/axios"; +import { enqueueSnackbar } from "notistack"; +import { useNavigate } from "react-router"; +import { TextField } from "@mui/material"; + + +type DialogDeleteType = { + openDialog: boolean; + setOpenDialog: any; + onSubmit?: void; + id: number|undefined; + path: string; +} + +export default function DialogDeleteFileLog({id, path, setOpenDialog, openDialog,onSubmit} : DialogDeleteType ) { + const style1 = { + color: '#919EAB', + width: '30%' + } + const style2 = { + width: '70%' + } + const marginBottom2 = { + marginBottom: 2, + } + + const handleCloseDialog = () => { + setOpenDialog(false); + resetForm(); + } + + const [isReasonSelected, setIsReasonSelected] = useState(false); + + const reasons = [ + { value: 'Wrong Setting', label: 'Wrong Setting' }, + { value: 'Hospital Request', label: 'Hospital Request' } + ]; + const [formData, setFormData] = useState({ + path: path, + reason: null + }); + + const resetForm = () => { + setFormData({ + reason: null, + path: path + }); + }; + + useEffect(() => { + // Update formData setiap kali approve berubah + setFormData(prevData => ({ + ...prevData, + path: path || '', + })); + }, [path]); + + const handleChange = (field, value) => { + setFormData((prevData) => ({ + ...prevData, + [field]: value, + })); + if (field === 'reason') { + setIsReasonSelected(!!value); + } + + }; + + const handleSubmit = () => { + if (isReasonSelected && formData.reason !== '') { + console.log(formData) + axios + .post(`customer-service/request/${id}/delete_file`, formData) + .then((response) => { + enqueueSnackbar('File LOG has Deleted', { variant: 'success' }); + setOpenDialog(false); + window.location.reload() + }) + .catch(({ response }) => { + enqueueSnackbar(response.data.message ?? 'Something went wrong!', { variant: 'error' }); + }); + } else { + setIsReasonSelected(false); + alert('Silakan pilih alasan sebelum menghapus data.'); + } + + } + + + const getContent = () => ( + + Are you sure to delete this file Final LOG ? +
+ + + Reason* + option.label} + fullWidth + value={reasons.find((r) => r.value === formData.reason) || null} // Use find to match the default value + onChange={(e, newValue) => handleChange('reason', newValue?.value)} + renderInput={(params) => ( + + )} + /> + + + + + + +
+ ); + + + return ( + + ); +} diff --git a/frontend/dashboard/src/pages/ClaimRequests/Components/DialogUploadFileFinalLog.tsx b/frontend/dashboard/src/pages/ClaimRequests/Components/DialogUploadFileFinalLog.tsx new file mode 100644 index 00000000..e70b65a5 --- /dev/null +++ b/frontend/dashboard/src/pages/ClaimRequests/Components/DialogUploadFileFinalLog.tsx @@ -0,0 +1,241 @@ +import { styled } from '@mui/material/styles'; +import Iconify from '@/components/Iconify'; +import { fCurrency } from '@/utils/formatNumber'; +import { LoadingButton } from '@mui/lab'; +import { Avatar, Button, Divider, LinearProgress, linearProgressClasses, ButtonBase, Box } from '@mui/material'; +import { Card, Autocomplete } from '@mui/material'; +import { Stack, Typography } from '@mui/material'; +import { fPostFormat } from '@/utils/formatTime'; +import axios from '@/utils/axios'; +import { enqueueSnackbar } from 'notistack'; +import { useRef, useState, useContext, useEffect } from 'react'; +import { makeFormData } from '@/utils/jsonToFormData'; +import { format } from 'date-fns'; +// import { LanguageContext } from '@/contexts/LanguageContext'; +import { DatePicker, LocalizationProvider, MobileDatePicker } from '@mui/x-date-pickers'; +import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns'; +import TextField from '@mui/material/TextField'; +import MuiDialog from '@/components/MuiDialog'; + +type DialogUploadType = { + openDialog: boolean; + setOpenDialog: any; + onSubmit?: void; + id: number|undefined; +} +export default function DialogUploadFileFinalLog({ id, openDialog, setOpenDialog }: DialogUploadType) { + // ---------------------------------------------------------------------- + // Files Diagnosa + const fileDiagnosaInput = useRef(null); + const [fileDiagnosas, setFileDiagnosas] = useState([]); + const marginBottom2 = { + marginBottom: 2, + } + const reason = [ + { value: 'Wrong Setting', label: 'Wrong Setting' }, + { value: 'Hospital Request', label: 'Hospital Request' } + ]; + const [selectedReason, setSelectedReason] = useState({value:'-', label:''}); + const [error, setError] = useState(''); + const handleDiagnosaInputChange = (event:any) => { + if (event.target.files[0]) { + setFileDiagnosas([...fileDiagnosas, ...event.target.files]); + } else { + console.log('NO FILE'); + } + }; + const removeDiagnosaFiles = (filesState:any, index:any) => { + setFileDiagnosas( + filesState.filter((file:any, fileIndex:any) => { + return fileIndex != index; + }) + ); + }; + + // ---------------------------------------------------------------------- + // Files Result Kondisi + + const fileKondisiInput = useRef(null); + const [fileKondisis, setFileKondisis] = useState([]); + + const handleKondisiInputChange = (event:any) => { + if (event.target.files[0]) { + setFileKondisis([...fileKondisis, ...event.target.files]); + } else { + console.log('NO FILE'); + } + }; + const removeKondisiFiles = (filesState:any, index:any) => { + setFileKondisis( + filesState.filter((file:any, fileIndex:any) => { + return fileIndex != index; + }) + ); + }; + + // ---------------------------------------------------------------------- + // Files Result Hasil Penunjang + + const fileHasilPenunjangInput = useRef(null); + const [fileHasilPenunjangs, setFileHasilPenunjangs] = useState([]); + + const handleResultInputChange = (event:any) => { + if (event.target.files[0]) { + setFileHasilPenunjangs([...fileHasilPenunjangs, ...event.target.files]); + } else { + console.log('NO FILE'); + } + }; + const removeFiles = (filesState:any, index:any) => { + setFileHasilPenunjangs( + filesState.filter((file:any, fileIndex:any) => { + return fileIndex != index; + }) + ); + }; + + // -------------------------------------------------------------- + // Submit Form + const [submitLoading, setSubmitLoading] = useState(false); + function submitRequestFinalLog() { + if(selectedReason.value != '-'){ + setSubmitLoading(true); + const formData = makeFormData({ + request_logs_id: id, + result_files: fileHasilPenunjangs, + diagnosa_files: fileDiagnosas, + kondisi_files: fileKondisis, + reason: selectedReason.value + }); + axios + .post(`/customer-service/request/${id}/add_file`, formData) + .then((response) => { + enqueueSnackbar('Berhasil membuat data', { variant: 'success' }); + setOpenDialog(false); + window.location.reload() + }) + .catch(({ response }) => { + enqueueSnackbar('Something Went Wrong', { variant: 'error' }); + }) + .then(() => { + setSubmitLoading(false); + }); + } else { + setError('Please select a reason') + } + } + + const getContent = () => ( + + } + spacing={4} + sx={{ marginY: 2, marginBottom: 6 }} + > + {/* -------------------------------Upload Dokumen Hasil Penunjang------------------------------- */} + + {/* Hasil Lab, */} + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileHasilPenunjangs && + fileHasilPenunjangs.map((file:any, index:any) => ( + + {file.name} + { + removeFiles(fileHasilPenunjangs, index); + }} + style={{ cursor: 'pointer' }} + > + + ))} + + + {/* { JSON.stringify(filesResult) } */} + fileHasilPenunjangInput.current?.click()}> + + + + Add Files + + + + + Reason for Update* + + option.label} + fullWidth + value={selectedReason} + onChange={(event, newValue) => { + setSelectedReason(newValue); + // Validasi jika newValue adalah null + if (!newValue) { + setError('Please select a reason'); + } else { + setError(''); + } + }} + renderInput={(params) => ( + + )} + /> + + + + + { + submitRequestFinalLog(); + }} + loading={submitLoading} + > + Add + + + ) + return ( + + ); +} diff --git a/frontend/dashboard/src/pages/ClaimRequests/Detail.tsx b/frontend/dashboard/src/pages/ClaimRequests/Detail.tsx index 39aa66ab..c9607120 100644 --- a/frontend/dashboard/src/pages/ClaimRequests/Detail.tsx +++ b/frontend/dashboard/src/pages/ClaimRequests/Detail.tsx @@ -1,5 +1,5 @@ // mui -import { Container, Grid, Stack, Typography, Card, TextField, Divider, ButtonBase, Box, IconButton } from '@mui/material'; +import { Container, Grid, Stack, Typography, Card, TextField, Divider, ButtonBase, Box, IconButton, MenuItem } from '@mui/material'; // components import Page from '../../components/Page'; // utils @@ -8,7 +8,7 @@ import useSettings from '../../hooks/useSettings'; import { useNavigate, useParams, useLocation } from 'react-router-dom'; import { useEffect, useState, useRef } from 'react'; import axios from '../../utils/axios'; -// pages +// pages import DetailTimeline from '../../pages/ClaimRequests/DetailTimeline'; import DetailStepper from '../../pages/ClaimRequests/DetailStepper'; import { format } from 'date-fns'; @@ -19,7 +19,7 @@ import RemoveIcon from '@mui/icons-material/Remove'; import { DatePicker, LocalizationProvider } from '@mui/x-date-pickers'; import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns'; import Iconify from '@/components/Iconify'; -import { fPostFormat } from '@/utils/formatTime'; +import { fDate, fPostFormat } from '@/utils/formatTime'; import InsertDriveFileIcon from '@mui/icons-material/InsertDriveFile'; import DownloadIcon from '@mui/icons-material/Download'; import { Dialog, DialogTitle, DialogContent, DialogActions } from '@mui/material'; @@ -28,279 +28,509 @@ import { fDateTimesecond } from '@/utils/formatTime'; import { makeFormData } from '@/utils/jsonToFormData'; import { enqueueSnackbar } from 'notistack'; +import { DetailClaimRequest } from './Model/Types'; +import { Delete, EditOutlined } from '@mui/icons-material'; +import { fNumber } from '@/utils/formatNumber'; +import palette from '@/theme/palette'; +import MoreMenu from '@/components/MoreMenu'; +import DialogUploadFileFinalLog from './Components/DialogUploadFileFinalLog'; +import DialogDeleteFileLog from './Components/DialogDeleteFileLog'; // ---------------------------------------------------------------------- export default function Detail() { const location = useLocation(); const queryParams = new URLSearchParams(location.search); - const code = queryParams.get('code'); const navigate = useNavigate(); const { themeStretch } = useSettings(); - const [data, setData] = useState(); - const [dataDialog, setDataDialog] = useState(); - const [document, setDocument] = useState(null); + const [claimRequests, setClaimRequest] = useState(); const { id } = useParams(); useEffect(() => { axios - .get('/claim-requests/detail/'+id) + .get('claim-requests/detail/'+id) .then((response) => { - setData(response.data); - setDataDialog(response.data.data.dialog_submits); - setDocument(response.data.data.documents); - + setClaimRequest(response.data.data) }) .catch((error) => { console.error(error); - }); - - }, []); - - const [isInvoiceVisible, setInvoiceVisibility] = useState(false); - - const handleInvoice = () => { - setInvoiceVisibility(!isInvoiceVisible); - } - const currentDate = new Date(); - const formattedCurrentDate = format(currentDate, 'dd MMM yyyy'); - const [dateInvoice, setDateInvoice] = useState(currentDate); - - const fileInvoiceInput = useRef(null); - const [fileInvoices, setFileInvoices] = useState([]); - - const handleInvoiceInputChange = (event) => { - if (event.target.files[0]) { - setFileInvoices([...fileInvoices, ...event.target.files]); - } else { - console.log('NO FILE'); - } - }; - const removeInvoiceFiles = (filesState, index) => { - setFileInvoices( - filesState.filter((file, fileIndex) => { - return fileIndex != index; }) - ); - }; - const date = dateInvoice ? fPostFormat(dateInvoice, 'yyyy-MM-dd') : null; + }, [id]); + + function toTitleCase(str: string | null) { + return str.replace(/\w\S*/g, function(txt) { + return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); + }); + } + + const style1 = { + color: '#919EAB', + width: '30%' + } + const style2 = { + width: '70%' + } + const style3 = { + color: '#919EAB', + width: '35%' + } + const marginBottom1 = { + marginBottom: 1, + } const [openDialogSubmit, setOpenDialogSubmit] = useState(false); const handleCloseDialogSubmit = () => { setOpenDialogSubmit(false); } - const handleSubmitData = () => { - // if(fileInvoices.length > 0) - // { - //submit data - axios - .post('claim-requests/'+id+'/approve') - .then((response) => { - enqueueSnackbar('Success Submit Claim Request', { variant: 'success' }); - setOpenDialogSubmit(false); - }) - .catch(({ response }) => { - enqueueSnackbar(response.data.message ?? 'Something went wrong!', { variant: 'error' }); - }); - //Upload file invoices - const formData = makeFormData({ - date:date, - invoice_files: fileInvoices, - }); - axios - .post('claim-requests/'+id+'/invoice-files', formData) - .then((response) => { - enqueueSnackbar(response.data.message ?? 'Success upload invoice', { variant: 'success' }); - }) - .catch(({ response }) => { - enqueueSnackbar(response.data.message ?? 'Something Went Wrong', { variant: 'error' }); - }); - // } - // else - // { - // enqueueSnackbar('Please upload file invoice, before submit', { variant: 'warning' }); - // } + const [approve, setApprove] = useState(''); - setTimeout(() => - { - window.location.reload(); - }, 5000); + // Handle Delete File LOG + const [pathFile, setPathFile] = useState('') + const [dialogDeleteFIleLog, setDialogDeleteFileLog] = useState(false) - }; - - const check_invoice = document?.find((dataInvoice) => dataInvoice.type === 'claim-invoice'); + // Handle Upload File LOG + const [dialogUploadFileLog, setDialogUploadFileLog] = useState(false) + // Buat total data + const totalAmountIncurred = (claimRequests?.benefit_data || []).reduce((accumulator, item) => { + return accumulator + (item.amount_incurred || 0); + }, 0); + const totalAmountApprove = (claimRequests?.benefit_data || []).reduce((accumulator, item) => { + return accumulator + (item.amount_approved || 0); + }, 0); + const totalAmountNotApprove = (claimRequests?.benefit_data || []).reduce((accumulator, item) => { + return accumulator + (item.amount_not_approved || 0); + }, 0); + const totalExcessPaid = (claimRequests?.benefit_data || []).reduce((accumulator, item) => { + return accumulator + (item.excess_paid || 0); + }, 0); + return ( - - + + - navigate(-1)} sx={{cursor:'pointer'}}/> - {(data && data.data) ? data.data.status.code : ''} - {data ? ( - - Submission Date - {(data && data.data) ? format(new Date(data.data.status.submission_date), "d MMM yyyy") : ''} + navigate(-1)} sx={{cursor:'pointer'}}/> + {(claimRequests && claimRequests.code ? claimRequests.code : '')} - ) : ''} - - {data ? ( + {/* Detail */} - - - - - Format Claim - - - - {check_invoice ? ( - - - Request Claim - - - - ) : ''} - - - - - { - setDateInvoice(newValue); - }} - inputFormat="dd MMM yyyy" - renderInput={(params) => } - /> - - } - spacing={1} - sx={{ marginY: 2 }} - > - {fileInvoices && - fileInvoices.map((file, index) => ( - - - - {file.name ? file.name : '-'} - - { - removeInvoiceFiles(fileInvoices, index); - }} - sx={{cursor: 'pointer'}} - > - - ))} - - fileInvoiceInput.current?.click()}> - - - - Upload Invoice + + + + + Details - - - + + + + Provider Name + {claimRequests?.provider} + + + Member ID + {claimRequests?.member_id} + + + Policy Number + {claimRequests?.policy_number} + + + Name + {claimRequests?.name} + + + Date Of Birth + {claimRequests?.date_of_birth ? fDate(claimRequests?.date_of_birth) : '-'} + + + Marital Status + {claimRequests?.marital_status} + + + Submission Date + {claimRequests?.submission_date ? fDateTimesecond(claimRequests?.submission_date) : '-'} + + + + No KTP + {claimRequests?.no_identitas ? claimRequests?.no_identitas : '-'} + + + Keterangan + {claimRequests?.keterangan ? claimRequests?.keterangan : '-'} + + + Hak Kamar Pasien + {claimRequests?.hak_kamar_pasien ? claimRequests?.hak_kamar_pasien : '-'} + + + Penempatan Kamar + {claimRequests?.penempatan_kamar ? claimRequests?.penempatan_kamar : '-'} + + + Diagnosis + + {claimRequests?.diagnosis?.length > 0 ? ( +
    + {claimRequests?.diagnosis.map((diagnosisItem, index) => ( +
  • {diagnosisItem.code} - {diagnosisItem.name}
  • + // Replace 'name' with the property you want to display + ))} +
+ ) : ( +

No diagnosis available.

+ )} +
- - + + {/* Service */} + + + Service + + Service Type + {claimRequests?.service_type} + + + Claim Method + {toTitleCase(claimRequests?.claim_method ?? '-')} + + + + {/* Document */} - - {dataDialog && dataDialog.status === 'requested' ? ( - <> - - - - ) : ''} - {/* Dialog Submits */} - - - - - Confirmation - - - - + + + + Document - - - {dataDialog ? ( - - Are you sure to submit this claim ? - - - Code - {dataDialog.code} - - - Name - {dataDialog.name} - - - Date Submission - {fDateTimesecond(dataDialog.submission_date)} - - - Claim Method - Service Type - - - Service Type - - {dataDialog.service_code === 'IP' ? 'Inpatient' : 'Outpatient'} - - - + + + + + {claimRequests?.files?.map((documentType, index) => ( + + + + + + {documentType.original_name ? documentType.original_name : '-'} + - ) : ''} - - - - - - - + + { + setDialogDeleteFileLog(true) + setPathFile(documentType.path) + }} aria-label="delete" size="small" sx={{ marginLeft: 'auto' }}> + + + + + ))} + + + + + + + + {/* Benefit */} + + + + Benefit + + + + + {claimRequests?.benefit_data?.map((item, index) => ( + + + + + + {item.benefit?.description} + + + + + { + // setDialogEditBenefit(true) + // setIdBenefitData(item.id) + // setBenefitConfigurationData(item) + }} + > + + Edit + + { + // setIdBenefitData(item.id) + // setDialogDeleteBenefit(true) + }} + > + + Delete + + + } /> + + + + + + + + {/* Amount Incurred */} + + + + + Amount Incurred + + + + + {fNumber(item.amount_incurred)} + + + + + + {/* Amount Approved */} + + + + + Amount Approved + + + + + {fNumber(item.amount_approved)} + + + + + + {/* Amount Not Approved */} + + + + + Amount Not Approved + + + + + {fNumber(item.amount_not_approved)} + + + + + + {/* Excess Paid* */} + + + + + Excess Paid* + + + + + {fNumber(item.excess_paid)} + + + + + + {/* Keterangan* */} + + + + + Keterangan* + + + + + {item.keterangan} + + + + + + + + + + + ))} +
+
+ {claimRequests?.benefit_data && claimRequests.benefit_data.length > 0 ? ( + + + + + + + Total Benefit + + + + + + + + + + {/* Amount Incurred */} + + + + + Amount Incurred + + + + + {fNumber(totalAmountIncurred)} + + + + + + {/* Amount Approved */} + + + + + Amount Approved + + + + + {fNumber(totalAmountApprove)} + + + + + + {/* Amount Not Approved */} + + + + + Amount Not Approved + + + + + {fNumber(totalAmountNotApprove)} + + + + + + {/* Excess Paid* */} + + + + + Excess Paid + + + + + {fNumber(totalExcessPaid)} + + + + + + + + + + ) + : ( + null + )} +
+
+ + {/* PR Buat pindahin ke componen */} + {/* + + */} + {/* + {/* Dialog Edit */} + {/* */} + + {/* Dialog Delete */} + {/* */} + + {/* Dialog Edit Detai; */} + {/* */}
- ) : ''} +
-
- ); +
+ ) } diff --git a/frontend/dashboard/src/pages/ClaimRequests/Model/Types.tsx b/frontend/dashboard/src/pages/ClaimRequests/Model/Types.tsx index 81b7da49..cf9295eb 100644 --- a/frontend/dashboard/src/pages/ClaimRequests/Model/Types.tsx +++ b/frontend/dashboard/src/pages/ClaimRequests/Model/Types.tsx @@ -23,3 +23,61 @@ export type ServiceType = { code : string name : string } + +export type DetailClaimRequest = { + id : number, + code : string, + member_id : string, + policy_number : string, + name : string, + date_of_birth : string, + gender : string, + marital_status : string, + submission_date : string, + service_type : string, + claim_method : string, + no_identitas : string, + keterangan : string, + hak_kamar_pasien : string, + penempatan_kamar : string, + provider : string, + status : string, + request_log_id : number, + benefit : Benefit[], + reason : string, + files : file[], + benefit_data : BenefitData[], + diagnosis : Diagnosis[], +} + +export type Benefit = { + code: string, + description: string +} + +export type BenefitData = { + amount_incurred : number, + amount_approved : number, + amount_not_approved : number, + excess_paid : number, + keterangan : string, + benefit : Benefit, + request_log_id : number, + benefit_name : string, + description : string, + id : number, +} + +export type Diagnosis = { + id : number, + name : string, + code : string +} + +export type file = { + original_name: string, + name: string, + path: string, + url: string, +} +