Files
recept/NačteníPředpisuWithClaude/NacistPredpis_DOKUMENTACE.md
T
2026-04-14 07:20:28 +02:00

203 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# NacistPredpis — Funkční SOAP klient pro IS eRecept SÚKL
Pipeline pro stažení **detailu jednotlivých receptů** z eRecept SÚKL API.
Doplňuje existující hromadný lékový záznam (`NacistLekovyZaznam`) o údaje,
které hromadný dotaz nevrací.
---
## Soubory
| Soubor | Co dělá |
|--------|---------|
| `NacistPredpis_FUNKCNI.py` | Stáhne detail **jednoho** receptu dle hardcoded ID_Dokladu (ruční test) |
| `08StahnoutPredpisy.py` | **Hlavní skript** — načte ERP kódy z Medicusu, stáhne detaily, uloží XML |
```
NačteníPředpisuWithClaude/
├── NacistPredpis_FUNKCNI.py ← test jednoho receptu
├── 08StahnoutPredpisy.py ← hromadné stahování
├── NacistPredpis_DOKUMENTACE.md ← tento soubor
├── xml_archive/ ← archiv XML odpovědí (YYYY-MM-DD/ERP_KOD.xml)
├── MedicusDebug/ ← zachycené SOAP požadavky z Medicusu
└── Tests/ ← starší vývojové soubory
```
---
## Co NacistPredpis vrací navíc oproti NacistLekovyZaznam
Hromadný lékový záznam (`NacistLekovyZaznam`, endpoint `/cuer/Lekar2`)
vrací seznam předpisů a výdejů za pacienta, ale **bez detailů o receptu jako celku**.
`NacistPredpis` (endpoint `/cuer/Lekar`, namespace `201704`) vrací detail
jednoho konkrétního receptu, včetně:
### Údaje o receptu (dokladu)
| Pole | Popis |
|------|-------|
| `ID_Dokladu` | Alfanumerický kód receptu (např. `PPIBVF93285E`) |
| `Stav` | Stav receptu: PREDEPSANY, CASTECNE_VYDANY, PLNE_VYDANY, ZRUSENY… |
| `PlatnostDo` | Datum konce platnosti receptu |
| `VypisDo` | Prodloužení platnosti výpisem |
| `Akutni` | Příznak akutní péče |
| `Rodina` | „Pro potřebu rodiny" / ad usum proprium |
| `Opakovani` | Počet výdejů u opakovacích receptů |
| `DruhPojisteni` | VEREJNE / OSTATNI |
| `ModryPruh` | Omamné/psychotropní látky |
| `Pozn` | Poznámka na receptu (max 1000 znaků) |
| `ZapocitatelnyDoplatekZbyvaDoLimitu` | Zbývá do limitu doplatků pacienta |
| `Zmena` / `Zalozeni` | Datetime poslední změny / vytvoření |
### Údaje o úhradě léku (per PLP)
| Pole | Popis |
|------|-------|
| `Uhrada` | ZAKLADNI / ZVYSENA / NEHRAZENY |
| `Prekroceni` | Překročení limitu |
### Údaje o pacientovi
| Pole | Popis |
|------|-------|
| `CP` | Číslo pojištěnce (rodné číslo) |
| `ZP` | Zdravotní pojišťovna (kód + název) |
| `Adresa` | Kompletní adresa pacienta |
| `Pohlavi` | M / Z |
| `Telefon` | Telefonní číslo |
| `Notifikace` | SMS / Email |
### Údaje o předepisujícím
| Pole | Popis |
|------|-------|
| `Odbornost` | Kód + název (např. 001 — všeobecné praktické lékařství) |
| `Email` | Email lékaře |
### Zkrácený výdej
Odpověď obsahuje i sekci `Vydej[]` se zkrácenou informací o výdejích — název lékárny,
jméno lékárníka (často „skryto"), datum vydeje, vydané léky.
---
## Porovnání operací
| | NacistPredpis | NacistLekovyZaznam |
|---|---|---|
| **Namespace** | `201704` | `201912` |
| **Endpoint** | `/cuer/Lekar` | `/cuer/Lekar2` |
| **SOAPAction** | `NacistPredpis` | `NacistLekovyZaznam` |
| **Identifikace** | ID_Dokladu (alfanumerický kód receptu) | jméno + datum narození pacienta |
| **Výsledek** | detail jednoho receptu | celý lékový záznam pacienta (roky) |
| **Velikost odpovědi** | ~3.54.5 KB | ~227 KB |
---
## Autentizace (stejná jako u všech operací eReceptu)
| Parametr | Hodnota |
|----------|---------|
| Endpoint | `https://lekar-soap.erecept.sukl.cz/cuer/Lekar` |
| mTLS certifikát | `AMBSUKL214235369G_31DEC2024.pfx` (platnost do 31. 12. 2026) |
| HTTP Basic user | UUID lékaře `e08c89c6-2b1a-4eba-8ed9-4e3e63618379` |
| SOAP operace | `NacistPredpis` |
| XML namespace | `http://www.sukl.cz/erp/201704` |
| Verze zprávy | `202501A` |
---
## Zdroj ID_Dokladu — Medicus (Firebird)
Alfanumerický kód receptu (ID_Dokladu) **není** v hromadném lékovém záznamu.
Nachází se v tabulce **`RECEPT_EPODANI`** v Medicusu:
```
RECEPT.id_epodani → RECEPT_EPODANI.id
RECEPT_EPODANI.erp = ID_Dokladu (např. "PPIBVF93285E")
```
### SQL dotaz
```sql
SELECT DISTINCT ep.erp, r.datum, r.lek, r.dop,
TRIM(kar.prijmeni) AS prijmeni, TRIM(kar.jmeno) AS jmeno
FROM recept r
JOIN recept_epodani ep ON r.id_epodani = ep.id
JOIN kar ON r.idpac = kar.idpac
WHERE r.datum >= '2025-01-01' AND ep.erp IS NOT NULL
ORDER BY r.datum DESC
```
### Statistika (duben 2026)
- **13 571** receptů s ERP kódem od 1. 1. 2025
- **13 578** receptů celkem (7 bez ERP kódu — papírové/neodeslané)
---
## 08StahnoutPredpisy.py — hlavní skript
### Parametry (editovat přímo v souboru)
```python
LIMIT = 100 # max počet receptů ke stažení
DATUM_OD = "2025-01-01" # recepty od tohoto data
PRIJMENI = ["Buzalka"] # filtr příjmení (list), nebo None = všichni
```
### Co dělá
1. Připojí se k Firebirdu, načte unikátní ERP kódy (deduplikované — jeden recept může mít více léků)
2. Pro každý ERP kód zavolá `NacistPredpis` přes SOAP API
3. Uloží XML odpověď do `xml_archive/YYYY-MM-DD/{ERP_KOD}.xml`
4. Chybové odpovědi uloží jako `{ERP_KOD}_CHYBA.xml`
5. Pauza 5 sekund mezi voláními
### Výstup v konzoli
```
[ 1/55] Buzalka Vladimír PPM5HM49EBF9 OK 3.6 KB EZETIMIB/ATORVASTATIN STADA 10MG/20MG TB
[ 25/55] Buzalka Vladimír POMOTIAJ77PI CHYBA HTTP 500 D003 - Předpis zrušen...
```
### Ošetření chyb
| Kód | Popis | Chování skriptu |
|-----|-------|-----------------|
| **D003** | Předpis byl zrušen lékařem | Uloží `_CHYBA.xml`, pokračuje dál |
| HTTP 500 | SOAP Fault (obecný) | Uloží `_CHYBA.xml`, pokračuje dál |
| Timeout / Exception | Síťová chyba | Vypíše EXCEPTION, pokračuje dál |
---
## Ověřeno (14. 4. 2026)
Testovací běh na receptech pacienta Buzalka od 1. 1. 2025:
- **55** unikátních ERP kódů nalezeno v Medicusu
- **51** úspěšně staženo (OK)
- **4** chyby D003 (zrušené recepty)
- XML uloženy do `xml_archive/2026-04-14/`
---
## Další kroky (plán)
1. **MySQL tabulka `recept`** — uložit detail receptu (stav, platnost, úhrada, pojišťovna…)
2. **Parsování XML** — extrakce dat z odpovědí do MySQL
3. **Inkrementální stahování** — procházet jen nové recepty od posledního běhu
4. **Stažení všech 13 571 receptů** od 1. 1. 2025 (odhad: ~19 hodin při 5s pauze)
---
## XSD zdroje
Schéma verze `202501A`, soubory v `Dokumentace/2025-04-24/WSDL_XSD/`:
| Soubor | Obsah |
|--------|-------|
| `PRIORITNI_WEBOVE_SLUZBY/schema1.xsd` | `NacteniPredpisuDotaz`, `identifikace_dokladu_type`, `nacteni_predpisu_erp_odpoved_type` |
| `NEPRIORITNI_WEBOVE_SLUZBY/CuerSchema.xsd` | `hvlp_type`, `zprava_type`, `jmeno_osoby_type` |