notebookvb
This commit is contained in:
@@ -0,0 +1,188 @@
|
||||
# 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`)
|
||||
Reference in New Issue
Block a user