Přejmenování Insurance/KdoJeLékař → KdoJeLekar (bez diakritiky)
Adresář přejmenován bez diakritiky kvůli problémům s kódováním cesty. Historie zachována přes git mv. Nadpis v NOTES.md sjednocen s názvem. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,108 @@
|
||||
# KdoJeLekar — 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 `<odbornost>` 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 `<odbornost>` 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
|
||||
Reference in New Issue
Block a user