Fixes #3389 - Trigger based notifications are not sent (Send no trigger based notification to bob.smith@example.com because email is marked as mail_delivery_failed for -157 days).

This commit is contained in:
Martin Edenhofer 2021-02-09 18:37:35 +01:00 committed by Thorsten Eckel
parent 5e2520fc5e
commit 0160e20427
2 changed files with 56 additions and 15 deletions

View file

@ -1479,20 +1479,8 @@ result
recipients_checked = []
recipients_raw.each do |recipient_email|
skip_user = false
users = User.where(email: recipient_email)
users.each do |user|
next if user.preferences[:mail_delivery_failed] != true
next if !user.preferences[:mail_delivery_failed_data]
till_blocked = ((user.preferences[:mail_delivery_failed_data] - Time.zone.now - 60.days) / 60 / 60 / 24).round
next if till_blocked.positive?
logger.info "Send no trigger based notification to #{recipient_email} because email is marked as mail_delivery_failed for #{till_blocked} days"
skip_user = true
break
end
next if skip_user
next if users.any? { |user| !trigger_based_notification?(user) }
# send notifications only to email addresses
next if recipient_email.blank?
@ -1510,7 +1498,7 @@ result
next # no usable format found
end
recipient_email = "#{$2}@#{$3}"
recipient_email = "#{$2}@#{$3}" # rubocop:disable Lint/OutOfRangeRegexpRef
end
end
@ -1789,4 +1777,20 @@ result
created_by_id: 1,
)
end
def trigger_based_notification?(user)
blocked_in_days = trigger_based_notification_blocked_in_days(user)
return true if blocked_in_days.zero?
logger.info "Send no trigger based notification to #{user.email} because email is marked as mail_delivery_failed for #{blocked_in_days} day(s)"
false
end
def trigger_based_notification_blocked_in_days(user)
return 0 if !user.preferences[:mail_delivery_failed]
return 0 if user.preferences[:mail_delivery_failed_data].blank?
# blocked for 60 full days
(user.preferences[:mail_delivery_failed_data].to_date - Time.zone.now.to_date).to_i + 61
end
end

View file

@ -516,6 +516,43 @@ RSpec.describe Ticket, type: :model do
end
end
describe '#trigger_based_notification?' do
let(:ticket) { create(:ticket) }
context 'with a normal user' do
let(:customer) { create(:customer) }
it 'send trigger base notification' do
expect(ticket.send(:trigger_based_notification?, customer)).to eq(true)
end
end
context 'with a permanent failed user' do
let(:failed_date) { 1.second.ago }
let(:customer) do
user = create(:customer)
user.preferences.merge!(mail_delivery_failed: true, mail_delivery_failed_data: failed_date)
user.save!
user
end
it 'send no trigger base notification' do
expect(ticket.send(:trigger_based_notification?, customer)).to eq(false)
end
context 'with failed date 61 days ago' do
let(:failed_date) { 61.days.ago }
it 'send trigger base notification' do
expect(ticket.send(:trigger_based_notification?, customer)).to eq(true)
end
end
end
end
describe '#subject_build' do
context 'with default "ticket_hook_position" setting ("right")' do
it 'returns the given string followed by a ticket reference (of the form "[Ticket#123]")' do
@ -757,7 +794,7 @@ RSpec.describe Ticket, type: :model do
end
describe '#pending_time' do
subject(:ticket) { create(:ticket, pending_time: Time.zone.now + 2.days) }
subject(:ticket) { create(:ticket, pending_time: 2.days.from_now) }
context 'when #state is updated to any non-"pending" value' do
it 'is reset to nil' do