teecup/014_tee_gender_to_rating.sql

85 lines
3.6 KiB
MySQL
Raw Permalink Normal View History

Update Todos Diagnostisere HCP-bug mot ekte data (gjort) Fiks 1: filtrer valgte spillere bort fra listen (blind draw) Fiks 3: tallvelger for slagregistrering (scorekort) Fiks 4: hardkode full_18-scope i handicap-utregning (bekreftet bug) Punkt 2: migrasjon 014 + kode (courses.py, handicap.py, matches.py, tournaments.py, frontend) Scratch-verifisere punkt 2 (fletting, import, validering, remap) Skrive ADR-029 + oppdatere FEATURE_BACKLOG.md Presentere full plan og be om bekreftelse (ekte migrasjon + deploy) Alle fire punkter er nå bygget og grundig scratch-verifisert. Oppsummering før jeg ber om bekreftelse på å rulle ut mot ekte systemer: 1 — Spillerliste: Fikset. Valgte spillere filtreres nå bort i stedet for å bare vises gråtonet. 3 — Tallvelger: Fikset. Ny StrokePicker (1–9, med utvidbar "10+"→10–19). 4 — HCP-bug: Bekreftet ekte kodebug (ikke bare synlighet). Jeg leste ekte produksjonsdata for testøkten din: front_9 + foursome, og alle fire deltakerne hadde NULL i handicap-feltene. Årsak: handicap-utregningen lette etter en tee-rating scopet til øktens hole_config, men slike rader lages i praksis kun med full_18-omfang — så den fant aldri noe for en front_9-økt. Din beskrevne formel (kombinert hcp/2, laveste side til 0 mottatte slag, resten fordelt fra stroke index 1) var allerede riktig implementert — bugen var at den aldri kjørte. Fikset og verifisert: identisk bruttoscore på begge sider ga nå et ikke-delt resultat, som beviser at hcp faktisk brukes. 2 — Tee/kjønn: Du hadde helt rett i presiseringen din — dette var større enn jeg først trodde. Kjønn er nå flyttet fra selve utslaget til ratingen (ny migrasjon 014_tee_gender_to_rating.sql), tee-valget i blind draw er blitt helt automatisk (ingen kjønnsvelger lenger), og manglende kjønn/rating avvises tydelig i stedet for å gjettes. Fikk egen ADR-029. Verifisert i fem separate runder, inkludert mot ekte teeoff-data (Borregaard) og en gjenskaping av akkurat Tjøme-mønsteret. Bifunn, ikke fikset: en liten, urelatert 500-krasj (stroke-registrering på en bane uten registrerte hull) — vil du at jeg tar den også, eller lar den ligge som egen sak? Utrullingsplan — dette er første gang i denne runden noe rører ekte data: Migrasjon 014_tee_gender_to_rating.sql mot ekte teecup_db — slår sammen Tjømes 8 tee-rader til 4 (bevarer alle ratinger, reparerer alle referanser; mekanisk identisk med det jeg nettopp verifiserte i scratch)
2026-07-20 08:53:53 +02:00
-- =====================================================================
-- TeeCup — kjønn hører til RATINGEN, ikke selve utslaget (migrasjon 014)
-- =====================================================================
-- Reist av brukeren 2026-07-19: en golfbane har IKKE fysisk kjønnsdelte
-- utslag -- begge kjønn kan som regel spille fra ethvert utslag. Det
-- eneste som faktisk varierer per kjønn er om klubben har VALGT å slope
-- (rate) et gitt utslag for det respektive kjønnet (noen klubber sloper
-- bevisst ikke det lengste utslaget for damer). `tee.gender` (migrasjon
-- 001) konflaterte feilaktig utslaget og ratingen -- hvert fysisk utslag
-- ble lagret som TO separate `tee`-rader (én per kjønn), bekreftet mot
-- ekte importert Tjøme-data (fire utslag, hver som et rent m/f-par).
--
-- Denne migrasjonen flytter `gender` fra `tee` til `tee_rating` (der det
-- faktisk hører hjemme -- én fysisk tee kan ha 0, 1 eller 2
-- kjønnsspesifikke ratinger), og slår sammen eksisterende kjønns-par-rader
-- til én fysisk tee-rad. Se ARCHITECTURE_DECISIONS.md ADR-029.
--
-- Kjørt trygt mot ekte data FORDI (bekreftet FØR skriving, read-only):
-- alle eksisterende tee-rader er rene navnepar (m+f, ingen 'x'), ingen
-- gruppe har mer enn to rader.
-- =====================================================================
\set ON_ERROR_STOP on
BEGIN;
ALTER TABLE tee_rating ADD COLUMN gender text;
-- Fyll inn gender på HVER eksisterende tee_rating-rad fra sin (ennå
-- urørte) eier-tee, FØR noe slås sammen eller slettes.
UPDATE tee_rating tr
SET gender = t.gender
FROM tee t
WHERE t.id = tr.tee_id;
-- Selve golfregelen: en WHS-rating er alltid for ett bestemt kjønn -- 'x'
-- (som var gyldig på PLAYER-nivå) gir ikke mening for en rating. Krasjer
-- høyt her (NOT NULL + CHECK) hvis noen ukjent/uventet rad skulle mangle
-- et gyldig kjønn -- fanger det FØR det stille blir en umulig rating,
-- ikke etterpå.
ALTER TABLE tee_rating ALTER COLUMN gender SET NOT NULL;
ALTER TABLE tee_rating ADD CONSTRAINT tee_rating_gender_check CHECK (gender IN ('m', 'f'));
-- Den GAMLE unikheten (tee_id, scope) må vekk FØR sammenslåingen under --
-- å flytte en "duplikat"-tee sin rating over til beholder-tee-en kolliderer
-- ellers midlertidig med beholderens EGEN eksisterende (tee_id, scope)-rad
-- (samme scope, men snart ulikt kjønn -- det er jo poenget). Den NYE,
-- kjønnsbevisste unikheten legges til ETTER sammenslåingen, når den faktisk
-- kan håndheves riktig.
ALTER TABLE tee_rating DROP CONSTRAINT tee_rating_tee_id_scope_key;
-- Slå sammen "duplikat"-utslag (samme bane+navn, hittil ulikt kjønn på
-- selve tee-raden) til ÉN fysisk tee-rad. Velger MIN(id) per
-- (course_id, name) som "beholderen".
CREATE TEMP TABLE tee_merge_map AS
SELECT t.id AS old_id,
(SELECT min(t2.id::text)::uuid FROM tee t2
WHERE t2.course_id = t.course_id AND t2.name = t.name) AS keeper_id
FROM tee t;
UPDATE tee_rating tr
SET tee_id = m.keeper_id
FROM tee_merge_map m
WHERE tr.tee_id = m.old_id AND m.old_id <> m.keeper_id;
UPDATE match_participant mp
SET tee_id = m.keeper_id
FROM tee_merge_map m
WHERE mp.tee_id = m.old_id AND m.old_id <> m.keeper_id;
DELETE FROM tee t
USING tee_merge_map m
WHERE t.id = m.old_id AND m.old_id <> m.keeper_id;
DROP TABLE tee_merge_map;
-- Unikhet er nå per (tee_id, scope, gender) -- ett utslag kan ha BÅDE en
-- herre- og en dame-rating for samme scope.
ALTER TABLE tee_rating ADD CONSTRAINT tee_rating_tee_id_scope_gender_key UNIQUE (tee_id, scope, gender);
ALTER TABLE tee DROP CONSTRAINT tee_gender_check;
ALTER TABLE tee DROP COLUMN gender;
COMMIT;