feat(anaf-dedup): ANAF partner dedup + address fix + UI enrichment

Prevent partner duplicates via ANAF CUI verification and dual PL/SQL
search. Fix address matching with street-level comparison and diacritics
normalization. Show partner/address comparison in order detail modal.

- New anaf_service.py: batch ANAF API client with chunking, retry, cache
- PL/SQL: dual CUI search (bare/RO+bare/RO space+bare), 3-tier address
  search (street+city+id_loc → city+id_loc → create), strip_diacritics
  at storage for addresses and partner names
- SQLite: anaf_cache table, 12 new order columns for partner/address data
- import_service: cod_fiscal_override param, return partner/address from Oracle
- sync_service: ANAF batch integration, denomination mismatch detection,
  cache pre-population trigger
- Router: enriched order_detail with partner_info + addresses JSON
- UI: collapsible Detalii Partener + Adrese Comparativ sections in modal,
  auto-expand on mismatch, ANAF badges, mobile address cards
- Dashboard: address quality attention indicator
- New scan_duplicate_partners.py script for one-time duplicate audit

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Agent
2026-04-01 14:36:52 +00:00
parent 3b9198d742
commit 2f593c30f6
12 changed files with 925 additions and 64 deletions

View File

@@ -179,6 +179,13 @@ CREATE TABLE IF NOT EXISTS order_items (
PRIMARY KEY (order_number, sku)
);
CREATE INDEX IF NOT EXISTS idx_order_items_order ON order_items(order_number);
CREATE TABLE IF NOT EXISTS anaf_cache (
cui TEXT PRIMARY KEY,
scp_tva INTEGER,
denumire_anaf TEXT,
checked_at TEXT NOT NULL
);
"""
_sqlite_db_path = None
@@ -333,6 +340,18 @@ def init_sqlite():
("web_status", "TEXT"),
("discount_split", "TEXT"),
("price_match", "INTEGER"),
("cod_fiscal_gomag", "TEXT"),
("cod_fiscal_roa", "TEXT"),
("denumire_roa", "TEXT"),
("anaf_platitor_tva", "INTEGER"),
("anaf_checked_at", "TEXT"),
("anaf_cod_fiscal_adjusted", "INTEGER DEFAULT 0"),
("adresa_livrare_gomag", "TEXT"),
("adresa_facturare_gomag", "TEXT"),
("adresa_livrare_roa", "TEXT"),
("adresa_facturare_roa", "TEXT"),
("anaf_denumire_mismatch", "INTEGER DEFAULT 0"),
("denumire_anaf", "TEXT"),
]:
if col not in order_cols:
conn.execute(f"ALTER TABLE orders ADD COLUMN {col} {typedef}")