# 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.5–4.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` |