1 dump('entering patron.bills.js\n');
3 if (typeof patron == 'undefined') patron = {};
4 patron.bills = function (params) {
7 try { JSAN.use('util.error'); obj.error = new util.error(); } catch(E) { alert(E); }
8 try { JSAN.use('util.network'); obj.network = new util.network(); } catch(E) { alert(E); }
10 obj.OpenILS = {}; JSAN.use('OpenILS.data'); obj.OpenILS.data = new OpenILS.data(); obj.OpenILS.data.init({'via':'stash'});
16 patron.bills.prototype = {
18 'version' : 'test123',
20 'current_payments' : [],
22 'refresh' : function() {
24 obj.bills = obj.network.request(
25 api.FM_MOBTS_HAVING_BALANCE.app,
26 api.FM_MOBTS_HAVING_BALANCE.method,
27 [ obj.session, obj.patron_id ]
29 if (window.xulG && typeof window.xulG.on_money_change == 'function') {
30 try { window.xulG.on_money_change(obj.bills); } catch(E) { this.error.sdump('D_ERROR',E); }
33 var tbs = document.getElementsByTagName('textbox');
34 for (var i = 0; i < tbs.length; i++) {
35 tbs[i].value = ''; tbs[i].setAttribute('value','');
38 obj.controller.view.bill_payment_amount.focus();
41 'init' : function( params ) {
45 obj.init_controller( params );
51 JSAN.use('util.money');
53 obj.current_payments = []; obj.list.clear();
54 //FIXME//.bills virtual field
55 for (var i = 0; i < obj.bills.length; i++) {
56 var rnode = obj.list.append( { 'row' : { 'my' : { 'mobts' : obj.bills[i] } }, 'attributes' : { 'allowevents' : true } } );
57 var cb = rnode.getElementsByTagName('checkbox')[0];
58 var tb = rnode.getElementsByTagName('textbox')[0];
59 var bo = obj.bills[i].balance_owed();
60 total_owed += util.money.dollars_float_to_cents_integer( bo );
61 var id = obj.bills[i].id();
62 obj.current_payments.push( { 'mobts_id' : id, 'balance_owed' : bo, 'checkbox' : cb, 'textbox' : tb, } );
64 obj.controller.view.bill_total_owed.value = util.money.cents_as_dollars( total_owed );
65 obj.controller.view.bill_total_owed.setAttribute('value',obj.controller.view.bill_total_owed.value);
68 'init_controller' : function( params ) {
72 if (obj._controller_inited) return;
74 obj.session = obj.session || params['session'];
75 obj.patron_id = obj.patron_id || params['patron_id'];
77 JSAN.use('util.list'); obj.list = new util.list('bill_list');
79 function getString(s) { return obj.OpenILS.data.entities[s]; }
84 'id' : 'xact_dates', 'label' : getString('staff.bills_xact_dates_label'), 'flex' : 1,
85 'primary' : false, 'hidden' : false, 'render' : 'obj.xact_dates_box(my.mobts)'
88 'id' : 'notes', 'label' : getString('staff.bills_information'), 'flex' : 2,
89 'primary' : false, 'hidden' : false, 'render' : 'obj.info_box(my.mobts)'
92 'id' : 'money', 'label' : getString('staff.bills_money_label'), 'flex' : 1,
93 'primary' : false, 'hidden' : false, 'render' : 'obj.money_box(my.mobts)'
96 'id' : 'current_pay', 'label' : getString('staff.bills_current_payment_label'), 'flex' : 0,
97 'render' : 'obj.payment_box()'
100 'map_row_to_column' : obj.gen_map_row_to_column(),
104 JSAN.use('util.controller'); obj.controller = new util.controller();
110 function() { alert('Not Yet Implemented'); }
112 'cmd_bill_wizard' : [
116 JSAN.use('util.window');
117 var win = new util.window();
119 urls.XUL_PATRON_BILL_WIZARD
120 + '?session=' + window.escape(obj.session)
121 + '&patron_id=' + window.escape(obj.patron_id),
123 'chrome,resizable,modal'
127 obj.error.sdump('D_ERROR',E);
132 'cmd_change_to_credit' : [
135 obj.change_to_credit();
138 'cmd_bill_apply_payment' : [
141 try { obj.apply_payment(); } catch(E) { alert(E); }
144 'bill_total_owed' : [
146 function(e) { return function() {}; }
150 function(e) { return function() {}; }
152 'bill_payment_amount' : [
155 JSAN.use('util.money');
157 tb.value = util.money.cents_as_dollars( util.money.dollars_float_to_cents_integer( tb.value ) );
158 tb.setAttribute('value', tb.value );
159 var total = util.money.dollars_float_to_cents_integer( tb.value );
160 for (var i = 0; i < obj.current_payments.length; i++) {
161 var bill = obj.current_payments[i];
162 if (bill.checkbox.checked) {
163 var bo = util.money.dollars_float_to_cents_integer( bill.balance_owed );
165 bill.textbox.value = util.money.cents_as_dollars( total );
168 bill.textbox.value = util.money.cents_as_dollars( bo );
172 bill.textbox.value = '0.00';
174 bill.textbox.setAttribute('value',bill.textbox.value);
176 obj.update_payment_applied();
179 'bill_payment_applied' : [
181 function(e) { return function() {}; }
183 'bill_change_amount' : [
186 JSAN.use('util.money');
188 var proposed_change = util.money.dollars_float_to_cents_integer( tb.value );
189 var proposed_credit = 0;
190 obj.update_payment_applied();
191 var real_change = util.money.dollars_float_to_cents_integer( tb.value );
192 if ( proposed_change > real_change ) {
193 obj.error.sdump('D_ERROR','Someone wanted more money than they deserved\n');
194 proposed_change = real_change;
195 } else if ( real_change > proposed_change ) {
196 proposed_credit = real_change - proposed_change;
198 tb.value = util.money.cents_as_dollars( proposed_change );
199 tb.setAttribute('value',tb.value);
200 obj.controller.view.bill_credit_amount.value = util.money.cents_as_dollars( proposed_credit );
201 obj.controller.view.bill_credit_amount.setAttribute(
203 obj.controller.view.bill_credit_amount.value
207 'bill_credit_amount' : [
209 function(e) { return function() {}; }
211 'bill_new_balance' : [
213 function(e) { return function() {}; }
219 obj._controller_inited = true;
224 /*****************************************************************************************************************************/
226 'apply_payment' : function() {
228 var payment_blob = {};
229 JSAN.use('util.window');
230 var win = new util.window();
231 switch(obj.controller.view.payment_type.value) {
232 case 'credit_card_payment' :
233 obj.OpenILS.data.temp = '';
234 obj.OpenILS.data.stash('temp');
236 urls.XUL_PATRON_BILL_CC_INFO,
238 'chrome,resizable,modal'
240 obj.OpenILS.data.stash_retrieve();
241 /* FIXME -- need unique temp space name */
242 payment_blob = JSON2js( obj.OpenILS.data.temp );
244 case 'check_payment' :
245 obj.OpenILS.data.temp = '';
246 obj.OpenILS.data.stash('temp');
248 urls.XUL_PATRON_BILL_CHECK_INFO,
250 'chrome,resizable,modal'
252 obj.OpenILS.data.stash_retrieve();
253 /* FIXME -- need unique temp space name */
254 payment_blob = JSON2js( obj.OpenILS.data.temp );
257 if (payment_blob=='' || payment_blob.cancelled=='true') { alert('cancelled'); return; }
258 payment_blob.userid = obj.patron_id;
259 payment_blob.note = payment_blob.note || '';
260 payment_blob.cash_drawer = 1; // FIXME: get new Config() to work
261 payment_blob.payment_type = obj.controller.view.payment_type.value;
262 payment_blob.payments = [];
263 payment_blob.patron_credit = obj.controller.view.bill_credit_amount.value;
264 for (var i = 0; i < obj.current_payments.length; i++) {
265 var tb = obj.current_payments[ i ].textbox;
266 if ( !(tb.value == '0.00' || tb.value == '') ) {
267 payment_blob.payments.push(
269 obj.current_payments[ i ].mobts_id,
276 if ( obj.pay( payment_blob ) ) {
279 alert('FIXME: Receipt goes here\n' + js2JSON(payment_blob));
288 obj.error.sdump('D_ERROR',E);
292 'pay' : function(payment_blob) {
295 var robj = obj.network.request(
298 [ obj.session, payment_blob ]
300 if (robj && robj.ilsevent && robj.ilsevent == 0) {
302 } else if (robj == 1) {
308 var error = 'patron.bills.pay: ' + js2JSON(E);
309 obj.error.sdump('D_ERROR',error);
315 'update_payment_applied' : function() {
316 JSAN.use('util.money');
318 var total_applied = 0;
319 for (var i = 0; i < obj.current_payments.length; i++) {
320 total_applied += util.money.dollars_float_to_cents_integer( obj.current_payments[ i ].textbox.value );
322 var total_payment = 0;
323 if (obj.controller.view.bill_payment_amount.value) {
325 total_payment = util.money.dollars_float_to_cents_integer( obj.controller.view.bill_payment_amount.value );
327 obj.error.sdump('D_ERROR',E + '\n');
330 if ( total_applied > total_payment ) {
331 total_payment = total_applied;
332 obj.controller.view.bill_payment_amount.value = util.money.cents_as_dollars( total_applied );
334 obj.controller.view.bill_payment_applied.value = util.money.cents_as_dollars( total_applied );
335 obj.controller.view.bill_payment_applied.setAttribute('value', obj.controller.view.bill_payment_applied.value )
336 obj.controller.view.bill_credit_amount.value = '';
337 if (total_payment > total_applied ) {
338 obj.controller.view.bill_change_amount.value = util.money.cents_as_dollars( total_payment - total_applied);
339 obj.controller.view.bill_credit_amount.value = '0.00';
341 obj.controller.view.bill_change_amount.value = '0.00';
342 obj.controller.view.bill_credit_amount.value = '0.00';
344 var total_owed = util.money.dollars_float_to_cents_integer( obj.controller.view.bill_total_owed.value );
345 obj.controller.view.bill_new_balance.value = util.money.cents_as_dollars( total_owed - total_applied );
348 'change_to_credit' : function() {
349 JSAN.use('util.money');
351 var tb = obj.controller.view.bill_change_amount;
352 var proposed_change = 0;
353 var proposed_credit = util.money.dollars_float_to_cents_integer( tb.value );
354 obj.update_payment_applied();
355 var real_change = util.money.dollars_float_to_cents_integer( tb.value );
356 if ( proposed_change > real_change ) {
357 obj.error.sdump('D_ERROR','Someone wanted more money than they deserved\n');
358 proposed_change = real_change;
359 } else if ( real_change > proposed_change ) {
360 proposed_credit = real_change - proposed_change;
362 tb.value = util.money.cents_as_dollars( proposed_change );
363 tb.setAttribute('value',tb.value);
364 obj.controller.view.bill_credit_amount.value = util.money.cents_as_dollars( proposed_credit );
365 obj.controller.view.bill_credit_amount.setAttribute('value',obj.controller.view.bill_credit_amount.value);
368 'retrieve' : function() {
370 if (window.xulG && window.xulG.bills) {
371 obj.bills = window.xulG.bills;
373 obj.bills = obj.network.request(
374 api.FM_MOBTS_HAVING_BALANCE.app,
375 api.FM_MOBTS_HAVING_BALANCE.method,
376 [ obj.session, obj.patron_id ]
381 'xact_dates_box' : function ( mobts ) {
383 function getString(s) { return obj.OpenILS.data.entities[s]; }
384 var grid = document.createElement('grid');
385 var cols = document.createElement('columns');
386 grid.appendChild( cols );
387 cols.appendChild( document.createElement('column') );
388 cols.appendChild( document.createElement('column') );
389 var rows = document.createElement('rows');
390 grid.appendChild( rows );
391 var row0 = document.createElement('row');
392 rows.appendChild( row0 );
393 var cb_r0_0 = document.createElement('checkbox');
394 row0.appendChild( cb_r0_0 );
395 cb_r0_0.setAttribute('checked','true');
396 var hb_r0_1 = document.createElement('hbox');
397 row0.appendChild( hb_r0_1 );
398 var label_r0_1 = document.createElement('label');
399 hb_r0_1.appendChild( label_r0_1 );
400 label_r0_1.setAttribute('value',getString('staff.mbts_id_label'));
401 var label_r0_2 = document.createElement('label');
402 hb_r0_1.appendChild( label_r0_2 );
403 label_r0_2.setAttribute('value',mobts.id());
404 var row1 = document.createElement('row');
405 rows.appendChild( row1 );
406 var label_r1_1 = document.createElement('label');
407 row1.appendChild( label_r1_1 );
408 label_r1_1.setAttribute('value',getString('staff.mbts_xact_start_label'));
409 var label_r1_2 = document.createElement('label');
410 row1.appendChild( label_r1_2 );
411 label_r1_2.setAttribute('value',mobts.xact_start().toString().substr(0,10));
412 var row2 = document.createElement('row');
413 rows.appendChild( row2 );
414 var label_r2_1 = document.createElement('label');
415 row2.appendChild( label_r2_1 );
416 label_r2_1.setAttribute('value',getString('staff.mbts_xact_finish_label'));
417 var label_r2_2 = document.createElement('label');
418 row2.appendChild( label_r2_2 );
419 try { label_r2_2.setAttribute('value',mobts.xact_finish().toString().substr(0,10));
425 'money_box' : function ( mobts ) {
427 function getString(s) { return obj.OpenILS.data.entities[s]; }
428 var grid = document.createElement('grid');
429 var cols = document.createElement('columns');
430 grid.appendChild( cols );
431 cols.appendChild( document.createElement('column') );
432 cols.appendChild( document.createElement('column') );
433 var rows = document.createElement('rows');
434 grid.appendChild( rows );
435 var row1 = document.createElement('row');
436 rows.appendChild( row1 );
437 var label_r1_1 = document.createElement('label');
438 row1.appendChild( label_r1_1 );
439 label_r1_1.setAttribute('value',getString('staff.mbts_total_owed_label'));
440 var label_r1_2 = document.createElement('label');
441 row1.appendChild( label_r1_2 );
442 label_r1_2.setAttribute('value',mobts.total_owed());
443 var row2 = document.createElement('row');
444 rows.appendChild( row2 );
445 var label_r2_1 = document.createElement('label');
446 row2.appendChild( label_r2_1 );
447 label_r2_1.setAttribute('value',getString('staff.mbts_total_paid_label'));
448 var label_r2_2 = document.createElement('label');
449 row2.appendChild( label_r2_2 );
450 label_r2_2.setAttribute('value',mobts.total_paid());
451 var row3 = document.createElement('row');
452 rows.appendChild( row3 );
453 var label_r3_1 = document.createElement('label');
454 row3.appendChild( label_r3_1 );
455 label_r3_1.setAttribute('value',getString('staff.mbts_balance_owed_label'));
456 label_r3_1.setAttribute('style','font-weight: bold');
457 var label_r3_2 = document.createElement('label');
458 row3.appendChild( label_r3_2 );
459 label_r3_2.setAttribute('value',mobts.balance_owed());
460 label_r3_2.setAttribute('style','font-weight: bold');
465 'info_box' : function ( mobts ) {
467 function getString(s) { return obj.OpenILS.data.entities[s]; }
468 var vbox = document.createElement('vbox');
469 var grid = document.createElement('grid');
470 vbox.appendChild( grid );
472 var cols = document.createElement('columns');
473 grid.appendChild( cols );
474 cols.appendChild( document.createElement('column') );
475 cols.appendChild( document.createElement('column') );
476 var rows = document.createElement('rows');
477 grid.appendChild( rows );
479 var xact_type = document.createElement('row');
480 rows.appendChild( xact_type );
482 var xt_label = document.createElement('label');
483 xact_type.appendChild( xt_label );
484 xt_label.setAttribute( 'value', 'Type' );
485 var xt_value = document.createElement('label');
486 xact_type.appendChild( xt_value );
487 xt_value.setAttribute( 'value', mobts.xact_type() );
489 var last_billing = document.createElement('row');
490 rows.appendChild( last_billing );
492 var lb_label = document.createElement('label');
493 last_billing.appendChild( lb_label );
494 lb_label.setAttribute( 'value', 'Last Billing:' );
496 var lb_value = document.createElement('label');
497 last_billing.appendChild( lb_value );
498 if (mobts.last_billing_type())
499 lb_value.setAttribute( 'value', mobts.last_billing_type() );
501 var last_payment = document.createElement('row');
502 rows.appendChild( last_payment );
504 var lp_label = document.createElement('label');
505 last_payment.appendChild( lp_label );
506 lp_label.setAttribute( 'value', 'Last Payment:' );
508 var lp_value = document.createElement('label');
509 last_payment.appendChild( lp_value );
510 if (mobts.last_payment_type())
511 lp_value.setAttribute( 'value', mobts.last_payment_type() );
513 var btn = document.createElement('button');
514 vbox.appendChild( btn );
515 btn.setAttribute( 'label', 'Full Details' );
516 btn.setAttribute( 'name', 'full_details' );
517 btn.setAttribute( 'mobts_id', mobts.id() );
518 btn.addEventListener(
521 JSAN.use('util.window'); var w = new util.window();
523 urls.XUL_PATRON_BILL_DETAILS
524 + '?session=' + window.escape(obj.session)
525 + '&mbts_id=' + window.escape(mobts.id()),
527 'modal,chrome,resizable'
536 'payment_box' : function() {
537 var vb = document.createElement('vbox');
538 var tb = document.createElement('textbox');
539 tb.setAttribute('readonly','true');
544 'gen_map_row_to_column' : function() {
547 return function(row,col) {
548 // row contains { 'my' : { 'mobts' : ... } }
549 // col contains one of the objects listed above in columns
554 value = eval( col.render );
556 try{obj.error.sdump('D_ERROR','map_row_to_column: ' + E);}
557 catch(P){dump('?map_row_to_column: ' + E + '\n');}
560 //dump('map_row_to_column: value = ' + value + '\n');
567 dump('exiting patron.bills.js\n');