educode_sales 0.1.0

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 (244) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +30 -0
  4. data/Rakefile +32 -0
  5. data/app/assets/config/educode_sales_manifest.js +2 -0
  6. data/app/assets/fonts/iconfont.eot +0 -0
  7. data/app/assets/fonts/iconfont.svg +554 -0
  8. data/app/assets/fonts/iconfont.ttf +0 -0
  9. data/app/assets/fonts/iconfont.woff +0 -0
  10. data/app/assets/fonts/iconfont.woff2 +0 -0
  11. data/app/assets/images/educode_sales/favicon.ico +0 -0
  12. data/app/assets/images/educode_sales/icon-ext.png +0 -0
  13. data/app/assets/images/educode_sales/icon-login.png +0 -0
  14. data/app/assets/images/educode_sales/icon.png +0 -0
  15. data/app/assets/images/educode_sales/loading-0.gif +0 -0
  16. data/app/assets/images/educode_sales/loading-1.gif +0 -0
  17. data/app/assets/images/educode_sales/loading-2.gif +0 -0
  18. data/app/assets/images/educode_sales/loginbg.png +0 -0
  19. data/app/assets/images/educode_sales/logo.png +0 -0
  20. data/app/assets/javascripts/educode_sales/application.js +16 -0
  21. data/app/assets/javascripts/educode_sales/extent/miniPage.js +394 -0
  22. data/app/assets/javascripts/educode_sales/extent/request.js +137 -0
  23. data/app/assets/javascripts/educode_sales/extent/select_input.js +522 -0
  24. data/app/assets/javascripts/educode_sales/layui.js +5 -0
  25. data/app/assets/stylesheets/educode_sales/app.css +256 -0
  26. data/app/assets/stylesheets/educode_sales/application.css +17 -0
  27. data/app/assets/stylesheets/educode_sales/error.css +181 -0
  28. data/app/assets/stylesheets/educode_sales/layui.scss +1525 -0
  29. data/app/assets/stylesheets/educode_sales/layuimini.css +838 -0
  30. data/app/assets/stylesheets/educode_sales/login.scss +38 -0
  31. data/app/assets/stylesheets/educode_sales/modules/code.css +29 -0
  32. data/app/assets/stylesheets/educode_sales/modules/laydate/default/font.scss +16 -0
  33. data/app/assets/stylesheets/educode_sales/modules/laydate/default/laydate.css +152 -0
  34. data/app/assets/stylesheets/educode_sales/modules/layer/default/icon-ext.png +0 -0
  35. data/app/assets/stylesheets/educode_sales/modules/layer/default/icon.png +0 -0
  36. data/app/assets/stylesheets/educode_sales/modules/layer/default/layer.scss +179 -0
  37. data/app/assets/stylesheets/educode_sales/modules/layer/default/loading-0.gif +0 -0
  38. data/app/assets/stylesheets/educode_sales/modules/layer/default/loading-1.gif +0 -0
  39. data/app/assets/stylesheets/educode_sales/modules/layer/default/loading-2.gif +0 -0
  40. data/app/assets/stylesheets/educode_sales/modules/select_input.css +103 -0
  41. data/app/assets/stylesheets/educode_sales/public.css +47 -0
  42. data/app/controllers/educode_sales/activities_controller.rb +58 -0
  43. data/app/controllers/educode_sales/application_controller.rb +35 -0
  44. data/app/controllers/educode_sales/businesses_controller.rb +189 -0
  45. data/app/controllers/educode_sales/commons_controller.rb +54 -0
  46. data/app/controllers/educode_sales/follow_ups_controller.rb +140 -0
  47. data/app/controllers/educode_sales/home_controller.rb +40 -0
  48. data/app/controllers/educode_sales/key_person_controller.rb +29 -0
  49. data/app/controllers/educode_sales/operation_plans_controller.rb +53 -0
  50. data/app/controllers/educode_sales/operation_reports_controller.rb +6 -0
  51. data/app/controllers/educode_sales/operations_controller.rb +38 -0
  52. data/app/controllers/educode_sales/places_controller.rb +69 -0
  53. data/app/controllers/educode_sales/plans_controller.rb +208 -0
  54. data/app/controllers/educode_sales/roles_controller.rb +69 -0
  55. data/app/controllers/educode_sales/sale_reports_controller.rb +133 -0
  56. data/app/controllers/educode_sales/sale_trends_controller.rb +45 -0
  57. data/app/controllers/educode_sales/sales_controller.rb +64 -0
  58. data/app/controllers/educode_sales/sessions_controller.rb +51 -0
  59. data/app/controllers/educode_sales/staffs_controller.rb +81 -0
  60. data/app/controllers/educode_sales/teachers_controller.rb +167 -0
  61. data/app/helpers/educode_sales/activities_helper.rb +4 -0
  62. data/app/helpers/educode_sales/application_helper.rb +44 -0
  63. data/app/helpers/educode_sales/business_helper.rb +4 -0
  64. data/app/helpers/educode_sales/home_helper.rb +4 -0
  65. data/app/helpers/educode_sales/sessions_helper.rb +4 -0
  66. data/app/helpers/educode_sales/teachers_helper.rb +4 -0
  67. data/app/jobs/educode_sales/application_job.rb +4 -0
  68. data/app/mailers/educode_sales/application_mailer.rb +6 -0
  69. data/app/models/ability.rb +54 -0
  70. data/app/models/educode_sales/activity.rb +6 -0
  71. data/app/models/educode_sales/activity_teacher.rb +6 -0
  72. data/app/models/educode_sales/application_record.rb +5 -0
  73. data/app/models/educode_sales/business.rb +11 -0
  74. data/app/models/educode_sales/common.rb +32 -0
  75. data/app/models/educode_sales/course_subject.rb +5 -0
  76. data/app/models/educode_sales/follow_up.rb +14 -0
  77. data/app/models/educode_sales/key_person.rb +11 -0
  78. data/app/models/educode_sales/market_area.rb +6 -0
  79. data/app/models/educode_sales/money_plan.rb +22 -0
  80. data/app/models/educode_sales/operation_plan.rb +6 -0
  81. data/app/models/educode_sales/operation_report.rb +5 -0
  82. data/app/models/educode_sales/operation_trend.rb +5 -0
  83. data/app/models/educode_sales/permission.rb +16 -0
  84. data/app/models/educode_sales/place.rb +7 -0
  85. data/app/models/educode_sales/place_area.rb +6 -0
  86. data/app/models/educode_sales/role.rb +8 -0
  87. data/app/models/educode_sales/role_area.rb +13 -0
  88. data/app/models/educode_sales/role_permission.rb +6 -0
  89. data/app/models/educode_sales/sale_plan.rb +6 -0
  90. data/app/models/educode_sales/sale_report.rb +5 -0
  91. data/app/models/educode_sales/sale_trend.rb +4 -0
  92. data/app/models/educode_sales/staff.rb +41 -0
  93. data/app/models/educode_sales/teacher.rb +12 -0
  94. data/app/models/educode_sales/teacher_follow.rb +6 -0
  95. data/app/views/educode_sales/activities/edit.html.erb +82 -0
  96. data/app/views/educode_sales/activities/index.html.erb +172 -0
  97. data/app/views/educode_sales/activities/index.json.jbuilder +14 -0
  98. data/app/views/educode_sales/activities/new.html.erb +81 -0
  99. data/app/views/educode_sales/activities/show_teachers.html.erb +368 -0
  100. data/app/views/educode_sales/businesses/edit.html.erb +82 -0
  101. data/app/views/educode_sales/businesses/edit_follow_record.html.erb +138 -0
  102. data/app/views/educode_sales/businesses/edit_plan.html.erb +172 -0
  103. data/app/views/educode_sales/businesses/index.html.erb +364 -0
  104. data/app/views/educode_sales/businesses/index.json.jbuilder +20 -0
  105. data/app/views/educode_sales/businesses/new.html.erb +80 -0
  106. data/app/views/educode_sales/businesses/new_follow_record.html.erb +144 -0
  107. data/app/views/educode_sales/businesses/show_follow.html.erb +466 -0
  108. data/app/views/educode_sales/businesses/show_follow.json.jbuilder +21 -0
  109. data/app/views/educode_sales/businesses/show_follow_record.html.erb +81 -0
  110. data/app/views/educode_sales/businesses/show_keys.html.erb +56 -0
  111. data/app/views/educode_sales/businesses/unfinish_plans.json.jbuilder +14 -0
  112. data/app/views/educode_sales/commons/edit.html.erb +112 -0
  113. data/app/views/educode_sales/commons/index.html.erb +132 -0
  114. data/app/views/educode_sales/commons/index.json.jbuilder +13 -0
  115. data/app/views/educode_sales/commons/new.html.erb +58 -0
  116. data/app/views/educode_sales/commons/show.json.jbuilder +9 -0
  117. data/app/views/educode_sales/follow_ups/money_plans.json.jbuilder +11 -0
  118. data/app/views/educode_sales/follow_ups/teachers.json.jbuilder +16 -0
  119. data/app/views/educode_sales/home/index.html.erb +1 -0
  120. data/app/views/educode_sales/home/no_permission.html.erb +27 -0
  121. data/app/views/educode_sales/home/search.json.jbuilder +8 -0
  122. data/app/views/educode_sales/home/search_edu_teacher.json.jbuilder +14 -0
  123. data/app/views/educode_sales/home/search_teacher.json.jbuilder +24 -0
  124. data/app/views/educode_sales/home/search_users.json.jbuilder +8 -0
  125. data/app/views/educode_sales/home/statistics.html.erb +68 -0
  126. data/app/views/educode_sales/operation_plans/_monthPlan.html.erb +288 -0
  127. data/app/views/educode_sales/operation_plans/_monthly.html.erb +284 -0
  128. data/app/views/educode_sales/operation_plans/_weekPlan.html.erb +291 -0
  129. data/app/views/educode_sales/operation_plans/_weekly.html.erb +275 -0
  130. data/app/views/educode_sales/operation_plans/edit_month.html.erb +60 -0
  131. data/app/views/educode_sales/operation_plans/edit_monthly.html.erb +175 -0
  132. data/app/views/educode_sales/operation_plans/edit_week.html.erb +72 -0
  133. data/app/views/educode_sales/operation_plans/edit_weekly.html.erb +173 -0
  134. data/app/views/educode_sales/operation_plans/index.html.erb +22 -0
  135. data/app/views/educode_sales/operation_plans/new_month.html.erb +79 -0
  136. data/app/views/educode_sales/operation_plans/new_monthly.html.erb +176 -0
  137. data/app/views/educode_sales/operation_plans/new_week.html.erb +86 -0
  138. data/app/views/educode_sales/operation_plans/new_weekly.html.erb +174 -0
  139. data/app/views/educode_sales/operation_plans/operation.html.erb +0 -0
  140. data/app/views/educode_sales/operation_plans/show_month.html.erb +36 -0
  141. data/app/views/educode_sales/operation_plans/show_monthly.html.erb +171 -0
  142. data/app/views/educode_sales/operation_plans/show_week.html.erb +43 -0
  143. data/app/views/educode_sales/operation_plans/show_weekly.html.erb +170 -0
  144. data/app/views/educode_sales/operations/trends.html.erb +191 -0
  145. data/app/views/educode_sales/places/edit.html.erb +91 -0
  146. data/app/views/educode_sales/places/index.html.erb +137 -0
  147. data/app/views/educode_sales/places/index.json.jbuilder +13 -0
  148. data/app/views/educode_sales/places/new.html.erb +77 -0
  149. data/app/views/educode_sales/plans/_monthPlan.html.erb +258 -0
  150. data/app/views/educode_sales/plans/_monthly.html.erb +302 -0
  151. data/app/views/educode_sales/plans/_weekPlan.html.erb +265 -0
  152. data/app/views/educode_sales/plans/_weekly.html.erb +296 -0
  153. data/app/views/educode_sales/plans/audit_weekly.html.erb +177 -0
  154. data/app/views/educode_sales/plans/edit_month.html.erb +74 -0
  155. data/app/views/educode_sales/plans/edit_monthly.html.erb +179 -0
  156. data/app/views/educode_sales/plans/edit_week.html.erb +81 -0
  157. data/app/views/educode_sales/plans/edit_weekly.html.erb +238 -0
  158. data/app/views/educode_sales/plans/index.html.erb +54 -0
  159. data/app/views/educode_sales/plans/index.json.jbuilder +19 -0
  160. data/app/views/educode_sales/plans/my_month.json.jbuilder +18 -0
  161. data/app/views/educode_sales/plans/my_week.json.jbuilder +19 -0
  162. data/app/views/educode_sales/plans/new_month.html.erb +89 -0
  163. data/app/views/educode_sales/plans/new_monthly.html.erb +235 -0
  164. data/app/views/educode_sales/plans/new_week.html.erb +95 -0
  165. data/app/views/educode_sales/plans/new_weekly.html.erb +262 -0
  166. data/app/views/educode_sales/plans/operation.html.erb +0 -0
  167. data/app/views/educode_sales/plans/show_month.html.erb +30 -0
  168. data/app/views/educode_sales/plans/show_monthly.html.erb +175 -0
  169. data/app/views/educode_sales/plans/show_week.html.erb +38 -0
  170. data/app/views/educode_sales/plans/show_weekly.html.erb +143 -0
  171. data/app/views/educode_sales/roles/edit.html.erb +127 -0
  172. data/app/views/educode_sales/roles/index.html.erb +105 -0
  173. data/app/views/educode_sales/roles/index.json.jbuilder +10 -0
  174. data/app/views/educode_sales/roles/new.html.erb +51 -0
  175. data/app/views/educode_sales/sale_reports/audit.html.erb +209 -0
  176. data/app/views/educode_sales/sale_reports/edit.html.erb +240 -0
  177. data/app/views/educode_sales/sale_reports/index.json.jbuilder +17 -0
  178. data/app/views/educode_sales/sale_reports/plans.json.jbuilder +19 -0
  179. data/app/views/educode_sales/sale_reports/show.html.erb +172 -0
  180. data/app/views/educode_sales/sale_trends/operations.html.erb +49 -0
  181. data/app/views/educode_sales/sale_trends/trends.html.erb +213 -0
  182. data/app/views/educode_sales/sales/index.html.erb +60 -0
  183. data/app/views/educode_sales/sales/index.json.jbuilder +17 -0
  184. data/app/views/educode_sales/sales/operations.html.erb +108 -0
  185. data/app/views/educode_sales/sales/operations.json.jbuilder +14 -0
  186. data/app/views/educode_sales/sales/school.html.erb +29 -0
  187. data/app/views/educode_sales/sales/trends.html.erb +216 -0
  188. data/app/views/educode_sales/sales/xschool.html.erb +35 -0
  189. data/app/views/educode_sales/sessions/login.html.erb +87 -0
  190. data/app/views/educode_sales/staffs/edit.html.erb +116 -0
  191. data/app/views/educode_sales/staffs/follow_up_departments.json.jbuilder +13 -0
  192. data/app/views/educode_sales/staffs/follow_up_schools.json.jbuilder +12 -0
  193. data/app/views/educode_sales/staffs/index.html.erb +141 -0
  194. data/app/views/educode_sales/staffs/index.json.jbuilder +15 -0
  195. data/app/views/educode_sales/staffs/new.html.erb +73 -0
  196. data/app/views/educode_sales/teachers/activities.json.jbuilder +9 -0
  197. data/app/views/educode_sales/teachers/add_courses.html.erb +53 -0
  198. data/app/views/educode_sales/teachers/add_event.html.erb +49 -0
  199. data/app/views/educode_sales/teachers/add_keys.html.erb +282 -0
  200. data/app/views/educode_sales/teachers/course_list.json.jbuilder +22 -0
  201. data/app/views/educode_sales/teachers/edit.html.erb +109 -0
  202. data/app/views/educode_sales/teachers/edit_follow_record.html.erb +67 -0
  203. data/app/views/educode_sales/teachers/index.html.erb +461 -0
  204. data/app/views/educode_sales/teachers/index.json.jbuilder +23 -0
  205. data/app/views/educode_sales/teachers/new.html.erb +166 -0
  206. data/app/views/educode_sales/teachers/new_follow_record.html.erb +67 -0
  207. data/app/views/educode_sales/teachers/search_new.html.erb +138 -0
  208. data/app/views/educode_sales/teachers/show_class.html.erb +101 -0
  209. data/app/views/educode_sales/teachers/show_follow.html.erb +511 -0
  210. data/app/views/educode_sales/teachers/show_follow_record.html.erb +67 -0
  211. data/app/views/layouts/educode_sales/application.html.erb +104 -0
  212. data/app/views/layouts/educode_sales/login.html.erb +20 -0
  213. data/config/locales/sale.zh-CN.yml +9 -0
  214. data/config/routes.rb +162 -0
  215. data/db/migrate/20210830081842_create_educode_sales_staffs.rb +9 -0
  216. data/db/migrate/20210831022421_create_educode_sales_sale_trends.rb +13 -0
  217. data/db/migrate/20210831085201_create_educode_sales_commons.rb +11 -0
  218. data/db/migrate/20210901025628_create_educode_sales_roles.rb +19 -0
  219. data/db/migrate/20210901031626_create_educode_sales_market_areas.rb +10 -0
  220. data/db/migrate/20210902061835_create_educode_sales_role_areas.rb +11 -0
  221. data/db/migrate/20210902064029_create_educode_sales_permissions.rb +12 -0
  222. data/db/migrate/20210902064109_create_educode_sales_role_permissions.rb +62 -0
  223. data/db/migrate/20210902073832_create_educode_sales_businesses.rb +11 -0
  224. data/db/migrate/20210902080535_create_educode_sales_places.rb +10 -0
  225. data/db/migrate/20210902080918_create_educode_sales_follow_ups.rb +20 -0
  226. data/db/migrate/20210902101022_create_educode_sales_teachers.rb +20 -0
  227. data/db/migrate/20210902103331_create_educode_sales_teacher_follows.rb +15 -0
  228. data/db/migrate/20210903015810_create_educode_sales_sale_plans.rb +14 -0
  229. data/db/migrate/20210903020721_create_educode_sales_sale_reports.rb +21 -0
  230. data/db/migrate/20210903021458_create_educode_sales_operation_plans.rb +14 -0
  231. data/db/migrate/20210903021710_create_educode_sales_operation_reports.rb +19 -0
  232. data/db/migrate/20210903022055_create_educode_sales_operation_trends.rb +13 -0
  233. data/db/migrate/20210903032011_create_educode_sales_activities.rb +16 -0
  234. data/db/migrate/20210906104001_create_educode_sales_money_plans.rb +18 -0
  235. data/db/migrate/20210906105154_create_educode_sales_place_areas.rb +10 -0
  236. data/db/migrate/20210908014953_create_educode_sales_key_people.rb +21 -0
  237. data/db/migrate/20210912061148_add_audit_user_id_to_sales_reports.rb +11 -0
  238. data/db/migrate/20210913070728_create_educode_sales_activity_teachers.rb +11 -0
  239. data/db/migrate/20210913071607_create_educode_sales_course_subjects.rb +14 -0
  240. data/lib/educode_sales/engine.rb +5 -0
  241. data/lib/educode_sales/version.rb +3 -0
  242. data/lib/educode_sales.rb +5 -0
  243. data/lib/tasks/educode_sales_tasks.rake +4 -0
  244. metadata +342 -0
@@ -0,0 +1,69 @@
1
+ require_dependency "educode_sales/application_controller"
2
+
3
+ module EducodeSales
4
+ class RolesController < ApplicationController
5
+ # before_action :authenticate_admin
6
+
7
+ def index
8
+ respond_to do |format|
9
+ format.html do
10
+ end
11
+ format.json do
12
+ @roles = Role.all
13
+ end
14
+ end
15
+ end
16
+
17
+ def create
18
+ role = Role.new(name: params[:name])
19
+ role.role_areas.build([{ clazz: 'Business' }, { clazz: 'SalePlan' }, { clazz: 'Teacher' }, { clazz: 'Operation' }])
20
+ if role.save
21
+ render_success
22
+ else
23
+ render_failure role
24
+ end
25
+ end
26
+
27
+ def new
28
+ render layout: false
29
+ end
30
+
31
+ def edit
32
+ role = Role.find(params[:id])
33
+ @permissions = role.permissions.pluck(:id)
34
+ @areas = role.role_areas.map { |d| "#{d.clazz}-#{d.level}" }
35
+ render layout: false
36
+ end
37
+
38
+ def update
39
+ permissions = []
40
+ role = Role.find(params[:id])
41
+ params[:permission].each do |d|
42
+ d[1].each do |c|
43
+ permissions << Permission.find_by(subject: d[0], action: c[1])
44
+ end
45
+ end
46
+ role.permissions = permissions
47
+ role.save
48
+ render json: { success: true }
49
+ end
50
+
51
+ def destroy
52
+ role = Role.find(params[:id])
53
+ role.destroy
54
+ render_success
55
+ rescue ActiveRecord::DeleteRestrictionError => e
56
+ render_failure '该角色已有用户存在,不能再删除'
57
+ end
58
+
59
+ def view
60
+ role = Role.find(params[:id])
61
+ role.role_areas.find_by(clazz: 'Business').update(level: params[:business])
62
+ role.role_areas.find_by(clazz: 'Operation').update(level: params[:operation])
63
+ role.role_areas.find_by(clazz: 'SalePlan').update(level: params[:sale_plan])
64
+ role.role_areas.find_by(clazz: 'Teacher').update(level: params[:teacher])
65
+ render_success
66
+ end
67
+
68
+ end
69
+ end
@@ -0,0 +1,133 @@
1
+ require_dependency "educode_sales/application_controller"
2
+
3
+ module EducodeSales
4
+ class SaleReportsController < ApplicationController
5
+
6
+ def create
7
+ if params[:month].present?
8
+ sale_report = @current_admin.sale_reports.build(month: Date.today.beginning_of_month)
9
+ else
10
+ sale_report = @current_admin.sale_reports.build(month: Date.today.beginning_of_month, weekly: Time.now.strftime('%W').to_i)
11
+ end
12
+
13
+ sale_report.finish_rate = params[:finish_rate]
14
+ sale_report.client = params[:client]
15
+ sale_report.content = params[:content]
16
+ sale_report.amount = params[:amount]
17
+ if sale_report.save
18
+ render_success
19
+ else
20
+ render_failure sale_report
21
+ end
22
+ end
23
+
24
+ def show
25
+ @sale_report = SaleReport.find(params[:id])
26
+ render layout: false
27
+ end
28
+
29
+ def destroy
30
+ sale_report = @current_admin.sale_reports.find(params[:id])
31
+ if sale_report.destroy
32
+ render_success
33
+ else
34
+ render_failure sale_report
35
+ end
36
+ end
37
+
38
+ def index
39
+ authorize! :read, SalePlan
40
+ respond_to do |format|
41
+ format.html do
42
+ end
43
+ format.json do
44
+ if @current_admin.is_admin?
45
+ @sale_reports = SaleReport
46
+ else
47
+ level = @current_admin.role.role_areas.find_by(clazz: '销售计划').level
48
+ case level
49
+ when '自己'
50
+ @sale_reports = SaleReport.where(staff_id: @current_admin.id)
51
+ when '区域'
52
+ staff_ids = Staff.joins(department: :school).where("school.province in ?", staff.areas.pluck(:name)).pluck(:id)
53
+ @sale_reports = SaleReport.where("staff_id in ?", staff_ids)
54
+ else
55
+ @sale_reports = SaleReport
56
+ end
57
+ end
58
+ if params[:clazz] == 'week'
59
+ @sale_reports = @sale_reports.where.not(weekly: nil)
60
+ else
61
+ @sale_reports = @sale_reports.where(weekly: nil)
62
+ end
63
+ if params[:q].present? && params[:q][:staff_id].present?
64
+ @sale_reports = @sale_reports.where(staff_id: params[:q][:staff_id])
65
+ end
66
+ if params[:q].present? && params[:q][:year].present?
67
+ @sale_reports = @sale_reports.where("month >= ? and month <= ?", "#{params[:q][:year]}-01-01 00:00:00".to_date, "#{params[:q][:year]}-12-31 23:59:00".to_date)
68
+ end
69
+ if params[:q].present? && params[:q][:month].present?
70
+ @sale_reports = @sale_reports.where("month = ?", "#{params[:q][:month]}-01 00:00:00".to_date)
71
+ end
72
+ if params[:sort].present? && params[:sort][:field]
73
+ @sale_reports = @sale_reports.order("#{params[:sort][:field]} #{params[:sort][:order]}")
74
+ else
75
+ @sale_reports = @sale_reports.order("updated_at desc")
76
+ end
77
+ @sale_reports = @sale_reports.page(params[:page]).per(params[:per_page])
78
+ end
79
+ end
80
+ end
81
+
82
+
83
+ def edit
84
+ @sale_report = @current_admin.sale_reports.find(params[:id])
85
+ render layout: false
86
+ end
87
+
88
+ def update
89
+ sale_report = @current_admin.sale_reports.find(params[:id])
90
+ sale_report.content = params[:content]
91
+ if sale_report.save
92
+ render_success
93
+ else
94
+ render_failure sale_report
95
+ end
96
+ end
97
+
98
+ def update_audit
99
+ authorize! :audit, EducodeSales::SaleReport
100
+ sale_report = SaleReport.find(params[:id])
101
+ sale_report.assign_attributes(audit_params)
102
+ if sale_report.level1_opinion_changed? || sale_report.level1_score_changed?
103
+ sale_report.audit1_user_id = @current_admin.id
104
+ end
105
+ if sale_report.level2_opinion_changed? || sale_report.level2_score_changed?
106
+ sale_report.audit2_user_id = @current_admin.id
107
+ end
108
+ if sale_report.level3_opinion_changed? || sale_report.level3_score_changed?
109
+ sale_report.audit3_user_id = @current_admin.id
110
+ end
111
+ if sale_report.save
112
+ render_success
113
+ else
114
+ render_failure sale_report
115
+ end
116
+ end
117
+
118
+ def audit
119
+ @sale_report = SaleReport.find(params[:id])
120
+ render layout: false
121
+ end
122
+
123
+ def plans
124
+ sale_report = SaleReport.find(params[:id])
125
+ @sale_plans = SalePlan.where(staff_id: sale_report.staff_id, month: sale_report.month, weekly: sale_report.weekly).order("updated_at desc").page(params[:page]).per(params[:per_page])
126
+ end
127
+
128
+ private
129
+ def audit_params
130
+ params.permit(:level1_opinion, :level2_opinion, :level3_opinion, :level1_score, :level2_score, :level3_score)
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,45 @@
1
+ require_dependency "educode_sales/application_controller"
2
+
3
+ module EducodeSales
4
+ class SaleTrendsController < ApplicationController
5
+ # authorize_resource class: false
6
+
7
+ def trends
8
+ # authorize! :trends, EducodeSales::SaleTrend
9
+ @year = params[:year] ? params[:year] : Time.now.year
10
+ @years = (1..(Time.now.year - 2020)).map { |d| 2020 + d }
11
+ year_time = "#{@year}-01-01 00:00:00"
12
+ @sale_trend = SaleTrend.find_or_create_by(year: @year)
13
+ @business_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.created_at >= ?", year_time).sum(:total_amount)
14
+ stage_ids = Common.where(clazz: '商机阶段', name: ['已中标','已签单','已验收','回款中', '服务中','已结束']).pluck(:id)
15
+ @goal_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.created_at >= ? AND educode_sales_follow_ups.stage_id IN (?)", year_time, stage_ids).sum(:total_amount)
16
+ s_stage_ids = Common.where(clazz: '商机阶段', name: ['已签单','已验收','回款中', '服务中','已结束']).pluck(:id)
17
+ @service_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.created_at >= ? AND educode_sales_follow_ups.stage_id IN (?)", year_time, s_stage_ids).sum(:total_amount)
18
+ @return_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.created_at >= ?", year_time).sum(:return_money)
19
+ a = Common.where(clazz: '商机类型', name: 'A类').pluck(:id)
20
+ @a_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.created_at >= ? AND educode_sales_follow_ups.clazz_id IN (?)", year_time, a).sum(:total_amount)
21
+ b = Common.where(clazz: '商机类型', name: 'B类').pluck(:id)
22
+ @b_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.created_at >= ? AND educode_sales_follow_ups.clazz_id IN (?)", year_time, b).sum(:total_amount)
23
+ end
24
+
25
+ def sale_trends
26
+ sale_trend = SaleTrend.find_by(year: params[:year])
27
+ if sale_trend.update(sale_trend_params)
28
+ render_success
29
+ else
30
+ render_failure sale_trend
31
+ end
32
+ end
33
+
34
+ def operations
35
+
36
+ end
37
+
38
+ private
39
+
40
+ def sale_trend_params
41
+ params.permit(:chance_money, :ballot_money, :sign_money, :returned_money)
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,64 @@
1
+ require_dependency "educode_sales/application_controller"
2
+
3
+ module EducodeSales
4
+ class SalesController < ApplicationController
5
+ # load_and_authorize_resource
6
+ # authorize_resource class: false
7
+
8
+ def index
9
+ # authorize! :sales, Staff
10
+ respond_to do |format|
11
+ format.html do
12
+ end
13
+ format.json do
14
+ common = Common.find_by(clazz: 'staff_type', name: '销售')
15
+ @a_clazz = Common.find_by(clazz: 'business_type', name: 'A类')
16
+ @b_clazz = Common.find_by(clazz: 'business_type', name: 'B类')
17
+ @step_ids = Common.where(name: %w(已中标 已签单 已验收 回款中 服务中 已结束), clazz: 'business_step').pluck(:id)
18
+
19
+ @staffs = Staff.where(job_type: common.id).page(params[:page]).per(params[:per_page])
20
+ end
21
+ end
22
+ end
23
+
24
+ def trends
25
+ @year = params[:year] ? params[:year] : Time.now.year
26
+ @sale_trend = SaleTrend.find_or_create_by(year: @year)
27
+ end
28
+
29
+ def sale_trends
30
+ sale_trend = SaleTrend.find_by(year: params[:year])
31
+ if sale_trend.update(sale_trend_params)
32
+ render_success
33
+ else
34
+ render_failure sale_trend
35
+ end
36
+ end
37
+
38
+ def operations
39
+ respond_to do |format|
40
+ format.html do
41
+ end
42
+ format.json do
43
+ common_id = Common.where(clazz: 'staff_type', name: ['销售', '运营']).pluck(:id)
44
+ @staffs = Staff.where(job_type: common_id).page(params[:page]).per(params[:per_page])
45
+ end
46
+ end
47
+ end
48
+
49
+ def school
50
+ render layout: false
51
+ end
52
+
53
+ def xschool
54
+ render layout: false
55
+ end
56
+
57
+ private
58
+
59
+ def sale_trend_params
60
+ params.permit(:chance_money, :ballot_money, :sign_money, :returned_money)
61
+ end
62
+
63
+ end
64
+ end
@@ -0,0 +1,51 @@
1
+ require_dependency "educode_sales/application_controller"
2
+
3
+ module EducodeSales
4
+ class SessionsController < ApplicationController
5
+ layout "educode_sales/login"
6
+ skip_before_action :authenticate_request
7
+
8
+ def login
9
+ end
10
+
11
+ def create
12
+ user = User.find_by(login: params[:account])
13
+ if user&.admin
14
+ check_pwd(user)
15
+ elsif user
16
+ staff = Staff.find_by(user_id: user.id)
17
+ if staff
18
+ check_pwd(user, staff)
19
+ else
20
+ render_failure('账号不存在')
21
+ end
22
+ else
23
+ render_failure('账号或密码错误')
24
+ end
25
+ end
26
+
27
+ def logout
28
+ session[:admin_id] = nil
29
+ redirect_to login_path
30
+ end
31
+
32
+ private
33
+ def check_pwd(user, staff=nil)
34
+ if user.check_password?(params[:password])
35
+ if staff.nil?
36
+ staff = Staff.find_or_initialize_by(user_id: user.id)
37
+ staff.is_admin = true
38
+ staff.save unless staff.persisted?
39
+ end
40
+ session[:admin_id] = staff.id
41
+ return render_success
42
+ else
43
+ return render_failure('账号或密码错误')
44
+ end
45
+ end
46
+ end
47
+
48
+ end
49
+
50
+
51
+
@@ -0,0 +1,81 @@
1
+ require_dependency "educode_sales/application_controller"
2
+
3
+ module EducodeSales
4
+ class StaffsController < ApplicationController
5
+
6
+ def index
7
+ respond_to do |format|
8
+ format.html do
9
+ end
10
+ format.json do
11
+ @staffs = Staff.where(is_admin: false).page(params[:page]).per(params[:per_page])
12
+ end
13
+ end
14
+ end
15
+
16
+ def create
17
+ user = User.find(params[:id])
18
+ staff = Staff.new(user_id: user.id)
19
+ if staff.save
20
+ render_success
21
+ else
22
+ render_failure staff
23
+ end
24
+ end
25
+
26
+ def edit
27
+ @staff = Staff.find(params[:id])
28
+ gon.area_ids = @staff.area_ids
29
+ gon.areas = Common.where(clazz: 'area').map { |d| { value: d.id, title: d.name } } #.unshift({value: -1, title: '全国'})
30
+ @staff_types = Common.where(clazz: 'staff_type').pluck(:name, :id)
31
+ render layout: false
32
+ end
33
+
34
+ def new
35
+ render layout: false
36
+ end
37
+
38
+ def destroy
39
+ staff = Staff.find(params[:id])
40
+ staff.destroy
41
+ render_success
42
+ rescue ActiveRecord::DeleteRestrictionError => e
43
+ render_failure '该用户已有数据产生,暂不能删除'
44
+ end
45
+
46
+ def disable
47
+ staff = Staff.find(params[:id])
48
+ staff.update(expired_at: Time.now.days_ago(1))
49
+ render_success
50
+ end
51
+
52
+ def update
53
+ staff = Staff.find(params[:id])
54
+ staff.assign_attributes(role_id: params[:role_id], job_type: params[:job_type], enabled_at: params[:enabled_at])
55
+ staff.expired_at = staff.enabled_at.months_since(params[:month].to_i)
56
+ commons = []
57
+ params[:area_ids].each do |d|
58
+ commons << Common.find(d)
59
+ end
60
+ staff.areas = commons
61
+ if staff.save
62
+ render_success
63
+ else
64
+ render_failure staff
65
+ end
66
+ end
67
+
68
+ def follow_up_schools
69
+ staff = Staff.find(params[:id])
70
+ @schools = EducodeSales::Business.joins(:last_follow_up, :department).where("educode_sales_follow_ups.staff_id = #{staff.id}").group("school_id").select("school_id, max(educode_sales_follow_ups.updated_at) AS updated_at").page(params[:page]).per(params[:per_page])
71
+ @count = EducodeSales::Business.joins(:last_follow_up, :department).where("educode_sales_follow_ups.staff_id = #{staff.id}").group("school_id").count
72
+ end
73
+
74
+ def follow_up_departments
75
+ staff = Staff.find(params[:id])
76
+ @schools = EducodeSales::Business.joins(:last_follow_up, [department: :school]).where("educode_sales_follow_ups.staff_id = #{staff.id}").select("departments.name, schools.name AS school, educode_sales_follow_ups.updated_at").page(params[:page]).per(params[:per_page])
77
+ end
78
+
79
+
80
+ end
81
+ end