Files
Vladimir Buzalka d30404ffd0 Medevio/80 Pacienti: GUI pro správu pacientů mimo Medicus
- pacienti_gui.py: Tkinter aplikace se scrollovatelným seznamem pacientů
  ACTIVE v Medevio, kteří nejsou registrovaní v Medicusu; tlačítka
  VZP dotaz, Bod zlomu (binary search pojištění) a Označ neaktivní
- _test_breakpoint.py: dočasný testovací skript pro binary search
- NOTES.md: technická dokumentace adresáře

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-05-20 07:05:13 +02:00

3.8 KiB
Raw Permalink Blame History

80 Pacienti — NOTES

Účel adresáře

Synchronizace a správa pacientů mezi Medevio (MySQL) a Medicus (Firebird). Hlavní výstup: GUI aplikace pacienti_gui.py pro ruční revizi a čištění.


Hlavní soubory

Soubor Popis
pacienti_gui.py Hlavní GUI — scrollovatelný seznam pacientů ACTIVE v Medevio mimo Medicus
sync_patients_to_mysql.py Stahuje pacienty z Medevio GraphQL API do MySQL (multithreading, 5 threadů)
bulk_set_removed.py Hromadně označí jako REMOVED pacienty bez účtu (user_id IS NULL) mimo Medicus
check_sync_counts.py Porovná počty: Medevio ACTIVE vs. Medicus registrovaní
create_table.sql DDL pro tabulku medevio_pacient
_test_breakpoint.py Dočasný testovací skript pro binary search pojištění (lze smazat)

GUI aplikace — pacienti_gui.py

Spuštění

python "U:\OrdinaceProjekt\Medevio\80 Pacienti\pacienti_gui.py"

Co zobrazuje

Pacienti status = 'ACTIVE' v MySQL tabulce medevio_pacient, kteří nemají platnou registraci v Medicusu (tabulka registr, ICP 09305001, odb 001).

Sloupce: Příjmení Jméno · Rodné číslo · Pojišťovna · Narozen · Poslední dekurz (z LOG)

Tlačítka na každém řádku

[VZP dotaz]

  • Zavolá VZP B2B API stavPojisteniB2B + RegistracePojistencePZSB2B (odb 001)
  • Zobrazí: pojišťovna, stav pojištění, jméno/ICP/ICZ registrujícího lékaře
  • Běží v threadu — GUI nezamrzá

[Bod zlomu]

  • Binary search přes stavPojisteniB2B — hledá datum, kdy stav přešel z '1' (pojištěn) na 'X' (nepojištěn/jiný)
  • Okno: dnes 2 roky → dnes
  • Přesnost: 1 den, ~12 API volání
  • Delay mezi voláními: 1.5s (VZP rate limit: max ~2 dotazy / 3s, jinak 503)
  • Retry: při 503 čeká 3s a zkusí znovu (max 3 pokusy)

[Označ neaktivní]

  • Potvrzovací dialog
  • Zavolá Medevio GraphQL mutation updateClinicPatientStatusREMOVED
  • Aktualizuje MySQL medevio_pacient.status = 'REMOVED'
  • Řádek se zbarví zeleně, tlačítka se deaktivují

Datové zdroje

MySQL — tabulka medevio_pacient

  • Host: 192.168.1.76:3306, DB: medevio
  • Klíčová pole: patient_id, status (ACTIVE/REMOVED), user_id (NULL = bez vlastního účtu), identification_number (RC bez lomítka)

Medicus (Firebird)

  • Registrace: tabulka registr JOIN icp, WHERE icp = '09305001' AND odb = '001'
  • Aktivní registrace: datum <= CURRENT_DATE AND (datum_zruseni IS NULL OR datum_zruseni >= CURRENT_DATE)
  • Poslední dekurz: tabulka LOG (miliony řádků — vždy filtrovat přes idpac IN (...))

Medevio GraphQL API

  • URL: https://api.medevio.cz/graphql
  • Clinic slug: mudr-buzalkova
  • Token: Medevio/token.txt

VZP B2B API

  • Certifikát: Insurance/Certificates/picka.pfx
  • Heslo: Vlado7309208104+
  • ICZ: 09305000
  • Produkční endpoint: https://prod.b2b.vzp.cz/B2BProxy/HttpProxy/
  • Rate limit: max 2 dotazy / 3s → delay 1.5s

Stav pojištění — kódy

stav Význam
'1' Pojištěn (aktivní)
'X' Nepojištěn / zánik pojištění
None Nenalezen v systému

Pojišťovna kód 111 = VZP. Kód zůstává i při stav 'X' (pacient je vedený u VZP ale pojištění zaniklo).


Známé problémy

  • 503 od VZP API — při příliš rychlých dotazech. Řešení: delay 1.5s + retry 3× po 3s.
  • bulk_set_removed.py má chybnou logiku — filtruje jen user_id IS NULL. Pro kompletní cleanup je třeba opravit na všechny ACTIVE mimo Medicus bez ohledu na user_id.

Počty (stav 2026-05-15 → aktualizovat po každém běhu)

Zdroj Počet
Medevio ACTIVE (MySQL) ~1746
Medicus registrovaní ~1624 (k 2026-05-20)
ACTIVE v Medevio mimo Medicus ~66130