# 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`)