From 4354285625a21a1da7703ee58ab23a557d778465 Mon Sep 17 00:00:00 2001 From: "michaela.buzalkova" Date: Sat, 18 Apr 2026 07:28:23 +0200 Subject: [PATCH] =?UTF-8?q?p=C5=99id=C3=A1na=20sd=C3=ADlen=C3=A1=20MySQL?= =?UTF-8?q?=20knihovna,=20pam=C4=9B=C5=A5=20Claude=20a=20oprava=20p=C5=99i?= =?UTF-8?q?pojen=C3=AD=20Medicus.fdb?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 4.6 --- .claude/memory/MEMORY.md | 6 ++++ .claude/memory/project_firebird.md | 15 ++++++++ .claude/memory/project_mysql.md | 16 +++++++++ .claude/memory/user_role.md | 9 +++++ CLAUDE.md | 3 ++ .../10 FinalSaveInsuranceStatusScript(R).py | 35 +++++++------------ Knihovny/mysql_db.py | 30 ++++++++++++++++ 7 files changed, 91 insertions(+), 23 deletions(-) create mode 100644 .claude/memory/MEMORY.md create mode 100644 .claude/memory/project_firebird.md create mode 100644 .claude/memory/project_mysql.md create mode 100644 .claude/memory/user_role.md create mode 100644 CLAUDE.md create mode 100644 Knihovny/mysql_db.py diff --git a/.claude/memory/MEMORY.md b/.claude/memory/MEMORY.md new file mode 100644 index 0000000..37390c5 --- /dev/null +++ b/.claude/memory/MEMORY.md @@ -0,0 +1,6 @@ +# Memory Index + +- [Uživatel](user_role.md) — role a kontext práce +- [Projekt OrdinaceProjekt](project_ordinace.md) — struktura, cíl, klíčové soubory +- [MySQL připojení](project_mysql.md) — logika výběru hostitele, sdílená knihovna +- [Firebird / Medicus.fdb](project_firebird.md) — připojení k databázi Medicus diff --git a/.claude/memory/project_firebird.md b/.claude/memory/project_firebird.md new file mode 100644 index 0000000..f4a30a9 --- /dev/null +++ b/.claude/memory/project_firebird.md @@ -0,0 +1,15 @@ +--- +name: Firebird – Medicus.fdb +description: Připojení k databázi Medicus přes Firebird +type: project +originSessionId: 90bfd8c5-50c6-4238-ae30-d78aa7b114e9 +--- +Sdílená knihovna: `Knihovny/medicus_db.py`, třída `MedicusDB` + +Parametry připojení: +- Server: `192.168.1.10` +- Cesta k DB: `M:\Medicus\Data\Medicus.fdb` +- User: `SYSDBA`, Password: `masterkey`, Charset: `WIN1250` + +**Why:** Medicus ukládá data pacientů do Firebird databáze na síťovém serveru. +**How to apply:** Vždy použít `MedicusDB(HOST, DB_PATH)` z knihovny, ne přímé `fdb.connect`. diff --git a/.claude/memory/project_mysql.md b/.claude/memory/project_mysql.md new file mode 100644 index 0000000..b4d4c89 --- /dev/null +++ b/.claude/memory/project_mysql.md @@ -0,0 +1,16 @@ +--- +name: MySQL připojení – sdílená logika +description: Jak se připojovat k MySQL, fallback logika, lokální stanice +type: project +originSessionId: 90bfd8c5-50c6-4238-ae30-d78aa7b114e9 +--- +Sdílená knihovna: `Knihovny/mysql_db.py`, funkce `connect_mysql()` + +Logika výběru hostitele: +- Hostname `lekar`, `sestra` nebo `lenovo` → použije rovnou `127.0.0.1` +- Jiný počítač → zkusí `192.168.1.76`, fallback `127.0.0.1` + +Credentials: user=`root`, db=`medevio`, port=3306 + +**Why:** MySQL server běží lokálně na těchto stanicích, vzdálená adresa je zbytečná a způsobuje zpoždění. +**How to apply:** Každý nový skript s MySQL musí importovat `from Knihovny.mysql_db import connect_mysql` místo přímého `pymysql.connect`. diff --git a/.claude/memory/user_role.md b/.claude/memory/user_role.md new file mode 100644 index 0000000..b496336 --- /dev/null +++ b/.claude/memory/user_role.md @@ -0,0 +1,9 @@ +--- +name: Uživatel – role a kontext +description: Kdo uživatel je a jak s ním spolupracovat +type: user +originSessionId: 90bfd8c5-50c6-4238-ae30-d78aa7b114e9 +--- +Pracuje na projektu pro lékařskou ordinaci (Python skripty kolem systému Medicus). +Komunikuje česky. Technicky zdatná, rozumí kódu, nepotřebuje vysvětlovat základy. +Preferuje stručné odpovědi a konkrétní akce. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..068e909 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,3 @@ +# OrdinaceProjekt + +Paměť projektu je v `.claude/memory/` — přečti ji na začátku každé konverzace. diff --git a/Insurance/10 FinalSaveInsuranceStatusScript(R).py b/Insurance/10 FinalSaveInsuranceStatusScript(R).py index 90b330c..6443e3e 100644 --- a/Insurance/10 FinalSaveInsuranceStatusScript(R).py +++ b/Insurance/10 FinalSaveInsuranceStatusScript(R).py @@ -15,6 +15,7 @@ import time import logging from Knihovny.medicus_db import MedicusDB from Knihovny.vzpb2b_client import VZPB2BClient +from Knihovny.mysql_db import connect_mysql import pymysql from datetime import date @@ -45,15 +46,7 @@ def log_error(msg): # ========================================== # MYSQL CONNECTION # ========================================== -mysql = pymysql.connect( - host="192.168.1.76", - port=3306, - user="root", - password="Vlado9674+", - database="medevio", - charset="utf8mb4", - autocommit=True -) +mysql = connect_mysql() # ========================================== # SAVE RESULT @@ -94,8 +87,8 @@ def save_insurance_status(mysql_conn, rc, prijmeni, jmeno, k_datu, result, xml_t # con = fdb.connect( # host='192.168.1.10', database=r'm:\MEDICUS\data\medicus.FDB', # user='sysdba', password='masterkey',charset='WIN1250') -HOST = "192.168.1.4" -DB_PATH = r"c:\Medicus 3\data\MEDICUS.FDB" +HOST = "192.168.1.10" +DB_PATH = r"M:\Medicus\Data\Medicus.fdb" PFX_PATH = Path(__file__).resolve().parent / "Certificates" / "picka.pfx" # PFX_PATH = PROJECT_ROOT / "certificates" / "MBcert.pfx" @@ -132,19 +125,15 @@ today = date.today() # ========================================== # FILTER: ONLY PATIENTS NOT CHECKED TODAY # ========================================== -patients_to_check = [] +with mysql.cursor() as cur: + cur.execute("SELECT DISTINCT rc FROM vzp_stav_pojisteni WHERE k_datu = %s", (today,)) + already_checked = {row[0] for row in cur.fetchall()} -with mysql.cursor(pymysql.cursors.DictCursor) as cur: - for rc, prijmeni, jmeno, poj in patients: - cur.execute( - "SELECT MAX(k_datu) AS last_check FROM vzp_stav_pojisteni WHERE rc = %s", - (rc,) - ) - row = cur.fetchone() - last_check = row["last_check"] - - if last_check is None or last_check < today: - patients_to_check.append((rc, prijmeni, jmeno)) +patients_to_check = [ + (rc, prijmeni, jmeno) + for rc, prijmeni, jmeno, poj in patients + if rc not in already_checked +] log_info(f"Incremental run: {len(patients_to_check)} patients to check today\n") diff --git a/Knihovny/mysql_db.py b/Knihovny/mysql_db.py new file mode 100644 index 0000000..eb125e2 --- /dev/null +++ b/Knihovny/mysql_db.py @@ -0,0 +1,30 @@ +import socket +import pymysql + +_LOCAL_HOSTS = {"lekar", "sestra", "lenovo"} + + +def connect_mysql(user="root", password="Vlado9674+", database="medevio", + port=3306, charset="utf8mb4", autocommit=True): + """ + Připojí se k MySQL. Na lokálních stanicích (lekar/sestra/lenovo) použije + 127.0.0.1 přímo, jinak zkusí 192.168.1.76 a pak 127.0.0.1 jako fallback. + Vrátí aktivní pymysql spojení nebo vyhodí RuntimeError. + """ + hostname = socket.gethostname().lower() + candidates = ("127.0.0.1",) if hostname in _LOCAL_HOSTS else ("192.168.1.76", "127.0.0.1") + + params = dict(port=port, user=user, password=password, + database=database, charset=charset, autocommit=autocommit) + + last_error = None + for host in candidates: + try: + conn = pymysql.connect(host=host, **params) + print(f"[mysql_db] Připojeno přes {host} (hostname: {hostname})") + return conn + except Exception as e: + print(f"[mysql_db] {host} selhal: {e}") + last_error = e + + raise RuntimeError(f"MySQL nedostupné na žádné adrese. Poslední chyba: {last_error}")