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
- } sx={{marginLeft: 'auto'}}>
- Import
-
-
-
- {check_invoice ? (
-
-
- Request Claim
- : < AddIcon/>} sx={{marginLeft: 'auto'}} onClick={() => handleInvoice()}>
- Invoice
-
-
-
- ) : ''}
-
-
-
-
- {
- 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 */}
-
-
+
+ {
+ setDialogDeleteFileLog(true)
+ setPathFile(documentType.path)
+ }} aria-label="delete" size="small" sx={{ marginLeft: 'auto' }}>
+
+
+
+
+ ))}
+
+
+
+
+
+
+
+ {/* Benefit */}
+
+
+
+ Benefit
+
+
+
+
+ {claimRequests?.benefit_data?.map((item, index) => (
+
+
+
+
+
+ {item.benefit?.description}
+
+
+
+
+
+
+ >
+ } />
+
+
+
+
+
+
+
+ {/* 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,
+}
+