Files
ordinaceprojekt/Medevio/80 Pacienti/NOTES.md
T
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

108 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 |