feat: explain RTC blockers when no R3 candidates are eligible

This commit is contained in:
gti
2026-09-25 16:04:29 -03:00
parent d8f1bd3415
commit 95605c2ff5
7 changed files with 137 additions and 5 deletions
+23 -1
View File
@@ -5,7 +5,7 @@ from sqlalchemy.dialects import postgresql
from central.app.audit import record_audit
from central.app.blocked_products import upsert_blocker
from central.app.control_plane import _blocker_breakdown_query, blocker_filter_summary, dashboard_summary, jobs_status_summary, list_blockers, list_installations, list_jobs
from central.app.control_plane import _blocker_breakdown_query, blocker_filter_summary, dashboard_summary, jobs_status_summary, list_blockers, list_installations, list_jobs, rtc_blocker_summary
from central.app.config import settings
from central.app.events import record_event
from central.app.models import Agent, AgentEnrollment, AgentRelease, AgentSnapshot, AuditEvent, BlockedProduct, Installation, Job, Tenant
@@ -238,6 +238,28 @@ def test_jobs_status_kpis_count_active_jobs_by_status_in_one_group():
assert jobs_status_summary(session, scope="all")["FAILED"] == 2
def test_rtc_blocker_summary_counts_products_and_simple_reason_server_side():
factory = setup_db()
with factory() as session:
_, agent, installation, _ = _installation(session, 1)
for index in range(521):
session.add(BlockedProduct(
tenant_id=installation.tenant_id, installation_id=installation.id, company="Client 1",
product_code=f"RTC-{index:04d}", description="RTC item", blocker_type="BLOCKED_FISCAL_DATA",
field="RTC", reason_code="CCLASSTRIB_MISSING_UNRESOLVED",
evidence_summary={"reason": "RTC-R1:SIMPLES_ORIENTATION_PENDING_OFFICIAL_NT"},
input_fingerprint=f"rtc-{index}", blocker_fingerprint=f"rtc-blocker-{index}",
first_seen_at=NOW, last_seen_at=NOW,
))
session.commit()
summary = rtc_blocker_summary(session, agent.id)
assert summary["open_blockers"] == 521
assert summary["products_affected"] == 521
assert summary["reason_counts"] == {"RTC-R1:SIMPLES_ORIENTATION_PENDING_OFFICIAL_NT": 521}
def test_attention_groups_rank_high_priority_before_limiting_recent_low_priority():
factory = setup_db()
with factory() as session: