From 2e136b99b7535288de38911cdbb33a71ac1a214b Mon Sep 17 00:00:00 2001 From: phasefx <phasefx@dcc99617-32d9-48b4-a31d-7c20da2025e4> Date: Tue, 13 Oct 2009 05:23:50 +0000 Subject: [PATCH] Toward a visually slimmer billing interface. Sticking it in the Alternate View slot until it's ready. git-svn-id: svn://svn.open-ils.org/ILS/trunk@14395 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- Open-ILS/web/opac/locale/en-US/lang.dtd | 12 + .../staff_client/chrome/content/main/constants.js | 1 + Open-ILS/xul/staff_client/server/patron/bill2.js | 315 +++++++++++++++++++++ Open-ILS/xul/staff_client/server/patron/bill2.xul | 116 ++++++++ Open-ILS/xul/staff_client/server/patron/bills.js | 2 +- Open-ILS/xul/staff_client/server/skin/circ.css | 2 + 6 files changed, 447 insertions(+), 1 deletion(-) create mode 100644 Open-ILS/xul/staff_client/server/patron/bill2.js create mode 100644 Open-ILS/xul/staff_client/server/patron/bill2.xul diff --git a/Open-ILS/web/opac/locale/en-US/lang.dtd b/Open-ILS/web/opac/locale/en-US/lang.dtd index aa12fd1bbd..bb46b4cab8 100644 --- a/Open-ILS/web/opac/locale/en-US/lang.dtd +++ b/Open-ILS/web/opac/locale/en-US/lang.dtd @@ -2455,6 +2455,18 @@ <!ENTITY staff.patron.bill_history.print.accesskey "P"> <!ENTITY staff.patron.bill_history.selected_billed.label "Selected Billed:"> <!ENTITY staff.patron.bill_history.selected_paid.label "Selected Paid:"> + +<!ENTITY staff.patron.bill_interface.add_billing.label "Add Billing"> +<!ENTITY staff.patron.bill_interface.full_details.label "Full Details"> +<!ENTITY staff.patron.bill_interface.full_details.accesskey "D"> +<!ENTITY staff.patron.bill_interface.show_in_catalog.label "Show in Catalog"> +<!ENTITY staff.patron.bill_interface.show_in_catalog.accesskey "S"> +<!ENTITY staff.patron.bill_interface.print.label "Print"> +<!ENTITY staff.patron.bill_interface.print.accesskey "P"> +<!ENTITY staff.patron.bill_interface.selected_billed.label "Checked Billed:"> +<!ENTITY staff.patron.bill_interface.selected_paid.label "Checked Paid:"> +<!ENTITY staff.patron.bill_interface.voided_this_session.label "Voided this session:"> + <!ENTITY staff.patron.bills_overlay.still_checked_out.label "Red Items are still Checked Out"> <!ENTITY staff.patron.bills_overlay.uncheck_all.label "Uncheck All"> <!ENTITY staff.patron.bills_overlay.check_all.label "Check All"> diff --git a/Open-ILS/xul/staff_client/chrome/content/main/constants.js b/Open-ILS/xul/staff_client/chrome/content/main/constants.js index 49d0f96bad..cd324f3139 100644 --- a/Open-ILS/xul/staff_client/chrome/content/main/constants.js +++ b/Open-ILS/xul/staff_client/chrome/content/main/constants.js @@ -329,6 +329,7 @@ const urls = { 'XUL_PATRON_BILL_DETAILS' : '/xul/server/patron/bill_details.xul', 'XUL_PATRON_BILL_HISTORY' : '/xul/server/patron/bill_history.xul', 'XUL_PATRON_BILL_WIZARD' : '/xul/server/patron/bill_wizard.xul', + 'XUL_PATRON_BILL_ALTERNATE_VIEW' : '/xul/server/patron/bill2.xul', 'XUL_PATRON_DISPLAY' : '/xul/server/patron/display.xul', 'XUL_PATRON_HORIZ_DISPLAY' : '/xul/server/patron/display_horiz.xul', 'XUL_PATRON_EDIT' : '/eg/actor/user/register', diff --git a/Open-ILS/xul/staff_client/server/patron/bill2.js b/Open-ILS/xul/staff_client/server/patron/bill2.js new file mode 100644 index 0000000000..2334b4b56b --- /dev/null +++ b/Open-ILS/xul/staff_client/server/patron/bill2.js @@ -0,0 +1,315 @@ +function $(id) { return document.getElementById(id); } + +function tally_selected() { + try { + JSAN.use('util.money'); + var selected_billed = 0; + var selected_paid = 0; + var selected_balance = 0; + + for (var i = 0; i < g.bill_list_selection.length; i++) { + var bill = g.bill_map[g.bill_list_selection[i]]; + if (!bill) { + //$('checked_owed').setAttribute('value', '???'); + //$('checked_billed').setAttribute('value', '???'); + //$('checked_paid').setAttribute('value', '???'); + return; + } + var to = util.money.dollars_float_to_cents_integer( bill.transaction.total_owed() ); + var tp = util.money.dollars_float_to_cents_integer( bill.transaction.total_paid() ); + var bo = util.money.dollars_float_to_cents_integer( bill.transaction.balance_owed() ); + selected_billed += to; + selected_paid += tp; + selected_balance += bo; + } + //$('checked_billed').setAttribute('value', '$' + util.money.cents_as_dollars( selected_billed ) ); + //$('checked_paid').setAttribute('value', '$' + util.money.cents_as_dollars( selected_paid ) ); + //$('checked_owed').setAttribute('value', '$' + util.money.cents_as_dollars( selected_balance ) ); + } catch(E) { + alert('Error in bill2.js, tally_selected(): ' + E); + } +} + +function tally_all() { + try { + JSAN.use('util.money'); + var checked_billed = 0; + var checked_paid = 0; + var checked_balance = 0; + var total_billed = 0; + var total_paid = 0; + var total_balance = 0; + + var retrieve_ids = g.bill_list.dump_retrieve_ids(); + for (var i = 0; i < retrieve_ids.length; i++) { + var bill = g.bill_map[retrieve_ids[i]]; + if (!bill) { + $('checked_owed').setAttribute('value', '???'); + $('checked_billed').setAttribute('value', '???'); + $('checked_paid').setAttribute('value', '???'); + $('total_owed').setAttribute('value', '???'); + $('total_billed').setAttribute('value', '???'); + $('total_paid').setAttribute('value', '???'); + return; + } + var to = util.money.dollars_float_to_cents_integer( bill.transaction.total_owed() ); + var tp = util.money.dollars_float_to_cents_integer( bill.transaction.total_paid() ); + var bo = util.money.dollars_float_to_cents_integer( bill.transaction.balance_owed() ); + total_billed += to; + total_paid += tp; + total_balance += bo; + if (g.check_map[retrieve_ids[i]]) { + checked_billed += to; + checked_paid += tp; + checked_balance += bo; + } + } + $('checked_billed').setAttribute('value', '$' + util.money.cents_as_dollars( checked_billed ) ); + $('checked_paid').setAttribute('value', '$' + util.money.cents_as_dollars( checked_paid ) ); + $('checked_owed').setAttribute('value', '$' + util.money.cents_as_dollars( checked_balance ) ); + $('total_billed').setAttribute('value', '$' + util.money.cents_as_dollars( total_billed ) ); + $('total_paid').setAttribute('value', '$' + util.money.cents_as_dollars( total_paid ) ); + $('total_owed').setAttribute('value', '$' + util.money.cents_as_dollars( total_balance ) ); + } catch(E) { + alert('Error in bill2.js, tally_all(): ' + E); + } +} + +function retrieve_mbts_for_list() { + var method = 'FM_MBTS_IDS_RETRIEVE_ALL_HAVING_BALANCE.authoritative'; + g.mbts_ids = g.network.simple_request(method,[ses(),g.patron_id]); + if (g.mbts_ids.ilsevent) { + switch(Number(g.mbts_ids.ilsevent)) { + case -1: g.error.standard_network_error_alert($("patronStrings").getString('staff.patron.bill_history.retrieve_mbts_for_list.close_win_try_again')); break; + default: g.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.bill_history.retrieve_mbts_for_list.close_win_try_again'),g.mbts_ids); break; + } + } else if (g.mbts_ids == null) { + g.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.bill_history.retrieve_mbts_for_list.close_win_try_again'),null); + } else { + + function gen_func(r) { + return function() { + if (typeof r == 'object') { g.row_map[ r.id() ] = g.bill_list.append( { 'retrieve_id' : r.id(), 'row' : { 'my' : { 'checked' : true, 'mbts' : r } } } ); + } else { g.row_map[r] = g.bill_list.append( { 'retrieve_id' : r, 'row' : { 'my' : { 'checked' : true } } } ); } + } + } + + for (var i = 0; i < g.mbts_ids.length; i++) { + dump('i = ' + i + ' g.mbts_ids[i] = ' + g.mbts_ids[i] + '\n'); + g.funcs.push( gen_func(g.mbts_ids[i]) ); + } + } +} + +function init_lists() { + JSAN.use('util.list'); JSAN.use('circ.util'); + + g.bill_list_selection = []; + + g.bill_list = new util.list('bill_tree'); + + g.bill_list.init( { + 'columns' : + [ + { + 'id' : 'select', 'type' : 'checkbox', 'editable' : true, 'label' : '', 'render' : function(my) { return String( my.checked ) == 'true'; }, + } + ].concat( + patron.util.mbts_columns({ + 'xact_finish' : { 'hidden' : xul_param('current') ? true : false } + }).concat( + circ.util.columns({ + 'title' : { 'hidden' : false, 'flex' : '3' } + }) + ) + ), + 'map_row_to_columns' : patron.util.std_map_row_to_columns(' '), + 'on_select' : function(ev) { + JSAN.use('util.functional'); + g.bill_list_selection = util.functional.map_list( + g.bill_list.retrieve_selection(), + function(o) { return o.getAttribute('retrieve_id'); } + ); + tally_selected(); + tally_all(); + $('details').setAttribute('disabled', g.bill_list_selection.length == 0); + $('add').setAttribute('disabled', g.bill_list_selection.length == 0); + $('voidall').setAttribute('disabled', g.bill_list_selection.length == 0); + }, + 'on_click' : function(ev) { + netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserRead'); + var row = {}; var col = {}; var nobj = {}; + g.bill_list.node.treeBoxObject.getCellAt(ev.clientX,ev.clientY,row,col,nobj); + if (row.value == -1) return; + var treeItem = g.bill_list.node.contentView.getItemAtIndex(row.value); + if (treeItem.nodeName != 'treeitem') return; + var treeRow = treeItem.firstChild; + var treeCell = treeRow.firstChild; + g.check_map[ treeItem.getAttribute('retrieve_id') ] = treeCell.getAttribute('value') == 'true'; + tally_selected(); + tally_all(); + }, + 'on_sort' : function() { + tally_selected(); + tally_all(); + }, + 'on_checkbox_toggle' : function(toggle) { + try { + var retrieve_ids = g.bill_list.dump_retrieve_ids(); + for (var i = 0; i < retrieve_ids.length; i++) { + g.check_map[ retrieve_ids[i] ] = (toggle=='on'); + } + tally_selected(); + tally_all(); + } catch(E) { + alert('error in on_checkbox_toggle(): ' + E); + } + }, + 'retrieve_row' : function(params) { + var id = params.retrieve_id; + var row = params.row; + if (id) { + if (typeof row.my == 'undefined') row.my = {}; + if (typeof row.my.mbts == 'undefined' ) { + g.network.simple_request('BLOB_MBTS_DETAILS_RETRIEVE',[ses(),id], function(req) { + var blob = req.getResultObject(); + row.my.mbts = blob.transaction; + row.my.circ = blob.circ; + row.my.acp = blob.copy; + row.my.mvr = blob.record; + g.bill_map[ id ] = blob; + g.check_map[ id ] = row.my.checked; + if (typeof params.on_retrieve == 'function') { + params.on_retrieve(row); + }; + tally_selected(); + tally_all(); + } ); + } + } + return row; + } + } ); + + $('bill_list_actions').appendChild( g.bill_list.render_list_actions() ); + g.bill_list.set_list_actions(); +} + +function my_init() { + try { + netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); + if (typeof JSAN == 'undefined') { throw( $("commonStrings").getString('common.jsan.missing') ); } + JSAN.errorLevel = "die"; // none, warn, or die + JSAN.addRepository('/xul/server/'); + + JSAN.use('util.error'); g.error = new util.error(); + JSAN.use('util.network'); g.network = new util.network(); + JSAN.use('util.date'); + JSAN.use('util.money'); + JSAN.use('patron.util'); + JSAN.use('OpenILS.data'); g.data = new OpenILS.data(); g.data.init({'via':'stash'}); + //g.data.temp = ''; g.data.stash('temp'); + + g.error.sdump('D_TRACE','my_init() for bill2.xul'); + + if (xul_param('current')) { + $('caption').setAttribute('label',$("patronStrings").getString('staff.patron.bill_history.my_init.current_bills')); + document.title = $("patronStrings").getString('staff.patron.bill_history.my_init.current_bills'); + } else { + $('caption').setAttribute('label',$("patronStrings").getString('staff.patron.bill_history.my_init.bill_history')); + document.title = $("patronStrings").getString('staff.patron.bill_history.my_init.bill_history'); + } + + g.funcs = []; g.bill_map = {}; g.row_map = {}; g.check_map = {}; + + g.patron_id = xul_param('patron_id'); + + init_lists(); + + retrieve_mbts_for_list(); + + $('details').addEventListener( + 'command', + handle_details, + false + ); + + $('add').addEventListener( + 'command', + handle_add, + false + ); + + JSAN.use('util.exec'); var exec = new util.exec(20); + exec.on_error = function(E) { alert(E); return true; } + exec.timer(g.funcs,100); + } catch(E) { + var err_msg = $("commonStrings").getFormattedString('common.exception', ['patron/bill2.xul', E]); + try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); } + alert(err_msg); + } +} + +function handle_add() { + if(g.bill_list_selection.length > 1) + var msg = $("patronStrings").getFormattedString('staff.patron.bill_history.handle_add.message_plural', [g.bill_list_selection]); + else + var msg = $("patronStrings").getFormattedString('staff.patron.bill_history.handle_add.message_singular', [g.bill_list_selection]); + + var r = g.error.yns_alert(msg, + $("patronStrings").getString('staff.patron.bill_history.handle_add.title'), + $("patronStrings").getString('staff.patron.bill_history.handle_add.btn_yes'), + $("patronStrings").getString('staff.patron.bill_history.handle_add.btn_no'),null, + $("patronStrings").getString('staff.patron.bill_history.handle_add.confirm_message')); + if (r == 0) { + JSAN.use('util.window'); + var win = new util.window(); + for (var i = 0; i < g.bill_list_selection.length; i++) { + var w = win.open( + urls.XUL_PATRON_BILL_WIZARD, + 'billwizard', + 'chrome,resizable,modal', + { 'patron_id' : g.patron_id, 'xact_id' : g.bill_list_selection[i] } + ); + } + g.bill_list.clear(); + retrieve_mbts_for_list(); + if (typeof window.refresh == 'function') window.refresh(); + if (typeof window.xulG == 'object' && typeof window.xulG.refresh == 'function') window.xulG.refresh(); + } +} + +function handle_details() { + JSAN.use('util.window'); var win = new util.window(); + for (var i = 0; i < g.bill_list_selection.length; i++) { + var my_xulG = win.open( + urls.XUL_PATRON_BILL_DETAILS, + 'test_billdetails_' + g.bill_list_selection[i], + 'chrome,resizable', + { + 'patron_id' : g.patron_id, + 'mbts_id' : g.bill_list_selection[i], + 'refresh' : function() { + if (typeof window.refresh == 'function') window.refresh(); + if (typeof window.xulG == 'object' && typeof window.xulG.refresh == 'function') window.xulG.refresh(); + }, + } + ); + } +} + +function print_bills() { + try { + var template = 'bills_historical'; if (xul_param('current')) template = 'bills_current'; + JSAN.use('patron.util'); + var params = { + 'patron' : patron.util.retrieve_au_via_id(ses(),g.patron_id), + 'template' : template + }; + g.bill_list.print(params); + } catch(E) { + g.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.bill_history.print_bills.print_error'), E); + } +} + + diff --git a/Open-ILS/xul/staff_client/server/patron/bill2.xul b/Open-ILS/xul/staff_client/server/patron/bill2.xul new file mode 100644 index 0000000000..af45d86ac5 --- /dev/null +++ b/Open-ILS/xul/staff_client/server/patron/bill2.xul @@ -0,0 +1,116 @@ +<?xml version="1.0"?> +<!-- Application: Evergreen Staff Client --> +<!-- Screen: Patron Display --> + +<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// --> +<!-- STYLESHEETS --> +<?xml-stylesheet href="chrome://global/skin/" type="text/css"?> +<?xml-stylesheet href="/xul/server/skin/global.css" type="text/css"?> +<?xml-stylesheet href="/xul/server/skin/circ.css" type="text/css"?> +<?xml-stylesheet href="/xul/server/skin/patron_display.css" type="text/css"?> + +<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// --> +<!-- LOCALIZATION --> +<!DOCTYPE window PUBLIC "" ""[ + <!--#include virtual="/opac/locale/${locale}/lang.dtd"--> +]> + +<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// --> +<!-- OVERLAYS --> +<?xul-overlay href="/xul/server/OpenILS/util_overlay.xul"?> +<!--<?xul-overlay href="/xul/server/patron/bill_summary_overlay.xul"?>--> + +<window id="bill_interface_win" width="700" height="550" oils_persist="sizemode width height" + onload="try{ my_init(); font_helper(); persist_helper(); } catch(E) { alert(E); }" + xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> + + <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// --> + <!-- BEHAVIOR --> + <script type="text/javascript">var myPackageDir = 'open_ils_staff_client'; var IAMXUL = true; var g = {};</script> + <scripts id="openils_util_scripts"/> + + <script type="text/javascript" src="/xul/server/main/JSAN.js"/> + <script type="text/javascript" src="bill2.js"/> + + <messagecatalog id="patronStrings" src="/xul/server/locale/<!--#echo var='locale'-->/patron.properties"/> + <messagecatalog id="circStrings" src="/xul/server/locale/<!--#echo var='locale'-->/circ.properties"/> + + <commandset> + <command id="opac" disabled="true"/> + <command id="voidall" disabled="true"/> + <command id="refund" disabled="true"/> + <command id="add" disabled="true"/> + <command id="details" disabled="true"/> + </commandset> + + <popupset> + <popup id="actions_popup"> + <menuitem command="opac" label="&staff.patron.bill_interface.show_in_catalog.label;" accesskey="&staff.patron.bill_interface.show_in_catalog.accesskey;" oncommand="alert('Not Yet Implemented');"/> + <menuitem command="voidall" label="Void All Billings" accesskey="" /> + <menuitem command="refund" label="Refund" accesskey="" /> + <menuitem command="add" label="&staff.patron.bill_interface.add_billing.label;" accesskey="" /> + <menuitem command="details" label="&staff.patron.bill_interface.full_details.label;" accesskey="&staff.patron.bill_interface.full_details.accesskey;"/> + </popup> + </popupset> + + <vbox flex="1" class="my_overflow"> + <groupbox orient="vertical" flex="1"> + <caption id="caption" label="&staff.patron.bill_interface.caption.label;"/> + <hbox> + <grid> + <columns> + <column /> + <column /> + </columns> + <rows> + <row> + <spacer /> + <label id="owed_label" value="Owed" control="total_owed" class="emphasis1"/> + <label id="billed_label" value="Billed" control="total_billed" class="emphasis2"/> + <label id="paid_label" value="Paid" control="total_paid" class="emphasis2"/> + </row> + <row> + <label id="total_label" value="Total:" control="total_owed" class="emphasis1"/> + <textbox id="total_owed" readonly="true" context="clipboard"/> + <textbox id="total_billed" readonly="true" context="clipboard"/> + <textbox id="total_paid" readonly="true" context="clipboard"/> + </row> + <row> + <label id="checked_label" value="Checked:" control="checked_owed" class="emphasis2"/> + <textbox id="checked_owed" readonly="true" context="clipboard"/> + <textbox id="checked_billed" readonly="true" context="clipboard"/> + <textbox id="checked_paid" readonly="true" context="clipboard"/> + </row> + </rows> + </grid> + </hbox> + <hbox> + <label value='&staff.patron.bill_interface.voided_this_session.label;' class="emphasis2"/> + <label id="paid_tally" /> + <spacer flex="1"/> + <button label="Bill Patron" accesskey="" /> + <button label="History" accesskey="" /> + <menubar> + <menu label="Actions for Selected Rows" accesskey="A"> + <menupopup> + <menuitem command="opac" label="&staff.patron.bill_interface.show_in_catalog.label;" accesskey="&staff.patron.bill_interface.show_in_catalog.accesskey;" oncommand="alert('Not Yet Implemented');"/> + <menuitem command="voidall" label="Void All Billings" accesskey="V" /> + <menuitem command="refund" label="Refund" accesskey="R" /> + <menuitem command="add" label="&staff.patron.bill_interface.add_billing.label;" accesskey="A" /> + <menuitem command="details" label="&staff.patron.bill_interface.full_details.label;" accesskey="&staff.patron.bill_interface.full_details.accesskey;"/> + </menupopup> + </menu> + </menubar> + + </hbox> + <tree id="bill_tree" flex="1" enableColumnDrag="true" seltype="multiple" editable="true" context="actions_popup"/> + <hbox> + <hbox id="bill_list_actions" /> + <button id="print" label="&staff.patron.bill_interface.print.label;" accesskey="&staff.patron.bill_interface.print.accesskey;" oncommand="print_bills();"/> + <spacer flex="1"/> + </hbox> + </groupbox> + </vbox> + +</window> + diff --git a/Open-ILS/xul/staff_client/server/patron/bills.js b/Open-ILS/xul/staff_client/server/patron/bills.js index 0475af303b..82f3c0d0e9 100644 --- a/Open-ILS/xul/staff_client/server/patron/bills.js +++ b/Open-ILS/xul/staff_client/server/patron/bills.js @@ -201,7 +201,7 @@ patron.bills.prototype = { function() { try { xulG.display_window.g.patron.right_deck.reset_iframe( - urls.XUL_PATRON_BILL_HISTORY, + urls.XUL_PATRON_BILL_ALTERNATE_VIEW, {}, { 'current' : 1, diff --git a/Open-ILS/xul/staff_client/server/skin/circ.css b/Open-ILS/xul/staff_client/server/skin/circ.css index b679146e24..1ee430c817 100644 --- a/Open-ILS/xul/staff_client/server/skin/circ.css +++ b/Open-ILS/xul/staff_client/server/skin/circ.css @@ -16,3 +16,5 @@ #amnesty_mode_indicator { border: thick solid white; background-color: red; color: white; font-size: large; font-weight: bold; padding: 10px; padding-bottom: 25px; margin: 10px; } #checkin_auto_print_slips_indicator { background-color: -moz-dialog; color: -moz-dialog-text; font-size: large; font-weight: bold; } +.emphasis1 { font-weight: bold; } +.emphasis2 { font-weight: normal; } -- 2.11.0