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,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íč)")
|
||||
Reference in New Issue
Block a user