- faktury_report.py: nový list ED_PODANI (ED_BOOKOFSUBMISSIONS) s přehledem podání pojišťovnám - faktury_report.py: nový list ED_PODANI_DATA s dekódovaným obsahem dávek (KDAVKA, REQUEST XML, odpovědi pojišťoven) - Opraveno kódování: KDAVKA=cp1250, REQUEST detekce BOM (utf-16/utf-8), SERVERRESPONSE/PROTOCOL=iso-8859-2 - Hyperlinky ED_PODANI ↔ ED_PODANI_DATA a Faktura → FAK - FakturaceADavky.md: dokumentace ED_* tabulek, portálů pojišťoven, formátů REQUEST XML - Průzkumné skripty: find_edavky_table, explore_hpn, explore_ed_bookofsubmissions, parse_trace_edavky aj. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
18 KiB
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 (<statuscode>100</statuscode> = 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)
<ekomunikace timestamp="20260127 063105">
<session id="ff59b436-...">
<statusline>Přijetí registrací proběhlo úspěšně</statusline>
<statuscode>100</statuscode>
<idpodani>D01F260118593316.D01</idpodani>
</session>
</ekomunikace>
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:
<statusline>Přijetí faktury proběhlo úspěšně</statusline>
<statuscode>100</statuscode>
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šťovnuLastMessagesDownloadTime(IDUZI=None) – datum posledního stažení zpráv
Struktura ServerSettingsXml:
<Settings>
<PortalZP>
<Portal Code="201">
<SigningCertificate Issuer="..." SerialNumber="..." />
</Portal>
<!-- Code: 201, 205, 207, 209, 212, 213, 217, 228, 333 -->
</PortalZP>
<PortalZPMV>
<!-- Pro ZPMV (211): PIN, Password, Email uloženy v plaintextu! -->
<Portal Code="211" PIN="..." Password="..." Email="ordinace@buzalkova.cz" />
</PortalZPMV>
<PortalVZP>
<!-- Pro VZP (111): SigningCertificate + AuthenticationCertificate -->
<Portal Code="111" UseAlternativePortal="true">
<SigningCertificate Issuer="..." SerialNumber="..." />
<AuthenticationCertificate Issuer="..." SerialNumber="..." />
</Portal>
</PortalVZP>
</Settings>
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 version="1.0" encoding="utf-16"?>
<SubmissionRequest>
<SubmissionType>RegistrationCards</SubmissionType>
<InvoiceType>None</InvoiceType>
<PeriodFrom>2026-03-01T00:00:00.000</PeriodFrom>
<PeriodTo>2026-03-31T00:00:00.000</PeriodTo>
<TotalSum>0</TotalSum>
<HcpCode>09305000</HcpCode> <!-- IČZ ordinace -->
<FICZ>09305000</FICZ>
<HcpOrgNum>68366370</HcpOrgNum> <!-- IČO -->
<HcpPersonName>MUDr. Buzalka Vladimír</HcpPersonName>
<HicCode>111</HicCode> <!-- kód pojišťovny -->
<HicName>Všeobecná zdravotní pojišťovna ČR</HicName>
<HicCity>0900</HicCity>
<FPOB>0900</FPOB>
<VDPOJ>1</VDPOJ>
<InvoiceItems>
<InvoiceItem>
<BatchNumber>8</BatchNumber>
<Type>DP80</Type> <!-- DP80 = registrační dávka -->
<Price>0.00</Price>
<Year>2026</Year>
<Month>3</Month>
<DBODY>0</DBODY>
<DUHR>2</DUHR>
</InvoiceItem>
</InvoiceItems>
</SubmissionRequest>
Formát REQUEST XML – výkonová dávka s fakturou (REQUESTTYPE=1)
<?xml version="1.0" encoding="utf-16"?>
<SubmissionRequest>
<SubmissionType>HealthCareBilling</SubmissionType>
<InvoiceNumber>0000260026</InvoiceNumber>
<InvoiceType>HealthCareInvoice</InvoiceType>
<DateOfIssue>2026-03-01T00:00:00.000</DateOfIssue>
<DateOfDispatch>2026-03-01T00:00:00.000</DateOfDispatch>
<DateOfMaturity>2026-03-31T00:00:00.000</DateOfMaturity>
<PeriodFrom>2025-12-01T00:00:00.000</PeriodFrom>
<PeriodTo>2025-12-31T00:00:00.000</PeriodTo>
<TotalSum>85</TotalSum>
<HcpCode>09305000</HcpCode>
<HcpOrgNum>68366370</HcpOrgNum>
<HcpAccountNumber>2800046620</HcpAccountNumber>
<HcpAccountPrefix>000000</HcpAccountPrefix>
<HcpAccountBankCode>2010</HcpAccountBankCode>
<HcpName>Praktický lékař pro dospělé</HcpName>
<HcpStreet>Lovosická 440/40</HcpStreet>
<HcpCity>Praha 9-Prosek</HcpCity>
<HcpZipCode>19000</HcpZipCode>
<HcpPersonName>MUDr. Buzalková Michaela</HcpPersonName>
<HicCode>207</HicCode>
<HicStreet>Ročkotova 1225/1</HicStreet>
<HicCity>Praha 4</HicCity>
<HicZipCode>140 21</HicZipCode>
<FPOB>0900</FPOB>
<VDPECE>51</VDPECE>
<InvoiceItems>
<InvoiceItem>
<BatchNumber>34</BatchNumber>
<Type>DP05</Type> <!-- DP05 = výkonová dávka -->
<Year>2025</Year>
<Month>12</Month>
<DBODY>85</DBODY>
<DUHR>1</DUHR>
</InvoiceItem>
</InvoiceItems>
</SubmissionRequest>
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
<Komunikace><Data ...><Soubor ...>text</Soubor></Data><Podpis>PKCS7</Podpis></Komunikace> PZP_IdPodani= přidělené podací čísloPZP_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
- SerialNumber:
- Autentizace vůči portálu: certifikát Komerční banky (DCS CA KB)
- SerialNumber:
46E67A
- SerialNumber:
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
<ekomunikace><statuscode>100</statuscode><idpodani>D01F...</idpodani> - OZP a ostatní (starý portál): XML
<Komunikace><Data ...><Soubor Format="BASE64">HTML protokol</Soubor></Data></Komunikace>- 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í:
# 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ě