přidána sdílená MySQL knihovna, paměť Claude a oprava připojení Medicus.fdb

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
michaela.buzalkova
2026-04-18 07:28:23 +02:00
parent 66e10b60c3
commit 4354285625
7 changed files with 91 additions and 23 deletions
+6
View File
@@ -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
+15
View File
@@ -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`.
+16
View File
@@ -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`.
+9
View File
@@ -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.
+3
View File
@@ -0,0 +1,3 @@
# OrdinaceProjekt
Paměť projektu je v `.claude/memory/` — přečti ji na začátku každé konverzace.
@@ -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")
+30
View File
@@ -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}")