notebookvb
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
import uuid
|
||||
from datetime import datetime, timezone
|
||||
from pathlib import Path
|
||||
from requests import Session
|
||||
from requests_pkcs12 import Pkcs12Adapter
|
||||
|
||||
# --- Konfigurace ---
|
||||
PFX_FILE = r"C:\Users\vlado\PycharmProjects\Recepty\AMBSUKL214235369G_31DEC2024.pfx"
|
||||
PFX_PASSWORD = "Vlado7309208104++"
|
||||
|
||||
API_USER = "e08c89c6-2b1a-4eba-8ed9-4e3e63618379"
|
||||
API_PASS = "Buzalka@Vladimir2025"
|
||||
|
||||
UZIVATEL = "E08C89C6-2B1A-4EBA-8ED9-4E3E63618379"
|
||||
PRACOVISTE = "00214235367"
|
||||
|
||||
ENDPOINT = "https://lekar-soap.erecept.sukl.cz/cuer/Lekar2"
|
||||
|
||||
PRIJMENI = "Buzalka"
|
||||
JMENA = "Vladimír"
|
||||
DATUM_NAROZENI = "1973-09-20"
|
||||
|
||||
POCET_ZNAKU_ATC = 7
|
||||
POCET_MESICU = 60
|
||||
|
||||
VYSTUP = Path(__file__).parent / "odpoved_lekovy_zaznam.xml"
|
||||
|
||||
|
||||
def nacist_a_ulozit():
|
||||
sess = Session()
|
||||
sess.mount("https://", Pkcs12Adapter(
|
||||
pkcs12_filename=PFX_FILE,
|
||||
pkcs12_password=PFX_PASSWORD
|
||||
))
|
||||
sess.auth = (API_USER, API_PASS)
|
||||
|
||||
id_zpravy = str(uuid.uuid4())
|
||||
odeslano = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%S+00:00")
|
||||
|
||||
soap_body = (
|
||||
'<?xml version="1.0" encoding="UTF-8"?>'
|
||||
'<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">'
|
||||
'<soapenv:Body>'
|
||||
f'<NacistLekovyZaznamLekarDotaz xmlns="http://www.sukl.cz/erp/201912">'
|
||||
f'<Doklad>'
|
||||
f'<Pristupujici><Uzivatel>{UZIVATEL}</Uzivatel><Pracoviste>{PRACOVISTE}</Pracoviste></Pristupujici>'
|
||||
f'<PocetZnakuATC>{POCET_ZNAKU_ATC}</PocetZnakuATC>'
|
||||
f'<PocetMesicu>{POCET_MESICU}</PocetMesicu>'
|
||||
f'<Pacient><Totoznost><Jmeno><Prijmeni>{PRIJMENI}</Prijmeni><Jmena>{JMENA}</Jmena></Jmeno>'
|
||||
f'<DatumNarozeni>{DATUM_NAROZENI}</DatumNarozeni></Totoznost></Pacient>'
|
||||
f'</Doklad>'
|
||||
f'<Zprava><ID_Zpravy>{id_zpravy}</ID_Zpravy><Verze>202501A</Verze>'
|
||||
f'<Odeslano>{odeslano}</Odeslano><SW_Klienta>MEDICUS_____</SW_Klienta></Zprava>'
|
||||
f'</NacistLekovyZaznamLekarDotaz>'
|
||||
'</soapenv:Body>'
|
||||
'</soapenv:Envelope>'
|
||||
)
|
||||
|
||||
headers = {
|
||||
"Content-Type": 'text/xml; charset="UTF-8"',
|
||||
"SOAPAction": '"NacistLekovyZaznam"',
|
||||
"User-Agent": "Medicus"
|
||||
}
|
||||
|
||||
print(f"POST {ENDPOINT} ...")
|
||||
resp = sess.post(ENDPOINT, data=soap_body.encode("utf-8"), headers=headers, timeout=30)
|
||||
print(f"HTTP {resp.status_code} | {len(resp.content)} bytů")
|
||||
|
||||
if resp.status_code == 200:
|
||||
VYSTUP.write_text(resp.text, encoding="utf-8")
|
||||
print(f"Uloženo: {VYSTUP}")
|
||||
else:
|
||||
print("CHYBA — odpověď neuložena")
|
||||
print(resp.text)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
nacist_a_ulozit()
|
||||
@@ -276,44 +276,78 @@ Server každý dotaz porovná s **Registrem obyvatel (ROB)**. Lze použít dvě
|
||||
|
||||
Obě sady lze kombinovat. Pokud jsou uvedeny obě, musí být konzistentní (jinak C017).
|
||||
|
||||
### Jak přesně probíhá ztotožnění pacienta v ROB
|
||||
|
||||
> Zdroj: oficiální dokumentace SÚKL k IS eRecept
|
||||
|
||||
IS eRecept nejprve prohledá svůj interní **kmen pacientů** (vlastní databáze dříve ztotožněných osob). Teprve při neúspěchu volá **Registr obyvatel (ROB)** — což může trvat až několik sekund. U každého pacienta s korektními údaji by se to mělo stát pouze jednou. IS eRecept průběžně přebírá změny z ROB (např. přejmenování po svatbě se projeví automaticky).
|
||||
|
||||
Způsoby ztotožnění probíhají v tomto pořadí:
|
||||
|
||||
#### 1. ECD — elektronicky čitelný doklad
|
||||
Hledání dle `DruhDokladu` + `CisloDokladu`. Pokud zadáno, má přednost.
|
||||
|
||||
#### 2. JPDN — jméno, příjmení, datum narození
|
||||
Pokud nalezena právě jedna osoba → hotovo (`ROB=JPDN`).
|
||||
Pokud nalezeno více jmenovců → přechod na JPDNA.
|
||||
Pokud nenalezena žádná → upozornění (měkká chyba).
|
||||
|
||||
#### 3. JPDNA — jméno, příjmení, datum narození + adresa trvalého pobytu
|
||||
ROB umí automaticky opravit záměnu čísla popisného a orientačního.
|
||||
Pokud nalezena právě jedna osoba → hotovo (`ROB=JPDNA`).
|
||||
Pokud nenalezena žádná → upozornění, předpis se uloží s kódem **C023**.
|
||||
|
||||
> **Důležité:** Adresu není nutné uvádět, pokud proběhne úspěšné vyhledání bez ní. V takovém případě se na předpisu použije adresa dohledaná v ROB.
|
||||
|
||||
> **Cizinci:** Lze uvést zahraniční adresu, nebo adresu hotelu/lázní v ČR.
|
||||
|
||||
> **⚠️ Testování:** Ztotožňování reálných osob smí probíhat **pouze na produkci**. O každém ztotožnění je záznam v základních registrech — pacient může obdržet výpis do datové schránky. Na testovacím prostředí jsou dostupné testovací identity na: https://www.szrcr.cz/cs/sluzby/spravci-a-vyvojari/vyvojari-agendovych-informacnich-systemu#testdata (mění se denně mezi 6:00–6:30).
|
||||
|
||||
---
|
||||
|
||||
### Hodnoty DruhDokladu
|
||||
|
||||
⚠️ **Oprava předchozí dokumentace** — povolených hodnot je více než jen `ID` a `P`:
|
||||
|
||||
| Hodnota | Doklad |
|
||||
|---|---|
|
||||
| `ID` | občanský průkaz |
|
||||
| `ID` | občanský průkaz (nový formát) |
|
||||
| `OP` | občanský průkaz (starší označení) |
|
||||
| `P` | cestovní pas |
|
||||
| `IR` | povolení k pobytu |
|
||||
| `VS` | vízový štítek |
|
||||
| `PS` | pobytový štítek |
|
||||
|
||||
`CisloDokladu` — pouze číslice, max 9 znaků.
|
||||
|
||||
---
|
||||
|
||||
### Chybové kódy — ztotožnění pacienta (skupina C)
|
||||
|
||||
| Kód | Popis | Co udělat |
|
||||
|---|---|---|
|
||||
| **C010** | Jméno + příjmení + datum narození nenalezeno v ROB | Zkontrolovat překlep, záměnu jména a příjmení |
|
||||
| **C011** | Druh a číslo dokladu nenalezeno v ROB | Zkontrolovat číslo a platnost dokladu |
|
||||
| **C012** | Adresa neodpovídá — více jmenovců se stejným jménem a datem | Doplnit `DruhDokladu` + `CisloDokladu` |
|
||||
| **C014** | Není uvedeno ani jméno/datum, ani číslo dokladu | Doplnit alespoň jednu sadu |
|
||||
| **C015** | Více jmenovců v ROB, nelze dohledat adresu | Doplnit adresu **nebo** číslo dokladu |
|
||||
| **C016** | Pacient mladší 33 dní | Předpis uložen, ale nebude v lékovém záznamu |
|
||||
| **C017** | Jméno/datum neodpovídá osobě nalezené dle čísla dokladu | Opravit jméno nebo ho neuvádět |
|
||||
| **C018** | Nelze dohledat, chybí adresa | Doplnit adresu nebo číslo dokladu |
|
||||
| **C019** | Datum narození v budoucnosti | Opravit datum |
|
||||
| **C020** | Chybí jméno, příjmení nebo datum narození | Doplnit kompletní sadu A |
|
||||
| **C022** | Pacient dle ROB již zemřel | — |
|
||||
| Kód | Typ | Popis | Co udělat |
|
||||
|---|---|---|---|
|
||||
| **C010** | tvrdá | Jméno + příjmení + datum narození nenalezeno v ROB | Zkontrolovat překlep, záměnu jména a příjmení |
|
||||
| **C011** | tvrdá | Druh a číslo dokladu nenalezeno v ROB | Zkontrolovat číslo a platnost dokladu |
|
||||
| **C012** | tvrdá | Adresa neodpovídá — více jmenovců | Doplnit `DruhDokladu` + `CisloDokladu` |
|
||||
| **C014** | tvrdá | Není uvedeno ani jméno/datum, ani číslo dokladu | Doplnit alespoň jednu sadu |
|
||||
| **C015** | tvrdá | Více jmenovců v ROB, nelze dohledat adresu | Doplnit adresu **nebo** číslo dokladu |
|
||||
| **C016** | měkká | Pacient mladší 33 dní | Předpis uložen, ale nebude v lékovém záznamu |
|
||||
| **C017** | tvrdá | Jméno/datum neodpovídá osobě nalezené dle čísla dokladu | Opravit jméno nebo ho neuvádět |
|
||||
| **C018** | tvrdá | Nelze dohledat, chybí adresa | Doplnit adresu nebo číslo dokladu |
|
||||
| **C019** | tvrdá | Datum narození v budoucnosti | Opravit datum |
|
||||
| **C020** | tvrdá | Chybí jméno, příjmení nebo datum narození | Doplnit kompletní sadu |
|
||||
| **C022** | tvrdá | Pacient dle ROB již zemřel | — |
|
||||
| **C023** | měkká | Předpis uložen, ale kvůli chybě ztotožnění **nebude v lékovém záznamu** | Opravit identifikaci a provést změnu předpisu |
|
||||
| **C024** | měkká | Registr LP prohledán, pacient nenalezen v ROB (možný cizinec) | — |
|
||||
| **C025** | měkká | Výdej uložen, ale kvůli chybě ztotožnění nebude v lékovém záznamu | — |
|
||||
|
||||
### Chybové kódy — upozornění (uloženo, ale bez záznamu)
|
||||
|
||||
| Kód | Popis |
|
||||
|---|---|
|
||||
| **C023** | Předpis uložen, ale kvůli chybě ztotožnění nebude v lékovém záznamu |
|
||||
| **C024** | Registr LP prohledán, pacient nenalezen v ROB (možný cizinec) |
|
||||
| **C025** | Výdej uložen, ale kvůli chybě ztotožnění nebude v lékovém záznamu |
|
||||
> **Měkká chyba** = operace proběhla, ale s upozorněním. **Tvrdá chyba** = operace odmítnuta.
|
||||
|
||||
### Chybové kódy — doklad totožnosti
|
||||
|
||||
| Kód | Popis |
|
||||
|---|---|
|
||||
| **L076** | Neznámý druh dokladu — povoleno pouze `ID` (občanský průkaz) nebo `P` (cestovní pas) |
|
||||
| **L076** | Neznámý druh dokladu — viz tabulka povolených hodnot výše |
|
||||
|
||||
### Chybové kódy — systémové
|
||||
|
||||
@@ -322,9 +356,15 @@ Obě sady lze kombinovat. Pokud jsou uvedeny obě, musí být konzistentní (jin
|
||||
| **I005** | Registr obyvatel nedostupný (mimo kontrolu SÚKL) — zkusit znovu |
|
||||
| **I007** | Chyba dotazu na ROB — vstupní data nemají správný formát |
|
||||
|
||||
---
|
||||
|
||||
### Proč Medicus žádá o občanský průkaz
|
||||
|
||||
Typický scénář: lékař pošle dotaz pouze se jménem + datem narození. Pokud existuje více jmenovců v ROB, server vrátí **C015**. Medicus tento kód rozpozná a zobrazí dialog *"zadejte číslo občanského průkazu"*. Lékař zadá číslo, Medicus pošle dotaz znovu s `DruhDokladu=ID` + `CisloDokladu=...` → server vrátí jednoznačný výsledek.
|
||||
Typický scénář: lékař pošle dotaz pouze se jménem + datem narození. Pokud existuje více jmenovců v ROB (méně než 1 % obyvatel), server vrátí **C015**. Medicus tento kód rozpozná a zobrazí dialog *"zadejte číslo občanského průkazu"*. Lékař zadá číslo, Medicus pošle dotaz znovu s `DruhDokladu=ID` + `CisloDokladu=...` → server jednoznačně identifikuje pacienta metodou **ECD**.
|
||||
|
||||
### Identifikace pro úhradové mechanismy (ZP)
|
||||
|
||||
Oddělená od ztotožnění v ROB — probíhá přes **kód ZP + číslo pojištěnce**. IS eRecept číslo pojištěnce **neověřuje** — není garantováno, že je správné. Pokud lékárna zjistí chybu kódu pojišťovny, může ji opravit operací `ZmenitPojistovnuPredpisu`.
|
||||
|
||||
### Skript s občankou
|
||||
|
||||
|
||||
Reference in New Issue
Block a user