notebookvb
This commit is contained in:
@@ -0,0 +1,155 @@
|
||||
#!/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 = True # False = produkční běh
|
||||
|
||||
PFX_PATH = Path(__file__).resolve().parent.parent / "Certificates" / "picka.pfx"
|
||||
PFX_PASS = "Vlado7309208104+"
|
||||
ODBORNOSTI = ["001", "002", "014"] # VPL, gynekologie, stomatologie
|
||||
|
||||
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']}]")
|
||||
|
||||
# Pokud VZP nevrátila žádného lékaře pro některou odbornost, uložíme placeholder
|
||||
nalezene_kody = {z["kod_odbornosti"] for z in zaznamy}
|
||||
for kod in ODBORNOSTI:
|
||||
if kod not in nalezene_kody:
|
||||
zaznamy.append({
|
||||
"ma_lekare": False,
|
||||
"kod_odbornosti": kod,
|
||||
"nazev_odbornosti": None,
|
||||
"ICZ": None, "ICP": None,
|
||||
"nazev_lekare": None, "nazev_zzz": None,
|
||||
"poj_kod": None, "poj_zkratka": None,
|
||||
"datum_registrace": None, "datum_zahajeni": None, "datum_ukonceni": None,
|
||||
"stav_vyrizeni": None,
|
||||
})
|
||||
print(f" {kod}: (žádný lékař)")
|
||||
|
||||
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()
|
||||
Reference in New Issue
Block a user