notebookvb
This commit is contained in:
@@ -162,6 +162,96 @@ class VZPB2BClient:
|
||||
print("HTTP:", resp.status_code)
|
||||
return resp.text
|
||||
|
||||
def registrace_lekare(self, rc: str, k_datu: str = None,
|
||||
odbornosti: list = None) -> str:
|
||||
"""
|
||||
Calls RegistracePojistencePZSB2B — vrátí registrující lékaře pojištěnce.
|
||||
odbornosti: seznam kódů, např. ["001","002","014"]. None = bez filtru (vrátí vše).
|
||||
"""
|
||||
service = "RegistracePojistencePZSB2B"
|
||||
endpoint = self._build_endpoint(service)
|
||||
|
||||
if not k_datu:
|
||||
k_datu = date.today().isoformat()
|
||||
|
||||
ns = "http://xmlns.gemsystem.cz/B2B/RegistracePojistencePZSB2B/1"
|
||||
odb_xml = ""
|
||||
if odbornosti:
|
||||
kody = "".join(f"<ns1:kodOdbornosti>{k}</ns1:kodOdbornosti>"
|
||||
for k in odbornosti)
|
||||
odb_xml = f"<ns1:seznamOdbornosti>{kody}</ns1:seznamOdbornosti>"
|
||||
|
||||
soap = f"""<?xml version="1.0" encoding="utf-8"?>
|
||||
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
|
||||
<soap:Body>
|
||||
<ns1:registracePojistencePZSB2B xmlns:ns1="{ns}">
|
||||
<ns1:cisloPojistence>{rc}</ns1:cisloPojistence>
|
||||
<ns1:kDatu>{k_datu}</ns1:kDatu>
|
||||
{odb_xml}
|
||||
</ns1:registracePojistencePZSB2B>
|
||||
</soap:Body>
|
||||
</soap:Envelope>"""
|
||||
|
||||
resp = self.session.post(
|
||||
endpoint,
|
||||
data=soap.encode("utf-8"),
|
||||
headers={"Content-Type": "text/xml; charset=utf-8", "SOAPAction": "process"},
|
||||
timeout=30,
|
||||
)
|
||||
return resp.text
|
||||
|
||||
def parse_registrace_lekare(self, xml_text: str) -> list[dict]:
|
||||
"""
|
||||
Parsuje odpověď RegistracePojistencePZSB2B.
|
||||
Vrátí seznam diktů — jeden na odbornost (i prázdné = ma_lekare=False).
|
||||
"""
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
NS = {
|
||||
"soap": "http://schemas.xmlsoap.org/soap/envelope/",
|
||||
"rp": "http://xmlns.gemsystem.cz/B2B/RegistracePojistencePZSB2B/1",
|
||||
}
|
||||
|
||||
root = ET.fromstring(xml_text)
|
||||
stav_el = root.find(".//rp:stavVyrizeniPozadavku", NS)
|
||||
stav_vyrizeni = stav_el.text.strip() if stav_el is not None and stav_el.text else None
|
||||
|
||||
# Jen vnější <odbornost> elementy (ty s ICZ), ne vnořené subelementy
|
||||
results = []
|
||||
for it in root.findall(".//rp:seznamOdbornosti/rp:odbornost", NS):
|
||||
def g(tag):
|
||||
el = it.find(f"rp:{tag}", NS)
|
||||
return el.text.strip() if el is not None and el.text else None
|
||||
|
||||
odb = it.find("rp:odbornost", NS)
|
||||
|
||||
if odb is not None:
|
||||
# Záznam s lékařem
|
||||
kod = odb.find("rp:kod", NS)
|
||||
naz = odb.find("rp:nazev", NS)
|
||||
poj = it.find("rp:zdravotniPojistovna", NS)
|
||||
results.append({
|
||||
"ma_lekare": True,
|
||||
"kod_odbornosti": kod.text.strip() if kod is not None and kod.text else None,
|
||||
"nazev_odbornosti": naz.text.strip() if naz is not None and naz.text else None,
|
||||
"ICZ": g("ICZ"),
|
||||
"ICP": g("ICP"),
|
||||
"nazev_lekare": g("nazevICP"),
|
||||
"nazev_zzz": g("nazevSZZ"),
|
||||
"poj_kod": poj.find("rp:kod", NS).text.strip() if poj is not None and poj.find("rp:kod", NS) is not None else None,
|
||||
"poj_zkratka": poj.find("rp:zkratka", NS).text.strip() if poj is not None and poj.find("rp:zkratka", NS) is not None else None,
|
||||
"datum_registrace": g("datumRegistrace"),
|
||||
"datum_zahajeni": g("datumZahajeni"),
|
||||
"datum_ukonceni": g("datumUkonceni"),
|
||||
"stav_vyrizeni": stav_vyrizeni,
|
||||
})
|
||||
else:
|
||||
# Prázdný placeholder — pacient nemá lékaře v této odbornosti
|
||||
# (VZP vrací element bez ICZ/ICP — ignorujeme, zaznamená skript sám)
|
||||
pass
|
||||
|
||||
return results
|
||||
|
||||
def parse_stav_pojisteni(self, xml_text: str):
|
||||
"""
|
||||
Parses stavPojisteniB2B SOAP response into a Python dict.
|
||||
|
||||
Reference in New Issue
Block a user