kpi_manager 0.1.0.pre → 0.2.0.pre

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 985c3aca449032e19dd3a05f7e2d487294c5672d
4
- data.tar.gz: 6bf47a080c73fcace81ae070bbb45c418e48d5b2
3
+ metadata.gz: 3c8f55cc566b14da16121391756278ad78e4e884
4
+ data.tar.gz: caed2e8541f8f30178830b7c9303fcf76228b5b3
5
5
  SHA512:
6
- metadata.gz: 88c32c4ebc9a5879f4f3c2760b750aa2575a3c4ca27699234ac3ae37b9f33351596996549ce10bc938880abb93f031d0e619b6cf4b3463d2b12e5c132ceb7d48
7
- data.tar.gz: e506c3ae26086b59c5a14a95e7b5f1efcb650ad04c124990812d8940c257070f63ae97f747375be92e963d6de224384dde6a7ad3ba638853f012627be8fa8506
6
+ metadata.gz: 3dfc53eaa8809ebc952bb8981a8af9a84ee36b1d834610768d332c80ac9e04e4edd293aa9671e6abc9eecdeefdb0ebcbc74dea8ef7c090e65afe31f7c77e8629
7
+ data.tar.gz: c05ad8ad69f2c24ce65cfc6fd5a94552566ae27d28a40d12daf222bf66948a8e8340afbc9a686ea8ac88c89d0d311a9eb37cd3e2daf8d2e5ee7c6e9d15467993
File without changes
File without changes
@@ -10,6 +10,8 @@ module KpiManager
10
10
  @to = to || Time.zone.now
11
11
  @report = []
12
12
 
13
+ @datacache.clear
14
+
13
15
  registered_kpis.each do |kpi_name, kpi_data|
14
16
  @report << [
15
17
  kpi_data[:label],
@@ -21,7 +23,35 @@ module KpiManager
21
23
  ]
22
24
  end
23
25
 
24
- @report
26
+ rr = KpiManager::ReportingResult.new(@report)
27
+ rr.from = @from
28
+ rr.to = @to
29
+ rr
30
+ end
31
+
32
+ def compare(from, to)
33
+ @from = from
34
+ @to = to
35
+ self
36
+ end
37
+
38
+ def with(oth_from, oth_to)
39
+ raise RuntimeError, 'No date range set' unless @from && @to
40
+
41
+ left = self.generate(@from, @to).results
42
+ right = self.generate(oth_from, oth_to).results
43
+
44
+ res = left.zip(right).map do |left, right|
45
+ [
46
+ left[0],
47
+ (right[1].to_f - left[1].to_f) / left[1].to_f * 100
48
+ ]
49
+ end
50
+
51
+ rr = KpiManager::ReportingResult.new(res)
52
+ rr.from = oth_from - @from
53
+ rr.to = oth_to - @to
54
+ rr
25
55
  end
26
56
 
27
57
  private
@@ -0,0 +1,24 @@
1
+ module KpiManager
2
+ class ReportingResult
3
+ attr_accessor :results, :from, :to
4
+
5
+ def initialize(table)
6
+ @results = table
7
+ end
8
+
9
+ def -(other)
10
+ left = self.results
11
+ right = other.results
12
+ res = left.zip(right).map do |left, right|
13
+ [
14
+ left[0],
15
+ (right[1].to_f - left[1].to_f) / left[1].to_f * 100
16
+ ]
17
+ end
18
+ rr = KpiManager::ReportingResult.new(res)
19
+ rr.from = other.from - self.from
20
+ rr.to = other.to - self.to
21
+ rr
22
+ end
23
+ end
24
+ end
@@ -1,3 +1,3 @@
1
1
  module KpiManager
2
- VERSION = '0.1.0.pre'.freeze
2
+ VERSION = '0.2.0.pre'.freeze
3
3
  end
data/lib/kpi_manager.rb CHANGED
@@ -3,9 +3,10 @@ require 'kpi_manager/engine'
3
3
  module KpiManager # :nodoc:
4
4
  end
5
5
 
6
- require 'kpi_manager/dataset'
7
- require 'kpi_manager/kpi'
8
- require 'kpi_manager/report'
6
+ require 'kpi_manager/models/dataset'
7
+ require 'kpi_manager/models/kpi'
8
+ require 'kpi_manager/models/reporting_result'
9
+ require 'kpi_manager/models/report'
9
10
 
10
11
  require 'rails/generators'
11
12
  require 'kpi_manager/generators/kpi_manager_generator'
data/spec/spec_helper.rb CHANGED
@@ -2,6 +2,7 @@ RSpec.configure do |config|
2
2
  require 'simplecov'
3
3
  SimpleCov.start do
4
4
  add_filter '/spec/'
5
+ add_filter '/lib/kpi_manager/generators/'
5
6
  end
6
7
 
7
8
  config.expect_with :rspec do |expectations|
@@ -12,6 +13,10 @@ RSpec.configure do |config|
12
13
  mocks.verify_partial_doubles = true
13
14
  end
14
15
 
16
+ require 'factory_girl_rails'
17
+ require 'faker'
18
+ config.include FactoryGirl::Syntax::Methods
19
+
15
20
  config.shared_context_metadata_behavior = :apply_to_host_groups
16
21
 
17
22
  config.filter_run_when_matching :focus
@@ -19,3 +19,12 @@ end
19
19
  KpiManager::Kpi.add(:average_order, 'Average order', dataset: :bills, references: [:total_earned]) do |dataset, **refs|
20
20
  dataset.count.zero? ? 0 : refs[:total_earned] / dataset.count
21
21
  end
22
+
23
+ KpiManager::Kpi.add(:promotion_used, 'Promotion used', dataset: :bills) do |dataset, **refs|
24
+ dataset.where.not(promotion: nil).count
25
+ end
26
+
27
+ KpiManager::Kpi.add(:average_promotion, 'Average promotion', dataset: :bills) do |dataset, **refs|
28
+ sum = dataset.where.not(promotion: nil).inject(0) { |acc, elem| acc + elem.promotion.percentage }
29
+ dataset.count.zero? ? 0 : sum / dataset.count
30
+ end
@@ -0,0 +1,7 @@
1
+ FactoryGirl.define do
2
+ factory :car do
3
+ brand Faker::Vehicle.manufacture
4
+ model Faker::Commerce.product_name
5
+ price Faker::Commerce.price
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ FactoryGirl.define do
2
+ factory :user do
3
+ firstname Faker::Name.first_name
4
+ lastname Faker::Name.last_name
5
+ email Faker::Internet.email
6
+ birthdate Faker::Date.between(20.years.ago, 10.years.ago)
7
+ created_at Faker::Date.between(2.hours.ago, 10.minutes.ago)
8
+ end
9
+ end
@@ -2,36 +2,80 @@ require 'spec_helper'
2
2
  require 'rails_helper'
3
3
 
4
4
  RSpec.describe KpiManager::Report, :type => :model do
5
- it 'generates a report' do
6
- p206 = Car.create(brand: 'Peugot', model: '206', price: 9890.90)
7
- zoe = Car.create(brand: 'Renault', model: 'Zoé', price: 12500)
8
-
9
- hugo = User.create(
10
- firstname: 'Hugo',
11
- lastname: 'Chevalier',
12
- email: 'email@gmail.com',
13
- birthdate: Date.parse('1989-05-01')
14
- )
15
-
16
- drakhaine = User.create(
17
- firstname: 'Drakhaine',
18
- lastname: 'Arakhnide',
19
- email: 'email@gmail.com',
20
- birthdate: Date.parse('1989-04-24')
21
- )
22
-
23
- hugo.buy_car(p206)
24
- drakhaine.buy_car(zoe, Promotion.create(percentage: 10))
25
-
26
- report = KpiManager::Report.create(name: 'My first report')
27
- report.kpis.create(slug: 'users_count')
28
- report.kpis.create(slug: 'total_earned')
29
- report.kpis.create(slug: 'average_order')
5
+ before(:all) do
6
+ car1 = create(:car, price: 1000.00)
7
+ car2 = create(:car, price: 2000.00)
8
+
9
+ user1 = create(:user, created_at: 10.minutes.ago)
10
+ user2 = create(:user, created_at: 3.minutes.ago)
11
+ old_user = create(:user, created_at: 35.days.ago)
12
+
13
+ old_user.buy_car(car1, Promotion.create(percentage: 30))
14
+ old_user.orders.last.update(created_at: 33.days.ago)
15
+
16
+ user1.buy_car(car1)
17
+ user2.buy_car(car2, Promotion.create(percentage: 10))
18
+
19
+ @report = KpiManager::Report.create(name: 'My first report')
20
+ @report.kpis.create(slug: 'users_count')
21
+ @report.kpis.create(slug: 'total_earned')
22
+ @report.kpis.create(slug: 'average_order')
23
+ @report.kpis.create(slug: 'promotion_used')
24
+ @report.kpis.create(slug: 'average_promotion')
25
+ end
26
+
27
+ it 'generates a report for previous month' do
28
+ # Last month
29
+ expectancy = [
30
+ ["Subscribed users", 1],
31
+ ["Total earned", 700.00],
32
+ ["Average order", 700.00],
33
+ ["Promotion used", 1],
34
+ ["Average promotion", 30]
35
+ ]
36
+ report = @report.generate(60.days.ago, 31.days.ago)
37
+ expect(report.results).to eql(expectancy)
38
+ end
39
+
40
+ it 'generates a report for current month' do
41
+ # Current month
30
42
  expectancy = [
31
43
  ["Subscribed users", 2],
32
- ["Total earned", 21140.9],
33
- ["Average order", 10570.45]
44
+ ["Total earned", 2800.00],
45
+ ["Average order", 1400.00],
46
+ ["Promotion used", 1],
47
+ ["Average promotion", 5]
34
48
  ]
35
- expect(report.generate(Date.yesterday)).to eql(expectancy)
49
+ report = @report.generate(30.days.ago)
50
+ expect(report.results).to eql(expectancy)
51
+ end
52
+
53
+ context 'generating a diff' do
54
+ it 'works with compare().with()' do
55
+ # Diff
56
+ expectancy = [
57
+ ["Subscribed users", 100.0],
58
+ ["Total earned", 300.00],
59
+ ["Average order", 100.00],
60
+ ["Promotion used", 0.0],
61
+ ["Average promotion", -83.33333333333334]
62
+ ]
63
+ report = @report.compare(60.days.ago, 31.days.ago).with(30.days.ago, Time.zone.now)
64
+ expect(report.results).to eql(expectancy)
65
+ end
66
+
67
+ it 'works when subtracting two report results' do
68
+ # Diff
69
+ expectancy = [
70
+ ["Subscribed users", 100.0],
71
+ ["Total earned", 300.00],
72
+ ["Average order", 100.00],
73
+ ["Promotion used", 0.0],
74
+ ["Average promotion", -83.33333333333334]
75
+ ]
76
+ report1 = @report.generate(60.days.ago, 31.days.ago)
77
+ report2 = @report.generate(30.days.ago, Time.zone.now)
78
+ expect((report1 - report2).results).to eql(expectancy)
79
+ end
36
80
  end
37
81
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kpi_manager
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.pre
4
+ version: 0.2.0.pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hugo Chevalier
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-16 00:00:00.000000000 Z
11
+ date: 2016-01-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -94,6 +94,34 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '3.5'
97
+ - !ruby/object:Gem::Dependency
98
+ name: factory_girl_rails
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 4.8.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 4.8.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: faker
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 1.7.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 1.7.0
97
125
  - !ruby/object:Gem::Dependency
98
126
  name: simplecov
99
127
  requirement: !ruby/object:Gem::Requirement
@@ -136,7 +164,11 @@ dependencies:
136
164
  - - "~>"
137
165
  - !ruby/object:Gem::Version
138
166
  version: 0.46.0
139
- description: Description of KpiManager.
167
+ description: |2
168
+ KpiManager allows to create reports from a back-office.
169
+ KPIs must be defined in the code before they're available in reports editor.
170
+ On v1.0.0, it will be possible to schedule recurrent reporting by email
171
+ and to create report-tied dashboards displaying widgets for each of your KPIs.
140
172
  email:
141
173
  - drakhaine@gmail.com
142
174
  executables: []
@@ -153,15 +185,16 @@ files:
153
185
  - app/views/layouts/kpi_manager/application.html.erb
154
186
  - config/routes.rb
155
187
  - lib/kpi_manager.rb
156
- - lib/kpi_manager/dashboard.rb
157
- - lib/kpi_manager/dataset.rb
158
188
  - lib/kpi_manager/engine.rb
159
189
  - lib/kpi_manager/generators/kpi_manager_generator.rb
160
190
  - lib/kpi_manager/generators/templates/dashboard_migration.rb
161
191
  - lib/kpi_manager/generators/templates/kpi_migration.rb
162
192
  - lib/kpi_manager/generators/templates/report_migration.rb
163
- - lib/kpi_manager/kpi.rb
164
- - lib/kpi_manager/report.rb
193
+ - lib/kpi_manager/models/dashboard.rb
194
+ - lib/kpi_manager/models/dataset.rb
195
+ - lib/kpi_manager/models/kpi.rb
196
+ - lib/kpi_manager/models/report.rb
197
+ - lib/kpi_manager/models/reporting_result.rb
165
198
  - lib/kpi_manager/version.rb
166
199
  - lib/tasks/kpi_manager_tasks.rake
167
200
  - spec/rails_helper.rb
@@ -196,8 +229,10 @@ files:
196
229
  - spec/test_app/db/migrate/20170116205701_create_kpi_manager_report.rb
197
230
  - spec/test_app/db/migrate/20170116205702_create_kpi_manager_kpi.rb
198
231
  - spec/test_app/db/schema.rb
232
+ - spec/test_app/spec/factories/car.rb
233
+ - spec/test_app/spec/factories/user.rb
199
234
  - spec/test_app/spec/kpi_manager_spec.rb
200
- homepage: https://rubygems.org/kpi_manager
235
+ homepage: https://github.com/hchevalier/kpi_manager
201
236
  licenses:
202
237
  - MIT
203
238
  metadata: {}
@@ -220,7 +255,7 @@ rubyforge_project:
220
255
  rubygems_version: 2.4.8
221
256
  signing_key:
222
257
  specification_version: 4
223
- summary: Summary of KpiManager.
258
+ summary: Create recurrent reports from KPIs.
224
259
  test_files:
225
260
  - spec/rails_helper.rb
226
261
  - spec/spec_helper.rb
@@ -254,4 +289,6 @@ test_files:
254
289
  - spec/test_app/db/migrate/20170116205701_create_kpi_manager_report.rb
255
290
  - spec/test_app/db/migrate/20170116205702_create_kpi_manager_kpi.rb
256
291
  - spec/test_app/db/schema.rb
292
+ - spec/test_app/spec/factories/car.rb
293
+ - spec/test_app/spec/factories/user.rb
257
294
  - spec/test_app/spec/kpi_manager_spec.rb