[freeside-commits] branch FREESIDE_3_BRANCH updated. 3220d99fa3ef70ca60cc7218533401da1990f4e0
Mark Wells
mark at 420.am
Thu Sep 3 13:44:09 PDT 2015
The branch, FREESIDE_3_BRANCH has been updated
via 3220d99fa3ef70ca60cc7218533401da1990f4e0 (commit)
from 9dc9789e61324f46e482107420fd27db55b846ef (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 3220d99fa3ef70ca60cc7218533401da1990f4e0
Author: Mark Wells <mark at freeside.biz>
Date: Thu Sep 3 13:42:45 2015 -0700
quick payment entry: fix preloading of rows when some of them contain bad amounts, #15861
diff --git a/httemplate/misc/batch-cust_pay.html b/httemplate/misc/batch-cust_pay.html
index 9f2540c..197ade1 100644
--- a/httemplate/misc/batch-cust_pay.html
+++ b/httemplate/misc/batch-cust_pay.html
@@ -101,6 +101,10 @@ function select_discount_term(row) {
var invoices_for_row = new Object;
+var preloading = 0; // the number of preloading threads currently running
+
+// callback from toggle_application_row: we've received a list of
+// the customer's open invoices. store them.
function update_invoices(rownum, invoices) {
invoices_for_row[rownum] = new Object;
// only called before create_application_row
@@ -113,6 +117,12 @@ function toggle_application_row(ev, next) {
if (!next) next = function(){}; //optional continuation
var rownum = this.getAttribute('rownum');
if ( this.checked ) {
+ // the user has opted to apply the payment to specific invoices.
+ // - lock the customer
+ // - fetch the list of open invoices
+ // - create a row to select an invoice
+ // - then optionally call "next", with this as the invocant
+ // and the rownum as argument; we use this to preload rows.
var custnum = document.getElementById('custnum'+rownum).value;
if (!custnum) return;
lock_payment_row(rownum, true);
@@ -124,6 +134,9 @@ function toggle_application_row(ev, next) {
}
);
} else {
+ // the user has opted not to do that.
+ // - remove all application rows
+ // - unlock the customer
var row = document.getElementById('row'+rownum);
var table_rows = row.parentNode.rows;
for (i = row.sectionRowIndex; i < table_rows.count; i++) {
@@ -183,6 +196,16 @@ function amount_unapplied(rownum) {
var change_app_amount;
+// the user has chosen an invoice. the previously chosen invoice is still
+// in curr_invoice
+// - if there is a value there, put it back on the invoices_for_row list for
+// this customer.
+// - then _remove_ the newly chosen invoice from that list.
+// - find the "owed" element for this application row and set its value to the
+// amount owed on that invoice.
+// - find the "amount" element for this application row and set its value to
+// either "owed" or the remaining payment amount, whichever is less.
+// - call change_app_amount() on that element.
function choose_app_invnum() {
var rownum = this.getAttribute('rownum');
var appnum = this.getAttribute('appnum');
@@ -210,8 +233,10 @@ function choose_app_invnum() {
}
}
+// the invoice selector has gained focus. clear its list of options, and
+// replace them with the list of open invoices (from invoices_for_row).
+// if there's already a selected invoice, prepend that to the list.
function focus_app_invnum() {
-% # invoice numbers just display as invoice numbers
var rownum = this.getAttribute('rownum');
var add_opt = function(obj, value, label) {
var o = document.createElement('OPTION');
@@ -233,14 +258,15 @@ function focus_app_invnum() {
}
}
+// an application amount has been changed. if there's any unapplied payment
+// amount, and any remaining invoices_for_row, add a blank application row.
+// (but don't do this while preloading; it will unconditionally add enough
+// rows to show all the attempted applications)
function change_app_amount() {
var rownum = this.getAttribute('rownum');
var appnum = this.getAttribute('appnum');
-%# maybe some kind of warning if amount_unapplied < 0?
-%# only spawn a new application row if there are open invoices left,
-%# and this is the highest-numbered application row for the customer,
-%# and the sum of the applied amounts is < the amount of the payment,
- if ( Object.keys(invoices_for_row[rownum]).length > 0
+ if ( preloading == 0
+ && Object.keys(invoices_for_row[rownum]).length > 0
&& !document.getElementById( 'row'+rownum+'.'+(parseInt(appnum) + 1) )
&& amount_unapplied(rownum) > 0 ) {
@@ -248,6 +274,9 @@ function change_app_amount() {
}
}
+// we're creating a payment application row.
+// create the following elements: <TR>, <TD>s, "Apply to invoice" caption,
+// invnum selector, "owed" display, amount input box, delete button.
function create_application_row(rownum, appnum) {
var payment_row = document.getElementById('row'+rownum);
var tr_app = document.createElement('TR');
@@ -341,29 +370,45 @@ function preload() {
var enable = document.getElementById('enable_app'+rownum);
enable.checked = true;
var preload_row = function(r) {//continuation from toggle_application_row
- for (appnum=0; appnum < row_obj[r].length; appnum++) {
- this_app = row_obj[r][appnum];
- var x = r + '.' + appnum;
- //set invnum
- var select_invnum = document.getElementById('invnum'+x);
- focus_app_invnum.call(select_invnum);
- for (i=0; i<select_invnum.options.length; i++) {
- if (select_invnum.options[i].value == this_app.invnum) {
- select_invnum.selectedIndex = i;
+
+ preloading++;
+
+ try {
+ for (appnum=0; appnum < row_obj[r].length; appnum++) {
+ this_app = row_obj[r][appnum];
+ var x = r + '.' + appnum;
+ //set invnum
+ var select_invnum = document.getElementById('invnum'+x);
+ focus_app_invnum.call(select_invnum);
+ for (i=0; i<select_invnum.options.length; i++) {
+ if (select_invnum.options[i].value == this_app.invnum) {
+ select_invnum.selectedIndex = i;
+ }
}
- }
- choose_app_invnum.call(select_invnum);
- //set amount
- var input_amount = document.getElementById('amount'+x);
- input_amount.value = this_app.amount;
-
- //set error
- var span_error = document.getElementById('error'+x);
- span_error.innerHTML = this_app.error;
- change_app_amount.call(input_amount); //creates next row
- } //for appnum
+ choose_app_invnum.call(select_invnum);
+ //set amount
+ var input_amount = document.getElementById('amount'+x);
+ input_amount.value = this_app.amount;
+
+ //set error
+ var span_error = document.getElementById('error'+x);
+ span_error.innerHTML = this_app.error;
+
+ // create another row (unconditionally)
+ create_application_row(r, appnum + 1);
+
+ } //for appnum
+
+ } finally {
+ preloading--;
+ }
+
}; //preload_row function
+
+ // enable application rows on the selected customer. this creates
+ // the first row, then kicks off preloading.
toggle_application_row.call(enable, null, preload_row);
+
} // if (row_obj[rownum].length
} //for rownum
}
-----------------------------------------------------------------------
Summary of changes:
httemplate/misc/batch-cust_pay.html | 97 +++++++++++++++++++++++++----------
1 file changed, 71 insertions(+), 26 deletions(-)
More information about the freeside-commits
mailing list