Files
2026-04-08 20:56:26 +02:00

177 lines
7.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 0113001134), 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*