From caff435f962c7e00ed2ac0dadb70963c9ffea6b8 Mon Sep 17 00:00:00 2001 From: Ivo Oskamp Date: Tue, 10 Feb 2026 09:40:27 +0100 Subject: [PATCH] Fix Autotask propagation to also check resolved status The previous fix only checked if tickets were deleted, but Autotask tickets can also be resolved (which is tracked via the internal Ticket table, not the JobRun table). Updated Strategy 2 to: 1. Find most recent non-deleted Autotask ticket 2. Check if its internal ticket is resolved 3. Only propagate if ticket is not deleted AND not resolved This ensures tickets stop propagating when they are resolved in Autotask (synced via PSA polling), matching the expected behavior. Co-Authored-By: Claude Sonnet 4.5 --- .../backupchecks/src/backend/app/ticketing_utils.py | 11 ++++++++++- docs/changelog-claude.md | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/containers/backupchecks/src/backend/app/ticketing_utils.py b/containers/backupchecks/src/backend/app/ticketing_utils.py index 5d94691..d8411a9 100644 --- a/containers/backupchecks/src/backend/app/ticketing_utils.py +++ b/containers/backupchecks/src/backend/app/ticketing_utils.py @@ -235,7 +235,7 @@ def link_open_internal_tickets_to_run(*, run: JobRun, job: Job) -> None: pass # Strategy 2: Direct Autotask propagation (independent of internal ticket status) - # Find the most recent non-deleted Autotask ticket for this job and propagate it. + # Find the most recent non-deleted, non-resolved Autotask ticket for this job. try: prior = ( JobRun.query.filter(JobRun.job_id == job.id) @@ -245,6 +245,15 @@ def link_open_internal_tickets_to_run(*, run: JobRun, job: Job) -> None: .first() ) if prior and getattr(prior, "autotask_ticket_id", None): + # Check if the internal ticket is resolved (Autotask tickets are resolved via internal Ticket) + ticket_number = (getattr(prior, "autotask_ticket_number", None) or "").strip() + if ticket_number: + internal_ticket = Ticket.query.filter_by(ticket_code=ticket_number).first() + if internal_ticket and getattr(internal_ticket, "resolved_at", None): + # Ticket is resolved, don't propagate + return + + # Ticket is not deleted and not resolved, propagate it run.autotask_ticket_id = prior.autotask_ticket_id run.autotask_ticket_number = prior.autotask_ticket_number run.autotask_ticket_created_at = getattr(prior, "autotask_ticket_created_at", None) diff --git a/docs/changelog-claude.md b/docs/changelog-claude.md index 701402a..338da91 100644 --- a/docs/changelog-claude.md +++ b/docs/changelog-claude.md @@ -5,7 +5,7 @@ This file documents all changes made to this project via Claude Code. ## [2026-02-10] ### Fixed -- Fixed Autotask ticket not being automatically linked to new runs when internal ticket is resolved by implementing independent Autotask propagation strategy (now checks for most recent non-deleted Autotask ticket on job regardless of internal ticket status, ensuring PSA ticket reference persists across runs) +- Fixed Autotask ticket not being automatically linked to new runs when internal ticket is resolved by implementing independent Autotask propagation strategy (now checks for most recent non-deleted and non-resolved Autotask ticket on job regardless of internal ticket status, ensuring PSA ticket reference persists across runs until explicitly resolved or deleted) ## [2026-02-09]