180 lines
5.3 KiB
Python
180 lines
5.3 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
Hromadně změní status na REMOVED pro pacienty, kteří:
|
|
- jsou ACTIVE v Medevio (medevio_pacient.status = 'ACTIVE')
|
|
- nemají Medevio účet (user_id IS NULL)
|
|
- nejsou registrovaní u lékaře v Medicusu (Firebird DB)
|
|
|
|
Spustit po sync_patients_to_mysql.py (data musí být čerstvá).
|
|
Token: Medevio/token.txt
|
|
"""
|
|
|
|
import sys
|
|
try:
|
|
sys.stdout.reconfigure(encoding="utf-8")
|
|
sys.stderr.reconfigure(encoding="utf-8")
|
|
except AttributeError:
|
|
import io
|
|
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")
|
|
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding="utf-8")
|
|
|
|
sys.path.insert(0, 'U:/OrdinaceProjekt')
|
|
|
|
import time
|
|
import pymysql
|
|
import requests
|
|
from pathlib import Path
|
|
from Knihovny.medicus_db import get_medicus_db
|
|
|
|
# ==================== CONFIG ====================
|
|
GRAPHQL_URL = "https://api.medevio.cz/graphql"
|
|
CLINIC_SLUG = "mudr-buzalkova"
|
|
DELAY = 0.5 # sekundy mezi voláními API
|
|
DRY_RUN = True # True = jen výpis, False = skutečná změna
|
|
|
|
TOKEN_PATH = Path(__file__).resolve().parent.parent / "token.txt"
|
|
|
|
DB_CONFIG = {
|
|
"host": "192.168.1.76",
|
|
"port": 3306,
|
|
"user": "root",
|
|
"password": "Vlado9674+",
|
|
"database": "medevio",
|
|
"charset": "utf8mb4",
|
|
"cursorclass": pymysql.cursors.DictCursor,
|
|
}
|
|
|
|
MUTATION = """
|
|
mutation ClinicPatientEditStatusModal_UpdateClinicPatientStatus(
|
|
$clinicSlug: String!, $patientId: String!, $status: ClinicPatientStatus!
|
|
) {
|
|
updated: updateClinicPatientStatus(
|
|
clinicSlug: $clinicSlug
|
|
patientId: $patientId
|
|
status: $status
|
|
)
|
|
}
|
|
"""
|
|
|
|
# ==================== HELPERS ====================
|
|
|
|
def make_headers(token):
|
|
return {
|
|
"content-type": "application/json",
|
|
"authorization": f"Bearer {token}",
|
|
"origin": "https://my.medevio.cz",
|
|
"referer": "https://my.medevio.cz/",
|
|
}
|
|
|
|
|
|
def set_patient_removed(headers, patient_id):
|
|
payload = {
|
|
"operationName": "ClinicPatientEditStatusModal_UpdateClinicPatientStatus",
|
|
"query": MUTATION,
|
|
"variables": {
|
|
"clinicSlug": CLINIC_SLUG,
|
|
"patientId": patient_id,
|
|
"status": "REMOVED",
|
|
},
|
|
}
|
|
resp = requests.post(GRAPHQL_URL, headers=headers, json=payload, timeout=20)
|
|
resp.raise_for_status()
|
|
data = resp.json()
|
|
if "errors" in data:
|
|
return False, str(data["errors"])
|
|
return data.get("data", {}).get("updated", False), None
|
|
|
|
|
|
# ==================== MAIN ====================
|
|
|
|
def main():
|
|
# --- Token ---
|
|
token = TOKEN_PATH.read_text(encoding="utf-8").strip()
|
|
if token.startswith("Bearer "):
|
|
token = token.split(" ", 1)[1]
|
|
headers = make_headers(token)
|
|
|
|
# --- Načti registrované v Medicusu (rodná čísla) ---
|
|
print("Načítám registrované pacienty z Medicusu...")
|
|
db = get_medicus_db()
|
|
rows = db.get_active_registered_patients()
|
|
medicus_rc = {r[0].strip() for r in rows if r[0]}
|
|
db.close()
|
|
print(f" Registrovaných v Medicusu: {len(medicus_rc)}")
|
|
|
|
# --- Načti kandidáty z MySQL ---
|
|
conn = pymysql.connect(**DB_CONFIG)
|
|
with conn.cursor() as cur:
|
|
cur.execute("""
|
|
SELECT patient_id, name, surname, identification_number
|
|
FROM medevio_pacient
|
|
WHERE status = 'ACTIVE'
|
|
AND user_id IS NULL
|
|
AND identification_number IS NOT NULL
|
|
AND surname NOT LIKE '%%\\%%%'
|
|
ORDER BY surname, name
|
|
""")
|
|
kandidati_raw = cur.fetchall()
|
|
conn.close()
|
|
|
|
# Filtruj ty, co nejsou v Medicusu
|
|
kandidati = [
|
|
r for r in kandidati_raw
|
|
if r["identification_number"] not in medicus_rc
|
|
]
|
|
print(f" Kandidátů (ACTIVE, bez účtu, mimo Medicus): {len(kandidati)}")
|
|
|
|
if not kandidati:
|
|
print("Nic ke změně.")
|
|
return
|
|
|
|
if DRY_RUN:
|
|
print("\n=== DRY RUN — žádné změny se neodesílají ===")
|
|
for r in kandidati:
|
|
print(f" {r['surname']} {r['name']} RC: {r['identification_number']} ID: {r['patient_id']}")
|
|
print(f"\nCelkem: {len(kandidati)} pacientů by bylo nastaveno na REMOVED.")
|
|
print("Nastav DRY_RUN = False pro skutečné provedení.")
|
|
return
|
|
|
|
# --- Hromadná změna ---
|
|
print(f"\nMěním status {len(kandidati)} pacientů na REMOVED...")
|
|
ok = 0
|
|
fail = 0
|
|
for i, r in enumerate(kandidati):
|
|
pid = r["patient_id"]
|
|
name = f"{r['surname']} {r['name']}"
|
|
success, err = set_patient_removed(headers, pid)
|
|
if success:
|
|
ok += 1
|
|
print(f" [{i+1}/{len(kandidati)}] OK {name}")
|
|
else:
|
|
fail += 1
|
|
print(f" [{i+1}/{len(kandidati)}] CHYBA {name}: {err}")
|
|
time.sleep(DELAY)
|
|
|
|
# Aktualizuj MySQL
|
|
if ok > 0:
|
|
ids_ok = []
|
|
for i, r in enumerate(kandidati):
|
|
pid = r["patient_id"]
|
|
ids_ok.append(pid)
|
|
|
|
conn2 = pymysql.connect(**DB_CONFIG)
|
|
with conn2.cursor() as cur:
|
|
fmt = ",".join(["%s"] * len(ids_ok))
|
|
cur.execute(
|
|
f"UPDATE medevio_pacient SET status='REMOVED' WHERE patient_id IN ({fmt})",
|
|
ids_ok,
|
|
)
|
|
conn2.commit()
|
|
conn2.close()
|
|
print(f"\nMySQL aktualizováno: {ok} záznamů → REMOVED")
|
|
|
|
print(f"\nHotovo — úspěch: {ok}, chyba: {fail}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|