diff --git a/Modules/Client/Http/Controllers/Api/DailyMonitoringController.php b/Modules/Client/Http/Controllers/Api/DailyMonitoringController.php new file mode 100755 index 00000000..331611fd --- /dev/null +++ b/Modules/Client/Http/Controllers/Api/DailyMonitoringController.php @@ -0,0 +1,913 @@ + ':attribute harus diisi', + 'integer' => ':attribute harus angka', + 'unique' => ':attribute (:input) sudah ada', + 'max' => ':attribute maximal :max karakter', + 'exists' => ':attribute (:input) tidak ditemukan', + 'numeric' => ':attribute harus angka', + 'digits_between'=> ':attribute maximal :max digit minimal :min digit' + ]; + } + + public function GetMemberList(Request $request) + { + $startDate = $request->start_date ? Carbon::parse($request->start_date) : Carbon::today(); + $endDate = $request->end_date ? Carbon::parse($request->end_date)->addDay() : Carbon::today()->addDay(); + + $memberList = DB::table('request_log_daily_monitorings') + ->leftJoin('request_logs', 'request_log_daily_monitorings.request_log_id', '=', 'request_logs.id') + ->leftJoin('members', 'request_logs.member_id', '=', 'members.id') + ->leftJoin('organizations', 'organizations.id', '=', 'request_logs.organization_id') + ->select( + 'members.member_id', + 'members.name', + 'members.birth_date', + 'request_logs.type_of_member as member_type', + 'members.members_effective_date AS startdate', + 'members.members_expire_date AS enddate', + 'request_logs.submission_date as addmision_date', + 'organizations.name as provider', + 'request_logs.organization_id', + 'request_logs.code', + // Using a subquery to fetch medical_plan + DB::raw('(SELECT plan FROM request_log_medical_plan rdm WHERE rdm.request_log_daily_monitoring_id = request_log_daily_monitorings.id AND type = 1 LIMIT 1) as medical_plan'), + DB::raw('(SELECT plan FROM request_log_medical_plan rdm WHERE rdm.request_log_daily_monitoring_id = request_log_daily_monitorings.id AND type = 2 LIMIT 1) as non_medical_plan'), + 'request_log_daily_monitorings.*' + ) + ->whereNull('request_logs.deleted_at') // Use whereNull() for checking NULL + ->when($request->search, function ($q, $search) { + $q->where(function ($subQ) use ($search) { + $subQ->where('members.member_id', 'LIKE', "%{$search}%"); + $subQ->orWhere('members.name', 'LIKE', "%{$search}%"); + }); + }) + ->when($startDate, function ($q) use ($startDate) { + $q->where('request_log_daily_monitorings.submission_date', '>=', $startDate); + }) + ->when($endDate, function ($q) use ($endDate) { + $q->where('request_log_daily_monitorings.submission_date', '<=', Carbon::parse($endDate)->addDay()); + }) + ->orderBy('request_logs.created_at', 'desc') + ->paginate(); + + return Helper::paginateResources(DailyMonitoringResource::collection($memberList)); + } + + /** + * Claim List - by member id + */ + public function GetClaimList(Request $request, $member_id) + { + $memberDetail = DB::table('members') + ->select('id','member_id','name') + ->where('member_id', $member_id) + ->first(); + + $claimList = DB::table('request_logs') + ->leftJoin('services', 'services.code', '=', 'request_logs.service_code') + ->leftJoin('members', 'members.id', '=', 'request_logs.member_id') + ->select('request_logs.id','request_logs.submission_date AS admission_date','request_logs.discharge_date','request_logs.code','services.name as service_name','request_logs.status','members.name', 'members.member_id') + ->where('request_logs.service_code', 'IP') + ->where('request_logs.deleted_at', null) + // ->where('request_logs.status_final_log', 'approved') + ->where("request_logs.member_id", "=", $memberDetail->id) + ->where("request_logs.organization_id", "=", $request->organization_id) + ->when($request->search, function ($q, $search) { + $q->where('request_logs.code', 'LIKE', "%".$search."%"); + }) + ->orderBy("request_logs.created_at", "desc") + // ->get() + ->paginate(); + + return response()->json([ + 'error' => false, + 'message' => "success", + 'data' => [ + 'member_detail'=> $memberDetail, + 'claim_list' => $claimList, + ] + ],200); + } + + /** + * Detail Monitoring List - by claim_code + */ + public function GetDetailMonitoringList(Request $request, $request_code) + { + // get id request log + $request_logs = DB::table('request_logs') + ->select('id','organization_id') + ->where('code', $request_code) + ->first(); + + $detail_list = RequestDailyMonitoring::where('request_log_id', empty($request_logs) == false ? $request_logs->id : '') + ->orderBy("submission_date", "desc") + ->get(); + + return response()->json([ + 'error' => false, + 'message' => "success", + 'data' => [ + 'detail_list'=> $detail_list, + 'organization_id' => $request_logs ? $request_logs->organization_id : 0 + ] + ],200); + } + + public function GetDetailMonitoringListbyID(Request $request, $id) + { + + $detail = RequestDailyMonitoring::where('id', $id) + ->orderBy("created_at", "desc") + ->first(); + + if ($detail) { + // Ubah menjadi array agar bisa dimodifikasi + $detailArray = $detail->toArray(); + + // Ubah nama key dari request_log_id menjadi log_id + $detailArray['log_code'] = $detailArray['request_log_id']; + unset($detailArray['request_log_id']); + } else { + $detailArray = null; + } + + return response()->json([ + 'error' => false, + 'message' => "success", + 'data' => $detailArray, + ], 200); + + } + + public function UpdateDetailMonitoringbyID(Request $request) + { + // validation rule + $validator = Validator::make($request->all(),[ + 'log_code' => 'required', + 'reason' => '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([ + 'request_log_id' => $request->log_code, + '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, + 'doctor_1' => $request->doctor_1, + 'doctor_2' => $request->doctor_2, + 'temp_diagnosis' => $request->temp_diagnosis, + 'final_diagnosis' => $request->final_diagnosis, + 'approval_pendamping' => $request->approval_pendamping, + 'description' => $request->keterangan, + 'note' => $request->catatan, + '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 + */ + public function AddDetailMonitoringList(Request $request, $claim_code) + { + $request->merge(['claim_code' => $claim_code]); + + // validation rule + $validator = Validator::make($request->all(),[ + 'claim_code' => 'required|exists:claim_requests,code', + 'subject' => 'required', + 'sistole' => 'required|numeric', + 'diastole' => 'required|numeric', + 'body_temperature' => 'required|numeric', + 'respiration_rate' => 'required|numeric', + 'analysis' => 'required', + 'complaints' => 'required', + 'medical_plan' => 'required', + ],$this->messages()); + + // validation error + if ($validator->fails()) { + return response()->json([ + 'error' => true, + 'message' => $validator->getMessageBag() + ],400); + } + + // get claim request + $claim_request = DB::table('claim_requests') + ->select('id') + ->where('code', $claim_code) + ->first(); + + // get claim + $claim = DB::table('claims') + ->select('id') + ->where('claim_request_id', $claim_request->id) + ->first(); + DB::beginTransaction(); + try { + // insert claim daily monitoring + $db_response = DailyMonitoring::create([ + 'claim_id' => $claim->id, + 'subject' => $request->subject, + 'objective' => $request->objective, + 'sistole' => $request->sistole, + 'diastole' => $request->diastole, + 'body_temperature' => $request->body_temperature, + 'respiration_rate' => $request->respiration_rate, + 'analysis' => $request->analysis, + 'complaints' => $request->complaints, + ]); + + + // 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) { + MedicalPlan::create([ + 'claim_daily_monitoring_id' => $db_response->id, + 'plan' => $row['medical_plan_str'], + ]); + } + + 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 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', + 'submission_date' => 'required', + 'body_temperature' => 'required', + 'sistole' => 'required', + 'diastole' => 'required', + 'respiration_rate' => 'required', + '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, + '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, + '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); + } + + // 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; + $orignalName = $file->getClientOriginalName(); + $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' => $orignalName, + '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; + $orignalName = $file->getClientOriginalName(); + $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' => $orignalName, + '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(); + $orignalName = $file->getClientOriginalName(); + $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' => $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); + } + } + + public function AddListRequestLog(Request $request) + { + // validation rule + $validator = Validator::make($request->all(),[ + 'log_code' => 'required|exists:request_logs,id', + 'subject' => 'required', + 'submission_date' => 'required', + 'body_temperature' => 'required', + 'sistole' => 'required', + 'diastole' => 'required', + 'respiration_rate' => 'required', + '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('id', $request->log_code) + ->first(); + DB::beginTransaction(); + try { + // insert claim daily monitoring + $db_response = RequestDailyMonitoring::create([ + 'request_log_id' => $request->log_code, + 'submission_date' => $request->submission_date, + 'doctor_1' => $request->doctor_1, + 'doctor_2' => $request->doctor_2, + 'temp_diagnosis' => $request->temp_diagnosis, + 'final_diagnosis' => $request->final_diagnosis, + 'approval_pendamping' => $request->approval_pendamping, + 'description' => $request->keterangan, + 'note' => $request->catatan, + '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, + '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); + } + + // 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; + $orignalName = $file->getClientOriginalName(); + $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' => $orignalName, + '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; + $orignalName = $file->getClientOriginalName(); + $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' => $orignalName, + '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(); + $orignalName = $file->getClientOriginalName(); + $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' => $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); + } + } + + /** + * Delete Listing Daily Monitoring + */ + public function deleteDetailMonitoringListRequestLog(Request $request, $id) + { + $listDailyMonitoring = RequestDailyMonitoring::find($id); + $listDailyMonitoring->reason = $request->reason; + $listDailyMonitoring->save(); + + if (!$listDailyMonitoring) { + return response()->json([ + 'error' => true, + 'message' => "Data not found.", + ], 404); + } + + $listDailyMonitoring->delete(); + + return response()->json([ + 'error' => false, + 'message' => "Delete success", + 'data' => $listDailyMonitoring + ], 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 + */ + public function UpdateListRequestLog(Request $request, $request_code) + { + // get claim request + $request_log = DB::table('request_logs') + ->where('code', $request_code) + ->update([ + 'discharge_date' => now(), + 'updated_by' => auth()->user()->id, + 'updated_at' => 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/Client/Routes/api.php b/Modules/Client/Routes/api.php index bf4635c0..27443755 100755 --- a/Modules/Client/Routes/api.php +++ b/Modules/Client/Routes/api.php @@ -19,6 +19,8 @@ use Modules\Internal\Http\Controllers\Api\FormulariumTemplateController; use Modules\Internal\Http\Controllers\Api\AuditTrailController; use Modules\Internal\Http\Controllers\Api\CorporateController; use Modules\Internal\Http\Controllers\Api\NavigationController; +use Modules\Client\Http\Controllers\Api\DailyMonitoringController; +use Modules\Internal\Http\Controllers\Api\RequestLogController; use Modules\Internal\Http\Controllers\Api\UserManagementController; @@ -35,6 +37,8 @@ use Modules\Internal\Http\Controllers\Api\UserManagementController; Route::prefix('client')->group(function () { + Route::get('codeLog', [RequestLogController::class, 'codeLog']); + Route::controller(AuthController::class)->group(function () { Route::post('login', 'login'); Route::post('verify-code', 'validateOtp'); @@ -80,6 +84,15 @@ Route::prefix('client')->group(function () { Route::get('download-ecard/{member_id}', [CorporateMemberController::class, 'downloadEcard']); Route::get('view_card/{member_id}', [CorporateMemberController::class, 'viewECard']); }); + + Route::get('memberlist', [DailyMonitoringController::class, 'GetMemberList']); + + // 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::get('claims/{id}', [ClaimController::class, 'show']); Route::post('claim-requests', [ClaimRequestController::class, 'store'])->name('claim-requests.store'); diff --git a/database/seeders/NavigationSeeder.php b/database/seeders/NavigationSeeder.php index 7e1cf74b..32f368bf 100755 --- a/database/seeders/NavigationSeeder.php +++ b/database/seeders/NavigationSeeder.php @@ -263,6 +263,11 @@ class NavigationSeeder extends Seeder 'path' => '/alarm-center', 'permission' => 'alarm-center-list-client-portal' ], + [ + 'title' => 'Daily Monitoring', + 'path' => '/daily_monitoring', + 'permission' => 'daily-monitoring-list-client-portal' + ], [ 'title' => 'Formularium', 'path' => '/master/formularium-template-v2', diff --git a/database/seeders/PermissionTableSeeder.php b/database/seeders/PermissionTableSeeder.php index f2d6af41..dbbfabec 100755 --- a/database/seeders/PermissionTableSeeder.php +++ b/database/seeders/PermissionTableSeeder.php @@ -85,6 +85,7 @@ class PermissionTableSeeder extends Seeder 'employee-data-list-client-portal', 'corporate-client-portal', 'alarm-center-list-client-portal', + 'daily-monitoring-list-client-portal', 'formularium-list-client-portal', 'case-management-client-portal', 'service-monitoring-limit-client-portal', diff --git a/frontend/client-portal/.env.development b/frontend/client-portal/.env.development index 91cbcee5..1e537983 100755 --- a/frontend/client-portal/.env.development +++ b/frontend/client-portal/.env.development @@ -5,5 +5,6 @@ PORT=8083 REACT_APP_HOST_API_URL="https://aso-api.linksehat.dev/api/client" # VITE_API_URL="https://aso-api.linksehat.dev/api/client" -VITE_API_URL="https://aso-api.linksehat.dev/api/client" +# VITE_API_URL="https://aso-api.linksehat.dev/api/client" +VITE_API_URL="http://localhost:8000/api/client" \ No newline at end of file diff --git a/frontend/client-portal/src/@types/claims.ts b/frontend/client-portal/src/@types/claims.ts new file mode 100755 index 00000000..40e282a0 --- /dev/null +++ b/frontend/client-portal/src/@types/claims.ts @@ -0,0 +1,116 @@ +import { Benefit } from "./corporates"; +import { Member } from "./member"; + +export type ClaimRequest = { + id: number; + code: string; + name: string; + submission_date: string; + payment_type: string; + service_code: string; + claim_method: string; + service_type: string; + service_name: string; + code_provider: string; + file_condition: Files; + member: Member; + claim: { + organization: Organizations + } + provider_code: string, + organization: { + code: string + } + }; + +export type Claims = { + id: number; + code: string; + plan: Plan; + payor_id: string; + corporate_id: string; + policy_number: string; + benefit_desc: string; + member: Member; + benefit: Benefit | boolean; + status: string; + claim_request: ClaimRequest; +}; + +export type ClaimsEdit = { + id: number; + plan_id: string; + payor_id: string; + corporate_id: string; + policy_number: string; + member_id: string; + benefit_code: string; + benefit_desc: string; + amount_incurred: number; + amount_approved: number; + amount_not_approved: number; + excess_paid: number; +} + +export type Files = { + name: string; + url: string; + path: string; +} + +export type Plan = { + code: string; +} + +export type ClaimHistoryCare = { + id: number; + claim_id: number; + service_code: string; + admission_date: string; + discharge_date: string; + main_diagnosis_id: number; + main_diagnosis_name: string; + medical_record_number: string; + organization_id: number; + practitioner_id: number; + organization_name: string; + practitioner_name: string; + secondary_diagnosis_id: number[]; + sign: string; + symptoms: string; + name: any; +} + +export type Organizations = { + id: number; + code: string; + name: string; + address: string; + type: string; + lat: string; + lng: string; + phone: string; + timezone: string; + active: boolean | number; + province_id: number; + city_id: number; + district_id: number; + village_id: number; + postal_code: string; + description: string; + technology: string; + support_services: string; + merchant_code: string; + merchant_key: string; + image_url: string; + region_groups: string; +}; + +export type Import = { + result_file: { + url: string, + name: string, + total_success_row: number, + total_failed_row: number + } +} diff --git a/frontend/client-portal/src/pages/DailyMonitoring/Components/DailyMonitoringList.tsx b/frontend/client-portal/src/pages/DailyMonitoring/Components/DailyMonitoringList.tsx new file mode 100755 index 00000000..3c997f77 --- /dev/null +++ b/frontend/client-portal/src/pages/DailyMonitoring/Components/DailyMonitoringList.tsx @@ -0,0 +1,457 @@ +/** + * Core + * ============================================ + */ +import React, { ChangeEvent, useEffect, useRef, useState } from "react"; +import { Box, Paper, TableContainer, Table, TableHead, TableRow, TableCell, TableBody, Stack, TextField, Button, Menu, Typography, ButtonGroup, } from "@mui/material"; + +/** + * Types & Functions + * ============================================ + */ +import { getDailyMonitoringList } from "../Model/Functions"; +import { DailyMonitoringListType } from "../Model/Types"; +import DailyMonitoringListRow from "./DailyMonitoringListRow"; +import { LaravelPaginatedData, LaravelPaginatedDataDefault } from "../../../@types/paginated-data"; +import { Grid } from "@mui/material"; +import DataTable from '../../../components/LaravelTable'; +import DownloadIcon from '@mui/icons-material/Download'; +import CancelIcon from '@mui/icons-material/Cancel'; +import UploadIcon from '@mui/icons-material/Upload'; +import { MenuItem } from "@mui/material"; +import { useNavigate, useSearchParams } from "react-router-dom"; +import axios from "../../../utils/axios"; +import { DesktopDatePicker, LocalizationProvider } from "@mui/x-date-pickers"; +import { AdapterDateFns } from "@mui/x-date-pickers/AdapterDateFns"; +import { fDate } from "../../../utils/formatTime"; +import { LoadingButton } from "@mui/lab"; +import { Import } from "../../../@types/claims"; +import { HeadCell, Order } from '../../../@types/table'; +import { fDateOnly } from "../../../utils/formatTime"; + +export default function DailyMonitoringList() { + const [searchParams, setSearchParams] = useSearchParams(); + // State + // -------------------- + const [dataTableIsLoading, setDataTableLoading] = useState(true); + const [dataTableData, setDataTableData] = useState( + LaravelPaginatedDataDefault + ); + + // Tabel Style + // -------------------- + const TableHeadStyle = { + fontWeight: 'bold', + }; + + const [importResult, setImportResult] = useState(null); + // Load Data + // ------------------- + const loadDataTableData = async (appliedFilter: any | null = null) => { + setDataTableLoading(true); + const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]); + + const response = await axios.get('/memberlist', {params: filter}) + setDataTableLoading(false); + setDataTableData(response.data); + } + + const applyFilter = async (searchFilter: { search: string }) => { + await loadDataTableData(searchFilter); + setSearchParams(searchFilter); + }; + + const handlePageChange = (event: ChangeEvent, value: number): void => { + const filter = Object.fromEntries([...searchParams.entries(), ['page', value]]); + loadDataTableData(filter); + setSearchParams(filter); + }; + + + /* ------------------------------ handle params ----------------------------- */ + const [appliedParams, setAppliedParams] = useState({}); + + const params = { + searchParams: searchParams, + setSearchParams: setSearchParams, + appliedParams: appliedParams, + setAppliedParams: setAppliedParams, + }; + + /* ------------------------------ handle order ------------------------------ */ + const [order, setOrder] = useState('desc'); + const [orderBy, setOrderBy] = useState('submission_date'); + + const orders = { + order: order, + setOrder: setOrder, + orderBy: orderBy, + setOrderBy: setOrderBy, + }; + + /* ------------------------------- handle sort ------------------------------ */ + const handleRequestSort = async (event: React.MouseEvent, property: string) => { + const isAsc = orders?.orderBy === property && orders?.order === 'asc'; + + orders?.setOrder(isAsc ? 'desc' : 'asc'); + orders?.setOrderBy(property); + const parameters = Object.fromEntries([ + ...(params?.searchParams.entries() as IterableIterator<[string, string]>), + ['order', isAsc ? 'desc' : 'asc'], + ['orderBy', property], + ]); + params?.setAppliedParams(parameters); + }; + + useEffect(() => { + loadDataTableData(); + }, [appliedParams, searchParams, order, orderBy, setSearchParams]) + + function SearchInput(props: any) { + // SEARCH + const searchInput = useRef(null); + const [searchText, setSearchText] = useState(''); + // Start Date + // con + + const handleSearchChange = (event: any) => { + const newSearchText = event.target.value ?? ''; + setSearchText(newSearchText); + }; + + + const today = new Date(); // Default ke hari ini + + const [startDate, setStartDate] = useState(today); + const [endDate, setEndDate] = useState(today); + + useEffect(() => { + // Set nilai default saat pertama kali load jika searchParams kosong + const paramStartDate = searchParams.get('start_date'); + const paramEndDate = searchParams.get('end_date'); + + if (paramStartDate) { + setStartDate(new Date(paramStartDate)); + } + if (paramEndDate) { + setEndDate(new Date(paramEndDate)); + } + }, []); + + useEffect(() => { + // Trigger First Search + setSearchText(searchParams.get('search') ?? ''); + }, []); + + return ( +
+ + + { + if (event.key === 'Enter') { + // handleSearchSubmit(event); + + const filter = Object.fromEntries([ + ...searchParams.entries(), + ['search', searchText], + ]); + setSearchParams(filter); + loadDataTableData(filter); + } + }} + value={searchText} + placeholder='Search Code or Name...' + /> + + {/* Start Date */} + + + { + if (value) { + setStartDate(value); + const dateStr = fDateOnly(value); + const filter = Object.fromEntries([...searchParams.entries(), ['start_date', dateStr]]); + setSearchParams(filter); + loadDataTableData(filter); + } + }} + renderInput={(params) => } + /> + + + + {/* End Date */} + + + { + if (value) { + setEndDate(value); + const dateStr = fDateOnly(value); + const filter = Object.fromEntries([...searchParams.entries(), ['end_date', dateStr]]); + setSearchParams(filter); + loadDataTableData(filter); + } + }} + renderInput={(params) => } + /> + + + + +
+ ); + } + + function ImportForm(props: any) { + // IMPORT + // Create Button Menu + const [anchorEl, setAnchorEl] = React.useState(null); + const createMenu = Boolean(anchorEl); + const importForm = useRef(null); + const [currentImportFileName, setCurrentImportFileName] = useState(null); + const [importLoading, setImportLoading] = useState(false); + + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + + const handleClose = () => { + setAnchorEl(null); + }; + + const handleImportButton = () => { + if (importForm?.current) { + handleClose(); + importForm.current ? importForm.current.click() : console.log('No File selected'); + } else { + alert('No file selected'); + } + }; + + const handleCancelImportButton = () => { + importForm.current.value = ''; + importForm.current.dispatchEvent(new Event('change', { bubbles: true })); + }; + + const handleImportChange = (event: any) => { + if (event.target.files[0]) { + setCurrentImportFileName(event.target.files[0].name); + } else { + setCurrentImportFileName(null); + } + }; + + const handleUpload = () => { + if (importForm.current?.files.length) { + const formData = new FormData(); + formData.append('file', importForm.current?.files[0]); + + setImportLoading(true); + axios + .post(`customer-service/request/import`, formData) + .then((response) => { + handleCancelImportButton(); + loadDataTableData(); + setImportResult(response.data); + // alert('Succesfully read '+ response.data.total_successed_row + ' with ' + response.data.total_failed_row + ' failed rows'); + setImportLoading(false); + }) + .catch((response) => { + enqueueSnackbar( + 'Looks like something went wrong. Please check your data and try again. ' + + response.message, + { variant: 'error' } + ); + setImportLoading(false); + }); + } else { + enqueueSnackbar('No File Selected', { variant: 'warning' }); + } + }; + + const handleGetTemplate = (type :string) => { + axios.get('corporates/import-document-example/' + type) + .then((response) => { + const link = document.createElement('a'); + link.href = response.data.data.file_url; + link.setAttribute('download', response.data.data.file_name); + document.body.appendChild(link); + link.click(); + handleClose(); + }) + } + + const handleGetData = (type :string) => { + + } + + const navigate = useNavigate() + + return ( +
+ + {!currentImportFileName && ( + + + + + Import + + { + handleGetTemplate('member'); + }} + > + Download Template + + navigate(`/daily_monitoring/add_monitoring`)}> + Tambah + + + + )} + + {currentImportFileName && ( + + + + + + + } + sx={{ p: 1.8 }} + onClick={handleUpload} + loading={importLoading} + > + Upload + + + )} + + {importResult && ( + + + Last Import Result :{' '} + + {importResult.total_success_row ?? 0} + {' '} + Row Processed,{' '} + + {importResult.total_failed_row} + {' '} + Failed, Report :{' '} + + {importResult.result_file?.name ?? '-'} + + + + )} +
+ ); + } + + function TableContent(){ + return ( + + {/* Head Table */} + + + + Code + Admission Date + Member ID + Name + Tanggal Lahir + Member Type + Medical Plan + Non Medical Plan + + + + + {/* Body Table */} + {dataTableIsLoading ? ( + + + Loading + + + ) : dataTableData.data.length == 0 ? ( + + + No Data + + + ) : dataTableData.data && dataTableData.data.length > 0 ? ( + + {dataTableData.data.map((row: DailyMonitoringListType, index) => ( + + ))} + + ) : null} + +
+ ) + } + + return ( + + + + + + + } + /> + + + ); + +} diff --git a/frontend/client-portal/src/pages/DailyMonitoring/Components/DailyMonitoringListRow.tsx b/frontend/client-portal/src/pages/DailyMonitoring/Components/DailyMonitoringListRow.tsx new file mode 100755 index 00000000..d17788a5 --- /dev/null +++ b/frontend/client-portal/src/pages/DailyMonitoring/Components/DailyMonitoringListRow.tsx @@ -0,0 +1,84 @@ +/** + * Core + * ============================================ + */ +import React, { useState } from "react"; +import { useNavigate } from "react-router"; +import { Box, Collapse, MenuItem, TableCell, TableRow, Stack } from "@mui/material"; +import Visibility from '@mui/icons-material/Visibility'; + +/** + * Component + * ============================================ + */ +// - Global - +import Label from "../../../components/Label"; +import TableMoreMenu from '../../../components/table/TableMoreMenu'; + +/** + * Utils, Types, Functions + * ============================================ + */ +import { fDate } from "../../../utils/formatTime"; +import { DailyMonitoringListType } from "../Model/Types"; +import { Edit } from "@mui/icons-material"; + +type Props = { + row: DailyMonitoringListType, + number: number +} + +export default function DailyMonitoringListRow ({ ...props }: Props) { + const navigate = useNavigate() + + return ( + + + td': { borderBottom: '1' } }}> + + {props.row.code} + + + + {props.row.member_id} + {props.row.name} + + + + + {props.row.member_type} + + + {props.row.medical_plan} + + + {props.row.non_medical_plan} + + + e.stopPropagation()}> + + + navigate(`/daily_monitoring/${props.row.member_id}/claims/${props.row.code}/list_monitoring`)}> + + View + + + } /> + + + + + + ); +} diff --git a/frontend/client-portal/src/pages/DailyMonitoring/Components/DetailMonitoringList.tsx b/frontend/client-portal/src/pages/DailyMonitoring/Components/DetailMonitoringList.tsx new file mode 100755 index 00000000..8cb81a30 --- /dev/null +++ b/frontend/client-portal/src/pages/DailyMonitoring/Components/DetailMonitoringList.tsx @@ -0,0 +1,526 @@ +/** + * Core + * ============================================ + */ +import React, { useEffect, useState } from 'react'; +import { useFieldArray, useForm } from 'react-hook-form'; +import { useNavigate, useParams } from 'react-router-dom'; +import { Box, IconButton, Typography, Grid, Card, List, ListItem, Stack, Autocomplete, TextField, Button } from '@mui/material'; +import { LoadingButton } from "@mui/lab"; + +/** + * Components + * ============================================ +*/ +// - Global - +import Page from '../../../components/Page'; +import Label from "../../../components/Label"; + +/** + * Icon + * ============================================ + */ +import ArrowBackIosNew from '@mui/icons-material/ArrowBackIosNew'; +import FiberManualRecord from '@mui/icons-material/FiberManualRecord'; + +/** + * Utils, Types, Functions + * ============================================ + */ +import { fDate, fDateOnly } from '../../../utils/formatTime'; +import { getMonitoringDetailList } from '../Model/Functions'; +import { getOrganizationId } from '../Model/Functions'; +import { DetailMonitoringListType } from '../Model/Types'; +import TableMoreMenu from '../../../components/table/TableMoreMenu'; +import { MenuItem } from '@mui/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'; +import { enqueueSnackbar } from 'notistack'; +import { escape } from 'lodash'; + + +export default function DetailMonitoringList() { + const { member_id, claim_code } = useParams(); + const navigate = useNavigate() + const pageTitle = claim_code??'_ _ _ _'; + + // State + // -------------------- + const [detailMonitoringList, setDetailMonitoringList] = useState(); + const [organizationId, setOrganizationId] = useState(); + + const [openDialog, setOpenDialog] = useState(false) + + // Use Effect + // -------------------- + useEffect(() => { + loadDataTableData(); + }, []) + + // Dialog + const marginBottom2 = { + marginBottom: 2, + } + const [selectedReason, setSelectedReason] = useState({value:'-', label:''}); + const reason = [ + { value: 'Wrong Setting', label: 'Wrong Setting' }, + { value: 'Hospital Request', label: 'Hospital Request' } + ]; + const [error, setError] = useState(''); + const [id, setId] = useState(null); + const [id_file, setIdFile] = useState(null); + + const handleCloseDialog = () => { + setOpenDialog(false); + } + const handleDelete = () => { + if(selectedReason.value != '-'){ + const parameters = { + 'reason' : selectedReason.value + } + 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 {id_file ? 'File ' : '' } Daily Monitoring ? + + + Reason for Delete* + + option.label} + fullWidth + value={selectedReason} + onChange={(event, newValue) => { + setSelectedReason(newValue); + // Validasi jika newValue adalah null + if (!newValue) { + setError('Please select a reason'); + } else { + setError(''); + } + }} + renderInput={(params) => ( + + )} + /> + + + + + + + + + ) + + + // Load Data + // ------------------- + const loadDataTableData = async () => { + const response = await getMonitoringDetailList(claim_code??''); + const organization_id = await getOrganizationId(claim_code??''); + + setDetailMonitoringList(response); + setOrganizationId(organization_id); + } + + function renderHTML(data: string) { + return ( +
+ ); + } + + return ( + + + {/* back button */} + + + navigate(`/daily_monitoring`)} > + + + + + {pageTitle} + + + + + {/* tabel claims */} + + + { + detailMonitoringList?.map((row, index) => { + return ( + + + {/* card header */} + + + + {row.discharge_date ? ( + + ) : ( + + )} + + {/* card body */} + + + + + + Subject : + + + + + {renderHTML(row.subject)} + + + + + + + + + + Object : + + + + + {renderHTML(row.object)} + + + + + + + Body Temperature + + + + + {row.body_temperature} Cel + + + + + Sistole + + + + + {row.sistole} mm[Hg] + + + + + Diastole + + + + + {row.diastole} mm[Hg] + + + + + Respiration Rate + + + + + {row.respiration_rate} / min + + + + + + + + + + + + Analysis : + + + + + {renderHTML(row.analysis)} + + + + + + + + + + Medical Plan : + + + + + { + row.medical_plan?.map((data, index) => { + return ( + + {renderHTML(data.medical_plan_str)} + + ) + }) + } + + + + + + + + + + Non Medikamentosa Plan : + + + + + { + row.non_medikamentosa_plan?.map((data, index) => { + return ( + + {renderHTML(data.non_medikamentosa_plan_str)} + + ) + }) + } + + + + + + + + + + Laboratorium Result : + + + + + + Date + + + + + { row.lab_date != null ? fDate(row.lab_date) : '-'} + + + + + + + Location + + + + + {row.provider != null ? row.provider : '-' } + + + + + + + Examination + + + + + {row.examination != null ? renderHTML(row.examination) : '-' } + + + + + + + + + + + Document Confirmation Medical Letter: + + + + + {row.document?.map((data, index) => ( + data.type === 'confirmation-medical-letter' ? ( + + + + ) : null + ))} + + + + + Document Medical Action Letter: + + + + + {row.document?.map((data, index) => ( + data.type === 'medical-action-letter' ? ( + + + + ) : null + ))} + + + + + + Document Examination Result: + + + + + {row.document?.map((data, index) => ( + data.type === 'laboratorium-result' ? ( + + + + ) : null + ))} + + + + + + + + + + + ) + }) + } + + + + {/* Dialog Delete */} + + + + ); +} diff --git a/frontend/client-portal/src/pages/DailyMonitoring/Model/Functions.ts b/frontend/client-portal/src/pages/DailyMonitoring/Model/Functions.ts new file mode 100755 index 00000000..cf1e18a4 --- /dev/null +++ b/frontend/client-portal/src/pages/DailyMonitoring/Model/Functions.ts @@ -0,0 +1,178 @@ +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 + */ +export const getDailyMonitoringList = async ( param: any) => { + const response = await axios.get('/case_management/memberlist', {params: param}) + .then((res) =>{ + return res.data; + }) + .catch((res) => { + enqueueSnackbar("server error !", { + variant: 'error', + }); + + return []; + }); + + return response; +}; + +/** + * Listing Claim + */ +export const getClaimList = async ( member_id: string ): Promise => { + const response = await axios.get(`/case_management/claimlist/${member_id}`) + .then((res) =>{ + return res.data.data; + }) + .catch((res) => { + enqueueSnackbar("server error !", { + variant: 'error', + }); + + return null; + }); + + return response; +}; + +/** + * Add Monitoring Detail + */ +export const AddMonitoringDetail = async ( claim_code: string,data: DetailMonitoringListType ): Promise => { + 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(`/daily_monitoring/add-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; +}; + +/** + * Get Monitoring Detail List + */ +export const getMonitoringDetailList = async ( claim_code: string ): Promise => { + const response = await axios.get(`/daily_monitoring/detail/${claim_code}/list`) + .then((res) =>{ + return res.data.data.detail_list; + }) + .catch((res) => { + enqueueSnackbar("server error !", { + variant: 'error', + }); + + return []; + }); + + return response; +}; + +/** + * Get Monitoring Detail List + */ +export const getOrganizationId = async ( claim_code: string ): Promise => { + const response = await axios.get(`/daily_monitoring/detail/${claim_code}/list`) + .then((res) =>{ + return res.data.data.organization_id; + }) + .catch((res) => { + enqueueSnackbar("server error !", { + variant: 'error', + }); + + return []; + }); + + return response; +}; + +/** + * Get detail monitoring + */ +export const getMonitoringDetailById = async ( id: string) => { + const response = await axios.get(`/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(`/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/client-portal/src/pages/DailyMonitoring/Model/Types.ts b/frontend/client-portal/src/pages/DailyMonitoring/Model/Types.ts new file mode 100755 index 00000000..30560d16 --- /dev/null +++ b/frontend/client-portal/src/pages/DailyMonitoring/Model/Types.ts @@ -0,0 +1,120 @@ +/** + * List Daily Monitoring + */ +export type DailyMonitoringListType = { + member_id : string, + member_type : string, + birth_date : string, + name : string, + start_date : string, + end_date : string, + description : string, + doctor_1 : string, + doctor_2 : string, + temp_diagnosis : string, + final_diagnosis : string, + approval_pendamping : string, + note : string, + addmision_date : string, + provider : string, + organization_id : number, + medical_plan : string, + non_medical_plan : string, +} + +/** + * Response Listing Claim + */ +export type ResponseListingClaimType = { + member_detail : MemberDetailType, + claim_list : ClaimListType[], +} + +/** + * Member Detail + */ +export type MemberDetailType = { + id : string, + member_id : string, + name : string, +} + +/** + * List Claim + */ +export type ClaimListType = { + claim_id : number, + admission_date : string, + discharge_date : string, + claim_code : string, + name : string, + code : string, + service_name : string, + claim_status : string, + service_type : string, + member_id : string +} + +/** + * Detail Monitoring List + */ +export type DetailMonitoringListType = { + id : number|null, + claim_id : string|null, + log_code : string|null, + request_log_id : string|null, + claim_code : string|undefined, + doctor_1 : string|undefined, + doctor_2 : string|undefined, + temp_diagnosis : string|undefined, + final_diagnosis : string|undefined, + approval_pendamping : string|undefined, + keterangan : string|undefined, + catatan : string|undefined, + description : string|undefined, + note : 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[], + medical_action_letter : files[], + result : files[], + document : document[], + created_at : string|null + data : { + organization_id : number + } +} + +export type MedicalPlanStrType = { + medical_plan_str: string +} + +export type NonMedikamentosaPlanType = { + non_medikamentosa_plan_str: string +} + +export type files = { + file: string +} + +export type document = { + id: number + file_name: string, + path: string, + type: string +} diff --git a/frontend/client-portal/src/pages/DailyMonitoring/index.tsx b/frontend/client-portal/src/pages/DailyMonitoring/index.tsx new file mode 100755 index 00000000..e6643f6b --- /dev/null +++ b/frontend/client-portal/src/pages/DailyMonitoring/index.tsx @@ -0,0 +1,48 @@ +/** + * Core + * ============================================ + */ +import { Box, Grid } from '@mui/material'; + +/** + * Components + * ============================================ +*/ +// - Global - +import Page from '../../components/Page'; +import HeaderBreadcrumbs from "../../components/HeaderBreadcrumbs"; +// - Local - +import DailyMonitoringList from './Components/DailyMonitoringList'; + +export default function DailyMonitoring() { + const pageTitle = "Daily Monitoring"; + + return ( + + + {/* page header */} + + + + + {/* tabel daily monitoring */} + + + + + + ); +} diff --git a/frontend/client-portal/src/routes/index.tsx b/frontend/client-portal/src/routes/index.tsx index d3d4bc87..c7ef9a1d 100755 --- a/frontend/client-portal/src/routes/index.tsx +++ b/frontend/client-portal/src/routes/index.tsx @@ -117,7 +117,26 @@ export default function Router() { }, ], }, - + { + path: '/daily_monitoring', + element: ( + + + + + + ), + children: [ + { + element: , + index: true, + }, + { + path: ':member_id/claims/:claim_code/list_monitoring', + element: + }, + ], + }, { path: '/claim-submit', element: ( @@ -463,3 +482,7 @@ const UserRole = Loadable(lazy(() => import('../pages/UserManagement/UserRole/In const UserRoleCreate = Loadable(lazy(() => import('../pages/UserManagement/UserRole/CreateUpdate'))); const UserAccess = Loadable(lazy(() => import('../pages/UserManagement/UserAccess/Index'))); const UserAccessCreate = Loadable(lazy(() => import('../pages/UserManagement/UserAccess/CreateUpdate'))); + +// Daily Monitoring +const DailyMonitoring = Loadable(lazy(() => import('../pages/DailyMonitoring/index'))) +const DetailMonitoringList = Loadable(lazy(() => import('../pages/DailyMonitoring/Components/DetailMonitoringList'))) \ No newline at end of file diff --git a/frontend/client-portal/src/utils/formatTime.ts b/frontend/client-portal/src/utils/formatTime.ts index 65e936d4..03444595 100755 --- a/frontend/client-portal/src/utils/formatTime.ts +++ b/frontend/client-portal/src/utils/formatTime.ts @@ -37,6 +37,10 @@ export function fPostFormat(date: Date | string | number, dateFormat = 'yyyy-MM- return format(new Date(date), dateFormat); } +export function fDateOnly(date: Date | string | number) { + return format(new Date(date), 'yyyy-MM-dd'); +} + // export function fDateString(date) { // const dateObj = parseISO(date); // const formattedDate = format(dateObj, 'dd MMMM yyyy');