#!/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 = False # 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()