118 lines
3.4 KiB
Python
118 lines
3.4 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
Read OPEN Medevio requests (požadavky) from local MySQL table `pozadavky`
|
|
and export to Excel in the same visual format as Agenda.
|
|
"""
|
|
|
|
import pymysql
|
|
import pandas as pd
|
|
from datetime import datetime
|
|
from pathlib import Path
|
|
from openpyxl import Workbook
|
|
from openpyxl.styles import Font, Alignment, PatternFill, Border, Side
|
|
from openpyxl.utils import get_column_letter
|
|
from openpyxl.utils.dataframe import dataframe_to_rows
|
|
|
|
# ==============================
|
|
# 🔧 CONFIGURATION
|
|
# ==============================
|
|
DB_CONFIG = {
|
|
"host": "192.168.1.76",
|
|
"port": 3307,
|
|
"user": "root",
|
|
"password": "Vlado9674+",
|
|
"database": "medevio",
|
|
"charset": "utf8mb4",
|
|
"cursorclass": pymysql.cursors.DictCursor,
|
|
}
|
|
|
|
EXPORT_DIR = Path(r"u:\Dropbox\Ordinace\Reporty")
|
|
EXPORT_DIR.mkdir(parents=True, exist_ok=True)
|
|
xlsx_path = EXPORT_DIR / f"{datetime.now():%Y-%m-%d_%H-%M-%S} Otevřené požadavky.xlsx"
|
|
|
|
# ==============================
|
|
# 📡 LOAD DATA
|
|
# ==============================
|
|
print("📡 Fetching open requests from MySQL...")
|
|
|
|
conn = pymysql.connect(**DB_CONFIG)
|
|
with conn.cursor() as cur:
|
|
cur.execute("""
|
|
SELECT id AS Request_ID,
|
|
displayTitle AS Title,
|
|
pacient_prijmeni AS Pacient_Prijmeni,
|
|
pacient_jmeno AS Pacient_Jmeno,
|
|
pacient_rodnecislo AS RodneCislo,
|
|
createdAt AS Created,
|
|
updatedAt AS Updated,
|
|
doneAt AS Done,
|
|
removedAt AS Removed
|
|
FROM pozadavky
|
|
WHERE doneAt IS NULL AND removedAt IS NULL
|
|
ORDER BY createdAt DESC
|
|
""")
|
|
rows = cur.fetchall()
|
|
conn.close()
|
|
|
|
if not rows:
|
|
print("⚠️ No open requests found.")
|
|
raise SystemExit()
|
|
|
|
df = pd.DataFrame(rows)
|
|
print(f"✅ Loaded {len(df)} open requests.")
|
|
|
|
# ==============================
|
|
# 🧩 CLEAN + PREPARE
|
|
# ==============================
|
|
df["Patient"] = (df["Pacient_Prijmeni"].fillna("") + " " + df["Pacient_Jmeno"].fillna("")).str.strip()
|
|
|
|
df = df.rename(columns={
|
|
"RodneCislo": "Rodné číslo",
|
|
"Request_ID": "Request ID",
|
|
})
|
|
df = df[["Created", "Title", "Patient", "Rodné číslo", "Request ID", "Updated"]]
|
|
|
|
# ==============================
|
|
# 🧾 EXPORT TO EXCEL
|
|
# ==============================
|
|
wb = Workbook()
|
|
ws = wb.active
|
|
ws.title = "Otevřené požadavky"
|
|
|
|
# === Styles ===
|
|
header_fill = PatternFill("solid", fgColor="00FF99")
|
|
alt_fill = PatternFill("solid", fgColor="F2FFF2")
|
|
thin_border = Border(
|
|
left=Side(style="thin", color="000000"),
|
|
right=Side(style="thin", color="000000"),
|
|
top=Side(style="thin", color="000000"),
|
|
bottom=Side(style="thin", color="000000")
|
|
)
|
|
|
|
# === Write DataFrame ===
|
|
for r_idx, row in enumerate(dataframe_to_rows(df, index=False, header=True), start=1):
|
|
ws.append(row)
|
|
|
|
# === Header styling ===
|
|
for col_idx in range(1, len(df.columns) + 1):
|
|
c = ws.cell(row=1, column=col_idx)
|
|
c.font = Font(bold=True)
|
|
c.alignment = Alignment(horizontal="center", vertical="center")
|
|
c.fill = header_fill
|
|
c.border = thin_border
|
|
ws.column_dimensions[get_column_letter(col_idx)].width = 25
|
|
|
|
# === Data styling ===
|
|
for r_idx, row in enumerate(ws.iter_rows(min_row=2, max_row=ws.max_row, max_col=ws.max_column), start=2):
|
|
for cell in row:
|
|
cell.border = thin_border
|
|
if r_idx % 2 == 0:
|
|
cell.fill = alt_fill
|
|
|
|
ws.freeze_panes = "A2"
|
|
wb.save(xlsx_path)
|
|
|
|
print(f"📘 Exported {len(df)} open requests → {xlsx_path}")
|