Přidán list ED_PODANI + ED_PODANI_DATA do faktury_report.py; doplněny poznámky o eDávkách

- 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>
This commit is contained in:
2026-03-30 07:42:46 +02:00
parent 8497223ebb
commit 4f586f4b57
9 changed files with 1175 additions and 1 deletions
@@ -0,0 +1,68 @@
# -*- coding: utf-8 -*-
import sys, io, base64, re
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace')
import fdb
conn = fdb.connect(
dsn=r'localhost:c:\medicus 3\data\medicus.fdb',
user='SYSDBA', password='masterkey', charset='win1250'
)
cur = conn.cursor()
# Nacti poslednich 5 PORTAL zaznamu s DATA
cur.execute("""
SELECT FIRST 5 ID, ODESLANO, IDFAK, ID_PODANI, DATA
FROM PORTAL
WHERE DATA IS NOT NULL
ORDER BY ID DESC
""")
rows = cur.fetchall()
for row in rows:
pid, odeslano, idfak, id_podani, data = row
print(f"\n{'='*70}")
print(f"PORTAL.ID={pid} ODESLANO={odeslano} IDFAK={idfak} ID_PODANI={id_podani}")
if data is None:
print("DATA: NULL")
continue
# data je string (win1250)
if isinstance(data, bytes):
data = data.decode('win1250', errors='replace')
# Parsuj XML obalku
print(f"DATA (prvnich 300 zn): {data[:300]}")
# Najdi BASE64 obsah uvnitr <Soubor ...>...</Soubor>
m = re.search(r'<Soubor[^>]*Format="BASE64"[^>]*>(.*?)</Soubor>', data, re.DOTALL)
if m:
b64_raw = m.group(1).strip()
# Dekoduj
try:
b64_clean = re.sub(r'\s+', '', b64_raw)
# Padding
b64_clean += '=' * (4 - len(b64_clean) % 4)
html_bytes = base64.b64decode(b64_clean)
html = html_bytes.decode('iso-8859-2', errors='replace')
# Extrahuj text
text = re.sub(r'<!--.*?-->', '', html, flags=re.DOTALL)
text = re.sub(r'<script[^>]*>.*?</script>', '', text, flags=re.DOTALL)
text = re.sub(r'<style[^>]*>.*?</style>', '', text, flags=re.DOTALL)
text = re.sub(r'<[^>]+>', ' ', text)
text = re.sub(r'&nbsp;', ' ', text)
text = re.sub(r'&amp;', '&', text)
text = re.sub(r'\s+', ' ', text).strip()
print(f"\nDEKÓDOVANÝ HTML protokol:")
print(text[:2000])
except Exception as e:
print(f"Chyba dekódování: {e}")
else:
# Zkus plain text odpoved (ne BASE64)
m2 = re.search(r'<Soubor[^>]*>(.*?)</Soubor>', data, re.DOTALL)
if m2:
print(f"\nObsah Soubor (plain): {m2.group(1)[:500]}")
conn.close()