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