educode_sales 0.9.86 → 0.9.89
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/app/controllers/educode_sales/contracts_controller.rb +21 -2
- data/app/controllers/educode_sales/sale_trends_controller.rb +11 -8
- data/app/controllers/educode_sales/sales_details_controller.rb +1 -1
- data/app/helpers/educode_sales/sale_trends_helper.rb +49 -22
- data/app/views/educode_sales/businesses/new_follow_record.html.erb +1 -8
- data/app/views/educode_sales/contracts/index.html.erb +10 -0
- data/app/views/educode_sales/contracts/new_follow_up.html.erb +241 -191
- data/app/views/educode_sales/sale_trends/_goal_forecast.html.erb +20 -17
- data/app/views/educode_sales/sales_details/_index.html.erb +401 -0
- data/app/views/educode_sales/sales_details/index.js.erb +1 -0
- data/app/views/layouts/educode_sales/application.html.erb +0 -4
- data/lib/educode_sales/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 90a8a2173c7a406ab0cc7e93e394c7112394ad05e264004870d3a7bbe60754db
|
4
|
+
data.tar.gz: 1e51f78cda684acf4c051bbc75ced90b7927dd901a7c12466a1f7d68926c36b9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ef42ae93980e1cad1414a09e6c8a8213d759b1722396b2901839dad11a2a24aa30672e24cf7f2a1c196eac11e366958b75c1b6a4686a739d87722f0a887e4182
|
7
|
+
data.tar.gz: caa434156ad1796fdffdf59afccc406ed9723968b6f1bd7856f8df237436cf91a838efee688e7a5b452c73a2a1b33d2cfbb9369b58c92266fd98675d136904d5
|
@@ -243,6 +243,19 @@ module EducodeSales
|
|
243
243
|
gon.department = []
|
244
244
|
gon.value = ''
|
245
245
|
end
|
246
|
+
|
247
|
+
@list = {}
|
248
|
+
EducodeSales::ContractDateList.clazzs.each do |d, i|
|
249
|
+
@list[d] = [EducodeSales::ContractDateList.new]
|
250
|
+
end
|
251
|
+
|
252
|
+
@last_follow_up.contract_date_lists.each do |d|
|
253
|
+
if @list[d.clazz][0].id == nil
|
254
|
+
@list[d.clazz][0] = d
|
255
|
+
else
|
256
|
+
@list[d.clazz] << d
|
257
|
+
end
|
258
|
+
end
|
246
259
|
|
247
260
|
render layout: false
|
248
261
|
end
|
@@ -312,6 +325,8 @@ module EducodeSales
|
|
312
325
|
end
|
313
326
|
|
314
327
|
def add_follow_ups
|
328
|
+
@business = Business.find(params[:business_id])
|
329
|
+
last_follow_up = @business.last_follow_up
|
315
330
|
data = []
|
316
331
|
6.times do |i|
|
317
332
|
data[i] = []
|
@@ -326,14 +341,18 @@ module EducodeSales
|
|
326
341
|
end
|
327
342
|
params["#{i+1}_actual_date"].each do |d, v|
|
328
343
|
data[i][d.to_i] << v
|
344
|
+
if i == 1 && last_follow_up
|
345
|
+
# 验收时间
|
346
|
+
last_follow_up.reception_at = v
|
347
|
+
end
|
329
348
|
end
|
349
|
+
|
330
350
|
end
|
331
351
|
data.each do |d|
|
332
352
|
d.select! { |d| d.delete_if{|f| f == ''}.present? }
|
333
353
|
end
|
334
354
|
|
335
|
-
|
336
|
-
last_follow_up = @business.last_follow_up
|
355
|
+
|
337
356
|
|
338
357
|
follow_up = last_follow_up.dup
|
339
358
|
follow_up.assign_attributes(follow_up_params)
|
@@ -388,6 +388,7 @@ module EducodeSales
|
|
388
388
|
|
389
389
|
end
|
390
390
|
format.js do
|
391
|
+
property = params[:property] || nil
|
391
392
|
staff_id = params[:staff_id] || nil
|
392
393
|
@forecast_count_range = params[:forecast_count_range] || "month"
|
393
394
|
forecast_default_dates = ("#{Time.now.year}-01-01".to_date.."#{Time.now.year}-#{Time.now.month}-01".to_date).map { |d| d.strftime("%Y-%m") }.uniq
|
@@ -398,10 +399,10 @@ module EducodeSales
|
|
398
399
|
if params[:forecast_date_day].present?
|
399
400
|
date = params[:forecast_date_day].split(" - ")
|
400
401
|
dates = (date[0].to_date..date[1].to_date).map { |d| d.strftime("%Y-%W") }.uniq.select { |d| d.split("-")[1] != '00' }
|
401
|
-
@forecast_count_data = goal_forecast_week(dates, sale_names, staff_id)
|
402
|
+
@forecast_count_data = goal_forecast_week(dates, sale_names, staff_id, property)
|
402
403
|
else
|
403
404
|
forecast_default_dates = ("#{Time.now.year}-01-01".to_date.."#{Time.now.year}-#{Time.now.month}-01".to_date).map { |d| d.strftime("%Y-%W") }.uniq.select { |d| d.split("-")[1] != '00' }
|
404
|
-
@forecast_count_data = goal_forecast_week(forecast_default_dates, sale_names, staff_id)
|
405
|
+
@forecast_count_data = goal_forecast_week(forecast_default_dates, sale_names, staff_id, property)
|
405
406
|
end
|
406
407
|
when "quarter"
|
407
408
|
# 按年
|
@@ -409,11 +410,11 @@ module EducodeSales
|
|
409
410
|
date = params[:forecast_date_year].split(" - ")
|
410
411
|
dates = (date[0]..date[1]).to_a
|
411
412
|
dates = dates.map { |d| [d.to_s + "-" + "1", d.to_s + "-" + "2", d.to_s + "-" + "3", d.to_s + "-" + "4"] }.flatten
|
412
|
-
@forecast_count_data = goal_forecast_quarter(dates, sale_names, staff_id)
|
413
|
+
@forecast_count_data = goal_forecast_quarter(dates, sale_names, staff_id, property)
|
413
414
|
else
|
414
415
|
forecast_default_dates = ("#{Time.now.year}-01-01".to_date.."#{Time.now.year}-#{Time.now.month}-01".to_date).map { |d| d.strftime("%Y") }.uniq
|
415
416
|
forecast_default_dates = forecast_default_dates.map { |d| [d.to_s + "-" + "1", d.to_s + "-" + "2", d.to_s + "-" + "3", d.to_s + "-" + "4"] }.flatten
|
416
|
-
@forecast_count_data = goal_forecast_quarter(forecast_default_dates, sale_names, staff_id)
|
417
|
+
@forecast_count_data = goal_forecast_quarter(forecast_default_dates, sale_names, staff_id, property)
|
417
418
|
end
|
418
419
|
when "month" # 按月
|
419
420
|
if params[:forecast_date_month].present?
|
@@ -421,21 +422,23 @@ module EducodeSales
|
|
421
422
|
date[0] = (date[0] + "-01").to_date.to_s
|
422
423
|
date[1] = (date[1] + "-01").to_date.end_of_month.to_s
|
423
424
|
dates = ((date[0] + "-01").to_date..(date[1] + "-01").to_date).map { |d| d.strftime("%Y-%m") }.uniq
|
424
|
-
@forecast_count_data = goal_forecast_month(dates, sale_names, staff_id)
|
425
|
+
@forecast_count_data = goal_forecast_month(dates, sale_names, staff_id, property)
|
425
426
|
else
|
426
|
-
@forecast_count_data = goal_forecast_month(forecast_default_dates, sale_names, staff_id)
|
427
|
+
@forecast_count_data = goal_forecast_month(forecast_default_dates, sale_names, staff_id, property)
|
427
428
|
end
|
428
429
|
else
|
429
430
|
# 按年
|
430
431
|
if params[:forecast_date_year].present?
|
431
432
|
date = params[:forecast_date_year].split(" - ")
|
432
433
|
dates = (date[0]..date[1]).to_a
|
433
|
-
@forecast_count_data = goal_forecast_year(dates, sale_names, staff_id)
|
434
|
+
@forecast_count_data = goal_forecast_year(dates, sale_names, staff_id, property)
|
434
435
|
else
|
435
436
|
forecast_default_dates = ("#{Time.now.year}-01-01".to_date.."#{Time.now.year}-#{Time.now.month}-01".to_date).map { |d| d.strftime("%Y") }.uniq
|
436
|
-
@forecast_count_data = goal_forecast_year(forecast_default_dates, sale_names, staff_id)
|
437
|
+
@forecast_count_data = goal_forecast_year(forecast_default_dates, sale_names, staff_id, property)
|
437
438
|
end
|
438
439
|
end
|
440
|
+
@forecast_count_data_0 = @forecast_count_data[0]
|
441
|
+
@forecast_count_data_1 = @forecast_count_data[1]
|
439
442
|
end
|
440
443
|
end
|
441
444
|
end
|
@@ -5,7 +5,7 @@ module EducodeSales
|
|
5
5
|
|
6
6
|
def index
|
7
7
|
respond_to do |format|
|
8
|
-
format.
|
8
|
+
format.js do
|
9
9
|
common = Common.find_by(clazz: 'staff_type', name: '销售')
|
10
10
|
staffs = Staff.joins(:user).where(job_type: common.id).where.not(role_id: 11)
|
11
11
|
@staffs = staffs.map { |d| [d.user.real_name, d.id]}
|
@@ -1,9 +1,10 @@
|
|
1
1
|
module EducodeSales
|
2
2
|
module SaleTrendsHelper
|
3
3
|
NAMES = %w[计划投标额 计划投标额累计 实际中标额 实际中标额累计]
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
|
5
|
+
def goal_forecast_quarter(labels, selects, staff_id = nil, property)
|
6
|
+
plan_get = plan_get(staff_id, labels, "quarter", property)
|
7
|
+
actual_get = actual_get(staff_id, labels, "quarter", property)
|
7
8
|
datasets = selects.map.with_index do |select, i|
|
8
9
|
data = if select == NAMES[0]
|
9
10
|
labels.map do |d|
|
@@ -53,16 +54,21 @@ module EducodeSales
|
|
53
54
|
borderWidth: 1
|
54
55
|
}
|
55
56
|
end
|
56
|
-
{
|
57
|
+
hash_a = {
|
58
|
+
labels: labels,
|
59
|
+
datasets: [datasets[0], datasets[2]]
|
60
|
+
}
|
61
|
+
hash_b = {
|
57
62
|
labels: labels,
|
58
|
-
datasets: datasets
|
63
|
+
datasets: [datasets[1], datasets[3]]
|
59
64
|
}
|
65
|
+
[hash_a, hash_b]
|
60
66
|
end
|
61
67
|
|
62
|
-
def goal_forecast_week(labels, selects, staff_id = nil)
|
68
|
+
def goal_forecast_week(labels, selects, staff_id = nil, property)
|
63
69
|
|
64
|
-
plan_get = plan_get(staff_id, labels, "week")
|
65
|
-
actual_get = actual_get(staff_id, labels, "week")
|
70
|
+
plan_get = plan_get(staff_id, labels, "week", property)
|
71
|
+
actual_get = actual_get(staff_id, labels, "week", property)
|
66
72
|
datasets = selects.map.with_index do |select, i|
|
67
73
|
data = if select == NAMES[0]
|
68
74
|
labels.map do |d|
|
@@ -117,15 +123,20 @@ module EducodeSales
|
|
117
123
|
}
|
118
124
|
end
|
119
125
|
|
120
|
-
{
|
126
|
+
hash_a = {
|
121
127
|
labels: labels,
|
122
|
-
datasets: datasets
|
128
|
+
datasets: [datasets[0], datasets[2]]
|
123
129
|
}
|
130
|
+
hash_b = {
|
131
|
+
labels: labels,
|
132
|
+
datasets: [datasets[1], datasets[3]]
|
133
|
+
}
|
134
|
+
[hash_a, hash_b]
|
124
135
|
end
|
125
136
|
|
126
|
-
def goal_forecast_month(labels, selects, staff_id = nil)
|
127
|
-
plan_get = plan_get(staff_id, labels, "month")
|
128
|
-
actual_get = actual_get(staff_id, labels, "month")
|
137
|
+
def goal_forecast_month(labels, selects, staff_id = nil, property)
|
138
|
+
plan_get = plan_get(staff_id, labels, "month", property)
|
139
|
+
actual_get = actual_get(staff_id, labels, "month", property)
|
129
140
|
datasets = selects.map.with_index do |select, i|
|
130
141
|
data = if select == NAMES[0]
|
131
142
|
labels.map do |d|
|
@@ -177,15 +188,20 @@ module EducodeSales
|
|
177
188
|
}
|
178
189
|
end
|
179
190
|
|
180
|
-
{
|
191
|
+
hash_a = {
|
181
192
|
labels: labels,
|
182
|
-
datasets: datasets
|
193
|
+
datasets: [datasets[0], datasets[2]]
|
183
194
|
}
|
195
|
+
hash_b = {
|
196
|
+
labels: labels,
|
197
|
+
datasets: [datasets[1], datasets[3]]
|
198
|
+
}
|
199
|
+
[hash_a, hash_b]
|
184
200
|
end
|
185
201
|
|
186
|
-
def goal_forecast_year(labels, selects, staff_id = nil)
|
187
|
-
plan_get = plan_get(staff_id, labels, "year")
|
188
|
-
actual_get = actual_get(staff_id, labels, "year")
|
202
|
+
def goal_forecast_year(labels, selects, staff_id = nil, property)
|
203
|
+
plan_get = plan_get(staff_id, labels, "year", property)
|
204
|
+
actual_get = actual_get(staff_id, labels, "year", property)
|
189
205
|
datasets = selects.map.with_index do |select, i|
|
190
206
|
data = if select == NAMES[0]
|
191
207
|
labels.map { |d| plan_get[d.to_i] || 0 }
|
@@ -220,15 +236,20 @@ module EducodeSales
|
|
220
236
|
borderWidth: 1
|
221
237
|
}
|
222
238
|
end
|
223
|
-
{
|
239
|
+
hash_a = {
|
240
|
+
labels: labels,
|
241
|
+
datasets: [datasets[0], datasets[2]]
|
242
|
+
}
|
243
|
+
hash_b = {
|
224
244
|
labels: labels,
|
225
|
-
datasets: datasets
|
245
|
+
datasets: [datasets[1], datasets[3]]
|
226
246
|
}
|
247
|
+
[hash_a, hash_b]
|
227
248
|
end
|
228
249
|
|
229
250
|
private
|
230
251
|
|
231
|
-
def plan_get(staff_id, time_range, type)
|
252
|
+
def plan_get(staff_id, time_range, type, property)
|
232
253
|
# budget_amount 预算额
|
233
254
|
start_time = case type
|
234
255
|
when "month"
|
@@ -253,6 +274,9 @@ module EducodeSales
|
|
253
274
|
staff_id = staff_id.present? ? Array(staff_id) : nil
|
254
275
|
data = Business.joins(:last_follow_up)
|
255
276
|
.where("educode_sales_follow_ups.invitation_at >= ? and educode_sales_follow_ups.invitation_at <= ? #{staff_id.present? ? "AND educode_sales_follow_ups.staff_id in (#{staff_id.join(",")})" : ""}", start_time, end_time)
|
277
|
+
if property.present?
|
278
|
+
data = data.joins(department: [school: :school_tags]).where("school_tags.id = ?", property)
|
279
|
+
end
|
256
280
|
case type
|
257
281
|
when "week"
|
258
282
|
data.select("educode_sales_follow_ups.*, yearweek(educode_sales_follow_ups.invitation_at) as week").group("yearweek(educode_sales_follow_ups.invitation_at)").sum(:budget_amount)
|
@@ -267,7 +291,7 @@ module EducodeSales
|
|
267
291
|
end
|
268
292
|
end
|
269
293
|
|
270
|
-
def actual_get(staff_id, time_range, type)
|
294
|
+
def actual_get(staff_id, time_range, type, property)
|
271
295
|
start_time = case type
|
272
296
|
when "month"
|
273
297
|
time_range.first + "-01"
|
@@ -292,6 +316,9 @@ module EducodeSales
|
|
292
316
|
staff_id = staff_id.present? ? Array(staff_id) : nil
|
293
317
|
data = Business.joins(:last_follow_up)
|
294
318
|
.where("educode_sales_follow_ups.bidded_date >= ? and educode_sales_follow_ups.bidded_date <= ? #{staff_id.present? ? "AND educode_sales_follow_ups.staff_id in (#{staff_id.join(",")})" : ""}", start_time, end_time)
|
319
|
+
if property.present?
|
320
|
+
data = data.joins(department: [school: :school_tags]).where("school_tags.id = ?", property)
|
321
|
+
end
|
295
322
|
case type
|
296
323
|
when "week"
|
297
324
|
data.select("educode_sales_follow_ups.*, yearweek(educode_sales_follow_ups.bidded_date) as week").group("yearweek(educode_sales_follow_ups.bidded_date)").sum(:actual_amount)
|
@@ -59,14 +59,7 @@
|
|
59
59
|
placeholder="请选择日期">
|
60
60
|
</div>
|
61
61
|
</div>
|
62
|
-
<
|
63
|
-
<label class="layui-form-label">验收时间</label>
|
64
|
-
<div class="layui-input-inline">
|
65
|
-
<input type="text" class="layui-input" name="reception_at" autocomplete="off" id="reception_at_add"
|
66
|
-
value="<%= @last_follow_up&.reception_at %>"
|
67
|
-
placeholder="请选择日期">
|
68
|
-
</div>
|
69
|
-
</div>
|
62
|
+
<input type="hidden" class="layui-input" name="reception_at" value="<%= @last_follow_up&.reception_at %>">
|
70
63
|
<div class="layui-inline">
|
71
64
|
<label class="layui-form-label">部署时间</label>
|
72
65
|
<div class="layui-input-inline">
|
@@ -3,6 +3,9 @@
|
|
3
3
|
<ul class="layui-tab-title">
|
4
4
|
<li class="layui-this follows_li">跟进动态</li>
|
5
5
|
<li class="contracts_list_li">合同列表</li>
|
6
|
+
<% if can? :read_sales_detail, EducodeSales::Business %>
|
7
|
+
<li class="sales_list_li">销售明细</li>
|
8
|
+
<% end %>
|
6
9
|
</ul>
|
7
10
|
<div class="layui-tab-content">
|
8
11
|
<div class="layui-tab-item follows_div layui-show">
|
@@ -11,6 +14,11 @@
|
|
11
14
|
<div class="layui-tab-item contracts_list_div">
|
12
15
|
<div id="contract_list_wraper"></div>
|
13
16
|
</div>
|
17
|
+
<% if can? :read_sales_detail, EducodeSales::Business %>
|
18
|
+
<div class="layui-tab-item sales_list_div">
|
19
|
+
<div id="sales_list_wraper"></div>
|
20
|
+
</div>
|
21
|
+
<% end %>
|
14
22
|
</div>
|
15
23
|
</div>
|
16
24
|
|
@@ -31,6 +39,8 @@
|
|
31
39
|
element.on('tab(contract_tab)', function(data) {
|
32
40
|
if (data.index == 1 && $("#contract_list").length == 0) {
|
33
41
|
loadPage('/missions/contracts/list')
|
42
|
+
} else if (data.index == 2 && $("#sales_list").length == 0) {
|
43
|
+
loadPage('/missions/sales_details')
|
34
44
|
}
|
35
45
|
});
|
36
46
|
|