9f3baf408bf05ef4042d167bbe8b857194d7aee7
[evergreen-equinox.git] / Open-ILS / src / eg2 / src / app / staff / circ / patron / bills.component.html
1 <eg-prompt-dialog #annotateDialog
2   i18n-dialogBody dialogBody="Please Annotate This Payment">
3 </eg-prompt-dialog>
4
5 <eg-alert-dialog #maxPayDialog
6   i18n-dialogBody dialogBody="Payments over 100,000 are denied by policy.">
7 </eg-alert-dialog>
8
9 <eg-alert-dialog #errorDialog i18n-dialogTitle dialogTitle="Error">
10 </eg-alert-dialog>
11
12 <eg-confirm-dialog #warnPayDialog
13   i18n-dialogBody i18n-dialogTitle dialogTitle="Confirm Payment Amount"
14   dialogBody="Are you sure you want to apply a payment of {{paymentAmount | currency}}?">
15 </eg-confirm-dialog>
16
17 <eg-confirm-dialog #voidBillsDialog
18   i18n-dialogBody i18n-dialogTitle dialogTitle="Void Billings"
19   dialogBody="Are you sure you would like to void {{voidAmount | currency}} 
20     in bills for the selected transactions?">
21 </eg-confirm-dialog>
22
23 <eg-confirm-dialog #adjustToZeroDialog *ngIf="billGrid"
24   i18n-dialogBody i18n-dialogTitle dialogTitle="Adjust To Zero"
25   dialogBody="Are you sure you would like to adjust to zero the balance 
26     on transactions {{billGrid.context.rowSelector.selected().join(',')}}?">
27 </eg-confirm-dialog>
28
29 <eg-confirm-dialog #refundDialog *ngIf="billGrid"
30   i18n-dialogBody i18n-dialogTitle dialogTitle="Adjust To Zero"
31   dialogBody="Are you sure you would like to refund excess payment on 
32     transaction(s) {{billGrid.context.rowSelector.selected().join(',')}}? 
33     This action will simply put the amount in the Payment Pending column as 
34     a negative value.  You must still select Apply Payment!  Certain types of 
35     payments may not be refunded.  The refund may be applied to checked 
36     transactions that follow the refunded transaction.">
37 </eg-confirm-dialog>
38
39
40 <eg-credit-card-dialog [patron]="patron()" #creditCardDialog>
41 </eg-credit-card-dialog>
42
43 <eg-add-billing-dialog [patronId]="patronId" #billingDialog>
44 </eg-add-billing-dialog>
45
46 <!-- SUMMARY  -->
47
48 <ng-container *ngIf="summary">
49   <div class="row border-bottom border-secondary pb-2 pt-2 mb-4">
50     <div class="col-lg-3 pr-0 mr-0 border-right">
51       <div class="d-flex pt-1 pb-1 striped">
52         <div class="flex-4" i18n>Total Owed:</div>
53         <div class="flex-1"
54           [ngClass]="{'font-weight-bold' : summary.balance_owed() > 0}">
55           {{summary.balance_owed() || 0 | currency}}</div>
56       </div>
57       <div class="d-flex pt-1 pb-1">
58         <div class="flex-4" i18n>Total Billed:</div>
59         <div class="flex-1">{{summary.total_owed() || 0 | currency}}</div>
60       </div>
61       <div class="d-flex pt-1 pb-1 striped">
62         <div class="flex-4" i18n>Total Paid/Credited:</div>
63         <div class="flex-1">{{summary.total_paid() || 0 | currency}}</div>
64       </div>
65     </div>
66
67     <div class="col-lg-3 pr-0 mr-0 border-right">
68       <div class="d-flex pt-1 pb-1 striped">
69         <div class="flex-4" i18n>Owed for Selected:</div>
70         <div class="flex-1">{{owedSelected() | currency}}</div>
71       </div>
72       <div class="d-flex pt-1 pb-1">
73         <div class="flex-4" i18n>Billed for Selected:</div>
74         <div class="flex-1">{{billedSelected() | currency}}</div>
75       </div>
76       <div class="d-flex pt-1 pb-1 striped">
77         <div class="flex-4" i18n>Paid/Credited for Selected:</div>
78         <div class="flex-1">{{paidSelected() | currency}}</div>
79       </div>
80     </div>
81
82     <div class="col-lg-3 pr-0 mr-0 border-right">
83       <div class="d-flex pt-1 pb-1 striped">
84         <div class="flex-4" i18n>Refunds Available:</div>
85         <div class="flex-1">{{refundsAvailable() | currency}}</div>
86       </div>
87       <div class="d-flex pt-1 pb-1">
88         <div class="flex-4" i18n>Credit Available:</div>
89         <div class="flex-1">{{patron().credit_forward_balance() | currency}}</div>
90       </div>
91       <div class="d-flex pt-1 pb-1 striped">
92         <div class="flex-4" i18n>Session Voided:</div>
93         <div class="flex-1">{{sessionVoided | currency}}</div>
94       </div>
95     </div>
96
97     <div class="col-lg-3 pr-0 mr-0">
98       <div class="d-flex pt-1 pb-1 striped">
99         <div class="flex-4">&nbsp;</div>
100         <div class="flex-1">&nbsp;</div>
101       </div>
102       <div class="d-flex pt-1 pb-1">
103         <div class="flex-4" i18n>Pending Payment:</div>
104         <div class="flex-1 font-weight-bold">{{pendingPayment() | currency}}</div>
105       </div>
106       <div class="d-flex pt-1 pb-1 striped">
107         <div class="flex-4" i18n>Pending Change:</div>
108         <div class="flex-1 font-weight-bold">{{pendingChange() | currency}}</div>
109       </div>
110     </div>
111   </div>
112 </ng-container>
113
114 <!-- BILL PAY FORM -->
115
116 <h3 i18n>Pay Bill</h3>
117
118 <div class="row bg-light border border-dark rounded pt-2 pb-2 mt-2 mb-4 payment-form">
119   <div class="col-lg-12 d-flex form-inline form-validated">
120     <div class="flex-1"></div>
121     <div class="ml-2"><label for="payment-type" i18n>Payment Type:</label></div>
122     <div class="ml-1">
123       <select [(ngModel)]="paymentType" class="form-control" id="payment-type">
124         <option value="cash_payment" i18n>Cash</option>
125         <option value="check_payment" i18n>Check</option>
126         <option value="credit_card_payment" i18n>Credit Card</option>
127         <option value="debit_card_payment" i18n>Debit Card</option>
128         <option value="credit_payment" i18n>Patron Credit</option>
129         <option value="work_payment" i18n>Work</option>
130         <option value="forgive_payment" i18n>Forgive</option>
131         <option value="goods_payment" i18n>Goods</option>
132       </select>
133     </div>
134     <div class="ml-2"><label for="check-number" i18n>Check Number:</label></div>
135     <div class="ml-1">
136       <input type="text" class="form-control" [(ngModel)]="checkNumber"
137         id="check-number" [disabled]="paymentType !== 'check_payment'"/>
138     </div>
139     <div class="ml-2"><label for="pay-amount" i18n>Payment Received:</label></div>
140     <div class="ml-1">
141       <input type="number" class="form-control" [(ngModel)]="paymentAmount"
142         (ngModelChange)="updatePendingColumn()" id="pay-amount" [min]="0"/>
143     </div>
144     <div class="ml-2 form-check form-check-inline">
145       <input class="form-check-input" type="checkbox"
146         (ngModelChange)="applySetting('eg.circ.bills.annotatepayment', $event)"
147         id="annotate" [(ngModel)]="annotatePayment"/>
148       <label class="form-check-label" for="annotate" i18n>Annotate</label>
149     </div>
150     <div class="ml-2">
151       <button class="btn btn-outline-dark" (click)="applyPayment()"
152         [disabled]="disablePayment()" i18n>Apply Payment</button>
153     </div>
154   </div>
155 </div>
156
157 <!-- BILLS GRID -->
158
159 <ng-template #titleTemplate let-r="row">
160   <ng-container *ngIf="r.record_id">
161     <a routerLink="/staff/catalog/record/{{r.record_id}}">{{r.title}}</a>
162   </ng-container>
163   <ng-container *ngIf="!r.record_id">{{r.title}}</ng-container>
164 </ng-template>
165
166 <ng-template #barcodeTemplate let-r="row">
167   <ng-container *ngIf="r.copy_id">
168     <a href="/eg/staff/cat/item/{{r.copy_id}}">{{r.copy_barcode}}</a>
169   </ng-container>
170 </ng-template>
171
172 <eg-grid #billGrid idlClass="mbt" [dataSource]="gridDataSource"
173   persistKey="circ.patron.bills" [sortable]="true" [disablePaging]="true"
174   (onRowActivate)="showStatement($event)"
175   [cellClassCallback]="cellClassCallback"
176   [reloadOnColumnChange]="true"
177   [showDeclaredFieldsOnly]="true"
178   [rowClassCallback]="rowClassCallback"
179   [rowFlairIsEnabled]="true"
180   [rowFlairCallback]="rowFlairCallback"
181   [cellTextGenerator]="cellTextGenerator">
182
183   <eg-grid-toolbar-button i18n-label label="Add Billing"
184     (onClick)="addBilling()"></eg-grid-toolbar-button>
185
186   <eg-grid-toolbar-button i18n-label label="History"
187     routerLink="/staff/circ/patron/{{patronId}}/bills/history/transactions">
188   </eg-grid-toolbar-button>
189
190   <eg-grid-toolbar-button i18n-label label="Select All Refunds"
191     (onClick)="selectRefunds()"></eg-grid-toolbar-button>
192
193   <!-- ACTIONS FOR SELECTED -->
194
195   <eg-grid-toolbar-action
196     i18n-label label="Full Details" (onClick)="showStatement($event[0])">
197   </eg-grid-toolbar-action>
198
199   <eg-grid-toolbar-action
200     i18n-label label="Print Bills" (onClick)="printBills($event)">
201   </eg-grid-toolbar-action>
202
203   <eg-grid-toolbar-action
204     i18n-label label="Void All Billings" (onClick)="voidBillings($event)">
205   </eg-grid-toolbar-action>
206
207   <eg-grid-toolbar-action
208     i18n-label label="Adjust To Zero" (onClick)="adjustToZero($event)">
209   </eg-grid-toolbar-action>
210
211   <eg-grid-toolbar-action
212     i18n-label label="Add Billing" (onClick)="addBillingForXact($event)">
213   </eg-grid-toolbar-action>
214
215   <eg-grid-toolbar-action i18n-label label="Refund" (onClick)="refund($event)">
216   </eg-grid-toolbar-action>
217
218   <!-- COLUMNS -->
219
220   <eg-grid-column name="balance_owed" path="summary.balance_owed" datatype="money"
221     [required]="true" label="Balance Owed" i18n-label></eg-grid-column>
222
223   <eg-grid-column name="total_owed" path="summary.total_owed" 
224     datatype="money" [required]="true" label="Total Billed" i18n-label></eg-grid-column>
225
226   <eg-grid-column name="total_paid" path="summary.total_paid" datatype="money" 
227     [required]="true" label="Total Paid" i18n-label></eg-grid-column>
228
229   <eg-grid-column path="summary.xact_type"
230     label="Type" i18n-label></eg-grid-column>
231
232   <eg-grid-column name="last_billing_ts" path="summary.last_billing_ts" 
233     [required]="true" label="Last Billed" i18n-label>
234   </eg-grid-column>
235
236   <eg-grid-column name="copy_barcode" label="Item Barcode" i18n-label
237     path="circulation.target_copy.barcode" [cellTemplate]="barcodeTemplate">
238   </eg-grid-column>
239
240   <eg-grid-column name="call_number_label"
241     path="circulation.target_copy.call_number.label" 
242     i18n-label label="Call Number" [hidden]="true"></eg-grid-column>
243
244   <eg-grid-column path="circulation.due_date" label="Due Date" i18n-label                   
245     timezoneContextOrg="circulation.circ_lib" dateOnlyIntervalField="circulation.duration"   
246     datatype="timestamp" [required]="true"></eg-grid-column>  
247
248   <eg-grid-column path="circulation.stop_fines" [required]="true"
249     label="Stop Fines" i18n-label></eg-grid-column>
250
251   <eg-grid-column i18n-label label="Title" name="title" 
252     [cellTemplate]="titleTemplate"
253     path="circulation.target_copy.call_number.record.simple_record.title">
254   </eg-grid-column>
255
256   <eg-grid-column name="last_billing_note" path="summary.last_billing_note" 
257     [required]="true" label="Last Billing Note" i18n-label></eg-grid-column>
258
259   <eg-grid-column name="paymentPending" datatype="money"
260     label="Payment Pending" i18n-label></eg-grid-column>
261
262   <!-- -->
263
264   <eg-grid-column path="id" [index]="true" [required]="true" 
265     [hidden]="true" label="Bill #" i18n-label> </eg-grid-column>
266
267   <eg-grid-column path="xact_start" datatype="timestamp" [datePlusTime]="true"
268     [required]="true" [hidden]="true" label="Start" i18n-label></eg-grid-column>
269
270   <eg-grid-column name="last_billing_type" path="summary.last_billing_type" 
271     [hidden]="true" [required]="true" label="Last Billing Type" i18n-label></eg-grid-column>
272
273   <eg-grid-column name="last_payment_type" path="summary.last_payment_type" 
274     [hidden]="true" [required]="true" label="Last Payment Type" i18n-label></eg-grid-column>
275
276   <eg-grid-column name="last_payment_ts" path="summary.last_payment_ts" 
277     [hidden]="true" [required]="true" [datePlusTime]="true" label="Last Payment Time" i18n-label>
278   </eg-grid-column>
279
280   <eg-grid-column name="billingLocation"
281     [hidden]="true" label="Billing Location" i18n-label></eg-grid-column>
282
283   <eg-grid-column path="circulation.target_copy.call_number.prefix.label" 
284     i18n-label label="CN Prefix" [hidden]="true"></eg-grid-column>
285   <eg-grid-column path="circulation.target_copy.call_number.suffix.label" 
286     i18n-label label="CN Suffix" [hidden]="true"></eg-grid-column>
287
288   <eg-grid-column i18n-label label="Owning Library" [hidden]="true"
289     path="circulation.target_copy.call_number.owning_lib.shortname">
290   </eg-grid-column>
291
292   <eg-grid-column i18n-label label="Checkout/Renewal Library" [hidden]="true"
293     path="circulation.circ_lib.shortname">
294   </eg-grid-column>
295
296   <eg-grid-column i18n-label label="Checkin Date" [hidden]="true"
297     path="circulation.checkin_time">
298   </eg-grid-column>
299
300   <eg-grid-column name="copy_id" path="circulation.target_copy.id" 
301     [required]="true" [hidden]="true"></eg-grid-column>
302
303   <eg-grid-column path="circulation.target_copy.location.name" 
304     [hidden]="true" label="Shelving Location" i18n-label></eg-grid-column>
305
306
307   <eg-grid-column name="record_id" 
308     path="circulation.target_copy.call_number.record.id" 
309     [required]="true" [hidden]="true"></eg-grid-column>
310
311
312   <eg-grid-column [hidden]="true" label="Author" i18n-label
313     path="circulation.target_copy.call_number.record.simple_record.author">
314   </eg-grid-column>
315
316   <eg-grid-column [hidden]="true" label="Grocery Billing Location" 
317     [required]="true" i18n-label path="grocery.billing_location.shortname">
318   </eg-grid-column>
319
320   <eg-grid-column [hidden]="true" label="Circulation Billing Location" 
321     [required]="true" i18n-label path="circulation.circ_lib.shortname">
322   </eg-grid-column>
323
324   <eg-grid-column path="usr" [hidden]="true"></eg-grid-column>
325   <eg-grid-column path="unrecovered" [hidden]="true"></eg-grid-column>
326
327 </eg-grid>
328
329 <div class="row mt-2">
330   <div class="col-lg-12 d-flex">
331     <div class="flex-1"></div>
332     <div class="d-flex flex-colum justify-content-end">
333       <div class="form-check form-check-inline">
334       <input class="form-check-input" type="checkbox" id="patron-credit-cbox"
335         [(ngModel)]="convertChangeToCredit"/>
336       <label class="form-check-label" for="patron-credit-cbox" i18n>
337         Convert Change To Patron Credit
338       </label>
339       </div>
340     </div>
341     <div class="d-flex flex-colum justify-content-end">
342       <div class="form-check form-check-inline ml-2">
343       <input class="form-check-input" type="checkbox" id="receipt-on-payment-cbox"
344         (ngModelChange)="applySetting('circ.bills.receiptonpay', $event)"
345         [(ngModel)]="receiptOnPayment"/>
346       <label class="form-check-label" for="receipt-on-payment-cbox" i18n>
347         Receipt On Payment
348       </label>
349       </div>
350     </div>
351     <div class="form-inline ml-2">
352       <div class="input-group">
353         <div class="input-group-prepend">
354           <span class="input-group-text" i18n># Receipts</span>
355         </div>
356         <input type="number" class="form-control num-receipts" [(ngModel)]="numReceipts"/>
357       </div>
358     </div>
359   </div>
360 </div>
361
362
363