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:
@@ -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' ', ' ', 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()
|
||||
Reference in New Issue
Block a user