# Fakturace a dávky – poznámky pro Clauda ## Přehled tabulek ### FAK – faktury pojišťovnám - **844 záznamů** (k 2026-03-28) - Primární klíč: `ID` | Sloupec | Popis | |---|---| | `ID` | primární klíč | | `CISFAK` | číslo faktury (10 znaků) | | `POJ` | pojišťovna (3 znaky, např. 111=VZP, 205=ČPZP, 207=OZP) | | `ICZ`, `ICZ1` | IČZ ordinace | | `IDICZ` | FK → ICZ.IDICZ (jen jedna ordinace, neřešit) | | `PORCISLO` | pořadové číslo | | `DATUMOD`, `DATUMDO` | období faktury (od–do) | | `DATVYS` | datum vystavení | | `DATODE` | datum odeslání | | `OBDOB` | období (5 znaků, např. "20260") | | `VYKONY` | částka za výkony (Kč) | | `KAPITACE` | kapitační platba (Kč) | | `ZALOHA` | záloha | | `CENA` | celková cena faktury (Kč) | | `DRUH` | druh faktury (např. "konečná") | | `TYP` | typ (1 znak) | | `ROK` | rok | | `SPLAT` | datum splatnosti | | `PROPLACENO` | datum proplacení (NULL = nezaplaceno) | | `ZAPLACENO` | zaplacená částka | | `ZUM` | ? | | `HOSPAUSAL` | hospitalizační/paušální? | | `FDAVKA` | BLOB – odkaz na dávku | | `KAPDETAIL`, `AGRDETAIL` | BLOBy – detaily kapitace/agregace | | `NAZFAK`, `POZFAK`, `OBDFAK` | název, poznámka, období faktury (texty) | | `ICO`, `BANKA`, `UCET` | IČO, banka, účet | | `ODJMENO/ULICE/MISTO/PSC` | adresa odesílatele | | `PLNAZEV/ULICE/MISTO/PSC` | adresa plátce (pojišťovny) | | `DRUHPOJ` | druh pojištění | --- ### FAKDET – finanční detail faktury - **1021 záznamů** - Vazba: `IDFAK` → FAK.ID - Typicky 1–2 řádky na fakturu (breakdown podle lékaře/IDUZI) | Sloupec | Popis | |---|---| | `ID` | primární klíč | | `IDFAK` | FK → FAK.ID | | `ICP` | IČP ordinace (např. 09305001) | | `ODB` | odbornost (001 = praktický lékař) | | `IDUZI` | FK → UZIVATEL.IDUZI – který lékař | | `CENAVYK` | výkony (Kč) | | `CENALEC` | léky (Kč) | | `CENAKAP` | kapitace (Kč) | **Poznámka:** IDUZI=0 = systémový záznam (kapitace bez konkrétního lékaře). --- ### FAKDAV – dávky zahrnuté ve faktuře - **1296 záznamů** - Vazba: `IDFAK` → FAK.ID | Sloupec | Popis | |---|---| | `ID` | primární klíč | | `IDFAK` | FK → FAK.ID | | `CISDAV` | číslo dávky | | `DRUH` | druh dávky | | `CENA` | celková cena dávky | | `CENAVYK` | výkony | | `CENALEC` | léky | | `CENAPAU` | paušál | | `ODB` | odbornost | | `ICP` | IČP | --- ### PORTAL – elektronické podání pojišťovně - **180 záznamů** - Vazba: `IDFAK` → FAK.ID | Sloupec | Popis | |---|---| | `ID` | primární klíč | | `IDFAK` | FK → FAK.ID | | `ODESLANO` | timestamp odeslání | | `DATA`, `KDAVKA`, `FDAVKA` | BLOBy – pravděpodobně XML dávky | | `CHYBA` | příznak chyby (1 znak) | | `STAV` | stav podání (smallint) | | `ID_PODANI` | ID podání u pojišťovny (32 znaků, UUID) | | `IDPODANI` | interní ID podání | | `IDCERT` | certifikát použitý pro podání | | `DAVKA_ROK`, `DAVKA_DISK`, `DAVKA_IDICZ` | metadata dávky | | `BB_DAVKA`, `BB_FAKTURA` | ? | | `DAVKA_DATUMOD`, `DAVKA_DATUMDO` | období dávky | | `DAVKA_CASTKA` | částka dávky | --- ## Schéma vazeb ``` FAK (faktura) ├── FAKDET (IDFAK → FAK.ID) – finanční breakdown podle lékaře ├── FAKDAV (IDFAK → FAK.ID) – seznam dávek ve faktuře ├── PORTAL (IDFAK → FAK.ID) – viz níže, IDFAK bývá NULL └── ICZ (IDICZ → ICZ.IDICZ) – ordinace (jen jedna, neřešit) ``` --- ## UZIVATEL – lékaři a uživatelé | IDUZI | Příjmení | Jméno | Zkratka | Aktivní | |---|---|---|---|---| | 2 | Jourová | Jana | JOU | F (neaktivní) | | 3 | Sestra | — | SES | F (neaktivní) | | 4 | Buzalková | Michaela | MBU | T – **lékařka, manželka** | | 5 | Ševčíková | Ivana | ISE | T | | 6 | Buzalka | Vladimír | VBU | T – **uživatel (já)** | --- ## Ukázkové záznamy ### FAK ID=856 (poslední) - Faktura č. 260026, pojišťovna **205 (ČPZP)**, prosinec 2025 - Vystavena: 2026-03-12, druh: konečná - VYKONY: 2 528,99 Kč, KAPITACE: 0, CENA: **2 528,99 Kč** - ZAPLACENO: NULL, PROPLACENO: NULL FAKDET k FAK ID=856: | ID | IDUZI | CENAVYK | CENALEC | CENAKAP | |---|---|---|---|---| | 1034 | 0 (systém) | 0 | 0 | 1 902,54 | | 1035 | 4 (Buzalková) | 2 528,99 | 0 | 0 | ### FAK ID=855 (předposlední) - Faktura č. 260026, pojišťovna **207 (OZP)**, prosinec 2025 - Vystavena: 2026-03-01, druh: konečná - VYKONY: 85 Kč, KAPITACE: 0, CENA: **85 Kč** - ZAPLACENO: NULL, PROPLACENO: NULL FAKDET k FAK ID=855: | ID | IDUZI | CENAVYK | CENALEC | CENAKAP | |---|---|---|---|---| | 1033 | 6 (Buzalka Vladimír) | 85 | 0 | 0 | --- ## PORTAL – upřesnění (zjištěno 2026-03-28) PORTAL **nesouvisí s fakturací**. Je to samostatná agenda – evidence **registračních dávek** odeslaných pojišťovně. ### Co PORTAL skutečně je - Medicus přes PORTAL odesílá pojišťovně dávky s přihlášením/odhlášením pacientů k lékaři (MUDr. Buzalková jako praktický lékař) - Bez peněz – čistě administrativní agenda registrací - **IDFAK = NULL** u všech registračních podání (není vazba na fakturu) ### Klíčové sloupce | Sloupec | Popis | |---|---| | `KDAVKA` | odeslaná dávka – pevný formát (hlavička + řádky I = pacienti, RC, datum) | | `DATA` | odpověď pojišťovny jako XML (`100` = OK) | | `ID_PODANI` | ID přidělené pojišťovnou (např. `D01F260118593316.D01`) | | `DAVKA_DISK` | číslo dávky v roce (sekvenční) | | `DAVKA_ROK` | rok dávky | | `DAVKA_DATUMOD/DO` | období registrací v dávce | | `CHYBA` | F = bez chyby | ### Ukázka KDAVKA (hlavička dávky) ``` DP80093050000900202506 15 1 0 0.00180:6.2.46 H21109305001 179202506001 I 1Příjmení Jméno RC datum_registrace I 2... ``` ### Ukázka DATA (odpověď pojišťovny) ```xml Přijetí registrací proběhlo úspěšně 100 D01F260118593316.D01 ``` --- ## PORTAL – dva typy dávek ### Typ 1 – Registrační dávka (DP80) - KDAVKA začíná `DP80` - **IDFAK = NULL** – bez vazby na fakturu - Bez peněz (`DAVKA_CASTKA` = NULL) - Přihlašuje/odhlašuje pacienty k lékaři (MUDr. Buzalková) - Řádky `I` = pacient (RC, datum registrace) ### Typ 2 – Výkonová dávka (DP98) - KDAVKA začíná `DP98` - **IDFAK = ID faktury** – napojeno na FAK - Má peníze (`DAVKA_CASTKA`, např. 15 452,91 Kč) - `STAV = 10` (registrační mají NULL) - Obsahuje výkony vykázané pojišťovně za dané období **Struktura výkonové dávky (KDAVKA):** ``` DP98... – hlavička dávky (IČP, rok, měsíc, disk, počet případů, částka) A ... – ambulantní případ (RC pacienta, diagnóza) V ... – výkon (datum, kód výkonu, body) Z ... – ZULP (zvlášť účtovaný léčivý přípravek) L ... – lékový řádek (kód, množství, cena) DP05... – druhá část dávky (prevence / jiný typ) P ... – preventivní prohlídka ``` **Odpověď pojišťovny pro výkonovou dávku:** ```xml Přijetí faktury proběhlo úspěšně 100 ``` --- ## Poznámky - Faktury jsou vystavovány zvlášť pro každou pojišťovnu - FAKDET má řádky zvlášť pro každého lékaře (IDUZI) - IDUZI=0 v FAKDET = systémový záznam pro kapitaci - Kapitace se v FAK.KAPITACE neukazuje (je 0), ale v FAKDET.CENAKAP ano – nutno ověřit - PORTAL = registrační dávky, nesouvisí s fakturací, IDFAK bývá NULL --- ## eDávky – elektronické odesílání dávek pojišťovnám (zjištěno 2026-03-29) ### Přehled tabulek Modul eDávky v Medicusu používá tabulky s prefixem `ED_`: | Tabulka | Záznamy | Popis | |---|---|---| | `ED_BOOKOFSUBMISSIONS` | 998 | Hlavní tabulka – Kniha podání (od 2016) | | `ED_BOOKOFSUBMISSIONATTACH` | 0 | Přílohy k podáním (zatím nevyužito) | | `ED_MAILBOXMESSAGE` | 0 | Schránka zpráv od pojišťoven (zatím prázdná) | | `ED_STORAGE` | 5 | Konfigurace – certifikáty a přihlašovací údaje | ### Jak jsme tabulku našli Přes Firebird trace log – při otevření okna eDávky v Medicusu se nejčastěji dotazuje na `ED_BOOKOFSUBMISSIONS` (45x) a `ED_MAILBOXMESSAGE` (4990x). ### PORTAL vs ED_BOOKOFSUBMISSIONS - **PORTAL** (180 záznamů, max 2026-01-27) = starý systém podávání dávek - **ED_BOOKOFSUBMISSIONS** (998 záznamů, od 2016) = nový systém (přechod ~únor 2026) - Nepřekrývají se – žádný záznam není v obou (různá ID_PODANI/SUBMISSIONID) - PORTAL má data od 2014, ED_BOOKOFSUBMISSIONS od 2016 (oba systémy běžely paralelně) --- ### ED_BOOKOFSUBMISSIONS – hlavní tabulka Knihy podání **Sloupce:** | Sloupec | Popis | |---|---| | `ID` | primární klíč | | `CREATED` | datum vytvoření | | `SENTDATE` | datum odeslání pojišťovně | | `CREATOR` | jméno autora (např. "Buzalková Michaela MUDr.") | | `HCPCODE` | IČZ ordinace (09305000) | | `HCPPERSONNAME` | jméno lékaře | | `HICCODE` | kód pojišťovny (111, 201, 205, 207, 209, 211...) | | `INVOICENUMBER` | číslo faktury (např. 0000260020) – NULL pro reg. dávky | | `PERIODFROM` / `PERIODTO` | období dávky | | `REQUESTTYPE` | typ: **0** = registrační (Reg. listy), **1** = výkonová s fakturou | | `STATE` | stav podání (0 = odesláno OK) | | `SUBMISSIONID` | podací číslo přidělené pojišťovnou (např. 59135047) | | `TOTALSUM` | celková částka (0 pro reg. dávky) | | `UNIQUEID` | UUID záznamu | | `USERDESCRIPTION` | popis (zobrazuje se ve sloupci "Zprávy") | | `REQUEST` | XML žádosti odeslané pojišťovně (BLOB) | | `SERVERRESPONSE` | odpověď pojišťovny (BLOB, bytes, kódování iso-8859-2) | | `FDAVKACONTENT` | obsah FDAVKA (BLOB) | | `KDAVKACONTENT` | obsah KDAVKA (BLOB) | | `PROTOCOL` | protokol (BLOB) | **Pojišťovny v datech:** 111 (VZP), 201 (VoZP), 205 (ČPZP), 207 (OZP), 209 (ZPŠ), 211 (ZPMV) ### Kódování pojišťoven (správné!) - **111** = VZP (Všeobecná zdravotní pojišťovna) - **201** = VoZP (Vojenská zdravotní pojišťovna) - **205** = ČPZP (Česká průmyslová zdravotní pojišťovna) - **207** = OZP (Oborová zdravotní pojišťovna) - **209** = ZPŠ (Zdravotní pojišťovna Škoda) - **211** = ZPMV (Zdravotní pojišťovna ministerstva vnitra) --- ### ED_STORAGE – konfigurace certifikátů a přihlašovacích údajů Sloupce: `ID`, `NAME`, `VALUEB` (BLOB XML), `IDUZI` **Záznamy:** - `ServerSettingsXml` (per uživatel, IDUZI=None/2/4/6) – XML s certifikáty pro každou pojišťovnu - `LastMessagesDownloadTime` (IDUZI=None) – datum posledního stažení zpráv **Struktura ServerSettingsXml:** ```xml ``` **Certifikát Buzalky Vladimíra (IDUZI=6):** - Vydavatel: I.CA EU Qualified CA2/RSA 06/2022 (První certifikační autorita, a.s.) - SerialNumber: `0247068517B0049E2E` - Platí pro pojišťovny: 201, 205, 207, 209, 213, 217, 228 --- ### Formát REQUEST XML – registrační dávka (REQUESTTYPE=0) ```xml RegistrationCards None 2026-03-01T00:00:00.000 2026-03-31T00:00:00.000 0 09305000 09305000 68366370 MUDr. Buzalka Vladimír 111 Všeobecná zdravotní pojišťovna ČR 0900 0900 1 8 DP80 0.00 2026 3 0 2 ``` ### Formát REQUEST XML – výkonová dávka s fakturou (REQUESTTYPE=1) ```xml HealthCareBilling 0000260026 HealthCareInvoice 2026-03-01T00:00:00.000 2026-03-01T00:00:00.000 2026-03-31T00:00:00.000 2025-12-01T00:00:00.000 2025-12-31T00:00:00.000 85 09305000 68366370 2800046620 000000 2010 Praktický lékař pro dospělé Lovosická 440/40 Praha 9-Prosek 19000 MUDr. Buzalková Michaela 207 Ročkotova 1225/1 Praha 4 140 21 0900 51 34 DP05 2025 12 85 1 ``` **Poznámka k diakritice v REQUEST:** Medicus ukládá XML v UTF-16, ale česká diakritika v polích jako HcpPersonName, HicName apod. bývá uložena bez háčků/čárek (bug Medicusu při tvorbě XML). Toto není chyba dekódování. ### Formát SERVERRESPONSE (odpověď pojišťovny) - Kódování: **iso-8859-2** (bytes) - Struktura: XML `textPKCS7` - `PZP_IdPodani` = přidělené podací číslo - `PZP_Chyba="0"` = bez chyby - Odpověď je podepsána pojišťovnou (PKCS7) --- ### Plán: skript pro automatické odeslání žádosti o seznam registrovaných ### Portály pojišťoven – 3 skupiny #### Skupina 1 – Společný portál (201, 205, 207, 209, 213, 217, 228) - Jeden společný portál pro všechny tyto pojišťovny - Autentizace a podepisování: **kvalifikovaný certifikát I.CA EU Qualified CA2/RSA 06/2022** - SerialNumber (Buzalka): `0247068517B0049E2E` - Vydavatel: První certifikační autorita, a.s. #### Skupina 2 – VZP (111) – vlastní portál - VZP má **samostatný portál** (`UseAlternativePortal="true"` v konfiguraci) - Podepisování: **komerční certifikát I.CA Public CA/RSA 06/2022** (nižší stupeň než kvalifikovaný) - SerialNumber: `01DE0F46B713505F1F` - Autentizace vůči portálu: **certifikát Komerční banky (DCS CA KB)** - SerialNumber: `46E67A` #### Skupina 3 – ZPMV (211) – samostatní exoti - Žádný certifikát, přihlašování **heslem** - Konfigurace: PIN, Password, Email (uloženo v plaintextu v ED_STORAGE) - Email: `ordinace@buzalkova.cz` ### Formáty odpovědí v PORTAL.DATA (historické) Různé pojišťovny vracely různé formáty: - **ČPZP/ZPMV** (D01 portál): XML `100D01F...` - **OZP a ostatní** (starý portál): XML `HTML protokol` - HTML protokol je v iso-8859-2, obsahuje tabulku s detaily dávky ### Kódování BLOBů v ED_BOOKOFSUBMISSIONS | Sloupec | Kódování | Poznámka | |---|---|---| | `KDAVKACONTENT` | CP1250 | fdb vrací str přes win1250 spojení – použít přímo | | `REQUEST` | ASCII/UTF-8 nebo UTF-16 | Detekovat podle BOM: `FF FE`/`FE FF` → utf-16, začíná `<` → utf-8 | | `SERVERRESPONSE` | iso-8859-2 | latin-1 re-encoding → decode iso-8859-2 | | `PROTOCOL` | iso-8859-2 | latin-1 re-encoding → decode iso-8859-2 | **Důležité:** Pro re-encoding str→bytes vždy používat `latin-1` (ne `cp1250`), protože latin-1 zachová všechny bajty 0–255 beze změny včetně null bajtů. Pro utf-16 nikdy nezkoušet decode bez ověření BOM – bez BOM Python tiše vrátí čínské znaky místo chyby. **Co potřebujeme ještě zjistit:** - URL endpointů jednotlivých portálů (zachytit přes síťový trace) - Jak přesně se REQUEST podepisuje certifikátem (PKCS12 / Windows certificate store) **Co už máme:** - Formát REQUEST XML (viz výše) - Certifikáty a přihlašovací údaje z ED_STORAGE - Strukturu odpovědi pojišťovny - Rozdělení pojišťoven do 3 skupin podle způsobu přístupu ## Kódování KDAVKA/FDAVKA – důležité! Dávkové soubory (KDAVKA, FDAVKA) jsou uloženy v **CP852** (DOS Latin-2, prahistorické kódování). fdb je čte přes connection charset win1250 a vrací je jako Python `str` (špatně dekódované). **Správný postup dekódování:** ```python # fdb vrátil string dekódovaný jako win1250 – musíme to zvrátit raw_bytes = s.encode('cp1250', errors='replace') spravny_text = raw_bytes.decode('cp852', errors='replace') ``` - **KDAVKA, FDAVKA** → cp852 - **DATA** (XML odpověď pojišťovny) → cp1250 (win1250), fdb dekóduje správně