Browse Source

Improved data structure of cti caller log to get better statistics.

Martin Edenhofer 6 years ago
parent
commit
72792fadd6

+ 17 - 10
app/models/cti/log.rb

@@ -149,8 +149,8 @@ example data, can be used for demo
     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: [
         {
@@ -174,8 +174,8 @@ example data, can be used for demo
     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: [
         {
@@ -199,8 +199,8 @@ example data, can be used for demo
     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: [
         {
@@ -222,8 +222,8 @@ example data, can be used for demo
     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: {}
   )
 
@@ -306,13 +306,15 @@ Cti::Log.process(
           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
@@ -328,7 +330,12 @@ Cti::Log.process(
           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

+ 6 - 2
db/migrate/20120101000001_create_base.rb

@@ -642,10 +642,14 @@ class CreateBase < ActiveRecord::Migration[4.2]
       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

+ 10 - 1
db/migrate/20180420000001_setting_cti.rb → db/migrate/20180809000001_cti_generic_api.rb

@@ -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
@@ -66,5 +66,14 @@ class SettingCti < ActiveRecord::Migration[5.1]
       },
       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 - 0
test/controllers/integration_cti_controller_test.rb

@@ -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'
@@ -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'
@@ -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'
@@ -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'
@@ -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'
@@ -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'
@@ -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'
@@ -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'
@@ -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'
@@ -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'
@@ -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'
@@ -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'
@@ -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'
@@ -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'