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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/educode_sales/businesses_controller.rb +3 -0
  3. data/app/controllers/educode_sales/contracts_controller.rb +17 -1
  4. data/app/controllers/educode_sales/follow_ups_controller.rb +13 -12
  5. data/app/controllers/educode_sales/home_controller.rb +14 -0
  6. data/app/controllers/educode_sales/key_person_controller.rb +1 -1
  7. data/app/controllers/educode_sales/money_plan_records_controller.rb +103 -0
  8. data/app/controllers/educode_sales/money_plans_controller.rb +32 -28
  9. data/app/controllers/educode_sales/sales_details_controller.rb +1 -1
  10. data/app/controllers/educode_sales/teachers_controller.rb +7 -2
  11. data/app/models/educode_sales/business.rb +3 -0
  12. data/app/models/educode_sales/key_person.rb +1 -1
  13. data/app/models/educode_sales/money_plan.rb +27 -0
  14. data/app/models/educode_sales/money_plan_claim.rb +7 -0
  15. data/app/models/educode_sales/money_plan_record.rb +7 -0
  16. data/app/views/educode_sales/businesses/edit_plan.html.erb +1 -1
  17. data/app/views/educode_sales/businesses/key_person.json.jbuilder +1 -1
  18. data/app/views/educode_sales/follow_ups/index.json.jbuilder +1 -1
  19. data/app/views/educode_sales/follow_ups/teachers.json.jbuilder +1 -1
  20. data/app/views/educode_sales/home/search_contracts.json.jbuilder +9 -0
  21. data/app/views/educode_sales/home/search_money_plans.json.jbuilder +9 -0
  22. data/app/views/educode_sales/money_plan_records/_index.html.erb +231 -0
  23. data/app/views/educode_sales/money_plan_records/add.html.erb +101 -0
  24. data/app/views/educode_sales/money_plan_records/confirm_plan.html.erb +167 -0
  25. data/app/views/educode_sales/money_plan_records/index.js.erb +1 -0
  26. data/app/views/educode_sales/money_plan_records/index.json.jbuilder +26 -0
  27. data/app/views/educode_sales/money_plans/{index.html.erb → _index.html.erb} +119 -65
  28. data/app/views/educode_sales/money_plans/add.html.erb +147 -0
  29. data/app/views/educode_sales/money_plans/index.json.jbuilder +41 -8
  30. data/app/views/educode_sales/money_plans/list.html.erb +55 -0
  31. data/app/views/educode_sales/sales_details/edit.html.erb +6 -0
  32. data/app/views/educode_sales/teachers/add_keys.html.erb +2 -2
  33. data/app/views/layouts/educode_sales/application.html.erb +1 -1
  34. data/config/routes.rb +16 -1
  35. data/db/migrate/20230527150102_add_category_to_educode_sales_money_plans.rb +7 -0
  36. data/db/migrate/20230528115654_create_educode_sales_money_plan_records.rb +13 -0
  37. data/db/migrate/20230529022020_create_educode_sales_money_plan_claims.rb +12 -0
  38. data/lib/educode_sales/version.rb +1 -1
  39. metadata +18 -3
@@ -0,0 +1,231 @@
1
+ <div style="margin: 10px 10px 10px 10px" id="money_plan_record">
2
+ <form class="layui-form layui-form-pane" lay-filter="submit_form_record">
3
+ <div class="layui-form-item">
4
+ <div class="layui-inline">
5
+ <label class="layui-form-label">付款单位</label>
6
+ <div class="layui-input-inline">
7
+ <input type="text" name="payer_name" class="layui-input">
8
+ </div>
9
+ </div>
10
+ <div class="layui-inline">
11
+ <label class="layui-form-label">回款金额</label>
12
+ <div class="layui-input-inline">
13
+ <input type="text" name="amount" class="layui-input">
14
+ </div>
15
+ </div>
16
+ <div class="layui-inline">
17
+ <label class="layui-form-label">回款日期</label>
18
+ <div class="layui-input-inline">
19
+ <input type="text" name="date_at" class="layui-input" id="date">
20
+ </div>
21
+ </div>
22
+ <div class="layui-inline">
23
+ <label class="layui-form-label required">匹配状态</label>
24
+ <div class="layui-input-inline">
25
+ <%= select_tag "state", options_for_select(['已认领', '待认领', '无对应合同', '无对应应收款']), { 'lay-filter': 'state', include_blank: true, "lay-search": "" } %>
26
+ </div>
27
+ </div>
28
+ <div class="layui-inline">
29
+ <button type="reset" class="layui-btn layui-btn-primary" lay-submit
30
+ lay-filter="reset_business_search_record">重置
31
+ </button>
32
+ <button type="submit" class="layui-btn layui-btn-primary" id="search_bt" lay-submit
33
+ lay-filter="submit_form_record">搜 索
34
+ </button>
35
+ </div>
36
+ </div>
37
+ </form>
38
+ </div>
39
+ <script type="text/html" id="toolbar_money_plan_record">
40
+ <button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn pull-right" style="margin-left: 20px;"
41
+ lay-event="add_record">添加回款记录</button>
42
+ </script>
43
+
44
+ <table class="layui-hide" id="money_plan_record_table" lay-filter="money_plan_record_table"></table>
45
+
46
+ <script type="text/html" id="school">
47
+ <a href="<%= base_url%>/colleges/{{d.school_id}}/statistics" class="layui-table-link"
48
+ target="_blank">{{ d.school }}</a>
49
+ </script>
50
+
51
+ <script type="text/html" id="currentTableBarmoney_record">
52
+ <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="confirm">认领回款</a>
53
+ </script>
54
+
55
+ <script>
56
+ layui.use(['form', 'table', 'miniPage', 'element', 'request'], function() {
57
+ var $ = layui.jquery,
58
+ form = layui.form,
59
+ request = layui.request,
60
+ miniPage = layui.miniPage;
61
+ laydate = layui.laydate;
62
+ table = layui.table;
63
+ laydate.render({
64
+ elem: '#date',
65
+ range: true
66
+ });
67
+ form.render();
68
+ table.render({
69
+ elem: '#money_plan_record_table',
70
+ url: '/missions/money_plan_records',
71
+ toolbar: '#toolbar_money_plan_record',
72
+ defaultToolbar: ['filter'],
73
+ initSort: {
74
+ field: 'date_at' //排序字段,对应 cols 设定的各字段名
75
+ ,
76
+ type: 'desc' //排序方式 asc: 升序、desc: 降序、null: 默认排序
77
+ },
78
+ cols: [
79
+ [{
80
+ field: 'id',
81
+ width: 80,
82
+ title: '序号',
83
+ type: 'numbers',
84
+ },
85
+ {
86
+ field: 'payer_name',
87
+ width: 180,
88
+ title: '付款单位'
89
+ },
90
+ {
91
+ field: 'amount',
92
+ width: 150,
93
+ title: '回款金额'
94
+ },
95
+ {
96
+ field: 'date_at',
97
+ width: 180,
98
+ title: '回款日期'
99
+ },
100
+ {
101
+ field: 'business',
102
+ width: 180,
103
+ title: '对应合同名称'
104
+ },
105
+ {
106
+ field: 'number',
107
+ width: 120,
108
+ title: '合同编号',
109
+ },
110
+ {
111
+ field: 'school',
112
+ width: 220,
113
+ title: '对应客户名称',
114
+ },
115
+ {
116
+ field: 'state',
117
+ width: 120,
118
+ title: '匹配状态',
119
+ },
120
+ {
121
+ title: '操作',
122
+ minWidth: 200,
123
+ toolbar: '#currentTableBarmoney_record',
124
+ align: "center",
125
+ fixed: 'right'
126
+ }
127
+ ]
128
+ ],
129
+ limit: 20,
130
+ limits: [10, 15, 20, 30, 40, 50, 60, 70, 80, 90],
131
+ page: true
132
+ });
133
+ var sort = {},
134
+ search = {};
135
+ table.on('sort(money_plan_record_table)', function(obj) {
136
+ sort.field = obj.field;
137
+ sort.order = obj.type;
138
+ table.reload('money_plan_record_table', {
139
+ initSort: obj,
140
+ where: {
141
+ sort: sort,
142
+ q: search
143
+ }
144
+ });
145
+ })
146
+ // 监听搜索操作
147
+ form.on('submit(submit_form_record)', function(data) {
148
+ search = data.field
149
+ table.reload('money_plan_record_table', {
150
+ page: {
151
+ curr: 1
152
+ },
153
+ where: {
154
+ q: search,
155
+ sort: sort
156
+ }
157
+ }, 'data');
158
+ return false;
159
+ });
160
+ form.on('submit(reset_business_search_record)', function(data) {
161
+ var field = data.field;
162
+ form.val('submit_form_record', {
163
+ area: "",
164
+ date: "",
165
+ staff_id: "",
166
+ clazz: "",
167
+ professional_title: "",
168
+ school: "",
169
+ business: ""
170
+ });
171
+ return false;
172
+ });
173
+ table.on('toolbar(money_plan_record_table)', function(obj) {
174
+ if (obj.event == 'add_record') {
175
+ var content = miniPage.getHrefContent('/missions/money_plan_records/add')
176
+ var openWH = miniPage.getOpenWidthHeight();
177
+ sindex = layer.open({
178
+ title: '添加回款记录',
179
+ type: 1,
180
+ shade: 0.2,
181
+ maxmin: true,
182
+ shadeClose: true,
183
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
184
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
185
+ content: content
186
+ });
187
+ $(window).on("resize", function() {
188
+ layer.full(sindex);
189
+ });
190
+ }
191
+ })
192
+ table.on('tool(money_plan_record_table)', function(obj) {
193
+ var data = obj.data;
194
+ id = data.id;
195
+ state = data.state;
196
+ if (obj.event === 'confirm') { // 监听添加操作
197
+ var content = miniPage.getHrefContent('/missions/money_plan_records/confirm_plan?id=' + id)
198
+ var openWH = miniPage.getOpenWidthHeight();
199
+ sindex = layer.open({
200
+ title: '认领回款',
201
+ type: 1,
202
+ shade: 0.2,
203
+ maxmin: true,
204
+ shadeClose: true,
205
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
206
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
207
+ content: content
208
+ });
209
+ $(window).on("resize", function() {
210
+ layer.full(sindex);
211
+ });
212
+ } else if (obj.event === 'business') {
213
+
214
+ }
215
+ });
216
+ });
217
+ </script>
218
+ <style>
219
+ .layui-table-tool-temp {
220
+ padding-right: 30px;
221
+ !important;
222
+ }
223
+
224
+ .layui-table-fixed .layui-table-body {
225
+ height: auto !important;
226
+ }
227
+
228
+ .layui-table-fixed.layui-hide {
229
+ display: block !important;
230
+ }
231
+ </style>
@@ -0,0 +1,101 @@
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" 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
+ <input type="text" name="payer_name" value="" class="layui-input" lay-verify="required">
14
+ </div>
15
+ </div>
16
+ <div class="layui-inline">
17
+ <label class="layui-form-label required">回款金额:</label>
18
+ <div class="layui-input-inline">
19
+ <input type="text" name="amount" 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" value="" class="layui-input" lay-verify="required" id="date_at">
26
+ </div>
27
+ </div>
28
+
29
+ </div>
30
+ <div id="wraper"></div>
31
+ <div class="layui-form-item">
32
+ <div class="layui-input-block">
33
+ <button class="layui-btn layui-btn-normal" lay-submit lay-filter="saveBtn">保存</button>
34
+ </div>
35
+ </div>
36
+ </div>
37
+ </div>
38
+
39
+ <script>
40
+ layui.use(['form', 'table', 'upload', 'laytpl', 'request', 'laydate', 'selectInput'], function() {
41
+ var form = layui.form,
42
+ layer = layui.layer,
43
+ table = layui.table,
44
+ laydate = layui.laydate,
45
+ laytpl = layui.laytpl,
46
+ request = layui.request,
47
+ selectInput = layui.selectInput,
48
+ $ = layui.$;
49
+ form.render();
50
+ laydate.render({
51
+ elem: '#date_at',
52
+ });
53
+ var business_id = "";
54
+ var business_select = selectInput.render({
55
+ elem: '#business',
56
+ name: 'bussiness_name', // 渲染的input的name值
57
+ layFilter: 'test', //同layui form参数lay-filter
58
+ layVerType: 'tips', // 同layui form参数lay-verType
59
+ layReqText: '请填写文本', //同layui form参数lay-ReqText
60
+ hasSelectIcon: false,
61
+ placeholder: '请输入合同名称', // 渲染的inputplaceholder值
62
+ remoteSearch: true, // 是否启用远程搜索 默认是false,和远程搜索回调保存同步
63
+ remoteMethod: function(value, cb) { // 远程搜索的回调函数
64
+ if (!value) {
65
+ business_id = "";
66
+ return cb([]);
67
+ }
68
+ request.get('missions/search_contracts?q=' + value, {}, function(res) {
69
+ if (res.data.length == 0) {
70
+ business_select.emptyValue();
71
+ return cb([])
72
+ }
73
+ return cb(res)
74
+ })
75
+ }
76
+ });
77
+ var num = 0;
78
+ $("#addInput").on("click", function() {
79
+ num += 1;
80
+ var getTpl = input_wraper.innerHTML,
81
+ view = document.getElementById('wraper');
82
+ laytpl(getTpl).render({
83
+ num: num
84
+ }, function(html) {
85
+ $(view).append(html);
86
+ });
87
+ form.render();
88
+ laydate.render({
89
+ elem: '.date_' + num,
90
+ });
91
+ })
92
+ form.on('submit(saveBtn)', function(data) {
93
+ data.field.business_id = business_select.getValue() || business_id;
94
+ request.post("missions/money_plan_records", data.field, function(res) {
95
+ layer.close(parent.sindex)
96
+ parent.table.reload('money_plan_record_table')
97
+ })
98
+ return false;
99
+ });
100
+ });
101
+ </script>
@@ -0,0 +1,167 @@
1
+ <%= Gon::Base.render_data %>
2
+ <div style="padding:10px">
3
+ <div class="layui-form layuimini-form" lay-filter="searchform">
4
+ <div class="layui-form-item">
5
+ <div class="layui-inline">
6
+ <label class="layui-form-label required" style="width:130px;">付款单位:</label>
7
+ <div class="layui-input-inline" style="line-height:38px;">
8
+ <%= @money_plan_record.payer_name %>
9
+ </div>
10
+ </div>
11
+ <div class="layui-inline">
12
+ <label class="layui-form-label required">回款金额:</label>
13
+ <div class="layui-input-inline" style="line-height:38px;">
14
+ <%= @money_plan_record.amount %>
15
+ </div>
16
+ </div>
17
+ <div class="layui-inline">
18
+ <label class="layui-form-label required" style="width: 110px;">回款日期:</label>
19
+ <div class="layui-input-inline" style="line-height:38px;">
20
+ <%= @money_plan_record.date_at.to_s(:date) %>
21
+ </div>
22
+ </div>
23
+ <div class="layui-inline">
24
+ <label class="layui-form-label" >状态匹配:</label>
25
+ <div class="layui-input-inline" style="line-height:38px;">
26
+ <span id="state_name"></span>
27
+ </div>
28
+ </div>
29
+ <div class="layui-form-item" style="margin-bottom: 0px;">
30
+ <label class="layui-form-label required" style="width: 130px !important;">对应回款计划:</label>
31
+ <div class="layui-inline">
32
+ <div id="money_plan_0" style="width:400px;"></div>
33
+ </div>
34
+ <div class="layui-inline">
35
+ <label class="layui-form-label required">金额:</label>
36
+ <div class="layui-input-inline">
37
+ <input type="text" name="amount[0]" value="<%= @money_plan_claim&.amount %>" class="layui-input" lay-verify="required">
38
+ </div>
39
+ </div>
40
+ <div class="layui-inline">
41
+ <button class="layui-btn" id="addPlan">+</button>
42
+ </div>
43
+ </div>
44
+
45
+ </div>
46
+ <div id="wraper"></div>
47
+ <div class="layui-form-item">
48
+ <div class="layui-input-block">
49
+ <button class="layui-btn layui-btn-normal" lay-submit lay-filter="saveBtn">保存</button>
50
+ </div>
51
+ </div>
52
+ </div>
53
+ </div>
54
+ <script type="text/html" id="input_wraper">
55
+ <div class="layui-form-item">
56
+ <label class="layui-form-label required" style="width: 130px !important;">对应回款计划:</label>
57
+ <div class="layui-inline">
58
+ <div id="money_plan_{{d.num}}" style="width:400px;"></div>
59
+ </div>
60
+ <div class="layui-inline">
61
+ <label class="layui-form-label required">金额:</label>
62
+ <div class="layui-input-inline">
63
+ <input type="text" name="amount[{{d.num}}]" value="{{d.amount||''}}" class="layui-input" lay-verify="required">
64
+ </div>
65
+ </div>
66
+ </div>
67
+ </script>
68
+
69
+ <script>
70
+
71
+ layui.use(['form', 'table', 'upload', 'laytpl', 'request', 'laydate', 'selectInput'], function() {
72
+ var form = layui.form,
73
+ layer = layui.layer,
74
+ table = layui.table,
75
+ laydate = layui.laydate,
76
+ laytpl = layui.laytpl,
77
+ request = layui.request,
78
+ selectInput = layui.selectInput,
79
+ $ = layui.$;
80
+ form.render();
81
+
82
+ laydate.render({
83
+ elem: '#date_at',
84
+ });
85
+
86
+ state_name.innerText = parent.state;
87
+
88
+ business_select_list = {};
89
+ num = 0;
90
+ setInput(0);
91
+
92
+ $("#addPlan").on("click", function() {
93
+ num += 1;
94
+ var getTpl = input_wraper.innerHTML, view = document.getElementById('wraper');
95
+ laytpl(getTpl).render({num: num}, function(html){
96
+ $(view).append(html);
97
+ });
98
+ form.render();
99
+ setInput(num);
100
+ })
101
+
102
+ if (gon.money_plan_ids.length > 1) {
103
+ for(var i=0; i<gon.money_plan_ids.length-1; i++) {
104
+ num += 1;
105
+ var getTpl = input_wraper.innerHTML, view = document.getElementById('wraper');
106
+ laytpl(getTpl).render({num: num, amount: gon.money_plan_claim_amount[num]}, function(html){
107
+ $(view).append(html);
108
+ });
109
+ form.render();
110
+ setInput(num);
111
+ }
112
+ }
113
+
114
+
115
+ function setInput(num) {
116
+ business_select_list['num_'+ num] = selectInput.render({
117
+ elem: '#money_plan_' + num,
118
+ layVerify: 'required',
119
+ initValue: gon.money_plan_ids[num],
120
+ data: gon.money_plan_records[num],
121
+ name: 'bussiness_name',
122
+ layFilter: 'test',
123
+ layVerType: 'tips',
124
+ layReqText: '请填写文本',
125
+ hasSelectIcon: false,
126
+ placeholder: '请输入回款计划名称/合同编号',
127
+ remoteSearch: true,
128
+ remoteMethod: function (value, cb) {
129
+ if (!value) {
130
+ return cb([]);
131
+ }
132
+ request.get('missions/search_money_plans?q=' + value, {}, function (res) {
133
+ if (res.data.length == 0) {
134
+ console.log("8888888")
135
+ business_select_list['num_'+ num].emptyValue();
136
+ return cb([])
137
+ }
138
+ return cb(res)
139
+ })
140
+ }
141
+ });
142
+ if (gon.money_plan_ids[num]) {
143
+ business_select_list['num_'+ num].tmpSelectValue = gon.money_plan_ids[num];
144
+ }
145
+ }
146
+
147
+
148
+ form.on('submit(saveBtn)', function(data) {
149
+ data.field.money_plan_ids = [];
150
+ for(var i=0; i<= num; i++) {
151
+ var money_plan_id = business_select_list['num_' + i].getValue();
152
+ console.log(i, money_plan_id)
153
+ if (money_plan_id == "") {
154
+ layer.msg('请选择计划')
155
+ return false;
156
+ }
157
+ data.field.money_plan_ids.push(money_plan_id)
158
+ }
159
+ data.field.num = num;
160
+ request.post("missions/money_plan_records/" + parent.id + "/confirm", data.field, function(res) {
161
+ layer.close(parent.sindex)
162
+ parent.table.reload('money_plan_record_table')
163
+ })
164
+ return false;
165
+ });
166
+ });
167
+ </script>
@@ -0,0 +1 @@
1
+ $("#monley_plan_record_wraper").html("<%= j render 'index' %>");
@@ -0,0 +1,26 @@
1
+ total_amount = 0
2
+ json.data do
3
+ json.array! @money_plan_records do |d|
4
+ json.id d.id
5
+ json.business_name d.business&.name
6
+ json.date_at d.date_at.to_s(:date)
7
+ json.amount d.amount
8
+ json.business d.business&.name
9
+ json.business_id d.business_id
10
+ json.school d.business&.school&.name
11
+ json.school_id d.business&.school_id
12
+ json.staff d.staff.user.real_name
13
+ json.number d.business&.number
14
+ json.payer_name d.payer_name
15
+ if d['claim_num'] > 0
16
+ json.state '已认领'
17
+ elsif d.business&.name.nil?
18
+ json.state '无对应合同'
19
+ else
20
+ json.state '待认领'
21
+ end
22
+ end
23
+ end
24
+
25
+ json.code 0
26
+ json.count @money_plan_records.total_count