educode_sales 1.10.8 → 1.10.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/educode_sales/businesses_controller.rb +46 -1
- data/app/controllers/educode_sales/contracts_controller.rb +5 -1
- data/app/controllers/educode_sales/customers_controller.rb +10 -2
- data/app/controllers/educode_sales/follow_ups_controller.rb +29 -6
- data/app/controllers/educode_sales/money_plan_records_controller.rb +34 -0
- data/app/controllers/educode_sales/money_plans_controller.rb +8 -0
- data/app/models/educode_sales/follow_up.rb +2 -0
- data/app/views/educode_sales/assessments/_attendances.html.erb +12 -4
- data/app/views/educode_sales/assessments/index.html.erb +3 -1
- data/app/views/educode_sales/businesses/edit.html.erb +44 -38
- data/app/views/educode_sales/businesses/get_export_data.json.jbuilder +9 -0
- data/app/views/educode_sales/businesses/index.html.erb +48 -36
- data/app/views/educode_sales/businesses/index.json.jbuilder +6 -1
- data/app/views/educode_sales/businesses/new.html.erb +92 -3
- data/app/views/educode_sales/businesses/time_line.html.erb +32 -0
- data/app/views/educode_sales/contracts/new_follow_up.html.erb +7 -0
- data/app/views/educode_sales/customers/list.json.jbuilder +3 -3
- data/app/views/educode_sales/follow_ups/add_assign.html.erb +42 -0
- data/app/views/educode_sales/money_plan_records/_index.html.erb +4 -3
- data/app/views/educode_sales/money_plan_records/index.json.jbuilder +1 -0
- data/app/views/educode_sales/money_plans/_index.html.erb +8 -1
- data/app/views/educode_sales/money_plans/index.json.jbuilder +1 -0
- data/config/routes.rb +2 -0
- data/lib/educode_sales/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8b14ccbfcb9a5061855ca86be07cacb97c60b4775dcfa2a5df9e43ffdef76d7a
|
4
|
+
data.tar.gz: 586ddfdcefed79700eb15c20ccba6b73dbe6ecee3fd12f808d614d843959f536
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fd7f2559d5a6ea7a69482dc0d4cae776e338bcaa99a30b0c303248d5f69abccfbeaf051dc3cbfcfa5b608cf718b7cef989b211f6eef52d4f3b98433b267112fb
|
7
|
+
data.tar.gz: 4c04378292d11f37b2e9c29061470fcec8920c4245bdf7b3c77839e309a20f22b7d6c4ae767a2cf4d4bc37b4d693379464edfbda526b562410a5befb3837a340
|
@@ -295,6 +295,32 @@ module EducodeSales
|
|
295
295
|
end
|
296
296
|
end
|
297
297
|
|
298
|
+
#商机来源
|
299
|
+
if params[:q].present? && params[:q][:source_way].present?
|
300
|
+
if params[:q].present? && params[:q][:source_name].present?
|
301
|
+
if ["会议活动", "渠道代理", "客户"].include?(params[:q][:source_way])
|
302
|
+
if params[:q][:source_way] == '会议活动'
|
303
|
+
sourcable_id = EducodeSales::Activity.where("name like ?", "%#{params[:q][:source_name]}%").limit(20).pluck(:id)
|
304
|
+
elsif params[:q][:source_way] == '渠道代理'
|
305
|
+
sourcable_id = EducodeSales::Place.where("name like ?", "%#{params[:q][:source_name]}%").limit(20).pluck(:id)
|
306
|
+
elsif params[:q][:source_way] == '客户'
|
307
|
+
sourcable_id = EducodeSales::Department.where("name like ?", "%#{params[:q][:source_name]}%").limit(20).pluck(:id)
|
308
|
+
end
|
309
|
+
|
310
|
+
if sourcable_id.present?
|
311
|
+
@businesses = @businesses.where(source_way: params[:q][:source_way], sourcable_id: sourcable_id)
|
312
|
+
else
|
313
|
+
@businesses = @businesses.none
|
314
|
+
end
|
315
|
+
else
|
316
|
+
@businesses = @businesses.where(source_way: params[:q][:source_way]).where("sourcable_type like ?", "%#{params[:q][:source_name]}%")
|
317
|
+
end
|
318
|
+
else
|
319
|
+
@businesses = @businesses.where(source_way: params[:q][:source_way])
|
320
|
+
end
|
321
|
+
end
|
322
|
+
|
323
|
+
|
298
324
|
# 商机变化
|
299
325
|
if params[:q][:clazz_changes].present?
|
300
326
|
clazz_changes = EducodeSales::BusinessClazzChange.clazz_changes_value[params[:q][:clazz_changes].to_s]
|
@@ -406,7 +432,26 @@ module EducodeSales
|
|
406
432
|
|
407
433
|
def create
|
408
434
|
department = Department.find(params[:department_id])
|
409
|
-
|
435
|
+
if params[:sourcable_type].present?
|
436
|
+
if params[:source_way] == '会议活动'
|
437
|
+
params[:sourcable_type] = 'EducodeSales::Activity'
|
438
|
+
elsif params[:source_way] == '渠道代理'
|
439
|
+
params[:sourcable_type] = 'EducodeSales::Place'
|
440
|
+
elsif params[:source_way] == '客户'
|
441
|
+
params[:sourcable_type] = 'EducodeSales::Department'
|
442
|
+
else
|
443
|
+
params[:sourcable_id] = ""
|
444
|
+
end
|
445
|
+
end
|
446
|
+
if ['会议活动', '渠道代理', '客户'].include?(params[:source_way] ) && params[:sourcable_id].blank?
|
447
|
+
params[:sourcable_type] = ""
|
448
|
+
end
|
449
|
+
if params[:sourcable_type].blank?
|
450
|
+
params[:sourcable_id] = ""
|
451
|
+
end
|
452
|
+
business = @current_admin.businesses.build(name: params[:name], department_id: department.id, source: params[:source], school_id: department.school_id, clazz_id: params[:clazz_id],
|
453
|
+
sourcable_type: params[:sourcable_type], sourcable_id: params[:sourcable_id], source_way: params[:source_way])
|
454
|
+
|
410
455
|
if business.save
|
411
456
|
render_success
|
412
457
|
else
|
@@ -344,6 +344,10 @@ module EducodeSales
|
|
344
344
|
if i == 1 && last_follow_up
|
345
345
|
# 验收时间
|
346
346
|
last_follow_up.reception_at = v
|
347
|
+
elsif i == 0 && last_follow_up
|
348
|
+
# 合同部署时间
|
349
|
+
last_follow_up.deploy_time = v
|
350
|
+
@business.p_deploy_time = v
|
347
351
|
end
|
348
352
|
end
|
349
353
|
|
@@ -523,7 +527,7 @@ module EducodeSales
|
|
523
527
|
|
524
528
|
private
|
525
529
|
def follow_up_params
|
526
|
-
params.permit(:o_business_deployment, :plan_signed_date, :bidded_days, :signed_date, :signed_department_id, :service_years, :service_start_time, :service_end_time, :funding_source, :signed_clazz)
|
530
|
+
params.permit(:o_business_deployment, :plan_signed_date, :actual_amount, :bidded_days, :signed_date, :signed_department_id, :service_years, :service_start_time, :service_end_time, :funding_source, :signed_clazz)
|
527
531
|
end
|
528
532
|
|
529
533
|
def product_up_params
|
@@ -221,11 +221,17 @@ module EducodeSales
|
|
221
221
|
s.major_count,
|
222
222
|
s.department_id,
|
223
223
|
departments.name AS department_name,
|
224
|
-
|
225
|
-
|
224
|
+
t.teacher_count,
|
225
|
+
t.student_count
|
226
226
|
").joins("
|
227
227
|
JOIN schools ON s.id = schools.id
|
228
228
|
LEFT JOIN departments ON s.department_id = departments.id
|
229
|
+
LEFT JOIN (
|
230
|
+
SELECT COUNT(IF(user_extensions.identity = 0, user_extensions.id, 0)) AS teacher_count,
|
231
|
+
COUNT(IF(user_extensions.identity = 1, user_extensions.id, 1)) AS student_count, user_extensions.department_id
|
232
|
+
FROM user_extensions
|
233
|
+
GROUP BY user_extensions.department_id
|
234
|
+
) AS t ON t.department_id = s.department_id
|
229
235
|
")
|
230
236
|
|
231
237
|
# part_a_ids = CustomerFollow.all.pluck(:school_id)
|
@@ -271,6 +277,8 @@ module EducodeSales
|
|
271
277
|
@customers = @customers.where(id: school_ids)
|
272
278
|
end
|
273
279
|
|
280
|
+
@count = School.joins("LEFT JOIN departments ON schools.id = departments.school_id").count
|
281
|
+
|
274
282
|
if params[:page].present?
|
275
283
|
@customers = @customers.order(id: :desc).page(params[:page]).per(params[:limit])
|
276
284
|
else
|
@@ -33,13 +33,17 @@ module EducodeSales
|
|
33
33
|
business_ids = Business.joins(last_follow_up: :assign_follow_ups).where("educode_sales_assign_follow_ups.staff_id = ?", @current_admin.id).pluck(:id)
|
34
34
|
@businesses = Business.where("educode_sales_businesses.staff_id = ? OR educode_sales_businesses.id in (?)", @current_admin.id, business_ids)
|
35
35
|
business_ids = @businesses.pluck(:id)
|
36
|
-
|
36
|
+
|
37
|
+
# 指定查看人
|
38
|
+
follow_up_ids = EducodeSales::WatchFollowUp.where(staff_id: @current_admin.id).pluck(:follow_up_id)
|
39
|
+
@follow_ups = FollowUp.where(business_id: business_ids + area_business_ids).or(FollowUp.where(id: follow_up_ids))
|
37
40
|
when '区域'
|
38
41
|
school_ids = School.where(province: @current_admin.areas.pluck(:name)).pluck(:id) + StaffSchool.where(staff_id: @current_admin.id).pluck(:school_id)
|
39
42
|
business_ids = Business.joins(last_follow_up: :assign_follow_ups).where("educode_sales_assign_follow_ups.staff_id = ?", @current_admin.id).pluck(:id)
|
40
43
|
@businesses = Business.joins("JOIN departments ON educode_sales_businesses.department_id = departments.id").where("departments.school_id in (?) OR educode_sales_businesses.staff_id = #{@current_admin.id} OR educode_sales_businesses.id in (?)", school_ids, business_ids)
|
41
44
|
business_ids = @businesses.pluck(:id)
|
42
|
-
|
45
|
+
follow_up_ids = EducodeSales::WatchFollowUp.where(staff_id: @current_admin.id).pluck(:follow_up_id)
|
46
|
+
@follow_ups = FollowUp.where(business_id: business_ids + area_business_ids).or(FollowUp.where(id: follow_up_ids))
|
43
47
|
else
|
44
48
|
@follow_ups = FollowUp.all
|
45
49
|
end
|
@@ -308,7 +312,7 @@ module EducodeSales
|
|
308
312
|
end
|
309
313
|
|
310
314
|
def update_tags
|
311
|
-
|
315
|
+
follow_up = FollowUp.find(params[:id])
|
312
316
|
tags = []
|
313
317
|
tags_name = []
|
314
318
|
params[:tags].split(",").uniq.each do |d|
|
@@ -317,15 +321,34 @@ module EducodeSales
|
|
317
321
|
end
|
318
322
|
tags_name << tag.name
|
319
323
|
tag.save unless tag.persisted?
|
320
|
-
t = FollowUpTag.find_or_initialize_by(tag_id: tag.id, follow_up_id:
|
324
|
+
t = FollowUpTag.find_or_initialize_by(tag_id: tag.id, follow_up_id: follow_up.id)
|
321
325
|
t.staff = @current_admin
|
322
326
|
tags << t
|
323
327
|
end
|
324
|
-
|
325
|
-
|
328
|
+
follow_up.follow_up_tags = tags
|
329
|
+
follow_up.save
|
326
330
|
render json: {success: true, tags: tags_name}
|
327
331
|
end
|
328
332
|
|
333
|
+
def add_assign
|
334
|
+
follow_up = FollowUp.find(params[:id])
|
335
|
+
staff_ids = follow_up.watch_follow_ups.pluck(:staff_id)
|
336
|
+
|
337
|
+
common = Common.find_by(clazz: 'staff_type', name: '销售')
|
338
|
+
gon.assign_watch= Staff.joins(:user).where.not(job_type: common.id).where.not(role_id: 11).map { |d| {name: d.user.real_name, value: d.id, selected: staff_ids.include?(d.id)} }
|
339
|
+
render layout: false
|
340
|
+
end
|
341
|
+
|
342
|
+
def update_assign
|
343
|
+
follow_up = FollowUp.find(params[:id])
|
344
|
+
staffs = []
|
345
|
+
params[:staff_ids].split(",").each do |staff_id|
|
346
|
+
staffs << WatchFollowUp.find_or_initialize_by(staff_id: staff_id, follow_up_id: follow_up.id)
|
347
|
+
end
|
348
|
+
follow_up.watch_follow_ups = staffs
|
349
|
+
follow_up.save
|
350
|
+
render json: {success: true, tags: staffs.map { |d| d.staff.user.real_name }}
|
351
|
+
end
|
329
352
|
|
330
353
|
private
|
331
354
|
|
@@ -6,8 +6,12 @@ module EducodeSales
|
|
6
6
|
def index
|
7
7
|
respond_to do |format|
|
8
8
|
format.html do
|
9
|
+
|
9
10
|
end
|
10
11
|
format.js do
|
12
|
+
gon.edit_record = can?(:update_record, EducodeSales::MoneyPlan)
|
13
|
+
gon.edit_record_self = can?(:update_record_self, EducodeSales::MoneyPlan)
|
14
|
+
gon.staff_id = @current_admin.id
|
11
15
|
end
|
12
16
|
format.json do
|
13
17
|
@money_plan_records = MoneyPlanRecord.left_joins(:money_plan_claims).group("educode_sales_money_plan_records.id").select("educode_sales_money_plan_records.*, COUNT(educode_sales_money_plan_claims.id) AS claim_num")
|
@@ -132,6 +136,36 @@ module EducodeSales
|
|
132
136
|
if business
|
133
137
|
money_plan_record.update(business_id: business.id)
|
134
138
|
business.update(return_money: claim.money_plan.money_plan_claims.sum(:amount))
|
139
|
+
|
140
|
+
|
141
|
+
# # 生成跟进信息
|
142
|
+
# last_follow_up = business.last_follow_up
|
143
|
+
# if last_follow_up.present?
|
144
|
+
# follow_up = last_follow_up.dup
|
145
|
+
|
146
|
+
# follow_up.description = "认领了回款记录"
|
147
|
+
|
148
|
+
# follow_up.staff = @current_admin
|
149
|
+
|
150
|
+
# last_follow_up.assign_follow_ups.each do |d|
|
151
|
+
# follow_up.assign_follow_ups.build(staff_id: d.staff_id)
|
152
|
+
# end
|
153
|
+
|
154
|
+
# if follow_up.save!
|
155
|
+
# last_follow_up.key_person.each do |d|
|
156
|
+
# key_person = d.dup
|
157
|
+
# key_person.follow_up_id = follow_up.id
|
158
|
+
# key_person.save
|
159
|
+
# end
|
160
|
+
# last_follow_up.money_plans.each do |d|
|
161
|
+
# d.follow_up_id = follow_up.id
|
162
|
+
# d.save
|
163
|
+
# end
|
164
|
+
# business.update(last_follow_up_id: follow_up.id)
|
165
|
+
# end
|
166
|
+
# end
|
167
|
+
|
168
|
+
|
135
169
|
end
|
136
170
|
end
|
137
171
|
render_success
|
@@ -7,6 +7,7 @@ module EducodeSales
|
|
7
7
|
authorize! :read, MoneyPlan
|
8
8
|
respond_to do |format|
|
9
9
|
format.html do
|
10
|
+
|
10
11
|
end
|
11
12
|
format.json do
|
12
13
|
last_follow_up_ids = Business.all.pluck(:last_follow_up_id)
|
@@ -48,6 +49,9 @@ module EducodeSales
|
|
48
49
|
format.html do
|
49
50
|
common = Common.find_by(clazz: 'staff_type', name: '销售')
|
50
51
|
@staffs = Staff.joins(:user).where(job_type: common.id).map { |d| [d.user.real_name, d.id]}
|
52
|
+
gon.edit_money_plan = can?(:update, EducodeSales::MoneyPlan)
|
53
|
+
gon.edit_money_plan_self = can?(:update_self, EducodeSales::MoneyPlan)
|
54
|
+
gon.staff_id = @current_admin.id
|
51
55
|
end
|
52
56
|
|
53
57
|
end
|
@@ -67,6 +71,10 @@ module EducodeSales
|
|
67
71
|
@money_plan = MoneyPlan.find(params[:id])
|
68
72
|
gon.business_id = @money_plan.business_id
|
69
73
|
gon.business = [{value: @money_plan.business_id.to_s, name: @money_plan.business&.name}]
|
74
|
+
|
75
|
+
gon.edit_money_plan = can?(:update, EducodeSales::MoneyPlan)
|
76
|
+
gon.edit_money_plan_self = can?(:update_self, EducodeSales::MoneyPlan)
|
77
|
+
gon.staff_id = @current_admin.id
|
70
78
|
render layout: false
|
71
79
|
end
|
72
80
|
|
@@ -23,6 +23,8 @@ module EducodeSales
|
|
23
23
|
has_many :teachers, through: :key_person
|
24
24
|
has_many :assign_follow_ups
|
25
25
|
has_many :follow_up_tags, dependent: :destroy
|
26
|
+
|
27
|
+
has_many :watch_follow_ups, dependent: :destroy
|
26
28
|
belongs_to :staff
|
27
29
|
belongs_to :stage, class_name: 'Common'
|
28
30
|
belongs_to :clazz, class_name: 'Common'
|
@@ -34,8 +34,12 @@
|
|
34
34
|
<script type="text/html" id="toolbarDemo">
|
35
35
|
<div class="layui-btn-container">
|
36
36
|
<span class="table-label">签到列表</span>
|
37
|
-
|
38
|
-
|
37
|
+
<% if can?(:import_attendances, EducodeSales::AssessmentsSetting) %>
|
38
|
+
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn pull-right" lay-event="import_attendances"><i class="layui-icon layui-icon-add-circle-fine"></i> 批量导入签到数据</button>
|
39
|
+
<% end %>
|
40
|
+
<% if can?(:batch_delete, EducodeSales::AssessmentsSetting) %>
|
41
|
+
<button class="layui-btn layui-btn-normal layui-btn-sm layui-btn-danger data-delete-btn pull-right" lay-event="batch_delete"><i class="layui-icon layui-icon-delete"></i> 批量删除签到数据</button>
|
42
|
+
<% end %>
|
39
43
|
</div>
|
40
44
|
</script>
|
41
45
|
|
@@ -44,8 +48,12 @@
|
|
44
48
|
</div>
|
45
49
|
|
46
50
|
<script type="text/html" id="currentTableBar">
|
47
|
-
|
48
|
-
|
51
|
+
<% if can?(:edit_attendance, EducodeSales::AssessmentsSetting) %>
|
52
|
+
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">编辑</a>
|
53
|
+
<% end %>
|
54
|
+
<% if can?(:delete_attendance, EducodeSales::AssessmentsSetting) %>
|
55
|
+
<a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除</a>
|
56
|
+
<% end %>
|
49
57
|
</script>
|
50
58
|
|
51
59
|
<script>
|
@@ -6,7 +6,9 @@
|
|
6
6
|
<% if can?(:show, EducodeSales::AssessmentsSetting) %>
|
7
7
|
<li data="assessments" > 考核指标设置</li>
|
8
8
|
<%end %>
|
9
|
-
|
9
|
+
<% if can?(:show_attendances, EducodeSales::AssessmentsSetting) %>
|
10
|
+
<li class="">签到记录</li>
|
11
|
+
<% end %>
|
10
12
|
</ul>
|
11
13
|
<!--<div class="layuimini-main min-height-table"></div>-->
|
12
14
|
<div class="layui-tab-content">
|
@@ -68,34 +68,38 @@
|
|
68
68
|
$ = layui.$;
|
69
69
|
selectInput = layui.selectInput;
|
70
70
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
71
|
+
if ($("#levels").length > 0) {
|
72
|
+
var levels_select = xmSelect.render({
|
73
|
+
el: '#levels',
|
74
|
+
name: 'level_ids',
|
75
|
+
data: gon.levels,
|
76
|
+
on: function(data) {
|
77
|
+
var is_secret = false;
|
78
|
+
data.arr.forEach(function(i) {
|
79
|
+
if (i.name == '战略型' || i.name == '保密型') {
|
80
|
+
is_secret = true;
|
81
|
+
}
|
82
|
+
})
|
83
|
+
if (is_secret) {
|
84
|
+
$("#watch_ids_wraper").removeClass('layui-hide')
|
85
|
+
} else {
|
86
|
+
$("#watch_ids_wraper").addClass('layui-hide')
|
80
87
|
}
|
81
|
-
})
|
82
|
-
if (is_secret) {
|
83
|
-
$("#watch_ids_wraper").removeClass('layui-hide')
|
84
|
-
} else {
|
85
|
-
$("#watch_ids_wraper").addClass('layui-hide')
|
86
88
|
}
|
89
|
+
})
|
90
|
+
}
|
91
|
+
if ($("#watch_ids").length > 0) {
|
92
|
+
var watch_id_select = xmSelect.render({
|
93
|
+
el: '#watch_ids',
|
94
|
+
name: 'watch_ids',
|
95
|
+
data: gon.watche_ids,
|
96
|
+
filterable: true,
|
97
|
+
})
|
98
|
+
if (gon.is_secret) {
|
99
|
+
$("#watch_ids_wraper").removeClass("layui-hide")
|
87
100
|
}
|
88
|
-
})
|
89
|
-
|
90
|
-
var watch_id_select = xmSelect.render({
|
91
|
-
el: '#watch_ids',
|
92
|
-
name: 'watch_ids',
|
93
|
-
data: gon.watche_ids,
|
94
|
-
filterable: true,
|
95
|
-
})
|
96
|
-
if (gon.is_secret) {
|
97
|
-
$("#watch_ids_wraper").removeClass("layui-hide")
|
98
101
|
}
|
102
|
+
|
99
103
|
var source_way = gon.source_way;
|
100
104
|
form.on('select(source_id)', function(data){
|
101
105
|
source_way = data.value;
|
@@ -162,20 +166,22 @@
|
|
162
166
|
|
163
167
|
}
|
164
168
|
});
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
169
|
+
if ($("#merge_business").length > 0) {
|
170
|
+
var merge_business_select = xmSelect.render({
|
171
|
+
el: '#merge_business',
|
172
|
+
filterable: true,
|
173
|
+
name: 'merge_business_ids',
|
174
|
+
remoteSearch: true,
|
175
|
+
remoteMethod: function(val, cb, show){
|
176
|
+
request.get('missions/businesses/search?id=' + parent.id + "&q=" + val, {},
|
177
|
+
function(res) {
|
178
|
+
cb(res.data)
|
179
|
+
})
|
180
|
+
},
|
181
|
+
data: []
|
182
|
+
})
|
183
|
+
}
|
184
|
+
|
179
185
|
|
180
186
|
|
181
187
|
var sourcable_id = gon.sourcable_id;
|
@@ -32,6 +32,15 @@ json.data do
|
|
32
32
|
json.divide_money d.divide_amount
|
33
33
|
json.budget_amount d.budget_amount
|
34
34
|
json.area d.department&.school&.province
|
35
|
+
|
36
|
+
json.keys_person_count d.last_follow_up.present? ? EducodeSales::KeyPerson.where("follow_up_id = #{d.last_follow_up.id}").count : 0
|
37
|
+
json.rival d.last_follow_up&.rival || ''
|
38
|
+
|
39
|
+
if ["会议活动", "渠道代理", "客户"].include?(d.source_way)
|
40
|
+
json.source "#{d.source_way} #{d.sourcable&.name}"
|
41
|
+
else
|
42
|
+
json.source "#{d.source_way} #{d.sourcable_type}"
|
43
|
+
end
|
35
44
|
# school_property = d.department&.school&.school_property
|
36
45
|
# property = []
|
37
46
|
|
@@ -91,35 +91,13 @@
|
|
91
91
|
<input type="text" class="layui-input" id="bidded_date" name="bidded_date" placeholder=" - " autocomplete="off">
|
92
92
|
</div>
|
93
93
|
</div>
|
94
|
-
<div class="layui-inline show_item" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
|
95
|
-
<label class="layui-form-label">签单时间</label>
|
96
|
-
<div class="layui-input-inline">
|
97
|
-
<input type="text" class="layui-input" id="signed_date" name="signed_date" placeholder=" - " autocomplete="off">
|
98
|
-
</div>
|
99
|
-
</div>
|
100
|
-
<div class="layui-inline show_item" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
|
101
|
-
<label class="layui-form-label">回款时间</label>
|
102
|
-
<div class="layui-input-inline">
|
103
|
-
<input type="text" class="layui-input" id="date_at" name="date_at" placeholder=" - " autocomplete="off">
|
104
|
-
</div>
|
105
|
-
</div>
|
106
94
|
<div class="layui-inline show_item" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
|
107
95
|
<label class="layui-form-label">创建时间</label>
|
108
96
|
<div class="layui-input-inline">
|
109
97
|
<input type="text" class="layui-input" id="date" name="date" placeholder=" - " autocomplete="off">
|
110
98
|
</div>
|
111
99
|
</div>
|
112
|
-
|
113
|
-
<label class="layui-form-label">部署类型</label>
|
114
|
-
<div class="layui-input-inline">
|
115
|
-
<select name="o_business_deployment">
|
116
|
-
<option value=""></option>
|
117
|
-
<option value="1">公有云</option>
|
118
|
-
<option value="2">私有云</option>
|
119
|
-
<option value="3">混合云</option>
|
120
|
-
</select>
|
121
|
-
</div>
|
122
|
-
</div>
|
100
|
+
|
123
101
|
<div class="layui-inline show_item" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
|
124
102
|
<label class="layui-form-label">商机等级</label>
|
125
103
|
<div class="layui-input-inline">
|
@@ -130,6 +108,15 @@
|
|
130
108
|
</select>
|
131
109
|
</div>
|
132
110
|
</div>
|
111
|
+
<div class="layui-inline show_item" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
|
112
|
+
<label class="layui-form-label">商机来源</label>
|
113
|
+
<div class="layui-inline">
|
114
|
+
<%= select_tag "source_way", options_for_select(EducodeSales::Business.source_ways.keys), { include_blank: true, "lay-filter": 'source_id_select' } %>
|
115
|
+
</div>
|
116
|
+
<div class="layui-inline" style="line-height: 38px;display:none;" id="source_input_wraper">
|
117
|
+
<input type="text" class="layui-input" name="source_name" placeholder="" autocomplete="off" id="source_name_input">
|
118
|
+
</div>
|
119
|
+
</div>
|
133
120
|
<div class="layui-inline show_item" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
|
134
121
|
<label class="layui-form-label">销售经理</label>
|
135
122
|
<div class="layui-input-inline">
|
@@ -277,19 +264,46 @@
|
|
277
264
|
range: true,
|
278
265
|
value: gon.bidded_date
|
279
266
|
});
|
280
|
-
|
281
|
-
elem: '#signed_date',
|
282
|
-
range: true,
|
283
|
-
value: gon.signed_date
|
284
|
-
});
|
267
|
+
|
285
268
|
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
value: gon.date_at
|
269
|
+
form.on('select(source_id_select)', function(data){
|
270
|
+
setSourceWay(data.value);
|
271
|
+
$("#source_name_input")[0].value = "";
|
290
272
|
});
|
291
273
|
|
292
|
-
|
274
|
+
|
275
|
+
function setSourceWay(value) {
|
276
|
+
if (value == '400电话' || value == '商务邮箱') {
|
277
|
+
$("#source_input_wraper").hide()
|
278
|
+
} else {
|
279
|
+
$("#source_input_wraper").show()
|
280
|
+
var text = "";
|
281
|
+
switch (value) {
|
282
|
+
case '会议活动':
|
283
|
+
text = "请选择活动运营";
|
284
|
+
break;
|
285
|
+
case '公司资源':
|
286
|
+
text = "请填写公司领导、部门其他同事姓名";
|
287
|
+
break;
|
288
|
+
case '渠道代理':
|
289
|
+
text = "请选择渠道";
|
290
|
+
break;
|
291
|
+
case '合作伙伴':
|
292
|
+
text = "请填写合作伙伴公司名称";
|
293
|
+
break;
|
294
|
+
case '招标信息':
|
295
|
+
text = "请填写招标信息";
|
296
|
+
break;
|
297
|
+
case '客户':
|
298
|
+
text = "请选择客户";
|
299
|
+
break;
|
300
|
+
case '朋友':
|
301
|
+
text = "请填写姓名";
|
302
|
+
break;
|
303
|
+
}
|
304
|
+
$("#source_name_input")[0].placeholder = text;
|
305
|
+
}
|
306
|
+
}
|
293
307
|
|
294
308
|
// $('#businesses_table_wraper .layui-table-body').on('scroll', function(e) {
|
295
309
|
// var leftPx = $(e.target).scrollLeft(); //获取表格body,滚动条距离左边的长度
|
@@ -478,7 +492,7 @@
|
|
478
492
|
},
|
479
493
|
{
|
480
494
|
field: 'source',
|
481
|
-
width:
|
495
|
+
width: 150,
|
482
496
|
title: '商机来源',
|
483
497
|
hide: gon.filter.source
|
484
498
|
},
|
@@ -773,8 +787,6 @@
|
|
773
787
|
select: data.select,
|
774
788
|
staff_id: data.staff_id,
|
775
789
|
staff_manages: data.staff_manages,
|
776
|
-
signed_date: data.signed_date,
|
777
|
-
date_at: data.date_at,
|
778
790
|
bidded_date: data.bidded_date,
|
779
791
|
business_year: data.business_year,
|
780
792
|
year: data.year,
|
@@ -63,7 +63,12 @@ json.data do
|
|
63
63
|
json.return_money_days d.last_follow_up&.reception_at.present? && d.last_follow_up.money_plans.where(clazz: '实际回款').present? ? (d.last_follow_up.money_plans.where(clazz: '实际回款').order(created_at: :asc).first.date_at.to_s(:date).to_date - d.last_follow_up&.reception_at).to_i : ''
|
64
64
|
json.place d.last_follow_up&.place&.name
|
65
65
|
json.last_follow_person d.last_follow_up.present? ? d.last_follow_up.staff&.user&.real_name : d.staff&.user&.real_name
|
66
|
-
|
66
|
+
if ["会议活动", "渠道代理", "客户"].include?(d.source_way)
|
67
|
+
json.source "#{d.source_way} #{d.sourcable&.name}"
|
68
|
+
else
|
69
|
+
json.source "#{d.source_way} #{d.sourcable_type}"
|
70
|
+
end
|
71
|
+
|
67
72
|
json.assign_follow_ups d.last_follow_up.present? ? d.last_follow_up.assign_follow_ups.pluck(:staff_id) : []
|
68
73
|
json.current_staff_id @current_admin.id
|
69
74
|
json.staff_id d.staff_id
|
@@ -14,13 +14,20 @@
|
|
14
14
|
<a href="/missions/customers" style=" color: #0000FF">添加单位/部门</a>
|
15
15
|
</div>
|
16
16
|
<br>
|
17
|
-
<div class="layui-inline" style="padding-top: 20px">
|
17
|
+
<!-- <div class="layui-inline" style="padding-top: 20px">
|
18
18
|
<label class="layui-form-label ">商机来源</label>
|
19
19
|
<input type="text" name="source" autocomplete="off" class="layui-input" style="width: 300px;" placeholder="请输入商机来源">
|
20
|
-
</div>
|
20
|
+
</div> -->
|
21
21
|
<div class="layui-inline" style="padding-top: 20px">
|
22
|
-
<
|
22
|
+
<label class="layui-form-label required">商机来源</label>
|
23
|
+
<div class="layui-inline">
|
24
|
+
<%= select_tag "source_way", options_for_select(EducodeSales::Business.source_ways.keys), { include_blank: true, "lay-filter": 'source_id', "lay-verify": "required" } %>
|
25
|
+
</div>
|
26
|
+
<div class="layui-inline" style="line-height: 38px;" id="source_wraper">
|
27
|
+
<div id="customer_id" style="width: 360px"></div>
|
28
|
+
</div>
|
23
29
|
</div>
|
30
|
+
|
24
31
|
<br>
|
25
32
|
<div class="layui-inline" style="padding-top: 20px">
|
26
33
|
<label class="layui-form-label required">项目类型</label>
|
@@ -70,6 +77,85 @@
|
|
70
77
|
}
|
71
78
|
});
|
72
79
|
|
80
|
+
var source_way = "";
|
81
|
+
form.on('select(source_id)', function(data){
|
82
|
+
source_way = data.value;
|
83
|
+
setSourceWay(data.value);
|
84
|
+
$("#" + customer_select._input)[0].value = "";
|
85
|
+
});
|
86
|
+
|
87
|
+
|
88
|
+
function setSourceWay(value) {
|
89
|
+
if (value == '400电话' || value == '商务邮箱') {
|
90
|
+
$("#source_wraper").hide()
|
91
|
+
} else {
|
92
|
+
$("#source_wraper").show()
|
93
|
+
var text = "";
|
94
|
+
switch (value) {
|
95
|
+
case '会议活动':
|
96
|
+
text = "请选择活动运营";
|
97
|
+
break;
|
98
|
+
case '公司资源':
|
99
|
+
text = "请填写公司领导、部门其他同事姓名";
|
100
|
+
break;
|
101
|
+
case '渠道代理':
|
102
|
+
text = "请选择渠道";
|
103
|
+
break;
|
104
|
+
case '合作伙伴':
|
105
|
+
text = "请填写合作伙伴公司名称";
|
106
|
+
break;
|
107
|
+
case '招标信息':
|
108
|
+
text = "请填写招标信息";
|
109
|
+
break;
|
110
|
+
case '客户':
|
111
|
+
text = "请选择客户";
|
112
|
+
break;
|
113
|
+
case '朋友':
|
114
|
+
text = "请填写姓名";
|
115
|
+
break;
|
116
|
+
}
|
117
|
+
$("#" + customer_select._input)[0].placeholder = text;
|
118
|
+
}
|
119
|
+
}
|
120
|
+
|
121
|
+
var sourcable_id = "";
|
122
|
+
var customer_select = selectInput.render({
|
123
|
+
elem: '#customer_id',
|
124
|
+
name: 'sourcable_type', // 渲染的input的name值
|
125
|
+
layFilter: 'test', //同layui form参数lay-filter
|
126
|
+
// layVerify: 'required', //同layui form参数lay-verify
|
127
|
+
layVerType: 'tips', // 同layui form参数lay-verType
|
128
|
+
layReqText: '请填写文本', //同layui form参数lay-ReqText
|
129
|
+
hasSelectIcon: false,
|
130
|
+
placeholder: '请输入商机来源', // 渲染的inputplaceholder值
|
131
|
+
remoteSearch: true, // 是否启用远程搜索 默认是false,和远程搜索回调保存同步
|
132
|
+
remoteMethod: function (value, cb) { // 远程搜索的回调函数
|
133
|
+
if (!value) {
|
134
|
+
sourcable_id = "";
|
135
|
+
return cb([]);
|
136
|
+
}
|
137
|
+
if (['会议活动', '渠道代理', '客户'].includes(source_way)) {
|
138
|
+
var type = "";
|
139
|
+
if (source_way == '客户') {
|
140
|
+
type = 'customer';
|
141
|
+
} else if (source_way == '渠道代理') {
|
142
|
+
type = 'place';
|
143
|
+
} else if (source_way == '会议活动') {
|
144
|
+
type = 'active';
|
145
|
+
}
|
146
|
+
request.get('missions/search_customer?q=' + value + "&type=" + type, {}, function (res) {
|
147
|
+
if (res.data.length == 0) {
|
148
|
+
customer_select.emptyValue();
|
149
|
+
return cb([])
|
150
|
+
}
|
151
|
+
return cb(res)
|
152
|
+
})
|
153
|
+
}
|
154
|
+
}
|
155
|
+
});
|
156
|
+
|
157
|
+
|
158
|
+
|
73
159
|
// 当前弹出层,防止ID被覆盖
|
74
160
|
var parentIndex = layer.index;
|
75
161
|
|
@@ -83,6 +169,9 @@
|
|
83
169
|
name: data.field.name,
|
84
170
|
source: data.field.source,
|
85
171
|
clazz_id: data.field.clazz_id,
|
172
|
+
source_way: data.field.source_way,
|
173
|
+
sourcable_type: data.field.sourcable_type,
|
174
|
+
sourcable_id: customer_select.getValue() || sourcable_id,
|
86
175
|
|
87
176
|
}, function (res) {
|
88
177
|
if (res.success == false) {
|
@@ -34,6 +34,16 @@
|
|
34
34
|
</span>
|
35
35
|
<!-- <span class="layui-badge layui-bg-green"></span> -->
|
36
36
|
<button type="button" class="layui-btn layui-btn-xs layui-btn-primary add-tag" data-id="<%= f.id %>"><i class="layui-icon layui-icon-addition"></i>标签设置</button>
|
37
|
+
|
38
|
+
<br/>
|
39
|
+
<br/>
|
40
|
+
<span id="assign_<%= f.id %>">
|
41
|
+
<% f.watch_follow_ups.each do |d| %>
|
42
|
+
<span class="layui-badge layui-bg-green"><%= d.staff&.name %></span>
|
43
|
+
<% end %>
|
44
|
+
</span>
|
45
|
+
<!-- <span class="layui-badge layui-bg-green"></span> -->
|
46
|
+
<button type="button" class="layui-btn layui-btn-xs layui-btn-primary assign-staff" data-id="<%= f.id %>"><i class="layui-icon layui-icon-addition"></i>指定人查看</button>
|
37
47
|
</p>
|
38
48
|
</div>
|
39
49
|
</li>
|
@@ -150,6 +160,28 @@
|
|
150
160
|
});
|
151
161
|
})
|
152
162
|
|
163
|
+
$(".assign-staff").on("click", function(e) {
|
164
|
+
var data = e.currentTarget.dataset;
|
165
|
+
follow_up_id = data.id
|
166
|
+
var content = miniPage.getHrefContent('/missions/follow_ups/' + follow_up_id + '/add_assign');
|
167
|
+
var openWH = miniPage.getOpenWidthHeight();
|
168
|
+
tindex = layer.open({
|
169
|
+
title: '指定人查看',
|
170
|
+
type: 1,
|
171
|
+
shade: 0.2,
|
172
|
+
maxmin: true,
|
173
|
+
shadeClose: true,
|
174
|
+
area: ['700px','600px'],
|
175
|
+
// offset: [openWH[2] + 'px', openWH[3] + 'px'],
|
176
|
+
content: content
|
177
|
+
});
|
178
|
+
$(window).on("resize", function () {
|
179
|
+
layer.full(sindex);
|
180
|
+
});
|
181
|
+
})
|
182
|
+
|
183
|
+
|
184
|
+
|
153
185
|
|
154
186
|
|
155
187
|
});
|
@@ -97,6 +97,13 @@
|
|
97
97
|
<%= select_tag "funding_source", options_for_select([''] + EducodeSales::FollowUp::funding_sources.keys, @last_follow_up&.funding_source), class: 'required' %>
|
98
98
|
</div>
|
99
99
|
</div>
|
100
|
+
<div class="layui-inline">
|
101
|
+
<label class="layui-form-label">合同额(万)</label>
|
102
|
+
<div class="layui-input-inline">
|
103
|
+
<input name="actual_amount" type="number" class="layui-input" autocomplete="off" placeholder="本单位的签单金额"
|
104
|
+
value="<%= @last_follow_up&.actual_amount.to_f.round(6) %>">
|
105
|
+
</div>
|
106
|
+
</div>
|
100
107
|
<br>
|
101
108
|
<h2 style="padding-left:20px;margin-top: 25px;">签单</h2>
|
102
109
|
<hr>
|
@@ -48,12 +48,12 @@ json.data do
|
|
48
48
|
json.department d['department_name'] || ''
|
49
49
|
json.major_count d['major_count']
|
50
50
|
json.department_id d['department_id'] || ''
|
51
|
-
json.teacher_counts d['teacher_count']
|
52
|
-
json.student_counts d['student_count']
|
51
|
+
json.teacher_counts d['teacher_count'] || 0
|
52
|
+
json.student_counts d['student_count'] || 0
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
56
|
json.code 0
|
57
57
|
if params[:page].present?
|
58
|
-
json.count @
|
58
|
+
json.count @count
|
59
59
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
<%= Gon::Base.render_data %>
|
2
|
+
<div class="layui-form layuimini-form">
|
3
|
+
<div class="layui-form-item" style="padding: 25px">
|
4
|
+
<div id="assign_staff"></div>
|
5
|
+
<div class="layui-form-item text-center" style="margin-top: 60px;">
|
6
|
+
<button class="layui-btn layui-btn-normal" lay-submit lay-filter="btn">提交</button>
|
7
|
+
</div>
|
8
|
+
</div>
|
9
|
+
</div>
|
10
|
+
<script>
|
11
|
+
layui.use(['form', 'request', 'xmSelect'], function() {
|
12
|
+
var form = layui.form,
|
13
|
+
request = layui.request,
|
14
|
+
xmSelect = layui.xmSelect,
|
15
|
+
$ = layui.$;
|
16
|
+
|
17
|
+
var place_list = xmSelect.render({
|
18
|
+
el: '#assign_staff',
|
19
|
+
name: "staff_ids",
|
20
|
+
tips: '请选择人员',
|
21
|
+
clickClose: true,
|
22
|
+
paging: true,
|
23
|
+
filterable: true,
|
24
|
+
data: gon.assign_watch,
|
25
|
+
})
|
26
|
+
|
27
|
+
form.on("submit(btn)", function(form) {
|
28
|
+
request.post('missions/follow_ups/' + parent.follow_up_id + '/update_assign',
|
29
|
+
form.field,
|
30
|
+
function(res) {
|
31
|
+
if (res.success) {
|
32
|
+
$("#assign_" + parent.follow_up_id).html("");
|
33
|
+
res.tags.forEach(function(tag) {
|
34
|
+
$("#assign_" + parent.follow_up_id).append(' <span class="layui-badge layui-bg-green">' + tag + '</span')
|
35
|
+
})
|
36
|
+
}
|
37
|
+
layer.close(tindex);
|
38
|
+
})
|
39
|
+
})
|
40
|
+
|
41
|
+
})
|
42
|
+
</script>
|
@@ -1,3 +1,4 @@
|
|
1
|
+
<%= Gon::Base.render_data %>
|
1
2
|
<div style="margin: 10px 10px 10px 10px" id="money_plan_record">
|
2
3
|
<form class="layui-form layui-form-pane" lay-filter="submit_form_record">
|
3
4
|
<div class="layui-form-item">
|
@@ -52,13 +53,13 @@
|
|
52
53
|
</script>
|
53
54
|
|
54
55
|
<script type="text/html" id="currentTableBarmoney_record">
|
55
|
-
|
56
|
+
{{# if (gon.edit_record || d.staff_id == gon.staff_id && gon.edit_record_self) {}}
|
56
57
|
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">编辑</a>
|
57
|
-
|
58
|
+
{{# }}}
|
58
59
|
<% if can? :delete_update_record, EducodeSales::MoneyPlan %>
|
59
60
|
<a class="layui-btn layui-btn-danger layui-btn-xs data-count-edit" lay-event="delete">删除</a>
|
60
61
|
<% end %>
|
61
|
-
<a class="layui-btn layui-btn-
|
62
|
+
<a class="layui-btn layui-btn-default layui-btn-xs data-count-edit" lay-event="confirm">认领回款</a>
|
62
63
|
</script>
|
63
64
|
|
64
65
|
<script>
|
@@ -1,3 +1,4 @@
|
|
1
|
+
<%= Gon::Base.render_data %>
|
1
2
|
<div style="margin: 10px 10px 10px 10px" id="money_plan_list">
|
2
3
|
<form class="layui-form layui-form-pane" lay-filter="search_plans">
|
3
4
|
<div class="layui-form-item">
|
@@ -23,7 +24,9 @@
|
|
23
24
|
</form>
|
24
25
|
</div>
|
25
26
|
<script type="text/html" id="toolbar_money_plan">
|
27
|
+
<% if can? :create, EducodeSales::MoneyPlan %>
|
26
28
|
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn pull-right" style="margin-left: 20px;" lay-event="addMoney">添加回款计划</button>
|
29
|
+
<% end %>
|
27
30
|
</script>
|
28
31
|
|
29
32
|
<table class="layui-hide" id="money_plan_table" lay-filter="money_plan_table"></table>
|
@@ -32,9 +35,13 @@
|
|
32
35
|
<a href="<%= base_url%>/colleges/{{d.school_id}}/statistics" class="layui-table-link" target="_blank">{{ d.school }}</a>
|
33
36
|
</script>
|
34
37
|
<script type="text/html" id="currentTableBarmoney_plan">
|
38
|
+
{{# if (gon.edit_money_plan || d.staff_id == gon.staff_id && gon.edit_money_plan_self) {}}
|
35
39
|
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">编辑</a>
|
40
|
+
{{# }}}
|
41
|
+
<% if can? :delete, EducodeSales::MoneyPlan %>
|
36
42
|
<a class="layui-btn layui-btn-danger layui-btn-xs data-count-edit" lay-event="delete">删除</a>
|
37
|
-
|
43
|
+
<% end %>
|
44
|
+
<a class="layui-btn layui-btn-default layui-btn-xs data-count-edit" lay-event="apply">开票申请</a>
|
38
45
|
<!-- <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">催款提醒</a> -->
|
39
46
|
|
40
47
|
</script>
|
data/config/routes.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: educode_sales
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.10.
|
4
|
+
version: 1.10.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- anke1460
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-06-
|
11
|
+
date: 2023-06-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -364,6 +364,7 @@ files:
|
|
364
364
|
- app/views/educode_sales/customers/show_follow.json.jbuilder
|
365
365
|
- app/views/educode_sales/customers/show_follow_record.html.erb
|
366
366
|
- app/views/educode_sales/customers/show_majors.html.erb
|
367
|
+
- app/views/educode_sales/follow_ups/add_assign.html.erb
|
367
368
|
- app/views/educode_sales/follow_ups/add_tag.html.erb
|
368
369
|
- app/views/educode_sales/follow_ups/file.html.erb
|
369
370
|
- app/views/educode_sales/follow_ups/index.json.jbuilder
|
@@ -758,7 +759,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
758
759
|
- !ruby/object:Gem::Version
|
759
760
|
version: '0'
|
760
761
|
requirements: []
|
761
|
-
rubygems_version: 3.0.
|
762
|
+
rubygems_version: 3.0.9
|
762
763
|
signing_key:
|
763
764
|
specification_version: 4
|
764
765
|
summary: Summary of EducodeSales.
|