no-mistakes(review): Make Cancelled reachable from all active states; wire phone PATCH; exclude cancelled from CEO resolution avg

This commit is contained in:
root
2026-08-02 14:12:46 +00:00
parent 1dd88a141e
commit 237284b012
4 changed files with 12 additions and 7 deletions
+1
View File
@@ -54,6 +54,7 @@ class TicketUpdate(BaseModel):
category_id: int | None = None category_id: int | None = None
priority: str | None = None priority: str | None = None
reporter: str | None = None reporter: str | None = None
phone: str | None = None
reported_via: str | None = None reported_via: str | None = None
description: str | None = None description: str | None = None
assigned_to: int | None = None assigned_to: int | None = None
+5 -5
View File
@@ -18,7 +18,7 @@ from app.services.sla import compute_sla_deadline
# ── Status Transition Map ──────────────────────────────────────────── # ── Status Transition Map ────────────────────────────────────────────
# Keys: current status → list of valid next statuses # Keys: current status → list of valid next statuses
VALID_TRANSITIONS: dict[str, list[str]] = { VALID_TRANSITIONS: dict[str, list[str]] = {
"New": ["Logged"], "New": ["Logged", "Cancelled"],
"Logged": ["Triage", "Closed", "Cancelled"], "Logged": ["Triage", "Closed", "Cancelled"],
"Triage": ["Assigned", "Escalated", "Cancelled"], "Triage": ["Assigned", "Escalated", "Cancelled"],
"Assigned": ["Accepted", "Triage", "Cancelled"], "Assigned": ["Accepted", "Triage", "Cancelled"],
@@ -28,11 +28,11 @@ VALID_TRANSITIONS: dict[str, list[str]] = {
"In Progress": ["Waiting Parts", "Escalated", "Completed", "Cancelled"], "In Progress": ["Waiting Parts", "Escalated", "Completed", "Cancelled"],
"Waiting Parts": ["In Progress", "Escalated", "Cancelled"], "Waiting Parts": ["In Progress", "Escalated", "Cancelled"],
"Escalated": ["Triage", "In Progress", "Completed", "Closed", "Cancelled"], "Escalated": ["Triage", "In Progress", "Completed", "Closed", "Cancelled"],
"Completed": ["On-Field Verification", "In Progress"], "Completed": ["On-Field Verification", "In Progress", "Cancelled"],
"On-Field Verification": ["Wahab Review", "Completed", "Closed"], "On-Field Verification": ["Wahab Review", "Completed", "Closed", "Cancelled"],
"Wahab Review": ["Closed", "On-Field Verification"], "Wahab Review": ["Closed", "On-Field Verification", "Cancelled"],
"Closed": ["Reopened"], "Closed": ["Reopened"],
"Reopened": ["Triage", "Logged"], "Reopened": ["Triage", "Logged", "Cancelled"],
# Terminal: cancelled tickets cannot resume work. # Terminal: cancelled tickets cannot resume work.
"Cancelled": [], "Cancelled": [],
} }
+1 -1
View File
@@ -288,7 +288,7 @@
}, },
calcAvgResolution(all) { calcAvgResolution(all) {
const closed = all.filter(t => ['Closed', 'Completed', 'Cancelled'].includes(t.status) && t.created_at && t.updated_at); const closed = all.filter(t => ['Closed', 'Completed'].includes(t.status) && t.created_at && t.updated_at);
if (!closed.length) return '—'; if (!closed.length) return '—';
const avgHrs = closed.reduce((sum, t) => { const avgHrs = closed.reduce((sum, t) => {
const diff = (new Date(t.updated_at) - new Date(t.created_at)) / (1000 * 60 * 60); const diff = (new Date(t.updated_at) - new Date(t.created_at)) / (1000 * 60 * 60);
+5 -1
View File
@@ -60,7 +60,11 @@ async def test_cancelled_reachable_from_active_states(client):
"""Logged/Triage/In Progress → Cancelled are all valid transitions.""" """Logged/Triage/In Progress → Cancelled are all valid transitions."""
from app.services.ticket import VALID_TRANSITIONS from app.services.ticket import VALID_TRANSITIONS
for state in ("Logged", "Triage", "Assigned", "Accepted", "In Progress", "Escalated"): for state in (
"New", "Logged", "Triage", "Assigned", "Accepted", "Travelling", "On Site",
"In Progress", "Waiting Parts", "Escalated", "On-Field Verification",
"Wahab Review", "Reopened",
):
assert "Cancelled" in VALID_TRANSITIONS[state], f"{state} should allow Cancelled" assert "Cancelled" in VALID_TRANSITIONS[state], f"{state} should allow Cancelled"