2022-01-01 13:38:12 +00:00
|
|
|
# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
|
2021-06-01 12:20:20 +00:00
|
|
|
|
2021-02-15 13:55:00 +00:00
|
|
|
class Escalation
|
|
|
|
class TicketPreferences
|
|
|
|
KEYS = %i[escalation_disabled
|
|
|
|
first_response_at last_update_at close_at escalation_at
|
|
|
|
sla_id sla_updated_at
|
2021-05-19 15:10:36 +00:00
|
|
|
calendar_id calendar_updated_at last_contact_at].freeze
|
2021-02-15 13:55:00 +00:00
|
|
|
|
|
|
|
attr_reader :hash
|
|
|
|
|
|
|
|
def initialize(ticket)
|
|
|
|
@hash = {}
|
|
|
|
|
|
|
|
KEYS.each do |key|
|
|
|
|
@hash[key] = ticket.preferences.dig(:escalation_calculation, key) || nil
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def escalation_became_enabled?(escalation_disabled)
|
|
|
|
!escalation_disabled && @hash[:escalation_disabled] != escalation_disabled
|
|
|
|
end
|
|
|
|
|
|
|
|
def sla_changed?(sla)
|
|
|
|
@hash[:sla_id] != sla&.id || @hash[:sla_updated_at] != sla&.updated_at
|
|
|
|
end
|
|
|
|
|
|
|
|
def calendar_changed?(calendar)
|
|
|
|
@hash[:calendar_id] != calendar&.id || @hash[:calendar_updated_at] != calendar&.updated_at
|
|
|
|
end
|
|
|
|
|
|
|
|
def first_response_at_changed?(ticket)
|
|
|
|
@hash[:first_response_at] != ticket.first_response_at
|
|
|
|
end
|
|
|
|
|
|
|
|
def last_update_at_changed?(ticket)
|
|
|
|
@hash[:last_update_at] != ticket.last_original_update_at || ticket.saved_change_to_state_id?
|
|
|
|
end
|
|
|
|
|
|
|
|
def close_at_changed?(ticket)
|
|
|
|
@hash[:close_at] != ticket.close_at
|
|
|
|
end
|
|
|
|
|
2021-05-19 15:10:36 +00:00
|
|
|
def last_contact_at_changed?(ticket)
|
|
|
|
@hash[:last_contact_at] != ticket.last_contact_at
|
|
|
|
end
|
|
|
|
|
2021-02-15 13:55:00 +00:00
|
|
|
def property_changes?(ticket)
|
|
|
|
%i[first_response_at last_update_at close_at].any? { |elem| send("#{elem}_changed?", ticket) }
|
|
|
|
end
|
|
|
|
|
|
|
|
def any_changes?(ticket, sla, escalation_disabled)
|
|
|
|
property_changes?(ticket) || sla_changed?(sla) || calendar_changed?(sla&.calendar) || @hash[:escalation_disabled] != escalation_disabled
|
|
|
|
end
|
|
|
|
|
|
|
|
def update_preferences(ticket, sla, escalation_disabled)
|
|
|
|
new_hash = hash_of(ticket, sla, escalation_disabled)
|
|
|
|
|
|
|
|
return if new_hash == { escalation_disabled: false } && !@hash[:escalation_disabled] # do not update when update not necessary
|
|
|
|
|
|
|
|
ticket.preferences[:escalation_calculation] = new_hash
|
|
|
|
end
|
|
|
|
|
|
|
|
def hash_of(ticket, sla, escalation_disabled)
|
|
|
|
{
|
|
|
|
first_response_at: ticket.first_response_at,
|
|
|
|
last_update_at: ticket.last_original_update_at,
|
|
|
|
close_at: ticket.close_at,
|
2021-05-19 15:10:36 +00:00
|
|
|
last_contact_at: ticket.last_contact_at,
|
2021-02-15 13:55:00 +00:00
|
|
|
sla_id: sla&.id,
|
|
|
|
sla_updated_at: sla&.updated_at,
|
|
|
|
calendar_id: sla&.calendar&.id,
|
|
|
|
calendar_updated_at: sla&.calendar&.updated_at,
|
|
|
|
escalation_disabled: escalation_disabled,
|
|
|
|
}.compact
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|