Commit | Line | Data |
---|---|---|
6a488035 TO |
1 | {* |
2 | +--------------------------------------------------------------------+ | |
1188c7a8 | 3 | | Copyright CiviCRM LLC. All rights reserved. | |
6a488035 | 4 | | | |
1188c7a8 TO |
5 | | This work is published under the GNU AGPLv3 license with some | |
6 | | permitted exceptions and without any warranty. For full license | | |
7 | | and copyright information, see https://civicrm.org/licensing | | |
6a488035 TO |
8 | +--------------------------------------------------------------------+ |
9 | *} | |
10 | ||
11 | {* Financial search component. *} | |
12 | <div id="enableDisableStatusMsg" class="crm-container" style="display:none"></div> | |
f850beb4 | 13 | <div class="action-link"> |
13a3d214 | 14 | <a accesskey="N" href="{crmURL p='civicrm/financial/batch' q="reset=1&action=add&context=$batchStatus"}" id="newBatch" class="button"><span><i class="crm-i fa-plus-circle" aria-hidden="true"></i> {ts}New Accounting Batch{/ts}</span></a> |
6a488035 TO |
15 | </div> |
16 | <div class="crm-form-block crm-search-form-block"> | |
17 | <div class="crm-accordion-wrapper crm-activity_search-accordion"> | |
18 | <div class="crm-accordion-header"> | |
19 | {ts}Filter Results{/ts} | |
20 | </div> | |
21 | <div class="crm-accordion-body"> | |
22 | <div id="financial-search-form" class="crm-block crm-form-block"> | |
23 | <table class="form-layout-compressed"> | |
16d7b9f4 | 24 | {if !empty($elements)} |
6a488035 TO |
25 | {* Loop through all defined search criteria fields (defined in the buildForm() function). *} |
26 | {foreach from=$elements item=element} | |
27 | <tr class="crm-financial-search-form-block-{$element}"> | |
28 | <td class="label">{$form.$element.label}</td> | |
29 | <td>{$form.$element.html}</td> | |
30 | </tr> | |
31 | {/foreach} | |
16d7b9f4 | 32 | {/if} |
6a488035 TO |
33 | </table> |
34 | </div> | |
35 | </div> | |
36 | </div> | |
37 | </div> | |
16d7b9f4 | 38 | {if !empty($form.batch_update)}<div class="form-layout-compressed">{$form.batch_update.html} {$form.submit.html}</div><br/>{/if} |
24e7a504 | 39 | <table id="crm-batch-selector-{$batchStatus}" class="row-highlight"> |
6a488035 TO |
40 | <thead> |
41 | <tr> | |
16d7b9f4 | 42 | <th class="crm-batch-checkbox">{if !empty($form.toggleSelect.html)}{$form.toggleSelect.html}{/if}</th> |
6a488035 | 43 | <th class="crm-batch-name">{ts}Batch Name{/ts}</th> |
536f0e02 | 44 | <th class="crm-batch-payment_instrument">{ts}Payment Method{/ts}</th> |
6a488035 TO |
45 | <th class="crm-batch-item_count">{ts}Item Count{/ts}</th> |
46 | <th class="crm-batch-total">{ts}Total Amount{/ts}</th> | |
47 | <th class="crm-batch-status">{ts}Status{/ts}</th> | |
48 | <th class="crm-batch-created_by">{ts}Created By{/ts}</th> | |
49 | <th></th> | |
50 | </tr> | |
51 | </thead> | |
52 | </table> | |
53 | {include file="CRM/Form/validate.tpl"} | |
54 | {literal} | |
55 | <script type="text/javascript"> | |
3cc60a06 | 56 | CRM.$(function($) { |
6a488035 TO |
57 | var batchSelector; |
58 | buildBatchSelector(); | |
6f9cd76f | 59 | $("#batch_update").prop('disabled', false); |
6a488035 | 60 | |
f8db8a66 CW |
61 | $('#financial-search-form :input') |
62 | .change(function() { | |
63 | if (!$(this).hasClass('crm-inline-error')) { | |
64 | batchSelector.fnDraw(); | |
65 | } | |
66 | }) | |
67 | .keypress(function(event) { | |
68 | if (event.which == 13) { | |
69 | event.preventDefault(); | |
70 | $(this).change(); | |
71 | return false; | |
72 | } | |
73 | }); | |
6a488035 TO |
74 | |
75 | var checkedRows = []; | |
76 | function buildBatchSelector() { | |
77 | var ZeroRecordText = {/literal}'<div class="status messages">{ts escape="js"}No Accounting Batches match your search criteria.{/ts}</div>'{literal}; | |
78 | var sourceUrl = {/literal}'{crmURL p="civicrm/ajax/batchlist" h=0 q="snippet=4&context=financialBatch"}'{literal}; | |
79 | ||
24e7a504 | 80 | batchSelector = $('#crm-batch-selector-{/literal}{$batchStatus}{literal}').dataTable({ |
6a488035 TO |
81 | "bFilter" : false, |
82 | "bAutoWidth" : false, | |
83 | "aaSorting" : [], | |
84 | "aoColumns" : [ | |
85 | {sClass:'crm-batch-checkbox', bSortable:false}, | |
86 | {sClass:'crm-batch-name'}, | |
87 | {sClass:'crm-batch-payment_instrument'}, | |
6209e779 PN |
88 | {sClass:'crm-batch-item_count right', bSortable:false}, |
89 | {sClass:'crm-batch-total right', bSortable:false}, | |
6a488035 TO |
90 | {sClass:'crm-batch-status'}, |
91 | {sClass:'crm-batch-created_by'}, | |
92 | {sClass:'crm-batch-links', bSortable:false}, | |
93 | ], | |
94 | "bProcessing": true, | |
95 | "asStripClasses" : ["odd-row", "even-row"], | |
96 | "sPaginationType": "full_numbers", | |
97 | "sDom" : '<"crm-datatable-pager-top"lfp>rt<"crm-datatable-pager-bottom"ip>', | |
98 | "bServerSide": true, | |
99 | "bJQueryUI": true, | |
100 | "sAjaxSource": sourceUrl, | |
101 | "iDisplayLength": 25, | |
102 | "oLanguage": { | |
103 | "sZeroRecords": ZeroRecordText, | |
104 | "sProcessing": {/literal}"{ts escape='js'}Processing...{/ts}"{literal}, | |
105 | "sLengthMenu": {/literal}"{ts escape='js'}Show _MENU_ entries{/ts}"{literal}, | |
106 | "sInfo": {/literal}"{ts escape='js'}Showing _START_ to _END_ of _TOTAL_ entries{/ts}"{literal}, | |
107 | "sInfoEmpty": {/literal}"{ts escape='js'}Showing 0 to 0 of 0 entries{/ts}"{literal}, | |
108 | "sInfoFiltered": {/literal}"{ts escape='js'}(filtered from _MAX_ total entries) {/ts}"{literal}, | |
109 | "sSearch": {/literal}"{ts escape='js'}Search:{/ts}"{literal}, | |
110 | "oPaginate": { | |
111 | "sFirst": {/literal}"{ts escape='js'}First{/ts}"{literal}, | |
112 | "sPrevious": {/literal}"{ts escape='js'}Previous{/ts}"{literal}, | |
113 | "sNext": {/literal}"{ts escape='js'}Next{/ts}"{literal}, | |
114 | "sLast": {/literal}"{ts escape='js'}Last{/ts}"{literal} | |
115 | } | |
116 | }, | |
117 | "fnServerParams": function (aoData) { | |
118 | $('#financial-search-form :input').each(function() { | |
119 | if ($(this).val()) { | |
120 | aoData.push( | |
121 | {name:$(this).attr('id'), value: $(this).val()} | |
122 | ); | |
123 | } | |
124 | }); | |
125 | checkedRows = []; | |
24e7a504 | 126 | $("#crm-batch-selector-{/literal}{$batchStatus}{literal} input.select-row:checked").each(function() { |
6a488035 TO |
127 | checkedRows.push('#' + $(this).attr('id')); |
128 | }); | |
129 | }, | |
130 | "fnRowCallback": function(nRow, aData, iDisplayIndex, iDisplayIndexFull) { | |
131 | var box = $(aData[0]); | |
132 | var id = box.attr('id').replace('check_', ''); | |
133 | $(nRow).addClass('crm-entity').attr('data-entity', 'batch').attr('data-id', id).attr('data-status_id', box.attr('data-status_id')); | |
134 | $('td:eq(1)', nRow).wrapInner('<div class="crm-editable crmf-title" />'); | |
135 | return nRow; | |
136 | }, | |
137 | "fnDrawCallback": function(oSettings) { | |
30b7642c | 138 | $(this).trigger('crmLoad'); |
6a488035 TO |
139 | $("#toggleSelect").prop('checked', false); |
140 | if (checkedRows.length) { | |
141 | $(checkedRows.join(',')).prop('checked', true).change(); | |
142 | } | |
143 | } | |
144 | }); | |
145 | } | |
146 | ||
147 | function editRecords(records, op) { | |
148 | records = validateOp(records, op); | |
149 | if (records.length) { | |
150 | $("#enableDisableStatusMsg").dialog({ | |
151 | title: {/literal}'{ts escape="js"}Confirm Changes{/ts}'{literal}, | |
152 | modal: true, | |
6a488035 TO |
153 | open:function() { |
154 | switch (op) {{/literal} | |
155 | case 'reopen': | |
156 | var msg = '<h3>{ts escape="js"}Are you sure you want to re-open:{/ts}</h3>'; | |
157 | break; | |
158 | case 'delete': | |
159 | var msg = '<h3>{ts escape="js"}Are you sure you want to delete:{/ts}</h3>'; | |
160 | break; | |
161 | case 'close': | |
162 | var msg = '<h3>{ts escape="js"}Are you sure you want to close:{/ts}</h3>'; | |
163 | break; | |
164 | case 'export': | |
165 | var msg = '<h3>{ts escape="js"}Export:{/ts}</h3>\ | |
166 | <div>\ | |
167 | <label>{ts escape="js"}Format:{/ts}</label>\ | |
168 | <select class="export-format">\ | |
169 | <option value="IIF">IIF</option>\ | |
170 | <option value="CSV">CSV</option>\ | |
171 | </select>\ | |
172 | </div>'; | |
173 | break; | |
174 | {literal}} | |
175 | msg += listRecords(records, op == 'close' || op == 'export'); | |
176 | $('#enableDisableStatusMsg').show().html(msg); | |
177 | }, | |
178 | buttons: { | |
179 | {/literal}"{ts escape='js'}Cancel{/ts}"{literal}: function() { | |
180 | $(this).dialog("close"); | |
181 | }, | |
182 | {/literal}"{ts escape='js'}OK{/ts}{literal}": function() { | |
183 | saveRecords(records, op); | |
184 | $(this).dialog("close"); | |
185 | } | |
186 | } | |
187 | }); | |
188 | } | |
189 | } | |
190 | ||
191 | function listRecords(records, compareValues) { | |
192 | var txt = '<ul>', | |
193 | mismatch = false; | |
194 | for (var i in records) { | |
195 | var $tr = $('tr[data-id=' + records[i] + ']'); | |
196 | txt += '<li>' + $('.crmf-title', $tr).text(); | |
197 | if (compareValues) { | |
198 | $('.actual-value.crm-error', $tr).each(function() { | |
199 | mismatch = true; | |
200 | var $th = $tr.closest('table').find('th').eq($(this).closest('td').index()); | |
201 | var $expected = $(this).siblings('.expected-value'); | |
202 | var label = $th.text(); | |
203 | var actual = $(this).text(); | |
204 | var expected = $expected.text(); | |
205 | txt += {/literal}'<div class="messages crm-error"><strong>' + | |
206 | label + ' {ts escape="js"}mismatch.{/ts}</strong><br />{ts escape="js"}Expected{/ts}: ' + expected + '<br />{ts escape="js"}Current Total{/ts}: ' + actual + '</div>'{literal}; | |
207 | }); | |
208 | } | |
209 | txt += '</li>'; | |
210 | } | |
211 | txt += '</ul>'; | |
212 | if (mismatch) { | |
213 | txt += {/literal}'<div class="messages status">{ts escape="js"}Click OK to override and update expected values.{/ts}</div>'{literal} | |
214 | } | |
215 | return txt; | |
216 | } | |
217 | ||
218 | function saveRecords(records, op) { | |
6a488035 TO |
219 | var postUrl = CRM.url('civicrm/ajax/rest', 'className=CRM_Financial_Page_AJAX&fnName=assignRemove'); |
220 | //post request and get response | |
221 | $.post(postUrl, {records: records, recordBAO: 'CRM_Batch_BAO_Batch', op: op, key: {/literal}"{crmKey name='civicrm/ajax/ar'}"{literal}}, | |
222 | function(response) { | |
223 | //this is custom status set when record update success. | |
224 | if (response.status == 'record-updated-success') { | |
5de2e536 PN |
225 | //Redirect CRM-18169 |
226 | window.location.href = CRM.url('civicrm/financial/financialbatches', 'reset=1&batchStatus=' + response.status_id); | |
6a488035 | 227 | CRM.alert(listRecords(records), op == 'delete' ? {/literal}'{ts escape="js"}Deleted{/ts}' : '{ts escape="js"}Updated{/ts}'{literal}, 'success'); |
6a488035 TO |
228 | } |
229 | else { | |
230 | CRM.alert({/literal}'{ts escape="js"}An error occurred while processing your request.{/ts}', $("#batch_update option[value=" + op + "]").text() + ' {ts escape="js"}Error{/ts}'{literal}, 'error'); | |
231 | } | |
232 | }, | |
d9ef1fd1 | 233 | 'json').fail(serverError); |
6a488035 TO |
234 | } |
235 | ||
6a488035 TO |
236 | function validateOp(records, op) { |
237 | switch (op) { | |
238 | case 'reopen': | |
239 | var notAllowed = [1, 5]; | |
240 | break; | |
241 | case 'close': | |
242 | var notAllowed = [2, 5]; | |
243 | break; | |
244 | case 'export': | |
245 | var notAllowed = [5]; | |
246 | break; | |
247 | default: | |
248 | return records; | |
249 | } | |
250 | var len = records.length; | |
251 | var invalid = {}; | |
252 | var i = 0; | |
253 | while (i < len) { | |
254 | var status = $('tr[data-id='+records[i]+']').data('status_id'); | |
255 | if ($.inArray(status, notAllowed) >= 0) { | |
256 | $('#check_' + records[i] + ':checked').prop('checked', false).change(); | |
257 | invalid[status] = invalid[status] || []; | |
258 | invalid[status].push(records[i]); | |
259 | records.splice(i, 1); | |
260 | --len; | |
261 | } | |
262 | else { | |
263 | i++; | |
264 | } | |
265 | } | |
266 | for (status in invalid) { | |
267 | i = invalid[status]; | |
268 | var msg = (i.length == 1 ? {/literal}'{ts escape="js"}This record already has the status{/ts}' : '{ts escape="js"}The following records already have the status{/ts}'{literal}) + ' ' + $('tr[data-id='+i[0]+'] .crm-batch-status').text() + ':' + listRecords(i); | |
269 | CRM.alert(msg, {/literal}'{ts escape="js"}Cannot{/ts} '{literal} + $("#batch_update option[value=" + op + "]").text()); | |
270 | } | |
271 | return records; | |
272 | } | |
273 | ||
274 | function serverError() { | |
275 | CRM.alert({/literal}'{ts escape="js"}No response from the server. Check your internet connection and try reloading the page.{/ts}', '{ts escape="js"}Network Error{/ts}'{literal}, 'error'); | |
276 | } | |
277 | ||
278 | $('#Go').click(function() { | |
279 | var op = $("#batch_update").val(); | |
280 | if (op == "") { | |
281 | CRM.alert({/literal}'{ts escape="js"}Please select an action from the menu.{/ts}', '{ts escape="js"}No Action Selected{/ts}'{literal}); | |
282 | } | |
283 | else if (!$("input.select-row:checked").length) { | |
284 | CRM.alert({/literal}'{ts escape="js"}Please select one or more batches for this action.{/ts}', '{ts escape="js"}No Batches Selected{/ts}'{literal}); | |
285 | } | |
286 | else { | |
287 | records = []; | |
288 | $("input.select-row:checked").each(function() { | |
289 | records.push($(this).attr('id').replace('check_', '')); | |
290 | }); | |
10c5467b JG |
291 | if (op == 'export') { |
292 | // No need for the modal pop-up, just proceed to the next screen. | |
293 | window.location = CRM.url("civicrm/financial/batch/export", {reset: 1, id: records[0], status: 1}); | |
294 | return false; | |
295 | } | |
6a488035 TO |
296 | editRecords(records, op); |
297 | } | |
298 | return false; | |
299 | }); | |
300 | ||
301 | $('#crm-container').on('click', 'a.action-item[href="#"]', function(event) { | |
302 | event.stopImmediatePropagation(); | |
303 | editRecords([$(this).closest('tr').attr('data-id')], $(this).attr('rel')); | |
304 | return false; | |
305 | }); | |
306 | ||
307 | }); | |
308 | ||
309 | </script> | |
310 | {/literal} |