Z230
This commit is contained in:
26
.gitignore
vendored
Normal file
26
.gitignore
vendored
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
# Python
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*.pyo
|
||||||
|
*.pyd
|
||||||
|
|
||||||
|
# Virtual environment
|
||||||
|
.venv/
|
||||||
|
venv/
|
||||||
|
|
||||||
|
# PyCharm / IDE
|
||||||
|
.idea/
|
||||||
|
*.iml
|
||||||
|
|
||||||
|
# OS
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# Logs & temp
|
||||||
|
*.log
|
||||||
|
*.tmp
|
||||||
|
|
||||||
|
# Generated / data (adjust if needed)
|
||||||
|
data/
|
||||||
|
output/
|
||||||
|
exports/
|
||||||
@@ -49,7 +49,7 @@ DB_CONFIG = {
|
|||||||
"charset": "utf8mb4",
|
"charset": "utf8mb4",
|
||||||
}
|
}
|
||||||
|
|
||||||
BASE_DIR = Path(r"z:\Dropbox\Ordinace\Dokumentace_ke_zpracování\MP")
|
BASE_DIR = Path(r"u:\Dropbox\Ordinace\Dokumentace_ke_zpracování\MP")
|
||||||
BASE_DIR.mkdir(parents=True, exist_ok=True)
|
BASE_DIR.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import requests
|
|||||||
import mysql.connector
|
import mysql.connector
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import sys
|
import sys
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
# UTF-8 handling
|
# UTF-8 handling
|
||||||
try:
|
try:
|
||||||
@@ -18,6 +19,11 @@ except:
|
|||||||
TOKEN_PATH = Path("token.txt")
|
TOKEN_PATH = Path("token.txt")
|
||||||
GRAPHQL_URL = "https://api.medevio.cz/graphql"
|
GRAPHQL_URL = "https://api.medevio.cz/graphql"
|
||||||
|
|
||||||
|
# --- ZPRACOVÁNÍ ---
|
||||||
|
# Zadejte počet požadavků ke zpracování.
|
||||||
|
# 0 znamená zpracovat VŠECHNY nesynchronizované požadavky.
|
||||||
|
PROCESS_LIMIT = 10 # <-- Používáme PROCESS_LIMIT
|
||||||
|
|
||||||
# --- MySQL DB ---
|
# --- MySQL DB ---
|
||||||
DB_CONFIG = {
|
DB_CONFIG = {
|
||||||
"host": "192.168.1.76",
|
"host": "192.168.1.76",
|
||||||
@@ -40,51 +46,86 @@ def read_token(p: Path) -> str:
|
|||||||
|
|
||||||
# === DB Funkce ===
|
# === DB Funkce ===
|
||||||
|
|
||||||
def get_latest_open_request_id_from_db():
|
def get_requests_to_process_from_db(limit):
|
||||||
"""
|
"""
|
||||||
Získá ID, Titul, Jméno a Příjmení nejnovějšího otevřeného požadavku z MySQL.
|
Získá seznam požadavků (ID, Titul, Jméno, Příjmení) k synchronizaci z MySQL.
|
||||||
|
Použije LIMIT, pokud limit > 0.
|
||||||
"""
|
"""
|
||||||
print("🔍 Připojuji se k MySQL a hledám ID nejnovějšího otevřeného požadavku...")
|
if limit == 0:
|
||||||
|
print("🔍 Připojuji se k MySQL a hledám **VŠECHNY** nesynchronizované požadavky...")
|
||||||
|
else:
|
||||||
|
print(f"🔍 Připojuji se k MySQL a hledám **{limit}** nesynchronizovaných požadavků...")
|
||||||
|
|
||||||
|
requests_list = []
|
||||||
|
conn = None
|
||||||
try:
|
try:
|
||||||
conn = mysql.connector.connect(**DB_CONFIG)
|
conn = mysql.connector.connect(**DB_CONFIG)
|
||||||
cursor = conn.cursor()
|
cursor = conn.cursor()
|
||||||
|
|
||||||
# SQL dotaz: Nyní vybíráme navíc jméno a příjmení pacienta
|
# Základní SQL dotaz
|
||||||
query = """
|
query = """
|
||||||
SELECT id, displayTitle, pacient_jmeno, pacient_prijmeni
|
SELECT id, displayTitle, pacient_jmeno, pacient_prijmeni
|
||||||
FROM pozadavky
|
FROM pozadavky
|
||||||
WHERE doneAt IS NULL
|
WHERE doneAt IS NULL
|
||||||
|
AND noteSyncedAt IS NULL
|
||||||
ORDER BY updatedAt DESC
|
ORDER BY updatedAt DESC
|
||||||
LIMIT 1;
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
# Podmíněné přidání LIMIT klauzule
|
||||||
|
if limit > 0:
|
||||||
|
query += f"LIMIT {limit};"
|
||||||
|
else:
|
||||||
|
query += ";"
|
||||||
|
|
||||||
cursor.execute(query)
|
cursor.execute(query)
|
||||||
result = cursor.fetchone()
|
results = cursor.fetchall()
|
||||||
|
|
||||||
cursor.close()
|
for result in results:
|
||||||
conn.close()
|
|
||||||
|
|
||||||
if result:
|
|
||||||
request_id, display_title, jmeno, prijmeni = result
|
request_id, display_title, jmeno, prijmeni = result
|
||||||
print(f"✅ Nalezen požadavek ID: {request_id} (Titul: {display_title})")
|
requests_list.append({
|
||||||
print(f" Pacient: **{prijmeni} {jmeno}**") # Vypíšeme pro snadnou kontrolu
|
|
||||||
return {
|
|
||||||
"id": request_id,
|
"id": request_id,
|
||||||
"displayTitle": display_title,
|
"displayTitle": display_title,
|
||||||
"jmeno": jmeno,
|
"jmeno": jmeno,
|
||||||
"prijmeni": prijmeni
|
"prijmeni": prijmeni
|
||||||
}
|
})
|
||||||
|
|
||||||
print("❌ Nebyl nalezen žádný otevřený požadavek v DB.")
|
cursor.close()
|
||||||
return None
|
|
||||||
|
if requests_list:
|
||||||
|
print(f"✅ Nalezeno {len(requests_list)} požadavků ke zpracování.")
|
||||||
|
else:
|
||||||
|
print("❌ Nebyl nalezen žádný nesynchronizovaný otevřený požadavek v DB.")
|
||||||
|
|
||||||
|
return requests_list
|
||||||
|
|
||||||
except mysql.connector.Error as err:
|
except mysql.connector.Error as err:
|
||||||
print(f"❌ Chyba při připojení/dotazu MySQL: {err}")
|
print(f"❌ Chyba při připojení/dotazu MySQL: {err}")
|
||||||
return None
|
return []
|
||||||
|
finally:
|
||||||
|
if conn and conn.is_connected():
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
|
||||||
# === GraphQL Operace ===
|
def update_db_sync_time(request_id, conn):
|
||||||
# Tyto GraphQL dotazy jsou beze změny
|
"""Aktualizuje sloupec noteSyncedAt v tabulce pozadavky. Používá existující připojení."""
|
||||||
|
cursor = conn.cursor()
|
||||||
|
|
||||||
|
current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
||||||
|
|
||||||
|
update_query = """
|
||||||
|
UPDATE pozadavky
|
||||||
|
SET noteSyncedAt = %s
|
||||||
|
WHERE id = %s;
|
||||||
|
"""
|
||||||
|
|
||||||
|
cursor.execute(update_query, (current_time, request_id))
|
||||||
|
conn.commit()
|
||||||
|
|
||||||
|
cursor.close()
|
||||||
|
print(f" (DB: Čas synchronizace pro {request_id} uložen)")
|
||||||
|
|
||||||
|
|
||||||
|
# === GraphQL Operace (Beze Změny) ===
|
||||||
|
|
||||||
QUERY_GET_NOTE = r"""
|
QUERY_GET_NOTE = r"""
|
||||||
query ClinicRequestNotes_Get($patientRequestId: String!) {
|
query ClinicRequestNotes_Get($patientRequestId: String!) {
|
||||||
@@ -103,6 +144,14 @@ mutation ClinicRequestNotes_Update($noteInput: UpdateClinicPatientRequestNoteInp
|
|||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
MUTATION_CREATE_NOTE = r"""
|
||||||
|
mutation ClinicRequestNotes_Create($noteInput: CreateClinicPatientRequestNoteInput!) {
|
||||||
|
createClinicPatientRequestNote(noteInput: $noteInput) {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
def gql(query, variables, token):
|
def gql(query, variables, token):
|
||||||
"""Obecná funkce pro volání GraphQL endpointu."""
|
"""Obecná funkce pro volání GraphQL endpointu."""
|
||||||
@@ -120,63 +169,92 @@ def gql(query, variables, token):
|
|||||||
|
|
||||||
def get_internal_note(request_id, token):
|
def get_internal_note(request_id, token):
|
||||||
"""Získá jedinou interní poznámku (obsah a ID) pro daný požadavek."""
|
"""Získá jedinou interní poznámku (obsah a ID) pro daný požadavek."""
|
||||||
print(f"🔍 Načítám poznámku z Medevia k požadavku {request_id}...")
|
|
||||||
data = gql(QUERY_GET_NOTE, {"patientRequestId": request_id}, token)
|
data = gql(QUERY_GET_NOTE, {"patientRequestId": request_id}, token)
|
||||||
notes = data.get("data", {}).get("notes", [])
|
notes = data.get("data", {}).get("notes", [])
|
||||||
|
return notes[0] if notes else None
|
||||||
if notes:
|
|
||||||
print("✅ Interní poznámka nalezena.")
|
|
||||||
return notes[0]
|
|
||||||
|
|
||||||
print(f"⚠️ Interní poznámka pro požadavek {request_id} neexistuje.")
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
def update_internal_note(note_id, new_content, token):
|
def update_internal_note(note_id, new_content, token):
|
||||||
"""Aktualizuje obsah poznámky v Medeviu."""
|
"""Aktualizuje obsah poznámky v Medeviu."""
|
||||||
variables = {"noteInput": {"id": note_id, "content": new_content}}
|
variables = {"noteInput": {"id": note_id, "content": new_content}}
|
||||||
print(f"📝 Odesílám aktualizaci poznámky {note_id}...")
|
|
||||||
return gql(MUTATION_UPDATE_NOTE, variables, token)
|
return gql(MUTATION_UPDATE_NOTE, variables, token)
|
||||||
|
|
||||||
|
|
||||||
|
def create_internal_note(request_id, content, token):
|
||||||
|
"""Vytvoří novou interní poznámku k požadavku v Medeviu."""
|
||||||
|
variables = {"noteInput": {"requestId": request_id, "content": content}}
|
||||||
|
return gql(MUTATION_CREATE_NOTE, variables, token)
|
||||||
|
|
||||||
|
|
||||||
# === MAIN ===
|
# === MAIN ===
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
token = read_token(TOKEN_PATH)
|
token = read_token(TOKEN_PATH)
|
||||||
|
|
||||||
# 1. Zjistit ID a jméno pacienta z TVÉ DB
|
# 1. Získat seznam ID požadavků ke zpracování (používáme PROCESS_LIMIT)
|
||||||
latest_request = get_latest_open_request_id_from_db()
|
requests_to_process = get_requests_to_process_from_db(PROCESS_LIMIT)
|
||||||
if not latest_request:
|
|
||||||
|
if not requests_to_process:
|
||||||
return
|
return
|
||||||
|
|
||||||
request_id = latest_request["id"]
|
# Pro update DB time otevřeme připojení jednou a použijeme ho v cyklu
|
||||||
|
conn = mysql.connector.connect(**DB_CONFIG)
|
||||||
|
|
||||||
# 2. Získat existující interní poznámku z Medevia
|
print("\n=============================================")
|
||||||
note = get_internal_note(request_id, token)
|
print(f"START ZPRACOVÁNÍ {len(requests_to_process)} POŽADAVKŮ")
|
||||||
if not note:
|
print("=============================================\n")
|
||||||
return
|
|
||||||
|
|
||||||
note_id = note["id"]
|
for idx, request in enumerate(requests_to_process, 1):
|
||||||
old_content = note["content"] or ""
|
request_id = request["id"]
|
||||||
|
|
||||||
# 3. Vytvořit nový obsah (ID požadavku jako první řádek)
|
print(
|
||||||
# Text, který vložíme na začátek
|
f"[{idx}/{len(requests_to_process)}] Zpracovávám požadavek: {request['prijmeni']} {request['jmeno']} (ID: {request_id})")
|
||||||
prepend_text = f"ID DB Synchronizace: {request_id}\n"
|
|
||||||
new_content = prepend_text + old_content
|
|
||||||
|
|
||||||
print("--- Nový obsah který odešlu (začátek) ---")
|
# 2. Vytvořit text, který chceme přidat/vytvořit
|
||||||
print(f"-> {prepend_text.strip()}")
|
prepend_text = f"ID: {request_id}\n"
|
||||||
print("------------------------------------------")
|
|
||||||
|
|
||||||
# 4. Aktualizovat poznámku v Medeviu
|
# 3. Pokusit se získat existující interní poznámku z Medevia
|
||||||
try:
|
note = get_internal_note(request_id, token)
|
||||||
update_internal_note(note_id, new_content, token)
|
|
||||||
print(f"\n✅ Úspěch! Poznámka {note_id} k požadavku {request_id} byla aktualizována v Medeviu.")
|
medevio_update_success = False
|
||||||
print(f" **Zkontroluj požadavek pacienta: {latest_request['prijmeni']} {latest_request['jmeno']}**")
|
|
||||||
except requests.exceptions.HTTPError as e:
|
if note:
|
||||||
print(f"\n❌ Chyba při aktualizaci Medevio API: {e}")
|
# A) POZNÁMKA EXISTUJE -> AKTUALIZOVAT
|
||||||
except Exception as e:
|
note_id = note["id"]
|
||||||
print(f"\n❌ Neočekávaná chyba: {e}")
|
old_content = note["content"] or ""
|
||||||
|
new_content = prepend_text + old_content
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Odeslání aktualizace
|
||||||
|
update_internal_note(note_id, new_content, token)
|
||||||
|
print(f" (Medevio: Poznámka {note_id} **aktualizována**.)")
|
||||||
|
medevio_update_success = True
|
||||||
|
except requests.exceptions.HTTPError as e:
|
||||||
|
print(f" ❌ Chyba při aktualizaci Medevio API: {e}")
|
||||||
|
|
||||||
|
else:
|
||||||
|
# B) POZNÁMKA NEEXISTUJE -> VYTVOŘIT
|
||||||
|
new_content = prepend_text.strip()
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Odeslání vytvoření
|
||||||
|
result = create_internal_note(request_id, new_content, token)
|
||||||
|
new_note_id = result.get("data", {}).get("createClinicPatientRequestNote", {}).get("id", "N/A")
|
||||||
|
print(f" (Medevio: Nová poznámka {new_note_id} **vytvořena**.)")
|
||||||
|
medevio_update_success = True
|
||||||
|
except requests.exceptions.HTTPError as e:
|
||||||
|
print(f" ❌ Chyba při vytváření Medevio API: {e}")
|
||||||
|
|
||||||
|
# 4. AKTUALIZACE ČASOVÉHO RAZÍTKA V DB
|
||||||
|
if medevio_update_success:
|
||||||
|
update_db_sync_time(request_id, conn)
|
||||||
|
|
||||||
|
print("---------------------------------------------")
|
||||||
|
|
||||||
|
# Uzavřeme připojení k DB po dokončení cyklu
|
||||||
|
if conn and conn.is_connected():
|
||||||
|
conn.close()
|
||||||
|
print("\n✅ Všechny požadavky zpracovány. Připojení k DB uzavřeno.")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
Reference in New Issue
Block a user