educode_sales 0.9.67 → 0.9.68

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 (43) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/educode_sales/activities_controller.rb +52 -38
  3. data/app/controllers/educode_sales/businesses_controller.rb +1 -1
  4. data/app/controllers/educode_sales/operation_plans_controller.rb +8 -4
  5. data/app/controllers/educode_sales/plans_controller.rb +173 -11
  6. data/app/controllers/educode_sales/recycles_controller.rb +11 -1
  7. data/app/controllers/educode_sales/teachers_controller.rb +4 -4
  8. data/app/controllers/educode_sales/upload_files_controller.rb +9 -2
  9. data/app/models/educode_sales/activity.rb +4 -0
  10. data/app/models/educode_sales/assessments_setting.rb +2 -2
  11. data/app/models/educode_sales/business_info.rb +9 -0
  12. data/app/models/educode_sales/sale_plan.rb +3 -1
  13. data/app/models/educode_sales/staff.rb +2 -0
  14. data/app/views/educode_sales/activities/_follows.html.erb +50 -36
  15. data/app/views/educode_sales/activities/_index.html.erb +82 -9
  16. data/app/views/educode_sales/activities/edit.html.erb +25 -68
  17. data/app/views/educode_sales/activities/files.html.erb +157 -0
  18. data/app/views/educode_sales/activities/files.json.jbuilder +13 -0
  19. data/app/views/educode_sales/activities/follow_ups.json.jbuilder +1 -1
  20. data/app/views/educode_sales/activities/index.json.jbuilder +2 -2
  21. data/app/views/educode_sales/activities/new.html.erb +21 -60
  22. data/app/views/educode_sales/activities/upload_file.html.erb +43 -0
  23. data/app/views/educode_sales/businesses/get_export_data.json.jbuilder +3 -0
  24. data/app/views/educode_sales/businesses/new.html.erb +1 -1
  25. data/app/views/educode_sales/plans/_yearPlan.html.erb +234 -0
  26. data/app/views/educode_sales/plans/business_infos.json.jbuilder +23 -0
  27. data/app/views/educode_sales/plans/edit_bussiness_info.html.erb +79 -0
  28. data/app/views/educode_sales/plans/edit_bussiness_info_extra.html.erb +260 -0
  29. data/app/views/educode_sales/plans/edit_year_plan.html.erb +237 -0
  30. data/app/views/educode_sales/plans/index.html.erb +8 -0
  31. data/app/views/educode_sales/plans/new_year.html.erb +204 -0
  32. data/app/views/educode_sales/plans/plan_business_infos.json.jbuilder +42 -0
  33. data/app/views/educode_sales/plans/years_plan.json.jbuilder +17 -0
  34. data/app/views/educode_sales/recycles/_monthly.html.erb +1 -1
  35. data/app/views/educode_sales/recycles/_yearPlan.html.erb +118 -0
  36. data/app/views/educode_sales/recycles/index.html.erb +26 -22
  37. data/app/views/educode_sales/recycles/monthPlan.json.jbuilder +0 -1
  38. data/app/views/educode_sales/recycles/yearPlan.json.jbuilder +14 -0
  39. data/config/routes.rb +19 -0
  40. data/db/migrate/20230330141213_create_educode_sales_activity_follow_ups.rb +6 -0
  41. data/db/migrate/20230405074036_add_year_to_sale_plans.rb +38 -0
  42. data/lib/educode_sales/version.rb +1 -1
  43. metadata +18 -3
@@ -0,0 +1,204 @@
1
+ <div class="layui-form layuimini-form">
2
+ <div class="layui-form-item" style="padding: 25px">
3
+ <div class="layui-inline">
4
+ <label class="layui-form-label required">年份</label>
5
+ <div class="layui-input-inline">
6
+ <input type="text" lay-verify="required" class="layui-input" id="new_year_field" autocomplete="off" name="year">
7
+ </div>
8
+ </div>
9
+ <div class="layui-inline">
10
+ <label class="layui-form-label required">选择商机</label>
11
+ <div class="layui-input-inline" style="width: 400px">
12
+ <%= select_tag "business_id", options_for_select(@businesses), {"lay-verify": "required", include_blank: true} %>
13
+ </div>
14
+ </div>
15
+ <div class="layui-inline">
16
+ <label class="layui-form-label required">目标类型</label>
17
+ <div class="layui-input-inline" style="width: 150px">
18
+ <%= select_tag "clazz", options_for_select(@clazz), {"lay-verify": "required", include_blank: true} %>
19
+ </div>
20
+ </div>
21
+ <div class="layui-inline">
22
+ <div class="layui-input-inline">
23
+ <button type="submit" class="layui-btn layui-btn-normal" lay-submit lay-filter="add_year_plan">提交</button>
24
+ </div>
25
+ </div>
26
+ </div>
27
+ </div>
28
+
29
+ <div>
30
+ <table class="layui-hide" id="yearTable" lay-filter="yearTable"></table>
31
+ </div>
32
+ <div class="layui-form layuimini-form" style="text-align: center;margin-top:20px;">
33
+ <button type="submit" class="layui-btn layui-btn-normal" lay-submit lay-filter="add_y_plan">提交</button>
34
+ </div>
35
+
36
+ <script type="text/html" id="newYearTableBar">
37
+ <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">编辑</a>
38
+ <a class="layui-btn layui-btn-danger layui-btn-xs data-count-delete" lay-event="delete">删除</a>
39
+ </script>
40
+ <script>
41
+ layui.use(['form', 'table', 'laytpl', 'request', 'laydate'], function () {
42
+ var form = layui.form,
43
+ layer = layui.layer,
44
+ table = layui.table,
45
+ request = layui.request,
46
+ laydate = layui.laydate,
47
+ $ = layui.$;
48
+ laydate.render({
49
+ elem: '#new_year_field',
50
+ type: 'year'
51
+ });
52
+ form.render();
53
+
54
+ var parentIndex = layer.index;
55
+
56
+ form.on('submit(add_year_plan)', function (data) {
57
+ request.authPost("missions/plans/create_business_info", data.field, function (res) {
58
+ if (res.success == false) {
59
+ layer.alert(res.msg)
60
+ } else {
61
+ console.log("resss", data.field)
62
+ table.reload('yearTable', {
63
+ where: data.field
64
+ })
65
+ }
66
+ })
67
+ return false;
68
+ });
69
+ form.on('submit(add_y_plan)', function (data) {
70
+ request.authPost("missions/plans/create_sales_plan", {}, function (res) {
71
+ table.reload('yearPlanTable');
72
+ layer.close(parent.yindex);
73
+ })
74
+ })
75
+
76
+ table.render({
77
+ elem: '#yearTable',
78
+ url: '/missions/plans/business_infos',
79
+ height: 400,
80
+ defaultToolbar: ['filter'],
81
+ initSort: {
82
+ field: 'created_at',
83
+ type: 'desc'
84
+ },
85
+ cols: [
86
+ [
87
+ {
88
+ field: 'id',
89
+ width: 60,
90
+ title:'序号',
91
+ type: 'numbers',
92
+ fixed: 'left'
93
+ },
94
+ {
95
+ field: 'business_name',
96
+ width: 160,
97
+ title: '商机名称',
98
+ },
99
+ {
100
+ field: 'school',
101
+ width: 150,
102
+ title: '单位'
103
+ },
104
+ {
105
+ field: 'department',
106
+ width: 150,
107
+ title: '二级部门'
108
+ },
109
+ {
110
+ field: 'stage',
111
+ width: 100,
112
+ title: '阶段',
113
+ },
114
+ {
115
+ field: 'staff_manages',
116
+ width: 100,
117
+ title: '销售经理',
118
+ },
119
+ {
120
+ field: 'created_at',
121
+ width: 180,
122
+ title: '创建时间',
123
+ },
124
+ {
125
+ field: 'sale_way',
126
+ width: 100,
127
+ title: '销售方式',
128
+ },
129
+ {
130
+ field: 'clazz',
131
+ width: 100,
132
+ title: '目标类型',
133
+ },
134
+ {
135
+ field: 'budget_amount',
136
+ width: 100,
137
+ title: '预算额',
138
+ },
139
+ {
140
+ field: 'plan_bid_on',
141
+ width: 170,
142
+ title: '计划投标时间',
143
+ },
144
+ {
145
+ field: 'plan_sign_on',
146
+ width: 170,
147
+ title: '计划签单时间',
148
+ },
149
+ {
150
+ field: 'prepayment_plan_on',
151
+ width: 170,
152
+ title: '计划回款时间',
153
+ },
154
+ {
155
+ field: 'prepayment_amount',
156
+ width: 170,
157
+ title: '计划回款额',
158
+ },
159
+ {
160
+ title: '操作',
161
+ minWidth: 200,
162
+ toolbar: '#newYearTableBar',
163
+ align: "center",
164
+ fixed: 'right'
165
+ }
166
+ ]
167
+ ],
168
+ limit: 20,
169
+ limits: [10,15,20,30,40,50,60,70,80,90],
170
+ page: true,
171
+ });
172
+
173
+ table.on('tool(yearTable)', function (obj) {
174
+ var data = obj.data;
175
+ id = data.id;
176
+ year = data.year;
177
+ if (obj.event === 'edit') {
178
+ content = miniPage.getHrefContent('/missions/plans/edit_bussiness_info?id='+ id);
179
+ openWH = miniPage.getOpenWidthHeight();
180
+ sindex = layer.open({
181
+ title: '编辑',
182
+ type: 1,
183
+ shade: 0.2,
184
+ maxmin: true,
185
+ shadeClose: true,
186
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
187
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
188
+ content: content
189
+ });
190
+ $(window).on("resize", function () {
191
+ layer.full(index);
192
+ });
193
+ return false;
194
+ } else if (obj.event === 'delete') {
195
+ layer.confirm('确定删除' + data.business_name + data.clazz, function (index) {
196
+ request.delete('missions/plans/' + data.id +'/delete_business_info', {}, function (res) {
197
+ layer.close(index);
198
+ table.reload("yearTable")
199
+ })
200
+ });
201
+ }
202
+ })
203
+ });
204
+ </script>
@@ -0,0 +1,42 @@
1
+ json.data do
2
+ json.array! @data do |d|
3
+ json.id d.id
4
+ json.staff d.staff.user.real_name
5
+ json.clazz EducodeSales::SalePlan::CLAZZ_NAME.invert[d.clazz]
6
+ json.year d.year
7
+ json.business_name d.business.name
8
+ json.department d.business.department&.name
9
+ json.school d.business.department&.school&.name
10
+ json.stage d.business.last_follow_up&.stage&.name
11
+ json.staff_manages d.business.last_follow_up&.assign_follow_ups.present? ? (d.business.last_follow_up.assign_follow_ups.map{ |d| d.staff.user.real_name}.join("、")) : d.business.staff&.user&.real_name
12
+ json.created_at d.created_at.to_s
13
+ json.sale_way d.business.last_follow_up&.place&.name.present? ? '渠道' : '直销'
14
+ json.budget_amount d.business&.last_follow_up ? d.business.last_follow_up.budget_amount.to_f.round(2) : 0
15
+ json.plan_bid_on d.plan_bid_on
16
+ json.plan_sign_on d.plan_sign_on
17
+ json.bidded_amount d.bidded_amount
18
+ json.plan_sign_on d.plan_sign_on
19
+ json.actual_sign_on d.actual_sign_on
20
+ json.sign_amount d.sign_amount
21
+ json.plan_deploy_on d.plan_deploy_on
22
+ json.actual_deploy_on d.actual_deploy_on
23
+ json.plan_check_on d.plan_check_on
24
+ json.actual_check_on d.actual_check_on
25
+ json.prepayment_plan_on d.prepayment_plan_on
26
+ json.prepayment_actual_on d.prepayment_actual_on
27
+ json.prepayment_amount d.prepayment_amount
28
+ json.check_fee_plan_on d.check_fee_plan_on
29
+ json.check_fee_actual_on d.check_fee_actual_on
30
+ json.check_fee d.check_fee
31
+ json.qa_plan_on d.qa_plan_on
32
+ json.qa_actual_on d.qa_actual_on
33
+ json.qa_amount d.qa_amount
34
+ json.account_receivable d.account_receivable
35
+ json.account_receivable_clazz d.account_receivable_clazz
36
+ json.invoice_amount d.invoice_amount
37
+
38
+ end
39
+ end
40
+
41
+ json.code 0
42
+ json.count @data.total_count
@@ -0,0 +1,17 @@
1
+ json.data do
2
+ json.array! @sale_plans do |d|
3
+ json.id d.id
4
+ json.staff d.staff.user.real_name
5
+ json.clazz EducodeSales::SalePlan::CLAZZ_NAME.invert[d.clazz]
6
+ json.year d.year
7
+ json.target_money d['annual'] || 0
8
+ json.plan_money d['budget_amounts']&.round(2) || 0
9
+ json.minimum_money d['annual'].present? ? (d['annual'].to_f * 0.8).round(2) : 0
10
+ json.finish_money 0
11
+ json.finish_rate 0
12
+ json.updated_at d.updated_at.to_s
13
+ end
14
+ end
15
+
16
+ json.code 0
17
+ json.count @sale_plans.total_count
@@ -1,6 +1,6 @@
1
1
  <script type="text/html" id="toolbarDemo4">
2
2
  <div class="layui-btn-container">
3
- <span class="table-label">周报列表</span>
3
+ <span class="table-label">月报列表</span>
4
4
  </div>
5
5
  </script>
6
6
 
@@ -0,0 +1,118 @@
1
+ <script type="text/html" id="toolbarDemo6">
2
+ <div class="layui-btn-container">
3
+ <span class="table-label">年计划列表</span>
4
+ </div>
5
+ </script>
6
+
7
+ <table class="layui-hide" id="yearPlan" lay-filter="yearPlan"></table>
8
+
9
+ <script type="text/html" id="currentTableBar6">
10
+ <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="restore">还原</a>
11
+ <a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除</a>
12
+ </script>
13
+
14
+ <script type="text/html" id="showchance">
15
+ <a href="/missions/businesses" class="layui-table-link">{{ d.chance }}</a>
16
+ </script>
17
+
18
+ <script>
19
+ layui.use(['form', 'table', 'miniPage', 'element', 'request'], function () {
20
+ var $ = layui.jquery,
21
+ form = layui.form,
22
+ table = layui.table,
23
+ request = layui.request,
24
+ miniPage = layui.miniPage;
25
+
26
+ table.render({
27
+ elem: '#yearPlan',
28
+ url: '/missions/recycles/yearPlan',
29
+ toolbar: '#toolbarDemo6',
30
+ totalRow:true,
31
+ defaultToolbar: [],
32
+ cols: [
33
+ [
34
+ {
35
+ field: 'id',
36
+ width: 60,
37
+ title:'序号',type: 'numbers',
38
+ },
39
+ {
40
+ field: 'name',
41
+ width: 90,
42
+ title: '姓名'
43
+ },
44
+ {
45
+ field: 'year',
46
+ width: 90,
47
+ title: '年度',
48
+ },
49
+ {
50
+ field: 'plan',
51
+ title: '计划内容'
52
+ },
53
+ {
54
+ field: 'update_at',
55
+ width: 160,
56
+ title: '更新时间',
57
+ sort: true,
58
+ },
59
+ {
60
+ field: 'deleter',
61
+ width: 90,
62
+ title: '删除人',
63
+ },
64
+ {
65
+ field: 'delete_time',
66
+ width: 160,
67
+ title: '删除时间',
68
+ sort: true,
69
+ },
70
+ {
71
+ title: '操作',
72
+ width: 120,
73
+ toolbar: '#currentTableBar6',
74
+ align: "center"
75
+ }
76
+ ]
77
+ ],
78
+ limit: 20,
79
+ limits: [10,15,20,30,40,50,60,70,80,90],
80
+ page: true
81
+ });
82
+
83
+ var sort = {}, search = {};
84
+ table.on('sort(yearPlan)', function (obj) {
85
+ sort.field = obj.field;
86
+ sort.order = obj.type;
87
+ table.reload('yearPlan', {
88
+ initSort: obj,
89
+ where: {
90
+ sort: sort,
91
+ q: search
92
+ }
93
+ });
94
+ })
95
+
96
+
97
+ table.on('tool(yearPlan)', function (obj) {
98
+ var data = obj.data;
99
+ var id = data.id
100
+ if (obj.event === 'restore') {
101
+ layer.confirm('确定恢复' + data.name, function (index) {
102
+ request.get('missions/recycles/' + data.id + '/restore_plans', {}, function (res) {
103
+ layer.close(index);
104
+ table.reload("yearPlan")
105
+ })
106
+ });
107
+ } else if (obj.event === 'delete') {
108
+ layer.confirm('确定删除' + data.name, function (index) {
109
+ request.delete('missions/recycles/' + data.id, {}, function (res) {
110
+ layer.close(index);
111
+ table.reload("yearPlan")
112
+ })
113
+ });
114
+ }
115
+ });
116
+
117
+ });
118
+ </script>
@@ -5,6 +5,7 @@
5
5
  <li data="weekly">周报</li>
6
6
  <li data="month">月计划</li>
7
7
  <li data="monthly">月报</li>
8
+ <li data="year">年计划</li>
8
9
  </ul>
9
10
  <div class="layui-tab-content">
10
11
  <div class="layui-tab-item layui-show">
@@ -22,6 +23,9 @@
22
23
  <div class="layui-tab-item">
23
24
  <%= render 'monthly' %>
24
25
  </div>
26
+ <div class="layui-tab-item">
27
+ <%= render 'yearPlan' %>
28
+ </div>
25
29
  </div>
26
30
  </div>
27
31
 
@@ -30,29 +34,29 @@
30
34
  var $ = layui.jquery,
31
35
  table = layui.table,
32
36
  element = layui.element;
33
- element.on('tab(sale_tab)', function (data) {
34
- var status = $(this).attr('data')
35
- switch (status) {
36
- case 'week':
37
- $("#week_table_wraper .layui-table-fixed-r")[0].classList.remove('layui-hide');
38
- $("#week_table_wraper .layui-table-fixed-r .layui-table-body")[0].style.height="auto";
39
- break;
40
- case 'weekly':
41
- $("#sales_weelky_table .layui-table-fixed-r")[0].classList.remove('layui-hide');
42
- $("#sales_weelky_table .layui-table-fixed-r .layui-table-body")[0].style.height="auto";
43
- break;
44
- ;
45
- case 'monthly':
46
- $("#monthly_table_wraper .layui-table-fixed-r")[0].classList.remove('layui-hide');
47
- $("#monthly_table_wraper .layui-table-fixed-r .layui-table-body")[0].style.height="auto";
48
- break;
49
- case 'month':
50
- $("#month_table_wraper .layui-table-fixed-r")[0].classList.remove('layui-hide');
51
- $("#month_table_wraper .layui-table-fixed-r .layui-table-body")[0].style.height="auto";
52
- break;
53
- }
37
+ // element.on('tab(sale_tab)', function (data) {
38
+ // var status = $(this).attr('data')
39
+ // switch (status) {
40
+ // case 'week':
41
+ // $("#week_table_wraper .layui-table-fixed-r")[0].classList.remove('layui-hide');
42
+ // $("#week_table_wraper .layui-table-fixed-r .layui-table-body")[0].style.height="auto";
43
+ // break;
44
+ // case 'weekly':
45
+ // $("#sales_weelky_table .layui-table-fixed-r")[0].classList.remove('layui-hide');
46
+ // $("#sales_weelky_table .layui-table-fixed-r .layui-table-body")[0].style.height="auto";
47
+ // break;
48
+ // ;
49
+ // case 'monthly':
50
+ // $("#monthly_table_wraper .layui-table-fixed-r")[0].classList.remove('layui-hide');
51
+ // $("#monthly_table_wraper .layui-table-fixed-r .layui-table-body")[0].style.height="auto";
52
+ // break;
53
+ // case 'month':
54
+ // $("#month_table_wraper .layui-table-fixed-r")[0].classList.remove('layui-hide');
55
+ // $("#month_table_wraper .layui-table-fixed-r .layui-table-body")[0].style.height="auto";
56
+ // break;
57
+ // }
54
58
 
55
59
 
56
- })
60
+ // })
57
61
  })
58
62
  </script>
@@ -1,6 +1,5 @@
1
1
  json.data do
2
2
  json.array! @monthPlans do |d|
3
- next if EducodeSales::SalePlan.unscoped.find(d.source_id).weekly.present?
4
3
  json.id d.id
5
4
  json.name EducodeSales::SalePlan.unscoped.find(d.source_id).staff.user.real_name
6
5
  json.month EducodeSales::SalePlan.unscoped.find(d.source_id).month.strftime("%Y-%m")
@@ -0,0 +1,14 @@
1
+ json.data do
2
+ json.array! @plans do |d|
3
+ json.id d.id
4
+ json.name EducodeSales::SalePlan.unscoped.find(d.source_id).staff.user.real_name
5
+ json.year EducodeSales::SalePlan.unscoped.find(d.source_id).year
6
+ json.plan EducodeSales::SalePlan.unscoped.find(d.source_id).content
7
+ json.update_at EducodeSales::SalePlan.unscoped.find(d.source_id).updated_at.to_s
8
+ json.deleter EducodeSales::Staff.find(d.deleter_id).user.real_name
9
+ json.delete_time d.created_at.to_s
10
+ end
11
+ end
12
+
13
+ json.code 0
14
+ json.count @plans.total_count
data/config/routes.rb CHANGED
@@ -143,6 +143,7 @@ EducodeSales::Engine.routes.draw do
143
143
  get :monthPlan
144
144
  get :weekPlan
145
145
  get :business
146
+ get :yearPlan
146
147
  end
147
148
  member do
148
149
  get :restore_plans
@@ -167,6 +168,20 @@ EducodeSales::Engine.routes.draw do
167
168
  get :edit_monthly
168
169
  get :my_week
169
170
  get :my_month
171
+ get :new_year
172
+ get :years_plan
173
+ post :create_business_info
174
+ get :business_infos
175
+ get :edit_bussiness_info
176
+ post :update_business_info
177
+ post :create_sales_plan
178
+ get :edit_year_plan
179
+ get :plan_business_infos
180
+ get :edit_bussiness_info_extra
181
+ post :update_business_info_extra
182
+ end
183
+ member do
184
+ delete :delete_business_info
170
185
  end
171
186
  end
172
187
 
@@ -267,10 +282,14 @@ EducodeSales::Engine.routes.draw do
267
282
  get :show_teachers
268
283
  get :new_follow_up
269
284
  get :follow_ups
285
+ post :add_advise
286
+ get :upload_file
270
287
  end
271
288
  member do
272
289
  get :show_schools
273
290
  post :follow_up
291
+ put :update_advise
292
+ get :files
274
293
  end
275
294
  end
276
295
 
@@ -21,5 +21,11 @@ class CreateEducodeSalesActivityFollowUps < ActiveRecord::Migration[5.2]
21
21
  EducodeSales::Permission.find_or_create_by(name: '添加跟进记录', subject: 'ActivityFollowUp', action: 'create', clazz: 'activity')
22
22
  EducodeSales::Permission.find_or_create_by(name: '团队建议', subject: 'ActivityFollowUp', action: 'advise', clazz: 'activity')
23
23
  # EducodeSales::Permission.find_or_create_by(name: '附件', subject: 'ActivityFollowUp', action: 'upload', clazz: 'activity')
24
+
25
+
26
+ EducodeSales::Permission.find_or_create_by(name: '上传文件', subject: 'Activity', action: 'upload_file', clazz: 'activity')
27
+ EducodeSales::Permission.find_or_create_by(name: '下载附件', subject: 'Activity', action: 'download_file', clazz: 'activity')
28
+ EducodeSales::Permission.find_or_create_by(name: '删除附件', subject: 'Activity', action: 'delete_file', clazz: 'activity')
29
+ EducodeSales::Permission.find_or_create_by(name: '查看附件', subject: 'Activity', action: 'show_file', clazz: 'activity')
24
30
  end
25
31
  end
@@ -0,0 +1,38 @@
1
+ class AddYearToSalePlans < ActiveRecord::Migration[5.2]
2
+ def change
3
+ add_column :educode_sales_sale_plans, :year, :string
4
+ add_column :educode_sales_sale_plans, :clazz, :integer
5
+
6
+ create_table :educode_sales_business_infos do |t|
7
+ t.references :business
8
+ t.references :staff
9
+ t.references :sale_plan
10
+ t.string :year, comment: '年份'
11
+ t.integer :clazz, comment: '目标类型'
12
+ t.date :plan_bid_on, comment: '计划投标时间'
13
+ t.date :actual_bidded_on, comment: '实际投标时间'
14
+ t.float :bidded_amount, comment: '中标额'
15
+ t.date :plan_sign_on, comment: '计划签单时间'
16
+ t.date :actual_sign_on, comment: '实际签单时间'
17
+ t.float :sign_amount, comment: '签单额'
18
+ t.date :plan_deploy_on, comment: '计划部署时间'
19
+ t.date :actual_deploy_on, comment: '实际部署时间'
20
+ t.date :plan_check_on, comment: '计划验收时间'
21
+ t.date :actual_check_on, comment: '实际验收时间'
22
+ t.date :prepayment_plan_on, comment: '预收款计划回款时间'
23
+ t.date :prepayment_actual_on, comment: '预收款实际回款时间'
24
+ t.float :prepayment_amount, comment: '预收款'
25
+ t.date :check_fee_plan_on, comment: '验收款计划回款时间'
26
+ t.date :check_fee_actual_on, comment: '验收款实际回款时间'
27
+ t.float :check_fee, comment: '验收款'
28
+ t.date :qa_plan_on, comment: '质保金计划回款时间'
29
+ t.date :qa_actual_on, comment: '质保金实际回款时间'
30
+ t.float :qa_amount, comment: '质保金'
31
+ t.float :account_receivable, comment: '应收款'
32
+ t.integer :account_receivable_clazz, comment: '应收款类型'
33
+ t.float :invoice_amount, comment: '开票金额'
34
+
35
+ t.timestamps
36
+ end
37
+ end
38
+ end
@@ -1,3 +1,3 @@
1
1
  module EducodeSales
2
- VERSION = '0.9.67'
2
+ VERSION = '0.9.68'
3
3
  end