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 +4 -4
- data/lib/kpi_manager/{dashboard.rb → models/dashboard.rb} +0 -0
- data/lib/kpi_manager/{dataset.rb → models/dataset.rb} +0 -0
- data/lib/kpi_manager/{kpi.rb → models/kpi.rb} +0 -0
- data/lib/kpi_manager/{report.rb → models/report.rb} +31 -1
- data/lib/kpi_manager/models/reporting_result.rb +24 -0
- data/lib/kpi_manager/version.rb +1 -1
- data/lib/kpi_manager.rb +4 -3
- data/spec/spec_helper.rb +5 -0
- data/spec/test_app/config/initializers/kpi_manager.rb +9 -0
- data/spec/test_app/spec/factories/car.rb +7 -0
- data/spec/test_app/spec/factories/user.rb +9 -0
- data/spec/test_app/spec/kpi_manager_spec.rb +72 -28
- metadata +46 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3c8f55cc566b14da16121391756278ad78e4e884
|
4
|
+
data.tar.gz: caed2e8541f8f30178830b7c9303fcf76228b5b3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3dfc53eaa8809ebc952bb8981a8af9a84ee36b1d834610768d332c80ac9e04e4edd293aa9671e6abc9eecdeefdb0ebcbc74dea8ef7c090e65afe31f7c77e8629
|
7
|
+
data.tar.gz: c05ad8ad69f2c24ce65cfc6fd5a94552566ae27d28a40d12daf222bf66948a8e8340afbc9a686ea8ac88c89d0d311a9eb37cd3e2daf8d2e5ee7c6e9d15467993
|
File without changes
|
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
|
data/lib/kpi_manager/version.rb
CHANGED
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/
|
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,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
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
)
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
)
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
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",
|
33
|
-
["Average order",
|
44
|
+
["Total earned", 2800.00],
|
45
|
+
["Average order", 1400.00],
|
46
|
+
["Promotion used", 1],
|
47
|
+
["Average promotion", 5]
|
34
48
|
]
|
35
|
-
|
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.
|
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-
|
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:
|
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/
|
164
|
-
- lib/kpi_manager/
|
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://
|
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:
|
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
|