203 lines
6.7 KiB
Markdown
203 lines
6.7 KiB
Markdown
# 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` |
|