Skip to content

Commit

Permalink
Improved data structure of cti caller log to get better statistics.
Browse files Browse the repository at this point in the history
  • Loading branch information
martini committed Aug 9, 2018
1 parent a93f81e commit 72792fa
Show file tree
Hide file tree
Showing 4 changed files with 103 additions and 13 deletions.
27 changes: 17 additions & 10 deletions app/models/cti/log.rb
Expand Up @@ -149,8 +149,8 @@ class Log < ApplicationModel
call_id: '00005',
comment: '',
state: 'hangup',
start: Time.zone.now - 15.seconds,
'end': Time.zone.now,
start_at: Time.zone.now - 15.seconds,
end_at: Time.zone.now,
preferences: {
from: [
{
Expand All @@ -174,8 +174,8 @@ class Log < ApplicationModel
call_id: '00006',
comment: '',
state: 'hangup',
start: Time.zone.now - 15.seconds,
'end': Time.zone.now,
start_at: Time.zone.now - 15.seconds,
end_at: Time.zone.now,
preferences: {
from: [
{
Expand All @@ -199,8 +199,8 @@ class Log < ApplicationModel
call_id: '00007',
comment: '',
state: 'hangup',
start: Time.zone.now - 15.seconds,
'end': Time.zone.now,
start_at: Time.zone.now - 15.seconds,
end_at: Time.zone.now,
preferences: {
from: [
{
Expand All @@ -222,8 +222,8 @@ class Log < ApplicationModel
call_id: '00008',
comment: '',
state: 'hangup',
start: Time.zone.now - 20.seconds,
'end': Time.zone.now,
start_at: Time.zone.now - 20.seconds,
end_at: Time.zone.now,
preferences: {}
)
Expand Down Expand Up @@ -306,13 +306,15 @@ def self.process(params)
call_id: call_id,
comment: comment,
state: event,
initialized_at: Time.zone.now,
preferences: preferences,
)
when 'answer'
log = find_by(call_id: call_id)
raise "No such call_id #{call_id}" if !log
log.state = 'answer'
log.start = Time.zone.now
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
Expand All @@ -328,7 +330,12 @@ def self.process(params)
log.done = false
end
log.state = 'hangup'
log.end = Time.zone.now
log.end_at = Time.zone.now
if log.start_at
log.duration_talking_time = log.start_at.to_i - log.end_at.to_i
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 = comment
log.save
else
Expand Down
8 changes: 6 additions & 2 deletions db/migrate/20120101000001_create_base.rb
Expand Up @@ -642,10 +642,14 @@ def up
t.string :from_comment, limit: 250, null: true
t.string :to, limit: 100, null: false
t.string :to_comment, limit: 250, null: true
t.string :queue, limit: 250, null: true
t.string :call_id, limit: 250, null: false
t.string :comment, limit: 500, null: true
t.timestamp :start, limit: 3, null: true
t.timestamp :end, limit: 3, null: true
t.timestamp :initialized_at, limit: 3, null: true
t.timestamp :start_at, limit: 3, null: true
t.timestamp :end_at, limit: 3, null: true
t.integer :duration_waiting_time, null: true
t.integer :duration_talking_time, null: true
t.boolean :done, null: false, default: true
t.text :preferences, limit: 500.kilobytes + 1, null: true
t.timestamps limit: 3, null: false
Expand Down
@@ -1,4 +1,4 @@
class SettingCti < ActiveRecord::Migration[5.1]
class CtiGenericApi < ActiveRecord::Migration[5.1]
def up

# return if it's a new setup
Expand Down Expand Up @@ -66,5 +66,14 @@ def up
},
frontend: false
)

add_column :cti_logs, :queue, :string, limit: 250, null: true
add_column :cti_logs, :initialized_at, :string, limit: 250, null: true
add_column :cti_logs, :duration_waiting_time, :integer, null: true
add_column :cti_logs, :duration_talking_time, :integer, null: true

rename_column :cti_logs, :start, :start_at
rename_column :cti_logs, :end, :end_at

end
end
70 changes: 70 additions & 0 deletions test/controllers/integration_cti_controller_test.rb
Expand Up @@ -180,6 +180,11 @@ class IntegrationCtiControllerTest < ActionDispatch::IntegrationTest
assert_nil(log.comment)
assert_equal('newCall', log.state)
assert_equal(true, log.done)
assert(log.initialized_at)
assert_nil(log.start_at)
assert_nil(log.end_at)
assert_nil(log.duration_waiting_time)
assert_nil(log.duration_talking_time)

# outbound - I - hangup by agent
params = 'event=hangup&direction=out&call_id=1234567890-1&cause=cancel'
Expand All @@ -195,6 +200,11 @@ class IntegrationCtiControllerTest < ActionDispatch::IntegrationTest
assert_equal('cancel', log.comment)
assert_equal('hangup', log.state)
assert_equal(true, log.done)
assert(log.initialized_at)
assert_nil(log.start_at)
assert(log.end_at)
assert(log.duration_waiting_time)
assert_nil(log.duration_talking_time)

# outbound - II - new call
params = 'event=newCall&direction=out&from=4930600000000&to=4912347114711&call_id=1234567890-2&user%5B%5D=user+1'
Expand All @@ -210,6 +220,11 @@ class IntegrationCtiControllerTest < ActionDispatch::IntegrationTest
assert_nil(log.comment)
assert_equal('newCall', log.state)
assert_equal(true, log.done)
assert(log.initialized_at)
assert_nil(log.start_at)
assert_nil(log.end_at)
assert_nil(log.duration_waiting_time)
assert_nil(log.duration_talking_time)

# outbound - II - answer by customer
params = 'event=answer&direction=out&call_id=1234567890-2&from=4930600000000&to=4912347114711'
Expand All @@ -225,6 +240,11 @@ class IntegrationCtiControllerTest < ActionDispatch::IntegrationTest
assert_nil(log.comment)
assert_equal('answer', log.state)
assert_equal(true, log.done)
assert(log.initialized_at)
assert(log.start_at)
assert_nil(log.end_at)
assert(log.duration_waiting_time)
assert_nil(log.duration_talking_time)

# outbound - II - hangup by customer
params = 'event=hangup&direction=out&call_id=1234567890-2&cause=normalClearing&from=4930600000000&to=4912347114711'
Expand All @@ -240,6 +260,11 @@ class IntegrationCtiControllerTest < ActionDispatch::IntegrationTest
assert_equal('normalClearing', log.comment)
assert_equal('hangup', log.state)
assert_equal(true, log.done)
assert(log.initialized_at)
assert(log.start_at)
assert(log.end_at)
assert(log.duration_waiting_time)
assert(log.duration_talking_time)

# inbound - I - new call
params = 'event=newCall&direction=in&to=4930600000000&from=4912347114711&call_id=1234567890-3&user%5B%5D=user+1'
Expand All @@ -255,6 +280,11 @@ class IntegrationCtiControllerTest < ActionDispatch::IntegrationTest
assert_nil(log.comment)
assert_equal('newCall', log.state)
assert_equal(true, log.done)
assert(log.initialized_at)
assert_nil(log.start_at)
assert_nil(log.end_at)
assert_nil(log.duration_waiting_time)
assert_nil(log.duration_talking_time)

# inbound - I - answer by customer
params = 'event=answer&direction=in&call_id=1234567890-3&to=4930600000000&from=4912347114711'
Expand All @@ -270,6 +300,11 @@ class IntegrationCtiControllerTest < ActionDispatch::IntegrationTest
assert_nil(log.comment)
assert_equal('answer', log.state)
assert_equal(true, log.done)
assert(log.initialized_at)
assert(log.start_at)
assert_nil(log.end_at)
assert(log.duration_waiting_time)
assert_nil(log.duration_talking_time)

# inbound - I - hangup by customer
params = 'event=hangup&direction=in&call_id=1234567890-3&cause=normalClearing&to=4930600000000&from=4912347114711'
Expand All @@ -285,6 +320,11 @@ class IntegrationCtiControllerTest < ActionDispatch::IntegrationTest
assert_equal('normalClearing', log.comment)
assert_equal('hangup', log.state)
assert_equal(true, log.done)
assert(log.initialized_at)
assert(log.start_at)
assert(log.end_at)
assert(log.duration_waiting_time)
assert(log.duration_talking_time)

# inbound - II - new call
params = 'event=newCall&direction=in&to=4930600000000&from=4912347114711&call_id=1234567890-4&user%5B%5D=user+1,user+2'
Expand All @@ -300,6 +340,11 @@ class IntegrationCtiControllerTest < ActionDispatch::IntegrationTest
assert_nil(log.comment)
assert_equal('newCall', log.state)
assert_equal(true, log.done)
assert(log.initialized_at)
assert_nil(log.start_at)
assert_nil(log.end_at)
assert_nil(log.duration_waiting_time)
assert_nil(log.duration_talking_time)

# inbound - II - answer by voicemail
params = 'event=answer&direction=in&call_id=1234567890-4&to=4930600000000&from=4912347114711&user=voicemail'
Expand All @@ -315,6 +360,11 @@ class IntegrationCtiControllerTest < ActionDispatch::IntegrationTest
assert_nil(log.comment)
assert_equal('answer', log.state)
assert_equal(true, log.done)
assert(log.initialized_at)
assert(log.start_at)
assert_nil(log.end_at)
assert(log.duration_waiting_time)
assert_nil(log.duration_talking_time)

# inbound - II - hangup by customer
params = 'event=hangup&direction=in&call_id=1234567890-4&cause=normalClearing&to=4930600000000&from=4912347114711'
Expand All @@ -330,6 +380,11 @@ class IntegrationCtiControllerTest < ActionDispatch::IntegrationTest
assert_equal('normalClearing', log.comment)
assert_equal('hangup', log.state)
assert_equal(false, log.done)
assert(log.initialized_at)
assert(log.start_at)
assert(log.end_at)
assert(log.duration_waiting_time)
assert(log.duration_talking_time)

# inbound - III - new call
params = 'event=newCall&direction=in&to=4930600000000&from=4912347114711&call_id=1234567890-5&user%5B%5D=user+1,user+2'
Expand All @@ -345,6 +400,11 @@ class IntegrationCtiControllerTest < ActionDispatch::IntegrationTest
assert_nil(log.comment)
assert_equal('newCall', log.state)
assert_equal(true, log.done)
assert(log.initialized_at)
assert_nil(log.start_at)
assert_nil(log.end_at)
assert_nil(log.duration_waiting_time)
assert_nil(log.duration_talking_time)

# inbound - III - hangup by customer
params = 'event=hangup&direction=in&call_id=1234567890-5&cause=normalClearing&to=4930600000000&from=4912347114711'
Expand All @@ -360,6 +420,11 @@ class IntegrationCtiControllerTest < ActionDispatch::IntegrationTest
assert_equal('normalClearing', log.comment)
assert_equal('hangup', log.state)
assert_equal(false, log.done)
assert(log.initialized_at)
assert_nil(log.start_at)
assert(log.end_at)
assert(log.duration_waiting_time)
assert_nil(log.duration_talking_time)

# inbound - IV - new call
params = 'event=newCall&direction=in&to=4930600000000&from=49999992222222&call_id=1234567890-6&user%5B%5D=user+1,user+2'
Expand All @@ -377,6 +442,11 @@ class IntegrationCtiControllerTest < ActionDispatch::IntegrationTest
assert_nil(log.comment)
assert_equal('newCall', log.state)
assert_equal(true, log.done)
assert(log.initialized_at)
assert_nil(log.start_at)
assert_nil(log.end_at)
assert_nil(log.duration_waiting_time)
assert_nil(log.duration_talking_time)

# get caller list
get '/api/v1/cti/log'
Expand Down

0 comments on commit 72792fa

Please sign in to comment.