334 lines
15 KiB
Markdown
334 lines
15 KiB
Markdown
# NacistPredpis — Funkční SOAP klient pro IS eRecept SÚKL
|
||
|
||
## Status
|
||
**OVĚŘENO FUNKČNÍ** — 6. dubna 2026
|
||
Odpověď serveru: `HTTP 200`, velikost: ~3.7 KB
|
||
Schéma ověřeno proti: `schema1.xsd` verze `202501A` (dokumentace SÚKL 2025-04-24)
|
||
Debug ověřen z: `MedicusDebug/eR_SuklMesage_bf002578-*.mime`
|
||
|
||
---
|
||
|
||
## Co tato operace dělá
|
||
|
||
`NacistPredpis` je SOAP operace IS eRecept (SÚKL), která vrátí **kompletní detail jednoho konkrétního receptu** podle jeho ID.
|
||
|
||
Vrací vše: pacienta (jméno, adresa, rodné číslo, ZP), lékaře, ordinaci, předepsaný lék (ATC, dávkování, úhrada), stav receptu, výdej z lékárny.
|
||
|
||
Typické použití: lékař si zobrazí detail receptu, který sám vystavil, nebo ověří zda byl vydán.
|
||
|
||
---
|
||
|
||
## Klíčové informace
|
||
|
||
### Endpoint (produkce)
|
||
```
|
||
https://lekar-soap.erecept.sukl.cz/cuer/Lekar
|
||
```
|
||
> Tato operace je na **starším** endpointu `/cuer/Lekar` — **bez** číslice 2.
|
||
> Operace `NacistLekovyZaznam` je naopak na `/cuer/Lekar2`.
|
||
|
||
### Endpoint (testovací prostředí)
|
||
```
|
||
https://lekar-soap.test-erecept.sukl.cz/cuer/Lekar
|
||
```
|
||
|
||
### SOAPAction
|
||
```
|
||
"NacistPredpis"
|
||
```
|
||
|
||
### XML namespace
|
||
```
|
||
http://www.sukl.cz/erp/201704
|
||
```
|
||
> Starší namespace z roku 2017 — tato operace existuje od počátku IS eRecept.
|
||
> Na rozdíl od `NacistLekovyZaznam` (namespace `201912`) zde zůstává `201704`.
|
||
|
||
---
|
||
|
||
## Porovnání s NacistLekovyZaznam
|
||
|
||
| | NacistPredpis | NacistLekovyZaznam |
|
||
|---|---|---|
|
||
| **Namespace** | `201704` | `201912` |
|
||
| **Endpoint** | `/cuer/Lekar` | `/cuer/Lekar2` |
|
||
| **SOAPAction** | `NacistPredpis` | `NacistLekovyZaznam` |
|
||
| **Identifikace** | ID receptu (alfanumerický kód) | jméno + datum narození pacienta |
|
||
| **Výsledek** | detail jednoho receptu | celý lékový záznam pacienta (roky) |
|
||
| **Velikost odpovědi** | ~3.7 KB | ~227 KB |
|
||
|
||
---
|
||
|
||
## Autentizace (dvojitá — stejná jako u všech operací)
|
||
|
||
### 1. Klientský certifikát (TLS mutual auth)
|
||
- Soubor: `AMBSUKL214235369G_31DEC2024.pfx`
|
||
- Formát: PKCS#12 (`.pfx`)
|
||
- Knihovna: `requests-pkcs12` → `Pkcs12Adapter`
|
||
|
||
### 2. HTTP Basic Auth
|
||
- Uživatel: UUID lékaře
|
||
- Heslo: osobní heslo lékaře do portálu eRecept
|
||
|
||
---
|
||
|
||
## Struktura SOAP dotazu
|
||
|
||
```xml
|
||
<?xml version="1.0" encoding="UTF-8"?>
|
||
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
|
||
<soapenv:Body>
|
||
<NacteniPredpisuDotaz xmlns="http://www.sukl.cz/erp/201704">
|
||
|
||
<Doklad>
|
||
<Pristupujici>
|
||
<Uzivatel>E08C89C6-2B1A-4EBA-8ED9-4E3E63618379</Uzivatel> <!-- UUID lékaře -->
|
||
<Pracoviste>00214235367</Pracoviste> <!-- IČP pracoviště -->
|
||
</Pristupujici>
|
||
<Identifikator>
|
||
<ID_Dokladu>PPIBVF93285E</ID_Dokladu> <!-- ID receptu, 12–25 znaků -->
|
||
<!-- alternativně: -->
|
||
<!-- <ID_Podani>uuid-guid-formát</ID_Podani> -->
|
||
</Identifikator>
|
||
</Doklad>
|
||
|
||
<Zprava>
|
||
<ID_Zpravy>bf002578-4e0d-48f9-86b4-ea3e21f280ec</ID_Zpravy>
|
||
<Verze>202501A</Verze>
|
||
<Odeslano>2026-04-06T07:24:04+00:00</Odeslano>
|
||
<SW_Klienta>MEDICUS_____</SW_Klienta>
|
||
</Zprava>
|
||
|
||
</NacteniPredpisuDotaz>
|
||
</soapenv:Body>
|
||
</soapenv:Envelope>
|
||
```
|
||
|
||
### Parametry dotazu (ověřeno proti schema1.xsd verze 202501A)
|
||
|
||
| Element | Povinný | Omezení | Poznámka |
|
||
|---|---|---|---|
|
||
| `Uzivatel` | ✅ ano | UUID formát | UUID lékaře přidělené SÚKL |
|
||
| `Pracoviste` | ✅ ano | — | IČP pracoviště lékaře |
|
||
| `ID_Dokladu` | ❌ volitelný* | 12–25 znaků | alfanumerický kód receptu |
|
||
| `ID_Podani` | ❌ volitelný* | UUID formát (36 znaků) | alternativní identifikátor podání |
|
||
| `ID_Zpravy` | ✅ ano | UUID formát | nové UUID pro každý dotaz |
|
||
| `Verze` | ✅ ano | — | aktuálně `202501A` |
|
||
| `Odeslano` | ✅ ano | ISO 8601 | čas odeslání s časovou zónou |
|
||
| `SW_Klienta` | ✅ ano | přesně 12 znaků | doplnit mezerami |
|
||
|
||
> *Uvést právě jedno z: `ID_Dokladu` nebo `ID_Podani` — viz chybový kód L001.
|
||
|
||
### Formát ID receptu (`ID_Dokladu`)
|
||
|
||
Alfanumerický kód délky 12–25 znaků, např. `PPIBVF93285E`.
|
||
- Nesmí obsahovat písmena O (zaměnitelné s nulou), I (zaměnitelné s jedničkou), Y, Z
|
||
- Nesmí obsahovat malá písmena ani diakritiku
|
||
- Lékař jej vidí na průvodce receptu / v Medicusu
|
||
|
||
---
|
||
|
||
## Struktura odpovědi (ověřeno proti schema1.xsd verze 202501A)
|
||
|
||
```
|
||
NacteniPredpisuOdpoved
|
||
├── Doklad
|
||
│ ├── ID_Dokladu alfanumerický kód receptu
|
||
│ ├── DatumVystaveni datum
|
||
│ ├── PlatnostDo datum
|
||
│ ├── VypisDo datum — volitelný (prodloužená platnost výpisem)
|
||
│ ├── Akutni boolean — volitelný
|
||
│ ├── Rodina boolean — volitelný
|
||
│ ├── Preshranicni boolean — volitelný
|
||
│ ├── Opakovani int — volitelný (opakovací předpis)
|
||
│ │
|
||
│ ├── Pacient
|
||
│ │ ├── Totoznost
|
||
│ │ │ ├── Jmeno (Prijmeni, Jmena)
|
||
│ │ │ ├── DatumNarozeni
|
||
│ │ │ ├── Adresa (ulice, číslo, obec, PSC, okres...)
|
||
│ │ │ └── ROB způsob ztotožnění: ECD / JPDN / JPDNA
|
||
│ │ ├── CP číslo pojištěnce (rodné číslo)
|
||
│ │ ├── ZP Kod + Nazev zdravotní pojišťovny
|
||
│ │ ├── Telefon volitelný
|
||
│ │ ├── Notifikace SMS / Email — volitelný
|
||
│ │ └── Pohlavi M / Z — volitelný
|
||
│ │
|
||
│ ├── Predepisujici
|
||
│ │ ├── Lekar Kod (UUID) + Jmeno
|
||
│ │ ├── ICZ 8 číslic
|
||
│ │ ├── ICP 8 číslic
|
||
│ │ ├── PZS Kod + Nazev + IC + Telefon + Adresa
|
||
│ │ ├── Telefon
|
||
│ │ ├── Email volitelný
|
||
│ │ └── Odbornost Kod + Nazev
|
||
│ │
|
||
│ ├── Doporucujici volitelný — doporučující lékař
|
||
│ │ ├── Jmeno
|
||
│ │ ├── PZS
|
||
│ │ └── Odbornost
|
||
│ │
|
||
│ ├── Revize volitelný — schválení revizním lékařem ZP
|
||
│ │
|
||
│ ├── PLP[] předepsané léčivé přípravky (1 nebo více)
|
||
│ │ ├── Mnozstvi int, 1–9999
|
||
│ │ ├── Navod dávkování, max 80 znaků (např. "1-1-0")
|
||
│ │ ├── Uhrada ZAKLADNI / ZVYSENA / NEHRAZENY
|
||
│ │ ├── HVLPReg volitelný — registrovaný lék
|
||
│ │ │ ├── Kod SÚKL kód (7 číslic, např. "0087076")
|
||
│ │ │ ├── ATC ATC kód (např. "R05CB15")
|
||
│ │ │ ├── Nazev např. "ERDOMED"
|
||
│ │ │ ├── Forma léková forma (např. "CPS DUR")
|
||
│ │ │ ├── Sila síla (např. "300MG")
|
||
│ │ │ ├── CestaPodani např. "POR"
|
||
│ │ │ └── Baleni počet kusů v balení
|
||
│ │ ├── HVLPNereg volitelný — neregistrovaný HVLP
|
||
│ │ ├── IPLP volitelný — individuálně připravovaný LP
|
||
│ │ ├── INN volitelný — generický název
|
||
│ │ ├── Prekroceni boolean — překročení limitu
|
||
│ │ ├── ID_LP_Zdroj int — ID zdroje LP
|
||
│ │ └── ID_LP UUID položky předpisu
|
||
│ │
|
||
│ ├── Pozn poznámka, max 1000 znaků — volitelný
|
||
│ ├── Stav stav receptu (viz níže)
|
||
│ │
|
||
│ ├── Vydej[] volitelný — výdeje z lékáren (zkrácená forma)
|
||
│ │ ├── ID_Dokladu ID výdeje
|
||
│ │ ├── ID_Dokladu_ERP ID receptu (zpětný odkaz)
|
||
│ │ ├── DatumVydeje datum
|
||
│ │ ├── NazevPZS název lékárny
|
||
│ │ ├── JmenoVydavajiciho jméno lékárníka (může být "skryto")
|
||
│ │ ├── VLP[] vydané léčivé přípravky
|
||
│ │ │ ├── Mnozstvi
|
||
│ │ │ ├── Nazev plný název léku (např. "ERDOMED 300MG CPS DUR 20")
|
||
│ │ │ ├── Kod SÚKL kód
|
||
│ │ │ ├── Navod
|
||
│ │ │ └── IdLpErp UUID zpětný odkaz na PLP
|
||
│ │ ├── Zmena datetime
|
||
│ │ └── Zalozeni datetime
|
||
│ │
|
||
│ ├── Zmena datetime — poslední změna receptu
|
||
│ ├── Zalozeni datetime — vytvoření receptu
|
||
│ ├── DruhPojisteni VEREJNE / OSTATNI — volitelný
|
||
│ ├── ModryPruh boolean — volitelný (omamné látky)
|
||
│ ├── Papirovy boolean — volitelný
|
||
│ └── ZapocitatelnyDoplatekZbyvaDoLimitu decimal — zbývající limit doplatků pacienta
|
||
│
|
||
└── Zprava
|
||
├── ID_Zpravy nové UUID od serveru
|
||
├── Verze
|
||
├── Odeslano
|
||
├── ID_Podani echo ID podání
|
||
└── Prijato datetime — čas přijetí na serveru
|
||
```
|
||
|
||
### Popis jednotlivých polí odpovědi (zdroj: `documentationCuer.html` SÚKL 2025-04-24)
|
||
|
||
| Pole | Typ | Povinné | Popis |
|
||
|---|---|---|---|
|
||
| `ID_Dokladu` | string 12–25 | ✅ | Identifikátor dokladu |
|
||
| `DatumVystaveni` | date | ✅ | Datum vystavení eReceptu |
|
||
| `PlatnostDo` | date | ✅ | Datum konce platnosti eReceptu určené při předepsání |
|
||
| `VypisDo` | date | ❌ | Datum prodloužení platnosti eReceptu (lékárna může platnost prodloužit výpisem) |
|
||
| `Akutni` | boolean | ❌ | Symbol Akutní péče nebo Neodkladná péče |
|
||
| `Rodina` | boolean | ❌ | Symbol „Pro potřebu rodiny" nebo „Ad usum proprium" (lékař předepisuje sobě/rodině) |
|
||
| `Preshranicni` | boolean | ❌ | Přeshraniční předpis *(nepoužívá se)* |
|
||
| `Opakovani` | long | ❌ | Celkový počet výdejů u opakovacích receptů |
|
||
| `Pacient` | nacteni_pacient_type | ✅ | Údaje o pacientovi |
|
||
| `Predepisujici` | nacteni_predepisujici_type | ✅ | Údaje o předepisujícím lékaři |
|
||
| `Doporucujici` | nacteni_doporucujici_type | ❌ | Údaje o doporučujícím lékaři |
|
||
| `Revize` | nacteni_revize_type | ❌ | Schválení revizním lékařem ZP *(nepoužívá se)* |
|
||
| `PLP` | nacteni_predepsany_lp_erp_type[] | ❌ | Předepsané položky (léky) |
|
||
| `Pozn` | string 1–1000 | ❌ | Poznámka na eReceptu |
|
||
| `UpozornitLekare` | enum | ❌ | Akceptace zpětného předání poznámky z lékárny — viz tabulka níže |
|
||
| `Stav` | enum | ✅ | Stav eReceptu — viz tabulka níže |
|
||
| `Vydej` | nacteni_zkraceny_vydej_erp_doklad_odpoved_type[] | ❌ | Seznam výdejů uskutečněných dosud na tento eRecept |
|
||
| `Zmena` | dateTime | ✅ | Datum a čas poslední změny eReceptu |
|
||
| `Zalozeni` | dateTime | ✅ | Datum a čas založení eReceptu |
|
||
| `DruhPojisteni` | enum | ❌ | Druh pojištění pacienta — viz tabulka níže |
|
||
| `ModryPruh` | boolean | ❌ | Předpis na LP s obsahem vysoce návykové látky (omamné/psychotropní) |
|
||
| `Papirovy` | boolean | ❌ | Digitalizovaný papírový předpis *(nepoužívá se)* |
|
||
| `ZapocitatelnyDoplatekZbyvaDoLimitu` | decimal 0–999999.99 | ❌ | Částka zbývající do max. ročního limitu započitatelných doplatků pacienta (po překročení limitu ZP hradí doplatky za pacienta) |
|
||
|
||
---
|
||
|
||
### Hodnoty stavu receptu (`Stav`) — enum `stav_elektronickeho_receptu`
|
||
|
||
| Hodnota | Popis |
|
||
|---|---|
|
||
| `KE_SCHVALENI` | *(Nepoužívá se)* Ke schválení zdravotní pojišťovnou |
|
||
| `ZAMITNUTY` | *(Nepoužívá se)* Zamítnutý zdravotní pojišťovnou |
|
||
| `PREDEPSANY` | Předepsaný — výchozí stav po založení, lze provést výdej ✅ |
|
||
| `PRIPRAVOVANY` | Připravovaný — lékárna pracuje na výdeji (připravuje IPLP nebo objednala HVLP u distributora); výdej může provést jen tato lékárna; používá se i pro blokaci při technickém výpadku |
|
||
| `CASTECNE_VYDANY` | Částečně vydaný — výdej proběhl, ale může následovat další (prodloužená platnost nebo opakovací recept s dalšími opakováními) |
|
||
| `PLNE_VYDANY` | Plně vydaný — výdej dokončen, žádný další výdej nenásleduje ✅ |
|
||
| `NEDOKONCENY_VYDEJ` | Nedokončený výdej — lékárna nevydala léčivo, ale zaznamenala doplňující informaci (důvod nevydání); lze použít pouze u prvního takového výdeje |
|
||
| `UZAVRENY` | *(Nepoužívá se)* Uzavřený |
|
||
|
||
### Hodnoty druhu pojištění (`DruhPojisteni`) — enum `druh_pojisteni`
|
||
|
||
| Hodnota | Popis |
|
||
|---|---|
|
||
| `NEZADANO` | Nezadáno |
|
||
| `VEREJNE` | Veřejné zdravotní pojištění (běžný případ v ČR) |
|
||
| `SMLUVNI_PRIPOJISTENI` | Smluvní připojištění |
|
||
| `CESTOVNI_PRIPOJISTENI` | Cestovní zdravotní připojištění |
|
||
| `POJISTENI_EU` | Pojištění EU (pacient z jiného státu EU) |
|
||
|
||
### Hodnoty upozornění lékaře (`UpozornitLekare`) — enum `upozornit_lekare`
|
||
|
||
Lékárník může k výdeji přidat poznámku pro předepisujícího lékaře. Toto pole říká, zda lékař tuto funkci akceptoval a jak urgentně chce být informován.
|
||
|
||
| Hodnota | Popis |
|
||
|---|---|
|
||
| `BEZODKLADNE` | Upozornit lékaře bezodkladně (akceptuje BEZODKLADNE i PRISTI_NAVSTEVA) |
|
||
| `PRISTI_NAVSTEVA` | Upozornit lékaře při příští návštěvě pacienta (akceptuje pouze PRISTI_NAVSTEVA) |
|
||
| *(neuvedeno)* | Lékař neakceptoval zpětné předávání poznámek z lékárny |
|
||
|
||
### Hodnoty způsobu ztotožnění (`ROB`)
|
||
|
||
| Hodnota | Popis |
|
||
|---|---|
|
||
| `ECD` | elektronicky čitelný doklad (občanský průkaz/pas) |
|
||
| `JPDN` | jednoznačný dle jména, příjmení, data a adresy |
|
||
| `JPDNA` | jednoznačný dle jména, příjmení a data (bez adresy) |
|
||
|
||
---
|
||
|
||
## HTTP hlavičky
|
||
|
||
```python
|
||
headers = {
|
||
"Content-Type": 'text/xml; charset="UTF-8"',
|
||
"SOAPAction": '"NacistPredpis"', # uvozovky jsou součástí hodnoty!
|
||
"User-Agent": "Medicus"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## Závislosti (Python)
|
||
|
||
```
|
||
requests
|
||
requests-pkcs12
|
||
```
|
||
|
||
---
|
||
|
||
## Soubor skriptu
|
||
|
||
`NacistPredpis_FUNKCNI.py` — funkční implementace, ověřeno 6. 4. 2026.
|
||
|
||
---
|
||
|
||
## Zdroje dokumentace SÚKL
|
||
|
||
| Soubor | Datum | Obsah |
|
||
|---|---|---|
|
||
| `MedicusDebug/eR_PostData.xml` | 2026-04-05 | reálný dotaz z Medicusu |
|
||
| `MedicusDebug/eR_SuklMesage_*.mime` | 2026-04-05 | HTTP hlavičky + tělo dotazu |
|
||
| `MedicusDebug/eR_SuklMesage_*_Resp.xml` | 2026-04-05 | reálná odpověď serveru |
|
||
| `CUERLekar.wsdl` | 2025-04-24 | definice operace NacistPredpis |
|
||
| `schema1.xsd` | 2025-04-24 | kompletní XSD schéma dotazu i odpovědi |
|