Feat: Out of office autoresponder (#2992)
This change allows the user to enable autoresponder during the out-of-office time. Fixes: #2035
This commit is contained in:
parent
6ad5a7452c
commit
794a56d4cc
5 changed files with 68 additions and 26 deletions
|
@ -392,6 +392,10 @@ export default {
|
||||||
key: 'collaborators',
|
key: 'collaborators',
|
||||||
name: this.$t('INBOX_MGMT.TABS.COLLABORATORS'),
|
name: this.$t('INBOX_MGMT.TABS.COLLABORATORS'),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
key: 'businesshours',
|
||||||
|
name: this.$t('INBOX_MGMT.TABS.BUSINESS_HOURS'),
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
if (this.isAWebWidgetInbox) {
|
if (this.isAWebWidgetInbox) {
|
||||||
|
@ -401,10 +405,6 @@ export default {
|
||||||
key: 'preChatForm',
|
key: 'preChatForm',
|
||||||
name: this.$t('INBOX_MGMT.TABS.PRE_CHAT_FORM'),
|
name: this.$t('INBOX_MGMT.TABS.PRE_CHAT_FORM'),
|
||||||
},
|
},
|
||||||
{
|
|
||||||
key: 'businesshours',
|
|
||||||
name: this.$t('INBOX_MGMT.TABS.BUSINESS_HOURS'),
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
key: 'configuration',
|
key: 'configuration',
|
||||||
name: this.$t('INBOX_MGMT.TABS.CONFIGURATION'),
|
name: this.$t('INBOX_MGMT.TABS.CONFIGURATION'),
|
||||||
|
|
|
@ -43,10 +43,10 @@ class WorkingHour < ApplicationRecord
|
||||||
def open_at?(time)
|
def open_at?(time)
|
||||||
return false if closed_all_day?
|
return false if closed_all_day?
|
||||||
|
|
||||||
time.hour >= open_hour &&
|
open_time = Time.zone.now.in_time_zone(inbox.timezone).change({ hour: open_hour, min: open_minutes })
|
||||||
time.min >= open_minutes &&
|
close_time = Time.zone.now.in_time_zone(inbox.timezone).change({ hour: close_hour, min: close_minutes })
|
||||||
time.hour <= close_hour &&
|
|
||||||
time.min <= close_minutes
|
time.between?(open_time, close_time)
|
||||||
end
|
end
|
||||||
|
|
||||||
def open_now?
|
def open_now?
|
||||||
|
|
|
@ -14,14 +14,16 @@ class MessageTemplates::HookExecutionService
|
||||||
delegate :contact, to: :conversation
|
delegate :contact, to: :conversation
|
||||||
|
|
||||||
def trigger_templates
|
def trigger_templates
|
||||||
# TODO: let's see whether this is needed and remove this and related logic if not
|
::MessageTemplates::Template::OutOfOffice.new(conversation: conversation).perform if should_send_out_of_office_message?
|
||||||
# ::MessageTemplates::Template::OutOfOffice.new(conversation: conversation).perform if should_send_out_of_office_message?
|
|
||||||
::MessageTemplates::Template::Greeting.new(conversation: conversation).perform if should_send_greeting?
|
::MessageTemplates::Template::Greeting.new(conversation: conversation).perform if should_send_greeting?
|
||||||
::MessageTemplates::Template::EmailCollect.new(conversation: conversation).perform if inbox.enable_email_collect && should_send_email_collect?
|
::MessageTemplates::Template::EmailCollect.new(conversation: conversation).perform if inbox.enable_email_collect && should_send_email_collect?
|
||||||
::MessageTemplates::Template::CsatSurvey.new(conversation: conversation).perform if should_send_csat_survey?
|
::MessageTemplates::Template::CsatSurvey.new(conversation: conversation).perform if should_send_csat_survey?
|
||||||
end
|
end
|
||||||
|
|
||||||
def should_send_out_of_office_message?
|
def should_send_out_of_office_message?
|
||||||
|
# should not send if its a tweet message
|
||||||
|
return false if conversation.tweet?
|
||||||
|
|
||||||
inbox.out_of_office? && conversation.messages.today.template.empty? && inbox.out_of_office_message.present?
|
inbox.out_of_office? && conversation.messages.today.template.empty? && inbox.out_of_office_message.present?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -26,4 +26,28 @@ RSpec.describe WorkingHour do
|
||||||
expect(described_class.today.closed_now?).to be true
|
expect(described_class.today.closed_now?).to be true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'when on friday 12:30pm' do
|
||||||
|
before do
|
||||||
|
Time.zone = 'UTC'
|
||||||
|
create(:working_hour)
|
||||||
|
travel_to '10.09.2021 12:30'.to_datetime
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'is considered to be in business hours' do
|
||||||
|
expect(described_class.today.open_now?).to be true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when on friday 17:30pm' do
|
||||||
|
before do
|
||||||
|
Time.zone = 'UTC'
|
||||||
|
create(:working_hour)
|
||||||
|
travel_to '10.09.2021 17:30'.to_datetime
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'is considered out of office' do
|
||||||
|
expect(described_class.today.closed_now?).to be true
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -154,25 +154,41 @@ describe ::MessageTemplates::HookExecutionService do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO: remove this if this hook is removed
|
context 'when it is after working hours' do
|
||||||
# context 'when it is after working hours' do
|
it 'calls ::MessageTemplates::Template::OutOfOffice' do
|
||||||
# it 'calls ::MessageTemplates::Template::OutOfOffice' do
|
contact = create :contact
|
||||||
# contact = create :contact
|
conversation = create :conversation, contact: contact
|
||||||
# conversation = create :conversation, contact: contact
|
|
||||||
|
|
||||||
# conversation.inbox.update(working_hours_enabled: true, out_of_office_message: 'We are out of office')
|
conversation.inbox.update(working_hours_enabled: true, out_of_office_message: 'We are out of office')
|
||||||
# conversation.inbox.working_hours.today.update!(closed_all_day: true)
|
conversation.inbox.working_hours.today.update!(closed_all_day: true)
|
||||||
|
|
||||||
# out_of_office_service = double
|
out_of_office_service = double
|
||||||
|
|
||||||
# allow(::MessageTemplates::Template::OutOfOffice).to receive(:new).and_return(out_of_office_service)
|
allow(::MessageTemplates::Template::OutOfOffice).to receive(:new).and_return(out_of_office_service)
|
||||||
# allow(out_of_office_service).to receive(:perform).and_return(true)
|
allow(out_of_office_service).to receive(:perform).and_return(true)
|
||||||
|
|
||||||
# # described class gets called in message after commit
|
# described class gets called in message after commit
|
||||||
# message = create(:message, conversation: conversation)
|
message = create(:message, conversation: conversation)
|
||||||
|
|
||||||
# expect(::MessageTemplates::Template::OutOfOffice).to have_received(:new).with(conversation: message.conversation)
|
expect(::MessageTemplates::Template::OutOfOffice).to have_received(:new).with(conversation: message.conversation)
|
||||||
# expect(out_of_office_service).to have_received(:perform)
|
expect(out_of_office_service).to have_received(:perform)
|
||||||
# end
|
end
|
||||||
# end
|
|
||||||
|
it 'will not call ::MessageTemplates::Template::OutOfOffice if its a tweet conversation' do
|
||||||
|
twitter_channel = create(:channel_twitter_profile)
|
||||||
|
twitter_inbox = create(:inbox, channel: twitter_channel)
|
||||||
|
twitter_inbox.update(working_hours_enabled: true, out_of_office_message: 'We are out of office')
|
||||||
|
|
||||||
|
conversation = create(:conversation, inbox: twitter_inbox, additional_attributes: { type: 'tweet' })
|
||||||
|
|
||||||
|
out_of_office_service = double
|
||||||
|
|
||||||
|
allow(::MessageTemplates::Template::OutOfOffice).to receive(:new).and_return(out_of_office_service)
|
||||||
|
allow(out_of_office_service).to receive(:perform).and_return(false)
|
||||||
|
|
||||||
|
message = create(:message, conversation: conversation)
|
||||||
|
expect(::MessageTemplates::Template::OutOfOffice).not_to have_received(:new).with(conversation: message.conversation)
|
||||||
|
expect(out_of_office_service).not_to receive(:perform)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue