Hoppa till innehållet
ErsviaErsviaSystemarkitekturdokument

5. Byggblocksvy

Byggblocksvyn beskriver Ersvias statiska struktur i tre nivåer:

  • Nivå 1 visar hela systemet som en vit låda med containrar och modulgrupper (C4 nivå 2).
  • Nivå 2 visar varje modul som en svart låda med ansvar, gränssnitt, händelser och krav.
  • Nivå 3 visar den inre strukturen i de moduler som är mest kritiska för arkitekturen (C4 nivå 3).

5.1 Nivå 1: Ersvia som helhet#

C4Containervy (C4 nivå 2)Ladda ned SVG: Containervy (C4 nivå 2)Ladda ned PUML: Containervy (C4 nivå 2)

Container Teknik Ansvar
Ersvia.Api och Ersvia.Patientdata ASP.NET Core Minimal APIs (.NET 10), båda byggda av ErsviaVard (Ersvia.Hosting) Samma modulkatalog med olika urval (IModul.Zon, Ersvia:Zon = alla, patientdata eller ersattning). Ersvia.Patientdata kör patientdatazonens moduler, Ersvia.Api ersättningszonens; i utveckling kör en process alla. Zonbryggan (POST /intern/zon/v1/{port}/{metod}, mTLS) förbinder dem (ADR 0020). /healthz, /readyz, /openapi/v1.json, ProblemDetails, CSP och hastighetsbegränsning (Webbskydd).
Ersvia.Regelmotor .NET-bibliotek utan I/O, reflection, klocka eller beroenden till andra Ersvia-projekt (arkitekturtest) Primitiver, 34 mallar, körfaser och DAG, trace och resultathash. Används av Regelverk, Berakning och Simulering. ADR 0013.
Ersvia.Portal Blazor Web App Vårdgivarportal och handläggargränssnitt, WCAG 2.2 AA, white-label per region
Ersvia.Ai IChatClient-adapter Regelassistent, förklaringar, avvikelseanalys. Bara ersättningszonen
Ersvia.Mcp MCP-server Läsande verktyg och utkastverktyg för AI-klienter
Bakgrundsarbetare Samma image som Api, rollen arbetare OutboxBearbetare, valideringskö, beräkningskörningar, nattlig omkörning av RF-händelser, SFTP-inläsning, exporter
PostgreSQL PostgreSQL 18 Ett schema per modul. Två instanser: patientdata och ersättning. RLS per huvudman
SFTP SFTP-container eller regionens SFTP CVR-filer, FUMS-filer, Kodserver, VAL- och KPP-exporter
API-gateway Regionens gateway (t.ex. Anypoint) eller ingress med WAF mTLS-terminering med SITHS, hastighetsbegränsning, routning av bas-URL

Arkitekturregler på nivå 1:

  1. En modul refererar bara andra modulers Kontrakt-namnrymd, aldrig deras interna lager (NetArchTest i tests/Ersvia.Tests.Architecture/ModulgransTester.cs).
  2. Moduler i ersättningszonen refererar aldrig kontrakt som innehåller personnummer. Typen Personnummer finns bara i Personuppgifter.Kontrakt och patientdatazonens moduler.
  3. Inga regionspecifika konstanter i src/ utanför src/Integrations/ (RegionoberoendeTester).
  4. All tid tas från IKlocka, alla belopp är Belopp, och alla fel är Resultat/Fel med stabil felkod.

Modulöversikt#

KomponentPaketdiagram: moduler, kontrakt och beroendenLadda ned SVG: Paketdiagram: moduler, kontrakt och beroendenLadda ned PUML: Paketdiagram: moduler, kontrakt och beroenden

Zon Modulgrupp (uppsatsens komponentmodell) Moduler
Patientdatazon Informationshantering (insamling) Vardhandelser, Vantande, Listning, Rapportering, Kompatibilitet, Personuppgifter
Ersättningszon Informationsinfrastruktur Masterdata, Kodverk, Overenskommelse, Regelverk
Ersättningszon Ekonomisk ersättningshantering Berakning, Malrelaterad, Simulering, Granskning, Avstamning, MedicinskService, Lakemedel
Ersättningszon Ekonomihantering Fakturering, Uppfoljning
Ersättningszon Tvärgående Identitet, Drift, Migrering, Ersvia.Ai, Ersvia.Mcp, Ersvia.Portal
Båda Grund Ersvia.BuildingBlocks, src/Integrations/*

5.2 Nivå 2: Patientdatazonen#

KomponentKomponentdiagram för patientdatazonenLadda ned SVG: Komponentdiagram för patientdatazonenLadda ned PUML: Komponentdiagram för patientdatazonen

Patientdatazonen är den enda platsen där personnummer, samordningsnummer och reservnummer finns i klartext. Allt som lämnar zonen passerar Personuppgifter.Pseudonymiseringstjanst, som ersätter person-id med en pseudonym och lägger till de demografiska attribut som beräkningen behöver: ålder på mätdagen, kön, folkbokföringslän, kommun och basområde.

Zonseparationen är fysisk, inte bara logisk (kontroll 3 Ä12 och R4; byggd i F12a, ADR 0020):

  • Patientdatazonen körs som egen process och egen deploybar enhet (ersvia-api-patient), med egen databasroll och inga grants mellan zonerna. Ersättningszonen kan inte läsa patientdatazonens scheman.
  • Pseudonymen är HMAC-SHA-256 med en nyckel som är unik per huvudman och ändamål. Nyckeln läses via INyckelkalla (F12a): konfiguration i utveckling, Kubernetes Secret som volym, eller KMS via IKmsKlient (HashiCorp Vault KV v2 eller stubbe). Den finns bara i patientdatazonen.
  • Återidentifieringstjänsten finns bara i patientdatazonen. Den kräver ett angivet ändamål, kontrollerar det mot en ändamålslista och loggar varje återidentifiering (NK19). Den används för drill-down i avstämningen (KRAV-59) och för utlämningsexporten. Byggd i F8: POST /api/kompatibilitet/v1/ateridentifiering, bara för vårdgivarens egna vårdhändelser.
  • Utlämningsexporten skapar de underlag som enligt regelverk kräver identitet: riksavtalet 8.9 när nationell tjänst saknas, Försäkringskassan för EU/EES och Migrationsverket. Den bygger på pseudonymiserade underlag från Fakturering och lämnar bara ut det som mottagaren behöver (OSL 25 kap. 1 §, NK21). Fakturaunderlag till vårdgivare och interna fakturor innehåller aldrig personnummer. Byggd i F8 som Kompatibilitet.IUtlamningsexport bakom porten IIdentitetsutlamning (s15).

Vardhandelser (ersätter GVR, byggd i F4)#

Egenskap Beskrivning
Ansvar Tar emot besök, inskrivningar, aktiviteter, vårdperioder och kontakter. Prövar dem i efterhand (asynkront) mot kodverk, överenskommelse, vårdenhet och personuppgifter. En rättelse blir en ny version. En makulerad händelse finns kvar, den raderas aldrig. Varje inskick har en livscykel med tre slags status (teknisk, kontroll, ekonomisk), och AF-koden tas fram ur dem. Faktureringsmånaden har sin brytpunkt sista vardagen 24.00. Helgdagar och midsommar-, jul- och nyårsafton är inte vardagar. Förfall sker efter 90 dagar. Händelser som är äldre än 30 månader bearbetas inte. RF-händelser köas om varje natt. Namngivna periodbilder (aktuell, avstämd, slutlig) med frysdatum. Torrkörning, det vill säga en prövning där inget sparas.
Schema vardhandelser: register (vårdhändelsenummer, aktuell version), vardhandelse (en rad per version, PARTITION BY RANGE (period), partitioner via sakerstall_partition, DEFAULT-partition), idempotens, periodbild, outbox. En trigger stoppar DELETE. Den stoppar också ändringar av allt utom statuskolumner. ADR 0012.
API (/api/vardhandelser/v1) POST /vardhandelser, POST /vardhandelser/batch, POST /vardhandelser/validera (torrkörning), GET /vardhandelser, GET /vardhandelser/{id}, PUT /vardhandelser/{id} (rättelse, ETag = version), DELETE /vardhandelser/{id} (makulering), GET /vardhandelser/{id}/status, /validering, /versioner, POST /bearbetningar, GET /statusrapport, GET /faktureringskalender/brytpunkt, POST/GET /perioder/{period}/ogonblicksbilder
Idempotens X-Idempotens-Nyckel: samma innehåll ger samma kvittens, och annat innehåll ger GEN-0409. GVR:s X-Resource-Id/externtId: en dubblett ger VH-0313. Allt sker i samma transaktion som versionen.
Publicerar ersvia.VardhandelseMottagen.v1, ersvia.VardhandelseAvvisad.v1, ersvia.VardhandelseRattad.v1, ersvia.VardhandelseMakulerad.v1, ersvia.VardhandelseStatusAndrad.v1 (alla med pseudonym), internt jobb ersvia.intern.ValideringBegard.v1
Portar (i Kontrakt) IPatientregister, IVardenhetsregister, IKodregister, IAvtalsregister, IFelkodsregister, IVardhandelsekoppling. Kopplas i kompositionsroten Ersvia.Api.Modulkopplingar till Personuppgifter, Masterdata, Kodverk, Överenskommelse och felkodskatalogen. Kod- och avtalsuppslag hålls 30 sekunder i minnet.
Volym och mätning Cirka 25 miljoner öppenvårdstillfällen per år. Lasttest: 70 000 händelser validerade på 4,2 minuter (krav 60 min), se docs/plan/matningar.md.
Krav KRAV-6 till KRAV-10, KRAV-15, KRAV-61
Kvar till F9 GVR v2-fasaden fullt ut (/v2/besok m.fl. mappas mot IVardhandelser), GVR-journal (/v2/journaler) och vårdplatser (/v2/vardplatser), SNOD och CVR-fil

Vantande (ersätter CVR, byggd i F4)#

Egenskap Beskrivning
Ansvar Väntande patienter i samma flöde som vårdhändelser (CVR-fälten), med avslut. Underlag till väntetidsdatabasen (utan personnummer, HSA-id). CVR-filernas ögonblicksbilder kommer i F9.
Schema vantande: dokument med versionshistorik (låg volym), outbox
API (/api/vantande/v1) POST /vantande, GET /vantande, GET /vantande/{id}, PUT /vantande/{id}, POST /vantande/{id}/avslut, DELETE /vantande/{id}
Publicerar ersvia.VantandeRapporterat.v1
Krav KRAV-14

Listning (ersätter ListOn, byggd i F5)#

Egenskap Beskrivning
Ansvar Listningstyper, listning, omlistning och avlistning, uppehåll (basal hemsjukvård), listningstak med kö och förtur, listningsbar personal med ST-tak, läkare som slutar, folkbokföringshändelser, ögonblicksbild på mätdagen, listningsstatistik och export. ADR 0014.
Lagring Intervall, inte dagar. En listning är en bitemporal version i listning.listning_version med nyckeln {pseudonym}|{listningstyp} och giltigheten [från, till). Omlistning registrerar ett nytt intervall och stänger det tidigare (exclusion constraint: aldrig två samtidiga listningar av samma typ). Attributändringar blir nya versioner av samma ListningId. Avlistning och uppehåll tar bort giltighet (AvslutaAsync). Övriga tabeller: enhet_version, personal_version, tak_version, regler_version, dokument (kö, index, uppehåll, ögonblicksbilder), outbox.
Ögonblicksbild "Vem var listad hos X den 2026-05-31 enligt vad vi visste 2026-06-03" besvaras med AllaAsOf(giltigVid, kandVid). Ögonblicksbilden låser kandVid, regelversion och alla pseudonymiserade poster med SHA-256, så att Beräkning kan lägga den i manifestet (KRAV-36). Aggregat per vårdenhet, åldersgrupp, kön och folkbokföringslän.
Regler Listningsreglerna (2 omlistningar per 12 månader, ST-tak 550/1 100, 28 dagars svarstid, 30 dagars uppehåll, mätdag, åldersgrupper, förtur) är data per regionpaket i packages/region-*/seed/listningsregler.json och regler_version (PUT /listningsregler), bakom IListningsregelkalla och utvärderade av Listningsregelmotor (rena funktioner). De flyttas till Regelverk när regelmotorn kan uttrycka dem.
API (/api/listning/v1) /listningar (+ /avlistning, /uppehall), /listningstyper, /listningsregler, /matdagar, /vardenheter, /vardenheter/{hsaId}/listade?datum=&kandVid=, /listningstak, /ko, /personal (+ /slutar), /antal-listade, /statistik, /ogonblicksbilder (+ /{id}/poster, paginerat), /folkbokforingshandelser, /export
Nationell port ICarelistingProducent med samma operationer och fält som carelisting v2.1, exponerad i MVP:n över REST på /api/carelisting/v2 (CreateListing, GetListing, UpdateListing, GetListingCounty, GetListingTypes, GetAvailableHealthcareFacilities, GetAvailableHealthcarePersonnel). En NTjP/RIVTA-adapter kan läggas ovanpå. IStatligListningstjanst med mock (Listning:StatligListningstjanst:Aktiv).
Portar IListningPersonregister och IListningEnhetsregister, kopplade i Ersvia.Api/Kopplingar/ListningKopplingar till Personuppgifter (åtkomstloggning med aktör och ändamål) och Masterdata
Publicerar ersvia.ListningAndrad.v1, ersvia.ListningsunderlagFaststallt.v1
Krav KRAV-12, KRAV-24 (nämnaren i kapiteringen); NK17, NK18

SekvensSekvens: listning med intervall-lagring och ögonblicksbild på mätdagenLadda ned SVG: Sekvens: listning med intervall-lagring och ögonblicksbild på mätdagenLadda ned PUML: Sekvens: listning med intervall-lagring och ögonblicksbild på mätdagen

Rapportering (ersätter RAPP, byggd i F9a)#

Egenskap Beskrivning
Ansvar Rapportering för vårdgivare som inte har en direkt koppling till Ersvia. Utkast och arbetslista. Inskick via torrkörning med svaret per besök (GVR-kod). Efterregistrering som är äldre än 3 månader kräver att en annan person godkänner (det går att ställa in). DRG-förslag ur regionpaketets tabell, som man bekräftar eller ändrar. MVC-inskrivningsstatus. Vårdperiod (starta, avsluta, öppna igen). Väntande. Kassa: avläsning, transaktioner, kassaperioder per dag, vecka och månad, stängning med kontantdifferens, kvitto och frikort. Reservnummer (99nnnnnnR), där LMA/dossier gör det möjligt att fakturera. Uppladdning av CSV och JSON. Modulen anropar samma portar som när ett system rapporterar maskinellt.
Schema rapportering: dokument utkast, vardperiod, kassa, reservnummer, lopnummer, fil
API (/api/rapportering/v1, 34 operationer) /utkast (+ /inskick, /svar, /drg-forslag, /drg, /godkannande, /makulering, /kopia), /vardperioder (+ /avslut, /ateroppning), /vantande, /mvc/inskrivningsstatus, /kassor/{kassaId}/transaktioner, /avlasning, /stangning, /perioder, /frikort, /reservnummer, /filer
Kopplingar Ersvia.Api/Kopplingar/RapporteringKopplingar.cs
Felkoder RA-5002–RA-5012
Krav KRAV-11

Kompatibilitet (fasader för dagens format, byggd i F9a)#

Egenskap Beskrivning
Ansvar Tunn översättning utan egen affärslogik till Vårdhändelser och Väntande via portarna IKompatibilitetVardhandelser, IKompatibilitetVantande, IKompatibilitetEnheter, IKompatibilitetPatienter, IKompatibilitetFelkoder och IKompatibilitetSystembehorighet (kopplas i Ersvia.Api/Kopplingar/KompatibilitetKopplingar.cs).
GVR REST v2.0.0 Alla 59 operationer på samma sökvägar under fasadens bas-URL (Kompatibilitet:Gvr:Bas): /v2/besok, /v2/inskrivningar (+ flytt, utskrivning), /v2/aktiviteter, /v2/vantande (+ avslut), /v2/vardperioder (+ avslut), /v2/journaler, /v2/kontakter (+ rapport för kontaktvårdgarantin), /v2/vardplatser (+ batch), /v2/info. X-Resource-Id ger 201 med Location och 409 med errorCode 313 vid dubblett, X-Patient-Id, page.limit/page.offset, 204, GvrProblemDetail med GVR:s errorCode via felkodskatalogen, schemavalidering direkt ur den inbäddade specen, synkron torrkörning som i GVR (Gvr:SynkronValidering), standardavtal OVR6001/OVR6002 och INS6001/INS6002.
GVR REST v1.9.5 Alla 54 operationer med naturlig nyckel
mTLS ASP.NET Core-certifikatautentisering (Kompatibilitet:Mtls:Aktiv): kedjan valideras mot regionens rotcertifikat (SITHS i drift, dev-CA i test), giltighet och användning kontrolleras, spärrkontroll kan slås på. HSA-id hämtas ur certifikatets SERIALNUMBER (OID 2.5.4.5), annars ur CN om det liknar ett HSA-id, och mappas till de vårdgivare systemet får rapportera för via Identitet eller Kompatibilitet:Systemkonton (annars 403, errorCode 12). När TLS termineras i ingressen läses klientcertifikatet ur en header (Mtls:VidarebefordratCertifikat, t.ex. X-Client-Cert).
SNOD-XML POST {bas}/snod/{tjanst} för nio tjänster: GVRXMED1, GVRXMEDK1, GVRXAKUT1, GVRXAKUTK1, GVRXAKUTB1, GVRXTILL1, GVRXTILLK1, GVRXTILLB1 och GVRXPOS1. Basic auth med konton per vårdgivare, HTTPS krävs, svaret <Svar><statuskod/>, statuskod 20 vid syntaxfel. SNOD25 och XSD saknas i underlaget (dokumenterat i contracts/legacy/gvr/gvr-fasad.json).
CVR Import av semikolonfiler (posttyp M och B, filnamnsmönster) som ögonblicksbild per enhet och filkälla med implicit avslut, maskinell semikolonkvittens till utkorgen, inkorgsvakt kl. 07.00. Förvaltnings-API i contracts/openapi/kompatibilitet.yaml: /cvr/filer, /cvr/kvittenser/{id} (+ /fil), /cvr/inkorg/korningar.
Schema kompatibilitet: dokument gvrpost, gvrindex, journal, vardplats, kontakt, cvrkalla, cvrkvittens. Akut- och tillgänglighetsfält ur GVR lagras bara här, inte i Vårdhändelser.
Felkoder KP-5001, KP-5002 och GVR:s errorCode via felkoder.yaml
Kvar till F9b VF-bokföringsfilen (.prn) och AF-rapporten i Excel, som kräver Fakturering och Avstämning (F8)
Krav KRAV-6, KRAV-14, KRAV-72

SekvensSekvens: GVR v2-rapportering via kompatibilitetsfasaden med mTLS och idempotensLadda ned SVG: Sekvens: GVR v2-rapportering via kompatibilitetsfasaden med mTLS och idempotensLadda ned PUML: Sekvens: GVR v2-rapportering via kompatibilitetsfasaden med mTLS och idempotens

Personuppgifter#

Egenskap Beskrivning
Ansvar Folkbokföring (ålder, kön, län, kommun, basområde). Slagning mot PU och sedan mot SPAR. Reservnummer och samordningsnummer. Skyddad identitet. Pseudonymisering (IPseudonymisering): ett ersättningsnamn tar platsen för personnumret. Återidentifiering, det vill säga att få fram personnumret igen, när ändamålet är prövat. Utlämningsexport och minsta åtkomst. Modulen loggar varje läsning med pseudonym i åtkomstloggen. Den loggar aldrig personnummer i klartext.
Byggt i F2 PersonId för personnummer, samordningsnummer och reservnummer. Pseudonymiseringstjanst (HMAC-SHA-256 per huvudman). En port mot folkbokföringen, med mock. Skyddad identitet. En åtkomstlogg i personuppgifter.revisionslogg. Återidentifiering och utlämningsexport kom i F8 (i Kompatibilitet). VAL-exporten och INyckelkalla kom i F12a.
Schema personuppgifter (F2: revisionslogg, outbox, dokument; planerat: patient med reservnummer och LMA/dossier, folkbokforing bitemporal)
Publicerar ersvia.FolkbokforingAndrad.v1 (pseudonymiserad variant till ersättningszonen)
Krav KRAV-18, KRAV-38, KRAV-67

5.3 Nivå 2: Ersättningszonen#

KomponentKomponentdiagram för ersättningszonenLadda ned SVG: Komponentdiagram för ersättningszonenLadda ned PUML: Komponentdiagram för ersättningszonen

Modul Ansvar Schema Viktigaste API Publicerar Krav Ersätter
Masterdata (byggd F2) Gemensamt register enligt NIM:s Organisation: huvudman, beställarnämnd, vårdgivare och vårdenhet med giltighet. Ersvias egna id är primära (vg-, ve-, bn-, fm-); HSA-id, Avtalat uppdrags-id, vårdgivarnummer och kombika är versionerade, bitemporala alias. Fakturamottagare med Peppol-id. HSA-port med mock. masterdata /vardgivare, /vardgivare/{id}, /vardgivare/{id}/historik, /vardgivare/{id}/villkor, /vardenheter, /vardenheter/{id}/historik, /vardenheter/sok-alias, /bestallarnamnder, /fakturamottagare, /hsa-synk, /huvudman ersvia.VardgivareRegistrerad.v1, ersvia.VardenhetRegistrerad.v1 KRAV-16, KRAV-76 Delar av Kodserver, Ek
Kodverk ICD-10-SE, KVÅ, ATC, NordDRG och Kodserver-tabellerna (AVD, SAMVERKS, UPPDRAGSTYP, ÅTAGANDE, PRODUKT, BTYP, VDG, TAXA, AKUT, IKOD, UKOD, IFORM, UFORM, KODSDIA, DIAGNOS, OPKOD, KODATC, TILLSTAND, CVRGRUPP, PVDG, KODSSAMVERKS, KODSSMHUS, ADA). Generisk modell kodsystem + version + kod med mappningstabeller mellan versioner, förberedd för ICD-11. Byggt i F2: importörer för ICD-10-SE (TSV), KVÅ (xlsx), NordDRG-viktlista och Kodservertabeller, publicering med fyra ögon. kodverk /kodverk, /kodverk/{id}/versioner, /kodverk/{id}/historik, /kodverk/{id}/koder/{kod}, /kodverk/{id}/mappningar, /kodverk/{id}/importer, /importer/{jobbId}, /kodverk/{id}/versioner/{versionsId}/publicera ersvia.KodverksversionPublicerad.v1 KRAV-17 Kodserver (replik)
Overenskommelse (byggd F2) Två styrformer: avtal (LOV, LOU, LOL, LOF) och uppdrag i egen regi (vårduppdrag i budgeten). Vårdutbud, vårdenheter, ersättningsgrunder (eg-) och versioner med giltighet, beställarnämnd, legacyModellnummer. VOK-attribut och mappning mot FHIR HVOContract/HVOOrganizationAffiliation. Import från avtalssystemet (mock). overenskommelse /overenskommelser, /overenskommelser/{id}, /overenskommelser/{id}/historik, /overenskommelser/{id}/ersattningsgrunder, /importer ersvia.OverenskommelseAndrad.v1 KRAV-1 till KRAV-5
Regelverk (byggd F3) Regelversioner som regeldokument enligt regelschemat, parametertabeller, konsultationsversioner (nästa års regelpaket), mallar, giltighet, beslutsreferens, källdokument, fyra ögon, facittest med hashat testbevis, import av rapporteringsanvisningar, export. Kör Ersvia.Regelmotor. ADR 0013. regelverk (regelversion_version, parametertabell_version, konsultationsversion_version) /ersattningsgrunder, /ersattningsgrunder/{id}/historik, /ersattningsgrunder/{id}/utkast, /regelversioner/{id}/granska, /publicera, /avsla, /facittest, /konsultation, /jamfor, /parametertabeller, /mallar, /konsultation, /export, /importer/rapporteringsanvisningar ersvia.RegelversionPublicerad.v1, ersvia.ParametertabellPublicerad.v1 KRAV-19 till KRAV-23 Konfiguration i ERSMO och HEJ
Berakning (byggd F6) Körning per period, huvudman och urval av vårdgivare (ordinarie, omräkning, reproduktion, torrkörning), låst manifest, regelval per vårdgivare, avtalsparametrar som JSON merge patch, ackumulerade regler i två pass, fakturamottagare via beslutstabell i regionpaketet, rader med trace och källhändelser, omräkning med differensrader, skuggkörning. ADR 0015. berakning (dokument korning, resultat, trace) /api/berakning/v1: POST /korningar, /korningar/{id}, /manifest, /reproducera, /omrakning, /differens, POST /skuggkorningar, /ersattningsrader, /ersattningsrader/{id}/trace ersvia.BerakningKlar.v1 KRAV-24 till KRAV-38, KRAV-40, KRAV-55 ERSMO, HEJ
Malrelaterad (byggd F7) Målindikatorer som bitemporala, versionerade regler med fyra ögon och facit vid godkännandet (testbevis). Måluppfyllelse med tröskel, linjärt eller andel; bonus eller vite per listad och månad/år, per mål eller i procent av totalersättningen; täckningskrav; efterregistreringsdag den 7:e; årsavstämning med tak per takgrupp; ansökningar (förslag och beslut av olika personer); inläsning av externa källor (patientenkät, kvalitetsregister, VAL, CVR) med hash. Bokför via Berakning.BokforTillaggAsync (körning tillagg, avräkning AVR/<komponent>). ADR 0017. malrelaterad (indikator_version; dokument indikatorutkast, maluppfyllelse, ansokan, kallinlasning) /api/malrelaterad/v1: /indikatorer (+ /historik, /godkannande), /maluppfyllelse (+ /berakningar), /arsavstamningar, /ansokningar (+ /beslut), /kallor/inlasningar ersvia.MaluppfyllelseBeraknad.v1 KRAV-41 till KRAV-46 Excel
Simulering (byggd F6) Isolerad simulering av utkast eller konsultationsversion mot historiskt underlag, KPI och jämförelse per vårdgivare, vårdval och ersättningsslag, parallellkörning mot legacy-CSV med rapport. simulering (dokument simulering, parallellkorning) /api/simulering/v1: /simuleringar (+ /resultat, /jamforelse), /parallellkorningar (+ /rapport) ersvia.SimuleringKlar.v1 KRAV-64, KRAV-65, KRAV-72
Granskning (byggd F7) Granskning per period med avvikelseflaggor, justeringar (motivering och ärende krävs), attest i två steg mot attestmatrisen, deterministiska kontrollregler (versionerade, fyra ögon), riskpoäng (profilering, av som standard), ärenden med underlagsbegäran, återkrav, beslut, ränta, preskription och kvittning, riskregister och årsrapport per nämnd och utförare. ADR 0017. granskning (kontrollregel_version, avvikelsegrans_version; dokument granskning, justering, kontrollregelutkast, kontrollkorning, bemanning, arende, kvittning, risk) /api/granskning/v1: /perioder/{period}/granskning, /granskningar (+ /justeringar, /attest, /aterforvisa), /avvikelsegranser, /kontrollregler (+ /historik, /godkannande), /kontrollutfall, /underlag/bemanning, /riskpoang (+ /dokumentation), /arenden (+ /underlagsbegaran, /aterkrav, /beslut, /preskriptionsavbrott, /ranta, /kvittningar), /kvittningar, /riskregister, /arsrapporter/{ar} ersvia.JusteringRegistrerad.v1, ersvia.UnderlagAttesterat.v1 KRAV-47 till KRAV-49; NK3–NK7 Manuell kontroll i VF
Fakturering (byggd F8) Fakturaunderlag per vårdgivare, fakturamottagare och faktureringsmånad ur attesterad granskning; förslag → godkännande eller invändning (90 dagar, FA-5002) → attest i två steg (FA-5019) → Peppol BIS Billing 3 till ekonomisystemet med kvittens; ostridiga rader betalas trots bestridda; tillägg med oföränderligt beslut (FA-5003) och kreditering; periodiska tillägg; MOMSK-AVTAL (6 % eller 18/5 %) på allt fakturerat inklusive ackumulerade regler och tillägg; kvittning och nedsättning från Granskning; asylspärr (FA-5006); självfakturering (FA-5018); egen regi som budgetjustering; fakturanummerserie, vårdgivargrupper och samfaktura, konteringsmodeller, LMA-registrering, faktureringsschema, aviseringar; utlämningar via zongränsen och inkommande utomlänskrav (FA-5021). ADR 0019. fakturering (dokument fakturaunderlag, periodiskttillagg, nummerserie, vardgivargrupp, kontering, momsvillkor, lma, utlamning, utomlanskrav, avisering) /api/fakturering/v1: /fakturaunderlag (+ /godkannande, /invandning (+ /beslut), /attest, /tillagg (+ /beslut, /kreditering), /peppol, /skicka), /kvittenser, /differensunderlag, /atersokningsunderlag, /vardgivare/{id}/fakturanummerserie, /vardgivargrupper (+ /samfaktura), /lmaregistreringar, /periodiska-tillagg, /konteringsmodeller/{id}, /momsvillkor/{id}, /faktureringsschema, /utlamningar, /utomlanskrav (+ /beslut), /aviseringar ersvia.FakturaforslagSkapat.v1, ersvia.UnderlagGodkant.v1, ersvia.UnderlagInvandning.v1, ersvia.FakturaSkickad.v1, ersvia.UtbetalningKvitterad.v1, ersvia.BudgetjusteringBokford.v1 KRAV-38, KRAV-39, KRAV-50 till KRAV-58; NK8, NK9, NK33 Vårdfaktura, Res
Avstamning (byggd F8) Avstämningsrad per ersättningsrad (av- ↔ er-) med drill-down via trace till regelrader (versions-id), vårdhändelser (fördelat belopp) och listningstal per vårdenhet och mätdag; status per vårdhändelse med AF-kod i alla steg; månadsfil (CSV/JSON); prenumerationer med nattlig uppdatering; engångsrapporter med urval och kolumnval; 15 månader i portalen, sedan arkivet. Återidentifiering för drill-down bara i patientdatazonen. ADR 0019. avstamning (dokument prenumeration, rapport) /api/avstamning/v1: /avstamningsrader (+ /{id}/underlag), /vardhandelsestatus, /manadsfiler/{period}, /prenumerationer (+ /korningar), /engangsrapporter, /rapporter KRAV-59 till KRAV-61 AF
Uppfoljning (byggd F10) Utfall per vårdgivare, vårdenhet, ersättningsslag och period; leveranser som paket med manifest.json (SHA-256 per fil) i CSV, Parquet eller JSON till VAL/datalagret och de nationella exporterna (väntetidsdatabasen, KPP, patientregistret, statsbidrag) med personnummerkontroll (UP-5003) och redovisade avvikelser från filspecifikationerna; bitemporal budget per år, nämnd och vårdval med budgetuppföljning, vårduppdrag i egen regi och budgetindikatorer; publicering av aggregat per privat utförare med cellundertryckning (minst 5). ADR 0018. uppfoljning (budget_version; dokument leverans, publicering) /api/uppfoljning/v1: /utfall, /leveranser (+ /filer/{filnamn}), /budgetar, /budgetuppfoljning, /budgetindikatorer, /varduppdrag, /publiceringar KRAV-62, KRAV-63; NK22, NK28, NK29 Exporter från GVR, ListOn, FUMS, FUL
MedicinskService (byggd F6) Leveranser från leverantörer av medicinsk service (JSON och Ersvias CSV-format), beställare via Masterdata, vidarefakturering med vårdgivarens andel (t.ex. 20 %) fördelad per rad, schablonavdrag för ej folkbokförda. medicinsk_service (dokument leverans, leverantor, vidarefakturering) /api/medicinsk-service/v1: /leveranser (+ /fil, /rader), /vidarefakturering (+ /korningar), /leverantorer KRAV-13, KRAV-56 FUMS
Lakemedel (byggd F6) Underlag från E-hälsomyndigheten (CSV-adapter), koppling via HSA-id eller arbetsplatskod, vidarefakturering vid eget kostnadsansvar, undantagsläkemedel, KÖL-riskdelning (50 % av avvikelsen utanför ±3 %) i årsavstämning. lakemedel (dokument underlag, vidarefakturering, arsavstamning) /api/lakemedel/v1: /underlag (+ /fil), /kostnader, /vidarefakturering (+ /korningar), /riskdelning/arsavstamningar, /undantagslakemedel KRAV-13, KRAV-56 FUL
Identitet (byggd F3) Roller (Avtalsansvarig, Controller, Attestant, Vårdgivare, Ekonomifunktionen, Systemförvaltare), behörighet per användare och vårdgivare, delegations- och attestmatris som bitemporal data med utkast och godkännande, provning av beslut (Delegationsprovning) och attest (Attestprovning, egenattest spärras, två steg över gräns), beslutslogg. Portarna IBeslutskontroll och IAttestkontroll i BuildingBlocks. identitet (matris_version, behorighet_version, revisionslogg) /api/identitet/v1: /roller, /mig, /anvandare/{id}/behorigheter, /matriser/{matristyp}, /matriser/{matristyp}/utkast, /matriser/utkast/{versionsId}/godkann, /provning/beslut, /provning/attest, /beslutslogg KRAV-66; NK20
Drift (byggd F10, del av F12) Integrationsstatus via IIntegrationslogg (VAL, nationella exporter, legacyimport, GVR-skuggning, CVR-inkorg) med omstart (IIntegrationskorare), ändrings- och åtkomstlogg med verifiering, export i öppet format (json, ndjson, csv, xml) med hash per fil, e-arkivpaket med METS enligt FGS/CSIP och systemhälsa. ADR 0018. drift (dokument integrationskorning, export, earkiv) /api/drift/v1: /integrationer (+ /korningar), /loggar/atkomst, /loggar/andringar, /loggar/verifiering, /exporter (+ /filer/{filnamn}), /earkiv/leveranser, /halsa KRAV-67, KRAV-68, KRAV-75, KRAV-79
Migrering (byggd F10) Legacyimport (AF-kolumner per vårdhändelse, VF:s bokföringsfil V2), parallellkörning med deterministisk klassning (avrundning, underlagsskillnad, regelskillnad, okänd) och täckning (3 godkända månader i följd), historik som legacy-körningar med eget manifest-id (MI-5004 vid dubblett) och differens för retroaktiv rättelse efter bytet. Skuggning till gamla GVR sker i Kompatibilitet. ADR 0018. migrering (dokument legacyimport, parallellkorning, legacykorning) /api/migrering/v1: /legacyimporter, /parallellkorningar (+ /rapport), /tackning, /legacykorningar (+ /differens) KRAV-72, KRAV-73
Ersvia.Portal (byggd F11a) Blazor Web App med tema per regionpaket, roller ur OIDC, ingen egen affärslogik (anropar Api via Ersvia.Klient). Se 5.5. ADR 0016. (inget eget) Sidor: /, /regelverk, /regelverk/konsultation, /vad-gallde-nar, /vardhandelser, /vardhandelser/torrkorning, /listning, /kodverk, /overenskommelser, /vardgivare, /ai-register; platshållare för /berakning, /granskning, /fakturering, /avstamning KRAV-5, KRAV-50 till KRAV-52, KRAV-59, KRAV-69, KRAV-77 VF-portalen, AF
Ersvia.Ai, Ersvia.Mcp (byggda F11a) AI-tjänst i ersättningszonen: IErsviaAi ovanpå IChatClient (Anthropic, lokal OpenAI-kompatibel, FakeChatClient), AI-register, pseudonymiseringsfilter, beloppsvakt, art. 50-upplysning och hashkedjad AI-revisionslogg. MCP på /mcp och stdio med sju verktyg; REST /ai/* för portalen och GET /ai/register. Se 8.6. ADR 0016. (inget eget; AI-revisionslogg som JSON Lines-fil) MCP: vad_gallde, sok_overenskommelse, hamta_regelversion, vardhandelsestatus, listning_ogonblicksbild, forklara_felkod, skapa_regelutkast NK26, NK40

Integrationsadaptrar#

Varje adapter implementerar en port som definieras i den modul som äger flödet. Portarna är regionoberoende, medan adaptrarna får innehålla regionspecifika format.

Adapter (src/Integrations/Ersvia.Integrations.*) Port Ägande modul Alternativa adaptrar i andra regioner
Avtalssystem IAvtalskalla Overenskommelse Regionens avtalsdatabas, E-hälsomyndighetens HVOContract
Utbudstjanst IVardutbudskalla Overenskommelse healthcareoffering v3
Folkbokforing IFolkbokforing Personuppgifter Navet, PU
Listning1177 ICarelistingProducent Listning Statlig listningstjänst; import från Master, LISSY, Huldra, OpenListon
Ehalsomyndigheten ILakemedelsunderlag Lakemedel
MedicinskServiceLev IMedicinskServiceunderlag MedicinskService
Raindance IEkonomisystem Fakturering Unit4/Agresso, Visma, SAP, Peppol direkt
Val IAnalysleverans Uppfoljning Regionens datalager
Migrationsverket IStatligAtersokning Fakturering
Kodserver IKodverkskalla Kodverk Regionens egna kodtabeller
EkHsa IHsaKatalog Masterdata
Drg IDrgGrupperare Berakning Olika licensierade grupperare
Billing IUtomlansfakturering Fakturering financial:billing:claim v1.1
Frikort IHogkostnadsskydd Berakning financial:patientfees:exemption 1.0

5.4 Nivå 3: Inre struktur#

Gemensam inre struktur för en modul#

Alla moduler har samma inre lager. Bara Kontrakt är public.

Lager Innehåll Synlighet
Kontrakt DTO:er, integrationshändelser (IIntegrationshandelse), portgränssnitt, läsfrågor public
Domain Aggregat, värdeobjekt, domänregler, bitemporala versioner (Bitemporal<T>, BitemporalHistorik<T>) internal
Application Kommandon och frågor, transaktionsgräns, outbox (IOutbox.LaggTillAsync i samma transaktion), revisionslogg internal
Infrastructure EF Core DbContext med eget schema och migrationshistorik __ef_migrationer, lager, adaptrar mot portar internal
Endpoints Minimal API-mappning, ProblemDetails, giltigVid/kandVid, idempotens internal

Modulen registreras genom IModul (Namn, Schema, RegistreraTjanster, MappaEndpoints). Masterdata är exempelmodulen i F0.

Regelmotorn (byggd i F3)#

Ersvia.Regelmotor är ett rent bibliotek (ADR 0013). Regelverk använder det för publiceringskontroll och facittest, och Berakning och Simulering ska använda det för körningar.

Komponent (kod) Ansvar
Grund (Uttryck, Varde, Miljo, Underlag, Post) Uttrycksspråk som träd av konstanter, fält, parametrar, tabelluppslag och en fast lista operatorer, skrivet som JSON (op/argument) eller formel ({"formel": "max(0, x - $troskel) * 0.75"}). Tal är alltid decimal. Typkontroll före publicering.
Primitiver (Primitiver, Villkor, Tabelluppslag) Elva primitiver: urval, villkor, tabelluppslag, trappa, tak, andel, tidsfönster, aggregering, fördelning, schablon och episod. Beslutstabeller med explicit Traffpolicy: Unik (UNIQUE), Forsta (FIRST), Prioritet (PRIORITY), Alla (COLLECT) och Summa (COLLECT-SUM).
Mallar (Mallbas, Listningsmall, Kvotmall, Sammansatt, Clearing m.fl.) 34 mallar (33 ur schemat plus clearing). Alla 42 regeltyper i katalogen är uttryckta som mall eller variant av mall, utan kodad specialmall. Mappningen finns i docs/plan/regelmappning.yaml.
Korning (Fas, Planbygge, Kor, Korningsresultat) Nio körfaser: urval → klassificering → prissättning → tillägg/avdrag → tak/målvolym → periodavstämning → pooler/clearing → justering → resultat, grupperade i fyra körnivåer (händelse, vårdgivare/period, pool, avstämning). Varje mall planeras till namngivna steg, och beroendena bildar en DAG som sorteras topologiskt med fas, regelordning och stegordning som deterministisk prioritet. Ett steg får inte bero på ett steg i en senare fas. Prisbrytpunkt: varje händelse prissätts med den regelversion som gällde på brytpunktsdatumet.
Trace och hash Varje primitivanrop skriver en Tracepost (regelrad som JSON-pekare, indata som post-id, mellanvärden, resultat). Korningsresultat.Hash() är SHA-256 över rader, flaggor och trace; samma regler och underlag ger samma hash (KRAV-36).
Validering (Publiceringskontroll, Testbevis) Stoppar regeldokument som inte går att planera (okänd mall, cykel, fel fasordning), som har överlapp (UNIQUE, PRIORITY med samma prioritet), luckor utan standardutfall eller typfel (RV-5002). Testbeviset (regelhash, motorversion, fallens utfall, hash) sparas med regelversionen.

AktivitetAktivitet: regelmotorns körningLadda ned SVG: Aktivitet: regelmotorns körningLadda ned PUML: Aktivitet: regelmotorns körning

Begränsningar i F3, som tas upp i F6 och F7: mätning vid flera tidpunkter i mål, riskpott i tandvårdspengen, LOL-undantag över ersättningstaket (10 §) och arvoden som passerar tak 1 mitt i ett besök.

Berakning (byggd i F6, C4 nivå 3)#

C4Komponentvy för Berakning och Regelverk (C4 nivå 3)Ladda ned SVG: Komponentvy för Berakning och Regelverk (C4 nivå 3)Ladda ned PUML: Komponentvy för Berakning och Regelverk (C4 nivå 3)

Komponent (kod) Ansvar
Portar (BerakningPortar.cs) IBerakningsregler, IBerakningsmasterdata, IBerakningsoverenskommelser, IVardhandelseunderlag, IListningsunderlag och IKostnadsunderlag. Adaptrarna i Ersvia.Api/Kopplingar/BerakningKopplingar.cs slår upp personuppgifter i patientdatazonen. Beräkning får bara ålder, länskod, kommunkod och pseudonym.
Manifest (BerakningTjanst) Låser poster med versions-id eller referens och hash: regel/{ersättningsgrund}/{giltigFrån}, parametertabell/{id}, masterdata/vardgivare/{id}, masterdata/vardenhet/{id}, kodverk/{kodverk}, overenskommelse/{id}, konfiguration/berakning, underlag/vardhandelser/{period} (vårdhändelsebildens id och hash, och tidigare månaders bilder för ackumulerade regler), underlag/listning/… (listningsbild per mätdag och listningstyp), underlag/fums/{period} och underlag/ful/{period}, tidigareKorning/{period} och motor/version. Manifest-id mf- + 16 hextecken av SHA-256 över posterna. Omräkning och reproduktion återanvänder de låsta bilderna.
Regelval och parametrar En regel gäller för en vårdgivare i två fall. Det första är när en överenskommelse pekar på regeln (ersattningsgrunder[].regelId). Det andra är när regelns omfattning träffar överenskommelsen, vårdvalet, avtalsområdet eller driftformen. Ersättningsgrundens parametrar läggs på som JSON merge patch (t.ex. uppdrag 70/28/2, poängpris, målvolym).
Kärnan (Berakningskarna) Pass 1 körs med regelmotorn. Pass 2 gäller regler med avstamningsperiod (kvartal, halvår, år) och bokför skillnaden mot tidigare körningar. Vårdgivarna körs parallellt (6 åt gången) i deterministisk ordning.
Summering och mottagare Rader per vårdgivare, vårdenhet, ersättningsgrund, komponent, ersättningsslag, patientkategori, betalningsmottagare, fakturamottagare och överenskommelse. Fakturamottagaren härleds med en beslutstabell (FIRST) i packages/region-*/berakning/berakning.json: asyl → staten/Asylenheten, EU/EES → Försäkringskassan, KSON per kommun, folkbokförd → överenskommelsens mottagare, utomläns → region:{länskod}, okänd hemvist; egen regi → egenRegiBudget.
Trace Per rad: motorsteg, källhändelser (vårdhändelse-id och pseudonym), listningstal per vårdenhet och kostnadsunderlag (/ersattningsrader/{id}/trace).
Omräkning och stängd period Nytt kunskapsläge med samma underlag, differensrader med ursprungligRadId. En period med slutlig ögonblicksbild kräver först en torrkörning. Själva körningen måste sedan ha samma manifesthash, annars blir det BE-5004.
Skuggkörning Två regeluppsättningar körs på samma underlag. Resultatet sparas inte som gällande. Det markerar inga vårdhändelser och publicerar ingen BerakningKlar.

SekvensSekvens: skuggkörning, simulering och parallellkörning mot legacyLadda ned SVG: Sekvens: skuggkörning, simulering och parallellkörning mot legacyLadda ned PUML: Sekvens: skuggkörning, simulering och parallellkörning mot legacy

Vardhandelser: mottagning och validering#

Komponent Ansvar
Mottagning Tar emot kanonisk vårdhändelse från API (senare fasaden), kontrollerar idempotens och schema, bestämmer faktureringsmånad, säkerställer partition, sparar versionen och skriver ersvia.intern.ValideringBegard.v1 i outboxen i samma transaktion.
Asynkron bearbetning Låser valideringsjobb med FOR UPDATE SKIP LOCKED, så att flera arbetare kan köra parallellt (16 samtidiga valideringar i lasttestet).
Valideringsregler Schema → personidentitet (IPatientregister, testpatientspärr) → datumregler → kodverk på vårdhändelsedatumet (IKodregister) → vårdenhet och avtal (IVardenhetsregister, IAvtalsregister) → diagnoser och åtgärder → frister (90 dagar, 30 månader). Varje utfall är en Regelutfall med felkod ur katalogen (IFelkodsregister).
Statusdimensioner Teknisk, kontroll och ekonomisk status; kontraktets status och AF-koden härleds (t05).
Faktureringskalender Brytpunkt sista vardagen 24.00 lokal tid, egna brytpunkter per huvudman (Vardhandelser:Brytpunkter). En period med slutlig periodbild är frusen, och nya inskick går då till nästa månad.

Fakturering och Avstämning (byggda i F8)#

Komponent (kod) Ansvar
Portar (FaktureringPortar.cs) IFaktureringsunderlag (attesterade rader, vårdhändelsestatus, brytpunkt), IEkonomisystem (filadapter till en mapp som systemet läser in från, med mock; systemets namn och mapp står i regionpaketet), IIdentitetsutlamning (gränsen mellan zonerna) och IEpostavisering. De kopplas i Ersvia.Api/Kopplingar/FaktureringKopplingar.cs.
Underlagsbyggare (FaktureringTjanst) Ett underlag per vårdgivare × fakturamottagare × faktureringsmånad: regionens enhet (e-faktura), asylenheten (spärras utan LMA/dossier) och egen regi (budgetjustering). Utomläns-, EU/EES- och okänd hemvist-rader betalas till vårdgivaren och återsöks via utlämningsexporten.
Faktureringsregler Momskompensation blir raden MOMSK-AVTAL per avtal (avtalets flagga, sats 6 % eller 18/5 % vid lokalkostnadsandel). Faktureringsmånad = mottagningsmånad. Beräkningsadaptern sätter faktureringsdatum, så att händelser som registreras i efterhand kommer med. Priset följer händelsedatumet. Betalningsdag är +20 dagar. Detta rättar F6:s begränsningar (T20, T21).
Peppolfaktura Peppol BIS Billing 3 (UBL 2.1, EN 16931). Skattekategori E (vård utan moms). Negativa rader har negativ kvantitet. Kreditnota 381. Inga personnummer.
Invändning och tillägg Vårdgivaren kan invända mot enskilda rader. När underlaget godkänns flyttas de bestridda raderna till ett eget underlag, och de ostridiga raderna betalas ut. Ett tilläggsbeslut går inte att ändra.
Avstämning (AvstamningTjanst, Avstamningsregler) Avstämningsrader, drill-down, status per vårdhändelse, månadsfil, prenumerationer och rapporter (se 5.3).
Dagens utdata (Kompatibilitet, F9b) VF-bokföringsfilen .prn enligt contracts/legacy/vf/vf-bokforingsfil.yaml: V1 (174 tecken), V2 med Akut, Vårdform och HSA-id (193 tecken) och med kontering (125 tecken). Windows-1252, CRLF, belopp i ören. AF-rapporten i Excel (OpenXml) med flikarna Händelser och Avvikelser; PatientID återidentifieras och loggas i patientdatazonen.

SekvensSekvens: fakturaunderlag, attest i två steg och e-fakturaLadda ned SVG: Sekvens: fakturaunderlag, attest i två steg och e-fakturaLadda ned PUML: Sekvens: fakturaunderlag, attest i två steg och e-faktura

Granskning och Målrelaterad (byggda i F7)#

Komponent (kod) Ansvar
Granskning (GranskningTjanst) POST /perioder/{period}/granskning hämtar ersättningsraderna via kompositionsroten (GranskningKopplingar) och flaggar avvikelser mot föregående period över gränsen i avvikelsegrans_version. Ändras beloppet efter godkännande återgår posten till beraknad och måste attesteras igen.
Kontrollmotor Deterministiska kontrollregler, alltså regler som alltid ger samma svar för samma indata. De versioneras med fyra ögon (två personer). Reglerna gäller volym mot kapacitet och bemanning. De gäller också dubbletter och nästan-dubbletter, avlidna och utflyttade, samma patient hos många vårdgivare, ovanliga kodkombinationer och sena rättelser med stor effekt. Träffarna visar exempel som vårdhändelsenummer eller id, aldrig personnummer.
Riskpoangmodell Summan av vikterna för träffade regler och avvikelseflaggor, högst 100, med förklaring per bidrag. Behandlas som profilering av enskilda näringsidkare (GDPR art. 4.4, kontroll 3 R8), dokumenteras i GET /riskpoang/dokumentation och används bara för urval. Den är avstängd om inte regionpaketet slår på den. region-stockholm slår på den, region-exempel stänger av den.
Ärenden (ArendeDto) Begäran om underlag (LOL 26 §, LOF 25 §). Förslag till återkrav (LOL/LOF 19 §). Beslut om återkrav, nedsättning eller ingen åtgärd, med motivering (förvaltningslagen 32 §). Fyra ögon och delegation via IBeslutskontroll (ärendetyp aterkrav).
Rantekalkyl och Preskription Beslutet om återkrav är ett skriftligt krav med förfallodag 30 dagar senare och preskriptionsavbrott. Ränta: referensräntan + 2 procentenheter till förfallodagen och + 8 därefter, per kalenderhalvår och faktiska dagar/365. Preskription efter tio år, avbryts av skriftligt krav. Kvittning begärs här och verkställs av Fakturering (F8).
Justeringar och attest Justering kräver motivering och ett befintligt ärende för samma vårdgivare och bokförs som egen rad (JUSTERING/<id>). Attest sker i två steg. Steg 2 prövas med IAttestkontroll mot beloppsnivåerna i attestmatrisen. Den som godkänt steg 1 eller gjort en justering får inte attestera (GR-5002). UnderlagAttesterat publiceras för Fakturering.
Riskregister och årsrapport (Riskmatris) Risker (sannolikhet × konsekvens, 4 × 4) med kontroller och ansvarslinje. En risk från nivån medel och uppåt som saknar kontroll flaggas. Årsrapporten per nämnd och utförare (KL 10 kap. 10 §) redovisar kontroller, avvikelser, ärenden, återkrav, kvittningar, viten och justeringar.
Målrelaterad (MalrelateradTjanst, Malkalkyl, CsvKalla) Se tabellen i 5.3. Vårdhändelser efter efterregistreringsdagen räknas inte (MR-5001), täckning under kravet ger ingen ersättning (MR-5002). Indikatorer och kontrollregler ligger i egna moduler och inte i Regelverk. Skälet är att deras indata inte är det flöde av händelser som regelmotorn tar emot (ADR 0017).

SekvensSekvens: kontrollregler, riskpoäng, ärende och återkravLadda ned SVG: Sekvens: kontrollregler, riskpoäng, ärende och återkravLadda ned PUML: Sekvens: kontrollregler, riskpoäng, ärende och återkrav

Uppföljning, Migrering och Drift (byggda i F10)#

Komponent (kod) Ansvar
Exportpaket (UppfoljningTjanst, Nationellaexporter) Varje leverans är ett paket med datafiler och manifest.json. Manifestet har kanonisk JSON, SHA-256, storlek, antal poster och kolumner per fil. Det tar också med de beräkningsmanifest som ingår och kända avvikelser. CSV utan BOM med semikolon, Parquet eller JSON. Nationella filer utan citering.
Patientdatazonen Adaptern i API-värden läser vårdhändelser och listning ur periodens ögonblicksbild (slutlig, avstämd eller aktuell). Den slår upp patienten i Personuppgifter med ändamålet uppföljning, och det loggas. Uppföljning får bara pseudonym, födelseår, kön, län, kommun och identitetstyp. Patientregistret får pseudonymen i LOPNR, och personnumret kopplas på av utlämningsexporten vid inlämning.
Budget Bitemporal per år, nämnd och vårdval; periodens budget är tolftedelen av årsbeloppet. Vårduppdrag i egen regi följs upp mot belopp och poängpris × målvolym och DRG-poäng hittills i år.
Publicering Summor per privat utförare (ersättning, vårdhändelser, unika patienter, listade). Celler under minsta storlek döljs. Allt hashas och loggas.
Migrering (MigreringTjanst, Legacyformat) Legacyimport, parallellkörning med klassning och täckning, legacy-körningar för historik (s14).
Skuggning (i Kompatibilitet) Kompatibilitet:Skuggning:LegacyBasUrl skickar vidare skrivande anrop som är autentiserade till gamla GVR. Det sker asynkront genom en begränsad kö i minnet. Ersvias svar gäller alltid. Loggen för skuggning sparar aldrig innehållet.
Drift (DriftTjanst) Integrationslogg, loggverifiering, export och e-arkiv (se 5.3).

SekvensSekvens: skuggning via GVR-fasaden, parallellkörning och historikmigreringLadda ned SVG: Sekvens: skuggning via GVR-fasaden, parallellkörning och historikmigreringLadda ned PUML: Sekvens: skuggning via GVR-fasaden, parallellkörning och historikmigrering

5.5 Användargränssnitt#

Portalen (Ersvia.Portal, F11a och F11b, ADR 0016; ny design i ADR 0021) är en Blazor Web App med server-rendering och interaktiv server. Den har ingen egen affärslogik: alla anrop går till Ersvia.Api via Ersvia.Klient, och behörigheten avgörs alltid av Api. Tema, regionnamn och logotypvariant kommer från regionpaketet (packages/region-*/portal/portal.json) och designtokens i design/tokens; användaren väljer ljust eller mörkt läge. Inloggning sker med OIDC (Keycloak i dev, regionens IdP i drift), och rollerna styr navigeringen.

Sida Innehåll Krav
Start (/) Översikt per roll och genvägar KRAV-77
Regelverk (/regelverk, /regelverk/{id}, /regelverk/konsultation) Ersättningsgrunder, regelversioner med status, historik och diff, konsultationsversioner KRAV-19 till KRAV-23
Vad gällde när? (/vad-gallde-nar) Bitemporal fråga med giltig tid och känd vid, beslutsreferens, fyra ögon, testbevis, källdokument och tidslinje KRAV-3, KRAV-22
Vårdhändelser (/vardhandelser, /vardhandelser/torrkorning) Status med tre dimensioner och orsakskoder, torrkörning KRAV-7, KRAV-61
Listning, Kodverk, Överenskommelser, Vårdgivare och vårdenheter Uppslag och villkor per vårdgivare KRAV-5, KRAV-12, KRAV-16, KRAV-17
AI-register (/ai-register) Registrerade AI-funktioner med riskklass och standardläge NK26
Beräkning och simulering (F11b) Körningar, manifest, rader med trace, skuggkörning; simuleringar med KPI och jämförelse KRAV-35, KRAV-64, KRAV-65
Mål och granskning (F11b) Indikatorer, måluppfyllelse, ansökningar; granskning med flaggor, justeringar, attest, kontrollutfall, riskpoäng (avstängd i Region Exempel), ärenden KRAV-41 till KRAV-49
Fakturering (F11b) Fakturaunderlag med invändning per rad, tillägg, attest, Peppol och kvittens; aviseringar efter inloggning KRAV-50 till KRAV-58
Avstämning och Mina rapporter (F11b) Drill-down från ersättningsrad till regelrad, vårdhändelser och listningstal; månadsfil, prenumerationer och engångsrapporter (ingen ZIP ännu) KRAV-59 till KRAV-61
Uppföljning och migrering (F11b) Utfall, leveranser, budget; parallellkörning och täckning KRAV-62, KRAV-63, KRAV-72

Designriktning (GUI v2, ADR 0021)#

Portalen fick en ny design efter en genomgång av prisbelönta gränssnitt och offentliga designsystem (GOV.UK, NL Design System, Designsystemet.no, AGDS, USWDS, Primer, Geist, Stripe och Linear; design/forskning/gui-benchmark.md). Riktningen är ett lugnt arbetsverktyg för handläggare och vårdgivare, där innehåll och åtgärder kommer först och färgen bara markerar det man kan göra.

Del Beslut
Appskal Smalt toppfält med logotyp, regionnamn, sök och kommandopalett (Ctrl+K), rollväljare vid flera roller, ljust och mörkt läge och användarmeny. Vänster sidomeny per arbetsflöde i fast ordning: Översikt; Vård och listning; Regler; Ersättning; Kontroll; Ekonomi; Uppföljning; Administration. Menyn visar bara det rollen ger, kan fällas ihop till ikoner och blir en utfällbar panel på smal skärm. Brödsmulor härleds ur menyn, och sidrubriken har plats för primär åtgärd.
Rollstart Vald roll sparas i kakan ersvia.roll och styr meny och startsida: controllern ser månadens läge, köer och avvikelser; vårdgivaren senaste fakturaunderlag, frister och rapporteringsstatus; attestanten och handläggaren attestkön; övriga en översikt. Rollen styr bara visningen, och Api avgör alltid behörigheten.
Visuellt språk (tokens v2) Neutrala ytor; primärfärgen bara för åtgärder, markering och en 3 px accentlinje i toppfältet, aldrig som platta. Typografisk skala med roller, 8-punktsrutnät, kort med diskret ram. Nya tokens för sidomeny, navigering, overlay och storlekar. Tre teman (ersvia, region-stockholm, region-exempel) med 110 kontrastkontroller per tema. Typsnittet Inter (SIL OFL) levereras från design/fonts, så att utseendet är detsamma offline.
Komponentbibliotek Kpikort med trend, Datatabell (fast rubrikrad, sortering med aria-sort, filterchips, tabulära siffror, täthet, tomt läge), TomtLage, skelett, modal Dialog, Faltgrupp, toasts utan tidsgräns (WCAG 2.2.1) och statusmärken med ikon och text.
Tillgänglighet WCAG 2.2 AA: skip-länk, landmärken, synlig fokus, klickytor minst 24 px, status med form och text, felsammanfattning. Inget inline-skript, eftersom CSP kräver nonce. axe gav 0 överträdelser på 67 granskningar (alla sidor, rollstarter, två teman i ljust och mörkt läge, kommandopalett och hopfälld meny).
SAD-sajten Samma riktning: dokumentationslayout med kapitelgrupper, "På denna sida", sök med Ctrl+K och /, startkort per kapitel, diagramgalleri med filter och nedladdning av SVG och PUML, utskrifts-CSS och inget CDN. axe 0 överträdelser och 0 brutna länkar.

Före och efter#

Före (GUI v1, F11a–F11b) Efter (GUI v2)
Före: startsidanLadda ned SVG: Före: startsidan
Efter: startsidanLadda ned SVG: Efter: startsidan
Före: Vad gällde när?Ladda ned SVG: Före: Vad gällde när?
Efter: Vad gällde när?Ladda ned SVG: Efter: Vad gällde när?
Före: fakturaunderlagLadda ned SVG: Före: fakturaunderlag
Efter: fakturaunderlagLadda ned SVG: Efter: fakturaunderlag
Före: vårdhändelser i mörkt lägeLadda ned SVG: Före: vårdhändelser i mörkt läge
Efter: vårdhändelser i mörkt lägeLadda ned SVG: Efter: vårdhändelser i mörkt läge

Skärmdumpar (GUI v2)#

Controllerns startsida (tema ersvia, ljust läge)Ladda ned SVG: Controllerns startsida (tema ersvia, ljust läge)

Vårdgivarens startsida (tema region-stockholm, ljust läge)Ladda ned SVG: Vårdgivarens startsida (tema region-stockholm, ljust läge)

Vad gällde när? med regelversion, testbevis och tidslinjeLadda ned SVG: Vad gällde när? med regelversion, testbevis och tidslinje

Vårdhändelser med statusdimensioner (mörkt läge)Ladda ned SVG: Vårdhändelser med statusdimensioner (mörkt läge)

Beräkning med körningar, manifest och raderLadda ned SVG: Beräkning med körningar, manifest och rader

Fakturaunderlag med invändning, tillägg och attest (tema region-stockholm)Ladda ned SVG: Fakturaunderlag med invändning, tillägg och attest (tema region-stockholm)

Kommandopaletten (Ctrl+K)Ladda ned SVG: Kommandopaletten (Ctrl+K)

Mobil menyLadda ned SVG: Mobil meny

SAD-sajten efter omdesignenLadda ned SVG: SAD-sajten efter omdesignen

Alla skärmdumpar, i båda teman och i ljust och mörkt läge, finns i docs/arkitektur/bilder/v2/.

Tillgängligheten kontrolleras med axe-core via Playwright (tests/Ersvia.Tests.Tillganglighet), som kräver att värdarna kör och därför inte ingår i dotnet test. Efter F11b gav axe 45 granskningar med 0 överträdelser, och efter GUI v2 67 granskningar med 0 överträdelser (WCAG 2.2 AA), med F12a:s CSP med nonce. Portalen har 54 egna tester (bUnit) i dotnet test. Kända luckor: ingen ZIP eller kopiering av beställningar i Mina rapporter, ingen filbilaga till tillägg (saknas i kontraktet), och aviseringar visas efter inloggning, inte på inloggningssidan.

Ersvia SAD · version b706ca6 (2026-11-11) (med ändringar som inte är incheckade) · byggd 2026-11-11 · Ändringslogg · Diagramgalleri · Källa: docs/arkitektur/kapitel/05-byggblocksvy.md

Sök i dokumentet

100 % Ladda ned SVG