diff --git a/app/models/observer/sla/ticket_rebuild_escalation.rb b/app/models/observer/sla/ticket_rebuild_escalation.rb index 761dfd10e..6c27cc206 100644 --- a/app/models/observer/sla/ticket_rebuild_escalation.rb +++ b/app/models/observer/sla/ticket_rebuild_escalation.rb @@ -3,15 +3,7 @@ class Observer::Sla::TicketRebuildEscalation < ActiveRecord::Observer observe 'sla', 'calendar' - def after_create(record) - _rebuild(record) - end - - def after_update(record) - _check(record) - end - - def after_delete(record) + def after_commit(record) _rebuild(record) end diff --git a/app/models/observer/ticket/article_changes.rb b/app/models/observer/ticket/article_changes.rb index c0184f6fa..337611fbf 100644 --- a/app/models/observer/ticket/article_changes.rb +++ b/app/models/observer/ticket/article_changes.rb @@ -27,7 +27,7 @@ class Observer::Ticket::ArticleChanges < ActiveRecord::Observer record.ticket.touch # rubocop:disable Rails/SkipsModelValidations return end - record.ticket.save + record.ticket.save! end def after_destroy(record) diff --git a/app/models/observer/ticket/escalation_update.rb b/app/models/observer/ticket/escalation_update.rb index c65a07b1a..085bce371 100644 --- a/app/models/observer/ticket/escalation_update.rb +++ b/app/models/observer/ticket/escalation_update.rb @@ -16,8 +16,6 @@ class Observer::Ticket::EscalationUpdate < ActiveRecord::Observer return true if record.destroyed? - return true if !record.saved_changes? - record.escalation_calculation end end diff --git a/app/models/observer/ticket/user_ticket_counter/background_job.rb b/app/models/observer/ticket/user_ticket_counter/background_job.rb index a09904d06..de2ffadf1 100644 --- a/app/models/observer/ticket/user_ticket_counter/background_job.rb +++ b/app/models/observer/ticket/user_ticket_counter/background_job.rb @@ -26,6 +26,7 @@ class Observer::Ticket::UserTicketCounter::BackgroundJob # check if update is needed customer = User.lookup(id: @customer_id) + return true if !customer need_update = false if customer[:preferences][:tickets_open] != tickets_open need_update = true @@ -36,7 +37,7 @@ class Observer::Ticket::UserTicketCounter::BackgroundJob customer[:preferences][:tickets_closed] = tickets_closed end - return if !need_update + return true if !need_update customer.updated_by_id = @updated_by_id customer.save end diff --git a/test/unit/ticket_escalation_test.rb b/test/unit/ticket_escalation_test.rb index c46bb97f5..1465f08db 100644 --- a/test/unit/ticket_escalation_test.rb +++ b/test/unit/ticket_escalation_test.rb @@ -115,27 +115,112 @@ class TicketEscalationTest < ActiveSupport::TestCase ticket.save! assert_not(ticket.has_changes_to_save?) assert(ticket.escalation_at) - assert_equal(ticket_escalation_at.to_s, ticket.escalation_at.to_s) - - ticket.title = 'some value 123-1' - ticket.save! - assert_not(ticket.has_changes_to_save?) - - assert(ticket.escalation_at) - assert_not_equal(ticket_escalation_at.to_s, ticket.escalation_at.to_s) + assert_equal((ticket_escalation_at - 30.minutes).to_s, ticket.escalation_at.to_s) sla.destroy! calendar.destroy! - ticket.save! - assert_not(ticket.has_changes_to_save?) - assert(ticket.escalation_at) - - ticket.title = 'some value 123-2' ticket.save! assert_not(ticket.has_changes_to_save?) assert_not(ticket.escalation_at) end + test 'email process and reply via email' do + + calendar = Calendar.create_or_update( + name: 'Escalation Test', + timezone: 'Europe/Berlin', + business_hours: { + mon: { + active: true, + timeframes: [ ['00:00', '23:59'] ] + }, + tue: { + active: true, + timeframes: [ ['00:00', '23:59'] ] + }, + wed: { + active: true, + timeframes: [ ['00:00', '23:59'] ] + }, + thu: { + active: true, + timeframes: [ ['00:00', '23:59'] ] + }, + fri: { + active: true, + timeframes: [ ['00:00', '23:59'] ] + }, + sat: { + active: true, + timeframes: [ ['00:00', '23:59'] ] + }, + sun: { + active: true, + timeframes: [ ['00:00', '23:59'] ] + }, + }, + default: true, + ical_url: nil, + updated_by_id: 1, + created_by_id: 1, + ) + + sla = Sla.create_or_update( + name: 'test sla 1', + condition: { + 'ticket.title' => { + operator: 'contains', + value: 'some value 123', + }, + }, + first_response_time: 60, + update_time: 180, + solution_time: 240, + calendar_id: calendar.id, + updated_by_id: 1, + created_by_id: 1, + ) + + email = "From: Bob Smith +To: zammad@example.com +Subject: some value 123 + +Some Text" + + ticket_p, article_p, user_p, mail = Channel::EmailParser.new.process({}, email) + ticket_p.reload + assert(ticket_p.escalation_at) + assert_equal(ticket_p.first_response_escalation_at.to_s, (ticket_p.created_at + 1.hour).to_s) + assert_equal(ticket_p.update_escalation_at.to_s, (ticket_p.created_at + 3.hours).to_s) + assert_equal(ticket_p.close_escalation_at.to_s, (ticket_p.created_at + 4.hours).to_s) + assert_equal(ticket_p.escalation_at.to_s, (ticket_p.created_at + 1.hour).to_s) + + travel 3.hours + article = nil + + ticket_p.with_lock do + article = Ticket::Article.create!( + ticket_id: ticket_p.id, + from: 'some_sender@example.com', + to: 'some_recipient@example.com', + subject: 'some subject', + message_id: 'some@id', + body: 'some message', + internal: false, + sender: Ticket::Article::Sender.where(name: 'Agent').first, + type: Ticket::Article::Type.where(name: 'email').first, + updated_by_id: 1, + created_by_id: 1, + ) + end + + ticket_p.reload + assert_equal(ticket_p.first_response_escalation_at.to_s, (ticket_p.created_at + 1.hour).to_s) + assert_equal(ticket_p.update_escalation_at.to_s, (ticket_p.last_contact_agent_at + 3.hours).to_s) + assert_equal(ticket_p.close_escalation_at.to_s, (ticket_p.created_at + 4.hours).to_s) + assert_equal(ticket_p.escalation_at.to_s, (ticket_p.created_at + 4.hours).to_s) + + end end