notebookvb
This commit is contained in:
@@ -0,0 +1,135 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
import sys as _sys
|
||||
_sys.stdout.reconfigure(encoding="utf-8", errors="replace")
|
||||
_sys.stderr.reconfigure(encoding="utf-8", errors="replace")
|
||||
"""
|
||||
07_doplnit_zahajeni.py
|
||||
======================
|
||||
Pro nové pacienty (první dávka po 31.12.2024) kteří jsou již ukončeni
|
||||
a nemají záznam v vzp_registrace_lekari pro naše ICP=09305001,
|
||||
dotáže se VZP k datu jejich první dávky — tehdy tam ještě byli
|
||||
a odpověď obsahuje datumZahajeni registrace u nás.
|
||||
|
||||
Výsledek uloží do vzp_registrace_lekari (stejná tabulka jako kdojelekar).
|
||||
"""
|
||||
|
||||
import sys
|
||||
import time
|
||||
from datetime import date
|
||||
from pathlib import Path
|
||||
|
||||
sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "Knihovny"))
|
||||
from mysql_db import connect_mysql
|
||||
from vzpb2b_client import VZPB2BClient
|
||||
|
||||
PFX_PATH = str(Path(__file__).resolve().parents[1] / "Certificates" / "picka.pfx")
|
||||
PFX_PASSWORD = "Vlado7309208104+"
|
||||
ICZ = "09305000"
|
||||
NASA_ICP = "09305001"
|
||||
API_PAUSE = 2
|
||||
|
||||
PRVNI_DAVKA = date(2024, 12, 1)
|
||||
|
||||
# ── Načtení kandidátů ─────────────────────────────────────────────────────────
|
||||
conn = connect_mysql()
|
||||
cur = conn.cursor()
|
||||
|
||||
# Noví pacienti (prvni_davka > 31.12.2024) bez záznamu v registrace pro naše ICP
|
||||
cur.execute("""
|
||||
SELECT
|
||||
s.cip,
|
||||
MIN(s.prijmeni) AS prijmeni,
|
||||
MIN(s.jmeno) AS jmeno,
|
||||
MIN(DATE(CONCAT(s.davka_rok,'-',LPAD(s.davka_mesic,2,'0'),'-',LPAD(s.davka_den,2,'0')))) AS prvni_davka
|
||||
FROM seznam_pojistencu_davky s
|
||||
WHERE s.pojistovna = '111'
|
||||
GROUP BY s.cip
|
||||
HAVING prvni_davka > %s
|
||||
""", (PRVNI_DAVKA,))
|
||||
vsichni_novi = {r[0]: (r[1], r[2], r[3]) for r in cur.fetchall()}
|
||||
|
||||
# Kteří z nich už mají záznam v registrace pro naše ICP
|
||||
cur.execute("""
|
||||
SELECT DISTINCT rc FROM vzp_registrace_lekari
|
||||
WHERE ICP = %s AND kod_odbornosti = '001' AND ma_lekare = 1
|
||||
""", (NASA_ICP,))
|
||||
uz_maji = {r[0] for r in cur.fetchall()}
|
||||
|
||||
kandidati = {
|
||||
cip: info
|
||||
for cip, info in vsichni_novi.items()
|
||||
if cip not in uz_maji
|
||||
}
|
||||
|
||||
print(f"Noví pacienti celkem: {len(vsichni_novi)}")
|
||||
print(f"Již mají datum zahájení: {len(uz_maji & vsichni_novi.keys())}")
|
||||
print(f"Ke doplnění: {len(kandidati)}")
|
||||
|
||||
if not kandidati:
|
||||
print("Vše je kompletní.")
|
||||
cur.close(); conn.close(); sys.exit(0)
|
||||
|
||||
vzp = VZPB2BClient("prod", PFX_PATH, PFX_PASSWORD, icz=ICZ)
|
||||
|
||||
print()
|
||||
sirka = max(len(f"{p} {j}") for p, j, _ in kandidati.values()) + 2
|
||||
|
||||
for i, (cip, (prijmeni, jmeno, prvni_davka)) in enumerate(kandidati.items(), 1):
|
||||
print(f"[{i:>2}/{len(kandidati)}] {prijmeni+' '+jmeno:<{sirka}} ({cip}) k {prvni_davka}", end=" ", flush=True)
|
||||
|
||||
try:
|
||||
xml = vzp.registrace_lekare(cip, prvni_davka.isoformat(), odbornosti=["001"])
|
||||
time.sleep(API_PAUSE)
|
||||
zaznamy = vzp.parse_registrace_lekare(xml)
|
||||
except Exception as e:
|
||||
print(f"CHYBA: {e}")
|
||||
continue
|
||||
|
||||
nas_zaznam = next(
|
||||
(z for z in zaznamy
|
||||
if z.get("ma_lekare") and z.get("ICP") == NASA_ICP and z.get("kod_odbornosti") == "001"),
|
||||
None
|
||||
)
|
||||
|
||||
if not nas_zaznam:
|
||||
print("→ nenalezen k tomuto datu")
|
||||
continue
|
||||
|
||||
def to_date(s):
|
||||
try:
|
||||
return date.fromisoformat(s) if s else None
|
||||
except ValueError:
|
||||
return None
|
||||
|
||||
poj_el = nas_zaznam
|
||||
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
|
||||
datum_zahajeni = VALUES(datum_zahajeni),
|
||||
datum_ukonceni = VALUES(datum_ukonceni),
|
||||
nazev_lekare = VALUES(nazev_lekare),
|
||||
nazev_zzz = VALUES(nazev_zzz)
|
||||
""", (
|
||||
cip, prijmeni, jmeno, prvni_davka, "001", 1,
|
||||
nas_zaznam.get("ICZ"), nas_zaznam.get("ICP"),
|
||||
nas_zaznam.get("nazev_lekare"), nas_zaznam.get("nazev_zzz"),
|
||||
nas_zaznam.get("poj_kod"), nas_zaznam.get("poj_zkratka"),
|
||||
to_date(nas_zaznam.get("datum_registrace")),
|
||||
to_date(nas_zaznam.get("datum_zahajeni")),
|
||||
to_date(nas_zaznam.get("datum_ukonceni")),
|
||||
nas_zaznam.get("stav_vyrizeni"),
|
||||
))
|
||||
|
||||
dz = nas_zaznam.get("datum_zahajeni") or "?"
|
||||
du = nas_zaznam.get("datum_ukonceni") or "?"
|
||||
print(f"→ zahájení: {dz} ukončení: {du}")
|
||||
|
||||
cur.close()
|
||||
conn.close()
|
||||
print(f"\nHotovo.")
|
||||
@@ -92,8 +92,8 @@ cur.execute("""
|
||||
cip,
|
||||
MIN(prijmeni) AS prijmeni,
|
||||
MIN(jmeno) AS jmeno,
|
||||
MIN(DATE(CONCAT(davka_rok,'-',LPAD(davka_mesic,2,'0'),'-01'))) AS prvni_davka,
|
||||
MAX(DATE(CONCAT(davka_rok,'-',LPAD(davka_mesic,2,'0'),'-01'))) AS posledni_davka,
|
||||
MIN(DATE(CONCAT(davka_rok,'-',LPAD(davka_mesic,2,'0'),'-',LPAD(davka_den,2,'0')))) AS prvni_davka,
|
||||
MAX(DATE(CONCAT(davka_rok,'-',LPAD(davka_mesic,2,'0'),'-',LPAD(davka_den,2,'0')))) AS posledni_davka,
|
||||
COUNT(DISTINCT CONCAT(davka_rok,davka_mesic)) AS pocet_davek
|
||||
FROM seznam_pojistencu_davky
|
||||
WHERE pojistovna='111'
|
||||
@@ -105,7 +105,7 @@ seznam = {r[0]: {"prijmeni": r[1], "jmeno": r[2],
|
||||
|
||||
# Nejnovější datum dávky (pro sloupec "v aktuální dávce")
|
||||
cur.execute("""
|
||||
SELECT MAX(DATE(CONCAT(davka_rok,'-',LPAD(davka_mesic,2,'0'),'-01')))
|
||||
SELECT MAX(DATE(CONCAT(davka_rok,'-',LPAD(davka_mesic,2,'0'),'-',LPAD(davka_den,2,'0'))))
|
||||
FROM seznam_pojistencu_davky WHERE pojistovna='111'
|
||||
""")
|
||||
nejnovejsi_davka = cur.fetchone()[0]
|
||||
@@ -113,8 +113,8 @@ nejnovejsi_davka = cur.fetchone()[0]
|
||||
cur.execute("""
|
||||
SELECT DISTINCT cip FROM seznam_pojistencu_davky
|
||||
WHERE pojistovna='111'
|
||||
AND CONCAT(davka_rok,LPAD(davka_mesic,2,'0')) = (
|
||||
SELECT MAX(CONCAT(davka_rok,LPAD(davka_mesic,2,'0')))
|
||||
AND CONCAT(davka_rok,LPAD(davka_mesic,2,'0'),LPAD(davka_den,2,'0')) = (
|
||||
SELECT MAX(CONCAT(davka_rok,LPAD(davka_mesic,2,'0'),LPAD(davka_den,2,'0')))
|
||||
FROM seznam_pojistencu_davky WHERE pojistovna='111'
|
||||
)
|
||||
""")
|
||||
@@ -214,15 +214,25 @@ for cip, s in seznam.items():
|
||||
"datum_prehl": datum_prehl,
|
||||
})
|
||||
|
||||
DATUM_REGISTRACE_OD = date(2025, 1, 1)
|
||||
|
||||
radky.sort(key=lambda r: (r["prijmeni"], r["jmeno"]))
|
||||
|
||||
aktivni = [r for r in radky if r["stav"] == "aktivní"]
|
||||
ukonceni = sorted([r for r in radky if r["stav"] == "ukončen"],
|
||||
key=lambda r: r["ukonceni"] or date.min)
|
||||
aktivni = [r for r in radky if r["stav"] == "aktivní"]
|
||||
ukonceni = sorted([r for r in radky if r["stav"] == "ukončen"],
|
||||
key=lambda r: r["ukonceni"] or date.min)
|
||||
nenalezeni = [r for r in radky if r["stav"] == "nenalezen"]
|
||||
# Noví: datum_zahajeni registrace u nás >= 01.01.2025, řazeno chronologicky
|
||||
novi = sorted(
|
||||
[r for r in radky
|
||||
if registrace.get(r["cip"], {}).get("zahajeni") is not None
|
||||
and registrace[r["cip"]]["zahajeni"] >= DATUM_REGISTRACE_OD],
|
||||
key=lambda r: (registrace[r["cip"]]["zahajeni"], r["prijmeni"], r["jmeno"])
|
||||
)
|
||||
|
||||
print(f" Aktivní: {len(aktivni)}")
|
||||
print(f" Ukončení: {len(ukonceni)}")
|
||||
print(f" Noví: {len(novi)}")
|
||||
print(f" Nenalezeni: {len(nenalezeni)}")
|
||||
|
||||
# ── Excel ─────────────────────────────────────────────────────────────────────
|
||||
@@ -270,6 +280,48 @@ def zapsat_list(ws, nadpis, bg_title, seznam_radku, stav_bg):
|
||||
cell(ws, ri, 11, r.get("novy_lekar", ""), bg)
|
||||
cell(ws, ri, 12, r.get("datum_prehl"), bg, align="center", fmt=DATE_FMT)
|
||||
|
||||
C_REGISTRACE = "DAEEF3" # světle modrá
|
||||
C_TITLE_REG = "17375E"
|
||||
|
||||
SLOUPCE_REG = ["Příjmení", "Jméno", "ČIP", "Zahájení\nregistrace",
|
||||
"Ukončení\nregistrace", "Počet\ndávek", "V aktuální\ndávce",
|
||||
"Stav", "Po ukončení", "Nový lékař / poznámka", "Datum\npřehlášení"]
|
||||
WIDTHS_REG = [24, 18, 13, 16, 14, 9, 10, 10, 13, 40, 13]
|
||||
|
||||
PO_CLR_REG = {"prehlasil": "375623", "nenalezen": "C55A11",
|
||||
"bez_lekare": "7F6000", "": "000000"}
|
||||
PO_TXT_REG = {"prehlasil": "přehlásil se", "nenalezen": "nenalezen",
|
||||
"bez_lekare": "bez lékaře", "": ""}
|
||||
|
||||
def zapsat_registrace(ws, nadpis, seznam_radku):
|
||||
ncols = len(SLOUPCE_REG)
|
||||
ws.freeze_panes = "A3"
|
||||
title_row(ws, 1, nadpis, ncols, C_TITLE_REG)
|
||||
ws.row_dimensions[2].height = 30
|
||||
for col, h in enumerate(SLOUPCE_REG, 1):
|
||||
hdr(ws.cell(2, col), h, bg=C_TITLE_REG)
|
||||
autofit(ws, WIDTHS_REG)
|
||||
|
||||
for ri, r in enumerate(seznam_radku, 3):
|
||||
bg = C_REGISTRACE if ri % 2 == 0 else None
|
||||
cell(ws, ri, 1, r["prijmeni"], bg)
|
||||
cell(ws, ri, 2, r["jmeno"], bg)
|
||||
cell(ws, ri, 3, r["cip"], bg, align="center")
|
||||
zahajeni = registrace.get(r["cip"], {}).get("zahajeni")
|
||||
cell(ws, ri, 4, zahajeni, bg, align="center", fmt=DATE_FMT)
|
||||
cell(ws, ri, 5, r["ukonceni"], bg, align="center", fmt=DATE_FMT)
|
||||
cell(ws, ri, 6, r["pocet_davek"],bg, align="right")
|
||||
akt_txt = "✓" if r["v_aktualni"] else "–"
|
||||
akt_clr = "375623" if r["v_aktualni"] else "C55A11"
|
||||
cell(ws, ri, 7, akt_txt, bg, bold=True, align="center", color=akt_clr)
|
||||
cell(ws, ri, 8, r["stav"], bg, align="center", bold=True,
|
||||
color=("375623" if r["stav"] == "aktivní" else "C55A11"))
|
||||
po = r.get("po_ukonceni", "")
|
||||
cell(ws, ri, 9, PO_TXT_REG.get(po, po), bg, align="center", bold=bool(po),
|
||||
color=PO_CLR_REG.get(po, "000000"))
|
||||
cell(ws, ri, 10, r.get("novy_lekar", ""), bg)
|
||||
cell(ws, ri, 11, r.get("datum_prehl"), bg, align="center", fmt=DATE_FMT)
|
||||
|
||||
wb = openpyxl.Workbook()
|
||||
|
||||
# List 1 – Všichni
|
||||
@@ -292,10 +344,16 @@ zapsat_list(ws3,
|
||||
f"Ukončená registrace — celkem: {len(ukonceni)}",
|
||||
C_TITLE_UKO, ukonceni, C_UKONCEN)
|
||||
|
||||
# List 4 – Nenalezeni
|
||||
# List 4 – Registrace (noví po 31.12.2024)
|
||||
ws4 = wb.create_sheet("Registrace")
|
||||
zapsat_registrace(ws4,
|
||||
f"Noví pojištěnci — datum zahájení registrace od 1.1.2025 — celkem: {len(novi)}",
|
||||
novi)
|
||||
|
||||
# List 5 – Nenalezeni
|
||||
if nenalezeni:
|
||||
ws4 = wb.create_sheet("Nenalezeni")
|
||||
zapsat_list(ws4,
|
||||
ws5 = wb.create_sheet("Nenalezeni")
|
||||
zapsat_list(ws5,
|
||||
f"Bez dostatečných dat — celkem: {len(nenalezeni)}",
|
||||
C_TITLE_NEN, nenalezeni, C_NENALEZEN)
|
||||
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user