103 lines
4.2 KiB
PHP
103 lines
4.2 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\API\v1\Admin\Allowance;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Http\Controllers\Util;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class SummaryController extends Controller
|
|
{
|
|
public function __invoke(Request $request)
|
|
{
|
|
$electionId = (int) Util::getCurrentElection();
|
|
|
|
$q = DB::table('allowance_payouts as ap')
|
|
->leftJoin('users as u', 'u.id', '=', 'ap.paid_by_admin_id')
|
|
->where('ap.election_id', $electionId)
|
|
->where('ap.status', 'paid')
|
|
->selectRaw('ap.paid_by_admin_id as admin_id')
|
|
->selectRaw('MAX(u.name) as admin_name')
|
|
->selectRaw('MAX(u.email) as admin_email')
|
|
->selectRaw('COUNT(*) as payouts_count')
|
|
->selectRaw('COALESCE(SUM(ap.amount_cents), 0) as total_amount_cents')
|
|
->selectRaw("COALESCE(SUM(CASE WHEN ap.method = 'cash' THEN ap.amount_cents ELSE 0 END), 0) as cash_amount_cents")
|
|
->selectRaw("COALESCE(SUM(CASE WHEN ap.method = 'cash' THEN 1 ELSE 0 END), 0) as cash_count")
|
|
->selectRaw("COALESCE(SUM(CASE WHEN ap.method = 'bank' THEN ap.amount_cents ELSE 0 END), 0) as bank_amount_cents")
|
|
->selectRaw("COALESCE(SUM(CASE WHEN ap.method = 'bank' THEN 1 ELSE 0 END), 0) as bank_count")
|
|
->groupBy('ap.paid_by_admin_id')
|
|
->orderByDesc('total_amount_cents');
|
|
|
|
// Optional: filter by method (?method=cash|bank)
|
|
$method = $request->query('method');
|
|
if ($method === 'cash' || $method === 'bank') {
|
|
$q->where('ap.method', $method);
|
|
}
|
|
|
|
$rows = $q->get();
|
|
|
|
$defaultCashCents = 30000;
|
|
$defaultBankCents = 15000;
|
|
|
|
$outstandingCash = (int) DB::table('voter as v')
|
|
->where('v.election_id', $electionId)
|
|
->where('v.kehadiran', 1)
|
|
->where(function ($outer) use ($electionId) {
|
|
$outer->whereExists(function ($sub) use ($electionId) {
|
|
$sub->select(DB::raw(1))
|
|
->from('result as r')
|
|
->whereColumn('r.voter_id', 'v.id')
|
|
->where('r.election_id', $electionId);
|
|
})->orWhere(function ($q) {
|
|
$q->whereNotNull('v.fizikal_registration_verified_at')
|
|
->whereRaw('COALESCE(v.saham, 0) < 500');
|
|
});
|
|
})
|
|
->whereNotExists(function ($sub) use ($electionId) {
|
|
$sub->select(DB::raw(1))
|
|
->from('allowance_payouts as ap')
|
|
->whereColumn('ap.voter_id', 'v.id')
|
|
->where('ap.election_id', $electionId)
|
|
->where('ap.method', 'cash')
|
|
->where('ap.status', 'paid');
|
|
})
|
|
->count();
|
|
|
|
$outstandingBank = (int) DB::table('voter as v')
|
|
->where('v.election_id', $electionId)
|
|
->where('v.kehadiran', 2)
|
|
->whereExists(function ($sub) use ($electionId) {
|
|
$sub->select(DB::raw(1))
|
|
->from('result as r')
|
|
->whereColumn('r.voter_id', 'v.id')
|
|
->where('r.election_id', $electionId);
|
|
})
|
|
->whereNotExists(function ($sub) use ($electionId) {
|
|
$sub->select(DB::raw(1))
|
|
->from('allowance_payouts as ap')
|
|
->whereColumn('ap.voter_id', 'v.id')
|
|
->where('ap.election_id', $electionId)
|
|
->where('ap.method', 'bank')
|
|
->where('ap.status', 'paid');
|
|
})
|
|
->count();
|
|
|
|
$outstandingAllowanceCents = ($outstandingCash * $defaultCashCents) + ($outstandingBank * $defaultBankCents);
|
|
|
|
return response()->json([
|
|
'status' => 'success',
|
|
'election_id' => $electionId,
|
|
'rows' => $rows,
|
|
'outstanding_allowance' => [
|
|
'cents' => $outstandingAllowanceCents,
|
|
'cash_count' => $outstandingCash,
|
|
'bank_count' => $outstandingBank,
|
|
'default_cash_cents' => $defaultCashCents,
|
|
'default_bank_cents' => $defaultBankCents,
|
|
],
|
|
]);
|
|
}
|
|
}
|
|
|