Files
medevio/Medevio3CapturePatients.py
2025-09-22 10:59:29 +02:00

112 lines
4.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from playwright.sync_api import sync_playwright
import mysql.connector
import time
MYSQL_CFG = dict(
host="192.168.1.76",
port=3307,
user="root",
password="Vlado9674+",
database="medevio",
)
# --- load 3 patients from DB ---
conn = mysql.connector.connect(**MYSQL_CFG)
with conn.cursor() as cur:
cur.execute("""
SELECT rid, prijmeni, jmeno, rc
FROM patients_extracted
WHERE prijmeni IS NOT NULL and mamedevioucet is null
ORDER BY prijmeni ASC
LIMIT 3
""")
rows = cur.fetchall()
if not rows:
raise RuntimeError("No entries found in patients_extracted")
STATE_FILE = r"medevio_storage.json"
BASE_URL = "https://my.medevio.cz/mudr-buzalkova/klinika/pacienti"
NOT_FOUND_SEL = "div[role='alert']:has-text('Pacient nebyl nalezen'), div:has-text('Pacient nebyl nalezen')"
DIALOG_SEL = "[role='dialog'], div.MuiDrawer-paper, div[aria-modal='true']"
def close_dialog_if_open(page):
dlg = page.locator(DIALOG_SEL)
try:
if dlg.count():
# Try a close button; if not, press Escape
try:
dlg.locator("button:has-text('Zavřít'), [aria-label='Zavřít'], [aria-label='Close'], [data-testid='CloseIcon']").first.click(timeout=1000)
except:
page.keyboard.press("Escape")
page.wait_for_selector(DIALOG_SEL, state="detached", timeout=1500)
except:
pass # best-effort close
def main():
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
try:
context = browser.new_context(storage_state=STATE_FILE)
page = context.new_page()
for rid, surname, name, rc in rows:
# 0) close any previous dialog to avoid stale matches
close_dialog_if_open(page)
target_url = f"{BASE_URL}?pacient={rid}"
page.goto(target_url, wait_until="domcontentloaded")
page.wait_for_load_state("networkidle")
# 1) Not-found toast?
try:
page.wait_for_selector(NOT_FOUND_SEL, timeout=3000)
print(f"{surname} {name} {rc} ⚠️ pacient s RID {rid} nebyl nalezen, přeskočeno")
# (optional) set mamedevioucet=NULL for this rid here
continue
except:
pass
# 2) Detail panel
try:
page.wait_for_selector(DIALOG_SEL, timeout=6000)
except:
print(f"⚠️ {surname} {name} {rc}: detailový panel se nenačetl, přeskočeno")
continue
# 3) Verify dialog belongs to current patient (avoid stale dialog)
detail = page.locator(DIALOG_SEL).first
detail_text = detail.inner_text()
if (surname not in detail_text) and (rc not in detail_text):
# Still looks wrong; give UI a moment and re-check once
page.wait_for_timeout(500)
detail_text = detail.inner_text()
if (surname not in detail_text) and (rc not in detail_text):
print(f"⚠️ {surname} {name} {rc}: detail neodpovídá (stará karta?), přeskočeno")
continue
# 4) Check Medevio account text
if "zatím nemá Medevio účet" in detail_text:
has_account = 0
print(f"{surname} {name} {rc} ❌ zatím nemá Medevio účet")
else:
has_account = 1
print(f"{surname} {name} {rc} ✅ má Medevio účet")
# Update DB by RID (or swap to rc if you prefer)
with conn.cursor() as c:
c.execute(
"UPDATE patients_extracted SET mamedevioucet = %s WHERE rid = %s",
(has_account, rid),
)
conn.commit()
time.sleep(0.5) # gentle pacing
finally:
browser.close()
if __name__ == "__main__":
main()