153 lines
4.0 KiB
Python
153 lines
4.0 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
|
||
"""
|
||
REPORT – ZMĚNA STAVU POJIŠTĚNÍ (POUZE REGISTROVANÍ PACIENTI)
|
||
|
||
- změna definována jako přechod 1 → X
|
||
- zdroj změn: MySQL (vzp_stav_pojisteni)
|
||
- filtr pacientů: Medicus (aktivně registrovaní)
|
||
- email se odešle pouze pokud existuje alespoň 1 změna
|
||
"""
|
||
|
||
import sys
|
||
from pathlib import Path
|
||
import pymysql
|
||
|
||
# ==========================================
|
||
# PROJECT ROOT (import fix)
|
||
# ==========================================
|
||
PROJECT_ROOT = Path(__file__).resolve().parent.parent
|
||
sys.path.insert(0, str(PROJECT_ROOT))
|
||
|
||
from knihovny.medicus_db import MedicusDB
|
||
from knihovny.EmailMessagingGraph import send_mail
|
||
|
||
# ==========================================
|
||
# MYSQL CONFIG
|
||
# ==========================================
|
||
MYSQL_CONFIG = {
|
||
"host": "192.168.1.76",
|
||
"port": 3307,
|
||
"user": "root",
|
||
"password": "Vlado9674+",
|
||
"database": "medevio",
|
||
"charset": "utf8mb4",
|
||
"cursorclass": pymysql.cursors.DictCursor,
|
||
}
|
||
|
||
# ==========================================
|
||
# MEDICUS CONFIG
|
||
# ==========================================
|
||
HOST = "192.168.1.4"
|
||
DB_PATH = r"z:\Medicus 3\data\MEDICUS.FDB"
|
||
|
||
# ==========================================
|
||
# EMAIL CONFIG
|
||
# ==========================================
|
||
EMAIL_TO = "vladimir.buzalka@buzalka.cz" # ← sem případně uprav adresu
|
||
EMAIL_SUBJECT = "VZP – změna pojištění u registrovaných pacientů"
|
||
|
||
# ==========================================
|
||
# SQL – ZMĚNA 1 → X (HISTORIE)
|
||
# ==========================================
|
||
SQL = """
|
||
SELECT
|
||
cur.rc,
|
||
cur.prijmeni,
|
||
cur.jmeno,
|
||
cur.stav AS current_stav,
|
||
chg.k_datu AS change_date,
|
||
chg.stav AS change_stav
|
||
FROM
|
||
(
|
||
SELECT p1.*
|
||
FROM vzp_stav_pojisteni p1
|
||
JOIN (
|
||
SELECT rc, MAX(k_datu) AS max_date
|
||
FROM vzp_stav_pojisteni
|
||
GROUP BY rc
|
||
) x
|
||
ON x.rc = p1.rc
|
||
AND x.max_date = p1.k_datu
|
||
WHERE p1.stav <> '1'
|
||
) cur
|
||
JOIN
|
||
(
|
||
SELECT rc, MAX(k_datu) AS last_ok
|
||
FROM vzp_stav_pojisteni
|
||
WHERE stav = '1'
|
||
GROUP BY rc
|
||
) ok
|
||
ON ok.rc = cur.rc
|
||
JOIN
|
||
vzp_stav_pojisteni chg
|
||
ON chg.id = (
|
||
SELECT MIN(id)
|
||
FROM vzp_stav_pojisteni z
|
||
WHERE z.rc = cur.rc
|
||
AND z.k_datu = (
|
||
SELECT MIN(k_datu)
|
||
FROM vzp_stav_pojisteni zz
|
||
WHERE zz.rc = cur.rc
|
||
AND zz.k_datu > ok.last_ok
|
||
)
|
||
)
|
||
ORDER BY cur.prijmeni, cur.jmeno;
|
||
"""
|
||
|
||
# ==========================================
|
||
# MAIN
|
||
# ==========================================
|
||
def main():
|
||
|
||
# 1️⃣ Registrovaní pacienti (Medicus)
|
||
db = MedicusDB(HOST, DB_PATH)
|
||
registered = db.get_active_registered_patients()
|
||
db.close()
|
||
|
||
registered_rc = {rc for rc, *_ in registered}
|
||
|
||
# 2️⃣ Načíst změny z MySQL
|
||
mysql = pymysql.connect(**MYSQL_CONFIG)
|
||
with mysql.cursor() as cur:
|
||
cur.execute(SQL)
|
||
rows = cur.fetchall()
|
||
mysql.close()
|
||
|
||
# 3️⃣ Průnik množin
|
||
filtered = [r for r in rows if r["rc"] in registered_rc]
|
||
|
||
# 4️⃣ Pokud není co hlásit → konec
|
||
if not filtered:
|
||
print("Žádná změna pojištění u registrovaných pacientů – e-mail se neposílá.")
|
||
return
|
||
|
||
# 5️⃣ Sestavení reportu (TEXT)
|
||
lines = []
|
||
lines.append("Změna stavu pojištění u registrovaných pacientů:\n")
|
||
|
||
for r in filtered:
|
||
pacient = f"{r['prijmeni']} {r['jmeno']}".strip()
|
||
lines.append(
|
||
f"- pacient {pacient}, "
|
||
f"současný stav \"{r['current_stav']}\", "
|
||
f"změna dne {r['change_date']} (ze \"1\" na \"{r['change_stav']}\")"
|
||
)
|
||
|
||
body = "\n".join(lines)
|
||
|
||
# 6️⃣ Odeslání e-mailu
|
||
send_mail(
|
||
to=EMAIL_TO,
|
||
subject=f"{EMAIL_SUBJECT} ({len(filtered)})",
|
||
body=body,
|
||
html=False,
|
||
)
|
||
|
||
print(f"Odeslán e-mail: {len(filtered)} pacientů")
|
||
|
||
# ==========================================
|
||
if __name__ == "__main__":
|
||
main()
|