educode_sales 0.5.0 → 0.5.4

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 (68) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/educode_sales//345/233/236/346/224/266/347/253/231.png +0 -0
  3. data/app/controllers/educode_sales/businesses_controller.rb +13 -6
  4. data/app/controllers/educode_sales/follow_ups_controller.rb +3 -2
  5. data/app/controllers/educode_sales/operation_plans_controller.rb +22 -2
  6. data/app/controllers/educode_sales/operation_reports_controller.rb +33 -3
  7. data/app/controllers/educode_sales/plans_controller.rb +23 -3
  8. data/app/controllers/educode_sales/recycles_controller.rb +95 -0
  9. data/app/controllers/educode_sales/roles_controller.rb +5 -0
  10. data/app/controllers/educode_sales/sale_reports_controller.rb +34 -4
  11. data/app/controllers/educode_sales/sale_trends_controller.rb +171 -0
  12. data/app/controllers/educode_sales/sales_controller.rb +4 -0
  13. data/app/controllers/educode_sales/staffs_controller.rb +4 -4
  14. data/app/controllers/educode_sales/upload_files_controller.rb +33 -26
  15. data/app/models/concerns/deletable.rb +8 -0
  16. data/app/models/educode_sales/application_record.rb +2 -0
  17. data/app/models/educode_sales/business.rb +15 -2
  18. data/app/models/educode_sales/common.rb +2 -1
  19. data/app/models/educode_sales/follow_up.rb +4 -2
  20. data/app/models/educode_sales/recycle.rb +5 -0
  21. data/app/models/educode_sales/sale_plan.rb +3 -0
  22. data/app/models/educode_sales/sale_report.rb +2 -0
  23. data/app/views/educode_sales/businesses/edit_follow_record.html.erb +3 -3
  24. data/app/views/educode_sales/businesses/edit_plan.html.erb +2 -2
  25. data/app/views/educode_sales/businesses/file.html.erb +5 -4
  26. data/app/views/educode_sales/businesses/index.html.erb +18 -3
  27. data/app/views/educode_sales/businesses/new_follow_record.html.erb +6 -2
  28. data/app/views/educode_sales/businesses/show_follow.html.erb +7 -2
  29. data/app/views/educode_sales/businesses/show_follow_record.html.erb +1 -1
  30. data/app/views/educode_sales/businesses/upload_file.html.erb +4 -4
  31. data/app/views/educode_sales/operation_plans/index.html.erb +6 -1
  32. data/app/views/educode_sales/operation_reports/audit.html.erb +14 -6
  33. data/app/views/educode_sales/operation_reports/show.html.erb +13 -10
  34. data/app/views/educode_sales/places/index.html.erb +6 -1
  35. data/app/views/educode_sales/places/index.json.jbuilder +11 -1
  36. data/app/views/educode_sales/plans/index.html.erb +6 -1
  37. data/app/views/educode_sales/recycles/_business.html.erb +122 -0
  38. data/app/views/educode_sales/recycles/_monthPlan.html.erb +123 -0
  39. data/app/views/educode_sales/recycles/_monthly.html.erb +121 -0
  40. data/app/views/educode_sales/recycles/_weekPlan.html.erb +128 -0
  41. data/app/views/educode_sales/recycles/_weekly.html.erb +122 -0
  42. data/app/views/educode_sales/recycles/business.json.jbuilder +16 -0
  43. data/app/views/educode_sales/recycles/index.html.erb +58 -0
  44. data/app/views/educode_sales/recycles/monthPlan.json.jbuilder +16 -0
  45. data/app/views/educode_sales/recycles/monthly.json.jbuilder +15 -0
  46. data/app/views/educode_sales/recycles/weekPlan.json.jbuilder +16 -0
  47. data/app/views/educode_sales/recycles/weekly.json.jbuilder +15 -0
  48. data/app/views/educode_sales/roles/index.html.erb +19 -1
  49. data/app/views/educode_sales/roles/rename.html.erb +50 -0
  50. data/app/views/educode_sales/sale_reports/audit.html.erb +17 -6
  51. data/app/views/educode_sales/sale_reports/show.html.erb +11 -8
  52. data/app/views/educode_sales/sale_trends/trends.html.erb +233 -2
  53. data/app/views/educode_sales/sale_trends/trends.json.jbuilder +14 -0
  54. data/app/views/educode_sales/sales/index.html.erb +75 -9
  55. data/app/views/educode_sales/sales/index.json.jbuilder +35 -1
  56. data/app/views/educode_sales/sales/operations.json.jbuilder +11 -1
  57. data/app/views/educode_sales/staffs/index.html.erb +6 -1
  58. data/app/views/educode_sales/staffs/index.json.jbuilder +11 -1
  59. data/app/views/educode_sales/teachers/add_keys.html.erb +3 -3
  60. data/app/views/educode_sales/teachers/index.html.erb +7 -2
  61. data/app/views/educode_sales/teachers/new.html.erb +1 -0
  62. data/app/views/educode_sales/upload_files/index.json.jbuilder +1 -1
  63. data/app/views/layouts/educode_sales/application.html.erb +3 -0
  64. data/config/routes.rb +18 -0
  65. data/db/migrate/20210902064109_create_educode_sales_role_permissions.rb +6 -0
  66. data/db/migrate/20211109015617_create_educode_sales_recycles.rb +25 -0
  67. data/lib/educode_sales/version.rb +1 -1
  68. metadata +20 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3c77c9d72b776a5250acf438fad00e27b871430b26bdf994a93d1189e0aaba14
4
- data.tar.gz: 6ea39f9c64190ccec5427668596827663e702ddd5a0e0d8c0fa5cace8931d1ba
3
+ metadata.gz: 660c43183c6a1edf9d5aab4b549bce9d2b68edf789010d85379198372be1a120
4
+ data.tar.gz: 28beeb3a7026076f4e6da6dc966bf75523e7be06717b787041d2e14500902532
5
5
  SHA512:
6
- metadata.gz: 842442865a01e90e7aa227fd5f0b33fd994d509b9d1bad0bff8fe3ebfe59d818fd48b05fcef54c665504d0f5b0a0ec70c2efaccbdc5c017269ef507565866073
7
- data.tar.gz: 365f1987a2fe002df56e11f72ba6456c1c15fefa880b06001dce1b4ae4ee1f95a92fae61b5afb3ff28c2ba51c04309b7d06f05067effee9f8aa8e618d0d38eae
6
+ metadata.gz: d7f6b1515f819aac77b135ba6d52a3562c4fef76d650fd1a74c44bf3dcaffacc41ec34e1623337538a36bf40cff2591d14d40e83575cd7920a69fcfadb5662c4
7
+ data.tar.gz: ff102c87e89e482809f4b8e84e0f27c5f42a3dd22863f6ebfe0a4fd115eae1d026de70cd738c5b0d83e9e3ab78aee3a276eb0fed4f6a66c467ab8926c7737ed2
@@ -4,7 +4,7 @@ module EducodeSales
4
4
  class BusinessesController < ApplicationController
5
5
 
6
6
  def file
7
- @root = Rails.root
7
+ gon.folder = edu_setting('attachment_folder') + '/'
8
8
  render layout: false
9
9
  end
10
10
  def upload_file
@@ -82,15 +82,17 @@ module EducodeSales
82
82
  end
83
83
 
84
84
  if params[:q].present? && params[:q][:name].present? && params[:q][:name] == "(销售态势-" + @year + "-已中标商机)"
85
+ stage_ids = Common.where(clazz: '商机阶段', name: ['已中标','已签单','已验收','回款中', '服务中','已结束']).pluck(:id)
85
86
  @businesses = @businesses.joins("
86
87
  JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
87
- ").where("educode_sales_follow_ups.bidded_date > ? AND educode_sales_follow_ups.bidded_date < ?", "#{@year}-01-01", "#{@year}-12-31")
88
+ ").where("educode_sales_follow_ups.bidded_date > ? AND educode_sales_follow_ups.bidded_date < ? AND educode_sales_follow_ups.stage_id IN (?)", "#{@year}-01-01", "#{@year}-12-31", stage_ids)
88
89
  end
89
90
 
90
91
  if params[:q].present? && params[:q][:name].present? && params[:q][:name] == "(销售态势-" + @year + "-已签单商机)"
92
+ s_stage_ids = Common.where(clazz: '商机阶段', name: ['已签单','已验收','回款中', '服务中','已结束']).pluck(:id)
91
93
  @businesses = @businesses.joins("
92
94
  JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
93
- ").where("educode_sales_follow_ups.signed_date > ? AND educode_sales_follow_ups.signed_date < ?", "#{@year}-01-01", "#{@year}-12-31")
95
+ ").where("educode_sales_follow_ups.signed_date > ? AND educode_sales_follow_ups.signed_date < ? AND educode_sales_follow_ups.stage_id IN (?)", "#{@year}-01-01", "#{@year}-12-31", s_stage_ids)
94
96
  end
95
97
 
96
98
  if params[:q].present? && params[:q][:name].present? && params[:q][:name] == "(销售态势-" + @year + "-已回款商机)"
@@ -122,10 +124,10 @@ module EducodeSales
122
124
  @businesses = @businesses.joins(:department).where("departments.id in (?)", departments_ids)
123
125
  end
124
126
  if params[:q].present? && params[:q][:staff_id].present?
125
- part_a_ids = @businesses.where("educode_sales_businesses.last_follow_up_id is null AND staff_id = ?",params[:q][:staff_id]).ids
127
+ part_a_ids = @businesses.where("educode_sales_businesses.last_follow_up_id is null AND educode_sales_businesses.staff_id = ?",params[:q][:staff_id]).ids
126
128
  part_b_ids = @businesses.where("educode_sales_businesses.last_follow_up_id is not null").joins("
127
129
  JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
128
- ").where("educode_sales_follow_ups.staff_id = ?", params[:q][:staff_id]).pluck(:business_id)
130
+ ").where("educode_sales_follow_ups.staff_id = ?", params[:q][:staff_id]).ids
129
131
  business_ids = part_a_ids + part_b_ids
130
132
  @businesses = EducodeSales::Business.where(id:business_ids)
131
133
  end
@@ -172,6 +174,8 @@ module EducodeSales
172
174
  educode_sales_businesses.*,
173
175
  last_follow.invitation_at,
174
176
  last_follow.reception_at,
177
+ last_follow.bidded_date,
178
+ last_follow.signed_date,
175
179
  last_follow.total_amount").joins("
176
180
  LEFT JOIN educode_sales_follow_ups AS last_follow ON educode_sales_businesses.last_follow_up_id = last_follow.id
177
181
  ").page(params[:page]).per(params[:limit])
@@ -221,7 +225,7 @@ module EducodeSales
221
225
 
222
226
  def destroy
223
227
  business = Business.find(params[:id])
224
- business.destroy
228
+ business.soft_destroy(@current_admin.id)
225
229
  render_success
226
230
  rescue ActiveRecord::DeleteRestrictionError => e
227
231
  render_failure '该商机已其它关联数据产生,暂不能删除'
@@ -315,5 +319,8 @@ module EducodeSales
315
319
  params.permit(:clazz_id, :stage_id, :invitation_at, :reception_at, :total_amount, :actual_amount, :divide_amount, :description, :advise, :place_id)
316
320
  end
317
321
 
322
+ def edu_setting name
323
+ EduSetting.get(name)
324
+ end
318
325
  end
319
326
  end
@@ -36,7 +36,7 @@ module EducodeSales
36
36
  def destroy
37
37
  follow_up = FollowUp.find(params[:id])
38
38
  business = follow_up.business
39
- if follow_up.destroy
39
+ if follow_up.soft_destroy(@current_admin.id)
40
40
  if follow_up.id == business.last_follow_up_id
41
41
  business.update(last_follow_up: business.follow_ups.last, return_money: MoneyPlan.where(clazz: '已完成', follow_up_id: business.follow_ups.last&.id).sum(:amount))
42
42
  end
@@ -132,7 +132,8 @@ module EducodeSales
132
132
  )
133
133
  teacher.save
134
134
  key_peprson = KeyPerson.new(teacher_params)
135
- key_peprson.teacher = teacher
135
+ teacher_id = EducodeSales::Teacher.find_by(name: user.real_name, department_id: user.department_id).id
136
+ key_peprson.teacher_id = teacher_id
136
137
  end
137
138
 
138
139
  follow_up.key_person << key_peprson
@@ -78,7 +78,17 @@ module EducodeSales
78
78
  end
79
79
 
80
80
  def new_weekly
81
- @area =@current_admin.areas.present? ? @current_admin.areas.pluck(:name).join("、") : ''
81
+ d = @current_admin
82
+ area_ids = EducodeSales::Common.where(clazz: 'area').ids.sort.to_s
83
+ if d.areas.present?
84
+ if d.areas.ids.sort.to_s == area_ids
85
+ @area = '全国'
86
+ else
87
+ @area = d.areas.pluck(:name).join("、")
88
+ end
89
+ else
90
+ @area = ''
91
+ end
82
92
  @name = @current_admin.user.real_name
83
93
  sale_plans = OperationPlan.where(month: Time.now.strftime("%Y-%m") + "-01 00:00:00", weekly: Time.now.strftime('%W').to_i, staff_id: @current_admin.id)
84
94
  @rate = sale_plans.present? ? (sale_plans.sum("finish_rate") / sale_plans.size) : 0
@@ -95,7 +105,17 @@ module EducodeSales
95
105
  end
96
106
 
97
107
  def new_monthly
98
- @area =@current_admin.areas.present? ? @current_admin.areas.pluck(:name).join("、") : ''
108
+ d = @current_admin
109
+ area_ids = EducodeSales::Common.where(clazz: 'area').ids.sort.to_s
110
+ if d.areas.present?
111
+ if d.areas.ids.sort.to_s == area_ids
112
+ @area = '全国'
113
+ else
114
+ @area = d.areas.pluck(:name).join("、")
115
+ end
116
+ else
117
+ @area = ''
118
+ end
99
119
  @name = @current_admin.user.real_name
100
120
  sale_plans = OperationPlan.where(month: Time.now.strftime("%Y-%m") + "-01 00:00:00", staff_id: @current_admin.id, weekly: nil)
101
121
  @rate = sale_plans.present? ? (sale_plans.sum("finish_rate") / sale_plans.size) : 0
@@ -68,7 +68,17 @@ module EducodeSales
68
68
  def show
69
69
  @sale_report = OperationReport.find(params[:id])
70
70
  @name = @sale_report.staff.user.real_name
71
- @area = @sale_report.staff.areas.present? ? @sale_report.staff.areas.pluck(:name).join("、") : ''
71
+ d = @sale_report.staff
72
+ area_ids = EducodeSales::Common.where(clazz: 'area').ids.sort.to_s
73
+ if d.areas.present?
74
+ if d.areas.ids.sort.to_s == area_ids
75
+ @area = '全国'
76
+ else
77
+ @area = d.areas.pluck(:name).join("、")
78
+ end
79
+ else
80
+ @area = ''
81
+ end
72
82
  render layout: false
73
83
  end
74
84
 
@@ -81,7 +91,17 @@ module EducodeSales
81
91
  def edit
82
92
  @sale_report = OperationReport.find(params[:id])
83
93
  @name = @sale_report.staff.user.real_name
84
- @area = @sale_report.staff.areas.present? ? @sale_report.staff.areas.pluck(:name).join("、") : ''
94
+ d = @sale_report.staff
95
+ area_ids = EducodeSales::Common.where(clazz: 'area').ids.sort.to_s
96
+ if d.areas.present?
97
+ if d.areas.ids.sort.to_s == area_ids
98
+ @area = '全国'
99
+ else
100
+ @area = d.areas.pluck(:name).join("、")
101
+ end
102
+ else
103
+ @area = ''
104
+ end
85
105
  render layout: false
86
106
  end
87
107
 
@@ -118,7 +138,17 @@ module EducodeSales
118
138
  def audit
119
139
  @sale_report = OperationReport.find(params[:id])
120
140
  @name = @sale_report.staff.user.real_name
121
- @area = @sale_report.staff.areas.present? ? @sale_report.staff.areas.pluck(:name).join("、") : ''
141
+ d = @sale_report.staff
142
+ area_ids = EducodeSales::Common.where(clazz: 'area').ids.sort.to_s
143
+ if d.areas.present?
144
+ if d.areas.ids.sort.to_s == area_ids
145
+ @area = '全国'
146
+ else
147
+ @area = d.areas.pluck(:name).join("、")
148
+ end
149
+ else
150
+ @area = ''
151
+ end
122
152
  render layout: false
123
153
  end
124
154
 
@@ -86,7 +86,17 @@ module EducodeSales
86
86
  end
87
87
 
88
88
  def new_weekly
89
- @area =@current_admin.areas.present? ? @current_admin.areas.pluck(:name).join("、") : ''
89
+ d = @current_admin
90
+ area_ids = EducodeSales::Common.where(clazz: 'area').ids.sort.to_s
91
+ if d.areas.present?
92
+ if d.areas.ids.sort.to_s == area_ids
93
+ @area = '全国'
94
+ else
95
+ @area = d.areas.pluck(:name).join("、")
96
+ end
97
+ else
98
+ @area = ''
99
+ end
90
100
  @name = @current_admin.user.real_name
91
101
  sale_plans = SalePlan.where(month: Time.now.strftime("%Y-%m") + "-01 00:00:00", weekly: Time.now.strftime('%W').to_i, staff_id: @current_admin.id)
92
102
  @rate = sale_plans.present? ? (sale_plans.sum("finish_rate") / sale_plans.size) : 0
@@ -104,7 +114,17 @@ module EducodeSales
104
114
  end
105
115
 
106
116
  def new_monthly
107
- @area =@current_admin.areas.present? ? @current_admin.areas.pluck(:name).join("、") : ''
117
+ d = @current_admin
118
+ area_ids = EducodeSales::Common.where(clazz: 'area').ids.sort.to_s
119
+ if d.areas.present?
120
+ if d.areas.ids.sort.to_s == area_ids
121
+ @area = '全国'
122
+ else
123
+ @area = d.areas.pluck(:name).join("、")
124
+ end
125
+ else
126
+ @area = ''
127
+ end
108
128
  @name = @current_admin.user.real_name
109
129
  sale_plans = SalePlan.where(month: Time.now.strftime("%Y-%m") + "-01 00:00:00", staff_id: @current_admin.id, weekly: nil)
110
130
  @rate = sale_plans.present? ? (sale_plans.sum("finish_rate") / sale_plans.size) : 0
@@ -175,7 +195,7 @@ module EducodeSales
175
195
 
176
196
  def destroy
177
197
  sale_plan = SalePlan.find(params[:id])
178
- if sale_plan.destroy
198
+ if sale_plan.soft_destroy(@current_admin.id)
179
199
  render_success
180
200
  else
181
201
  render_failure sale_plan
@@ -0,0 +1,95 @@
1
+ require_dependency "educode_sales/application_controller"
2
+
3
+ module EducodeSales
4
+ class RecyclesController < ApplicationController
5
+
6
+ def destroy
7
+ @recycle = Recycle.find(params[:id])
8
+ @recycle.destroy
9
+ render_success
10
+ end
11
+
12
+
13
+
14
+ def restore_reports
15
+ @recycle = Recycle.find(params[:id])
16
+ report_id = @recycle.source_id
17
+ EducodeSales::SaleReport.unscoped.find(report_id).update(deleted_at: nil)
18
+ @recycle.destroy
19
+ render_success
20
+ end
21
+
22
+ def restore_plans
23
+ @recycle = Recycle.find(params[:id])
24
+ plan = EducodeSales::SalePlan.unscoped.find(@recycle.source_id)
25
+ business = EducodeSales::Business.unscoped.find(plan.business_id)
26
+ Recycle.find_by(source_id: business.id).destroy if Recycle.find_by(source_id: business.id).present?
27
+ business.update(deleted_at: nil)
28
+ follow_ups = EducodeSales::FollowUp.unscoped.where(business_id: business.id)
29
+ follow_ups.update_all(deleted_at: nil)
30
+ plan.update(deleted_at: nil)
31
+ @recycle.destroy
32
+ render_success
33
+ end
34
+
35
+ def restore_businesses
36
+ @recycle = Recycle.find(params[:id])
37
+ business_id = @recycle.source_id
38
+ EducodeSales::Business.unscoped.find(business_id).update(deleted_at: nil)
39
+ follow_ups = EducodeSales::FollowUp.unscoped.where(business_id: business_id)
40
+ follow_ups.update_all(deleted_at: nil)
41
+ @recycle.destroy
42
+ render_success
43
+ end
44
+
45
+ def business
46
+ @businesses = Recycle.where(source_type:"EducodeSales::Business")
47
+ if params[:sort].present? && params[:sort][:field]
48
+ @businesses = @businesses.order("created_at #{params[:sort][:order]}")
49
+ else
50
+ @businesses = @businesses.order("educode_sales_recycles.created_at desc")
51
+ end
52
+ @businesses = @businesses.page(params[:page]).per(params[:limit])
53
+ end
54
+
55
+ def weekly
56
+ @weekly = Recycle.where(source_type:"EducodeSales::SaleReport").order(created_at: :desc).page(params[:page]).per(params[:limit])
57
+ if params[:sort].present? && params[:sort][:field]
58
+ @weekly = @weekly.order("created_at #{params[:sort][:order]}")
59
+ else
60
+ @weekly = @weekly.order("educode_sales_recycles.created_at desc")
61
+ end
62
+ @weekly = @weekly.page(params[:page]).per(params[:limit])
63
+ end
64
+
65
+ def monthly
66
+ @monthly = Recycle.where(source_type:"EducodeSales::SaleReport")
67
+ if params[:sort].present? && params[:sort][:field]
68
+ @monthly = @monthly.order("created_at #{params[:sort][:order]}")
69
+ else
70
+ @monthly = @monthly.order("educode_sales_recycles.created_at desc")
71
+ end
72
+ @monthly = @monthly.page(params[:page]).per(params[:limit])
73
+ end
74
+
75
+ def weekPlan
76
+ @weekPlans = Recycle.where(source_type:"EducodeSales::SalePlan")
77
+ if params[:sort].present? && params[:sort][:field]
78
+ @weekPlans = @weekPlans.order("created_at #{params[:sort][:order]}")
79
+ else
80
+ @weekPlans = @weekPlans.order("educode_sales_recycles.created_at desc")
81
+ end
82
+ @weekPlans = @weekPlans.page(params[:page]).per(params[:limit])
83
+ end
84
+
85
+ def monthPlan
86
+ @monthPlans = Recycle.where(source_type:"EducodeSales::SalePlan")
87
+ if params[:sort].present? && params[:sort][:field]
88
+ @monthPlans = @monthPlans.order("created_at #{params[:sort][:order]}")
89
+ else
90
+ @monthPlans = @monthPlans.order("educode_sales_recycles.created_at desc")
91
+ end
92
+ @monthPlans = @monthPlans.page(params[:page]).per(params[:limit])
93
+ end
94
+ end
95
+ end
@@ -35,6 +35,11 @@ module EducodeSales
35
35
  render layout: false
36
36
  end
37
37
 
38
+ def rename
39
+ @name = Role.find(params[:id]).name
40
+ render layout: false
41
+ end
42
+
38
43
  def update_role
39
44
  role = Role.find(params[:id])
40
45
  if role.update(name: params[:name])
@@ -24,13 +24,23 @@ module EducodeSales
24
24
  def show
25
25
  @sale_report = SaleReport.find(params[:id])
26
26
  @name = @sale_report.staff.user.real_name
27
- @area = @sale_report.staff.areas.present? ? @sale_report.staff.areas.pluck(:name).join("、") : ''
27
+ d = @sale_report.staff
28
+ area_ids = EducodeSales::Common.where(clazz: 'area').ids.sort.to_s
29
+ if d.areas.present?
30
+ if d.areas.ids.sort.to_s == area_ids
31
+ @area = '全国'
32
+ else
33
+ @area = d.areas.pluck(:name).join("、")
34
+ end
35
+ else
36
+ @area = ''
37
+ end
28
38
  render layout: false
29
39
  end
30
40
 
31
41
  def destroy
32
42
  sale_report = SaleReport.find(params[:id])
33
- if sale_report.destroy
43
+ if sale_report.soft_destroy(@current_admin.id)
34
44
  render_success
35
45
  else
36
46
  render_failure sale_report
@@ -86,7 +96,17 @@ module EducodeSales
86
96
  def edit
87
97
  @sale_report = SaleReport.find(params[:id])
88
98
  @name = @sale_report.staff.user.real_name
89
- @area = @sale_report.staff.areas.present? ? @sale_report.staff.areas.pluck(:name).join("、") : ''
99
+ d = @sale_report.staff
100
+ area_ids = EducodeSales::Common.where(clazz: 'area').ids.sort.to_s
101
+ if d.areas.present?
102
+ if d.areas.ids.sort.to_s == area_ids
103
+ @area = '全国'
104
+ else
105
+ @area = d.areas.pluck(:name).join("、")
106
+ end
107
+ else
108
+ @area = ''
109
+ end
90
110
  render layout: false
91
111
  end
92
112
 
@@ -123,7 +143,17 @@ module EducodeSales
123
143
  def audit
124
144
  @sale_report = SaleReport.find(params[:id])
125
145
  @name = @sale_report.staff.user.real_name
126
- @area = @sale_report.staff.areas.present? ? @sale_report.staff.areas.pluck(:name).join("、") : ''
146
+ d = @sale_report.staff
147
+ area_ids = EducodeSales::Common.where(clazz: 'area').ids.sort.to_s
148
+ if d.areas.present?
149
+ if d.areas.ids.sort.to_s == area_ids
150
+ @area = '全国'
151
+ else
152
+ @area = d.areas.pluck(:name).join("、")
153
+ end
154
+ else
155
+ @area = ''
156
+ end
127
157
  render layout: false
128
158
  end
129
159
 
@@ -23,6 +23,124 @@ module EducodeSales
23
23
  @a_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id IN (?)", a).sum(:total_amount).round(2)
24
24
  b = Common.where(clazz: '商机类型', name: Common.find_by(extras: EducodeSales::Common::BTYPE)&.name).pluck(:id)
25
25
  @b_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id IN (?)", b).sum(:total_amount).round(2)
26
+
27
+ common = Common.find_by(clazz: 'staff_type', name: '销售')
28
+ names = Staff.includes(:user).where(job_type: common.id).map { |d| [d.user.real_name, d.id] }
29
+ x_business_ids = []
30
+ default_dates = (7.day.ago.to_date..Date.today).to_a #默认时间范围
31
+ Business.all.each do |d|
32
+ if d.last_follow_up&.clazz&.id == x
33
+ x_business_ids << d.id
34
+ end
35
+ end
36
+ colors = ['#44D7B6','#4CACFF','#F7B500','#FF0000', '#FF7F00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#8B00FF', 'rgba(255, 99, 132, 1)', 'rgba(54, 162, 235, 1)', 'rgba(255, 206, 86, 1)', 'rgba(75, 192, 192, 1)', 'rgba(153, 102, 255, 1)', 'rgba(255, 159, 64, 1)']
37
+ @follow_count_range = params[:follow_count_range] || "day"
38
+ @goal_count_range = params[:goal_count_range] || "day"
39
+ # 商机跟进数图表
40
+ @follow_count_data = day_follow_count_chart(default_dates,names,x_business_ids,colors)
41
+ if params[:follow_count_range].present?
42
+ case params[:follow_count_range]
43
+ when "week"
44
+ when "month" #按月
45
+ if params[:date_month].present?
46
+ # (Date.new(2020,12,1)..Date.new(2021,12,1)).map { |d| d.strftime("%Y-%m")}.uniq
47
+ date = params[:date_month].split(" - ")
48
+ dates = ((date[0]+"-01").to_date..(date[1]+"-01").to_date).map { |d| d.strftime("%Y-%m")}.uniq
49
+ @follow_count_data = month_follow_count_chart(dates,names,x_business_ids,colors)
50
+ end
51
+ when "year" #按年
52
+ if params[:date_year].present?
53
+ date = params[:date_year].split(" - ")
54
+ dates = (date[0]..date[1]).to_a
55
+ @follow_count_data = year_follow_count_chart(dates,names,x_business_ids,colors)
56
+ end
57
+ else #按天
58
+ if params[:date].present?
59
+ date = params[:date].split(" - ")
60
+ dates = (date[0].to_date..date[1].to_date).to_a
61
+ @follow_count_data = day_follow_count_chart(dates,names,x_business_ids,colors)
62
+ end
63
+ end
64
+ end
65
+
66
+
67
+ # 已中标图表
68
+ goal_default_dates = ("#{Time.now.year}-01".."#{Time.now.year}-#{Time.now.month}").to_a
69
+ sale_names = ['已中标','已签单','已回款']
70
+ @goal_count_data =
71
+ {
72
+ labels: goal_default_dates,
73
+ datasets: sale_names.map do |name|{
74
+ label: name,
75
+ data: goal_default_dates.map{ |d|
76
+ case sale_names.index(name)
77
+ when 0
78
+ Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", x).where("educode_sales_follow_ups.bidded_date >= ? AND educode_sales_follow_ups.bidded_date <= ? AND educode_sales_follow_ups.stage_id IN (?)", "#{d}-01", "#{d}-31", stage_ids).sum(:total_amount).round(2)
79
+ when 1
80
+ Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", x).where("educode_sales_follow_ups.signed_date >= ? AND educode_sales_follow_ups.signed_date <= ? AND educode_sales_follow_ups.stage_id IN (?)", "#{d}-01", "#{d}-31", s_stage_ids).sum(:total_amount).round(2)
81
+ else
82
+ Business.joins(last_follow_up: :money_plans).where("educode_sales_follow_ups.clazz_id != ?", x).where.not("educode_sales_money_plans.clazz!= ?", 1).where("educode_sales_money_plans.date_at >= ? AND educode_sales_money_plans.date_at <= ? ", "#{d}-01", "#{d}-31").sum(:amount).round(2)
83
+ end
84
+ },
85
+ backgroundColor: colors[sale_names.index(name)],
86
+ borderColor: colors[sale_names.index(name)],
87
+ borderWidth: 1
88
+ }
89
+ end
90
+ }
91
+ if params[:goal_count_range].present?
92
+ case params[:goal_count_range]
93
+ when "week"
94
+ when "month" #按月
95
+ if params[:goal_date_month].present?
96
+ date = params[:goal_date_month].split(" - ")
97
+ dates = ((date[0]+"-01").to_date..(date[1]+"-01").to_date).map { |d| d.strftime("%Y-%m")}.uniq
98
+ @goal_count_data = {
99
+ labels: dates,
100
+ datasets: sale_names.map do |name|{
101
+ label: name,
102
+ data: dates.map{ |d|
103
+ case sale_names.index(name)
104
+ when 0
105
+ Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", x).where("educode_sales_follow_ups.bidded_date >= ? AND educode_sales_follow_ups.bidded_date <= ? AND educode_sales_follow_ups.stage_id IN (?)", "#{d}-01", "#{d}-31", stage_ids).sum(:total_amount).round(2)
106
+ when 1
107
+ Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", x).where("educode_sales_follow_ups.signed_date >= ? AND educode_sales_follow_ups.signed_date <= ? AND educode_sales_follow_ups.stage_id IN (?)", "#{d}-01", "#{d}-31", s_stage_ids).sum(:total_amount).round(2)
108
+ else
109
+ Business.joins(last_follow_up: :money_plans).where("educode_sales_follow_ups.clazz_id != ?", x).where.not("educode_sales_money_plans.clazz!= ?", 1).where("educode_sales_money_plans.date_at >= ? AND educode_sales_money_plans.date_at <= ? ", "#{d}-01", "#{d}-31").sum(:amount).round(2)
110
+ end },
111
+ backgroundColor: colors[sale_names.index(name)],
112
+ borderColor: colors[sale_names.index(name)],
113
+ borderWidth: 1
114
+ }
115
+ end
116
+ }
117
+ end
118
+ else #按年
119
+ if params[:goal_date_year].present?
120
+ date = params[:goal_date_year].split(" - ")
121
+ dates = (date[0]..date[1]).to_a
122
+ @goal_count_data = {
123
+ labels: dates,
124
+ datasets:sale_names.map do |name| {
125
+ label: name,
126
+ data: dates.map{ |d|
127
+ case sale_names.index(name)
128
+ when 0
129
+ Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", x).where("educode_sales_follow_ups.bidded_date >= ? AND educode_sales_follow_ups.bidded_date <= ? AND educode_sales_follow_ups.stage_id IN (?)", "#{d}-01-01", "#{d}-12-31", stage_ids).sum(:total_amount).round(2)
130
+ when 1
131
+ Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", x).where("educode_sales_follow_ups.signed_date >= ? AND educode_sales_follow_ups.signed_date <= ? AND educode_sales_follow_ups.stage_id IN (?)", "#{d}-01-01", "#{d}-12-31", s_stage_ids).sum(:total_amount).round(2)
132
+ else
133
+ Business.joins(last_follow_up: :money_plans).where("educode_sales_follow_ups.clazz_id != ?", x).where.not("educode_sales_money_plans.clazz!= ?", 1).where("educode_sales_money_plans.date_at >= ? AND educode_sales_money_plans.date_at <= ? ", "#{d}-01-01", "#{d}-12-31").sum(:amount).round(2)
134
+ end },
135
+ backgroundColor: colors[sale_names.index(name)],
136
+ borderColor: colors[sale_names.index(name)],
137
+ borderWidth: 1
138
+ }
139
+ end
140
+ }
141
+ end
142
+ end
143
+ end
26
144
  end
27
145
 
28
146
  def sale_trends
@@ -44,5 +162,58 @@ module EducodeSales
44
162
  params.permit(:chance_money, :ballot_money, :sign_money, :returned_money)
45
163
  end
46
164
 
165
+ def day_follow_count_chart(dates,names,x_business_ids,colors)
166
+ {
167
+ labels: dates,
168
+ datasets:names.map do |name|
169
+ {
170
+ hidden: names.index(name) < 3 ? false : true,
171
+ label: name[0],
172
+ data: dates.map{ |d| @follow_up = FollowUp.where(staff_id: name[1], created_at: d.beginning_of_day..d.end_of_day).where.not(business: x_business_ids).count },
173
+ backgroundColor: "#fff",
174
+ pointBorderColor: colors[names.index(name)%15],
175
+ borderColor: colors[names.index(name)%15],
176
+ pointBackgroundColor: colors[names.index(name)%15],
177
+ borderWidth: 4
178
+ }
179
+ end
180
+ }
181
+ end
182
+ def month_follow_count_chart(dates,names,x_business_ids,colors)
183
+ {
184
+ labels: dates,
185
+ datasets:names.map do |name|
186
+ {
187
+ hidden: names.index(name) < 3 ? false : true,
188
+ label: name[0],
189
+ data: dates.map { |d| @follow_up = FollowUp.where( staff_id: name[1]).where("created_at >= ? AND created_at <= ?", "#{d}-01", "#{d}-31").where.not(business: x_business_ids).count },
190
+ backgroundColor: "#fff",
191
+ pointBorderColor: colors[names.index(name)%15],
192
+ borderColor: colors[names.index(name)%15],
193
+ pointBackgroundColor: colors[names.index(name)%15],
194
+ borderWidth: 4,
195
+ }
196
+ end
197
+ }
198
+ end
199
+ def year_follow_count_chart(dates,names,x_business_ids,colors)
200
+ {
201
+ labels: dates,
202
+ datasets:names.map do |name|
203
+ {
204
+ hidden: names.index(name) < 3 ? false : true,
205
+ label: name[0],
206
+ data: dates.map { |d| @follow_up = FollowUp.where( staff_id: name[1]).where("created_at >= ? AND created_at <= ?", "#{d}-01-01", "#{d}-12-31").where.not(business: x_business_ids).count },
207
+ backgroundColor: "#fff",
208
+ pointBorderColor: colors[names.index(name)%15],
209
+ borderColor: colors[names.index(name)%15],
210
+ pointBackgroundColor: colors[names.index(name)%15],
211
+ borderWidth: 4
212
+ }
213
+ end
214
+ }
215
+ end
216
+
217
+
47
218
  end
48
219
  end
@@ -14,6 +14,10 @@ module EducodeSales
14
14
  common = Common.find_by(clazz: 'staff_type', name: '销售')
15
15
  @a_clazz = Common.find_by(clazz: 'business_type', name: Common.find_by(extras: EducodeSales::Common::ATYPE)&.name)
16
16
  @b_clazz = Common.find_by(clazz: 'business_type', name: Common.find_by(extras: EducodeSales::Common::BTYPE)&.name)
17
+ @c_clazz = Common.find_by(clazz: 'business_type', name: Common.find_by(extras: EducodeSales::Common::CTYPE)&.name)
18
+ @d_clazz = Common.find_by(clazz: 'business_type', name: Common.find_by(extras: EducodeSales::Common::DTYPE)&.name)
19
+ @e_clazz = Common.find_by(clazz: 'business_type', name: Common.find_by(extras: EducodeSales::Common::ETYPE)&.name)
20
+ @o_clazz = Common.find_by(clazz: 'business_type', name: Common.find_by(extras: EducodeSales::Common::OTYPE)&.name)
17
21
  @x = Common.find_by(extras: EducodeSales::Common::XTYPE)
18
22
  @step_ids = Common.where(name: %w(已中标 已签单 已验收 回款中 服务中 已结束), clazz: 'business_step').pluck(:id)
19
23
 
@@ -8,7 +8,7 @@ module EducodeSales
8
8
  format.html do
9
9
  end
10
10
  format.json do
11
- @staffs = Staff.where(is_admin: false).page(params[:page]).per(params[:limit])
11
+ @staffs = Staff.where(is_admin: false, deleted_at: nil).page(params[:page]).per(params[:limit])
12
12
  end
13
13
  end
14
14
  end
@@ -37,10 +37,10 @@ module EducodeSales
37
37
 
38
38
  def destroy
39
39
  staff = Staff.find(params[:id])
40
- staff.destroy
40
+ staff.update(deleted_at: Time.now, expired_at: Time.now.days_ago(1))
41
41
  render_success
42
- rescue ActiveRecord::DeleteRestrictionError => e
43
- render_failure '该用户已有数据产生,暂不能删除'
42
+ # rescue ActiveRecord::DeleteRestrictionError => e
43
+ # render_failure '该用户已有数据产生,暂不能删除'
44
44
  end
45
45
 
46
46
  def disable