]> git.evergreen-ils.org Git - Evergreen.git/blob - Evergreen/staff_client/chrome/content/evergreen/patron/patron_bills.js
magic money distribution
[Evergreen.git] / Evergreen / staff_client / chrome / content / evergreen / patron / patron_bills.js
1 sdump('D_TRACE','Loading patron_bills.js\n');
2
3 function patron_bills_init(p) {
4         sdump('D_PATRON_BILLS',"TESTING: patron_bills.js: " + mw.G['main_test_variable'] + '\n');
5         sdump('D_CONSTRUCTOR',arg_dump(arguments));
6
7         patron_bills_list_box_init( p );
8
9         patron_bills_control_box_init( p );
10
11         p.current_payments = [];
12
13         p.update_payment_applied = function () {
14                 sdump('D_PATRON_BILLS','p.update_payment_applied()\n');
15                 var total_applied = 0;
16                 for (var i = 0; i < p.current_payments.length; i++) {
17                         total_applied += dollars_float_to_cents_integer( p.current_payments[ i ].textbox.value );
18                 }
19                 var total_payment = 0;
20                 if (p.control_box.bill_payment_amount.value) {
21                         try {
22                                 total_payment = dollars_float_to_cents_integer( p.control_box.bill_payment_amount.value );
23                         } catch(E) {
24                                 sdump('D_ERROR',E + '\n');
25                         }
26                 }
27                 if ( total_applied > total_payment ) {
28                         total_payment = total_applied;
29                         p.control_box.bill_payment_amount.value = cents_as_dollars( total_applied );
30                 }
31                 p.control_box.bill_payment_applied.value = cents_as_dollars( total_applied );
32                 p.control_box.bill_credit_amount.value = '';
33                 if (total_payment > total_applied ) {
34                         p.control_box.bill_change_amount.value = cents_as_dollars( total_payment - total_applied);
35                         p.control_box.bill_credit_amount.value = '0.00';
36                 } else {
37                         p.control_box.bill_change_amount.value = '0.00';
38                         p.control_box.bill_credit_amount.value = '0.00';
39                 }
40                 var total_owed = dollars_float_to_cents_integer( p.control_box.bill_total_owed.value );
41                 p.control_box.bill_new_balance.value = cents_as_dollars( total_owed - total_applied );
42         }
43
44         p.list_box.apply_to_each_listitem = function (idx, listitem) {
45                 sdump('D_PATRON_BILLS','p.list_box.apply_to_each_listitem()\n');
46                 p.current_payments[ idx ] = {};
47                 p.current_payments[ idx ].listitem = listitem;
48                 p.current_payments[ idx ].checkbox = listitem.getElementsByTagName('checkbox')[0];
49                 p.current_payments[ idx ].textbox = listitem.getElementsByTagName('textbox')[0];
50                 p.current_payments[ idx ].mbts_id = listitem.getAttribute('record_id');
51                 p.current_payments[ idx ].balance_owed = listitem.getAttribute('balance_owed');
52
53                 p.current_payments[ idx ].textbox.addEventListener(
54                         'change',
55                         function () {
56                                 sdump('D_PATRON_BILLS','listitem textbox onchange handler()\n');
57                                 var tb = p.current_payments[ idx ].textbox;
58                                 var bo = p.current_payments[ idx ].balance_owed;
59                                 tb.value = cents_as_dollars( dollars_float_to_cents_integer( tb.value ) ); // show user what we think the number is
60                                 sdump('D_PATRON_BILLS','bo = ' + bo + '\ntb.value = ' + tb.value + '\n');
61                                 if ( dollars_float_to_cents_integer( tb.value ) > dollars_float_to_cents_integer( bo ) ) {
62                                         sdump('D_PATRON_BILLS','Tried to overpay bill\n');
63                                         tb.value = bo;
64                                 }
65                                 p.update_payment_applied();
66                         },
67                         false
68                 );
69         }
70
71         p.control_box.bill_payment_amount.addEventListener(
72                 'change',
73                 function () {
74                         var tb = p.control_box.bill_payment_amount;
75                         tb.value = cents_as_dollars( dollars_float_to_cents_integer( tb.value ) );
76                         var total = dollars_float_to_cents_integer( tb.value );
77                         for (var i = 0; i < p.current_payments.length; i++) {
78                                 var bill = p.current_payments[i];
79                                 var bo = dollars_float_to_cents_integer( bill.balance_owed );
80                                 if ( bo > total ) {
81                                         bill.textbox.value = cents_as_dollars( total );
82                                         total = 0;
83                                 } else {
84                                         bill.textbox.value = cents_as_dollars( bo );
85                                         total = total - bo;
86                                 }
87                         }
88                         p.update_payment_applied();
89                 },
90                 false
91         );
92
93         p.control_box.bill_change_amount.addEventListener(
94                 'change',
95                 function() {
96                         var tb = p.control_box.bill_change_amount;
97                         var proposed_change = dollars_float_to_cents_integer( tb.value );
98                         var proposed_credit = 0;
99                         p.update_payment_applied();
100                         var real_change = dollars_float_to_cents_integer( tb.value );
101                         if ( proposed_change > real_change ) {
102                                 sdump('D_ERROR','Someone wanted more money than they deserved\n');
103                                 proposed_change = real_change;
104                         } else if ( real_change > proposed_change ) {
105                                 proposed_credit = real_change - proposed_change;
106                         }
107                         tb.value = cents_as_dollars( proposed_change );
108                         p.control_box.bill_credit_amount.value = cents_as_dollars( proposed_credit );
109                 },
110                 false
111         );
112
113         p.control_box.bill_apply_payment.addEventListener(
114                 'command',
115                 function() { alert('Fatal error.. gasp.. arggg.. choke... cough.. sputter'); },
116                 false
117         );
118
119         sdump('D_TRACE_EXIT',arg_dump(arguments));
120         return p;
121 }
122
123 function patron_bills_control_box_init( p ) {
124         p.control_box = {};
125         p.control_box.node = p.node.nextSibling;
126         p.control_box.bill_total_owed = p.control_box.node.getElementsByAttribute('id','bill_total_owed')[0];
127         p.control_box.payment_type = p.control_box.node.getElementsByAttribute('id','payment_type_menulist')[0];
128         p.control_box.bill_payment_amount = p.control_box.node.getElementsByAttribute('id','bill_payment_amount_textbox')[0];
129         p.control_box.bill_payment_applied = p.control_box.node.getElementsByAttribute('id','bill_payment_applied_textbox')[0];
130         p.control_box.bill_change_amount = p.control_box.node.getElementsByAttribute('id','bill_change_amount_textbox')[0];
131         p.control_box.bill_credit_amount = p.control_box.node.getElementsByAttribute('id','bill_credit_amount_textbox')[0];
132         p.control_box.bill_apply_payment = p.control_box.node.getElementsByAttribute('id','bill_apply_payment')[0];
133         p.control_box.bill_new_balance = p.control_box.node.getElementsByAttribute('id','bill_new_balance_textbox')[0];
134 }
135
136 function patron_bills_list_box_init( p ) {
137         p.patron_bills_cols = [
138                 {
139                         'id' : 'checkbox', 'label' : '', 'flex' : 0, 'primary' : false, 'hidden' : false,
140                         'render_xul' : 'checkbox'
141                 },
142                 {
143                         'id' : 'xact_dates', 'label' : getString('bills_xact_dates_label'), 'flex' : 0,
144                         'primary' : false, 'hidden' : false, 'fm_class' : 'mbts', 
145                         'fm_field_render' : 'xact_dates_box($$)'
146                 },
147                 {
148                         'id' : 'notes', 'label' : getString('mbts_xact_type_label'), 'flex' : 1,
149                         'primary' : false, 'hidden' : false, 'fm_class' : 'mbts',
150                         'fm_field_render' : '.xact_type()'
151                 },
152                 {
153                         'id' : 'money', 'label' : getString('bills_money_label'), 'flex' : 0,
154                         'primary' : false, 'hidden' : false, 'fm_class' : 'mbts', 
155                         'fm_field_render' : 'money_box($$)'
156                 },
157                 {
158                         'id' : 'current_pay', 'label' : getString('bills_current_payment_label'), 'flex' : 0, 
159                         'render_xul' : 'textbox'
160                 }
161         ];
162
163         p.list_box = list_box_init( { 'w' : p.w, 'node' : p.node, 'cols' : p.patron_bills_cols, 'debug' : p.app } );
164         p.clear_patron_bills = function () { p.current_payments = []; p.list_box.clear_rows(); };
165         p.add_patron_bills = function (bills) {
166                 sdump('D_PATRON_BILLS','p.add_patron_bills(' + bills + ')\n');
167                 return patron_bills_add_patron_bills(p,bills);
168         }
169 }
170
171 function patron_bills_add_patron_bills(p, bills) {
172         sdump('D_PATRON_BILLS',arg_dump(arguments,{1:true}));
173
174         p.control_box.bill_total_owed.setAttribute('value',get_bills_total( bills ));
175         p.control_box.bill_new_balance.setAttribute('value',get_bills_total( bills ));
176
177         function xact_dates_box( mbts ) {
178                 var grid = p.w.document.createElement('grid');
179                         var cols = p.w.document.createElement('columns');
180                         grid.appendChild( cols );
181                                 cols.appendChild( p.w.document.createElement('column') );
182                                 cols.appendChild( p.w.document.createElement('column') );
183                         var rows = p.w.document.createElement('rows');
184                         grid.appendChild( rows );
185                                 var row0 = p.w.document.createElement('row');
186                                 rows.appendChild( row0 );
187                                         var label_r0_1 = p.w.document.createElement('label');
188                                         row0.appendChild( label_r0_1 );
189                                         label_r0_1.setAttribute('value',getString('mbts_id_label'));
190                                         var label_r0_2 = p.w.document.createElement('label');
191                                         row0.appendChild( label_r0_2 );
192                                         label_r0_2.setAttribute('value',mbts.id());
193                                 var row1 = p.w.document.createElement('row');
194                                 rows.appendChild( row1 );
195                                         var label_r1_1 = p.w.document.createElement('label');
196                                         row1.appendChild( label_r1_1 );
197                                         label_r1_1.setAttribute('value',getString('mbts_xact_start_label'));
198                                         var label_r1_2 = p.w.document.createElement('label');
199                                         row1.appendChild( label_r1_2 );
200                                         label_r1_2.setAttribute('value',mbts.xact_start().toString().substr(0,10));
201                                 var row2 = p.w.document.createElement('row');
202                                 rows.appendChild( row2 );
203                                         var label_r2_1 = p.w.document.createElement('label');
204                                         row2.appendChild( label_r2_1 );
205                                         label_r2_1.setAttribute('value',getString('mbts_xact_finish_label'));
206                                         var label_r2_2 = p.w.document.createElement('label');
207                                         row2.appendChild( label_r2_2 );
208                                         try { label_r2_2.setAttribute('value',mbts.xact_finish().toString().substr(0,10));
209                                         } catch(E) {}
210
211                 return grid;
212         }
213
214         function money_box( mbts ) {
215                 var grid = p.w.document.createElement('grid');
216                         var cols = p.w.document.createElement('columns');
217                         grid.appendChild( cols );
218                                 cols.appendChild( p.w.document.createElement('column') );
219                                 cols.appendChild( p.w.document.createElement('column') );
220                         var rows = p.w.document.createElement('rows');
221                         grid.appendChild( rows );
222                                 var row1 = p.w.document.createElement('row');
223                                 rows.appendChild( row1 );
224                                         var label_r1_1 = p.w.document.createElement('label');
225                                         row1.appendChild( label_r1_1 );
226                                         label_r1_1.setAttribute('value',getString('mbts_total_owed_label'));
227                                         var label_r1_2 = p.w.document.createElement('label');
228                                         row1.appendChild( label_r1_2 );
229                                         label_r1_2.setAttribute('value',mbts.total_owed());
230                                 var row2 = p.w.document.createElement('row');
231                                 rows.appendChild( row2 );
232                                         var label_r2_1 = p.w.document.createElement('label');
233                                         row2.appendChild( label_r2_1 );
234                                         label_r2_1.setAttribute('value',getString('mbts_total_paid_label'));
235                                         var label_r2_2 = p.w.document.createElement('label');
236                                         row2.appendChild( label_r2_2 );
237                                         label_r2_2.setAttribute('value',mbts.total_paid());
238                                 var row3 = p.w.document.createElement('row');
239                                 rows.appendChild( row3 );
240                                         var label_r3_1 = p.w.document.createElement('label');
241                                         row3.appendChild( label_r3_1 );
242                                         label_r3_1.setAttribute('value',getString('mbts_balance_owed_label'));
243                                         label_r3_1.setAttribute('style','font-weight: bold');
244                                         var label_r3_2 = p.w.document.createElement('label');
245                                         row3.appendChild( label_r3_2 );
246                                         label_r3_2.setAttribute('value',mbts.balance_owed());
247                                         label_r3_2.setAttribute('style','font-weight: bold');
248
249                 return grid;
250         }
251
252         var obj_string ='mbts';
253
254         setTimeout(
255                 function() {
256                         //p.list_box.clear_rows();
257
258                         for (var i = 0; i < bills.length; i++) {
259
260                                 var mbts = bills[i];
261
262                                 var cols = [];
263
264                                 for (var j = 0; j < p.patron_bills_cols.length; j++) {
265                                         var hash = p.patron_bills_cols[j];
266                                         sdump('D_PATRON_BILLS','Considering ' + js2JSON(hash) + '\n');
267                                         var listcell = p.w.document.createElement('listcell');
268                                         listcell.setAttribute('pack','start');
269                                         listcell.setAttribute('align','start');
270                                         listcell.setAttribute('style','border-left: black solid thin');
271                                         var col = '';
272                                         if (hash.fm_field_render) {
273
274                                                 var obj = 'mbts';
275                                                 switch( hash.fm_class ) {
276                                                         case 'mvr' : obj_string = 'mvr'; break;
277                                                 }
278                                                 var cmd = parse_render_string( obj_string, hash.fm_field_render );
279                                                 sdump('D_PATRON_BILLS','cmd = ' + cmd + '\n');
280                                                 try {
281                                                         col = eval( cmd );
282                                                         sdump('D_PATRON_BILLS','eval = ' + col + '\n');
283                                                 } catch(E) {
284                                                         sdump('D_ERROR',E + '\n');
285                                                 }
286                                                 if (typeof(col) == 'string') {
287                                                         listcell.setAttribute('label',col);
288                                                 } else {
289                                                         listcell.appendChild( col );
290                                                 }
291                                         }
292                                         if (hash.render_xul) {
293                                                 var xul = p.w.document.createElement( hash.render_xul );
294                                                 listcell.appendChild( xul );
295                                                 if (hash.render_xul == 'checkbox') xul.setAttribute('checked', 'true');
296                                         }
297                                         cols.push( listcell );
298                                 }
299
300                                 var listitem = p.list_box.add_row( 
301                                         cols, { 
302                                                 'record_id' : mbts.id(),
303                                                 'balance_owed' : mbts.balance_owed()
304                                         } 
305                                 ); 
306                                 if (p.list_box.apply_to_each_listitem) {
307                                         p.list_box.apply_to_each_listitem( i, listitem );
308                                 }
309                         }
310                 }, 0
311         );
312 }