notebookvb

This commit is contained in:
Vladimir Buzalka
2026-04-29 06:24:11 +02:00
parent 4aee1a05bd
commit 3c3a12d5a6
6 changed files with 374 additions and 77 deletions
+13 -5
View File
@@ -70,13 +70,21 @@ class MedicusDB:
kar.prijmeni,
kar.jmeno,
kar.poj
FROM registr
JOIN kar ON registr.idpac = kar.idpac
WHERE registr.datum_zruseni IS NULL
AND registr.priznak IN ('A','D','V')
FROM kar
WHERE kar.vyrazen = 'N'
AND kar.rodcis IS NOT NULL
AND kar.rodcis <> ''
AND kar.vyrazen <> 'A'
AND EXISTS (
SELECT r.id FROM registr r
JOIN icp i ON r.idicp = i.idicp
WHERE r.idpac = kar.idpac
AND r.datum <= CURRENT_DATE
AND (r.datum_zruseni IS NULL OR r.datum_zruseni >= CURRENT_DATE)
AND r.priznak IN ('V','D','A')
AND i.icp = '09305001'
AND i.odb = '001'
)
ORDER BY kar.prijmeni, kar.rodcis
"""
if as_dict:
return self.query_dict(sql)
+90
View File
@@ -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.