Files
medicus/MedicusWithClaudePoj/registrace_report.py
T
2026-04-01 06:04:40 +02:00

118 lines
3.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import sys, io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace')
import fdb
import openpyxl
from openpyxl.styles import Font, PatternFill, Alignment
from datetime import date, timedelta
import os
conn = fdb.connect(
dsn=r'localhost:c:\medicus 3\data\medicus.fdb',
user='SYSDBA', password='masterkey', charset='win1250'
)
cur = conn.cursor()
zacatek = date(2025, 1, 1)
konec = date.today()
dny = []
d = zacatek
while d <= konec:
dny.append(d)
d += timedelta(days=1)
print(f"Počítám {len(dny)} dní ({zacatek} {konec})...")
vysledky = []
for i, den in enumerate(dny):
# Počet registrovaných
cur.execute(f"""
SELECT COUNT(*) FROM KAR
WHERE vyrazen = 'N'
AND EXISTS (
SELECT id FROM registr r
JOIN icp i ON r.idicp = i.idicp
WHERE r.idpac = kar.idpac
AND r.datum <= '{den}'
AND (r.datum_zruseni IS NULL OR r.datum_zruseni >= '{den}')
AND r.priznak IN ('V','D','A')
AND i.icp = '09305001'
AND i.odb = '001'
)
""")
pocet = cur.fetchone()[0]
# Zaregistrovaní tento den
cur.execute(f"""
SELECT k.RODCIS, k.PRIJMENI, k.JMENO
FROM REGISTR r JOIN KAR k ON k.IDPAC = r.IDPAC
WHERE r.datum = '{den}'
AND r.priznak IN ('V','D','A')
ORDER BY k.PRIJMENI, k.JMENO
""")
zaregistrovani = [f"{row[0]} {row[1].strip()} {row[2]}" for row in cur.fetchall()]
# Odregistrovaní tento den
cur.execute(f"""
SELECT k.RODCIS, k.PRIJMENI, k.JMENO
FROM REGISTR r JOIN KAR k ON k.IDPAC = r.IDPAC
WHERE r.datum_zruseni = '{den}'
ORDER BY k.PRIJMENI, k.JMENO
""")
odregistrovani = [f"{row[0]} {row[1].strip()} {row[2]}" for row in cur.fetchall()]
vysledky.append((den, pocet, zaregistrovani, odregistrovani))
if (i + 1) % 30 == 0:
print(f" {i+1}/{len(dny)}: {den}{pocet}")
conn.close()
# Excel
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "Registrace"
hlavicka_font = Font(bold=True, color="FFFFFF")
hlavicka_fill = PatternFill("solid", fgColor="2E75B6")
ws.column_dimensions['A'].width = 14
ws.column_dimensions['B'].width = 14
ws.column_dimensions['C'].width = 10
ws.column_dimensions['D'].width = 45
ws.column_dimensions['E'].width = 45
for col, nazev in enumerate(['Datum', 'Registrovaných', 'Změna', 'Zaregistrováno', 'Odregistrováno'], start=1):
cell = ws.cell(row=1, column=col, value=nazev)
cell.font = hlavicka_font
cell.fill = hlavicka_fill
cell.alignment = Alignment(horizontal='center')
predchozi = None
for row_i, (den, pocet, zaregistrovani, odregistrovani) in enumerate(vysledky, start=2):
ws.cell(row=row_i, column=1, value=den).number_format = 'DD.MM.YYYY'
ws.cell(row=row_i, column=2, value=pocet).alignment = Alignment(horizontal='center')
if predchozi is not None:
zmena = pocet - predchozi
cell = ws.cell(row=row_i, column=3, value=zmena)
cell.alignment = Alignment(horizontal='center')
if zmena > 0:
cell.font = Font(color="00AA00", bold=True)
elif zmena < 0:
cell.font = Font(color="CC0000", bold=True)
predchozi = pocet
if zaregistrovani:
cell = ws.cell(row=row_i, column=4, value="\n".join(zaregistrovani))
cell.alignment = Alignment(wrap_text=True, vertical='top')
cell.font = Font(color="00AA00")
if odregistrovani:
cell = ws.cell(row=row_i, column=5, value="\n".join(odregistrovani))
cell.alignment = Alignment(wrap_text=True, vertical='top')
cell.font = Font(color="CC0000")
ws.freeze_panes = 'A2'
vystup = os.path.join(os.path.dirname(__file__), 'registrace_2025_dnes.xlsx')
wb.save(vystup)
print(f"\nUloženo: {vystup}")