quick payment entry improvements, RT8121
[freeside.git] / httemplate / elements / customer-table.html
index f00419f..aa085c4 100644 (file)
@@ -22,6 +22,7 @@ Example:
              ###
 
              'name_singular' => 'customer', #label
+             'custnum_update_callback' => 'name_of_js_callback' #passed a rownum
 
              #listrefs
              'types'         => ['immutable', ''], # immutable or ''/text
@@ -40,6 +41,15 @@ Example:
 
 <SCRIPT TYPE="text/javascript">
 
+  function clearhint_invnum() {
+
+    if ( this.value == 'Not found' || this.value == 'Multiple' ) {
+      this.value = '';
+      this.style.color = '#000000';
+    }
+
+  }
+
   function clearhint_custnum() {
 
     if ( this.value == 'Not found' || this.value == 'Multiple' ) {
@@ -57,6 +67,86 @@ Example:
       this.value = '';
 
   }
+  
+  function <% $opt{prefix} %>search_invnum() {
+
+    this.style.color = '#000000'
+
+    var invnum_obj = this;
+    var searchrow = this.getAttribute('rownum');
+    var invnum = this.value;
+
+    if ( invnum == 'searching...' || invnum == 'Not found' || invnum == '' )
+      return;
+
+    if ( this.getAttribute('magic') == 'nosearch' ) {
+      this.setAttribute('magic', '');
+      return;
+    }
+
+    if ( ( <% $opt{prefix} %>rownum - searchrow ) == 1 ) {
+      <% $opt{prefix} %>addRow();
+    }
+    var customer = document.getElementById('customer'+searchrow);
+    customer.value = 'searching...';
+    customer.disabled = true;
+    customer.style.color = '#000000';
+    customer.style.backgroundColor = '#dddddd';
+
+    var customer_select = document.getElementById('cust_select'+searchrow);
+
+    customer.style.display = '';
+    customer_select.style.display = 'none';
+    
+    var custnum_obj = document.getElementById('custnum'+searchrow);
+    var balance = document.getElementById('balance'+searchrow);
+    var status = document.getElementById('status'+searchrow);
+    balance.innerHTML = '';
+    status.innerHTML = '';
+
+    function search_invnum_update(customers) {
+      
+      var customerArray = eval('(' + customers + ')');
+
+      custnum_obj.disabled = false;
+      custnum_obj.style.backgroundColor = '#ffffff';
+      customer.disabled = false;
+      customer.style.backgroundColor = '#ffffff';
+
+      if ( customerArray.length == 0 ) {
+
+        custnum_obj.value = 'Not found';
+       customer.value = 'Not found';
+        custnum_obj.style.color = '#ff0000';
+        customer.style.color = '#ff0000';
+
+        customer.style.display = '';
+        customer_select.style.display = 'none';
+
+      } else if ( customerArray.length == 5 ) {
+
+        custnum_obj.value = customerArray[0];
+        custnum_obj.style.color = '#000000';
+        customer.value = customerArray[1];
+        balance.innerHTML = '<% $money_char %>' + customerArray[2] + ' &nbsp; ';
+        status.innerHTML = customerArray[3]; 
+        status.style.color = '#'+customerArray[4];
+
+        customer.style.display = '';
+        customer_select.style.display = 'none';
+
+% if ( $opt{invnum_update_callback} ) {
+        <% $opt{invnum_update_callback} %>(searchrow, '<% $opt{prefix} %>')
+% }
+
+      }
+
+    }
+
+    invnum_search( invnum, search_invnum_update );
+
+  }
+
 
   function <% $opt{prefix} %>search_custnum() {
 
@@ -88,26 +178,47 @@ Example:
     customer.style.display = '';
     customer_select.style.display = 'none';
 
-    function search_custnum_update(name) {
+    var invnum = document.getElementById('invnum'+searchrow);
+    invnum.value = '';
+    
+    var balance = document.getElementById('balance'+searchrow);
+    balance.innerHTML = '';
+    
+    var status = document.getElementById('status'+searchrow);
+    status.innerHTML = '';
+
+    function search_custnum_update(customers) {
 
-      var name = eval('(' + name + ')' );
+      var customerArray = eval('(' + customers + ')');
 
       customer.disabled = false;
       customer.style.backgroundColor = '#ffffff';
+      
+      if ( customerArray.length == 0 ) {
 
-      if ( name.length > 0 ) {
-        customer.value = name;
-        customer.setAttribute('magic', 'nosearch');
-      } else {
-        customer.value = 'Not found';
+       customer.value = 'Not found';
         customer.style.color = '#ff0000';
         custnum_obj.style.color = '#ff0000';
 
-      }
+      } else if ( customerArray.length == 5 ) {
+
+        custnum_obj.value = customerArray[0];
+        custnum_obj.style.color = '#000000';
+        customer.value = customerArray[1];
+        balance.innerHTML = '<% $money_char %>' + customerArray[2] + ' &nbsp; ';
+        status.innerHTML = customerArray[3]; 
+        status.style.color = '#'+customerArray[4];
+
+        customer.style.display = '';
+        customer_select.style.display = 'none';
 
+% if ( $opt{custnum_update_callback} ) {
+        <% $opt{custnum_update_callback} %>(searchrow, '<% $opt{prefix} %>')
+% }
+      }
     }
 
-    custnum_search( custnum, search_custnum_update );
+    custnum_search(custnum, search_custnum_update );
 
   }
 
@@ -128,6 +239,9 @@ Example:
     if ( ( <% $opt{prefix} %>rownum - searchrow ) == 1 ) {
       <% $opt{prefix} %>addRow();
     }
+    
+    var invnum = document.getElementById('invnum'+searchrow);
+    invnum.value = '';
 
     var custnum_obj = document.getElementById('custnum'+searchrow);
     custnum_obj.value = 'searching...';
@@ -136,6 +250,12 @@ Example:
     custnum_obj.style.backgroundColor = '#dddddd';
 
     var customer_select = document.getElementById('cust_select'+searchrow);
+    
+    var balance = document.getElementById('balance'+searchrow);
+    balance.innerHTML = '';
+    
+    var status = document.getElementById('status'+searchrow);
+    status.innerHTML = '';
 
     function search_customer_update(customers) {
 
@@ -153,15 +273,20 @@ Example:
         customer_obj.style.display = '';
         customer_select.style.display = 'none';
 
-
       } else if ( customerArray.length == 1 ) {
 
         custnum_obj.value = customerArray[0][0];
         customer_obj.value = customerArray[0][1];
+        balance.innerHTML = '<% $money_char %>' + customerArray[0][2] + ' &nbsp; ';
+        status.innerHTML = customerArray[0][3]; 
+        status.style.color = '#'+customerArray[0][4];
 
         customer_obj.style.display = '';
         customer_select.style.display = 'none';
 
+% if ( $opt{custnum_update_callback} ) {
+        <% $opt{custnum_update_callback} %>(searchrow, '<% $opt{prefix} %>')
+% }
 
       } else {
 
@@ -176,7 +301,7 @@ Example:
 
         //add the multiple customers
         for ( var s = 0; s < customerArray.length; s++ )
-          opt(customer_select, customerArray[s][0], customerArray[s][1], '#000000');
+          opt(customer_select, customerArray[s][0] + '_' + customerArray[s][2] + '_' + customerArray[s][3] + '_' + customerArray[s][4], customerArray[s][1], '#000000');
 
         opt(customer_select, 'cancel', '(Edit search string)', '#000000');
 
@@ -194,16 +319,18 @@ Example:
 
   function select_customer() {
 
-    var custnum = this.options[this.selectedIndex].value;
+    var custnum_balance_status = this.options[this.selectedIndex].value;
     var customer = this.options[this.selectedIndex].text;
 
     var searchrow = this.getAttribute('rownum');
     var custnum_obj = document.getElementById('custnum'+searchrow);
     var customer_obj = document.getElementById('customer'+searchrow);
+    var balance_obj = document.getElementById('balance'+searchrow);
+    var status_obj = document.getElementById('status'+searchrow);
 
-    if ( custnum == '' ) {
+    if ( custnum_balance_status == '' ) {
 
-    } else if ( custnum == 'cancel' ) {
+    } else if ( custnum_balance_status == 'cancel' ) {
 
       custnum_obj.value = '';
       custnum_obj.style.color = '#000000';
@@ -213,6 +340,14 @@ Example:
       customer_obj.focus();
 
     } else {
+    
+      var pos_underscore1 = custnum_balance_status.indexOf('_'); 
+      var pos_underscore2 = custnum_balance_status.indexOf('_',pos_underscore1+1); 
+      var pos_underscore3 = custnum_balance_status.indexOf('_',pos_underscore2+1); 
+      var custnum = custnum_balance_status.substring(0,pos_underscore1);
+      var balance = custnum_balance_status.substring(pos_underscore1+1,pos_underscore2) + ' &nbsp; ';
+      var status = custnum_balance_status.substring(pos_underscore2+1,pos_underscore3);
+      var color = custnum_balance_status.substring(pos_underscore3+1);
 
       custnum_obj.value = custnum;
       custnum_obj.style.color = '#000000';
@@ -220,9 +355,18 @@ Example:
       customer_obj.value = customer;
       customer_obj.style.color = '#000000';
 
+      balance_obj.innerHTML = '<% $money_char %>' + balance;
+
+      status_obj.innerHTML = status;
+      status_obj.style.color = '#'+color;
+
       this.style.display = 'none';
       customer_obj.style.display = '';
 
+% if ( $opt{custnum_update_callback} ) {
+      <% $opt{custnum_update_callback} %>(searchrow, '<% $opt{prefix} %>')
+% }
+
     }
 
   }
@@ -239,8 +383,11 @@ Example:
 <TABLE ID="<% $opt{prefix} %>OneTrueTable" BGCOLOR="#cccccc" BORDER=0 CELLSPACING=0>
 
 <TR>
+  <TH>Inv #</TH>
   <TH>Cust #</TH>
+  <TH>Status</TH>
   <TH>Customer</TH>
+  <TH>Balance</TH>
 % foreach my $header ( @{$opt{header}} ) {
     <TH><% $header %></TH>
 % }
@@ -249,6 +396,22 @@ Example:
 % for ( $row = 0; exists($param->{"custnum$row"}); $row++ ) { 
 
     <TR>
+      <TD>
+       <INPUT TYPE      = "text"
+               NAME      = "invnum<% $row %>"
+               ID        = "invnum<% $row %>"
+               SIZE      = 8
+               MAXLENGTH = 12
+               STYLE     = "text-align:right;"
+               VALUE     = "<% $param->{"invnum$row"} %>"
+               rownum    = "<% $row %>"
+        >
+        <SCRIPT TYPE="text/javascript">
+          var invnum_input<% $row %> = document.getElementById("invnum<% $row %>");
+          invnum_input<% $row %>.onfocus = clearhint_invnum;
+          invnum_input<% $row %>.onchange = <% $opt{prefix} %>search_invnum;
+        </SCRIPT>
+      </TD>
 
       <TD>
         <INPUT TYPE      = "text"
@@ -266,6 +429,16 @@ Example:
           custnum_input<% $row %>.onchange = <% $opt{prefix} %>search_custnum;
         </SCRIPT>
       </TD>
+      
+      <TD>
+        <SPAN 
+               NAME      = "status<% $row %>"
+               ID        = "status<% $row %>"
+               rownum    = "<% $row %>"
+               STYLE     = "text-align:center; font-weight: bold"
+        >
+        </SPAN>
+      </TD>
 
       <TD>
         <INPUT TYPE="text" NAME="customer<% $row %>" ID="customer<% $row %>" SIZE=64 VALUE="<% $param->{"customer$row"} %>" rownum="<% $row %>">
@@ -314,19 +487,27 @@ Example:
         >
 %     } elsif ($types->[$col] eq 'immutable') {
         <% $font %><% $value %><% $font ? '</FONT>' : '' %>
-        <INPUT TYPE="hidden" NAME="<% $name %>" VALUE="<% $value %>" >
+        <INPUT TYPE="hidden" ID="<% $name %>" NAME="<% $name %>" VALUE="<% $value %>" >
 %     } else {
         Cannot represent unknown type: <% $types->[$col] %>
 %     }
       </TD>
 %     $col++;
 %   }
-
+      <TD STYLE="text-align:right;">
+        <SPAN 
+               NAME      = "balance<% $row %>"
+               ID        = "balance<% $row %>"
+               rownum    = "<% $row %>"
+        >
+        </SPAN>
+        &nbsp;
+      </TD>
     </TR>
 % } 
 
 <TR>
-  <TH COLSPAN=2 ID="<% $opt{'prefix'} %>_TOTAL_TOTAL">
+  <TH COLSPAN=5 ID="<% $opt{'prefix'} %>_TOTAL_TOTAL">
     Total <% $row ? $row-1 : 0 %>
     <% PL($opt{name_singular} || 'customer', ( $row ? $row-1 : 0 ) ) %>
   </TH>
@@ -383,7 +564,7 @@ Example:
 
 <% include('/elements/xmlhttp.html',
               'url'  => $p. 'misc/xmlhttp-cust_main-search.cgi',
-              'subs' => [qw( custnum_search smart_search )],
+              'subs' => [qw( custnum_search smart_search invnum_search )],
            )
 %>
 
@@ -400,6 +581,21 @@ Example:
     var tablebody = table.getElementsByTagName('tbody').item(0);
 
     var row = table.insertRow(rownum+1);
+    
+    var invnum_cell = document.createElement('TD');
+
+      var invnum_input = document.createElement('INPUT');
+      invnum_input.setAttribute('name', 'invnum'+<% $opt{prefix} %>rownum);
+      invnum_input.setAttribute('id',   'invnum'+<% $opt{prefix} %>rownum);
+      invnum_input.style.textAlign = 'right';
+      invnum_input.setAttribute('size', 8);
+      invnum_input.setAttribute('maxlength', 12);
+      invnum_input.setAttribute('rownum', <% $opt{prefix} %>rownum);
+      invnum_input.onfocus = clearhint_invnum;
+      invnum_input.onchange = <% $opt{prefix} %>search_invnum;
+      invnum_cell.appendChild(invnum_input);
+
+    row.appendChild(invnum_cell);
 
     var custnum_cell = document.createElement('TD');
 
@@ -415,6 +611,18 @@ Example:
       custnum_cell.appendChild(custnum_input);
 
     row.appendChild(custnum_cell);
+    
+    var status_cell = document.createElement('TD');
+        
+        var status_span = document.createElement('SPAN');
+        status_span.setAttribute('name', 'status'+<% $opt{prefix} %>rownum);
+        status_span.setAttribute('id',   'status'+<% $opt{prefix} %>rownum);
+        status_span.style.textAlign = 'center';
+        status_span.style.fontWeight = 'bold';
+        status_span.setAttribute('rownum', <% $opt{prefix} %>rownum);
+        status_cell.appendChild(status_span);
+        
+    row.appendChild(status_cell);
 
     var customer_cell = document.createElement('TD');
 
@@ -439,6 +647,17 @@ Example:
       customer_cell.appendChild(customer_select);
 
     row.appendChild(customer_cell);
+    
+    var balance_cell = document.createElement('TD');
+        balance_cell.style.textAlign = 'right';
+        
+        var balance_span = document.createElement('SPAN');
+        balance_span.setAttribute('name', 'balance'+<% $opt{prefix} %>rownum);
+        balance_span.setAttribute('id',   'balance'+<% $opt{prefix} %>rownum);
+        balance_span.setAttribute('rownum', <% $opt{prefix} %>rownum);
+        balance_cell.appendChild(balance_span);
+
+    row.appendChild(balance_cell);
 
 %   my $col = 0;
 %   foreach my $field ( @{$opt{fields}} ) {
@@ -501,6 +720,7 @@ Example:
 <%init>
 
 my(%opt) = @_;
+my $conf = new FS::Conf;
 
 $opt{prefix} = '' unless defined $opt{prefix};
 $opt{prefix} .= '_' if $opt{prefix};
@@ -521,4 +741,6 @@ my %align = (
   'c' => 'center',
 );
 
+my $money_char = $conf->config('money_char') || '$';
+
 </%init>