Files
ordinaceprojekt/Insurance/KdoJeLékař/kdojelekar_20250101.py
T
2026-04-29 12:33:19 +02:00

159 lines
6.2 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
kdojelekar_20250101.py
======================
Jednorázový skript: vybere pacienty registrované k 01.01.2025
a dotáže se VZP B2B na jejich registrujícího lékaře k tomuto datu.
Výsledky uloží do stejných MySQL tabulek jako týdenní skript
(vzp_registrace_lekari, vzp_registrace_raw) s k_datu = 2025-01-01.
Resumovatelný — přeskočí pacienty, kteří již mají raw XML pro k_datu=2025-01-01.
"""
import sys
import time
from pathlib import Path
from datetime import date
PROJECT_ROOT = Path(__file__).resolve().parent.parent.parent
sys.path.insert(0, str(PROJECT_ROOT))
from Knihovny.vzpb2b_client import VZPB2BClient
from Knihovny.mysql_db import connect_mysql
from Knihovny.medicus_db import get_medicus_connection
# ── KONFIGURACE ───────────────────────────────────────────────────────────────
K_DATU = date(2025, 1, 1)
API_PAUSE = 2
PFX_PATH = Path(__file__).resolve().parent.parent / "Certificates" / "picka.pfx"
PFX_PASS = "Vlado7309208104+"
ODBORNOSTI = None # None = bez filtru odborností
# ── INIT ──────────────────────────────────────────────────────────────────────
vzp = VZPB2BClient("prod", str(PFX_PATH), PFX_PASS)
mysql = connect_mysql()
# ── PACIENTI Z MEDICUS (registrovaní k 01.01.2025) ───────────────────────────
import fdb, socket
computer_name = socket.gethostname().upper()
dsn_map = {
"LEKAR": r"localhost:M:\medicus\data\medicus.fdb",
"SESTRA": r"192.168.1.10:m:\medicus\data\medicus.fdb",
"LENOVO": r"192.168.1.10:m:\medicus\data\medicus.fdb",
}
dsn = dsn_map.get(computer_name, r"localhost:c:\medicus 3\data\medicus.fdb")
fb_conn = fdb.connect(dsn=dsn, user="SYSDBA", password="masterkey", charset="win1250")
fb_cur = fb_conn.cursor()
fb_cur.execute("""
SELECT kar.rodcis, kar.prijmeni, kar.jmeno, kar.poj
FROM kar
WHERE kar.vyrazen = 'N'
AND kar.rodcis IS NOT NULL
AND kar.rodcis <> ''
AND EXISTS (
SELECT r.id FROM registr r
JOIN icp i ON r.idicp = i.idicp
WHERE r.idpac = kar.idpac
AND r.datum <= ?
AND (r.datum_zruseni IS NULL OR r.datum_zruseni >= ?)
AND r.priznak IN ('V', 'D', 'A')
AND i.icp = '09305001'
AND i.odb = '001'
)
ORDER BY kar.prijmeni, kar.rodcis
""", (K_DATU.isoformat(), K_DATU.isoformat()))
cols = [d[0].strip().lower() for d in fb_cur.description]
pacienti = [dict(zip(cols, row)) for row in fb_cur.fetchall()]
fb_conn.close()
print(f"Pacientu registrovanych k {K_DATU}: {len(pacienti)}")
# ── RESUME: přeskočit již hotové ─────────────────────────────────────────────
with mysql.cursor() as cur:
cur.execute("SELECT rc FROM vzp_registrace_raw WHERE k_datu = %s", (K_DATU,))
hotove = {row[0] for row in cur.fetchall()}
pacienti = [p for p in pacienti if (p.get("rodcis") or "").strip() not in hotove]
print(f"Zbyvá zpracovat: {len(pacienti)} ({len(hotove)} již hotovo)\n")
# ── BATCH ─────────────────────────────────────────────────────────────────────
call_count = 0
for i, pac in enumerate(pacienti):
rc = (pac.get("rodcis") or "").strip()
prijmeni = (pac.get("prijmeni") or "").strip()
jmeno = (pac.get("jmeno") or "").strip()
if not rc:
continue
if call_count > 0:
time.sleep(API_PAUSE)
call_count += 1
print(f"[{i+1}/{len(pacienti)}] {prijmeni} {jmeno} ({rc}) ...", end=" ", flush=True)
try:
xml = vzp.registrace_lekare(rc=rc, k_datu=K_DATU.isoformat(), odbornosti=ODBORNOSTI)
zaznamy = vzp.parse_registrace_lekare(xml)
except Exception as e:
print(f"CHYBA: {e}")
continue
print(f"{len(zaznamy)} lekar(u)")
for z in zaznamy:
print(f" {z['kod_odbornosti']}: {z['nazev_lekare']} / {z['nazev_zzz']}"
f" [{z['datum_zahajeni']} - {z['datum_ukonceni']}]")
if not zaznamy:
print(" (zadny lekar v zadne odbornosti)")
with mysql.cursor() as cur:
cur.execute("""
INSERT INTO vzp_registrace_raw (rc, k_datu, raw_xml)
VALUES (%s, %s, %s)
ON DUPLICATE KEY UPDATE raw_xml=VALUES(raw_xml)
""", (rc, K_DATU, xml))
with mysql.cursor() as cur:
for z in zaznamy:
cur.execute("""
INSERT INTO vzp_registrace_lekari
(rc, prijmeni, jmeno, k_datu, kod_odbornosti, ma_lekare,
ICZ, ICP, nazev_lekare, nazev_zzz,
poj_kod, poj_zkratka,
datum_registrace, datum_zahajeni, datum_ukonceni,
stav_vyrizeni)
VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)
ON DUPLICATE KEY UPDATE
prijmeni=VALUES(prijmeni), jmeno=VALUES(jmeno),
ma_lekare=VALUES(ma_lekare),
ICZ=VALUES(ICZ), ICP=VALUES(ICP),
nazev_lekare=VALUES(nazev_lekare), nazev_zzz=VALUES(nazev_zzz),
poj_kod=VALUES(poj_kod), poj_zkratka=VALUES(poj_zkratka),
datum_registrace=VALUES(datum_registrace),
datum_zahajeni=VALUES(datum_zahajeni),
datum_ukonceni=VALUES(datum_ukonceni),
stav_vyrizeni=VALUES(stav_vyrizeni)
""", (
rc, prijmeni, jmeno, K_DATU, z["kod_odbornosti"], 1 if z["ma_lekare"] else 0,
z["ICZ"], z["ICP"], z["nazev_lekare"], z["nazev_zzz"],
z["poj_kod"], z["poj_zkratka"],
z["datum_registrace"], z["datum_zahajeni"], z["datum_ukonceni"],
z["stav_vyrizeni"],
))
print(f"\nHotovo. VZP dotazu: {call_count}")
mysql.close()