# 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 `updateClinicPatientStatus` → `REMOVED` - 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 | ~66–130 |