Files
aso/Modules/Client/Http/Controllers/Api/BillingSummaryController.php
2026-01-21 17:13:45 +07:00

287 lines
9.5 KiB
PHP

<?php
namespace Modules\Client\Http\Controllers\Api;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\DB;
class BillingSummaryController extends Controller
{
public function index(Request $request, $corporate_id)
{
$year = $request->year ?? now()->year;
$status = $request->status;
$bn = $request->bn;
$payorId = $request->payorId;
$service = $request->service;
$billing = $request->billing;
$search = $request->search;
$rows = DB::table('invoice_payments')
->join('invoice_payment_details', 'invoice_payment_details.invoice_payment_id', '=', 'invoice_payments.id')
->join('claim_requests', 'claim_requests.id', '=', 'invoice_payment_details.claim_request_id')
->join('request_logs', 'request_logs.id', '=', 'claim_requests.request_log_id')
->join('corporate_employees', 'corporate_employees.member_id', '=', 'request_logs.member_id')
->join('organizations', 'organizations.id', '=', 'request_logs.organization_id')
->leftJoin('members', 'members.id', '=', 'request_logs.member_id')
->whereYear('invoice_payments.created_at', $year)
->where('corporate_employees.corporate_id', '=', $corporate_id)
// FILTERS
->when($status, fn ($q) =>
$q->where('invoice_payments.status', $status)
)
->when($bn, fn ($q) =>
$q->where('members.member_id', $bn)
)
->when($payorId, fn ($q) =>
$q->where('members.payor_id', $payorId)
)
->when($service, fn ($q) =>
$q->where('claim_requests.service_code', $service)
)
->when($billing, fn ($q) =>
$q->where('invoice_payments.invoice_number', $billing)
)
// 🔍 SEARCH PROVIDER (LIKE)
->when($search, fn ($q) =>
$q->where('organizations.name', 'like', '%' . $search . '%')
)
->selectRaw("
MONTH(invoice_payments.created_at) as month_number,
organizations.name as provider,
SUM(request_logs.nominal) as total
")
->groupBy('month_number', 'organizations.name')
->orderBy('month_number')
->get();
return response()->json(
$this->formatMonthly($rows)
);
}
protected function formatMonthly($rows): array
{
$months = [
1 => 'Januari', 2 => 'Februari', 3 => 'Maret',
4 => 'April', 5 => 'Mei', 6 => 'Juni',
7 => 'Juli', 8 => 'Agustus', 9 => 'September',
10 => 'Oktober', 11 => 'November', 12 => 'Desember',
];
return collect($rows)
->groupBy('month_number')
->map(function ($items, $monthNumber) use ($months) {
return [
'month' => $months[$monthNumber],
'total' => $items->sum('total'),
'items' => $items->map(fn ($item) => [
'provider' => $item->provider,
'total' => (float) $item->total,
])->values(),
];
})
->values()
->toArray();
}
public function providerSummary(Request $request, $corporate_id)
{
$year = $request->year ?? now()->year;
$status = $request->status;
$bn = $request->bn;
$payorId = $request->payorId;
$service = $request->service;
$billing = $request->billing;
$search = $request->search;
$query = DB::table('invoice_payments')
->join('invoice_payment_details', 'invoice_payment_details.invoice_payment_id', '=', 'invoice_payments.id')
->join('claim_requests', 'claim_requests.id', '=', 'invoice_payment_details.claim_request_id')
->join('request_logs', 'request_logs.id', '=', 'claim_requests.request_log_id')
->join('corporate_employees', 'corporate_employees.member_id', '=', 'request_logs.member_id')
->join('organizations', 'organizations.id', '=', 'request_logs.organization_id')
->leftJoin('members', 'members.id', '=', 'request_logs.member_id')
->whereYear('invoice_payments.created_at', $year)
->where('corporate_employees.corporate_id', '=', $corporate_id)
// FILTER
->when($status, fn ($q) =>
$q->where('invoice_payments.status', $status)
)
->when($bn, fn ($q) =>
$q->where('members.member_id', $bn)
)
->when($payorId, fn ($q) =>
$q->where('members.payor_id', $payorId)
)
->when($service, fn ($q) =>
$q->where('claim_requests.service_code', $service)
)
->when($billing, fn ($q) =>
$q->where('invoice_payments.invoice_number', $billing)
)
->when($search, fn ($q) =>
$q->where('organizations.name', 'like', '%' . $search . '%')
);
$items = $query
->selectRaw("
organizations.name as provider,
SUM(request_logs.nominal) as total
")
->groupBy('organizations.name')
->orderByDesc('total')
->get()
->map(fn ($row) => [
'provider' => $row->provider,
'total' => (float) $row->total,
]);
return response()->json([
'total' => $items->sum('total'),
'items' => $items,
]);
}
public function topDiagnosis(Request $request, $corporate_id)
{
$year = $request->year ?? now()->year;
$status = $request->status;
$bn = $request->bn;
$payorId = $request->payorId;
$service = $request->service;
$billing = $request->billing;
$search = $request->search;
$rows = DB::table('invoice_payments')
->join('invoice_payment_details', 'invoice_payment_details.invoice_payment_id', '=', 'invoice_payments.id')
->join('claim_requests', 'claim_requests.id', '=', 'invoice_payment_details.claim_request_id')
->join('request_logs', 'request_logs.id', '=', 'claim_requests.request_log_id')
->join('corporate_employees', 'corporate_employees.member_id', '=', 'request_logs.member_id')
// 🔥 ICD JOIN
->leftJoin(
'icd',
DB::raw("icd.code"),
'=',
DB::raw("SUBSTRING_INDEX(request_logs.diagnosis, ',', 1)")
)
->leftJoin('members', 'members.id', '=', 'request_logs.member_id')
->where('corporate_employees.corporate_id', '=', $corporate_id)
->whereYear('invoice_payments.created_at', $year)
// FILTER
->when($status, fn ($q) =>
$q->where('invoice_payments.status', $status)
)
->when($bn, fn ($q) =>
$q->where('members.member_id', $bn)
)
->when($payorId, fn ($q) =>
$q->where('members.payor_id', $payorId)
)
->when($service, fn ($q) =>
$q->where('claim_requests.service_code', $service)
)
->when($billing, fn ($q) =>
$q->where('invoice_payments.invoice_number', $billing)
)
->selectRaw("
SUBSTRING_INDEX(request_logs.diagnosis, ',', 1) as code_diagnosis,
icd.name as diagnosis,
COUNT(request_logs.id) as total_case,
SUM(request_logs.nominal) as total_billing
")
->groupBy('code_diagnosis', 'icd.name')
->orderByDesc('total_case')
->limit(10)
->get();
return response()->json(
$rows->map(fn ($row) => [
'code' => $row->code_diagnosis,
'diagnosis' => $row->diagnosis ?? '-',
'total_case' => (int) $row->total_case,
'total_billing' => (float) $row->total_billing,
])
);
}
/**
* Display a listing of the resource.
* @return Renderable
*/
// public function index()
// {
// return view('client::index');
// }
/**
* Show the form for creating a new resource.
* @return Renderable
*/
public function create()
{
return view('client::create');
}
/**
* Store a newly created resource in storage.
* @param Request $request
* @return Renderable
*/
public function store(Request $request)
{
//
}
/**
* Show the specified resource.
* @param int $id
* @return Renderable
*/
public function show($id)
{
return view('client::show');
}
/**
* Show the form for editing the specified resource.
* @param int $id
* @return Renderable
*/
public function edit($id)
{
return view('client::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)
{
//
}
}