feat: close autonomous operations for blocked products

This commit is contained in:
gti
2026-09-22 14:51:54 -03:00
parent dca4847c21
commit 3a36ac630b
16 changed files with 666 additions and 3 deletions
+23
View File
@@ -7,6 +7,7 @@ from datetime import datetime, timezone
from .ipi_auto_apply import ipi_write_decision
from .runner import product_fingerprint
from central.app.operational_state import classify_product_state, summarize_operational_states
def now():
@@ -27,6 +28,9 @@ def run_pipeline(products, decisions, state, firebird_writes, write_connection,
"writes_failed": 0,
"skipped_not_eligible": 0,
"no_ops": 0,
"product_states": [],
"blocked_products": [],
"resolved_products": [],
}
for product, decision in zip(products, decisions):
code = product["CODIGO"]
@@ -37,6 +41,22 @@ def run_pipeline(products, decisions, state, firebird_writes, write_connection,
wd = ipi_write_decision(decision, current_ipi)
decision_status = decision.get("status")
ipi_status = decision.get("ipi_status")
operational = classify_product_state(product, decision)
summary["product_states"].append(operational)
if operational["state"].startswith("BLOCKED_"):
summary["blocked_products"].append({
"company": product.get("COMPANY") or product.get("company") or "",
"product_code": code,
"gtin": product.get("GTIN") or product.get("EAN_GTIN"),
"description": product.get("PRODUTO") or product.get("description"),
"blocker_type": operational["state"],
"field": "NCM",
"reason_code": decision_status or "MISSING_EVIDENCE",
"evidence_summary": {"decision_status": decision_status, "ipi_status": ipi_status},
"input_fingerprint": fingerprint,
})
else:
summary["resolved_products"].append(code)
if not firebird_writes:
state.log_ipi_write(code, fingerprint, decision_status, ipi_status, "DRY_RUN_ONLY", current_ipi, wd["proposed_value"], None, wd["reason_code"], now())
@@ -69,8 +89,11 @@ def run_pipeline(products, decisions, state, firebird_writes, write_connection,
record = executor.execute_guarded_update(write_connection, database_path=database_path, proposal=proposal, now=now(), authorized_path=authorized_path)
state.log_ipi_write(code, fingerprint, decision_status, ipi_status, "SUCCEEDED", record.before_value, record.after_value, f"rowcount={record.rowcount}", wd["reason_code"], now())
summary["writes_succeeded"] += 1
summary["product_states"][-1] = classify_product_state(product, decision, write_status="SUCCEEDED")
except executor.WriteRefused as error:
state.log_ipi_write(code, fingerprint, decision_status, ipi_status, "FAILED", current_ipi, wd["proposed_value"], str(error), wd["reason_code"], now())
summary["writes_failed"] += 1
summary["product_states"][-1] = classify_product_state(product, decision, write_status="FAILED")
summary["operational"] = summarize_operational_states(summary["product_states"])
return summary