lotteryAdmin(); abort_if(! $admin instanceof AdminUser, 401); $scope = AdminScopePolicy::resolveContext($request, $admin); $drawId = (int) $draw->id; $orders = TicketOrder::query()->where('draw_id', $drawId); $items = TicketItem::query()->where('draw_id', $drawId); AdminScopePolicy::applyViaPlayer($orders, $scope); AdminScopePolicy::applyViaPlayer($items, $scope); $totalBetMinor = (int) (clone $orders)->sum('total_actual_deduct'); $orderCount = (int) (clone $orders)->count(); $itemCount = (int) (clone $items)->count(); $currencyCode = (string) ((clone $orders)->value('currency_code') ?? ''); $totalWinMinor = (int) (clone $items)->sum('win_amount'); $totalJackpotWinMinor = (int) (clone $items)->sum('jackpot_win_amount'); $totalPayoutMinor = $totalWinMinor + $totalJackpotWinMinor; $approxHouseGrossMinor = $totalBetMinor - $totalPayoutMinor; $batches = SettlementBatch::query() ->where('draw_id', $drawId) ->orderByDesc('id') ->limit(30) ->get(['id', 'status', 'total_ticket_count', 'total_win_count', 'total_payout_amount', 'total_jackpot_payout_amount', 'finished_at']); $batchRows = $batches->map(static function (SettlementBatch $b): array { return [ 'id' => (int) $b->id, 'status' => $b->status, 'total_ticket_count' => (int) $b->total_ticket_count, 'total_win_count' => (int) $b->total_win_count, 'total_payout_amount' => (int) $b->total_payout_amount, 'total_jackpot_payout_amount' => (int) $b->total_jackpot_payout_amount, 'finished_at' => $b->finished_at?->toIso8601String(), ]; })->values()->all(); return ApiResponse::success([ 'draw_id' => $drawId, 'draw_no' => $draw->draw_no, 'draw_status' => $draw->status, 'currency_code' => $currencyCode !== '' ? $currencyCode : null, 'order_count' => $orderCount, 'ticket_item_count' => $itemCount, 'total_bet_minor' => $totalBetMinor, 'total_win_payout_minor' => $totalWinMinor, 'total_jackpot_win_minor' => $totalJackpotWinMinor, 'total_payout_minor' => $totalPayoutMinor, 'approx_house_gross_minor' => $approxHouseGrossMinor, 'settlement_batches' => $batchRows, ]); } }