Files
insurance/10 Tests/2026-01-17 02.py
2026-01-17 20:35:55 +01:00

141 lines
3.6 KiB
Python
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
REPORT ZMĚNA STAVU POJIŠTĚNÍ (POUZE REGISTROVANÍ PACIENTI)
Výstup:
pacient XY, současný stav pojištění je "X",
ke změně došlo dne YYYY-MM-DD (ze "1" na "X")
Zdroj:
- změna stavu: MySQL (vzp_stav_pojisteni)
- filtr pacientů: Medicus (aktivně registrovaní)
"""
import sys
from pathlib import Path
import pymysql
# ==========================================
# PROJECT ROOT
# ==========================================
PROJECT_ROOT = Path(__file__).resolve().parent.parent
sys.path.insert(0, str(PROJECT_ROOT))
from knihovny.medicus_db import MedicusDB
# ==========================================
# 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"
# ==========================================
# SQL ZMĚNY 1 → X (BEZ OHLEDU NA REGISTRACI)
# ==========================================
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⃣ Načíst aktivně registrované pacienty z Medicusu
db = MedicusDB(HOST, DB_PATH)
registered = db.get_active_registered_patients()
db.close()
# vytvoříme množinu RC (rychlé filtrování)
registered_rc = {rc for rc, *_ in registered}
print(f"Registrovaných pacientů: {len(registered_rc)}")
# 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]
print(f"Změny pojištění (registrovaní): {len(filtered)}\n")
# 4⃣ Výpis reportu
print("REPORT ZMĚNA STAVU POJIŠTĚNÍ (REGISTROVANÍ)\n")
for r in filtered:
pacient = f"{r['prijmeni']} {r['jmeno']}".strip()
print(
f"pacient {pacient}, "
f"současný stav pojištění je \"{r['current_stav']}\", "
f"ke změně došlo dne {r['change_date']} "
f"(ze \"1\" na \"{r['change_stav']}\")"
)
print("\nKONEC REPORTU.")
# ==========================================
if __name__ == "__main__":
main()