""" Najde datum poslední preventivní prohlídky (výkon 01022 nebo 01021) pro každého registrovaného pacienta z VZPARC DRUH=98 (výkonové dávky pojišťovnám). Výsledek zapíše do KAR.POZNAMKA ve formátu: [[prev_prohlidka:YYYY-MM-DD 01022, YYYY-MM-DD]] kde první datum je datum PP a druhé je nejdřívější možný termín příští (23 měsíců). """ import fdb import re import sys from datetime import date from dateutil.relativedelta import relativedelta sys.stdout = open(sys.stdout.fileno(), mode='w', encoding='utf-8', buffering=1) KODY_PP = {'01022', '01021'} conn = fdb.connect( dsn=r'localhost:c:\medicus 3\data\medicus.fdb', user='SYSDBA', password='masterkey', charset='win1250' ) cur = conn.cursor() # --- 1. Načti registrované pacienty (RC → IDPAC, aktuální POZNAMKA) --- dnes = date.today().strftime('%Y-%m-%d') cur.execute(f""" SELECT KAR.IDPAC, KAR.RODCIS, KAR.PRIJMENI, KAR.JMENO, KAR.POZNAMKA FROM KAR WHERE KAR.VYRAZEN = 'N' AND EXISTS ( SELECT r.ID FROM REGISTR r JOIN ICP i ON r.IDICP = i.IDICP WHERE r.IDPAC = KAR.IDPAC AND r.DATUM <= '{dnes}' AND (r.DATUM_ZRUSENI IS NULL OR r.DATUM_ZRUSENI >= '{dnes}') AND r.PRIZNAK IN ('V','D','A') AND i.ICP = '09305001' AND i.ODB = '001' ) """) pacienti = {} # RODCIS -> {'idpac', 'prijmeni', 'jmeno', 'poznamka'} for row in cur.fetchall(): idpac, rodcis, prijmeni, jmeno, poznamka = row if rodcis: pacienti[rodcis.strip()] = { 'idpac': idpac, 'prijmeni': prijmeni, 'jmeno': jmeno, 'poznamka': poznamka or '', } print(f"Registrovaných pacientů: {len(pacienti)}") # --- 2. Projdi všechny VZPARC DRUH=98 dávky a hledej výkony 01022/01021 --- # Výsledek: RC -> (nejnovejsi_datum, kod) vysledky = {} # RC -> (nejnovejsi_datum, kod) cur.execute(""" SELECT DAVKA FROM VZPARC WHERE DRUH = '98' AND DAVKA IS NOT NULL """) davky = cur.fetchall() print(f"VZPARC DRUH=98 blobů celkem: {len(davky)}") for (kdavka_raw,) in davky: if not kdavka_raw: continue # Dekódování CP852 try: text = kdavka_raw.encode('cp1250', errors='replace').decode('cp852', errors='replace') except Exception: continue if not text.startswith('DP98'): continue aktualni_rc = None for line in text.splitlines(): if not line: continue typ = line[0] if typ == 'A': # RC je na pevné pozici 34, délka 10 if len(line) >= 44: aktualni_rc = line[34:44].strip() else: aktualni_rc = None elif typ == 'V' and aktualni_rc: # V + DDMMYYYY + KOD(5) if len(line) < 14: continue try: dd = int(line[1:3]) mm = int(line[3:5]) yyyy = int(line[5:9]) kod = line[9:14].strip() except (ValueError, IndexError): continue if kod not in KODY_PP: continue try: datum = date(yyyy, mm, dd) except ValueError: continue # Ulož jen nejnovější datum if aktualni_rc not in vysledky or datum > vysledky[aktualni_rc][0]: vysledky[aktualni_rc] = (datum, kod) print(f"Pacientů s nalezenou PP (01022/01021): {len(vysledky)}") # --- 3. Zapiš do KAR.POZNAMKA --- TAG_RE = re.compile(r'\[\[prev_prohlidka:[^\]]*\]\]\s*#zaps[^#]*#') TAG_FORMAT = '[[prev_prohlidka:{pp_datum} {kod}, {pristi_datum}]] #zapsáno {zapsano}#' zapsano = 0 preskoceno = 0 nenalezeno = 0 from datetime import datetime ted = datetime.now().strftime('%d-%m-%Y %H:%M') for rc, (datum_pp, kod) in sorted(vysledky.items()): if rc not in pacienti: nenalezeno += 1 continue pac = pacienti[rc] pristi = datum_pp + relativedelta(months=23) tag = TAG_FORMAT.format( pp_datum=datum_pp.strftime('%d-%m-%Y'), kod=kod, pristi_datum=pristi.strftime('%d-%m-%Y'), zapsano=ted, ) stara = pac['poznamka'] # Odstraň starý tag a vlož nový na začátek nova = TAG_RE.sub('', stara).lstrip('\n') nova = tag + ('\n' + nova if nova else '') cur.execute( "UPDATE KAR SET POZNAMKA=? WHERE IDPAC=?", (nova, pac['idpac']) ) zapsano += 1 conn.commit() print(f"Zapsáno: {zapsano}, nenalezeno v KAR: {nenalezeno}, přeskočeno: {preskoceno}") conn.close()