lotteryPlayer(); abort_if($player === null, 500, 'lottery_player missing'); $perPage = $this->perPage($request, 'size', 20, 100); $page = $this->page($request); $currencyCode = strtoupper(trim((string) $request->query('currency', ''))); $typeFilter = (string) $request->query('type', ''); $pendingPayload = $this->pendingReconcilePayload((int) $player->id, $currencyCode); $result = $this->ledgerLogs->listForPlayerApi($player, $page, $perPage, $currencyCode, $typeFilter); return ApiResponse::success([ 'items' => $result['items'], 'total' => $result['total'], 'page' => $result['page'], 'per_page' => $result['per_page'], 'ledger_source' => $result['ledger_source'], 'funding_mode' => $result['funding_mode'], 'auth_source' => $result['auth_source'], 'pending_reconcile' => $pendingPayload, ]); } /** * @return list> */ private function pendingReconcilePayload(int $playerId, string $currencyCode = ''): array { return TransferOrder::query() ->where('player_id', $playerId) ->when($currencyCode !== '', fn ($q) => $q->where('currency_code', $currencyCode)) ->where('status', 'pending_reconcile') ->orderByDesc('id') ->limit(50) ->get() ->map(fn (TransferOrder $o) => $this->formatPendingOrder($o)) ->all(); } /** * @return array */ private function formatPendingOrder(TransferOrder $order): array { $amount = (int) $order->amount; return [ 'transfer_no' => $order->transfer_no, 'direction' => $order->direction, 'type' => $order->direction === 'in' ? 'transfer_in' : 'transfer_out', 'currency_code' => $order->currency_code, 'amount' => $amount, 'amount_formatted' => CurrencyFormatter::fromMinor($amount), 'status' => $order->status, 'fail_reason' => $order->fail_reason, 'idempotent_key' => $order->idempotent_key, 'created_at' => $order->created_at?->toIso8601String(), ]; } }