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:
@@ -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
|
||||||
@@ -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`.
|
||||||
@@ -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`.
|
||||||
@@ -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.
|
||||||
@@ -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
|
import logging
|
||||||
from Knihovny.medicus_db import MedicusDB
|
from Knihovny.medicus_db import MedicusDB
|
||||||
from Knihovny.vzpb2b_client import VZPB2BClient
|
from Knihovny.vzpb2b_client import VZPB2BClient
|
||||||
|
from Knihovny.mysql_db import connect_mysql
|
||||||
import pymysql
|
import pymysql
|
||||||
from datetime import date
|
from datetime import date
|
||||||
|
|
||||||
@@ -45,15 +46,7 @@ def log_error(msg):
|
|||||||
# ==========================================
|
# ==========================================
|
||||||
# MYSQL CONNECTION
|
# MYSQL CONNECTION
|
||||||
# ==========================================
|
# ==========================================
|
||||||
mysql = pymysql.connect(
|
mysql = connect_mysql()
|
||||||
host="192.168.1.76",
|
|
||||||
port=3306,
|
|
||||||
user="root",
|
|
||||||
password="Vlado9674+",
|
|
||||||
database="medevio",
|
|
||||||
charset="utf8mb4",
|
|
||||||
autocommit=True
|
|
||||||
)
|
|
||||||
|
|
||||||
# ==========================================
|
# ==========================================
|
||||||
# SAVE RESULT
|
# SAVE RESULT
|
||||||
@@ -94,8 +87,8 @@ def save_insurance_status(mysql_conn, rc, prijmeni, jmeno, k_datu, result, xml_t
|
|||||||
# con = fdb.connect(
|
# con = fdb.connect(
|
||||||
# host='192.168.1.10', database=r'm:\MEDICUS\data\medicus.FDB',
|
# host='192.168.1.10', database=r'm:\MEDICUS\data\medicus.FDB',
|
||||||
# user='sysdba', password='masterkey',charset='WIN1250')
|
# user='sysdba', password='masterkey',charset='WIN1250')
|
||||||
HOST = "192.168.1.4"
|
HOST = "192.168.1.10"
|
||||||
DB_PATH = r"c:\Medicus 3\data\MEDICUS.FDB"
|
DB_PATH = r"M:\Medicus\Data\Medicus.fdb"
|
||||||
|
|
||||||
PFX_PATH = Path(__file__).resolve().parent / "Certificates" / "picka.pfx"
|
PFX_PATH = Path(__file__).resolve().parent / "Certificates" / "picka.pfx"
|
||||||
# PFX_PATH = PROJECT_ROOT / "certificates" / "MBcert.pfx"
|
# PFX_PATH = PROJECT_ROOT / "certificates" / "MBcert.pfx"
|
||||||
@@ -132,19 +125,15 @@ today = date.today()
|
|||||||
# ==========================================
|
# ==========================================
|
||||||
# FILTER: ONLY PATIENTS NOT CHECKED 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:
|
patients_to_check = [
|
||||||
for rc, prijmeni, jmeno, poj in patients:
|
(rc, prijmeni, jmeno)
|
||||||
cur.execute(
|
for rc, prijmeni, jmeno, poj in patients
|
||||||
"SELECT MAX(k_datu) AS last_check FROM vzp_stav_pojisteni WHERE rc = %s",
|
if rc not in already_checked
|
||||||
(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))
|
|
||||||
|
|
||||||
log_info(f"Incremental run: {len(patients_to_check)} patients to check today\n")
|
log_info(f"Incremental run: {len(patients_to_check)} patients to check today\n")
|
||||||
|
|
||||||
|
|||||||
@@ -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}")
|
||||||
Reference in New Issue
Block a user