Om Test op imod Test database

Disse test retter sig imod: **invoice controller**.

Disse manuelle tests udføres i **middleware / Swagger UI** ("Try it out"). Testeren kan kun sætte **kald-parametre** og observere svaret.

Der er **ingen** adgang til lokale json-konfig-filer såsom: `appsettings.json` / `MyConfiguration.json`.

Synlighedsfiltre styres via BCHEC-indstillinger for det givne firmanr i SonWin **Test-databasen**.

> **Delt Test-database — vigtigt:**
> - **A, B, E*, F, G, H** er læse-tests bundet til bestemte konti → kan køres samtidig med andre testere.
> - **C, D, E** kræver, at et BCHEC-flag sættes for **firmaet** + at API'et genstartes. Det er **globalt for hele firmaet** (ikke pr. konto), så det påvirker **alle** testere på firmaet uanset `accountId`. Koordinér disse (stille vindue eller dedikeret firmanr).

Før du går i gang

- Testene køres mod **Swagger UI** på endpointet `GET /accounts/{accountId}/invoices`.
- Datoer angives som `ÅÅÅÅ-MM-DD`. Udelades `limit`, returneres kun de **nyeste 100** fakturaer. Testkontiene herunder er små (≤ 46 fakturaer), så standard-`limit` rækker — men sæt et højere `limit`, hvis du udvider til større konti.
- **Fejl returneres i øjeblikket som HTTP 500** med en forklarende tekst i svaret. Vurdér derfor på **beskeden**, ikke på statuskoden.
- Filtrene i afsnit **C–E** styres af **BCHEC** i databasen. Efter en ændring i BCHEC skal API'et **genstartes**, før ændringen slår igennem.

Konkrete værdier nedenfor er hentet fra **Test-databasen** (2026-06-24). Foretrukne testkonti `305493`, `307375`, `309941` (valgt for at undgå sammenstød med andre testere).

Hvor en sag ikke fandtes på disse konti (parkeret, annulleret, kreditnota, PDF), bruges en **delt fallback-konto** — markeret tydeligt.

Bchec-indstillinger:

Her er de relevante Bchec-indstillinger som kan sættes for at hente en liste af SonWin fakturaer:

────────────────────────────────────────

UDSMARK- / fremtidsdaterings-flag

KODENAVN: WEB011_WEB012
KODETYPEA: VISEJPARKEREDE
Filter (kode): ExcludeParked
Virkning på resultatet: Skjuler parkerede fakturaer.
Tilføjet SQL-prædikat: (a.UDSMARK IS NULL OR a.UDSMARK <= 25)
────────────────────────────────────────
KODENAVN: WEB011_WEB012
KODETYPEA: CHECKUDSMARK
Filter (kode): CheckUdsmark
Virkning på resultatet: Beholder kun UDSMARK NULL / 0 / 2–25; fjerner også UDSMARK = 1
  (markeret-men-ikke-udskrevet).
Tilføjet SQL-prædikat: (a.UDSMARK IS NULL OR a.UDSMARK = 0 OR a.UDSMARK BETWEEN 2 AND 25)
────────────────────────────────────────
KODENAVN: WEB011_WEB012
KODETYPEA: VISKUNUDSKREVNE
Filter (kode): ShowOnlyDelivered
Virkning på resultatet: Viser kun udsendte/udskrevne fakturaer: UDSMARK <= 25 plus et
  SNEX/DSEND-leveringstjek (DELIVERYSTATE IN (5, 9)).
Tilføjet SQL-prædikat: UDSMARK <= 25 + DSEND/SNEX EXISTS/NOT EXISTS-blokken
────────────────────────────────────────
KODENAVN: WEB011_WEB012
KODETYPEA: EJFREMTID
Filter (kode): ExcludeFutureDated
Virkning på resultatet: Skjuler fremtidsdaterede fakturaer (BILAGSDATO efter i dag).
Tilføjet SQL-prædikat: a.BILAGSDATO <= @Today

De tre UDSMARK-varianter (VISEJPARKEREDE, CHECKUDSMARK, VISKUNUDSKREVNE) er alternative måder at frasortere parkerede/ikke-udsendte fakturaer på; et firma aktiverer typisk én af dem, men de kan kombineres.

────────────────────────────────────────

Frasortering af afregningstyper

KODENAVN: W11_W12EJAFRTYP
KODETYPEA: hver konfigureret rækkes KODETYPEA = én AFREGNTYPE-værdi der skal udelukkes
Filter (kode): ExcludeAfregnTypes
Virkning: Udelukker fakturaer hvis AFREGNTYPE er i det konfigurerede sæt. NULL-AFREGNTYPE rammes ikke af NOT
  IN og bliver derfor stående.

## Endepunkter

- **Liste:** `GET /accounts/{accountId}/invoices?dateFrom=&dateTo=&limit=`
- **PDF:** `GET /v1/accounts/{accountId}/invoices/{invoiceId}/pdf` hvor `invoiceId = {INSTNR}-{FORBNR}-{UDEBNR}-{REGNINGNR}`

Tests

A. Grundlæggende test ("virker det overhovedet?")
**Formål:** Bekræfte at endpointet svarer, og at felterne ser rigtige ud.

**A1 – Hent fakturaer for en kendt kunde**

1. Kald endpointet med `accountId = 305493`, `dateFrom = 2015-01-01`, `dateTo = 2026-12-31`.
2. *Forventet:* HTTP 200 og en liste med fakturaer (46 stk., ikke tom).

**A2 – Tjek felterne på en faktura**

1. Brug svaret fra A1, og se på den første faktura.
2. *Forventet:* `id` har formen `INSTNR-FORBNR-UDEBNR-REGNINGNR`, og felterne `invoiceDate`, `dueDate`, `totalAmount`, `remainingAmount` (saldo), `invoiceStatus` og `invoiceType` er udfyldt.

**A3 – Begræns til én faktura**

1. Gentag A1, men tilføj `limit = 1`.
2. *Forventet:* Præcis 1 faktura — den nyeste (`BILAGSDATO 2026-04-14`).

**A4 – Fremtidigt interval uden fakturaer**

1. Kald med `accountId = 305493`, `dateFrom = 2099-01-01`, `dateTo = 2099-12-31`.
2. *Forventet:* HTTP 200 og en **tom liste** `[]` (ikke en fejl).

B. Inputvalidering ("pæne fejl ved forkert input")
**Formål:** Bekræfte at forkert input giver en klar fejlbesked (i dag HTTP 500 + tekst), ikke en kryptisk databasefejl.

**B1 – Manglende dato (fra)** — Kald uden `dateFrom`, med `dateTo = 2030-12-31`. *Forventet:* Besked om at `DateFrom` mangler/er ugyldig (interval 1753–9999) — ikke "SqlDateTime overflow".

**B2 – Manglende dato (til)** — `dateFrom = 2000-01-01`, intet `dateTo`. *Forventet:* Tilsvarende besked om `DateTo`.

**B3 – Omvendt datointerval** — `dateFrom = 2030-01-01`, `dateTo = 2000-01-01`. *Forventet:* Besked om at `DateFrom` skal være ≤ `DateTo`.

**B4 – Ugyldigt limit** — gyldige datoer + `limit = 0`. *Forventet:* Besked om at `Limit` skal være ≥ 1.

**B5 – Manglende kunde-id** — tomt `accountId`. *Forventet:* Fejl om manglende `AccountId`.

**B6 – Dato før databasens minimum** — `dateFrom = 1500-01-01`, `dateTo = 2030-12-31`. *Forventet:* Pæn valideringsfejl — ikke "SqlDateTime overflow".

**B7 – Ukendt kunde** — `accountId = 999999999`, gyldigt interval. *Forventet:* Fejl med besked om at kunden ikke findes.

C. Synlighed af parkerede fakturaer (UDSMARK-varianter)
**Formål:** Bekræfte at de tre UDSMARK-flag skjuler en parkeret faktura.

> **Ingen parkerede fakturaer i Test-databasen p.t.** Ingen faktura på firmaet har `UDSMARK > 25`, så C kan ikke køres på eksisterende data. Du skal først **oprette** en parkeret faktura. Dette ændrer delt testdata + kræver et globalt BCHEC-flag og genstart → **koordinér med andre testere**.

**Forberedelse (opret + nulstil testdata).** Park en eksisterende faktura på `305493` (den forfaldne `503-1-1-56`):
```sql
-- 1) Notér nuværende værdi (til nulstilling bagefter):
SELECT UDSMARK FROM Sonlinc.AKOND WITH (NOLOCK)
WHERE FIRMANR = @CompanyId AND INSTNR = 503 AND FORBNR = 1 AND UDEBNR = 1 AND REGNINGNR = 56;
-- 2) Park den:
UPDATE Sonlinc.AKOND SET UDSMARK = 26
WHERE FIRMANR = @CompanyId AND INSTNR = 503 AND FORBNR = 1 AND UDEBNR = 1 AND REGNINGNR = 56;
-- ... kør C-trinene ...
-- 3) Nulstil til den oprindelige værdi fra trin 1 (typisk NULL eller 0):
UPDATE Sonlinc.AKOND SET UDSMARK = <oprindelig værdi>
WHERE FIRMANR = @CompanyId AND INSTNR = 503 AND FORBNR = 1 AND UDEBNR = 1 AND REGNINGNR = 56;
```
Brug i alle C-trin: `accountId = 305493`, `dateFrom = 2026-04-01`, `dateTo = 2026-04-30`.

C0 – Udgangspunkt (uden flag)**
1. Med fakturaen parkeret (UDSMARK 26) og **uden** `WEB011_WEB012`-flag: kald med ovenstående parametre.
2. *Forventet:* `503-1-1-56` **er** med. Notér antal.

**C1 – VISEJPARKEREDE** — Opret `WEB011_WEB012 / VISEJPARKEREDE`, genstart, gentag. *Forventet:* `503-1-1-56` **forsvinder**.

**C2 – CHECKUDSMARK** — Fjern C1-flaget, opret `WEB011_WEB012 / CHECKUDSMARK`, genstart, gentag. *Forventet:* `503-1-1-56` forsvinder (UDSMARK 26 uden for NULL/0/2–25).

**C3 – VISKUNUDSKREVNE** — Fjern C2-flaget, opret `WEB011_WEB012 / VISKUNUDSKREVNE`, genstart, gentag. *Forventet:* `503-1-1-56` forsvinder (UDSMARK > 25).

**C4 – Flere flag samtidig** — Aktivér fx VISEJPARKEREDE + VISKUNUDSKREVNE, genstart, gentag. *Forventet:* Resultatet er snittet (færrest rækker).

> Husk at nulstille `UDSMARK` (forberedelsens trin 3) og fjerne BCHEC-flagene + genstarte, når C er færdig.

D. Fremtidsdaterede fakturaer (EJFREMTID)
**Formål:** Bekræfte at `WEB011_WEB012 / EJFREMTID` skjuler fakturaer med bilagsdato efter i dag.

> **Ingen testdata p.t.:** Firmaet har ingen fakturaer med bilagsdato i fremtiden, så D kan ikke demonstreres uden først at oprette en fremtidsdateret faktura. (Forveksl ikke med A4, der tester et fremtidigt *datointerval* → tom liste.)

**D1 – Skjul fremtidsdaterede (når data findes)** — Find/opret en faktura med bilagsdato efter i dag, opret `WEB011_WEB012 / EJFREMTID`, genstart, kald med interval der dækker datoen. *Forventet:* Den fremtidsdaterede faktura er **ikke** med.

**D2 – Uden flaget** — Fjern flaget, genstart, gentag. *Forventet:* Den fremtidsdaterede faktura **er** med.

## E. Frasortering af afregningstyper (W11_W12EJAFRTYP)
**Formål:** Bekræfte at fakturaer med en bestemt afregningstype kan frasorteres.

**Testdata:** Konto `305493` har `KV-EN` (41), `KV-I` (4) og præcis **1** faktura med `AFREGNTYPE = NULL` (i alt 46). Brug i alle E-trin: `accountId = 305493`, `dateFrom = 2015-01-01`, `dateTo = 2026-12-31`.

E2 – Udgangspunkt (tom liste i BCHEC)**
1. Sørg for at `W11_W12EJAFRTYP` **ingen** rækker har for firmaet.
2. Kald med ovenstående parametre. *Forventet:* Antal = **46**.

**E1 – Udeluk én afregningstype**

1. Opret `W11_W12EJAFRTYP` med `KODETYPEA = KV-I`, og genstart.
2. Gentag kaldet. *Forventet:* 4 færre = **42**. (Større alternativ: udeluk `KV-EN` → 41 færre = 5.)

**E3 – NULL rammes ikke**

1. Med `KV-I` stadig udelukket, kig efter fakturaen med `AFREGNTYPE = NULL`.
2. *Forventet:* Den ene NULL-faktura er stadig med (`NOT IN` matcher ikke NULL).

F. PDF-tilstedeværelse og fakturatype
**Formål:** Bekræfte at listen som udgangspunkt kun viser fakturaer med en færdig PDF, markeret `invoiceType = pdf`.

> Ingen af de tre foretrukne konti har en renderet PDF → brug **delt fallback-konto `200229`**.

**Testdata:** `200229 / 400-1-1-56` har en renderet PDF (bilagsdato 2026-04-14).

**F1 – Kun fakturaer med PDF, markeret som `pdf`**

1. Kald med `accountId = 200229`, `dateFrom = 2026-04-01`, `dateTo = 2026-04-30`.
2. *Forventet:* `400-1-1-56` er med, og de returnerede fakturaer har `invoiceType = pdf`. (Fakturaer uden renderet PDF kommer som udgangspunkt slet ikke med.)

G. Download af faktura-PDF
**Formål:** Bekræfte at PDF'en kan hentes, og at fejl håndteres pænt. Endpoint: `GET /v1/accounts/{accountId}/invoices/{invoiceId}/pdf`.

**G1 – Hent en gyldig PDF** — `accountId = 200229`, `invoiceId = 400-1-1-56`. *Forventet:* HTTP 200, binær PDF (`application/pdf`) der kan åbnes.

**G2 – Ugyldigt id-format** — `invoiceId = 123-456` (mangler led). *Forventet:* Håndteret fejl om at `InvoiceId` skal have formen `INSTNR-FORBNR-UDEBNR-REGNINGNR`.

**G3 – Velformet, men ikke-eksisterende id** — korrekt format, ikke-eksisterende nr. *Forventet:* Passende fejl — ikke en tom/ødelagt fil.

H. Status på fakturaer (saldo-model)
**Formål:** Bekræfte at `invoiceStatus` og `remainingAmount` afspejler den løbende saldo (SonWin er saldo-baseret).

**Testdata:** Ét kald på konto `309941` med `dateFrom = 2015-01-01`, `dateTo = 2026-12-31` returnerer H2–H4 på én gang. H1 ligger på den delte konto `200229`.

**H1 – Annulleret (`cancelled`)** *(delt konto)*

1. Kald med `accountId = 200229`, `dateFrom = 2015-07-01`, `dateTo = 2015-07-31`.
2. *Forventet:* `400-1-1-2` har status `cancelled`.
3. *Bonus:* `400-1-1-3` (samme dag) er både `KORTSTATUS = 99` og `KR < 0` → bekræfter at `cancelled` vinder over `credited`.

**H2 – Kreditnota (`credited`)**

1. Kald med `accountId = 309941`, `dateFrom = 2016-01-01`, `dateTo = 2016-12-31`.
2. *Forventet:* `479-1-1-9` (−165,65) har status `credited`.

**H3 – Betalt (`paid`)**

1. Kald med `accountId = 309941`, `dateFrom = 2015-01-01`, `dateTo = 2015-12-31`.
2. *Forventet:* `479-1-1-1` (beløb 0,00, **saldo 0,00**) har status `paid`. *(Bemærk: dette er kontoens åbnings-/nul-postering — den eneste linje hvor saldo ≤ 0; kontoen er i debet derefter.)*

**H4 – Forfalden (`overdue`)**

1. Kald med `accountId = 309941`, `dateFrom = 2026-01-01`, `dateTo = 2026-12-31`.
2. *Forventet:* `479-1-1-54` (saldo 601,01, **forfald 2026-05-04**, dvs. før i dag) har status `overdue`.

**H5 – Ubetalt (`unpaid`)**

> **Ingen testdata p.t.:** Ingen faktura på firmaet er **fremtidsforfalden med positiv saldo** — de nyeste fakturaer er allerede forfaldne (→ `overdue`). H5 kan derfor ikke demonstreres uden at oprette en faktura med fremtidig forfaldsdato og positiv saldo.

**H6 – Saldo stemmer med kilden**

1. Vælg en kendt konto, sammenlign `remainingAmount` med den løbende saldo i SonWin/RVV for samme forbrugssted.
2. *Forventet:* Beløbene stemmer (samme `lbsum`-beregning).

---------------------------------- Nedenfor findes Test rettet imod Produktionsdata --------------------------------------

Om

Disse test retter sig imod: invoice controller. 

Disse manuelle tests udføres i **middleware / Swagger UI** ("Try it out"). Testeren kan kun sætte **kald-parametre** og observere svaret.

Der er **ingen** adgang til lokale json-konfig-filer såsom: "appsettings.json" / "MyConfiguration.json".

Synlighedsfiltre styres via BCHEC indstillinger for det givne firmanr i SonWin Test-database.

Før du går i gang

- Testene køres mod **Swagger UI** på endpointet `GET /accounts/{accountId}/invoices`.
- Datoer angives som `ÅÅÅÅ-MM-DD`. Udelades `limit`, returneres kun de **nyeste 100** fakturaer — sæt derfor `limit` højere, når en bestemt (ofte ældre) faktura skal findes.
- **Fejl returneres i øjeblikket som HTTP 500** med en forklarende tekst i svaret. Vurdér derfor på **beskeden**, ikke på statuskoden.
- Filtrene i afsnit **C–E** styres af **BCHEC** i databasen. Efter en ændring i BCHEC skal API'et **genstartes**, før ændringen slår igennem.

Bchec-indstillinger:

Her er de relevante Bchec-indstillinger som kan sættes for at hente en liste af SonWin fakturaer:

────────────────────────────────────────

UDSMARK- / fremtidsdaterings-flag

KODENAVN: WEB011_WEB012
KODETYPEA: VISEJPARKEREDE
Filter (kode): ExcludeParked
Virkning på resultatet: Skjuler parkerede fakturaer.
Tilføjet SQL-prædikat: (a.UDSMARK IS NULL OR a.UDSMARK <= 25)
────────────────────────────────────────
KODENAVN: WEB011_WEB012
KODETYPEA: CHECKUDSMARK
Filter (kode): CheckUdsmark
Virkning på resultatet: Beholder kun UDSMARK NULL / 0 / 2–25; fjerner også UDSMARK = 1
  (markeret-men-ikke-udskrevet).
Tilføjet SQL-prædikat: (a.UDSMARK IS NULL OR a.UDSMARK = 0 OR a.UDSMARK BETWEEN 2 AND 25)
────────────────────────────────────────
KODENAVN: WEB011_WEB012
KODETYPEA: VISKUNUDSKREVNE
Filter (kode): ShowOnlyDelivered
Virkning på resultatet: Viser kun udsendte/udskrevne fakturaer: UDSMARK <= 25 plus et
  SNEX/DSEND-leveringstjek (DELIVERYSTATE IN (5, 9)).
Tilføjet SQL-prædikat: UDSMARK <= 25 + DSEND/SNEX EXISTS/NOT EXISTS-blokken
────────────────────────────────────────
KODENAVN: WEB011_WEB012
KODETYPEA: EJFREMTID
Filter (kode): ExcludeFutureDated
Virkning på resultatet: Skjuler fremtidsdaterede fakturaer (BILAGSDATO efter i dag).
Tilføjet SQL-prædikat: a.BILAGSDATO <= @Today

De tre UDSMARK-varianter (VISEJPARKEREDE, CHECKUDSMARK, VISKUNUDSKREVNE) er alternative måder at frasortere parkerede/ikke-udsendte fakturaer på; et firma aktiverer typisk én af dem, men de kan kombineres.

────────────────────────────────────────

Frasortering af afregningstyper

KODENAVN: W11_W12EJAFRTYP
KODETYPEA: hver konfigureret rækkes KODETYPEA = én AFREGNTYPE-værdi der skal udelukkes
Filter (kode): ExcludeAfregnTypes
Virkning: Udelukker fakturaer hvis AFREGNTYPE er i det konfigurerede sæt. NULL-AFREGNTYPE rammes ikke af NOT
  IN og bliver derfor stående.

────────────────────────────────────────

Endepunkter:

- **Liste:** "GET /accounts/{accountId}/invoices?dateFrom=&dateTo=&limit="
- **PDF:** "GET /v1/accounts/{accountId}/invoices/{invoiceId}/pdf"
hvor invoiceId = {INSTNR}-{FORBNR}-{UDEBNR}-{REGNINGNR}

Information om controlleren findes her:

Invoice Controller

Tests

GetInvoices (Returner en liste af fakturaer på 0 eller flere fakturaer for kunden)

A. Grundlæggende test ("virker det overhovedet?")

Formål: Bekræfte at endpointet svarer, og at felterne ser rigtige ud.

A1 – Hent fakturaer for en kendt kunde
1. Kald endpointet med accountId = 327080, dateFrom = 2015-01-01, dateTo = 2026-12-31.
2. Forventet: HTTP 200 og en liste med fakturaer (ikke tom).

A2 – Tjek felterne på en faktura
1. Brug svaret fra A1, og se på den første faktura.
2. Forventet: id har formen INSTNR-FORBNR-UDEBNR-REGNINGNR, og felterne invoiceDate, dueDate, totalAmount, remainingAmount (saldo), invoiceStatus og invoiceType er udfyldt.

A3 – Begræns til én faktura
1. Gentag A1, men tilføj limit = 1.
2. Forventet: Præcis 1 faktura returneres, og det er den nyeste (sorteret efter bilagsdato faldende).

A4 – Fremtidigt interval uden fakturaer
1. Kald med accountId = 327080 og et interval langt ude i fremtiden, fx dateFrom = 2099-01-01, dateTo = 2099-12-31.
2. Forventet: HTTP 200 og en tom liste [] (altså ikke en fejl).

B. Inputvalidering ("pæne fejl ved forkert input")

Formål: Bekræfte at forkert input giver en klar fejlbesked (i dag HTTP 500 + tekst), ikke en kryptisk databasefejl.

B1 – Manglende dato (fra)
1. Kald uden dateFrom, men med dateTo = 2030-12-31.
2. Forventet: Besked om, at DateFrom mangler/er ugyldig (interval 1753–9999) — ikke "SqlDateTime overflow".

B2 – Manglende dato (til)
1. Kald med dateFrom = 2000-01-01 og uden dateTo.
2. Forventet: Tilsvarende besked om DateTo.

B3 – Omvendt datointerval
1. Kald med dateFrom = 2030-01-01 og dateTo = 2000-01-01.
2. Forventet: Besked om, at DateFrom skal være tidligere end eller lig DateTo.

B4 – Ugyldigt limit
1. Kald med gyldige datoer og limit = 0.
2. Forventet: Besked om, at Limit skal være 1 eller derover.

B5 – Manglende kunde-id
1. Kald med tomt accountId.
2. Forventet: Fejl om manglende AccountId.

B6 – Dato før databasens minimum
1. Kald med dateFrom = 1500-01-01, dateTo = 2030-12-31.
2. Forventet: Pæn valideringsfejl — ikke "SqlDateTime overflow".

B7 – Ukendt kunde
1. Kald med accountId = 999999999 og et gyldigt interval.
2. Forventet: Fejl med forklarende besked om, at kunden ikke findes.

C. Synlighed af parkerede fakturaer (UDSMARK-varianter)

Formål: Bekræfte at de tre UDSMARK-flag skjuler en parkeret faktura. Kræver, at flaget sættes i BCHEC (familie WEB011_WEB012) + genstart.

Testdata: Parkeret faktura 1084-3-1-51 på konto 403881 (UDSMARK = 26, bilagsdato 2022-04-07). Brug i alle C-trin: accountId = 403881, dateFrom = 2022-04-01, dateTo = 2022-04-30, limit = 500.

C0 – Udgangspunkt (uden flag)
1. Kald med ovenstående parametre, mens firmaet ingen WEB011_WEB012-flag har.
2. Forventet: Fakturaen 1084-3-1-51 er med i listen. Notér antal fakturaer som sammenligningsgrundlag.

C1 – VISEJPARKEREDE
1. Opret BCHEC WEB011_WEB012 / VISEJPARKEREDE for firmaet, og genstart API’et.
2. Gentag kaldet.
3. Forventet: 1084-3-1-51 er forsvundet; antallet er lavere end i C0.

C2 – CHECKUDSMARK
1. Fjern flaget fra C1. Opret i stedet WEB011_WEB012 / CHECKUDSMARK, og genstart.
2. Gentag kaldet.
3. Forventet: 1084-3-1-51 forsvinder (UDSMARK 26 ligger uden for NULL/0/2–25).

C3 – VISKUNUDSKREVNE
1. Fjern flaget fra C2. Opret i stedet WEB011_WEB012 / VISKUNUDSKREVNE, og genstart.
2. Gentag kaldet.
3. Forventet: 1084-3-1-51 forsvinder; antallet er lavere end eller lig C0.

C4 – Flere flag samtidig
1. Aktivér fx både VISEJPARKEREDE og VISKUNUDSKREVNE, og genstart.
2. Gentag kaldet.
3. Forventet: Resultatet er snittet af filtrene (færrest rækker).

D. Fremtidsdaterede fakturaer (EJFREMTID)

Formål: Bekræfte at flaget WEB011_WEB012 / EJFREMTID skjuler fakturaer med bilagsdato efter i dag.

Bemærk – ingen testdata p.t.: Firmaet har aktuelt ingen fakturaer med en bilagsdato i fremtiden, så D kan ikke demonstreres på de eksisterende data. 

Det kræver, at der først oprettes/findes en fremtidsdateret faktura. (Forveksl ikke med A4, der tester et fremtidigt datointerval og giver en tom liste.)

D1 – Skjul fremtidsdaterede (når data findes)
1. Find/opret en faktura med bilagsdato efter i dag. Opret WEB011_WEB012 / EJFREMTID, og genstart.
2. Kald med et interval, der dækker den fremtidige dato.
3. Forventet: Den fremtidsdaterede faktura er ikke med.

D2 – Uden flaget
1. Fjern flaget, og genstart.
2. Gentag kaldet.
3. Forventet: Den fremtidsdaterede faktura er med.

E. Frasortering af afregningstyper (W11_W12EJAFRTYP)

Formål: Bekræfte at fakturaer med en bestemt afregningstype kan frasorteres via BCHEC-familien W11_W12EJAFRTYP (én række pr. type, der skal udelukkes).

Testdata: Konto 327080 har bl.a. MD-I (141 fakturaer), KV-I (29) og præcis 1 faktura med AFREGNTYPE = NULL. Brug i alle E-trin: accountId = 327080, dateFrom = 2015-01-01, dateTo = 2026-12-31, limit = 2000 (så hele sættet på 1.542 kommer med).

E2 – Udgangspunkt (tom liste i BCHEC)
1. Sørg for, at W11_W12EJAFRTYP ingen rækker har for firmaet.
2. Kald med ovenstående parametre.
3. Forventet: Ingen afregningstyper frasorteres — antal = 1.542.

E1 – Udeluk én afregningstype
1. Opret en BCHEC-række W11_W12EJAFRTYP med KODETYPEA = MD-I, og genstart API’et.
2. Gentag kaldet.
3. Forventet: 141 færre fakturaer — antal = 1.401. (Mindre alternativ: udeluk KV-I → 29 færre.)

E3 – NULL rammes ikke
1. Med MD-I stadig udelukket fra E1, kig efter fakturaen med AFREGNTYPE = NULL.
2. Forventet: Den ene NULL-faktura er stadig med (en NOT IN-liste matcher ikke NULL).


Test af PDF-fakturaer (bør nok have sin Confluence side, men for her-og-nu, står det her)

F. PDF-tilstedeværelse og fakturatype

Formål: Bekræfte, at listen som udgangspunkt kun viser fakturaer, der har en færdig PDF i databasen, og at disse er markeret med invoiceType = pdf.

Testdata: Konto 476261 har en faktura 1201054-1-1-2 med en renderet PDF (bilagsdato 2026-06-23). Flere med PDF: 313587 / 1200923-1-1-2, 401925 / 1200836-1-1-2, 307701 / 1200949-1-1-2, 224789 / 1200990-1-1-2 (alle 2026-06-22).

F1 – Kun fakturaer med PDF, markeret som pdf
1. Kald med accountId = 476261, dateFrom = 2026-06-01, dateTo = 2026-06-30.
2. Forventet: Fakturaen 1201054-1-1-2 er med, og alle returnerede fakturaer har invoiceType = pdf. (Fakturaer uden renderet PDF kommer som udgangspunkt slet ikke med.)

Bemærk: Muligheden for også at vise fakturaer uden PDF (invoiceType = missing) samt finjustering af PDF-genkendelsen styres af lokal konfiguration og kan ikke ændres fra Swagger. De scenarier hører til udvikler-appendikset og indgår ikke i denne gennemgang.

G. Download af faktura-PDF

Formål: Bekræfte, at PDF’en kan hentes for en faktura, der har en PDF, og at fejl håndteres pænt.

Endpoint: GET /v1/accounts/{accountId}/invoices/{invoiceId}/pdf.

G1 – Hent en gyldig PDF
1. Kald med accountId = 476261 og invoiceId = 1201054-1-1-2 (fra F1).
2. Forventet: HTTP 200, og svaret er en binær PDF (application/pdf), der kan åbnes.

G2 – Ugyldigt id-format
1. Kald med et forkert formateret invoiceId, fx 123-456 (mangler led).
2. Forventet: En håndteret fejl om, at InvoiceId skal have formen INSTNR-FORBNR-UDEBNR-REGNINGNR.

G3 – Velformet, men ikke-eksisterende id
1. Kald med et korrekt formateret, men ikke-eksisterende invoiceId (eller en faktura uden PDF).
2. Forventet: En passende fejl — ikke en tom eller ødelagt fil.

H. Status på fakturaer (saldo-model)

Formål: Bekræfte, at invoiceStatus og remainingAmount afspejler den løbende saldo på kontoen (SonWin er saldo-baseret), og at hver status udledes korrekt.

Testdata: Ét kald på konto 327080 med dateFrom = 2026-01-01, dateTo = 2026-12-31, limit = 500 returnerer status-eksemplerne H3–H5 på én gang. H1 og H2 ligger på andre konti og er ældre, så de bruger hvert sit snævre datovindue.

H1 – Annulleret (cancelled)
1. Kald med accountId = 308678, dateFrom = 2015-07-01, dateTo = 2015-07-31.
2. Forventet: Fakturaen 14684-1-1-2 har status cancelled.
3. Bonus: 14684-1-1-3 (samme dag) er både annulleret og har negativt beløb — den skal stadig vise cancelled (annulleret vinder over kreditnota).

H2 – Kreditnota (credited)
1. Kald med accountId = 410166, dateFrom = 2023-12-01, dateTo = 2023-12-31.
2. Forventet: Fakturaen 14685-2-1-49 (−149,64) har status credited.
3. Alternativer (hvert sit vindue): 410166 / 14685-2-1-29 (2019-01), 260447 / 14686-1-1-13 (2016-06), 327080 / 31901-7-1-61 (2026-06).

H3 – Betalt (paid)
1. Kald med accountId = 327080, dateFrom = 2026-01-01, dateTo = 2026-12-31, limit = 500.
2. Forventet: Fakturaen 18587-3-1-58 (beløb 37,96, saldo 0,00) har status paid.

H4 – Forfalden (overdue)
1. Brug samme kald som H3.
2. Forventet: Fakturaen 19271-4-1-78 (saldo 94,16, forfald 2026-06-04, dvs. før i dag) har status overdue.

H5 – Ubetalt (unpaid)
1. Brug samme kald som H3.
2. Forventet: Fakturaen 17349-7-1-78 (saldo 117,70, forfald 2026-07-03, dvs. i fremtiden) har status unpaid.

H6 – Saldo stemmer med kilden
1. Vælg en kendt konto, og sammenlign remainingAmount med den løbende saldo i SonWin/RVV for samme forbrugssted.
2. Forventet: Beløbene stemmer (samme lbsum-beregning).


----------------------------------------------------