educode_sales 0.5.5 → 0.5.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/images/educode_sales//345/256/242/346/210/267/347/256/241/347/220/206.png +0 -0
- data/app/controllers/educode_sales/businesses_controller.rb +20 -1
- data/app/controllers/educode_sales/customer_extensions_controller.rb +17 -0
- data/app/controllers/educode_sales/customer_follows_controller.rb +41 -0
- data/app/controllers/educode_sales/customers_controller.rb +194 -0
- data/app/controllers/educode_sales/follow_ups_controller.rb +58 -1
- data/app/controllers/educode_sales/home_controller.rb +18 -2
- data/app/controllers/educode_sales/roles_controller.rb +4 -1
- data/app/controllers/educode_sales/sale_trends_controller.rb +19 -9
- data/app/controllers/educode_sales/sales_controller.rb +3 -0
- data/app/controllers/educode_sales/teachers_controller.rb +41 -14
- data/app/models/educode_sales/customer.rb +4 -0
- data/app/models/educode_sales/customer_extension.rb +7 -0
- data/app/models/educode_sales/customer_follow.rb +5 -0
- data/app/models/educode_sales/permission.rb +2 -1
- data/app/models/educode_sales/role_area.rb +1 -0
- data/app/models/educode_sales/teacher.rb +2 -1
- data/app/models/educode_sales/teacher_assign_follow.rb +6 -0
- data/app/views/educode_sales/activities/index.html.erb +4 -5
- data/app/views/educode_sales/activities/show_teachers.html.erb +1 -1
- data/app/views/educode_sales/businesses/_follows.html.erb +258 -0
- data/app/views/educode_sales/businesses/edit_follow_record.html.erb +69 -6
- data/app/views/educode_sales/businesses/index.html.erb +155 -66
- data/app/views/educode_sales/businesses/index.json.jbuilder +1 -1
- data/app/views/educode_sales/businesses/new.html.erb +3 -0
- data/app/views/educode_sales/businesses/new_follow_record.html.erb +70 -6
- data/app/views/educode_sales/businesses/show_follow.html.erb +15 -10
- data/app/views/educode_sales/businesses/show_follow.json.jbuilder +1 -0
- data/app/views/educode_sales/businesses/show_follow_record.html.erb +8 -0
- data/app/views/educode_sales/businesses/time_line.html.erb +1 -1
- data/app/views/educode_sales/customers/edit.html.erb +60 -0
- data/app/views/educode_sales/customers/edit_department.html.erb +52 -0
- data/app/views/educode_sales/customers/edit_follow_record.html.erb +50 -0
- data/app/views/educode_sales/customers/give.html.erb +51 -0
- data/app/views/educode_sales/customers/index.html.erb +485 -0
- data/app/views/educode_sales/customers/index.json.jbuilder +25 -0
- data/app/views/educode_sales/customers/new.html.erb +89 -0
- data/app/views/educode_sales/customers/new_department.html.erb +53 -0
- data/app/views/educode_sales/customers/new_follow_record.html.erb +54 -0
- data/app/views/educode_sales/customers/show_department.json.jbuilder +13 -0
- data/app/views/educode_sales/customers/show_follow.html.erb +439 -0
- data/app/views/educode_sales/customers/show_follow.json.jbuilder +13 -0
- data/app/views/educode_sales/customers/show_follow_record.html.erb +17 -0
- data/app/views/educode_sales/follow_ups/index.json.jbuilder +20 -0
- data/app/views/educode_sales/home/sales_place.json.jbuilder +9 -0
- data/app/views/educode_sales/operation_plans/_monthPlan.html.erb +6 -0
- data/app/views/educode_sales/operation_plans/_monthly.html.erb +2 -0
- data/app/views/educode_sales/operation_plans/_weekPlan.html.erb +6 -0
- data/app/views/educode_sales/operation_plans/_weekly.html.erb +2 -0
- data/app/views/educode_sales/places/index.json.jbuilder +1 -1
- data/app/views/educode_sales/plans/_monthPlan.html.erb +5 -0
- data/app/views/educode_sales/plans/_monthly.html.erb +1 -0
- data/app/views/educode_sales/plans/_weekPlan.html.erb +5 -0
- data/app/views/educode_sales/plans/_weekly.html.erb +1 -0
- data/app/views/educode_sales/recycles/index.html.erb +1 -1
- data/app/views/educode_sales/roles/edit.html.erb +8 -0
- data/app/views/educode_sales/sale_trends/trends.html.erb +2 -2
- data/app/views/educode_sales/sales/index.html.erb +58 -19
- data/app/views/educode_sales/sales/index.json.jbuilder +31 -16
- data/app/views/educode_sales/sales/operations.html.erb +4 -1
- data/app/views/educode_sales/teachers/course_list.json.jbuilder +1 -1
- data/app/views/educode_sales/teachers/edit.html.erb +53 -7
- data/app/views/educode_sales/teachers/index.html.erb +42 -3
- data/app/views/educode_sales/teachers/index.json.jbuilder +6 -3
- data/app/views/educode_sales/teachers/new.html.erb +55 -17
- data/app/views/educode_sales/teachers/show_follow.html.erb +10 -5
- data/app/views/educode_sales/teachers/show_follow.json.jbuilder +1 -0
- data/app/views/layouts/educode_sales/application.html.erb +8 -1
- data/config/routes.rb +26 -0
- data/db/migrate/20210902064109_create_educode_sales_role_permissions.rb +15 -0
- data/db/migrate/20211201023750_create_educode_sales_teacher_assign_follows.rb +11 -0
- data/db/migrate/20211206054756_add_year_to_follow_ups.rb +5 -0
- data/db/migrate/20211214100803_create_customer_extensions.rb +9 -0
- data/db/migrate/20211215025029_create_educode_sales_customer_follows.rb +12 -0
- data/lib/educode_sales/version.rb +1 -1
- metadata +30 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 82398cf1df1cb40215b1632031edfd6b6ffa4dfed2ff1c8f86c624fa938c917c
|
4
|
+
data.tar.gz: b11d133013cc1dfe416f77b26255709fb24b33061568380abf625012b13b4ee0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ee3920c928e0d06ba4785d0a5ab091b9833d94c42eb881e879c378d36d71f6c75985299b225c198b9abf0f2d5d9a6e133a5afeb7147c87e6523bcde609f07f30
|
7
|
+
data.tar.gz: 14a4f1e5e7f23f94279b9023656d170fed8cf6b3d1a6a034b71cca658bc4d0ab13c27f8d82b589a747f02fca5f53fda1a224c7fb76d1a7f25db4552b2a9ac53d
|
Binary file
|
@@ -35,6 +35,7 @@ module EducodeSales
|
|
35
35
|
@staffs = Staff.joins(:user).where(job_type: common.id).map { |d| [d.user.real_name, d.id]}
|
36
36
|
@more = can?(:create, EducodeSales::SalePlan) || can?(:update, EducodeSales::Business) || can?(:destroy, EducodeSales::Business)
|
37
37
|
gon.menus = []
|
38
|
+
gon.place = params[:place_id].present? ? [{ value: params[:place_id], name: EducodeSales::Place.find(params[:place_id]).name }] : []
|
38
39
|
if can?(:create, EducodeSales::SalePlan)
|
39
40
|
gon.menus << { title: '添加周计划', event: 'week' }
|
40
41
|
gon.menus << { title: '添加月计划', event: 'month' }
|
@@ -149,10 +150,24 @@ module EducodeSales
|
|
149
150
|
|
150
151
|
if params[:q].present? && params[:q][:area].present?
|
151
152
|
p = EducodeSales::Common.find(params[:q][:area]).name
|
152
|
-
|
153
|
+
if @current_admin.is_admin?
|
154
|
+
@businesses = @businesses.joins("
|
155
|
+
JOIN departments ON educode_sales_businesses.department_id = departments.id
|
156
|
+
JOIN schools ON departments.school_id = schools.id
|
157
|
+
").where("province = ?", p)
|
158
|
+
else
|
159
|
+
level = @current_admin.role.role_areas.find_by(clazz: '商机管理').level
|
160
|
+
if level == "区域"
|
161
|
+
@businesses = @businesses.joins("
|
162
|
+
JOIN schools ON departments.school_id = schools.id
|
163
|
+
").where("province = ?", p)
|
164
|
+
else
|
165
|
+
@businesses = @businesses.joins("
|
153
166
|
JOIN departments ON educode_sales_businesses.department_id = departments.id
|
154
167
|
JOIN schools ON departments.school_id = schools.id
|
155
168
|
").where("province = ?", p)
|
169
|
+
end
|
170
|
+
end
|
156
171
|
end
|
157
172
|
|
158
173
|
if params[:q].present? && params[:q][:date].present?
|
@@ -261,6 +276,7 @@ module EducodeSales
|
|
261
276
|
|
262
277
|
def new_follow_record
|
263
278
|
load_business
|
279
|
+
@years = (2015..Time.now.year).to_a.reverse
|
264
280
|
@o_name = EducodeSales::Common.find_by(extras: EducodeSales::Common::OTYPE)&.name
|
265
281
|
@clazz = Common.where(clazz: 'business_type').order("position").pluck(:name, :id)
|
266
282
|
@stages = Common.where(clazz: 'business_step').order("position").pluck(:name, :id)
|
@@ -270,6 +286,7 @@ module EducodeSales
|
|
270
286
|
gon.sales = @last_follow_up.assign_follow_ups.map do |d|
|
271
287
|
{value: d.staff_id, name: d.staff.user.full_name}
|
272
288
|
end
|
289
|
+
gon.place = @last_follow_up.place.present? ? [{ value: @last_follow_up.place&.id, name: @last_follow_up.place&.name }] : []
|
273
290
|
end
|
274
291
|
render layout: false
|
275
292
|
end
|
@@ -295,6 +312,7 @@ module EducodeSales
|
|
295
312
|
end
|
296
313
|
|
297
314
|
def edit_follow_record
|
315
|
+
@years = (2015..Time.now.year).to_a.reverse
|
298
316
|
@o_name = EducodeSales::Common.find_by(extras: EducodeSales::Common::OTYPE)&.name
|
299
317
|
@follow_up = FollowUp.find(params[:follow_up_id])
|
300
318
|
@clazz = Common.where(clazz: 'business_type').order("position").pluck(:name, :id)
|
@@ -303,6 +321,7 @@ module EducodeSales
|
|
303
321
|
gon.sales = @follow_up.assign_follow_ups.map do |d|
|
304
322
|
{value: d.staff_id, name: d.staff.user.full_name}
|
305
323
|
end
|
324
|
+
gon.place = @follow_up.place.present? ? [{ value: @follow_up.place&.id, name: @follow_up.place&.name }] : [value: '', name: '']
|
306
325
|
render layout: false
|
307
326
|
end
|
308
327
|
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require_dependency "educode_sales/application_controller"
|
2
|
+
|
3
|
+
module EducodeSales
|
4
|
+
class CustomerExtensionsController < ApplicationController
|
5
|
+
|
6
|
+
def create
|
7
|
+
params[:school_ids].each do |d|
|
8
|
+
if EducodeSales::CustomerExtension.find_by(school_id: d).present?
|
9
|
+
EducodeSales::CustomerExtension.find_by(school_id: d).update(customer_staff_id: params[:staff_id])
|
10
|
+
else
|
11
|
+
EducodeSales::CustomerExtension.create(customer_staff_id: params[:staff_id], school_id: d)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
render_success
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require_dependency "educode_sales/application_controller"
|
2
|
+
|
3
|
+
module EducodeSales
|
4
|
+
class CustomerFollowsController < ApplicationController
|
5
|
+
def create
|
6
|
+
follow_up = EducodeSales::CustomerFollow.new(follow_up_params)
|
7
|
+
follow_up.staff = @current_admin
|
8
|
+
if follow_up.save
|
9
|
+
render_success
|
10
|
+
else
|
11
|
+
render_failure follow_up
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def destroy
|
16
|
+
follow_up = CustomerFollow.find(params[:id])
|
17
|
+
if follow_up.destroy
|
18
|
+
render_success
|
19
|
+
else
|
20
|
+
render_failure follow_up
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def update
|
25
|
+
follow_up = CustomerFollow.find(params[:id])
|
26
|
+
follow_up.assign_attributes(follow_up_params)
|
27
|
+
if follow_up.save
|
28
|
+
render_success
|
29
|
+
else
|
30
|
+
render_failure follow_up
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def follow_up_params
|
37
|
+
params.permit(:school_id, :department_id, :content)
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,194 @@
|
|
1
|
+
require_dependency "educode_sales/application_controller"
|
2
|
+
|
3
|
+
module EducodeSales
|
4
|
+
class CustomersController < ApplicationController
|
5
|
+
# before_action :find_school, only: [:edit, :update]
|
6
|
+
# before_action :must_admin!, only: [:destroy]
|
7
|
+
|
8
|
+
def new_department
|
9
|
+
render layout: false
|
10
|
+
end
|
11
|
+
def create_department
|
12
|
+
department_name = params[:department_name].to_s.strip
|
13
|
+
school = School.find(params[:school_id])
|
14
|
+
|
15
|
+
return render_failure('部门名称重复') if school.departments.exists?(name: department_name)
|
16
|
+
|
17
|
+
ActiveRecord::Base.transaction do
|
18
|
+
department = school.departments.create!(name: department_name, is_auth: 1)
|
19
|
+
ApplyAddDepartment.create!(school_id: school.id, status: 1, name: department.name,
|
20
|
+
department_id: department.id, user_id: current_user.id)
|
21
|
+
end
|
22
|
+
|
23
|
+
render_success
|
24
|
+
end
|
25
|
+
|
26
|
+
def edit_department
|
27
|
+
@department = Department.find(params[:id])
|
28
|
+
render layout: false
|
29
|
+
end
|
30
|
+
def update_department
|
31
|
+
department = Department.find(params[:id])
|
32
|
+
department.update(name: params[:department_name])
|
33
|
+
render_success
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
def index
|
38
|
+
authorize! :read, Customer
|
39
|
+
respond_to do |format|
|
40
|
+
format.html do
|
41
|
+
common = Common.find_by(clazz: 'staff_type', name: '销售')
|
42
|
+
@staffs = Staff.joins(:user).where(job_type: common.id).map { |d| [d.user.real_name, d.id]}
|
43
|
+
end
|
44
|
+
format.json do
|
45
|
+
if @current_admin.is_admin?
|
46
|
+
@customers = School
|
47
|
+
else
|
48
|
+
level = @current_admin.role.role_areas.find_by(clazz: '客户管理').level
|
49
|
+
case level
|
50
|
+
when '自己'
|
51
|
+
school_ids = CustomerExtension.where(customer_staff_id: @current_admin.id).pluck(:school_id)
|
52
|
+
@customers = School.where(id: school_ids)
|
53
|
+
when '区域'
|
54
|
+
a_school_ids = School.where(province: @current_admin.areas.pluck(:name)).ids
|
55
|
+
b_school_ids = CustomerExtension.where(customer_staff_id: @current_admin.id).pluck(:school_id)
|
56
|
+
school_ids = a_school_ids + b_school_ids
|
57
|
+
@customers = School.where(id: school_ids)
|
58
|
+
else
|
59
|
+
@customers = School
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
if params[:q].present? && params[:q][:name].present?
|
64
|
+
@customers = @customers.where("schools.name like ?", "%#{params[:q][:name]}%")
|
65
|
+
end
|
66
|
+
if params[:q].present? && params[:q][:area].present?
|
67
|
+
@customers = @customers.where("schools.province = ?", "#{params[:q][:area]}")
|
68
|
+
end
|
69
|
+
if params[:q].present? && params[:q][:staff_id].present?
|
70
|
+
school_ids = EducodeSales::CustomerExtension.where(customer_staff_id: params[:q][:staff_id]).pluck(:school_id)
|
71
|
+
@customers = @customers.where(id: school_ids)
|
72
|
+
end
|
73
|
+
|
74
|
+
# if params[:q].present? && params[:q][:date].present?
|
75
|
+
# department_ids =
|
76
|
+
# business_ids = EducodeSales::Business.where(department_id: department_ids).ids
|
77
|
+
# follow_ups = EducodeSales::FollowUp.where(business_id: business_ids)
|
78
|
+
# customer_follows = EducodeSales::CustomerFollow.where(school_id: d.id)
|
79
|
+
# a_last_follow_time = follow_ups.last&.created_at&.to_s(:date)
|
80
|
+
# b_last_follow_time = customer_follows.last&.created_at&.to_s(:date)
|
81
|
+
# if a_last_follow_time.present? && b_last_follow_time.present?
|
82
|
+
# json.last_follow_time a_last_follow_time < b_last_follow_time ? b_last_follow_time : a_last_follow_time
|
83
|
+
# else
|
84
|
+
# json.last_follow_time a_last_follow_time || b_last_follow_time
|
85
|
+
# end
|
86
|
+
# date = params[:q][:date].split(" - ")
|
87
|
+
# @customers = @customers.where("educode_sales_businesses.created_at > ? AND educode_sales_businesses.created_at < ?", date[0], date[1])
|
88
|
+
# end
|
89
|
+
|
90
|
+
@customers = @customers.order(id: :desc).page(params[:page]).per(params[:limit])
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def give
|
96
|
+
common = Common.find_by(clazz: 'staff_type', name: '销售')
|
97
|
+
@staffs = Staff.joins(:user).where(job_type: common.id).map { |d| [d.user.real_name, d.id]}
|
98
|
+
render layout: false
|
99
|
+
end
|
100
|
+
|
101
|
+
def show_follow
|
102
|
+
respond_to do |format|
|
103
|
+
format.html do
|
104
|
+
@school_name = School.find(params[:id]).name
|
105
|
+
@area = School.find(params[:id]).province
|
106
|
+
@staff = EducodeSales::CustomerExtension.find_by(school_id: params[:id])&.customer_staff&.user&.real_name
|
107
|
+
render layout: false
|
108
|
+
end
|
109
|
+
format.json do
|
110
|
+
@follow_ups = EducodeSales::CustomerFollow.where(school_id: params[:id])
|
111
|
+
@latest = @follow_ups.order(created_at: :desc).first
|
112
|
+
# if params[:field]
|
113
|
+
# @follow_ups = @follow_ups.order("#{params[:field]} #{params[:order]}")
|
114
|
+
# else
|
115
|
+
# @follow_ups = @follow_ups.order("created_at desc")
|
116
|
+
# end
|
117
|
+
@follow_ups = @follow_ups.order("created_at desc")
|
118
|
+
@follow_ups = @follow_ups.page(params[:page]).per(params[:limit])
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def show_department
|
124
|
+
@departments = School.find(params[:id]).departments
|
125
|
+
# if params[:field]
|
126
|
+
# @follow_ups = @follow_ups.order("#{params[:field]} #{params[:order]}")
|
127
|
+
# else
|
128
|
+
# @follow_ups = @follow_ups.order("created_at desc")
|
129
|
+
# end
|
130
|
+
@departments = @departments.order("created_at desc")
|
131
|
+
@departments = @departments.page(params[:page]).per(params[:limit])
|
132
|
+
end
|
133
|
+
|
134
|
+
|
135
|
+
def new_follow_record
|
136
|
+
@school = School.find(params[:id])
|
137
|
+
render layout: false
|
138
|
+
end
|
139
|
+
|
140
|
+
def show_follow_record
|
141
|
+
@follow_up = EducodeSales::CustomerFollow.find(params[:id])
|
142
|
+
@school = School.find(@follow_up.school_id)
|
143
|
+
render layout: false
|
144
|
+
end
|
145
|
+
|
146
|
+
def edit_follow_record
|
147
|
+
@follow_up = EducodeSales::CustomerFollow.find(params[:id])
|
148
|
+
@school = School.find(@follow_up.school_id)
|
149
|
+
render layout: false
|
150
|
+
end
|
151
|
+
|
152
|
+
def new
|
153
|
+
render layout: false
|
154
|
+
end
|
155
|
+
|
156
|
+
def create
|
157
|
+
@school = School.find(params[:id])
|
158
|
+
ActiveRecord::Base.transaction do
|
159
|
+
property = SchoolProperty.find_or_create_by!(school_property_params)
|
160
|
+
@school = School.new
|
161
|
+
@school.attributes = school_params
|
162
|
+
@school.school_property = property
|
163
|
+
@school.save!
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
def edit
|
168
|
+
@school = School.find(params[:id])
|
169
|
+
render layout: false
|
170
|
+
end
|
171
|
+
|
172
|
+
def update
|
173
|
+
@school = School.find(params[:id])
|
174
|
+
ActiveRecord::Base.transaction do
|
175
|
+
property = SchoolProperty.find_or_create_by!(school_property_params)
|
176
|
+
@school.attributes = school_params
|
177
|
+
@school.school_property = property
|
178
|
+
@school.save!
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
private
|
183
|
+
|
184
|
+
|
185
|
+
def school_property_params
|
186
|
+
params.require(:school).permit(:project_985, :project_211, :regular_college, :junior_college, :secondary_school, :military_school, :enterprise)
|
187
|
+
end
|
188
|
+
|
189
|
+
def school_params
|
190
|
+
params.require(:school).permit(:name, :province, :city, :address)
|
191
|
+
end
|
192
|
+
|
193
|
+
end
|
194
|
+
end
|
@@ -3,6 +3,63 @@ require_dependency "educode_sales/application_controller"
|
|
3
3
|
module EducodeSales
|
4
4
|
class FollowUpsController < ApplicationController
|
5
5
|
|
6
|
+
def index
|
7
|
+
authorize! :read, Business
|
8
|
+
respond_to do |format|
|
9
|
+
format.html do
|
10
|
+
end
|
11
|
+
format.json do
|
12
|
+
if @current_admin.is_admin?
|
13
|
+
@follow_ups = FollowUp.all
|
14
|
+
else
|
15
|
+
level = @current_admin.role.role_areas.find_by(clazz: '商机管理').level
|
16
|
+
case level
|
17
|
+
when '自己'
|
18
|
+
business_ids = Business.joins(last_follow_up: :assign_follow_ups).where("educode_sales_assign_follow_ups.staff_id = ?", @current_admin.id).pluck(:id)
|
19
|
+
@businesses = Business.where("educode_sales_businesses.staff_id = ? OR educode_sales_businesses.id in (?)", @current_admin.id, business_ids)
|
20
|
+
business_ids = @businesses.pluck(:id)
|
21
|
+
@follow_ups = FollowUp.where(business_id: business_ids)
|
22
|
+
when '区域'
|
23
|
+
school_ids = School.where(province: @current_admin.areas.pluck(:name)).pluck(:id)
|
24
|
+
business_ids = Business.joins(last_follow_up: :assign_follow_ups).where("educode_sales_assign_follow_ups.staff_id = ?", @current_admin.id).pluck(:id)
|
25
|
+
@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)
|
26
|
+
business_ids = @businesses.pluck(:id)
|
27
|
+
@follow_ups = FollowUp.where(business_id: business_ids)
|
28
|
+
else
|
29
|
+
@follow_ups = FollowUp.all
|
30
|
+
end
|
31
|
+
end
|
32
|
+
if params[:q].present? && params[:q][:name].present?
|
33
|
+
@follow_ups = @follow_ups.joins(:business).where("educode_sales_businesses.name LIKE ?", "%#{params[:q][:name]}%")
|
34
|
+
end
|
35
|
+
if params[:q].present? && params[:q][:follows_date].present?
|
36
|
+
date = params[:q][:follows_date].split(" - ")
|
37
|
+
@follow_ups = @follow_ups.where("educode_sales_follow_ups.created_at > ? AND educode_sales_follow_ups.created_at < ?", date[0], date[1])
|
38
|
+
end
|
39
|
+
if params[:q].present? && params[:q][:staff_id].present?
|
40
|
+
@follow_ups = @follow_ups.where(staff_id: params[:q][:staff_id])
|
41
|
+
end
|
42
|
+
if params[:q].present? && params[:q][:department].present?
|
43
|
+
departments_ids = Department.joins(:school).where("schools.name like ?", "%#{params[:q][:department]}%").pluck(:id)
|
44
|
+
@follow_ups = @follow_ups.joins(business: :department).where("departments.id in (?)", departments_ids)
|
45
|
+
end
|
46
|
+
if params[:q].present? && params[:q][:area].present?
|
47
|
+
p = EducodeSales::Common.find(params[:q][:area]).name
|
48
|
+
@follow_ups = @follow_ups.joins(:business).joins("
|
49
|
+
JOIN departments ON educode_sales_businesses.department_id = departments.id
|
50
|
+
JOIN schools ON departments.school_id = schools.id
|
51
|
+
").where("province = ?", p)
|
52
|
+
end
|
53
|
+
if params[:sort].present? && params[:sort][:field]
|
54
|
+
@follow_ups = @follow_ups.order("#{params[:sort][:field]} #{params[:sort][:order]}")
|
55
|
+
else
|
56
|
+
@follow_ups = @follow_ups.order("educode_sales_follow_ups.created_at desc")
|
57
|
+
end
|
58
|
+
@follow_ups = @follow_ups.page(params[:page]).per(params[:limit])
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
6
63
|
def create
|
7
64
|
load_business
|
8
65
|
follow_up = @business.follow_ups.build(follow_up_params)
|
@@ -157,7 +214,7 @@ module EducodeSales
|
|
157
214
|
end
|
158
215
|
|
159
216
|
def follow_up_params
|
160
|
-
params.permit(:clazz_id, :stage_id, :invitation_at, :reception_at, :total_amount, :actual_amount, :divide_amount, :description, :advise, :place_id, :bidded_date, :signed_date)
|
217
|
+
params.permit(:clazz_id, :stage_id, :invitation_at, :reception_at, :total_amount, :actual_amount, :divide_amount, :description, :advise, :place_id, :bidded_date, :signed_date, :year)
|
161
218
|
end
|
162
219
|
|
163
220
|
def teacher_params
|
@@ -42,12 +42,28 @@ module EducodeSales
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def sales_staff
|
45
|
-
common = Common.find_by(clazz: 'staff_type', name: '销售')
|
46
45
|
@staffs = Staff
|
46
|
+
if params[:teacher_assist].present?
|
47
|
+
common = Common.find_by(clazz: 'staff_type', name: '运营')
|
48
|
+
else
|
49
|
+
common = Common.find_by(clazz: 'staff_type', name: '销售')
|
50
|
+
end
|
47
51
|
if params[:q].present?
|
48
52
|
@staffs = @staffs.joins(user: :user_extension).where("concat(lastname, firstname) like :q", q: "%#{params[:q]}%")
|
49
53
|
end
|
50
|
-
|
54
|
+
if params[:teacher_assist].present?
|
55
|
+
@staffs = @staffs.where(is_admin: false).where(job_type: common.id).page(params[:page]).per(10)
|
56
|
+
else
|
57
|
+
@staffs = @staffs.where(is_admin: false).where.not(id: @current_admin.id).where(job_type: common.id).page(params[:page]).per(10)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def sales_place
|
62
|
+
@places = EducodeSales::Place
|
63
|
+
if params[:q].present?
|
64
|
+
@places = @places.where("name like :q", q: "%#{params[:q].strip}%")
|
65
|
+
end
|
66
|
+
@places = @places.page(params[:page]).per(10)
|
51
67
|
end
|
52
68
|
|
53
69
|
end
|
@@ -16,7 +16,7 @@ module EducodeSales
|
|
16
16
|
|
17
17
|
def create
|
18
18
|
role = Role.new(name: params[:name])
|
19
|
-
role.role_areas.build([{ clazz: 'Business' }, { clazz: 'SalePlan' }, { clazz: 'Teacher' }, { clazz: 'Operation' }])
|
19
|
+
role.role_areas.build([{ clazz: 'Business' }, { clazz: 'SalePlan' }, { clazz: 'Teacher' }, { clazz: 'Operation' }, {clazz:'Customer'}])
|
20
20
|
if role.save
|
21
21
|
render_success
|
22
22
|
else
|
@@ -78,6 +78,9 @@ module EducodeSales
|
|
78
78
|
role.role_areas.find_by(clazz: 'Operation').update(level: params[:operation])
|
79
79
|
role.role_areas.find_by(clazz: 'SalePlan').update(level: params[:sale_plan])
|
80
80
|
role.role_areas.find_by(clazz: 'Teacher').update(level: params[:teacher])
|
81
|
+
r = role.role_areas.find_or_initialize_by(clazz: 'Customer')
|
82
|
+
r.level = params[:customer]
|
83
|
+
r.save
|
81
84
|
render_success
|
82
85
|
end
|
83
86
|
|
@@ -43,7 +43,7 @@ module EducodeSales
|
|
43
43
|
@follow_count_data = week_follow_count_chart(default_dates,names,x_business_ids,colors)
|
44
44
|
if params[:follow_count_range].present?
|
45
45
|
case params[:follow_count_range]
|
46
|
-
when "week"
|
46
|
+
when "week" #按周
|
47
47
|
if params[:date_week].present?
|
48
48
|
date = params[:date_week].split(" - ")
|
49
49
|
dates = (date[0].to_date..date[1].to_date).map { |d|
|
@@ -76,7 +76,6 @@ module EducodeSales
|
|
76
76
|
# 已中标图表
|
77
77
|
goal_default_dates = ("#{Time.now.year}-01".."#{Time.now.year}-#{Time.now.month}").to_a
|
78
78
|
sale_names = ['已中标','已签单','已回款']
|
79
|
-
10.times{p count_type}
|
80
79
|
@goal_count_data = month_sale_chart(goal_default_dates,sale_names,colors,x,stage_ids,s_stage_ids,count_type)
|
81
80
|
if params[:goal_count_range].present?
|
82
81
|
case params[:goal_count_range]
|
@@ -121,7 +120,7 @@ module EducodeSales
|
|
121
120
|
labels: dates,
|
122
121
|
datasets:names.map.with_index do |name,i|
|
123
122
|
{
|
124
|
-
hidden: i < 3 ? false : true,
|
123
|
+
# hidden: i < 3 ? false : true,
|
125
124
|
label: name[0],
|
126
125
|
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 },
|
127
126
|
backgroundColor: "#fff",
|
@@ -135,21 +134,32 @@ module EducodeSales
|
|
135
134
|
end
|
136
135
|
def week_follow_count_chart(dates,names,x_business_ids,colors)
|
137
136
|
{
|
138
|
-
labels: dates
|
137
|
+
labels: dates.map{ |date|
|
138
|
+
d = date.split("-")
|
139
|
+
year = d[0].to_i
|
140
|
+
week = d[1].to_i
|
141
|
+
if week == 0
|
142
|
+
0
|
143
|
+
else
|
144
|
+
month = Date.commercial(year,week).strftime("%m月%d日")
|
145
|
+
day = Date.commercial(year,week,7).strftime("%m月%d日")
|
146
|
+
date.to_s + "(#{month}-#{day})"
|
147
|
+
end
|
148
|
+
} - [0],
|
139
149
|
datasets:names.map.with_index do |name,i|
|
140
150
|
{
|
141
|
-
hidden: i < 3 ? false : true,
|
151
|
+
# hidden: i < 3 ? false : true,
|
142
152
|
label: name[0],
|
143
153
|
data: dates.map{ |d|
|
144
154
|
d = d.split("-")
|
145
155
|
year = d[0].to_i
|
146
156
|
week = d[1].to_i
|
147
157
|
if week == 0
|
148
|
-
@follow_up =
|
158
|
+
@follow_up = 999999
|
149
159
|
else
|
150
160
|
@follow_up = FollowUp.where(staff_id: name[1]).where("created_at >= ? AND created_at <= ?", Date.commercial(year,week).strftime("%Y-%m-%d"), Date.commercial(year,week,7).strftime("%Y-%m-%d")).where.not(business: x_business_ids).count
|
151
161
|
end
|
152
|
-
},
|
162
|
+
} - [999999],
|
153
163
|
backgroundColor: "#fff",
|
154
164
|
pointBorderColor: colors[i%15+1],
|
155
165
|
borderColor: colors[i%15+1],
|
@@ -164,7 +174,7 @@ module EducodeSales
|
|
164
174
|
labels: dates,
|
165
175
|
datasets:names.map.with_index do |name,i|
|
166
176
|
{
|
167
|
-
hidden: i < 3 ? false : true,
|
177
|
+
# hidden: i < 3 ? false : true,
|
168
178
|
label: name[0],
|
169
179
|
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 },
|
170
180
|
backgroundColor: "#fff",
|
@@ -181,7 +191,7 @@ module EducodeSales
|
|
181
191
|
labels: dates,
|
182
192
|
datasets:names.map.with_index do |name,i|
|
183
193
|
{
|
184
|
-
hidden: i < 3 ? false : true,
|
194
|
+
# hidden: i < 3 ? false : true,
|
185
195
|
label: name[0],
|
186
196
|
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 },
|
187
197
|
backgroundColor: "#fff",
|
@@ -9,8 +9,11 @@ module EducodeSales
|
|
9
9
|
authorize! :sales, Staff
|
10
10
|
respond_to do |format|
|
11
11
|
format.html do
|
12
|
+
@year = params[:year] ? params[:year] : "全部"
|
13
|
+
@years = ["全部"]+(2015..Time.now.year).to_a.reverse
|
12
14
|
end
|
13
15
|
format.json do
|
16
|
+
@year = params[:year] ? params[:year] : "全部"
|
14
17
|
common = Common.find_by(clazz: 'staff_type', name: '销售')
|
15
18
|
@a_clazz = Common.find_by(clazz: 'business_type', name: Common.find_by(extras: EducodeSales::Common::ATYPE)&.name)
|
16
19
|
@b_clazz = Common.find_by(clazz: 'business_type', name: Common.find_by(extras: EducodeSales::Common::BTYPE)&.name)
|
@@ -21,6 +21,8 @@ module EducodeSales
|
|
21
21
|
def index
|
22
22
|
respond_to do |format|
|
23
23
|
format.html do
|
24
|
+
common = Common.find_by(clazz: 'staff_type', name: '运营')
|
25
|
+
@staffs = Staff.joins(:user).where(job_type: common.id).map { |d| [d.user.real_name, d.id]}
|
24
26
|
@more = can?(:create, EducodeSales::OperationPlan) || can?(:update, EducodeSales::Teacher) || can?(:destroy, EducodeSales::Teacher)
|
25
27
|
gon.menus = []
|
26
28
|
if can?(:create, EducodeSales::OperationPlan)
|
@@ -43,14 +45,30 @@ module EducodeSales
|
|
43
45
|
when '自己'
|
44
46
|
@teachers = Teacher.where(is_key: false)
|
45
47
|
@teachers = @teachers.where(staff_id: @current_admin.id)
|
48
|
+
teacher_ids = EducodeSales::Teacher.where(staff_id: 0).pluck(:id) - EducodeSales::TeacherAssignFollow.all.pluck(:Teacher_id) + EducodeSales::TeacherAssignFollow.where(staff_id: @current_admin.id).pluck(:teacher_id) + @teachers.ids
|
49
|
+
@teachers = Teacher.where(id: teacher_ids)
|
46
50
|
when '区域'
|
47
51
|
school_ids = School.where(province: @current_admin.areas.pluck(:name)).pluck(:id)
|
48
52
|
@teachers = Teacher.joins("JOIN departments ON educode_sales_teachers.department_id = departments.id").where(is_key: false).where("departments.school_id in (?) OR educode_sales_teachers.staff_id = #{@current_admin.id}", school_ids)
|
53
|
+
teacher_ids = EducodeSales::Teacher.where(staff_id: 0).pluck(:id) - EducodeSales::TeacherAssignFollow.all.pluck(:Teacher_id) + EducodeSales::TeacherAssignFollow.where(staff_id: @current_admin.id).pluck(:teacher_id) + @teachers.ids
|
54
|
+
@teachers = Teacher.where(id: teacher_ids)
|
49
55
|
else
|
50
56
|
@teachers = Teacher.where(is_key: false)
|
51
57
|
end
|
52
58
|
end
|
53
|
-
|
59
|
+
|
60
|
+
if @current_admin.job_type == Common.find_by(clazz: 'staff_type', name: '销售').id
|
61
|
+
public_teacher_ids = EducodeSales::Teacher.where(staff_id: 0).pluck(:id) - EducodeSales::TeacherAssignFollow.where(staff_id: @current_admin.id).pluck(:teacher_id)
|
62
|
+
@teachers = @teachers.where.not(id: public_teacher_ids)
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
if params[:q].present? && params[:q][:assist].present?
|
68
|
+
staff_id = params[:q][:assist].to_i
|
69
|
+
teacher_ids = EducodeSales::TeacherAssignFollow.where(staff_id: staff_id).pluck(:teacher_id)
|
70
|
+
@teachers = @teachers.where(id: teacher_ids)
|
71
|
+
end
|
54
72
|
if params[:q].present? && params[:q][:name].present?
|
55
73
|
@teachers = @teachers.where("educode_sales_teachers.name like ?", "%#{params[:q][:name]}%")
|
56
74
|
end
|
@@ -60,6 +78,13 @@ module EducodeSales
|
|
60
78
|
if params[:q].present? && params[:q][:regist_at].present?
|
61
79
|
@teachers = @teachers.where("educode_sales_teachers.regist_at like ?", "%#{params[:q][:regist_at]}%")
|
62
80
|
end
|
81
|
+
if params[:q].present? && params[:q][:status].present?
|
82
|
+
if params[:q][:status] == "1"
|
83
|
+
@teachers = @teachers.where("educode_sales_teachers.user_id is not null")
|
84
|
+
else
|
85
|
+
@teachers = @teachers.where("educode_sales_teachers.user_id is null")
|
86
|
+
end
|
87
|
+
end
|
63
88
|
if params[:q].present? && params[:q][:attitude].present?
|
64
89
|
# @teachers = @teachers.where("educode_sales_teachers.attitude_id = ?", "#{params[:q][:attitude]}")
|
65
90
|
@teachers = @teachers.joins("
|
@@ -105,6 +130,9 @@ module EducodeSales
|
|
105
130
|
def create
|
106
131
|
department = Department.find(params[:department_id])
|
107
132
|
teacher = @current_admin.teachers.build(teacher_params)
|
133
|
+
params[:teacher_assist].each do |d|
|
134
|
+
teacher.teacher_assign_follows.build(staff_id: d)
|
135
|
+
end
|
108
136
|
teacher.department_id = department.id
|
109
137
|
if params[:user_id].present?
|
110
138
|
user = User.find(params[:user_id])
|
@@ -147,6 +175,13 @@ module EducodeSales
|
|
147
175
|
teacher = Teacher.find(params[:id])
|
148
176
|
teacher.department_id = department.id
|
149
177
|
teacher.assign_attributes(teacher_params)
|
178
|
+
|
179
|
+
teacher_assists = []
|
180
|
+
params[:teacher_assist].each do |d|
|
181
|
+
teacher_assists << teacher.teacher_assign_follows.find_or_initialize_by(staff_id: d)
|
182
|
+
end
|
183
|
+
teacher.teacher_assign_follows = teacher_assists
|
184
|
+
|
150
185
|
if params[:user_id].present?
|
151
186
|
user = User.find(params[:user_id])
|
152
187
|
teacher.user_id = user.id
|
@@ -171,7 +206,10 @@ module EducodeSales
|
|
171
206
|
end
|
172
207
|
|
173
208
|
def edit
|
174
|
-
|
209
|
+
load_teacher
|
210
|
+
gon.teacher_assist = @teacher.teacher_assign_follows.map do |d|
|
211
|
+
{value: d.staff_id, name: d.staff.user.full_name}
|
212
|
+
end
|
175
213
|
gon.department = { value: @teacher.department_id, name: "#{@teacher.department&.school&.name}-#{@teacher.department&.name}" }
|
176
214
|
gon.value = @teacher.department_id
|
177
215
|
render layout: false
|
@@ -256,17 +294,6 @@ module EducodeSales
|
|
256
294
|
render layout: false
|
257
295
|
end
|
258
296
|
|
259
|
-
# def create_follow_record
|
260
|
-
#
|
261
|
-
# end
|
262
|
-
#
|
263
|
-
# def update_follow_record
|
264
|
-
#
|
265
|
-
# end
|
266
|
-
# def delete_follow_record
|
267
|
-
#
|
268
|
-
# end
|
269
|
-
|
270
297
|
def show_follow_record
|
271
298
|
@follow_up = TeacherFollow.find(params[:id])
|
272
299
|
render layout: false
|
@@ -294,7 +321,7 @@ module EducodeSales
|
|
294
321
|
|
295
322
|
private
|
296
323
|
def teacher_params
|
297
|
-
params.permit(:name, :professional_title, :job, :source_id)
|
324
|
+
params.permit(:name, :professional_title, :job, :source_id, :wechat)
|
298
325
|
end
|
299
326
|
|
300
327
|
def load_teacher
|