summaryrefslogtreecommitdiff
path: root/httemplate
diff options
context:
space:
mode:
authorivan <ivan>2008-05-18 03:04:03 +0000
committerivan <ivan>2008-05-18 03:04:03 +0000
commitb8d03e480cf0798c30d6d8e9ec6cf53d8f419043 (patch)
tree913fd43745734ac92a68fba0b952b2aad15e8a0b /httemplate
parentdc3217c61d6a62a8e599d8804e05ba45b3224c7e (diff)
quick payment entry running total, closes: #3470
Diffstat (limited to 'httemplate')
-rw-r--r--httemplate/elements/customer-table.html179
-rw-r--r--httemplate/misc/batch-cust_pay.html15
2 files changed, 164 insertions, 30 deletions
diff --git a/httemplate/elements/customer-table.html b/httemplate/elements/customer-table.html
index 779b01c51..f00419f9c 100644
--- a/httemplate/elements/customer-table.html
+++ b/httemplate/elements/customer-table.html
@@ -4,17 +4,36 @@ Example:
include( '/elements/customer-table.html',
+ ###
+ # required
+ ###
+
#listrefs...
- 'header' => [ '#', 'Item' ],
- 'fields' => [
- 'column',
- sub { my ($row,$param) = @_;
- $param->{"column$row"};
- },
- ],
- 'sizes' => [], # sizes ignored for immutable
- 'types' => ['immutable', ''], # immutable or ''/text
- 'param' => { column0 => 1 }, # preset column of row 0 to 1
+ 'header' => [ '#', 'Item' ],
+ 'fields' => [
+ 'column',
+ sub { my ($row,$param) = @_;
+ $param->{"column$row"};
+ },
+ ],
+
+ ###
+ # optional
+ ###
+
+ 'name_singular' => 'customer', #label
+
+ #listrefs
+ 'types' => ['immutable', ''], # immutable or ''/text
+ 'align' => [ 'c', 'l', 'r', '' ],
+ 'size' => [], # sizes ignored for immutable
+ 'color' => [],
+ 'footer' => ['string', '_TOTAL'], # strings or the special
+ #value _TOTAL
+ 'footer_align' => [ 'c', 'l', 'r', '' ],
+
+ 'param' => { column0 => 1 }, # preset column of row 0 to 1
+
)
</%doc>
@@ -232,12 +251,20 @@ Example:
<TR>
<TD>
- <INPUT TYPE="text" NAME="custnum<% $row %>" ID="custnum<% $row %>" SIZE=8 MAXLENGTH=12 VALUE="<% $param->{"custnum$row"} %>" rownum="<% $row %>">
- <SCRIPT TYPE="text/javascript">
- var custnum_input<% $row %> = document.getElementById("custnum<% $row %>");
- custnum_input<% $row %>.onfocus = clearhint_custnum;
- custnum_input<% $row %>.onchange = <% $opt{prefix} %>search_custnum;
- </SCRIPT>
+ <INPUT TYPE = "text"
+ NAME = "custnum<% $row %>"
+ ID = "custnum<% $row %>"
+ SIZE = 8
+ MAXLENGTH = 12
+ STYLE = "text-align:right;"
+ VALUE = "<% $param->{"custnum$row"} %>"
+ rownum = "<% $row %>"
+ >
+ <SCRIPT TYPE="text/javascript">
+ var custnum_input<% $row %> = document.getElementById("custnum<% $row %>");
+ custnum_input<% $row %>.onfocus = clearhint_custnum;
+ custnum_input<% $row %>.onchange = <% $opt{prefix} %>search_custnum;
+ </SCRIPT>
</TD>
<TD>
@@ -264,13 +291,29 @@ Example:
% } else {
% $value = $param->{"$field$row"};
% }
-% my $name = (ref($field) eq 'CODE') ? "column${col}_$row" : "$field$row";
-% my $size = $sizes->[$col] || 10;
- <TD>
+% my $name = (ref($field) eq 'CODE') ? "column${col}_$row" : "$field$row";
+% my $align = $align{ $opt{align}->[$col] || 'l' };
+% my $size = $sizes->[$col] || 10;
+% my $color = $opt{color}->[$col];
+% my $font = $color ? qq(<FONT COLOR="$color">) : '';
+% my $onchange = '';
+% if ( $opt{footer}->[$col] eq '_TOTAL' ) {
+% $total[$col] += $value;
+% $onchange = $opt{prefix}. "calc_total$col();";
+% $onchange = qq(onchange="$onchange" onkeyup="$onchange");
+% }
+ <TD ALIGN="<% $align %>">
% if (! $types->[$col] || $types->[$col] eq 'text') {
- <INPUT TYPE="text" NAME="<% $name %>" SIZE="<% $size %>" VALUE="<% $value %>" >
+ <INPUT TYPE = "text"
+ NAME = "<% $name %>"
+ ID = "<% $name %>"
+ SIZE = "<% $size %>"
+ STYLE = "text-align: <% $align %>;"
+ VALUE = "<% $value %>"
+ <% $onchange %>
+ >
% } elsif ($types->[$col] eq 'immutable') {
- <% $value %>
+ <% $font %><% $value %><% $font ? '</FONT>' : '' %>
<INPUT TYPE="hidden" NAME="<% $name %>" VALUE="<% $value %>" >
% } else {
Cannot represent unknown type: <% $types->[$col] %>
@@ -282,9 +325,62 @@ Example:
</TR>
% }
+<TR>
+ <TH COLSPAN=2 ID="<% $opt{'prefix'} %>_TOTAL_TOTAL">
+ Total <% $row ? $row-1 : 0 %>
+ <% PL($opt{name_singular} || 'customer', ( $row ? $row-1 : 0 ) ) %>
+ </TH>
+% my $col = 0;
+% foreach my $footer ( @{$opt{footer}} ) {
+% my $align = $align{ $opt{'footer_align'}->[$col] || 'c' };
+% if ($footer eq '_TOTAL' ) {
+% my $id = $opt{'fields'}->[$col];
+% $id = ref($id) ? "column${col}_TOTAL" : "${id}_TOTAL";
+ <TH ALIGN="<% $align %>" ID="<% $id %>">&nbsp;<% sprintf('%.2f', $total[$col] ) %></TH>
+% } else {
+ <TH ALIGN="<% $align %>"><% $footer %></TH>
+% }
+% $col++;
+% }
+</TR>
</TABLE>
+<SCRIPT TYPE="text/javascript">
+% my $col = 0;
+% foreach my $footer ( @{$opt{footer}} ) {
+% if ($footer eq '_TOTAL' ) {
+% my $name = $opt{fields}->[$col];
+% $name = ref($name) ? "column$col" : $name;
+ var <% $opt{prefix}.$name %>_CACHE = new Array ();
+ var <% $opt{prefix} %>th_el = document.getElementById("<%$name%>_TOTAL");
+ function <% $opt{prefix} %>calc_total<% $col %>() {
+ var row = 0;
+ var total = 0;
+ for ( var row = 0;
+
+ ( <% $opt{prefix}.$name%>_CACHE[row] =
+ <% $opt{prefix}.$name%>_CACHE[row]
+ || document.getElementById("<%$name%>"+row)
+ ) != null;
+
+ row++
+ )
+ {
+ var value = <%$name%>_CACHE[row].value;
+ value = parseFloat(value);
+ if ( ! isNaN(value) ) {
+ total = total + value;
+ }
+ }
+ <% $opt{prefix} %>th_el.innerHTML = '&nbsp;' + total.toFixed(2);
+
+ }
+% }
+% $col++;
+% }
+</SCRIPT>
+
<% include('/elements/xmlhttp.html',
'url' => $p. 'misc/xmlhttp-cust_main-search.cgi',
'subs' => [qw( custnum_search smart_search )],
@@ -293,6 +389,9 @@ Example:
<SCRIPT TYPE="text/javascript">
+ var <% $opt{prefix} %>total_el =
+ document.getElementById("<% $opt{'prefix'} %>_TOTAL_TOTAL");
+
var <% $opt{prefix} %>rownum = <% $row %>;
function <% $opt{prefix} %>addRow() {
@@ -300,13 +399,14 @@ Example:
var table = document.getElementById('<% $opt{prefix} %>OneTrueTable');
var tablebody = table.getElementsByTagName('tbody').item(0);
- var row = document.createElement('TR');
+ var row = table.insertRow(rownum+1);
var custnum_cell = document.createElement('TD');
var custnum_input = document.createElement('INPUT');
custnum_input.setAttribute('name', 'custnum'+<% $opt{prefix} %>rownum);
custnum_input.setAttribute('id', 'custnum'+<% $opt{prefix} %>rownum);
+ custnum_input.style.textAlign = 'right';
custnum_input.setAttribute('size', 8);
custnum_input.setAttribute('maxlength', 12);
custnum_input.setAttribute('rownum', <% $opt{prefix} %>rownum);
@@ -342,7 +442,9 @@ Example:
% my $col = 0;
% foreach my $field ( @{$opt{fields}} ) {
- var my_cell = document.createElement('TD');
+
+ var my_cell = document.createElement('TD');
+ my_cell.setAttribute('align', '<% $align{ $opt{align}->[$col] || 'l' } %>');
% if ($types->[$col] eq 'immutable') {
% my $value;
@@ -357,10 +459,16 @@ Example:
var my_input = document.createElement('INPUT');
my_input.setAttribute('name', '<% $field %>'+<% $opt{prefix} %>rownum);
+ my_input.setAttribute('id', '<% $field %>'+<% $opt{prefix} %>rownum);
+ my_input.style.textAlign = '<% $align{ $opt{align}->[$col] || 'l' } %>';
my_input.setAttribute('size', <% $sizes->[$col] || 10 %>);
% if ($types->[$col] eq 'immutable') {
my_input.setAttribute('type', 'hidden');
% }
+% if ( $opt{footer}->[$col] eq '_TOTAL' ) {
+ my_input.onchange = <% $opt{prefix} %>calc_total<%$col%>;
+ my_input.onkeyup = <% $opt{prefix} %>calc_total<%$col%>;
+% }
my_cell.appendChild(my_input);
row.appendChild(my_cell);
@@ -368,7 +476,18 @@ Example:
% $col++;
% }
- tablebody.appendChild(row);
+ //update the total # of rows display
+ if ( <% $opt{prefix} %>rownum == 1 ) {
+ <% $opt{prefix} %>total_el.innerHTML =
+ 'Total '
+ + <% $opt{prefix} %>rownum
+ + ' <% $opt{name_singular} || 'customer' %>';
+ } else {
+ <% $opt{prefix} %>total_el.innerHTML =
+ 'Total '
+ + <% $opt{prefix} %>rownum
+ + ' <% PL($opt{name_singular} || 'customer') %>';
+ }
<% $opt{prefix} %>rownum++;
@@ -387,9 +506,19 @@ $opt{prefix} = '' unless defined $opt{prefix};
$opt{prefix} .= '_' if $opt{prefix};
my $types = $opt{'types'} ? [ @{$opt{'types'}} ] : [];
-my $sizes = $opt{'sizes'} ? [ @{$opt{'sizes'}} ] : [];
+my $sizes = $opt{'size'} ? [ @{$opt{'size'}} ] : [];
my $param = $opt{param};
$param = $cgi->Vars if $cgi->param('error');
+$opt{$_} ||= [] foreach qw(align color footer footer_align);
+
+my @total = map 0, @{$opt{footer}};
+
+my %align = (
+ 'l' => 'left',
+ 'r' => 'right',
+ 'c' => 'center',
+);
+
</%init>
diff --git a/httemplate/misc/batch-cust_pay.html b/httemplate/misc/batch-cust_pay.html
index c0b9068be..e10a5f658 100644
--- a/httemplate/misc/batch-cust_pay.html
+++ b/httemplate/misc/batch-cust_pay.html
@@ -7,11 +7,16 @@
<!-- <B>Batch</B> <INPUT TYPE="text" NAME="paybatch"><BR><BR> -->
<% include( "/elements/customer-table.html",
- header => [ '', 'Amount', 'Check #', '' ],
- fields => [ sub {'$'}, 'paid', 'payinfo', 'error', ],
- types => [ 'immutable', '', '', 'immutable', ],
- sizes => [ 0, 8, 10, 0, ],
- param => { () },
+ name_singular => 'payment',
+ header => [ '', 'Amount', 'Check #', '' ],
+ fields => [ sub {'$'}, 'paid', 'payinfo', 'error', ],
+ types => [ 'immutable', '', '', 'immutable', ],
+ align => [ 'c', 'r', 'r', 'l' ],
+ sizes => [ 0, 8, 10, 0, ],
+ colors => [ '', '', '', '#ff0000' ],
+ param => { () },
+ footer => [ '$', '_TOTAL', '', '' ],
+ footer_align => [ 'c', 'r', 'r', '' ],
)
%>