queri 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +38 -2
- data/lib/queri.rb +1 -1
- data/lib/queri/stats/answered_calls/answered_calls_by_direction.rb +74 -0
- data/lib/queri/stats/answered_calls/answered_calls_by_queue.rb +74 -0
- data/lib/queri/stats/answered_calls/answered_calls_by_stints.rb +73 -0
- data/lib/queri/stats/answered_calls/calls_fully_within_the_given_time_interval.rb +82 -0
- data/lib/queri/stats/answered_calls/disconnection_causes.rb +73 -0
- data/lib/queri/stats/answered_calls/dnis_used.rb +73 -0
- data/lib/queri/stats/answered_calls/ivr_selection.rb +77 -0
- data/lib/queri/stats/answered_calls/music_on_hold_by_agent.rb +72 -0
- data/lib/queri/stats/answered_calls/queue_position.rb +73 -0
- data/lib/queri/stats/answered_calls/service_level_agreement.rb +73 -0
- data/lib/queri/stats/answered_calls/transfers.rb +73 -0
- data/lib/queri/stats/details_of_agent_sessions_and_pauses/detail_of_agent_pauses.rb +81 -0
- data/lib/queri/stats/details_of_agent_sessions_and_pauses/detail_of_agent_sessions.rb +81 -0
- data/lib/queri/stats/details_of_agents_sessions_and_pauses.rb +11 -0
- data/lib/queri/version.rb +1 -1
- data/spec/queri_spec.rb +1 -1
- data/spec/realtime/agents_spec.rb +2 -0
- data/spec/realtime/queues_spec.rb +2 -0
- data/spec/spec_helper.rb +0 -2
- data/spec/stats/agents_and_sessions/agent_availability_spec.rb +2 -0
- data/spec/stats/answered_calls/agents_on_queue_spec.rb +2 -0
- data/spec/stats/answered_calls/all_calls_spec.rb +2 -0
- data/spec/stats/answered_calls/answered_calls_by_direction_spec.rb +22 -0
- data/spec/stats/answered_calls/answered_calls_by_queue_spec.rb +22 -0
- data/spec/stats/answered_calls/answered_calls_by_stints_spec.rb +22 -0
- data/spec/stats/answered_calls/calls_fully_within_the_given_time_interval_spec.rb +20 -0
- data/spec/stats/answered_calls/disconnection_causes_spec.rb +20 -0
- data/spec/stats/answered_calls/dnis_used_spec.rb +22 -0
- data/spec/stats/answered_calls/ivr_selection_spec.rb +22 -0
- data/spec/stats/answered_calls/music_on_hold_by_agent_spec.rb +20 -0
- data/spec/stats/answered_calls/queue_position_spec.rb +22 -0
- data/spec/stats/answered_calls/service_level_agreement_spec.rb +20 -0
- data/spec/stats/answered_calls/transfers_spec.rb +27 -0
- data/spec/stats/details_of_agent_sessions_and_pauses/detail_of_agent_pauses_spec.rb +20 -0
- data/spec/stats/details_of_agent_sessions_and_pauses/detail_of_agent_sessions_spec.rb +20 -0
- data/spec/stats/details_of_agent_sessions_and_pauses/details_of_agent_sessions_and_pauses_spec.rb +7 -0
- data/spec/stats/unanswered_calls/all_calls_spec.rb +2 -0
- data/spec/support/shared/shared_examples_for_composite_agent_level_report_instance.rb +37 -0
- data/spec/support/shared/shared_examples_for_composite_aggregate_report_instance.rb +38 -0
- metadata +48 -4
- data/spec/support/constantize.rb +0 -27
@@ -0,0 +1,81 @@
|
|
1
|
+
module Queri
|
2
|
+
class Stats
|
3
|
+
class DetailsOfAgentSessionsAndPauses
|
4
|
+
class DetailOfAgentPauses
|
5
|
+
attr_reader :response
|
6
|
+
|
7
|
+
class << self
|
8
|
+
def xml_code
|
9
|
+
DetailsOfAgentSessionsAndPauses.xml_code + ".AgentPauses"
|
10
|
+
end
|
11
|
+
|
12
|
+
def query_method
|
13
|
+
Stats.query_method
|
14
|
+
end
|
15
|
+
|
16
|
+
def key_translations
|
17
|
+
Hash[
|
18
|
+
:agent, "Agent",
|
19
|
+
:extension, "Ext.",
|
20
|
+
:pause_code, "Code",
|
21
|
+
:pause_activity, "Activity",
|
22
|
+
:pause_billable_code, " ",
|
23
|
+
:pause_billable, "Billable?",
|
24
|
+
:pause_start, "Start hour",
|
25
|
+
:pause_end, "End hour",
|
26
|
+
:pause_duration, "Duration"
|
27
|
+
]
|
28
|
+
end
|
29
|
+
|
30
|
+
def keys
|
31
|
+
key_translations.keys
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def initialize *args
|
36
|
+
raise ArgumentError, "expected arguments: queues(Array), period_start(Time), period_end(Time)" unless valid_args?(args)
|
37
|
+
@queues, @period_start, @period_end = normalize_times(*args)
|
38
|
+
@response = parse_response
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def valid_args? args
|
44
|
+
valid = true
|
45
|
+
valid = false if args[0].class != Array
|
46
|
+
valid = false if args[1].class != Time
|
47
|
+
valid = false if args[2].class != Time
|
48
|
+
if valid and args[0].empty?
|
49
|
+
raise ArgumentError, "queues array cannot be empty"
|
50
|
+
end
|
51
|
+
return valid
|
52
|
+
end
|
53
|
+
|
54
|
+
def normalize_times queues, period_start, period_end
|
55
|
+
if period_start > period_end
|
56
|
+
tmp = period_start
|
57
|
+
period_start = period_end
|
58
|
+
period_end = tmp
|
59
|
+
end
|
60
|
+
return [queues, period_start, period_end]
|
61
|
+
end
|
62
|
+
|
63
|
+
def parse_response
|
64
|
+
r = Queri.send_request(@queues, self, @period_start, @period_end)
|
65
|
+
xml_keys_to_human_readable_keys = self.class.key_translations.invert
|
66
|
+
new_keys = r.shift.map {|k| xml_keys_to_human_readable_keys[k]}
|
67
|
+
agent_metrics = []
|
68
|
+
r.each do |agent|
|
69
|
+
agent_metrics << Hash[new_keys.zip(agent)]
|
70
|
+
end
|
71
|
+
agents = agent_metrics.map {|a| a[:agent]}.uniq
|
72
|
+
parsed_metrics = Hash.new
|
73
|
+
agents.each do |agent|
|
74
|
+
parsed_metrics[agent] = agent_metrics.select {|m| m[:agent] == agent}
|
75
|
+
end
|
76
|
+
return parsed_metrics
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
module Queri
|
2
|
+
class Stats
|
3
|
+
class DetailsOfAgentSessionsAndPauses
|
4
|
+
class DetailOfAgentSessions
|
5
|
+
attr_reader :response
|
6
|
+
|
7
|
+
class << self
|
8
|
+
def xml_code
|
9
|
+
DetailsOfAgentSessionsAndPauses.xml_code + ".AgentSessions"
|
10
|
+
end
|
11
|
+
|
12
|
+
def query_method
|
13
|
+
Stats.query_method
|
14
|
+
end
|
15
|
+
|
16
|
+
def key_translations
|
17
|
+
Hash[
|
18
|
+
:agent, "Agent",
|
19
|
+
:clock_in, "Start hour",
|
20
|
+
:clock_out, "End hour",
|
21
|
+
:session_duration, "Duration",
|
22
|
+
:call_back_extension, "Ext.",
|
23
|
+
:termination, "Termination",
|
24
|
+
:number_of_pauses, "Pause",
|
25
|
+
:total_pause_time, "P.Time",
|
26
|
+
:server, "Srv"
|
27
|
+
]
|
28
|
+
end
|
29
|
+
|
30
|
+
def keys
|
31
|
+
key_translations.keys
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def initialize *args
|
36
|
+
raise ArgumentError, "expected arguments: queues(Array), period_start(Time), period_end(Time)" unless valid_args?(args)
|
37
|
+
@queues, @period_start, @period_end = normalize_times(*args)
|
38
|
+
@response = parse_response
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def valid_args? args
|
44
|
+
valid = true
|
45
|
+
valid = false if args[0].class != Array
|
46
|
+
valid = false if args[1].class != Time
|
47
|
+
valid = false if args[2].class != Time
|
48
|
+
if valid and args[0].empty?
|
49
|
+
raise ArgumentError, "queues array cannot be empty"
|
50
|
+
end
|
51
|
+
return valid
|
52
|
+
end
|
53
|
+
|
54
|
+
def normalize_times queues, period_start, period_end
|
55
|
+
if period_start > period_end
|
56
|
+
tmp = period_start
|
57
|
+
period_start = period_end
|
58
|
+
period_end = tmp
|
59
|
+
end
|
60
|
+
return [queues, period_start, period_end]
|
61
|
+
end
|
62
|
+
|
63
|
+
def parse_response
|
64
|
+
r = Queri.send_request(@queues, self, @period_start, @period_end)
|
65
|
+
xml_keys_to_human_readable_keys = self.class.key_translations.invert
|
66
|
+
new_keys = r.shift.map {|k| xml_keys_to_human_readable_keys[k]}
|
67
|
+
agent_metrics = []
|
68
|
+
r.each do |agent|
|
69
|
+
agent_metrics << Hash[new_keys.zip(agent)]
|
70
|
+
end
|
71
|
+
agents = agent_metrics.map {|a| a[:agent]}.uniq
|
72
|
+
parsed_metrics = Hash.new
|
73
|
+
agents.each do |agent|
|
74
|
+
parsed_metrics[agent] = agent_metrics.select {|m| m[:agent] == agent}
|
75
|
+
end
|
76
|
+
return parsed_metrics
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
data/lib/queri/version.rb
CHANGED
data/spec/queri_spec.rb
CHANGED
@@ -4,6 +4,8 @@ describe Queri::Realtime::Agents do
|
|
4
4
|
let(:report_class) { Queri::Realtime::Agents }
|
5
5
|
let(:xml_code) { report_class.xml_code }
|
6
6
|
|
7
|
+
before { Queri.configure_with(File.join(File.dirname(__FILE__), '..', 'config.yml')) }
|
8
|
+
|
7
9
|
it_behaves_like "a report class"
|
8
10
|
|
9
11
|
it_behaves_like "a report method"
|
@@ -4,6 +4,8 @@ describe Queri::Realtime::Queues do
|
|
4
4
|
let(:report_class) { Queri::Realtime::Queues }
|
5
5
|
let(:xml_code) { report_class.xml_code }
|
6
6
|
|
7
|
+
before { Queri.configure_with(File.join(File.dirname(__FILE__), '..', 'config.yml')) }
|
8
|
+
|
7
9
|
it_behaves_like "a report class"
|
8
10
|
|
9
11
|
it_behaves_like "a report method"
|
data/spec/spec_helper.rb
CHANGED
@@ -2,10 +2,8 @@ require 'rubygems'
|
|
2
2
|
require 'bundler/setup'
|
3
3
|
require 'queri'
|
4
4
|
Dir[File.join( File.dirname(__FILE__), 'support', '**', '*.rb' )].each {|f| require f}
|
5
|
-
#require File.join(File.dirname(__FILE__), '..', 'lib', 'queuemetrics.rb')
|
6
5
|
|
7
6
|
RSpec.configure do |config|
|
8
7
|
include TimeHelper
|
9
|
-
include Constantize
|
10
8
|
config.treat_symbols_as_metadata_keys_with_true_values = true
|
11
9
|
end
|
@@ -4,6 +4,8 @@ describe Queri::Stats::AgentsAndSessions::AgentAvailability do
|
|
4
4
|
let(:report_class) { Queri::Stats::AgentsAndSessions::AgentAvailability }
|
5
5
|
let(:xml_code) { report_class.xml_code }
|
6
6
|
|
7
|
+
before { Queri.configure_with(File.join(File.dirname(__FILE__), '..', '..', 'config.yml')) }
|
8
|
+
|
7
9
|
it_behaves_like "a report class"
|
8
10
|
|
9
11
|
it_behaves_like "a report method"
|
@@ -4,6 +4,8 @@ describe Queri::Stats::AnsweredCalls::AgentsOnQueue do
|
|
4
4
|
let(:report_class) { Queri::Stats::AnsweredCalls::AgentsOnQueue }
|
5
5
|
let(:xml_code) { report_class.xml_code }
|
6
6
|
|
7
|
+
before { Queri.configure_with(File.join(File.dirname(__FILE__), '..', '..', 'config.yml')) }
|
8
|
+
|
7
9
|
it_behaves_like "a report class"
|
8
10
|
|
9
11
|
it_behaves_like "a report method"
|
@@ -4,6 +4,8 @@ describe Queri::Stats::AnsweredCalls::AllCalls do
|
|
4
4
|
let(:report_class) { Queri::Stats::AnsweredCalls::AllCalls }
|
5
5
|
let(:xml_code) { report_class.xml_code }
|
6
6
|
|
7
|
+
before { Queri.configure_with(File.join(File.dirname(__FILE__), '..', '..', 'config.yml')) }
|
8
|
+
|
7
9
|
it_behaves_like "a report class"
|
8
10
|
|
9
11
|
it_behaves_like "a report method"
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Queri::Stats::AnsweredCalls::AnsweredCallsByDirection do
|
4
|
+
let(:report_class) { Queri::Stats::AnsweredCalls::AnsweredCallsByDirection }
|
5
|
+
let(:xml_code) { report_class.xml_code }
|
6
|
+
|
7
|
+
before do
|
8
|
+
Queri.configure_with(File.join(File.dirname(__FILE__), '..', '..', 'config.yml'))
|
9
|
+
end
|
10
|
+
|
11
|
+
it_behaves_like "a report class"
|
12
|
+
|
13
|
+
it_behaves_like "a report method"
|
14
|
+
|
15
|
+
it_behaves_like "a queuemetrics report"
|
16
|
+
|
17
|
+
it_behaves_like "a stats report"
|
18
|
+
|
19
|
+
describe "An instance of", Queri::Stats::AnsweredCalls::AnsweredCallsByDirection do
|
20
|
+
it_behaves_like "a composite aggregate report instance"
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Queri::Stats::AnsweredCalls::AnsweredCallsByQueue do
|
4
|
+
let(:report_class) { Queri::Stats::AnsweredCalls::AnsweredCallsByQueue }
|
5
|
+
let(:xml_code) { report_class.xml_code }
|
6
|
+
|
7
|
+
before do
|
8
|
+
Queri.configure_with(File.join(File.dirname(__FILE__), '..', '..', 'config.yml'))
|
9
|
+
end
|
10
|
+
|
11
|
+
it_behaves_like "a report class"
|
12
|
+
|
13
|
+
it_behaves_like "a report method"
|
14
|
+
|
15
|
+
it_behaves_like "a queuemetrics report"
|
16
|
+
|
17
|
+
it_behaves_like "a stats report"
|
18
|
+
|
19
|
+
describe "An instance of", Queri::Stats::AnsweredCalls::AnsweredCallsByQueue do
|
20
|
+
it_behaves_like "a composite aggregate report instance"
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Queri::Stats::AnsweredCalls::AnsweredCallsByStints do
|
4
|
+
let(:report_class) { Queri::Stats::AnsweredCalls::AnsweredCallsByStints }
|
5
|
+
let(:xml_code) { report_class.xml_code }
|
6
|
+
|
7
|
+
before do
|
8
|
+
Queri.configure_with(File.join(File.dirname(__FILE__), '..', '..', 'config.yml'))
|
9
|
+
end
|
10
|
+
|
11
|
+
it_behaves_like "a report class"
|
12
|
+
|
13
|
+
it_behaves_like "a report method"
|
14
|
+
|
15
|
+
it_behaves_like "a queuemetrics report"
|
16
|
+
|
17
|
+
it_behaves_like "a stats report"
|
18
|
+
|
19
|
+
describe "An instance of", Queri::Stats::AnsweredCalls::AnsweredCallsByStints do
|
20
|
+
it_behaves_like "a composite aggregate report instance"
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Queri::Stats::AnsweredCalls::CallsFullyWithinTheGivenTimeInterval do
|
4
|
+
let(:report_class) { Queri::Stats::AnsweredCalls::CallsFullyWithinTheGivenTimeInterval }
|
5
|
+
let(:xml_code) { report_class.xml_code }
|
6
|
+
|
7
|
+
before { Queri.configure_with(File.join(File.dirname(__FILE__), '..', '..', 'config.yml')) }
|
8
|
+
|
9
|
+
it_behaves_like "a report class"
|
10
|
+
|
11
|
+
it_behaves_like "a report method"
|
12
|
+
|
13
|
+
it_behaves_like "a queuemetrics report"
|
14
|
+
|
15
|
+
it_behaves_like "a stats report"
|
16
|
+
|
17
|
+
describe "An instance of", Queri::Stats::AnsweredCalls::CallsFullyWithinTheGivenTimeInterval do
|
18
|
+
it_behaves_like "an aggregate report instance"
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Queri::Stats::AnsweredCalls::DisconnectionCauses do
|
4
|
+
let(:report_class) { Queri::Stats::AnsweredCalls::DisconnectionCauses }
|
5
|
+
let(:xml_code) { report_class.xml_code }
|
6
|
+
|
7
|
+
before { Queri.configure_with(File.join(File.dirname(__FILE__), '..', '..', 'config.yml')) }
|
8
|
+
|
9
|
+
it_behaves_like "a report class"
|
10
|
+
|
11
|
+
it_behaves_like "a report method"
|
12
|
+
|
13
|
+
it_behaves_like "a queuemetrics report"
|
14
|
+
|
15
|
+
it_behaves_like "a stats report"
|
16
|
+
|
17
|
+
describe "An instance of", Queri::Stats::AnsweredCalls::DisconnectionCauses do
|
18
|
+
it_behaves_like "a composite aggregate report instance"
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Queri::Stats::AnsweredCalls::DnisUsed do
|
4
|
+
let(:report_class) { Queri::Stats::AnsweredCalls::DnisUsed }
|
5
|
+
let(:xml_code) { report_class.xml_code }
|
6
|
+
|
7
|
+
before do
|
8
|
+
Queri.configure_with(File.join(File.dirname(__FILE__), '..', '..', 'config.yml'))
|
9
|
+
end
|
10
|
+
|
11
|
+
it_behaves_like "a report class"
|
12
|
+
|
13
|
+
it_behaves_like "a report method"
|
14
|
+
|
15
|
+
it_behaves_like "a queuemetrics report"
|
16
|
+
|
17
|
+
it_behaves_like "a stats report"
|
18
|
+
|
19
|
+
describe "An instance of", Queri::Stats::AnsweredCalls::DnisUsed do
|
20
|
+
it_behaves_like "a composite aggregate report instance"
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Queri::Stats::AnsweredCalls::IvrSelection do
|
4
|
+
let(:report_class) { Queri::Stats::AnsweredCalls::IvrSelection }
|
5
|
+
let(:xml_code) { report_class.xml_code }
|
6
|
+
|
7
|
+
before do
|
8
|
+
Queri.configure_with(File.join(File.dirname(__FILE__), '..', '..', 'config.yml'))
|
9
|
+
end
|
10
|
+
|
11
|
+
it_behaves_like "a report class"
|
12
|
+
|
13
|
+
it_behaves_like "a report method"
|
14
|
+
|
15
|
+
it_behaves_like "a queuemetrics report"
|
16
|
+
|
17
|
+
it_behaves_like "a stats report"
|
18
|
+
|
19
|
+
describe "An instance of", Queri::Stats::AnsweredCalls::IvrSelection do
|
20
|
+
it_behaves_like "a composite aggregate report instance"
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Queri::Stats::AnsweredCalls::MusicOnHoldByAgent do
|
4
|
+
let(:report_class) { Queri::Stats::AnsweredCalls::MusicOnHoldByAgent }
|
5
|
+
let(:xml_code) { report_class.xml_code }
|
6
|
+
|
7
|
+
before { Queri.configure_with(File.join(File.dirname(__FILE__), '..', '..', 'config.yml')) }
|
8
|
+
|
9
|
+
it_behaves_like "a report class"
|
10
|
+
|
11
|
+
it_behaves_like "a report method"
|
12
|
+
|
13
|
+
it_behaves_like "a queuemetrics report"
|
14
|
+
|
15
|
+
it_behaves_like "a stats report"
|
16
|
+
|
17
|
+
describe "An instance of", Queri::Stats::AnsweredCalls::MusicOnHoldByAgent do
|
18
|
+
it_behaves_like "an agent-level report instance"
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Queri::Stats::AnsweredCalls::QueuePosition do
|
4
|
+
let(:report_class) { Queri::Stats::AnsweredCalls::QueuePosition }
|
5
|
+
let(:xml_code) { report_class.xml_code }
|
6
|
+
|
7
|
+
before do
|
8
|
+
Queri.configure_with(File.join(File.dirname(__FILE__), '..', '..', 'config.yml'))
|
9
|
+
end
|
10
|
+
|
11
|
+
it_behaves_like "a report class"
|
12
|
+
|
13
|
+
it_behaves_like "a report method"
|
14
|
+
|
15
|
+
it_behaves_like "a queuemetrics report"
|
16
|
+
|
17
|
+
it_behaves_like "a stats report"
|
18
|
+
|
19
|
+
describe "An instance of", Queri::Stats::AnsweredCalls::QueuePosition do
|
20
|
+
it_behaves_like "a composite aggregate report instance"
|
21
|
+
end
|
22
|
+
end
|