diff --git a/Modules/Client/Http/Controllers/Api/ClaimController.php b/Modules/Client/Http/Controllers/Api/ClaimController.php index 8e0fd282..6935c5e4 100644 --- a/Modules/Client/Http/Controllers/Api/ClaimController.php +++ b/Modules/Client/Http/Controllers/Api/ClaimController.php @@ -336,7 +336,9 @@ class ClaimController extends Controller 'request_logs.member_id', 'request_logs.service_code', 'request_logs.code', - 'request_logs.diagnosis' + 'request_logs.diagnosis', + 'request_logs.keterangan', + 'request_logs.catatan' ) ->orderBy('request_logs.submission_date') ->get(); diff --git a/Modules/Internal/Http/Controllers/Api/OptionController.php b/Modules/Internal/Http/Controllers/Api/OptionController.php index 2d46b506..51608ea8 100644 --- a/Modules/Internal/Http/Controllers/Api/OptionController.php +++ b/Modules/Internal/Http/Controllers/Api/OptionController.php @@ -20,7 +20,7 @@ class OptionController extends Controller { $request->validate([ 'type' => 'required', - 'search' => 'required' + // 'search' => 'required' ]); switch ($request->type) { diff --git a/Modules/Internal/Http/Controllers/Api/RequestLogController.php b/Modules/Internal/Http/Controllers/Api/RequestLogController.php index 06e6b84d..e8e2ec81 100644 --- a/Modules/Internal/Http/Controllers/Api/RequestLogController.php +++ b/Modules/Internal/Http/Controllers/Api/RequestLogController.php @@ -5,6 +5,7 @@ namespace Modules\Internal\Http\Controllers\Api; use App\Helpers\Helper; use App\Models\RequestLog; use App\Models\Organization; +use App\Models\Icd; use App\Services\ClaimService; use App\Services\ImportService; use Illuminate\Contracts\Support\Renderable; @@ -193,6 +194,20 @@ class RequestLogController extends Controller return Helper::responseJson(data: RequestLogShowResource::make($claimRequest)); } + public function diagnosis(){ + $icds = Icd::query() + ->get(); + + $manipulatedIcds = $icds->map(function ($icd) { + // Contoh manipulasi, tambahkan atau ubah properti sesuai kebutuhan + return [ + 'value' => $icd->code, // Ganti dengan properti yang sesuai dari model Icd + 'label' => $icd->code . ' - ' .$icd->name, // Ganti dengan properti yang sesuai dari model Icd + ]; + }); + return Helper::responseJson(data: $manipulatedIcds); + } + /** * Show the form for editing the specified resource. * @param int $id @@ -366,14 +381,32 @@ class RequestLogController extends Controller // Update Request LOG untuk lanjut ke Final LOG - $requestLog->catatan = $request->catatan; + if (!empty($request->catatan)) { + $requestLog->catatan = $request->catatan; + } + if ($request->discharge_date) { + $requestLog->discharge_date = $request->discharge_date; + } + if (!empty($request->icdCodes)) { + $diagnosis = implode(',', $request->icdCodes); + + $requestLog->diagnosis = $diagnosis; + } + if (!empty($request->status)) { + $requestLog->status_final_log = $status; + } + + if (!empty($request->reason)) { + $requestLog->reason_final = $request->reason; + } + $requestLog->final_log = 1; - $requestLog->status_final_log = $status; $requestLog->approved_final_log_by = auth()->user()->id; $requestLog->approved_final_log_at = Carbon::now(); - if($requestLog->service_code != 'IP'){ - $requestLog->discharge_date = Carbon::now(); - } + // if($requestLog->service_code != 'IP'){ + // $requestLog->discharge_date = Carbon::now(); + // } + $requestLog->save(); diff --git a/Modules/Internal/Routes/api.php b/Modules/Internal/Routes/api.php index 86bde176..30556c0e 100644 --- a/Modules/Internal/Routes/api.php +++ b/Modules/Internal/Routes/api.php @@ -263,7 +263,10 @@ Route::prefix('internal')->group(function () { Route::get('customer-service/request/data', [RequestLogController::class, 'generateDataRequestLogExcel']); Route::post('customer-service/request/final-log', [RequestLogController::class, 'updateFinalLog']); - + + // search diagnosis + Route::get('diagnosis', [RequestLogController::class, 'diagnosis']); + // insert benefit Route::post('customer-service/request/insert-benefit', [RequestLogBenefitController::class, 'store']); Route::delete('customer-service/request/benefit_data/{id}', [RequestLogBenefitController::class, 'destroy']); diff --git a/Modules/Internal/Transformers/RequestLogShowResource.php b/Modules/Internal/Transformers/RequestLogShowResource.php index 91a98752..3b7e774f 100644 --- a/Modules/Internal/Transformers/RequestLogShowResource.php +++ b/Modules/Internal/Transformers/RequestLogShowResource.php @@ -82,11 +82,21 @@ class RequestLogShowResource extends JsonResource ->where('corporate_id', $corporateId) ->first(); + // Diagnosis + $icd = []; + if($requestLog['diagnosis']){ + $diagnosis = explode(',', $requestLog['diagnosis']); + $icd = Icd::query() + ->whereIn('code', $diagnosis) + ->select('code', 'name') + ->get(); + } $data = [ 'id' => $requestLog['id'], 'code' => $requestLog['code'], 'member_id' => $requestLog['member']['member_id'], + 'corporate_id' => $corporateId, 'policy_number' =>$policyNumber->code ? $policyNumber->code : '-', 'name' => $requestLog['member']['name'], 'date_of_birth' => $requestLog['member']['birth_date'], @@ -97,6 +107,7 @@ class RequestLogShowResource extends JsonResource 'principal_name' => $requestLog['member']['principal_id'] ? Helper::principalName($requestLog['member']['principal_id']) : '-', 'relation_with_principal' => Helper::relationWithPrincipal($requestLog['member']['relation_with_principal']), 'submission_date' => $requestLog['submission_date'], + 'discharge_date' => $requestLog['discharge_date'], 'service_type' => Helper::serviceName($requestLog['service_code']), 'claim_method' => $requestLog['payment_type'], 'status' => $requestLog['status'], @@ -114,7 +125,7 @@ class RequestLogShowResource extends JsonResource 'penempatan_kamar' => $requestLog['penempatan_kamar'], 'catatan' => $requestLog['catatan'], 'reason' => $requestLog['reason'], - + 'diagnosis' => $icd, ]; diff --git a/app/Models/RequestLog.php b/app/Models/RequestLog.php index def92923..62165f5b 100644 --- a/app/Models/RequestLog.php +++ b/app/Models/RequestLog.php @@ -39,6 +39,7 @@ class RequestLog extends Model 'diagnosis', 'code', 'reason', + 'reason_final', 'approved_by', 'approved_at', 'approved_final_log_by', diff --git a/database/migrations/2024_01_23_165408_add_column_reason_final_to_request_logs.php b/database/migrations/2024_01_23_165408_add_column_reason_final_to_request_logs.php new file mode 100644 index 00000000..ff941b4a --- /dev/null +++ b/database/migrations/2024_01_23_165408_add_column_reason_final_to_request_logs.php @@ -0,0 +1,32 @@ +string('reason_final')->after('reason')->default(null); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('request_logs', function (Blueprint $table) { + $table->dropColumn('reason_final'); + }); + } +}; diff --git a/frontend/dashboard/src/pages/CustomerService/Components/CardDetail.tsx b/frontend/dashboard/src/pages/CustomerService/Components/CardDetail.tsx deleted file mode 100644 index 7faf7ed8..00000000 --- a/frontend/dashboard/src/pages/CustomerService/Components/CardDetail.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import { Card, Typography } from "@mui/material"; -import { Stack } from '@mui/material'; -import { DetailFinalLogType } from "../FinalLog/Model/Types"; -import { fDate, fDateTimesecond, toTitleCase } from "@/utils/formatTime"; - - -type CardDetail = { - requestLog: DetailFinalLogType|undefined; -} - -const style1 = { - color: '#919EAB', - width: '30%' -} -const style2 = { - width: '70%' -} -const marginBottom1 = { - marginBottom: 1, -} -const marginBottom2 = { - marginBottom: 2, -} - - -export default function CardDetail({requestLog} : CardDetail ) { - return ( - - Detail - - Provider - {requestLog?.provider} - - - Member ID - {requestLog?.member_id} - - - Policy Number - {requestLog?.policy_number} - - - Name - {requestLog?.name} - - - Date Of Birth - {requestLog?.date_of_birth ? fDate(requestLog?.date_of_birth) : '-'} - - - Marital Status - {requestLog?.marital_status} - - - Submission Date - {requestLog?.submission_date ? fDateTimesecond(requestLog?.submission_date) : '-'} - - - - No KTP - {requestLog?.no_identitas ? requestLog?.no_identitas : '-'} - - - Keterangan - {requestLog?.keterangan ? requestLog?.keterangan : '-'} - - - Hak Kamar Pasien - {requestLog?.hak_kamar_pasien ? requestLog?.hak_kamar_pasien : '-'} - - - Penempatan Kamar - {requestLog?.penempatan_kamar ? requestLog?.penempatan_kamar : '-'} - - - Catatan - {requestLog?.catatan ? requestLog?.catatan : '-'} - - - ) - -} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogConfirmation.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogConfirmation.tsx index a6d6b5de..4ff76dd6 100644 --- a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogConfirmation.tsx +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogConfirmation.tsx @@ -1,10 +1,10 @@ import MuiDialog from "@/components/MuiDialog"; -import { Button, Card, Checkbox, DialogActions, Grid, TextField, Typography } from "@mui/material"; +import { Autocomplete, Button, Card, Checkbox, DialogActions, Grid, TextField, Typography } from "@mui/material"; import { Paper } from "@mui/material"; import { Stack } from '@mui/material'; import React, { useEffect, useState } from 'react'; import { DetailFinalLogType } from "../Model/Types"; -import { fDateTimesecond, toTitleCase } from "@/utils/formatTime"; +import { fDateOnly, fDateTimesecond, toTitleCase } from "@/utils/formatTime"; import axios from "@/utils/axios"; import { enqueueSnackbar } from "notistack"; import { useNavigate } from "react-router"; @@ -22,11 +22,29 @@ export default function DialogConfirmation({requestLog, setOpenDialog, openDialo const navigate = useNavigate(); const [formData, setFormData] = useState({ + discharge_date: requestLog?.discharge_date, id: requestLog?.id, status: approve || '', catatan: '', + icdCodes: requestLog?.diagnosis.length ? requestLog.diagnosis.map(diagnosis => ({ value: diagnosis.id, label: diagnosis.name })) : [] }); + + const [icdOptions, setIcdOptions] = useState([ + { value: '-', label: '-' } + ]); + useEffect(() => { + // Ambil data dari API dan atur opsi ICD + axios.get('diagnosis') + .then((response) => { + setIcdOptions(response.data.data); + }) + .catch((error) => { + console.error('Error fetching ICD options:', error); + }); + }, []); // useEffect dijalankan hanya sekali saat komponen dimount + + useEffect(() => { // Update formData setiap kali approve berubah setFormData(prevData => ({ @@ -87,6 +105,8 @@ export default function DialogConfirmation({requestLog, setOpenDialog, openDialo setOpenDialog(false); } + + const getContent = () => ( Are you sure to {approve == 'approved' ? 'approve' : 'deciline'} this final log ? @@ -119,6 +139,17 @@ export default function DialogConfirmation({requestLog, setOpenDialog, openDialo + + Discharge Date + handleChange('discharge_date', e.target.value)} + /> + Catatan handleChange('catatan', e.target.value)} /> + + Diagnosis ICD - X + option.label} + fullWidth + value={icdOptions.filter((icd) => formData.icdCodes.includes(icd.value))} + onChange={(e, newValues) => handleChange('icdCodes', newValues.map((value) => value.value))} + renderInput={(params) => ( + + )} + /> + diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogEditFinalLOG.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogEditFinalLOG.tsx new file mode 100644 index 00000000..f7a61920 --- /dev/null +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogEditFinalLOG.tsx @@ -0,0 +1,261 @@ +import MuiDialog from "@/components/MuiDialog"; +import { Autocomplete, Button, Card, Checkbox, DialogActions, Grid, TextField, Typography } from "@mui/material"; +import { Paper } from "@mui/material"; +import { Stack } from '@mui/material'; +import React, { useEffect, useState } from 'react'; +import { DetailFinalLogType } from "../Model/Types"; +import { fDateOnly, fDateTimesecond, toTitleCase } from "@/utils/formatTime"; +import axios from "@/utils/axios"; +import { enqueueSnackbar } from "notistack"; +import { useNavigate } from "react-router"; + + +type DialogConfirmationType = { + openDialog: boolean; + setOpenDialog: any; + onSubmit?: void; + requestLog: DetailFinalLogType|undefined; +} + +export default function DialogEditFinalLOG({requestLog, setOpenDialog, openDialog, onSubmit} : DialogConfirmationType ) { + + const navigate = useNavigate(); + const [formData, setFormData] = useState({ + discharge_date: requestLog?.discharge_date, + id: requestLog?.id, + catatan: requestLog?.catatan, + icdCodes: requestLog?.diagnosis + ? requestLog?.diagnosis.map(diagnosis => diagnosis.code) + : [], + reason: requestLog?.reason + }); + + const [icdOptions, setIcdOptions] = useState([ + { value: '-', label: '-' } + ]); + + useEffect(() => { + // Ambil data dari API dan atur opsi ICD + axios.get('diagnosis') + .then((response) => { + setIcdOptions(response.data.data); + }) + .catch((error) => { + console.error('Error fetching ICD options:', error); + }); + }, []); // useEffect dijalankan hanya sekali saat komponen dimount + + useEffect(() => { + if (requestLog) { + setFormData({ + discharge_date: requestLog.discharge_date, + id: requestLog.id, + catatan: requestLog.catatan, + icdCodes: requestLog.diagnosis + ? requestLog.diagnosis.map(diagnosis => diagnosis.code) + : [], + reason: requestLog.reason + }); + } + }, [requestLog]); + + const handleChange = (field, value) => { + setFormData((prevData) => ({ + ...prevData, + [field]: value, + })); + if (field === 'reason') { + setIsReasonSelected(!!value); + } + + }; + + const handleApprove = () => { + setFormData((prevData) => ({ + ...prevData, + })); + handleSubmit(); + }; + + + const handleSubmit = () => { + if (isReasonSelected && formData.reason !== '') { + axios + .post(`customer-service/request/final-log`, formData) + .then((response) => { + enqueueSnackbar('Verification Request LOG Success', { variant: 'success' }); + setOpenDialog(false); + if (requestLog?.service_type == 'Inpatient'){ + navigate('/case_management/inpatient_monitoring'); + } else { + navigate('/custormer-service/final-log'); + } + }) + .catch(({ response }) => { + enqueueSnackbar(response.data.message ?? 'Something went wrong!', { variant: 'error' }); + }); + } else { + setIsReasonSelected(false); + alert('Silakan pilih alasan sebelum mengirimkan data.'); + } + } + + + const style1 = { + color: '#919EAB', + width: '30%' + } + const style2 = { + width: '70%' + } + const marginBottom1 = { + marginBottom: 1, + } + const marginBottom2 = { + marginBottom: 2, + } + + const resetForm = () => { + setFormData({ + discharge_date: requestLog?.discharge_date, + id: requestLog?.id, + catatan: requestLog?.catatan, + icdCodes: requestLog?.diagnosis + ? requestLog?.diagnosis.map(diagnosis => diagnosis.code) + : [], + reason: requestLog?.reason + }); + }; + + const [isReasonSelected, setIsReasonSelected] = useState(true); + + const handleCloseDialog = () => { + setOpenDialog(false); + resetForm(); + } + + const reasons = [ + { value: 'agreement', label: 'Agreement changed' }, + { value: 'endorsement', label: 'Endorsement' }, + { value: 'renewal', label: 'Renewal' }, + { value: 'wrong_setting', label: 'Wrong Setting' }, + // Add more options as needed + ]; + + + + const getContent = () => ( + + Are you sure to edit this final log ? + + + + Member ID + {requestLog?.member_id} + + + Policy Number + {requestLog?.policy_number} + + + Name + {requestLog?.name} + + + Submission Date + {requestLog?.submission_date ? fDateTimesecond(requestLog?.submission_date) : '-'} + + + Claim Method + {requestLog?.claim_method ? toTitleCase(requestLog?.claim_method) : '-'} + + + Service Type + {requestLog?.service_type} + + + + + + Discharge Date + handleChange('discharge_date', e.target.value)} + /> + + + Catatan + handleChange('catatan', e.target.value)} + /> + + + Diagnosis ICD - X + option.label} + fullWidth + value={icdOptions.filter((icd) => formData.icdCodes.includes(icd.value))} + onChange={(e, newValues) => { + const selectedCodes = newValues.map((value) => value.value); + setFormData({ ...formData, icdCodes: selectedCodes }); + }} + renderInput={(params) => ( + + )} + /> + + + 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 ( + + ); +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Detail.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Detail.tsx index 080a8885..3dd6be43 100644 --- a/frontend/dashboard/src/pages/CustomerService/FinalLog/Detail.tsx +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Detail.tsx @@ -54,6 +54,7 @@ import { fNumber } from '@/utils/formatNumber'; import palette from '@/theme/palette'; import CardMedicine from '../Components/CardMedicine'; import CardFile from '../Components/CardFile'; +import DialogEditFinalLOG from './Components/DialogEditFinalLOG'; // ---------------------------------------------------------------------- @@ -84,6 +85,10 @@ export default function Detail() { color: '#919EAB', width: '30%' } + const style3 = { + color: '#919EAB', + width: '35%' + } const style2 = { width: '70%' } @@ -95,7 +100,7 @@ export default function Detail() { } const [openDialogSubmit, setOpenDialogSubmit] = useState(false); - const [openDialogHospital, setDialogHospital] = useState(false); + const [openDialogEditDetail, setDialogDEditDetail] = useState(false); const [openDialogBenefit, setDialogBenefit] = useState(false); const [openDialogMedicine, setDialogMedicine] = useState(false); @@ -121,10 +126,104 @@ export default function Detail() { {/* Detail */} - + + + + Detail + + + + + { + setDialogDEditDetail(true) + }}> + + Edit + + + } + /> + + + + + Provider + {requestLog?.provider} + + + Member ID + {requestLog?.member_id} + + + Policy Number + {requestLog?.policy_number} + + + Name + {requestLog?.name} + + + Date Of Birth + {requestLog?.date_of_birth ? fDate(requestLog?.date_of_birth) : '-'} + + + Marital Status + {requestLog?.marital_status} + + + Submission Date + {requestLog?.submission_date ? fDateTimesecond(requestLog?.submission_date) : '-'} + + + + Discharge Date + {requestLog?.discharge_date ? fDateTimesecond(requestLog?.discharge_date) : '-'} + + + + No KTP + {requestLog?.no_identitas ? requestLog?.no_identitas : '-'} + + + Keterangan + {requestLog?.keterangan ? requestLog?.keterangan : '-'} + + + Hak Kamar Pasien + {requestLog?.hak_kamar_pasien ? requestLog?.hak_kamar_pasien : '-'} + + + Penempatan Kamar + {requestLog?.penempatan_kamar ? requestLog?.penempatan_kamar : '-'} + + + Catatan + {requestLog?.catatan ? requestLog?.catatan : '-'} + + + Diagnosis + + {requestLog?.diagnosis?.length > 0 ? ( +
    + {requestLog.diagnosis.map((diagnosisItem, index) => ( +
  • {diagnosisItem.code} - {diagnosisItem.name}
  • + // Replace 'name' with the property you want to display + ))} +
+ ) : ( +

No diagnosis available.

+ )} +
+
+ {/* -
+ openDialog={openDialogEdit} + /> */} +
{/* Service */} @@ -138,10 +237,10 @@ export default function Detail() { {/* Exclusion */} - - + */} {/* Hospital Care */} @@ -313,7 +412,6 @@ export default function Detail() { > */} - + /> - {/* Dialog Delete */} + + {/* Dialog Edit Detai; */} +
{/* Medicine */} diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Model/Types.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Model/Types.tsx index bad6c293..fe0aeefb 100644 --- a/frontend/dashboard/src/pages/CustomerService/FinalLog/Model/Types.tsx +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Model/Types.tsx @@ -45,6 +45,9 @@ export type DetailFinalLogType = { hak_kamar_pasien : string, penempatan_kamar : string, catatan : string, + discharge_date : string, + reason : string, + diagnosis : Diagnosis[], benefit : Benefit[], benefit_data : BenefitData[], config_service : ConfigService, @@ -53,6 +56,12 @@ export type DetailFinalLogType = { files : file[], } +export type Diagnosis = { + id : number, + name : string, + code : string +} + export type BenefitData = { amount_incurred : number, amount_approved : number,