24 lines
1.8 KiB
Python
24 lines
1.8 KiB
Python
"""Gate Firebird reads on the registered schema fingerprint."""
|
|
import hashlib, json
|
|
REFERENCE_SCHEMA_V1 = "1198f89897532b643439f06b729e93b189018f56e7d478e95095f8f56977005b"
|
|
|
|
def product_fingerprint(product):
|
|
fields = ("PRODUTO", "EAN_GTIN", "NCM", "CLASSIFICACAO_FISCAL", "CFOP", "CST", "ALIQUOTA", "CEST", "CSOSN")
|
|
return hashlib.sha256(json.dumps({key: product.get(key) for key in fields}, sort_keys=True, default=str).encode()).hexdigest()
|
|
def to_hub_product(product):
|
|
# C000025 has NCM empty and stores the confirmed eight-digit NCM in CLASSIFICACAO_FISCAL.
|
|
return {"product_id": product["CODIGO"], "description": product.get("PRODUTO", ""), "gtin": product.get("EAN_GTIN"), "current_ncm": product.get("CLASSIFICACAO_FISCAL")}
|
|
def run_sample(products, client, state, schema_fingerprint):
|
|
if schema_fingerprint != REFERENCE_SCHEMA_V1: return {"status": "SCHEMA_UNKNOWN", "results": [], "firebird_writes": 0}
|
|
outbound = []
|
|
for product in products:
|
|
fingerprint = product_fingerprint(product)
|
|
if state.enqueue(product["CODIGO"], fingerprint, "pending", "0.1.0"): outbound.append((product, fingerprint))
|
|
if not outbound: return {"status": "OK", "results": [], "firebird_writes": 0, "api_requests": 0}
|
|
try: results = client.classify_batch([to_hub_product(product) for product, _ in outbound])
|
|
except Exception:
|
|
for product, _ in outbound: state.retry(product["CODIGO"])
|
|
return {"status": "API_UNAVAILABLE", "results": [], "firebird_writes": 0}
|
|
for (product, fingerprint), result in zip(outbound, results): state.result_received(product["CODIGO"], fingerprint, result["dataset_versions"].get("ncm") or "none", result["engine_version"])
|
|
return {"status": "OK", "results": results, "firebird_writes": 0, "api_requests": 1}
|