# Endringslogg

Alle merkbare endringer i SelgerFlyt dokumenteres her. Prosjektet bruker
[semantisk versjonering](https://semver.org/lang/no/): `MAJOR.MINOR.PATCH` –
**major** = brytende endring, **minor** = ny funksjonalitet (bakoverkompatibel),
**patch** = feilretting. Versjonen vises nederst i sidemenyen og bor som
`APP_VERSION` i `js/app.js`.

## [1.23.8] – 2026-07-27

### Fjernet
- **Telenor «Ubegrenset Normal» er tatt ut** – abonnementet selges ikke lenger (bekreftet av bruker). Det var også den ene raden nettkildene spriket på, så forbeholdet om den er fjernet fra periode-merknaden.

### Endret
- **Telenor Sikre Mobil bekreftet til 699,-** (uendret verdi, nå verifisert av bruker og nevnt eksplisitt i periode-merknaden). Telenor-serien er dermed Fast 5 GB 399,- / Fast 10 GB 479,- / Ubegrenset Enkel 599,- / Optimal 749,- / Maksimal 799,- / Sikre Mobil 699,-.

## [1.23.7] – 2026-07-27

### Endret
- **Ny research-runde på Telenors ubegrenset-priser.** Enkel (599,-), Optimal (749,-) og Maksimal (799,-) ble bekreftet av flere uavhengige kilder og står som de er. **Ubegrenset Normal** er den ene raden kildene spriker på (649,- vs. 699,-) – tallet står fortsatt på 649,-, men periode-merknaden ber nå eksplisitt om at akkurat den dobbeltsjekkes på telenor.no før den brukes i en kundesamtale. (telenor.no kan ikke hentes fra utviklingsmiljøet, så tallene er triangulert fra prissammenligningssider.)

## [1.23.6] – 2026-07-27

### Endret
- **Rettet Telenor-prisene på Konkurrenter-siden.** Ubegrenset-serien sto oppført med **ungdomsprisen (under 30) som om det var ordinærpris** – det fikk Telenor til å se 100–150 kr billigere ut enn de er i en kundesamtale. Ordinære priser nå: **Ubegrenset Enkel 599,-** (var «fra 449,-»), **Normal 649,-** (var 549,-), **Optimal 749,-** (var 649,-), **Maksimal 799,-** (var 699,-). «fra»-prefikset er fjernet siden radene nå er ordinærpris.
- **Lagt til Telenor Fast 10 GB (479,-)** som manglet i oversikten. Fast 5 GB (399,-) og Sikre Mobil (699,-) er uendret; Fast 5 GB fikk presis toppfart (250 Mbit/s) i stedet for «God hastighet», og Ubegrenset Normal er merket med 100 GB full fart.
- **Rabattkortene presisert:** Telenors samlerabatt (100,- per ekstra ubegrenset-abonnement) **kan ikke kombineres med ungdomsrabatt**, og under 13 får opptil 250,- på Sikre Mobil/Fast 5 GB og 230,- på Fast 10 GB.
- **Periode-merknaden sier nå eksplisitt at alle priser er ordinærpris** uten ungdoms-/student-/samlerabatt, og at Telenor-tallene er rettet 27.7.2026.

## [1.23.5] – 2026-07-27

### Fjernet
- **Konkurrenter-siden viser nå kun priser** (brukervalg): toppkortene «Dine beste argumenter», fordels-matrisen «Inkluderte fordeler og tjenester» og verdikt-kortene «Hva Telia er bedre på» / «Der Telia er dyrere» er tatt bort. Igjen står prisoversikten – individuelle abonnement per leverandør, familie-/delt data og ungdoms-/barnerabatter – med søk og periode-merknad som før.
- Ryddet tilhørende død kode: `COMPETITOR_EDGE`/`COMPETITOR_BENEFITS`/`COMPETITOR_SUMMARY` i `js/competitors.js`, `renderCompetitorEdge`/`renderCompetitorBenefits`/`cmpBenefitState`/`CMP_EDGE_ICONS`/`CMP_STATE_ICON` i `js/app.js` og `.cmp-edge*`/`.cmp-verdict*`/`.cmp-benefits`-stilene i `css/styles.css`.

## [1.23.4] – 2026-07-24

### Endret
- **Bekreftet at Telias egne X-priser i appen er riktige** (449/499/599/699 – butikkarket er autoritativt; de eksterne sammenligningssidene tok feil / viste ikke-kampanjepris). Fjernet det midlertidige forbeholdet om Telia-prisene fra `COMPETITOR_PERIOD.note`, så note-boksen ikke sår tvil om egne priser. Konkurrent-rettelsene fra 1.23.3 står.

## [1.23.3] – 2026-07-24

### Endret
- **Full research-runde nr. 2 mot konkurrentene (fullførte denne gangen) – flere bekreftede rettelser på Konkurrenter-siden:**
  - **Onecall StudentPakka:** 30 GB → **15 GB** (279,- uendret) – flere uavhengige kilder bekreftet 15 GB.
  - **Ice iceMax m/Netflix:** 449,- → **429,-**.
  - **Fjordkraft Fri data:** serien har nå FIRE nivåer – basis 299,- (10 Mbit/s), **normal 379,- (20 Mbit/s, ny)**, **rask 399,- (250 Mbit/s)** (het før «maks 449,-»), **ekstra rask 499,- (1000 Mbit/s, ny)**. Toppnivået når nå 1000 Mbit/s.
  - **Toppfart-nyansering:** Talkmore (Ubegrenset Maksimal) og Fjordkraft (Fri data ekstra rask) når også 1000 Mbit/s på sitt dyreste nivå. «Konkurrentene stopper på 200–300 Mbit/s» gjaldt bare Onecall/Ice – argumentkortet, matrisen og oppsummeringen er rettet så det ikke overdrives.
  - **Sikkerhet nyansert (viktig):** den GRATIS grunnsikkerheten (SvindelSperre + Nettslett + Telia Sky) gjelder alle abonnement, men den fulle **Telia Trygg**-pakken (ID-overvåking/passordhvelv/ID-forsikring) koster 109 kr/mnd og er gratis kun i X Max Pluss. Toppkortet, matrisen (Telia Sky nå «alle X-abonnement») og coachens kunnskapsbase skiller nå tydelig mellom gratis grunnsikkerhet og betalt Telia Trygg – appen motsa ellers sin egen produktkunnskap.
- **Flagget for kontroll (IKKE endret):** uavhengige sammenligningssider oppgir Telias EGNE X-priser 50 kr høyere enn butikkarket (X Start 499 / Basis 549 / Max 649 / Max Pluss 749, generell prisøkning jan 2026). Dette rører hele appens kjerne­priser (data.js/kalkulator), så det er notert i `COMPETITOR_PERIOD.note` og bør bekreftes mot Telias interne prisliste før det endres.

## [1.23.2] – 2026-07-24

### Endret
- **Rettet faktafeil om Telenor på Konkurrenter-siden (og i AI-coachens kunnskapsbase) etter research mot telenor.no.** Tre påstander var feil/utdaterte: (1) «konkurrentene stopper på 200–300 Mbit/s» – Telenors Ubegrenset Normal/Optimal/Maksimal kjører faktisk **1000 Mbit/s** (kun billigste Enkel er 250); (2) «Telia er eneste med gratis sikkerhet» – Telenor har nå lagt grunnleggende sikkerhet (Nettvern) i vanlige abonnement, så argumentet er nyansert til at Telia har HELE pakken gratis mens Telenors fulle ID-/advokatpakke fortsatt koster ekstra (Sikre-nivå); (3) Telenors abonnementsliste var utdatert – oppdatert til dagens Enkel/Normal/Optimal/Maksimal + Sikre Mobil med riktige hastigheter. Toppkortene «Dine beste argumenter», fordels-matrisen og styrker-oppsummeringen er rettet tilsvarende, og coachen slutter å påstå at Telia er «raskest»/«eneste».
- **Merknad:** prisene for lavprismerkene (Talkmore/Onecall/Ice/Fjordkraft) ble ikke fullstendig re-verifisert i denne runden (research-jobben traff en bruksgrense underveis) – flagget i `COMPETITOR_PERIOD.note`.

## [1.23.1] – 2026-07-23

### Endret
- **Konkurrenter-siden er redesignet fra kjedelige tabeller til et salgsverktøy.** Øverst ligger nå «Dine beste argumenter» – fire visuelle kort (sikkerhet inkludert, høyest toppfart, datadeling uten familieabonnement, konkurrentene kjører på Telias/Telenors nett). Leverandørene har fått fargekodede badges, og Telia er uthevet overalt (egen «Din leverandør»-tag + lilla aksent). Fordels-matrisen viser nå grønn hake / gul strek (mot tillegg) / kryss i stedet for ren tekst, så det er lett å se hvem som har hva ved et blikk. Individuelle abonnement er gruppert per leverandør med tydelig pris, og familie-/ungdomsdata vises som leverandør-kort. Styrker/svakheter-oppsummeringen er blitt to fargede verdikt-kort. Ingen dataendring – kun presentasjon.

## [1.23.0] – 2026-07-23

### Lagt til
- **Ny side: «Konkurrenter» (`#konkurrenter`, i Verktøy & oppslag).** Sammenligner Telia mot Telenor, Talkmore, Onecall, Ice og Fjordkraft: individuelle abonnement, familie-/delt data, ungdoms-/barnerabatter og inkluderte fordeler (sikkerhet, fart, familiedeling, roaming m.m.) i fire tabeller + en kort styrker/svakheter-oppsummering. Søkbar (`#competitorSearch`). Data i ny fil `js/competitors.js` (`COMPETITOR_PLANS`/`COMPETITOR_FAMILY`/`COMPETITOR_YOUTH`/`COMPETITOR_BENEFITS`/`COMPETITOR_SUMMARY`), hentet fra leverandørenes prissider **24.7.2026** (`COMPETITOR_PERIOD`) – hardkodet og MÅ verifiseres på nytt før eksakte tall siteres til kunde, priser endres jevnlig. Ammunisjon for innvendingen «konkurrenten er billigere».
- **AI-coachen kjenner konkurrentbildet.** Kunnskapsbasen har fått en kondensert «Konkurrenter»-seksjon (sikkerhetspakke gratis i alle Telia-abonnement vs. Telenors betalte tillegg, høyest toppfart, gratis datadeling i familien opptil 30 GB, ærlig om at lavpristilbydere er billigere for lite databruk, noen kjører på Telias eget nett) + en ny innvendingsmal **«[Konkurrent] er billigere»** i rammeverket – coachen henviser til Konkurrenter-siden for eksakte tall i stedet for å gjette.
- **Salgsprosess-seksjon fullført i coachens kunnskapsbase:** behovsavdekkende spørsmål, fast mersalgstrapp (abonnement/oppgradering → Telia Trygg → forsikring → tilbehør → FWA → ekstra SIM) og avslutnings-/trial-close-veiledning.

## [1.22.1] – 2026-07-18

### Endret
- **Fjernet stygg scrollbar på betalings-/lagringsvelgeren i telefondialogen.** «Engangs/12/24/36/48 mnd» tvang tidligere segmentet til å scrolle horisontalt (synlig grå scrollbar) i stedet for å bruke appens vanlige `.seg`-mønster, som allerede støtter elegant linjebryting til flere rader. Fjernet tvangs-scroll/nowrap – valgene bryter nå naturlig i stedet.

## [1.22.0] – 2026-07-18

### Lagt til
- **Lagringsvelger i telefondialogen.** 21 av 43 telefoner selges nå i flere lagringsstørrelser (f.eks. iPhone 17 Pro Max i 256/512 GB/1 TB), hver med egen pris per abonnementsnivå. En ny «Lagring»-seg (samme mønster som betalingsvelgeren) lar selgeren bytte størrelse i telefondialogen – hero-pris, sparing og abonnementsvisning oppdateres momentant. `phoneCatalog`-oppføringer har fått et valgfritt `variants`-felt (ekstra lagringer); basis-lagringen (billigst) ligger fortsatt i `prices` som før, så **kalkulatoren, AI-coachens tilbudsbygger og enhetstestene er upåvirket** – de bruker automatisk basis-lagringen, uendret. Verifisert med en isolert simulering av alle prisoppslagene (riktige tall for alle lagringsvalg + fallback til basis for ukjent lagring).

## [1.21.4] – 2026-07-18

### Endret
- **Full oppdatering av telefonkatalogen (`js/phones.js`) for gjeldende kampanjeperiode.** 43 telefoner (opp fra 27) med posisjonsverifiserte priser per abonnementsnivå, hentet fra det nye prisarket. Nye modeller: Galaxy Z Fold8 Ultra/Fold8/Flip8, Galaxy S24, A56, A36, Pixel 9a, Pixel 9 Pro XL, Galaxy XCover6 Pro/XCover7/Xcover7 Pro, iPhone 14 Plus, samt to nye merker – **Doro** og **Nokia** (enkle feature-/rimelige telefoner). Alle 43 rader ble maskinelt verifisert mot kilden (ingen abonnementspris overstiger kontantprisen; «Ung 10 GB»/«Junior 10 GB»/«Fast 10 GB» og «X Ung»/«X Start» bekreftet identiske overalt, som appens eksisterende nivå-modell forutsetter).
  - Telefonnavn forenklet (droppet redundant «Samsung»/«Google»-prefiks, matcher Apple-konvensjonen som allerede var uten «Apple»-prefiks) – `js/phonespecs.js` sine 27 eksisterende spec-nøkler er omdøpt tilsvarende, så ingen mister specs-dataen sin.
  - **«Telia X + Viaplay Total»** har nå sin egen abonnementspris koblet inn i telefonkonfiguratoren (`PHONE_TIER_SUB_NAME`), siden produktet nå faktisk finnes i `data.js` (se forrige versjon).
  - Coachens kunnskapsbase oppdatert med noen av de nye modellene.

## [1.21.3] – 2026-07-18

### Endret
- **Aktiv halvpris-kampanje på Junior-abonnement.** Junior 1 GB og Junior 10 GB har nå kampanjepris (64,5 kr / 114,5 kr i stedet for normalt 129 kr / 229 kr) i kalkulatoren, hurtigregistreringen og produkttabellen, så kundene får riktig pris mens kampanjen pågår. Provisjonen er upåvirket. **Ukjent sluttdato** – flagget i ROADMAP.md, husk å sette prisen tilbake når kampanjen er over. Coachens kunnskapsbase oppdatert tilsvarende.

## [1.21.2] – 2026-07-18

### Lagt til
- **Nytt abonnement: Ung 10 GB** (299 kr, familierabatt 30, for kunder under 30 år) i produktlisten, tilbehørs- og telefon-nivåmappingen. **Provisjonen er ikke oppgitt ennå** – står som 0 til arket kommer (samme mønster som «1 gb»).

### Endret
- **X + Viaplay-pakken omdøpt og reprisert:** «X + Viaplay» (1148 kr) → **«Telia X + Viaplay Total»** (1099 kr), samme provisjon. Oppdatert i produktlisten, tilbehørs-nivåmappingen og enhetstestene.

## [1.21.1] – 2026-07-18

### Lagt til
- **Flere tips i «Dagens innsikt».** Den regelbaserte, lokale innsiktsmotoren på dashbordet (ingen AI, ingen kostnad, virker offline) har fått tre nye regler: **upgrade-tempo** (manglet helt før – kun gross og Trygg ble sjekket mot skjema), et **historisk ukedagsmønster** («du selger typisk mer/mindre på [ukedag]», basert på egne salgsdata), og en **MBB-påminnelse** hvis ingen MBB er solgt denne måneden. Viser nå de tre viktigste tipsene i stedet for to.

## [1.21.0] – 2026-07-18

### Lagt til
- **Coachen har nå et ekte innvendingshåndterings-rammeverk, ikke bare forklaringer.** Leder testet «det er for dyrt» og fikk et svar som forklarte pris-per-dag grundig, men aldri prøvde å lukke salget – og den skrev til og med ut plassholdertekst («[pris ÷ 30]») bokstavelig. Lagt til et generelt rammeverk (isolér innvendingen → anerkjenn → reframe til verdi kunden bryr seg om, ikke bare kr/dag → **lukk ALLTID med et konkret trial close-spørsmål** → tilby et mindre skritt ved fortsatt nøling), og skjerpet både kunnskapsbasen og system-prompten: svar skal være korte og handlingsrettede, stille ett avklarende spørsmål FØR en lang forklaring når konteksten mangler, og aldri sitere plassholdere bokstavelig.

## [1.20.5] – 2026-07-18

### Rettet
- **Coachen siterte innvendingseksempler ordrett i stedet for å resonnere.** Fanget da leder testet «det er for dyrt» og fikk mitt utkast-eksempel nesten ord-for-ord tilbake – inkludert en regnefeil (Trygg er ~3,6 kr/dag, ikke «2 kr» som sto i utkastet). Rettet feilen, og lagt til en eksplisitt regel: eksemplene i kunnskapsbasen er ILLUSTRASJONER av en teknikk, ikke ferdige svar å sitere – coachen skal alltid tilpasse til det faktiske abonnementet/produktet og regne selv (kr/mnd ÷ 30), ikke gjenbruke tall fra et annet eksempel.

## [1.20.4] – 2026-07-18

### Endret
- **Coachens tone og innvendingssvar er finpusset.** Leder bekreftet: coachen skal være en **peppende kompis** – engasjert, litt energi, feirer gode grep – i stedet for nøytral/rett-på. System-prompten og kunnskapsbasen er justert. Innvendingshåndteringen (for dyrt/må tenke/har allerede forsikring/trenger ikke Trygg/vil ikke binde meg) er bekreftet og skjerpet med konkrete eksempeltall.

## [1.20.3] – 2026-07-18

### Rettet
- **Telefon i coach-tilbud fungerer nå.** Telefonkatalogen krever eksakte navn (f.eks. «Google Pixel 10»), men coachen skrev ofte løsere navn («Pixel 10», «Samsung S26») – da forsvant telefon-linja. Lagt til løs modell-matching (`resolvePhoneName`) som slår opp riktig katalognavn uansett, og ga coachen dagens modell-liste. Tilbudskortet viser nå det korrekte modellnavnet.

## [1.20.2] – 2026-07-18

### Lagt til
- **Coachen kan legge telefon i tilbudet.** Be coachen legge en telefon på en abonnementslinje, så viser tilbudskortet telefonen med pris og delbetaling – hentet fra appens «Telefoner»-data (som roterer per periode), ikke fra AI-en. Telefon gir ingen provisjon, og «Åpne i Tilbudskalkulatoren» tar telefonen med videre. En ukjent modell viser ingen (feil) telefonpris i stedet for «kr 0».

## [1.20.1] – 2026-07-18

### Endret
- **Coachen bygger smartere tilbud.** To justeringer basert på lederens innspill: (1) den defaulter nå til **X Basis** (evt. X Start) i tilbud i stedet for X Max – valgt for å *close*, og tilbyr heller oppgradering som et valg; (2) den legger **ikke lenger Telia Trygg automatisk inn i pakka**, men foreslår Trygg (og forsikring) som et eget mersalg *etter* at grunntilbudet er presentert.

## [1.20.0] – 2026-07-18

### Lagt til
- **Coachen viser tilbud som et ekte kalkulator-kort.** Når du ber coachen lage et tilbud, sender den nå en maskinlesbar pakke, og **appens egen kalkulator** (ikke AI-en) regner ut familierabatt og månedspris og tegner det kundevennlige tilbudskortet rett under svaret – så tallene er alltid riktige. Kortet har en **«Åpne i Tilbudskalkulatoren»**-knapp som legger pakka rett i kalkulatoren, klar til å justere og vise kunden. JSON-en vises aldri som tekst.

## [1.19.0] – 2026-07-18

### Lagt til
- **AI-coachen lager tilbud/pakker for deg.** Beskriv en kunde i chatten – f.eks. «familie på 3, to foreldre med mye data + barn under 16» – så foreslår coachen en konkret pakke med riktige abonnement, familierabatt regnet ut linje for linje med månedssum, og forslag til mersalg (Telia Trygg, forsikring, hjemmenett/FWA). Den henviser til Tilbudskalkulatoren for eksakt utregning og kundevennlig visning. Ny forslags-chip på coach-siden. La inn en «bygg tilbud»-oppskrift + regne-eksempel i kunnskapsbasen.

## [1.18.7] – 2026-07-18

### Endret
- **Rettet: ingen familierabatt på FWA.** Coachen påsto feilaktig at trådløst bredbånd kvalifiserer for familierabatt. Kunnskapsbasen presiserer nå at familierabatt gjelder KUN mobilabonnement (ikke FWA/MBB/forsikring/Trygg/tilbehør), og system-prompten har fått en regel om å ikke overføre regler mellom produkter.

## [1.18.6] – 2026-07-18

### Endret
- Provisjon på enhetsforsikring i coachens kunnskapsbase: **20 kr for både Pluss og Skjerm forsikring**.

## [1.18.5] – 2026-07-18

### Endret
- **Coachen forstår nå gross vs. upgrade riktig.** Tidligere trodde den at upgrade betyr å gå opp til et større abonnement – feil. Riktig regel er nå lagt inn: **gross** = nytt nummer eller portering inn til Telia (binding uten betydning; FWA/MBB-opprettelse teller også), **upgrade** = binding av et eksisterende abonnement (uansett hvilket, ikke nødvendigvis større). Egen «Gross vs. Upgrade»-seksjon med eksempler, og system-prompten er oppdatert. La også inn provisjon på Pluss forsikring (20 kr).

## [1.18.4] – 2026-07-18

### Lagt til
- **Full Telia Trygg-kunnskap til coachen.** La inn hele innholdet fra Telia Trygg-siden: at det er en samlet trygghetspakke (ID-overvåking, passordhvelv, VPN/WiFi-vern, nettleser-/netthandel-/nettbank-vern, virusvern, SMS-svindelvern), og særlig de sterke forsikringene – ID-tyveriforsikring (rettshjelp inntil 3 mill, lønnstap 25 000, psykolog 10 timer, hele husstanden) og netthandelsforsikring (15 000/hendelse, også Finn/Tise) – pluss konkrete pitch-vinkler. Coachen kan nå forklare og selge Telia Trygg presist.

## [1.18.3] – 2026-07-18

### Endret
- **Presise forsikringspriser i coachens kunnskapsbase.** Skjerm- og Pluss-forsikring med konkrete månedspriser per mobilverdi (ny + brukt/«Like Fin»), bekreftet av leder.

## [1.18.2] – 2026-07-18

### Lagt til
- **Mer kunnskap til AI-coachen.** La inn i kunnskapsbasen: enhetsforsikring (Pluss vs. Skjerm, med prisnivå), Telia Sky, DataSIM/Tvillingkort, kontantkort (→ konverter til abonnement = upgrade), SDU/fiber, at Svitsj er avviklet, Telia Trygg-pitch («2 mnd gratis»), og starten på salgsprosessen (åpne med «Hva kan jeg hjelpe deg med?» + slå opp kunden i Salesforce tidlig). Coachen kjenner dermed langt mer av butikkens faktiske sortiment. (Flere detaljer fylles inn fortløpende.)

## [1.18.1] – 2026-07-18

### Endret
- **Rettet AI-coachens forståelse av Telia Trygg.** Coachen beskrev det feilaktig som mobil-/enhetsforsikring – Telia Trygg er en **ID-tyveri- og svindelbeskyttelse** (enhetsforsikring er et eget produkt). Kunnskapsbasen og system-prompten er korrigert. Første av flere forbedringer av coachens kunnskap.

## [1.18.0] – 2026-07-18

### Endret
- **AI-salgscoachen kjører nå på Cloudflare Workers AI** i stedet for Anthropic. Modellen (Llama 3.3 70B) kjører rett i Worker-en via `env.AI`-bindingen – **ingen ekstern API-nøkkel, ingen funds, gratis dagskvote**. Bakgrunn: Anthropic-kontoen kunne ikke fylles på. Alt annet er uendret for brukeren: samme chat-side, kunnskapsbase, dine-tall-kontekst og streaming. Svaret normaliseres nå server-side til et **leverandør-uavhengig format**, så vi kan bytte AI-leverandør igjen senere uten å røre frontend. `ANTHROPIC_API_KEY` trengs ikke lenger. (Modell kan overstyres med `COACH_MODEL`.)

## [1.17.4] – 2026-07-18

### Lagt til
- **AI-coachen «kan» nå butikkens salg og tjenester.** Ny kunnskapsbase (`functions/api/coach-knowledge.js`) som sendes med coachen hver gang: mobilabonnementene med priser og provisjon, Telia Trygg, FWA- og MBB-provisjon, familierabatt, bindingsregelen og gode innvendingssvar – hentet fra `js/data.js`, så tallene er korrekte. Coachen gir dermed konkrete, riktige råd om hvor provisjonen ligger og hvordan man løfter et salg, i stedet for generelle tips. Lederen «lærer opp» coachen videre bare ved å redigere fila (seksjoner for pitch-rammeverk, egne innvendinger og butikkens prioriteringer står klare til å fylles ut) – ingen modell trenes. Eksakte kampanjepriser på tilbehør/telefoner holdes fortsatt i appen (roterer per periode).

## [1.17.3] – 2026-07-18

### Endret
- **AI-coachen sier tydeligere ifra ved API-feil.** Skiller nå mellom «ikke nok kreditt på AI-kontoen» (henviser til Anthropic → Billing), «API-nøkkelen ble ikke godtatt», rate limit, og andre feil – i stedet for et generisk «AI-tjenesten svarte med en feil». Gjør oppsett/feilsøking lettere.

## [1.17.2] – 2026-07-18

### Endret
- **AI-coachen fungerer nå på den faktiske hosten.** selgerflyt.com kjøres som en Cloudflare **Worker** med statiske filer (ikke et Pages-prosjekt), og en slik Worker ignorerer `functions/`-mappa – derfor ga `/api/coach` 404. Lagt til et lite Worker-script (`worker.js` + `wrangler.jsonc`) som fanger `/api/coach` og kjører coach-funksjonen, mens alt annet serveres som statiske filer nøyaktig som før. Ingen endring i selve app-oppførselen. (Krever fortsatt `ANTHROPIC_API_KEY` som Secret i Cloudflare – se `AI-COACH-OPPSETT.md`.)

## [1.17.1] – 2026-07-18

### Endret
- **Tydeligere feilmeldinger i AI-salgscoachen.** Hvis coachen ikke svarer, sier appen nå *hvorfor* i stedet for et vagt «Noe gikk galt»: den skiller mellom at backend-funksjonen ikke er deployet (HTTP 404 / uventet svar), at API-nøkkelen mangler på serveren, og at du ikke er innlogget. Gjør oppsett/feilsøking mye lettere. Ingen funksjonell endring i selve coachen.

## [1.17.0] – 2026-07-18

### Lagt til
- **AI-salgscoach.** Ny side under «Verktøy & oppslag» (og eget kort i hub-en) der du kan chatte med en AI-salgscoach på norsk. Spør om mersalg (særlig Telia Trygg og tilbehør), gode åpningsreplikker, hvordan du håndterer innvendinger som «det er for dyrt», og hvordan du ligger an mot månedsmålet – coachen kjenner **dine egne tall** (gross/upgrade/Trygg/FWA mot mål) og gir konkrete, praktiske råd. Svaret streames inn mens det skrives, og du kan starte med et forslag eller skrive ditt eget spørsmål. Samtalen lagres ikke, og coachen ber aldri om kundens personopplysninger.
  - **Personvern/sikkerhet:** Anthropic-API-nøkkelen ligger **kun** server-side i en Cloudflare Pages-funksjon (`functions/api/coach.js`) – aldri i frontend eller i git (samme regel som `sb_secret_`-nøkler). Kun innloggede brukere kan bruke coachen (Supabase-sesjonen verifiseres server-side). Frontend snakker bare med `/api/coach` på samme domene, så CSP-en dekker det uendret.
  - **Oppsett (må gjøres én gang av mennesket):** legg til `ANTHROPIC_API_KEY` som en «Environment variable» i Cloudflare Pages (Production + Preview), og sørg for at Pages Functions er på. Se `AI-COACH-OPPSETT.md`.

## [1.16.2] – 2026-07-17

### Endret
- **supabase-js er nå selvhostet** (`js/vendor/supabase.min.js`, v2.110.7) i stedet for å lastes fra et tredjeparts-CDN ved hver sidelast. Den vanlige innloggingsstien laster dermed ingen ekstern kode – det lukker en supply-chain-sti og gjør appen robust mot CDN-nedetid (som ga innloggingstrøbbel tidligere). jsDelivr/unpkg beholdes kun som automatisk reserve hvis den lokale fila mot formodning skulle svikte. Ingen synlig endring for brukeren.

## [1.16.1] – 2026-07-17

### Endret
- **Tydelig beskjed når økten utløper.** Hvis innloggingen din faktisk utløper midt i bruk (token kan ikke fornyes), viser appen nå et banner øverst – «Økten din har utløpt. Logg inn på nytt» – med en knapp, i stedet for bare et stille «Synk feilet». Dataene på enheten din er trygge, og usynkede endringer synkes så snart du logger inn igjen (knappen logger deg ut uten å slette noe lokalt). Kun ekte token-utløp utløser dette – forbigående nett-hikke gjør det ikke.

## [1.16.0] – 2026-07-17

### Lagt til
- **Regionsmål og konkurranser på tvers (fase 3 – region-systemet er komplett).** På Region-siden kan regionslederen nå sette et **felles månedsmål for hele regionen** (gross/upgrade/trygg/FWA) og se progresjonen mot butikkenes samlede tall, og starte **konkurranser på tvers av butikkene** («Flest Trygg denne uka» o.l.) med live stilling som viser hvilken butikk hver selger hører til. Provisjon vises aldri på region-nivå. Alt er gated til regionslederen (verifisert mot ekte Postgres: selgere og andre regioners ledere blokkeres av RLS). **Krever schema-rekjøring** (nye tabeller `region_goals`/`region_challenges` + RPC-en `region_challenge_board`).

## [1.15.0] – 2026-07-17

### Lagt til
- **Region-dashboard (fase 2).** Nå kan en regionsleder faktisk bruke region-systemet i appen. Ny **«Region»-side** (dukker opp i menyen kun for regionsledere) med: regionens navn + delbar region-kode (kopier-knapp) + gi-nytt-navn, en månedsvelger, en oversikt over **butikkene i regionen** med samlede nøkkeltall (gross/upgrade/trygg/FWA) og selgerantall, og et **leaderboard PÅ TVERS** av alle butikkene – hver selger rangert etter poeng med butikk-kolonne. **Provisjon vises aldri her**, heller ikke for regionslederen. Er du ikke regionsleder ennå, kan du opprette en region fra siden.
- **Region-kort på Butikk-siden.** Butikkledere kan knytte butikken sin til en region med region-koden (eller løsne den igjen); alle i butikken ser hvilken region butikken hører til.
- Ny klientmodul `js/region.js` (`Region`) og RPC-en `region_leaderboard(p_month)` (aggregerer på tvers av regionens butikker, uten provisjon). **Krever schema-rekjøring** (for `region_leaderboard`).

## [1.14.9] – 2026-07-17

### Lagt til
- **Regioner – fundament (schema).** Første steg mot et region-system over butikkene: en «regionsleder» kan overvåke flere butikker samlet. Denne leveransen er datamodellen + sikkerheten (ingen UI ennå – den bygges oppå i neste runde): nye tabeller `regions` + `region_managers`, `shops.region_id`, og RPC-er `create_region`/`rename_region`/`set_shop_region`/`clear_shop_region`/`region_info`/`region_shops`/`my_shop_region`. En region har en hemmelig `region_code` (som butikkens invitasjonskode) som butikkledere bruker for å knytte butikken sin til regionen. Alt innsyn på tvers av butikker går via SECURITY DEFINER-RPC-er som stripper private felt (join-koder/e-post/provisjon) – de eksisterende butikk-RLS-ene er urørt, så en regionsleder kan aldri lese en annen butikks rådata. Verifisert mot ekte Postgres (regionsleder ser kun sin egen region, butikkleder-gating, selger/annen region/anon blokkert, region_code aldri lekket til medlemmer, idempotent). **Krever schema-rekjøring.**

## [1.14.8] – 2026-07-17

### Endret
- **Toast kan nå sveipes bort både til siden og opp/ned.** Tidligere kunne bekreftelses-toasten kun sveipes horisontalt for å lukkes; nå fungerer også vertikal sveip (opp eller ned), med samme fart/momentum-følelse. Den dominante retningen låses når du starter dratt, så gesten ikke hopper mellom akser.

## [1.14.7] – 2026-07-17

### Lagt til
- **Åpningstider på butikken.** Butikklederen (og assisterende leder) kan nå føre butikkens åpningstider i «Butikkinfo»-kortet på Butikk-siden – én linje per dag. Tidene er synlige for hele teamet i topp-kortet, og vises på **visittkortet** med en klokke-ikon-rad (under adressen). Speiler telefon/adresse-mønsteret: `set_shop_hours`-RPC (kun leder), tom tekst nullstiller, verifisert mot ekte Postgres. **Krever schema-rekjøring.**

## [1.14.6] – 2026-07-17

### Endret
- **Intern ytelse:** `allTableRows()` (som slår sammen lokale tabellrader med lederførte dagstall) memoiseres nå på referanse-identitet, så den bygges én gang i stedet for ~15 ganger per skjermtegning. Ingen synlig endring – kildene reassignes alltid ved endring, så tallene er alltid ferske. Rein opprydding uten funksjonell forskjell.

## [1.14.5] – 2026-07-17

### Lagt til
- **«Beste tilbud»-finner i kalkulatoren (fase C).** Når en abonnementslinje har telefon og/eller tilbehør, foreslår appen nå automatisk et høyere abonnement der maskinvaren blir billigere – f.eks. «Ta Telia X Max til Kari: telefonen og tilbehøret blir 1 000 kr billigere – kun 100 kr/mnd mer.» Forslaget velger det minste fornuftige hoppet (best netto over bindingen), og **«Bytt»**-knappen løfter linjen til det nivået med ett klikk (telefon/tilbehør henger med og reprises automatisk). Er oppgraderingen billigere totalt over bindingsperioden, merkes det grønt. Vises kun for selgeren – aldri i kundevisningen, aldri med provisjon.

## [1.14.4] – 2026-07-17

### Lagt til
- **Tilbehør i Tilbudskalkulatoren (fase B).** Hver abonnementslinje kan nå få tilbehør på samme måte som telefon: trykk **«+ Tilbehør»**, og velgeren viser kampanjeprisene som gjelder akkurat for det abonnementet og kundetypen (gross = ny kunde, upgrade = eksisterende) – billigst først, med «Nesten gratis»-kupp øverst. Tilbehøret vises i tilbudet med kampanjepris og **«spar X»** mot full pris (både i selgerkortet og i kundevisningen – aldri provisjon), og legges sammen i «Tilbehør i dag (engangs)». Bytter du linjen mellom gross/upgrade, oppdateres tilbehørsprisen automatisk; er tilbehøret ikke i kampanje for det nivået, merkes det tydelig. Datakilden er `accessoryOffers` i `js/offers.js` (roteres per kampanjeperiode).

## [1.14.3] – 2026-07-17

### Lagt til
- **Vis kunden flere tilbud side om side.** I Tilbudskalkulatoren kan selgeren nå bygge en pakke og trykke **«+ Alternativ»** for å lagre den som et alternativ, bygge en ny pakke, og gjenta. «Vis kunden» viser da alle alternativene som egne kort ved siden av hverandre (kolonner), så kunden ser valgene sammenlignet – f.eks. «med telefon» vs. «uten», eller X Basis vs. X Max. Hvert alternativ vises med sin egen totalpris per måned (aldri provisjon). Alternativene listes i selgervisningen med sammendrag og kan fjernes enkeltvis eller tømmes. Uten alternativer fungerer «Vis kunden» som før (den gjeldende pakka).

## [1.14.2] – 2026-07-16

### Lagt til
- **Liten «text-effect» på dashbord-hilsenen.** «God morgen, [navn]!» toner nå inn ord for ord (mykt blur→skarpt, stagget) når du åpner dashbordet – en subtil detalj på linje med resten av appens innslagsanimasjoner. Spilles kun ved sideinngang (ikke ved KPI-oppdateringer), og respekterer «redusert bevegelse».

## [1.14.1] – 2026-07-16

### Endret
- **Caselisten er lettere.** Butikkmedlemslista (til «Tildelt»-velgeren) hentes nå fra en 60s-cache i stedet for et databasekall ved hver re-render av caselisten – den kjøres ofte (realtime, navigasjon, filter/søk), så dette fjerner en haug unødvendige spørringer. Cachen nullstilles ved utlogging.

## [1.14.0] – 2026-07-16

### Lagt til
- **Leder kan bekrefte nye selgere i appen.** Telias e-postfilter leverer ikke bekreftelses-e-posten til @telia.no, så nye selgere ble sittende fast (nødløsning: kjøre SQL manuelt i Supabase). Nå registrerer den nye selgeren seg med sin inviterte e-post, og butikklederen trykker **«Bekreft konto»** ved navnet på Butikk-siden – da kan selgeren logge rett inn (og blir automatisk med i butikken). Stramt sikret: kun leder, kun e-post med en ventende invitasjon til lederens egen butikk, kun tillatt domene. Verifisert mot ekte Postgres. Registrerings-skjermen har fått en hint om løsningen. **Krever schema-rekjøring.**
- **ROADMAP.md oppdatert** med alt gjenstående arbeid (sikkerhet, ytelse, sesongdata-rotasjon, fase B/C, feature-backlog).

## [1.13.9] – 2026-07-16

### Fikset
- **Bakgrunnssynk sletter ikke lenger det du taster.** Den periodiske synken (hvert minutt) kunne bygge om siden mens du skrev – og dermed tømme f.eks. provisjonskalkulatoren eller et målfelt du holdt på med. Nå utsettes bakgrunns-rebygget mens du er aktiv i et felt (dataene lagres uansett, og vises ved neste render).
- **Butikkdata blinker ikke til feil tall.** Bakgrunnsoppdateringen kjørte `Team.load()` parallelt med den andre synk-stien, så to samtidige hentinger kunne blanke felter et øyeblikk. Nå går den gjennom den samme «én om gangen»-køen.
- **Korrupt lokal lagring skjules ikke lenger.** Ved en ødelagt localStorage-verdi logges det tydelig og rådataene tas vare på (i stedet for å bli stille overskrevet); skydataene gjenoppretter uansett.

## [1.13.8] – 2026-07-16

### Fikset
- **Siste datataps-luke i skysynken lukket (optimistisk låsing).** Fletting alene tettet ikke det smale vinduet der to enheter/faner leste sky-tilstanden samtidig og begge skrev – den sist ankomne kunne fortsatt overskrive et salg den andre nettopp la til. `user_state` har nå en `version`-kolonne, og skrivingen er en **compare-and-swap**: skriv kun hvis versjonen ikke har endret seg siden vi leste; ellers les på nytt og prøv igjen (fletting bevarer begge enheters salg). Verifisert mot ekte Postgres. Bakoverkompatibelt – faller tilbake til gammel oppførsel til `version`-kolonnen finnes. **Krever schema-rekjøring.**

## [1.13.7] – 2026-07-16

### Fikset
- **Datofeil på kvelden (UTC-skift).** Trendgrafen, rapporten (dag/uke) og «Dagens fokus» brukte UTC-datoer i bøtte-/dato-nøklene, så salg registrert sent på kvelden kunne havne på feil dag. Nå brukes lokal dato overalt (`localISO()` + lokal fokus-dato).
- **Sikkerhet: tettet anon-hull.** RPC-batchen revokeres nå `from public, anon` (ikke bare `anon`), og de interne hjelpefunksjonene (`user_shop` m.fl.) revokeres fra public/anon – de var ellers et «hvilken butikk hører denne brukeren til?»-orakel for hvem som helst med den offentlige nøkkelen. Verifisert mot ekte Postgres at RLS fortsatt virker. **Krever schema-rekjøring.**

### Lagt til
- **Butikkadresse.** Butikken har nå en adresse (i tillegg til telefon) som leder setter i «Butikkinfo»-kortet på Butikk-siden, synlig for hele teamet og brukt automatisk på visittkortet. `set_shop_address`-RPC verifisert mot ekte Postgres. **Krever schema-rekjøring.**
- **«Utløpt kampanje»-varsel.** Når sesongperioden er passert (Sommer '26 → 16.08), viser Tilbud & kampanjer og Telefoner-siden et rødt varsel om at prisene kan være utdaterte – så du ikke siterer gamle tall til kunde.

### Endret
- **Tilbud & kampanjer starter nå på X Max** i abonnement-velgeren, så «så mye gratis»-effekten (flest 1,-kupp) er synlig med en gang.

## [1.13.6] – 2026-07-15

### Lagt til
- **Ny «Kort»-visning på Tilbud & kampanjer (standard).** I stedet for å lete i en bred pristabell velger du nå **kundens abonnement** øverst, og tilbehøret vises som **kort sortert billigst først** – med gratis-kuppene (1,-) løftet fram i gull («Nesten gratis»). Abonnement-velgeren viser hvor mange kupp hvert nivå gir (f.eks. «X Max · 14× 1,-»), så verdien av et større abonnement er synlig med én gang. Nye **kategori-chips** og et **«Kun kupp (1,-)»-filter** gjør det raskt å finne det rette. Den gamle matrisen er beholdt som **«Tabell»-visning** (bryter øverst).

## [1.13.5] – 2026-07-15

### Endret
- **Telefoner-siden er tilbake til prisliste-følelsen.** I stedet for den delte «liste + fast ark»-visningen er det nå en ren, søkbar telefonliste i full bredde – klikk en telefon så **morpher** raden til et priskort (som den gamle prislista). Nytt: kortet har en **fane-bryter «Pris & delbetaling» | «Spesifikasjoner»** (pris som standard), så du får både pris/delbetaling og full spec-oppslag på samme kort. Sammenlign-funksjonen (inntil 3 telefoner) er beholdt.

## [1.13.4] – 2026-07-15

### Endret
- **Visittkortet bruker nå den offisielle Telia-logoen** (`assets/telia-logo.png`) i stedet for den midlertidige gjengivelsen. Logoen vises hvit på det lilla kortet (CSS-filter), og de gjennomsiktige stripene i core-symbolet slipper den lilla bakgrunnen gjennom.

## [1.13.3] – 2026-07-15

### Lagt til
- **Visittkort-side i Verktøy & oppslag.** Ny side (`#visittkort`) med butikkens visittkort – logo, butikknavn, telefon og adresse – klart til å skrive ut i standard visittkortstørrelse (85 × 55 mm) og dele ut til kunder. Butikknavn og telefon hentes automatisk fra butikken din (settes på Butikk-siden). «Skriv ut»-knappen isolerer kortet på arket (firkantet, farge helt ut til kanten). Logoen er en merkevaretilpasset gjengivelse – bytt inn den offisielle Telia-logoen ved endelig trykk.

## [1.13.2] – 2026-07-15

### Lagt til
- **Butikktelefon på Butikk-siden.** Butikken har nå et telefonnummer som vises for hele teamet øverst på Butikk/Team-siden. Butikkleder (og assisterende leder) setter/endrer/fjerner det i et eget «Butikktelefon»-kort. Verifisert mot ekte Postgres (kun ledere kan skrive, alle medlemmer kan lese, andre blokkert). **Krever schema-rekjøring** (`supabase/schema.sql` – ny `shops.phone`-kolonne + `set_shop_phone`-RPC).

## [1.13.1] – 2026-07-15

### Endret
- **Prisen er nå front og center på Telefoner-siden.** Etter tilbakemelding om at prisene ble rotete å finne (gjemt bak spec-arket og en knapp): velger du en telefon, viser arket nå **prisen med en gang** via en fane-bryter **«Pris & delbetaling» | «Spesifikasjoner»** med **pris som standard**. Abonnement + delbetaling velges rett i arket – ingen dialog å åpne. «Spesifikasjoner» er ett klikk unna på samme side.

### Fjernet
- **Telefon-pris-dialogen (morph/`#phoneDialog`).** Priskonfiguratoren er flyttet inline i arket, så den frittstående morph-dialogen er borte (kalkulatorens egen telefonvelger er uendret).

## [1.13.0] – 2026-07-15

### Endret
- **«Telefoner & priser» og «Telefon-specs» er slått sammen til én «Telefoner»-side.** Slutt på å gjette hvilken av to sider som har pris kontra specs: nå er det én søkbar telefonliste (med «fra kr/md»-teaser) → ett ark som viser spesifikasjonene, og en «Se pris og delbetaling»-knapp (med «fra kr/md») som åpner priskonfiguratoren. Sammenlign-funksjonen (inntil 3 telefoner) er beholdt. Verktøy & oppslag-huben har nå ett «Telefoner»-kort i stedet for to.

### Fjernet
- **Den frittstående telefonkatalog-siden (`#mobiler`).** Funksjonaliteten lever videre på den sammenslåtte siden; gamle `#mobiler`-lenker og -bokmerker rutes automatisk dit. Priskonfigurator-dialogen er uendret.

## [1.12.3] – 2026-07-15

### Endret
- **Prosent-chippen viser nå «til dags dato», ikke hele månedsmålet.** På live inneværende-måned-celler (dashbordet, Mine mål, Butikkens mål inneværende måned, «Dine mål» på Butikk-siden) er tallet nå hvor du ligger an mot forventet tempo så langt i måneden – **100 % = akkurat i rute**, over 100 % = foran skjema, under = bak. Samme grunnlag som «foran/bak skjema»-teksten, så de to signalene er enige. Historiske måneder og profilmodalen viser fortsatt ren oppnåelse av månedsmålet (naturlig, siden måneden er ferdig). Framgangsbaren fyller fortsatt mot hele månedsmålet.

## [1.12.2] – 2026-07-15

### Lagt til
- **Prosentvis måloppnåelse i målcellene.** Alle målceller (dashbordet, Mine mål, Butikkens mål, profilmodalen og «Dine mål» på Butikk-siden) viser nå oppnåelsen i prosent oppe til høyre – f.eks. «62 %». Tallet kan gå over 100 % når målet er slått (baren stopper fortsatt på 100), og blir grønt når målet er nådd.

## [1.12.1] – 2026-07-15

### Lagt til
- **Nytt abonnement: 1 gb (219 kr/md).** Tilgjengelig i hurtigregistrering, pakkebygger, kalkulator og produktkatalogen. Provisjonssatsene er ikke oppgitt ennå og står som 0 – oppdater `js/data.js` når arket kommer. Ingen familierabatt (ikke med i butikkens rabattregler).

## [1.12.0] – 2026-07-02

GDPR-herdingspakke etter full kode-revisjon (se `GDPR-ETTERLEVELSE.md` §3b).

### Fikset
- **«Slett mine data» slettet ikke alt i skyen.** Pitch-økter og salgstabellen manglet tombstones og ble flettet tilbake fra sky-blobben i samme push. De deler nå tombstone-settet med salgene, så slettingen faktisk står seg – også mot gamle enheter.
- **Navnet ditt kunne overleve kontosletting.** Sto du som «Tildelt» på en kollegas case, ble navnet stående som tekst etter at kontoen var slettet. `delete_my_account()` nuller nå både tildelingen og navnet (verifisert mot ekte Postgres). **Krever schema-rekjøring.**

### Endret
- **«Last ned alle mine data» er nå komplett (art. 15/20).** Eksporten inkluderer i tillegg til lokal state også alle server-tabellene om deg: egne caser, kommentarer og bildevedlegg, coaching-planer og -observasjoner om deg, leder-førte dagstall, månedsjusteringer, mål/vakter og vaktdatoer – pluss kontometadata og personvern-bekreftelsen.
- **Utlogging rydder enheten.** Eksplisitt utlogging fjerner nå alle personlige data fra localStorage (salg, notater, case-kopi, «sett»-markører) – viktig på delte butikk-enheter. Tema beholdes; skydataene er urørt og hentes på nytt ved neste innlogging.
- **Personvern-bekreftelsen dokumenteres.** Ved registrering lagres tidsstempel + hvilken versjon av erklæringen som ble bekreftet (i kontoens metadata, med i data-eksporten). Teksten er omformulert fra «samtykker» til «har lest og forstått» – behandlingsgrunnlaget er ansettelsesforholdet/berettiget interesse (erklæringens §3), ikke samtykke.
- **Fontene er selvhostet.** Inter og Space Grotesk lastes nå fra `assets/fonts/` i stedet for Google Fonts – ingen IP-overføring til Google (kjent GDPR-tema i EU). CSP-en er strammet tilsvarende (`font-src 'self'`, Google-domenene fjernet).

## [1.11.3] – 2026-07-01

### Endret
- **Inviterte har nå egne tall per måned (juni og juli holdes adskilt).** Tidligere hadde en invitert selger bare ett felles talls­ett, så tall for én måned overskrev en annen. Nå lagres tallene per måned (ny tabell `shop_invite_numbers`), slik at du kan føre både juni- og juli-tall for en invitert uten at de blander seg. Måneds-velgeren i «Oppdater månedstall» viser riktig måneds tall, og ved første innlogging følger alle månedene med over som justeringer på riktig måned. Eksisterende inviterte-tall migreres automatisk til inneværende måned.

> **Krever schema-rekjøring i Supabase** (ny tabell + oppdatert `shop_leaderboard`/`claim_invite` i `supabase/schema.sql`): kjør hele filen på nytt i SQL Editor (idempotent, trygg å kjøre flere ganger).

## [1.11.2] – 2026-07-01

### Fikset
- **Inviterte forsvant når man bladde til en tidligere måned i «Oppdater månedstall».** Den nye måneds-velgeren (v1.11.1) viste ikke de inviterte (ventende) selgerne i historiske måneder, så lim-inn rutet dem feilaktig til Ekstrahjelp-raden. Inviterte vises nå på alle måneder (tallene deres er én felles bøtte som følger dem til de blir med), og lim-inn matcher dem igjen uansett valgt måned.

## [1.11.1] – 2026-07-01

### Lagt til
- **Rediger månedstall for tidligere måneder.** «Oppdater månedstall»-editoren på Butikk-siden har fått en måneds-velger (pil fram/tilbake). Lederen kan nå bla til en tidligere måned og rette opp tallene for hver selger + ekstrahjelp der – også med «Lim inn fra Excel / Claude»-funksjonen, som nå matcher navn og fyller feltene for den valgte måneden. Tallene lagres som justeringer for riktig måned (teller i leaderboard/mål/budsjett, aldri som rekord/milepæl), og «Neste måned» er sperret på inneværende måned.

## [1.11.0] – 2026-06-30

### Lagt til
- **Selvbetjent kontosletting (GDPR – rett til sletting, art. 17).** Ny «Slett konto permanent»-knapp på «Profil & konto» sletter hele kontoen og alt som er knyttet til den (profil, salg, leads, notater, caser, coaching) via en ny `delete_my_account()`-RPC. Funksjonen sletter `auth.users`-raden slik at cascade rydder alt brukereid, nuller ut `created_by`/`invited_by`/`observed_by`-referanser på butikkens/andres rader (FK uten cascade), og krever at en butikkleder først overfører lederrollen (siste medlem: butikken slettes). Verifisert mot ekte Postgres (leder-blokkering, cascade, referanse-nulling, selger beholder butikk, idempotent). «Slett mine data» beholdes for å tømme innhold uten å slette kontoen.

> **Krever schema-rekjøring i Supabase** (ny funksjon i `supabase/schema.sql`): kjør hele filen på nytt i SQL Editor (idempotent).

## [1.10.2] – 2026-06-30

### Lagt til
- **Endre synlighet på caser etter opprettelse.** Caseeieren kan nå endre hvem som ser en case fra case-dialogen – bytte mellom «Bare meg», «Hele butikken» og «Bestemte personer», og justere hvilke personer den deles med – uten å måtte lage casen på nytt. Endringen lagres med «Lagre synlighet» og varsler teamet som vanlig aktivitet. Kun eieren (i en butikk, ikke på arkiverte caser) ser editoren.

## [1.10.1] – 2026-06-30

### Endret
- **Dataminimering av kundeopplysninger (GDPR).** Kundefeltet på salgsskjemaet oppfordrer nå til klokkeslett/initialer (ikke fullt navn eller personnummer), «Hvem?»-feltene i pakkebygger/kalkulator ber om fornavn/initialer, og opplasting av case-bilder advarer eksplisitt mot legitimasjon, kontrakter og personnummer. Reduserer mengden kundePII som lagres.

## [1.10.0] – 2026-06-30

### Lagt til
- **Personvernerklæring (GDPR).** Ny fullskjerms personvernerklæring tilgjengelig både før og etter innlogging – fra login-skjermen, sidemenyen og «Profil & konto». Beskriver hvilke opplysninger som behandles, formål, tilgang, lagring, databehandlere og brukerens rettigheter.
- **Samtykke ved registrering.** Nye brukere må aktivt godta personvernerklæringen (avkrysning med lenke) før konto kan opprettes; registrering blokkeres til boksen er huket av.
- **Dine rettigheter på «Profil & konto».** «Last ned alle mine data» (innsyn/dataportabilitet – samler konto, profil, salg/leads, mål og notater i én JSON) og «Slett mine data» (fjerner profilbilde, «om meg», salg, leads og notater lokalt og i skyen, med tombstones så skyfletting ikke gjenoppretter dem; krever bekreftelse).

## [1.9.1] – 2026-06-30

### Endret
- **iPhone 17, 17 Pro og 17 Pro Max: AirPods 4 er fjernet som inkludert gave i telefonkatalogen** («Telefoner & priser»). Forrige fjerning (v1.8.3) gjaldt kun kampanjekortet på «Tilbud & kampanjer»; `bonus`-feltet lå fortsatt på de tre 17-modellene i `js/phones.js` og viste «Får med AirPods 4» i prislista/konfiguratoren. Samsungs Buds-gaver er uendret.

## [1.9.0] – 2026-06-30

### Lagt til
- **Dagens innsikt – lokal salgscoach (dashbordet).** Nytt kort som regner ut konkrete, personlige tips fra dine egne tall: nesten-i-mål-dytt, lav Trygg-attach, bak skjema på gross/Trygg, FWA-påminnelse og «ta dagens første salg». Ingen server/kostnad, virker offline. Bygget som en utvidbar regelliste (`INSIGHT_RULES`) så en ekte AI-coach kan kobles på senere.
- **Mål-/lønnssimulator («Hva skal til?», Mine mål).** Skriv inn hvor mange flere du tror du rekker ut måneden, og se projisert måloppnåelse per KPI + estimert provisjon ved månedsslutt. Steppere, live oppdatering uten å miste fokus, og «Nullstill».
- **Ukesoppsummering.** Kort, personlig «din uke»-recap (gjenbruker recap-overlayet) som dukker opp ved første besøk i en ny uke (mandagsrullering) når forrige uke hadde salg – totaltall, KPI-er + beste dag, og provisjon med endring mot uka før. Månedsrecap har forrang. Manuell «Se ukesoppsummering»-knapp på Mine mål.
- **Storskjerm / kiosk-modus (Butikk-siden).** Fullskjerms «butikkens puls» til en skjerm i butikken: dagens samlede KPI-er, månedens leaderboard med avatarer, målprogresjon og en siste-salg-ticker (leder). Live klokke + skånsom auto-oppdatering hvert 45. sekund; Escape/lukk avslutter, valgfri ekte fullskjerm. Provisjon vises aldri (privat).

### Endret
- **Teknisk: ren salgs-/provisjonslogikk flyttet til `js/calc.js`** (`saleCounts`, `itemCommission`, `quickCommission`, `basketPricing`, `itemsSummary`, `fwaLabel`, `mbbLabel`) – trukket ut av den store `app.js` så den kan enhetstestes uten nettleser. Første trygge steg i en gradvis oppdeling; ingen funksjonell endring.
- **Teknisk: enhetstester for provisjonsmatten** (`tests/calc.test.mjs`, `node --test`, ingen byggesteg) som dekker provisjon, familierabatt og at `saleCounts()` speiler `public.sale_counts()` i schema.sql.

## [1.8.3] – 2026-06-29

### Endret
- **iPhone 17-serien: AirPods 4 er ikke lenger med på kjøpet.** Gaven er fjernet fra kampanjekortet på «Tilbud & kampanjer»-siden; spar-beløpet (kr 1 200) og månedsprisen er uendret.

## [1.8.2] – 2026-06-29

### Endret
- **«Registrerte salg» er redesignet som kortfeed.** Tabellen er erstattet av datogrupperte kort med farget venstrekant per salgstype (grønn = Gross, lilla = Upgrade, blå = Trygg, oransje = FWA, grå = Lead). Kunde og selger (butikk-modus) vises i kort-metaraden; Trygg-tillegg merkes som blå badge. Pakkesalg viser antall linjer og kan ekspanderes med «N linjer ▾»-knappen for å se enkeltlinjene med produktnavn, hvem og provisjon. Provisjon og rediger/slett-knapper beholdes.

## [1.8.1] – 2026-06-29

### Lagt til
- **Ledere kan arkivere og slette caser.** Butikkleder og assisterende leder ser nå arkiver- og slette-knappen på alle delte (butikk/person) caser i sin butikk, ikke bare egne. De kan også slette kommentarer og bildevedlegg på disse casene. Privat-caser til andre ansatte er fortsatt utilgjengelige for ledere (de er usynlige). **Krever schema-rekjøring** (oppdaterte RLS-policyer for `cases`, `case_comments` og `case_attachments`).

## [1.8.0] – 2026-06-29

### Lagt til
- **Provisjonsmodell på Rapport-siden.** Nytt kort viser butikkens oppnåelse per KPI (Gross/Upgrades/Trygg/FWA) og tilhørende provisjonsrate: under 90 % → 0 %, 90 % → 30 %, 100 % → full provisjon, 120 %+ → 20 % bonus. Lineær interpolering mellom trinnene.
- **Provisjonskalkulator.** Hver selger kan legge inn provisjon per KPI-type og se forventet utbetaling basert på butikkens KPI-oppnåelse. «Hent fra registrerte salg»-knapp fyller inn automatisk fra månedens salgsdata.

## [1.7.9] – 2026-06-29

### Fikset
- **Tall i «Oppdater månedstall» ble nullstilt mens man redigerte.**
  Periodiske bakgrunnsoppdateringer (`refreshTeamUI`) rebuildet HTML og
  slettet uferdige feltverdier. Nå settes en `teamDirty`-guard mens et felt
  har fokus, og siden bygges ikke om før brukeren er ferdig å skrive.

## [1.7.8] – 2026-06-29

### Lagt til
- **Poengsystem i leaderboardet.** Gross teller 2 poeng, Upgrades og Trygg 1 poeng
  hver. «Poeng»-kolonnen vises i begge leaderboard-visningene (dashbord og
  Butikk/Team) og leaderboardet sorteres nå etter poeng (gross er tiebreaker).

## [1.7.7] – 2026-06-29

### Endret
- **iPhone 17, 17 Pro og 17 Pro Max: oppdaterte telefonpriser med sommerkampanjerabatter.**
  Nye telefonrabatter: 10 GB −1000, X Start −1500, X Basis −2000, X Max −2500,
  X Max Pluss −2900. Fullpris og 5 GB uendret.

## [1.7.6] – 2026-06-29

### Fikset
- **«Lim inn»-panelet fylte ikke inn tall for inviterte/ventende selgere.**
  Inviterte selgere bruker `mni_`-prefiks i tabellen, men lim-inn-funksjonen
  prøvde alltid `mn_`. Navnematch traff riktig, men verdiene forsvant stille.
  Nå brukes riktig prefiks avhengig av om selgeren er invitert eller aktiv.

## [1.7.5] – 2026-06-29

### Lagt til
- **«Lim inn fra Excel / Claude»-panel i «Oppdater månedstall».** Lederen kan
  lime inn tekst med selgernes totaltall (Navn · Gross · Upgrade · Trygg · FWA,
  tab-separert) – appen matcher navn og fyller feltene automatisk. Hensikten er
  å gjøre daglig oppdatering fra Excel-arket raskere: send bildet til Claude,
  kopier teksten Claude genererer, lim inn og lagre.

### Endret
- Kortet heter nå «Oppdater månedstall» (tidligere «Juster butikkens tall») og
  har en kortere, tydeligere beskrivelse av hva feltene betyr.

## [1.7.4] – 2026-06-24

### Lagt til
- **Sammenlign telefoner på spec-siden.** Velg inntil 3 telefoner («Legg til i
  sammenligning» på spec-arket), så viser en fullskjerms kolonnetabell spec-ene
  side ved side – gruppert som arket, med **høyeste tallverdi uthevet** per rad
  (RAM, oppdatering, kamera, selfie, batteri). En sammenlign-bar øverst på siden
  viser de valgte telefonene som chips og åpner sammenligningen.

## [1.7.3] – 2026-06-24

### Rettet
- Telefon-specs: korrigerte lagringsalternativene for **iPhone 17e** (starter på
  256 GB, ikke 128 GB).

## [1.7.2] – 2026-06-24

### Lagt til
- **Telefon-specs (`#specs`):** ny oppslagsside i **Verktøy & oppslag** som viser
  spesifikasjoner per telefon à la GSM Arena. Søkbar telefonliste til venstre +
  spec-ark til høyre med en hurtig-strip (skjerm, brikke, kamera, batteri) og
  grupper for skjerm, ytelse, kamera, batteri, design og system. «Se pris og
  delbetaling» åpner priskonfiguratoren for samme modell. På mobil glir du fra
  lista over til spec-arket med en «← Alle telefoner»-knapp tilbake.
- Spec-dataene bor i `js/phonespecs.js`. De er **omtrentlige og hardkodet** og
  roteres per kampanjeperiode (som priser/tilbud) – siden viser en datert
  «verifiser eksakte tall»-merknad, siden appen ikke kan hente live data.

## [1.7.1] – 2026-06-20

### Lagt til
- **Notat-kortet morpher til redigeringsdialogen.** Klikk et notat, og selve
  kortet vokser/glir ut til full visning (og krymper tilbake ved lukking) –
  samme FLIP-morph som case- og telefon-dialogen. Respekterer «redusert
  bevegelse».
- **Dra for å omorganisere notatene.** Velg sorteringen **«Egendefinert»**, så
  kan du dra kortene dit du vil på tavla (mus/desktop); rekkefølgen huskes og
  synkes. På touch bruker du fortsatt pin + sortering.

## [1.7.0] – 2026-06-20

### Endret
- **Notater er bygget om til et sticky-board (Keep-stil).** Notatsiden er nå et
  fargetavle (masonry) i stedet for en enkel liste:
  - **Sjekklister** inne i notater (avkryssingspunkter med progresjon på kortet).
  - **Farger** og **pin** (festede notater øverst).
  - **Søk** og **sortering** (sist endret / nyeste / tittel).
  - **Maler** (kundesamtale, vaktoverlevering, ting å gjøre i dag, pitch &
    innvendinger) – ett klikk lager et ferdig strukturert notat.
  - **Fokusert redigeringsdialog**: klikk et kort for å redigere tittel, tekst,
    farge, pin og sjekkliste i ett panel. Tom tittel fylles automatisk fra
    første linje ved lukking.
- Notatmodellen er utvidet (`pinned`/`color`/`checklist`/`created`) i samme
  private sky-blob – ingen schema-endring, og eldre notater oppgraderes uten
  migrering. Markøren mistes aldri ved skriving (tavla bygges ikke om mens du
  skriver).

## [1.6.10] – 2026-06-20

### Lagt til
- **Skullcandy Party Speaker STOMP** i tilbehørsmatrisen på «Tilbud &
  kampanjer» (kategori Lyd & høyttalere). Fullpris 1990 kr, samme pris for nye
  og eksisterende kunder (gross/upgrade): Mobil 5 GB 1390 · Mobil 10 GB 990 ·
  X Start/Ung 490 · X Basis/Max/Max Pluss 1,- (gull-kupp).

## [1.6.9] – 2026-06-19

### Endret
- **Rapport flyttet til «Verktøy & oppslag».** Rapportsiden ligger ikke lenger
  i «Salg»-gruppa i sidemenyen, men som et kort i Verktøy & oppslag-hub-en (med
  «← Verktøy & oppslag»-tilbakelenke, som de andre verktøysidene). Innholdet er
  uendret, og `#rapport`-adressen virker fortsatt.

## [1.6.8] – 2026-06-19

### Lagt til
- **Mobilt bredbånd 20 GB** (10 GB normalt, dobbel data i 12 mnd) til 249 kr/md
  er lagt inn i MBB-planene. Dukker dermed opp som hurtigknapp i «Registrer
  salg», i pakkebyggeren/kalkulatoren og i MBB-katalogen. Lite datamengde-bånd
  (gross 30 / upgrade 0). 50 GB-planen lå allerede inne uendret.

## [1.6.7] – 2026-06-19

### Fjernet
- **«Slett alle dataene mine»-knappen** (Faresone på Profil & konto) er tatt
  bort sammen med tilhørende kode (`Cloud.replace` og `.danger-zone`-stilene).
  Den slettet alle salg, pitch-økter og oppfølginger lokalt OG i skyen/på de
  andre enhetene – nå er den risikoen for utilsiktet tap borte. Eksport
  (JSON/CSV) og import finnes fortsatt for backup.

## [1.6.6] – 2026-06-19

### Lagt til
- **«X + Viaplay» som abonnement.** Telia X + Viaplay (X Max Pluss + Viaplay)
  er lagt inn i produktlista og dukker dermed opp som egen hurtigknapp i
  «Registrer salg», i pakkebyggeren/kalkulatoren og i produktoversikten. Pris
  1148 kr/md, samme provisjon som X Max Pluss (gross 450 / upgrade 150).

## [1.6.5] – 2026-06-19

### Rettet
- **Salg kunne forsvinne fra KPI-er og «Registrerte salg» igjen.** Sky-synken
  (`Cloud.push`) leser gjeldende sky-tilstand og fletter (union) FØR den skriver,
  så ingen enhet skal overskrive salg en annen enhet/fane la til. Men ved
  **lese-feil** (typisk butikk-wifi-hikke) falt den tilbake til å skrive den
  uflettede lokale payloaden rett over skyen – «degraderte til gammel oppførsel»,
  altså «siste skriving vinner». Hadde en fane/enhet en foreldet (ufullstendig)
  liste i det øyeblikket, kunne skyen bli overskrevet med færre salg, og tapet
  spredte seg til alle enheter ved neste synk (typisk «alt forsvant, bare ett
  tall sto igjen»). Nå **skriver vi aldri blindt ved lese-feil**: pushen utsettes
  og prøver igjen (med ferske data) i stedet for å risikere datatap. De lokale
  dataene er trygge hele tiden, og en push der lesingen lykkes fletter som før.

## [1.6.4] – 2026-06-18

### Lagt til
- **Notater (private huskelapper).** Ny side i Verktøy & oppslag-hubben der du
  kan skrive flere notater med tittel og tekst (opprett/rediger/slett).
  Notatene er **private** – bare du ser dem – og synkes til din egen sky
  (`user_state`) så de følger deg på alle enheter. Endringer lagres automatisk
  (debounced), og notatene flettes på tvers av enheter med «nyeste endring
  vinner» + tombstones (et slettet notat gjenoppstår ikke). Ingen ny
  database-tabell og ingen schema-rekjøring.

## [1.6.3] – 2026-06-18

### Lagt til
- **Dagsbasert ekstrahjelp som teller i «I dag»-tallene.** Ekstrahjelp (salg av
  innleid hjelp fra andre butikker) kan nå føres per **dato** i
  Dagsoversikt-kortet på Butikk-siden – ikke bare som én månedslump. Disse
  tallene teller både i butikkens **«I dag»-KPI-er** (Butikk-modus på
  dashbordet) og på månedsbudsjettet, i tillegg til (ikke i stedet for) den
  eksisterende månedslumpen i «Juster butikkens tall». Ny tabell
  `shop_extra_daily` (PK `shop_id+date`) med samme tilgangskontroll som
  `shop_extra` (hele butikken leser, kun leder skriver) – **krever
  schema-rekjøring**. Ingen provisjon, og vises aldri som en navngitt selger.

## [1.6.2] – 2026-06-17

### Lagt til
- **Frist på caser.** En case kan nå få en valgfri frist (dato). Den settes i
  «Ny case»-skjemaet og kan endres når som helst i case-dialogen. Fristen vises
  som en farget tag på kortet og i dialogen: **rød = forfalt**, **gul = i dag /
  innen 2 dager**, **nøytral = fram i tid** (løste caser viser fristen uten
  alarmfarge). Ny sorteringsmulighet «Frist (nærmest først)» legger forfalte og
  nære frister øverst (caser uten frist nederst). Krever schema-rekjøring (ny
  `due_date`-kolonne på `cases`, dekkes av eksisterende RLS).
- **Forfalt-badge i menyen.** «Caser»-knappen i sidemenyen får en gul teller for
  antall åpne caser med passert frist (egen farge fra den røde uleste-badgen), og
  bunnmenyens prikk lyser også når noe er forfalt.

## [1.6.1] – 2026-06-17

### Fjernet
- **«Estimert provisjon»-kortet** i de sekundære nøkkeltallkortene på dashbordet
  (`#metrics`). Raden viser nå tre kort – case-preview, Aktive caser og
  Snittprovisjon – i et 3-kolonners rutenett. Egen provisjon vises fortsatt i
  «I dag»-kortene, rapporten og månedsbanneret.

## [1.6.0] – 2026-06-17

### Lagt til
- **Coaching-side (`#coaching`, sommertrening).** Ny side i sidemenyen under
  «Oppfølging & team» der leder og ansatt setter treningsmål sammen og følger
  utviklingen i kundemøter.
  - **Treningsplan per ansatt:** Fokus-KPI, periode, «hva skal trenes på»,
    «hva den ansatte selv vil bli bedre på», «konkret adferd i kundemøter»,
    «hvordan lederen følger opp» og kommentarer underveis. Planer kan arkiveres
    (start ny) og gjenåpnes – historikken beholdes.
  - **Observasjonslogg med trafikklys:** leder logger en observert kundesamtale
    med dato, fokusområde, «sett i praksis» og status **Grønn** (brukes
    konsekvent) / **Gul** (på vei) / **Rød** (ikke synlig), pluss kommentar.
  - **Tilgang:** hovedleder og assisterende leder (`is_manager()`) ser og
    redigerer hele teamets coaching-sider; en ansatt ser **kun sin egen** side,
    skrivebeskyttet. Håndhevet med RLS i `supabase/schema.sql` (nye tabeller
    `coaching_plans` + `coaching_observations`, samme mønster som dagstall).
    Coaching-data ryddes ved `leave_shop`/`remove_member`.

> **NB:** krever at hele `supabase/schema.sql` kjøres på nytt i Supabase
> SQL Editor (idempotent) for de to nye tabellene.

## [1.5.27] – 2026-06-16

### Rettet
- **Den aktive pillen i segmenterte brytere stakk ut av kapselen når knappene
  brøt til to rader** (f.eks. Gross/Upgrade-velgeren i hurtigregistreringen på
  mobil). Kapselens `border-radius` er satt fra 999px til 22px – én-rads brytere
  ser likt ut (radien kappes til halv høyde), men flerrads-brytere blir et
  avrundet rektangel så pillen holder seg innenfor.

## [1.5.26] – 2026-06-16

### Endret
- **Leder-førte dagstall vises nå i dagsoversikten.** Når du fører dagstall på
  en selger (i profilen), teller de med i selgerens totaler for dagen i
  dagsoversikten og listes som en egen «Ført av leder»-linje. Hele butikkens
  dagstall hentes i `Team.load` (RLS lar leder lese alle i butikken) – ingen
  databaseendring.

## [1.5.25] – 2026-06-16

### Lagt til
- **Dagsoversikt på Butikk-siden (kun ledere).** Velg en dato og se hver
  selger som registrerte salg den dagen, med dagens totaler (Gross/Upgr./
  Trygg/FWA) og en utvidbar liste over de enkelte salgene – for å sjekke at
  alt er ført riktig. Bygger på butikkens registrerte salg (`Team.shopSales`);
  provisjon vises kun for lederen selv (privat, strippet server-side). Ingen
  databaseendring.

## [1.5.24] – 2026-06-16

### Rettet
- **Betalingsvelgeren i telefondialogen brøt til to rader** og den glidende
  pillen havnet oppå «Betaling»-overskriften. `.phone-pay` var ment å være én
  rad med horisontal scroll, men arvet `flex-wrap: wrap` fra `.seg` – satt nå
  til `flex-wrap: nowrap` så valgene (Engangs/12/24/36/48 mnd) ligger på én
  linje og pillen plasseres riktig.

## [1.5.23] – 2026-06-16

### Endret
- **Juster butikkens tall ved å redigere de faktiske tallene.** Ledere
  korrigerer nå månedstall ved å skrive inn det tallet det skal være (f.eks.
  ved glemte registreringer), i stedet for å regne ut et tillegg. Feltene viser
  selgerens nåværende Gross/Upgr./Trygg/FWA, og endringen lagres som en
  justering bak kulissene (`member_adjustments` – ingen databaseendring).
  Gjelder både samletabellen på Butikk-siden (nå «Juster butikkens tall») og
  per-selger-editoren i profilen. Provisjon er privat og forblir en ren
  justering (legges oppå). Inviterte og ekstrahjelp fylles inn direkte som før.

## [1.5.22] – 2026-06-16

### Lagt til
- **Ledere ser hele butikkens registrerte salg i «Butikken»-modus.** Når
  dashbordet står på «Butikken» viser nå «Registrerte salg»-lista alle salg
  registrert av alle i butikken (med «Selger»-kolonne), mens «Meg» fortsatt kun
  viser dine egne. Kun **Shop Manager** og **Assistant Shop Manager** ser
  fellesvisningen (vanlige selgere ser bare sine egne). Andres rader er
  skrivebeskyttet (ingen rediger/slett – salgene bor i en annen brukers data).
- Ny SECURITY DEFINER-RPC `shop_sales(p_month)` (kun for ledere, egen butikk).
  **Provisjon forblir privat:** commission-feltet fjernes server-side fra
  andres salg (både på toppnivå og per pakke-linje i `items[]`) – kun dine egne
  salg viser provisjon, i tråd med resten av appen. Krever ny kjøring av
  `supabase/schema.sql`. Verifisert mot ekte Postgres (leder ser alle med
  strippet provisjon, assisterende leder likeså, vanlig selger 0 rader, fremmed
  butikk utestengt, månedsfilter).

## [1.5.21] – 2026-06-16

### Lagt til
- **Jevnlig sky-synk (enhetene konvergerer underveis).** Tidligere hentet en
  enhet personlige salg fra skyen kun ved innlogging, så den så ikke salg en
  annen enhet la til før neste pålogging. Nå kjører en lett PULL (`pullFromCloud`)
  når fanen hentes frem igjen og på et 60-sekunders intervall mens fanen er
  synlig: den henter sky-tilstanden og fletter den inn lokalt med samme
  union/tombstone-regler som ved push (pusher ikke selv – lokale endringer
  pushes allerede). Re-rendrer kun når noe faktisk endret seg, og hopper over
  når fanen er skjult (sparer nett/batteri). Bakgrunnsoppdateringen henter nå
  både personlige tall og butikkens tall (maks én gang i minuttet uansett trigger).

## [1.5.20] – 2026-06-16

### Rettet
- **Salg forsvant for godt når samme bruker var aktiv på flere enheter/faner
  («siste skriving vinner»-datatap).** Sky-synken lagret hele salgs-blobben per
  bruker og overskrev den ved hver push. Var samme konto åpen på f.eks. telefon
  og butikk-PC, overskrev den ene enhetens push den andres salg – og siden
  enhetene bare hentet sky-data ved innlogging, ble salg lagt til ett sted borte
  for alltid (alle KPI-er falt, fordi hele salg gikk tapt). Pushen er nå
  **les-flett-skriv**: den henter gjeldende sky-tilstand og fletter (union per
  salgs-id, lokal endring vinner ved kollisjon) før den skriver, så ingen enhet
  overskriver en annens salg. Den oppdaterer også lokal tilstand med
  fletteresultatet, så enheten ser de andres salg etter synk.
- **Sletting/angre respekteres på tvers av enheter (tombstones).** En liste over
  slettede salgs-id-er (`deleted`) følger med i sky-blobben og unioneres ved
  fletting, så et slettet/angret salg ikke gjenoppstår fra en annen enhets kopi.
  «Slett alle data» bruker direkte overskriving (`Cloud.replace`) så tømmingen
  faktisk slår igjennom i stedet for å bli flettet tilbake.

## [1.5.19] – 2026-06-16

### Rettet
- **Butikk-KPI-ene blanket til 0 utover dagen.** `Team.load()` nullstilte
  `leaderboard`/`shopTodayTotals`/`shopGoals` *før* henting og repopulerte kun
  ved suksess. Etter at 1.5.18 begynte å friske opp butikkdata etter hver synk,
  blanket en forbigående hentefeil (mobil/CDN-hikke, eller en `Promise.all`-
  reject) KPI-ene til 0 – gjentatte ganger gjennom dagen. `Team.load()` beholder
  nå siste kjente butikk-data ved hentefeil (både ved enkelt-RPC-feil og ved
  full nettverks-reject) i stedet for å blanke dashbordet. La også til en
  in-flight-guard så samtidige oppdateringer ikke racer hverandre.

## [1.5.18] – 2026-06-16

### Rettet
- **Et nyregistrert salg dukket ikke opp i «Butikken»-dashbordet (KPI-ene sto
  på 0).** Hurtigregistrering kaller `renderAll()`, som re-rendrer alt fra
  **lokal** state – men butikk-visningens KPI-kort, leaderboard og månedsbanner
  leser fra `Team.leaderboard`/`Team.shopTodayTotals`, som bare fylles av
  `Team.load()` (ved innlogging/foregrunn). Salget ble synket til skyen, men
  butikk-tallene ble stående på de gamle boot-verdiene (ofte 0) til neste
  innlogging. Nå kjører `Cloud.push` en `onSynced`-hook etter at `user_state`
  er skrevet, og app.js henter butikkens aggregater på nytt (debounced) så
  salget vises i butikk-dashbordet med en gang.
- **`todayISO()` brukte UTC (`toISOString()`) i strid med konvensjonen.**
  Et salg registrert sent på kvelden kunne få gårsdagens UTC-dato og falle
  utenfor butikkens «I dag»/måneds-filter (som bruker lokal dato via
  `todayLocalISO`/`monthKey`). `todayISO()` bygger nå datoen fra lokale
  komponenter, i tråd med resten av appen.

## [1.5.14] – 2026-06-15

### Rettet
- **Innlogging hang på «Jobber…» (auth-deadlock).** `onAuthStateChange`-lytteren
  (1.5.11) var `async` og kalte `SB.refreshUser()` → `getSession()` inne i
  callbacken. Supabase holder auth-låsen mens lytteren kjører, så getSession
  prøvde å ta en lås som allerede var holdt → deadlock: `signInWithPassword`
  fullførte aldri løftet (selv om HTTP-svaret var `200`), og skjemaet ble
  stående på «Jobber…». (Dukket opp først etter at 1.5.13 fikset `init()`-krasjen
  som tidligere hindret lytteren i å bli registrert.) Lytteren er nå **synkron**
  og bruker `session`-argumentet direkte (ny `SB.applySession()`), og UI-
  oppdateringen kjøres utenfor låsen via `setTimeout(0)`. `signIn` bruker også
  sesjonen fra svaret i stedet for et ekstra `getSession`-kall.

## [1.5.13] – 2026-06-15

### Rettet
- **DEN egentlige «kastes ut ved refresh»-årsaken.** `Team.myShiftDates()` leste
  `SB.user.id` uten å sjekke at `SB.user` fantes. Ved sidelast er `SB.user` null
  fram til auth er gjenopprettet, men `renderAll()` (som via `renderGoals` →
  `myShiftsLeft` → `myShiftDates` traff den) kjører FØR `Auth.hydrate()` i
  oppstarten. Feilen stoppet hele `init()`, så **hydrate kjørte aldri** og
  sesjonen ble aldri gjenopprettet → login-skjerm ved hver refresh. Nå er
  `myShiftDates()` null-sikret, og oppstart-rendene er pakket i try/catch så en
  render-feil aldri kan hindre at auth gjenopprettes.
- Fjernet den midlertidige `[selgerflyt-auth]`-diagnoseloggingen (1.5.12).

## [1.5.12] – 2026-06-15

### Endret
- Midlertidig diagnose-logging (`[selgerflyt-auth]` i konsollen) for å spore
  «kastes ut ved refresh»: viser om Supabase-sesjonen lagres i localStorage ved
  innlogging og om den gjenopprettes ved sidelast. Fjernes når årsaken er funnet.

## [1.5.11] – 2026-06-15

### Rettet
- **Mer robust innlogging ved oppstart (utlogging ved refresh).** Auth-lytteren
  registreres nå FØR den første sesjons-lesingen, så `INITIAL_SESSION`-eventet
  som leverer den gjenopprettede sesjonen aldri går tapt i en oppstart-race.
  `refreshUser()` kaster ikke lenger ved en transient storage-feil (beholder
  forrige bruker i stedet for å logge ut), og `init()` lager aldri en ny
  klient-instans hvis en finnes (flere GoTrueClient-er kan slåss om
  token-fornyelsen og logge deg ut).

## [1.5.10] – 2026-06-15

### Endret
- **«Produkter/priser» er skjult fra sidemenyen** (siden finnes fortsatt, men
  listes ikke lenger). Den tomme «Referanse»-overskriften forsvant med den, så
  «Profil & konto» står nå alene nederst.
- **Utstyrsretur:** fjernet «Strømadapter» og «Kabel» fra utstyrstypene, lagt
  til «Antenne» (Router · TV-boks · Fjernkontroll · Antenne · Annet).

## [1.5.9] – 2026-06-15

### Rettet
- **Utlogging ved refresh – egentlige årsaken.** Nettleseren bufret `js/`-filene
  heuristisk (ingen `Cache-Control` var satt), så mange kjørte fortsatt den gamle
  koden og fikk ikke `getSession`-fiksen fra 1.5.4. `_headers` setter nå
  `Cache-Control: no-cache` på HTML/JS/CSS (revalideres via ETag → 304 når
  uendret), så nye deployer slår igjennom umiddelbart. **Du må laste siden hardt
  én gang** (Ctrl/Cmd+Shift+R) for å hente den nye koden – etterpå sitter den.
- Supabase-klienten opprettes nå med **eksplisitt** auth-config
  (`persistSession`/`autoRefreshToken`/`detectSessionInUrl`/localStorage) så
  sesjonen garantert lagres og overlever refresh.

## [1.5.8] – 2026-06-15

### Rettet
- **Verktøy-kortene gikk til dashbordet.** Etter at verktøyene fikk egen hub
  uten sidemeny-knapper, sendte ruteren dem til dashbordet (den krevde en
  `.nav-btn` for hash-en). Nå validerer ruteren mot at selve seksjonen finnes,
  så kortene tar deg til riktig verktøy.

### Endret
- **«Verktøy» heter nå «Verktøy & oppslag»** og rommer også **Tilbud &
  kampanjer** og **Telefoner & priser** (flyttet inn fra Referanse-menyen), i
  tillegg til Tilbudskalkulator og Utstyrsretur. Alle fire har en «← Verktøy &
  oppslag»-lenke tilbake.

## [1.5.7] – 2026-06-15

### Endret
- **Egen «Verktøy»-side som samler verktøyene.** Sidemenyen viser nå én
  **Verktøy**-oppføring i stedet for å liste hvert verktøy. Den åpner en
  hub-side med kort for **Tilbudskalkulator** og **Utstyrsretur** (med plass til
  flere senere), så menyen blir renere. Hvert verktøy har en «← Verktøy»-lenke
  tilbake til hub-en. Mobilens «Tilbud»-snarvei til kalkulatoren er beholdt.

## [1.5.6] – 2026-06-15

### Lagt til
- **Utstyrsretur-kvittering** (ny side i **Verktøy**). Lag en kvittering på at
  kunden har levert tilbake internett-/TV-utstyr (type, modell, serienummer,
  antall – flere linjer) og skriv den ut med «Skriv ut» (eller lagre som PDF via
  nettleseren). Butikknavn fylles fra butikken din, selgernavnet og et unikt
  referansenummer kommer på kvitteringen. **Ingenting lagres** – verken lokalt
  eller i skyen – så ingen kundedata havner i databasen; kunden tar vare på
  papiret som dokumentasjon.

## [1.5.5] – 2026-06-15

### Fjernet
- **Den lille lilla flekken øverst til høyre på dashbordet.** Den dekorative
  lavendel-gloen i header-hjørnet (`#dashboard .topbar::after`) leste som en løs
  flekk bak bryterne og er fjernet.

## [1.5.4] – 2026-06-15

### Rettet
- **Du blir ikke lenger logget ut ved refresh / nytt besøk.** Appen avgjorde
  innlogget-tilstand med et serverkall (`auth.getUser()`) ved hver sidelast – en
  nett- eller CDN-hikke fikk den til å vise innloggingsskjermen selv om sesjonen
  var gyldig og lagret. Nå leses sesjonen lokalt (`auth.getSession()`, fornyer
  token selv ved behov), så du forblir innlogget på tvers av refresh og nye
  besøk. Tilgangskontrollen er uendret – RLS validerer token server-side på hver
  datahenting uansett.

## [1.5.3] – 2026-06-15

### Lagt til
- **Assistant Shop Manager (assisterende leder).** Shop Manager kan nå gjøre en
  hvilken som helst selger til **assisterende leder** (knapp i selgerens profil)
  og fjerne rollen igjen. En assisterende leder får **alle de operative**
  leder-rettighetene (mål, justeringer, dagstall, vakter, invitasjoner,
  konkurranser, ekstrahjelp, fokus, bytte invitasjonskode, fjerne vanlige
  selgere) – men kan **ikke** styre roller eller overføre hovedrollen; det er
  forbeholdt Shop Manager. Verifisert mot ekte Postgres (operative rettigheter
  ja; rolleadministrasjon/eskalering blokkert).

### Endret
- **«Leder» heter nå «Shop Manager»** i leaderboard, fordeling og profiler.
  Ny rolle-merkelapp «Assistant Shop Manager» vises tilsvarende.
- Krever ny `supabase/schema.sql`-kjøring (ny rolle + `is_manager()`/
  `set_member_role()` + oppdaterte RLS-policyer).

## [1.5.2] – 2026-06-15

### Endret
- **«Butikken»-visningen på dashbordet er nå for alle.** Tidligere kunne bare
  butikkledere bytte KPI-kortene til butikkens samlede tall – nå kan hele teamet
  trykke **«Butikken»** for å se butikkens gross/upgr/Trygg/FWA (både «I dag» og
  «Måned»), og **«Meg»** for sine egne. Selgere starter på «Meg» som før; ledere
  starter på «Butikken». Provisjon er fortsatt privat og vises aldri i
  butikk-visningen.

## [1.5.1] – 2026-06-15

### Lagt til
- **Ekstrahjelp fra andre butikker.** Salg gjort av innleid hjelp / ekstrahjelp
  fra andre butikker kan nå føres på butikkens budsjett **uten** at et fremmed
  navn dukker opp i leaderboardet eller fordelingen. Lederen fører ett samletall
  (gross/upgr/Trygg/FWA) per måned i **«Før månedstall for butikken»**-kortet
  (egen «Ekstrahjelp · andre butikker»-rad). Tallet teller i butikkens totaler
  og mot totalmålet (dashbord, «Butikkens mål», recap), men vises aldri som en
  selger – kun selve totalen øker. Ingen provisjon knyttes til det. På
  «Butikkens mål» står et lite «inkludert ekstrahjelp»-notat når det er ført.
  Krever ny `shop_extra`-tabell – kjør `supabase/schema.sql` på nytt.

## [1.5.0] – 2026-06-15

### Lagt til
- **Abonnementspris på Telefoner & priser.** Når du åpner en telefon og velger et
  abonnement, viser dialogen nå **abonnementets egen månedspris** sammen med
  telefon-delbetalingen og en uthevet **«Totalt per måned»** (abonnement +
  telefon). Velger du engangsbetaling, vises abonnementsprisen per måned ved
  siden av engangsprisen på telefonen. Abonnementsprisen hentes fra
  produktlista (samme priser som ellers i appen), så den holder seg i synk.
  «Uten abonnement» og «X + Viaplay» har ingen oppgitt abonnementspris og viser
  som før kun telefonprisen.

## [1.4.0] – 2026-06-13

### Lagt til
- **Telefon i Tilbudskalkulatoren (fase B).** Hver abonnementslinje kan nå få en
  **telefon** («+ Telefon» → søkbar velger). Prisen hentes automatisk fra
  linjens abonnement, og en felles **delbetalingsvelger** (engangs / 12 / 24 /
  36 / 48 mnd) styrer månedsprisen. Tilbudet viser telefonen på egen linje, en
  samlet **«Totalt per måned inkl. telefon»**, engangskjøp som «i dag»-beløp, og
  **hvor mye kunden sparer mot full pris** – også i kundevisningen (aldri
  provisjon). Telefonen følger med når tilbudet lagres som lead.

## [1.3.0] – 2026-06-13

### Endret
- **Telefoner & priser – ny, ren visning.** Den brede pristabellen er byttet ut
  med en **søkbar telefonliste** der hver telefon **morpher** til en
  priskonfigurator-dialog når du trykker på den (samme morphing-dialog som
  casene). I dialogen velger du **abonnement** (chips, inkl. «Uten abonnement»)
  og **betaling** (engangs eller 12/24/36/48 mnd rentefri delbetaling), og ett
  stort tall viser prisen. Velger du et abonnement, vises hvor mye du sparer mot
  full pris. Standardvisning: «Uten abonnement · engangspris».

## [1.2.0] – 2026-06-13

### Lagt til
- **Telefoner & priser** – ny oppslagsside i Referanse-gruppa (`#mobiler`).
  Søk- og klikkbar katalog over alle telefonene (Samsung / Apple / Google).
  Når du velger en telefon vises totalprisen med hvert abonnement (Full pris,
  5/10 GB, X Start/Ung, X Basis, X Max, X Max Pluss, X + Viaplay) og
  **månedsprisen ved rentefri delbetaling over 12, 24, 36 og 48 måneder**.
  Billigste abonnement utheves som «Beste pris», inkludert tilbehør vises som
  badge, og en periodevelger fremhever valgt delbetalingsperiode. Datakilden
  (`js/phones.js`) er hardkodet og oppdateres per kampanjeperiode. Forberedt
  for senere kobling mot Tilbudskalkulatoren (rene oppslag
  `phonePrice`/`phoneMonthly`).

## [1.1.0] – 2026-06-13

### Lagt til
- **Dashboard – «I dag / Måned»-bryter** på KPI-kortene, tilgjengelig for **både
  shop manager og shop assistant**. Veksle mellom dagens tall og månedens tall
  uten å forlate dashbordet.
- **Dashboard – butikkens dagstall for ledere:** «Butikken»-visningen kan nå vise
  dagens tall, ikke bare måneden (hentet via `challenge_board` i `Team.load`).
- **Rapport – KPI-velger** (Provisjon / Gross / Upgrades / Trygg / FWA) som styrer
  søylegrafen og de fire nøkkeltallkortene. «Per produkt» og attach-rate forblir
  provisjonsbaserte.
- **Versjonering:** denne endringsloggen + versjonsetikett nederst i sidemenyen.

### Endret
- KPI-kortene på dashbordet oppdateres nå når butikkdata lastes, så butikktall
  blir friske med en gang (ikke først etter et sidebytte).

## [1.0.0] – 2026-06-13

Første versjonerte utgivelse – etablerer versjonering for den eksisterende appen.
Baseline-funksjoner:

- Salg med **pakkebygger** (familie), hurtigregistrering, FWA og mobilt bredbånd.
- Provisjonsberegning, **mål** (personlig + butikk, vektet etter vakter) og tempo.
- **Tilbudskalkulator** med familierabatt og ren kundevisning.
- **Oppfølging** (kanban), **caser** med deling/realtime/bilder, **butikk/team**
  med roller, leaderboard, konkurranser, dagstall, invitasjoner og vaktplan.
- **Rapport**, **måneds-recap** (stories), rekorder/milepæler og brukerprofiler.
- Supabase-backend med RLS, engangskode-bekreftelse, strenge sikkerhetshoder og PWA.
