lotteryAdmin(); abort_if($admin === null, 401); $type = (string) $request->query('type', 'summary'); abort_unless(in_array($type, self::TYPES, true), 404); $periodId = (int) $request->query('settlement_period_id', 0); $period = $this->resolvePeriod($periodId, $request); $data = match ($type) { 'summary' => $reports->summary($admin, $periodId), 'player_win_loss' => [ 'items' => $reports->playerWinLoss($admin, $periodId, $period['start'], $period['end']), ], 'agent_share' => [ 'items' => $reports->agentShare($admin, $period['start'], $period['end']), ], 'rebate' => $reports->rebate($admin, $periodId, $period['start'], $period['end']), 'credit' => $reports->credit($admin), 'unpaid_bills' => [ 'items' => $reports->unpaidBills($admin, $periodId), ], 'overdue' => [ 'items' => $reports->overdue($admin), ], 'platform_pnl' => $periodId > 0 ? $reports->platformPnl($admin, $periodId) : ['error' => 'settlement_period_id_required'], 'draw_period' => [ 'items' => $reports->drawPeriod($admin, $period['start'], $period['end']), ], default => [], }; return ApiResponse::success([ 'type' => $type, 'settlement_period_id' => $periodId > 0 ? $periodId : null, 'period_start' => $period['start'], 'period_end' => $period['end'], 'data' => $data, 'footnote' => $type === 'summary' ? null : 'agent_credit_line_settlement', ]); } /** * @return array{start: string, end: string} */ private function resolvePeriod(int $periodId, Request $request): array { if ($periodId > 0) { $row = DB::table('settlement_periods')->where('id', $periodId)->first(); abort_if($row === null, 404); return [ 'start' => (string) $row->period_start, 'end' => (string) $row->period_end, ]; } $request->validate([ 'period_start' => ['required_with:period_end', 'date'], 'period_end' => ['required_with:period_start', 'date', 'after_or_equal:period_start'], ]); $start = $request->query('period_start'); $end = $request->query('period_end'); if ($start && $end) { return ['start' => (string) $start, 'end' => (string) $end]; } $now = now(); return [ 'start' => $now->copy()->subDays(7)->toDateTimeString(), 'end' => $now->toDateTimeString(), ]; } }