Hullet lukket: hele WHS-HCP-motoren fantes og var testet, men ble aldri kalt — score_differential ble lagret per runde, men ingen indeks ble noensinne regnet ut. Nå har du: To atskilte tall: manuelt satt HCP (uendret bruk) og et nytt, automatisk beregnet «faktisk HCP» (beste 8-av-≤20 nyeste tellende runder, WHS Rule 5.2, med Low-HCP-cap). «Bruk som mitt HCP»-knapp på /account for å eksplisitt overføre. Eksklusjon per deltaker — hver innlogget spiller (ikke bare eieren) styrer selv om egen deltakelse skal telle, uansett fullført-status. Selvdeklarert spilleform (slagspill/matchspill) — matchspill forhåndsforeslår (ikke tvinger) eksklusjon, begrunnet i WHS sin «most likely score»-regel som TeeCup ikke kan garantere presist. Verifisert med 111/111 scratch-sjekker (inkl. håndregnet WHS-matte) og en ekte nettleser-gjennomgang av hele flyten. Migrasjon 030 kjørt mot ekte teecup_db, begge containere redeployet, alt grønt, teeoff.no upåvirket. Gjenstår (dokumentert i CLAUDE.md/FEATURE_BACKLOG.md, ikke bygget nå): offline-kø for frittstående runder, Stableford, rundedeling/visibility, flere flighter i én runde.
39 lines
2 KiB
SQL
39 lines
2 KiB
SQL
-- =====================================================================
|
|
-- TeeCup — faktisk (beregnet) HCP vs. manuelt satt HCP (migrasjon 030,
|
|
-- ADR-038)
|
|
-- =====================================================================
|
|
-- To atskilte tall (Beslutning A): `app_user.handicap_index` (uendret,
|
|
-- manuelt satt, brukes til Course Handicap-beregning som i dag) og en
|
|
-- NY `computed_handicap_index` (WHS Handicap Index, Rule 5.2, regnet
|
|
-- automatisk fra beste 8 av de ≤20 nyeste tellende Score Differential-
|
|
-- ene -- se `handicap_engine.handicap_index_from_differentials`,
|
|
-- allerede skrevet og testet, bare aldri kalt før nå).
|
|
--
|
|
-- `round_participant.exclude_from_handicap` (Beslutning C) er en
|
|
-- EKSPLISITT, manuell opt-out -- uavhengig av `counts_for_handicap`
|
|
-- (den AUTOMATISKE WHS-kvalifiseringen, minimum spilte hull). Endelig
|
|
-- medregning krever begge: counts_for_handicap AND NOT
|
|
-- exclude_from_handicap. Kontrolleres av HVER innlogget deltaker for
|
|
-- sin egen rad (app-lag-autorisasjon, ikke noe denne migrasjonen
|
|
-- håndhever).
|
|
--
|
|
-- `round.play_format` (Beslutning D) er selvdeklarert -- frittstående
|
|
-- runder har ingen egen match-motor til å "oppdage" dette selv.
|
|
--
|
|
-- `handicap_history.source` (Beslutning F) skiller manuelle
|
|
-- profilendringer (eksisterende bruk) fra automatiske beregninger --
|
|
-- samme tabell, to kilder, i stedet for en parallell historikk-tabell.
|
|
-- =====================================================================
|
|
|
|
\set ON_ERROR_STOP on
|
|
|
|
ALTER TABLE app_user ADD COLUMN computed_handicap_index numeric(4,1);
|
|
ALTER TABLE app_user ADD COLUMN computed_handicap_index_updated_at timestamptz;
|
|
|
|
ALTER TABLE round_participant ADD COLUMN exclude_from_handicap boolean NOT NULL DEFAULT false;
|
|
|
|
ALTER TABLE round ADD COLUMN play_format text NOT NULL DEFAULT 'stroke'
|
|
CHECK (play_format IN ('stroke', 'match'));
|
|
|
|
ALTER TABLE handicap_history ADD COLUMN source text NOT NULL DEFAULT 'manual'
|
|
CHECK (source IN ('manual', 'computed'));
|