# KdoJeLékař — poznámky k vývoji ## Cíl Zjistit pro pacienty z Medicus DB, kdo je jejich registrující **praktický lékař (001)**, **gynekolog (002)** a **stomatolog (014)** — dotazem na VZP B2B portál. --- ## Stav k 29. 4. 2026 — hotovo - Certifikát ✅, tabulky ✅, produkční skript ✅ - Připraveno ke spuštění — přepnout `TEST_MODE = False` --- ## Soubory v tomto adresáři | Soubor | Popis | |--------|-------| | `kdojelekar_tydenni.py` | Produkční skript — batch všech pacientů, ukládá do MySQL | | `_test_temp.py` | Testovací skript — dotaz na jedno RC, výpis XML + parsovaný výsledek | | `_test_no_odb.py` | Test bez filtru odborností — sloužil k ověření struktury odpovědi | --- ## Certifikát **`u:\ordinaceprojekt\Insurance\Certificates\picka.pfx`** / heslo **`Vlado7309208104+`** Ověřeno 29. 4. 2026 (HTTP 200). Stejný certifikát používá i `StavPojisteni\zkontroluj_a_odesli_zlomy.py`. --- ## VZP B2B služba: `RegistracePojistencePZSB2B` ### Endpoint (produkce) ``` https://prod.b2b.vzp.cz/B2BProxy/HttpProxy/RegistracePojistencePZSB2B ``` ### Autentizace mTLS — klientský certifikát `.pfx`, stejný mechanismus jako u `stavPojisteniB2B`. ### Struktura odpovědi Pro každou odbornost kde má pacient lékaře vrátí jeden `` element. Pokud lékař není, VZP element vynechá — skript ukládá placeholder řádek s `ma_lekare=0`. | XML tag | Uloženo jako | Popis | |---------|-------------|-------| | `ICZ` | `ICZ` | IČZ zdravotnického zařízení | | `ICP` | `ICP` | IČP lékaře | | `nazevICP` | `nazev_lekare` | Název pracoviště | | `nazevSZZ` | `nazev_zzz` | Jméno lékaře | | `zdravotniPojistovna/kod` | `poj_kod` | Kód pojišťovny pacienta | | `zdravotniPojistovna/zkratka` | `poj_zkratka` | Zkratka pojišťovny | | `odbornost/kod` | `kod_odbornosti` | Kód odbornosti (001/002/014) | | `datumRegistrace` | `datum_registrace` | Kdy pacient podepsal registraci | | `datumZahajeni` | `datum_zahajeni` | Od kdy registrace platí u VZP | | `datumUkonceni` | `datum_ukonceni` | Do kdy (3000-01-01 = bez konce) | | `stavVyrizeniPozadavku` | `stav_vyrizeni` | Stavový kód odpovědi VZP | **Poznámka k parsování:** VZP vrací pro každý nalezený záznam dva `` elementy — vnější (s ICZ/ICP/jménem) a vnořený subelement (jen kód+název). Parser používá `findall(".//seznamOdbornosti/odbornost")` který zachytí jen vnější. --- ## MySQL tabulky ### `vzp_registrace_lekari` Jeden řádek na `(rc, k_datu, kod_odbornosti)`. UNIQUE klíč = `(rc, k_datu, kod_odbornosti)`. Historie se hromadí — každý týdenní běh přidá nové řádky. ### `vzp_registrace_raw` Jeden řádek na `(rc, k_datu)` — celé raw XML odpovědi. Slouží k případnému přepočtu bez opakování API dotazů. UNIQUE klíč = `(rc, k_datu)`. --- ## Produkční skript `kdojelekar_tydenni.py` ### Konfigurace (začátek souboru) | Proměnná | Výchozí | Popis | |----------|---------|-------| | `API_PAUSE` | `2` | Sekundy mezi VZP dotazy | | `TEST_MODE` | `True` | False = produkční běh | | `ODBORNOSTI` | `["001","002","014"]` | Dotazované odbornosti | ### Logika 1. Načte aktivně registrované pacienty z Medicus (přesný select dle SELECTS.md, IČP 09305001) 2. V produkčním běhu přeskočí pacienty, kteří už mají záznam v `vzp_registrace_raw` pro dnešní datum — **resumovatelný běh** 3. Pro každého pacienta zavolá VZP B2B, uloží raw XML + parsované záznamy 4. Placeholdery pro odbornosti bez lékaře ukládá s `ma_lekare=0` ### Knihovny - `Knihovny/vzpb2b_client.py` → metody `registrace_lekare()` a `parse_registrace_lekare()` - `Knihovny/medicus_db.py` → `get_active_registered_patients()` (opraveno 29. 4. 2026) - `Knihovny/mysql_db.py` → `connect_mysql()` --- ## Plán dalšího postupu 1. ~~Certifikát~~ — vyřešeno, `picka.pfx` / `Vlado7309208104+` 2. ~~Ověřit funkčnost~~ — hotovo, HTTP 200 s daty 3. ~~Produkční skript~~ — hotovo, `kdojelekar_tydenni.py` 4. ~~MySQL tabulky~~ — hotovo, `vzp_registrace_lekari` + `vzp_registrace_raw` 5. Naplánovat týdenní spouštění (Windows Task Scheduler nebo Claude schedule) 6. Zvážit detekci změn lékaře (analogie zlomů u StavPojisteni) — zatím není v plánu