d30404ffd0
- 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>
3.8 KiB
3.8 KiB
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, kdystavpř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
registrJOINicp, WHEREicp = '09305001'ANDodb = '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řesidpac 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 |