189 lines
6.1 KiB
Markdown
189 lines
6.1 KiB
Markdown
# MedicusWithClaudeKomplexniReport – CLAUDE_NOTES
|
||
|
||
## Co skript dělá
|
||
|
||
`komplexni_report.py` generuje komplexní Excel přehled ordinace.
|
||
Soubor se ukládá do `u:\Dropbox\!!!Days\Downloads Z230\YYYY-MM-DD_HH-MM-SS_Pacienti.xlsx`.
|
||
Předchozí verze (`*Pacienti.xlsx`) se před zápisem automaticky smažou.
|
||
|
||
## Spuštění
|
||
|
||
```
|
||
C:\Python\python.exe komplexni_report.py
|
||
```
|
||
|
||
Trvá cca **10 minut** (kvůli xlwings autofit přes celý Excel).
|
||
Spouští se automaticky v noci → nevadí.
|
||
|
||
## Připojení k DB
|
||
|
||
```python
|
||
fdb.connect(
|
||
host='localhost',
|
||
database=r'c:\MEDICUS 3\data\medicus.FDB',
|
||
user='sysdba', password='masterkey', charset='WIN1250'
|
||
)
|
||
```
|
||
|
||
## Závislosti
|
||
|
||
```
|
||
pip install fdb openpyxl xlwings extract-msg beautifulsoup4 python-dateutil
|
||
```
|
||
|
||
---
|
||
|
||
## Listy v Excelu (pořadí)
|
||
|
||
| List | Zdroj | Popis |
|
||
|---|---|---|
|
||
| `Registrovani` | registr + kar | Aktivní registrovaní pacienti |
|
||
| `Očkování` | ockzaz + registr + kar | Záznamy o očkování registrovaných |
|
||
| `Recepty` | recept + recept_epodani + kar | Všechny recepty, eRECEPT čísla, ceny |
|
||
| `Vykony` | dokladd + kar + vykony | Všechny výkony (s platným číselníkem) |
|
||
| `Neschopenky všechny` | nes + kar | Všechny neschopenky |
|
||
| `Neschopenky aktivní` | nes + kar | Pouze aktivní (pracne='A') |
|
||
| `Preventivni prohlidky` | dokladd + vykony | Kódy 1021, 1022 |
|
||
| `INR` | dokladd + vykony | Kód 1443 |
|
||
| `CRP` | dokladd + vykony | Kódy 2230, 9111 |
|
||
| `Holter` | dokladd + vykony | Kód 17129 |
|
||
| `Prostata` | dokladd + vykony | Kódy 1130–1134 |
|
||
| `TOKS` | dokladd + vykony | Kódy 15118–15121 |
|
||
| `COVID` | dokladd + vykony | Kód 1306 |
|
||
| `Streptest` | dokladd + vykony | Kód 2220 |
|
||
| `Posudky řidičák` | HISTDOC (TYP=MOTORVO) + KAR | Ruční posudky k řízení MV |
|
||
| `ePosudky registr` | HISTDOC (TYP=EPOSMRO) + HISTDOC_EPOSUDEK + KAR | Elektronická podání do centrálního registru |
|
||
|
||
---
|
||
|
||
## Pomocné funkce
|
||
|
||
### `sanitize(val)`
|
||
Opraví znaky neplatné pro Excel:
|
||
- `µ` → `u`
|
||
- řídící znaky (ord < 32, kromě tab/LF/CR) → `_`
|
||
- náhradní znaky Unicode (0xFFFE, 0xFFFF, surrogáty) → `_`
|
||
|
||
Použito ve všech listech kde hrozí problematická data z DB.
|
||
|
||
### `fmt(val)`
|
||
Vrátí `''` pro None, jinak zavolá `sanitize()`.
|
||
|
||
### `add_vykony_sheet(sheet_name, kody)`
|
||
Helper pro listy s výkony. Přijme název listu a seznam kódů výkonů.
|
||
SQL: `dokladd JOIN kar JOIN vykony WHERE kod IN (...) AND platnost kódu platí`.
|
||
Řazení: datum DESC, rodcis, kod.
|
||
|
||
### `pocet_dni(zacnes, konnes, pracne)`
|
||
Výpočet délky neschopenky:
|
||
- `pracne='A'` (aktivní) → dny od začátku do dnes
|
||
- `pracne='N'` → dny od začátku do konce
|
||
- jinak → `"NA"`
|
||
|
||
### `parse_data(data_str)`
|
||
Parsuje `key=value` text z pole `HISTDOC.DATA` do slovníku.
|
||
Každý řádek = jeden klíč/hodnota oddělené `=`.
|
||
|
||
### `parse_date(val)`
|
||
Převede formát `D:DD.MM.YYYY` (jak ho ukládá Medicus) na `datetime.date`.
|
||
|
||
### `style_header(ws)` / `autofit_ws(ws)`
|
||
Styl záhlaví (modrý fill, bílý tučný text, centrování) a šířky sloupců (max 50 znaků).
|
||
Používají se jen na listech s posudky (ostatní listy řeší xlwings).
|
||
|
||
---
|
||
|
||
## Listy s posudky – detail
|
||
|
||
### `Posudky řidičák` (MOTORVO)
|
||
|
||
Data jsou uložena v `HISTDOC.DATA` jako `key=value` text.
|
||
Parsovaná pole:
|
||
|
||
| Sloupec | Zdroj v DATA |
|
||
|---|---|
|
||
| PorCislo | `PorCislo` nebo `HISTDOC.PORCISLO` |
|
||
| DatumVyd | `DatumVyd` (formát `D:DD.MM.YYYY`) |
|
||
| DatKonec | `DatKonec` (formát `D:DD.MM.YYYY`) |
|
||
| DruhProh | `DruhProh` |
|
||
| Posouzeni | odvozeno z `Posouzeni`, `Posouzeni2`, `ZpusobPodminka` |
|
||
| ZpusobPodminka | `ZpusobPodminka` |
|
||
| SkupinaPodminka | `SkupinaPodminka` |
|
||
| Skupiny | `ZpusobJe` |
|
||
|
||
**Logika Posouzeni:**
|
||
- `Posouzeni2 = T` → `nezpůsobilý`
|
||
- `ZpusobPodminka = B:1` → `způsobilý s podmínkou`
|
||
- `Posouzeni = T` → `způsobilý`
|
||
|
||
**Sloupec ePosudek:**
|
||
`ANO` pokud existuje záznam v HISTDOC s `TYP='EPOSMRO'` pro stejného pacienta (IDPACI) a stejné datum.
|
||
Párování: `(IDPACI, DATUM)` – přímá FK vazba mezi MOTORVO a EPOSMRO neexistuje.
|
||
Buňka s ANO je zelená (fill + font).
|
||
|
||
**Zebra pruhování:** liché řádky bílé, sudé světle modré (`DCE6F1`).
|
||
|
||
### `ePosudky registr` (EPOSMRO)
|
||
|
||
Elektronická podání do centrálního registru způsobilosti.
|
||
Stát tuto funkci zavedl přibližně od aktualizace Medicusu (03/2026).
|
||
|
||
Data parsovaná z `HISTDOC.DATA`:
|
||
|
||
| Sloupec | Zdroj v DATA |
|
||
|---|---|
|
||
| DatumVyd | `DatumVystaveni` |
|
||
| DatKonec | `PlatnostDo` |
|
||
| DruhProhlidky | `DruhProhlidkyNazev` |
|
||
| DruhPosudku | `DruhPosudkuNazev` |
|
||
| Vysledek | `VysledekNazev` |
|
||
| StavPosudku | `StavPosudkuNazev` |
|
||
| TypAkce | `TypAkceNazev` |
|
||
|
||
Stavová pole z `HISTDOC_EPOSUDEK`:
|
||
- `ID_PODANI` – ID podání do registru
|
||
- `ODESLANO` – timestamp odeslání
|
||
- `STATUS_ODESL` – stav odpovědi z registru (`O` = odesláno)
|
||
|
||
**Zneplatnění:** `StavPosudku = zneplatneny` = lékař aktivně odvolal způsobilost
|
||
(např. pacient prodělal mrtvici, epileptický záchvat atp.).
|
||
Zneplatnění je samostatný EPOSMRO záznam, ne modifikace původního.
|
||
|
||
---
|
||
|
||
## xlwings – závěrečný krok
|
||
|
||
Po `wb.save()` se soubor otevře přes xlwings (vyžaduje plný Excel):
|
||
1. `sheet.autofit()` na všech listech – správné šířky sloupců
|
||
2. Na listu `Recepty`: centrování sloupců C, E, F, G, I, M, N
|
||
3. `wb_xw.save()` + zavření
|
||
|
||
xlwings je nutný pro spolehlivý autofit (openpyxl ho neumí přesně).
|
||
Trvá ~10 minut, spouští se v noci.
|
||
|
||
---
|
||
|
||
## Pořadí zpracování (pro debugování)
|
||
|
||
```
|
||
DB connect
|
||
→ smazání starých souborů
|
||
→ SQL dotazy (Registrovani, Očkování, Recepty, Výkony, Neschopenky)
|
||
→ add_vykony_sheet × 8
|
||
→ MOTORVO + EPOSMRO listy (s parsováním DATA)
|
||
→ autofilter na všech listech
|
||
→ con.close() + wb.save()
|
||
→ xlwings autofit + centrování
|
||
→ Hotovo.
|
||
```
|
||
|
||
Print výstup v konzoli ukazuje počty řádků každého listu – užitečné pro kontrolu.
|
||
|
||
---
|
||
|
||
## Rozšíření v budoucnu
|
||
|
||
- Přidat další typy posudků (pracovní, vstupní, sportovní...) ze `VS_POSUDKY`
|
||
- Případně sledovat stav podání EPOSMRO v čase (datum odeslání vs. datum posudku)
|
||
- Automatické spouštění přes Windows Task Scheduler (jako `faktury_report.py`)
|