Fix Autotask resolution update for tickets with unset classification fields

For picklist fields (issueType, subIssueType, source), use 0 as default
when fields are null/missing in GET response. Value 0 is valid in Autotask
and means "not set". Only id and status are truly required with real values.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Ivo Oskamp 2026-02-05 15:56:55 +01:00
parent 8baf4e8ff1
commit 0c9cf21d5d

View File

@ -597,27 +597,30 @@ class AutotaskClient:
if not isinstance(ticket, dict) or not ticket:
raise AutotaskError("Autotask did not return a ticket object.")
def _pick(d: Dict[str, Any], keys: List[str]) -> Any:
def _pick(d: Dict[str, Any], keys: List[str], default: Any = None) -> Any:
"""Pick first available value from possible field names.
Note: 0 is a valid Autotask picklist value, so we only skip None and empty string.
Returns default if no value is found.
"""
for k in keys:
if k in d and d.get(k) not in (None, ""):
return d.get(k)
return None
return default
# Required stabilising fields for safe resolution updates (validated via Postman tests)
resolved_issue_type = _pick(ticket, ["issueType", "issueTypeID", "issueTypeId"])
resolved_sub_issue_type = _pick(ticket, ["subIssueType", "subIssueTypeID", "subIssueTypeId"])
resolved_source = _pick(ticket, ["source", "sourceID", "sourceId"])
resolved_status = _pick(ticket, ["status", "statusID", "statusId"])
# Required stabilising fields for safe resolution updates (validated via Postman tests).
# Field names are camelCase as per API contract (docs/autotask_rest_api.md section 2.1).
# For picklist fields (issueType, subIssueType, source), 0 is valid and means "not set".
# If these fields are null/missing in the GET response, we default to 0 for the PUT payload.
resolved_issue_type = _pick(ticket, ["issueType"], default=0)
resolved_sub_issue_type = _pick(ticket, ["subIssueType"], default=0)
resolved_source = _pick(ticket, ["source"], default=0)
resolved_status = _pick(ticket, ["status"])
# Only id and status are truly required (must have real values)
missing: List[str] = []
if _pick(ticket, ["id"]) in (None, ""):
missing.append("id")
if resolved_issue_type in (None, ""):
missing.append("issueType")
if resolved_sub_issue_type in (None, ""):
missing.append("subIssueType")
if resolved_source in (None, ""):
missing.append("source")
if resolved_status in (None, ""):
missing.append("status")