## Description When an agent resolves or snoozes a conversation, their capacity frees up — but under Assignment V2, no new conversation was assigned until the next event triggered the assignment job. This meant agents could sit idle despite having queued conversations waiting. This change triggers the AssignmentJob immediately on resolve/snooze so freed capacity is utilized right away. ## Type of change - [ ] New feature (non-breaking change which adds functionality) ## How Has This Been Tested? - Enable auto assignment v2 on an inbox - Create a conversation (gets auto-assigned to an available agent) - Resolve the conversation - Verify that another unassigned conversation in the inbox gets assigned to the freed-up agent ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented on my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --------- Co-authored-by: tds-1 <tds-1@users.noreply.github.com>
48 lines
1.8 KiB
Ruby
48 lines
1.8 KiB
Ruby
module AutoAssignmentHandler
|
|
extend ActiveSupport::Concern
|
|
include Events::Types
|
|
|
|
included do
|
|
after_save :run_auto_assignment
|
|
end
|
|
|
|
private
|
|
|
|
def run_auto_assignment
|
|
# 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?
|
|
# Use new assignment system
|
|
AutoAssignment::AssignmentJob.perform_later(inbox_id: inbox.id)
|
|
else
|
|
# Use legacy assignment system
|
|
# If conversation has a team, only consider team members for assignment
|
|
allowed_agent_ids = team_id.present? ? team_member_ids_with_capacity : inbox.member_ids_with_assignment_capacity
|
|
AutoAssignment::AgentAssignmentService.new(conversation: self, allowed_agent_ids: allowed_agent_ids).perform
|
|
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?
|
|
|
|
inbox.member_ids_with_assignment_capacity & team.members.ids
|
|
end
|
|
|
|
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)
|
|
end
|
|
end
|