diff --git a/app/models/concerns/auto_assignment_handler.rb b/app/models/concerns/auto_assignment_handler.rb index dca154842..6be7a8d85 100644 --- a/app/models/concerns/auto_assignment_handler.rb +++ b/app/models/concerns/auto_assignment_handler.rb @@ -9,9 +9,9 @@ module AutoAssignmentHandler private def run_auto_assignment - # Round robin kicks in on conversation create & update - # run it only when conversation status changes to open - return unless conversation_status_changed_to_open? + # Assignment V2: Also trigger assignment when conversation is resolved or snoozed, + # bypassing the open-only condition so the AssignmentJob can redistribute capacity. + return unless conversation_status_changed_to_open? || conversation_status_changed_to_resolved_or_snoozed? return unless should_run_auto_assignment? if inbox.auto_assignment_v2_enabled? @@ -25,6 +25,10 @@ module AutoAssignmentHandler end end + def conversation_status_changed_to_resolved_or_snoozed? + inbox.auto_assignment_v2_enabled? && saved_change_to_status? && (resolved? || snoozed?) + end + def team_member_ids_with_capacity return [] if team.blank? || team.allow_auto_assign.blank? @@ -33,6 +37,9 @@ module AutoAssignmentHandler def should_run_auto_assignment? return false unless inbox.enable_auto_assignment? + # Assignment V2: Resolved/snoozed conversations still have an assignee, so bypass the + # assignee-blank check below. The AssignmentJob needs to run to rebalance assignments. + return true if conversation_status_changed_to_resolved_or_snoozed? # run only if assignee is blank or doesn't have access to inbox assignee.blank? || inbox.members.exclude?(assignee)