when($request->search, function ($q, $search) { $q->where('code', 'LIKE', "%".$search."%"); }) ->when($request->orderBy, function ($q, $orderBy) use ($request) { if (in_array($orderBy, ['submission_date', 'code'])) { $q->orderBy($orderBy, $request->order); } }) ->when($request->status, function($q, $status) { $q->where('status', $status); }) ->with(['member']) ->orderBy('created_at', 'DESC') ->paginate(); return Helper::responseJson($claimRequests); } /** * Show the form for creating a new resource. * @return Renderable */ public function create() { return view('hospitalportal::create'); } /** * Store a newly created resource in storage. * @param Request $request * @return Renderable */ public function store(Request $request) { $data = [ 'request_logs_id' => $request->request_logs_id, 'member_id' => $request->member_id, 'service_code' => $request->service_code ]; $validator = Validator::make($request->all(), [ 'request_logs_id' => 'required', 'member_id' => 'required', 'service_code' => 'required' ], [ 'request_logs_id.required' => trans('Validation.required',['attribute' => 'Request Log ID']), 'member_id.required' => trans('Validation.required',['attribute' => 'Member ID']), 'service_code.required' => trans('Validation.required',['attribute' => 'Service Code']) ]); if ($validator->fails()) { return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400); } else { $check_claim_requests = DB::table('claim_requests') ->where('claim_requests.request_log_id', '=', $request->request_logs_id) ->first(); if(!$check_claim_requests) { try { DB::beginTransaction(); $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: 'cashless', serviceCode: $request->service_code, requestLogID: $request->request_logs_id, organization_code: $provideCode, ); // Log History $newClaimRequest->histories()->create([ 'title' => 'New Claim Requested', 'description' => "Claim Requested for Member : {$member->member_id} - ({$member->full_name})", 'type' => 'info', 'system_origin' => 'hospital-portal' ]); // Claim Log DB::table('claim_logs') ->insert([ 'claim_request_id' => $newClaimRequest->id, 'status' => 'requested', 'date' => date('Y-m-d H:i:s'), 'description' => "Claim Requested for Member : {$member->member_id} - ({$member->full_name})", 'system_origin' => 'hospital-portal', 'created_by' => auth()->user()->id, 'created_at' => date('Y-m-d H:i:s'), 'updated_at'=> date('Y-m-d H:i:s'), ]); if ($request->hasFile('additional_files')) { foreach ($request->additional_files as $file) { $fileData = File::storeFile('additional-files', $request->request_logs_id, $file); // $newClaimRequest->files()->updateOrCreate([ // 'type' => 'additional-files', // 'name' => File::getFileName('additional-files', $newClaimRequest->id, $file), // 'original_name' => $file->getClientOriginalName(), // 'extension' => $file->getClientOriginalExtension(), // 'path' => $pathFile, // 'created_by' => auth()->user()->id, // 'updated_by' => auth()->user()->id, // ]); File::updateOrCreate([ 'fileable_type' => 'App\Models\RequestLog', 'fileable_id' => $request->request_logs_id, 'type' => 'additional-files', 'name' => $fileData['name'], 'original_name' => $file->getClientOriginalName(), 'extension' => $file->getClientOriginalExtension(), 'source' => env('FILESYSTEM_DISK'), 'path' => $fileData['path'], 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, ]); } } DB::commit(); return ApiResponse::apiResponse('Success', $data, trans('Message.success'), 200); } catch (\Exception $e) { DB::rollback(); return ApiResponse::apiResponse("Error", $data, $e->getMessage(), 500); } } else { return ApiResponse::apiResponse("Error", $data, trans('Message.already_exists'), 409); } } } /** * Show the specified resource. * @param int $id * @return Renderable */ public function show($id) { $claimRequest = ClaimRequest::findOrFail($id); $claimRequest->load([ 'histories' => function ($history) { $history->latest(); }, 'files', ]); return Helper::responseJson(data: ClaimRequestShowResource::make($claimRequest)); } /** * Show the form for editing the specified resource. * @param int $id * @return Renderable */ public function edit($id) { return view('hospitalportal::edit'); } /** * Update the specified resource in storage. * @param Request $request * @param int $id * @return Renderable */ public function update(Request $request, $id) { // } /** * Remove the specified resource from storage. * @param int $id * @return Renderable */ public function destroy($id) { // } public function generateLog($claim_request_id) { $claimRequest = ClaimRequest::findOrFail($claim_request_id); $service_code = $claimRequest->service_code; if ($claimRequest->status != 'approved') { throw new Exception("Belum Teverifikasi", 1); } $member = Member::findOrFail($claimRequest->member_id) ->load([ // 'currentPlan', 'currentPlan' => function ($plan) use ($claim_request_id, $service_code) { $plan->where('plans.service_code', $service_code); }, 'currentPolicy', 'currentPlan.corporateBenefits', 'currentPlan.corporateBenefits.benefit' ]); $pdf = PDF::loadView('pdf.guaranted_leter', compact('member', 'claimRequest')); return $pdf->download('Guaranted Letter - '.$member->full_name.'.pdf'); return $claimRequest; } public static function getNextCode($request_log_id = 0) { $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, $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 . $sparator. 'H' . $sparator. $provideCode . $sparator. $date. $sparator . $member->currentPolicy->code . $sparator. $member->member_id . $sparator. str_pad($next_number, 5, '0', STR_PAD_LEFT); } public function get_claim_requests(Request $request) { $limit = $request->has('per_page') ? $request->input('per_page') : 10; $results = 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') ->when($request->input('search'), function ($query, $search) { $query->where(function ($query) use ($search) { $query->orWhere('claim_requests.code', 'like', "%" . ($search == 'outpatient' || $search == 'Outpatient' ? 'OP' : 'IP') . "%") ->orWhere('members.member_id', 'like', "%" . $search . "%") ->orWhere('members.name', 'like', "%" . $search . "%") ->orWhere('corporate_divisions.name', 'like', "%" . $search . "%") ->orWhere('claim_requests.status', 'like', "%" . $search . "%") ->orWhere('claim_requests.submission_date', 'like', "%" . $search . "%") ->orWhere('claims.status', 'like', "%" . $search . "%"); }); }) ->when($request->has('orderBy'), function ($query) use ($request) { $orderBy = $request->orderBy; $direction = $request->order ?? 'asc'; $query->orderBy($orderBy, $direction); }) ->when($request->input('start_date') && !$request->input('end_date'), function ($query, $start_date) { $query->where(function ($query) use ($start_date) { $query->where('claim_requests.submission_date', '<', $start_date); }); }) ->when($request->input('status'), function ($query, $status) { $query->where(function ($query) use ($status) { if ($status === 'requested') { $query->where('claim_requests.status', '=', 'requested'); } if ($status === 'reviewed') { $query->where('claim_requests.status', '=', 'approved'); $query->where('claims.status', '=', 'received'); } if ($status === 'approved') { $query->where('claim_requests.status', '=', 'approved'); $query->where('claims.status', '=', 'approved'); } if ($status === 'declined') { $query->where('claim_requests.status', '=', 'approved'); $query->where('claims.status', '=', 'declined'); } }); }) ->select( 'members.id', 'claim_requests.code', 'members.member_id', 'members.name as full_name', 'corporate_divisions.name AS division_name', 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 '), 'claim_requests.id AS claim_request_id', 'claim_requests.submission_date', DB::raw(' CASE WHEN service_code = "OP" THEN "Outpatient" WHEN service_code = "IP" THEN "Inpatient" ELSE "" END AS service_type ') ) ->paginate($limit); return response()->json(Helper::paginateResources($results)); } public function detail_claim_requests($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', 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; return Helper::responseJson($results); } public function requestFiles(Request $request, $claim_id) { if ($request->hasFile('fileDiagnosis')) { foreach ($request->fileDiagnosis as $file) { $fileData = File::storeFile('claim-diagnosis', $claim_id, $file); File::updateOrCreate([ 'fileable_type'=>'App\Models\ClaimRequest', 'fileable_id' => $claim_id, 'type' => 'claim-diagnosis', 'name' => $fileData['name'], 'original_name' => $file->getClientOriginalName(), 'extension' => $file->getClientOriginalExtension(), 'source' => env('FILESYSTEM_DISK'), 'path' => $fileData['path'], 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, ]); } } if ($request->hasFile('fileKondisis')) { foreach ($request->fileKondisis as $file) { $fileData = File::storeFile('claim-kondisi', $claim_id, $file); File::updateOrCreate([ 'fileable_type'=>'App\Models\ClaimRequest', 'fileable_id' => $claim_id, 'type' => 'claim-kondisi', 'name' => $fileData['name'], 'original_name' => $file->getClientOriginalName(), 'extension' => $file->getClientOriginalExtension(), 'path' => $pathFile, 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, ]); } } if ($request->hasFile('fileResults')) { foreach ($request->fileResults as $file) { $fileData = File::storeFile('claim-result', $claim_id, $file); File::updateOrCreate([ 'fileable_type'=>'App\Models\ClaimRequest', 'fileable_id' => $claim_id, 'type' => 'claim-result', 'name' => $fileData['name'], 'original_name' => $file->getClientOriginalName(), 'extension' => $file->getClientOriginalExtension(), 'source' => env('FILESYSTEM_DISK'), 'path' => $fileData['path'], 'created_by' => auth()->user()->id, 'updated_by' => auth()->user()->id, ]); } } return Helper::responseJson(data: $request->toArray(), message: 'Invoice Success Uploaded'); } }