# 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](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](docs/forsattsblad-ocr.md).** | | 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 i `C:\Program Files\dotnet` finns en `dotnet`-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](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) ```powershell 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: ```powershell 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 även nä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år vid skärmen efter Skriv ut), men ses över inför tyst drift. - SecureFile.Shred är bäst-möjligt, inte forensiskt (SSD/wear-leveling).