This commit is contained in:
2026-04-08 20:56:26 +02:00
parent 3b792690aa
commit 80c7376ad3
2 changed files with 242 additions and 13 deletions
+66 -13
View File
@@ -3,9 +3,9 @@ import pandas as pd
# TCP to the Firebird 2.5 server. Use the DB path as seen by the *server* (Windows path).
conn = fb.connect(
host="192.168.1.10",
host="localhost",
port=3050,
database=r"m:\Medicus\data\MEDICUS.FDB", # raw string for backslashes
database=r"c:\Medicus 3\data\MEDICUS.FDB", # local test Medicus
user="SYSDBA",
password="masterkey",
charset="WIN1250", # adjust if needed
@@ -29,9 +29,6 @@ print(df)
from datetime import datetime
start = datetime(2025, 1, 1)
end = datetime(2026, 1, 1)
sql = """
SELECT
/*vh.idvh,*/
@@ -43,13 +40,19 @@ SELECT
/*vh.idhodn,*/
/*vd.poradi,*/
/*vd.idmetod,*/
/* NEW: list of matching dokladd entries within ±7 days, one cell */
(
SELECT MAX(dd.datose)
FROM dokladd dd
WHERE dd.rodcis = kar.rodcis
AND dd.kod = '01130'
AND dd.datose < vh.datum
) AS minule,
(
SELECT LIST(CAST(dd.datose AS VARCHAR(10)) || ' ' || dd.kod, ', ')
FROM dokladd dd
WHERE dd.rodcis = kar.rodcis
AND (dd.kod = '01130' or dd.kod = '01131' OR dd.kod = '01132' OR dd.kod = '01133' OR dd.kod = '01134')
AND dd.datose BETWEEN vh.datum - 365 AND vh.datum + 365
AND (dd.kod = '01130' OR dd.kod = '01131' OR dd.kod = '01132' OR dd.kod = '01133' OR dd.kod = '01134')
AND dd.datose BETWEEN vh.datum - 7 AND vh.datum + 7
) AS vykodovano,
lm.kodtext,
lm.nazev,
@@ -63,18 +66,68 @@ JOIN kar ON kar.idpac = vh.idpacient
JOIN labmetod lm ON lm.idmetod = vd.idmetod
JOIN labjedn lj ON lj.idjedn = vd.idjedn
JOIN labskaly ls ON ls.idskaly = vd.idskaly
WHERE vh.datum >= ?
AND vh.datum < ?
AND lm.nazev CONTAINING 'PSA'
WHERE lm.nazev CONTAINING 'PSA'
/*ORDER BY kar.idpac, vh.datum, vd.poradi;*/
ORDER BY vh.datum desc;
"""
df_direct = query_df(sql, (start, end))
df_direct = query_df(sql)
import re
import numpy as np
# --- MINULE: expand with ", další XXXXX" based on codes billed around that date ---
df_dokladd = query_df("""
SELECT rodcis, datose, kod FROM dokladd
WHERE kod = '01131' OR kod = '01132' OR kod = '01133'
""")
df_dokladd['DATOSE'] = pd.to_datetime(df_dokladd['DATOSE'])
def compute_minule_str(row):
minule = row['MINULE']
if minule is None or (isinstance(minule, float) and np.isnan(minule)):
return None
minule_ts = pd.Timestamp(minule)
rodcis = row['RODCIS']
mask = (
(df_dokladd['RODCIS'] == rodcis) &
(df_dokladd['DATOSE'] >= minule_ts - pd.Timedelta(days=7)) &
(df_dokladd['DATOSE'] <= minule_ts + pd.Timedelta(days=7))
)
codes = df_dokladd.loc[mask, 'KOD'].tolist()
if '01133' in codes:
dalsi_str = 'NIKDY'
elif '01131' in codes:
dalsi_str = (minule_ts + pd.DateOffset(years=4)).strftime('%Y-%m-%d')
elif '01132' in codes:
dalsi_str = (minule_ts + pd.DateOffset(years=2)).strftime('%Y-%m-%d')
else:
dalsi_str = ''
date_str = minule_ts.strftime('%Y-%m-%d')
return f"{date_str}, další {dalsi_str}" if dalsi_str else date_str
df_direct['MINULE'] = df_direct.apply(compute_minule_str, axis=1)
# --- DALŠÍ: next PSA billing date based on codes in VYKODOVANO ---
def compute_dalsi(row):
vykod = str(row['VYKODOVANO'] or '')
datum = row['DATUM']
if '01133' in vykod:
return 'NIKDY'
if '01131' in vykod:
return (pd.Timestamp(datum) + pd.DateOffset(years=4)).strftime('%Y-%m-%d')
if '01132' in vykod:
return (pd.Timestamp(datum) + pd.DateOffset(years=2)).strftime('%Y-%m-%d')
return None
df_direct['DALŠÍ'] = df_direct.apply(compute_dalsi, axis=1)
# Reorder: DALŠÍ immediately after VYKODOVANO
cols = list(df_direct.columns)
cols.remove('DALŠÍ')
cols.insert(cols.index('VYKODOVANO') + 1, 'DALŠÍ')
df_direct = df_direct[cols]
# --- 0) Helper: parse numeric value from string like "5,6", "<0.1", "3.2 mmol/L" ---
num_re = re.compile(r'[-+]?\d+(?:[.,]\d+)?(?:[eE][-+]?\d+)?')
@@ -120,7 +173,7 @@ from openpyxl.styles import PatternFill
from openpyxl.formatting.rule import FormulaRule
base_path = Path(r"z:\Dropbox\Ordinace\Reporty")
base_path = Path(r"u:\Dropbox\!!!Days\Downloads Z230")
base_path.mkdir(parents=True, exist_ok=True)
# ================= DELETE OLD PSA REPORTS ==================