"""E8 · cotejo con la fuente (§7.2): para los casos de la muestra con ficha de la PLACSP descargada, ¿aparecen en la ficha el objeto (sus primeras palabras) y el importe sin IVA de nuestra fila? Sin red. Uso: c5_cotejo_fuente.py . Salida: priv/cotejo_fuente_.csv (lo mira una persona; el script solo busca).""" import csv, html, re, sys, unicodedata, os m = sys.argv[1] def nz(t): t = unicodedata.normalize('NFKD', (t or '').lower()) t = ''.join(c for c in t if not unicodedata.combining(c)) return re.sub(r'\s+', ' ', re.sub(r'[^a-z0-9,.€ ]', ' ', t)).strip() def formatos(x): v = float(x); s = [] for d in (2,): a = f'{v:,.{d}f}' # 1,234.56 s += [a.replace(',', 'X').replace('.', ',').replace('X', '.'), a.replace(',', ''), a.replace(',', '').replace('.', ',')] if v == int(v): s += [f'{int(v):,}'.replace(',', '.'), str(int(v))] return set(s) out = [] for r in csv.DictReader(open(f'/p/priv/cotejo_{m}.csv')): f = f"/ref/cotejo/{m}/{m}_{int(r['orden']):02d}.html" if not os.path.exists(f): continue raw = open(f, encoding='utf-8', errors='replace').read() txt = html.unescape(re.sub(r'<[^>]+>', ' ', raw)) t = nz(txt) obj = nz(r['objeto'].split(' — ')[0])[:70] pal = [w for w in obj.split() if len(w) > 3][:8] obj_ok = obj[:40] in t or (len(pal) >= 3 and sum(w in t for w in pal) >= len(pal) - 1) imp_ok = any(s in txt for s in formatos(r['imp_sin_iva'])) ctx = ' | '.join(re.sub(r'\s+', ' ', txt[mm.start():mm.start() + 160]) for mm in re.finditer(r'Importe', txt))[:600] out.append(dict(orden=r['orden'], objeto_en_ficha=obj_ok, importe_en_ficha=imp_ok, imp=r['imp_sin_iva'], contexto=ctx)) with open(f'/p/priv/cotejo_fuente_{m}.csv', 'w', newline='') as fh: w = csv.DictWriter(fh, fieldnames=['orden', 'objeto_en_ficha', 'importe_en_ficha', 'imp', 'contexto']); w.writeheader(); w.writerows(out) print(m, 'fichas', len(out), 'objeto', sum(o['objeto_en_ficha'] for o in out), 'importe', sum(o['importe_en_ficha'] for o in out)) for o in out: if not (o['objeto_en_ficha'] and o['importe_en_ficha']): print(' ', o['orden'], o['objeto_en_ficha'], o['importe_en_ficha'], o['imp'], o['contexto'][:300])