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>
106 lines
3.5 KiB
Python
106 lines
3.5 KiB
Python
# -*- 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íč)")
|