Files
ordinaceprojekt/Insurance/KdoJeLékař/kdojelekar_tydenni.py
T
Vladimir Buzalka a1b9c93506 notebookvb
2026-04-29 06:41:45 +02:00

143 lines
5.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
kdojelekar_tydenni.py
======================
Projde aktivně registrované pacienty z Medicus a pro každého zjistí
registrujícího lékaře u VZP (odbornosti 001, 002, 014).
Výsledky uloží do MySQL tabulky vzp_registrace_lekari.
Spouštět týdně. Mezi dotazy 2s prodleva (API_DELAY).
TEST_MODE = True → zpracuje jen 3 náhodné pacienty, bez zápisu do DB.
TEST_MODE = False → produkční běh, zapíše vše.
"""
import sys
import time
import random
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_db
# ── KONFIGURACE ───────────────────────────────────────────────────────────────
API_PAUSE = 2 # sekundy mezi VZP dotazy
TEST_MODE = False # False = produkční běh
PFX_PATH = Path(__file__).resolve().parent.parent / "Certificates" / "picka.pfx"
PFX_PASS = "Vlado7309208104+"
ODBORNOSTI = None # None = bez filtru, VZP vrátí všechny odbornosti
TODAY = date.today()
# ── INIT ──────────────────────────────────────────────────────────────────────
vzp = VZPB2BClient("prod", str(PFX_PATH), PFX_PASS)
mysql = connect_mysql()
# ── PACIENTI Z MEDICUS ────────────────────────────────────────────────────────
medicus = get_medicus_db()
pacienti = medicus.get_active_registered_patients(as_dict=True)
medicus.close()
print(f"Aktivně registrovaných pacientů: {len(pacienti)}")
if TEST_MODE:
pacienti = random.sample(pacienti, min(3, len(pacienti)))
print(f"TEST MODE — zpracuji {len(pacienti)} náhodné pacienty, BEZ zápisu do DB\n")
else:
# Načti RC která už dnes mají uložený raw XML — ty přeskočíme
with mysql.cursor() as cur:
cur.execute("SELECT rc FROM vzp_registrace_raw WHERE k_datu = %s", (TODAY,))
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"PRODUKČNÍ běh — k_datu={TODAY}, zbývá zpracovat: {len(pacienti)} pacientů"
f" ({len(hotove)} již hotovo dnes)\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=TODAY.isoformat(), odbornosti=ODBORNOSTI)
zaznamy = vzp.parse_registrace_lekare(xml)
except Exception as e:
print(f"CHYBA: {e}")
continue
print(f"{len(zaznamy)} lékař(ů)")
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(f" (žádný lékař v žádné odbornosti)")
if TEST_MODE:
continue
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, TODAY, 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, TODAY, 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 dotazů: {call_count}")
if TEST_MODE:
print("(TEST MODE — nic nebylo zapsáno do DB)")
mysql.close()