{# Live region for the Live Racing monitor. Rendered inside monitor.html.twig on first load AND standalone by WfboController::liveRacingMonitorData(), re-fetched by the lr-monitor Stimulus controller every 15s (innerHTML swap of this file's output only — the header and video iframe live in the shell). #} {% if state == 'idle' %}
{{ now|date('H:i') }}
No live event right now
{% if notFound %}
Requested event not found.
{% endif %} {% if nextEvent %}
Next: {{ nextEvent.management.name }} — {{ nextEvent.eventDate|date('D, M j, Y') }}
{% endif %}
{% else %} {# Remaining Stakes = Turnover minus Settled Stake, i.e. stake money not yet resolved to won/lost. This also nets out any scratched/void stake, so it can run a bit above the Pending Bets tile's own pending-only total; snapshot.pendingStaked is the strictly-pending figure if that distinction ever matters. #} {% set kpis = [ {label: 'Turnover', value: '₱' ~ snapshot.staked|number_format(2), sub: snapshot.count ~ ' bets · ' ~ snapshot.pendingCount ~ ' pending'}, {label: 'Settled Stake', value: '₱' ~ totals.betAmount|number_format(2), sub: totals.count ~ ' settled bets'}, {label: 'Remaining Stakes', value: '₱' ~ (snapshot.staked - totals.betAmount)|number_format(2), sub: 'turnover not yet won/lost'}, {label: 'Payout', value: '₱' ~ totals.payout|number_format(2), sub: null}, {label: 'Commission', value: '₱' ~ totals.commission|number_format(2), sub: null}, {label: 'Revenue', value: '₱' ~ totals.revenue|number_format(2), sub: null, signed: true, amount: totals.revenue}, {label: 'Pending Bets', value: pendingTotal, sub: null}, {label: 'Settled Bets', value: totals.count, sub: null}, {label: 'Win Count', value: statusCounts.won.count, sub: '₱' ~ statusCounts.won.amount|number_format(2)}, {label: 'Lose Count', value: statusCounts.lost.count, sub: '₱' ~ statusCounts.lost.amount|number_format(2)}, {label: 'Void Count', value: statusCounts.void.count, sub: '₱' ~ statusCounts.void.amount|number_format(2)}, {label: 'Failed Credits', value: settlement.failed, sub: settlement.total ~ ' settlement rows', danger: settlement.failed > 0}, {label: 'Win Rate Today', value: winRate ~ '%', sub: 'payout ÷ settled stake'}, {label: 'Active Players Today', value: activePlayers, sub: 'placed a live racing bet'}, {label: 'Late Bets', value: lateBetTotal, sub: 'placed after betting closed', danger: lateBetTotal > 0}, ] %} {% set settledBets = totals.count %} {% set settleKnown = settledBets + pendingTotal %}
{% for row in races %} {% if row.statusKey in ['betting-closed', 'awaiting-settlement'] %}
Race {{ row.race.raceNumber }} — Horses
{% for h in row.horses %} #{{ h.horseNumber }} {{ h.horseName }} {% endfor %}
{% endif %} {% endfor %}
{% for kpi in kpis %}
{{ kpi.label }}
{{ kpi.value }}
{% if kpi.sub is defined and kpi.sub %}
{{ kpi.sub }}
{% endif %}
{% endfor %}
{% if settleKnown > 0 %}
{% if settlementActive %} ⚙ Settlement running — {{ settledBets }} of {{ settleKnown }} bets {% elseif pendingTotal == 0 %} Settlement — all {{ settledBets }} bets settled {% else %} Settlement — {{ pendingTotal }} bets awaiting settlement {% endif %} {%- if settlement.failed > 0 %} · {{ settlement.failed }} failed{% endif %} {{ (settledBets / settleKnown * 100)|round }}%
{% endif %}
{% for row in races %} {% set labels = { 'open': 'Open', 'betting-closed': 'Betting closed', 'awaiting-settlement': 'Awaiting settlement', 'settled': 'Settled', } %}
Race {{ row.race.raceNumber }} {% if row.dividendsSaved %} ✓ Dividends saved {% elseif row.statusKey == 'betting-closed' %} Dividends not entered {% endif %} {% if row.settling %} ⚙ Settling now {% else %} {{ labels[row.statusKey] }} {% endif %}
{% set raceKnown = row.stats.count + row.pendingCount %} {% if row.race.hasResult and not row.race.isSettled and raceKnown > 0 %}
{{ row.stats.count }}/{{ raceKnown }} settled · {{ row.pendingCount }} pending
{% elseif row.pendingCount > 0 %}
{{ row.pendingCount }} pending
{% endif %} {% if row.scratchedHorses is not empty %}
Scratched: {% for h in row.scratchedHorses %} #{{ h.horseNumber }} {{ h.horseName }}{{ h.isScratchedAfterClose ? ' (after close)' : '' }}{{ not loop.last ? ', ' : '' }} {% endfor %}
{% endif %} {% if row.statusKey == 'settled' and row.race.result is not empty %}
🏆 {% for finisher in row.race.result %} {% set horse = row.horses|filter(h => h.id == finisher.horseId)|first %} {{ not loop.first ? ', ' : '' }}#{{ finisher.horseNumber }}{% if horse %} {{ horse.horseName }}{% endif %} {% endfor %}
{% endif %} {% if row.lateBetCount > 0 %}
⚠ {{ row.lateBetCount }} bet{{ row.lateBetCount > 1 ? 's' : '' }} placed after betting closed
{% endif %}
₱{{ row.stats.betAmount|number_format(2) }} staked · ₱{{ row.stats.payout|number_format(2) }} paid
{% else %}
No races on this event yet.
{% endfor %}
Top Earners
{% for earner in topEarners %}
{{ loop.index }} {{ earner.firstName }} {{ earner.lastName }} ₱{{ earner.totalPayout|number_format(2) }}
{% else %}
No winners yet.
{% endfor %}
Recent Bets
{% for ticket in recentTickets %}
{{ ticket.createdAt|date('H:i:s') }} {{ ticket.user.firstName }} {{ ticket.user.lastName }} {{ ticket.betTypeLabel }} · {{ ticket.firstRaceLabel }} ₱{{ ticket.amount|number_format(2) }}
{% else %}
No bets yet.
{% endfor %}
Updated {{ updatedAt|date('H:i:s') }}
{% endif %}