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>
103 lines
3.0 KiB
Python
103 lines
3.0 KiB
Python
# -*- coding: utf-8 -*-
|
||
import sys, io
|
||
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()
|
||
|
||
print("=" * 60)
|
||
print("1. Sloupce HPN")
|
||
print("=" * 60)
|
||
cur.execute("""
|
||
SELECT rf.RDB$FIELD_NAME
|
||
FROM RDB$RELATION_FIELDS rf
|
||
WHERE rf.RDB$RELATION_NAME = 'HPN'
|
||
ORDER BY rf.RDB$FIELD_POSITION
|
||
""")
|
||
col_names = [r[0].strip() for r in cur.fetchall()]
|
||
print(f" Sloupce: {col_names}")
|
||
|
||
print()
|
||
print("=" * 60)
|
||
print("2. Počet záznamů a max datum")
|
||
print("=" * 60)
|
||
cur.execute("SELECT COUNT(*) FROM HPN")
|
||
print(f" Celkem: {cur.fetchone()[0]} záznamů")
|
||
|
||
# Najdi datumove sloupce
|
||
date_candidates = [c for c in col_names if any(x in c for x in ['DAT', 'ODE', 'VYT', 'CAS'])]
|
||
print(f" Datumové sloupce: {date_candidates}")
|
||
for dc in date_candidates[:3]:
|
||
try:
|
||
cur.execute(f"SELECT MIN({dc}), MAX({dc}) FROM HPN")
|
||
mn, mx = cur.fetchone()
|
||
print(f" {dc}: {mn} .. {mx}")
|
||
except Exception as e:
|
||
print(f" {dc}: {e}")
|
||
|
||
print()
|
||
print("=" * 60)
|
||
print("3. Posledních 20 záznamů (bez BLOBů)")
|
||
print("=" * 60)
|
||
|
||
# Zjisti BLOB sloupce
|
||
cur.execute("""
|
||
SELECT rf.RDB$FIELD_NAME
|
||
FROM RDB$RELATION_FIELDS rf
|
||
JOIN RDB$FIELDS f ON f.RDB$FIELD_NAME = rf.RDB$FIELD_SOURCE
|
||
WHERE rf.RDB$RELATION_NAME = 'HPN'
|
||
AND f.RDB$FIELD_TYPE = 261
|
||
""")
|
||
blob_cols = {r[0].strip() for r in cur.fetchall()}
|
||
print(f" BLOB sloupce: {blob_cols}")
|
||
|
||
safe_cols = [c for c in col_names if c not in blob_cols]
|
||
|
||
# Zjisti razeni - zkus VYTVORENO nebo ODESLANO nebo ID
|
||
order_col = next((c for c in ['VYTVORENO', 'ODESLANO', 'DATUM', 'ID'] if c in col_names), col_names[0])
|
||
|
||
cur.execute(f"SELECT FIRST 20 {', '.join(safe_cols)} FROM HPN ORDER BY {order_col} DESC")
|
||
rows = cur.fetchall()
|
||
for row in rows:
|
||
d = dict(zip(safe_cols, row))
|
||
print(f" {d}")
|
||
|
||
print()
|
||
print("=" * 60)
|
||
print("4. Záznamy od 2026-02-01")
|
||
print("=" * 60)
|
||
for dc in date_candidates[:2]:
|
||
try:
|
||
cur.execute(f"SELECT COUNT(*) FROM HPN WHERE {dc} >= '2026-02-01'")
|
||
cnt = cur.fetchone()[0]
|
||
if cnt > 0:
|
||
print(f" {dc} >= 2026-02-01: {cnt} záznamů")
|
||
cur.execute(f"SELECT FIRST 5 {', '.join(safe_cols)} FROM HPN WHERE {dc} >= '2026-02-01' ORDER BY {dc} DESC")
|
||
for row in cur.fetchall():
|
||
print(f" {dict(zip(safe_cols, row))}")
|
||
break
|
||
except Exception as e:
|
||
print(f" {dc}: {e}")
|
||
|
||
print()
|
||
print("=" * 60)
|
||
print("5. HPN_NOTIFIKACE_DETAIL – sloupce a ukazka")
|
||
print("=" * 60)
|
||
cur.execute("""
|
||
SELECT rf.RDB$FIELD_NAME
|
||
FROM RDB$RELATION_FIELDS rf
|
||
WHERE rf.RDB$RELATION_NAME = 'HPN_NOTIFIKACE_DETAIL'
|
||
ORDER BY rf.RDB$FIELD_POSITION
|
||
""")
|
||
hnd_cols = [r[0].strip() for r in cur.fetchall()]
|
||
print(f" Sloupce: {hnd_cols}")
|
||
cur.execute("SELECT COUNT(*) FROM HPN_NOTIFIKACE_DETAIL")
|
||
print(f" Záznamy: {cur.fetchone()[0]}")
|
||
|
||
conn.close()
|
||
print("\nHotovo.")
|