Remiss – automatiskt försättsblad vid utskrift
När en användare skriver ut en remiss fångas jobbet av en PDF-skrivare ("Remiss"), den här appen får PDF:en som argument, låter användaren välja mottagning, genererar ett försättsblad, sammanfogar det med remissen och skickar allt tyst till måldigitalskrivaren.
Se Plan.md för arkitektur, teknikval och faser.
Status
| Fas | Innehåll | Läge |
|---|---|---|
| 0 | Spika hur nedströms-skrivaren läser av mottagning | Klart: text-OCR server-side. Kontrakt. |
| 1 | Fristående C#-app, körs manuellt med test-PDF | Bygger + tester gröna. Kvar: manuellt dialog+utskriftstest. |
| 2 | Koppla på fångst (clawPDF) | Ej påbörjad |
| 3 | Härdning (HSA, config, audit, temp, felflöden) | Delvis förberedd i koden |
| 4 | Paketering & utrullning | Ej påbörjad |
Förutsättningar
- Windows
- .NET SDK 8.x (byggt och verifierat med 8.0.424). På utvecklingsmaskinen är
den installerad per användare i
%LOCALAPPDATA%\Microsoft\dotnet– eftersom maskin-PATH pekar på en SDK-lös runtime iC:\Program Files\dotnetfinns endotnet-shim i PowerShell-profilen som väljer rätt host.net8.0-targeten fungerar även med nyare SDK (10.x). - SumatraPDF-binär i
tools/– se tools/README.md.Behövs bara för det sista utskriftssteget; dialog + försättsblad + merge fungerar utan.
- Typsnitten Arial och Consolas (standard på Windows) – försättsbladet
renderas mot dem via en egen
WindowsFontResolver.
Bygga och köra (Fas 1)
dotnet build Remiss.sln
dotnet test Remiss.sln
# Kör mot en test-PDF och en testskrivare
dotnet run --project src/Remiss.App -- "C:\temp\testremiss.pdf"
Målskrivaren styrs av targetPrinter i config/appsettings.json (default: "Microsoft Print to PDF" – byt till en riktig skrivare vid test).
Utan SumatraPDF-binär kommer stegen dialog → försättsblad → merge att köras, och utskriftssteget kastar ett tydligt fel.
Iterera på försättsbladets OCR-layout utan hela flödet:
dotnet run --project tools/Remiss.CoverPreview -- preview.pdf SE2321000131-E000000000009 "Testmottagning"
Projektstruktur
Remiss.sln
config/
appsettings.json sökvägar, målskrivare, retry, flaggor
mottagningar.json POC-register (namn → HSA-id)
docs/
forsattsblad-ocr.md OCR-kontraktet för försättsbladet (Fas 0)
tools/
README.md buntad SumatraPDF (checkas ej in)
Remiss.CoverPreview/ dev-verktyg: rendera försättsblad för öga-test
src/
Remiss.Core/ all logik, UI-oberoende
Abstractions/ IMottagningRepository, IPrinter
Models/ Mottagning
Repositories/ JsonMottagningRepository
Pdf/ CoverPageGenerator, PdfMerger, OcrContract, WindowsFontResolver
Printing/ SumatraPdfPrinter (retry)
Security/ SecureTempStore (ACL + shred), SecureFile
Audit/ AuditLogger (JSONL + separat error-logg)
AppConfig.cs konfigmodell + inläsning
RemissWorkflow.cs steg [3]–[6]
Remiss.App/ WinForms-exe (AssemblyName: Remiss)
Program.cs entrypoint, argument, returkoder
MottagningDialog.cs sökbar lista, avbryt-hantering
tests/
Remiss.Core.Tests/ xUnit: PDF-pipeline, register, SecureTempStore
Konfiguration (config/appsettings.json)
| Nyckel | Betydelse |
|---|---|
targetPrinter | Namn på måldigitalskrivaren. Tom = Windows standardskrivare (tyst, inga dialoger). |
sumatraPdfPath | Sökväg till SumatraPDF.exe (relativt exe-mappen) |
mottagningarPath | Sökväg till mottagningsregistret |
secureTempRoot | Tom = %LOCALAPPDATA%\Remiss\temp |
auditLogPath | Tom = %LOCALAPPDATA%\Remiss\audit\audit.jsonl |
errorLogPath | Tom = %LOCALAPPDATA%\Remiss\logs\error.log |
printRetries / printRetryDelayMs | Retry vid utskriftsfel |
deleteSourceAfterPrint | false i Fas 1 (behåll test-PDF:en). true i Fas 2. |
debugOutputDir | Endast test. Satt = kopiera mergad PDF hit (patientdata, städas ej). Tom i drift. |
Säkerhet
Remiss-PDF:erna är känsliga personuppgifter.
- Temp-filer skrivs till en jobb-isolerad mapp under användarprofilen (inte
%TEMP%),med ACL låst till användaren + SYSTEM + Administrators.
SecureTempStore.Dispose()skriver över och raderar alla temp-filer – körs ävennär utskriften fallerar.
- Audit-loggen innehåller bara metadata: användare, maskin, mottagning (namn +
HSA-id), tidpunkt, utfall. Aldrig patientdata, filnamn eller innehåll.
- Error-loggen kan innehålla sökvägar och stacktraces. Den ligger användar-scopat
och ska redigeras/rensas i Fas 3-härdningen.
Kända begränsningar (Fas 1)
- Försättsbladets layout följer OCR-kontrakt v1. Den bör verifieras mot
nedströmssystemets faktiska OCR innan pilot – ingen checksumma ännu.
- Mottagningsregistret är statisk JSON; HSA-katalog kopplas i Fas 3 bakom
IMottagningRepository. - Tester täcker Core (PDF, register, temp). Dialog + utskrift är inte
automattestade – kräver ett manuellt körtest.
- Tidiga fel visas som blockerande
MessageBox. OK för Fas 2 (användaren stårvid skärmen efter Skriv ut), men ses över inför tyst drift.
- SecureFile.Shred är bäst-möjligt, inte forensiskt (SSD/wear-leveling).