educode_sales 1.10.23 → 1.10.24

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.
Files changed (28) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/educode_sales/businesses_controller.rb +13 -0
  3. data/app/controllers/educode_sales/contracts_controller.rb +55 -0
  4. data/app/controllers/educode_sales/follow_ups_controller.rb +29 -0
  5. data/app/controllers/educode_sales/money_plan_records_controller.rb +14 -10
  6. data/app/controllers/educode_sales/money_plans_controller.rb +5 -3
  7. data/app/controllers/educode_sales/plans_controller.rb +28 -5
  8. data/app/helpers/educode_sales/sale_trends_helper.rb +11 -1
  9. data/app/models/educode_sales/common.rb +3 -1
  10. data/app/models/educode_sales/money_plan_claim.rb +1 -1
  11. data/app/models/educode_sales/permission.rb +2 -1
  12. data/app/models/educode_sales/sale_plan.rb +2 -0
  13. data/app/views/educode_sales/businesses/index.html.erb +123 -80
  14. data/app/views/educode_sales/ideas/_index.html.erb +2 -2
  15. data/app/views/educode_sales/ideas/follow_ups.json.jbuilder +2 -1
  16. data/app/views/educode_sales/money_plans/index.json.jbuilder +4 -4
  17. data/app/views/educode_sales/plans/_monthPlan.html.erb +5 -0
  18. data/app/views/educode_sales/plans/_weekPlan.html.erb +5 -0
  19. data/app/views/educode_sales/plans/_yearPlan.html.erb +4 -4
  20. data/app/views/educode_sales/plans/edit_month.html.erb +6 -0
  21. data/app/views/educode_sales/plans/edit_week.html.erb +6 -0
  22. data/app/views/educode_sales/plans/index.json.jbuilder +1 -0
  23. data/app/views/educode_sales/plans/new_month.html.erb +14 -0
  24. data/app/views/educode_sales/plans/new_week.html.erb +14 -0
  25. data/db/migrate/20230629130033_add_clazz_to_money_plans.rb +6 -0
  26. data/lib/educode_sales/version.rb +1 -1
  27. metadata +7 -7
  28. data/app/assets/images/educode_sales/indexlogo.png +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ac157bfbdbc5c1aceeef3b0d0af4b81e74b6835ddda09a5beae4188f23720391
4
- data.tar.gz: a4f7c4077fc9af0f5374fc3efec8bf42e5c3a57a27dc78090a5727cabe2f5510
3
+ metadata.gz: 3b89143c3577e56b16967098a24f73fe1b7d3b1a0906047bb1b70a5f403442d2
4
+ data.tar.gz: 75cfa41097af3a67fc4e74d0a64203cc34d2e551bee15097a5c310b5e78382d4
5
5
  SHA512:
6
- metadata.gz: 804531ab845025fe61054b79b248a5f1f83e4194d0c23cad2f0fb4c49978db71eb695815723d50e7255fa35a4aa0b0154babb156fdd5cd953808bb2a1b56a9e9
7
- data.tar.gz: 13484d3b014be703413f41b03938881aeb56bd1b7cf97f721f055f9a0aa869dfedc6b948ddbd57bb7b3174c2e3aa171dc7efa5823821f3e2b903e1e1ec9b2591
6
+ metadata.gz: 14a3554944e927b9536e035ddd17906aa836f48c5715cf8f6966a986af517cd8fb9e37847d26fae97ffd2b2f7e596ecf3104f1ac43069ff7290c2561ed9dbae1
7
+ data.tar.gz: 125797df83bf24579f5c5100649aa47659580c84968bc9d06edb309c6ae2274095c809142905f065f856370afa6112920a5a6eff12dcf62eca52c7b09f0d4bf5
@@ -15,6 +15,7 @@ module EducodeSales
15
15
  # @more = can?(:create, EducodeSales::SalePlan) || can?(:update, EducodeSales::Business) || can?(:destroy, EducodeSales::Business) || can?(:show_file, EducodeSales::Business)
16
16
  @more = true
17
17
  gon.menus = []
18
+ gon.assign_menus = []
18
19
  gon.export_menus = []
19
20
  gon.place = params[:place_id].present? ? [{ value: params[:place_id], name: EducodeSales::Place.find(params[:place_id]).name }] : []
20
21
 
@@ -70,18 +71,30 @@ module EducodeSales
70
71
  gon.menus << { title: '添加年计划', event: 'year' }
71
72
  end
72
73
 
74
+ if can?(:assign, EducodeSales::SalePlan)
75
+ gon.assign_menus << { title: '指派周计划', event: 'week' }
76
+ gon.assign_menus << { title: '指派月计划', event: 'month' }
77
+ gon.assign_menus << { title: '指派年计划', event: 'year' }
78
+ end
79
+
73
80
  gon.menus << { title: '添加回款计划', event: 'money_plan' }
81
+ gon.assign_menus << { title: '添加回款计划', event: 'money_plan' }
74
82
 
75
83
  gon.menus << { title: '关注', event: 'following' }
76
84
  gon.menus << { title: '跟进时间线', event: 'time_line' }
85
+
86
+ gon.assign_menus << { title: '关注', event: 'following' }
87
+ gon.assign_menus << { title: '跟进时间线', event: 'time_line' }
77
88
  if can?(:show_file, EducodeSales::Business)
78
89
  gon.menus << { title: '附件管理', event: 'file' }
90
+ gon.assign_menus << { title: '附件管理', event: 'file' }
79
91
  end
80
92
  if can?(:update, EducodeSales::Business)
81
93
  # gon.menus << { title: '编辑', event: 'edit' }
82
94
  end
83
95
  if can?(:destroy, EducodeSales::Business)
84
96
  gon.menus << { title: '删除', event: 'delete' }
97
+ gon.assign_menus << { title: '删除', event: 'delete' }
85
98
  end
86
99
  if can?(:export_business, EducodeSales::Business)
87
100
  gon.export_menus << { title: '导出到Csv文件', event: 'export_csv' }
@@ -328,6 +328,17 @@ module EducodeSales
328
328
  def add_follow_ups
329
329
  @business = Business.find(params[:business_id])
330
330
  last_follow_up = @business.last_follow_up
331
+
332
+ # 计划交货时间
333
+ current_1_plan = nil
334
+ # 计划验收时间
335
+ current_2_plan = nil
336
+ # 实际交货时间
337
+ current_1_actual = nil
338
+ # 实际验收时间
339
+ current_2_actual = nil
340
+
341
+
331
342
 
332
343
  data = []
333
344
  6.times do |i|
@@ -340,9 +351,20 @@ module EducodeSales
340
351
  end
341
352
  params["#{i+1}_plan_date"].each do |d, v|
342
353
  data[i][d.to_i] << v
354
+ if i == 0 && v.present?
355
+ current_1_plan = v.to_date
356
+ elsif i == 1 && v.present?
357
+ current_2_plan = v
358
+ end
343
359
  end
344
360
  params["#{i+1}_actual_date"].each do |d, v|
345
361
  data[i][d.to_i] << v
362
+ if i == 0 && v.present?
363
+ current_1_actual = v.to_date
364
+ elsif i == 1 && v.present?
365
+ current_2_actual = v
366
+ end
367
+
346
368
  if i == 1 && last_follow_up
347
369
  # 验收时间
348
370
  last_follow_up.reception_at = v
@@ -357,6 +379,39 @@ module EducodeSales
357
379
  # data.each do |d|
358
380
  # d.select! { |d| d.delete_if{|f| f == ''}.present? }
359
381
  # end
382
+ current_week = Time.now.strftime('%W')
383
+ staff_manage_ids = @business&.last_follow_up&.assign_follow_ups.present? ? @business.last_follow_up.assign_follow_ups.pluck(:staff_id) : [@business.staff_id]
384
+ if current_1_plan && current_1_plan.to_date.strftime('%W') == current_week
385
+ unless EducodeSales::SalePlan.where(weekly: current_week, content: "提醒:请补充交付计划内容!", business: @business, staff_id: staff_manage_ids, finish_rate: 0).exists?
386
+ common_id = EducodeSales::Common.find_by(clazz: '计划类型', name: '交付计划')&.id
387
+ staff_manage_ids.each do |staff_id|
388
+ EducodeSales::SalePlan.create(month: Time.now.beginning_of_month, weekly: current_week, content: "提醒:请补充交付计划内容!", business: @business, staff_id: staff_id, finish_rate: '0', common_id: common_id )
389
+ EducodeSales::SalePlan.create(month: Time.now.beginning_of_month, content: "提醒:请补充交付计划内容!", business: @business, staff_id: staff_id, finish_rate: '0', common_id: common_id )
390
+ end
391
+ end
392
+ end
393
+
394
+ if current_2_plan && current_2_plan.to_date.strftime('%W') == current_week
395
+ unless EducodeSales::SalePlan.where(weekly: current_week, content: "提醒:请补充验收计划内容!", business: @business, staff_id: staff_manage_ids, finish_rate: 0).exists?
396
+ common_id = EducodeSales::Common.find_by(clazz: '计划类型', name: '验收计划')&.id
397
+ staff_manage_ids.each do |staff_id|
398
+ EducodeSales::SalePlan.create(month: Time.now.beginning_of_month, weekly: current_week, content: "提醒:请补充验收计划内容!", business: @business, staff_id: staff_id, finish_rate: '0', common_id: common_id )
399
+ EducodeSales::SalePlan.create(month: Time.now.beginning_of_month, content: "提醒:请补充验收计划内容!", business: @business, staff_id: staff_id, finish_rate: '0', common_id: common_id )
400
+ end
401
+ end
402
+ end
403
+
404
+ # 更新对应的计划完成度
405
+ if current_2_plan.present? && current_2_plan.to_date.strftime('%W') == current_week
406
+ common_id = EducodeSales::Common.find_by(clazz: '计划类型', name: '交付计划')&.id
407
+ EducodeSales::SalePlan.where(month: Time.now.beginning_of_month, business: @business, staff_id: staff_manage_ids, finish_rate: 0, common_id: common_id).update_all(finish_rate: 100)
408
+ end
409
+
410
+ if current_2_actual.present? && current_2_actual.to_date.strftime('%W') == current_week
411
+ common_id = EducodeSales::Common.find_by(clazz: '计划类型', name: '验收计划')&.id
412
+ EducodeSales::SalePlan.where(month: Time.now.beginning_of_month, business: @business, staff_id: staff_manage_ids, finish_rate: 0, common_id: common_id).update_all(finish_rate: 100)
413
+ end
414
+
360
415
 
361
416
  follow_up = last_follow_up.dup
362
417
 
@@ -119,6 +119,17 @@ module EducodeSales
119
119
  business_clazz_change.save unless business_clazz_change.persisted?
120
120
  end
121
121
  end
122
+
123
+ # 计划投标时间有变化且是当前周的话,添加当周/当月的销售计划
124
+ current_week = Time.now.strftime('%W').to_i
125
+ if follow_up.invitation_at&.strftime('%W').to_i == current_week
126
+ if last_follow_up && last_follow_up.invitation_at&.strftime('%W').to_i == current_week
127
+ current_week = nil
128
+ end
129
+ else
130
+ current_week = nil
131
+ end
132
+
122
133
  if follow_up.save
123
134
  if last_follow_up.present?
124
135
  last_follow_up.key_person.each do |d|
@@ -136,6 +147,24 @@ module EducodeSales
136
147
  last_follow_up.contract_date_lists.update_all(follow_up_id: follow_up.id)
137
148
  end
138
149
  @business.update(last_follow_up_id: follow_up.id, clazz_id: follow_up.clazz_id, p_deploy_time: params[:deploy_time])
150
+
151
+ if current_week.present?
152
+ staff_manage_ids = @business&.last_follow_up&.assign_follow_ups.present? ? @business.last_follow_up.assign_follow_ups.pluck(:staff_id) : [@business.staff_id]
153
+ common_id = EducodeSales::Common.find_by(clazz: '计划类型', name: '中标计划')&.id
154
+ staff_manage_ids.each do |staff_id|
155
+ EducodeSales::SalePlan.create(month: Time.now.beginning_of_month, weekly: current_week, content: "提醒:请补充中标计划内容!", business: @business, staff_id: staff_id, finish_rate: '0', common_id: common_id )
156
+ EducodeSales::SalePlan.create(month: Time.now.beginning_of_month, content: "提醒:请补充中标计划内容!", business: @business, staff_id: staff_id, finish_rate: '0', common_id: common_id )
157
+ end
158
+ end
159
+
160
+ # 更新对应的计划完成度
161
+ if follow_up.bidded_date.present? && follow_up.bidded_date.strftime('%W') == Time.now.strftime('%W')
162
+ staff_manage_ids = @business&.last_follow_up&.assign_follow_ups.present? ? @business.last_follow_up.assign_follow_ups.pluck(:staff_id) : [@business.staff_id]
163
+ common_id = EducodeSales::Common.find_by(clazz: '计划类型', name: '中标计划')&.id
164
+ EducodeSales::SalePlan.where(month: Time.now.beginning_of_month, business: @business, staff_id: staff_manage_ids, finish_rate: 0, common_id: common_id).update_all(finish_rate: 100)
165
+ end
166
+
167
+
139
168
  # 增加o商机编号
140
169
  add_business_number
141
170
  update_department
@@ -6,7 +6,7 @@ module EducodeSales
6
6
  def index
7
7
  respond_to do |format|
8
8
  format.html do
9
-
9
+
10
10
  end
11
11
  format.js do
12
12
  gon.edit_record = can?(:update_record, EducodeSales::MoneyPlan)
@@ -50,7 +50,7 @@ module EducodeSales
50
50
  elsif params[:q][:state] == '无对应合同'
51
51
  @money_plan_records = @money_plan_records.having("claim_num = 0 AND business_id IS NULL")
52
52
  end
53
-
53
+
54
54
  end
55
55
 
56
56
  if params[:q].present? && params[:q][:staff_manages].present?
@@ -60,7 +60,7 @@ module EducodeSales
60
60
  LEFT JOIN educode_sales_assign_follow_ups ON educode_sales_assign_follow_ups.follow_up_id = last_follow_up.id").
61
61
  where("(educode_sales_assign_follow_ups.id IS NOT NULL AND educode_sales_assign_follow_ups.staff_id = ?) OR (educode_sales_assign_follow_ups.id IS NULL AND educode_sales_businesses.staff_id = ?)", params[:q][:staff_manages], params[:q][:staff_manages])
62
62
  end
63
-
63
+
64
64
  if params[:q].present? && params[:q][:amount].present?
65
65
  @money_plan_records = @money_plan_records.where(amount: params[:q][:amount])
66
66
  end
@@ -119,7 +119,7 @@ module EducodeSales
119
119
  business_id = Business.find_by(number: ods.row(r+2)[3].to_s.strip)&.id
120
120
  EducodeSales::MoneyPlanRecord.create(payer_name: ods.row(r+2)[0].to_s.strip, amount: ods.row(r+2)[1].to_s.strip, date_at: ods.row(r+2)[2].to_s.strip, business_id: business_id, staff_id: @current_admin.id) if business_id
121
121
  end
122
-
122
+
123
123
  render json: { succcess: true}
124
124
  end
125
125
 
@@ -163,15 +163,15 @@ module EducodeSales
163
163
  # last_follow_up = business.last_follow_up
164
164
  # if last_follow_up.present?
165
165
  # follow_up = last_follow_up.dup
166
-
166
+
167
167
  # follow_up.description = "认领了回款记录"
168
-
168
+
169
169
  # follow_up.staff = @current_admin
170
-
170
+
171
171
  # last_follow_up.assign_follow_ups.each do |d|
172
172
  # follow_up.assign_follow_ups.build(staff_id: d.staff_id)
173
173
  # end
174
-
174
+
175
175
  # if follow_up.save!
176
176
  # last_follow_up.key_person.each do |d|
177
177
  # key_person = d.dup
@@ -187,9 +187,13 @@ module EducodeSales
187
187
  # end
188
188
  end
189
189
  end
190
-
191
190
  businesses.uniq.each do |d|
192
- d.update(return_money: d.money_plans.joins(:money_plan_claims).sum("educode_sales_money_plan_claims.amount") )
191
+ d.update(return_money: d.money_plans.joins(:money_plan_claims).sum("educode_sales_money_plan_claims.amount").round(6) )
192
+
193
+ # 更新对应的计划完成度
194
+ staff_manage_ids = d&.last_follow_up&.assign_follow_ups.present? ? d.last_follow_up.assign_follow_ups.pluck(:staff_id) : [d.staff_id]
195
+ common_id = EducodeSales::Common.find_by(clazz: '计划类型', name: '回款计划')&.id
196
+ EducodeSales::SalePlan.where(month: Time.now.beginning_of_month, business: d, staff_id: staff_manage_ids, common_id: common_id).update_all(finish_rate: 100)
193
197
  end
194
198
  render_success
195
199
  end
@@ -92,16 +92,18 @@ module EducodeSales
92
92
  data = []
93
93
  week = Time.now.strftime('%W').to_i
94
94
  current_week = ""
95
- staff_manage_ids = business&.last_follow_up&.assign_follow_ups.present? ? business.last_follow_up.assign_follow_ups.pluck(:staff_id) : [business.staff_id]
95
+
96
96
  (params[:num].to_i+1).times do |i|
97
97
  _week = params["date_at[#{i}]"].to_date.strftime('%W').to_i
98
98
  current_week = _week if _week == week
99
99
  business.money_plans.create(category: params["category[#{i}]"], amount: params["amount[#{i}]"], payment_clause: params["payment_clause[#{i}]"], date_at: params["date_at[#{i}]"], follow_up_id: business.last_follow_up_id, staff_id: @current_admin.id )
100
100
  end
101
101
  if current_week.present?
102
+ staff_manage_ids = business&.last_follow_up&.assign_follow_ups.present? ? business.last_follow_up.assign_follow_ups.pluck(:staff_id) : [business.staff_id]
103
+ common_id = EducodeSales::Common.find_by(clazz: '计划类型', name: '回款计划')&.id
102
104
  staff_manage_ids.each do |staff_id|
103
- EducodeSales::SalePlan.create(month: Time.now.beginning_of_month, weekly: week, content: "提醒:请补充回款计划内容!", business: business, staff_id: staff_id, finish_rate: '0' )
104
- EducodeSales::SalePlan.create(month: Time.now.beginning_of_month, content: "提醒:请补充回款计划内容!", business: business, staff_id: staff_id, finish_rate: '0' )
105
+ EducodeSales::SalePlan.create(month: Time.now.beginning_of_month, weekly: week, content: "提醒:请补充回款计划内容!", business: business, staff_id: staff_id, finish_rate: '0', common_id: common_id )
106
+ EducodeSales::SalePlan.create(month: Time.now.beginning_of_month, content: "提醒:请补充回款计划内容!", business: business, staff_id: staff_id, finish_rate: '0', common_id: common_id )
105
107
  end
106
108
  end
107
109
  render_success
@@ -61,7 +61,11 @@ module EducodeSales
61
61
  def create
62
62
  if params["year"].present?
63
63
  business = Business.find_by(id: params[:business_id])
64
- plan = @current_admin.sale_plans.build(year: params[:year], business_id: business.id, clazz: params[:clazz])
64
+ plan = @current_admin.sale_plans.build(year: params[:year], business_id: business.id, clazz: params[:clazz], common_id: params[:common_id] )
65
+ if params[:assign_id].present?
66
+ plan.staff_id = params[:assign_id]
67
+ plan.assign_id = @current_admin.id
68
+ end
65
69
  if plan.save
66
70
  render_success
67
71
  else
@@ -71,6 +75,11 @@ module EducodeSales
71
75
  plan = @current_admin.sale_plans.build(plan_params)
72
76
  plan.month = params["month"] + "-1"
73
77
  plan.business = Business.find_by(id: params[:business_id])
78
+
79
+ if params[:assign_id].present?
80
+ plan.staff_id = params[:assign_id]
81
+ plan.assign_id = @current_admin.id
82
+ end
74
83
  if plan.save
75
84
  render_success
76
85
  else
@@ -93,6 +102,10 @@ module EducodeSales
93
102
 
94
103
  def new_week
95
104
  @business = Business.find_by(id: params[:business_id])
105
+ common = Common.find_by(clazz: 'staff_type', name: '销售')
106
+ @staffs = Staff.includes(:user).where(job_type: common.id).map { |d| [d.user.real_name, d.id] }
107
+
108
+
96
109
  @week = Time.now.strftime('%W').to_i
97
110
  week = Time.now.strftime('%W').to_i
98
111
  if week > 3
@@ -102,6 +115,7 @@ module EducodeSales
102
115
  else
103
116
  @weeks = [[week.to_s + ' 本周',week]]
104
117
  end
118
+ @commons = Common.where(clazz: '计划类型').pluck(:name, :id)
105
119
  business_ids = EducodeSales::AssignFollowUp.joins(:follow_up).where(staff_id: @current_admin.id).pluck :business_id
106
120
  @businesses = Business.includes(:department, :last_follow_up).where("educode_sales_businesses.id in (?) or educode_sales_businesses.staff_id = ?", business_ids, @current_admin.id).order(created_at: :desc)
107
121
  @businesses = @businesses.map { |b| [b.name + "(#{b.department&.school&.name} #{b.department&.name})" + "---" + "最新跟进:" + (b.last_follow_up.present? ? b.last_follow_up.created_at.to_s : b.created_at.to_s), b.id] }
@@ -129,6 +143,10 @@ module EducodeSales
129
143
  end
130
144
 
131
145
  def new_month
146
+ @commons = Common.where(clazz: '计划类型').pluck(:name, :id)
147
+ common = Common.find_by(clazz: 'staff_type', name: '销售')
148
+ @staffs = Staff.includes(:user).where(job_type: common.id).map { |d| [d.user.real_name, d.id] }
149
+
132
150
  @business = Business.find_by(id: params[:business_id])
133
151
  business_ids = EducodeSales::AssignFollowUp.joins(:follow_up).where(staff_id: @current_admin.id).pluck :business_id
134
152
  @businesses =Business.includes(:department, :last_follow_up).where("educode_sales_businesses.id in (?) or educode_sales_businesses.staff_id = ?", business_ids, @current_admin.id).order(created_at: :desc)
@@ -201,10 +219,14 @@ module EducodeSales
201
219
  end
202
220
 
203
221
  def edit_week
222
+ @commons = Common.where(clazz: '计划类型').pluck(:name, :id)
204
223
  business_ids = EducodeSales::AssignFollowUp.joins(:follow_up).where(staff_id: @current_admin.id).pluck :business_id
205
- @businesses = Business.includes(:department, :last_follow_up).where("educode_sales_businesses.id in (?) or educode_sales_businesses.staff_id = ?", business_ids, @current_admin.id).order(created_at: :desc)
206
- @businesses = @businesses.map { |b| [b.name + "(" + b.department.school.name + ")" + "---" + "最新跟进:" + (b.last_follow_up.present? ? b.last_follow_up.created_at.to_s : b.created_at.to_s), b.id] }
207
224
  @sale_plan = SalePlan.find(params[:id])
225
+ # 加入指派的商机id
226
+ business_ids << @sale_plan.business_id
227
+ @businesses = Business.includes(:department, :last_follow_up).where("educode_sales_businesses.id in (?) or educode_sales_businesses.staff_id = ?", business_ids, @current_admin.id).order(created_at: :desc)
228
+ @businesses = @businesses.map { |b| [b.name + "(" + b.department&.school&.name.to_s + ")" + "---" + "最新跟进:" + (b.last_follow_up.present? ? b.last_follow_up.created_at.to_s : b.created_at.to_s), b.id] }
229
+
208
230
  if @sale_plan.weekly.present?
209
231
  week = Time.now.strftime('%W').to_i
210
232
  if week > 3
@@ -267,9 +289,10 @@ module EducodeSales
267
289
  end
268
290
 
269
291
  def edit_month
292
+ @commons = Common.where(clazz: '计划类型').pluck(:name, :id)
270
293
  business_ids = EducodeSales::AssignFollowUp.joins(:follow_up).where(staff_id: @current_admin.id).pluck :business_id
271
294
  @businesses = Business.includes(:department, :last_follow_up).where("educode_sales_businesses.id in (?) or educode_sales_businesses.staff_id = ?", business_ids, @current_admin.id).order(created_at: :desc)
272
- @businesses = @businesses.map { |b| [b.name + "(" + b.department.school.name + ")" + "---" + "最新跟进:" + (b.last_follow_up.present? ? b.last_follow_up.created_at.to_s : b.created_at.to_s), b.id] }
295
+ @businesses = @businesses.map { |b| [b.name + "(" + b.department&.school&.name.to_s + ")" + "---" + "最新跟进:" + (b.last_follow_up.present? ? b.last_follow_up.created_at.to_s : b.created_at.to_s), b.id] }
273
296
  @sale_plan = SalePlan.find(params[:id])
274
297
  @finish_rates = []
275
298
  11.times { |d| @finish_rates << ["#{d*10}%", d * 10]}
@@ -448,7 +471,7 @@ module EducodeSales
448
471
  private
449
472
 
450
473
  def plan_params
451
- params.permit(:month, :weekly, :content, :finish_rate, :business_id)
474
+ params.permit(:month, :weekly, :content, :finish_rate, :business_id, :common_id, :assign_id)
452
475
  end
453
476
 
454
477
  def business_info_params
@@ -248,7 +248,17 @@ module EducodeSales
248
248
  end
249
249
 
250
250
  def visit_analysis_charts(visit_count_year, visit_count_season, visit_count_month, visit_count_week, visit_type, title_names)
251
- names = visit_count_year.map{|d| d[0]}
251
+ if visit_type.present? && visit_type.include?("1")
252
+ names = visit_count_year.map{|d| d[0]}
253
+ elsif visit_type.present? && visit_type.include?("2")
254
+ names = visit_count_season.map{|d| d[0]}
255
+ elsif visit_type.present? && visit_type.include?("3")
256
+ names = visit_count_month.map{|d| d[0]}
257
+ elsif visit_type.present? && visit_type.include?("4")
258
+ names = visit_count_week.map{|d| d[0]}
259
+ else
260
+ names = visit_count_year.map{|d| d[0]}
261
+ end
252
262
 
253
263
  visit_count_season_data = []
254
264
  names.each do |name|
@@ -3,6 +3,7 @@ module EducodeSales
3
3
  acts_as_list scope: [:clazz]
4
4
 
5
5
  has_many :market_areas, class_name: 'MarketArea', foreign_key: 'area_id'
6
+ has_many :sale_plans, dependent: :nullify
6
7
 
7
8
  XTYPE = "x_class"
8
9
  OTYPE = 'o_class'
@@ -24,7 +25,8 @@ module EducodeSales
24
25
  '跟进手段': 'contact',
25
26
  '人员类型': 'staff_type',
26
27
  '开课计划': 'course_plan',
27
- '区域': 'area'
28
+ '区域': 'area',
29
+ '计划类型': 'plan_type'
28
30
  }
29
31
 
30
32
  def self.job_type_name
@@ -11,7 +11,7 @@ module EducodeSales
11
11
 
12
12
  def update_return_money
13
13
  amount = self.money_plan.business.money_plans.joins(:money_plan_claims).sum("educode_sales_money_plan_claims.amount")
14
- self.money_plan.business.update(return_money: amount)
14
+ self.money_plan.business.update(return_money: amount.round(6))
15
15
  end
16
16
  end
17
17
  end
@@ -16,7 +16,8 @@ module EducodeSales
16
16
  '绩效考核': 'assessments_setting',
17
17
  '方案管理': 'idea',
18
18
  '项目管理': 'project',
19
- '合同管理': 'contract'
19
+ '合同管理': 'contract',
20
+ '产品目录': 'product_category'
20
21
  }
21
22
  end
22
23
  end
@@ -3,6 +3,8 @@ module EducodeSales
3
3
  include ::Deletable
4
4
  belongs_to :business
5
5
  belongs_to :staff
6
+ belongs_to :common, optional: true
7
+ belongs_to :assign, class_name: "Staff", optional: true
6
8
  validates :business_id, presence: true
7
9
 
8
10
  has_many :business_infos
@@ -218,9 +218,9 @@
218
218
  <% end %>
219
219
  <% if @more %>
220
220
  {{# if(d.followed==0){}}
221
- <a class="layui-btn-xs data-count-edit more-btn more-btn1" data-name={{d.name}} data-id={{d.id}} data-clazz="{{d.extras_clazz}}">更多<i class="layui-icon layui-icon-down layui-nav-more"></i></a>
221
+ <a class="layui-btn-xs data-count-edit more-btn more-btn1" data-name={{d.name}} lay-event="more" data-id={{d.id}} data-clazz="{{d.extras_clazz}}">更多<i class="layui-icon layui-icon-down layui-nav-more"></i></a>
222
222
  {{# }else{}}
223
- <a class="layui-btn-xs data-count-edit more-btn more-btn2" data-name={{d.name}} data-id={{d.id}} data-clazz="{{d.extras_clazz}}">更多<i class="layui-icon layui-icon-down layui-nav-more"></i></a>
223
+ <a class="layui-btn-xs data-count-edit more-btn more-btn2" data-name={{d.name}} lay-event="more" data-id={{d.id}} data-clazz="{{d.extras_clazz}}">更多<i class="layui-icon layui-icon-down layui-nav-more"></i></a>
224
224
  {{# }}}
225
225
  <% end %>
226
226
 
@@ -635,7 +635,7 @@
635
635
  skin: 'line',
636
636
  done: function (res, curr, coun) {
637
637
  exportData=res.data;
638
- drowpdwonRender();
638
+ // drowpdwonRender();
639
639
  export_drowpdwonRender();
640
640
  // let headerTop = $('.layui-table-header').offset().top; //获取表格头到文档顶部的距离
641
641
  // $(".layuimini-content-page").scroll(function () {
@@ -654,84 +654,85 @@
654
654
  dropmenu2[dropmenu2.findIndex(function (elem)
655
655
  {return elem.title.includes("关注")})].title="取消关注";
656
656
 
657
- drowpdwonRender = function() {
658
- dropdown.render({
659
- elem: '.more-btn1',
660
- data: dropmenu,//dropmenu,
661
- click: function(data, othis){
662
- var elem = $(this.elem);
663
- id = elem.data('id');
657
+ // 删除,不需要重复定义两次一样的下拉菜单
658
+ // drowpdwonRender = function(is) {
659
+ // dropdown.render({
660
+ // elem: '.more-btn1',
661
+ // data: dropmenu,
662
+ // click: function(data, othis){
663
+ // var elem = $(this.elem);
664
+ // id = elem.data('id');
664
665
 
665
- switch (data.event) {
666
- case 'week':
667
- week(id);
668
- break;
669
- case 'month':
670
- month(id);
671
- break;
672
- case 'year':
673
- year(id);
674
- break;
675
- case 'edit':
676
- edit(id);
677
- break;
678
- case 'file':
679
- file(id, elem.data('name'));
680
- break;
681
- case 'time_line':
682
- time_line(id, elem.data('name'));
683
- break;
684
- case 'delete':
685
- deleteBusiness(id, elem.data('name'), elem.data('clazz'));
686
- break;
687
- case 'following':
688
- following(id);
689
- break;
690
- case 'money_plan':
691
- money_plan(id);
692
- break;
693
- }
694
- }
695
- });
696
- dropdown.render({
697
- elem: '.more-btn2',
698
- data: dropmenu2,//dropmenu,
699
- click: function(data, othis){
700
- var elem = $(this.elem);
701
- id = elem.data('id');
666
+ // switch (data.event) {
667
+ // case 'week':
668
+ // week(id);
669
+ // break;
670
+ // case 'month':
671
+ // month(id);
672
+ // break;
673
+ // case 'year':
674
+ // year(id);
675
+ // break;
676
+ // case 'edit':
677
+ // edit(id);
678
+ // break;
679
+ // case 'file':
680
+ // file(id, elem.data('name'));
681
+ // break;
682
+ // case 'time_line':
683
+ // time_line(id, elem.data('name'));
684
+ // break;
685
+ // case 'delete':
686
+ // deleteBusiness(id, elem.data('name'), elem.data('clazz'));
687
+ // break;
688
+ // case 'following':
689
+ // following(id);
690
+ // break;
691
+ // case 'money_plan':
692
+ // money_plan(id);
693
+ // break;
694
+ // }
695
+ // }
696
+ // });
697
+ // dropdown.render({
698
+ // elem: '.more-btn2',
699
+ // data: dropmenu2,//dropmenu,
700
+ // click: function(data, othis){
701
+ // var elem = $(this.elem);
702
+ // id = elem.data('id');
702
703
 
703
- switch (data.event) {
704
- case 'week':
705
- week(id);
706
- break;
707
- case 'month':
708
- month(id);
709
- break;
710
- case 'year':
711
- year(id);
712
- break;
713
- case 'edit':
714
- edit(id);
715
- break;
716
- case 'file':
717
- file(id, elem.data('name'));
718
- break;
719
- case 'time_line':
720
- time_line(id, elem.data('name'));
721
- break;
722
- case 'delete':
723
- deleteBusiness(id, elem.data('name'), elem.data('clazz'));
724
- break;
725
- case 'following':
726
- following(id);
727
- break;
728
- case 'money_plan':
729
- money_plan(id);
730
- break;
731
- }
732
- }
733
- });
734
- }
704
+ // switch (data.event) {
705
+ // case 'week':
706
+ // week(id);
707
+ // break;
708
+ // case 'month':
709
+ // month(id);
710
+ // break;
711
+ // case 'year':
712
+ // year(id);
713
+ // break;
714
+ // case 'edit':
715
+ // edit(id);
716
+ // break;
717
+ // case 'file':
718
+ // file(id, elem.data('name'));
719
+ // break;
720
+ // case 'time_line':
721
+ // time_line(id, elem.data('name'));
722
+ // break;
723
+ // case 'delete':
724
+ // deleteBusiness(id, elem.data('name'), elem.data('clazz'));
725
+ // break;
726
+ // case 'following':
727
+ // following(id);
728
+ // break;
729
+ // case 'money_plan':
730
+ // money_plan(id);
731
+ // break;
732
+ // }
733
+ // }
734
+ // });
735
+ // }
735
736
 
736
737
  export_drowpdwonRender = function() {
737
738
  dropdown.render({
@@ -1257,6 +1258,7 @@
1257
1258
 
1258
1259
  table.on('tool(businesses_table)', function (obj) {
1259
1260
  var data = obj.data;
1261
+ var that = this;
1260
1262
  id = data.id
1261
1263
  if (obj.event === 'add_event') { // 监听添加操作
1262
1264
  business_id = data.id
@@ -1454,8 +1456,49 @@
1454
1456
  layer.close(index)
1455
1457
  }
1456
1458
  });
1459
+ } else if (obj.event == 'more') {
1460
+ dropdown.render({
1461
+ elem: that,
1462
+ show: true,
1463
+ data: data.staff_id == data.current_staff_id ? dropmenu2 : gon.assign_menus,//dropmenu,
1464
+ click: function(data, othis){
1465
+ var elem = $(this.elem);
1466
+ id = elem.data('id');
1467
+
1468
+ switch (data.event) {
1469
+ case 'week':
1470
+ week(id);
1471
+ break;
1472
+ case 'month':
1473
+ month(id);
1474
+ break;
1475
+ case 'year':
1476
+ year(id);
1477
+ break;
1478
+ case 'edit':
1479
+ edit(id);
1480
+ break;
1481
+ case 'file':
1482
+ file(id, elem.data('name'));
1483
+ break;
1484
+ case 'time_line':
1485
+ time_line(id, elem.data('name'));
1486
+ break;
1487
+ case 'delete':
1488
+ deleteBusiness(id, elem.data('name'), elem.data('clazz'));
1489
+ break;
1490
+ case 'following':
1491
+ following(id);
1492
+ break;
1493
+ case 'money_plan':
1494
+ money_plan(id);
1495
+ break;
1496
+ }
1497
+ }
1498
+ });
1499
+ // drowpdwonRender(data.staff_id == data.current_staff_id)
1457
1500
  }
1458
- drowpdwonRender()
1501
+
1459
1502
  });
1460
1503
  });
1461
1504
  </script>
@@ -97,7 +97,7 @@
97
97
  </div>
98
98
  <script type="text/html" id="currentTableBar">
99
99
  {{# if(d.is_deleted){}}
100
- <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edita" lay-event="add_event">详情</a>
100
+ <!-- <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edita" lay-event="add_event">详情</a>-->
101
101
  <% if can? :recycle, EducodeSales::Idea %>
102
102
  <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="idea_recycle_s">恢复</a>
103
103
  <% end %>
@@ -107,7 +107,7 @@
107
107
  <% if can? :add_follow, EducodeSales::Idea %>
108
108
  <a class="layui-btn layui-btn-normal layui-btn-xs data-count-add_follow" lay-event="add_follows">添加跟进</a>
109
109
  <% end %>
110
- <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edita" lay-event="add_event">详情</a>
110
+ <!-- <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edita" lay-event="add_event">详情</a>-->
111
111
  <% if can? :update, EducodeSales::Idea %>
112
112
  <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="idea_edit">编辑</a>
113
113
  <% end %>
@@ -1,12 +1,13 @@
1
1
  json.data do
2
2
  json.array! @data do |d|
3
3
  json.(d, *d.attributes.keys)
4
+ json.status d.idea&.status
4
5
  json.name d.idea&.business&.name || d.idea&.name
5
6
  json.school_name d.idea&.business&.department&.school&.name
6
7
  json.created_at d.created_at.strftime("%Y-%m-%d %H:%M:%S")
7
8
  json.staff d.staff&.user&.real_name
8
9
  json.sale_staff d.sale_staff&.user&.real_name
9
- json.idea_staff d.idea_staff&.user&.real_name
10
+ json.idea_staff d.idea&.staff&.user&.real_name
10
11
  end
11
12
  end
12
13
 
@@ -34,8 +34,8 @@ json.data do
34
34
  end
35
35
  json.claim_num d['claim_num']
36
36
 
37
- json.return_money d['return_money'] || 0
38
- json.residue_money (d.amount - d['return_money'].to_f) > 0 ? d.amount - d['return_money'].to_f : 0
37
+ json.return_money (d['return_money'] || 0).round(6)
38
+ json.residue_money ((d.amount - d['return_money'].to_f) > 0 ? d.amount - d['return_money'].to_f : 0).round(6)
39
39
  if d['claim_num'] > 0
40
40
  json.accounts_state ''
41
41
  else
@@ -53,10 +53,10 @@ json.data do
53
53
  when '已开票'
54
54
  json.accounts_state '开票应收款'
55
55
  end
56
-
56
+
57
57
  end
58
58
  json.created_at d.created_at.to_s
59
-
59
+
60
60
  end
61
61
  end
62
62
 
@@ -115,6 +115,11 @@
115
115
  width: 100,
116
116
  title: '月份',
117
117
  },
118
+ {
119
+ field: 'assign',
120
+ width: 100,
121
+ title: '指定者',
122
+ },
118
123
  {
119
124
  field: 'content',
120
125
  width: 300,
@@ -120,6 +120,11 @@
120
120
  width: 60,
121
121
  title: '周次',
122
122
  },
123
+ {
124
+ field: 'assign',
125
+ width: 100,
126
+ title: '指定者',
127
+ },
123
128
  {
124
129
  field: 'content',
125
130
  width: 300,
@@ -23,9 +23,9 @@
23
23
  </div>
24
24
  </div>
25
25
  <div class="layui-inline">
26
- <button type="reseet" class="layui-btn layui-btn-primary" lay-submit lay-filter="month_plan_reset_btn">重置
26
+ <button type="reseet" class="layui-btn layui-btn-primary" lay-submit lay-filter="year_plan_reset_btn">重置
27
27
  </button>
28
- <button type="submit" class="layui-btn layui-btn-primary" lay-submit lay-filter="month_plan_seach_btn">检索
28
+ <button type="submit" class="layui-btn layui-btn-primary" lay-submit lay-filter="year_plan_seach_btn">检索
29
29
  </button>
30
30
  </div>
31
31
  </div>
@@ -149,7 +149,7 @@
149
149
  })
150
150
 
151
151
  // 监听搜索操作
152
- form.on('submit(month_plan_seach_btn)', function (data) {
152
+ form.on('submit(year_plan_seach_btn)', function (data) {
153
153
  search = data.field
154
154
  table.reload('yearPlanTable', {
155
155
  page: {
@@ -161,7 +161,7 @@
161
161
  return false;
162
162
  });
163
163
 
164
- form.on('submit(month_plan_reset_btn)', function(data){
164
+ form.on('submit(year_plan_reset_btn)', function(data){
165
165
  var field = data.field;
166
166
  form.val('month_plan_search_form', { staff_id: '', year: '', month: '', year: ''})
167
167
  return false;
@@ -6,6 +6,12 @@
6
6
  <input type="text" class="layui-input" id="edit_month_plan_month" autocomplete="off" name="month">
7
7
  </div>
8
8
  </div>
9
+ <div class="layui-inline">
10
+ <label class="layui-form-label required">计划类型</label>
11
+ <div class="layui-input-inline">
12
+ <%= select_tag "common_id", options_for_select(@commons, @sale_plan.common_id), class: 'required' %>
13
+ </div>
14
+ </div>
9
15
  <div class="layui-inline">
10
16
  <label class="layui-form-label required">商机</label>
11
17
  <div class="layui-input-inline" style="width: 500px">
@@ -14,6 +14,12 @@
14
14
  </div>
15
15
  </div>
16
16
  <% end %>
17
+ <div class="layui-inline">
18
+ <label class="layui-form-label required">计划类型</label>
19
+ <div class="layui-input-inline">
20
+ <%= select_tag "common_id", options_for_select(@commons, @sale_plan.common_id), class: 'required' %>
21
+ </div>
22
+ </div>
17
23
  <div class="layui-inline">
18
24
  <label class="layui-form-label required">商机</label>
19
25
  <div class="layui-input-inline" style="width: 500px">
@@ -12,6 +12,7 @@ json.data do
12
12
  json.follow_ups_count d.business.follow_ups_count
13
13
  json.finish_rate "#{d.finish_rate}%"
14
14
  json.updated_at d.updated_at.to_s
15
+ json.assign d.assign&.user&.real_name
15
16
  end
16
17
  end
17
18
 
@@ -6,6 +6,20 @@
6
6
  <input type="text" lay-verify="required" class="layui-input" id="new_month_month" autocomplete="off" name="month">
7
7
  </div>
8
8
  </div>
9
+ <div class="layui-inline">
10
+ <label class="layui-form-label required">计划类型</label>
11
+ <div class="layui-input-inline">
12
+ <%= select_tag "common_id", options_for_select(@commons), include_blank: true, class: 'required' %>
13
+ </div>
14
+ </div>
15
+ <% if can?(:assign, EducodeSales::SalePlan) && @business && @business.staff_id != @current_admin.id %>
16
+ <div class="layui-inline">
17
+ <label class="layui-form-label required">指派给</label>
18
+ <div class="layui-input-inline">
19
+ <%= select_tag "assign_id", options_for_select(@staffs), include_blank: true, class: 'required' %>
20
+ </div>
21
+ </div>
22
+ <% end %>
9
23
  <div class="layui-inline">
10
24
  <label class="layui-form-label required">商机</label>
11
25
  <div class="layui-input-inline" style="width: 500px">
@@ -12,6 +12,20 @@
12
12
  <%= select_tag "weekly", options_for_select(@weeks,@week), class: 'required' %>
13
13
  </div>
14
14
  </div>
15
+ <div class="layui-inline">
16
+ <label class="layui-form-label required">计划类型</label>
17
+ <div class="layui-input-inline">
18
+ <%= select_tag "common_id", options_for_select(@commons),include_blank: true, class: 'required' %>
19
+ </div>
20
+ </div>
21
+ <% if can?(:assign, EducodeSales::SalePlan) && @business && @business.staff_id != @current_admin.id %>
22
+ <div class="layui-inline">
23
+ <label class="layui-form-label required">指派给</label>
24
+ <div class="layui-input-inline">
25
+ <%= select_tag "assign_id", options_for_select(@staffs), include_blank: true, class: 'required' %>
26
+ </div>
27
+ </div>
28
+ <% end %>
15
29
  <div class="layui-inline">
16
30
  <label class="layui-form-label required">商机</label>
17
31
  <div class="layui-input-inline" style="width: 500px">
@@ -0,0 +1,6 @@
1
+ class AddClazzToMoneyPlans < ActiveRecord::Migration[5.2]
2
+ def change
3
+ add_column :educode_sales_money_plans, :common_id, :integer
4
+ add_column :educode_sales_money_plans, :assign_id, :integer, comment: "指定者"
5
+ end
6
+ end
@@ -1,3 +1,3 @@
1
1
  module EducodeSales
2
- VERSION = '1.10.23'
2
+ VERSION = '1.10.24'
3
3
  end
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.23
4
+ version: 1.10.24
5
5
  platform: ruby
6
6
  authors:
7
7
  - anke1460
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-06-29 00:00:00.000000000 Z
11
+ date: 2023-06-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -105,7 +105,6 @@ files:
105
105
  - app/assets/images/educode_sales/icon-login.png
106
106
  - app/assets/images/educode_sales/icon.png
107
107
  - app/assets/images/educode_sales/indexLogo.png
108
- - app/assets/images/educode_sales/indexlogo.png
109
108
  - app/assets/images/educode_sales/loading-0.gif
110
109
  - app/assets/images/educode_sales/loading-1.gif
111
110
  - app/assets/images/educode_sales/loading-2.gif
@@ -741,6 +740,7 @@ files:
741
740
  - db/migrate/20230614141225_create_educode_sales_tags.rb
742
741
  - db/migrate/20230614141628_create_educode_sales_follow_up_tags.rb
743
742
  - db/migrate/20230614142145_create_educode_sales_watch_follow_ups.rb
743
+ - db/migrate/20230629130033_add_clazz_to_money_plans.rb
744
744
  - lib/educode_sales.rb
745
745
  - lib/educode_sales/engine.rb
746
746
  - lib/educode_sales/version.rb
@@ -749,7 +749,7 @@ homepage: https://www.educoder.net
749
749
  licenses:
750
750
  - MIT
751
751
  metadata: {}
752
- post_install_message:
752
+ post_install_message:
753
753
  rdoc_options: []
754
754
  require_paths:
755
755
  - lib
@@ -764,8 +764,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
764
764
  - !ruby/object:Gem::Version
765
765
  version: '0'
766
766
  requirements: []
767
- rubygems_version: 3.0.9
768
- signing_key:
767
+ rubygems_version: 3.0.0
768
+ signing_key:
769
769
  specification_version: 4
770
770
  summary: Summary of EducodeSales.
771
771
  test_files: []