4f586f4b57
- 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>
69 lines
2.2 KiB
Python
69 lines
2.2 KiB
Python
# -*- 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' ', ' ', text)
|
|
text = re.sub(r'&', '&', 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()
|