From 19e9e334e2d4482602c87449b7cfa12f3aed8912 Mon Sep 17 00:00:00 2001 From: Tb Fajri Date: Thu, 28 Dec 2023 15:50:56 +0700 Subject: [PATCH] update ecard dan daily monitoring --- .../Api/CorporateMemberController.php | 63 ++++- .../Api/DailyMonitoringController.php | 211 ++++++++++++++- Modules/Internal/Routes/api.php | 5 +- .../Services/MemberEnrollmentService.php | 6 + app/Models/Member.php | 35 ++- app/Models/RequestDailyMonitoring.php | 99 +++++++ ...40_create_request_log_daily_monitoring.php | 33 +++ ...add_column_to_request_log_medical_plan.php | 32 +++ .../Components/ClaimListRow.tsx | 58 +++- .../Components/DetailMonitoringForm.tsx | 255 ++++++++++++++++-- .../Components/DetailMonitoringList.tsx | 208 +++++++++++--- .../Components/DialogConfirmation.tsx | 92 +++++++ .../DailyMonitoring/Model/Functions.ts | 10 +- .../DailyMonitoring/Model/Types.ts | 18 ++ .../src/pages/Corporates/Member/List.tsx | 43 +++ public/images/background-vale.png | Bin 0 -> 9049 bytes public/images/logo-default.png | Bin 0 -> 21008 bytes resources/views/pdf/ecard.blade.php | 111 +++++--- 18 files changed, 1146 insertions(+), 133 deletions(-) create mode 100644 app/Models/RequestDailyMonitoring.php create mode 100644 database/migrations/2023_12_27_141340_create_request_log_daily_monitoring.php create mode 100644 database/migrations/2023_12_27_163050_add_column_to_request_log_medical_plan.php create mode 100644 frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DialogConfirmation.tsx create mode 100644 public/images/background-vale.png create mode 100644 public/images/logo-default.png diff --git a/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php b/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php index 549a01a0..9acc2340 100644 --- a/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php +++ b/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php @@ -21,6 +21,7 @@ use PDF; use Illuminate\Support\Facades\DB; use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Facades\File; +use Spatie\Browsershot\Browsershot; class CorporateMemberController extends Controller { @@ -396,34 +397,68 @@ class CorporateMemberController extends Controller } public function sendAllECard(Request $request, $corporate_id){ - $members = DB::table('members') - ->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id') - ->where('corporate_employees.corporate_id', $corporate_id) - ->get() - ->toArray(); - - + $members = Member::with([ + 'currentPlan', + 'currentPolicy', + 'currentCorporate', + // 'currentPlan.corporateBenefits.benefit' + ])->whereHas('currentCorporate', function ($query) use ($corporate_id) { + $query->where('corporate_id', $corporate_id); + })->get(); + $data = []; + $countSuccesSend = 0; foreach($members as $member){ - $pdf = PDF::loadView('pdf.ecard', compact(['member'])); // Simpan file PDF ke direktori yang diinginkan - $pdfPath = storage_path('app/pdf/ecards/E-card-' . $member->name . '.pdf'); + $pdfPath = storage_path('app/pdf/ecards/E-card-' . $member->name. '.pdf'); // Cek apakah file sudah ada if (!File::exists($pdfPath)) { - $pdf = PDF::loadView('pdf.ecard', compact('member')); + $pdf = PDF::loadView('pdf.ecard', compact('member'))->setPaper('A5', 'portrait'); $pdf->save($pdfPath); } $dataEmail = [ - 'email' => $member->email, + // 'email' => $member->email, + 'email' => 'tbfajri', 'name' => $member->name, 'subject' => 'Digital E Card '. $member->name, - 'body' => '

Hi ' . $member->name . '

', + 'body' => '

Hi ' . $member->name . '


ini adalah uji coba kirim e-card' , 'attach' => $pdfPath, ]; $sendEmail = Helper::sendEmailattachData($dataEmail); - } + + if ($sendEmail === true){ + $countSuccesSend ++; - return true; + File::delete($pdfPath); + } else { + $dataFaild = [ + 'email' => $member->email, + 'name' => $member->name, + 'message' => $sendEmail + ]; + array_push($data, $dataFaild); + } + } + $response = [ + 'data_fail_send' => count($data), + 'message' => $data, + 'data_succes_send' => $countSuccesSend, + ]; + + return response()->json($response); + } + + public function viewECard(Request $request, $member_id){ + $member = Member::with([ + 'currentPlan', + 'currentPolicy', + 'currentCorporate', + // 'currentPlan.corporateBenefits.benefit' + ])->find($member_id); + + $pdf = PDF::loadView('pdf.ecard', compact('member'))->setPaper('A5', 'portrait'); + return $pdf->download('Ecard - '.$member->full_name.'.pdf'); } + } diff --git a/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php b/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php index 1d70de74..d5da9d0f 100644 --- a/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php +++ b/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php @@ -3,12 +3,14 @@ namespace Modules\Internal\Http\Controllers\Api; use App\Models\DailyMonitoring; +use App\Models\RequestDailyMonitoring; use App\Models\MedicalPlan; use DB; use Exception; use Illuminate\Http\Request; use Illuminate\Routing\Controller; use Illuminate\Support\Facades\Validator; +use App\Models\File; /** * Bagaskoro BSD 27-10-2023 @@ -17,6 +19,7 @@ use Illuminate\Support\Facades\Validator; */ class DailyMonitoringController extends Controller { + protected $path_for_store = 'public/lab_result'; protected function messages() { return [ @@ -88,21 +91,17 @@ class DailyMonitoringController extends Controller /** * Detail Monitoring List - by claim_code */ - public function GetDetailMonitoringList(Request $request, $claim_code) + public function GetDetailMonitoringList(Request $request, $request_code) { - // get claim request - $claim_request = DB::table('claim_requests') + // get id request log + $request_logs = DB::table('request_logs') ->select('id') - ->where('code', $claim_code) + ->where('code', $request_code) ->first(); - // get claim - $claim = DB::table('claims') - ->select('id') - ->where('claim_request_id', empty($claim_request)==false ? $claim_request->id : '') - ->first(); - - $detail_list = DailyMonitoring::where('claim_id', empty($claim) == false ? $claim->id : '')->orderBy("created_at", "desc")->get()->makeHidden(['updated_at']); + $detail_list = RequestDailyMonitoring::where('request_log_id', empty($request_logs) == false ? $request_logs->id : '') + ->orderBy("created_at", "desc") + ->get(); return response()->json([ 'error' => false, @@ -213,4 +212,194 @@ class DailyMonitoringController extends Controller ],500); } } + + /** + * Add Detail Request LOG LIST + */ + public function AddDetailMonitoringListRequestLog(Request $request, $request_code) + { + $request->merge(['request_code' => $request_code]); + + // validation rule + $validator = Validator::make($request->all(),[ + 'request_code' => 'required|exists:request_logs,code', + 'subject' => 'required', + 'body_temperature' => 'required|numeric', + 'sistole' => 'required|numeric', + 'diastole' => 'required|numeric', + 'respiration_rate' => 'required|numeric', + 'analysis' => 'required', + 'medical_plan' => 'required', + 'non_medikamentosa_plan' => 'required', + ],$this->messages()); + + // validation error + if ($validator->fails()) { + return response()->json([ + 'error' => true, + 'message' => $validator->getMessageBag() + ],400); + } + + // get claim request + $request_log = DB::table('request_logs') + ->select('id') + ->where('code', $request_code) + ->first(); + DB::beginTransaction(); + try { + // insert claim daily monitoring + $db_response = RequestDailyMonitoring::create([ + 'request_log_id' => $request_log->id, + 'subject' => $request->subject, + '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, + ]); + + + // 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); + } + + // insert medical plan + foreach ($request->medical_plan as $row) { + DB::table('request_log_medical_plan')->insert([ + 'request_log_daily_monitoring_id' => $db_response->id, + 'plan' => $row['medical_plan_str'], + 'type' => 1, + 'created_at' => date('Y-m-d'), + ]); + } + + // insert non medical plan + foreach ($request->non_medikamentosa_plan as $row) { + DB::table('request_log_medical_plan')->insert([ + 'request_log_daily_monitoring_id' => $db_response->id, + 'plan' => $row['non_medikamentosa_plan_str'], + 'type' => 2, + 'created_at' => date('Y-m-d'), + ]); + } + + // insert file result + if ($request->confirmation_medical_leter){ + foreach ($request->confirmation_medical_leter as $file) { + $name = 'labresult-' . uniqid(); + $extension= $file->getClientOriginalExtension(); + $fileName = $name . '.' . $extension; + $path = $file->storeAs($this->path_for_store, $fileName); + File::create([ + 'fileable_type' => 'App\Models\LaboratoriumResult', + 'fileable_id' => $db_response->id, + 'type' => 'confirmation-medical-letter', + 'name' => $name, + 'original_name' => $fileName, + 'extension' => $extension, + 'path' => $path, + ]); + + } + } + if ($request->medical_action_letter){ + foreach ($request->medical_action_letter as $file) { + $name = 'labresult-' . uniqid(); + $extension= $file->getClientOriginalExtension(); + $fileName = $name . '.' . $extension; + $path = $file->storeAs($this->path_for_store, $fileName); + File::create([ + 'fileable_type' => 'App\Models\LaboratoriumResult', + 'fileable_id' => $db_response->id, + 'type' => 'medical-action-letter', + 'name' => $name, + 'original_name' => $fileName, + 'extension' => $extension, + 'path' => $path, + ]); + + // $file->storeAs($this->path_for_store, $fileName); + } + } + if ($request->result){ + foreach ($request->result as $file) { + $name = 'labresult-' . uniqid(); + $extension= $file->getClientOriginalExtension(); + $fileName = $name . '.' . $extension; + $path = $file->storeAs($this->path_for_store, $fileName); + File::create([ + 'fileable_type' => 'App\Models\LaboratoriumResult', + 'fileable_id' => $db_response->id, + 'type' => 'laboratorium-result', + 'name' => $name, + 'original_name' => $fileName, + '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); + } + } + + /** + * Update Status Request LOG + */ + public function UpdateListRequestLog(Request $request, $request_code) + { + // get claim request + $request_log = DB::table('request_logs') + ->where('code', $request_code) + ->update(['discharge_date' => now()]); + if ($request_log) { + return response()->json([ + 'error' => false, + 'message' => "success", + 'data' => [] + ], 200); + } else { + return response()->json([ + 'error' => true, + 'message' => $e->getMessage(), + 'data' => [] + ],500); + } + } } diff --git a/Modules/Internal/Routes/api.php b/Modules/Internal/Routes/api.php index 4a262d30..a4b86bba 100644 --- a/Modules/Internal/Routes/api.php +++ b/Modules/Internal/Routes/api.php @@ -170,6 +170,8 @@ Route::prefix('internal')->group(function () { Route::prefix('daily_monitoring')->group(function () { Route::get('detail/{claim_code}/list', [DailyMonitoringController::class, 'GetDetailMonitoringList']); 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']); }); // Laboratorium Result @@ -285,7 +287,8 @@ Route::prefix('internal')->group(function () { Route::post('generate-log/{member_id}', [CorporateMemberController::class, 'generateLog']); - Route::post('send_card/{corporate_id}', [CorporateMemberController::class, 'sendAllECard']); + Route::get('send_card/{corporate_id}', [CorporateMemberController::class, 'sendAllECard']); + Route::get('view_card/{member_id}', [CorporateMemberController::class, 'viewECard']); Route::controller(ClaimRequestController::class)->group(function () { Route::post('files-mcu', 'filesMcu'); }); diff --git a/Modules/Internal/Services/MemberEnrollmentService.php b/Modules/Internal/Services/MemberEnrollmentService.php index 278e7720..4c554386 100644 --- a/Modules/Internal/Services/MemberEnrollmentService.php +++ b/Modules/Internal/Services/MemberEnrollmentService.php @@ -324,6 +324,12 @@ class MemberEnrollmentService // "Ingestion Status", ]; + public $doc_headers_send_email = [ + "Name", + "Email", + "Message" + ]; + public function __construct(Member $member) { app()->setLocale('en'); diff --git a/app/Models/Member.php b/app/Models/Member.php index 1d0435a3..ef95adb6 100644 --- a/app/Models/Member.php +++ b/app/Models/Member.php @@ -255,19 +255,46 @@ class Member extends Model ); } - protected function birthDate(): Attribute + // protected function birthDate(): Attribute + // { + // // $date = $this->person->birth_date ?? ($this->birth_date ?? null); + // $date = $this->birth_date ?? ($this->person->birth_date ?? null); + // return Attribute::make( + // get: fn () => !empty($date) ? Carbon::parse($date)->format('Y-m-d') : null + // ); + // } + + protected function birthDateeCard(): Attribute { // $date = $this->person->birth_date ?? ($this->birth_date ?? null); - $date = $this->person->birth_date ?? ($this->birth_date ?? null); + $date = $this->birth_date ?? ($this->birth_date ?? this->person->birth_date); return Attribute::make( - get: fn () => !empty($date) ? Carbon::parse($date)->format('Y-m-d') : null + get: fn () => !empty($date) ? Carbon::parse($date)->format('d / M / Y') : null + ); + } + + protected function startDate(): Attribute + { + // $date = $this->person->birth_date ?? ($this->birth_date ?? null); + $date = $this->members_effective_date; + return Attribute::make( + get: fn () => !empty($date) ? Carbon::parse($date)->format('d / M / Y') : null + ); + } + + protected function endDate(): Attribute + { + // $date = $this->person->birth_date ?? ($this->birth_date ?? null); + $date = $this->members_expire_date; + return Attribute::make( + get: fn () => !empty($date) ? Carbon::parse($date)->format('d / M / Y') : null ); } protected function gender(): Attribute { return Attribute::make( - get: fn () => $this->person->gender ?? null + get: fn () => ucfirst($this->person->gender) ?? null ); } diff --git a/app/Models/RequestDailyMonitoring.php b/app/Models/RequestDailyMonitoring.php new file mode 100644 index 00000000..6eb1aa77 --- /dev/null +++ b/app/Models/RequestDailyMonitoring.php @@ -0,0 +1,99 @@ +attributes['body_temperature'], 0); + } + + public function getSistoleAttribute() + { + return round($this->attributes['sistole'], 0); + } + + public function getDiastoleAttribute() + { + return round($this->attributes['diastole'], 0); + } + + public function getRespirationRateAttribute() + { + return round($this->attributes['respiration_rate'], 0); + } + + public function getMedicalPlanAttribute() + { + $arr_medical_plan = []; + $medical_plan = DB::table('request_log_medical_plan')->where(['request_log_daily_monitoring_id' => $this->attributes['id'], 'type' => 1])->get(); + + foreach ($medical_plan as $row) { + $arr_medical_plan[] = [ + 'medical_plan_str' => $row->plan + ]; + } + + return $arr_medical_plan; + } + + public function getNonMedikamentosaPlanAttribute() + { + $arr_non_medikamentosa_plan = []; + $non_medikamentosa_plan = DB::table('request_log_medical_plan')->where(['request_log_daily_monitoring_id' => $this->attributes['id'], 'type' => 2])->get(); + + foreach ($non_medikamentosa_plan as $row) { + $arr_non_medikamentosa_plan[] = [ + 'non_medikamentosa_plan_str' => $row->plan + ]; + } + + return $arr_non_medikamentosa_plan; + } + + public function getDocumentAttribute() + { + $arr_document = []; + $document = DB::table('files')->where(['fileable_type' => 'App\Models\LaboratoriumResult', 'fileable_id' => $this->attributes['id']])->get(); + + foreach ($document as $row) { + $arr_document[] = [ + 'file_name' => $row->original_name, + 'path' => env('APP_URL') . '/storage/lab_result/' . $row->original_name, + 'type' => $row->type, + ]; + } + + return $arr_document; + } + + public function getDischargeDateAttribute() + { + return $discharge_date = DB::table('request_logs')->where('id', $this->attributes['request_log_id'])->select('discharge_date')->first(); + } + +} diff --git a/database/migrations/2023_12_27_141340_create_request_log_daily_monitoring.php b/database/migrations/2023_12_27_141340_create_request_log_daily_monitoring.php new file mode 100644 index 00000000..aa6f74e9 --- /dev/null +++ b/database/migrations/2023_12_27_141340_create_request_log_daily_monitoring.php @@ -0,0 +1,33 @@ +id(); + $table->foreignId('request_log_daily_monitoring_id'); + $table->string('plan'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('request_log_medical_plan'); + } +}; diff --git a/database/migrations/2023_12_27_163050_add_column_to_request_log_medical_plan.php b/database/migrations/2023_12_27_163050_add_column_to_request_log_medical_plan.php new file mode 100644 index 00000000..9e3115f5 --- /dev/null +++ b/database/migrations/2023_12_27_163050_add_column_to_request_log_medical_plan.php @@ -0,0 +1,32 @@ +integer('type')->after('plan'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('request_log_medical_plan', function (Blueprint $table) { + $table->dropColumn('type'); + }); + } +}; diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/ClaimListRow.tsx b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/ClaimListRow.tsx index 3b758f82..e08b4db5 100644 --- a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/ClaimListRow.tsx +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/ClaimListRow.tsx @@ -22,6 +22,8 @@ import TableMoreMenu from '@/components/table/TableMoreMenu'; */ import { fDate } from "@/utils/formatTime"; import { ClaimListType } from "../Model/Types"; +import { ClearOutlined, LoopOutlined } from "@mui/icons-material"; +import DialogConfirmation from "./DialogConfirmation"; type Props = { row: ClaimListType, @@ -30,6 +32,14 @@ type Props = { export default function ClaimListRow ({ ...props }: Props) { const navigate = useNavigate() + const [openDialogSubmit, setOpenDialogSubmit] = useState(false); + const [code, setCode] = useState(''); + const [member_id, setMemberId] = useState(''); + const handleUpdate = (code: string, member_id: string) => { + setOpenDialogSubmit(true) + setMemberId(member_id) + setCode(code) + } return ( @@ -87,21 +97,45 @@ export default function ClaimListRow ({ ...props }: Props) { e.stopPropagation()}> - - navigate(`/case_management/daily_monitoring/${props.row.member_id}/claims/${props.row.code}/list_monitoring`)}> - - View - - navigate(`/case_management/daily_monitoring/${props.row.member_id}/claims/${props.row.code}/add_monitoring`)}> - - Daily Monitoring - - - } /> + {props.row.discharge_date == null ? + ( + + navigate(`/case_management/daily_monitoring/${props.row.member_id}/claims/${props.row.code}/list_monitoring`)}> + + View + + navigate(`/case_management/daily_monitoring/${props.row.member_id}/claims/${props.row.code}/add_monitoring`)}> + + Daily Monitoring + + handleUpdate(props.row.code, props.row.member_id)}> + + Update Status + + + } /> + ) : + ( + + navigate(`/case_management/daily_monitoring/${props.row.member_id}/claims/${props.row.code}/list_monitoring`)}> + + View + + + } /> + ) + } + + ); diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringForm.tsx b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringForm.tsx index fae9e07d..0960b7ab 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 } from '@mui/material'; +import { Box, IconButton, Typography, Grid, Card, Button, ButtonBase, Stack } from '@mui/material'; import { LoadingButton } from "@mui/lab"; /** @@ -13,6 +13,7 @@ import { LoadingButton } from "@mui/lab"; */ import Page from '@/components/Page'; import { FormProvider, RHFTextField } from '@/components/hook-form'; +import RHFDatePickerV2 from '@/components/hook-form/RHFDatePickerV2'; /** * Icon @@ -21,6 +22,7 @@ import { FormProvider, RHFTextField } from '@/components/hook-form'; import ArrowBackIosNew from '@mui/icons-material/ArrowBackIosNew'; import AddIcon from '@mui/icons-material/Add'; import RemoveIcon from '@mui/icons-material/Remove'; +import InsertDriveFileIcon from '@mui/icons-material/InsertDriveFile'; /** * Utils, Types, Functions @@ -37,7 +39,9 @@ export default function DetailMonitoringList() { const { member_id, claim_code } = useParams(); const navigate = useNavigate() const pageTitle = claim_code??'_ _ _ _'; - const fileInput = useRef(null); + const fileInput1 = useRef(null); + const fileInput2 = useRef(null); + const fileInput3 = useRef(null); // setup form // ==================================== @@ -58,7 +62,13 @@ export default function DetailMonitoringList() { non_medikamentosa_plan : [{ non_medikamentosa_plan_str: '' }], - created_at : '' + confirmation_medical_leter : [], + medical_action_letter : [], + result : [], + created_at : '', + lab_date : '', + provider : '', + examination : '', }; const methods = useForm({ @@ -72,29 +82,75 @@ export default function DetailMonitoringList() { const formValues = watch(); // Handle File Input // ===================================== - const handleInputChange = (event: any) => { + const handleInputChangeConfirmationMedicalLeter = (event: any) => { if (event.target.files[0]) { - let arr_lab_result_file = formValues.lab_result_file; - arr_lab_result_file.push(event.target.files[0]); + let arr_confirmation_medical_leter_file = formValues.confirmation_medical_leter; + arr_confirmation_medical_leter_file.push(event.target.files[0]); - setValue('lab_result_file', arr_lab_result_file) + setValue('confirmation_medical_leter', arr_confirmation_medical_leter_file); + } + else { + console.log('NO FILE'); + } + }; + const handleInputChangeMedicalActionLetter = (event: any) => { + if (event.target.files[0]) { + + let arr_medical_action_letter = formValues.medical_action_letter; + 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'); } }; + const handleInputChangeResult = (event: any) => { + if (event.target.files[0]) { + + let arr_result = formValues.result; + arr_result.push(event.target.files[0]); + + setValue('result', arr_result) + console.log('test3') + } + else { + console.log('NO FILE'); + } + }; + + // Handle Remove File // ===================================== - const handleRemoveFile = (target_index: number) => { - let arr_lab_result_file = formValues.lab_result_file.filter((file: any, index: number) =>{ + const handleRemoveFileConfirmationMedicalLeter = (target_index: number) => { + let arr_confirmation_medical_leter_file = formValues.confirmation_medical_leter.filter((file: any, index: number) =>{ if (target_index !== index) { return file; } }); - setValue('lab_result_file', arr_lab_result_file) + setValue('confirmation_medical_leter', arr_confirmation_medical_leter_file) + }; + const handleRemoveFileMedicalActionLetter = (target_index: number) => { + let arr_medical_action_letter = formValues.medical_action_letter.filter((file: any, index: number) =>{ + if (target_index !== index) { + return file; + } + }); + + setValue('medical_action_letter', arr_medical_action_letter) + }; + const handleRemoveFileResult = (target_index: number) => { + let arr_result = formValues.result.filter((file: any, index: number) =>{ + if (target_index !== index) { + return file; + } + }); + + setValue('result', arr_result) }; // Submit Form @@ -106,8 +162,8 @@ export default function DetailMonitoringList() { if (response == true) { reset(); - navigate('case_management/daily_monitoring/'+claim_code+'claims'); - window.location.reload() + navigate('/case_management/daily_monitoring/'+member_id+'/claims', { replace: true }); + // window.location.reload() } } @@ -370,7 +426,7 @@ export default function DetailMonitoringList() { { - formValues.lab_result_file.map((file: any, index: number) => ( + formValues.confirmation_medical_leter.map((file: any, index: number) => ( @@ -379,7 +435,7 @@ export default function DetailMonitoringList() { handleRemoveFile(index)} + onClick={() => handleRemoveFileConfirmationMedicalLeter(index)} sx={{cursor: 'pointer'}} > @@ -387,7 +443,7 @@ export default function DetailMonitoringList() { } - fileInput.current?.click()}> + fileInput1.current?.click()}> - Upload Result + Upload File handleInputChangeConfirmationMedicalLeter(e)} accept="application/pdf" /> @@ -417,8 +473,165 @@ export default function DetailMonitoringList() { {/* Medical Action Letter */} + + + + + Medical Action Letter* + + + + { + formValues.medical_action_letter.map((file: any, index: number) => ( + + + + {file.name ? file.name : '-'} + + handleRemoveFileMedicalActionLetter(index)} + sx={{cursor: 'pointer'}} + > + + )) + } + + + fileInput2.current?.click()}> + + + + Upload File + + + + + + + + - {/* Button Cancle & Save */} + + {/* Laboratorium */} + + + + + Laboratorium Result* + + + + + Date* + + + + + Provider* + + + + + + + + + + + + Examination* + + + + + + + + Laboratorium Result* + + + + { + formValues.result.map((file: any, index: number) => ( + + + + {file.name ? file.name : '-'} + + handleRemoveFileResult(index)} + sx={{cursor: 'pointer'}} + > + + )) + } + + + fileInput3.current?.click()}> + + + + Upload File + + + + + + + + + + + {/* Button Cancel & Save */} @@ -426,7 +639,7 @@ export default function DetailMonitoringList() { Cancel - Save Changes + Add diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringList.tsx b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringList.tsx index da31d37d..3c96fa02 100644 --- a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringList.tsx +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringList.tsx @@ -27,7 +27,7 @@ import FiberManualRecord from '@mui/icons-material/FiberManualRecord'; * Utils, Types, Functions * ============================================ */ -import { fDate } from "@/utils/formatTime"; +import { fDate, fDateOnly } from '@/utils/formatTime'; import { getMonitoringDetailList } from '../Model/Functions'; import { DetailMonitoringListType } from '../Model/Types'; @@ -87,6 +87,22 @@ export default function DetailMonitoringList() { > {row.created_at ? fDate(row.created_at) : '-'} + + {row.discharge_date.discharge_date ? + () : ()} + {/* card body */} @@ -160,21 +176,6 @@ export default function DetailMonitoringList() { - - - - - Subject : - - - - - {row.subject} - - - - - @@ -190,21 +191,6 @@ export default function DetailMonitoringList() { - - - - - Complaints : - - - - - {row.complaints} - - - - - @@ -215,7 +201,7 @@ export default function DetailMonitoringList() { { - row.medical_plan.map((data, index) => { + row.medical_plan?.map((data, index) => { return ( {data.medical_plan_str} @@ -227,6 +213,164 @@ export default function DetailMonitoringList() { + + + + + + Non Medikamentosa Plan : + + + + + { + row.non_medikamentosa_plan?.map((data, index) => { + return ( + + {data.non_medikamentosa_plan_str} + + ) + }) + } + + + + + + + + + + Laboratorium Result : + + + + + + Date + + + + + { row.lab_date != null ? fDate(row.lab_date) : '-'} + + + + + + + Location + + + + + {row.provider} + + + + + + + Examination + + + + + {row.examination} + + + + + + + + + + + Document Confirmation Medical Letter: + + + + + {row.document?.map((data, index) => ( + + {data.type === 'confirmation-medical-letter' ? ( + <> + + + {data.file_name} + + + ) : null} + + ))} + + + + + + + + + Document Medical Action Letter: + + + + + {row.document?.map((data, index) => ( + + {data.type === 'medical-action-letter' ? ( + <> + + + {data.file_name} + + + ) : null} + + ))} + + + + + + + + + Document Laboratorium Result: + + + + + {row.document?.map((data, index) => ( + + {data.type === 'laboratorium-result' ? ( + <> + + + {data.file_name} + + + ) : null} + + ))} + + + + + diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DialogConfirmation.tsx b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DialogConfirmation.tsx new file mode 100644 index 00000000..d391a9ad --- /dev/null +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DialogConfirmation.tsx @@ -0,0 +1,92 @@ +import MuiDialog from "@/components/MuiDialog"; +import { Button, Card, Checkbox, DialogActions, Grid, Typography } from "@mui/material"; +import { Paper } from "@mui/material"; +import { Stack } from '@mui/material'; +import React, { useState } from 'react'; +import { fDate, fDateTimesecond, toTitleCase } from "@/utils/formatTime"; +import axios from "@/utils/axios"; +import { enqueueSnackbar } from "notistack"; +import { useNavigate } from "react-router"; +import { replace } from "lodash"; +import { ClaimListType } from "../Model/Types"; +import Label from "@/components/Label"; + + +type DialogConfirmationType = { + openDialog: boolean; + setOpenDialog: any; + onSubmit?: void; + row: ClaimListType; +} + +export default function DialogConfirmation({ setOpenDialog, openDialog, row} : DialogConfirmationType ) { + + const navigate = useNavigate(); + const handleSubmit = () => { + axios + .post(`case_management/daily_monitoring/detail/${row.code}/update-status`) + .then((response) => { + enqueueSnackbar('Close Monitoring Success', { variant: 'success' }); + setOpenDialog(false); + navigate(`/case_management/daily_monitoring/${row.member_id}/claims`, { replace: true }) + window.location.reload(); + }) + .catch(({ response }) => { + enqueueSnackbar(response.data.message ?? 'Something went wrong!', { variant: 'error' }); + }); + } + + const style1 = { + color: '#919EAB', + width: '30%' + } + const style2 = { + width: '70%' + } + const marginBottom1 = { + marginBottom: 1, + } + + const handleCloseDialog = () => { + setOpenDialog(false); + } + + const getContent = () => ( + + Are you sure to closed this monitoring ? + + + + Name + {row.name} + + + Code + {row.code} + + + Admision Date + + + + + + + + + + + + ); + + + return ( + + ); +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Functions.ts b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Functions.ts index 05ace34d..fd68763e 100644 --- a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Functions.ts +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Functions.ts @@ -1,6 +1,8 @@ import axios from '@/utils/axios'; +import { makeFormData } from '@/utils/jsonToFormData'; import { enqueueSnackbar } from 'notistack'; import { DailyMonitoringListType, DetailMonitoringListType, ResponseListingClaimType } from "./Types"; +import { fDate, fDateOnly } from '@/utils/formatTime'; /** * Listing Daily Monitoring @@ -44,9 +46,11 @@ export const getClaimList = async ( member_id: string ): Promise => { - const response = await axios.post(`/case_management/daily_monitoring/detail/${claim_code}/add`, { - ...data - }) + data.lab_date = data.lab_date != '' && data.lab_date != null ? fDateOnly(data.lab_date) : ''; + + const formData = makeFormData({...data}); + + const response = await axios.post(`/case_management/daily_monitoring/detail/${claim_code}/add-request`, formData) .then((res) =>{ enqueueSnackbar(res.data.message, { variant: 'success', diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Types.ts b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Types.ts index 5d8c058d..3e4706c5 100644 --- a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Types.ts +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Types.ts @@ -35,6 +35,7 @@ export type ClaimListType = { admission_date : string, discharge_date : string, claim_code : string, + name : string, code : string, service_name : string, claim_status : string, @@ -56,8 +57,15 @@ export type DetailMonitoringListType = { diastole : string analysis : string, complaints : string, + lab_date : string, + provider : string, + examination : string, medical_plan : MedicalPlanStrType[], non_medikamentosa_plan : NonMedikamentosaPlanType[], + confirmation_medical_leter : files[], + medical_action_letter : files[], + result : files[], + document : document[], created_at : string|null } @@ -68,3 +76,13 @@ export type MedicalPlanStrType = { export type NonMedikamentosaPlanType = { non_medikamentosa_plan_str: string } + +export type files = { + file: string +} + +export type document = { + file_name: string, + path: string, + type: string +} diff --git a/frontend/dashboard/src/pages/Corporates/Member/List.tsx b/frontend/dashboard/src/pages/Corporates/Member/List.tsx index b2e0c17e..b6030f4f 100644 --- a/frontend/dashboard/src/pages/Corporates/Member/List.tsx +++ b/frontend/dashboard/src/pages/Corporates/Member/List.tsx @@ -94,6 +94,7 @@ export default function CorporatePlanList({handleSubmitSuccess}) { const { corporate_id } = useParams(); const [searchParams, setSearchParams] = useSearchParams(); const [importResult, setImportResult] = useState(null); + const [sendResult, setSendResult] = useState(null); const [openDialog, setOpenDialog] = useState(false); const [isDialog, setIsDialog] = useState(''); @@ -267,6 +268,25 @@ export default function CorporatePlanList({handleSubmitSuccess}) { }); } + const handleSendAllEcard = () => { + setImportLoading(true); + setDataTableLoading(true); + axios + .get(`send_card/${corporate_id}`) + .then((response) => { + loadDataTableData(); + }) + + .catch((response) => { + enqueueSnackbar( + 'Looks like something went wrong. Please check your data and try again.', + { variant: 'error' } + ); + setImportLoading(false); + loadDataTableData(); + }); + } + const handleCancelImportButton = () => { importPlan.current.value = ''; importPlan.current.dispatchEvent(new Event('change', { bubbles: true })); @@ -363,6 +383,9 @@ export default function CorporatePlanList({handleSubmitSuccess}) { Download Member + + Send All Ecard + )} @@ -413,6 +436,7 @@ export default function CorporatePlanList({handleSubmitSuccess}) { )} + ); } @@ -470,6 +494,21 @@ export default function CorporatePlanList({handleSubmitSuccess}) { const style1 = { color: '#637381' } + + + const handleDownloadEcard = (id: number) => { + axios + .get(`view_card/${id}`, { + responseType: 'blob', + }) + .then((response) => { + window.open(URL.createObjectURL(response.data)); + }) + .catch((response) => { + enqueueSnackbar(response.message, { variant: 'error' }); + }); + } + return ( @@ -527,6 +566,10 @@ export default function CorporatePlanList({handleSubmitSuccess}) { Update Status + handleDownloadEcard(row.id)}> + + Download E-card + navigate ('/corporates/'+corporate_id+'/members/'+row.id+'/history')}> History diff --git a/public/images/background-vale.png b/public/images/background-vale.png new file mode 100644 index 0000000000000000000000000000000000000000..e41e2fa3b57858ffefc7ae9e82fa1e2c32bde46d GIT binary patch literal 9049 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 literal 0 HcmV?d00001 diff --git a/public/images/logo-default.png b/public/images/logo-default.png new file mode 100644 index 0000000000000000000000000000000000000000..267e2e13466f94378cef55007cdfee71d20ad328 GIT binary patch literal 21008 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 literal 0 HcmV?d00001 diff --git a/resources/views/pdf/ecard.blade.php b/resources/views/pdf/ecard.blade.php index 003b4dfa..99c30f7e 100644 --- a/resources/views/pdf/ecard.blade.php +++ b/resources/views/pdf/ecard.blade.php @@ -2,7 +2,6 @@ - Guarantee Letter {{ $member->name }} {{-- --}} @@ -13,69 +12,111 @@ src: url('{{asset('fonts/PublicSans-Medium.ttf')}}') format('truetype'); } */ + html, body { + height: 100%; + margin: 0; + padding: 0; + } + body { font-family: 'Public Sans'; color: #404040; font-size: 20px; + margin: 0; /* Reset default margin */ + padding: 0; /* Reset default padding */ + background-image: url("{{ public_path('images/background-vale.png') }}"); + background-repeat: no-repeat; + background-size: cover; /* Adjust as needed */ } .text-sm { font-size: 18px; + color: #FFFFFF } .text-md { - font-size: 20px; + font-size: 18px; + color: #159C9C } .text-lg { font-size: 22px; + color: #117D7D; + } .text-gray { color: #919EAB; } - - #member-detail{ - - } - #member-detail td { - width: 50%; - padding: 10px 0px; - } - #member-detail td>div{ - margin-bottom: 5px; + + .content { + margin: 10% 0 0 0; } - .benefit-table-wrapper { - border: 1px solid #E0E0E0; - border-radius: 5px; - overflow: hidden; - } - #benefit-table { - width: 100%; - border-collapse: collapse; + .image-container { + margin-left: 75%; /* Adjust the margin as needed */ } - #benefit-table th, #benefit-table th { - width: 50%; + .label { + background-color: #117D7D; + color: #fff; + border-radius: 15px; + padding: 8px; /* Sesuaikan dengan kebutuhan Anda */ + font-size: 18px; + gap: 4px; + display: inline-flex; /* Untuk memastikan ikon dan teks berada dalam satu baris */ + align-items: center; /* Untuk memastikan ikon dan teks berada dalam satu baris */ } - #benefit-table th{ - font-size: 20px; - font-weight: 400; - padding: 15px; - text-align: left; + .label svg { + margin-right: 4px; /* Jarak antara ikon dan teks */ } - #benefit-table tr:first-child { - background: #F5F5F5; - border-bottom: 1px solid #E0E0E0; + .text-sm { + font-size: 18px; /* Sesuaikan dengan kebutuhan Anda */ } - #benefit-table td { - padding: 15px; - font-size: 20px; - } + -

Hi {{ $member->name }}

+



+
+
+ Member Name +

{{ $member->fullName }}

+ + Member ID +

{{ $member->member_id }}

+ + Policy Holder +

{{ $member->currentCorporate->name }}

+ + Policy Number +

{{ $member->currentPolicy->code }}

+ + Date of Birth +

{{ $member->birthDateeCard }}

+ + Gender +

{{ $member->gender }}

+ + Start Date +

{{ $member->startDate }}

+ +
+ +
+ + + + + + 08114123962 + + + Valid until: {{ $member->endDate }} +
+ +
+ + \ No newline at end of file