From 19bddcdd22c579402d0211a15171990b3128ae1a Mon Sep 17 00:00:00 2001 From: Tb Fajri Date: Fri, 1 Mar 2024 09:17:30 +0700 Subject: [PATCH] export import claim request --- .../Http/Controllers/Api/ClaimController.php | 1 + .../Http/Controllers/Api/ClaimController.php | 18 +- .../Api/ClaimRequestController.php | 297 +++++++++++++++++- Modules/Internal/Routes/api.php | 3 +- app/Models/ClaimRequest.php | 12 +- .../src/pages/ClaimRequests/List.tsx | 4 +- 6 files changed, 316 insertions(+), 19 deletions(-) diff --git a/Modules/Client/Http/Controllers/Api/ClaimController.php b/Modules/Client/Http/Controllers/Api/ClaimController.php index 77365d3c..2fdabfc8 100644 --- a/Modules/Client/Http/Controllers/Api/ClaimController.php +++ b/Modules/Client/Http/Controllers/Api/ClaimController.php @@ -456,6 +456,7 @@ class ClaimController extends Controller //Data Benefit $dataClaimLog = DB::table('request_log_benefits') ->where('request_log_benefits.request_log_id', '=', $item->id) + ->where('request_log_benefits.deleted_at', null) ->select( '*', DB::raw(' diff --git a/Modules/Internal/Http/Controllers/Api/ClaimController.php b/Modules/Internal/Http/Controllers/Api/ClaimController.php index 1fdb9a3a..4165c2ff 100644 --- a/Modules/Internal/Http/Controllers/Api/ClaimController.php +++ b/Modules/Internal/Http/Controllers/Api/ClaimController.php @@ -192,15 +192,15 @@ class ClaimController extends Controller '), 'claim_requests.created_at', DB::raw(' - (SELECT plans.code - FROM plans - WHERE plans.id IN ( - SELECT member_plans.plan_id - FROM member_plans - WHERE member_plans.member_id = claim_requests.member_id - ) - AND plans.service_code = claim_requests.service_code) AS plan_code - '), + (SELECT plans.code + FROM plans + WHERE plans.id IN ( + SELECT member_plans.plan_id + FROM member_plans + WHERE member_plans.member_id = claim_requests.member_id + ) + AND plans.service_code = claim_requests.service_code) AS plan_code + '), // DB::raw(' // (SELECT plans.code FROM plans WHERE plans.id = member_plans.plan_id LIMIT 1) AS plan_code // '), diff --git a/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php b/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php index 38d6a30e..b65c5682 100644 --- a/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php +++ b/Modules/Internal/Http/Controllers/Api/ClaimRequestController.php @@ -17,11 +17,18 @@ use App\Services\ClaimRequestService; use App\Exceptions\ImportRowException; use App\Events\ClaimRequested; +use Box\Spout\Reader\Common\Creator\ReaderEntityFactory; +use Box\Spout\Writer\Common\Creator\WriterEntityFactory; +use Box\Spout\Writer\Common\Creator\Style\StyleBuilder; +use Box\Spout\Common\Entity\Style\CellAlignment; use App\Models\File; use App\Models\FilesMcu; use Illuminate\Support\Facades\DB; use App\Models\Member; +use App\Models\MemberPlan; +use App\Models\Plan; +use App\Models\RequestLogBenefit; use Carbon\Carbon; class ClaimRequestController extends Controller @@ -53,7 +60,6 @@ class ClaimRequestController extends Controller } }) - ->when($request->service_code, function ($q, $serviceCode) { $q->whereIn('service_code', $serviceCode); }) @@ -70,7 +76,7 @@ class ClaimRequestController extends Controller }) ->with(['member', 'files', 'service', 'member.currentPolicy']) ->paginate(); - + return Helper::paginateResources(ClaimRequestResource::collection($claimRequests)); } @@ -722,6 +728,293 @@ class ClaimRequestController extends Controller return Helper::responseJson(data: $request->toArray(), message: 'Invoice Success Uploaded'); } + public function exportClaimRequest(Request $request) + { + $claimRequests = ClaimRequest::query() + ->when($request->search, function ($q, $search) { + $q->where('code', 'LIKE', "%".$search."%"); + $q->orWhereHas('member', function ($subQuery) use ($search) { + $subQuery->where('name', 'LIKE', "%".$search."%"); + }); + }) + ->when($request->start_date, function ($q, $startDate) { + $q->where('submission_date', '>', Carbon::parse($startDate)->subDay()); + }) + ->when($request->end_date, function ($q, $endDate) use ($request) { + // Jika tanggal akhir diberikan dan tidak sama dengan tanggal mulai + if ($request->start_date != $request->end_date) { + $q->where('submission_date', '<', Carbon::parse($endDate)->addDay()); + } else { + $q->where('submission_date', '<=', Carbon::parse($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); + } + }) + ->when(empty($request->orderBy), function ($q) { + $q->orderBy('created_at', 'desc'); + }) + ->when($request->status, function($q, $status) { + $q->where('status', $status); + }) + ->with(['member', 'member.currentCorporate', 'files', 'service', 'member.currentPolicy', 'requestLog', 'requestLog.organization',]) + ->addSelect([ + 'tot_billing' => function ($query) { + $query->select(DB::raw('SUM(request_log_benefits.amount_approved)')) + ->from('request_log_benefits') + ->whereColumn('request_log_benefits.request_log_id', 'claim_requests.request_log_id') + ->limit(1); + } + ]) + ->get(); + $writer = WriterEntityFactory::createXLSXWriter(); + $writer->openToFile(public_path('files/Report-Data-Claim-Request.xlsx')); + $header = [ + 'No', + 'Code Claim', + 'Date Claim Submission', + 'Code LOG', + 'Date Submission', + 'Date Admission', + 'Date Discharge', + 'Provider', + 'Member ID (BN)', + 'Member Name', + 'Member Name Principal', + 'Plan Code', + 'Payor ID', + 'Corporate name', + 'Policy Number', + 'Total Billing', + 'Benefit Code', + 'Benefit Desc', + 'Amt Incurred', + 'Amt Approved', + 'Amt Not Approved', + 'Excess Paid', + // 'Reason', + 'Diagnosis', + 'Keterangan', + 'Catatan', + 'Status', + 'QC' + ]; + $style = (new StyleBuilder()) + ->setFontBold() + // ->setFontSize(15) + // ->setFontColor(Color::BLUE) + // ->setShouldWrapText() + ->setCellAlignment(CellAlignment::LEFT) + // ->setBackgroundColor(Color::YELLOW) + ->build(); + + $headerRow = WriterEntityFactory::createRowFromArray($header, $style); + $writer->addRow($headerRow); + + $results = $claimRequests; + $no=0; + $gr_total = 0; + $rowData=[]; + foreach($results as $item) + { + // $gr_total += $item->tot_bill; + // $requestLogData = RequestLogBenefit::selectRaw('*, + // (SELECT code FROM benefits WHERE benefits.id = request_log_benefits.benefit_id) AS benefit_code, + // (SELECT description FROM benefits WHERE benefits.id = request_log_benefits.benefit_id) AS benefit_description, + // sum(amount_incurred) AS total_incurred' + // ) + // ->where(['request_log_id' => $item->request_log_id, 'deleted_at' => null]) + // ->get()->toArray(); + + //Data Benefit + $requestLogData = DB::table('request_log_benefits') + ->where('request_log_benefits.request_log_id', '=', $item->request_log_id) + ->select( + '*', + // DB::raw('SUM(request_log_benefits.amount_incurred) AS total_incurred'), + + DB::raw(' + (Select benefits.description FROM benefits + WHERE benefits.id = request_log_benefits.benefit_id LIMIT 1) AS benefit_description + '), + DB::raw(' + (Select benefits.code FROM benefits + WHERE benefits.id = request_log_benefits.benefit_id LIMIT 1) AS benefit_code + ') + ) + ->get(); + if ($item->member){ + $member = Member::where('member_id', $item->member->principal_id)->first(); + $memberPrincipal = $member->name; + $memberPlan = MemberPlan::where('member_id', $item->member->id)->get('plan_id')->toArray(); + $plan= Plan::whereIn('id', $memberPlan)->where('service_code', $item->requestLog->service_code)->first(); + $planCode = $plan->code; + if ($item->member->currentCorporate->id == $item->requestLog->organization->corporate_id_partner){ + $payor = $item->member->currentCorporate->name; + } else { + $payor = 'LinkSehat'; + } + } else { + $memberPrincipal = '-'; + $planCode = '-'; + $payor = '-'; + } + + if ($requestLogData){ + foreach($requestLogData as $key => $data){ + $no++; + if ($key == 0){ + $gr_total += $item->tot_billing; + } + $rowItem = [ + $no, + $item->code, + $item->submission_date ? $item->submission_date : '', + $item->requestLog ? $item->requestLog->code : '-', + $item->requestLog ? Helper::dateParser($item->requestLog->created_at) : '-', // submission = created_at + $item->requestLog ? $item->requestLog->submission_date : '-', + $item->requestLog ? $item->requestLog->discharge_date : '-', + $item->requestLog ? $item->requestLog->organization->name : '-', + $item->member ? $item->member->member_id : '-', + $item->member ? $item->member->name : '-', + $memberPrincipal, + $key == 0 ? $planCode : '', + $payor, + $item->member ? $item->member->currentCorporate->name : '-', + $item->member ? $item->member->currentPolicy->code : '-', + $key == 0 ? $item->tot_billing : '', + $data->benefit_code, + $data->benefit_description, + $data->amount_incurred ? $data->amount_incurred : '' , + $data->amount_approved ? $data->amount_approved : '', + $data->amount_not_approved ? $data->amount_not_approved : '', + $data->excess_paid ? $data->excess_paid : '', + // $data->reason ? $data->reason : '', + $item->requestLog ? $item->requestLog->diagnosis : '-', + $item->requestLog ? $item->requestLog->keterangan : '-', + $item->requestLog ? $item->requestLog->catatan : '-', + $item->status ? $item->status : '-' + ]; + array_push($rowData,$rowItem); + } + } else { + $no++; + if ($item->member){ + $member = Member::where('member_id', $item->member->principal_id)->first(); + $memberPrincipal = $member->name; + $memberPlan = MemberPlan::where('member_id', $item->member->id)->get('plan_id')->toArray(); + $plan= Plan::whereIn('id', $memberPlan)->where('service_code', $item->requestLog->service_code)->first(); + $planCode = $plan->code; + if ($item->member->currentCorporate->id == $item->requestLog->organization->corporate_id_partner){ + $payor = $item->member->currentCorporate->name; + } else { + $payor = 'LinkSehat'; + } + } else { + $memberPrincipal = '-'; + $planCode = '-'; + $payor = '-'; + } + $rowItem = [ + $no, + $item->code, + $item->submission_date ? Helper::dateParser($item->submission_date) : '', + $item->requestLog ? $item->requestLog->code : '-', + $item->requestLog ? Helper::dateParser($item->requestLog->created_at) : '-', // submission = created_at + $item->requestLog ? $item->requestLog->submission_date : '-', + $item->requestLog ? $item->requestLog->discharge_date : '-', + $item->requestLog ? $item->requestLog->organization->name : '-', + $item->member ? $item->member->member_id : '-', + $item->member ? $item->member->name : '-', + $memberPrincipal, + $planCode, + $payor, + $item->member ? $item->member->currentCorporate->name : '-', + $item->member ? $item->member->currentPolicy->code : '-', + '', + '', + '', + '', + '', + '', + '', + // '', + $item->requestLog ? $item->requestLog->diagnosis : '-', + $item->requestLog ? $item->requestLog->keterangan : '-', + $item->requestLog ? $item->requestLog->catatan : '-', + $item->status ? $item->status : '-' + ]; + array_push($rowData,$rowItem); + } + + } + $style = (new StyleBuilder()) + //->setFontBold() + // ->setFontSize(15) + // ->setFontColor(Color::BLUE) + // ->setShouldWrapText() + ->setCellAlignment(CellAlignment::LEFT) + // ->setBackgroundColor(Color::YELLOW) + ->build(); + foreach ($rowData as $rowItem) { + // if (is_numeric($rowItem[13])) { + // // Jumlahkan nilai angka ke total + // $grand_total_billing += $rowItem[13]; + // } + $row = WriterEntityFactory::createRowFromArray($rowItem, $style); + $writer->addRow($row); + } + + //Footer + $footer = [ + 'Total', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + $gr_total, + '', + '', + '', + '', + '', + '', + '' + ]; + $style = (new StyleBuilder()) + ->setFontBold() + // ->setFontSize(15) + // ->setFontColor(Color::BLUE) + // ->setShouldWrapText() + ->setCellAlignment(CellAlignment::LEFT) + // ->setBackgroundColor(Color::YELLOW) + ->build(); + $grand_total_billing = 0; + $footerRow = WriterEntityFactory::createRowFromArray($footer, $style); + $writer->addRow($footerRow); + + $writer->close(); + return Helper::responseJson([ + 'file_name' => 'Report-Data-Claim-Request', + "file_url" => url('files/Report-Data-Claim-Request.xlsx') + ]); + } + public function submition($id){ $claimRequest = ClaimRequest::findOrFail($id); $claimRequest->status = 'submission'; diff --git a/Modules/Internal/Routes/api.php b/Modules/Internal/Routes/api.php index e29af216..5df7062b 100644 --- a/Modules/Internal/Routes/api.php +++ b/Modules/Internal/Routes/api.php @@ -315,13 +315,14 @@ Route::prefix('internal')->group(function () { Route::get('claim-requests/list-member', [ClaimRequestController::class, 'getClaimMemberInfiniteScroll']); // Bagaskoro, BSD 31 Oktober 2023 Route::post('claim-requests/{id}/approve', [ClaimRequestController::class, 'approve'])->name('claim-requests.approve'); Route::post('claim-requests/{id}/submition', [ClaimRequestController::class, 'submition'])->name('claim-requests.submition'); - Route::get('claim-requests/{id}', [ClaimRequestController::class, 'show'])->name('claim-requests.show'); + Route::get('claim-requests/{id}/show', [ClaimRequestController::class, 'show'])->name('claim-requests.show'); Route::post('claim-requests', [ClaimRequestController::class, 'createNew']); // Bagaskoro, BSD 2 November 2023 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']); Route::post('claim-requests/{id}/request-files', [ClaimRequestController::class, 'requestFiles']); + Route::get('claim-requests/export', [ClaimRequestController::class, 'exportClaimRequest']); Route::get('claim-requests/service/{id}', [ClaimRequestController::class, 'getServiceMember']); diff --git a/app/Models/ClaimRequest.php b/app/Models/ClaimRequest.php index fbab541a..71db5a57 100644 --- a/app/Models/ClaimRequest.php +++ b/app/Models/ClaimRequest.php @@ -52,26 +52,28 @@ class ClaimRequest extends Model ]; public static $doc_headers_to_field_map = [ - "Code" => "code", - "Date Submission" => "date_submission", + "Code LOG" => "code", + "Date Claim Submission" => "date_submission", "Total Billing" => "total_billing", "Benefit Code" => "benefit_code", "Amt Incurred" => "amount_incurred", "Amt Approved" => "amount_apporve", "Amt Not Approved" => "amount_not_apporve", "Excess Paid" => "excess_paid", + "Reason" => "reason", "QC" => "qc", ]; public static $listing_doc_headers = [ - "Code", - "Date Submission", + "Code LOG", + "Date Claim Submission", "Total Billing", "Benefit Code", "Amt Incurred", "Amt Approved", "Amt Not Approved", - "Excess Paid", + "Excess Paid", + "Reason", "QC", ]; diff --git a/frontend/dashboard/src/pages/ClaimRequests/List.tsx b/frontend/dashboard/src/pages/ClaimRequests/List.tsx index 295d0c9d..20437328 100644 --- a/frontend/dashboard/src/pages/ClaimRequests/List.tsx +++ b/frontend/dashboard/src/pages/ClaimRequests/List.tsx @@ -279,7 +279,7 @@ export default function List() { } const handleGetData = (type :string) => { - axios.get(`corporates/${corporate_id}/data-plan-benefit`) + axios.get(`claim-requests/export`) .then((response) => { const link = document.createElement('a'); link.href = response.data.data.file_url; @@ -416,7 +416,7 @@ export default function List() { setDataTableLoading(true); const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]); const response = await axios.get('/claim-requests', { params: filter }); - console.log(response.data); + setDataTableLoading(false);