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>
This commit is contained in:
Vladimir Buzalka
2026-05-20 07:05:13 +02:00
parent fc13fe9d34
commit d30404ffd0
3 changed files with 869 additions and 0 deletions
+107
View File
@@ -0,0 +1,107 @@
# 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 | ~66130 |