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>
108 lines
3.8 KiB
Markdown
108 lines
3.8 KiB
Markdown
# 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 |
|