notebookvb
This commit is contained in:
@@ -0,0 +1,155 @@
|
||||
"""
|
||||
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()
|
||||
Reference in New Issue
Block a user