diff --git a/Modules/HospitalPortal/Http/Controllers/Api/MemberController.php b/Modules/HospitalPortal/Http/Controllers/Api/MemberController.php index a0f13b44..9d3b4c51 100755 --- a/Modules/HospitalPortal/Http/Controllers/Api/MemberController.php +++ b/Modules/HospitalPortal/Http/Controllers/Api/MemberController.php @@ -37,27 +37,24 @@ class MemberController extends Controller else { $members = DB::table('members') - ->leftJoin('member_policies', 'member_policies.member_id', '=', 'members.member_id') - ->leftJoin('persons', 'persons.id', '=', 'members.person_id') - ->where('members.member_id', '=', $request->no_polis) - ->where('members.birth_date', '=', $request->birth_date) - ->whereNull('members.deleted_at') // Mengecek apakah deleted_at adalah NULL - ->select( - 'members.id', - 'members.name', - 'members.member_id', - 'member_policies.policy_id', - 'persons.nik', - 'members.email', - 'members.birth_date', - 'members.gender', - 'members.marital_status', - 'members.language', - 'members.race', - 'members.relation_with_principal' - ) - ->first(); // Mengambil hasil pertama - + ->leftJoin('member_policies', 'member_policies.member_id','=', 'members.member_id') + ->leftJoin('persons', 'persons.id', '=', 'members.person_id') + ->where('members.member_id', '=', $request->no_polis) + ->where('members.birth_date', '=', $request->birth_date) + ->select( + 'members.id', + 'members.name', + 'members.member_id', + 'member_policies.policy_id', + 'persons.nik', + 'members.email', + 'members.birth_date', + 'members.gender', + 'members.marital_status', + 'members.language', + 'members.race', + 'members.relation_with_principal') + ->first(); if($members) { $res_data['members'] = $members; @@ -134,6 +131,17 @@ class MemberController extends Controller $res_data['companies'] = $companies; + // specialities + $specialities = DB::table('specialities') + ->select( + 'specialities.id', + 'specialities.name' + ) + ->orderBy('specialities.name','asc') + ->get(); + + $res_data['specialities'] = $specialities; + return ApiResponse::apiResponse("Success", $res_data, trans('Message.success'), 200); } diff --git a/Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php b/Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php index 3aa9ad50..5386556a 100755 --- a/Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php +++ b/Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php @@ -36,6 +36,8 @@ class RequestLogController extends Controller 'address_provider' => !empty($request->address_provider) ? $request->address_provider : null, 'submission_date' => $request->submission_date, 'corporate_id_partner' => !empty($request->corporate_id_partner) ? $request->corporate_id_partner : [], + 'specialities_id' => $request->specialities_id, + 'dppj' => $request->dppj ]; $validator = Validator::make($request->all(), [ 'member_id' => 'required', @@ -240,6 +242,8 @@ class RequestLogController extends Controller 'request_logs.submission_date', 'request_logs.approved_at') ->paginate($limit); + + return response()->json(Helper::paginateResources($results)); } @@ -338,12 +342,14 @@ class RequestLogController extends Controller $validator = Validator::make($request->all(), [ 'request_logs_id' => 'required', 'discharge_date' => 'required', + 'service_code' => 'required', 'result_files.*' => 'sometimes|file|max:10000', 'diagnosa_files.*' => 'sometimes|file|max:10000', 'kondisi_files.*' => 'sometimes|file|max:10000', ], [ 'request_logs_id.required' => trans('Validation.required',['attribute' => 'Request Logs ID']), 'discharge_date.required' => trans('Validation.required',['attribute' => 'Discharge Date']), + 'service_code.required' => trans('Validation.required',['attribute' => 'Service Code']), 'result_files.*.max' => trans('Validation.max.file', ['attribute' => 'Result Files', 'max' => '10 MB' ]), 'diagnosa_files.*.max' => trans('Validation.max.file', ['attribute' => 'Diagnosis Files', 'max' => '10 MB' ]), 'kondisi_files.*.max' => trans('Validation.max.file', ['attribute' => 'Condition Files', 'max' => '10 MB' ]), @@ -361,6 +367,7 @@ class RequestLogController extends Controller ->update([ 'status_final_log' => 'requested', 'final_log' => 1, + 'service_code' =>$request->service_code, 'discharge_date' => $request->discharge_date, 'created_final_by'=> auth()->user()->id, 'created_final_at'=> date('Y-m-d H:i:s'), diff --git a/Modules/HospitalPortal/Routes/api.php b/Modules/HospitalPortal/Routes/api.php index d7f4fd37..94f74d27 100755 --- a/Modules/HospitalPortal/Routes/api.php +++ b/Modules/HospitalPortal/Routes/api.php @@ -11,6 +11,7 @@ use Modules\HospitalPortal\Http\Controllers\ApotekController; use Modules\HospitalPortal\Http\Middleware\Authentication; use Modules\HospitalPortal\Http\Middleware\Authorization; use Modules\Internal\Http\Controllers\Api\NavigationController; +use Modules\Linksehat\Http\Controllers\Api\AutocompleteController; /* |-------------------------------------------------------------------------- @@ -34,7 +35,8 @@ Route::prefix('v1')->group(function() { Route::post('forget-password', [AuthController::class, 'forgetPassword']); Route::post('verify-email', [AuthController::class, 'verifyEmail'])->name('verify-email'); Route::post('verify-code', [AuthController::class, 'verifCode']); - + + Route::get('service-member/{id}', [AutocompleteController::class, 'serviceCode']); Route::middleware('auth:sanctum')->group(function () { @@ -92,5 +94,7 @@ Route::prefix('v1')->group(function() { Route::get('detail-claim-requests/{id}', [ClaimRequestController::class, 'detail_claim_requests'])->name('claim-requests.detail_claim_requests'); Route::post('claim-requests/{id}/request-files', [ClaimRequestController::class, 'requestFiles']); }); + + }); }); diff --git a/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php b/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php index 488ededf..4465a747 100755 --- a/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php +++ b/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php @@ -13,6 +13,7 @@ use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\File as Files; use Modules\Internal\Transformers\DailyMonitoringResource; use App\Models\File; +use Carbon\Carbon; /** @@ -38,25 +39,44 @@ class DailyMonitoringController extends Controller public function GetMemberList(Request $request) { - $memberList = DB::table('request_logs') - ->leftJoin('members', 'request_logs.member_id', '=', 'members.id') - ->leftJoin('organizations', 'organizations.id', '=', 'request_logs.organization_id') - ->select('members.member_id','members.name','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' ) - ->where('request_logs.service_code', 'IP') - ->where('request_logs.deleted_at', 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."%"); - }); - }) - // ->where('request_logs.status_final_log', 'approved') - ->groupBy('request_logs.member_id', 'request_logs.organization_id') - ->orderBy('request_logs.created_at', 'desc') - // ->get() - ->paginate(); - + $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)); } @@ -125,29 +145,34 @@ class DailyMonitoringController extends Controller { $detail = RequestDailyMonitoring::where('id', $id) - ->orderBy("created_at", "desc") - ->first(); + ->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' => $detail, - ],200); + 'data' => $detailArray, + ], 200); + } public function UpdateDetailMonitoringbyID(Request $request) { // validation rule $validator = Validator::make($request->all(),[ - 'subject' => 'required', - 'submission_date' => 'required', - 'body_temperature' => 'required', - 'sistole' => 'required', - 'diastole' => 'required', - 'respiration_rate' => 'required', - 'analysis' => 'required', - 'medical_plan' => 'required', + 'log_code' => 'required', 'reason' => 'required', - 'non_medikamentosa_plan' => 'required', ],$this->messages()); // validation error @@ -161,6 +186,7 @@ class DailyMonitoringController extends Controller // 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, @@ -172,6 +198,13 @@ class DailyMonitoringController extends Controller '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, ]); @@ -620,6 +653,181 @@ class DailyMonitoringController extends Controller } } + 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 */ diff --git a/Modules/Internal/Http/Controllers/Api/DrugController.php b/Modules/Internal/Http/Controllers/Api/DrugController.php index 52ac59d8..6372c770 100755 --- a/Modules/Internal/Http/Controllers/Api/DrugController.php +++ b/Modules/Internal/Http/Controllers/Api/DrugController.php @@ -165,6 +165,10 @@ class DrugController extends Controller [ 'name' => $row['name'], 'code' => $row['code'], + 'id_setara' => $row['id_setara'], + 'code_setara' => $row['code_setara'], + 'nama_setara' => $row['nama_setara'], + 'multiply_jual' => $row['multiply_jual'], 'generic_name' => $row['generic_name'], 'description' => $row['description'], 'mims_class' => $row['mims_class'], diff --git a/Modules/Internal/Http/Controllers/Api/RequestLogController.php b/Modules/Internal/Http/Controllers/Api/RequestLogController.php index 5a55f03a..eabf892a 100755 --- a/Modules/Internal/Http/Controllers/Api/RequestLogController.php +++ b/Modules/Internal/Http/Controllers/Api/RequestLogController.php @@ -150,7 +150,9 @@ class RequestLogController extends Controller // status: 'approved', status: 'requested', // di nonaktifkan dulu auto approved organization_id: $request->organization_id, - source: $request->source + source: $request->source, + specialities_id: $request->specialities_id, + dppj: $request->dppj ); DB::commit(); @@ -172,7 +174,9 @@ class RequestLogController extends Controller submissionDate: $request->submission_date, status: 'requested', organization_id: $request->organization_id, - source: $request->source + source: $request->source, + specialities_id: $request->specialities_id, + dppj: $request->dppj ); DB::commit(); @@ -237,6 +241,31 @@ class RequestLogController extends Controller return Helper::responseJson(data: $manipulatedIcds); } + public function codeLog(Request $request) + { + $codeLogs = RequestLog::with(['member']) + ->when($request->search, function ($q) use ($request) { + $q->where('code', 'LIKE', "%{$request->search}%") + ->orWhereHas('member', function ($subQuery) use ($request) { + $subQuery->where('name', 'LIKE', "%{$request->search}%"); + }); + }) + ->whereHas('member', function ($subQuery) { + $subQuery->whereNull('deleted_at'); + }) + ->get(); + + $manipulatedIcds = $codeLogs->map(function ($codeLog) { + return [ + 'value' => $codeLog->id, + 'label' => $codeLog->code . ' - ' . ($codeLog->member->name ?? 'Unknown'), + ]; + }); + + return Helper::responseJson(data: $manipulatedIcds); + } + + public function hospitals(){ $organizations = Organization::query() ->where([ @@ -490,11 +519,11 @@ class RequestLogController extends Controller if (!empty($request->reason)) { $requestLog->reason_final = $request->reason; } - + if (!empty($request->type_of_member)){ $requestLog->type_of_member = $request->type_of_member; } - + $requestLog->final_log = 1; $requestLog->approved_final_log_by = auth()->user()->id; $requestLog->approved_final_log_at = Carbon::now(); diff --git a/Modules/Internal/Routes/api.php b/Modules/Internal/Routes/api.php index 3fde67d7..61abb29d 100755 --- a/Modules/Internal/Routes/api.php +++ b/Modules/Internal/Routes/api.php @@ -82,6 +82,7 @@ Route::prefix('internal')->group(function () { Route::get('diagnosis', [RequestLogController::class, 'diagnosis']); + Route::get('codeLog', [RequestLogController::class, 'codeLog']); Route::get('drugs', [AutocompleteController::class, 'drugList']); Route::get('units', [AutocompleteController::class, 'unitList']); @@ -207,6 +208,7 @@ Route::prefix('internal')->group(function () { Route::post('detail/update-request', [DailyMonitoringController::class, 'UpdateDetailMonitoringbyID']); Route::post('detail/{claim_code}/add', [DailyMonitoringController::class, 'AddDetailMonitoringList']); Route::post('detail/{claim_code}/add-request', [DailyMonitoringController::class, 'AddDetailMonitoringListRequestLog']); + Route::post('add-request', [DailyMonitoringController::class, 'AddListRequestLog']); Route::post('detail/{claim_code}/update-status', [DailyMonitoringController::class, 'UpdateListRequestLog']); Route::get('detail/{id}/delete', [DailyMonitoringController::class, 'deleteDetailMonitoringListRequestLog']); Route::get('detail/{id}/delete-file', [DailyMonitoringController::class, 'deleteFileDetailMonitoringListRequestLog']); diff --git a/Modules/Internal/Transformers/DailyMonitoringResource.php b/Modules/Internal/Transformers/DailyMonitoringResource.php index e1090d92..1a0f65d1 100755 --- a/Modules/Internal/Transformers/DailyMonitoringResource.php +++ b/Modules/Internal/Transformers/DailyMonitoringResource.php @@ -14,15 +14,29 @@ class DailyMonitoringResource extends JsonResource */ public function toArray($request) { - $data = [ + 'code' => $this->code, + 'id' => $this->id, 'member_id' => $this->member_id, + 'member_type' => $this->member_type, + 'birth_date' => $this->birth_date, 'name' => $this->name, 'start_date' => $this->startdate, 'end_date' => $this->enddate, 'addmision_date' => $this->addmision_date, + 'submission_date' => $this->submission_date, 'provider' => $this->provider, 'organization_id' => $this->organization_id, + 'doctor_1' => $this->doctor_1, + 'doctor_2' => $this->doctor_2, + 'temp_diagnosis' => $this->temp_diagnosis, + 'final_diagnosis' => $this->final_diagnosis, + 'approval_pendamping' => $this->approval_pendamping, + 'status' => $this->status, + 'description' => strip_tags($this->description), + 'note' => strip_tags($this->note), + 'medical_plan' => strip_tags($this->medical_plan), + 'non_medical_plan' => strip_tags($this->non_medical_plan), ]; return $data; diff --git a/Modules/Internal/Transformers/RequestLogShowResource.php b/Modules/Internal/Transformers/RequestLogShowResource.php index 8aa77dfb..d1c9d509 100755 --- a/Modules/Internal/Transformers/RequestLogShowResource.php +++ b/Modules/Internal/Transformers/RequestLogShowResource.php @@ -13,6 +13,7 @@ use App\Models\Benefit; use App\Models\Exclusion; use App\Models\ClaimRequest; use App\Models\Icd; +use App\Models\Speciality; use App\Helpers\Helper; use App\Models\CorporatePolicy; use Illuminate\Http\Resources\Json\JsonResource; @@ -117,12 +118,29 @@ class RequestLogShowResource extends JsonResource } $memberUsage = Helper::getUsageMember($corporateId, $requestLog['member']['id'], $benefitData); - // dd($memberLimitUsage); + if(isset($requestLog['specialities_id'])) + { + $spesialis = Speciality::query() + ->where('id', $requestLog['specialities_id']) + ->select('name') + ->first(); + $name = $spesialis['name']; + } else { + $name = '-'; + } + + if (isset($requestLog['specialities_id'])){ + $dppj = $requestLog['dppj']; + } else { + $dppj = '-'; + } $data = [ 'id' => $requestLog['id'], 'code' => $requestLog['code'], 'invoice_no' => $requestLog['invoice_no'], 'billing_no' => $requestLog['billing_no'], + 'specialities_id' => $name, + 'dppj' => $dppj, 'code' => $requestLog['code'], 'code_claim' => $claimCode, 'member_id' => $requestLog['member']['member_id'], @@ -161,7 +179,7 @@ class RequestLogShowResource extends JsonResource 'reason' => $requestLog['reason'], 'diagnosis' => $icd, 'is_reversal' => $isReversal, // untuk penjagaan, jika true tidak bisa di edit/hapus lagi - + ]; diff --git a/Modules/Linksehat/Http/Controllers/Api/AutocompleteController.php b/Modules/Linksehat/Http/Controllers/Api/AutocompleteController.php index 25e4e73c..fddfd0ae 100755 --- a/Modules/Linksehat/Http/Controllers/Api/AutocompleteController.php +++ b/Modules/Linksehat/Http/Controllers/Api/AutocompleteController.php @@ -6,6 +6,7 @@ use App\Models\OLDLMS\User; use App\Models\Icd; use App\Models\Drug; use App\Models\Unit; +use App\Models\MemberPlan; use Illuminate\Contracts\Support\Renderable; use Illuminate\Http\Request; use Illuminate\Routing\Controller; @@ -180,6 +181,22 @@ class AutocompleteController extends Controller { return Helper::responseJson(['message' => 'Signa added successfully']); } + public function serviceCode(Request $request, $id) + { + $plans = MemberPlan::with('plan', 'plan.service') + ->where('member_id', $id) + ->get(); + + $manipulatedPlan = $plans->map(function ($plan) { + return [ + 'value' => optional($plan->plan)->service_code ?? '-', + 'label' => optional($plan->plan->service)->name ?? 'Unknown' + ]; + }); + + return response()->json($manipulatedPlan); + } + } diff --git a/app/Models/Drug.php b/app/Models/Drug.php index 1d6d77f0..8b8c1dad 100755 --- a/app/Models/Drug.php +++ b/app/Models/Drug.php @@ -15,6 +15,10 @@ class Drug extends Model 'name', 'generic_name', 'code', + 'id_setara', + 'code_setara', + 'nama_setara', + 'multiply_jual', 'description', 'brand_id', 'mims_class', diff --git a/app/Models/RequestDailyMonitoring.php b/app/Models/RequestDailyMonitoring.php index 83b9aa16..06757c77 100755 --- a/app/Models/RequestDailyMonitoring.php +++ b/app/Models/RequestDailyMonitoring.php @@ -16,6 +16,13 @@ class RequestDailyMonitoring extends Model protected $fillable = [ 'request_log_id', + 'doctor_1', + 'doctor_2', + 'temp_diagnosis', + 'final_diagnosis', + 'approval_pendamping', + 'description', + 'note', 'subject', 'object', 'submission_date', diff --git a/app/Models/RequestLog.php b/app/Models/RequestLog.php index 08e45eb7..bd180522 100755 --- a/app/Models/RequestLog.php +++ b/app/Models/RequestLog.php @@ -51,6 +51,8 @@ class RequestLog extends Model 'approved_final_log_at', 'created_final_at', 'created_final_by', + 'specialities_id', + 'dppj', 'type_of_member' ]; @@ -82,7 +84,7 @@ class RequestLog extends Model "Keterangan IGL" => "keterangan", "Catatan FGL" => "catatan", "QC 1" => "status_final_log", - "Ingestion Code" => "ingestion_code", + "Ingestion Code" => "ingestion_code", "Ingestion Status" => "ingestion_status", ]; diff --git a/app/Services/RequestLogService.php b/app/Services/RequestLogService.php index 415a7ed2..1b821865 100755 --- a/app/Services/RequestLogService.php +++ b/app/Services/RequestLogService.php @@ -21,14 +21,16 @@ use Str; class RequestLogService{ public static function storeRequestLog( - $row = null, - $code, - $member, - $paymentType, - $serviceCode, - $submissionDate, - $status, $organization_id = null, - $source + $row = null, + $code, + $member, + $paymentType, + $serviceCode, + $submissionDate, + $status, $organization_id = null, + $source, + $specialities_id, + $dppj ) { try { @@ -55,6 +57,8 @@ class RequestLogService{ 'policy_id' => $member->currentPolicy->id ?? null, 'organization_id' => $organization ? $organization->id : 0, 'source' => $source, + 'specialities_id' => $specialities_id, + 'dppj' => $dppj ]; $requestLog = RequestLog::create($requestLogData); @@ -109,7 +113,7 @@ class RequestLogService{ DB::commit(); return $claimManagement; - + } catch (\Exception $error) { DB::rollBack(); @@ -168,4 +172,4 @@ class RequestLogService{ } } -} \ No newline at end of file +} diff --git a/database/migrations/2025_02_12_153942_add_column_to_request_log_daily_monitoring_table.php b/database/migrations/2025_02_12_153942_add_column_to_request_log_daily_monitoring_table.php new file mode 100644 index 00000000..a6bc899e --- /dev/null +++ b/database/migrations/2025_02_12_153942_add_column_to_request_log_daily_monitoring_table.php @@ -0,0 +1,44 @@ +string('doctor_1')->after('examination')->nullable(); + $table->string('doctor_2')->after('doctor_1')->nullable(); + $table->string('approval_pendamping')->after('doctor_2')->nullable(); + $table->text('description')->after('approval_pendamping')->nullable(); + $table->text('note')->after('description')->nullable(); + $table->string('temp_diagnosis')->after('note')->nullable(); + $table->string('final_diagnosis')->after('temp_diagnosis')->nullable(); + $table->string('status')->after('final_diagnosis')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('request_log_daily_monitorings', function (Blueprint $table) { + $table->dropColumn('doctor_1'); + $table->dropColumn('doctor_2'); + $table->dropColumn('description'); + $table->dropColumn('note'); + $table->dropColumn('temp_diagnosis'); + $table->dropColumn('final_diagnosis'); + }); + } +}; diff --git a/database/migrations/2025_02_13_102948_add_column_specialities_id_to_request_logs.php b/database/migrations/2025_02_13_102948_add_column_specialities_id_to_request_logs.php new file mode 100644 index 00000000..bbf14e00 --- /dev/null +++ b/database/migrations/2025_02_13_102948_add_column_specialities_id_to_request_logs.php @@ -0,0 +1,36 @@ +bigInteger('specialities_id')->after('created_final_by')->nullable(); + }); + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + if(!Schema::hasColumn('request_logs', 'specialities_id')) { + Schema::table('request_logs', function (Blueprint $table) { + $table->dropColumn('specialities_id'); + }); + } + } +}; diff --git a/database/migrations/2025_02_13_105939_add_column_dppj_to_request_logs.php b/database/migrations/2025_02_13_105939_add_column_dppj_to_request_logs.php new file mode 100644 index 00000000..0e8447da --- /dev/null +++ b/database/migrations/2025_02_13_105939_add_column_dppj_to_request_logs.php @@ -0,0 +1,36 @@ +string('dppj', '255')->after('specialities_id')->nullable(); + }); + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + if(!Schema::hasColumn('request_logs', 'dppj')) { + Schema::table('request_logs', function (Blueprint $table) { + $table->dropColumn('dppj'); + }); + } + } +}; diff --git a/database/migrations/2025_02_20_140739_add_column_to_drugs_table.php b/database/migrations/2025_02_20_140739_add_column_to_drugs_table.php new file mode 100644 index 00000000..54b4f2c8 --- /dev/null +++ b/database/migrations/2025_02_20_140739_add_column_to_drugs_table.php @@ -0,0 +1,38 @@ +string('id_setara')->nullable()->after('code'); + $table->string('code_setara')->nullable()->after('id_setara'); + $table->string('nama_setara')->nullable()->after('code_setara'); + $table->integer('multiply_jual')->nullable()->after('nama_setara'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('drugs', function (Blueprint $table) { + $table->dropColumn('id_setara'); + $table->dropColumn('nama_setara'); + $table->dropColumn('code_setara '); + $table->dropColumn('multiply_jual'); + }); + } +}; diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DailyMonitoringList.tsx b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DailyMonitoringList.tsx index 30b755c1..3b9c600f 100755 --- a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DailyMonitoringList.tsx +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DailyMonitoringList.tsx @@ -3,7 +3,7 @@ * ============================================ */ import React, { ChangeEvent, useEffect, useRef, useState } from "react"; -import { Box, Paper, TableContainer, Table, TableHead, TableRow, TableCell, TableBody, Stack, TextField, Button, Menu, } from "@mui/material"; +import { Box, Paper, TableContainer, Table, TableHead, TableRow, TableCell, TableBody, Stack, TextField, Button, Menu, Typography, ButtonGroup, } from "@mui/material"; /** * Types & Functions @@ -15,9 +15,18 @@ 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 { useSearchParams } from "react-router-dom"; +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 { fDateOnly } from "@/utils/formatTime"; +import { LoadingButton } from "@mui/lab"; +import { Import } from "@/@types/claims"; +import { HeadCell, Order } from '@/@types/table'; export default function DailyMonitoringList() { const [searchParams, setSearchParams] = useSearchParams(); @@ -34,8 +43,7 @@ export default function DailyMonitoringList() { fontWeight: 'bold', }; - - + const [importResult, setImportResult] = useState(null); // Load Data // ------------------- const loadDataTableData = async (appliedFilter: any | null = null) => { @@ -57,46 +65,156 @@ export default function DailyMonitoringList() { 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 handleSearchSubmit = (event: any) => { - event.preventDefault(); - props.onSearch({ search: searchText }); // Trigger to Parent - }; - + + + 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 @@ -110,6 +228,7 @@ export default function DailyMonitoringList() { const handleClick = (event: React.MouseEvent) => { setAnchorEl(event.currentTarget); }; + const handleClose = () => { setAnchorEl(null); }; @@ -124,7 +243,8 @@ export default function DailyMonitoringList() { }; const handleCancelImportButton = () => { - + importForm.current.value = ''; + importForm.current.dispatchEvent(new Event('change', { bubbles: true })); }; const handleImportChange = (event: any) => { @@ -136,32 +256,146 @@ export default function DailyMonitoringList() { }; 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(`/case_management/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 ?? '-'} + + )}
@@ -175,12 +409,14 @@ export default function DailyMonitoringList() { + Code + Admission Date Member ID Name - Start Date - End Date - Admission Date - Provider + Tanggal Lahir + Member Type + Medical Plan + Non Medical Plan diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DailyMonitoringListRow.tsx b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DailyMonitoringListRow.tsx index 087a9b4b..32282606 100755 --- a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DailyMonitoringListRow.tsx +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DailyMonitoringListRow.tsx @@ -21,6 +21,7 @@ import TableMoreMenu from '@/components/table/TableMoreMenu'; */ import { fDate } from "@/utils/formatTime"; import { DailyMonitoringListType } from "../Model/Types"; +import { Edit } from "@mui/icons-material"; type Props = { row: DailyMonitoringListType, @@ -29,12 +30,21 @@ type Props = { export default function DailyMonitoringListRow ({ ...props }: Props) { const navigate = useNavigate() - + return ( td': { borderBottom: '1' } }}> + {props.row.code} + + + {props.row.member_id} {props.row.name} @@ -42,34 +52,31 @@ export default function DailyMonitoringListRow ({ ...props }: Props) { variant="ghost" color="default" > - {fDate(props.row.start_date)} + {props.row.birth_date ? fDate(props.row.birth_date) : '-'} - + {props.row.member_type} - + {props.row.medical_plan} - {props.row.provider} + + {props.row.non_medical_plan} + + e.stopPropagation()}> - navigate(`/case_management/daily_monitoring/${props.row.member_id}/${props.row.organization_id}/claims`)}> + navigate(`/case_management/daily_monitoring/${props.row.member_id}/claims/${props.row.code}/list_monitoring`)}> View + navigate(`/case_management/daily_monitoring/${props.row.id}/edit`)}> + + Edit + } /> diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringForm.tsx b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringForm.tsx index 6a6af022..21f24d6e 100755 --- a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringForm.tsx +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringForm.tsx @@ -4,7 +4,7 @@ */ import { useFieldArray, useForm } from 'react-hook-form'; import { useNavigate, useParams } from 'react-router-dom'; -import { Box, IconButton, Typography, Grid, Card, Button, ButtonBase, Stack, Autocomplete } from '@mui/material'; +import { Box, IconButton, Typography, Grid, Card, Button, ButtonBase, Stack, Autocomplete, CircularProgress } from '@mui/material'; import { LoadingButton } from "@mui/lab"; /** @@ -28,41 +28,41 @@ import InsertDriveFileIcon from '@mui/icons-material/InsertDriveFile'; * Utils, Types, Functions * ============================================ */ -import { AddMonitoringDetail, UpdateMonitoringDetail, getMonitoringDetailById, getMonitoringDetailList, getMonitorungDetailById, getOrganizationId } from '../Model/Functions'; +import { AddMonitoringDetail, UpdateMonitoringDetail, getMonitoringDetailById, getOrganizationId } from '../Model/Functions'; import { DetailMonitoringListType} from '../Model/Types'; import FormCreateFilesUpload from '@/pages/CustomerService/FinalLog/Components/FormCreateFilesUpload'; import MultiFilePreview from '@/components/upload/MultiFilePreview'; import Iconify from '@/components/Iconify'; import { useEffect, useMemo, useRef, useState } from 'react'; import { TextField } from '@mui/material'; +import axios from "@/utils/axios"; type Detail = { row : DetailMonitoringListType|undefined } export default function DetailMonitoringList() { - const { member_id, claim_code, id} = useParams(); + const { member_id, id} = useParams(); const [organizationId, setOrganizationId] = useState(); const [isEdit, setIsEdit] = useState(false); const [data, setData] = useState(); const navigate = useNavigate() - const pageTitle = claim_code??'_ _ _ _'; const fileInput1 = useRef(null); const fileInput2 = useRef(null); const fileInput3 = useRef(null); - const loadOrganizationID = async () => { - const organization_id = await getOrganizationId(claim_code??''); - setOrganizationId(organization_id); - } + // const loadOrganizationID = async () => { + // const organization_id = await getOrganizationId(''); + // setOrganizationId(organization_id); + // } const loadDetailDailyMonitoring = async () => { - const monitoring = await getMonitoringDetailById(id??'') + const monitoring = await getMonitoringDetailById(id) setData(monitoring) } useEffect(() => { - loadOrganizationID(); + // loadOrganizationID(); if (id){ loadDetailDailyMonitoring(); setIsEdit(true) @@ -74,33 +74,41 @@ export default function DetailMonitoringList() { // ==================================== const defaultValues = useMemo( () => ({ - id : data?.id ??'', - claim_code : data?.claim_code ?? '', - claim_id : data?.claim_id ?? '', - subject : data?.subject ?? '', - objective : data?.object ?? '', - submission_date : data?.submission_date ?? '', - body_temperature: data?.body_temperature ?? '', - sistole : data?.sistole ?? '', - diastole : data?.diastole ??'', - respiration_rate: data?.respiration_rate ??'', - complaints : data?.complaints ?? '', - analysis : data?.analysis ?? '', - medical_plan : data?.medical_plan ?? [{ - medical_plan_str: '' - }], - non_medikamentosa_plan : data?.non_medikamentosa_plan ?? [{ - non_medikamentosa_plan_str: '' - }], - confirmation_medical_leter : [], - medical_action_letter : [], - // result : data?.laboratorium_result ?? [], - result : [], - created_at : data?.created_at ?? '', - lab_date : data?.lab_date ?? '', - provider : data?.provider ?? '', - examination : data?.examination ?? '', - reason : '', + id : data?.id ??'', + // claim_code : data?.claim_code ?? '', + log_code : data?.log_code ?? '', + doctor_1 : data?.doctor_1 ?? '', + doctor_2 : data?.doctor_2 ?? '', + temp_diagnosis : data?.temp_diagnosis ?? '', + final_diagnosis : data?.final_diagnosis ?? '', + approval_pendamping : data?.approval_pendamping ?? '', + keterangan : data?.keterangan ?? '', + catatan : data?.catatan ?? '', + claim_id : data?.claim_id ?? '', + subject : data?.subject ?? '', + objective : data?.object ?? '', + submission_date : data?.submission_date ?? '', + body_temperature: data?.body_temperature ?? '', + sistole : data?.sistole ?? '', + diastole : data?.diastole ??'', + respiration_rate: data?.respiration_rate ??'', + complaints : data?.complaints ?? '', + analysis : data?.analysis ?? '', + medical_plan : data?.medical_plan ?? [{ + medical_plan_str: '' + }], + non_medikamentosa_plan : data?.non_medikamentosa_plan ?? [{ + non_medikamentosa_plan_str: '' + }], + confirmation_medical_leter : [], + medical_action_letter : [], + // result : data?.laboratorium_result ?? [], + result : [], + created_at : data?.created_at ?? '', + lab_date : data?.lab_date ?? '', + provider : data?.provider ?? '', + examination : data?.examination ?? '', + reason : '', }), [data] ); @@ -188,7 +196,6 @@ export default function DetailMonitoringList() { arr_result.push(event.target.files[0]); setValue('result', arr_result) - console.log('test3') } else { console.log('NO FILE'); @@ -230,35 +237,77 @@ export default function DetailMonitoringList() { // ===================================== const submitHandler = async (data: DetailMonitoringListType) => { - const response = isEdit ? await UpdateMonitoringDetail(data) : await AddMonitoringDetail(claim_code??'', data); + const response = isEdit ? await UpdateMonitoringDetail(data) : await AddMonitoringDetail('', data); if (response == true) { reset(); if (isEdit) { - navigate('/case_management/daily_monitoring/'+member_id+'/claims/'+claim_code+'/list_monitoring', { replace: true }); + navigate('/case_management/daily_monitoring', { replace: true }); } else { - navigate('/case_management/daily_monitoring/'+member_id+'/'+organizationId+'/claims', { replace: true }); + navigate('/case_management/daily_monitoring', { replace: true }); } // window.location.reload() } } const [selectedReason, setSelectedReason] = useState({value:'-', label:''}); + const [selectedCode, setSelectedCode] = useState({value:'-', label:''}); const reasons = [ { value: 'Wrong Setting', label: 'Wrong Setting' }, { value: 'Hospital Request', label: 'Hospital Request' } ]; + + const [codes, setCodes] = useState([{ value: '-', label: '-' }]); // Data hasil pencarian + const [searchTerm, setSearchTerm] = useState(''); // Nilai input pencarian + + + useEffect(() => { + axios.get('codeLog') + .then((response) => { + const fetchedCodes = response.data.data; + setCodes(fetchedCodes); + // Set nilai default jika data tersedia + console.log(defaultValues, 'test') + if (defaultValues?.log_code) { + const defaultValueLOG = fetchedCodes.find((item) => item.value === defaultValues?.log_code); + setSelectedCode(defaultValueLOG || null); + } + }) + .catch((error) => { + console.error('Error fetching Code LOG options:', error); + }); + }, [isEdit, defaultValues]); // Tambahkan dependency agar dijalankan ulang jika log_code berubah + + + useEffect(() => { + const fetchCodes = async () => { + if (searchTerm.length > 3) { // Hanya fetch jika input lebih dari 2 karakter + try { + const response = await axios.get(`codeLog?search=${searchTerm}`); + setCodes(response.data.data); + } catch (error) { + console.error('Error fetching codes:', error); + setCodes([]); + } + } + }; + + const debounceFetch = setTimeout(fetchCodes, 500); // Debounce 500ms + return () => clearTimeout(debounceFetch); + }, [searchTerm]); + const [searchCode, setSearchCode] = useState(''); + const [error, setError] = useState(true); return ( - + - navigate(`/case_management/daily_monitoring/${member_id}/${organizationId}/claims`)} > + navigate(`/case_management/daily_monitoring`)} > - {pageTitle} + {isEdit ? "Update " : "Tambah "} Daily Monitoring @@ -269,6 +318,43 @@ export default function DetailMonitoringList() { {/* Date */} + + + Code Letter of Guarantee* : + + + + option.label} + fullWidth + value={selectedCode} + onChange={(event, newValue) => { + setSelectedCode(newValue); + setValue('log_code', newValue?.value); + if (!newValue) { + setError('Please select a code'); + } else { + setError(''); + } + }} + onInputChange={(event, newInputValue) => { + setSearchTerm(newInputValue); // Set nilai pencarian untuk fetch data + }} + renderInput={(params) => ( + + )} + /> + + Date* : @@ -285,8 +371,74 @@ export default function DetailMonitoringList() { - {/* Subject */} - + {/* Doctor 1 */} + {/* + + + + Dokter 1 + + + + + + + + Dokter 2 + + + + + + + + Temp Diagnosis + + + + + + + + Final Diagnosis + + + + + + + + Approval Pendamping + + + + + + + */} + + {/* Subject */} + @@ -562,6 +714,28 @@ export default function DetailMonitoringList() { + {/* Keterangan dan Catatan */} + {/* + + + + Keterangan + + + + + + + + Catatan + + + + + + + */} + {/* Confirmation Medical Letter */} @@ -673,7 +847,7 @@ export default function DetailMonitoringList() { - + {/* Laboratorium */} @@ -823,7 +997,7 @@ export default function DetailMonitoringList() { - diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringList.tsx b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringList.tsx index e01f2f54..382c356a 100755 --- a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringList.tsx +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringList.tsx @@ -173,11 +173,10 @@ export default function DetailMonitoringList() { setOrganizationId(organization_id); } - const renderHTML = (data:string) => { + function renderHTML(data: string) { return ( -
+
); } @@ -187,7 +186,7 @@ export default function DetailMonitoringList() { {/* back button */} - navigate(`/case_management/daily_monitoring/${member_id}/${organizationId}/claims`)} > + navigate(`/case_management/daily_monitoring`)} > @@ -241,10 +240,10 @@ export default function DetailMonitoringList() { {/* Menempatkan TableMoreMenu di sebelah kanan */} - {handleEdit(row.id);}}> + {/* {handleEdit(row.id);}}> Edit - + */} {setOpenDialog(true); setId(row.id); setIdFile(null)}}> Delete diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Functions.ts b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Functions.ts index 6f493f90..af73e53d 100755 --- a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Functions.ts +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Functions.ts @@ -51,7 +51,7 @@ export const AddMonitoringDetail = async ( claim_code: string,data: DetailMonito const formData = makeFormData({...data}); - const response = await axios.post(`/case_management/daily_monitoring/detail/${claim_code}/add-request`, formData) + const response = await axios.post(`/case_management/daily_monitoring/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 90cdf1d9..30560d16 100755 --- a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Types.ts +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Types.ts @@ -3,12 +3,23 @@ */ export type DailyMonitoringListType = { member_id : string, + member_type : string, + birth_date : string, name : string, - start_date : string, - end_date : string, - addmision_date : string, - provider : string, - organization_id : number, + 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, } /** @@ -50,7 +61,18 @@ export type ClaimListType = { 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, diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogConfirmation.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogConfirmation.tsx index 0c145178..8b6ce0d5 100755 --- a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogConfirmation.tsx +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogConfirmation.tsx @@ -25,8 +25,9 @@ export default function DialogConfirmation({requestLog, setOpenDialog, openDialo id: requestLog?.id, status: approve || '', catatan: '', - type_of_member: '' , - icdCodes: requestLog?.diagnosis.length ? requestLog.diagnosis.map(diagnosis => ({ value: diagnosis.id, label: diagnosis.name })) : [] + type_of_member: requestLog?.type_of_member, + // icdCodes: requestLog?.diagnosis.length ? requestLog.diagnosis.map(diagnosis => ({ value: diagnosis.id, label: diagnosis.name })) : [] + icdCodes: requestLog?.diagnosis }); const [error, setError] = useState(false); @@ -197,7 +198,7 @@ export default function DialogConfirmation({requestLog, setOpenDialog, openDialo variant="outlined" displayEmpty required - error={error} + error={error} > Type Member diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogEditFinalLOG.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogEditFinalLOG.tsx index da9c5b07..c81f524e 100755 --- a/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogEditFinalLOG.tsx +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Components/DialogEditFinalLOG.tsx @@ -194,9 +194,9 @@ export default function DialogEditFinalLOG({requestLog, setOpenDialog, openDialo - Invoice Number + Invoice Provider Penempatan Kamar {requestLog?.penempatan_kamar ? requestLog?.penempatan_kamar : '-'} + + Spesialis + {requestLog?.specialities_id ? requestLog?.specialities_id : '-'} + + + DPPJ + {requestLog?.dppj ? requestLog?.dppj : '-'} + Catatan {requestLog?.catatan ? requestLog?.catatan : '-'} diff --git a/frontend/dashboard/src/pages/CustomerService/FinalLog/Model/Types.tsx b/frontend/dashboard/src/pages/CustomerService/FinalLog/Model/Types.tsx index 0bb817a2..8d08b7ac 100755 --- a/frontend/dashboard/src/pages/CustomerService/FinalLog/Model/Types.tsx +++ b/frontend/dashboard/src/pages/CustomerService/FinalLog/Model/Types.tsx @@ -24,6 +24,8 @@ export type FinalLogType = { provider : string, status : string, files_by_type : files_by_type, + specialities_id : number, + dppj: string } diff --git a/frontend/dashboard/src/pages/CustomerService/Request/Detail.tsx b/frontend/dashboard/src/pages/CustomerService/Request/Detail.tsx index 6ba7f378..d192b013 100755 --- a/frontend/dashboard/src/pages/CustomerService/Request/Detail.tsx +++ b/frontend/dashboard/src/pages/CustomerService/Request/Detail.tsx @@ -34,7 +34,7 @@ export default function Detail() { const navigate = useNavigate(); const { themeStretch } = useSettings(); const [requestLog, setRequestLog] = useState(); - + const { id } = useParams(); @@ -70,9 +70,9 @@ export default function Detail() { const handleCloseDialogSubmit = () => { setOpenDialogSubmit(false); } - + const [approve, setApprove] = useState('') - + const [openDialogEdit, setOpenDialogEdit] = useState(false); return ( @@ -84,7 +84,7 @@ export default function Detail() { - + Detail @@ -106,7 +106,7 @@ export default function Detail() { /> ) : null} - + Provider Name @@ -157,6 +157,14 @@ export default function Detail() { Penempatan Kamar {requestLog?.penempatan_kamar ? requestLog?.penempatan_kamar : '-'} + + Spesialis + {requestLog?.specialities_id ? requestLog?.specialities_id : '-'} + + + DPPJ + {requestLog?.dppj ? requestLog?.dppj : '-'} + @@ -217,13 +225,13 @@ export default function Detail() { openDialog={openDialogSubmit} approve={approve} > - + ) : null} - - + diff --git a/frontend/dashboard/src/pages/CustomerService/Request/Model/Types.tsx b/frontend/dashboard/src/pages/CustomerService/Request/Model/Types.tsx index 209fab3a..a446cbcf 100755 --- a/frontend/dashboard/src/pages/CustomerService/Request/Model/Types.tsx +++ b/frontend/dashboard/src/pages/CustomerService/Request/Model/Types.tsx @@ -57,7 +57,9 @@ export type DetailRequestLogType = { benefit : Benefit[], reason : string, type_of_member : string, - corporate_id : number + corporate_id : number, + specialities_id : number, + dppj: string } export type Benefit = { diff --git a/frontend/dashboard/src/routes/index.tsx b/frontend/dashboard/src/routes/index.tsx index c29ee22d..bd69b2ce 100755 --- a/frontend/dashboard/src/routes/index.tsx +++ b/frontend/dashboard/src/routes/index.tsx @@ -233,10 +233,18 @@ export default function Router() { path: 'daily_monitoring/:member_id/claims/:claim_code/add_monitoring', element: }, + { + path: 'daily_monitoring/add_monitoring', + element: + }, { path: 'daily_monitoring/:member_id/claims/:claim_code/:id', element: }, + { + path: 'daily_monitoring/:id/edit', + element: + }, { path: 'daily_monitoring/:member_id/claims/:claim_code/list_monitoring', element: diff --git a/frontend/hospital-portal/src/lang/en-US.json b/frontend/hospital-portal/src/lang/en-US.json index 88f5da3a..2de517d8 100755 --- a/frontend/hospital-portal/src/lang/en-US.json +++ b/frontend/hospital-portal/src/lang/en-US.json @@ -138,7 +138,9 @@ "txtButtonClose": "Close", "txtLabelFailed": "Failed", "txtAttention": "Attention", - "txtAttentionInfo": "There are pending orders that require approval." + "txtAttentionInfo": "There are pending orders that require approval.", + "txtDPPJ": "DPPJ", + "txtSpecialist": "Specialist" } diff --git a/frontend/hospital-portal/src/lang/id-ID.json b/frontend/hospital-portal/src/lang/id-ID.json index ac3e7f70..2b6edfce 100755 --- a/frontend/hospital-portal/src/lang/id-ID.json +++ b/frontend/hospital-portal/src/lang/id-ID.json @@ -138,5 +138,7 @@ "txtButtonClose": "Tutup", "txtLabelFailed": "Gagal Pengiriman", "txtAttention": "Perhatian", - "txtAttentionInfo": "Terdapat pesanan pending mohon untuk segera di approve." + "txtAttentionInfo": "Terdapat pesanan pending mohon untuk segera di approve.", + "txtDPPJ": "DPPJ", + "txtSpecialist": "Spesialis" } diff --git a/frontend/hospital-portal/src/sections/dashboard/DialogFinalLog.tsx b/frontend/hospital-portal/src/sections/dashboard/DialogFinalLog.tsx index 79fe4de6..4f375236 100755 --- a/frontend/hospital-portal/src/sections/dashboard/DialogFinalLog.tsx +++ b/frontend/hospital-portal/src/sections/dashboard/DialogFinalLog.tsx @@ -2,13 +2,13 @@ import { styled } from '@mui/material/styles'; import Iconify from '@/components/Iconify'; import { fCurrency } from '@/utils/formatNumber'; import { LoadingButton } from '@mui/lab'; -import { Avatar, Button, Divider, LinearProgress, linearProgressClasses, ButtonBase, Box } from '@mui/material'; +import { Avatar, Button, Divider, LinearProgress, linearProgressClasses, ButtonBase, Box, Autocomplete, FormHelperText } from '@mui/material'; import { Card } from '@mui/material'; import { Stack, Typography } from '@mui/material'; import { fPostFormat } from '@/utils/formatTime'; import axios from '@/utils/axios'; import { enqueueSnackbar } from 'notistack'; -import { useRef, useState, useContext } from 'react'; +import { useRef, useState, useContext, useEffect } from 'react'; import { makeFormData } from '@/utils/jsonToFormData'; import { format } from 'date-fns'; import { LanguageContext } from '@/contexts/LanguageContext'; @@ -17,10 +17,10 @@ import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns'; import TextField from '@mui/material/TextField'; export default function DialogFinalLog({ member, getData, onClose, handleSubmitSuccess }: any) { - const { localeData }: any = useContext(LanguageContext); - //Submission date - const [dischargeDate, setDischargeDate] = useState(format(new Date(), "yyyy MMM d HH:mm:ss")); - + const { localeData }: any = useContext(LanguageContext); + //Submission date + const [dischargeDate, setDischargeDate] = useState(format(new Date(), "yyyy MMM d HH:mm:ss")); + const [serviceCode, setServiceCode] = useState(''); // ---------------------------------------------------------------------- // Files Diagnosa @@ -101,6 +101,7 @@ export default function DialogFinalLog({ member, getData, onClose, handleSubmitS diagnosa_files: fileDiagnosas, kondisi_files: fileKondisis, discharge_date: fPostFormat(dischargeDate, 'yyyy-MM-dd HH:mm:ss'), + service_code: serviceCode, }); axios .post('/request-final-log', formData) @@ -117,6 +118,22 @@ export default function DialogFinalLog({ member, getData, onClose, handleSubmitS }); } + const [serviceOptions, setServiceOptions] = useState([ + { value: '-', label: '-' } + ]); + + useEffect(() => { + axios.get('service-member/'+member.member_id) + .then((response) => { + setServiceOptions(response.data); + }).catch((error) => { + console.error('Error fetching ICD options:', error); + }); + + }, []); + + console.log(serviceOptions, member, 'test') + return ( @@ -324,23 +341,44 @@ export default function DialogFinalLog({ member, getData, onClose, handleSubmitS - - - {localeData.txtDischargeDate} * - - { - setDischargeDate( (newValue)); - }} - inputFormat="dd-MM-yyyy HH:mm" - renderInput={(params) => } - /> - - + + {/* Kolom Tanggal Discharge */} + + {localeData.txtDischargeDate} * + + { + setDischargeDate(newValue); + }} + inputFormat="dd-MM-yyyy HH:mm" + renderInput={(params) => } + /> + + {/* Kolom Service Type */} + + {localeData.txtDialogMember1} * + option.label || ""} + value={serviceOptions.find((opt) => opt.value == member.service_code) || null} + onChange={(event, newValue) => { + setServiceCode(newValue?.value || ""); + }} + renderInput={(params) => ( + + )} + /> + + + + + + (''); const [idProvider, setIdProvider] = useState(0); + const [idSpecialities, setIdSpecialities] = useState(0); + const [inputDppj, setInputDppj] = useState(''); //Submission date const [submissionDate, setSubmissionDate] = useState(format(new Date(), "yyyy MMM d HH:mm:ss")); @@ -47,7 +50,7 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }: FormRe setCorporateIdPartner(member?.companies?.map((item: { id: any; name: any; }) => ({ value: item.id, label: item.name }))); }, []); const [selectedCorporatID, setSelectedCorporateID] = useState([]); - + const handleSelectChangePatner = (event:any, selectedOptions:any) => { const selectedValues = selectedOptions.map((option: { value: any; }) => option.value); setSelectedCorporateID(selectedValues); @@ -77,24 +80,26 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }: FormRe organization_name : name, address_provider: alamat, submission_date: fPostFormat(submissionDate, 'yyyy-MM-dd HH:mm:ss'), - corporate_id_partner: selectedCorporatID + corporate_id_partner: selectedCorporatID, + specialities_id: idSpecialities, + dppj: inputDppj }; axios .post('/request-log', formData) .then((response) => { if (response && response.data && response.data.meta) { - setTimeout(() => { - window.location.reload(); - }, 1500); + // setTimeout(() => { + // window.location.reload(); + // }, 1500); enqueueSnackbar(response.data.meta.message, { variant: 'success' }); handleSubmitSuccess(); - - } + + } }) .catch(({ response }) => { if (response && response.data && response.data.meta) { enqueueSnackbar(response.data.meta.message, { variant: 'error' }); - } + } }) .then(() => { setSubmitLoading(false); @@ -111,6 +116,11 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }: FormRe name: string; } + interface Specialities { + id: number; + name: string; + } + const [showAddNewForm, setShowAddNewForm] = useState(false); const [name, setName] = useState(''); const [alamat, setAlamat] = useState(''); @@ -191,22 +201,46 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }: FormRe - + {localeData.txtDialogMember1} * option.name || ''} - value={member?.services.find((item: MemberService) => item.service_code === serviceCode) || null} - onChange={(event: React.ChangeEvent<{}>, newValue: MemberService | null) => { - setServiceCode(newValue?.service_code || ''); + id="service_type" + options={member?.services || []} + getOptionLabel={(option: MemberService) => option.name || ''} + value={member?.services.find((item: MemberService) => item.service_code === serviceCode) || null} + onChange={(event: React.ChangeEvent<{}>, newValue: MemberService | null) => { + setServiceCode(newValue?.service_code || ''); + }} + renderInput={(params) => ( + + )} + /> + + + + + {/* Specialist */} + + + {localeData.txtSpecialist} + option.name || ''} + value={member?.specialities.find((item: Specialities) => item.id === idSpecialities) || null} + onChange={(event: React.ChangeEvent<{}>, newValue : Specialities | null) => { + setIdSpecialities(newValue?.id || 0); }} renderInput={(params) => ( )} @@ -215,6 +249,21 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }: FormRe + + + { localeData.txtDPPJ } + { + setInputDppj(event.target.value); + }} + fullWidth + /> + + + {localeData.txtDialogMember5} * @@ -226,7 +275,7 @@ export default function FormRequestClaim({ member, handleSubmitSuccess }: FormRe setSubmissionDate( (newValue)); }} inputFormat="dd-MM-yyyy HH:mm" - renderInput={(params) => } + renderInput={(params) => } /> diff --git a/frontend/hospital-portal/src/sections/dashboard/TableListReqLog.tsx b/frontend/hospital-portal/src/sections/dashboard/TableListReqLog.tsx index 42f78be3..96fc724d 100755 --- a/frontend/hospital-portal/src/sections/dashboard/TableListReqLog.tsx +++ b/frontend/hospital-portal/src/sections/dashboard/TableListReqLog.tsx @@ -348,14 +348,23 @@ export default function TableList() { - function handleRequestFinalLog(id:any, full_name:any, no_polis:any, submission_date:any) + function handleRequestFinalLog( + id:any, + full_name:any, + no_polis:any, + submission_date:any, + service_code:any, + member_id:any, + ) { setOpenDialogFinalLog(true); const datas_view = { 'id' : id, 'full_name' : full_name, 'no_polis' : no_polis, - 'submission_date' : submission_date + 'submission_date' : submission_date, + 'service_code' : service_code, + 'member_id' : member_id, }; setDataViewFinalDialog(datas_view); } @@ -427,7 +436,7 @@ export default function TableList() { ):''} {obj.final_log === 0 && obj.status === 'approved' ? ( - handleRequestFinalLog(obj.id, obj.full_name, obj.no_polis, obj.submission_date) }> + handleRequestFinalLog(obj.id, obj.full_name, obj.no_polis, obj.submission_date, obj.service_code, obj.member_id) }> Request Final LOG diff --git a/resources/views/pdf/final_log_page_1.blade.php b/resources/views/pdf/final_log_page_1.blade.php index 509e4369..16f7935a 100755 --- a/resources/views/pdf/final_log_page_1.blade.php +++ b/resources/views/pdf/final_log_page_1.blade.php @@ -242,7 +242,7 @@ {{ wordwrap($request_logs->code,15,"
\n")}} Tanggal : - {{ \Carbon\Carbon::parse($request_logs->created_at)->format('d M Y') }} + {{ \Carbon\Carbon::parse($request_logs->approved_at)->format('d M Y') }} Kepada