From 5bd21950811ba0b3b36f0df0dd9033cfe4769d1b Mon Sep 17 00:00:00 2001 From: ivan-sim Date: Wed, 6 Mar 2024 11:14:45 +0700 Subject: [PATCH 1/7] Update import --- Modules/Internal/Http/Controllers/Api/ClaimController.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Modules/Internal/Http/Controllers/Api/ClaimController.php b/Modules/Internal/Http/Controllers/Api/ClaimController.php index 832cddc3..b29e3f86 100644 --- a/Modules/Internal/Http/Controllers/Api/ClaimController.php +++ b/Modules/Internal/Http/Controllers/Api/ClaimController.php @@ -146,7 +146,9 @@ class ClaimController extends Controller $affectedRows = DB::table('claim_requests') ->where('code','=', $row['code']) ->where('claim_management','=', 1) + ->where('status_claim_management.status', '=', 'received') ->update([ + 'status' => $row['qc'] == 'Y' ? 'approved' : 'declined', 'status_claim_management' => $row['qc'] == 'Y' ? 'approved' : 'declined', 'reason_decline' => $row['reason'] ? $row['reason'] : null, 'approval_by_claim_management' => auth()->user()->id, From bc95fbd51c7e9cf9a87c585a6c40b21e3e7a425e Mon Sep 17 00:00:00 2001 From: Tb Fajri Date: Wed, 6 Mar 2024 11:58:23 +0700 Subject: [PATCH 2/7] update header reason --- app/Models/ClaimRequest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Models/ClaimRequest.php b/app/Models/ClaimRequest.php index 61b7fcf3..8806f646 100644 --- a/app/Models/ClaimRequest.php +++ b/app/Models/ClaimRequest.php @@ -60,7 +60,7 @@ class ClaimRequest extends Model "Amt Approved" => "amount_apporve", "Amt Not Approved" => "amount_not_apporve", "Excess Paid" => "excess_paid", - "Reason" => "reason", + // "Reason" => "reason", "QC" => "qc", ]; From 44c8e3e5f38ce5edc2c833c57afbc800f234a591 Mon Sep 17 00:00:00 2001 From: ivan-sim Date: Thu, 7 Mar 2024 10:21:38 +0700 Subject: [PATCH 3/7] Update --- .../Http/Controllers/Api/ClaimController.php | 47 ++++++++++++++++--- frontend/dashboard/src/pages/Claims/List.tsx | 29 ++++++------ 2 files changed, 55 insertions(+), 21 deletions(-) diff --git a/Modules/Internal/Http/Controllers/Api/ClaimController.php b/Modules/Internal/Http/Controllers/Api/ClaimController.php index b29e3f86..5b33b40c 100644 --- a/Modules/Internal/Http/Controllers/Api/ClaimController.php +++ b/Modules/Internal/Http/Controllers/Api/ClaimController.php @@ -139,6 +139,7 @@ class ClaimController extends Controller $processedData = $this->processCategoryNames($data); $importedRows = 0; + $result_rows = []; $failedRows = []; foreach ($processedData as $row) { @@ -146,7 +147,7 @@ class ClaimController extends Controller $affectedRows = DB::table('claim_requests') ->where('code','=', $row['code']) ->where('claim_management','=', 1) - ->where('status_claim_management.status', '=', 'received') + ->where('claim_requests.status_claim_management', '=', 'received') ->update([ 'status' => $row['qc'] == 'Y' ? 'approved' : 'declined', 'status_claim_management' => $row['qc'] == 'Y' ? 'approved' : 'declined', @@ -156,11 +157,39 @@ class ClaimController extends Controller ]); if ($affectedRows === 0) { + $check_status = DB::table('claim_requests') + ->where('code','=', $row['code']) + ->where('claim_management','=', 1) + ->select('status_claim_management') + ->first(); + if($check_status) + { + $row['error'] = 'Gagal update karena Status Claim sudah '.$check_status->status_claim_management; + } + else{ + $row['error'] = 'Gagal update karena Code tidak sesuai'; + } + $row['code_error'] = '500'; + $result_rows[] = $row; $failedRows[] = $row; } else { $importedRows += $affectedRows; + $row['code_error'] = '200'; + $row['error'] = 'Sukses'; + $result_rows[] = $row; } } catch (\Exception $e) { + $row['code_error'] = '500'; + $row['error'] = $e->getMessage(); + if(!$row['code']) + { + $row['error'] = 'Kolom Code wajib isi'; + } + if(!$row['qc']) + { + $row['error'] = 'Kolom QC wajib isi'; + } + $result_rows[] = $row; $failedRows[] = $row; } } @@ -170,7 +199,7 @@ class ClaimController extends Controller 'data' => [ 'total_success_row' => $importedRows, 'total_failed_row' => count($failedRows), - 'failed_rows' => $failedRows, + 'result_rows' => $result_rows, ], ]; @@ -377,11 +406,13 @@ class ClaimController extends Controller public function exportFiled(Request $request) { $writer = WriterEntityFactory::createXLSXWriter(); - $writer->openToFile(public_path('files/Report-Data-Filed-Import.xlsx')); + $writer->openToFile(public_path('files/Report-Data-Result-Import.xlsx')); $header = [ 'Code*', 'QC*', - 'Reason' + 'Reason', + 'Ingest Code', + 'Ingest Note' ]; $style = (new StyleBuilder()) ->setFontBold() @@ -402,7 +433,9 @@ class ClaimController extends Controller $rowData = [ $item['code'], $item['qc'], - $item['reason'] + $item['reason'], + $item['code_error'], + $item['error'] ]; $style = (new StyleBuilder()) //->setFontBold() @@ -435,8 +468,8 @@ class ClaimController extends Controller $writer->close(); return Helper::responseJson([ - 'file_name' => 'Report-Data-Filed-Import', - "file_url" => url('files/Report-Data-Filed-Import.xlsx') + 'file_name' => 'Report-Data-Result-Import', + "file_url" => url('files/Report-Data-Result-Import.xlsx') ]); } public function getProvider(Request $request) diff --git a/frontend/dashboard/src/pages/Claims/List.tsx b/frontend/dashboard/src/pages/Claims/List.tsx index 5de5511c..b18793f7 100644 --- a/frontend/dashboard/src/pages/Claims/List.tsx +++ b/frontend/dashboard/src/pages/Claims/List.tsx @@ -397,7 +397,7 @@ const dummyServices = [ const [anchorEl, setAnchorEl] = React.useState(null); const createMenu = Boolean(anchorEl); - const importHospital = useRef(null); + const importClaimManagement = useRef(null); const [currentImportFileName, setCurrentImportFileName] = useState(null); const [importLoading, setImportLoading] = useState(false); const [importResult, setImportResult] = useState(null); @@ -408,18 +408,18 @@ const dummyServices = [ setAnchorEl(null); }; const handleImportButton = () => { - if (importHospital?.current) { + if (importClaimManagement?.current) { handleClose(); - importHospital.current ? importHospital.current.click() : console.log('No File selected'); + importClaimManagement.current ? importClaimManagement.current.click() : console.log('No File selected'); } else { alert('No file selected'); } }; const handleCancelImportButton = () => { - if(importHospital.current) + if(importClaimManagement.current) { - importHospital.current.value = ''; - importHospital.current.dispatchEvent(new Event('change', { bubbles: true })); + importClaimManagement.current.value = ''; + importClaimManagement.current.dispatchEvent(new Event('change', { bubbles: true })); } }; const handleImportChange = (event: any) => { @@ -430,11 +430,11 @@ const dummyServices = [ } }; const handleUpload = () => { - if(importHospital.current && importHospital.current.files) + if(importClaimManagement.current && importClaimManagement.current.files) { - if (importHospital.current?.files.length) { + if (importClaimManagement.current?.files.length) { const formData = new FormData(); - formData.append('file', importHospital.current?.files[0]); + formData.append('file', importClaimManagement.current?.files[0]); setImportLoading(true); axios .post('claims/import', formData) @@ -443,7 +443,7 @@ const dummyServices = [ loadDataTableData(); setImportResult(response.data); setImportLoading(false); - enqueueSnackbar('Success Import Hospitals', { variant: 'success' }); + enqueueSnackbar('Success Import Claim Managemenet', { variant: 'success' }); }) .catch((response) => { enqueueSnackbar( @@ -474,7 +474,7 @@ const dummyServices = [ const handleExportReportFiled = async () => { await axios - .post('claims/exportFiled', { params: importResult?.data.failed_rows }) + .post('claims/exportFiled', { params: importResult?.data.result_rows }) .then((res) => { enqueueSnackbar('Data berhasil di Export', { variant: 'success', @@ -792,7 +792,7 @@ const handleExportReportFiled = async () => { { {importResult.data.total_failed_row} {' '} - Failed + Failed, {/* {importResult.data.failed_rows.map((row, index) => ( [Code={row.code ? row.code : 'Required'}] ))} */} -  Download Data Filed +  Report: +  Download Data Result Import )} From e1bab4dd8e3541a634a82c23d61e19ce3b6dda3b Mon Sep 17 00:00:00 2001 From: Tb Fajri Date: Thu, 7 Mar 2024 16:11:46 +0700 Subject: [PATCH 4/7] add fitur delete file dan update daily monitoring --- .../AlarmCenter/DataServiceMonitoring.php | 5 + .../Api/DailyMonitoringController.php | 254 ++++++++++++++++++ Modules/Internal/Routes/api.php | 3 + app/Models/RequestDailyMonitoring.php | 67 ++++- .../Components/DetailMonitoringForm.tsx | 190 ++++++++++--- .../Components/DetailMonitoringList.tsx | 197 ++++++++------ .../DailyMonitoring/Model/Functions.ts | 59 ++++ .../DailyMonitoring/Model/Types.ts | 32 +-- frontend/dashboard/src/routes/index.tsx | 4 + 9 files changed, 682 insertions(+), 129 deletions(-) diff --git a/Modules/Client/Transformers/AlarmCenter/DataServiceMonitoring.php b/Modules/Client/Transformers/AlarmCenter/DataServiceMonitoring.php index 849e1f91..caaaeaef 100644 --- a/Modules/Client/Transformers/AlarmCenter/DataServiceMonitoring.php +++ b/Modules/Client/Transformers/AlarmCenter/DataServiceMonitoring.php @@ -175,8 +175,12 @@ class DataServiceMonitoring extends JsonResource ->groupBy(function ($requestLogDailyMonitoring) { return Carbon::parse($requestLogDailyMonitoring->lab_date)->format('d M Y'); }) + ->filter(function ($groupedItems) { + return !is_null($groupedItems->first()->lab_date); + }) ->map(function ($groupedItems) { return collect($groupedItems) + ->map(function ($test) { $arr_document = []; $document = DB::table('files') @@ -197,6 +201,7 @@ class DataServiceMonitoring extends JsonResource ]; } } + return [ 'code' => $test->code, 'date' => Carbon::parse($test->lab_date)->format('d M Y') ?? null, diff --git a/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php b/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php index 5a0e6403..efff0dd3 100644 --- a/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php +++ b/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php @@ -10,6 +10,7 @@ use Exception; use Illuminate\Http\Request; use Illuminate\Routing\Controller; use Illuminate\Support\Facades\Validator; +use Illuminate\Support\Facades\File as Files; use Modules\Internal\Transformers\DailyMonitoringResource; use App\Models\File; @@ -120,6 +121,230 @@ class DailyMonitoringController extends Controller ],200); } + public function GetDetailMonitoringListbyID(Request $request, $id) + { + + $detail = RequestDailyMonitoring::where('id', $id) + ->orderBy("created_at", "desc") + ->first(); + return response()->json([ + 'error' => false, + 'message' => "success", + 'data' => $detail, + ],200); + } + + public function UpdateDetailMonitoringbyID(Request $request) + { + // validation rule + $validator = Validator::make($request->all(),[ + 'subject' => 'required', + 'submission_date' => 'required', + 'body_temperature' => 'required', + 'sistole' => 'required', + 'diastole' => 'required', + 'respiration_rate' => 'required', + 'analysis' => 'required', + 'medical_plan' => 'required', + 'reason' => 'required', + 'non_medikamentosa_plan' => 'required', + ],$this->messages()); + + // validation error + if ($validator->fails()) { + return response()->json([ + 'error' => true, + 'message' => $validator->getMessageBag() + ],400); + } + try { + // insert claim daily monitoring + $db_response = RequestDailyMonitoring::where('id', $request->id) + ->update([ + 'submission_date' => $request->submission_date, + 'subject' => $request->subject, + 'object' => $request->objective, + 'sistole' => $request->sistole, + 'diastole' => $request->diastole, + 'body_temperature' => $request->body_temperature, + 'respiration_rate' => $request->respiration_rate, + 'analysis' => $request->analysis, + 'lab_date' => $request->lab_date, + 'provider' => $request->provider, + 'examination' => $request->examination, + 'reason' => $request->reason, + 'created_by' => auth()->user()->id, + ]); + + // cek medical plan + $num_medical_plan = 0; + foreach ($request->medical_plan as $row) { + if ($row['medical_plan_str']) { + $num_medical_plan++; + } + } + + if ($num_medical_plan == 0) { + DB::rollBack(); + return response()->json([ + 'error' => true, + 'message' => [ + 'medical_plan' => ['medical plan harus diisi'] + ], + 'data' => [] + ],400); + } + if ($request->medical_plan){ + // delete medical plan + DB::table('request_log_medical_plan') + ->where([ + 'request_log_daily_monitoring_id' => $request->id, + 'type' => 1 + ]) + ->delete(); + // insert medical plan + foreach ($request->medical_plan as $row) { + DB::table('request_log_medical_plan')->insert([ + 'request_log_daily_monitoring_id' => $request->id, + 'plan' => $row['medical_plan_str'], + 'type' => 1, + 'created_at' => date('Y-m-d'), + ]); + } + } + + if ($request->non_medikamentosa_plan){ + // delete medical plan + DB::table('request_log_medical_plan') + ->where([ + 'request_log_daily_monitoring_id' => $request->id, + 'type' => 2 + ]) + ->delete(); + // insert non medical plan + foreach ($request->non_medikamentosa_plan as $row) { + DB::table('request_log_medical_plan')->insert([ + 'request_log_daily_monitoring_id' => $request->id, + 'plan' => $row['non_medikamentosa_plan_str'], + 'type' => 2, + 'created_at' => date('Y-m-d'), + ]); + } + } + + // insert file result + if ($request->confirmation_medical_leter){ + // $fileCurrents = File::where([ + // 'fileable_id' => $request->id, + // 'type' => 'confirmation-medical-letter', + // ])->get(); + // if ($fileCurrents){ + // foreach($fileCurrents as $fileCurrent){ + // if (Files::exists($fileCurrent->path)) { + // Files::delete(); + // } + // File::find($fileCurrent->id)->delete(); + // } + // } + foreach ($request->confirmation_medical_leter as $file) { + $name = 'labresult-' . uniqid(); + $extension= $file->getClientOriginalExtension(); + $fileName = $name . '.' . $extension; + $orignalName = $file->getClientOriginalName(); + $path = $file->storeAs($this->path_for_store, $fileName); + File::create([ + 'fileable_type' => 'App\Models\LaboratoriumResult', + 'fileable_id' => $request->id, + 'type' => 'confirmation-medical-letter', + 'name' => $name, + 'original_name' => $orignalName, + 'extension' => $extension, + 'path' => $path, + ]); + + } + } + if ($request->medical_action_letter){ + // $fileCurrents = File::where([ + // 'fileable_id' => $request->id, + // 'type' => 'medical-action-letter', + // ])->get(); + // if ($fileCurrents){ + // foreach($fileCurrents as $fileCurrent){ + // if (Files::exists($fileCurrent->path)) { + // Files::delete(); + // } + // File::find($fileCurrent->id)->delete(); + // } + // } + foreach ($request->medical_action_letter as $file) { + $name = 'labresult-' . uniqid(); + $extension= $file->getClientOriginalExtension(); + $fileName = $name . '.' . $extension; + $orignalName = $file->getClientOriginalName(); + $path = $file->storeAs($this->path_for_store, $fileName); + File::create([ + 'fileable_type' => 'App\Models\LaboratoriumResult', + 'fileable_id' => $request->id, + 'type' => 'medical-action-letter', + 'name' => $name, + 'original_name' => $orignalName, + 'extension' => $extension, + 'path' => $path, + ]); + // $file->storeAs($this->path_for_store, $fileName); + } + } + if ($request->result){ + // $fileCurrents = File::where([ + // 'fileable_id' => $request->id, + // 'type' => 'laboratorium-result', + // ])->get(); + // if ($fileCurrents){ + // foreach($fileCurrents as $fileCurrent){ + // if (Files::exists($fileCurrent->path)) { + // Files::delete(); + // } + // File::find($fileCurrent->id)->delete(); + // } + // } + foreach ($request->result as $file) { + $name = 'labresult-' . uniqid(); + $extension= $file->getClientOriginalExtension(); + $orignalName = $file->getClientOriginalName(); + $fileName = $name . '.' . $extension; + $path = $file->storeAs($this->path_for_store, $fileName); + File::create([ + 'fileable_type' => 'App\Models\LaboratoriumResult', + 'fileable_id' => $request->id, + 'type' => 'laboratorium-result', + 'name' => $name, + 'original_name' => $orignalName, + 'extension' => $extension, + 'path' => $path, + ]); + + // $file->storeAs($this->path_for_store, $fileName); + } + } + DB::commit(); + + return response()->json([ + 'error' => false, + 'message' => "success", + 'data' => [] + ],200); + } + catch (Exception $e) { + DB::rollBack(); + return response()->json([ + 'error' => true, + 'message' => $e->getMessage(), + 'data' => [] + ],500); + } + } + /** * Add Detail Monitoring List */ @@ -420,6 +645,35 @@ class DailyMonitoringController extends Controller ], 200); } + /** + * Delete File Daily Monitoring + */ + public function deleteFileDetailMonitoringListRequestLog(Request $request, $id){ + $fileCurrent = File::where([ + 'id' => $id, + ])->first(); + if ($fileCurrent){ + if (Files::exists($fileCurrent->path)) { + Files::delete(); + } + $fileCurrent->deleted_at = now(); + $fileCurrent->reason = $request->reason; + $fileCurrent->deleted_by = auth()->user()->id; + $fileCurrent->save(); + + return response()->json([ + 'error' => false, + 'message' => "Delete success", + 'data' => $fileCurrent + ], 200); + } else { + return response()->json([ + 'error' => true, + 'message' => "Data not found.", + ], 404); + } + } + /** * Update Status Request LOG */ diff --git a/Modules/Internal/Routes/api.php b/Modules/Internal/Routes/api.php index b9353597..320b5501 100644 --- a/Modules/Internal/Routes/api.php +++ b/Modules/Internal/Routes/api.php @@ -175,10 +175,13 @@ Route::prefix('internal')->group(function () { // Daily Monitoring Route::prefix('daily_monitoring')->group(function () { Route::get('detail/{claim_code}/list', [DailyMonitoringController::class, 'GetDetailMonitoringList']); + Route::get('detail/{id}/edit', [DailyMonitoringController::class, 'GetDetailMonitoringListbyID']); + Route::post('detail/update-request', [DailyMonitoringController::class, 'UpdateDetailMonitoringbyID']); Route::post('detail/{claim_code}/add', [DailyMonitoringController::class, 'AddDetailMonitoringList']); Route::post('detail/{claim_code}/add-request', [DailyMonitoringController::class, 'AddDetailMonitoringListRequestLog']); Route::post('detail/{claim_code}/update-status', [DailyMonitoringController::class, 'UpdateListRequestLog']); Route::get('detail/{id}/delete', [DailyMonitoringController::class, 'deleteDetailMonitoringListRequestLog']); + Route::get('detail/{id}/delete-file', [DailyMonitoringController::class, 'deleteFileDetailMonitoringListRequestLog']); }); // Laboratorium Result diff --git a/app/Models/RequestDailyMonitoring.php b/app/Models/RequestDailyMonitoring.php index dd34d374..83b9aa16 100644 --- a/app/Models/RequestDailyMonitoring.php +++ b/app/Models/RequestDailyMonitoring.php @@ -34,7 +34,7 @@ class RequestDailyMonitoring extends Model 'deleted_at' ]; - protected $appends = ['medical_plan', 'non_medikamentosa_plan', 'document', 'discharge_date']; + protected $appends = ['medical_plan', 'non_medikamentosa_plan', 'document', 'discharge_date', 'confirmation_medical_leter', 'medical_action_letter', 'laboratorium_result']; // public function getBodyTemperatureAttribute() // { @@ -99,10 +99,15 @@ class RequestDailyMonitoring extends Model public function getDocumentAttribute() { $arr_document = []; - $document = DB::table('files')->where(['fileable_type' => 'App\Models\LaboratoriumResult', 'fileable_id' => $this->attributes['id']])->get(); + $document = DB::table('files')->where([ + 'fileable_type' => 'App\Models\LaboratoriumResult', + 'fileable_id' => $this->attributes['id'], + 'deleted_at' => null, + ])->get(); foreach ($document as $row) { $arr_document[] = [ + 'id' => $row->id, 'file_name' => $row->original_name, 'path' => env('APP_URL') . '/storage/lab_result/' . $row->name .'.'. $row->extension, 'type' => $row->type, @@ -117,4 +122,62 @@ class RequestDailyMonitoring extends Model return $discharge_date = DB::table('request_logs')->where('id', $this->attributes['request_log_id'])->select('discharge_date')->first(); } + public function getConfirmationMedicalLeterAttribute() + { + $arr_document = []; + $document = DB::table('files')->where([ + 'fileable_type' => 'App\Models\LaboratoriumResult', + 'type' => 'confirmation-medical-letter', + 'fileable_id' => $this->attributes['id'], + ])->get(); + + foreach ($document as $row) { + $arr_document[] = [ + 'name' => $row->original_name, + 'path' => env('APP_URL') . '/storage/lab_result/' . $row->name .'.'. $row->extension, + 'type' => $row->type, + ]; + } + + return $arr_document; + } + public function getMedicalActionLetterAttribute() + { + $arr_document = []; + $document = DB::table('files')->where([ + 'fileable_type' => 'App\Models\LaboratoriumResult', + 'type' => 'medical-action-letter', + 'fileable_id' => $this->attributes['id'], + ])->get(); + + foreach ($document as $row) { + $arr_document[] = [ + 'name' => $row->original_name, + 'path' => env('APP_URL') . '/storage/lab_result/' . $row->name .'.'. $row->extension, + 'type' => $row->type, + ]; + } + + return $arr_document; + } + public function getLaboratoriumResultAttribute() + { + $arr_document = []; + $document = DB::table('files')->where([ + 'fileable_type' => 'App\Models\LaboratoriumResult', + 'type' => 'laboratorium-result', + 'fileable_id' => $this->attributes['id'], + ])->get(); + + foreach ($document as $row) { + $arr_document[] = [ + 'name' => $row->original_name, + 'path' => env('APP_URL') . '/storage/lab_result/' . $row->name .'.'. $row->extension, + 'type' => $row->type, + ]; + } + + return $arr_document; + } + } diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringForm.tsx b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringForm.tsx index d4e53b4c..9c422d6b 100644 --- a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringForm.tsx +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringForm.tsx @@ -4,7 +4,7 @@ */ import { useFieldArray, useForm } from 'react-hook-form'; import { useNavigate, useParams } from 'react-router-dom'; -import { Box, IconButton, Typography, Grid, Card, Button, ButtonBase, Stack } from '@mui/material'; +import { Box, IconButton, Typography, Grid, Card, Button, ButtonBase, Stack, Autocomplete } from '@mui/material'; import { LoadingButton } from "@mui/lab"; /** @@ -28,16 +28,23 @@ import InsertDriveFileIcon from '@mui/icons-material/InsertDriveFile'; * Utils, Types, Functions * ============================================ */ -import { AddMonitoringDetail, getOrganizationId } from '../Model/Functions'; +import { AddMonitoringDetail, UpdateMonitoringDetail, getMonitoringDetailById, getMonitoringDetailList, getMonitorungDetailById, getOrganizationId } from '../Model/Functions'; import { DetailMonitoringListType} from '../Model/Types'; import FormCreateFilesUpload from '@/pages/CustomerService/FinalLog/Components/FormCreateFilesUpload'; import MultiFilePreview from '@/components/upload/MultiFilePreview'; import Iconify from '@/components/Iconify'; -import { useEffect, useRef, useState } from 'react'; +import { useEffect, useMemo, useRef, useState } from 'react'; +import { TextField } from '@mui/material'; + +type Detail = { + row : DetailMonitoringListType|undefined +} export default function DetailMonitoringList() { - const { member_id, claim_code } = useParams(); + const { member_id, claim_code, id} = useParams(); const [organizationId, setOrganizationId] = useState(); + const [isEdit, setIsEdit] = useState(false); + const [data, setData] = useState(); const navigate = useNavigate() const pageTitle = claim_code??'_ _ _ _'; @@ -49,39 +56,94 @@ export default function DetailMonitoringList() { const organization_id = await getOrganizationId(claim_code??''); setOrganizationId(organization_id); } + const loadDetailDailyMonitoring = async () => { + const monitoring = await getMonitoringDetailById(id??'') + setData(monitoring) + } + useEffect(() => { loadOrganizationID(); + if (id){ + loadDetailDailyMonitoring(); + setIsEdit(true) + console.log(data) + } }, []) // setup form // ==================================== - const defaultValues: DetailMonitoringListType = { - id : '', - claim_code : '', - claim_id : '', - subject : '', - objective : '', - submission_date : '', - body_temperature: '', - sistole : '', - diastole : '', - respiration_rate: '', - complaints : '', - analysis : '', - medical_plan : [{ - medical_plan_str: '' - }], - non_medikamentosa_plan : [{ - non_medikamentosa_plan_str: '' - }], - confirmation_medical_leter : [], - medical_action_letter : [], - result : [], - created_at : '', - lab_date : '', - provider : '', - examination : '', - }; + const defaultValues = useMemo( + () => ({ + id : data?.id ??'', + claim_code : data?.claim_code ?? '', + claim_id : data?.claim_id ?? '', + subject : data?.subject ?? '', + objective : data?.object ?? '', + submission_date : data?.submission_date ?? '', + body_temperature: data?.body_temperature ?? '', + sistole : data?.sistole ?? '', + diastole : data?.diastole ??'', + respiration_rate: data?.respiration_rate ??'', + complaints : data?.complaints ?? '', + analysis : data?.analysis ?? '', + medical_plan : data?.medical_plan ?? [{ + medical_plan_str: '' + }], + non_medikamentosa_plan : data?.non_medikamentosa_plan ?? [{ + non_medikamentosa_plan_str: '' + }], + confirmation_medical_leter : [], + medical_action_letter : [], + // result : data?.laboratorium_result ?? [], + result : [], + created_at : data?.created_at ?? '', + lab_date : data?.lab_date ?? '', + provider : data?.provider ?? '', + examination : data?.examination ?? '', + reason : '', + }), + [data] + ); + + useEffect(() => { + if (isEdit && data) { + reset(defaultValues); + } + if (!isEdit) { + reset(defaultValues); + } + // setFileKondisis(currentClaim?.files_by_type?.claim_diagnosis); + // setFileDiagnosas(currentClaim?.files_by_type?.claim_diagnosis); + }, [isEdit, data]); + + // const defaultValues: DetailMonitoringListType = { + // id : '', + // claim_code : '', + // claim_id : '', + // subject : '', + // objective : '', + // submission_date : '', + // body_temperature: '', + // sistole : '', + // diastole : '', + // respiration_rate: '', + // complaints : '', + // analysis : data?.analysis ?? '', + // medical_plan : [{ + // medical_plan_str: '' + // }], + // non_medikamentosa_plan : [{ + // non_medikamentosa_plan_str: '' + // }], + // confirmation_medical_leter : [], + // medical_action_letter : [], + // result : [], + // created_at : '', + // lab_date : '', + // provider : '', + // examination : '', + // }; + const methods = useForm({ defaultValues @@ -113,7 +175,6 @@ export default function DetailMonitoringList() { arr_medical_action_letter.push(event.target.files[0]); setValue('medical_action_letter', arr_medical_action_letter) - console.log('test2') } else { console.log('NO FILE'); @@ -168,15 +229,27 @@ export default function DetailMonitoringList() { // Submit Form // ===================================== const submitHandler = async (data: DetailMonitoringListType) => { - const response = await AddMonitoringDetail(claim_code??'', data); + + const response = isEdit ? await UpdateMonitoringDetail(data) : await AddMonitoringDetail(claim_code??'', data); if (response == true) { reset(); - navigate('/case_management/daily_monitoring/'+member_id+'/'+organizationId+'/claims', { replace: true }); + if (isEdit) { + navigate('/case_management/daily_monitoring/'+member_id+'/claims/'+claim_code+'/list_monitoring', { replace: true }); + } else { + navigate('/case_management/daily_monitoring/'+member_id+'/'+organizationId+'/claims', { replace: true }); + } // window.location.reload() } } + const [selectedReason, setSelectedReason] = useState({value:'-', label:''}); + const reasons = [ + { value: 'Wrong Setting', label: 'Wrong Setting' }, + { value: 'Hospital Request', label: 'Hospital Request' } + ]; + const [error, setError] = useState(true); + return ( @@ -211,6 +284,7 @@ export default function DetailMonitoringList() { + {/* Subject */} @@ -586,7 +660,6 @@ export default function DetailMonitoringList() { - {/* Laboratorium */} @@ -689,6 +762,49 @@ export default function DetailMonitoringList() { + {/* Reason Update */} + { + isEdit ? ( + + + + Reason for Update* + + option.label} + fullWidth + value={selectedReason} + onChange={(event, newValue) => { + setSelectedReason(newValue); + setValue('reason',newValue?.value) + // Validasi jika newValue adalah null + if (!newValue) { + setError('Please select a reason'); + } else { + setError(''); + } + }} + renderInput={(params) => ( + + )} + /> + + + + + ) : null + } + + {/* Button Cancel & Save */} @@ -697,8 +813,8 @@ export default function DetailMonitoringList() { - - Add + + {isEdit ? 'Update' : 'Add'} diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringList.tsx b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringList.tsx index 573bda2d..36560935 100644 --- a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringList.tsx +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringList.tsx @@ -33,7 +33,7 @@ import { getOrganizationId } from '../Model/Functions'; import { DetailMonitoringListType } from '../Model/Types'; import TableMoreMenu from '@/components/table/TableMoreMenu'; import { MenuItem } from '@mui/material'; -import { Delete } from '@mui/icons-material'; +import { Delete, DeleteForever, Edit, LoopOutlined } from '@mui/icons-material'; import MuiDialog from '@/components/MuiDialog'; import { DialogActions } from '@mui/material'; import axios from '@/utils/axios'; @@ -68,7 +68,9 @@ export default function DetailMonitoringList() { { value: 'Hospital Request', label: 'Hospital Request' } ]; const [error, setError] = useState(''); - const [id, setId] = useState(null); + const [id, setId] = useState(null); + const [id_file, setIdFile] = useState(null); + const handleCloseDialog = () => { setOpenDialog(false); } @@ -77,27 +79,52 @@ export default function DetailMonitoringList() { const parameters = { 'reason' : selectedReason.value } - const response = axios.get(`case_management/daily_monitoring/detail/${id}/delete`, { - params: { ...parameters }, - }); - if (!response.error){ - enqueueSnackbar('Claim Request Updated Successfully!', { variant: 'success' }); - window.location.reload(); - setOpenDialog(false) - } else { - enqueueSnackbar('Claim Request Updated Error!', { variant: 'error' }); - } + if (id){ + const response = axios.get(`case_management/daily_monitoring/detail/${id}/delete`, { + params: { ...parameters }, + }); + + if (!response.error){ + enqueueSnackbar('Claim Request Updated Successfully!', { variant: 'success' }); + window.location.reload(); + setOpenDialog(false) + } else { + enqueueSnackbar('Claim Request Updated Error!', { variant: 'error' }); + } + + } else { + axios.get(`case_management/daily_monitoring/detail/${id_file}/delete-file`, { + params: { ...parameters }, + }) + .then(response => { + if (!response.error) { + enqueueSnackbar('File Successfully deleted!', { variant: 'success' }); + window.location.reload(); + setOpenDialog(false); + } else { + enqueueSnackbar('Deleted File Error!', { variant: 'error' }); + } + }) + .catch(error => { + console.error('Error:', error); + }); + } } else { setError('Please select a reason') } } + + const handleEdit = (id:number|undefined) => { + navigate(`/case_management/daily_monitoring/${member_id}/claims/${claim_code}/${id}`) + } + const getContent = () => ( - Are you sure to delete this Daily Monitoring ? + Are you sure to delete this {id_file ? 'File ' : '' } Daily Monitoring ? - Reason for Delete* + Reason for Delete* Cancel - - ) + + ) + // Load Data // ------------------- const loadDataTableData = async () => { @@ -203,10 +231,16 @@ export default function DetailMonitoringList() { {/* Menempatkan TableMoreMenu di sebelah kanan */} {setOpenDialog(true); setId(row.id)}}> - - Delete - + <> + {handleEdit(row.id);}}> + + Edit + + {setOpenDialog(true); setId(row.id); setIdFile(null)}}> + + Delete + + } /> @@ -394,93 +428,106 @@ export default function DetailMonitoringList() { - + Document Confirmation Medical Letter: - + {row.document?.map((data, index) => ( - - {data.type === 'confirmation-medical-letter' ? ( - <> - - - {data.file_name} - - - ) : null} - + data.type === 'confirmation-medical-letter' ? ( + + + { setOpenDialog(true); setIdFile(data.id); setId(null); }} + style={{ cursor: 'pointer' }} + > + + + + ) : null ))} - - - - Document Medical Action Letter: - + {row.document?.map((data, index) => ( - - {data.type === 'medical-action-letter' ? ( - <> - - - {data.file_name} - - - ) : null} - + data.type === 'medical-action-letter' ? ( + + + { setOpenDialog(true); setIdFile(data.id); setId(null); }} + style={{ cursor: 'pointer' }} + > + + + + ) : null ))} - - - - + Document Laboratorium Result: - + {row.document?.map((data, index) => ( - - {data.type === 'laboratorium-result' ? ( - <> - - - {data.file_name} - - - ) : null} - + data.type === 'laboratorium-result' ? ( + + + { setOpenDialog(true); setIdFile(data.id); setId(null); }} + style={{ cursor: 'pointer' }} + > + + + + ) : null ))} + + @@ -492,7 +539,7 @@ export default function DetailMonitoringList() { {/* Dialog Delete */} = return response; }; + +/** + * Get detail monitoring + */ +export const getMonitoringDetailById = async ( id: string) => { + const response = await axios.get(`/case_management/daily_monitoring/detail/${id}/edit`) + .then((res) =>{ + return res.data.data; + }) + .catch((res) => { + enqueueSnackbar("server error !", { + variant: 'error', + }); + + return []; + }); + + return response; +} + +/** + * Update detail monitoring + */ +export const UpdateMonitoringDetail = async (data: DetailMonitoringListType) => { + data.lab_date = data.lab_date != '' && data.lab_date != null ? fDateOnly(data.lab_date) : ''; + data.submission_date = data.submission_date != '' && data.submission_date != null ? fDateOnly(data.submission_date) : ''; + + const formData = makeFormData({...data}); + + const response = await axios.post(`/case_management/daily_monitoring/detail/update-request`, formData) + .then((res) =>{ + enqueueSnackbar(res.data.message, { + variant: 'success', + }); + + return true; + }) + .catch((res) => { + if (res.response.status == 400) { + let arr_message = res.response.data.message; + + for (const key in arr_message) { + enqueueSnackbar(arr_message[key][0], { + variant: 'warning', + }); + } + } + else { + enqueueSnackbar("server error !", { + variant: 'error', + }); + } + + return false; + }); + + return response; +} diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Types.ts b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Types.ts index 5230826f..90cdf1d9 100644 --- a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Types.ts +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Types.ts @@ -50,21 +50,22 @@ export type ClaimListType = { export type DetailMonitoringListType = { id : number|null, claim_id : string|null, - claim_code : string, - subject : string, - object : string, - objective : string, - body_temperature: string, - respiration_rate: string, - sistole : string, - diastole : string - analysis : string, - complaints : string, - submission_date : string, - discharge_date : string, - lab_date : string, - provider : string, - examination : string, + claim_code : string|undefined, + subject : string|undefined, + object : string|undefined, + objective : string|undefined, + body_temperature: string|undefined, + respiration_rate: string|undefined, + sistole : string|undefined, + diastole : string|undefined + analysis : string|undefined, + complaints : string|undefined, + submission_date : string|undefined, + discharge_date : string|undefined, + lab_date : string|undefined, + provider : string|undefined, + examination : string|undefined, + reason : string|undefined, medical_plan : MedicalPlanStrType[], non_medikamentosa_plan : NonMedikamentosaPlanType[], confirmation_medical_leter : files[], @@ -90,6 +91,7 @@ export type files = { } export type document = { + id: number file_name: string, path: string, type: string diff --git a/frontend/dashboard/src/routes/index.tsx b/frontend/dashboard/src/routes/index.tsx index 23c0a50c..c6534bfa 100644 --- a/frontend/dashboard/src/routes/index.tsx +++ b/frontend/dashboard/src/routes/index.tsx @@ -232,6 +232,10 @@ export default function Router() { path: 'daily_monitoring/:member_id/claims/:claim_code/add_monitoring', element: }, + { + path: 'daily_monitoring/:member_id/claims/:claim_code/:id', + element: + }, { path: 'daily_monitoring/:member_id/claims/:claim_code/list_monitoring', element: From 6369e07d95e19fee9c6bece1bcabc8b2453b2ff1 Mon Sep 17 00:00:00 2001 From: Tb Fajri Date: Thu, 7 Mar 2024 16:22:42 +0700 Subject: [PATCH 5/7] fixing tombol cancel --- .../DailyMonitoring/Components/DetailMonitoringForm.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringForm.tsx b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringForm.tsx index 9c422d6b..065332ac 100644 --- a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringForm.tsx +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringForm.tsx @@ -810,7 +810,7 @@ export default function DetailMonitoringList() { - From 150aba4b0fc600cd961b20ef6be30dd3f2812cdd Mon Sep 17 00:00:00 2001 From: Tb Fajri Date: Fri, 8 Mar 2024 11:00:48 +0700 Subject: [PATCH 6/7] update list inpatient monitoring --- .../src/pages/CaseManagement/InpatientMonitoring/List.tsx | 2 +- .../src/pages/CustomerService/FinalLog/Model/Types.tsx | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/dashboard/src/pages/CaseManagement/InpatientMonitoring/List.tsx b/frontend/dashboard/src/pages/CaseManagement/InpatientMonitoring/List.tsx index 32ea17c9..687c9e43 100644 --- a/frontend/dashboard/src/pages/CaseManagement/InpatientMonitoring/List.tsx +++ b/frontend/dashboard/src/pages/CaseManagement/InpatientMonitoring/List.tsx @@ -492,7 +492,7 @@ export default function List() { Name - Date of Submission + Date of Admission Service Type diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Model/Types.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Model/Types.tsx index f0eaa9f0..26601ebb 100644 --- a/frontend/dashboard/src/pages/CustomerService/FinalLog/Model/Types.tsx +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Model/Types.tsx @@ -16,6 +16,7 @@ export type FinalLogType = { member : Member, member_name : string, submission_date_fgl : string, + submission_date : string, service_name : string, payment_type_name : string, status_final_log : string, From 0a4e534ba200e6d56686031e28710e666fbdc789 Mon Sep 17 00:00:00 2001 From: Linksehat Staging Server Date: Fri, 8 Mar 2024 11:04:02 +0700 Subject: [PATCH 7/7] update --- .../dashboard/src/pages/CustomerService/FinalLog/List.tsx | 8 ++++---- .../src/pages/CustomerService/FinalLog/Model/Types.tsx | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/List.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/List.tsx index 83de9d33..40d31b34 100644 --- a/frontend/dashboard/src/pages/CustomerService/FinalLog/List.tsx +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/List.tsx @@ -360,9 +360,9 @@ export default function List() { {row.provider} {row.member_name} - {row.submission_date_fgl ? ( - - ) : ''} + {row.admission_date ? ( + + ) : '-'} {row.service_name} {row.payment_type_name} @@ -691,7 +691,7 @@ export default function List() { {/* Dialog Delete */} -