Files
ordinaceprojekt/Insurance/FinalReconcilliation/NOTES.md
T
Vladimir Buzalka 9b6f89f437 notebookvb
2026-06-16 10:21:19 +02:00

137 lines
5.4 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.
# 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í.