kpi_manager 0.1.0.pre → 0.2.0.pre
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/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
|