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,105 @@
# -*- coding: utf-8 -*-
import sys, io, re
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace')
TRACE_FILE = r'c:\Program Files\Firebird\Firebird_2_5_CGM\default_trace.log'
TIME_FROM = '2026-03-29T13:20:00'
TIME_TO = '2026-03-29T13:20:15'
# Hledame dotazy ktere pravdepodobne patri k eDavky oknu:
# - zminka o tabulkach s davkami/podanim na pojistovnu
# - sloupce jako ZP, PODACI, ODESLANO, STAV v kontextu davek
KEYWORDS = [
'EDAVKY', 'EDAVKA', 'DAVKY_POJ', 'REGISTR_POJ',
'PODACI_CISLO', 'PODACI',
'FAKDAV', 'BB_DAVKA', 'BB_FAKTURA',
'STAV_PODANI', 'ID_PODANI',
'DAVKA_ROK', 'DAVKA_DISK', 'DAVKA_CASTKA',
]
# Tabulky ktere NECHCEME (HPN = neschopenky, RECEPT = recepty, atd.)
EXCLUDE_TABLES = ['FROM HPN', 'FROM NES', 'FROM RECEPT', 'FROM CLICKDOC',
'FROM UZIVATEL', 'FROM ZARIZENI', 'FROM ODDEL', 'FROM PRACOVISTE']
print(f"Čtu trace: {TRACE_FILE}")
print(f"Časové okno: {TIME_FROM} .. {TIME_TO}")
print(f"Hledám klíčová slova: {KEYWORDS}")
print("=" * 70)
ts_re = re.compile(r'^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}')
in_window = False
current_ts = ''
current_block = []
hits = []
all_selects_tables = {} # tabulka -> pocet vyskytu
def get_from_tables(text):
"""Extrahuj tabulky z FROM klauzule."""
tables = re.findall(r'\bFROM\s+([A-Z_][A-Z0-9_]*)', text, re.IGNORECASE)
tables += re.findall(r'\bJOIN\s+([A-Z_][A-Z0-9_]*)', text, re.IGNORECASE)
return [t.upper() for t in tables]
def process_block(ts, lines):
text = '\n'.join(lines)
if not re.search(r'\bSELECT\b', text, re.IGNORECASE):
return
text_up = text.upper()
# Spocitej tabulky
tables = get_from_tables(text_up)
for t in tables:
all_selects_tables[t] = all_selects_tables.get(t, 0) + 1
# Filtr - hledej klicova slova
for kw in KEYWORDS:
if kw in text_up:
hits.append((ts, kw, text))
return
# Alternativne: dotazy na PORTAL nebo FAK s datumem
if ('PORTAL' in text_up or 'FAKDAV' in text_up) and 'SELECT' in text_up:
# Vynech jednoduche dotazy
if len(text) > 100:
hits.append((ts, 'PORTAL/FAKDAV', text))
try:
with open(TRACE_FILE, 'r', encoding='utf-8', errors='replace') as f:
for line in f:
line = line.rstrip('\n')
m = ts_re.match(line)
if m:
if current_block and in_window:
process_block(current_ts, current_block)
current_ts = line[:19]
current_block = [line]
in_window = (TIME_FROM <= current_ts <= TIME_TO)
else:
if in_window:
current_block.append(line)
if current_block and in_window:
process_block(current_ts, current_block)
except FileNotFoundError:
print(f"CHYBA: soubor nenalezen: {TRACE_FILE}")
sys.exit(1)
print(f"\nNejčastější tabulky v SELECT dotazech v okně (top 40):")
sorted_tables = sorted(all_selects_tables.items(), key=lambda x: -x[1])
for t, cnt in sorted_tables[:40]:
print(f" {t:<40} {cnt}x")
print()
print(f"{'='*70}")
print(f"Nalezeno relevantních bloků (klíčová slova): {len(hits)}")
print()
for i, (ts, kw, text) in enumerate(hits):
print(f"{'='*70}")
print(f"[{i+1}] {ts} klíčové slovo: {kw}")
print(text[:4000])
print()
if not hits:
print("Žádné přesné shody. Zkusíme PREPARE_STATEMENT bloky s FROM tabulkami:")
print("(viz seznam tabulek nahoře - neobvyklé názvy mohou být klíč)")