177 lines
7.1 KiB
Markdown
177 lines
7.1 KiB
Markdown
# 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*
|