Merge branch 'master' of git.freeside.biz:/home/git/freeside
[freeside.git] / httemplate / misc / batch-cust_pay.html
index 45459f1..9f2540c 100644 (file)
@@ -5,6 +5,15 @@
 
 <& /elements/error.html &>
 
+<STYLE TYPE="text/css">
+.select_invnum {
+  text-align: right;
+  width: 220px;
+}
+.select_invnum * {
+  font-family: monospace;
+}
+</STYLE>
 <SCRIPT TYPE="text/javascript">
 function warnUnload() {
   if(document.getElementById("OneTrueTable").rows.length > 3 &&
@@ -17,21 +26,49 @@ function warnUnload() {
 }
 window.onbeforeunload = warnUnload;
 
-function add_row_callback(rownum, prefix) {
-  document.getElementById('enable_app'+rownum).disabled = true;
+function add_row_callback(rownum, values) {
+  if (values) {
+    custnum_update_callback(rownum);
+  } else {
+    document.getElementById('enable_app'+rownum).disabled = true;
+  }
 }
 
-function custnum_update_callback(rownum, prefix) {
+function delete_row_callback(rownum) {
+  var i = 0;
+  var delbutton = document.getElementById('delete'+rownum+'.'+i);
+  var delrows = [];
+  while (delbutton) {
+    delrows[i] = delbutton;
+    i++;
+    delbutton = document.getElementById('delete'+rownum+'.'+i);
+  }
+  delrows = delrows.reverse();
+  for (i = 0; i < delrows.length; i++) {
+    delrows[i].onclick();
+  }
+}
+
+function custnum_update_callback(rownum) {
   var custnum = document.getElementById('custnum'+rownum).value;
-  document.getElementById('enable_app'+rownum).disabled = (custnum == 0);
+  // if there is a custnum and more than one open invoice, enable
+  // (and check) the box
+  var show_applications = !(custnum > 0 && num_open_invoices[rownum] > 1);
+  var enable_app_checkbox = document.getElementById('enable_app'+rownum);
+  enable_app_checkbox.disabled = show_applications;
+
 % if ( $use_discounts ) {
-  select_discount_term(rownum, prefix);
+  select_discount_term(rownum);
 % }
 }
 
-function select_discount_term(row, prefix) {
-  var custnum_obj = document.getElementById('custnum'+prefix+row);
-  var select_obj = document.getElementById('discount_term'+prefix+row);
+function invnum_update_callback(rownum) {
+  custnum_update_callback(rownum);
+}
+
+function select_discount_term(row) {
+  var custnum_obj = document.getElementById('custnum'+row);
+  var select_obj = document.getElementById('discount_term'+row);
 
   var value = '';
   if (select_obj.type == 'hidden') {
@@ -86,6 +123,17 @@ function toggle_application_row(ev, next) {
         next.call(this, rownum);
       }
     );
+  } else {
+    var row = document.getElementById('row'+rownum);
+    var table_rows = row.parentNode.rows;
+    for (i = row.sectionRowIndex; i < table_rows.count; i++) {
+      if ( table_rows[i].id.indexof('row'+rownum+'.') > -1 ) {
+        table_rows.removeChild(table_rows[i]);
+      } else {
+        break;
+      }
+    }
+    lock_payment_row(rownum, false);
   }
 }
 
@@ -165,21 +213,23 @@ function choose_app_invnum() {
 function focus_app_invnum() {
 % # invoice numbers just display as invoice numbers
   var rownum = this.getAttribute('rownum');
-  var add_opt = function(obj, value) {
+  var add_opt = function(obj, value, label) {
     var o = document.createElement('OPTION');
-    o.text = value;
+    o.text = label;
     o.value = value;
     obj.add(o);
   }
   this.options.length = 0;
   var this_invoice = this.curr_invoice;
   if ( this_invoice ) {
-    add_opt(this, this_invoice.invnum);
+    add_opt(this, this_invoice.invnum, this_invoice.label);
   } else {
-    add_opt(this, '');
+    add_opt(this, '', '');
   }
   for ( var x in invoices_for_row[rownum] ) {
-    add_opt(this, invoices_for_row[rownum][x].invnum);
+    add_opt(this,
+            invoices_for_row[rownum][x].invnum,
+            invoices_for_row[rownum][x].label);
   }
 }
 
@@ -195,7 +245,6 @@ function change_app_amount() {
        && amount_unapplied(rownum) > 0 ) {
 
     create_application_row(rownum, parseInt(appnum) + 1);
-
   }
 }
 
@@ -217,8 +266,7 @@ function create_application_row(rownum, appnum) {
   select_invnum.setAttribute('appnum', appnum);
   select_invnum.setAttribute('id', 'invnum'+rownum+'.'+appnum);
   select_invnum.setAttribute('name', 'invnum'+rownum+'.'+appnum);
-  select_invnum.style.textAlign = 'right';
-  select_invnum.style.width = '50px';
+  select_invnum.className = 'select_invnum';
   select_invnum.onchange = choose_app_invnum;
   select_invnum.onfocus  = focus_app_invnum;
   
@@ -284,17 +332,17 @@ function create_application_row(rownum, appnum) {
 
 %# for error handling--ugly, but the alternative is translating the whole 
 %# process of creating rows into Mason
-var row_array = <% encode_json(\@rows) %>;
+var row_obj = <% encode_json(\%rows) %>;
 function preload() {
   var rownum;
   var appnum;
-  for (rownum=0; rownum < row_array.length; rownum++) {
-    if ( row_array[rownum].length ) {
+  for (rownum in row_obj) {
+    if ( row_obj[rownum].length ) {
       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_array[r].length; appnum++) {
-          this_app = row_array[r][appnum];
+        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);
@@ -316,7 +364,7 @@ function preload() {
         } //for appnum
       }; //preload_row function
       toggle_application_row.call(enable, null, preload_row);
-    } // if row_array[rownum].length
+    } // if (row_obj[rownum].length
   } //for rownum
 }
 
@@ -349,7 +397,9 @@ function preload() {
     footer_align => \@footer_align,
     onchange => \@onchange,
     custnum_update_callback => 'custnum_update_callback',
+    invnum_update_callback => 'invnum_update_callback',
     add_row_callback => 'add_row_callback',
+    delete_row_callback => 'delete_row_callback',
 &>
 
 <BR>
@@ -357,13 +407,12 @@ function preload() {
 
 </FORM>
 
-%if ( $cgi->param('error') ) {
-<SCRIPT TYPE="text/javascript">
-%  for ( my $row = 0; defined($cgi->param("custnum$row")); $row++ ) {
-     select_discount_term(<% $row %>, '');
-%  }
-</SCRIPT>
-%}
+% #XXX I think this can go away completely, but need to test with $use_discount
+% ###not perl <SCRIPT TYPE="text/javascript">
+% #foreach my $row ( keys %rows ) {
+% ###not perl   select_discount_term(<% $row %>, '');
+% #}
+% ###not perl </SCRIPT>
 
 <% include('/elements/footer.html') %>
 
@@ -387,6 +436,7 @@ my @footer_align = ( 'r', 'r' );
 my @onchange = ( '', '' );;
 my $use_discounts = '';
 
+# Not entirely sure this works anymore...
 if ( FS::Record->scalar_sql('SELECT COUNT(*) FROM part_pkg_discount') ) {
   #push @header, 'Discount';
   push @header, '';
@@ -411,6 +461,16 @@ push @footer, '';
 push @footer_align, '';
 push @onchange, 'toggle_application_row';
 
+push @header, 'No Auto Allocate';
+push @fields, 'no_auto_apply';
+push @types, 'checkbox';
+push @align, 'c';
+push @sizes, '0';
+push @colors, '';
+push @footer, '';
+push @footer_align, '';
+push @onchange, '';
+
 #push @header, 'Error';
 push @header, '';
 push @fields, 'error';
@@ -425,29 +485,31 @@ push @onchange, '';
 $m->comp('/elements/handle_uri_query');
 
 # set up for preloading
-my @rows;
-my @row_errors;
+my %rows;
+my %row_errors;
 if ( $cgi->param('error') ) {
   my $param = $cgi->Vars;
   my $enum = 0; #errors numbered separately
-  for( my $row = 0; exists($param->{"custnum$row"}); $row++ ) {
-    $rows[$row] = [];
-    $row_errors[$row] = $param->{"error$enum"};
+  my @invrows = grep /^invnum\d+\.\d+$/, keys %$param; #pare down possibilities
+  foreach my $row ( sort { $a <=> $b } map /^custnum(\d+)$/, keys %$param ) {
+#  for( my $row = 0; exists($param->{"custnum$row"}); $row++ ) {
+    $rows{$row} = [];
+    $row_errors{$row} = $param->{"error$enum"};
     $enum++;
-    for( my $app = 0; exists($param->{"invnum$row.$app"}); $app++ ) {
+    foreach my $app ( map /^invnum$row\.(\d+)$/, @invrows ) {
       next if !$param->{"invnum$row.$app"};
       my %this_app = map { $_ => ($param->{$_.$row.'.'.$app} || '') } 
         qw( invnum amount );
       $this_app{'error'} = $param->{"error$enum"} || '';
       $param->{"error$enum"} = ''; # don't pass this error through
-      $rows[$row][$app] = \%this_app;
+      $rows{$row}[$app] = \%this_app;
       $enum++;
     }
   }
-  for( my $row = 0; $row < @row_errors; $row++ ) {
-    $param->{"error$row"} = $row_errors[$row];
+  foreach my $row (keys %rows) {
+    $param->{"error$row"} = $row_errors{$row};
   }
 }
-#warn Dumper {rows => \@rows, row_errors => \@row_errors };
+#warn Dumper {rows => \%rows, row_errors => \%row_errors };
 
 </%init>