# Multi-sport — Match Live TV ## Concetti | Concetto | Descrizione | |----------|-------------| | `sport_key` | Disciplina (pallavolo, basket, tennis…) — sulla squadra e snapshot sulla partita | | `board_type` | Macro-tabellone **implicito** dal catalogo (`volley`, `basket`, `timed`, `racket`, `timer`, `generic`) | | `overlay_kind` | Layout video sulla partita (`none`, `timer`, `volley`, `basket`, `timed`, `racket`) | | `scoring_rules` | Regole effettive della partita (override sui default del catalogo) | ## Catalogo Definito in [`backend/config/sports.yml`](../backend/config/sports.yml), caricato da `Sports::Catalog`. - Nessuna tabella `sports` in DB - API: `GET /api/v1/sports` ## Scoring `Scoring::Engine.for(match)` seleziona l'engine: | Board | Engine | Azioni principali | |-------|--------|-------------------| | volley | VolleyEngine | +1, −1, chiudi set | | racket | RacketEngine | come volley (fase 1) | | generic | GenericEngine | +1, −1 (nessuna chiusura set) | | basket | BasketEngine | +1/+2/+3, quarti, cronometro | | timed | TimedEngine | +1, −1, tempi, cronometro | | timer | TimerEngine | solo cronometro | `score_states.data` (JSONB) per basket/timed/timer. ## Overlay Scelto per partita (`overlay_kind`), limitato da `allowed_overlays` dello sport. Rendering Android: `OverlayKind` in `OverlayState` → `ScoreboardElement`, `CompactScoreboardElement`, `TimerElement`. ## Migrazione - `teams.sport` → `sport_key` (`volleyball` → `pallavolo`) - `matches.sport` → `sport_key` - `matches.overlay_kind` (nullable) - `score_states.board_type`, `score_states.data` ## Regia web Partial per board in `app/views/public/regia/_*.html.erb`, `data-board` su `#regia-app`.