# Analýza synchronizace pacientů Medevio ↔ Medicus **Datum:** 15. května 2026 **Adresář:** `U:\OrdinaceProjekt\Medevio\80 Pacienti` --- ## 1. Situace na začátku Minulý den (14. května) jsme: - Stáhli pacienty z Medevio API (1600 pacientů) - Uložili je do MySQL tabulky `medevio_pacient` - Spustili skript `bulk_set_removed.py`, který měl označit pacienty bez registrace v Medicusu jako REMOVED **Otázka:** Proč se záznamů neodstranilo více? --- ## 2. Analýza stavu dat ### 2.1 Porovnání počtů (check_sync_counts.py) | Zdroj | Počet | |-------|-------| | Medevio (MySQL) — ACTIVE | 1746 | | Medicus (Firebird) — registrovaní | 1617 | | **Rozdíl** | **129** | → V Medeviu je **129 pacientů navíc**, kteří nejsou registrovaní v Medicusu. ### 2.2 Detailnější statistika (stats_user_id.py) Zjistili jsme rozdíl mezi pacienty s `user_id` a bez: ``` ACTIVE — BEZ user_id: 547 pacientů ├─ V Medicusu: 545 ✓ └─ MIMO Medicus: 0 (nikdo!) ACTIVE — S user_id: 1,198 pacientů ├─ V Medicusu: 1,131 ✓ └─ MIMO Medicus: 66 ← KANDIDÁTI NA REMOVE! REMOVED — BEZ user_id: 179 └─ Všichni mimo Medicus (správně smazáno) REMOVED — S user_id: 19 └─ 18 mimo Medicus (měli by být REMOVED, ale nejsou!) ``` **Klíčová zjištění:** - `user_id IS NULL` = pacient bez vlastního účtu v Medeviu (přidán lékařem) - `user_id IS NOT NULL` = pacient se SVÝM účtem v Medeviu (sám se registroval) --- ## 3. Problém se skriptem bulk_set_removed.py Skript měl tento filtr: ```sql WHERE status = 'ACTIVE' AND user_id IS NULL ← ❌ PROBLÉM! AND identification_number IS NOT NULL ``` **Důsledek:** Skript odstranit jen pacienty bez vlastního Medevio účtu. Ale pacienti s `user_id`, co nejsou v Medicusu, zůstali označeni jako ACTIVE. --- ## 4. Úprava sync_patients_to_mysql.py na multithreading **Původní problém:** Stahování detailů 1600 pacientů trvalo dlouho (sekvenciální dotazy s 0.3s delay). **Řešení:** Přidáno `ThreadPoolExecutor` s `MAX_WORKERS = 5` **Kód:** - Importy: `threading`, `concurrent.futures` - Třída `RateLimiter` — globální kontrola API rate limit (0.3s mezi requesty) - Funkce `fetch_all_details_threaded()` — paralelní stahování s 5 thrady **Efekt:** Čas snížen z ~15–20 minut na ~2–3 minuty (6–8× zrychlení) --- ## 5. Speciální případy ### 5.1 Vymětalová Kristýna (RC: 9054260083) - **Status v Medeviu:** ACTIVE s `user_id` - **Status v Medicusu:** Figuruje v seznamu, ale poslední registrace skončila **8. 10. 2024** - **Závěr:** Správně se počítá jako neregistrovaná (registrace starší než dnes 15. 5. 2026) ### 5.2 Divný záznam s chybou Nalezen pacient s jménem: ``` name: %JMENO% surname: %PRIJMENI% identification_number: %RODCISN% ``` **Akce:** Smazáno z MySQL (datová chyba, placeholder místo skutečných údajů) --- ## 6. Seznamy pacientů ### 6.1 Těch 66 mimo Medicus (ACTIVE s user_id) Plný seznam viz: `list_extras.py` nebo tabulka v [SEZNAM.md](SEZNAM.md) Poznámky: - 3 duplikáty (4 záznamy): - Bauerová Irena (2×) - Jechová Alena (2×) - Kroupa Vratislav (2×) --- ## 7. VZP API dotazy na registrující lékaře Vytvořeny skripty pro dotazování VZP B2B API: | Skript | Účel | |--------|------| | `check_lekare_vzp_test.py` | Test na prvních 5 pacientech | | `check_lekare_vzp.py` | Všech 61–66 pacientů | **Konfiguraci:** - Certifikát: `Insurance/Certificates/picka.pfx` - Heslo: `Vlado7309208104+` - ICZ: `09305000` **Výstup:** Tabulka s jménem lékaře v odbornosti 001 pro každého pacienta (nebo "NEMÁ LÉKAŘE") **Poznámka:** VZP provádí údržbu 15. 5. 2026 18:30 — 17. 5. 2026 (sic!) — API nemusí být dostupné. --- ## 8. Oprava připojení k Medicusu **Problém:** `get_medicus_connection()` v `medicus_db.py` měla špatný DSN **Řešení:** Aktualizován DSN pro počítač `NTBVBHP470G10`: ```python "NTBVBHP470G10": r"reporter:c:\medicus\medicus.fdb", ``` Místo: `localhost:c:\medicus 3\data\medicus.fdb` --- ## 9. Závěr — co to znamená **Situace:** - ✓ 1617 pacientů je správně registrovaných v Medicusu - ⚠️ 66 pacientů je ACTIVE v Medeviu, ale nemají registraci u nás (mají vlastní účet v Medeviu) - ⚠️ 179 pacientů bylo správně označeno jako REMOVED (bez vlastního účtu) - ⚠️ 18 pacientů je označeno REMOVED, mají vlastní účet, ale nejsou v Medicusu **Příštích kroků:** 1. Opravit `bulk_set_removed.py` — měl by hledat všechny ACTIVE mimo Medicus, ne jen bez `user_id` 2. Rozhodnout o těch 66 pacientech: - Jsou to pacienti, co se registrují jen v Medeviu (bez návštěvy u lékaře)? - Měli by být označeni jako REMOVED? 3. Dotázat se VZP API, kde jsou těmito pacienty registrováni (pokud vůbec) --- ## 10. Soubory vytvořené během analýzy ``` U:\OrdinaceProjekt\Medevio\80 Pacienti\ ├── sync_patients_to_mysql.py (upraveno — multithreading) ├── bulk_set_removed.py (existující — problém s logikou) ├── check_sync_counts.py (NEW) ├── check_removed_status.py (NEW) ├── analyze_extras.py (NEW) ├── list_extras.py (NEW) ├── stats_user_id.py (NEW) ├── check_vymetalova.py (NEW) ├── debug_vymetalova.py (NEW) ├── check_lekare_vzp.py (NEW) ├── check_lekare_vzp_test.py (NEW) └── vzp_output.txt (output z VZP dotazů) ``` --- **Zpracoval:** Claude Code **Poslední update:** 2026-05-15 16:00 CET