educode_sales 0.7.2 → 0.7.5

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 (60) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/educode_sales/assessment.png +0 -0
  3. data/app/assets/images/educode_sales/indexlogo.png +0 -0
  4. data/app/controllers/educode_sales/assessments_controller.rb +490 -0
  5. data/app/controllers/educode_sales/businesses_controller.rb +13 -4
  6. data/app/controllers/educode_sales/customers_controller.rb +3 -0
  7. data/app/controllers/educode_sales/follow_ups_controller.rb +13 -1
  8. data/app/controllers/educode_sales/home_controller.rb +4 -3
  9. data/app/controllers/educode_sales/money_plans_controller.rb +2 -0
  10. data/app/controllers/educode_sales/plans_controller.rb +1 -0
  11. data/app/controllers/educode_sales/results_controller.rb +54 -0
  12. data/app/controllers/educode_sales/roles_controller.rb +4 -1
  13. data/app/controllers/educode_sales/sessions_controller.rb +2 -1
  14. data/app/helpers/educode_sales/application_helper.rb +61 -0
  15. data/app/helpers/educode_sales/assessments_help.rb +52 -0
  16. data/app/models/educode_sales/assessments_setting.rb +28 -0
  17. data/app/models/educode_sales/business.rb +2 -1
  18. data/app/models/educode_sales/follow_up.rb +1 -1
  19. data/app/models/educode_sales/money_plan.rb +1 -0
  20. data/app/models/educode_sales/permission.rb +2 -1
  21. data/app/models/educode_sales/result.rb +4 -0
  22. data/app/models/educode_sales/role_area.rb +2 -1
  23. data/app/views/educode_sales/assessments/_progress.html.erb +433 -0
  24. data/app/views/educode_sales/assessments/_setup.html.erb +331 -0
  25. data/app/views/educode_sales/assessments/edit.html.erb +238 -0
  26. data/app/views/educode_sales/assessments/get_export_data.json.jbuilder +197 -0
  27. data/app/views/educode_sales/assessments/index.html.erb +63 -0
  28. data/app/views/educode_sales/assessments/index.json.jbuilder +26 -0
  29. data/app/views/educode_sales/assessments/new.html.erb +310 -0
  30. data/app/views/educode_sales/assessments/progress.json.jbuilder +372 -0
  31. data/app/views/educode_sales/businesses/edit_follow_record.html.erb +150 -114
  32. data/app/views/educode_sales/businesses/get_export_data.json.jbuilder +1 -0
  33. data/app/views/educode_sales/businesses/index.html.erb +25 -19
  34. data/app/views/educode_sales/businesses/index.json.jbuilder +1 -0
  35. data/app/views/educode_sales/businesses/new_follow_record.html.erb +163 -126
  36. data/app/views/educode_sales/businesses/show_follow.html.erb +25 -20
  37. data/app/views/educode_sales/businesses/show_follow.json.jbuilder +1 -0
  38. data/app/views/educode_sales/businesses/show_follow_record.html.erb +8 -1
  39. data/app/views/educode_sales/places/index.html.erb +5 -3
  40. data/app/views/educode_sales/plans/_monthPlan.html.erb +3 -1
  41. data/app/views/educode_sales/plans/new_month.html.erb +2 -0
  42. data/app/views/educode_sales/plans/new_week.html.erb +5 -1
  43. data/app/views/educode_sales/results/edit.html.erb +111 -0
  44. data/app/views/educode_sales/results/index.html.erb +0 -0
  45. data/app/views/educode_sales/results/index.json.jbuilder +13 -0
  46. data/app/views/educode_sales/results/new.html.erb +58 -0
  47. data/app/views/educode_sales/results/show.json.jbuilder +9 -0
  48. data/app/views/educode_sales/roles/edit.html.erb +26 -18
  49. data/app/views/educode_sales/sale_reports/index.json.jbuilder +1 -0
  50. data/app/views/layouts/educode_sales/application.html.erb +18 -12
  51. data/app/views/layouts/educode_sales/login.html.erb +1 -1
  52. data/config/routes.rb +18 -1
  53. data/db/migrate/20210902064109_create_educode_sales_role_permissions.rb +9 -1
  54. data/db/migrate/20220314053856_add_service_start_time_to_follow_ups.rb +6 -0
  55. data/db/migrate/20220314074354_add_service_time_long_to_follow_ups.rb +5 -0
  56. data/db/migrate/20220402020233_create_educode_sales_assessments_settings.rb +27 -0
  57. data/db/migrate/20220411021641_add_new_column_assessments_settings.rb +20 -0
  58. data/db/migrate/20220413090940_add_september_progress_to_assessment_settings.rb +5 -0
  59. data/lib/educode_sales/version.rb +1 -1
  60. metadata +31 -6
@@ -19,11 +19,11 @@
19
19
  <label class="layui-form-label required">项目类型</label>
20
20
  <%if EducodeSales::FollowUp.where(business_id: @follow_up.business.id,clazz_id: EducodeSales::Common.find_by(name: @o_name).id).count >= 2 %>
21
21
  <div class="layui-input-inline">
22
- <%= select_tag "clazz_id", options_for_select([[@o_name,EducodeSales::Common.find_by(name: @o_name).id]]),:disabled => true, class: 'required' %>
22
+ <%= select_tag "clazz_id", options_for_select([[@o_name, EducodeSales::Common.find_by(name: @o_name).id]]), { 'lay-filter': 'clazz_id', class: 'required', :disabled => true } %>
23
23
  </div>
24
24
  <%else %>
25
25
  <div class="layui-input-inline">
26
- <%= select_tag "clazz_id", options_for_select(@clazz, @follow_up&.clazz_id), class: 'required' %>
26
+ <%= select_tag "clazz_id", options_for_select(@clazz, @follow_up&.clazz_id), { 'lay-filter': 'clazz_id', class: 'required' } %>
27
27
  </div>
28
28
  <%end %>
29
29
  </div>
@@ -60,21 +60,29 @@
60
60
  <label class="layui-form-label">验收时间</label>
61
61
  <div class="layui-input-inline">
62
62
  <input type="text" class="layui-input" value="<%= @follow_up.reception_at %>" name="reception_at"
63
- id="reception_at_edit" placeholder="请选择日期">
63
+ id="reception_at_edit" placeholder="请选择日期">
64
64
  </div>
65
65
  </div>
66
66
  <br>
67
+ <div class="layui-inline service_show layui-hide">
68
+ <label class="layui-form-label required">服务期</label>
69
+ <div class="layui-input-inline">
70
+ <input type="text" class="layui-input required" id="service_time" name="service_time" placeholder=" - " autocomplete="off" value="<%= (@follow_up.service_start_time.present? && @follow_up.service_end_time.present?) ? (@follow_up.service_start_time.to_s + ' - ' + @follow_up.service_end_time.to_s) : '' %>">
71
+ </div>
72
+ </div>
73
+ <br class="service_show layui-hide">
67
74
  <div class="layui-inline">
68
75
  <label class="layui-form-label">总额(万)</label>
69
76
  <div class="layui-input-inline">
70
77
  <input name="total_amount" type="number" class="layui-input" value="<%= @follow_up.total_amount %>">
71
78
  </div>
72
- 客户采购支出的费用。总额的生命历程:1.在最初阶段,是商机的预算总额;2.在挂网阶段,是项目的挂网预算总额;3.在中标阶段,是项目的中标总额。 </div>
79
+ 客户采购支出的费用。总额的生命历程:1.在最初阶段,是商机的预算总额;2.在挂网阶段,是项目的挂网预算总额;3.在中标阶段,是项目的中标总额。
80
+ </div>
73
81
  <br>
74
82
  <div class="layui-inline">
75
83
  <label class="layui-form-label">合同额(万)</label>
76
84
  <div class="layui-input-inline">
77
- <input name="actual_amount" type="number" class="layui-input" placeholder="本单位的签单金额" value="<%= @follow_up.actual_amount %>">
85
+ <input name="actual_amount" type="number" class="layui-input" placeholder="本单位的签单金额" value="<%= @follow_up.actual_amount %>">
78
86
  </div>
79
87
  客户签给头歌的费用。合同额的生命历程:1.在中标之前,合同额都是0;2.在中标之后,实际与头歌签合同的金额。
80
88
  </div>
@@ -146,128 +154,156 @@
146
154
  </div>
147
155
 
148
156
  <script>
149
- layui.use(['form', 'table', 'upload', 'layer', 'laytpl', 'request', 'laydate', 'xmSelect'], function () {
150
- var form = layui.form,
151
- layer = layui.layer,
152
- table = layui.table,
153
- xmSelect = layui.xmSelect,
154
- laytpl = layui.laytpl,
155
- request = layui.request,
156
- laydate = layui.laydate,
157
- $ = layui.$;
158
-
159
- laydate.render({
160
- elem: '#invitation_at_edit'
161
- })
162
- laydate.render({
163
- elem: '#edit_year',
164
- type: 'year'
165
- })
157
+ layui.use(['form', 'table', 'upload', 'layer', 'laytpl', 'request', 'laydate', 'xmSelect'], function () {
158
+ var form = layui.form,
159
+ layer = layui.layer,
160
+ table = layui.table,
161
+ xmSelect = layui.xmSelect,
162
+ laytpl = layui.laytpl,
163
+ request = layui.request,
164
+ laydate = layui.laydate,
165
+ $ = layui.$;
166
166
 
167
- laydate.render({
168
- elem: '#reception_at_edit'
169
- });
167
+ flag =
168
+ <%=@follow_up&.clazz_id == EducodeSales::Common.where(extras: EducodeSales::Common::OTYPE).first&.id %>
169
+ if (flag) {
170
+ $(".service_show").removeClass('layui-hide')
171
+ }
170
172
 
171
- var sales_list = xmSelect.render({
172
- el: '#edit_assign_follow',
173
- remoteSearch: true,
174
- clickClose: true,
175
- delay: 1000,
176
- paging: true,
177
- pageRemote: true,
178
- filterable: true,
179
- remoteMethod: function (val, cb, show, pageIndex) {
180
- $.ajax( '/missions/sales_staff', {
181
- method: 'get',
182
- data: {
183
- q: val,
184
- page: pageIndex
185
- },
186
- dataType: 'json',
187
- success: function (res) {
188
- var data = res.data;
189
- if (res.code == 0) {
190
- cb(res.data, res.count);
173
+ form.on('select(clazz_id)', function (data) {
174
+ console.log(data.value)
175
+ const value = data.value;
176
+ if (value == <%= EducodeSales::Common.where(extras: EducodeSales::Common::OTYPE).first&.id %>) {
177
+ $(".service_show").removeClass('layui-hide')
191
178
  } else {
192
- layer.msg(res.msg, {time: 2000, icon: 2, shade: 0.01});
179
+ console.log(data.value)
180
+ $(".service_show").addClass('layui-hide')
193
181
  }
194
- }
195
182
  })
196
- }
197
- })
198
- sales_list.setValue(gon.sales)
199
- var places_list = xmSelect.render({
200
- el: '#edit_place',
201
- remoteSearch: true,
202
- clickClose: true,
203
- model: {
204
- icon: 'hidden',
205
- label: {
206
- type: 'text',
207
- text: {
208
- //左边拼接的字符
209
- left: '',
210
- //右边拼接的字符
211
- right: '',
212
- //中间的分隔符
213
- separator: ', ',
214
- },
183
+
184
+ laydate.render({
185
+ elem: '#invitation_at_edit'
186
+ })
187
+ laydate.render({
188
+ elem: '#service_time',
189
+ range: true
190
+ });
191
+ laydate.render({
192
+ elem: '#edit_year',
193
+ type: 'year'
194
+ })
195
+
196
+ laydate.render({
197
+ elem: '#reception_at_edit'
198
+ });
199
+
200
+ var sales_list = xmSelect.render({
201
+ el: '#edit_assign_follow',
202
+ remoteSearch: true,
203
+ clickClose: true,
204
+ delay: 1000,
205
+ paging: true,
206
+ pageRemote: true,
207
+ filterable: true,
208
+ remoteMethod: function (val, cb, show, pageIndex) {
209
+ $.ajax('/missions/sales_staff', {
210
+ method: 'get',
211
+ data: {
212
+ q: val,
213
+ page: pageIndex
214
+ },
215
+ dataType: 'json',
216
+ success: function (res) {
217
+ var data = res.data;
218
+ if (res.code == 0) {
219
+ cb(res.data, res.count);
220
+ } else {
221
+ layer.msg(res.msg, {time: 2000, icon: 2, shade: 0.01});
222
+ }
223
+ }
224
+ })
215
225
  }
216
- },
217
- delay: 1000,
218
- radio: true,
219
- paging: true,
220
- pageRemote: true,
221
- filterable: true,
222
- remoteMethod: function (val, cb, show, pageIndex) {
223
- $.ajax( '/missions/sales_place', {
224
- method: 'get',
225
- data: {
226
- q: val,
227
- page: pageIndex
228
- },
229
- dataType: 'json',
230
- success: function (res) {
231
- var data = res.data;
232
- if (res.code == 0) {
233
- cb(res.data, res.count);
234
- } else {
235
- layer.msg(res.msg, {time: 2000, icon: 2, shade: 0.01});
226
+ })
227
+ sales_list.setValue(gon.sales)
228
+ var places_list = xmSelect.render({
229
+ el: '#edit_place',
230
+ remoteSearch: true,
231
+ clickClose: true,
232
+ model: {
233
+ icon: 'hidden',
234
+ label: {
235
+ type: 'text',
236
+ text: {
237
+ //左边拼接的字符
238
+ left: '',
239
+ //右边拼接的字符
240
+ right: '',
241
+ //中间的分隔符
242
+ separator: ', ',
243
+ },
244
+ }
245
+ },
246
+ delay: 1000,
247
+ radio: true,
248
+ paging: true,
249
+ pageRemote: true,
250
+ filterable: true,
251
+ remoteMethod: function (val, cb, show, pageIndex) {
252
+ $.ajax('/missions/sales_place', {
253
+ method: 'get',
254
+ data: {
255
+ q: val,
256
+ page: pageIndex
257
+ },
258
+ dataType: 'json',
259
+ success: function (res) {
260
+ var data = res.data;
261
+ if (res.code == 0) {
262
+ cb(res.data, res.count);
263
+ } else {
264
+ layer.msg(res.msg, {time: 2000, icon: 2, shade: 0.01});
265
+ }
266
+ }
267
+ })
236
268
  }
237
- }
238
269
  })
239
- }
240
- })
241
- places_list.setValue(gon.place)
270
+ places_list.setValue(gon.place)
242
271
 
243
- form.render();
244
- form.on('submit(update_follow_up)', function (data) {
245
- var assign_follow = [];
246
- sales_list.getValue().forEach(function(d) {
247
- assign_follow.push(d.value);
248
- })
249
- data.field.assign_follow_up = assign_follow;
250
- data.field.place_id = places_list.getValue()[0].value;
251
- request.authPut("missions/follow_ups/<%= @follow_up.id%>", data.field, function (res) {
252
- if (res.success == false) {
253
- layer.alert(res.msg)
254
- } else {
255
- layer.close(parent.sale_plan_edit_open);
256
- parent.layer.close(parent.layer.getFrameIndex(window.name))
257
- parent.table.reload('sale_plan_follow_table')
258
- parent.table.reload('businesses_table')
259
- parent.table.reload('teachers_table')
260
- }
261
- })
272
+ form.render();
273
+ form.on('submit(update_follow_up)', function (data) {
274
+ if (data.field.clazz_id == <%= EducodeSales::Common.where(extras: EducodeSales::Common::OTYPE).first&.id %>) {
275
+ if (data.field.service_time.length == 0) {
276
+ layer.msg('请选择服务期', {time: 2000, icon: 2, shade: 0.01});
277
+ return false;
278
+ }
279
+ }
280
+ var assign_follow = [];
281
+ sales_list.getValue().forEach(function (d) {
282
+ assign_follow.push(d.value);
283
+ })
284
+ data.field.assign_follow_up = assign_follow;
285
+ data.field.place_id = places_list.getValue()[0].value;
286
+ request.authPut("missions/follow_ups/<%= @follow_up.id%>", data.field, function (res) {
287
+ if (res.success == false) {
288
+ layer.alert(res.msg)
289
+ } else {
290
+ layer.close(parent.sale_plan_edit_open);
291
+ parent.layer.close(parent.layer.getFrameIndex(window.name))
292
+ parent.table.reload('sale_plan_follow_table')
293
+ parent.table.reload('businesses_table')
294
+ parent.table.reload('teachers_table')
295
+ }
296
+ })
262
297
 
263
298
 
264
- return false;
265
- });
299
+ return false;
300
+ });
266
301
 
267
- });
302
+ });
268
303
  </script>
269
304
  <style>
270
- .place_select xm-select > .xm-body{
271
- width: 300px; !important;
305
+ .place_select xm-select > .xm-body {
306
+ width: 300px;
307
+ !important;
272
308
  }
273
309
  </style>
@@ -15,6 +15,7 @@ json.data do
15
15
  json.bidded_date d.last_follow_up&.bidded_date.to_s
16
16
  json.signed_date d.last_follow_up&.signed_date.to_s
17
17
  json.total_amount d.last_follow_up&.total_amount
18
+ json.service_end_time d.last_follow_up&.service_start_time.to_s + "-" + d.last_follow_up&.service_end_time.to_s
18
19
  json.actual_amount d.last_follow_up&.actual_amount
19
20
  json.return_money d.return_money
20
21
  json.wait_return_money d.wait_return_money.to_i.round(2)
@@ -95,7 +95,7 @@
95
95
  <div class="layui-btn-container">
96
96
  <span class="table-label">商机列表</span>
97
97
  <% if can?(:export_business, EducodeSales::Business) %>
98
- <button class="layui-btn layui-btn-primary layui-border-green layui-btn-sm data-count-edit export_more-btn pull-right" style="color: #0000FF;" data-name="export" data-id="export">导出<i class="layui-icon layui-icon-down layui-nav-more" style="font-size: 12px"></i></button>
98
+ <button class="layui-btn layui-btn-primary layui-border-green layui-btn-sm data-count-edit export_more-btn pull-right" style="color: #0000ff;" data-name="export" data-id="export">导出<i class="layui-icon layui-icon-down layui-nav-more" style="font-size: 12px"></i></button>
99
99
  <% end %>
100
100
  <% if can? :create, EducodeSales::Business %>
101
101
  <button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn pull-right" lay-event="add"> 添加商机</button>
@@ -338,26 +338,32 @@
338
338
  },
339
339
  {
340
340
  field: 'signed_date',
341
- width: 105,
342
- title: '签单时间',
341
+ width: 105,
342
+ title: '签单时间',
343
343
  sort: true
344
344
  },
345
- {
346
- field: 'reception_at',
347
- width: 105,
348
- title: '验收时间',
349
- sort: true
350
- },
351
- {
352
- field: 'total_amount',
353
- width: 100,
354
- title: '总额',
355
- totalRow: true,
356
- sort: true
357
- },
358
- {
359
- field: 'actual_amount',
360
- width: 100,
345
+ {
346
+ field: 'reception_at',
347
+ width: 105,
348
+ title: '验收时间',
349
+ sort: true
350
+ },
351
+ {
352
+ field: 'service_end_time',
353
+ width: 200,
354
+ title: '服务期',
355
+ sort: true
356
+ },
357
+ {
358
+ field: 'total_amount',
359
+ width: 100,
360
+ title: '总额',
361
+ totalRow: true,
362
+ sort: true
363
+ },
364
+ {
365
+ field: 'actual_amount',
366
+ width: 100,
361
367
  title: '合同额',
362
368
  totalRow: true,
363
369
  sort: true
@@ -17,6 +17,7 @@ json.data do
17
17
  json.reception_at d.last_follow_up&.reception_at.to_s
18
18
  json.bidded_date d.last_follow_up&.bidded_date.to_s
19
19
  json.signed_date d.last_follow_up&.signed_date.to_s
20
+ json.service_end_time d.last_follow_up&.service_start_time.to_s + "-" + d.last_follow_up&.service_end_time.to_s
20
21
  json.year d.last_follow_up&.year.to_s
21
22
  json.total_amount d.last_follow_up&.total_amount
22
23
  json.actual_amount d.last_follow_up&.actual_amount