# 01 PSA.py — Dokumentace ## Účel Skript generuje report výsledků PSA (prostatický specifický antigen) z databáze Medicus (Firebird) a exportuje ho do formátovaného Excel souboru. Výsledky jsou barevně označeny podle poměru naměřené hodnoty k horní hranici normy. Skript zároveň sleduje historii vykázání PSA pojišťovně a počítá, kdy by měl být výkon vykázán příště. --- ## Databázové připojení | Parametr | Hodnota | |------------|--------------------------------------| | Host | `localhost` | | Port | `3050` | | Databáze | `c:\Medicus 3\data\MEDICUS.FDB` | | Uživatel | `SYSDBA` | | Heslo | `masterkey` | | Kódování | `WIN1250` | > Jde o **lokální testovací instanci** Medicus. Produkční verze (`Reporter PSA.py`) se připojuje na `192.168.1.10`, databáze `m:\Medicus\data\MEDICUS.FDB`. --- ## Výstup Soubor se ukládá do: ``` u:\Dropbox\!!!Days\Downloads Z230\ ``` Název souboru: `YYYY-MM-DD HH-MM-SS PSA report.xlsx` Před každým spuštěním jsou **automaticky smazány** všechny starší soubory v této složce, jejichž název končí na `PSA report.xlsx`. --- ## SQL dotaz — co se táhne z databáze Dotaz vytáhne všechna PSA měření bez datumového omezení, seřazená od nejnovějšího. ### Tabulky | Tabulka | Alias | Popis | |-------------|-------|------------------------------------| | `labvh` | `vh` | Hlavičky laboratorních vyšetření | | `labvd` | `vd` | Výsledky laboratorních vyšetření | | `kar` | | Kartotéka pacientů | | `labmetod` | `lm` | Laboratorní metody (název, kód) | | `labjedn` | `lj` | Jednotky výsledků | | `labskaly` | `ls` | Referenční rozmezí (normy) | | `dokladd` | `dd` | Vykázané výkony pojišťovně | ### Filtr ```sql WHERE lm.nazev CONTAINING 'PSA' ``` Bez datumového omezení — bere všechna PSA z celé databáze. --- ## Sloupce ve výsledném Excel souboru | Sloupec | Zdroj / Popis | |---------------|---------------| | `IDPACIENT` | ID pacienta z `labvh` | | `PRIJMENI` | Příjmení z kartotéky | | `JMENO` | Jméno z kartotéky | | `RODCIS` | Rodné číslo | | `DATUM` | Datum odběru PSA | | `MINULE` | Datum posledního vykázání kódu `01130` **před** tímto PSA + vypočtený termín příštího vykázání dle kódů z té návštěvy (viz logika níže) | | `VYKODOVANO` | Seznam výkonů vykázaných pojišťovně v okně ±7 dní od data PSA (kódy 01130–01134), formát: `"YYYY-MM-DD kod, ..."` | | `DALŠÍ` | Vypočtený termín příštího vykázání PSA dle kódů v `VYKODOVANO` (viz logika níže) | | `KODTEXT` | Kód laboratorní metody | | `NAZEV` | Název laboratorní metody | | `VYSL` | Naměřená hodnota (text, např. `"5,6"`, `"<0.1"`) | | `JEDN` | Jednotka výsledku | | `NORMDOL` | Dolní hranice normy | | `NORMHOR` | Horní hranice normy | | `VYSL_NUM` | Numerická hodnota z `VYSL` (pomocný sloupec pro výpočty) | | `NORMHOR_NUM` | Numerická hodnota z `NORMHOR` (pomocný sloupec) | | `RATIO` | `VYSL_NUM / NORMHOR_NUM` — poměr hodnoty k horní normě (základ pro barevné zvýraznění) | --- ## Logika sloupců MINULE a DALŠÍ Kódy pojišťovny relevantní pro PSA: | Kód | Význam | Interval opakování | |---------|---------------------------------------------|--------------------| | `01130` | Základní vykázání PSA | — | | `01131` | PSA s rozšířeným sledováním (rizikový) | za **4 roky** | | `01132` | PSA se středním sledováním | za **2 roky** | | `01133` | PSA — jednorázový výkon (bez opakování) | **NIKDY** | | `01134` | Ostatní / doplňkový kód | — | ### Sloupec DALŠÍ Vypočítá se z kódů nalezených v `VYKODOVANO` (okno ±7 dní od data PSA): ``` 01133 → "NIKDY" 01131 → datum PSA + 4 roky 01132 → datum PSA + 2 roky jinak → prázdné ``` ### Sloupec MINULE 1. SQL subquery najde `MAX(datose)` z `dokladd` kde `kod = '01130'` a `datose < datum PSA` — tedy **poslední vykázání PSA před tímto odběrem**. 2. Python pak k tomuto datu dohledá kódy `01131`, `01132`, `01133` vykázané v okně ±7 dní a aplikuje stejnou logiku jako DALŠÍ. Výsledný formát: `"2024-03-15, další 2028-03-15"` nebo `"2024-03-15, další NIKDY"` nebo jen `"2024-03-15"` (pokud nebyl nalezen žádný rozhodující kód). --- ## Parsování výsledků (funkce `to_num`) Hodnoty PSA přicházejí jako text. Funkce `to_num` extrahuje číslo i z nestandardních zápisů: | Vstup | Výstup | Poznámka | |-------------|------------------|---------------------------------------| | `"5,6"` | `5.6` | česká desetinná čárka | | `"<0.1"` | `0.05` | pod mezí detekce → polovina hodnoty | | `">100"` | `100.0` | nad rozsahem → použije se hodnota | | `"3.2 ng/mL"` | `3.2` | jednotka se ignoruje | | `None` / `""` | `NaN` | prázdné nebo chybějící | --- ## Barevné podmíněné formátování (sloupec VYSL) Barva se odvíjí od sloupce `RATIO` (`VYSL_NUM / NORMHOR_NUM`): | Barva | Podmínka | Význam | |-------------|------------------|-------------------------| | 🟢 Zelená | `RATIO ≤ 0.80` | V normě | | 🟡 Žlutá | `0.80 < RATIO < 1.00` | Hraniční hodnota | | 🔴 Červená | `RATIO ≥ 1.00` | Nad horní hranicí normy | --- ## Formátování Excel souboru - Automatická šířka sloupců (max. 50 znaků) - Tenké ohraničení všech buněk - Sloupce A, B, E zarovnány na střed - Zmražení prvního řádku (záhlaví) - Autofiltr na celý rozsah dat --- ## Závislosti (Python balíčky) ``` firebirdsql pandas numpy openpyxl ``` --- ## Rozdíl oproti `Reporter PSA.py` | Vlastnost | `01 PSA.py` (tento) | `Reporter PSA.py` | |------------------------|--------------------------------------------|------------------------------------------| | Host / DB | `localhost` / `c:\Medicus 3\data\MEDICUS.FDB` | `192.168.1.10` / `m:\Medicus\data\MEDICUS.FDB` | | Výstupní složka | `u:\Dropbox\!!!Days\Downloads Z230` | `z:\Dropbox\Ordinace\Reporty` | | Okno pro VYKODOVANO | ±7 dní | ±7 dní | | Sloupce MINULE / DALŠÍ | ✅ Ano | ❌ Ne | | Datumové omezení | Žádné (celá databáze) | Žádné (celá databáze) | --- *Poslední aktualizace dokumentace: 2026-04-08*