Bug 29684: Fix warn about js/locale_data.js (paycollect.pl)
[koha.git] / koha-tmpl / intranet-tmpl / prog / en / modules / members / paycollect.tt
1 [% USE raw %]
2 [% USE Asset %]
3 [% USE Koha %]
4 [% USE Branches %]
5 [% USE Registers %]
6 [% USE Price %]
7 [% SET footerjs = 1 %]
8 [% PROCESS 'accounts.inc' %]
9 [% INCLUDE 'doc-head-open.inc' %]
10 [% BLOCK cash_register_required %]
11     <div id="error_message" class="dialog message">
12         <p>
13             You must have at least one cash register associated with the library before you can record payments.
14         </p>
15         [% IF ( CAN_user_parameters_manage_cash_registers ) %]
16             <form action="/cgi-bin/koha/admin/cash_registers.pl" method="get">
17                 <input type="hidden" name="op" value="add_form" />
18                 <button class="new" type="submit"><i class="fa fa-plus"></i> Create a new cash register</button>
19             </form>
20         [% END %]
21     </div>
22 [% END %]
23 [% SET registers = Registers.all( filters => { current_branch => 1 } ) %]
24 <title>
25     [% IF type == 'WRITEOFF' %]
26         Write off an amount for [% patron.firstname | html %] [% patron.surname | html %]
27     [% ELSE %]
28         Collect fine payment for [% patron.firstname | html %] [% patron.surname | html %]
29     [% END %] &rsaquo; Patrons &rsaquo; Koha
30 </title>
31 [% INCLUDE 'doc-head-close.inc' %]
32 </head>
33
34 <body id="pat_paycollect" class="pat">
35 [% INCLUDE 'header.inc' %]
36 [% INCLUDE 'patron-search.inc' %]
37
38 <nav id="breadcrumbs" aria-label="Breadcrumb" class="breadcrumb">
39     <ol>
40         <li>
41             <a href="/cgi-bin/koha/mainpage.pl">Home</a>
42         </li>
43         <li>
44             <a href="/cgi-bin/koha/members/members-home.pl">Patrons</a>
45         </li>
46         <li>
47             <a href="/cgi-bin/koha/members/pay.pl?borrowernumber=[% patron.borrowernumber | uri %]">Pay charges for [% patron.firstname | html %] [% patron.surname | html %]</a>
48         </li>
49         <li>
50             <a href="#" aria-current="page">
51                 [% IF ( pay_individual ) %]
52                     Pay an individual fine
53                 [% ELSIF ( writeoff_individual ) %]
54                     Write off an individual fine
55                 [% ELSE %]
56                     [% IF ( selected_accts ) %]
57                         [% IF type == 'WRITEOFF' %]
58                             Write off an amount toward selected fines
59                         [% ELSE %]
60                             Pay an amount toward selected fines
61                         [% END %]
62                     [% ELSE %]
63                         Pay an amount toward all fines
64                     [% END %]
65                 [% END %]
66             </a>
67         </li>
68     </ol>
69 </nav>
70
71 <div class="main container-fluid">
72     <div class="row">
73         <div class="col-sm-10 col-sm-push-2">
74             <main>
75
76 [% INCLUDE 'members-toolbar.inc' borrowernumber=patron.borrowernumber %]
77
78
79 <!-- The manual invoice and credit buttons -->
80 <div class="statictabs">
81 <ul>
82     <li>
83     <a href="/cgi-bin/koha/members/boraccount.pl?borrowernumber=[% patron.borrowernumber | uri %]">Transactions</a>
84     </li>
85     <li class="active">
86     <a href="/cgi-bin/koha/members/pay.pl?borrowernumber=[% patron.borrowernumber | uri %]" >Make a payment</a>
87     </li>
88     <li>
89     <a href="/cgi-bin/koha/members/maninvoice.pl?borrowernumber=[% patron.borrowernumber | uri %]" >Create manual invoice</a>
90     </li>
91     <li>
92     <a href="/cgi-bin/koha/members/mancredit.pl?borrowernumber=[% patron.borrowernumber | uri %]" >Create manual credit</a>
93     </li>
94 </ul>
95 <div class="tabs-container">
96 [% IF ( error_over ) %]
97     <div id="error_message" class="dialog alert">
98     You must pay a value less than or equal to [% total_due | format('%.2f') %].
99     </div>
100 [% END %]
101 [% IF ( error_under ) %]
102     <div id="error_message" class="dialog alert">
103     You must collect a value greater than or equal to [% total_paid | format('%.2f') %].
104     </div>
105 [% END %]
106
107 [% IF ( pay_individual ) %]
108     [% IF Koha.Preference('UseCashRegisters') && ( registers.size == 0 ) %]
109         [% PROCESS 'cash_register_required' %]
110     [% ELSE %]
111
112     <ul class="nav nav-pills">
113         <li role="presentation" class="active"><a>Pay</a></li>
114         <li role="presentation"><a href="/cgi-bin/koha/members/paycollect.pl?writeoff_individual=1&borrowernumber=[% patron.borrowernumber | uri %]&debit_type_code=[% debit_type_code | uri %]&amount=[% amount | uri %]&amountoutstanding=[% amountoutstanding | uri %]&description=[% individual_description | uri %]&itemnumber=[% itemnumber | uri %]&accountlines_id=[% accountlines_id | uri %]&payment_note=[% payment_note | uri %]">Write off</a></li>
115     </ul>
116
117     <form name="payindivfine" id="payindivfine" method="post" action="/cgi-bin/koha/members/paycollect.pl">
118     <input type="hidden" name="csrf_token" value="[% csrf_token | html %]" />
119     <input type="hidden" name="borrowernumber" id="borrowernumber" value="[% patron.borrowernumber | html %]" />
120     <input type="hidden" name="pay_individual" id="pay_individual" value="[% pay_individual | html %]" />
121     <input type="hidden" name="itemnumber" id="itemnumber" value="[% itemnumber | html %]" />
122     <input type="hidden" name="description" id="description" value="[% individual_description | html %]" />
123     <input type="hidden" name="debit_type_code" id="debit_type_code" value="[% debit_type_code | html %]" />
124     <input type="hidden" name="amount" id="amount" value="[% amount | html %]" />
125     <input type="hidden" name="amountoutstanding" id="amountoutstanding" value="[% amountoutstanding | html %]" />
126     <input type="hidden" name="accountlines_id" id="accountlines_id" value="[% accountlines_id | html %]" />
127     <input type="hidden" name="title" id="title" value="[% borrower_data.title | html %]" />
128     <input type="hidden" name="change_given" id="change_given" />
129
130 <fieldset class="rows">
131     <legend>Pay an individual fine</legend>
132     <input type="hidden" name="payment_note" id="payment_note" value="[% payment_note | html %]" />
133     <table>
134     <thead><tr>
135             <th>Description</th>
136             <th>Account type</th>
137             <th>Amount</th>
138             <th>Amount outstanding</th>
139         </tr></thead>
140     <tfoot>
141         <tr><td colspan="3">Total amount payable:</td><td>[% amountoutstanding | format('%.2f') %]</td></tr>
142     </tfoot>
143     <tbody><tr>
144             <td>
145                 [% individual_description | html %]
146             </td>
147             [% line.debit_type_code = debit_type_code %]
148             <td>[% PROCESS account_type_description account=line %]</td>
149             <td class="debit">[% amount | format('%.2f') %]</td>
150             <td class="debit">[% amountoutstanding | format('%.2f') %]</td>
151         </tr></tbody>
152 </table>
153
154 <ol>
155
156     <li>
157         <label for="paid">Amount being paid: </label>
158         <input name="paid" id="paid" type="text" step="0.01" min="0" value="[% amountoutstanding | $Price on_editing => 1 %]"/>
159     </li>
160     <li>
161         <label for="collected">Amount tendered: </label>
162         <input name="collected" id="collected" type="text" step="0.01" min="0" value="[% amountoutstanding | $Price on_editing => 1 %]"/>
163     </li>
164     <li>
165         <label>Change to give: </label>
166         <span id="change">0.00</span>
167     </li>
168
169     [% INCLUDE 'transaction_types.inc' type="payment" %]
170
171     [% IF Koha.Preference('UseCashRegisters') %]
172     <li>
173         <label for="cash_register">Cash register: </label>
174         <select name="cash_register" id="cash_register">
175             <option id="noregister" disabled selected="selected" value="">-- Select an option--</option>
176             [% PROCESS options_for_registers %]
177         </select>
178     </li>
179     [% END %]
180 </ol>
181 </fieldset>
182
183         <div class="action">
184             <input type="submit" name="submitbutton" value="Confirm" />
185             <a class="cancel" href="/cgi-bin/koha/members/pay.pl?borrowernumber=[% patron.borrowernumber | html %]">Cancel</a>
186         </div>
187     </form>
188     [% END %]
189 [% ELSIF ( writeoff_individual ) %]
190     <ul class="nav nav-pills">
191         <li role="presentation"><a href="/cgi-bin/koha/members/paycollect.pl?pay_individual=1&borrowernumber=[% patron.borrowernumber | uri %]&debit_type_code=[% debit_type_code | uri %]&amount=[% amount | uri %]&amountoutstanding=[% amountoutstanding | uri %]&description=[% individual_description | uri %]&itemnumber=[% itemnumber | uri %]&accountlines_id=[% accountlines_id | uri %]&payment_note=[% payment_note | uri %]">Pay</a></li>
192         <li role="presentation" class="active"><a>Write off</a></li>
193     </ul>
194
195     <form name="woindivfine" id="woindivfine" action="/cgi-bin/koha/members/pay.pl" method="post" >
196     <input type="hidden" name="csrf_token" value="[% csrf_token | html %]" />
197     <fieldset class="rows">
198     <legend>Write off an individual fine</legend>
199     <input type="hidden" name="borrowernumber" id="borrowernumber" value="[% patron.borrowernumber | html %]" />
200     <input type="hidden" name="pay_individual" id="pay_individual" value="[% pay_individual | html %]" />
201     <input type="hidden" name="itemnumber" id="itemnumber" value="[% itemnumber | html %]" />
202     <input type="hidden" name="description" id="description" value="[% individual_description | html %]" />
203     <input type="hidden" name="debit_type_code" id="debit_type_code" value="[% debit_type_code | html %]" />
204     <input type="hidden" name="amount" id="amount" value="[% amount | html %]" />
205     <input type="hidden" name="accountlines_id" id="accountlines_id" value="[% accountlines_id | html %]" />
206     <input type="hidden" name="title" id="title" value="[% borrower_data.title | html %]" />
207     <input type="hidden" name="payment_note" id="payment_note" value="[% payment_note | html %]" />
208     <input type="hidden" name="amountoutstanding" id="amountoutstanding" value="[% amountoutstanding | html %]" />
209     <input type="hidden" name="confirm_writeoff" id="confirm_writeoff" value="1" />
210     <input type="hidden" name="change_given" id="change_given" />
211     <table>
212     <thead><tr>
213             <th>Description</th>
214             <th>Account type</th>
215             <th>Amount</th>
216             <th>Amount outstanding</th>
217         </tr></thead>
218     <tfoot><tr><td colspan="3">Total amount outstanding:</td><td>[% amountoutstanding | format('%.2f') %]</td></tr></tfoot>
219     <tbody><tr>
220             <td>[% individual_description | html %]</td>
221             [% line.debit_type_code = debit_type_code %]
222             <td>[% PROCESS account_type_description account=line %]</td>
223             <td class="debit">[% amount | format('%.2f') %]</td>
224             <td class="debit">[% amountoutstanding | format('%.2f') %]</td>
225         </tr></tbody>
226     </table>
227
228             <ol>
229                 <li>
230                     <label for="amountwrittenoff">Writeoff amount: </label>
231                     <!-- default to writing off all -->
232                     <input name="amountwrittenoff" id="amountwrittenoff" value="[% amountoutstanding | $Price on_editing => 1 %]" type="text" />
233                 </li>
234             </ol>
235         </fieldset>
236         <div class="action">
237             <input type="submit" value="Write off this charge" />
238             <a class="cancel" href="/cgi-bin/koha/members/pay.pl?borrowernumber=[% patron.borrowernumber | html %]">Cancel</a>
239         </div>
240     </form>
241 [% ELSE %]
242     [% IF Koha.Preference('UseCashRegisters') && ( registers.size == 0 ) && ( type != 'WRITEOFF' ) %]
243         [% PROCESS 'cash_register_required' %]
244     [% ELSE %]
245
246     [% IF selected_accts %]
247         <ul class="nav nav-pills">
248             [% IF type == 'WRITEOFF' %]
249                 <li role="presentation"><a href="/cgi-bin/koha/members/paycollect.pl?borrowernumber=[% patron.borrowernumber | uri %]&type=PAYMENT&amt=[% amt | uri %]&selected=[% selected_accts | uri %]&notes=[% selected_accts_notes | uri %]">Pay</a></li>
250                 <li role="presentation" class="active"><a>Write off</a></li>
251             [% ELSE %]
252                 <li role="presentation" class="active"><a>Pay</a></li>
253                 <li role="presentation"><a href="/cgi-bin/koha/members/paycollect.pl?borrowernumber=[% patron.borrowernumber | uri %]&type=WRITEOFF&amt=[% amt | uri %]&selected=[% selected_accts | uri %]&notes=[% selected_accts_notes | uri %]">Write off</a></li>
254             [% END %]
255         </ul>
256     [% END %]
257
258     <form name="payfine" id="payfine" method="post" action="/cgi-bin/koha/members/paycollect.pl">
259     <input type="hidden" name="csrf_token" value="[% csrf_token | html %]" />
260     <input type="hidden" name="borrowernumber" id="borrowernumber" value="[% patron.borrowernumber | html %]" />
261     <input type="hidden" name="selected_accts" id="selected_accts" value="[% selected_accts | html %]" />
262     <input type="hidden" name="total" id="total" value="[% total | html %]" />
263     <input type="hidden" name="type" value="[% type | html %]" />
264     <input type="hidden" name="change_given" id="change_given" />
265
266     <fieldset class="rows">
267     [% IF ( selected_accts ) %]
268         [% IF type == 'WRITEOFF' %]
269             <legend>Write off an amount toward selected fines</legend>
270         [% ELSE %]
271             <legend>Pay an amount toward selected fines</legend>
272         [% END %]
273     [% ELSE %]
274         <legend>Pay an amount toward all fines</legend>
275     [% END %]
276
277     <ol>
278         <li>
279             <span class="label">Total amount outstanding: </span>
280             <span class="debit">[% total | format('%.2f') %]</span>
281         </li>
282     <li>
283         [% IF type == 'WRITEOFF' %]
284             <label for="paid">Writeoff amount: </label>
285         [% ELSE %]
286             <label for="paid">Amount being paid: </label>
287         [% END %]
288         <input name="paid" id="paid" type="text" step="0.01" min="0" value="[% total | $Price on_editing => 1 %]"/>
289     </li>
290     [% IF type != 'WRITEOFF' %]
291         <li>
292             <label for="collected">Amount tendered: </label>
293             <input name="collected" id="collected" type="text" step="0.01" min="0" value="[% total | $Price on_editing => 1 %]"/>
294         </li>
295         <li>
296             <label>Change to give: </label>
297             <span id="change">0.00</span>
298         </li>
299
300     [% INCLUDE 'transaction_types.inc' type="payment" %]
301
302     [% IF Koha.Preference('UseCashRegisters') %]
303     <li>
304         <label for="cash_register">Cash register: </label>
305         <select name="cash_register" id="cash_register">
306             <option id="noregister" disabled selected="selected" value="">-- Select an option--</option>
307             [% PROCESS options_for_registers %]
308         </select>
309     </li>
310     [% END %]
311     [% END %]
312
313     <li>
314         <label for="selected_accts_notes">Note: </label>
315         <textarea name="selected_accts_notes" id="selected_accts_notes">[% selected_accts_notes | html %]</textarea>
316     </li>
317     </ol>
318     </fieldset>
319     <div class="action">
320         <input type="submit" name="submitbutton" value="Confirm" />
321         <a class="cancel" href="/cgi-bin/koha/members/pay.pl?borrowernumber=[% patron.borrowernumber | html %]">Cancel</a>
322     </div>
323     </form>
324     [% END %]
325 [% END %]
326 </div></div>
327
328             </main>
329         </div> <!-- /.col-sm-10.col-sm-push-2 -->
330
331         <div class="col-sm-2 col-sm-pull-10">
332             <aside>
333                 [% INCLUDE 'circ-menu.inc' %]
334             </aside>
335         </div> <!-- /.col-sm-2.col-sm-pull-10 -->
336      </div> <!-- /.row -->
337
338 <!-- Modal -->
339 <div id="confirm_change_form" class="modal" tabindex="-1" role="dialog" aria-hidden="true">
340     <div class="modal-dialog">
341         <div class="modal-content">
342             <div class="modal-header">
343                 <h3>The amount collected is more than the outstanding charge</h3>
344             </div>
345             <div class="modal-body">
346                 <p>The amount collected from the patron is higher than the amount to be paid.</p>
347                 <p>The change to give is <strong><span id="modal_change">0.00</span></strong>.</p>
348                 <p>Confirm this payment?</p>
349             </div>
350             <div class="modal-footer">
351                 <button class="btn btn-default approve" id="modal_submit" type="button"><i class="fa fa-check"></i> Yes</button>
352                 <button class="btn btn-default deny cancel" href="#" data-dismiss="modal" aria-hidden="true"><i class="fa fa-times"></i> No</button>
353             </div>
354         </div>
355     </div>
356 </div>
357
358 [% MACRO jsinclude BLOCK %]
359     [% INCLUDE 'str/members-menu.inc' %]
360     [% Asset.js("js/members-menu.js") | $raw %]
361     <script>
362         $(document).ready(function() {
363             [% IF payment_id && Koha.Preference('FinePaymentAutoPopup') %]
364                 window.open('/cgi-bin/koha/members/printfeercpt.pl?action=print&accountlines_id=[% payment_id | html %]&change_given=[% change_given | html %]&borrowernumber=[% patron.borrowernumber | html %]', '_blank');
365             [% END %]
366
367             var forms = $('#payindivfine, #payfine');
368             var change = $('#change')[0];
369
370             $('#payindivfine, #payfine').preventDoubleFormSubmit();
371             $("#paid, #collected").on("change",function() {
372                 moneyFormat( this );
373                 if (change != undefined) {
374                     updateChangeValues();
375                 }
376             });
377
378             if (change != undefined) {
379                 forms.on("submit", function(e) {
380                     if (change.innerHTML > 0.00) {
381                         e.preventDefault();
382                         $("#confirm_change_form").modal("show");
383                     } else {
384                         return true;
385                     }
386                 });
387             }
388
389             $("#confirm_change_form").on("hidden.bs.modal", function(){
390                 // remove class added by preventDoubleFormSubmit if necessary
391                 $("body, form input[type='submit'], form button[type='submit'], form a").removeClass('waiting');
392             });
393
394             $('#modal_submit').click(function() {
395                 forms[0].submit();
396             });
397
398             $( "#payindivfine, #payfine" ).validate({
399                 rules: {
400                     paid: { required: true },
401                     collected: {
402                         required: true
403                     },
404                     [% IF Koha.Preference('UseCashRegisters') %]
405                     cash_register: {
406                         required: function() {
407                             return $('#payment_type').val() == 'CASH'
408                         }
409                     }
410                     [% END %]
411                 },
412                 invalidHandler: function(event, validator) {
413                     // reset beenSubmitted for prevenDoubleFormSubmit
414                     event.target.beenSubmitted = false;
415                     // remove class added by preventDoubleFormSubmit
416                     $("body, form input[type='submit'], form button[type='submit'], form a").removeClass('waiting');
417                 }
418             });
419         });
420
421         prevent_default = 1;
422         $('#woindivfine').on('submit', function(e){
423             if ( prevent_default ) {
424                 e.preventDefault();
425
426                 let amount_outstanding = parseFloat( $('#amountoutstanding').attr('value') );
427                 let amount_writeoff = parseFloat( $('#amountwrittenoff').attr('value') );
428                 if ( amount_writeoff > amount_outstanding ) {
429                     alert(_("You are attemping to writeoff more than the value of the fee."));
430                     $('#woindivfine').beenSubmitted = false;
431                 } else {
432                     prevent_default = 0;
433                     $('#woindivfine').preventDoubleFormSubmit();
434                     $('#woindivfine').submit();
435                 }
436             }
437         });
438
439         function moneyFormat(textObj) {
440             var newValue = textObj.value;
441             var decAmount = "";
442             var dolAmount = "";
443             var decFlag   = false;
444             var aChar     = "";
445
446             for(i=0; i < newValue.length; i++) {
447                 aChar = newValue.substring(i, i+1);
448                 if (aChar >= "0" && aChar <= "9") {
449                     if(decFlag) {
450                         decAmount = "" + decAmount + aChar;
451                     }
452                     else {
453                         dolAmount = "" + dolAmount + aChar;
454                     }
455                 }
456                 if (aChar == ".") {
457                     if (decFlag) {
458                         dolAmount = "";
459                         break;
460                     }
461                     decFlag = true;
462                 }
463             }
464
465             if (dolAmount == "") {
466                 dolAmount = "0";
467             }
468         // Strip leading 0s
469             if (dolAmount.length > 1) {
470                 while(dolAmount.length > 1 && dolAmount.substring(0,1) == "0") {
471                     dolAmount = dolAmount.substring(1,dolAmount.length);
472                 }
473             }
474             if (decAmount.length > 2) {
475                 decAmount = decAmount.substring(0,2);
476             }
477         // Pad right side
478             if (decAmount.length == 1) {
479                decAmount = decAmount + "0";
480             }
481             if (decAmount.length == 0) {
482                decAmount = decAmount + "00";
483             }
484
485             textObj.value = dolAmount + "." + decAmount;
486         }
487
488         function updateChangeValues() {
489             var change = $('#change')[0];
490             change.innerHTML = Math.round(($('#collected')[0].value - $('#paid')[0].value) * 100) / 100;
491             if (change.innerHTML <= 0) {
492                 var paid = $('#paid')[0];
493                 moneyFormat(paid);
494                 $('#collected').rules( "add", { min: Number(paid.value) });
495                 $( "#payindivfine, #payfine" ).valid();
496                 change.innerHTML = "0.00";
497                 $('input[name="change_given"]').val('0.00');
498             } else {
499                 change.value = change.innerHTML;
500                 moneyFormat(change);
501                 change.innerHTML = change.value;
502                 $('input[name="change_given"]').val(change.value);
503             }
504
505             $('#modal_change').html(change.innerHTML);
506         }
507     </script>
508 [% END %]
509
510 [% INCLUDE 'intranet-bottom.inc' %]