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#
| 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:
- En modul refererar bara andra modulers
Kontrakt-namnrymd, aldrig deras interna lager (NetArchTest itests/Ersvia.Tests.Architecture/ModulgransTester.cs). - Moduler i ersättningszonen refererar aldrig kontrakt som innehåller personnummer. Typen
Personnummerfinns bara iPersonuppgifter.Kontraktoch patientdatazonens moduler. - Inga regionspecifika konstanter i
src/utanförsrc/Integrations/(RegionoberoendeTester). - All tid tas från
IKlocka, alla belopp ärBelopp, och alla fel ärResultat/Felmed stabil felkod.
Modulöversikt#
| 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#
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 viaIKmsKlient(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
Faktureringoch 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 somKompatibilitet.IUtlamningsexportbakom portenIIdentitetsutlamning(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 |
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 |
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#
| 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. |
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)#
| 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. |
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. |
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). |
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). |
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) |
|---|---|
Skärmdumpar (GUI v2)#
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.