-- ===================================================================== -- 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;