educode_sales 0.7.1 → 0.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/educode_sales/indexlogo.png +0 -0
  3. data/app/controllers/educode_sales/businesses_controller.rb +17 -2
  4. data/app/controllers/educode_sales/follow_ups_controller.rb +14 -2
  5. data/app/controllers/educode_sales/results_controller.rb +54 -0
  6. data/app/controllers/educode_sales/sale_trends_controller.rb +116 -116
  7. data/app/helpers/educode_sales/follow_up_helper.rb +7 -0
  8. data/app/models/educode_sales/money_plan.rb +3 -3
  9. data/app/models/educode_sales/result.rb +4 -0
  10. data/app/views/educode_sales/businesses/edit_follow_record.html.erb +150 -114
  11. data/app/views/educode_sales/businesses/edit_plan.html.erb +4 -4
  12. data/app/views/educode_sales/businesses/export_records.json.jbuilder +1 -2
  13. data/app/views/educode_sales/businesses/get_export_data.json.jbuilder +2 -1
  14. data/app/views/educode_sales/businesses/index.html.erb +131 -109
  15. data/app/views/educode_sales/businesses/index.json.jbuilder +3 -2
  16. data/app/views/educode_sales/businesses/new_follow_record.html.erb +156 -119
  17. data/app/views/educode_sales/businesses/show_follow.html.erb +30 -24
  18. data/app/views/educode_sales/businesses/show_follow.json.jbuilder +1 -0
  19. data/app/views/educode_sales/businesses/show_follow_record.html.erb +8 -1
  20. data/app/views/educode_sales/customers/show_follow.html.erb +1 -1
  21. data/app/views/educode_sales/follow_ups/index.json.jbuilder +1 -1
  22. data/app/views/educode_sales/follow_ups/money_plans.json.jbuilder +2 -4
  23. data/app/views/educode_sales/money_plans/index.html.erb +1 -1
  24. data/app/views/educode_sales/operation_plans/_monthPlan.html.erb +8 -3
  25. data/app/views/educode_sales/operation_plans/_monthly.html.erb +2 -2
  26. data/app/views/educode_sales/operation_plans/_weekPlan.html.erb +2 -2
  27. data/app/views/educode_sales/operation_plans/_weekly.html.erb +2 -2
  28. data/app/views/educode_sales/plans/_monthPlan.html.erb +8 -3
  29. data/app/views/educode_sales/plans/_monthly.html.erb +2 -2
  30. data/app/views/educode_sales/plans/_weekPlan.html.erb +2 -2
  31. data/app/views/educode_sales/plans/_weekly.html.erb +2 -2
  32. data/app/views/educode_sales/results/edit.html.erb +111 -0
  33. data/app/views/educode_sales/results/index.html.erb +0 -0
  34. data/app/views/educode_sales/results/index.json.jbuilder +13 -0
  35. data/app/views/educode_sales/results/new.html.erb +58 -0
  36. data/app/views/educode_sales/results/show.json.jbuilder +9 -0
  37. data/app/views/educode_sales/sale_reports/audit.html.erb +2 -0
  38. data/app/views/educode_sales/sale_reports/edit.html.erb +2 -0
  39. data/app/views/educode_sales/sale_reports/show.html.erb +2 -0
  40. data/app/views/educode_sales/sales/index.html.erb +7 -7
  41. data/app/views/educode_sales/teachers/show_follow.html.erb +1 -1
  42. data/app/views/layouts/educode_sales/application.html.erb +9 -3
  43. data/config/routes.rb +7 -1
  44. data/db/migrate/20220314053856_add_service_start_time_to_follow_ups.rb +6 -0
  45. data/db/migrate/20220314074354_add_service_time_long_to_follow_ups.rb +5 -0
  46. data/lib/educode_sales/version.rb +1 -1
  47. metadata +17 -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>
@@ -24,7 +24,7 @@
24
24
  <div class="layui-input-inline" style="width: 300px;" id="professional_title_div">
25
25
  <label class="layui-form-label required">状态</label>
26
26
  <div class="layui-input-block">
27
- <%= select_tag "clazz", options_for_select(['未完成', '已完成']), class: 'required' %>
27
+ <%= select_tag "clazz", options_for_select(['计划回款', '实际回款']), class: 'required' %>
28
28
  </div>
29
29
  </div>
30
30
  </div>
@@ -43,7 +43,7 @@
43
43
  <script type="text/html" id="return_money_select">
44
44
  <div class="layui-input-block table-select">
45
45
  <select name="clazz" lay-filter="return_money_select">
46
- {{# layui.each(['未完成', '已完成'], function(i, data) { }}
46
+ {{# layui.each(['计划回款', '实际回款'], function(i, data) { }}
47
47
  {{# if (data == d.clazz) { }}
48
48
  <option value="{{data}}" selected="{{d.clazz}}">{{data}}</option>
49
49
  {{# } else { }}
@@ -90,8 +90,8 @@
90
90
  layer.alert(res.msg)
91
91
  } else {
92
92
  // layer.close(parent.plan_index);
93
- parent.table.reload('sale_plan_follow_table');
94
- parent.table.reload('businesses_table');
93
+ table.reload('sale_plan_follow_table');
94
+ table.reload('businesses_table');
95
95
  table.reload('return_money_list');
96
96
  }
97
97
  })
@@ -1,7 +1,6 @@
1
1
  json.data do
2
2
  json.array! @records do |d|
3
- json.id d.id
4
- json.name d.name
3
+ json.(d, :id, :name)
5
4
  json.staff d.staff&.user&.real_name
6
5
  json.created_at d.created_at.to_s
7
6
  end
@@ -15,10 +15,11 @@ 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)
21
- json.return_money_days d.last_follow_up&.reception_at.present? && d.last_follow_up.money_plans.where(clazz: '已完成').present? ? (d.last_follow_up.money_plans.where(clazz: '已完成').order(created_at: :asc).first.date_at.to_s(:date).to_date - d.last_follow_up&.reception_at).to_i : ''
22
+ json.return_money_days d.last_follow_up&.reception_at.present? && d.last_follow_up.money_plans.where(clazz: '实际回款').present? ? (d.last_follow_up.money_plans.where(clazz: '实际回款').order(created_at: :asc).first.date_at.to_s(:date).to_date - d.last_follow_up&.reception_at).to_i : ''
22
23
  json.place d.last_follow_up&.place&.name
23
24
  json.last_follow_person d.last_follow_up.present? ? d.last_follow_up.staff.user.real_name : EducodeSales::Staff.find(d.staff_id).user.real_name
24
25
  json.source d.source