feat(plsql): CUI strict search + country filter for ANAF
PL/SQL cauta_partener_dupa_cod_fiscal gains p_strict_search param: - strict (=1): search only exact CUI form (ANAF-determined) - dual (NULL): search all forms (existing anti-dedup behavior) Skip denomination fallback when strict to force new partner creation. Python: country filter excludes foreign companies from ANAF batch, anaf_strict flag threaded sync→import→PL/SQL, normalize RO-space in cod_fiscal_adjusted comparison to eliminate false positives. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -201,7 +201,7 @@ def build_articles_json(items, order=None, settings=None) -> str:
|
||||
return json.dumps(articles)
|
||||
|
||||
|
||||
def import_single_order(order, id_pol: int = None, id_sectie: int = None, app_settings: dict = None, id_gestiuni: list[int] = None, cod_fiscal_override: str = None) -> dict:
|
||||
def import_single_order(order, id_pol: int = None, id_sectie: int = None, app_settings: dict = None, id_gestiuni: list[int] = None, cod_fiscal_override: str = None, anaf_strict: int = None) -> dict:
|
||||
"""Import a single order into Oracle ROA.
|
||||
|
||||
Returns dict with:
|
||||
@@ -257,7 +257,7 @@ def import_single_order(order, id_pol: int = None, id_sectie: int = None, app_se
|
||||
is_pj = 0
|
||||
|
||||
cur.callproc("PACK_IMPORT_PARTENERI.cauta_sau_creeaza_partener", [
|
||||
cod_fiscal, denumire, registru, is_pj, id_partener
|
||||
cod_fiscal, denumire, registru, is_pj, anaf_strict, id_partener
|
||||
])
|
||||
|
||||
partner_id = id_partener.getvalue()
|
||||
|
||||
@@ -653,10 +653,11 @@ async def run_sync(id_pol: int = None, id_sectie: int = None, run_id: str = None
|
||||
_log_line(run_id, f"ANAF pre-populare eroare: {e}")
|
||||
logger.warning(f"ANAF cache pre-population failed: {e}")
|
||||
|
||||
# Step 4: ANAF batch verification for company CUIs
|
||||
# Step 4: ANAF batch verification for company CUIs (RO companies only)
|
||||
company_cuis = set()
|
||||
for order in truly_importable:
|
||||
if order.billing.is_company and order.billing.company_code:
|
||||
is_ro = (order.billing.country or "").strip().lower() == "romania"
|
||||
if order.billing.is_company and order.billing.company_code and is_ro:
|
||||
raw_cf = import_service.clean_web_text(order.billing.company_code) or ""
|
||||
bare = anaf_service.strip_ro_prefix(raw_cf)
|
||||
if anaf_service.validate_cui(bare):
|
||||
@@ -709,11 +710,19 @@ async def run_sync(id_pol: int = None, id_sectie: int = None, run_id: str = None
|
||||
_log_line(run_id, f"#{order.number} CUI corectat: {raw_cf} → {correct_cf}")
|
||||
cod_fiscal_override = correct_cf
|
||||
|
||||
# Determine strict search mode: only when RO company + ANAF data available
|
||||
is_ro_company = (order.billing.is_company
|
||||
and (order.billing.country or "").strip().lower() == "romania")
|
||||
anaf_strict = None
|
||||
if is_ro_company and anaf_data_for_order and anaf_data_for_order.get("scpTVA") is not None:
|
||||
anaf_strict = 1 # ANAF data available → strict search
|
||||
|
||||
result = await asyncio.to_thread(
|
||||
import_service.import_single_order,
|
||||
order, id_pol=id_pol, id_sectie=id_sectie,
|
||||
app_settings=app_settings, id_gestiuni=id_gestiuni,
|
||||
cod_fiscal_override=cod_fiscal_override
|
||||
cod_fiscal_override=cod_fiscal_override,
|
||||
anaf_strict=anaf_strict
|
||||
)
|
||||
|
||||
# Build order items data for storage (R9)
|
||||
@@ -770,7 +779,12 @@ async def run_sync(id_pol: int = None, id_sectie: int = None, run_id: str = None
|
||||
"denumire_roa": result.get("denumire_roa"),
|
||||
"anaf_platitor_tva": (1 if anaf_data_for_order.get("scpTVA") else 0) if anaf_data_for_order and anaf_data_for_order.get("scpTVA") is not None else None,
|
||||
"anaf_checked_at": anaf_data_for_order.get("checked_at") if anaf_data_for_order else None,
|
||||
"anaf_cod_fiscal_adjusted": 1 if cod_fiscal_override and cod_fiscal_override != raw_cf else 0,
|
||||
"anaf_cod_fiscal_adjusted": 1 if (
|
||||
cod_fiscal_override
|
||||
and result.get("cod_fiscal_roa")
|
||||
and anaf_service.strip_ro_prefix(result["cod_fiscal_roa"]) == anaf_service.strip_ro_prefix(raw_cf)
|
||||
and result["cod_fiscal_roa"].strip().upper().replace("RO ", "RO") != raw_cf.strip().upper().replace("RO ", "RO")
|
||||
) else 0,
|
||||
"adresa_livrare_gomag": json.dumps({"address": order.shipping.address, "city": order.shipping.city, "region": order.shipping.region}) if order.shipping else None,
|
||||
"adresa_facturare_gomag": json.dumps({"address": order.billing.address, "city": order.billing.city, "region": order.billing.region}),
|
||||
"adresa_livrare_roa": json.dumps(result.get("adresa_livrare_roa")) if result.get("adresa_livrare_roa") else None,
|
||||
|
||||
Reference in New Issue
Block a user