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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +38 -2
  3. data/lib/queri.rb +1 -1
  4. data/lib/queri/stats/answered_calls/answered_calls_by_direction.rb +74 -0
  5. data/lib/queri/stats/answered_calls/answered_calls_by_queue.rb +74 -0
  6. data/lib/queri/stats/answered_calls/answered_calls_by_stints.rb +73 -0
  7. data/lib/queri/stats/answered_calls/calls_fully_within_the_given_time_interval.rb +82 -0
  8. data/lib/queri/stats/answered_calls/disconnection_causes.rb +73 -0
  9. data/lib/queri/stats/answered_calls/dnis_used.rb +73 -0
  10. data/lib/queri/stats/answered_calls/ivr_selection.rb +77 -0
  11. data/lib/queri/stats/answered_calls/music_on_hold_by_agent.rb +72 -0
  12. data/lib/queri/stats/answered_calls/queue_position.rb +73 -0
  13. data/lib/queri/stats/answered_calls/service_level_agreement.rb +73 -0
  14. data/lib/queri/stats/answered_calls/transfers.rb +73 -0
  15. data/lib/queri/stats/details_of_agent_sessions_and_pauses/detail_of_agent_pauses.rb +81 -0
  16. data/lib/queri/stats/details_of_agent_sessions_and_pauses/detail_of_agent_sessions.rb +81 -0
  17. data/lib/queri/stats/details_of_agents_sessions_and_pauses.rb +11 -0
  18. data/lib/queri/version.rb +1 -1
  19. data/spec/queri_spec.rb +1 -1
  20. data/spec/realtime/agents_spec.rb +2 -0
  21. data/spec/realtime/queues_spec.rb +2 -0
  22. data/spec/spec_helper.rb +0 -2
  23. data/spec/stats/agents_and_sessions/agent_availability_spec.rb +2 -0
  24. data/spec/stats/answered_calls/agents_on_queue_spec.rb +2 -0
  25. data/spec/stats/answered_calls/all_calls_spec.rb +2 -0
  26. data/spec/stats/answered_calls/answered_calls_by_direction_spec.rb +22 -0
  27. data/spec/stats/answered_calls/answered_calls_by_queue_spec.rb +22 -0
  28. data/spec/stats/answered_calls/answered_calls_by_stints_spec.rb +22 -0
  29. data/spec/stats/answered_calls/calls_fully_within_the_given_time_interval_spec.rb +20 -0
  30. data/spec/stats/answered_calls/disconnection_causes_spec.rb +20 -0
  31. data/spec/stats/answered_calls/dnis_used_spec.rb +22 -0
  32. data/spec/stats/answered_calls/ivr_selection_spec.rb +22 -0
  33. data/spec/stats/answered_calls/music_on_hold_by_agent_spec.rb +20 -0
  34. data/spec/stats/answered_calls/queue_position_spec.rb +22 -0
  35. data/spec/stats/answered_calls/service_level_agreement_spec.rb +20 -0
  36. data/spec/stats/answered_calls/transfers_spec.rb +27 -0
  37. data/spec/stats/details_of_agent_sessions_and_pauses/detail_of_agent_pauses_spec.rb +20 -0
  38. data/spec/stats/details_of_agent_sessions_and_pauses/detail_of_agent_sessions_spec.rb +20 -0
  39. data/spec/stats/details_of_agent_sessions_and_pauses/details_of_agent_sessions_and_pauses_spec.rb +7 -0
  40. data/spec/stats/unanswered_calls/all_calls_spec.rb +2 -0
  41. data/spec/support/shared/shared_examples_for_composite_agent_level_report_instance.rb +37 -0
  42. data/spec/support/shared/shared_examples_for_composite_aggregate_report_instance.rb +38 -0
  43. metadata +48 -4
  44. 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, "&nbsp;",
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
@@ -0,0 +1,11 @@
1
+ module Queri
2
+ class Stats
3
+ class DetailsOfAgentSessionsAndPauses
4
+ @@xml_code = "DetailsDO"
5
+
6
+ def self.xml_code
7
+ @@xml_code
8
+ end
9
+ end
10
+ end
11
+ end
data/lib/queri/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Queri
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
data/spec/queri_spec.rb CHANGED
@@ -190,7 +190,7 @@ describe Queri do
190
190
  context "without configurations" do
191
191
  before do
192
192
  @saved_configs = Queri.config.dup
193
- Queri.instance_variable_set(:@config, {})
193
+ Queri.class_variable_set(:@@server, nil)
194
194
  end
195
195
 
196
196
  after do
@@ -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