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,167 @@
1
+ require_dependency "educode_sales/application_controller"
2
+
3
+ module EducodeSales
4
+ class TeachersController < ApplicationController
5
+
6
+ def add_keys
7
+ follow_up = FollowUp.find(params[:follow_up_id])
8
+ if follow_up.key_people_count == 0
9
+ last_follow = follow_up.business.follow_ups.where.not(id: follow_up.id).order("id desc").first
10
+ if last_follow.present? && last_follow.key_people_count > 0
11
+ @person = last_follow.key_person.last
12
+ gon.teacher = "t-#{@person.teacher_id}"
13
+ gon.teachers = { value: "t-#{@person.teacher_id}", name: @person.teacher.name }
14
+ end
15
+ end
16
+ @attitudes = Common.where(clazz: 'key_attitude').order("position").pluck(:name, :id)
17
+ gon.attitudes = @attitudes
18
+ render layout: false
19
+ end
20
+
21
+ def index
22
+ respond_to do |format|
23
+ format.html do
24
+
25
+ # @teachers = Teacher.joins(:user).map { |d| [d.user.real_name, d.id] }
26
+ end
27
+ format.json do
28
+ @teachers = Teacher.where(is_key: false)
29
+
30
+ if params[:q].present? && params[:q][:name].present?
31
+ @teachers = @teachers.where("educode_sales_teachers.name like ?", "%#{params[:q][:name]}%")
32
+ end
33
+ if params[:q].present? && params[:q][:professional_title].present?
34
+ @teachers = @teachers.where("educode_sales_teachers.professional_title like ?", "%#{params[:q][:professional_title]}%")
35
+ end
36
+ if params[:q].present? && params[:q][:regist_at].present?
37
+ @teachers = @teachers.where("educode_sales_teachers.regist_at like ?", "%#{params[:q][:regist_at]}%")
38
+ end
39
+ if params[:q].present? && params[:q][:key_attitude].present?
40
+ @teachers = @teachers.where("educode_sales_teachers.attitude_id = ?", "#{params[:q][:key_attitude]}")
41
+ end
42
+ if params[:q].present? && params[:q][:teacher_source].present?
43
+ @teachers = @teachers.where("educode_sales_teachers.source_id = ?", "#{params[:q][:teacher_source]}")
44
+ end
45
+ if params[:q].present? && params[:q][:school].present?
46
+ departments_ids = Department.joins(:school).where("schools.name like ?", "%#{params[:q][:school]}%").pluck(:id)
47
+ @teachers = @teachers.joins(:department).where("departments.id in (?)", departments_ids)
48
+ end
49
+ if params[:q].present? && params[:q][:area].present?
50
+ p = EducodeSales::Common.where(id: params[:q][:area]).pluck(:name)[0]
51
+ @teachers = @teachers.joins("
52
+ JOIN departments ON educode_sales_teachers.department_id = departments.id
53
+ JOIN schools ON departments.school_id = schools.id
54
+ ").where("province = ?", p)
55
+ end
56
+ if params[:activity_id].present?
57
+ @teachers = @teachers.joins(:activity_teachers).where("educode_sales_activity_teachers.activity_id = ?", params[:activity_id])
58
+ end
59
+ if params[:q].present? && params[:q][:date].present?
60
+ date = params[:q][:date].split(" - ")
61
+ @teachers = @teachers.where("created_at > ? AND created_at < ?", date[0], date[1])
62
+ end
63
+
64
+ @teachers = @teachers.page(params[:page]).per(params[:per_page])
65
+
66
+ end
67
+ end
68
+ end
69
+
70
+ def new
71
+ render layout: false
72
+ end
73
+
74
+ def create
75
+ department = Department.find(params[:department_id])
76
+ teacher = @current_admin.teachers.build(teacher_params)
77
+ teacher.department_id = department.id
78
+ if params[:user_id].present?
79
+ user = User.find(params[:user_id])
80
+ teacher.user_id = user.id
81
+ teacher.regist_at = user.created_on
82
+ else
83
+ teacher.regist_at = Time.now
84
+ end
85
+
86
+ if params[:activity_id].present? && params[:user_id].present?
87
+ # 把老师添加到活动列表,提取判断下老师列表是否存在
88
+ teacher = Teacher.find_by(user_id: params[:user_id])
89
+ if teacher
90
+ teacher.activity_teachers.build(activity_id: params[:activity_id])
91
+ end
92
+ end
93
+
94
+ if teacher.save
95
+ render_success
96
+ else
97
+ render_failure teacher
98
+ end
99
+ end
100
+
101
+ def destroy
102
+ teacher = Teacher.find(params[:id])
103
+ teacher.destroy
104
+ render_success
105
+ end
106
+
107
+ def edit
108
+ @teacher = Teacher.find(params[:id])
109
+ gon.department = { value: @teacher.department_id, name: "#{@teacher.department.school.name}-#{@teacher.department.name}" }
110
+ gon.value = @teacher.department_id
111
+ render layout: false
112
+ end
113
+
114
+ def search_new
115
+ render layout: false
116
+ end
117
+
118
+ def add_courses
119
+ render layout: false
120
+ end
121
+
122
+ def add_event
123
+ render layout: false
124
+ end
125
+
126
+ def show_follow
127
+ render layout: false
128
+ end
129
+
130
+ def show_class
131
+ render layout: false
132
+ end
133
+
134
+ def new_follow_record
135
+ render layout: false
136
+ end
137
+
138
+ def show_follow_record
139
+ render layout: false
140
+ end
141
+
142
+ def edit_follow_record
143
+ render layout: false
144
+ end
145
+
146
+ def course_list
147
+ user = User.find_by(id: params[:user_id])
148
+ if user
149
+ @courses = Course.joins(:course_members).where(course_members: {user_id: user.id}).page(params[:page]).per(params[:per_page])
150
+ else
151
+ @courses = Course.none
152
+ end
153
+ end
154
+
155
+
156
+ def activities
157
+ teacher = Teacher.find(params[:id])
158
+ @activities = teacher.activities.page(params[:page]).per(params[:per_page])
159
+ end
160
+
161
+ private
162
+ def teacher_params
163
+ params.permit(:name, :professional_title, :job, :source_id)
164
+ end
165
+
166
+ end
167
+ end
@@ -0,0 +1,4 @@
1
+ module EducodeSales
2
+ module ActivitiesHelper
3
+ end
4
+ end
@@ -0,0 +1,44 @@
1
+ module EducodeSales
2
+ module ApplicationHelper
3
+
4
+ def current?(css, path)
5
+ if path.is_a?(Array) ? (current_page?(path.first) || request.path == path.last) : current_page?(path)
6
+ css
7
+ else
8
+ ' '
9
+ end
10
+ end
11
+
12
+ def url_to_avatar(source)
13
+ return "" if source.blank?
14
+ if File.exist?(disk_filename(source&.class, source&.id)) && File.file?(disk_filename(source&.class, source&.id))
15
+ ctime = File.ctime(disk_filename(source&.class, source&.id)).to_i
16
+ if source.class.to_s == 'User'
17
+ File.join(relative_path, ["#{source&.class}", "#{source&.id}"]) + "?t=#{ctime}"
18
+ else
19
+ File.join("images/avatars", ["#{source&.class}", "#{source&.id}"]) + "?t=#{ctime}"
20
+ end
21
+ elsif source.class.to_s == 'User'
22
+ str = source.user_extension.try(:gender).to_i == 0 ? "b" : "g"
23
+ File.join(relative_path, "#{source.class}", str)
24
+ elsif source.class.to_s == 'Subject'
25
+ File.join("images","educoder", "index", "subject", "subject#{rand(19)}.jpg")
26
+ elsif source.class.to_s == 'Shixun'
27
+ File.join("images","educoder", "index", "shixun", "shixun#{rand(23)}.jpg")
28
+ end
29
+ end
30
+
31
+
32
+ def disk_filename(source_type,source_id,image_file=nil)
33
+ File.join(storage_path, "#{source_type}", "#{source_id}")
34
+ end
35
+
36
+ def storage_path
37
+ File.join(Rails.root, "public", "images", relative_path)
38
+ end
39
+
40
+ def relative_path
41
+ "avatars"
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,4 @@
1
+ module EducodeSales
2
+ module BusinessHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module EducodeSales
2
+ module HomeHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module EducodeSales
2
+ module SessionsHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module EducodeSales
2
+ module TeachersHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module EducodeSales
2
+ class ApplicationJob < ActiveJob::Base
3
+ end
4
+ end
@@ -0,0 +1,6 @@
1
+ module EducodeSales
2
+ class ApplicationMailer < ActionMailer::Base
3
+ default from: 'from@example.com'
4
+ layout 'mailer'
5
+ end
6
+ end
@@ -0,0 +1,54 @@
1
+ class Ability
2
+ include CanCan::Ability
3
+
4
+ def initialize(staff)
5
+ # Define abilities for the passed in user here. For example:
6
+ #
7
+ # user ||= User.new # guest user (not logged in)
8
+ alias_action :index, :trends, :show, :to => :read
9
+
10
+ if staff.is_admin
11
+ can :manage, :all
12
+ else
13
+ staff.role.permissions.each do |ps|
14
+ can ps.action.to_sym, "EducodeSales::#{ps.subject}".constantize
15
+ # level = @current_admin.role.role_areas.find_by(clazz: 'name')&.level
16
+ # if level == '自己'
17
+ # can ps.action.to_sym, "EducodeSales::#{ps.subject}".constantize, staff_id: staff.id
18
+ # elsif level == '区域'
19
+ # schools = School.where(province: staff.areas.pluck(:name)).pluck(:id)
20
+ # can ps.action.to_sym, "EducodeSales::#{ps.subject}".constantize, staff_id: staff.id
21
+ # else
22
+ # end
23
+ # case level
24
+ # when '自己'
25
+ # @businesses = Business.where(staff_id: @current_admin.id)
26
+ # when '区域'
27
+ # staff_ids = Staff.joins(department: :school).where("school.province in ?", staff.areas.pluck(:name)).pluck(:id)
28
+ # @businesses = Business.joins("JOIN departments ON businesses.department_id = departments.id").where("departments.school_id in ?", school_ids)
29
+ # else
30
+ # @businesses = Business
31
+ # end
32
+
33
+ end if staff.role
34
+ end
35
+ #
36
+ # The first argument to `can` is the action you are giving the user
37
+ # permission to do.
38
+ # If you pass :manage it will apply to every action. Other common actions
39
+ # here are :read, :create, :update and :destroy.
40
+ #
41
+ # The second argument is the resource the user can perform the action on.
42
+ # If you pass :all it will apply to every resource. Otherwise pass a Ruby
43
+ # class of the resource.
44
+ #
45
+ # The third argument is an optional hash of conditions to further filter the
46
+ # objects.
47
+ # For example, here the user can only update published articles.
48
+ #
49
+ # can :update, Article, :published => true
50
+ #
51
+ # See the wiki for details:
52
+ # https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities
53
+ end
54
+ end
@@ -0,0 +1,6 @@
1
+ module EducodeSales
2
+ class Activity < ApplicationRecord
3
+ belongs_to :staff
4
+ has_many :teachers, dependent: :restrict_with_exception
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module EducodeSales
2
+ class ActivityTeacher < ApplicationRecord
3
+ belongs_to :activity, counter_cache: true
4
+ belongs_to :teacher, counter_cache: true
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ module EducodeSales
2
+ class ApplicationRecord < ActiveRecord::Base
3
+ self.abstract_class = true
4
+ end
5
+ end
@@ -0,0 +1,11 @@
1
+ module EducodeSales
2
+ class Business < ApplicationRecord
3
+ belongs_to :staff
4
+ belongs_to :department
5
+ belongs_to :place, optional: true
6
+ belongs_to :last_follow_up, class_name: 'FollowUp', optional: true
7
+
8
+ has_many :sale_plans, dependent: :destroy
9
+ has_many :follow_ups, dependent: :destroy
10
+ end
11
+ end
@@ -0,0 +1,32 @@
1
+ module EducodeSales
2
+ class Common < ApplicationRecord
3
+ acts_as_list scope: [:clazz]
4
+
5
+
6
+ validates :name, uniqueness: {scope: :clazz, message: '已存在'}
7
+
8
+ enum clazz: {
9
+ '商机类型': 'business_type',
10
+ '商机阶段': 'business_step',
11
+ '关键人态度': 'key_attitude',
12
+ '教师来源': 'teacher_source' ,
13
+ '教师态度': 'teacher_attitude',
14
+ '课堂建设': 'course_build',
15
+ '跟进手段': 'contact',
16
+ '人员类型': 'staff_type',
17
+ '区域': 'area'
18
+ }
19
+
20
+ def self.job_type_name
21
+ self.where(clazz: 'staff_type', name: ['销售', '运营']).pluck(:id, :name).to_h
22
+ end
23
+
24
+ def self.teacher_source_name
25
+ self.where(clazz: 'teacher_source').pluck(:id, :name).to_h
26
+ end
27
+
28
+ def self.key_attitude_name
29
+ self.where(clazz: 'key_attitude').pluck(:id, :name).to_h
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,5 @@
1
+ module EducodeSales
2
+ class CourseSubject < ApplicationRecord
3
+ belongs_to :teacher
4
+ end
5
+ end
@@ -0,0 +1,14 @@
1
+ module EducodeSales
2
+ class FollowUp < ApplicationRecord
3
+ belongs_to :business, counter_cache: true
4
+ belongs_to :place, optional: true
5
+ has_many :money_plans
6
+ has_many :key_person
7
+ has_many :teachers, through: :key_person
8
+ belongs_to :staff
9
+ belongs_to :stage, class_name: 'Common'
10
+ belongs_to :clazz, class_name: 'Common'
11
+
12
+
13
+ end
14
+ end
@@ -0,0 +1,11 @@
1
+ module EducodeSales
2
+ class KeyPerson < ApplicationRecord
3
+ belongs_to :teacher
4
+ belongs_to :attitude, class_name: 'Common'
5
+ belongs_to :follow_up, counter_cache: true
6
+
7
+ enum sex: ['男', '女']
8
+
9
+ validates :teacher_id, uniqueness: {scope: :follow_up_id, allow_blank: true}
10
+ end
11
+ end
@@ -0,0 +1,6 @@
1
+ module EducodeSales
2
+ class MarketArea < ApplicationRecord
3
+ belongs_to :staff
4
+ belongs_to :area, class_name: 'Common'
5
+ end
6
+ end
@@ -0,0 +1,22 @@
1
+ module EducodeSales
2
+ class MoneyPlan < ApplicationRecord
3
+ belongs_to :staff
4
+ belongs_to :follow_up, counter_cache: true
5
+
6
+ enum clazz: ['未完成', '已完成']
7
+
8
+ after_save :update_return_money
9
+ after_destroy :update_return_money
10
+
11
+
12
+ private
13
+
14
+ def update_return_money
15
+ if self.clazz == '已完成'
16
+ follow_up.update(return_money: follow_up.money_plans.where(clazz: '已完成').sum(:amount))
17
+ all_follow_ups_ids = follow_up.business.follow_ups.pluck(:id)
18
+ follow_up.business.update(return_money: EducodeSales::MoneyPlan.where(clazz: '已完成', follow_up_id: all_follow_ups_ids).sum(:amount))
19
+ end
20
+ end
21
+ end
22
+ end