2021-06-01 12:20:20 +00:00
|
|
|
|
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
|
|
|
|
|
2016-04-23 09:04:33 +00:00
|
|
|
|
module Cti
|
|
|
|
|
class Log < ApplicationModel
|
2018-10-03 06:23:22 +00:00
|
|
|
|
include HasSearchIndexBackend
|
|
|
|
|
|
2016-04-23 09:04:33 +00:00
|
|
|
|
self.table_name = 'cti_logs'
|
|
|
|
|
|
2021-05-12 10:31:00 +00:00
|
|
|
|
store :preferences, accessors: %i[from_pretty to_pretty]
|
2016-04-29 08:23:12 +00:00
|
|
|
|
|
2021-05-12 11:37:44 +00:00
|
|
|
|
validates :state, format: { with: %r{\A(newCall|answer|hangup)\z}, message: 'newCall|answer|hangup is allowed' }
|
2018-09-25 14:52:46 +00:00
|
|
|
|
|
2021-05-12 10:31:00 +00:00
|
|
|
|
before_create :set_pretty
|
|
|
|
|
before_update :set_pretty
|
2019-07-09 22:07:32 +00:00
|
|
|
|
after_commit :push_caller_list_update
|
2016-04-23 09:04:33 +00:00
|
|
|
|
|
|
|
|
|
=begin
|
|
|
|
|
|
2018-08-17 07:48:12 +00:00
|
|
|
|
Cti::Log.create!(
|
2016-04-23 09:04:33 +00:00
|
|
|
|
direction: 'in',
|
|
|
|
|
from: '007',
|
2019-07-09 22:07:32 +00:00
|
|
|
|
from_comment: '',
|
2016-04-23 09:04:33 +00:00
|
|
|
|
to: '008',
|
2016-04-27 12:35:36 +00:00
|
|
|
|
to_comment: 'BBB',
|
2016-04-23 09:04:33 +00:00
|
|
|
|
call_id: '1',
|
|
|
|
|
comment: '',
|
|
|
|
|
state: 'newCall',
|
2019-07-09 22:07:32 +00:00
|
|
|
|
done: true,
|
2016-04-23 09:04:33 +00:00
|
|
|
|
)
|
|
|
|
|
|
2018-08-17 07:48:12 +00:00
|
|
|
|
Cti::Log.create!(
|
2016-04-23 09:04:33 +00:00
|
|
|
|
direction: 'in',
|
|
|
|
|
from: '007',
|
|
|
|
|
from_comment: '',
|
|
|
|
|
to: '008',
|
|
|
|
|
to_comment: '',
|
|
|
|
|
call_id: '2',
|
|
|
|
|
comment: '',
|
|
|
|
|
state: 'answer',
|
2019-07-09 22:07:32 +00:00
|
|
|
|
done: true,
|
2016-04-23 09:04:33 +00:00
|
|
|
|
)
|
|
|
|
|
|
2018-08-17 07:48:12 +00:00
|
|
|
|
Cti::Log.create!(
|
2016-04-23 09:04:33 +00:00
|
|
|
|
direction: 'in',
|
|
|
|
|
from: '009',
|
|
|
|
|
from_comment: '',
|
|
|
|
|
to: '010',
|
|
|
|
|
to_comment: '',
|
|
|
|
|
call_id: '3',
|
|
|
|
|
comment: '',
|
|
|
|
|
state: 'hangup',
|
2019-07-09 22:07:32 +00:00
|
|
|
|
done: true,
|
2016-04-23 09:04:33 +00:00
|
|
|
|
)
|
|
|
|
|
|
2016-05-31 08:56:13 +00:00
|
|
|
|
example data, can be used for demo
|
|
|
|
|
|
2018-08-17 07:48:12 +00:00
|
|
|
|
Cti::Log.create!(
|
2016-05-31 08:56:13 +00:00
|
|
|
|
direction: 'in',
|
|
|
|
|
from: '4930609854180',
|
|
|
|
|
from_comment: 'Franz Bauer',
|
|
|
|
|
to: '4930609811111',
|
|
|
|
|
to_comment: 'Bob Smith',
|
2018-08-17 07:48:12 +00:00
|
|
|
|
call_id: '435452113',
|
2016-05-31 08:56:13 +00:00
|
|
|
|
comment: '',
|
|
|
|
|
state: 'newCall',
|
|
|
|
|
done: false,
|
|
|
|
|
preferences: {
|
|
|
|
|
from: [
|
|
|
|
|
{
|
|
|
|
|
caller_id: '4930726128135',
|
|
|
|
|
comment: nil,
|
|
|
|
|
level: 'known',
|
|
|
|
|
object: 'User',
|
|
|
|
|
o_id: 2,
|
|
|
|
|
user_id: 2,
|
2019-07-09 22:07:32 +00:00
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
caller_id: '4930726128135',
|
|
|
|
|
comment: nil,
|
|
|
|
|
level: 'maybe',
|
|
|
|
|
object: 'User',
|
|
|
|
|
o_id: 2,
|
|
|
|
|
user_id: 3,
|
|
|
|
|
},
|
2016-05-31 08:56:13 +00:00
|
|
|
|
]
|
2018-10-18 09:42:37 +00:00
|
|
|
|
},
|
|
|
|
|
created_at: Time.zone.now,
|
2016-05-31 08:56:13 +00:00
|
|
|
|
)
|
|
|
|
|
|
2018-08-17 07:48:12 +00:00
|
|
|
|
Cti::Log.create!(
|
2016-05-31 08:56:13 +00:00
|
|
|
|
direction: 'out',
|
|
|
|
|
from: '4930609854180',
|
|
|
|
|
from_comment: 'Franz Bauer',
|
|
|
|
|
to: '4930609811111',
|
|
|
|
|
to_comment: 'Bob Smith',
|
2018-08-17 07:48:12 +00:00
|
|
|
|
call_id: rand(999_999_999),
|
2016-05-31 08:56:13 +00:00
|
|
|
|
comment: '',
|
|
|
|
|
state: 'newCall',
|
2019-07-09 22:07:32 +00:00
|
|
|
|
done: true,
|
2016-05-31 08:56:13 +00:00
|
|
|
|
preferences: {
|
|
|
|
|
to: [
|
|
|
|
|
{
|
|
|
|
|
caller_id: '4930726128135',
|
|
|
|
|
comment: nil,
|
|
|
|
|
level: 'known',
|
|
|
|
|
object: 'User',
|
|
|
|
|
o_id: 2,
|
|
|
|
|
user_id: 2,
|
|
|
|
|
}
|
|
|
|
|
]
|
2018-10-18 09:42:37 +00:00
|
|
|
|
},
|
|
|
|
|
created_at: Time.zone.now - 20.seconds,
|
2016-05-31 08:56:13 +00:00
|
|
|
|
)
|
|
|
|
|
|
2018-08-17 07:48:12 +00:00
|
|
|
|
Cti::Log.create!(
|
2016-05-31 08:56:13 +00:00
|
|
|
|
direction: 'in',
|
|
|
|
|
from: '4930609854180',
|
|
|
|
|
from_comment: 'Franz Bauer',
|
|
|
|
|
to: '4930609811111',
|
|
|
|
|
to_comment: 'Bob Smith',
|
2018-08-17 07:48:12 +00:00
|
|
|
|
call_id: rand(999_999_999),
|
2016-05-31 08:56:13 +00:00
|
|
|
|
comment: '',
|
|
|
|
|
state: 'answer',
|
2019-07-09 22:07:32 +00:00
|
|
|
|
done: true,
|
2016-05-31 08:56:13 +00:00
|
|
|
|
preferences: {
|
|
|
|
|
from: [
|
|
|
|
|
{
|
|
|
|
|
caller_id: '4930726128135',
|
|
|
|
|
comment: nil,
|
|
|
|
|
level: 'known',
|
|
|
|
|
object: 'User',
|
|
|
|
|
o_id: 2,
|
|
|
|
|
user_id: 2,
|
|
|
|
|
}
|
|
|
|
|
]
|
2018-10-18 09:42:37 +00:00
|
|
|
|
},
|
|
|
|
|
initialized_at: Time.zone.now - 20.seconds,
|
|
|
|
|
start_at: Time.zone.now - 30.seconds,
|
|
|
|
|
duration_waiting_time: 20,
|
|
|
|
|
created_at: Time.zone.now - 20.seconds,
|
2016-05-31 08:56:13 +00:00
|
|
|
|
)
|
|
|
|
|
|
2018-08-17 07:48:12 +00:00
|
|
|
|
Cti::Log.create!(
|
2016-05-31 08:56:13 +00:00
|
|
|
|
direction: 'in',
|
|
|
|
|
from: '4930609854180',
|
|
|
|
|
from_comment: 'Franz Bauer',
|
|
|
|
|
to: '4930609811111',
|
|
|
|
|
to_comment: 'Bob Smith',
|
2018-08-17 07:48:12 +00:00
|
|
|
|
call_id: rand(999_999_999),
|
2016-05-31 08:56:13 +00:00
|
|
|
|
comment: '',
|
|
|
|
|
state: 'hangup',
|
|
|
|
|
comment: 'normalClearing',
|
|
|
|
|
done: false,
|
|
|
|
|
preferences: {
|
|
|
|
|
from: [
|
|
|
|
|
{
|
|
|
|
|
caller_id: '4930726128135',
|
|
|
|
|
comment: nil,
|
|
|
|
|
level: 'known',
|
|
|
|
|
object: 'User',
|
|
|
|
|
o_id: 2,
|
|
|
|
|
user_id: 2,
|
|
|
|
|
}
|
|
|
|
|
]
|
2018-10-18 09:42:37 +00:00
|
|
|
|
},
|
|
|
|
|
initialized_at: Time.zone.now - 80.seconds,
|
|
|
|
|
start_at: Time.zone.now - 45.seconds,
|
|
|
|
|
end_at: Time.zone.now,
|
|
|
|
|
duration_waiting_time: 35,
|
|
|
|
|
duration_talking_time: 45,
|
|
|
|
|
created_at: Time.zone.now - 80.seconds,
|
2016-05-31 08:56:13 +00:00
|
|
|
|
)
|
|
|
|
|
|
2018-08-17 07:48:12 +00:00
|
|
|
|
Cti::Log.create!(
|
2016-05-31 08:56:13 +00:00
|
|
|
|
direction: 'in',
|
|
|
|
|
from: '4930609854180',
|
|
|
|
|
from_comment: 'Franz Bauer',
|
|
|
|
|
to: '4930609811111',
|
|
|
|
|
to_comment: 'Bob Smith',
|
2018-08-17 07:48:12 +00:00
|
|
|
|
call_id: rand(999_999_999),
|
2016-05-31 08:56:13 +00:00
|
|
|
|
comment: '',
|
|
|
|
|
state: 'hangup',
|
2019-07-09 22:07:32 +00:00
|
|
|
|
done: true,
|
2018-08-09 21:06:34 +00:00
|
|
|
|
start_at: Time.zone.now - 15.seconds,
|
|
|
|
|
end_at: Time.zone.now,
|
2016-05-31 08:56:13 +00:00
|
|
|
|
preferences: {
|
|
|
|
|
from: [
|
|
|
|
|
{
|
|
|
|
|
caller_id: '4930726128135',
|
|
|
|
|
comment: nil,
|
|
|
|
|
level: 'known',
|
|
|
|
|
object: 'User',
|
|
|
|
|
o_id: 2,
|
|
|
|
|
user_id: 2,
|
|
|
|
|
}
|
|
|
|
|
]
|
2018-10-18 09:42:37 +00:00
|
|
|
|
},
|
|
|
|
|
initialized_at: Time.zone.now - 5.minutes,
|
|
|
|
|
start_at: Time.zone.now - 3.minutes,
|
|
|
|
|
end_at: Time.zone.now - 20.seconds,
|
|
|
|
|
duration_waiting_time: 120,
|
|
|
|
|
duration_talking_time: 160,
|
|
|
|
|
created_at: Time.zone.now - 5.minutes,
|
2016-05-31 08:56:13 +00:00
|
|
|
|
)
|
|
|
|
|
|
2018-08-17 07:48:12 +00:00
|
|
|
|
Cti::Log.create!(
|
2016-05-31 08:56:13 +00:00
|
|
|
|
direction: 'in',
|
|
|
|
|
from: '4930609854180',
|
|
|
|
|
from_comment: 'Franz Bauer',
|
|
|
|
|
to: '4930609811111',
|
|
|
|
|
to_comment: '',
|
2018-08-17 07:48:12 +00:00
|
|
|
|
call_id: rand(999_999_999),
|
2016-05-31 08:56:13 +00:00
|
|
|
|
comment: '',
|
|
|
|
|
state: 'hangup',
|
2019-07-09 22:07:32 +00:00
|
|
|
|
done: true,
|
2018-08-09 21:06:34 +00:00
|
|
|
|
start_at: Time.zone.now - 15.seconds,
|
|
|
|
|
end_at: Time.zone.now,
|
2016-05-31 08:56:13 +00:00
|
|
|
|
preferences: {
|
|
|
|
|
from: [
|
|
|
|
|
{
|
|
|
|
|
caller_id: '4930726128135',
|
|
|
|
|
comment: nil,
|
|
|
|
|
level: 'known',
|
|
|
|
|
object: 'User',
|
|
|
|
|
o_id: 2,
|
|
|
|
|
user_id: 2,
|
|
|
|
|
}
|
|
|
|
|
]
|
2018-10-18 09:42:37 +00:00
|
|
|
|
},
|
|
|
|
|
initialized_at: Time.zone.now - 60.minutes,
|
|
|
|
|
start_at: Time.zone.now - 59.minutes,
|
|
|
|
|
end_at: Time.zone.now - 2.minutes,
|
|
|
|
|
duration_waiting_time: 60,
|
|
|
|
|
duration_talking_time: 3420,
|
|
|
|
|
created_at: Time.zone.now - 60.minutes,
|
2016-05-31 08:56:13 +00:00
|
|
|
|
)
|
|
|
|
|
|
2018-08-17 07:48:12 +00:00
|
|
|
|
Cti::Log.create!(
|
2016-05-31 08:56:13 +00:00
|
|
|
|
direction: 'in',
|
|
|
|
|
from: '4930609854180',
|
|
|
|
|
from_comment: 'Franz Bauer',
|
|
|
|
|
to: '4930609811111',
|
|
|
|
|
to_comment: 'Bob Smith',
|
2018-08-17 07:48:12 +00:00
|
|
|
|
call_id: rand(999_999_999),
|
2016-05-31 08:56:13 +00:00
|
|
|
|
comment: '',
|
|
|
|
|
state: 'hangup',
|
2019-07-09 22:07:32 +00:00
|
|
|
|
done: true,
|
2018-08-09 21:06:34 +00:00
|
|
|
|
start_at: Time.zone.now - 15.seconds,
|
|
|
|
|
end_at: Time.zone.now,
|
2016-05-31 08:56:13 +00:00
|
|
|
|
preferences: {
|
|
|
|
|
from: [
|
|
|
|
|
{
|
|
|
|
|
caller_id: '4930726128135',
|
|
|
|
|
comment: nil,
|
|
|
|
|
level: 'maybe',
|
|
|
|
|
object: 'User',
|
|
|
|
|
o_id: 2,
|
|
|
|
|
user_id: 2,
|
|
|
|
|
}
|
|
|
|
|
]
|
2018-10-18 09:42:37 +00:00
|
|
|
|
},
|
|
|
|
|
initialized_at: Time.zone.now - 240.minutes,
|
|
|
|
|
start_at: Time.zone.now - 235.minutes,
|
|
|
|
|
end_at: Time.zone.now - 222.minutes,
|
|
|
|
|
duration_waiting_time: 300,
|
|
|
|
|
duration_talking_time: 1080,
|
|
|
|
|
created_at: Time.zone.now - 240.minutes,
|
2016-05-31 08:56:13 +00:00
|
|
|
|
)
|
|
|
|
|
|
2018-08-17 07:48:12 +00:00
|
|
|
|
Cti::Log.create!(
|
2017-01-14 05:23:58 +00:00
|
|
|
|
direction: 'in',
|
|
|
|
|
from: '4930609854180',
|
|
|
|
|
to: '4930609811112',
|
2018-08-17 07:48:12 +00:00
|
|
|
|
call_id: rand(999_999_999),
|
2017-01-14 05:23:58 +00:00
|
|
|
|
comment: '',
|
|
|
|
|
state: 'hangup',
|
2019-07-09 22:07:32 +00:00
|
|
|
|
done: true,
|
2018-08-09 21:06:34 +00:00
|
|
|
|
start_at: Time.zone.now - 20.seconds,
|
|
|
|
|
end_at: Time.zone.now,
|
2018-10-18 09:42:37 +00:00
|
|
|
|
preferences: {},
|
|
|
|
|
initialized_at: Time.zone.now - 1440.minutes,
|
|
|
|
|
start_at: Time.zone.now - 1430.minutes,
|
|
|
|
|
end_at: Time.zone.now - 1429.minutes,
|
|
|
|
|
duration_waiting_time: 600,
|
|
|
|
|
duration_talking_time: 660,
|
|
|
|
|
created_at: Time.zone.now - 1440.minutes,
|
2017-01-14 05:23:58 +00:00
|
|
|
|
)
|
|
|
|
|
|
2016-04-23 09:04:33 +00:00
|
|
|
|
=end
|
|
|
|
|
|
2016-04-29 08:23:12 +00:00
|
|
|
|
=begin
|
|
|
|
|
|
2019-07-09 22:07:32 +00:00
|
|
|
|
Cti::Log.log(current_user)
|
2016-04-29 08:23:12 +00:00
|
|
|
|
|
|
|
|
|
returns
|
|
|
|
|
|
|
|
|
|
{
|
2018-08-17 07:48:12 +00:00
|
|
|
|
list: [log_record1, log_record2, log_record3],
|
|
|
|
|
assets: {...},
|
2016-04-29 08:23:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
=end
|
|
|
|
|
|
2019-07-09 22:07:32 +00:00
|
|
|
|
def self.log(current_user)
|
|
|
|
|
list = Cti::Log.log_records(current_user)
|
2016-04-29 08:23:12 +00:00
|
|
|
|
|
|
|
|
|
# add assets
|
2018-05-28 06:42:04 +00:00
|
|
|
|
assets = list.map(&:preferences)
|
|
|
|
|
.map { |p| p.slice(:from, :to) }
|
|
|
|
|
.map(&:values).flatten
|
2020-09-30 09:07:01 +00:00
|
|
|
|
.pluck(:user_id).compact
|
2018-05-28 06:42:04 +00:00
|
|
|
|
.map { |user_id| User.lookup(id: user_id) }.compact
|
|
|
|
|
.each.with_object({}) { |user, a| user.assets(a) }
|
2016-04-29 08:23:12 +00:00
|
|
|
|
|
|
|
|
|
{
|
2018-12-19 17:31:51 +00:00
|
|
|
|
list: list,
|
2016-04-29 08:23:12 +00:00
|
|
|
|
assets: assets,
|
|
|
|
|
}
|
|
|
|
|
end
|
|
|
|
|
|
2018-08-17 07:48:12 +00:00
|
|
|
|
=begin
|
|
|
|
|
|
2019-07-09 22:07:32 +00:00
|
|
|
|
Cti::Log.log_records(current_user)
|
2018-08-17 07:48:12 +00:00
|
|
|
|
|
|
|
|
|
returns
|
|
|
|
|
|
|
|
|
|
[log_record1, log_record2, log_record3]
|
|
|
|
|
|
|
|
|
|
=end
|
|
|
|
|
|
2019-07-09 22:07:32 +00:00
|
|
|
|
def self.log_records(current_user)
|
|
|
|
|
cti_config = Setting.get('cti_config')
|
|
|
|
|
if cti_config[:notify_map].present?
|
2021-05-12 10:31:00 +00:00
|
|
|
|
return Cti::Log.where(queue: queues_of_user(current_user, cti_config)).order(created_at: :desc).limit(view_limit)
|
2019-07-09 22:07:32 +00:00
|
|
|
|
end
|
|
|
|
|
|
2021-05-12 10:31:00 +00:00
|
|
|
|
Cti::Log.order(created_at: :desc).limit(view_limit)
|
2018-08-17 07:48:12 +00:00
|
|
|
|
end
|
|
|
|
|
|
2017-09-05 19:53:37 +00:00
|
|
|
|
=begin
|
|
|
|
|
|
|
|
|
|
processes a incoming event
|
|
|
|
|
|
|
|
|
|
Cti::Log.process(
|
2018-10-16 14:35:31 +00:00
|
|
|
|
cause: '',
|
|
|
|
|
event: 'newCall',
|
|
|
|
|
user: 'user 1',
|
|
|
|
|
from: '4912347114711',
|
|
|
|
|
to: '4930600000000',
|
|
|
|
|
callId: '43545211', # or call_id
|
|
|
|
|
direction: 'in',
|
|
|
|
|
queue: 'helpdesk', # optional
|
2017-09-05 19:53:37 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
=end
|
|
|
|
|
|
2016-11-29 20:12:27 +00:00
|
|
|
|
def self.process(params)
|
2018-09-25 14:52:46 +00:00
|
|
|
|
cause = params['cause']
|
2016-11-29 20:12:27 +00:00
|
|
|
|
event = params['event']
|
|
|
|
|
user = params['user']
|
2018-10-16 14:35:31 +00:00
|
|
|
|
queue = params['queue']
|
2018-05-28 23:45:29 +00:00
|
|
|
|
call_id = params['callId'] || params['call_id']
|
2020-10-22 13:57:01 +00:00
|
|
|
|
if user.instance_of?(Array)
|
2016-11-29 20:12:27 +00:00
|
|
|
|
user = user.join(', ')
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
from_comment = nil
|
|
|
|
|
to_comment = nil
|
|
|
|
|
preferences = nil
|
2018-08-17 07:48:12 +00:00
|
|
|
|
done = true
|
2016-11-29 20:12:27 +00:00
|
|
|
|
if params['direction'] == 'in'
|
2018-10-18 09:42:37 +00:00
|
|
|
|
if user.present?
|
|
|
|
|
to_comment = user
|
|
|
|
|
elsif queue.present?
|
|
|
|
|
to_comment = queue
|
|
|
|
|
end
|
2016-11-30 07:04:35 +00:00
|
|
|
|
from_comment, preferences = CallerId.get_comment_preferences(params['from'], 'from')
|
2019-07-09 22:07:32 +00:00
|
|
|
|
if queue.blank?
|
|
|
|
|
queue = params['to']
|
|
|
|
|
end
|
2016-11-29 20:12:27 +00:00
|
|
|
|
else
|
|
|
|
|
from_comment = user
|
2016-11-30 07:04:35 +00:00
|
|
|
|
to_comment, preferences = CallerId.get_comment_preferences(params['to'], 'to')
|
2019-07-09 22:07:32 +00:00
|
|
|
|
if queue.blank?
|
|
|
|
|
queue = params['from']
|
|
|
|
|
end
|
2016-11-29 20:12:27 +00:00
|
|
|
|
end
|
|
|
|
|
|
2018-09-25 14:52:46 +00:00
|
|
|
|
log = find_by(call_id: call_id)
|
|
|
|
|
|
2016-11-29 20:12:27 +00:00
|
|
|
|
case event
|
|
|
|
|
when 'newCall'
|
2018-08-17 07:48:12 +00:00
|
|
|
|
if params['direction'] == 'in'
|
|
|
|
|
done = false
|
|
|
|
|
end
|
2018-09-25 14:52:46 +00:00
|
|
|
|
raise "call_id #{call_id} already exists!" if log
|
2018-10-09 06:17:41 +00:00
|
|
|
|
|
2019-07-09 22:07:32 +00:00
|
|
|
|
log = create(
|
2018-12-19 17:31:51 +00:00
|
|
|
|
direction: params['direction'],
|
|
|
|
|
from: params['from'],
|
|
|
|
|
from_comment: from_comment,
|
|
|
|
|
to: params['to'],
|
|
|
|
|
to_comment: to_comment,
|
|
|
|
|
call_id: call_id,
|
|
|
|
|
comment: cause,
|
|
|
|
|
queue: queue,
|
|
|
|
|
state: event,
|
2018-08-09 21:06:34 +00:00
|
|
|
|
initialized_at: Time.zone.now,
|
2018-12-19 17:31:51 +00:00
|
|
|
|
preferences: preferences,
|
|
|
|
|
done: done,
|
2016-11-29 20:12:27 +00:00
|
|
|
|
)
|
|
|
|
|
when 'answer'
|
2018-05-28 23:45:29 +00:00
|
|
|
|
raise "No such call_id #{call_id}" if !log
|
2018-09-25 14:52:46 +00:00
|
|
|
|
return if log.state == 'hangup' # call is already hangup, ignore answer
|
2018-10-09 06:17:41 +00:00
|
|
|
|
|
2018-09-25 14:52:46 +00:00
|
|
|
|
log.with_lock do
|
|
|
|
|
log.state = 'answer'
|
|
|
|
|
log.start_at = Time.zone.now
|
|
|
|
|
log.duration_waiting_time = log.start_at.to_i - log.initialized_at.to_i
|
|
|
|
|
if user
|
|
|
|
|
log.to_comment = user
|
|
|
|
|
end
|
|
|
|
|
log.done = true
|
|
|
|
|
log.comment = cause
|
|
|
|
|
log.save
|
2016-11-29 20:12:27 +00:00
|
|
|
|
end
|
|
|
|
|
when 'hangup'
|
2018-05-28 23:45:29 +00:00
|
|
|
|
raise "No such call_id #{call_id}" if !log
|
2018-10-09 06:17:41 +00:00
|
|
|
|
|
2018-09-25 14:52:46 +00:00
|
|
|
|
log.with_lock do
|
|
|
|
|
log.done = done
|
|
|
|
|
if params['direction'] == 'in'
|
2020-11-12 11:42:44 +00:00
|
|
|
|
if (log.state == 'newCall' && cause != 'forwarded') || log.to_comment == 'voicemail' # rubocop:disable Style/SoleNestedConditional
|
2018-09-25 14:52:46 +00:00
|
|
|
|
log.done = false
|
|
|
|
|
end
|
2018-08-17 07:48:12 +00:00
|
|
|
|
end
|
2018-09-25 14:52:46 +00:00
|
|
|
|
log.state = 'hangup'
|
|
|
|
|
log.end_at = Time.zone.now
|
|
|
|
|
if log.start_at
|
2018-10-18 09:42:37 +00:00
|
|
|
|
log.duration_talking_time = log.end_at.to_i - log.start_at.to_i
|
2018-09-25 14:52:46 +00:00
|
|
|
|
elsif !log.duration_waiting_time && log.initialized_at
|
|
|
|
|
log.duration_waiting_time = log.end_at.to_i - log.initialized_at.to_i
|
|
|
|
|
end
|
|
|
|
|
log.comment = cause
|
|
|
|
|
log.save
|
2016-11-29 20:12:27 +00:00
|
|
|
|
end
|
|
|
|
|
else
|
2017-09-08 08:28:34 +00:00
|
|
|
|
raise ArgumentError, "Unknown event #{event.inspect}"
|
2016-11-29 20:12:27 +00:00
|
|
|
|
end
|
2018-08-17 14:12:28 +00:00
|
|
|
|
|
2019-07-09 22:07:32 +00:00
|
|
|
|
log
|
2016-04-23 09:04:33 +00:00
|
|
|
|
end
|
|
|
|
|
|
2018-08-17 07:48:12 +00:00
|
|
|
|
def self.push_caller_list_update?(record)
|
2021-05-12 10:31:00 +00:00
|
|
|
|
list_ids = Cti::Log.order(created_at: :desc).limit(view_limit).pluck(:id)
|
2018-08-17 14:12:28 +00:00
|
|
|
|
return true if list_ids.include?(record.id)
|
2018-10-09 06:17:41 +00:00
|
|
|
|
|
2018-08-17 14:12:28 +00:00
|
|
|
|
false
|
2018-08-17 07:48:12 +00:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def push_caller_list_update
|
2018-08-17 14:12:28 +00:00
|
|
|
|
return false if !Cti::Log.push_caller_list_update?(self)
|
2016-04-23 09:04:33 +00:00
|
|
|
|
|
2018-08-17 14:12:28 +00:00
|
|
|
|
# send notify on create/update/delete
|
2016-08-12 16:39:09 +00:00
|
|
|
|
users = User.with_permissions('cti.agent')
|
2017-10-01 12:25:52 +00:00
|
|
|
|
users.each do |user|
|
2016-04-23 09:04:33 +00:00
|
|
|
|
Sessions.send_to(
|
|
|
|
|
user.id,
|
|
|
|
|
{
|
|
|
|
|
event: 'cti_list_push',
|
|
|
|
|
},
|
|
|
|
|
)
|
2017-10-01 12:25:52 +00:00
|
|
|
|
end
|
2018-08-17 07:48:12 +00:00
|
|
|
|
true
|
2016-04-23 09:04:33 +00:00
|
|
|
|
end
|
2017-07-14 15:20:48 +00:00
|
|
|
|
|
|
|
|
|
=begin
|
|
|
|
|
|
|
|
|
|
cleanup caller logs
|
|
|
|
|
|
|
|
|
|
Cti::Log.cleanup
|
|
|
|
|
|
|
|
|
|
optional you can put the max oldest chat entries as argument
|
|
|
|
|
|
|
|
|
|
Cti::Log.cleanup(12.months)
|
|
|
|
|
|
|
|
|
|
=end
|
|
|
|
|
|
|
|
|
|
def self.cleanup(diff = 12.months)
|
|
|
|
|
Cti::Log.where('created_at < ?', Time.zone.now - diff).delete_all
|
|
|
|
|
true
|
|
|
|
|
end
|
|
|
|
|
|
2018-05-28 06:42:04 +00:00
|
|
|
|
# adds virtual attributes when rendering #to_json
|
|
|
|
|
# see http://api.rubyonrails.org/classes/ActiveModel/Serialization.html
|
|
|
|
|
def attributes
|
2021-05-12 10:31:00 +00:00
|
|
|
|
if !from_pretty || !to_pretty
|
|
|
|
|
set_pretty
|
|
|
|
|
end
|
|
|
|
|
|
2018-05-28 06:42:04 +00:00
|
|
|
|
virtual_attributes = {
|
|
|
|
|
'from_pretty' => from_pretty,
|
2018-12-19 17:31:51 +00:00
|
|
|
|
'to_pretty' => to_pretty,
|
2018-05-28 06:42:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
super.merge(virtual_attributes)
|
|
|
|
|
end
|
|
|
|
|
|
2021-05-12 10:31:00 +00:00
|
|
|
|
def set_pretty
|
|
|
|
|
%i[from to].each do |field|
|
2021-05-12 11:37:44 +00:00
|
|
|
|
parsed = TelephoneNumber.parse(send(field)&.sub(%r{^\+?}, '+'))
|
2021-05-12 10:31:00 +00:00
|
|
|
|
preferences[:"#{field}_pretty"] = parsed.send(parsed.valid? ? :international_number : :original_number)
|
|
|
|
|
end
|
2018-05-28 06:42:04 +00:00
|
|
|
|
end
|
2019-07-09 22:07:32 +00:00
|
|
|
|
|
|
|
|
|
=begin
|
|
|
|
|
|
2019-07-31 08:23:48 +00:00
|
|
|
|
returns queues of user
|
2019-07-09 22:07:32 +00:00
|
|
|
|
|
|
|
|
|
['queue1', 'queue2'] = Cti::Log.queues_of_user(User.find(123), config)
|
|
|
|
|
|
|
|
|
|
=end
|
|
|
|
|
|
|
|
|
|
def self.queues_of_user(user, config)
|
|
|
|
|
queues = []
|
|
|
|
|
config[:notify_map]&.each do |row|
|
|
|
|
|
next if row[:user_ids].blank?
|
2020-09-30 09:07:01 +00:00
|
|
|
|
next if row[:user_ids].exclude?(user.id.to_s) && row[:user_ids].exclude?(user.id)
|
2019-07-09 22:07:32 +00:00
|
|
|
|
|
|
|
|
|
queues.push row[:queue]
|
|
|
|
|
end
|
|
|
|
|
if user.phone.present?
|
|
|
|
|
caller_ids = Cti::CallerId.extract_numbers(user.phone)
|
2020-09-30 09:07:01 +00:00
|
|
|
|
queues.concat(caller_ids)
|
2019-07-09 22:07:32 +00:00
|
|
|
|
end
|
|
|
|
|
queues
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
=begin
|
|
|
|
|
|
|
|
|
|
return best customer id of caller log
|
|
|
|
|
|
|
|
|
|
log = Cti::Log.find(123)
|
|
|
|
|
customer_id = log.best_customer_id_of_log_entry
|
|
|
|
|
|
|
|
|
|
=end
|
|
|
|
|
|
|
|
|
|
def best_customer_id_of_log_entry
|
|
|
|
|
customer_id = nil
|
|
|
|
|
if preferences[:from].present?
|
|
|
|
|
preferences[:from].each do |entry|
|
|
|
|
|
if customer_id.blank?
|
|
|
|
|
customer_id = entry[:user_id]
|
|
|
|
|
end
|
|
|
|
|
next if entry[:level] != 'known'
|
|
|
|
|
|
|
|
|
|
customer_id = entry[:user_id]
|
|
|
|
|
break
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
customer_id
|
|
|
|
|
end
|
|
|
|
|
|
2021-05-12 10:31:00 +00:00
|
|
|
|
def self.view_limit
|
|
|
|
|
Hash(Setting.get('cti_config'))['view_limit'] || 60
|
|
|
|
|
end
|
2016-04-23 09:04:33 +00:00
|
|
|
|
end
|
|
|
|
|
end
|