diff --git a/Modules/Client/Http/Controllers/Api/ClaimController.php b/Modules/Client/Http/Controllers/Api/ClaimController.php index 061dbddd..2b7537ab 100644 --- a/Modules/Client/Http/Controllers/Api/ClaimController.php +++ b/Modules/Client/Http/Controllers/Api/ClaimController.php @@ -380,9 +380,9 @@ class ClaimController extends Controller DB::raw(' (Select persons.nik FROM persons WHERE persons.id = members.person_id LIMIT 1) AS nik '), - DB::raw(' - "LinkSehat" AS penjamin - '), + // DB::raw(' + // "LinkSehat" AS penjamin + // '), DB::raw(' (Select corporates.name FROM corporates LEFT JOIN corporate_employees ON corporate_employees.corporate_id = corporates.id @@ -426,6 +426,18 @@ class ClaimController extends Controller ) ->first(); + //get penjamin + $penjamin = 'LinkSehat'; + if(!empty($dataRumahSakit->corporate_id_partner)) + { + $corporate_id_partners = explode(',', $dataRumahSakit->corporate_id_partner); + $valueToCheck = $dataMember->id_perusahaan; + + if (in_array($valueToCheck, $corporate_id_partners)) { + $penjamin = $dataMember->nama_perusahaan; + } + } + //Nama Karyawan $data['namaKaryawan'] = ''; if($dataMember->principal_id) @@ -480,7 +492,7 @@ class ClaimController extends Controller !empty($dataMember->name) ? $dataMember->name : '', $data['namaKaryawan'], !empty($dataMember->code_plan) ? $dataMember->code_plan : '', - 'LinkSehat', + $penjamin, !empty($dataMember->nama_perusahaan) ? $dataMember->nama_perusahaan : '', !empty($dataMember->no_polis) ? $dataMember->no_polis : '', ($firtIndex == $index ? $item->tot_bill : ''), @@ -513,7 +525,7 @@ class ClaimController extends Controller !empty($dataMember->name) ? $dataMember->name : '', $data['namaKaryawan'], !empty($dataMember->code_plan) ? $dataMember->code_plan : '', - 'LinkSehat', + $penjamin, !empty($dataMember->nama_perusahaan) ? $dataMember->nama_perusahaan : '', !empty($dataMember->no_polis) ? $dataMember->no_polis : '', '', diff --git a/Modules/HospitalPortal/Http/Controllers/Api/ClaimRequestController.php b/Modules/HospitalPortal/Http/Controllers/Api/ClaimRequestController.php index 54d56720..3d27eb3a 100644 --- a/Modules/HospitalPortal/Http/Controllers/Api/ClaimRequestController.php +++ b/Modules/HospitalPortal/Http/Controllers/Api/ClaimRequestController.php @@ -7,6 +7,9 @@ use App\Helpers\Helper; use App\Models\ClaimRequest; use App\Models\File; use App\Models\Member; +use App\Models\RequestLog; +use App\Models\Organization; + use App\Services\ClaimRequestService; use App\Services\ClaimService; use Exception; @@ -26,7 +29,7 @@ class ClaimRequestController extends Controller * Display a listing of the resource. * @return Renderable */ - private static $code_prefix = 'CRQ-H'; + private static $code_prefix = 'CLAIM'; public function index(request $request) { $claimRequests = ClaimRequest::query() @@ -85,21 +88,26 @@ class ClaimRequestController extends Controller else { $check_claim_requests = DB::table('claim_requests') - ->where('claim_requests.request_log_id', '=', $request->request_logs_id) - ->first(); + ->where('claim_requests.request_log_id', '=', $request->request_logs_id) + ->first(); if(!$check_claim_requests) { try { DB::beginTransaction(); - $code = $this->getNextCode(); + $code = $this->getNextCode($request->request_logs_id); $member = Member::find($request->member_id); + $requestLogData = RequestLog::where('id',$request->request_logs_id)->first(); + $organization = Organization::where(['id' => $requestLogData->organization_id, 'type' => 'hospital'])->first('code'); + $provideCode = $organization ? $organization->code : ''; + $newClaimRequest = ClaimRequestService::storeClaimRequest( row: [], code: $code, member: $member, - paymentType: 'reimbursement', + paymentType: 'cashless', serviceCode: $request->service_code, requestLogID: $request->request_logs_id, + organization_code: $provideCode, ); // Log History $newClaimRequest->histories()->create([ @@ -228,21 +236,36 @@ class ClaimRequestController extends Controller return $claimRequest; } - public static function getNextCode() + public static function getNextCode($request_log_id = 0) { - $last_number = ClaimRequest::withTrashed()->max('code'); - $last_number_parts = explode('-', $last_number); - $next_number = count($last_number_parts) < 3 ? 1 : ((int) $last_number_parts[2] + 1); - return self::makeCode($next_number); + $last_numeric_code = ClaimRequest::select(DB::raw('MAX(CAST(SUBSTRING_INDEX(code, ".", -1) AS SIGNED)) as max_numeric_code')) + ->whereRaw('SUBSTRING_INDEX(code, ".", -1) REGEXP "^[0-9]+$"') + ->value('max_numeric_code'); + // $next_number = 1; + if ($last_numeric_code) { + // // Jika ada kode sebelumnya, pecah kode dan tambahkan 1 ke angka terakhir + // $parts = explode('-', $last_code); + // $last_number = (int) end($parts); + $next_number = $last_numeric_code + 1; + } else { + $next_number = 1; + } + return self::makeCode($next_number, $request_log_id); } - public static function makeCode($next_number) + public static function makeCode($next_number, $request_log_id) { // Pastikan $next_number adalah integer positif $next_number = max(1, (int) $next_number); - + $requestLogData = RequestLog::where('id', $request_log_id)->first(); + $organization = Organization::where(['id' => $requestLogData->organization_id, 'type' => 'hospital'])->first('code'); + $provideCode = $organization ? $organization->code : ''; + $member = Member::with('currentCorporate')->where(['id' => $requestLogData->member_id])->first(); + $sparator = '.'; + $date = date('ymd'); // Menghasilkan kode dengan format yang diinginkan - return self::$code_prefix . '-' . str_pad($next_number, 5, '0', STR_PAD_LEFT); + return self::$code_prefix . $sparator. 'H' . $sparator. $provideCode . $sparator. $date. $sparator . $member->currentPolicy->code . $sparator. $member->member_id . $sparator. str_pad($next_number, 5, '0', STR_PAD_LEFT); + return self::$code_prefix . '.' . str_pad($next_number, 6, '0', STR_PAD_LEFT); } public function get_claim_requests(Request $request) diff --git a/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php b/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php index 20376706..584b7264 100644 --- a/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php +++ b/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php @@ -37,9 +37,18 @@ class ClaimRequestController extends Controller ->when($request->search, function ($q, $search) { $q->where('code', 'LIKE', "%".$search."%"); $q->orWhereHas('member', function ($subQuery) use ($search) { - $subQuery->where('name', 'LIKE', "%".$search.""); + $subQuery->where('name', 'LIKE', "%".$search."%"); }); }) + ->when($request->start_date, function ($q, $startDate) { + $q->where('submission_date', '>', $startDate); + }) + ->when($request->end_date, function ($q, $endDate) { + $q->where('submission_date', '<', $endDate); + }) + ->when($request->service_code, function ($q, $serviceCode) { + $q->whereIn('service_code', $serviceCode); + }) ->when($request->orderBy, function ($q, $orderBy) use ($request) { if (in_array($orderBy, ['submission_date', 'code'])) { $q->orderBy($orderBy, $request->order); @@ -262,12 +271,8 @@ class ClaimRequestController extends Controller 'claim', 'organization', ]); - $organization = Organization::where('code', $request->provider_code)->first(); - if (!$organization) { - return response()->json(['error' => true, 'message' => 'Data tidak ditemukan'], 404); - } - $updateClaimRequest = ClaimRequestService::updateClaimRequest(organization_id: $organization->id, claim_request_id: $id); + $updateClaimRequest = ClaimRequestService::updateClaimRequest(reason: $request->reason, submission_date: $request->date, claim_request_id: $id); ClaimRequested::dispatch($updateClaimRequest); // Log History @@ -511,89 +516,102 @@ class ClaimRequestController extends Controller public function claimRequestDetail($claimRequestId) { - $status = DB::table('claim_requests') - ->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id') - ->leftJoin('members', 'claim_requests.member_id', '=', 'members.id') - ->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id') - ->leftJoin('corporate_divisions', 'corporate_employees.division_id', '=', 'corporate_divisions.id') - ->where('claim_requests.id', '=', $claimRequestId) - ->select( - 'claim_requests.submission_date', - 'claim_requests.code', - DB::raw(' - CASE - WHEN claim_requests.status = "requested" THEN "requested" - WHEN claim_requests.status = "approved" AND claims.status = "approved" THEN "approved" - WHEN claim_requests.status = "approved" AND claims.status = "declined" THEN "declined" - WHEN claim_requests.status = "approved" AND claims.status = "disbrusmented" THEN "disbrusmented" - /*WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "pending"*/ - WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "reviewed" - ELSE "" - END AS status - ') - ) - ->first(); - $results['status'] = $status; - $timeline = DB::table('claim_logs') - ->where('claim_logs.claim_request_id', '=', $claimRequestId) - ->select( - DB::raw(' - CASE - WHEN claim_logs.status = "requested" THEN "Request" - WHEN claim_logs.status = "reviewed" THEN "Review" - WHEN claim_logs.status = "approved" THEN "Approval" - WHEN claim_logs.status = "declined" THEN "Decline" - ELSE "-" - END AS txt_status - '), - DB::raw(' - CASE - WHEN claim_logs.status = "requested" THEN "#159C9C" - WHEN claim_logs.status = "reviewed" THEN "#0C53B7" - WHEN claim_logs.status = "approved" THEN "#229A16" - WHEN claim_logs.status = "declined" THEN "#FF4842" - ELSE "-" - END AS txt_status_color - '), - DB::raw(' - CASE - WHEN claim_logs.status = "requested" THEN "#00AB5529" - WHEN claim_logs.status = "reviewed" THEN "#1890FF29" - WHEN claim_logs.status = "approved" THEN "#54D62C29" - WHEN claim_logs.status = "declined" THEN "#FF48427A" - ELSE "-" - END AS txt_status_backgroundColor - '), - 'claim_logs.date', - 'claim_logs.description', - 'claim_logs.status' - ) - ->orderBy('claim_logs.id', 'desc') - ->get(); - $results['timeline'] = $timeline; - $request_files = DB::table('claim_request_files') - ->where('claim_request_files.claim_request_id', '=', $claimRequestId) - ->select( - 'claim_request_files.*', - DB::raw('(SELECT files.fileable_id FROM files WHERE files.fileable_id = claim_request_files.claim_request_id AND files.type = claim_request_files.type LIMIT 1) AS check_files'), - ) - ->get(); - $results['request_files'] = $request_files; - $documents = DB::table('files') - ->where('fileable_type', 'App\Models\ClaimRequest') - ->where('fileable_id', $claimRequestId) - ->select('original_name', \DB::raw("CONCAT('" . env('APP_URL') . "/storage/', path) as path"), 'type') - ->orderBy('id', 'desc') - ->get(); - $results['documents'] = $documents; - $dialog_submits = DB::table('claim_requests') - ->leftJoin('members', 'claim_requests.member_id','=', 'members.id') - ->where('claim_requests.id', $claimRequestId) - ->select('claim_requests.code', 'members.name', 'claim_requests.submission_date', 'claim_requests.service_code','claim_requests.status') - ->first(); - $results['dialog_submits'] = $dialog_submits; + // $status = DB::table('claim_requests') + // ->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id') + // ->leftJoin('members', 'claim_requests.member_id', '=', 'members.id') + // ->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id') + // ->leftJoin('corporate_divisions', 'corporate_employees.division_id', '=', 'corporate_divisions.id') + // ->where('claim_requests.id', '=', $claimRequestId) + // ->select( + // 'claim_requests.submission_date', + // 'claim_requests.code', + // DB::raw(' + // CASE + // WHEN claim_requests.status = "requested" THEN "requested" + // WHEN claim_requests.status = "approved" AND claims.status = "approved" THEN "approved" + // WHEN claim_requests.status = "approved" AND claims.status = "declined" THEN "declined" + // WHEN claim_requests.status = "approved" AND claims.status = "disbrusmented" THEN "disbrusmented" + // /*WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "pending"*/ + // WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "reviewed" + // ELSE "" + // END AS status + // ') + // ) + // ->first(); + // $results['status'] = $status; + // $timeline = DB::table('claim_logs') + // ->where('claim_logs.claim_request_id', '=', $claimRequestId) + // ->select( + // DB::raw(' + // CASE + // WHEN claim_logs.status = "requested" THEN "Request" + // WHEN claim_logs.status = "reviewed" THEN "Review" + // WHEN claim_logs.status = "approved" THEN "Approval" + // WHEN claim_logs.status = "declined" THEN "Decline" + // ELSE "-" + // END AS txt_status + // '), + // DB::raw(' + // CASE + // WHEN claim_logs.status = "requested" THEN "#159C9C" + // WHEN claim_logs.status = "reviewed" THEN "#0C53B7" + // WHEN claim_logs.status = "approved" THEN "#229A16" + // WHEN claim_logs.status = "declined" THEN "#FF4842" + // ELSE "-" + // END AS txt_status_color + // '), + // DB::raw(' + // CASE + // WHEN claim_logs.status = "requested" THEN "#00AB5529" + // WHEN claim_logs.status = "reviewed" THEN "#1890FF29" + // WHEN claim_logs.status = "approved" THEN "#54D62C29" + // WHEN claim_logs.status = "declined" THEN "#FF48427A" + // ELSE "-" + // END AS txt_status_backgroundColor + // '), + // 'claim_logs.date', + // 'claim_logs.description', + // 'claim_logs.status' + // ) + // ->orderBy('claim_logs.id', 'desc') + // ->get(); + // $results['timeline'] = $timeline; + // $request_files = DB::table('claim_request_files') + // ->where('claim_request_files.claim_request_id', '=', $claimRequestId) + // ->select( + // 'claim_request_files.*', + // DB::raw('(SELECT files.fileable_id FROM files WHERE files.fileable_id = claim_request_files.claim_request_id AND files.type = claim_request_files.type LIMIT 1) AS check_files'), + // ) + // ->get(); + // $results['request_files'] = $request_files; + // $documents = DB::table('files') + // ->where('fileable_type', 'App\Models\ClaimRequest') + // ->where('fileable_id', $claimRequestId) + // ->select('original_name', \DB::raw("CONCAT('" . env('APP_URL') . "/storage/', path) as path"), 'type') + // ->orderBy('id', 'desc') + // ->get(); + // $results['documents'] = $documents; + // $dialog_submits = DB::table('claim_requests') + // ->leftJoin('members', 'claim_requests.member_id','=', 'members.id') + // ->where('claim_requests.id', $claimRequestId) + // ->select('claim_requests.code', 'members.name', 'claim_requests.submission_date', 'claim_requests.service_code','claim_requests.status') + // ->first(); + // $results['dialog_submits'] = $dialog_submits; - return Helper::responseJson($results); + // return Helper::responseJson($results); + + $claimRequest = ClaimRequest::findOrFail($claimRequestId); + $claimRequest->load([ + 'requestLog', + 'requestLog.organization', + 'requestLog.member', + 'member.currentPlan' => function($memberPlan) { + $memberPlan->join('claim_requests', 'claim_requests.service_code', '=', 'plans.service_code'); + }, + 'requestLog.files', + ]); + + return Helper::responseJson(data: ClaimRequestShowResource::make($claimRequest)); } public function invoiceFiles(Request $request, $claim_id) diff --git a/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php b/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php index 6178fbd1..5a0e6403 100644 --- a/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php +++ b/Modules/Internal/Http/Controllers/Api/DailyMonitoringController.php @@ -395,6 +395,31 @@ class DailyMonitoringController extends Controller } } + /** + * 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); + } + /** * Update Status Request LOG */ diff --git a/Modules/Internal/Http/Controllers/Api/ReportLogController.php b/Modules/Internal/Http/Controllers/Api/ReportLogController.php index 1877c8d3..e0bbcee2 100644 --- a/Modules/Internal/Http/Controllers/Api/ReportLogController.php +++ b/Modules/Internal/Http/Controllers/Api/ReportLogController.php @@ -104,8 +104,8 @@ class ReportLogController extends Controller */ public function show($id) { - $claimRequest = RequestLog::findOrFail($id); - $claimRequest->load([ + $requestLog = RequestLog::findOrFail($id); + $requestLog->load([ 'histories' => function ($history) { $history->latest(); }, @@ -120,7 +120,7 @@ class ReportLogController extends Controller ]); - return Helper::responseJson(data: RequestLogShowResource::make($claimRequest)); + return Helper::responseJson(data: RequestLogShowResource::make($requestLog)); } /** diff --git a/Modules/Internal/Http/Controllers/Api/RequestLogController.php b/Modules/Internal/Http/Controllers/Api/RequestLogController.php index 7b3fc169..aaa7f8c7 100644 --- a/Modules/Internal/Http/Controllers/Api/RequestLogController.php +++ b/Modules/Internal/Http/Controllers/Api/RequestLogController.php @@ -441,6 +441,7 @@ class RequestLogController extends Controller 'path' => $pathFile, 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, + 'reason' => $request->reason, ]); } } @@ -878,6 +879,7 @@ class RequestLogController extends Controller 'path' => $pathFile, 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, + 'reason' => $request->reason, ]); } } @@ -893,6 +895,7 @@ class RequestLogController extends Controller 'path' => $pathFile, 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, + 'reason' => $request->reason, ]); } } @@ -908,6 +911,7 @@ class RequestLogController extends Controller 'path' => $pathFile, 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, + 'reason' => $request->reason, ]); } } diff --git a/Modules/Internal/Routes/api.php b/Modules/Internal/Routes/api.php index 560bae58..303a75dc 100644 --- a/Modules/Internal/Routes/api.php +++ b/Modules/Internal/Routes/api.php @@ -178,6 +178,7 @@ Route::prefix('internal')->group(function () { Route::post('detail/{claim_code}/add', [DailyMonitoringController::class, 'AddDetailMonitoringList']); Route::post('detail/{claim_code}/add-request', [DailyMonitoringController::class, 'AddDetailMonitoringListRequestLog']); Route::post('detail/{claim_code}/update-status', [DailyMonitoringController::class, 'UpdateListRequestLog']); + Route::get('detail/{id}/delete', [DailyMonitoringController::class, 'deleteDetailMonitoringListRequestLog']); }); // Laboratorium Result @@ -312,7 +313,7 @@ Route::prefix('internal')->group(function () { Route::post('claim-requests/{id}/approve', [ClaimRequestController::class, 'approve'])->name('claim-requests.approve'); Route::get('claim-requests/{id}', [ClaimRequestController::class, 'show'])->name('claim-requests.show'); Route::post('claim-requests', [ClaimRequestController::class, 'createNew']); // Bagaskoro, BSD 2 November 2023 - Route::put('claim-requests/{id}', [ClaimRequestController::class, 'update'])->name('claim-requests.update'); + Route::post('claim-requests/{id}/update', [ClaimRequestController::class, 'update']); Route::post('claim-requests/import', [ClaimRequestController::class, 'importClaim'])->name('claim-requests.importClaim'); Route::get('claim-requests/detail/{id}', [ClaimRequestController::class, 'claimRequestDetail']); Route::post('claim-requests/{id}/invoice-files', [ClaimRequestController::class, 'invoiceFiles']); diff --git a/Modules/Internal/Transformers/ClaimRequestShowResource.php b/Modules/Internal/Transformers/ClaimRequestShowResource.php index 33af672a..e982b4f1 100644 --- a/Modules/Internal/Transformers/ClaimRequestShowResource.php +++ b/Modules/Internal/Transformers/ClaimRequestShowResource.php @@ -4,6 +4,15 @@ namespace Modules\Internal\Transformers; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Str; +use App\Models\Service; +use App\Models\MemberPlan; +use App\Models\Plan; +use App\Models\CorporateBenefit; +use App\Models\RequestLogBenefit; +use App\Models\CorporatePolicy; +use App\Models\RequestLogMedicine; +use App\Models\Organization; +use App\Helpers\Helper; class ClaimRequestShowResource extends JsonResource { @@ -16,25 +25,57 @@ class ClaimRequestShowResource extends JsonResource public function toArray($request) { $data = parent::toArray($request); + $corporateId = $data['member']['current_plan']['corporate_id'] ?? 0; + $planMember = MemberPlan::where('member_id', $data['member_id'])->get('plan_id'); - // Map Histories to Group by Dates - $historiesGroupByDate = $this->histories->mapToGroups(function($history) { - return [$history->created_at->format('Y-m-d') => $history]; - }); - $data['histories_by_date'] = []; - foreach ($historiesGroupByDate as $date => $histories) { - $data['histories_by_date'][] = [ - 'date' => $date, - 'histories' => $histories - ]; + $planId = Plan::whereIn('id', $planMember)->where('service_code', $data['service_code'])->first(); + $benefit = CorporateBenefit::with('benefit')->where('plan_id', $planId->id)->get()->toArray(); + $benefitDetailLog = RequestLogBenefit::with('benefit')->where('request_log_id', $data['request_log_id'])->get()->toArray(); + $medicineDetailLog = RequestLogMedicine::where('request_log_id', $data['request_log_id'])->get()->toArray(); + + $benefitData = []; + + if (count($benefit)){ + foreach($benefit as $row){ + array_push($benefitData, $row['benefit']); + } } - // Map Files by type - $filesGroupByType = $this->files->mapToGroups(function($file) { - return [Str::slug($file->type, '_') => $file]; - }); - $data['files_by_type'] = $filesGroupByType; + // Policy Number + $policyNumber = CorporatePolicy::query() + ->where('corporate_id', $corporateId) + ->first(); - return $data; + + $response = [ + 'id' => $data['id'], + 'code' => $data['code'], + 'request_log_id' => $data['request_log_id'], + 'provider' => $data['request_log']['organization']['name'], + 'member_id' => $data['request_log']['member']['member_id'], + 'policy_number' => $policyNumber->code ? $policyNumber->code : '-', + 'name' => $data['request_log']['member']['name'], + 'date_of_birth' => $data['request_log']['member']['birth_date'], + 'gender' => $data['request_log']['member']['gender'], + 'marital_status' => $data['request_log']['member']['status_marital'], + 'member_type' => Helper::memberType($data['request_log']['member']['record_type']), + 'principal_id' => $data['request_log']['member']['principal_id'] ? $data['request_log']['member']['principal_id'] : '-', + 'principal_name' => $data['request_log']['member']['principal_id'] ? Helper::principalName($data['request_log']['member']['principal_id']) : '-', + 'relation_with_principal' => Helper::relationWithPrincipal($data['request_log']['member']['relation_with_principal']), + 'submission_date' => $data['submission_date'], + 'no_identitas' => $data['request_log']['member']['nric'], + 'keterangan' => $data['request_log']['keterangan'], + 'hak_kamar_pasien' => $data['request_log']['hak_kamar_pasien'], + 'penempatan_kamar' => $data['request_log']['penempatan_kamar'], + 'catatan' => $data['request_log']['catatan'], + 'service_type' => Helper::serviceName( $data['request_log']['service_code']), + 'claim_method' => $data['request_log']['payment_type'], + 'files' => $data['request_log']['files'], + 'benefit' => $benefitData, + 'benefit_data' => $benefitDetailLog, + ]; + + + return $response; } } diff --git a/app/Models/ClaimRequest.php b/app/Models/ClaimRequest.php index 6622efc4..cfed961a 100644 --- a/app/Models/ClaimRequest.php +++ b/app/Models/ClaimRequest.php @@ -8,6 +8,7 @@ use App\Traits\Blameable; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; +use Altek\Accountant\Contracts\Recordable; use Str; class ClaimRequest extends Model @@ -28,7 +29,8 @@ class ClaimRequest extends Model 'claim_id', 'organization_id', 'code', - 'request_log_id' + 'request_log_id', + 'reason' ]; protected $hidden = [ @@ -207,6 +209,11 @@ class ClaimRequest extends Model return $this->hasMany(Claim::class, 'claim_request_id'); } + public function requestLog() + { + return $this->hasOne(RequestLog::class, 'id', 'request_log_id'); + } + public function files() { return $this->morphMany(File::class, 'fileable'); diff --git a/app/Models/RequestDailyMonitoring.php b/app/Models/RequestDailyMonitoring.php index 2d658f68..dd34d374 100644 --- a/app/Models/RequestDailyMonitoring.php +++ b/app/Models/RequestDailyMonitoring.php @@ -4,12 +4,14 @@ namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\SoftDeletes; +use Illuminate\Support\Facades\Auth; use DB; class RequestDailyMonitoring extends Model { use HasFactory; - + use SoftDeletes; protected $table = "request_log_daily_monitorings"; protected $fillable = [ @@ -28,6 +30,8 @@ class RequestDailyMonitoring extends Model 'created_by', 'updated_by', 'deleted_by', + 'reason', + 'deleted_at' ]; protected $appends = ['medical_plan', 'non_medikamentosa_plan', 'document', 'discharge_date']; @@ -52,6 +56,18 @@ class RequestDailyMonitoring extends Model // return round($this->attributes['respiration_rate'], 0); // } + protected static function boot() + { + parent::boot(); + + // Event handling untuk deleting + static::deleting(function ($model) { + // Set nilai deleted_by dengan ID pengguna yang melakukan penghapusan (jika ada) + $model->deleted_by = Auth::id(); + $model->save(); + }); + } + public function getMedicalPlanAttribute() { $arr_medical_plan = []; diff --git a/app/Models/RequestLog.php b/app/Models/RequestLog.php index ea538202..b5a865fc 100644 --- a/app/Models/RequestLog.php +++ b/app/Models/RequestLog.php @@ -270,7 +270,7 @@ class RequestLog extends Model public function requestLogDailyMonitorings() { - return $this->hasMany(RequestLogDailyMonitoring::class, 'request_log_id'); + return $this->hasMany(RequestLogDailyMonitoring::class, 'request_log_id')->whereNull('deleted_at'); } public function getPaymentTypeNameAttribute() diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 8b88ce96..456eb067 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -14,6 +14,7 @@ use App\Models\CorporateBenefit; use App\Models\Member; use App\Models\MemberPlan; use App\Models\CorporateHospital; +use App\Models\ClaimRequest; use App\Models\ExclusionRules; use App\Models\ExclusionImport; use App\Models\Icd; @@ -147,6 +148,15 @@ class AppServiceProvider extends ServiceProvider $this->logAuditTrail($model, 'deleted'); }); + ClaimRequest::updated(function ($model) { + + $this->logAuditTrail($model, 'updated'); + }); + + ClaimRequest::deleted(function ($model) { + $this->logAuditTrail($model, 'deleted'); + }); + // ICD or exlusion Icd::updated(function ($model) { $this->logAuditTrail($model, 'updated'); diff --git a/app/Services/ClaimRequestService.php b/app/Services/ClaimRequestService.php index c840e2da..3ecac549 100644 --- a/app/Services/ClaimRequestService.php +++ b/app/Services/ClaimRequestService.php @@ -110,19 +110,23 @@ class ClaimRequestService{ } } - public static function updateClaimRequest($organization_id, $claim_request_id){ + public static function updateClaimRequest($reason, $submission_date, $claim_request_id){ try { - $data = [ - 'organization_id' => $organization_id - ]; - DB::commit(); - $update = ClaimRequest::where('id', $claim_request_id)->update($data); - return ClaimRequest::find($claim_request_id); - + $claimRequest = ClaimRequest::find($claim_request_id); + + if (!$claimRequest) { + throw new \Exception("Claim request not found"); + } + + $claimRequest->submission_date = $submission_date; + $claimRequest->reason = $reason; + + $claimRequest->save(); + + return $claimRequest; + } catch (\Exception $error) { - DB::rollBack(); - - throw new \Exception($error); + throw new \Exception($error->getMessage()); } } diff --git a/database/migrations/2024_02_20_121654_add_coloumn_claim_requests_table.php b/database/migrations/2024_02_20_121654_add_coloumn_claim_requests_table.php new file mode 100644 index 00000000..8936d362 --- /dev/null +++ b/database/migrations/2024_02_20_121654_add_coloumn_claim_requests_table.php @@ -0,0 +1,32 @@ +string('reason')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('claim_requests', function (Blueprint $table) { + $table->dropColumn('reason'); + }); + } +}; diff --git a/database/migrations/2024_02_20_152314_add_coloumn_to_request_log_daily_monitorings.php b/database/migrations/2024_02_20_152314_add_coloumn_to_request_log_daily_monitorings.php new file mode 100644 index 00000000..08c9a820 --- /dev/null +++ b/database/migrations/2024_02_20_152314_add_coloumn_to_request_log_daily_monitorings.php @@ -0,0 +1,34 @@ +string('reason'); + $table->softDeletes(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('request_log_daily_monitorings', function (Blueprint $table) { + $table->dropColumn('reason'); + $table->dropSoftDeletes(); + }); + } +}; diff --git a/frontend/dashboard/src/@types/claims.ts b/frontend/dashboard/src/@types/claims.ts index 4329ae71..d1938af7 100644 --- a/frontend/dashboard/src/@types/claims.ts +++ b/frontend/dashboard/src/@types/claims.ts @@ -10,12 +10,16 @@ export type ClaimRequest = { service_code: string; claim_method: string; service_type: string; + service_name: string; code_provider: string; file_condition: Files; member: Member; claim: { organization: Organizations } + organization: { + code: string + } }; export type Claims = { diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringList.tsx b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringList.tsx index 81f61580..573bda2d 100644 --- a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringList.tsx +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Components/DetailMonitoringList.tsx @@ -2,10 +2,10 @@ * Core * ============================================ */ -import { useEffect, useState } from 'react'; +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 } from '@mui/material'; +import { Box, IconButton, Typography, Grid, Card, List, ListItem, Stack, Autocomplete, TextField, Button } from '@mui/material'; import { LoadingButton } from "@mui/lab"; /** @@ -31,6 +31,13 @@ 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 } from '@mui/icons-material'; +import MuiDialog from '@/components/MuiDialog'; +import { DialogActions } from '@mui/material'; +import axios from '@/utils/axios'; +import { enqueueSnackbar } from 'notistack'; export default function DetailMonitoringList() { @@ -42,12 +49,91 @@ export default function DetailMonitoringList() { // -------------------- 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 handleCloseDialog = () => { + setOpenDialog(false); + } + const handleDelete = () => { + if(selectedReason.value != '-'){ + const parameters = { + 'reason' : selectedReason.value + } + const response = axios.get(`case_management/daily_monitoring/detail/${id}/delete`, { + params: { ...parameters }, + }); + if (!response.error){ + enqueueSnackbar('Claim Request Updated Successfully!', { variant: 'success' }); + window.location.reload(); + setOpenDialog(false) + } else { + enqueueSnackbar('Claim Request Updated Error!', { variant: 'error' }); + } + } else { + setError('Please select a reason') + } + } + + const getContent = () => ( + + Are you sure to delete this 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 () => { @@ -81,33 +167,49 @@ export default function DetailMonitoringList() { detailMonitoringList?.map((row, index) => { return ( - + {/* card header */} - - + )} + {/* Menempatkan TableMoreMenu di sebelah kanan */} + {setOpenDialog(true); setId(row.id)}}> + + Delete + + } /> + + {/* card body */} @@ -387,6 +489,15 @@ export default function DetailMonitoringList() { } + + {/* Dialog Delete */} + ); diff --git a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Types.ts b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Types.ts index 430a8990..5230826f 100644 --- a/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Types.ts +++ b/frontend/dashboard/src/pages/CaseManagement/DailyMonitoring/Model/Types.ts @@ -48,7 +48,7 @@ export type ClaimListType = { * Detail Monitoring List */ export type DetailMonitoringListType = { - id : string|null, + id : number|null, claim_id : string|null, claim_code : string, subject : string, @@ -61,6 +61,7 @@ export type DetailMonitoringListType = { analysis : string, complaints : string, submission_date : string, + discharge_date : string, lab_date : string, provider : string, examination : string, diff --git a/frontend/dashboard/src/pages/ClaimRequests/Components/DialogConfirmation.tsx b/frontend/dashboard/src/pages/ClaimRequests/Components/DialogConfirmation.tsx new file mode 100644 index 00000000..ce78fa0b --- /dev/null +++ b/frontend/dashboard/src/pages/ClaimRequests/Components/DialogConfirmation.tsx @@ -0,0 +1,174 @@ +import MuiDialog from "@/components/MuiDialog"; +import { Autocomplete, Button, Card, Checkbox, DialogActions, Grid, TextField, Typography } from "@mui/material"; +import { Paper } from "@mui/material"; +import { Stack } from '@mui/material'; +import React, { useEffect, useState } from 'react'; +import { ClaimRequest, Files } from '@/@types/claims'; +import { fDateOnly, fDateTimesecond, toTitleCase } from "@/utils/formatTime"; +import axios from "@/utils/axios"; +import { enqueueSnackbar, useSnackbar } from "notistack"; +import { useNavigate } from "react-router"; +import * as Yup from 'yup'; +import { yupResolver } from '@hookform/resolvers/yup'; + +type DialogConfirmationType = { + openDialog: boolean; + setOpenDialog: any; + onSubmit?: void; + approve: string; + claimRequest: ClaimRequest|undefined; +} + +export default function DialogConfirmation({claimRequest, setOpenDialog, openDialog, approve, onSubmit} : DialogConfirmationType ) { + + const navigate = useNavigate(); + const { enqueueSnackbar } = useSnackbar(); + + const [formData, setFormData] = useState({ + date: claimRequest?.date, + id: claimRequest?.id, + reason: claimRequest?.reason + }); + + const handleChange = (field, value) => { + setFormData((prevData) => ({ + ...prevData, + [field]: value, + })); + + }; + + const handleSubmit = () => { + axios + .post(`customer-service/request/final-log`, formData) + .then((response) => { + enqueueSnackbar('Verification Request LOG Success', { variant: 'success' }); + setOpenDialog(false); + if (requestLog?.service_type == 'Inpatient'){ + navigate('/case_management/inpatient_monitoring'); + } else { + navigate('/custormer-service/final-log'); + } + }) + .catch(({ response }) => { + enqueueSnackbar(response.data.message ?? 'Something went wrong!', { variant: 'error' }); + }); + } + + + const style1 = { + color: '#919EAB', + width: '30%' + } + const style2 = { + width: '70%' + } + const marginBottom1 = { + marginBottom: 1, + } + const marginBottom2 = { + marginBottom: 2, + } + const handleCloseDialog = () => { + setOpenDialog(false); + } + + + + const getContent = () => ( + + Are you sure to {approve == 'approved' ? 'approve' : 'deciline'} this final log ? + + + + Member ID + {requestLog?.member_id} + + + Policy Number + {requestLog?.policy_number} + + + Name + {requestLog?.name} + + + Submission Date + {requestLog?.submission_date ? fDateTimesecond(requestLog?.submission_date) : '-'} + + + Claim Method + {requestLog?.claim_method ? toTitleCase(requestLog?.claim_method) : '-'} + + + Service Type + {requestLog?.service_type} + + + + + + Discharge Date + handleChange('discharge_date', e.target.value)} + /> + + + Catatan + handleChange('catatan', e.target.value)} + /> + + + Diagnosis ICD - X + option.label} + fullWidth + value={icdOptions.filter((icd) => formData.icdCodes.includes(icd.value))} + onChange={(e, newValues) => handleChange('icdCodes', newValues.map((value) => value.value))} + renderInput={(params) => ( + + )} + /> + + + + + + + {approve == 'approved' ? ( + + ) : ( + + ) } + + + + ); + + + return ( + + ); +} \ No newline at end of file diff --git a/frontend/dashboard/src/pages/ClaimRequests/Components/DialogDeleteFileLog.tsx b/frontend/dashboard/src/pages/ClaimRequests/Components/DialogDeleteFileLog.tsx new file mode 100644 index 00000000..b893a9a4 --- /dev/null +++ b/frontend/dashboard/src/pages/ClaimRequests/Components/DialogDeleteFileLog.tsx @@ -0,0 +1,140 @@ +import MuiDialog from "@/components/MuiDialog"; +import { Autocomplete, Button, Card, Checkbox, DialogActions, Grid, Typography } from "@mui/material"; +import { Paper } from "@mui/material"; +import { Stack } from '@mui/material'; +import React, { useEffect, useState } from 'react'; +import { fDateTimesecond, toTitleCase } from "@/utils/formatTime"; +import axios from "@/utils/axios"; +import { enqueueSnackbar } from "notistack"; +import { useNavigate } from "react-router"; +import { TextField } from "@mui/material"; + + +type DialogDeleteType = { + openDialog: boolean; + setOpenDialog: any; + onSubmit?: void; + id: number|undefined; + path: string; +} + +export default function DialogDeleteFileLog({id, path, setOpenDialog, openDialog,onSubmit} : DialogDeleteType ) { + const style1 = { + color: '#919EAB', + width: '30%' + } + const style2 = { + width: '70%' + } + const marginBottom2 = { + marginBottom: 2, + } + + const handleCloseDialog = () => { + setOpenDialog(false); + resetForm(); + } + + const [isReasonSelected, setIsReasonSelected] = useState(false); + + const reasons = [ + { value: 'Wrong Setting', label: 'Wrong Setting' }, + { value: 'Hospital Request', label: 'Hospital Request' } + ]; + const [formData, setFormData] = useState({ + path: path, + reason: null + }); + + const resetForm = () => { + setFormData({ + reason: null, + path: path + }); + }; + + useEffect(() => { + // Update formData setiap kali approve berubah + setFormData(prevData => ({ + ...prevData, + path: path || '', + })); + }, [path]); + + const handleChange = (field, value) => { + setFormData((prevData) => ({ + ...prevData, + [field]: value, + })); + if (field === 'reason') { + setIsReasonSelected(!!value); + } + + }; + + const handleSubmit = () => { + if (isReasonSelected && formData.reason !== '') { + console.log(formData) + axios + .post(`customer-service/request/${id}/delete_file`, formData) + .then((response) => { + enqueueSnackbar('File LOG has Deleted', { variant: 'success' }); + setOpenDialog(false); + window.location.reload() + }) + .catch(({ response }) => { + enqueueSnackbar(response.data.message ?? 'Something went wrong!', { variant: 'error' }); + }); + } else { + setIsReasonSelected(false); + alert('Silakan pilih alasan sebelum menghapus data.'); + } + + } + + + const getContent = () => ( + + Are you sure to delete this file Final LOG ? +
+ + + Reason* + option.label} + fullWidth + value={reasons.find((r) => r.value === formData.reason) || null} // Use find to match the default value + onChange={(e, newValue) => handleChange('reason', newValue?.value)} + renderInput={(params) => ( + + )} + /> + + + + + + +
+ ); + + + return ( + + ); +} diff --git a/frontend/dashboard/src/pages/ClaimRequests/Components/DialogUploadFileFinalLog.tsx b/frontend/dashboard/src/pages/ClaimRequests/Components/DialogUploadFileFinalLog.tsx new file mode 100644 index 00000000..e70b65a5 --- /dev/null +++ b/frontend/dashboard/src/pages/ClaimRequests/Components/DialogUploadFileFinalLog.tsx @@ -0,0 +1,241 @@ +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 { Card, Autocomplete } 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, useEffect } from 'react'; +import { makeFormData } from '@/utils/jsonToFormData'; +import { format } from 'date-fns'; +// import { LanguageContext } from '@/contexts/LanguageContext'; +import { DatePicker, LocalizationProvider, MobileDatePicker } from '@mui/x-date-pickers'; +import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns'; +import TextField from '@mui/material/TextField'; +import MuiDialog from '@/components/MuiDialog'; + +type DialogUploadType = { + openDialog: boolean; + setOpenDialog: any; + onSubmit?: void; + id: number|undefined; +} +export default function DialogUploadFileFinalLog({ id, openDialog, setOpenDialog }: DialogUploadType) { + // ---------------------------------------------------------------------- + // Files Diagnosa + const fileDiagnosaInput = useRef(null); + const [fileDiagnosas, setFileDiagnosas] = useState([]); + const marginBottom2 = { + marginBottom: 2, + } + const reason = [ + { value: 'Wrong Setting', label: 'Wrong Setting' }, + { value: 'Hospital Request', label: 'Hospital Request' } + ]; + const [selectedReason, setSelectedReason] = useState({value:'-', label:''}); + const [error, setError] = useState(''); + const handleDiagnosaInputChange = (event:any) => { + if (event.target.files[0]) { + setFileDiagnosas([...fileDiagnosas, ...event.target.files]); + } else { + console.log('NO FILE'); + } + }; + const removeDiagnosaFiles = (filesState:any, index:any) => { + setFileDiagnosas( + filesState.filter((file:any, fileIndex:any) => { + return fileIndex != index; + }) + ); + }; + + // ---------------------------------------------------------------------- + // Files Result Kondisi + + const fileKondisiInput = useRef(null); + const [fileKondisis, setFileKondisis] = useState([]); + + const handleKondisiInputChange = (event:any) => { + if (event.target.files[0]) { + setFileKondisis([...fileKondisis, ...event.target.files]); + } else { + console.log('NO FILE'); + } + }; + const removeKondisiFiles = (filesState:any, index:any) => { + setFileKondisis( + filesState.filter((file:any, fileIndex:any) => { + return fileIndex != index; + }) + ); + }; + + // ---------------------------------------------------------------------- + // Files Result Hasil Penunjang + + const fileHasilPenunjangInput = useRef(null); + const [fileHasilPenunjangs, setFileHasilPenunjangs] = useState([]); + + const handleResultInputChange = (event:any) => { + if (event.target.files[0]) { + setFileHasilPenunjangs([...fileHasilPenunjangs, ...event.target.files]); + } else { + console.log('NO FILE'); + } + }; + const removeFiles = (filesState:any, index:any) => { + setFileHasilPenunjangs( + filesState.filter((file:any, fileIndex:any) => { + return fileIndex != index; + }) + ); + }; + + // -------------------------------------------------------------- + // Submit Form + const [submitLoading, setSubmitLoading] = useState(false); + function submitRequestFinalLog() { + if(selectedReason.value != '-'){ + setSubmitLoading(true); + const formData = makeFormData({ + request_logs_id: id, + result_files: fileHasilPenunjangs, + diagnosa_files: fileDiagnosas, + kondisi_files: fileKondisis, + reason: selectedReason.value + }); + axios + .post(`/customer-service/request/${id}/add_file`, formData) + .then((response) => { + enqueueSnackbar('Berhasil membuat data', { variant: 'success' }); + setOpenDialog(false); + window.location.reload() + }) + .catch(({ response }) => { + enqueueSnackbar('Something Went Wrong', { variant: 'error' }); + }) + .then(() => { + setSubmitLoading(false); + }); + } else { + setError('Please select a reason') + } + } + + const getContent = () => ( + + } + spacing={4} + sx={{ marginY: 2, marginBottom: 6 }} + > + {/* -------------------------------Upload Dokumen Hasil Penunjang------------------------------- */} + + {/* Hasil Lab, */} + } + spacing={1} + sx={{ marginY: 2 }} + > + {fileHasilPenunjangs && + fileHasilPenunjangs.map((file:any, index:any) => ( + + {file.name} + { + removeFiles(fileHasilPenunjangs, index); + }} + style={{ cursor: 'pointer' }} + > + + ))} + + + {/* { JSON.stringify(filesResult) } */} + fileHasilPenunjangInput.current?.click()}> + + + + Add Files + + + + + Reason for Update* + + 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) => ( + + )} + /> + + + + + { + submitRequestFinalLog(); + }} + loading={submitLoading} + > + Add + + + ) + return ( + + ); +} diff --git a/frontend/dashboard/src/pages/ClaimRequests/Components/FormEdit.tsx b/frontend/dashboard/src/pages/ClaimRequests/Components/FormEdit.tsx index faa95bf0..f91d3284 100644 --- a/frontend/dashboard/src/pages/ClaimRequests/Components/FormEdit.tsx +++ b/frontend/dashboard/src/pages/ClaimRequests/Components/FormEdit.tsx @@ -5,7 +5,7 @@ import { yupResolver } from '@hookform/resolvers/yup'; import { Controller, useForm } from 'react-hook-form'; import React, { useRef, useEffect, useMemo, useState } from 'react'; import axios from '../../../utils/axios'; -import { FormProvider, RHFTextField } from '../../../components/hook-form'; +import { FormProvider, RHFDatepicker, RHFTextField } from '../../../components/hook-form'; import { makeFormData } from '@/utils/jsonToFormData'; import { @@ -31,6 +31,7 @@ import { Divider, ButtonBase, Box, + DialogActions, } from '@mui/material'; import Iconify from '../../../components/Iconify'; import CalendarTodayIcon from '@mui/icons-material/CalendarToday'; @@ -39,7 +40,10 @@ import { fCurrency } from '../../../utils/formatNumber'; import MemberSelectDialog from '../../../components/dialogs/MemberSelectDialog'; import { Add, ArrowBackIosNew, DeleteOutline } from '@mui/icons-material'; import { ClaimRequest, Files } from '@/@types/claims'; -import { fDateTimesecond } from '@/utils/formatTime'; +import { fDateOnly, fDateTimesecond, fPostFormat } from '@/utils/formatTime'; +import RHFDatePicker from '@/components/hook-form/RHFDatePickerV2'; +import RHFDateTimePicker from '@/components/hook-form/v2/RHFDateTimePicker'; +import MuiDialog from '@/components/MuiDialog'; interface FormValuesProps extends Partial { taxes: boolean; @@ -57,7 +61,7 @@ export default function FormEdit({ isEdit, currentClaim }: Props) { const { enqueueSnackbar } = useSnackbar(); const EditClaimSchema = Yup.object().shape({ - organization_id: Yup.string().required('Code Provider is required'), + date: Yup.string().required('Date Submission is required'), }); const defaultValues = useMemo( @@ -73,6 +77,16 @@ export default function FormEdit({ isEdit, currentClaim }: Props) { [currentClaim] ); + + const [date, setDate] = useState(currentClaim?.submission_date) + const id = currentClaim?.id + + useEffect(() => { + setDate(currentClaim?.submission_date) + }, [currentClaim]); + + console.log(date); + useEffect(() => { if (isEdit && currentClaim) { reset(defaultValues); @@ -80,9 +94,6 @@ export default function FormEdit({ isEdit, currentClaim }: Props) { if (!isEdit) { reset(defaultValues); } - // setFileKondisis(currentClaim?.files_by_type?.claim_diagnosis); - // setFileDiagnosas(currentClaim?.files_by_type?.claim_diagnosis); - setFileHasilPenunjangCurrent(currentClaim?.files_by_type?.claim_result); }, [isEdit, currentClaim]); @@ -97,99 +108,25 @@ export default function FormEdit({ isEdit, currentClaim }: Props) { control, setValue, getValues, - setError, handleSubmit, formState: { isSubmitting }, } = methods; - const values = watch(); - - const [isCheckingLimit, setIsCheckingLimit] = useState(false); - const [isEligible, setIsEligible] = useState(false); - const [memberBenefits, setMemberBenefits] = useState([]); - const [diagnosisOption, setDiagnosisOption] = useState([]); - const [isMemberDialogOpen, setIsMemberDialogOpen] = useState(false); - const [member, setMember] = useState({}) // ---------------------------------------------------------------------- - - // Files Result Kondisi - const fileKondisiInput = useRef(null); - const [fileKondisis, setFileKondisis] = useState([]); - - const handleKondisiInputChange = (event) => { - if (event.target.files[0]) { - setFileKondisis([...fileKondisis, ...event.target.files]); - } else { - console.log('NO FILE'); - } - }; - const removeKondisiFiles = (filesState, index) => { - setFileKondisis( - filesState.filter((file, fileIndex) => { - return fileIndex != index; - }) - ); - }; - - // Files Result Diagnosa - const fileDiagnosaInput = useRef(null); - const [fileDiagnosas, setFileDiagnosas] = useState([]); - - const handleDiagnosaInputChange = (event) => { - if (event.target.files[0]) { - setFileDiagnosas([...fileDiagnosas, ...event.target.files]); - } else { - console.log('NO FILE'); - } - }; - const removeDiagnosaFiles = (filesState, index) => { - setFileDiagnosas( - filesState.filter((file, fileIndex) => { - return fileIndex != index; - }) - ); - }; - - // Files Result Hasil Penunjang - const fileHasilPenunjangInput = useRef(null); - const [fileHasilPenunjangs, setFileHasilPenunjangs] = useState([]); - const [fileHasilPenunjangsCurrent, setFileHasilPenunjangCurrent] = useState([]); - - const handleResultInputChange = (event) => { - if (event.target.files[0]) { - setFileHasilPenunjangs([...fileHasilPenunjangs, ...event.target.files]); - } else { - console.log('NO FILE'); - } - }; - const removeFiles = (filesState, index) => { - setFileHasilPenunjangs( - filesState.filter((file, fileIndex) => { - return fileIndex != index; - }) - ); - }; - - const onSubmit = async (data: FormValuesProps) => { try { - // const formData = new FormData(); + const formData = new FormData(); // formData.append('result_files', fileHasilPenunjangs); // formData.append('diagnosa_files', fileDiagnosaInput); // formData.append('kondisi_files', fileKondisiInput); // formData.append('provider_code', data.organization_id); // formData.append('_method', 'PUT'); - const formData = makeFormData({ - result_files: fileHasilPenunjangs, - diagnosa_files: fileDiagnosas, - kondisi_files: fileKondisis, - provider_code: data.organization_id, - _method: 'PUT' - }); - - const response = await axios.put(`/claim-requests/${data.id}`, formData); + // formData.append('date', fPostFormat(id)); + + // const response = await axios.post(`/claim-requests/${data.id}/update`, formData); + reset(); enqueueSnackbar('Claim Request Updated Successfully!', { variant: 'success' }); navigate('/claim-requests'); @@ -205,6 +142,118 @@ export default function FormEdit({ isEdit, currentClaim }: Props) { } }; + const handleApprove = () => { + if(selectedReason.value != '-'){ + const formData = makeFormData({ + date: fPostFormat(date), + reason: selectedReason.value, + }); + const response = axios.post(`/claim-requests/${id}/update`, formData); + + if (!response.error){ + reset(); + enqueueSnackbar('Claim Request Updated Successfully!', { variant: 'success' }); + navigate('/claim-requests'); + } else { + enqueueSnackbar('Claim Request Updated Error!', { variant: 'error' }); + } + } else { + setError('Please select a reason') + } + } + const [openDialog, setOpenDialog] = useState(false); + const style1 = { + color: '#919EAB', + width: '30%' + } + const style2 = { + width: '70%' + } + const marginBottom1 = { + marginBottom: 1, + } + const marginBottom2 = { + marginBottom: 2, + } + const handleCloseDialog = () => { + setOpenDialog(false); + } + + const reason = [ + { value: 'Wrong Setting', label: 'Wrong Setting' }, + { value: 'Hospital Request', label: 'Hospital Request' } + ]; + const [selectedReason, setSelectedReason] = React.useState({value:'-', label:''}); + const [error, setError] = useState(''); + + const getContent = () => ( + + Are you sure to update this claim ? + + + + Code + {currentClaim?.code} + + + Name + {currentClaim?.member?.name} + + + Date of Submission + {date ? fDateTimesecond(date) : '-'} + + + Claim Method + {currentClaim?.payment_type} + + + Service Type + {currentClaim?.service_name || '-'} + + + Code Provider + {currentClaim?.organization?.code || '-'} + + + + Reason for Update* + + 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) => ( + + )} + /> + + + + + + + + + ) + return ( @@ -254,12 +303,18 @@ export default function FormEdit({ isEdit, currentClaim }: Props) { - - - - ), }} - name="date" label="Date of Submission" disabled/> + ( + setDate(field.value)} + /> + )} + /> @@ -268,161 +323,8 @@ export default function FormEdit({ isEdit, currentClaim }: Props) { - + - - - {/* -------------------------------Upload Dokumen Kondisi------------------------------- */} - - - Condition Document - - - {fileKondisis && - fileKondisis.map((file, index) => ( - - {file.name} - { - removeKondisiFiles(fileKondisis, index); - }} - > - - ))} - - - fileKondisiInput.current?.click()}> - - - - Add File - - - - - - - {/* -------------------------------Upload Dokumen Diagnosa------------------------------- */} - - - Diagnosis Document - - - {fileDiagnosas && - fileDiagnosas.map((file, index) => ( - - {file.name} - { - removeDiagnosaFiles(fileDiagnosas, index); - }} - > - - ))} - - - fileDiagnosaInput.current?.click()}> - - - - Add Result - - - - - - - {/* -------------------------------Upload Result Hasil Penunjang------------------------------- */} - - - Supporting Result Document - - - {fileHasilPenunjangs && - fileHasilPenunjangs.map((file, index) => ( - - {file.name} - { - removeFiles(fileHasilPenunjangs, index); - }} - > - - ))} - - - fileHasilPenunjangInput.current?.click()}> - - - - Add Result - - - - - - - @@ -440,17 +342,24 @@ export default function FormEdit({ isEdit, currentClaim }: Props) { > Cancel - date ? setOpenDialog(true) : setOpenDialog(false)} > Update - + + ); } diff --git a/frontend/dashboard/src/pages/ClaimRequests/CreateUpdate.tsx b/frontend/dashboard/src/pages/ClaimRequests/CreateUpdate.tsx index c710deaa..c1e6307d 100644 --- a/frontend/dashboard/src/pages/ClaimRequests/CreateUpdate.tsx +++ b/frontend/dashboard/src/pages/ClaimRequests/CreateUpdate.tsx @@ -33,7 +33,6 @@ export default function ClaimsCreateUpdate() { useEffect(() => { if (isEdit) { axios.get('/claim-requests/' + id).then((res) => { - console.log('Yeet', res.data); setCurrentClaim(res.data.data); }); diff --git a/frontend/dashboard/src/pages/ClaimRequests/Detail.tsx b/frontend/dashboard/src/pages/ClaimRequests/Detail.tsx index 39aa66ab..c9607120 100644 --- a/frontend/dashboard/src/pages/ClaimRequests/Detail.tsx +++ b/frontend/dashboard/src/pages/ClaimRequests/Detail.tsx @@ -1,5 +1,5 @@ // mui -import { Container, Grid, Stack, Typography, Card, TextField, Divider, ButtonBase, Box, IconButton } from '@mui/material'; +import { Container, Grid, Stack, Typography, Card, TextField, Divider, ButtonBase, Box, IconButton, MenuItem } from '@mui/material'; // components import Page from '../../components/Page'; // utils @@ -8,7 +8,7 @@ import useSettings from '../../hooks/useSettings'; import { useNavigate, useParams, useLocation } from 'react-router-dom'; import { useEffect, useState, useRef } from 'react'; import axios from '../../utils/axios'; -// pages +// pages import DetailTimeline from '../../pages/ClaimRequests/DetailTimeline'; import DetailStepper from '../../pages/ClaimRequests/DetailStepper'; import { format } from 'date-fns'; @@ -19,7 +19,7 @@ import RemoveIcon from '@mui/icons-material/Remove'; import { DatePicker, LocalizationProvider } from '@mui/x-date-pickers'; import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns'; import Iconify from '@/components/Iconify'; -import { fPostFormat } from '@/utils/formatTime'; +import { fDate, fPostFormat } from '@/utils/formatTime'; import InsertDriveFileIcon from '@mui/icons-material/InsertDriveFile'; import DownloadIcon from '@mui/icons-material/Download'; import { Dialog, DialogTitle, DialogContent, DialogActions } from '@mui/material'; @@ -28,279 +28,509 @@ import { fDateTimesecond } from '@/utils/formatTime'; import { makeFormData } from '@/utils/jsonToFormData'; import { enqueueSnackbar } from 'notistack'; +import { DetailClaimRequest } from './Model/Types'; +import { Delete, EditOutlined } from '@mui/icons-material'; +import { fNumber } from '@/utils/formatNumber'; +import palette from '@/theme/palette'; +import MoreMenu from '@/components/MoreMenu'; +import DialogUploadFileFinalLog from './Components/DialogUploadFileFinalLog'; +import DialogDeleteFileLog from './Components/DialogDeleteFileLog'; // ---------------------------------------------------------------------- export default function Detail() { const location = useLocation(); const queryParams = new URLSearchParams(location.search); - const code = queryParams.get('code'); const navigate = useNavigate(); const { themeStretch } = useSettings(); - const [data, setData] = useState(); - const [dataDialog, setDataDialog] = useState(); - const [document, setDocument] = useState(null); + const [claimRequests, setClaimRequest] = useState(); const { id } = useParams(); useEffect(() => { axios - .get('/claim-requests/detail/'+id) + .get('claim-requests/detail/'+id) .then((response) => { - setData(response.data); - setDataDialog(response.data.data.dialog_submits); - setDocument(response.data.data.documents); - + setClaimRequest(response.data.data) }) .catch((error) => { console.error(error); - }); - - }, []); - - const [isInvoiceVisible, setInvoiceVisibility] = useState(false); - - const handleInvoice = () => { - setInvoiceVisibility(!isInvoiceVisible); - } - const currentDate = new Date(); - const formattedCurrentDate = format(currentDate, 'dd MMM yyyy'); - const [dateInvoice, setDateInvoice] = useState(currentDate); - - const fileInvoiceInput = useRef(null); - const [fileInvoices, setFileInvoices] = useState([]); - - const handleInvoiceInputChange = (event) => { - if (event.target.files[0]) { - setFileInvoices([...fileInvoices, ...event.target.files]); - } else { - console.log('NO FILE'); - } - }; - const removeInvoiceFiles = (filesState, index) => { - setFileInvoices( - filesState.filter((file, fileIndex) => { - return fileIndex != index; }) - ); - }; - const date = dateInvoice ? fPostFormat(dateInvoice, 'yyyy-MM-dd') : null; + }, [id]); + + function toTitleCase(str: string | null) { + return str.replace(/\w\S*/g, function(txt) { + return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); + }); + } + + const style1 = { + color: '#919EAB', + width: '30%' + } + const style2 = { + width: '70%' + } + const style3 = { + color: '#919EAB', + width: '35%' + } + const marginBottom1 = { + marginBottom: 1, + } const [openDialogSubmit, setOpenDialogSubmit] = useState(false); const handleCloseDialogSubmit = () => { setOpenDialogSubmit(false); } - const handleSubmitData = () => { - // if(fileInvoices.length > 0) - // { - //submit data - axios - .post('claim-requests/'+id+'/approve') - .then((response) => { - enqueueSnackbar('Success Submit Claim Request', { variant: 'success' }); - setOpenDialogSubmit(false); - }) - .catch(({ response }) => { - enqueueSnackbar(response.data.message ?? 'Something went wrong!', { variant: 'error' }); - }); - //Upload file invoices - const formData = makeFormData({ - date:date, - invoice_files: fileInvoices, - }); - axios - .post('claim-requests/'+id+'/invoice-files', formData) - .then((response) => { - enqueueSnackbar(response.data.message ?? 'Success upload invoice', { variant: 'success' }); - }) - .catch(({ response }) => { - enqueueSnackbar(response.data.message ?? 'Something Went Wrong', { variant: 'error' }); - }); - // } - // else - // { - // enqueueSnackbar('Please upload file invoice, before submit', { variant: 'warning' }); - // } + const [approve, setApprove] = useState(''); - setTimeout(() => - { - window.location.reload(); - }, 5000); + // Handle Delete File LOG + const [pathFile, setPathFile] = useState('') + const [dialogDeleteFIleLog, setDialogDeleteFileLog] = useState(false) - }; - - const check_invoice = document?.find((dataInvoice) => dataInvoice.type === 'claim-invoice'); + // Handle Upload File LOG + const [dialogUploadFileLog, setDialogUploadFileLog] = useState(false) + // Buat total data + const totalAmountIncurred = (claimRequests?.benefit_data || []).reduce((accumulator, item) => { + return accumulator + (item.amount_incurred || 0); + }, 0); + const totalAmountApprove = (claimRequests?.benefit_data || []).reduce((accumulator, item) => { + return accumulator + (item.amount_approved || 0); + }, 0); + const totalAmountNotApprove = (claimRequests?.benefit_data || []).reduce((accumulator, item) => { + return accumulator + (item.amount_not_approved || 0); + }, 0); + const totalExcessPaid = (claimRequests?.benefit_data || []).reduce((accumulator, item) => { + return accumulator + (item.excess_paid || 0); + }, 0); + return ( - - + + - navigate(-1)} sx={{cursor:'pointer'}}/> - {(data && data.data) ? data.data.status.code : ''} - {data ? ( - - Submission Date - {(data && data.data) ? format(new Date(data.data.status.submission_date), "d MMM yyyy") : ''} + navigate(-1)} sx={{cursor:'pointer'}}/> + {(claimRequests && claimRequests.code ? claimRequests.code : '')} - ) : ''} - - {data ? ( + {/* Detail */} - - - - - Format Claim - - - - {check_invoice ? ( - - - Request Claim - - - - ) : ''} - - - - - { - setDateInvoice(newValue); - }} - inputFormat="dd MMM yyyy" - renderInput={(params) => } - /> - - } - spacing={1} - sx={{ marginY: 2 }} - > - {fileInvoices && - fileInvoices.map((file, index) => ( - - - - {file.name ? file.name : '-'} - - { - removeInvoiceFiles(fileInvoices, index); - }} - sx={{cursor: 'pointer'}} - > - - ))} - - fileInvoiceInput.current?.click()}> - - - - Upload Invoice + + + + + Details - - - + + + + Provider Name + {claimRequests?.provider} + + + Member ID + {claimRequests?.member_id} + + + Policy Number + {claimRequests?.policy_number} + + + Name + {claimRequests?.name} + + + Date Of Birth + {claimRequests?.date_of_birth ? fDate(claimRequests?.date_of_birth) : '-'} + + + Marital Status + {claimRequests?.marital_status} + + + Submission Date + {claimRequests?.submission_date ? fDateTimesecond(claimRequests?.submission_date) : '-'} + + + + No KTP + {claimRequests?.no_identitas ? claimRequests?.no_identitas : '-'} + + + Keterangan + {claimRequests?.keterangan ? claimRequests?.keterangan : '-'} + + + Hak Kamar Pasien + {claimRequests?.hak_kamar_pasien ? claimRequests?.hak_kamar_pasien : '-'} + + + Penempatan Kamar + {claimRequests?.penempatan_kamar ? claimRequests?.penempatan_kamar : '-'} + + + Diagnosis + + {claimRequests?.diagnosis?.length > 0 ? ( +
    + {claimRequests?.diagnosis.map((diagnosisItem, index) => ( +
  • {diagnosisItem.code} - {diagnosisItem.name}
  • + // Replace 'name' with the property you want to display + ))} +
+ ) : ( +

No diagnosis available.

+ )} +
- - + + {/* Service */} + + + Service + + Service Type + {claimRequests?.service_type} + + + Claim Method + {toTitleCase(claimRequests?.claim_method ?? '-')} + + + + {/* Document */} - - {dataDialog && dataDialog.status === 'requested' ? ( - <> - - - - ) : ''} - {/* Dialog Submits */} - - - - - Confirmation - - - - + + + + Document - - - {dataDialog ? ( - - Are you sure to submit this claim ? - - - Code - {dataDialog.code} - - - Name - {dataDialog.name} - - - Date Submission - {fDateTimesecond(dataDialog.submission_date)} - - - Claim Method - Service Type - - - Service Type - - {dataDialog.service_code === 'IP' ? 'Inpatient' : 'Outpatient'} - - - + + + + + {claimRequests?.files?.map((documentType, index) => ( + + + + + + {documentType.original_name ? documentType.original_name : '-'} + - ) : ''} - - - - - - - + + { + setDialogDeleteFileLog(true) + setPathFile(documentType.path) + }} aria-label="delete" size="small" sx={{ marginLeft: 'auto' }}> + + + + + ))} + + + + + + + + {/* Benefit */} + + + + Benefit + + + + + {claimRequests?.benefit_data?.map((item, index) => ( + + + + + + {item.benefit?.description} + + + + + { + // setDialogEditBenefit(true) + // setIdBenefitData(item.id) + // setBenefitConfigurationData(item) + }} + > + + Edit + + { + // setIdBenefitData(item.id) + // setDialogDeleteBenefit(true) + }} + > + + Delete + + + } /> + + + + + + + + {/* Amount Incurred */} + + + + + Amount Incurred + + + + + {fNumber(item.amount_incurred)} + + + + + + {/* Amount Approved */} + + + + + Amount Approved + + + + + {fNumber(item.amount_approved)} + + + + + + {/* Amount Not Approved */} + + + + + Amount Not Approved + + + + + {fNumber(item.amount_not_approved)} + + + + + + {/* Excess Paid* */} + + + + + Excess Paid* + + + + + {fNumber(item.excess_paid)} + + + + + + {/* Keterangan* */} + + + + + Keterangan* + + + + + {item.keterangan} + + + + + + + + + + + ))} +
+
+ {claimRequests?.benefit_data && claimRequests.benefit_data.length > 0 ? ( + + + + + + + Total Benefit + + + + + + + + + + {/* Amount Incurred */} + + + + + Amount Incurred + + + + + {fNumber(totalAmountIncurred)} + + + + + + {/* Amount Approved */} + + + + + Amount Approved + + + + + {fNumber(totalAmountApprove)} + + + + + + {/* Amount Not Approved */} + + + + + Amount Not Approved + + + + + {fNumber(totalAmountNotApprove)} + + + + + + {/* Excess Paid* */} + + + + + Excess Paid + + + + + {fNumber(totalExcessPaid)} + + + + + + + + + + ) + : ( + null + )} +
+
+ + {/* PR Buat pindahin ke componen */} + {/* + + */} + {/* + {/* Dialog Edit */} + {/* */} + + {/* Dialog Delete */} + {/* */} + + {/* Dialog Edit Detai; */} + {/* */}
- ) : ''} +
-
- ); +
+ ) } diff --git a/frontend/dashboard/src/pages/ClaimRequests/List.tsx b/frontend/dashboard/src/pages/ClaimRequests/List.tsx index 98e193f4..c2df449c 100644 --- a/frontend/dashboard/src/pages/ClaimRequests/List.tsx +++ b/frontend/dashboard/src/pages/ClaimRequests/List.tsx @@ -19,6 +19,7 @@ import { Chip, TableHead, Grid, + Autocomplete, } from '@mui/material'; import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; @@ -43,25 +44,59 @@ import { enqueueSnackbar } from 'notistack'; import { Divider } from '@mui/material'; import Iconify from '@/components/Iconify'; import DialogDetailClaim from '@/components/dialogs/DialogDetailClaim'; -import { fDateTimesecond } from '@/utils/formatTime'; +import { fDateOnly, fDateTimesecond } from '@/utils/formatTime'; import { capitalizeFirstLetter } from '@/utils/formatString'; import Label from '@/components/Label'; import TableMoreMenu from '@/components/table/TableMoreMenu'; import { Import } from '@/@types/claims'; +import { DesktopDatePicker, LocalizationProvider } from '@mui/x-date-pickers'; +import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns'; // import LoadingButton from '@/theme/overrides/LoadingButton'; export default function List() { + type ServiceCode = { + value: string, + label: string + } const { themeColorPresets } = useSettings(); const [searchParams, setSearchParams] = useSearchParams(); const [importResult, setImportResult] = useState(null); + const [selectedOptions, setSelectedOptions] = useState([]); // State untuk nilai terpilih const navigate = useNavigate() + const defaultValue = [ + { + value: '-', + label: '-' + } + ]; + const [serviceCode, setServiceCode] = useState(defaultValue); + + const handleOptionService = () => { + + } + + const handleFilter = (event: React.SyntheticEvent, newValue: { value: string, label: string }[], name:string) => { // + const serviceCodeArray :string[] = []; + const codeArray :string[] = []; + const typeArray :string[] = []; + const planArray :string[] = []; + if (name == 'service_code'){ + newValue.map(row => { + serviceCodeArray.push(row.value); + }) + setSelectedOptions(newValue) + } + var entries = [...searchParams.entries(), ['service_code', serviceCodeArray ?? '']]; + const filter = Object.fromEntries(entries); + loadDataTableData(filter); + } function SearchInput(props: any) { // SEARCH const searchInput = useRef(null); const [searchText, setSearchText] = useState(''); - + const handleSearchChange = (event: any) => { const newSearchText = event.target.value ?? ''; setSearchText(newSearchText); @@ -79,16 +114,83 @@ export default function List() { return (
- + + + + + + + { + try { + if (value && !!Date.parse(value)) { + const date:string = value ? fDateOnly(value) : ''; + var entries = [...searchParams.entries(), ['start_date', date ?? '']]; + const filter = Object.fromEntries(entries); + setSearchParams(filter); + loadDataTableData(filter); + } + } catch (e) {} + }} + renderInput={(params) => } + /> + + + + + { + try { + if (value && !!Date.parse(value)) { + const date = fDateOnly(value); + var entries = [...searchParams.entries(), ['end_date', date ?? '']]; + const filter = Object.fromEntries(entries); + setSearchParams(filter); + loadDataTableData(filter); + } + } catch (e) {} + }} + renderInput={(params) => } + /> + + + + handleFilter(event, newValue, 'service_code') + } + fullWidth + disableCloseOnSelect + getOptionLabel={(option) => option.label} + renderInput={(params) => ( + + )} + /> + + + + + ); } @@ -279,11 +381,21 @@ export default function List() { ); const loadDataTableData = async (appliedFilter: any | null = null) => { + + axios.get('service').then((response) => { + const formattedData = response.data.data.map(service => ({ + value: service.code, + label: service.name + })); + setServiceCode(formattedData); + }); + setDataTableLoading(true); const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]); const response = await axios.get('/claim-requests', { params: filter }); - // console.log(response.data); + console.log(response.data); setDataTableLoading(false); + setDataTableData(response.data); }; diff --git a/frontend/dashboard/src/pages/ClaimRequests/Model/Types.tsx b/frontend/dashboard/src/pages/ClaimRequests/Model/Types.tsx index 81b7da49..cf9295eb 100644 --- a/frontend/dashboard/src/pages/ClaimRequests/Model/Types.tsx +++ b/frontend/dashboard/src/pages/ClaimRequests/Model/Types.tsx @@ -23,3 +23,61 @@ export type ServiceType = { code : string name : string } + +export type DetailClaimRequest = { + id : number, + code : string, + member_id : string, + policy_number : string, + name : string, + date_of_birth : string, + gender : string, + marital_status : string, + submission_date : string, + service_type : string, + claim_method : string, + no_identitas : string, + keterangan : string, + hak_kamar_pasien : string, + penempatan_kamar : string, + provider : string, + status : string, + request_log_id : number, + benefit : Benefit[], + reason : string, + files : file[], + benefit_data : BenefitData[], + diagnosis : Diagnosis[], +} + +export type Benefit = { + code: string, + description: string +} + +export type BenefitData = { + amount_incurred : number, + amount_approved : number, + amount_not_approved : number, + excess_paid : number, + keterangan : string, + benefit : Benefit, + request_log_id : number, + benefit_name : string, + description : string, + id : number, +} + +export type Diagnosis = { + id : number, + name : string, + code : string +} + +export type file = { + original_name: string, + name: string, + path: string, + url: string, +} +