notebook
This commit is contained in:
+66
-13
@@ -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 ==================
|
||||
|
||||
Reference in New Issue
Block a user