bmc_hub/docs/workflow-manuel-testplan.md

386 lines
30 KiB
Markdown
Raw Normal View History

# Manuel testplan – workflows, tags og afregning
Dato: 8. oktober 2026. Grundlag: lokal implementering `b398278` og [implementeringsstatus](workflow-status.md).
Planen er til manuel accepttest; nedenstående resultater er forventninger, ikke allerede udførte manuelle tests. Kør i rækkefølge. Sæt hver test til **Bestået / Fejlet / Ikke testet**, og notér ID'er og observationer i skemaet nederst.
## Nye sider
Links bruger standardporten 8001. Log ind på den lokale Hub først.
De nye administrationssider findes i hovedmenuen **Automatisering**. Menupunkterne følger brugergruppernes rettigheder: Workflows og Workflowdrift kræver `workflows.view`; Aftaledækning kræver både `workflows.view` og `workflows.manage`; Tagklassifikation kræver `system.admin`. Personlige menuindstillinger kan desuden skjule et tilladt punkt. Hvorfor åbnes fortsat fra den konkrete tid.
| Side | Lokalt link | Indhold |
|---|---|---|
| Workflow Builder | [Åbn workflows](http://localhost:8001/workflows) | Regler, versioner, simulator, aktivering, kopiering og deaktivering |
| Aftaler og klippekort | [Åbn aftaledækning](http://localhost:8001/workflows/resources) | Inkluderede/udelukkede tags, undertags og månedspris |
| Workflowdrift | [Åbn drift og eksport](http://localhost:8001/workflows/operations) | Faktisk motortilstand, kø, fejlede hændelser, genforsøg og eksportafstemning |
| Afregningsbeslutning | `http://localhost:8001/workflows/time/TIDS_ID` | Hvorfor, beslutningshistorik, manuel overstyring og genberegning. Erstat TIDS_ID med en faktisk tidsregistrerings ID; siden åbnes også via Hvorfor i økonomikøen |
| Taghierarki og klassifikation | [Åbn klassifikation](http://localhost:8001/tags/classification) | Overtagsstruktur, nøgleordsregler, AI-forslag, godkendelse og taghistorik |
Eksisterende sider, som er udvidet og også skal testes:
- [Økonomikø](http://localhost:8001/economy/time-queue): workflowmetode, Hvorfor, godkendelse og valg mellem separate/samlede fakturalinjer.
- [Tags](http://localhost:8001/tags): oprettelse af tags og link til klassifikation.
- [Fastprisrapporter](http://localhost:8001/fixed-price-agreements/reports/dashboard): pris-/kostprisestimater og det eksisterende forbrugsgrundlag.
- Sagsvisning, tidscomposer og bundbar: eksisterende sider/komponenter, hvor medarbejderens afregningsvalg skjules for aktive workflowkunder.
## 1. Miljø og startpunkt
Brug kun den lokale udviklingsinstallation, normalt `http://localhost:8001`. Hvis lokalporten er ændret, brug den faktiske lokale port. Brug ikke produktionsadressen. Migrationerne 1062–1066 er installeret lokalt; motoren er som udgangspunkt slukket.
- Brug en særskilt testkunde, fx `WF TEST – må ikke faktureres`, og nye testsager med præfikset `WF TEST`. Brug **ikke kunde 24**, medmindre den faktisk er en isoleret testkunde.
- En gendannet testdatabase kan indeholde rigtige kunder og integrationer. Kontrollér, at øvrige lokale schedulerjobs og integrationer ikke sender til produktion. Workflowflagene styrer kun den nye motor.
- Brug en administrator til opsætning, en almindelig medarbejder til tidsregistrering og en bogholder med workflowrettigheder til godkendelse. Administratoren kan gennemføre første runde alene; gentag rettighedstesten med separate brugere.
- Workflowrettigheder: `workflows.view`, `workflows.manage`, `workflows.activate`, `workflows.decisions.view`, `workflows.override`, `workflows.settle`. Tagadministration kræver `system.admin`. Roller får ikke automatisk de nye rettigheder.
- Tag et nyt lokalt checkpoint før aktive tests. Kommandoerne nedenfor ændrer ikke konfiguration automatisk.
I **zsh**, fra `/Users/christianthomas/DEV/bmc_hub_dev`, vis først backuphandlingen:
```zsh
./.venv/bin/python scripts/workflow_backup.py backup
```
Opret derefter backuppen:
```zsh
./.venv/bin/python scripts/workflow_backup.py backup --apply --confirm BACKUP-LOCAL-BMC
```
Notér den udskrevne mappe. `/private/tmp` er midlertidig opbevaring; bevar en privat kopi varigt. [Tilbageførsel](workflow-rollback.md) beskriver de forskellige muligheder.
### Skift testtilstand
Ret kun de nedenstående nøgler i den **lokale `.env`**; bevar resten af filen og eventuelle eksisterende værdier til senere gendannelse. Kundelisten er en bagudkompatibel JSON-standard med **Hub-kunde-ID’er**, ikke vTiger-ID’er. Nye kundetilvalg styres fra kundekortet.
| Nøgle | Slukket | Skyggetilstand | Aktiv test |
|---|---|---|---|
| `WORKFLOWS_ENABLED` | `false` | `true` | `true` |
| `WORKFLOWS_MODE` | `shadow` | `shadow` | `active` |
| `WORKFLOWS_CUSTOMER_IDS` | `[]` | `[]` | `[]` |
| `WORKFLOWS_INTERNAL_ENABLED` | `false` | `false` | `false` |
| `WORKFLOW_AI_ENABLED` | `false` | `false` | `false` |
Aktivér testkunde A på CRM-kundekortet under Oversigt → Workflows → Brug workflows for kunden; skriv en begrundelse og klik Gem. Kundelisten kan nu stå tom. En eksisterende miljøkundeliste bruges kun som standard, indtil kunden har et gemt valg. Et gemt Fra gælder også for en kunde på miljølisten. En aktiveret workflowversion og en aktiveret motor er fortsat to forskellige ting; begge skal være sat korrekt.
Efter ændringer til `.env` skal Docker-servicen genskabes, fordi `env_file` indlæses ved oprettelse. En almindelig restart er ikke tilstrækkelig til at erstatte containerens gamle miljøvariabler.
Kontrollér først Compose-filen i zsh:
```zsh
docker compose -f docker-compose.yml config --quiet
```
Hvis den består, genopret kun den lokale API-service:
```zsh
docker compose -f docker-compose.yml up -d --no-deps --force-recreate api
```
Kontrollér derefter den faktiske tilstand på `/workflows/operations`. Fortsæt kun, når banneret viser den forventede tilstand og kundeliste. Ved brug af lokal uvicorn i stedet for Docker: stop og start den samme lokale proces med den opdaterede konfiguration.
## 2. Testdata
Opret via de eksisterende kunde-, aftale-, kort-, tag- og sagsskærme. Brug samme testkunde til alle finansielle tests og en anden testkunde uden for kundelisten til kontrol.
| Data | Opsætning / ID, du skal notere |
|---|---|
| Kunde A | Workflowtestkunde, Hub-ID: ______ |
| Kunde B | Kontrolkunde uden for kundelisten, Hub-ID: ______ |
| Tags | `WF TEST Microsoft` → `WF TEST Office` → `WF TEST Excel`; desuden `WF TEST Mobiltelefoni` og `WF TEST IT-support` |
| Excel-nøgleord | Hele ord: `Excel`; alternativer `regneark`; særskilt Indeholder-regel: `.xlsx`; negativt ord `uden Excel`; prioritet 10 |
| Fastprisaftale A | Aktiv for kunde A, gældende i testperioden; fx 20 timer og intern kostpris 300 kr./time; notér ID |
| Klippekort A | Aktivt for kunde A, 2 timer til rådighed, afrunding 30 minutter; notér ID og startsaldo |
| Sag A1 | Kunde A, titel `WF TEST Excel`, manuel tagtildeling Excel |
| Sag A2 | Kunde A, titel `WF TEST Mobil`, tag Mobiltelefoni |
| Sag A3 | Kunde A, titel `WF TEST Kort`, tag IT-support |
| Sag B1 | Kunde B, titel `WF TEST Kontrol` |
| Fakturavare | Et eksisterende aktivt Hub-varenummer med korrekt e-conomic-tilknytning; notér nummeret. Ellers test lokal standardvare og spring specifik varetest over |
Tags oprettes på `/tags`; overtag og nøgleord vedligeholdes på `/tags/classification`. Markér de tags, som bruges til afregning, med **Kan påvirke afregning**. Brug testtags i en gruppe, der tillader flere tags, så eksisterende enkeltvalgsregler ikke forstyrrer testen.
På `/workflows/resources`: sæt aftale A til at dække Microsoft inklusive undertags, udelukke Mobiltelefoni og have månedspris 15.000 kr. Sæt kort A til kun at dække IT-support. Gem og genåbn for at kontrollere værdierne. Ændr kun testressourcer.
### Testworkflows
Opret på `/workflows`. Felter og handlinger har danske navne: `tag_ids` vises som Tags, `contains` som Indeholder og `hours` som Timer. Sæt **Kunde** til kunde A. Brug Tags + Indeholder til tagbetingelser.
| Navn | Prioritet | IF | Handling | Stop efter match |
|---|---:|---|---|---|
| WF TEST Mobil | 10 | Tag indeholder Mobiltelefoni | Vælg afregning → Faktura, evt. testvarenummer | Ja |
| WF TEST Kort | 20 | Tag indeholder IT-support | Vælg afregning → Klippekort, vælg kort A | Ja |
| WF TEST Office | 30 | Tag indeholder Microsoft, Medtag undertags = ja | Vælg afregning → Fastpris, vælg aftale A | Ja |
| WF TEST Standard | 100 | `hours` `gt` `0` | Send til manuel vurdering, begrundelse `Ingen testregel dækkede arbejdet` | Ja |
Trigger skal være **Tid oprettet** (`time.created`). Gem, test den gemte version med en relevant sag, og aktivér den testede version. Lav derefter kopier med trigger **Tid ændret** (`time.updated`), gem, test og aktivér dem. Oprettelsesregler matcher ikke automatisk ændringshændelser; begge sæt er nødvendige til genberegningstests.
Aktivér kun testreglerne. Eksisterende aktive regler kan påvirke resultatet; notér dem og gennemgå deres scope før testen. Simulatoren tester den valgte definition, mens køen evaluerer alle relevante aktive workflows.
## 3. Slukket motor og simulator
### T01 – Eksisterende arbejdsgang
1. Sæt slukket tilstand og kontrollér banneret.
2. Registrér almindelig tid på sag B1 gennem den normale medarbejderskærm.
3. Åbn økonomikøen `/economy/time-queue` og kontrollér den eksisterende afregningsarbejdsgang.
**Forventet:** ingen ny automatisk workflowbeslutning. På V5 gemmes hurtigregistrering som kladde; manuelt valg findes under Tidsregistrering. V4 og den hidtidige økonomikø bevarer deres arbejdsgang. Undlad afregning af kontroltiden.
### T02 – Hierarki, søgning og cyklus
1. Find Excel på `/tags/classification`. Kontrollér stien Microsoft / Office / Excel.
2. Søg på `Excel`, derefter `Microsoft`. Kontrollér også tagvælgeren på en testsag.
3. Forsøg at sætte Microsofts overtag til Excel.
**Forventet:** søgning og tagvalg virker; cyklusforsøget afvises og det oprindelige hierarki bevares efter genindlæsning.
### T03 – Simulator og undertags
1. Åbn Office-workflowet og vælg **Eksisterende data → Sag**, ID A1.
2. Klik **Test gemt version**. Kontrollér Fastpris og match på Microsoft med undertags.
3. Notér kortsaldo, aftaleforbrug og antal testordrekladder. Gentag testen tre gange.
4. Gem en ny version med Medtag undertags = nej, og test samme sag.
**Forventet:** den første version matcher Excel gennem Microsoft. Den anden matcher ikke Microsoft, når kun Excel er tildelt. Simulatoren ændrer hverken tags, saldo, forbrug eller kladder. Gem en tredje version med undertags aktiveret igen til de følgende tests.
### T04 – Versioner, kopiering og tilbagevalg
1. Kontrollér at **Aktivér testet version** er deaktiveret før test.
2. Test, og ændr derefter en betingelse uden at gemme. Aktivér må igen være deaktiveret.
3. Gem en ny version; kontrollér at den gamle version stadig kan vælges og indeholder den gamle regel.
4. Kopiér workflowet; kopien må være inaktiv. Deaktivér kopien.
5. Vælg en tidligere version, test og aktivér den. Kontrollér aktiveringshistorikken.
**Forventet:** aktivering kræver test af den gemte version; gamle versioner bevares. Gendan og aktivér de tilsigtede testversioner før næste fase.
### T05 – AND, OR og ELSE IF
1. Lav et særskilt inaktivt simulatorworkflow: kunde A **AND** (beskrivelse indeholder `Excel` **OR** `regneark`) → Faktura.
2. Tilføj ELSE IF beskrivelse indeholder `intern test` → Ikke fakturerbar; ELSE → manuel vurdering.
3. Test indtastede data: kunde A + `Hjælp med Excel`; kunde A + `Hjælp med regneark`; kunde B + `Excel`; kunde A + `intern test`.
**Forventet:** henholdsvis Faktura, Faktura, manuel vurdering og Ikke fakturerbar. Sporet viser både match og ikke-match. Hold dette workflow inaktivt.
## 4. Skyggetilstand
### T06 – Analyse uden forretningsændringer
1. Sæt skyggetilstand; lad AI være slukket. Kontrollér banneret.
2. Registrér 45 minutter på A1 med beskrivelse `Hjulpet med Excel` og notér tids-ID.
3. Vent op til 60 sekunder, og genindlæs økonomikøen. Jobbet kører normalt hvert 15. sekund; større køer kan tage længere.
4. Åbn **Hvorfor?**, eller `/workflows/time/TIDS_ID`.
5. Sammenlign kortsaldo, aftaleforbrug, kladder og konkrete tags med før registreringen.
**Forventet:** skyggeresultat foreslår Fastpris og viser spor/historik. Motoren har ikke ændret afregning, trukket timer eller tilføjet automatiske tags. Manuel overstyring/afregning gennem workflow kræver aktiv tilstand. Eksisterende automatisering kan stadig reagere; undersøg dens kilde ved ændringer.
## 5. Aktiv test på kunde A
Skift til aktiv test. Opret **nye** tidsregistreringer; tidligere hændelser, der allerede er behandlet i skyggetilstand, skal ikke forventes automatisk genafspillet.
### T07 – Medarbejderen vælger kun tid og beskrivelse
1. Som medarbejder: registrér 45 minutter på A1, `Hjulpet med Excel`.
2. Kontrollér sagsskærm, tidscomposer og bundbar: afregningsvalg/direkte godkendelse må ikke være tilgængelige for denne aktive workflowkunde.
3. Registrér tid på B1 som kontrol.
**Forventet:** A-tiden går videre til bogholderiet uden medarbejdervalg af afregning. På V5 gemmes B som kladde; manuelt valg findes under Tidsregistrering. Ingen korttimer trækkes ved registrering.
### T08 – Fastpris, faktura, kort og manglende regel
Opret én ny tid på hver sag: A1 45 min, A2 30 min og A3 15 min. Opret også en ny sag for A uden testtags og registrér 20 min med neutral beskrivelse.
**Forventet i Hvorfor:** A1 Fastpris med aftale A; A2 Faktura; A3 Klippekort med kort A; neutral tid manuel vurdering. Bogholderiet kan se de anvendte workflows og deres spor. Saldo og forbrug er uændrede før godkendelse.
### T09 – Nøgleord, negative ord og manuelle tags
1. Brug nye A-sager uden Excel-tag. Registrér `Excel`, `Hjælp med regneark`, `Åbnede filen budget.xlsx`, `Excelkursus` og `Arbejdet blev udført uden Excel` på forskellige tider.
2. Se klassifikationshistorik for **Tidsregistrering** og tids-ID på `/tags/classification`. Se også Hvorfor → Tekniske detaljer for konkrete tag-ID'er.
3. Brug ikke en sag med Excel i titel/beskrivelse til de negative prøver; klassifikationen bruger også sagens indhold.
**Forventet:** de første tre giver Excel-tag via nøgleordsregler. `Excelkursus` matcher ikke Hele ord-reglen; den negative formulering matcher ikke den pågældende regel. Andre regler kan stadig matche, så gennemgå alle regelkilder. Et manuelt tildelt tag skal bevares ved senere behandling; historie skal vise kilden.
### T10 – Konflikt og prioritet
1. Kopiér Mobil-workflowet med samme kunde, trigger og prioritet 10, men vælg Ikke fakturerbar. Test og aktivér kopien.
2. Registrér ny tid på A2.
3. Kontrollér manuel vurdering og konfliktspor; der må ikke oprettes afregning automatisk.
4. Deaktivér konfliktkopien og opret en ny A2-tid.
**Forventet:** to modstridende afregningsvalg i samme prioritetsgruppe giver manuel vurdering, også med Stop efter match. Uden kopien vælges Faktura. En senere regel med højere prioritetsnummer må ikke tilsidesætte et stoppet match.
### T11 – Manuel overstyring og genberegning
1. Vælg en endnu ikke afregnet A2-tid. På Hvorfor: prøv overstyring uden begrundelse.
2. Vælg Ikke fakturerbar, skriv `Manuel testaftale`, og gem overstyring.
3. Klik **Genberegn (bevar overstyring)**. Redigér også tidsbeskrivelsen og vent på ny behandling.
4. Kontrollér metode og historik. Som administrator: skriv en begrundelse og klik **Ophæv overstyring og genberegn**.
**Forventet:** tom begrundelse afvises; historik bevarer oprindelig beslutning og overstyring. Normal genberegning bevarer overstyringen; eksplicit ophævelse anvender de aktive `time.updated`-regler. Ingen afregning udføres af disse knapper.
### T12 – Bogholderiets preview og godkendelse
1. Åbn `/economy/time-queue`, filtrér kunde A og derefter hver faktureringstype; kontrollér også filter for afsluttede sager.
2. Vælg kun nye, ubehandlede A-tider med entydige beslutninger. Kontrollér at de gamle fælles metodevalg er deaktiverede.
3. Åbn preview. Notér saldo og forbrug før og efter preview.
4. Klik **Gennemfør afregning** én gang. Kontrollér tider og de relevante ressourcer.
**Forventet:** preview ændrer intet. Faktura opretter lokal ordrekladde; Fastpris øger faktisk forbrug med 0,75 time ved A1-prøven; kortet trækker 0,5 time for A3's 15 minutter ved 30-minutters afrunding. Intern/Ikke fakturerbar opretter ingen fakturakladde. Intet sendes til e-conomic fra denne godkendelse.
### T13 – Separate eller samlede fakturalinjer
1. Registrér to nye A2-tider på samme sag, 30 og 45 minutter, samme vare og sats.
2. Vælg begge, vælg separate linjer, og se preview: forvent to linjer med tilsammen 1,25 time. Gennemfør og notér kladde-ID.
3. Opret et nyt tilsvarende par, vælg sammenlagte linjer og gennemfør.
**Forventet:** andet par samles til én linje med 1,25 time, og alle tids-ID'er kan spores. Forskellige varenumre må ikke samles som samme vare. Brug nye tider til hver prøve; allerede afregnede tider kan ikke bruges igen.
### T14 – Saldo, dækning og datoer
1. Notér kortets aktuelle saldo. Opret korttid, der kræver flere afrundede timer end saldoen.
2. Prøv en Fastpris-overstyring på Mobil-tid, selvom Mobil er udelukket af aftalen.
3. Brug en separat udløbet/inaktiv testaftale eller et udløbet testkort i en regel eller overstyring.
4. Prøv en manglende/ukendt fakturavare på en ny fakturatid, og godkend gennem køen.
**Forventet:** manuel vurdering eller tydelig afvisning; ingen negativ saldo, ugyldigt aftaleforbrug eller halv oprettet kladde. En manglende vare kan først afvises ved afregning. En manuel overstyring må ikke omgå ressourcevalidering. Notér det faktiske tidspunkt og den viste fejl.
### T15 – Gentagen og samtidig godkendelse
1. Opret en ny A3-tid med tilstrækkelig saldo. Åbn samme valg i to browserfaner og lav preview i begge.
2. Gennemfør i den første fane, derefter i den anden. Prøv også dobbeltklik ved en separat ny test.
3. Kontrollér kortets transaktionshistorik og saldo, ikke kun toastbeskeden.
**Forventet:** højst ét korttræk pr. tids-ID. Andet forsøg er allerede behandlet eller afvises. Gentag med Faktura: højst én kladde pr. tids-ID. Hvorfor kan stadig dokumentere den afregnede beslutning, og ændring/genberegning af den skal afvises.
### T16 – Fastprisrapport og rettigheder
1. Åbn eksisterende fastprisrapport `/fixed-price-agreements/reports/dashboard`; kontrollér testaftalens månedspris, budget og forbrug efter godkendelse.
2. Kontrollér rentabilitet for den relevante periode: månedens pris og intern kostpris indgår, og brugte timer er de godkendte testtimer. Skeln mellem dashboardets estimat og faktisk perioderapport.
3. Log ind som medarbejder uden administrationsrettigheder. Forsøg at åbne workflow-/tagadministration, overstyre og godkende.
4. Log ind som bogholder med de tilsigtede rettigheder og kontrollér tilladte handlinger.
5. Kontrollér Automatisering-menuen: medarbejderen uden rettigheder ser ingen nye punkter; læsebrugeren ser Workflows/Workflowdrift, men ingen redigeringsknapper eller Aftaledækning/Tagklassifikation. En systemadministrator med kun `system.admin` ser Tagklassifikation. Kontrollér også direkte URL'er.
6. Skjul et tilladt menupunkt i Profil → menuindstillinger, genindlæs og kontrollér, at det forbliver skjult. Vis det igen. Et punkt uden adgang må ikke kunne gøres synligt gennem personlige menuvalg.
7. Kontrollér de fem sider i lyst/mørkt tema og ved smal vinduesbredde: tekst, felter, knapper og tagstier skal kunne læses uden afskårne handlinger.
**Forventet:** ingen nye skriverettigheder for medarbejderen. En synlig knap er ikke i sig selv bevis på adgang; handlingen skal afvises af serveren, hvis rettigheden mangler.
### T17 – Øvrige handlinger og stop af loops
1. Opret særskilt testworkflow med `case.created` for kunde A, titlen `WF TEST Handling`, og handlinger Opret opgave, Sæt felt → priority med en gyldig eksisterende prioritet, og Notifikation til testbrugeren.
2. Test, aktivér og opret en ny testsag. Kontrollér én opgave, den valgte prioritet og frontendnotifikation; ingen workflowmail/Mattermost forventes.
3. Test Opret reminder med fremtidigt tidspunkt og testmodtager på en ny testsag.
4. Valgfrit: opret to testworkflows, som starter hinanden. Kontrollér at kæden stopper; følg køen på Drift og eksport. Deaktivér dem straks efter prøven.
**Forventet:** handlinger knyttes til den rigtige sag. Gentagen behandling skaber ikke samme handling igen for samme event. Loop afvises eller stoppes af kædegrænsen; det må ikke fortsætte uden begrænsning. Nye, forskellige events kan legitimt udføre en regel igen.
## 6. Valgfrie integrationstests
### T18 – AI-forslag
Kun hvis lokal Ollama-model og endpoint fungerer. Notér eksisterende værdier; ret ingen produktionsendpoint. Sæt `WORKFLOW_AI_ENABLED=true`, behold aktiv testkunde og sæt tærsklerne til `WORKFLOW_AI_AUTO_THRESHOLD=90`, `WORKFLOW_AI_SUGGEST_THRESHOLD=70`. Genopret API og kontrollér banneret.
1. Lav en ny sag med neutral tekst og en ny tid: `Formlerne beregner forkert i regnearket`. Undgå konfigurerede nøgleord, hvis du vil isolere AI-delen; justér testteksten til fx `Cellerne viser forkerte beregnede tal`.
2. Vent på AI-jobbet. På `/tags/classification`: vælg Tidsregistrering, angiv tids-ID og klik Vis.
3. Kontrollér forslagets tag, model, forklaring og confidence i historikken. Et forslag er ikke garanteret, da modellen er variabel.
4. Hvis Excel foreslås og påvirker afregning: prøv bogholderigodkendelse før review; godkend eller afvis derefter forslaget med begrundelse.
5. Genindlæs Hvorfor efter ny behandling. Test også en ændret beskrivelse, mens et job endnu afventer.
**Forventet:** afregningsrelevante AI-tags kræver review selv ved høj confidence og blokerer afregning, mens relevante forslag/job er uafklarede. Gamle resultater må ikke anvendes på ændret tekst. AI-confidence er modellens vurdering. Hvis modellen ikke foreslår et relevant tag, markér reviewprøven Ikke testet; det er ikke bevis på fungerende review. Ved utilgængelig AI: undersøg jobstatus/teknisk log og markér integrationen fejlet eller blokeret.
Slå AI fra igen efter testen. Automatisk AI-kø er implementeret for tidsregistrering; antag ikke, at oprettelse af en vilkårlig mail alene starter denne AI-kø.
### T19 – e-conomic
Spring denne prøve over, hvis der ikke er en verificeret særskilt e-conomic-testaftale med testkunde og testvare. En lokal Hub er ikke garanti for, at e-conomic-forbindelsen er test. Denne prøve opretter en ekstern ordre via den eksisterende ordreeksport.
1. Vælg én workflowoprettet fakturakladde. Kontrollér kunde, vare, timer og beløb samt eksportbrugerens eksisterende rettighed `economic.documents.export`.
2. Overfør gennem den eksisterende ordreskærm. Notér ekstern ordre og eksportreference på `/workflows/operations`.
3. Forsøg samme eksport igen; kontrollér i e-conomic, at der ikke er en ekstra ordre.
4. Ved reelt uafklaret svar: brug **Kontrollér og afstem eksisterende ordre** med den eksisterende ordres nummer. Prøv ikke blind geneksport.
**Forventet:** én ekstern ordre, stabil reference og bevaret tids-/linjespor. Afstemning kontrollerer kunde, varer og beløb og opretter ikke en ny ordre. En forkert ordres nummer afvises. Fremprovokér ikke en timeout ved at slukke produktion/netværk; fejl-/timeoutprøven kan markeres Ikke testet, hvis et kontrolleret testsetup mangler.
## 7. Sluk igen og kontrollér tilbagevejen
### T20 – Deaktivering uden tab af data
1. Notér sidste afregning, kortsaldo, forbrug og kladde-ID'er.
2. Sæt `WORKFLOWS_ENABLED=false`, `WORKFLOW_AI_ENABLED=false`, `WORKFLOWS_INTERNAL_ENABLED=false`; genopret API.
3. Kontrollér Slukket på `/workflows/operations`.
4. Opret en ny kontroltid og kontrollér den gamle arbejdsgang.
5. Kontrollér at tidligere beslutninger og gennemførte afregninger stadig kan dokumenteres.
**Forventet:** ny workflowbehandling ophører. Slukning tilbagefører ikke gennemførte korttræk eller sletter kladder; historik bevares. Deaktivér testworkflows, og arkivér testdata gennem eksisterende funktioner. Ret gennemførte testafregninger gennem den normale økonomiproces.
Permanent afinstallation og fuld databasegendannelse indgår **ikke** i den almindelige manuelle test. Afprøv kun dette i en separat disposable database efter [rollbackvejledningen](workflow-rollback.md). En fuld restore fjerner også senere data.
### T21 – Aktivér og deaktivér fra CRM-kundekortet
1. Åbn `/customers/KUNDE_A_ID` → Oversigt → Workflows som administrator eller bruger med både `customers.edit` og `workflows.activate` samt læseadgang til kunder/workflows.
2. Slå Brug workflows for kunden til, skriv `Manuel CRM-test`, og klik Gem. Genindlæs: valget skal stadig være Til. Med global motor slukket viser kortet, at kundens valg er gemt, men ikke aktivt.
3. Start global skyggetilstand og derefter aktiv tilstand som beskrevet ovenfor. I aktiv tilstand skal kortet vise Aktiv for kunden. Registrér ny tid, og kontrollér workflowafregning.
4. Slå kunden fra, begrund og gem. Den globale motor skal forblive aktiv, men kortet vise Ikke aktiv. En ny tid følger den eksisterende arbejdsgang; eksisterende beslutninger og afregninger bevares.
5. Genstart den lokale API: kundens valg skal stadig være Fra. En eventuel gammel miljøkundeliste må ikke tilsidesætte det gemte Fra.
6. Log ind med kun læseadgang. Status må kunne ses, men aktivering/deaktivering må ikke kunne gemmes. Mangler begge læserettigheder, skjules sektionen.
7. Prøv tom eller for kort begrundelse. Valget må ikke blive gemt. Kundekortets øvrige sektioner skal stadig fungere.
**Forventet:** valget gælder uden miljøændring eller API-genstart pr. kunde; motorens globale tilstand er fortsat en hovedkontrol. Kun fremtidig behandling bruger valget; gamle tider genbehandles ikke automatisk. Tilvalg/fravalg registreres med bruger, tidspunkt og begrundelse. Slå testkunden fra efter prøven.
## 8. Fejlrapport og accept
Hvis der er uventet korttræk, dobbelt kladde, forkert kunde, manglende historik eller ændringer i skyggetilstand: stop den aktive test, slå motor/AI fra og bevar data til fejlsøgning. Fortsæt ikke med flere afregninger.
Notér ved fejl: testnummer, lokal URL, tidspunkt, brugerrolle, kunde-/sag-/tids-ID, workflow og version, tilstand, forventet/faktisk resultat og eventuel fejltekst. Gem gerne et skærmbillede og Hvorfor-detaljer; del ingen tokens, passwords eller `.env`-indhold.
| Test | Bestået / Fejlet / Ikke testet | ID'er og observationer |
|---|---|---|
| T01 Eksisterende adfærd | | |
| T02 Hierarki | | |
| T03 Simulator/undertags | | |
| T04 Versioner | | |
| T05 AND/OR/ELSE IF | | |
| T06 Skyggetilstand | | |
| T07 Medarbejderflow | | |
| T08 Afregningsvalg | | |
| T09 Nøgleord | | |
| T10 Konflikter | | |
| T11 Overstyring | | |
| T12 Godkendelse | | |
| T13 Fakturalinjer | | |
| T14 Ressourcekontrol | | |
| T15 Dobbeltbehandling | | |
| T16 Rapporter/rettigheder | | |
| T17 Handlinger/loops | | |
| T18 AI (valgfri) | | |
| T19 e-conomic (valgfri) | | |
| T20 Deaktivering | | |
| T21 Kundekortaktivering | | |
| T22 V5-afregning | | |
| T23 Automatisk aftaledækning | | |
Grundforløbet er manuelt accepteret, når T01–T17, T20, T21, T22 og T23 består, og ingen alvorlige fejl står åbne. AI og e-conomic kan kun accepteres særskilt efter deres egne tests. Slukket standard er ikke i sig selv godkendelse til produktion.
Automatisk SLA/eskalering, aftaleudløb samt eventkilder til `reminder.due` og `notification.created` er endnu ikke tilkoblet og kan ikke accepteres med denne plan. Registrér dem som **Ikke implementeret**, ikke Bestået. Sagoprettelse via workflow er heller ikke implementeret. Se [status](workflow-status.md).
### T22 – Afregning på Sag V5
1. Åbn `/sag/<id>/v5` for både en aktiv workflowkunde og en kunde uden aktive workflows. Registrér tid med hurtigkommentar, timer og `/tid`.
2. Kontrollér, at ingen af disse registreringsfelter tilbyder afregningsvalg. Kunden uden workflows skal få kladde. Den aktive kunde skal få kladde, indtil workflowet vælger afregning.
3. Åbn Tidsregistrering. Kontrollér, at den valgte metode vises, også når den lagrede tid fortsat er kladde.
4. Vælg afregning manuelt under fanen. For aktive workflows kræves `workflows.override` og `workflows.decisions.view` samt en begrundelse. Kontrollér beslutningshistorikken og uændret kortsaldo før økonomisk godkendelse.
5. Kontrollér, at allerede godkendt/afregnet workflowtid ikke kan ændres gennem denne knap. Kontrollér også, at en almindelig medarbejder uden overstyringsrettighed ikke får knappen for aktiv workflowtid.
6. Gentag en eksisterende V4-registrering: dens tidligere afregningsvalg skal fortsat fungere.
**Forventet:** V5 har kun manuelt afregningsvalg under Tidsregistrering. Registrering og workflowoverstyring trækker ikke korttimer.
### T23 – Automatisk regel fra aftaledækning
1. Aktivér en testkunde og motoren i aktiv tilstand. Brug en kunde uden særskilte afregningsregler.
2. Vælg ABA som fastprisaftalens dækning på Aftaler og klippekort, og gem. Registrér ny tid på en ABA-sag.
3. Kontrollér Fastpris under Tidsregistrering og forklaringen Automatisk aftaledækning. Der skal ikke oprettes en regel manuelt i builderen.
4. Registrér tid på en sag uden ABA: ingen automatisk fastpris. Tilføj ABA til udelukkelserne og gem: ubogført tid skal genberegnes uden fastpris.
5. Lad to aftaler, eller en aftale og et kort, dække ABA: manuel vurdering, aldrig vilkårligt valg.
6. Kontrollér et entydigt kortmatch: Klippekort vælges, saldoen ændres først ved økonomisk godkendelse.
7. Kontrollér tom gemt dækning (alle tags), under-tags og en særskilt Faktura-regel med forrang. Slå kunden fra: nye tider får ingen aktiv beslutning.
**Forventet:** gemt dækning vedligeholder den automatiske regel, mens aktivering, rettigheder og økonomisk godkendelse fortsat gælder.