## Versjon 1.1.17
**TLDR:** Lagt til full støtte for reiseoppdrag (oppdrag på kundens lokasjon) med timer, tilpasset SMS og fleksibel prising. Hurtigsvar og SMS/e-post-støtte håndterer nå MMS-vedlegg, drag-and-drop og e-postvedlegg ved dobbel sending.

- Backend: Ny `isReiseoppdrag` boolean og `reiseoppdragDetails` nested object i Ticket-modellen med adresse, planlagt tid, timer, deler, prising og enhetsinfo.
- Backend: Ny status "Reiseoppdrag" for oppdrag på kundens lokasjon.
- Backend: Timer API-endepunkter (`/api/tickets/:id/timer/start` og `/api/tickets/:id/timer/stop`) for å spore arbeidstid på stedet.
- Backend: Timer beregner arbeidstimer automatisk fra start- til stopptid og lagrer i `workedHours`.
- Backend: Ny `SmsTemplate`-modell for redigerbare SMS-maler med placeholder-støtte.
- Backend: SMS-mal API-endepunkter i adminPanel (`GET/PUT /api/admin/sms-templates/:key`) for å administrere maler.
- Backend: Tilpasset SMS-generering for reiseoppdrag med adresse, dato/tid, timepris (1050 kr) og teknikerens navn.
- Backend: SMS-mal endepunkt i tickets route (`GET /api/tickets/sms-template/reiseoppdrag`) for å hente mal ved opprettelse.
- Frontend: Reiseoppdrag-avkrysningsboks i CreateTicket med betingede felt for adresse og planlagt dato/tid.
- Frontend: Reiseoppdrag-status setter automatisk når avkrysningsboks er valgt.
- Frontend: Timer-knapp på billettkort for reiseoppdrag-saker med sanntidsvisning (HH:MM:SS) som oppdateres hvert sekund.
- Frontend: Visuelt merke "🚗 Reiseoppdrag" på billettkort for enkel identifikasjon.
- Frontend: Ny `ReiseoppdragPopup`-komponent for å fullføre oppdrag med timer, deler, prising og "Fast pris"-modus.
- Frontend: "Fast pris"-toggle i ReiseoppdragPopup som lar teknikere angi fast pris i stedet for timebasert beregning.
- Frontend: Delsøk med prisautofyll fra delkatalog i ReiseoppdragPopup.
- Frontend: Valgfri enhetsinfo (merke/modell/farge) i ReiseoppdragPopup.
- Frontend: Fullføring av reiseoppdrag setter status til "Picked Up" automatisk.
- Frontend: Reiseoppdrag-avkrysningsboks i TicketPopup info-panel for å konvertere eksisterende saker.
- Frontend: Beskyttelse mot fjerning av reiseoppdrag-flagg etter at timer har vært brukt (forhindrer datatap).
- Frontend: Ny "Maler"-seksjon i adminpanelet for å redigere SMS-maler.
- Frontend: SMS-mal redigering med innholdsområde og tilgjengelige placeholders for referanse.
- Frontend: Hurtigsvar støtter MMS-vedlegg for SMS, med drag-and-drop og forhåndsvisning av vedlegg.
- Frontend: Chat og SMS-popup støtter drag-and-drop vedlegg og sender både komprimert MMS og original for e-post.
- Backend: AI-drafts send støtter nå MMS-vedlegg for SMS/chat.
- Backend: SMS + e-post-sending inkluderer vedlegg i e-post når det finnes.

## Versjon 1.1.16
**TLDR:** Automatisk purring (påminnelser) for kunder som ikke henter maskinen eller godkjenner reparasjon. Teknikere kan aktivere per sak, og systemet sender SMS-påminnelser med eskalering og auto-stopp.

- Backend: Ny `autoReminderService.js` med logikk for å identifisere berettigede saker og sende påminnelser i 3 scenarier (henting, godkjenning, retur).
- Backend: Automatisk purring aktiveres per sak av tekniker via toggle-knapp, med opt-in design (ikke påtvinget).
- Backend: Påminnelser sendes 2x per uke på tilfeldig tid mellom 11:00-17:00 Oslo-tid, med maksimalt 6 påminnelser per sak.
- Backend: Eskalering fra vennlig til advarselstone ved påminnelse 5-6, med status-endring til "Awaiting Recycling" eller "Abandoned" ved maksimalt antall.
- Backend: Auto-stopp når kunde svarer på SMS eller bekrefter hentedato via avtalt-levering-endepunktet.
- Backend: Cron-jobb kjører hvert 15. minutt innenfor åpningstider for å prosessere berettigede saker.
- Frontend: Ny toggle-knapp "Auto-purring" på sakskortet for berettigede statuser (Ready for Pickup, Awaiting Customer Approval, Awaiting Repair).
- Frontend: Toggle viser antall sendte påminnelser (f.eks. "🔔 Auto-purring (3/6)") og status (🔔 aktivert, 🔕 deaktivert).
- Backend: Nye SMS-maler for alle 3 scenarier på både norsk og engelsk, med vennlig og advarselstone.
- Backend: Påminnelseshistorikk lagres på saken (`autoReminderCount`, `lastAutoReminderSentAt`, `nextAutoReminderScheduledAt`).

## Versjon 1.1.15
**TLDR:** Etikettutskrift fungerer nå konsistent fra både saksliste og delbestillingssiden, og all etikettgenerering bruker delt kode.

- Frontend: Fikset bug hvor "Del ankommet" fra sakslisten ikke lastet ned etikett (fungerte kun fra delbestillingssiden).
- Frontend: Etikettutskrift ved deleankomst fra sakslisten bruker nå samme automatiske nedlasting som delbestillingssiden.
- Frontend: Nytt delt `formatCompanyInfo(location)` hjelpeverktøy i `ticketUtils.js` for konsistent formatering.
- Frontend: Fjernet duplisert `printLabel`-funksjon fra TicketList.js (~50 linjer) - bruker nå delt implementering.
- Frontend: OrderPopups.js, PartOrderList.js og CreateTicket.js bruker alle `formatCompanyInfo` for konsistent firmainfo på etiketter.
- Frontend: Fikset inkonsistent rekkefølge på firmainfo i etiketter (nå alltid: adresse - e-post - telefon).

## Versjon 1.1.14
**TLDR:** AI-diagnose viser nå interaktiv status med verktøybruk, og AI-verktøy er forenklet fra 17 til 10 verktøy med nytt `lookup_device`-verktøy.

- Frontend: AI-diagnose viser nå animert statusindikator under behandling ("Tenker...", "Skriver svar...", "Utfører: search_parts...").
- Frontend: Verktøybruk vises i sanntid med 500ms minimumstid per verktøy for lesbarhet.
- Frontend: Statuspolling hver 200ms for responsiv oppdatering.
- Backend: Nytt `/api/ai-diagnosis/:ticketId/processing-status` endepunkt for sanntidsstatus.
- Backend: Statussporing inkluderer liste over brukte verktøy (`toolsUsed`) for pålitelig visning.
- Backend: Nytt `lookup_device`-verktøy som erstatter 4 separate verktøy (search_brands, search_models, get_model_colors, get_parts_for_model).
- Backend: Fjernet 7 redundante AI-verktøy (17 → 10 verktøy totalt) for enklere AI-beslutninger.
- Backend: La til `color` og `isStandardPart` felter i `partsToOrder`-skjema for diagnoseverktøy.

## Versjon 1.1.13
**TLDR:** Fikset race condition hvor "Alle saker" ikke filtrerte på lokasjon, og optimalisert API-kall ved bruk av DataContext.

- Frontend: Fikset bug hvor "Alle saker"-knappen viste saker fra alle lokasjoner i stedet for kun teknikerens lokasjon (race condition).
- Frontend: TicketList bruker nå `employeeProfile` fra DataContext i stedet for å hente profilen på nytt ved hver handling (4 færre API-kall).
- Frontend: TicketPopup henter nå merker, modeller og farger fra DataContext i stedet for egne API-kall (3 færre API-kall per popup).
- Frontend: Nye merker/modeller/farger opprettet i TicketPopup synkroniseres tilbake til DataContext via `refreshData()`.
- Frontend: Kunde-fanen i TicketPopup laster nå data i bakgrunnen ved åpning av popup (ingen ventetid ved klikk på fanen).
- Frontend: Slettet ubrukt `useApi.js` hook (160 linjer død kode).

## Versjon 1.1.12
**TLDR:** Diagnosenotater kan nå markeres som synlige på sakskortet med en egen øye-knapp.

- Frontend: La til øye-knapp i notatlisten som lar teknikere markere notater som synlige på sakskortet.
- Frontend: Diagnosenotater på sakskortet vises nå som egne kort med individuell åpne/lukk-tilstand.
- Backend: Notater kan lagres med synlighetsflagg slik at ticketlisten kan vise dem, og synlighet kan endres uten å redigere innhold.

## Versjon 1.1.11
**TLDR:** Synkroniseringsloggen for e-post er ryddet for støyende debug-meldinger.

- Backend: Fjernet SYNC DEBUG-logglinjer fra e-postsynk for å holde loggene korte og mer relevante i drift.

## Versjon 1.1.10
**TLDR:** Nettskjemaet sender nå bekreftelse på e-post med saksinfo og oppsummering av skjemaet, og lokasjoner kan lagre postnummer, sted og Google Maps-lenke.

- Backend: Nettskjemaets innsendingsflyt sender bekreftelsesmail med samme informasjon som SMS, skjemaopplysninger og EasyPC-logo i signaturen.
- Backend: Lokasjoner eksponerer postnummer, sted og Google Maps-lenke til offentlige widgeter.
- Frontend: Adminpanelet lar deg registrere og redigere postnummer, sted og Google Maps-lenke for lokasjoner.

## Versjon 1.1.9
**TLDR:** Varslingslyd er nå debouncet globalt slik at flere oppdateringer ikke spiller flere chimer ved oppfriskning.

- Frontend: Felles chime-funksjon med debounce brukes for varsler og morning inbox slik at kun én lyd spilles innenfor kort tid.

## Versjon 1.1.7
**TLDR:** Nettskjemaet forklarer nå hva som skjer videre og sender mer informative SMS-er med åpningstider. Teknikere kan justere modellnummer direkte fra sakskortet og kundens enhet lagres ved innsending.

- Backend: Nettskjemaets innsendingsflyt oppdaterer kundens datamaskinliste når merke/modell oppgis, og SMS-teksten inkluderer køstatus samt åpningstider.
- Backend: La til endepunkt for å justere modellnummer på en sak og oppdatere kundens enhetsliste.
- Frontend: TicketListUI viser knapp for «Juster modell» direkte på sakskortet.
- Widget: Oppdatert bekreftelsestekster med «Hva skjer videre», spam-notis ved SMS-verifisering og valgfri leveringsinformasjon.

## Versjon 1.1.8
**TLDR:** Kontekstanalyse for utviklingsforslag tåler nå AI-svar med kodeblokker, viser lesbar forfatter på kontekst, og widget-generatoren kan laste ekte forhåndsvisning mot dev-serveren.

- Backend: Forbedret JSON-parsing i kontekstanalyse slik at svar med code fences eller ekstra tekst kan tolkes tryggere.
- Backend: Ved parsefeil brukes nå enkel heuristikk for å avgjøre om forslag har nok kontekst i stedet for å feile direkte.
- Backend: Ekstra kontekst som legges til viser nå navn på medarbeideren i stedet for ID.
- Backend: Cron jobben reanalyserer kun forslag som er nye eller oppdatert siden sist vurdering.
- Backend: Nye prompt-endepunkter støtter API-key autentisering for ekstern AI-henting og ferdigmarkering.
- Backend: Lageroppdatering returnerer nå "Lager uendret" når delta er 0 i hurtig-ankomstflyten.
- Frontend: Widget-kodegeneratoren kan nå generere ekte forhåndsvisning med live widget mot dev-server.

## Versjon 1.1.6
**TLDR:** Nettskjemaet gir nå detaljert hjelp for å finne modellnummer, og kundeopprettelse fra skjema feiler ikke lenger på grunn av manglende krypteringsnøkkel.

- Backend: Genererer `encryptionKey` før validering av nye kunder slik at offentlige skjema kan opprette kunder uten valideringsfeil.
- Widget: La til info-modal for modellnummer i kundeskjemaet med merke-spesifikke tips og forbedret styling.

## Versjon 1.1.5
**TLDR:** Nytt globalt kundepassord-vindu i headeren med opplåsingsmodus, søk og rask tilgang til opplåste passord i 3 timer.

- Backend: Nytt endepunkt `/api/ticketlist/password-customers/search` for søk etter kunder via navn, telefon, e-post eller eksakt saksnummer.
- Frontend: Nytt globalt "Kundepassord"-popup åpnes fra headeren og viser alle opplåste passord øverst.
- Frontend: Opplåsingsmodus (10 min) kreves for å låse opp passord i 3 timer; opplåsinger lagres lokalt og utløper automatisk.
- Frontend: Passord legges nå alltid til som synlige for teknikere, og den gamle passord-popupen er fjernet fra ticket-listen.

## Versjon 1.1.4
**TLDR:** Ny funksjon for å simulere innkommende SMS-meldinger i adminpanelet, samt AI-svarforslag vises nå direkte i chatten for SMS-meldinger.

- Backend: Nytt API-endepunkt `/api/admin/simulate-sms` for å simulere innkommende SMS-meldinger på dev-server.
- Frontend: Ny «Simuler Innkommende SMS»-seksjon i adminpanelet med søk etter kunde/sak, telefonnummer og meldingsinnhold.
- Frontend: Mulighet for å velge mottaker via søk på kunde eller saksnummer med autofyll av telefonnummer.
- Frontend: AI-svarforslag vises nå som egen «boble» i kundemeldingsvisningen når kunde sender SMS.
- Frontend: Teknikere kan godkjenne, forkaste, legge til kontekst eller regenerere AI-forslag direkte i chatten.

## Versjon 1.1.3
**TLDR:** AI-en kan nå slå opp priser og reparasjonsdata fra tidligere saker automatisk basert på enhetsmodell og reparasjonstype.

- Backend: Ny funksjon `fetchHistoricalTicketData` som søker i fullførte saker etter lignende reparasjoner.
- Backend: Automatisk gjenkjenning av enhetsmodeller (ThinkPad, MacBook, Dell, HP, osv.) og reparasjonstyper (skjerm, batteri, hengsel, osv.) fra kundemeldinger.
- Backend: AI-svar inkluderer nå historiske priser med saksnummer, tidsangivelse og gjennomsnittspris for lignende reparasjoner.
- Backend: Forbedret AI-prompt som instruerer modellen til kun å returnere kundesvaret uten ekstra forklaringer.
- Frontend: E-postinnholdet vises nå før AI-svarforslaget slik at teknikeren ser konteksten først.

## Versjon 1.1.2
**TLDR:** AI-systemet har nå en dynamisk kunnskapsbase som lærer fra kontekst teknikere gir under svarutkast, og kan administreres manuelt i adminpanelet.

- Backend: Ny `AIKnowledge`-modell for lagring av firmakunnskap (priser, kontaktinfo, tjenester, retningslinjer, produkter, prosedyrer) med kategorisering og søkestøtte.
- Backend: AI-en henter automatisk relevant kunnskap fra databasen basert på nøkkelord og tekstsøk når den genererer svar.
- Backend: Kontekst som legges til ved regenerering av svarkladder lagres automatisk i kunnskapsbasen for fremtidig bruk.
- Backend: Automatisk kategorisering av ny kunnskap via AI, samt duplikatdeteksjon for å unngå dobbeltlagring.
- Backend: Nye adminendepunkter for CRUD-operasjoner på kunnskapsbasen (`/api/admin/ai/knowledge`) og statistikk.
- Frontend: Ny «AI Kunnskapsbase»-seksjon i administrasjonspanelet for å se, legge til, redigere og slette firmakunnskap.
- Frontend: Filtrer kunnskap etter kategori, søk i innhold, og aktiver/deaktiver enkeltoppføringer.
- Frontend: Statistikkvisning viser antall oppføringer, aktive oppføringer og totalt antall ganger kunnskapen er brukt.

## Versjon 1.1.1
**TLDR:** Nytt AI-responssystem genererer automatisk svarkladder for alle innkommende e-poster (ikke spam) – tekniker kan godkjenne, redigere eller forkaste forslaget direkte i e-postpopupen.

- Backend: Ny `AIDraft`-modell for lagring av AI-genererte svarkladder med status, tilbakemelding og kontekstinfo.
- Backend: Ny `aiService.js` utility med støtte for flere leverandører: OpenAI API, Anthropic API, og Claude CLI (for Pro-abonnement).
- Backend: Nye API-endepunkter under `/api/ai-drafts/` for å generere, hente, godkjenne, avvise og regenerere kladder.
- Backend: Automatisk generering av svarkladder for alle nye e-poster med positiv spamscore i INBOX.
- Backend: AI-en analyserer kontekst og foreslår manglende informasjon som ville forbedret svaret.
- Backend: Støtte for regenerering av kladder med ekstra kontekst fra tekniker.
- Backend: AI lærer fra teknikerens tidligere svar for å tilpasse stilen til hver enkelt tekniker.
- Backend: Nye adminendepunkter for AI-konfigurasjon (`GET/POST /api/admin/ai/config`) og testing (`POST /api/admin/ai/test`).
- Frontend: Ny «AI Innstillinger»-seksjon i administrasjonspanelet for valg av AI-leverandør, modell og API-nøkkel.
- Frontend: Test-funksjon i administrasjonspanelet for å verifisere AI-tilkobling før produksjonsbruk.
- Frontend: AI-svarforslag vises i e-postpopupen med «Bruk svar», «Forkast», «Mer kontekst» og «Regenerer» knapper.

## Versjon 1.1.0
**TLDR:** Ny oversiktspanel (dashboard) viser viktige nøkkeltall som daglige saker, kundeprediksjon, inntekt og reparasjonsstatistikk – med ukedag-sammenligning og periodevelger.

- Backend: Ny `OverviewCache`-modell lagrer forhåndsberegnet dashboarddata som oppdateres hver time via cron-jobb.
- Backend: Nye API-endepunkter under `/api/dashboard/` for oversikt, daglig sammenligning, kundeprediksjon, inntekt, statusfordeling og reparasjonsstatistikk.
- Backend: Støtte for periode-filtrering (ukentlig, annenhver uke, månedlig, årlig) og lokasjonfiltrering på alle dashboard-endepunkter.
- Backend: Reparasjons-suksessrate beregnes ut fra `RepairFailed`-flagg og `isFixable`-felt på avsluttede saker.
- Frontend: Ny `Dashboard`-komponent med metrikk-kort, statuslinje, suksess-ring og ukedag-diagram for å visualisere trender.
- Frontend: Teknikere ser kun operasjonell data (åpne saker, ventende kunder), mens administratorer også ser inntekts- og profittall.
- Frontend: Dashboard oppdateres automatisk ved sideåpning; administratorer kan manuelt oppdatere cache.
- Frontend: Teknikere ser kun data for sin egen lokasjon, mens administratorer kan velge mellom alle lokasjoner.
- Frontend: Periodevelger flyttet til de relevante seksjonene (inntekt og reparasjonsstatistikk) i stedet for global filtrering.

## Versjon 1.0.99
**TLDR:** Diagnosepopupen lagrer nå automatisk utkast slik at arbeid ikke går tapt dersom popup lukkes før diagnosen er fullført.

- Backend: Lagt til `diagnosisDraft`-felt i `Ticket`-modellen for å lagre pågående diagnosedata.
- Backend: Nye API-endepunkter for å lagre, hente og slette diagnoseutkast (`PUT/GET/DELETE /api/ticketlist/tickets/:id/diagnosis-draft`).
- Frontend: Diagnosepopupen laster automatisk inn lagret utkast ved åpning, og viser en indikator når utkast er aktivt.
- Frontend: Automatisk lagring av utkast hvert 30. sekund og ved lukking av popup.
- Frontend: Manuell "Lagre utkast"-knapp for eksplisitt lagring, og utkast slettes automatisk når diagnose fullføres.

## Versjon 1.0.96
**TLDR:** Saker-per-side-innstillingen oppdateres nå umiddelbart i listen uten å måtte oppdatere siden manuelt. TicketPopup-fanene ligger nå under tittelen i toppfeltet for raskere navigasjon.

- Frontend: Når brukeren endrer `Saker per side` i TicketList oppdateres visningen umiddelbart og henter nye data med oppdatert grense, ved å prioritere lokal state for antall per side fremfor kun å stole på profil-innstillinger. (Fix for at endringen tidligere krevde sideoppfriskning.)
	- Endret filer: `client/src/components/tickets/TicketList.js`, `client/src/hooks/UseTicketData.js`.
	- Frontend: `TicketList.js` oppdaterer nå lokal `ticketsPerPage` umiddelbart, tilbakestiller verdien hvis lagring mislykkes, og setter siden til 1 ved endring. `UseTicketData.js` bruker nå lokal `ticketsPerPage` (faller tilbake til profilinnstilling) og har `ticketsPerPage` som effekt-dependency slik at listen hentes på nytt straks brukeren endrer innstillingen.

- Frontend: TicketPopup viser nå faner under tittelen i toppfeltet for mer ryddig og rask navigasjon mellom seksjoner.

## Versjon 1.0.94
**TLDR:** Fargekonvertering håndterer nå eksisterende lager per lokasjon, standarddeler husker automatisk forrige modellkoblinger, og Katalogadministrasjon har fått et ryddigere UI. Admin-popupen guider brukeren gjennom fordeling og oppdaterer UI umiddelbart.

- Backend: `Part`-modellen lagrer nå `previousFitsModels`, og `PUT /api/parts/:id` konverterer kvanta mellom N/A og konkrete farger (med validering av brukerens fordeling) når `colorIndependent` endres.
- Backend: Standarddeler stasher og gjenoppretter tidligere `fitsModels`, slik at frakoblede modeller dukker opp igjen når standardflagget fjernes.
- Frontend: `CatalogManagement` viser et eget popup (“assign the parts to the right colors”) som lar brukeren fordele lager på faktiske farger før `Fargeuavhengig` skrus av, og summerer alt automatisk tilbake til N/A når funksjonen skrus på.
- Frontend: Lager-tabellen, kompatibilitetslisten og statustekstene oppdateres live etter begge toggler, inkludert tydelige meldinger om hva som skjedde og hvor mange modeller som ble gjenopprettet.
- Frontend: Forbedret layout og lesbarhet i `CatalogManagement` med en ryddigere toppverktøylinje, mer konsistente delerader og tydeligere kontroller i merge/fargefordeling.

## Versjon 1.0.92
## Versjon 1.0.95
**TLDR:** Klikkbar kø-etikett (køantall) viser saker i kø i oversikten.

- Frontend: `CreateTicket` har nå en klikkbar kø-etikett som fyrer `openQueueView`-event og åpner kø-visningen i `TicketList`.
- Backend: `ticketList.js` støtter `viewMode=queue` og returnerer saker med statusene: `Delivered`, `Awaiting Diagnosis`, `In Diagnosis`, `Awaiting Repair`, `Being Repaired`, `Awaiting Recovery` (kun saker hvor kundene ikke har beholdt maskinen).

**TLDR:** Vis "Klar for henting"-saker med høy prioritet i "Mine oppgaver", legg til 7-dagers "Neste purring"-cooldown, og oppdater UI-etiketten til "Neste purring".

- Backend: La til `lastReminderSentAt` i `Ticket`-modellen for å spore når en purring ble sendt.
- Backend: Endret prioriterings-cron (`ticketList.js`) slik at "Ready for Pickup"-saker ikke eskaleres til Høy dersom en purring ble sendt mindre enn 7 dager siden.
- Backend: Løst aggregasjons-feil ved å erstatte feil `$elemMatch`-bruk i `$addFields` med `$filter/$size`-sjekk for uleste kundeoppdateringer (forhindrer "Invalid $addFields" runtime-feil).
- Backend: Korrigert `excludeStatuses`-scope for å unngå `ReferenceError` i aggregasjon og sorteringslogikk.
- Backend: `myTasks`-filtrering inkluderer nå også "Ready for Pickup" med `priority: 'High'` i visningen "Mine oppgaver".
- Frontend: Endret UI-strengen "Purre-køling" til "Neste purring" og la til visning av nedtelling i ticket-listen.
- Frontend: Når "Send purring" utføres, settes `lastReminderSentAt` (og prioritet settes til Lav) slik at cooldown starter.
- Tests: Lagt til `Backend/test/test_purring_cooldown_21449.js` for å verifisere 7-dagers cooldown og `Backend/test/test_ticketlist_aggregation.js` for å verifisere aggregasjons-pipeline.
**TLDR:** Draggable popups holder seg nå over toppheaderen og forblir øverst når man klikker dem.

- Frontend: `DraggablePopup` bruker nå en delt portalcontainer (i stedet for én per popup) slik at alle vinduer deler samme stacking context og den aktive popupen kan løftes foran andre med `z-index`.
- Frontend: `.draggable-popup-portal` i `App.css` fikk `z-index: 1002`, noe som sørger for at portalen alltid ligger over headeren med `z-index: 1001` og hindrer at popups havner under.

## Versjon 1.0.98
**TLDR:** Automatiske lagerbestillinger allokeres nå automatisk til kundesaker ved godkjenning, slik at deler som allerede er på vei tildeles billetten i stedet for å opprette dupliserte bestillinger.

- Backend: Lagt til automatisk allokering fra automatiske ordrer (på vei) når kunde godkjenner alternativ i `ticketList.js` og `ticketPopup.js`.
- Backend: Når en kundesak godkjennes og det finnes matchende automatiske ordrer (samme del, lokasjon, farge) som er bestilt men ikke ankommet, trekkes mengden fra den automatiske ordren og tildeles billetten med `isOrderMade=true` og eventuell sporingsinformasjon.
- Backend: Støtter delvis allokering (automatisk ordre har færre deler enn behov), full tømming (automatisk ordre slettes når alt er tildelt), og allokering fra flere automatiske ordrer.
- Backend: Lagt til `normalizeVendor`-funksjon i `ticketList.js` for konsistent leverandørnavn.

## Versjon 1.0.97
**TLDR:** Forbedret håndtering av delbestillinger: massemarkering oppdaterer UI uten oppfriskning, manuelle lagerbestillinger støttes, leverandørnavn normaliseres, og etikett kan skrives ut ved ankomst.

- Backend: `POST /api/part-orders/:id/made` og tilhørende endepunkter returnerer nå fullt befolkede `PartOrder`-objekter med billett- og kundeinformasjon for å gjøre UI-oppdatering enklere.
- Backend: Lagt til `POST /api/part-orders` for å opprette manuelle (lager)bestillinger. Oppretter også `PartOrderLog` for sporing ved behov.
- Backend: Når en kundebestilling opprettes og det finnes automatiske ordre (ticket:null) som er markert som gjort og ikke ankommet, flyttes mengde fra automatisk ordre over til den nye billettbestillingen (tildeles med `isOrderMade=true` og sporingsinformasjon hvis tilgjengelig).
- Backend: Normalisering av leverandørnavn ved oppdatering og ved legging til lenker for å forhindre dupliserte grupper (f.eks. eBay/Ebay).
- Frontend: `PartOrderList` viser hylle (`shelf`) når en del har ankommet og saken ikke er hentet, skriver automatisk ut en etikett (DYMO) når del ankommer og kunden har maskinen, og lar brukeren starte manuelle bestillinger via UI.
- Frontend: Fikset UI-issue der kun én ordre ble oppdatert ved massemarkering; nå bruker vi funksjonelle state-oppdateringer og oppdaterer alle endrede bestillinger etter API-respons.

## Versjon 1.0.88
**TLDR:** Forhindrer at "Se SMS"-handlingen av en ikke-tilordnet tekniker markerer kundeoppdateringer som sett.
## Versjon 1.0.89
**TLDR:** Emoji-vinduet i chat kan nå dras fritt uten å være begrenset av overliggende popup.

## Versjon 1.0.93
**TLDR:** Fikset tapte SMS-meldinger ved å gjøre webhook-mer robust: godtar alternative telefonfelt, samler sammen multipart-meldinger og forbedrer logging.

- Backend: `POST /api/chat/sms/webhook` aksepterer nå flere vanlige telefonfelt (`phoneNumber`, `from`, `msisdn`, `sender`, `originator`) og flere meldingsfelt (`message`, `text`, `body`, `messageText`).
- Backend: Normaliserer og slår sammen multipart-meldinger (array eller `parts`-objekt) til én streng før videre behandling, for å unngå runtime-feil.
- Backend: Telefonnummer normaliseres (stripper ikke-siffer, beholder ledende +), og søker både med og uten `+47` for å øke treff på eksisterende kunder.
- Backend: Aksepterer flere variant-navn for event (f.eks. `sms:received` og `sms.received`) for bedre kompatibilitet med ulike leverandører.
- Backend: Forbedret logging for webhook: lagrer forhåndsvisning (200 tegn) av innkommende melding, hvilke fallback-felter som ble brukt, og indikerer multipart-detektering for enklere feilsøking.
- Tests: Lagt til flere testskript for å verifisere webhook-fallback (f.eks. `test-sms-webhook-fallback.js`, `test-sms-long-message.js`, `test-sms-gate-kirsti.js`) samt script for å opprette testkunde og billett (`ensure-kirsti-sms-arrives.js`).


## Versjon 1.0.90
**TLDR:** Planlagte meldinger oppretter ikke lenger en synlig kundeoppdatering før meldingen faktisk sendes.

- Backend: Når en SMS eller e-post planlegges via `POST /api/chat/:ticketId/phone-popup-sms`, lagres meldingen internt (`internalOnly: true`) slik at den ikke vises for kunden umiddelbart.
- Backend cron-jobben som sender planlagte meldinger setter nå `internalOnly: false` for oppdateringen først når sendingen er vellykket, slik at kunden ser oppdateringen samtidig som meldingen sendes.

## Versjon 1.0.91
**TLDR:** Intern-meldinger vises nå tydelig for teknikere med merket «Intern melding» og forklart årsak; kunder ser dem ikke.

- Frontend: `CustomerUpdates` viser nå interne meldinger for `technician` og `admin` med en tydelig badge "Intern melding" og forklaring (f.eks. "Planlagt: 14:30" eller "Kilde: E-post"). Dette gir teknikere mer kontekst uten å avsløre informasjon for kunden.
- Frontend: Interne meldinger får en egen, mer dempet stil (`internal-only` klasse med slående, dempet farge og diskret ramme) for å skille dem visuelt fra vanlige meldinger.
- Backend: Sikkerhetsforbedring i API-et — GET `/api/chat/:ticketId/updates` og `/api/chat/:ticketId/updates/poll` returnerer ikke lenger `internalOnly`-oppdateringer til kunder (server-side filtrering). Dette forhindrer at interne meldinger lekker via API-kall.
- Tests & scripts: Lagt til `Backend/test/test-scheduled-message-visibility.js` for rask manuell/automatisert verifisering og `Backend/scripts/mark-scheduled-internal.js` for migrering av eksisterende usendte planlagte meldinger hvis ønskelig.

- Frontend: Endret `DraggablePopup` til å rendere via et React-portal (`document.body`) slik at popups ikke blir klippet av foreldreelementers `overflow` eller transform CSS-egenskaper.
- UX: Emoji-vinduet (`EmojiPicker`) kan nå flyttes utenfor chat-popup'en og fungerer konsistent på tvers av skjermer og popups.


- Backend: Endret `POST /api/chat/:ticketId/mark-updates-seen` for å kun tillate at tildelt tekniker (eller admin) markerer kundeoppdateringer som sett.
- Frontend: Oppdatert `client/src/components/customers/CustomerUpdates.js` for å kun sende kall for å merke oppdateringer som sett når brukeren er admin eller den tildelte teknikeren; lagt til `assignedToId` i chat-oppdaterings-responsen.

## Versjon 1.0.87
**TLDR:** Lokasjonsfilteret er synlig for teknikere i «Alle saker», defaulter til teknikeren sin lokasjon, og lar brukere velge «Alle lokasjoner» uten at den automatisk endres.

- Viser lokasjonsfilteret for teknikere når `viewMode` er `all` (Alle saker) og for administratorer som før.
- Defaultet lokasjonsfilter til teknikerens lokasjon ved åpning av «Alle saker», men legger til en beskyttelse slik at brukerens valg (inkludert «Alle lokasjoner») ikke overskrives etterpå.
- Forbedret utseende på filteret (`select` får knapp-lignende styling) for bedre visuell konsistens med andre kontroller.
- Rettet feil som gjorde at valget "Alle lokasjoner" ble overskrevet med den teknikerens lokasjon automatisk.

## Versjon 1.0.86

## Versjon 1.0.85
**TLDR:** Mulighet for redigering og myk sletting (soft-delete) av notater i Ticket-popup; teknikere kan redigere/slette kun egne notater, og administratorer ser og kan endre alle notater.

- Implementert redigering og sletting (soft-delete) for notater i `TicketPopup` (frontend) med inline-redigering og ikon-knapper for bedre brukeropplevelse.
- Lagt til backend-endepunkter for notater: `PUT /api/ticketlist/tickets/:id/notes/:noteId` (rediger) og `DELETE /api/ticketlist/tickets/:id/notes/:noteId` (myk sletting).
- Notater markeres som slettet (`deleted: true`, `deletedAt`, `deletedBy`) i `Ticket.notes` i `Backend/models/Ticket.js` i stedet for å bli fysisk fjernet, slik at historikk beholdes.
- Admin-brukere ser slettede notater og får informasjon om hvem som slettet (`deletedBy`), mens vanlige teknikere/kunder ikke ser slettede notater (API filtrerer dem ut for ikke-admins).
- Autorisasjon: bare notatets forfatter (eller admin) kan redigere/slette; redigering av slettede notater er kun for admin.
- Backend-populeringer (`notes.createdBy`, `notes.deletedBy`) er lagt til slik at frontend kan vise forfatternavn og hvem som slettet notatet.
- Frontend: `TicketPopup.js` ble oppdatert til å bruke ikon-knapper (FaEdit / FaTimes), inline-editing, og en diskret stil for slettede notater. Popup'en nullstiller også redigerings-tilstanden ved lukking.
- Oppdaterte backend-rutene for ticket-popup/-liste til å filtrere slettede notater for ikke-admin brukere og sikre riktig tilgangskontroll.

## Versjon 1.0.86
**TLDR:** Legg til gjenoppretting av notater (undo delete) og sporingsfelt for notatredigering (editedBy/editedAt).

- Lagt til `editedBy` og `editedAt` i `Ticket.notes` for å kunne vise hvem og når et notat ble endret.
- Når en notat redigeres, settes `editedBy` og `editedAt` i backend (`PUT /api/ticketlist/tickets/:id/notes/:noteId`).
- Lagt til `POST /api/ticketlist/tickets/:id/notes/:noteId/restore` for å gjenopprette (undo delete) et tidligere soft-slettet notat. Kun administratorer kan gjenopprette notater.
- Frontend: `TicketPopup` viser nå "Endret av" metadata for notater og en gjenopprettingsknapp for administratorer ved myk sletting.
- Mindre UI-forbedringer: notater viser nå line-through og grå stil når de er slettet, og administratører får ekstra kontrollmuligheter for å håndtere slettede notater.

## Versjon 1.0.84
**TLDR:** Lignende e-poster laster ferdig før markeringene vises, skjulte tegn fjernes og debugging vises i konsollen for samme avsender.

- Fakturaveilederen forhåndslaster nå full tekst for valgte e-poster og viser en tydelig spinner før fremhevingene aktiveres, slik at kriteriene bygges på komplette data.
- Steg 3 sperrer for interaksjon mens innholdet hentes og skrur av markeringene midlertidig, slik at brukeren slipper å se manglende høydepunkter som senere endrer seg.
- Endepunktet `/api/email/similar/:id` returnerer nå utelukkende meldinger med identisk normalisert avsenderadresse, noe som sikrer at sammenligningssiden holder seg relevant.
- Nullbreddetegn (ZWS, ZWNJ, Word Joiner) fjernes fra både tekstgrunnlaget og forhåndsvisningen før vi beregner/highlighter tokens, så eBay-maler og andre obfuskerte e-poster får komplette treff.
- CSS-/scriptblokker fjernes helt før vi analyserer brødteksten, slik at ordlyden i selve e-posten gir forslagene og ikke de innebygde stilarkene.
- Tekstforhåndsvisningen i steg 3 begrenser nå overflødige linjeskift og viser dem som `<br/>` i stedet for `<pre>`, slik at e-poster uten HTML fortsatt ser ut som originalen når du bekrefter likheter.
- Selve e-posten hentes nå i fullversjon før Steg 3 vises dersom metadataen mangler HTML, så «Bekreft likheter»-visningen matcher identisk det du ser via «Forhåndsvis».
- Highlight-panelet bruker ikke lenger hvit bakgrunn/padding som overstyrer e-postenes design, slik at mørke eBay-maler og andre layout-tunge e-poster ser like ut som i forhåndsvisningen.
- Konsoll-loggene for høydepunktberegning er nå aktivert som standard og kan slås av/på via `window.setInvoiceHighlightDebug(false|true)`, slik at feilsøking fungerer uten ekstra steg.

## Versjon 1.0.83
**TLDR:** Database komprimering fungerer nå på produksjonsservere med replica set.

- Lagt til `force: true` i database komprimeringskommando for å tillate komprimering på replica set primary.

## Versjon 1.0.82
**TLDR:** Test av videresendingsregel laster ned full e-postmetadata ved behov og tilbakestiller til minimal metadata etter 1 time.

- Oppdatert testfunksjonen for videresendingsregler til å hente full e-postinnhold (tekst, HTML, vedlegg) fra IMAP når det mangler i databasen og regelen krever det.
- Lagt til `hydratedAt`-felt i EmailMetadata-modellen for å spore når full metadata ble lastet ned.
- Implementert timebasert opprydding (kl. 0 hver time) som fjerner lastet tekst, HTML og vedlegg eldre enn 1 time, og tilbakestiller metadata til minimal tilstand.

## Versjon 1.0.81
**TLDR:** Test av videresendingsregel sjekker nå kun e-poster fra relevant konto og øker grensen for antall e-poster som sjekkes.

- Oppdatert `/api/forwarding-rules/test` til å filtrere e-poster basert på reglens `sourceAccountId` (mottaker-konto), slik at testen kun evaluerer e-poster fra den aktuelle kontoen.
- Økt grensen for antall kandidat-e-poster som hentes fra databasen fra 2000 til 10000 for å tillate testing av flere e-poster i større postbokser.

## Versjon 1.0.80
**TLDR:** Implementert automatisk opprydding av bufret HTML-innhold i e-poster etter 2 dager for å optimalisere lagringsbruk.

- Lagt til `htmlBodyCachedAt`-felt i EmailMetadata-modellen for å spore når HTML-innhold ble bufret.
- Oppdatert e-posthentingslogikken til å sette tidsstempel når HTML-innhold caches fra IMAP.
- Implementert daglig cron-jobb (kl. 02:00) som sletter bufret HTML-innhold eldre enn 2 dager, noe som reduserer lagringsbehovet over tid.
- Utført engangsopprydding av eksisterende HTML-innhold for å legge til tidsstempler og aktivere automatisk opprydding.
- Trunkeret oversize tekst- og HTML-innhold til henholdsvis 50KB og 100KB for å håndheve størrelsesgrenser.
- Utført full reset av alle bufret HTML-innhold for å simulere frisk e-postkonto-oppsett, noe som reduserte samlingen fra 431MB til 42MB.
- Kjørte MongoDB-kompaktering for å frigjøre fragmentert lagringsplass, noe som reduserte total database-størrelse fra 580MB til 61MB.

## Versjon 1.0.79
**TLDR:** E-post metadata tar nå betydelig mindre lagringsplass ved å begrense størrelsen på tekst- og HTML-innhold, og en oppryddingsfunksjon er lagt til i adminpanelet.

- Implementert størrelsesbegrensning på e-postinnhold ved lagring: tekstlegemer begrenset til 50KB og HTML-legemer til 100KB for å forhindre overdreven lagringsbruk.
- Lagt til oppryddingsfunksjon i adminpanelet for å fjerne store vedlegg og avkorte eksisterende e-postinnhold som overstiger grensene, noe som reduserte total lagringsplass betydelig.

## Versjon 1.0.78
**TLDR:** Massevideresending av e-poster i tidsrom sjekker nå alle e-poster i valgt periode i stedet for en begrenset delmengde.

- Endepunktet for massevideresending (`/api/forwarding-rules/:ruleId/forward-range`) fjerner nå grensen på antall kandidater som hentes fra databasen, slik at alle e-poster i tidsrommet evalueres mot regelen før videresending.
- Økt standardgrense for maksimalt antall videresendinger fra 200 til 1000 for å håndtere større mengder e-poster.

## Versjon 1.0.77
**TLDR:** Fakturaveilederen og videresendingsreglene støtter nå «Brødtekst må ikke inneholde» både ved opprettelse og redigering.

- Steg 3 i fakturaveilederen (Bekreft likheter/Definer manuelt) har fått et eget tekstfelt for ord og fraser som diskvalifiserer e-poster, og oppsummeringen viser listen slik at kriteriet er synlig før lagring.
- Lagrede regler sender nå `bodyExclude` til backend, og `ForwardingRule`-modellen/evalueringslogikken håndhever feltet slik at e-poster stoppes selv om alle andre kriterier treffer.
- Regeltesteren og redigeringspanelet i e-postmodulen viser og lar deg oppdatere «Brødtekst må ikke inneholde»-listen sammen med de øvrige kriteriene.

## Versjon 1.0.76
**TLDR:** E-postsynkronisering viser nå antall nedlastede e-poster i sanntid, og lasteskjermen for e-poster har fått nytt design som matcher fremdriftslinjen.

- Lagt til fremdriftsrapportering for e-postsynkronisering som viser antall behandlede e-poster av totalt antall i sanntid.
- Oppdatert frontend for å vise detaljert fremdrift i synkroniseringslinjen for administratorer.
- Oppdatert lasteskjerm for e-poster i frontend for å matche stilen til synkroniseringslinjen for en mer helhetlig brukeropplevelse.

## Versjon 1.0.75
**TLDR:** Baktesten returnerer bare én rad per e-post selv når databasen har dubletter.

- `/api/forwarding-rules/test` dedupliserer nå kun på `messageId`, faller tilbake til `accountId+UID` eller `fra+emne+dato` når ID mangler og logger hvilken strategi som filtrerte bort dubletter før resultatet sendes til UI-et.
- Frontenden bruker samme prioritering når den bygger nøkkelen for trefflisten, slik at identiske ordrebekreftelser ikke lenger rendres to ganger selv om de ligger på flere kontoer eller har parallelle MongoDB-oppføringer.

## Versjon 1.0.74
**TLDR:** Tilbake-testen viser nå hvert treff kun én gang.

- E-posttreffene i «Test videresendingsregel» dedupliseres nå på e-post-ID før de lagres i state, slik at samme melding ikke rendres to ganger selv om backend skulle returnere duplikater.

## Versjon 1.0.73
**TLDR:** Regeldetaljer ligger nå øverst med full redigering, og test-popupen fokuserer på kjernetiltakene.

- Videresendingsregler kan nå redigeres direkte i test-popupen, inkludert alle match-kriterier for emne, brødtekst, mottaker, avsender og vedleggsnavn; backend godtar de samme feltene og validerer at hver liste består av trimmede strenger før lagring.
- Regeldetaljene er flyttet over datointervallet og viser sist brukt, oppdatert-tidspunkt og antall videresendinger, samt et rutenett som oppsummerer hvert kriteriefelt når redigering er skjult.
- Test-popupen viser kun «Kjør test» og «Videresend alle i tidsrommet» i handlingsraden etter at «Oppdater regelliste» og «Lukk»-knappene ble fjernet for å rydde opp i UI-et.

## Versjon 1.0.72
**TLDR:** Videresendingsregler dukker opp i testverktøyet med en gang de opprettes, og manuell modus lar deg markere valgfri tekst direkte i e-posten.

- Email.js eksponerer nå en `refreshForwardingRules`-callback som trigges etter fakturaveilederen, slik at test-popupen alltid får en oppdatert regelliste uten å laste siden på nytt.
- InvoiceQuestionnairePopup i EmailPopupandHandlers lar deg markere hvilken som helst tekst i steg 3 når ingen sammenligninger brukes, og instruksjonen forteller at markeringen legges til kriteriene umiddelbart.

## Versjon 1.0.71
**TLDR:** Fremhevingen i fakturaveilederen rendres igjen som ekte DOM-elementer, og Steg 3 er ryddet for overflødige paneler.

- EmailPopupandHandlers.js injiserer nå emne- og brødtekstforhåndsvisningene via refs slik at `span`-markeringene ikke lenger vises som rå tekst og klikking faktisk toggler kriterier.
- Fjernet de gamle adresse-/nøkkelordpanelene og strammet opp layouten slik at Steg 3 kun viser e-posten, auto-låste adresser og vedleggsvalg.
- Oppdaterte App.css med den nye, enklere highlight-seksjonen slik at styling matcher den forenklede DOM-strukturen.
- Emnefeltet i Steg 3 rendres nå alltid fordi highlight-DOM injiseres på nytt hver gang steget åpnes, og klikk lytter nå kun monteres mens steget er aktivt slik at markering av ord fungerer konsekvent.
- Valgte markeringer beholder samme gulfarge som hover-stylingen, så brukeren ser med én gang hvilke ord som er aktive krav.
- La tilbake analysemotor-funksjonene (`extractEmailBodyText`, `getCommonBodyTokens`) som ble mistet under oppryddingen, slik at Steg 3 igjen finner felles ord og UI-en slipper runtime-feil.
- Hele listen over foreslåtte e-poster kan nå klikkes hvor som helst for å velge/avvelge, kortene er 2,5x større med tydeligere typografi og scroll-rammen har fått høyere maks-høyde slik at flere forslag vises samtidig.
- Steg 3 reinitialiserer nå highlight-DOM og event-lytttere hver gang du går tilbake fra oppsummeringen, så e-posten er synlig og klikking på markerte ord fungerer med én gang.

## Versjon 1.0.70
**TLDR:** Fakturaveilederen lar deg plukke ord direkte fra e-postvisningen, og markeringene matcher nå faktisk felles tekst.

- Oppdaterte markør-algoritmer sørger for at både hele e-posttekster og enkeltord blir fremhevet selv når bare én e-post er valgt, slik at 99 % identiske meldinger får full dekning bortsett fra datoer og unike felter.
- Steg 3 i «Merk som faktura/kvittering»-veilederen viser nå emne og brødtekst med klikkbare markeringer samt en valgt-liste, slik at du kan bygge kriterier direkte fra innholdet i stedet for å bruke separate nøkkelord-lister.
- La til elegante chip-lister for valgte tekstbiter, mulighet for egendefinerte innslag og kompakte seksjoner for adresser, vedleggsnavn og ekstra til-/fra-filtre slik at hele konfigureringen skjer fra ett skjermbilde.

## Versjon 1.0.69
**TLDR:** IMAP-synk hopper nå over gigantiske meldinger i stedet for å krasje hele jobben.

- `fetchFolderMetadata` måler byte-størrelsen på hver melding og skipper alt over ~30MB, slik at `mailparser` ikke treffer Node sitt `offset out of range` ved ekstremt store vedlegg.
- Feil under behandling av én enkelt e-post fanges nå og logges pr. UID i stedet for å stoppe hele synkroniseringsjobben, slik at cron kan fortsette selv om én melding feiler.

## Versjon 1.0.68
**TLDR:** IMAP-synk lagrer fremdrift etter hvert batch slik at cron-jobben ikke starter på nytt ved uventede krasj.

- `fetchFolderMetadata` persisterer `highestUid` etter hver gruppe på 50 meldinger i tillegg til sluttskrivingen, slik at en midlertidig feil ikke tvinger full rehydrering av innboksen neste runde.

## Versjon 1.0.67
**TLDR:** Regnskapsadressene styres nå direkte fra lokasjonslisten, og fakturaveilederen henter alltid de ferskeste verdiene.

- Location-skjemaet normaliserer `accountingEmail` (trim + lowercase) slik at forwarding-regler og søk ikke skiller mellom formateringsvarianter.
- Adminpanelet viser og redigerer regnskapsadresser per lokasjon med tydelig felt, hjelpetekst og normalisering før lagring, slik at teknikerne kan oppdatere mottakere uten kodeendringer.
- Fakturaveilederen refresher lokasjonslisten hver gang popupen åpnes, slik at ny- eller endrede adresser er tilgjengelige umiddelbart etter at admin gjør endringer.

## Versjon 1.0.66
**TLDR:** Globale e-postsynkindikatorer viser nå én rad per jobb og er kun synlige for administratorer.

- EmailSyncContext i frontend sporer flere jobber parallelt, viser konto/mappe-informasjon i en stablet oversikt og auto-fjerner linjene når jobben er ferdig eller avbrutt.
- Den globale synkseksjonen i App-skjellet rendres kun for brukere med admin-rolle, med manuelle «Lukk»-knapper for feil og fullførte jobber slik at teknikere ikke ser produksjonsstøy.

## Versjon 1.0.65
**TLDR:** E-postsynk skjer nå i egne arbeidstråder per konto, og UI viser en diskret fremdriftsindikator mens innboksen hentes.

- Flyttet hele IMAP-synkroniseringen til dedikerte worker-tråder per e-postkonto slik at hovedserveren holder seg responsiv og cron-/API-kall legger jobber i kø i stedet for å blokkere.
- Lagt til kø- og statusendepunkter (`/api/email/sync` + `/api/email/sync-status/:jobId`) samt intern jobbstyring som logger status per konto/mappe.
- Oppdatert e-postmodulen i frontend til å gjøre asynkrone sync-kall, vente på jobbstatuser og vise en global, ikke-inngripende fremdriftslinje mens mappepåfyllingen kjører i bakgrunnen – synlig selv når brukeren navigerer til andre moduler.

## Versjon 1.0.64
**TLDR:** Varsler aktiveres først etter at en ny konto er ferdig initial-synket og kan fortsatt skrus av pr. konto.

- La til `initialFetchCompleted` flagg på e-postkontoer og sikret at `createNotification` må være aktivt før e-poster utløser varslingsreglene.
- Synkroniseringen hopper nå over varsler under første nedlasting av innboksen for en ny konto, og aktiverer varsler automatisk når første runde er ferdig.

## Versjon 1.0.63
**TLDR:** Massevideresending hopper ikke lenger over e-poster uten UID, og admin kan styre varsler per konto direkte i e-postmodulen.

- Fikset `forward-range`-flyten slik at e-poster uten IMAP-UID fortsatt videresendes med lagret innhold; bulkjobben stoppet tidligere etter første treff.
- Lagt til av/på-valg for «send varsler» når e-postkontoer opprettes/redigeres, og eksponerte feltet i `/api/email/accounts` slik at eksisterende kontoer får korrekt status i UI.

## Versjon 1.0.62
**TLDR:** Forhåndsvisningen i fakturaveilederen viser igjen korrekt formaterte e-poster.

- Oppdatert markeringslogikken i `EmailPopupandHandlers.js` slik at nøkkelord kun fremheves i tekstinnholdet og aldri inne i HTML-taggenes `style`/`class` attributter. Dette hindrer at inline-CSS brytes og sørger for at fakturaer (som subtel-malene) rendres som forventet under regelopprettelse.

## Versjon 1.0.61
**TLDR:** Lignende e-poster finner nå arkiverte treff og søker direkte i hele historikken til avsenderen.

- Fjernet den harde filtreringen på `folder: 'INBOX'` i `/api/email/similar`, slik at søket inkluderer arkiverte/etiketterte innboksmeldinger innenfor ett år. Dermed dukker historiske fakturaer fra samme avsender (som tidligere ble flyttet til Arkiv) igjen opp i «Lignende e-poster».
- Begrenset databaseforespørselen til samme avsender før vi sorterer/avgrenser resultatene, slik at eldre fakturaer ikke skyves ut av topplisten når innboksen har mer enn 1000 nyere meldinger fra andre leverandører.

## Versjon 1.0.60
**TLDR:** Lignende-fanen velger nå automatisk modus basert på valgene dine, og regeltesteren lar deg åpne e-posten direkte fra trefflisten.

- Steg 2 i fakturaveilederen antar nå at du vil bruke forslag dersom du har valgt minst én lignende e-post, skjuler de gamle radioknappene og oppdaterer «Neste»-knappen med teksten for den planlagte handlingen.
- Alle nøkkelord og felles tekstlinjer starter nå umarkert (med emne øverst i listen), slik at teknikere kan velge kun de kriteriene de faktisk ønsker å lagre.
- Testverktøyet for regler har fått en «Vis e-post»-knapp ved siden av «Videresend nå», slik at full melding kan inspiseres før man trykker send.
- Endepunktet /api/email/similar filtrerer nå treff til samme avsender over et helt år, og brukergrensesnittet gjenspeiler den nye tidsrammen og avsendersperren.

## Versjon 1.0.59
**TLDR:** Regeltesteren har fått dato-fra/til og skjult redigering, og ufordelte fakturaer kan massevideresendes i ett klikk.

- Redigeringspanelet i regeltesteren er nå sammenleggbart og skjules som standard, med en kort oppsummering som viser navn, regnskapsadresse og aktiv-status før man ekspanderer for å gjøre endringer.
- Baktestingen lar deg velge eksakt dato fra/til i stedet for «dager tilbake», og både frontend- og backend-logikken validerer intervallet og viser tydelige tidsstempel i sammendraget.
- Lagt til nytt `/api/forwarding-rules/:id/forward-range` endepunkt og tilhørende knapp i UI som videresender alle ufordelte e-poster i valgt tidsrom, inkludert vedleggshydrering og statusoppdatering av trefflisten.

## Versjon 1.0.58
**TLDR:** Fakturaregler krever nå riktig avsender/mottaker, kan navngis ved opprettelse og baktesting viser feltvise diagnoser.

- Utvidet ForwardingRule-modellen og matchingsutilene med støtte for `sender`-kriterier slik at automatisk videresending kun skjer når e-posten faktisk kommer fra forventet adresse.
- Fakturaveilederen henter nå både avsender og faktiske mottakere fra e-posten, legger dem automatisk inn i reglene i både auto- og manuell modus og sender disse feltene til backend ved lagring.
- Steg 4 i veilederen er redesignet med kort som viser avsender, mottakere, emne, brødtekst og vedlegg, noe som gjør oppsummeringen mer lesbar og forhindrer at regnskapsadressen feilaktig listes som mottaker.
- Teknikere kan navngi regler direkte i oppsummeringssteget, og backend lagrer navnet (med fornuftig fallback) slik at regellisten og tester viser menneskevennlige titler i stedet for bare regnskapskontoen.
- Baktest-verktøyet lar deg velge hvilke kriteriefelt som skal evalueres (med «Kun emne»-preset) og viser per felt hvilke kriterier som forventes, hvilke verdier som faktisk ble funnet og nøyaktig hvilke tekst-/adressebiter som mangler.
- Test-vinduet for videresendingsregler lar deg oppdatere navn, regnskapsadresse og aktiv-status direkte, samt slette regler uten å forlate popupen; tilhørende API-endepunkter støtter nå PATCH og DELETE.
- Når en regel slettes, frigjøres alle tilknyttede e-poster automatisk ved å sette `isInvoice` tilbake til false og fjerne forwarding-informasjon slik at veilederen kan brukes på nytt uten manuelle databaseendringer.
- Lagt til admin-endepunkt og knapp i e-postverktøylinjen for å nullstille alle fakturamerkinger (`isInvoice`, `forwardingRuleId`, `forwardedAt`) i ett klikk når man ønsker å starte opplæringen på nytt.

## Versjon 1.0.57
**TLDR:** Autoforward-regler lagres nå i en egen modell og kan testes mot historiske e-poster før de aktiveres.

- Flyttet alle fakturaregler til den nye `ForwardingRule`-modellen, migrerte eksisterende regler fra EmailMetadata og oppdaterte autoforward-jobben til å slå direkte opp i den sentrale samlingen.
- EmailMetadata peker nå på regler via `forwardingRuleId`, og backend svarene returnerer alltid oppslåtte regeldetaljer slik at frontend beholder dagens indikatorer.
- La til `/api/forwarding-rules`-endepunkter for å liste regler, simulere treff innenfor et valgt tidsrom og manuelt trigge videresending per e-post.
- E-postmodulen har fått en «Test videresendingsregler»-popup der teknikere kan velge regel, angi periode tilbake i tid, se hvilke e-poster som ville blitt sendt videre og trykke «Videresend nå» per treff.

## Versjon 1.0.56
**TLDR:** Fakturaveilederen analyserer nå hele brødteksten og markerer felles tekst i forhåndsvisningene for tryggere regelvalg.

- Lagt til automatisk henting av fulltekst for utvalgte lignende e-poster og analyse av alle ord som går igjen, slik at nøkkelord med høy treffprosent kan velges direkte som «må oppfylles»-kriterier.
- Originale e-poster og forhåndsvisninger viser nå felles ord og fraser med gul bakgrunn, og veilederen inkluderer en hurtigvisning av den aktuelle e-posten slik at teknikerne ser hva systemet faktisk bruker i reglene.
- Fjernet behovet for å krysse av brødtekst- og emnesetninger manuelt; systemet bruker nå automatisk de ordene som går igjen i både emnelinje og brødtekst.
- Til-feltet låses alltid til mottakeradressene fra den aktuelle e-posten/regnskapsadressen, slik at regler ikke kan trigges på feil leverandører uten riktig mottaker.
- La til søk/vis-mer i nøkkelord- og tekstlinje-listene samt mulighet til å fjerne enkeltord/-linjer, slik at teknikere kan skreddersy regelen uten å miste oversikten når mange treff dukker opp.
- Brødtekst-analysen fanger nå opp komplette linjer (tabeller, adresser, etiketter) og ignorerer årstall (19xx/20xx) slik at innholdet ikke brytes når kalenderåret endres.

## Versjon 1.0.55
**TLDR:** Forbedret fakturaveilederen med tydeligere valg, forhåndsvisning av lignende e-poster og nye kriterier for adresser og mottakerfelt i autoforward-regler.

- Gjorde veilederen mer lesbar ved å gi kontraststerke knapper, riktig justerte radio-/avkrysningsfelt og mulighet til å forhåndsvise og velge hvilke lignende e-poster som skal brukes i læringen.
- Lagt til egne forslag for adresser, postnumre og mottaker-e-poster slik at teknikere kan skille mellom f.eks. Bergen og Stavanger eller ulike fakturamottakere direkte fra bekreft likheter-steget.
- Utvidet backend-reglene slik at match-kriterier støtter flere verdier samt mottakerfelt, noe som gjør automatisk videresending mer treffsikkert når fakturaer skal rutes til riktig regnskapsadresse.
- Økte søkevinduet for lignende e-poster fra 30 dager til ett år slik at historiske fakturaer dukker opp i sammenligningen og gir bedre læringsgrunnlag.
- Henteloggen for lignende e-poster økes fra 200 til 1000 kandidater for å sikre at alle relevante fakturaer dukker opp selv i store innbokser før systemet velger de beste treffene.
- Forhåndsvisning av lignende e-poster åpnes nå i et eget popup-vindu, slik at hovedveilederen får bedre plass og detaljvisningen kan rulles separat.

## Versjon 1.0.54
**TLDR:** Innført læringsbasert fakturahåndtering med automatisk videresending til regnskapsadresser og tydelige indikatorer i e-postmodulen.

- La til komplett faktura-/kvitteringsveileder i e-postpopupen og e-postlisten med lokasjonsvalg, lignende e-postanalyse og regelgenerering før videresending.
- Utvidet Location- og EmailMetadata-modellene med `accountingEmail`, `isInvoice`, `forwardingRule` og `forwardedAt`, samt nye API-endepunkter for regnskapslokasjoner, lignende e-poster og fakturaklassifisering.
- Implementerte backend-autoforward av fakturaer basert på lagrede regler, støtte for målrettet regnskapsmottaker i /send-endepunktet og frontendvarsler/ikoner som viser når en melding er merket eller automatisk videresendt.

## Versjon 1.0.53
**TLDR:** Forbedret e-postsynkronisering med timeout for å hoppe over fastlåste e-poster, lagt til mulighet for å kontrollere notifikasjoner per e-postkonto, størrelsesgrense for e-postparsing, separat timeout for parsing, og optimaliserte parsing-innstillinger.

- Lagt til timeout (30 sekunder) på e-postbehandling under synkronisering; hvis en e-post tar for lang tid å behandle, hoppes den over med feilmelding i terminalen for senere feilsøking.
- Lagt til 'createNotification' felt i EmailAccount-modellen for å kontrollere om en konto skal sende notifikasjoner til ansatte.
- Endret notifikasjonslogikk slik at kun e-postkontoer med 'createNotification' aktivert sender notifikasjoner til ansatte ved nye e-poster.
- Lagt til størrelsesgrense på 10MB for e-postkropper; e-poster større enn dette hoppes over for å unngå parsing-heng.
- Lagt til separat 10-sekunders timeout for e-postparsing; hvis parsing tar for lang tid, hoppes e-posten over.
- Optimalisert parsing-innstillinger: hopp over HTML-til-tekst konvertering, begrens HTML-lengde til 100KB, og hopp over bilde-lenker for raskere parsing.

## Versjon 1.0.52
**TLDR:** Lagt til admin panel-knapp for opprydding av delantall-database for å fjerne ugyldige fargeoppføringer og slå sammen duplikater.

- Lagt til "Ryd Opp Delantall-database" knapp i admin panel faresone som kjører omfattende opprydding av delbeholdningsdata.
- Implementert bekreftelses-popup som forklarer hva oppryddingen gjør: fjerning av ugyldige fargeoppføringer, sammenslåing av duplikater og korrigering av dataintegritetsproblemer.
- Koblet frontend-knappen til eksisterende backend-endepunkt (/api/admin/cleanup-part-quantities) som allerede var implementert i adminPanel.js.

## Versjon 1.0.51
**TLDR:** Fikset feil hvor avkryssing av 'del på lager, men ikke registrert' i DiagnosisPopup ikke hindret billett fra å gå til 'Waiting for Parts'.

- Fikset feil hvor avkryssing av 'del på lager, men ikke registrert' i DiagnosisPopup ikke hindret billett fra å gå til 'Waiting for Parts'.

## Versjon 1.0.50
**TLDR:** Lagt til fargevalidering i backend add-part endepunkt for å forhindre opprettelse av ugyldige fargeoppføringer i delbeholdning.

- Implementert fargekompatibilitetsvalidering i /api/ticketlist/add-part endepunktet som validerer at valgte farger er kompatible med delens modeller før beholdningsoppføringer opprettes.
- Forhindret opprettelse av ugyldige fargeoppføringer i delbeholdning ved å legge til backend-validering som matcher frontend-valideringslogikk, noe som sikrer dataintegritet på tvers av alle deltilleggingsoperasjoner.

## Versjon 1.0.49
**TLDR:** Fikset fargevalidering ved deltillegging i diagnosepopup for å forhindre ugyldige fargeoppføringer i beholdningsdata.

- Korrigerte fargevalideringslogikk i DiagnosisPopup.js når nye deler legges til katalog, slik at systemet nå validerer at den valgte fargen er kompatibel med delens modeller og faller tilbake til første tilgjengelige kompatible farge hvis ikke.
- Forhindret opprettelse av ugyldige fargeoppføringer i delbeholdning som kunne føre til lagerkontrollfeil ved fremtidige deltillegginger i diagnoseprosessen.

**TLDR:** Oppdaget omfattende dataintegritetsproblemer i delbeholdning med 44 deler som har ugyldige fargeoppføringer, og laget verktøy for opprydding.

- Identifiserte systematiske problemer i delbeholdningsdata hvor fargeuavhengige deler har fargespesifikke oppføringer og flere duplikatoppføringer per lokasjon.
- Utviklet omfattende oppryddingsverktøy som analyserer og fikser beholdningsdata for alle deler, inkludert farging av kvanta fra ugyldige oppføringer til riktige "N/A" oppføringer for fargeuavhengige deler.
- Opprettet testskript for å validere lagerkontrollrettelser og identifisere dataintegritetsproblemer før produksjonopprydding.

## Versjon 1.0.46
**TLDR:** Fikset lagerkontrollfeil ved kundegodkjenning som fikk saker til å gå til "Venter på deler" selv når deler var på lager.

- Korrigerte lagerkontrolllogikk i customer-approval endepunktet for fargeuavhengige deler, slik at den nå spesifikt ser etter "N/A" fargeoppføringer i stedet for å matche enhver oppføring på lokasjonen, noe som løser problem hvor tilgjengelig lager ikke ble gjenkjent korrekt.

## Versjon 1.0.45
**TLDR:** Forhindret notatseksjonen fra å bli bredere enn billettkortet ved å legge til tekstbryting for lange URL-er og tekst.

- Lagt til word-break: break-word og max-width: 100% til .ticket-description-card CSS-klassen for å sikre at lange URL-er og tekst brytes korrekt innenfor kortgrensene.

## Versjon 1.0.44
**TLDR:** Løste lageroppdateringsproblemer ved automatisk delbestilling og forhindret duplikat lageroppføringer som forårsaket feilaktige beholdningstall.

- Fikset automatisk delbestillingsprosess ved å importere autoCreateOrders-funksjonen i part.js, noe som sikrer at daglige lagerpåfyllinger kjører korrekt.
- Forbedret updatePartQuantities-funksjonen til å håndtere og flette duplikat lageroppføringer før oppdatering, noe som løser problem hvor lagerbeholdning ikke oppdaterte seg riktig når automatiske bestillinger ble markert som ankommet.

## Versjon 1.0.43
**TLDR:** Fikset visuell prioritering av sak-handlinger slik at uleste kundeoppdateringer overstyrer høy prioritet-farge.

- Løste visuell feil hvor sak-handlinger viste høy prioritet-farge i stedet for ulest kundeoppdatering-farge når begge statuser var til stede.

## Versjon 1.0.42
**TLDR:** Løste problem hvor tillegging av sporingsnummer til delbestillinger ikke oppdaterte saksprioritet fra høy til lav i brukergrensesnittet før sideoppdatering.

- Fikset handleAddTracking-funksjonen i OrderPopups-komponenten for å oppdatere saksprioritet til lav når sporingsnummer legges til, noe som sikrer umiddelbar visuell oppdatering uten behov for sideoppdatering.
- Forbedret feilhåndtering og responsvalidering i sporingsfunksjonaliteten for å forhindre popup-låsning og sikre pålitelig oppdatering av brukergrensesnittet.

## Versjon 1.0.41
**TLDR:** Tillatt teknikere å chatte med kunder de ikke er tildelt til, noe som forbedrer kommunikasjonen på tvers av teamet.

- Fjernet tildelingsrestriksjoner i chat-endepunktene for å tillate teknikere å sende SMS, legge til oppdateringer og markere meldinger som sett for alle saker, ikke bare de de er tildelt.

## Versjon 1.0.40
**TLDR:** Forbedret CreateTicket brukergrensesnitt med bedre layout, justering og lesbarhet for optimal brukeropplevelse.

- Omstrukturerte CreateTicket-komponenten ved å flytte alle avkrysningsbokser og radioknapper til en dedikert alternativseksjon under skjemaet, noe som skaper bedre visuell separasjon og reduserer rot.
- Forbedret vertikal justering mellom "Kundeinformasjon" og "Saksdetaljer"-seksjonene ved å justere beskrivelsesfeltets høyde for perfekt balanse.
- Økte skriftstørrelser på tvers av brukergrensesnittet: formfelt (14px→16px), seksjonstitler (14px→18px), alternativtitler (14px→16px) og avkrysnings-/radiotekst (14px→16px) for bedre lesbarhet, spesielt i sollys.
- Løste knappbreddeinkonsistens ved å sikre at "Opprett Sak" og "Send i app"-knapper har identisk bredde på 140px minimum.
- Implementert spesifikke CSS-klasser for radioknapper (.radio-label) med optimal tekstavstand for bedre visuell konsistens.

## Versjon 1.0.39
**TLDR:** Implementert manuell hylleoppføring når systemet går tom for automatisk tildelte hyller, slik at teknikere kan opprette saker selv når alle hyller er opptatt.

- Lagt til automatisk deteksjon av hylleutfordringer i CreateTicket-komponenten hvor systemet oppdager når backend returnerer "ingen tilgjengelige hyller"-feil.
- Implementert manuell hylleoppføring med brukergrensesnitt som viser klar melding om at automatisk hylletildeling ikke er mulig og krever manuell oppføring.
- Gjort hylle-feltet påkrevd og aktivert det når manuell oppføring er nødvendig, samtidig som det opprettholdes eksisterende logikk for spesialtilfeller som "Kunde har" og "Gulv".
- Opprettet testskript fill_all_shelves.js som fyller alle tilgjengelige hyller med testbilletter for å muliggjøre testing av manuell hylleoppføring-funksjonalitet.

## Versjon 1.0.38
**TLDR:** Løste feil hvor "createdById is not defined" oppstod ved teknikeroppdateringer, og sikret at skjemaet tømmes etter manuell SMS-sending.

- Fikset variabeldeklarasjon i teknikeroppdateringsruten for å unngå "createdById is not defined"-feil ved kartlegging av kundeoppdateringer.
- Oppdaterte CreateTicket-komponenten slik at skjemaet tømmes og utkast slettes etter vellykket manuell SMS-sending via "Send i app"-knappen.

## Versjon 1.0.37
**TLDR:** Løste problem hvor teknikere fikk "1 ulest melding"-ikon for egne sendte meldinger ved å sikre at alle kundeoppdateringer markeres som sett når teknikere sender oppdateringer.

- Modifiserte teknikeroppdateringsrutene i ticketList.js og chat.js for å markere alle eksisterende kundeoppdateringer som sett av tekniker (seenByTech: true) før nye teknikeroppdateringer legges til, noe som forhindrer falske uleste melding-varsler for teknikere som sender meldinger via "Send i app"-funksjonaliteten.

## Versjon 1.0.35
**TLDR:** Organisert test- og sjekkskript i dedikert test-mappe for bedre kodeorganisering.

- Flyttet alle test- og sjekkskript fra Backend/ til Backend/test/ for å forbedre kodeorganisering og vedlikeholdbarhet.
- Oppdaterte utviklerinstruksjoner for å lagre fremtidige testskript i Backend/test/-mappen.

## Versjon 1.0.34
**TLDR:** Implementert fullt funksjonell multicore spam-sortering med korrekte beregninger, responsiv brukergrensesnitt og tekniske verktøy for å inspisere ordpoeng.

## Versjon 1.0.33
**TLDR:** Løste problem hvor billett-popup viste spam-e-poster og e-poster fra kunder uten registrerte e-postadresser ved å implementere streng filtrering som kun viser legitime kunde-e-poster.

- Modifiserte GET /api/email/ endepunkt for å kun returnere e-poster når kunder har registrerte e-postadresser og avsenderadressen matcher kundens registrerte e-post.
- Løste problem hvor spam-e-poster og feilaktig lenkede e-poster fra kunder uten registrerte e-postadresser ble vist i billett-popupens e-post-nedtrekksmeny.
- Implementert toveis e-postvisning som viser både e-poster sendt av kunder (fra-adresse matcher registrert e-post) og e-poster sendt til kunder (til-adresse matcher registrert e-post).

## Versjon 1.0.32
**TLDR:** Løste importfeil for ikke-eksisterende 'syncSentEmailsWithCustomers'-funksjon som forhindret serveroppstart.

- Fjernet kall til ikke-implementert 'syncSentEmailsWithCustomers'-funksjon fra adminPanel.js som forårsaket "export named 'syncSentEmailsWithCustomers' not found"-feil under modulinnlasting.

## Versjon 1.0.31
**TLDR:** Løste MongoDB-transaksjonsfeil i kunde-e-postsammenslåingsfunksjonalitet ved å fjerne transaksjonskrav for kompatibilitet med frittstående MongoDB-instanser.

- Fjernet MongoDB-transaksjonsbruk fra kunde-e-postsammenslåingsfunksjonalitet for å løse "Transaction numbers are only allowed on a replica set member or mongos"-feil på frittstående MongoDB-instanser.
- Bevart all funksjonalitet for automatisk sammenslåing av dupliserte kundee-poster mens operasjonene nå kjører uten transaksjonelle garantier.

## Versjon 1.0.30
**TLDR:** Løste problem hvor sendte e-poster ikke kunne åpnes i billett-popupen på grunn av null UID-feil, og sikret at alle e-postoperasjoner fungerer korrekt for både sendte og mottatte e-poster.

- Løste feil hvor klikking på sendte e-poster i billett-popupen viste ingenting og genererte serverfeil på grunn av null UID-verdier.
- Modifiserte alle e-post-API-endepunkter for å håndtere sendte e-poster ved å bruke lagret databaseinnhold i stedet for IMAP-operasjoner når UID er null.
- Sikret at e-postoperasjoner som åpning, merking som lest/ulest, vedleggstilgang og sletting fungerer korrekt for både sendte og mottatte e-poster.

## Versjon 1.0.29
**TLDR:** Implementert automatisk sammenslåing av dupliserte kundee-poster for å sikre at e-poster fra kunder med midlertidige telefonnumre flyttes til kunder med gyldige telefonnumre, og lagt til admin-knapp for manuell kjøring av sammenslåingsprosessen.

- Lagt til customerMerge.js verktøyfil med funksjoner for å identifisere og slå sammen dupliserte kundee-poster basert på e-postadresser, hvor e-poster fra kunder med midlertidige telefonnumre automatisk flyttes til kunder med gyldige telefonnumre.
- Implementert automatisk e-postsammenslåing i kundeopprettings- og kundeoppdateringsrutene som kjører når kunder opprettes eller oppdateres med e-postadresser.
- Lagt til POST /api/admin/merge-customer-emails admin-endepunkt for manuell kjøring av sammenslåingsprosessen på tvers av alle kunder.
- Lagt til "Slå Sammen Dupliserte Kundee-poster" knapp i AdminPanel under "Administrer Kunder" seksjonen for å kjøre manuell sammenslåing.

## Versjon 1.0.28
**TLDR:** Forbedret plassutnyttelse i TicketPopup ved å skjule ikke-aktive seksjoner når en seksjon åpnes, noe som gir mer plass til innholdet og bedre brukeropplevelse.

- Implementert plassbesparende funksjonalitet i TicketPopup hvor kun den aktive seksjonen vises når en seksjon åpnes, mens de andre seksjonene skjules for å gi mer plass til innholdet. Når alle seksjoner lukkes, blir alle seksjonene synlige igjen.

## Versjon 1.0.27
**TLDR:** Løste feil hvor DiagnosisPopup viste total lagerbeholdning på tvers av alle lokasjoner i stedet for kun beholdningen på teknikerens lokasjon, og sikret at fargeavhengige deler filtreres riktig etter valgt farge.

- Fikset dellagerberegning i DiagnosisPopup for å filtrere mengder etter teknikerens lokasjon og valgt farge for fargeavhengige deler, noe som sikrer at teknikere ser korrekt tilgjengelig beholdning for sin arbeidsplass i stedet for totalsummer på tvers av alle lokasjoner.

## Versjon 1.0.26
**TLDR:** Endret dellogikk for å tillate fargeuavhengige deler å brukes fra alle lokasjoner, mens fargeavhengige deler fortsatt krever riktig lokasjon og farge.

- Modifiserte kundegodkjenningslogikken i ticketList.js for å summere tilgjengelige mengder på tvers av alle lokasjoner for fargeuavhengige deler, slik at deler kan brukes fra hvilken som helst lokasjon når de finnes på lager totalt, mens fargeavhengige deler fortsatt må være på riktig lokasjon med riktig farge.

## Versjon 1.0.25
**TLDR:** Løste feil hvor fargeuavhengige deler på datamaskiner med farger ikke ble gjenkjent som tilgjengelige på lager under kundegodkjenning.

- Lagt til modellmatching i delsjekking-logikken i ticketList.js for å sikre at deler kun matches mot riktige modellkvantiteter på lager, noe som løser problem hvor fargeuavhengige deler feilaktig ble satt til "Venter på deler"-status selv når de var tilgjengelige.

## Versjon 1.0.24
**TLDR:** Fjernet ubrukt kundegodkjenningsrute fra tickets.js for å rydde opp i kodebasen.

- Fjernet ubrukt `/api/tickets/:id/customer-approval` rute fra tickets.js siden frontend kun bruker tilsvarende ruter i ticketList.js og customerTickets.js.

## Versjon 1.0.23
**TLDR:** Løste feil hvor saker ble satt til "Venter på deler" status selv når deler var tilgjengelige på lager under kundegodkjenning.

- Løste lokasjonssammenligningsfeil i delsjekking som forhindret korrekt gjenkjenning av tilgjengelige deler på lager under kundegodkjenning.

## Versjon 1.0.22
**TLDR:** Lagt til omfattende endringslogg-funksjonalitet i utvikler-popup med norsk oversettelse, TLDR-sammendrag og utvidbar brukergrensesnitt for bedre oversikt over systemendringer.

- Implementert backend API-endepunkt (/api/changelog) som parser CHANGELOG.md-filen og returnerer strukturert data med versjoner, TLDR-sammendrag og detaljerte endringer.
- Lagt til "Oppdateringer"-fanen i utviklerforslag-popup som viser endringsloggen med moderne, utvidbar brukergrensesnitt hvor TLDR-sammendrag er synlig som standard og detaljer kan utvides med klikkbare knapper.
- Oversatte alle eksisterende endringsloggoppføringer til norsk med korrekt grammatikk og teknisk terminologi, inkludert tillegg av TLDR-sammendrag (maksimalt 2 setninger) for hver versjon.
- Forbedret brukergrensesnittet med kompakt layout hvor TLDR-tekst vises direkte under versjonstitler og mindre utvidelsesknapper for bedre visuell hierarki og brukeropplevelse.
- Sikret at endringsloggen lastes dynamisk og håndterer feiltilstander med passende norsk feilmeldinger.

## Versjon 1.0.21
**TLDR:** Løste korrupte dellenker ved å normalisere lenkeformater på tvers av alle endepunkter og sikre at lenker alltid lagres som objekter med url og addedAt-felt.

- Løste problem med korrupte del-lenker ved å normalisere lenkeformater på tvers av alle endepunkter. Oppdaterte PUT-ruten i part.js og flettingsfunksjonalitet for å sikre at lenker alltid lagres som objekter med url og addedAt-felt, noe som forhindrer lagring av feilformet data. Verifiserte at det ikke finnes eksisterende korrupte lenker i databasen.

## Versjon 1.0.20
**TLDR:** Forbedret delbestillingshåndtering med bedre leverandørgruppering, automatisk leverandørdeteksjon og løste kritisk datahentingsfeil som forhindret bestillinger fra å vises.

- Forbedret PartOrderList-komponenten med bedre leverandørgruppering ved å implementere normalisering av leverandørnavn som ikke skiller mellom store og små bokstaver, noe som forhindrer duplikatgrupper fra variasjoner som "topmedia.nl" vs "topmedia".
- Lagt til automatisk leverandørdeteksjon fra URL-er når lenker legges til bestillinger, som automatisk setter riktig leverandør basert på domenet.
- Implementert rulle-til-bestilling-funksjonalitet som jevnt ruller til og fremhever bestillinger når de flytter mellom leverandørgrupper etter leverandørendringer eller lenketillegg.
- Lagt til endepunkt for normalisering av leverandørnavn i databasen for å standardisere alle eksisterende leverandørnavn.
- Løste kritisk problem med datahenting som forhindret delbestillinger fra å vises ved å legge til korrekt useEffect for å kalle fetchData ved komponentmontering.

## Versjon 1.0.19
**TLDR:** Løste lenkesletting i katalogadministrasjon og forhindret modeller fra å forsvinne ved åpning/lukking av komponenter.

- Løste lenkesletting i katalogadministrasjon ved å oppdatere backend til å håndtere lenker-feltet riktig i deloppdateringsforespørsler.
- Løste problem hvor modeller forsvant ved åpning og lukking ved å forhindre event bubbling i merke- og modellvekslingshåndterere.

## Versjon 1.0.18
**TLDR:** Løste billett-popup i lønnsoversikt til å åpne med riktig seksjon og fikset klikking på billettnumre som ikke fungerte.

- Løste billett-popup i WageOverview til å åpne med info-seksjonen i stedet for notater når billettnumre klikkes.
- Løste problem hvor klikking på billettnumre i lønnsoversikt ikke åpnet billett-popupen i det hele tatt.

## Versjon 1.0.16
**TLDR:** Forbedret reparasjonsprisvalidering i DiagnosisPopup for å gi bedre brukerfeedback når priser mangler på noen alternativer.

- Løste tooltip og knapp deaktiveringslogikk i DiagnosisPopup for å vise valideringsmelding for reparasjonspris og deaktivere knappen når noen alternativer mangler reparasjonspris (endret fra å kreve at alle alternativer mangler pris), noe som sikrer konsistent brukerfeedback når reparasjonsprising er ufullstendig.

## Versjon 1.0.15
**TLDR:** Gjorde reparasjonsprisvalideringsmeldinger mer eksplisitte i DiagnosisPopup for bedre brukerforståelse.

- Forbedret tooltip og feilmelding for validering av reparasjonspris i DiagnosisPopup for å være mer eksplisitt: "Reparasjonspris mangler: Angi pris for alle alternativer før du kan fullføre diagnosen."

## Versjon 1.0.14
**TLDR:** Fjernet overflødig advarsel-popup og forbedret reparasjonsprisvalidering med bedre brukerfeedback i DiagnosisPopup.

- Fjernet overflødig advarsel-popup for delvalidering i DiagnosisPopup siden knappen nå er riktig deaktivert med klare tooltips og synlige feilmeldinger.
- Lagt til validering av reparasjonspris for å deaktivere "Fullfør"-knappen når enheten kan repareres, ikke er under garanti, og ingen reparasjonspris er satt for noen alternativer, noe som sikrer at diagnose ikke kan fullføres uten korrekt prising.
- Oppdaterte tooltips og synlige feilmeldinger under knappen for å inkludere feedback for validering av reparasjonspris.

## Versjon 1.0.13
**TLDR:** Lagt til synlige forklaringer under deaktiverte knapper i DiagnosisPopup så brukere forstår hvorfor handlinger ikke kan utføres.

- Lagt til synlige tekstmeldinger under den deaktiverte "Fullfør"-knappen i DiagnosisPopup som forklarer hvorfor knappen er deaktivert når deler trengs men mangler nødvendig informasjon (merke, modell eller gyldige deler), noe som sikrer at brukere ser forklaringen selv når tooltips er deaktivert.

## Versjon 1.0.12
**TLDR:** Lagt til dynamiske tooltips som forklarer hvorfor knapper er deaktivert når nødvendig informasjon mangler i DiagnosisPopup.

- Lagt til dynamisk tooltip til "Fullfør"-knappen i DiagnosisPopup som forklarer hvorfor knappen er deaktivert når deler trengs men mangler nødvendig informasjon (merke, modell eller gyldige deler).

## Versjon 1.0.11
**TLDR:** Lagt til bekreftelses-popup når diagnose fullføres uten å ha lagt til nødvendige deler.

- Lagt til en advarsel-popup når diagnose fullføres hvis "Deler nødvendig" er krysset av men ingen deler er lagt til, som spør brukeren om å bekrefte hvis de ønsker å fortsette.

## Versjon 1.0.10
**TLDR:** Forbedret kundelogging med mer brukervennlige feilmeldinger og bedre brukeropplevelse.

- Forbedret feilmeldinger for kundelogging for å være mer brukervennlige ved å erstatte tekniske "Ugyldige legitimasjoner" med spesifikke "Telefonnummer eller passord er feil" og standardisere generisk feilhåndtering.
- Forbedret kundeloggingssiden.

## Versjon 1.0.9
**TLDR:** Løste duplikatbestillinger i automatisk bestillingsgenerering og forbedret håndtering av deler som er på vei.

- Løste automatisk bestillingsgenerering for å forhindre duplikatbestillinger ved å sjekke for eksisterende automatiske bestillinger som er markert som laget men ikke ennå ankommet. Løste også ankomstlogikken for å håndtere partsOnTheWay-oppdateringer og lageraddisjoner for automatiske bestillinger riktig.

## Versjon 1.0.8
**TLDR:** Tillot "+"-tegn i telefonnummer for internasjonale numre mens SMS-levering og kundeoppslag opprettholdes.

- Løste telefonnummer-inndata i Opprett billett for å tillate "+"-tegn for internasjonale numre, samtidig som det bevares for SMS-levering mens korrekt kundeoppslag opprettholdes.

## Versjon 1.0.7
**TLDR:** Lagt til direktenavigasjon til billettsiden fra kunde-godkjenningsvarsler.

- Lagt til mulighet til å klikke på "Kunde har godkjent sak"-varsler for å navigere direkte til billett-siden med billetten automatisk søkt opp og vist.

## Versjon 1.0.6
**TLDR:** Løste rulleproblemer i varsler og fikset sletting av kommentarer i utviklingsforslag-popup.

- Løste horisontal rulleproblem i varsler ved å legge til tekstbryting og forhindre overløp.
- Løste problem hvor sletting av kommentarer i utviklingsforslag-popup feilet med 404-feil. Lagt til manglende DELETE-rute og forbedret frontend-tillatelsessjekker.

## Versjon 1.0.5
**TLDR:** Løste språkblanding i engelske gjenopprettings-SMS-meldinger.

- Løste blandet språkproblem i engelske gjenopprettings-SMS-meldinger hvor gjenopprettingsdetaljer ble vist på norsk i stedet for engelsk.

# Nedenfor ble lastet opp 25.10.2025

## Versjon 1.0.4
**TLDR:** Løste brukerfastlåsing ved utløpte JWT-tokens med automatisk utlogging og bedre feilhåndtering.

- Løste problem hvor brukere sitter fast på "laster..." med uautoriserte feil når JWT-tokens utløper. Lagt til automatisk utlogging og omdirigering til innloggingsside ved 401-svar (autentiseringsfeil), samtidig som korrekt håndtering av 403-svar (tillatelse nektet) som ikke krever utlogging opprettholdes.

## Versjon 1.0.3
**TLDR:** Løste problem hvor nylig lagt til deler ikke dukket opp umiddelbart i delvalg-nedtrekksmenyen.

- Løste problem hvor nylig lagt til deler i DiagnosisPopup ikke dukket opp umiddelbart i delvalg-nedtrekksmenyen uten å åpne popupen på nytt.

## Versjon 1.0.2
**TLDR:** Forbedret e-post- og SMS-avsending med bedre standardinnstillinger og pålitelighet.

- Løste e-post-avkrysningsboks til å starte uavkrysset som standard i stedet for auto-kryssing for kunder med e-postadresser.
- Løste e-postsending til kun å skje når e-post-avkrysningsboksen er eksplisitt krysset av av brukeren.
- Forbedret pålitelighet for e-post- og SMS-av/på-brytere ved å bruke korrekte tilstandsoppdateringsfunksjoner.
