# FinalReconcilliation — sledování stavu registrovaných pacientů ## Cíl Jednoznačně roztřídit pacienty **registrované v Medicusu** podle **skutečnosti ověřené u pojišťovny**: kdo je k danému dni jejich registrující **praktik (odbornost 001)** dle VZP B2B. - praktik = **Buzalková (IČP 09305001)** → pacient **je** v zakoupeném souboru pacientů (OK) - praktik = kdokoli jiný / žádný → **„NEBYL V ZAKOUPENÉM SOUBORU PACIENTŮ"** „Registrovaný v Medicusu" je jen stav v software; tohle ověřuje realitu u pojišťovny. ## Úložiště — MongoDB | | | |---|---| | Server | `mongodb://192.168.1.76:27017` (stejný stroj jako MySQL `medevio`) | | Databáze | `ordinace` | | Kolekce | `registrovani_tracking` | | Klíč | `_id` = rodné číslo (1 dokument na pacienta) | ### Schéma dokumentu ```json { "_id": "8202...", "rc": "8202...", "prijmeni": "...", "jmeno": "...", "pojistovna": {"kod": "111", "zkratka": "VZP"}, "vychozi_datum": "2025-01-01", "aktualni": { ...snímek... }, "historie": [ { ...snímek..., "zmena": "výchozí snímek" } ], "created_at": ISODate, "updated_at": ISODate } ``` Snímek (`aktualni` i položky `historie[]`): `k_datu, kategorie, kategorie_popis, v_zakoupenem_souboru (bool), flag, flag_duvod, praktik_nazev, praktik_icz, praktik_icp, praktik_od, datum_zahajeni, datum_ukonceni` - **`praktik_nazev` / `praktik_icz` / `praktik_icp`** = KDO je registrující praktik dle VZP (u `OK_BUZALKOVA` Buzalková, u `JINY_PRAKTIK` cizí ZZZ). - **`praktik_od`** (= `datum_zahajeni`) = OD KDY je u tohoto praktika registrován. - **`flag_duvod`** = čitelný důvod mimo soubor, např. `"jiný praktik: MOJE AMBULANCE A.S. (IČZ 91777000) od 2014-01-01"`. ### Kategorie (plné podkategorie) | kategorie | význam | v souboru | |---|---|---| | `OK_BUZALKOVA` | praktik 001 = Buzalková (IČP 09305001) | ✅ ano | | `JINY_PRAKTIK` | praktik 001 je jiné ZZZ | 🚩 ne | | `BEZ_PRAKTIKA_VZP` | u VZP záznam (jiná odb.), ale praktik 001 ne | 🚩 ne | | `BEZ_ZAZNAMU_VZP` | VZP nevrátila žádný záznam (jiná pojišťovna / neplatné RČ / zaniklé pojištění) | 🚩 ne | ## Stav k výchozímu snímku 1.1.2025 Populace = 1688 pacientů registrovaných v Medicusu k 1.1.2025 (= RČ v `vzp_registrace_raw` pro to datum). | kategorie | počet | |---|---:| | OK_BUZALKOVA | 1537 | | JINY_PRAKTIK | 53 | | BEZ_ZAZNAMU_VZP | 50 | | BEZ_PRAKTIKA_VZP | 48 | | **v souboru / mimo** | **1537 / 151** | ## Skript `seed_tracking.py` Zdroj klasifikace = MySQL `medevio` tabulky `vzp_registrace_raw` + `vzp_registrace_lekari` (plní je skripty z `Insurance/KdoJeLekar/`). ``` python seed_tracking.py # výchozí snímek k 2025-01-01 python seed_tracking.py 2026-05-02 # aplikuje další snímek (appendne změny do historie) ``` Funkce `apply_snapshot(coll, mysql, k_datu)`: - nový pacient → vloží dokument s historií `["výchozí snímek"]` - existující pacient → při změně `kategorie` nebo `praktik_icp` appendne položku do `historie[]` a aktualizuje `aktualni`; jinak jen `updated_at` → tím se **postupně trackují změny stavu** mezi jednotlivými běhy. ### Doplnění jmen (BEZ_ZAZNAMU_VZP) 50 pacientů bez žádného VZP záznamu nemá jméno v MySQL `vzp_registrace_lekari`. Jména + pojišťovnu jim doplňujeme z Medicus Firebird (tabulka `kar`) — uloženo i pole `medicus_poj`. Pozn.: kdo má `medicus_poj=111` (VZP), ale je `BEZ_ZAZNAMU_VZP`, je reálně podezřelý (zaniklé pojištění/úmrtí); 201/205/207/211 jsou prostě jiné pojišťovny. ## Reconciliation workflow — statusy Zakoupený soubor (příloha smlouvy) = `Inputs/2025-01-01 seznam_pacientu_jmeno_rc.csv` (OCR ze skenu; `;`-CSV, UTF-8 BOM; sloupce *Příjmení a jméno; Rodné číslo; Strana; Řádek*). **1712 RČ.** (Opraven 1 OCR překlep RČ: Slavíková Zuzana `8956534235`→`8956039037`.) Každý dokument nese workflow stav: | pole | význam | |---|---| | `status` (int) | aktuální stav workflow | | `status_popis` | název stavu | | `status_datum` | datum platnosti stavu | | `status_historie[]` | postup stavů (`status, status_popis, status_datum, zapsano`) | | `ve_smlouve` (bool) | je pacient v zakoupeném souboru 1712? | | `mimo_vzp_populaci` | true = doplněn ze smlouvy, nebyl ve VZP populaci k 1.1.2025 | ### Stavy | status | popis | datum | skript | |---|---|---|---| | **0** | **Zakoupeno** | 31.12.2024 | `01_zakoupeno.py` | `01_zakoupeno.py` (idempotentní): nastaví status 0 všem 1712 ze smlouvy. - 1678 už v Mongo → status 0 - 34 chybělo (odhlášeni u Buzalkové před předáním) → doplněno z `kar`, `mimo_vzp_populaci=true`, `aktualni.kategorie="ODHLASEN_PRED_PREDANIM"` + `medicus_zruseni` - 10 v Mongo mimo smlouvu → `ve_smlouve=false` (status 0 nedostali) Kolekce po kroku 0: **1722 dokumentů** (1712 ve smlouvě + 10 mimo). ### Reconciliation 1712 (k 1.1.2025) ``` 1712 zakoupeno (status 0) −34 registrace zrušena před 1.1.2025 (mimo_vzp_populaci) ───── 1678 registrovaní v Medicusu k 1.1.2025 ├ 1531 OK Buzalková · 50 jiný praktik · 49 bez záznamu · 48 bez praktika ``` ## Další kroky (workflow) - Definovat status 1, 2, … (např. 1 = ověřeno u VZP / registrovaný u Buzalkové). - Aplikovat snímky z dalších běhů (29.4. a 2.5.2026 v MySQL) → naplní `historie[]`. - Doplnit ověření **stavu pojištění** (`vzp_stav_pojisteni`). - Finální reconciliation Excel + MCP nástroj nad kolekcí.