# 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 |
