teecup/083_tournament_cut.sql
Erol Haagenrud 19c527f834 Cut i individuelle turneringer: topp N og delt plass (ADR-087)
Manuelt anvendt (organisator trykker "Anvend cut"), etter et valgt
rundenummer. Kuttede spillere blokkeres fra scoring i senere runder og
vises i egen seksjon på leaderboardet. Migrasjon 083 lagt til, men IKKE
anvendt mot ekte teecup_db ennå -- venter på bekreftelse.
2026-08-18 15:07:21 +02:00

37 lines
1.9 KiB
SQL

-- =====================================================================
-- TeeCup — migrasjon 083
-- Cut: topp N og delt plass, etter et valgt rundenummer, manuelt anvendt
-- =====================================================================
-- Kun for individuelle turneringer (stroke_gross/stroke_net/stableford
-- -- samme sett som Augusta-resultattavlen, se ADR-*/CHANGELOG #104/112).
-- Bruker bekreftet design 2026-08-17/18: "Topp N og delt plass" (den
-- N-te plassen og alle uavgjort med den slipper gjennom), "etter et
-- bestemt rundenummer" (organisator velger selv hvilken runde cutten
-- gjelder fra), "vises i egen 'Cut'-seksjon, blokkert fra videre
-- scoring" -- og eksplisitt et MANUELT "Anvend cut"-trykk, IKKE
-- automatisk ved fullspilt runde (for å unngå at cutten slår inn for
-- tidlig mens noen fortsatt spiller den runden).
--
-- cut_after_round/cut_size er KONFIGURASJON (satt i Oppsett, kan endres
-- fritt inntil cutten faktisk anvendes). cut_applied_at er null inntil
-- organisator trykker "Anvend cut" -- selve anvendelsen er et eksplisitt
-- API-kall (`app/routers/individual_tournaments.py`) som beregner
-- stillingen etter cut_after_round og setter tournament_participant.cut
-- = true for alle UTENFOR cut_size+uavgjort-grensen. Idempotent: kan
-- trykkes på nytt (f.eks. etter en rettelse) -- regner alt på nytt fra
-- bunnen av, ikke bare inkrementelt.
--
-- tournament_participant.cut er IKKE nullable (false = fortsatt med,
-- samme "ingen regresjon for eksisterende data"-prinsipp som resten av
-- prosjektets nullable/default-valg).
-- =====================================================================
\set ON_ERROR_STOP on
ALTER TABLE tournament
ADD COLUMN cut_after_round smallint,
ADD COLUMN cut_size smallint CHECK (cut_size IS NULL OR cut_size > 0),
ADD COLUMN cut_applied_at timestamptz;
ALTER TABLE tournament_participant
ADD COLUMN cut boolean NOT NULL DEFAULT false;