Merge branch 'develop' into feat/api-webhook-feature-flag

This commit is contained in:
Shivam Mishra
2026-07-13 14:05:36 +05:30
committed by GitHub
4 changed files with 29 additions and 3 deletions
+2
View File
@@ -22,6 +22,8 @@
# index_assignment_policies_on_enabled (enabled)
#
class AssignmentPolicy < ApplicationRecord
DEFAULT_EXCLUDE_OLDER_THAN_HOURS = 168
belongs_to :account
has_many :inbox_assignment_policies, dependent: :destroy
has_many :inboxes, through: :inbox_assignment_policies
@@ -35,9 +35,9 @@ class AutoAssignment::AssignmentService
def unassigned_conversations(limit)
scope = inbox.conversations.unassigned.open
# Skip stale backlog with no activity beyond the policy's age threshold (defaults to 7 days)
# Skip stale backlog with no activity beyond the age threshold
policy = inbox.assignment_policy
scope = apply_age_exclusions(scope, policy&.exclude_older_than_hours)
scope = apply_age_exclusions(scope, age_exclusion_hours(policy))
# Apply conversation priority using assignment policy if available
scope = if policy&.longest_waiting?
@@ -49,6 +49,12 @@ class AutoAssignment::AssignmentService
scope.limit(limit)
end
def age_exclusion_hours(policy)
return policy.exclude_older_than_hours if policy
AssignmentPolicy::DEFAULT_EXCLUDE_OLDER_THAN_HOURS
end
def apply_age_exclusions(scope, hours_threshold)
return scope if hours_threshold.blank?
@@ -60,7 +60,7 @@ module Enterprise::AutoAssignment::AssignmentService
scope = inbox.conversations.unassigned.open
# First apply the assignment policy's age exclusion (defaults to 7 days)
scope = apply_age_exclusions(scope, policy&.exclude_older_than_hours)
scope = apply_age_exclusions(scope, age_exclusion_hours(policy))
# Then apply the capacity policy's exclusion rules (labels and age)
scope = apply_exclusion_rules(scope)
@@ -239,6 +239,24 @@ RSpec.describe AutoAssignment::AssignmentService do
expect(assigned_count).to eq(1)
expect(old_conversation.reload.assignee).to eq(agent)
end
context 'when the inbox has no assignment policy' do
before do
inbox.inbox_assignment_policy.destroy!
inbox.reload
end
it 'falls back to the default threshold and skips stale conversations' do
stale_conversation = create(:conversation, inbox: inbox, assignee: nil, last_activity_at: 8.days.ago)
recent_conversation = create(:conversation, inbox: inbox, assignee: nil, last_activity_at: 6.days.ago)
assigned_count = service.perform_bulk_assignment(limit: 10)
expect(assigned_count).to eq(1)
expect(stale_conversation.reload.assignee).to be_nil
expect(recent_conversation.reload.assignee).to eq(agent)
end
end
end
context 'with fair distribution' do