-- ===================================================================== -- TeeCup — migrasjon 084 -- Utslagsgrupper for individuelle turneringer: hvem spiller med hvem, -- klokka når -- ===================================================================== -- Bruker: "Jeg må jo kunne bulksjekke hvem som skal spille fra hvor, med -- hvem, klokka når?" -- undersøkt FØR bygging: individuelle turneringer -- hadde INGEN gruppe-/pairing-konsept i det hele tatt, kun ett delt -- start_hole/scheduled_at/tee_interval_minutes for HELE runden -- (tournament_round, migrasjon 040) -- ingen måte å si hvem som spiller -- sammen, eller gi ulike grupper ulikt klokkeslett. -- -- Design bekreftet med bruker 2026-08-18 (tre spørsmål): -- - TRADISJONELT utslag: samme starthull for alle (tournament_round sitt -- allerede eksisterende start_hole -- ingen endring der), staggerte -- klokkeslett PER GRUPPE med fast intervall -- IKKE shotgun (ulike -- hull samtidig). -- - Gruppesammensetning er MANUELL, med et forslag å justere -- ikke -- helt automatisk, ikke helt fra bunnen av. -- - FAST gruppestørrelse (organisator velger tallet, f.eks. 4), ikke -- fleksibelt antall per gruppe. -- -- `tournament_round_group` speiler `session`/`match` sin allerede -- etablerte klokkeslett-modell i matches.py (`_compute_tee_time`): -- gruppens tee-tid er UTLEDET (tournament_round.scheduled_at + -- (sequence-1)*tournament_round.tee_interval_minutes), med en valgfri -- `tee_time_override` som vinner hvis satt (samme unntaks-mønster som -- `match.tee_time_override` -- f.eks. én gruppe forsinket). INGEN nytt -- starthull-felt her -- alle grupper i en runde bruker rundens EGNE -- start_hole, per bekreftet "tradisjonelt"-valg. -- -- `tournament_round_participant.tournament_round_group_id` er nullable -- (ikke gruppert ennå = null, ingen regresjon for eksisterende runder/ -- deltakere). BEVISST INGEN `ON DELETE SET NULL` på FK-en, selv om det -- først virket naturlig ("slett en gruppe -> deltakerne blir ugrupperte -- igjen") -- funnet under egen scratch-testing: en SAMMENSATT FK -- (organization_id, tournament_round_group_id) med ON DELETE SET NULL -- setter BEGGE kolonnene til null ved kaskade, IKKE bare fremmednøkkel- -- kolonnen -- det ville korrumpert organization_id (RLS sin tenant- -- nøkkel, kan ALDRI være null) på deltaker-rader hver gang en gruppe -- slettes. Appen (`save_round_groups`, individual_tournaments.py) -- nullstiller derfor `tournament_round_group_id` EKSPLISITT i Python -- FØR den sletter de gamle gruppe-radene -- samme "eksplisitt rekkefølge -- fremfor å stole på kaskade-semantikk"-mønster som ADR-086 sin -- turneringssletting allerede etablerte for en beslektet RESTRICT-FK- -- diamant. Standard FK-oppførsel (RESTRICT) er dermed trygg: den -- utløses aldri fra denne kodestien (kolonnen er allerede null før -- selve DELETE-en kjører), og ville korrekt stoppet enhver FREMTIDIG -- kodesti som glemte å nullstille først, i stedet for å stille -- korrumpere data. -- ===================================================================== \set ON_ERROR_STOP on CREATE TABLE tournament_round_group ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), organization_id uuid NOT NULL, tournament_round_id uuid NOT NULL, sequence smallint NOT NULL, tee_time_override timestamptz, created_at timestamptz NOT NULL DEFAULT now(), FOREIGN KEY (organization_id, tournament_round_id) REFERENCES tournament_round(organization_id, id) ON DELETE CASCADE, UNIQUE (organization_id, id), UNIQUE (tournament_round_id, sequence) ); ALTER TABLE tournament_round_participant ADD COLUMN tournament_round_group_id uuid, ADD FOREIGN KEY (organization_id, tournament_round_group_id) REFERENCES tournament_round_group(organization_id, id);