[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