From 3a77e672f8d65c2157cbe94d0d3af2a303c49d3b Mon Sep 17 00:00:00 2001 From: Pranav Raj S Date: Mon, 17 Jul 2023 11:21:31 -0700 Subject: [PATCH] feat: Compute average response time of replies (#7530) --- app/listeners/reporting_event_listener.rb | 20 +++++++++++++++++++ app/models/message.rb | 8 ++++++-- lib/events/types.rb | 1 + .../reporting_event_listener_spec.rb | 11 ++++++++++ 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/app/listeners/reporting_event_listener.rb b/app/listeners/reporting_event_listener.rb index c0c54cc26..653d307bd 100644 --- a/app/listeners/reporting_event_listener.rb +++ b/app/listeners/reporting_event_listener.rb @@ -43,6 +43,26 @@ class ReportingEventListener < BaseListener reporting_event.save! end + def reply_created(event) + message = extract_message_and_account(event)[0] + conversation = message.conversation + waiting_since = event.data[:waiting_since] + reply_time = message.created_at.to_i - waiting_since.to_i + + reporting_event = ReportingEvent.new( + name: 'reply_time', + value: reply_time, + value_in_business_hours: business_hours(conversation.inbox, waiting_since, message.created_at), + account_id: conversation.account_id, + inbox_id: conversation.inbox_id, + user_id: conversation.assignee_id, + conversation_id: conversation.id, + event_start_time: waiting_since, + event_end_time: message.created_at + ) + reporting_event.save! + end + def conversation_bot_handoff(event) conversation = extract_conversation_and_account(event)[0] diff --git a/app/models/message.rb b/app/models/message.rb index 75117a2cd..ae1cf5135 100644 --- a/app/models/message.rb +++ b/app/models/message.rb @@ -260,8 +260,12 @@ class Message < ApplicationRecord end def update_waiting_since - conversation.update(waiting_since: nil) if human_response? && !private && conversation.waiting_since.present? - + if human_response? && !private && conversation.waiting_since.present? + Rails.configuration.dispatcher.dispatch( + REPLY_CREATED, Time.zone.now, waiting_since: conversation.waiting_since, message: self + ) + conversation.update(waiting_since: nil) + end conversation.update(waiting_since: Time.now.utc) if incoming? && conversation.waiting_since.blank? end diff --git a/lib/events/types.rb b/lib/events/types.rb index 2c2213e48..40c88fa18 100644 --- a/lib/events/types.rb +++ b/lib/events/types.rb @@ -33,6 +33,7 @@ module Events::Types # message events MESSAGE_CREATED = 'message.created' FIRST_REPLY_CREATED = 'first.reply.created' + REPLY_CREATED = 'reply.created' MESSAGE_UPDATED = 'message.updated' # contact events diff --git a/spec/listeners/reporting_event_listener_spec.rb b/spec/listeners/reporting_event_listener_spec.rb index 3151b714c..373beb276 100644 --- a/spec/listeners/reporting_event_listener_spec.rb +++ b/spec/listeners/reporting_event_listener_spec.rb @@ -34,6 +34,17 @@ describe ReportingEventListener do end end + describe '#reply_created' do + it 'creates reply created event' do + event = Events::Base.new('reply.created', Time.zone.now, waiting_since: 2.hours.ago, message: message) + listener.reply_created(event) + + events = account.reporting_events.where(name: 'reply_time', conversation_id: message.conversation_id) + expect(events.length).to be 1 + expect(events.first.value).to eq 7200 + end + end + describe '#first_reply_created' do it 'creates first_response event' do previous_count = account.reporting_events.where(name: 'first_response').count