educode_sales 1.0.2 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/educode_sales/businesses_controller.rb +3 -0
- data/app/controllers/educode_sales/contracts_controller.rb +17 -1
- data/app/controllers/educode_sales/follow_ups_controller.rb +13 -12
- data/app/controllers/educode_sales/home_controller.rb +14 -0
- data/app/controllers/educode_sales/key_person_controller.rb +1 -1
- data/app/controllers/educode_sales/money_plan_records_controller.rb +103 -0
- data/app/controllers/educode_sales/money_plans_controller.rb +32 -28
- data/app/controllers/educode_sales/sales_details_controller.rb +1 -1
- data/app/controllers/educode_sales/teachers_controller.rb +7 -2
- data/app/models/educode_sales/business.rb +3 -0
- data/app/models/educode_sales/key_person.rb +1 -1
- data/app/models/educode_sales/money_plan.rb +27 -0
- data/app/models/educode_sales/money_plan_claim.rb +7 -0
- data/app/models/educode_sales/money_plan_record.rb +7 -0
- data/app/views/educode_sales/businesses/edit_plan.html.erb +1 -1
- data/app/views/educode_sales/businesses/key_person.json.jbuilder +1 -1
- data/app/views/educode_sales/follow_ups/index.json.jbuilder +1 -1
- data/app/views/educode_sales/follow_ups/teachers.json.jbuilder +1 -1
- data/app/views/educode_sales/home/search_contracts.json.jbuilder +9 -0
- data/app/views/educode_sales/home/search_money_plans.json.jbuilder +9 -0
- data/app/views/educode_sales/money_plan_records/_index.html.erb +231 -0
- data/app/views/educode_sales/money_plan_records/add.html.erb +101 -0
- data/app/views/educode_sales/money_plan_records/confirm_plan.html.erb +167 -0
- data/app/views/educode_sales/money_plan_records/index.js.erb +1 -0
- data/app/views/educode_sales/money_plan_records/index.json.jbuilder +26 -0
- data/app/views/educode_sales/money_plans/{index.html.erb → _index.html.erb} +119 -65
- data/app/views/educode_sales/money_plans/add.html.erb +147 -0
- data/app/views/educode_sales/money_plans/index.json.jbuilder +41 -8
- data/app/views/educode_sales/money_plans/list.html.erb +55 -0
- data/app/views/educode_sales/sales_details/edit.html.erb +6 -0
- data/app/views/educode_sales/teachers/add_keys.html.erb +2 -2
- data/app/views/layouts/educode_sales/application.html.erb +1 -1
- data/config/routes.rb +16 -1
- data/db/migrate/20230527150102_add_category_to_educode_sales_money_plans.rb +7 -0
- data/db/migrate/20230528115654_create_educode_sales_money_plan_records.rb +13 -0
- data/db/migrate/20230529022020_create_educode_sales_money_plan_claims.rb +12 -0
- data/lib/educode_sales/version.rb +1 -1
- metadata +18 -3
@@ -1,36 +1,18 @@
|
|
1
|
-
<div style="margin: 10px 10px 10px 10px">
|
2
|
-
<form class="layui-form layui-form-pane" lay-filter="
|
1
|
+
<div style="margin: 10px 10px 10px 10px" id="money_plan_list">
|
2
|
+
<form class="layui-form layui-form-pane" lay-filter="search_plans">
|
3
3
|
<div class="layui-form-item">
|
4
4
|
<div class="layui-inline">
|
5
|
-
<label class="layui-form-label"
|
5
|
+
<label class="layui-form-label">合同名称</label>
|
6
6
|
<div class="layui-input-inline">
|
7
7
|
<input type="text" name="business" class="layui-input">
|
8
8
|
</div>
|
9
9
|
</div>
|
10
10
|
<div class="layui-inline">
|
11
|
-
<label class="layui-form-label"
|
11
|
+
<label class="layui-form-label">客户名称</label>
|
12
12
|
<div class="layui-input-inline">
|
13
13
|
<input type="text" name="school" class="layui-input">
|
14
14
|
</div>
|
15
15
|
</div>
|
16
|
-
<div class="layui-inline">
|
17
|
-
<label class="layui-form-label">负责人</label>
|
18
|
-
<div class="layui-input-inline">
|
19
|
-
<%= select_tag "staff_id", options_for_select(@staffs, params[:staff_id]), { 'lay-filter': 'staff_id', include_blank: true } %>
|
20
|
-
</div>
|
21
|
-
</div>
|
22
|
-
<div class="layui-inline">
|
23
|
-
<label class="layui-form-label">状态</label>
|
24
|
-
<div class="layui-input-inline">
|
25
|
-
<%= select_tag "clazz", options_for_select(['实际回款','计划回款']), { include_blank: true } %>
|
26
|
-
</div>
|
27
|
-
</div>
|
28
|
-
<div class="layui-inline">
|
29
|
-
<label class="layui-form-label">回款时间</label>
|
30
|
-
<div class="layui-input-inline">
|
31
|
-
<input type="text" class="layui-input" id="date" name="date" placeholder=" - " autocomplete="off">
|
32
|
-
</div>
|
33
|
-
</div>
|
34
16
|
<div class="layui-inline">
|
35
17
|
<button type="reset" class="layui-btn layui-btn-primary" lay-submit lay-filter="reset_business_search">重置
|
36
18
|
</button>
|
@@ -40,45 +22,44 @@
|
|
40
22
|
</div>
|
41
23
|
</form>
|
42
24
|
</div>
|
43
|
-
|
44
|
-
<
|
45
|
-
<div class="layui-btn-container">
|
46
|
-
<span class="table-label">回款计划</span>
|
47
|
-
</div>
|
25
|
+
<script type="text/html" id="toolbar_money_plan">
|
26
|
+
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn pull-right" style="margin-left: 20px;" lay-event="addMoney">添加回款计划</button>
|
48
27
|
</script>
|
49
28
|
|
50
|
-
<table class="layui-hide" id="
|
29
|
+
<table class="layui-hide" id="money_plan_table" lay-filter="money_plan_table"></table>
|
30
|
+
|
51
31
|
|
52
|
-
<script type="text/html" id="currentTableBar">
|
53
|
-
</script>
|
54
|
-
<script type="text/html" id="business">
|
55
|
-
<a href="javascript:void(0);" lay-event="business" class="layui-table-link">{{ d.business }}</a>
|
56
|
-
</script>
|
57
32
|
|
58
33
|
<script type="text/html" id="school">
|
59
34
|
<a href="<%= base_url%>/colleges/{{d.school_id}}/statistics" class="layui-table-link" target="_blank">{{ d.school }}</a>
|
60
35
|
</script>
|
61
36
|
|
37
|
+
<script type="text/html" id="currentTableBarmoney_plan">
|
38
|
+
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="add">开票申请</a>
|
39
|
+
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">催款提醒</a>
|
40
|
+
|
41
|
+
</script>
|
42
|
+
|
62
43
|
<script>
|
63
44
|
layui.use(['form', 'table', 'miniPage', 'element', 'request'], function () {
|
64
45
|
var $ = layui.jquery,
|
65
46
|
form = layui.form,
|
66
|
-
table = layui.table,
|
67
47
|
request = layui.request,
|
68
48
|
miniPage = layui.miniPage;
|
69
49
|
laydate = layui.laydate;
|
70
|
-
|
50
|
+
table = layui.table;
|
71
51
|
|
72
52
|
laydate.render({
|
73
53
|
elem: '#date',
|
74
54
|
range: true
|
75
55
|
});
|
76
56
|
|
57
|
+
|
58
|
+
|
77
59
|
table.render({
|
78
|
-
elem: '#
|
60
|
+
elem: '#money_plan_table',
|
79
61
|
url: '/missions/money_plans',
|
80
|
-
toolbar: '#
|
81
|
-
totalRow: true,
|
62
|
+
toolbar: '#toolbar_money_plan',
|
82
63
|
defaultToolbar: ['filter'],
|
83
64
|
initSort: {
|
84
65
|
field: 'date_at' //排序字段,对应 cols 设定的各字段名
|
@@ -90,42 +71,85 @@
|
|
90
71
|
field: 'id',
|
91
72
|
width: 80,
|
92
73
|
title:'序号',type: 'numbers',
|
93
|
-
totalRowText:'本页/总计'
|
94
74
|
},
|
95
75
|
{
|
96
|
-
|
76
|
+
field: 'number',
|
77
|
+
width: 120,
|
78
|
+
title: '合同编号'
|
79
|
+
},
|
80
|
+
{
|
81
|
+
field: 'business_name',
|
82
|
+
width: 150,
|
83
|
+
title: '合同名称'
|
84
|
+
},
|
85
|
+
{
|
86
|
+
field: 'school',
|
87
|
+
width: 180,
|
88
|
+
title: '客户名称'
|
89
|
+
},
|
90
|
+
{
|
91
|
+
field: 'staff_manages',
|
97
92
|
width: 120,
|
98
|
-
|
99
|
-
|
93
|
+
title: '销售经理'
|
94
|
+
},
|
95
|
+
{
|
96
|
+
field: 'category',
|
97
|
+
width: 120,
|
98
|
+
title: '回款类别',
|
100
99
|
},
|
101
100
|
{
|
102
101
|
field: 'amount',
|
103
|
-
width:
|
102
|
+
width: 120,
|
104
103
|
sort: true,
|
105
|
-
|
106
|
-
title: '回款金额',
|
104
|
+
title: '金额',
|
107
105
|
},
|
108
106
|
{
|
109
|
-
field: '
|
107
|
+
field: 'rate',
|
110
108
|
width: 100,
|
111
|
-
title: '
|
109
|
+
title: '比例',
|
112
110
|
},
|
113
111
|
{
|
114
|
-
field: '
|
115
|
-
|
116
|
-
|
117
|
-
|
112
|
+
field: 'payment_clause',
|
113
|
+
width: 200,
|
114
|
+
title: '付款条款',
|
118
115
|
},
|
119
116
|
{
|
120
|
-
|
121
|
-
|
122
|
-
|
117
|
+
field: 'date_at',
|
118
|
+
width: 150,
|
119
|
+
title: '计划回款时间',
|
120
|
+
},
|
121
|
+
{
|
122
|
+
field: 'return_period',
|
123
|
+
width: 120,
|
124
|
+
title: '回款周期',
|
125
|
+
},
|
126
|
+
{
|
127
|
+
field: 'state',
|
128
|
+
width: 100,
|
129
|
+
title: '回款状态',
|
130
|
+
},
|
131
|
+
{
|
132
|
+
field: 'stage',
|
133
|
+
width: 100,
|
134
|
+
title: '阶段',
|
123
135
|
},
|
124
136
|
{
|
125
|
-
field: '
|
126
|
-
width:
|
127
|
-
title: '
|
137
|
+
field: 'accounts_state',
|
138
|
+
width: 150,
|
139
|
+
title: '应收款类型',
|
128
140
|
},
|
141
|
+
{
|
142
|
+
field: 'busireceipt_state',
|
143
|
+
width: 120,
|
144
|
+
title: '开票状态',
|
145
|
+
},
|
146
|
+
{
|
147
|
+
title: '操作',
|
148
|
+
minWidth: 200,
|
149
|
+
toolbar: '#currentTableBarmoney_plan',
|
150
|
+
align: "center",
|
151
|
+
fixed: 'right'
|
152
|
+
}
|
129
153
|
]
|
130
154
|
],
|
131
155
|
limit: 20,
|
@@ -134,10 +158,10 @@
|
|
134
158
|
});
|
135
159
|
|
136
160
|
var sort = {}, search = {};
|
137
|
-
table.on('sort(
|
161
|
+
table.on('sort(money_plan_table)', function (obj) {
|
138
162
|
sort.field = obj.field;
|
139
163
|
sort.order = obj.type;
|
140
|
-
table.reload('
|
164
|
+
table.reload('money_plan_table', {
|
141
165
|
initSort: obj,
|
142
166
|
where: {
|
143
167
|
sort: sort,
|
@@ -149,7 +173,7 @@
|
|
149
173
|
// 监听搜索操作
|
150
174
|
form.on('submit(search_teachers)', function (data) {
|
151
175
|
search = data.field
|
152
|
-
table.reload('
|
176
|
+
table.reload('money_plan_table', {
|
153
177
|
page: {
|
154
178
|
curr: 1
|
155
179
|
},
|
@@ -172,10 +196,31 @@
|
|
172
196
|
return false;
|
173
197
|
});
|
174
198
|
|
175
|
-
table.on('
|
199
|
+
table.on('toolbar(money_plan_table)', function ( obj) {
|
200
|
+
console.log(111)
|
201
|
+
if (obj.event == 'addMoney') {
|
202
|
+
var content = miniPage.getHrefContent('/missions/money_plans/add')
|
203
|
+
var openWH = miniPage.getOpenWidthHeight();
|
204
|
+
sindex = layer.open({
|
205
|
+
title: '添加回款计划',
|
206
|
+
type: 1,
|
207
|
+
shade: 0.2,
|
208
|
+
maxmin: true,
|
209
|
+
shadeClose: true,
|
210
|
+
area: [openWH[0] + 'px', openWH[1] + 'px'],
|
211
|
+
offset: [openWH[2] + 'px', openWH[3] + 'px'],
|
212
|
+
content: content
|
213
|
+
});
|
214
|
+
$(window).on("resize", function () {
|
215
|
+
layer.full(sindex);
|
216
|
+
});
|
217
|
+
}
|
218
|
+
})
|
219
|
+
|
220
|
+
table.on('tool(money_plan_table)', function (obj) {
|
176
221
|
var data = obj.data;
|
177
222
|
id = data.id
|
178
|
-
if (obj.event === '
|
223
|
+
if (obj.event === 'add_money_plan') { // 监听添加操作
|
179
224
|
var content = miniPage.getHrefContent('/missions/businesses/show_follow_record?follow_up_id=' + data.id);
|
180
225
|
var openWH = miniPage.getOpenWidthHeight();
|
181
226
|
show_index = layer.open({
|
@@ -216,7 +261,16 @@
|
|
216
261
|
});
|
217
262
|
</script>
|
218
263
|
<style>
|
219
|
-
|
220
|
-
|
221
|
-
|
264
|
+
.layui-table-tool-temp {
|
265
|
+
padding-right: 30px;
|
266
|
+
!important;
|
267
|
+
}
|
268
|
+
|
269
|
+
.layui-table-fixed .layui-table-body {
|
270
|
+
height: auto!important;
|
271
|
+
}
|
272
|
+
|
273
|
+
.layui-table-fixed.layui-hide {
|
274
|
+
display: block!important;
|
275
|
+
}
|
222
276
|
</style>
|
@@ -0,0 +1,147 @@
|
|
1
|
+
<div style="padding:10px">
|
2
|
+
<div class="layui-form layuimini-form" lay-filter="searchform">
|
3
|
+
<div class="layui-form-item">
|
4
|
+
<label class="layui-form-label required" style="width: 80px !important;">合同名称:</label>
|
5
|
+
<div class="layui-input-inline">
|
6
|
+
<div id="business" style="width:600px;"></div>
|
7
|
+
</div>
|
8
|
+
</div>
|
9
|
+
<div class="layui-form-item">
|
10
|
+
<div class="layui-inline">
|
11
|
+
<label class="layui-form-label required">回款类别:</label>
|
12
|
+
<div class="layui-input-inline">
|
13
|
+
<%= select_tag "category[0]", options_for_select(EducodeSales::MoneyPlan.categories.keys), { 'lay-filter': 'category', 'lay-verify': "required", include_blank: true, "lay-search": "" } %>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
<div class="layui-inline">
|
17
|
+
<label class="layui-form-label required" style="width:50px;">金额:</label>
|
18
|
+
<div class="layui-input-inline">
|
19
|
+
<input type="text" name="amount[0]" value="" class="layui-input" lay-verify="required">
|
20
|
+
</div>
|
21
|
+
</div>
|
22
|
+
<div class="layui-inline">
|
23
|
+
<label class="layui-form-label required" style="width: 110px;">计划回款时间:</label>
|
24
|
+
<div class="layui-input-inline">
|
25
|
+
<input type="text" name="date_at[0]" value="" class="layui-input" lay-verify="required" id="date_at">
|
26
|
+
</div>
|
27
|
+
</div>
|
28
|
+
<div class="layui-inline">
|
29
|
+
<label class="layui-form-label">付款条件:</label>
|
30
|
+
<div class="layui-input-inline">
|
31
|
+
<input type="text" name="payment_clause[0]" value="" class="layui-input">
|
32
|
+
</div>
|
33
|
+
</div>
|
34
|
+
<div class="layui-inline">
|
35
|
+
<button class="layui-btn" id="addInput">+</button>
|
36
|
+
</div>
|
37
|
+
</div>
|
38
|
+
<div id="wraper"></div>
|
39
|
+
<div class="layui-form-item">
|
40
|
+
<div class="layui-input-block">
|
41
|
+
<button class="layui-btn layui-btn-normal" lay-submit lay-filter="saveBtn">保存</button>
|
42
|
+
</div>
|
43
|
+
</div>
|
44
|
+
</div>
|
45
|
+
</div>
|
46
|
+
<script type="text/html" id="input_wraper">
|
47
|
+
<div class="layui-form-item">
|
48
|
+
<div class="layui-inline">
|
49
|
+
<label class="layui-form-label required">回款类别:</label>
|
50
|
+
<div class="layui-input-inline">
|
51
|
+
<%= select_tag "category[{{d.num}}]", options_for_select(EducodeSales::MoneyPlan.categories.keys), { 'lay-filter': 'category', 'lay-verify': "required", include_blank: true, "lay-search": "" } %>
|
52
|
+
</div>
|
53
|
+
</div>
|
54
|
+
<div class="layui-inline">
|
55
|
+
<label class="layui-form-label required" style="width:50px;">金额:</label>
|
56
|
+
<div class="layui-input-inline">
|
57
|
+
<input type="text" name="amount[{{d.num}}]" value="" class="layui-input" lay-verify="required">
|
58
|
+
</div>
|
59
|
+
</div>
|
60
|
+
<div class="layui-inline">
|
61
|
+
<label class="layui-form-label required" style="width: 110px;">计划回款时间:</label>
|
62
|
+
<div class="layui-input-inline">
|
63
|
+
<input type="text" name="date_at[{{d.num}}]" value="" class="layui-input date_{{d.num}}" lay-verify="required">
|
64
|
+
</div>
|
65
|
+
</div>
|
66
|
+
<div class="layui-inline">
|
67
|
+
<label class="layui-form-label">付款条件:</label>
|
68
|
+
<div class="layui-input-inline">
|
69
|
+
<input type="text" name="payment_clause[{{d.num}}]" value="" class="layui-input">
|
70
|
+
</div>
|
71
|
+
</div>
|
72
|
+
</div>
|
73
|
+
</script>
|
74
|
+
|
75
|
+
<script>
|
76
|
+
|
77
|
+
layui.use(['form', 'table', 'upload', 'laytpl', 'request', 'laydate', 'selectInput'], function() {
|
78
|
+
var form = layui.form,
|
79
|
+
layer = layui.layer,
|
80
|
+
table = layui.table,
|
81
|
+
laydate = layui.laydate,
|
82
|
+
laytpl = layui.laytpl,
|
83
|
+
request = layui.request,
|
84
|
+
selectInput = layui.selectInput,
|
85
|
+
$ = layui.$;
|
86
|
+
form.render();
|
87
|
+
|
88
|
+
laydate.render({
|
89
|
+
elem: '#date_at',
|
90
|
+
});
|
91
|
+
|
92
|
+
|
93
|
+
var business_id = "";
|
94
|
+
var business_select = selectInput.render({
|
95
|
+
elem: '#business',
|
96
|
+
name: 'bussiness_name', // 渲染的input的name值
|
97
|
+
layFilter: 'test', //同layui form参数lay-filter
|
98
|
+
layVerType: 'tips', // 同layui form参数lay-verType
|
99
|
+
layReqText: '请填写文本', //同layui form参数lay-ReqText
|
100
|
+
hasSelectIcon: false,
|
101
|
+
placeholder: '请输入合同名称', // 渲染的inputplaceholder值
|
102
|
+
remoteSearch: true, // 是否启用远程搜索 默认是false,和远程搜索回调保存同步
|
103
|
+
remoteMethod: function (value, cb) { // 远程搜索的回调函数
|
104
|
+
if (!value) {
|
105
|
+
business_id = "";
|
106
|
+
return cb([]);
|
107
|
+
}
|
108
|
+
request.get('missions/search_contracts?q=' + value, {}, function (res) {
|
109
|
+
if (res.data.length == 0) {
|
110
|
+
business_select.emptyValue();
|
111
|
+
return cb([])
|
112
|
+
}
|
113
|
+
return cb(res)
|
114
|
+
})
|
115
|
+
}
|
116
|
+
});
|
117
|
+
|
118
|
+
|
119
|
+
var num = 0;
|
120
|
+
$("#addInput").on("click", function() {
|
121
|
+
num += 1;
|
122
|
+
var getTpl = input_wraper.innerHTML, view = document.getElementById('wraper');
|
123
|
+
laytpl(getTpl).render({num: num}, function(html){
|
124
|
+
$(view).append(html);
|
125
|
+
});
|
126
|
+
form.render();
|
127
|
+
laydate.render({
|
128
|
+
elem: '.date_' + num,
|
129
|
+
});
|
130
|
+
})
|
131
|
+
|
132
|
+
|
133
|
+
form.on('submit(saveBtn)', function(data) {
|
134
|
+
data.field.num = num;
|
135
|
+
data.field.business_id = business_select.getValue() || business_id;
|
136
|
+
if (data.field.business_id == '') {
|
137
|
+
layer.msg('请选择合同')
|
138
|
+
return false;
|
139
|
+
}
|
140
|
+
request.post("missions/money_plans/", data.field, function(res) {
|
141
|
+
layer.close(parent.sindex)
|
142
|
+
parent.table.reload('money_plan_table')
|
143
|
+
})
|
144
|
+
return false;
|
145
|
+
});
|
146
|
+
});
|
147
|
+
</script>
|
@@ -2,20 +2,53 @@ total_amount = 0
|
|
2
2
|
json.data do
|
3
3
|
json.array! @money_plans do |d|
|
4
4
|
json.id d.id
|
5
|
+
json.business_name d.business.name
|
5
6
|
json.date_at (d&.date_at&.to_s(:date) || "")
|
6
7
|
json.amount d.amount
|
7
|
-
total_amount += d.amount
|
8
8
|
json.clazz d.clazz
|
9
|
-
json.business d.
|
10
|
-
json.business_id d.
|
11
|
-
json.school
|
12
|
-
json.school_id
|
9
|
+
json.business d.business.name
|
10
|
+
json.business_id d.business.id
|
11
|
+
json.school d.business.school.name
|
12
|
+
json.school_id d.business.school_id
|
13
13
|
json.staff d.staff.user.real_name
|
14
|
+
json.number d.business.number
|
15
|
+
json.category d.category || ''
|
16
|
+
json.payment_clause d.payment_clause
|
17
|
+
json.stage d.business&.last_follow_up&.stage&.name || ''
|
18
|
+
json.return_period d.return_period
|
19
|
+
json.signed_date d.business&.last_follow_up&.signed_date
|
20
|
+
json.actual_amount d.business&.last_follow_up&.actual_amount
|
21
|
+
json.rate d.business&.last_follow_up&.actual_amount ? (d.amount / d.business.last_follow_up.actual_amount * 100.0).round(2) : ''
|
22
|
+
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
|
23
|
+
if d['claim_num'] > 0
|
24
|
+
json.state '已回款'
|
25
|
+
elsif d['claim_num'] == 0 && d.date_at < Time.now
|
26
|
+
json.state '正常'
|
27
|
+
else
|
28
|
+
json.state '已逾期'
|
29
|
+
end
|
30
|
+
if d['claim_num'] > 0
|
31
|
+
json.accounts_state ''
|
32
|
+
else
|
33
|
+
case d.business&.last_follow_up&.stage&.name
|
34
|
+
when '已中标'
|
35
|
+
json.accounts_state '中标应收款'
|
36
|
+
when '已签单'
|
37
|
+
json.accounts_state '合同应收款'
|
38
|
+
when '已部署'
|
39
|
+
json.accounts_state '部署应收款'
|
40
|
+
when '已验收'
|
41
|
+
json.accounts_state '验收应收款'
|
42
|
+
when '已回款'
|
43
|
+
json.accounts_state '质保金'
|
44
|
+
when '已开票'
|
45
|
+
json.accounts_state '开票应收款'
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
14
50
|
end
|
15
51
|
end
|
16
52
|
|
17
|
-
json.totalRow do
|
18
|
-
json.amount total_amount.round(2).to_s + '/' + @total_amount.round(2).to_s
|
19
|
-
end
|
20
53
|
json.code 0
|
21
54
|
json.count @money_plans.total_count
|
@@ -0,0 +1,55 @@
|
|
1
|
+
<%= Gon::Base.render_data %>
|
2
|
+
<div class="layui-tab" lay-filter="money_plan_tab">
|
3
|
+
<ul class="layui-tab-title">
|
4
|
+
<li class="layui-this">回款计划</li>
|
5
|
+
<li class="">回款记录</li>
|
6
|
+
<li class="">开票记录</li>
|
7
|
+
</ul>
|
8
|
+
<div class="layui-tab-content">
|
9
|
+
<div class="layui-tab-item layui-show">
|
10
|
+
<%=render 'index' %>
|
11
|
+
</div>
|
12
|
+
<div class="layui-tab-item">
|
13
|
+
<div id="monley_plan_record_wraper"></div>
|
14
|
+
</div>
|
15
|
+
<div class="layui-tab-item">
|
16
|
+
<div id="invoice_wraper"></div>
|
17
|
+
</div>
|
18
|
+
</div>
|
19
|
+
</div>
|
20
|
+
|
21
|
+
<script>
|
22
|
+
layui.use(['form', 'table', 'miniPage', 'element', 'request', 'laydate', 'element'], function() {
|
23
|
+
var $ = layui.jquery,
|
24
|
+
form = layui.form,
|
25
|
+
request = layui.request,
|
26
|
+
dropdown = layui.dropdown,
|
27
|
+
miniPage = layui.miniPage,
|
28
|
+
element = layui.element,
|
29
|
+
laydate = layui.laydate;
|
30
|
+
var laydate = layui.laydate;
|
31
|
+
|
32
|
+
|
33
|
+
|
34
|
+
element.render();
|
35
|
+
element.on('tab(money_plan_tab)', function(data) {
|
36
|
+
if (data.index == 1 && $("#money_plan_record").length == 0) {
|
37
|
+
loadPage('/missions/money_plan_records')
|
38
|
+
} else if (data.index == 2 && $("#invoice_wraper").length == 0) {
|
39
|
+
}
|
40
|
+
});
|
41
|
+
|
42
|
+
|
43
|
+
function loadPage(url) {
|
44
|
+
var layer_index = layer.load(0, {shade: [0.1, '#fff']});
|
45
|
+
Rails.ajax({
|
46
|
+
url: url,
|
47
|
+
type: 'GET',
|
48
|
+
dataType: "script",
|
49
|
+
success: function (res) {
|
50
|
+
layer.close(layer_index);
|
51
|
+
}
|
52
|
+
});
|
53
|
+
}
|
54
|
+
})
|
55
|
+
</script>
|
@@ -45,6 +45,12 @@
|
|
45
45
|
<input type="text" name="delivery_date" value="<%= @sale_detail.delivery_date %>" class="layui-input" lay-verify="required" id="delivery_date">
|
46
46
|
</div>
|
47
47
|
</div>
|
48
|
+
<div class="layui-inline">
|
49
|
+
<label class="layui-form-label required">知识产权归属:</label>
|
50
|
+
<div class="layui-input-inline">
|
51
|
+
<%= select_tag "proprietorship", options_for_select(EducodeSales::SalesDetail.proprietorships.keys, @sale_detail.proprietorship), { 'lay-filter': 'proprietorship', 'lay-verify': "required", include_blank: true, "lay-search": "" } %>
|
52
|
+
</div>
|
53
|
+
</div>
|
48
54
|
</div>
|
49
55
|
<div class="layui-form-item">
|
50
56
|
<div class="layui-input-block">
|
@@ -160,7 +160,7 @@
|
|
160
160
|
});
|
161
161
|
});
|
162
162
|
|
163
|
-
|
163
|
+
user_input = selectInput.render({
|
164
164
|
elem: '#teacher',
|
165
165
|
name: 'name', // 渲染的input的name值
|
166
166
|
layFilter: 'teacher',
|
@@ -201,7 +201,7 @@
|
|
201
201
|
form.on('submit(add_keys)', function (data) {
|
202
202
|
data.field.name = user_input.getValue()
|
203
203
|
if (data.field.name == "") {
|
204
|
-
data.field.name = gon.teacher;
|
204
|
+
data.field.name = $("#"+user_input._input).val() // gon.teacher;
|
205
205
|
}
|
206
206
|
|
207
207
|
request.authPost("missions/follow_ups/" + parent.follow_up_id + "/add_keys", data.field, function (res) {
|
@@ -72,7 +72,7 @@
|
|
72
72
|
</dd>
|
73
73
|
<% end %>
|
74
74
|
<% if can? :read, EducodeSales::MoneyPlan %>
|
75
|
-
<dd><a href="/missions/money_plans" class="<%= current?('layui-this',
|
75
|
+
<dd><a href="/missions/money_plans/list" class="<%= current?('layui-this', list_money_plans_path) %>"><i style="padding-right: 35px"></i><%= image_tag "educode_sales/money_plans.png",size:"15"%><i style="font-size: 25px; padding-right: 15px"></i>回款管理</a>
|
76
76
|
</dd>
|
77
77
|
<% end %>
|
78
78
|
<% if can? :read, EducodeSales::Customer %>
|
data/config/routes.rb
CHANGED
@@ -19,7 +19,8 @@ EducodeSales::Engine.routes.draw do
|
|
19
19
|
get :filter, to: "application#filter"
|
20
20
|
get :search_activity, to: "home#search_activity"
|
21
21
|
get :search_customer, to: "home#search_customer"
|
22
|
-
|
22
|
+
get :search_contracts, to: "home#search_contracts"
|
23
|
+
get :search_money_plans, to: "home#search_money_plans"
|
23
24
|
|
24
25
|
resources :sessions do
|
25
26
|
end
|
@@ -62,6 +63,20 @@ EducodeSales::Engine.routes.draw do
|
|
62
63
|
resources :customer_follows do
|
63
64
|
end
|
64
65
|
resources :money_plans do
|
66
|
+
collection do
|
67
|
+
get :list
|
68
|
+
get :add
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
resources :money_plan_records do
|
73
|
+
collection do
|
74
|
+
get :add
|
75
|
+
get :confirm_plan
|
76
|
+
end
|
77
|
+
member do
|
78
|
+
post :confirm
|
79
|
+
end
|
65
80
|
end
|
66
81
|
|
67
82
|
resources :customers do
|
@@ -0,0 +1,7 @@
|
|
1
|
+
class AddCategoryToEducodeSalesMoneyPlans < ActiveRecord::Migration[5.2]
|
2
|
+
def change
|
3
|
+
add_column :educode_sales_money_plans, :category, :integer
|
4
|
+
add_column :educode_sales_money_plans, :payment_clause, :string
|
5
|
+
add_column :educode_sales_money_plans, :business_id, :integer
|
6
|
+
end
|
7
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class CreateEducodeSalesMoneyPlanRecords < ActiveRecord::Migration[5.2]
|
2
|
+
def change
|
3
|
+
create_table :educode_sales_money_plan_records do |t|
|
4
|
+
t.references :business
|
5
|
+
t.date :date_at
|
6
|
+
t.float :amount
|
7
|
+
t.string :payer_name
|
8
|
+
t.references :staff
|
9
|
+
|
10
|
+
t.timestamps
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class CreateEducodeSalesMoneyPlanClaims < ActiveRecord::Migration[5.2]
|
2
|
+
def change
|
3
|
+
create_table :educode_sales_money_plan_claims do |t|
|
4
|
+
t.references :money_plan
|
5
|
+
t.references :money_plan_record
|
6
|
+
t.references :staff
|
7
|
+
t.float :amount
|
8
|
+
|
9
|
+
t.timestamps
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|