diff options
-rw-r--r-- | FS/FS/cust_main.pm | 39 | ||||
-rw-r--r-- | FS/FS/part_pkg.pm | 17 | ||||
-rw-r--r-- | README.1.4.0pre3-4 | 2 | ||||
-rwxr-xr-x | bin/fs-setup | 4 | ||||
-rw-r--r-- | htetc/global.asa | 2 | ||||
-rw-r--r-- | htetc/handler.pl | 2 | ||||
-rwxr-xr-x | httemplate/browse/part_pkg.cgi | 6 | ||||
-rw-r--r-- | httemplate/docs/schema.html | 2 | ||||
-rw-r--r-- | httemplate/docs/upgrade8.html | 2 | ||||
-rwxr-xr-x | httemplate/edit/part_pkg.cgi | 83 | ||||
-rwxr-xr-x | httemplate/edit/process/cust_main.cgi | 4 | ||||
-rwxr-xr-x | httemplate/edit/process/part_pkg.cgi | 8 | ||||
-rwxr-xr-x | httemplate/edit/svc_acct.cgi | 4 |
13 files changed, 121 insertions, 54 deletions
diff --git a/FS/FS/cust_main.pm b/FS/FS/cust_main.pm index dce73c0ba..3895514d4 100644 --- a/FS/FS/cust_main.pm +++ b/FS/FS/cust_main.pm @@ -813,6 +813,7 @@ sub bill { # & generate invoice database. my( $total_setup, $total_recur ) = ( 0, 0 ); + my( $taxable_setup, $taxable_recur ) = ( 0, 0 ); my @cust_bill_pkg = (); foreach my $cust_pkg ( @@ -927,37 +928,49 @@ sub bill { push @cust_bill_pkg, $cust_bill_pkg; $total_setup += $setup; $total_recur += $recur; + $taxable_setup += $setup + unless $part_pkg->dbdef_table->column('setuptax') + || $part_pkg->setuptax =~ /^Y$/i; + $taxable_recur += $recur + unless $part_pkg->dbdef_table->column('recurtax') + || $part_pkg->recurtax =~ /^Y$/i; } } } my $charged = sprintf( "%.2f", $total_setup + $total_recur ); + my $taxable_charged = sprintf( "%.2f", $taxable_setup + $taxable_recur ); unless ( @cust_bill_pkg ) { $dbh->commit or die $dbh->errstr if $oldAutoCommit; return ''; } - unless ( $self->tax =~ /Y/i || $self->payby eq 'COMP' ) { + unless ( $self->tax =~ /Y/i + || $self->payby eq 'COMP' + || $taxable_charged == 0 ) { my $cust_main_county = qsearchs('cust_main_county',{ 'state' => $self->state, 'county' => $self->county, 'country' => $self->country, } ); my $tax = sprintf( "%.2f", - $charged * ( $cust_main_county->getfield('tax') / 100 ) + $taxable_charged * ( $cust_main_county->getfield('tax') / 100 ) ); - $charged = sprintf( "%.2f", $charged+$tax ); - - my $cust_bill_pkg = new FS::cust_bill_pkg ({ - 'pkgnum' => 0, - 'setup' => $tax, - 'recur' => 0, - 'sdate' => '', - 'edate' => '', - }); - push @cust_bill_pkg, $cust_bill_pkg; + + if ( $tax > 0 ) { + $charged = sprintf( "%.2f", $charged+$tax ); + + my $cust_bill_pkg = new FS::cust_bill_pkg ({ + 'pkgnum' => 0, + 'setup' => $tax, + 'recur' => 0, + 'sdate' => '', + 'edate' => '', + }); + push @cust_bill_pkg, $cust_bill_pkg; + } } my $cust_bill = new FS::cust_bill ( { @@ -1827,7 +1840,7 @@ sub append_fuzzyfiles { =head1 VERSION -$Id: cust_main.pm,v 1.41 2001-10-15 12:16:42 ivan Exp $ +$Id: cust_main.pm,v 1.42 2001-10-20 12:17:59 ivan Exp $ =head1 BUGS diff --git a/FS/FS/part_pkg.pm b/FS/FS/part_pkg.pm index d84b9c5b7..ceb2a0128 100644 --- a/FS/FS/part_pkg.pm +++ b/FS/FS/part_pkg.pm @@ -52,6 +52,10 @@ inherits from FS::Record. The following fields are currently supported: =item recur - Recurring fee expression +=item setuptax - Setup fee tax exempt flag, empty or `Y' + +=item recurtax - Recurring fee tax exempt flag, empty or `Y' + =item plan - Price plan =item plandata - Price plan data @@ -126,7 +130,7 @@ insert and replace methods. sub check { my $self = shift; - $self->ut_numbern('pkgpart') + my $error = $self->ut_numbern('pkgpart') || $self->ut_text('pkg') || $self->ut_text('comment') || $self->ut_anything('setup') @@ -135,6 +139,15 @@ sub check { || $self->ut_alphan('plan') || $self->ut_anything('plandata') ; + return $error if $error; + + $self->setuptax =~ /^(Y?)$/ or return "Illegal setuptax: ". $self->setuptax; + $self->setuptax($1); + + $self->recurtax =~ /^(Y?)$/ or return "Illegal recrutax: ". $self->recurtax; + $self->recurtax($1); + + ''; } =item pkg_svc @@ -172,7 +185,7 @@ sub svcpart { =head1 VERSION -$Id: part_pkg.pm,v 1.3 2001-10-15 10:42:28 ivan Exp $ +$Id: part_pkg.pm,v 1.4 2001-10-20 12:17:59 ivan Exp $ =head1 BUGS diff --git a/README.1.4.0pre3-4 b/README.1.4.0pre3-4 index 49ca5a4d0..0027d3450 100644 --- a/README.1.4.0pre3-4 +++ b/README.1.4.0pre3-4 @@ -16,6 +16,8 @@ ALTER TABLE cust_pay_batch ADD paybatchnum integer; CREATE UNIQUE INDEX cust_pay_batch_pkey ON cust_pay_batch ( paybatchnum ); ALTER TABLE part_pkg ADD plan varchar NULL; ALTER TABLE part_pkg ADD plandata varchar NULL; +ALTER TABLE part_pkg ADD setuptax char(1) NULL; +ALTER TABLE part_pkg ADD recurtax char(1) NULL; Run bin/dbdef-create diff --git a/bin/fs-setup b/bin/fs-setup index 96ec2b74b..5927f88f7 100755 --- a/bin/fs-setup +++ b/bin/fs-setup @@ -1,6 +1,6 @@ #!/usr/bin/perl -Tw # -# $Id: fs-setup,v 1.62 2001-10-15 10:42:28 ivan Exp $ +# $Id: fs-setup,v 1.63 2001-10-20 12:17:59 ivan Exp $ #to delay loading dbdef until we're ready BEGIN { $FS::Record::setup_hack = 1; } @@ -540,6 +540,8 @@ sub tables_hash_hack { 'setup', @perl_type, 'freq', 'int', '', '', #billing frequency (months) 'recur', @perl_type, + 'setuptax', 'char', 'NULL', 1, + 'recurtax', 'char', 'NULL', 1, 'plan', 'varchar', 'NULL', '', 'plandata', 'varchar', 'NULL', '', ], diff --git a/htetc/global.asa b/htetc/global.asa index c3393ad67..a5863c327 100644 --- a/htetc/global.asa +++ b/htetc/global.asa @@ -12,7 +12,7 @@ use FS::part_pkg; use FS::pkg_svc; use FS::cust_pkg; use FS::cust_svc; -use FS::CGI qw(header menubar popurl table ntable); +use FS::CGI qw(header menubar popurl table itable ntable); sub Script_OnStart { $cgi = new CGI; diff --git a/htetc/handler.pl b/htetc/handler.pl index d747fe464..e537d26fc 100644 --- a/htetc/handler.pl +++ b/htetc/handler.pl @@ -66,7 +66,7 @@ sub handler use FS::pkg_svc; use FS::cust_pkg; use FS::cust_svc; - use FS::CGI qw(header menubar popurl table ntable); + use FS::CGI qw(header menubar popurl table itable ntable); $cgi = new CGI; &cgisuidsetup($cgi); diff --git a/httemplate/browse/part_pkg.cgi b/httemplate/browse/part_pkg.cgi index e20ba2404..30f994872 100755 --- a/httemplate/browse/part_pkg.cgi +++ b/httemplate/browse/part_pkg.cgi @@ -1,5 +1,5 @@ <% -#<!-- $Id: part_pkg.cgi,v 1.5 2001-10-15 10:42:28 ivan Exp $ --> +#<!-- $Id: part_pkg.cgi,v 1.6 2001-10-20 12:17:59 ivan Exp $ --> use strict; use vars qw( $cgi $p $part_pkg ); @@ -21,9 +21,9 @@ $p = popurl(2); print $cgi->header( '-expires' => 'now' ), header("Package Definition Listing",menubar( 'Main Menu' => $p, )), "One or more services are grouped together into a package and given", - " pricing information. Customers purchase packages, not services.<BR><BR>", + " pricing information. Customers purchase packages", + " rather than purchase services directly.<BR><BR>", &table(), <<END; - <TABLE BORDER> <TR> <TH COLSPAN=2>Package</TH> <TH>Comment</TH> diff --git a/httemplate/docs/schema.html b/httemplate/docs/schema.html index 88b4cb2b1..145d55fc2 100644 --- a/httemplate/docs/schema.html +++ b/httemplate/docs/schema.html @@ -196,6 +196,8 @@ <li>setup - setup fee expression <li>freq - recurring frequency (months) <li>recur - recurring fee expression + <li>setuptax - Setup fee tax exempt flag, empty or `Y' + <li>recurtax - Recurring fee tax exempt flag, empty or `Y' <li>plan - price plan <li>plandata - additional price plan data </ul> diff --git a/httemplate/docs/upgrade8.html b/httemplate/docs/upgrade8.html index c317e88c8..a368d4488 100644 --- a/httemplate/docs/upgrade8.html +++ b/httemplate/docs/upgrade8.html @@ -137,6 +137,8 @@ ALTER TABLE cust_refund ADD custnum integer; ALTER TABLE cust_pkg ADD manual_flag char(1) NULL; ALTER TABLE part_pkg ADD plan varchar NULL; ALTER TABLE part_pkg ADD plandata varchar NULL; +ALTER TABLE part_pkg ADD setuptax char(1) NULL; +ALTER TABLE part_pkg ADD recurtax char(1) NULL; CREATE INDEX cust_main3 ON cust_main ( referral_custnum ); CREATE INDEX cust_credit_bill1 ON cust_credit_bill ( crednum ); CREATE INDEX cust_credit_bill2 ON cust_credit_bill ( invnum ); diff --git a/httemplate/edit/part_pkg.cgi b/httemplate/edit/part_pkg.cgi index 5eccc1e1e..fee0b411e 100755 --- a/httemplate/edit/part_pkg.cgi +++ b/httemplate/edit/part_pkg.cgi @@ -1,4 +1,4 @@ -<!-- $Id: part_pkg.cgi,v 1.5 2001-10-15 11:39:29 ivan Exp $ --> +<!-- $Id: part_pkg.cgi,v 1.6 2001-10-20 12:17:59 ivan Exp $ --> <% @@ -34,8 +34,8 @@ if ( $cgi->param('clone') ) { } unless ( $part_pkg->plan ) { #backwards-compat $part_pkg->plan('flat'); - $part_pkg->plandata("setup=". $part_pkg->setup. "\n". - "recur=". $part_pkg->recur. "\n"); + $part_pkg->plandata("setup_fee=". $part_pkg->setup. "\n". + "recur_fee=". $part_pkg->recur. "\n"); } $action ||= $part_pkg->pkgpart ? 'Edit' : 'Add'; my $hashref = $part_pkg->hashref; @@ -76,28 +76,44 @@ print '<FORM NAME="dummy">'; #print qq!<INPUT TYPE="hidden" NAME="pkgpart" VALUE="$hashref->{pkgpart}">!, print "Package Part #", $hashref->{pkgpart} ? $hashref->{pkgpart} : "(NEW)"; +print itable("#cccccc",2), <<END; +<TR><TD ALIGN="right">Package (customer-visable)</TD><TD><INPUT TYPE="text" NAME="pkg" SIZE=32 VALUE="$hashref->{pkg}"></TD></TR> +<TR><TD ALIGN="right">Comment (customer-hidden)</TD><TD><INPUT TYPE="text" NAME="comment" SIZE=32 VALUE="$hashref->{comment}"></TD></TR> +<TR><TD ALIGN="right">Frequency (months) of recurring fee</TD><TD><INPUT TYPE="text" NAME="freq" VALUE="$hashref->{freq}" SIZE=3></TD></TR> +<TR><TD ALIGN="right">Setup fee tax exempt</TD><TD> +END + +print '<INPUT TYPE="checkbox" NAME="setuptax" VALUE="Y"'; +print ' CHECKED' if $hashref->{setuptax} eq "Y"; +print '>'; + print <<END; -<PRE> -Package (customer-visable) <INPUT TYPE="text" NAME="pkg" SIZE=32 VALUE="$hashref->{pkg}"> -Comment (customer-hidden) <INPUT TYPE="text" NAME="comment" SIZE=32 VALUE="$hashref->{comment}"> +</TD></TR> +<TR><TD ALIGN="right">Recurring fee tax exempt</TD><TD> +END -Frequency (months) of recurring fee <INPUT TYPE="text" NAME="freq" VALUE="$hashref->{freq}"> +print '<INPUT TYPE="checkbox" NAME="recurtax" VALUE="Y"'; +print ' CHECKED' if $hashref->{recurtax} eq "Y"; +print '>'; -</PRE> +print '</TD></TR></TABLE>'; +my $thead = "\n\n". ntable('#cccccc', 2). <<END; +<TR><TH BGCOLOR="#dcdcdc"><FONT SIZE=-1>Quan.</FONT></TH><TH BGCOLOR="#dcdcdc">Service</TH></TR> END unless ( $cgi->param('clone') ) { - print <<END; -Enter the quantity of each service this package includes.<BR><BR> -<TABLE BORDER><TR><TH><FONT SIZE=-1>Quan.</FONT></TH><TH>Service</TH> - <TH><FONT SIZE=-1>Quan.</FONT></TH><TH>Service</TH></TR> + #print <<END, $thead; + print <<END, itable(), '<TR><TD VALIGN="top">', $thead; +<BR><BR>Enter the quantity of each service this package includes.<BR><BR> END } -my $count = 0; my @fixups = (); -foreach my $part_svc ( ( qsearch( 'part_svc', {} ) ) ) { +my $count = 0; +my $columns = 3; +my @part_svc = qsearch( 'part_svc', {} ); +foreach my $part_svc ( @part_svc ) { my $svcpart = $part_svc->svcpart; my $pkg_svc = qsearchs( 'pkg_svc', { 'pkgpart' => $cgi->param('clone') || $part_pkg->pkgpart, @@ -112,16 +128,16 @@ foreach my $part_svc ( ( qsearch( 'part_svc', {} ) ) ) { push @fixups, "pkg_svc$svcpart"; unless ( defined ($cgi->param('clone')) && $cgi->param('clone') ) { - print '<TR>' if $count == 0 ; - print qq!<TD><INPUT TYPE="text" NAME="pkg_svc$svcpart" SIZE=3 VALUE="!, + print '<TR>'; # if $count == 0 ; + print qq!<TD><INPUT TYPE="text" NAME="pkg_svc$svcpart" SIZE=4 MAXLENGTH=3 VALUE="!, $cgi->param("pkg_svc$svcpart") || $pkg_svc->quantity || 0, qq!"></TD><TD><A HREF="part_svc.cgi?!,$part_svc->svcpart, - qq!">!, $part_svc->getfield('svc'), "</A></TD>"; - $count++; - if ($count == 2) - { - print '</TR>'; - $count = 0; + qq!">!, $part_svc->getfield('svc'), "</A></TD></TR>"; +# print "</TABLE></TD><TD>$thead" if ++$count == int(scalar(@part_svc) / 2); + $count+=1; + foreach ( 1 .. $columns-1 ) { + print "</TABLE></TD><TD VALIGN=\"top\">$thead" + if $count == int( $_ * scalar(@part_svc) / $columns ); } } else { print qq!<INPUT TYPE="hidden" NAME="pkg_svc$svcpart" VALUE="!, @@ -130,8 +146,8 @@ foreach my $part_svc ( ( qsearch( 'part_svc', {} ) ) ) { } unless ( $cgi->param('clone') ) { - print qq!</TR>! if ($count != 0) ; - print "</TABLE>"; + print "</TR></TABLE></TD></TR></TABLE>"; + #print "</TR></TABLE>"; } # prolly should be in database @@ -216,6 +232,12 @@ function fixup(what) { <% foreach my $f ( qw( pkg comment freq ), @fixups ) { %> what.<%= $f %>.value = document.dummy.<%= $f %>.value; <% } %> +<% foreach my $f ( qw( setuptax recurtax ) ) { %> + if (document.dummy.<%= $f %>.checked) + what.<%= $f %>.value = 'Y'; + else + what.<%= $f %>.value = ''; +<% } %> what.plan.value = document.dummy.plan.options[document.dummy.plan.selectedIndex].value; <% foreach my $p ( keys %plans ) { %> if ( what.plan.value == "<%= $p %>" ) { @@ -246,6 +268,8 @@ if (document.getElementById) { <INPUT TYPE="hidden" NAME="pkg" VALUE="<%= $hashref->{pkg} %>"> <INPUT TYPE="hidden" NAME="comment" VALUE="$<%= $hashref->{comment} %>"> <INPUT TYPE="hidden" NAME="freq" VALUE="<%= $hashref->{freq} %>"> +<INPUT TYPE="hidden" NAME="setuptax" VALUE="<%= $hashref->{setuptax} %>"> +<INPUT TYPE="hidden" NAME="recurtax" VALUE="<%= $hashref->{recurtax} %>"> <% foreach my $f ( @fixups ) { %> <INPUT TYPE="hidden" NAME="<%= $f %>" VALUE=""> <% } %> @@ -257,17 +281,20 @@ if ( $cgi->param('clone') ) { if ( $cgi->param('pkgnum') ) { print qq!<INPUT TYPE="hidden" NAME="pkgnum" VALUE="!, $cgi->param('pkgnum'), qq!">!; } -print qq!<INPUT TYPE="hidden" NAME="pkgpart" VALUE="$hashref->{pkgpart}">!, %> +<INPUT TYPE="hidden" NAME="pkgpart" VALUE="<%= $hashref->{pkgpart} %>"> +<%= itable("#cccccc",2) %> + <% my $href = $plans{$layer}->{'fields'}; foreach my $field ( keys %{ $href } ) { %> -<%= $href->{$field}{'name'} %>: -<INPUT TYPE="text" NAME="<%= $field %>" VALUE="<%= exists($plandata{$field}) ? $plandata{$field} : $href->{$field}{'default'} %>" onChange="fchanged(this)"><BR> +<TR><TD ALIGN="right"><%= $href->{$field}{'name'} %></TD> +<TD><INPUT TYPE="text" NAME="<%= $field %>" VALUE="<%= exists($plandata{$field}) ? $plandata{$field} : $href->{$field}{'default'} %>" onChange="fchanged(this)"></TD></TR> <% } %> +</TABLE> <INPUT TYPE="hidden" NAME="plandata" VALUE="<%= join(',', keys %{ $href } ) %>"> - <FONT SIZE="1"> +<BR><BR> Setup expression<BR><INPUT TYPE="text" NAME="setup" SIZE="160" VALUE="<%= $hashref->{setup} %>" onLoad="fchanged(this)"><BR> Recurring espression<BR><INPUT TYPE="text" NAME="recur" SIZE="160" VALUE="<%= $hashref->{recur} %>" onLoad="fchanged(this)"><BR> </FONT> diff --git a/httemplate/edit/process/cust_main.cgi b/httemplate/edit/process/cust_main.cgi index cc5efd6b1..625a85052 100755 --- a/httemplate/edit/process/cust_main.cgi +++ b/httemplate/edit/process/cust_main.cgi @@ -1,5 +1,5 @@ <% -# $Id: cust_main.cgi,v 1.4 2001-09-04 15:06:03 ivan Exp $ +# $Id: cust_main.cgi,v 1.5 2001-10-20 12:18:00 ivan Exp $ use strict; use vars qw( $cgi $payby @invoicing_list $new $custnum $error ); @@ -20,7 +20,7 @@ $error = ''; #unmunge stuff -$cgi->param('tax','') unless defined($cgi->param('tax')); +$cgi->param('tax','') unless defined $cgi->param('tax'); $cgi->param('refnum', (split(/:/, ($cgi->param('refnum'))[0] ))[0] ); diff --git a/httemplate/edit/process/part_pkg.cgi b/httemplate/edit/process/part_pkg.cgi index 6cfaa122e..cd799b5b9 100755 --- a/httemplate/edit/process/part_pkg.cgi +++ b/httemplate/edit/process/part_pkg.cgi @@ -1,5 +1,5 @@ <% -#<!-- $Id: part_pkg.cgi,v 1.3 2001-10-15 10:42:29 ivan Exp $ --> +#<!-- $Id: part_pkg.cgi,v 1.4 2001-10-20 12:18:00 ivan Exp $ --> use strict; use vars qw( $cgi $pkgpart $old $new $part_svc $error $dbh ); @@ -26,12 +26,18 @@ $cgi->param('plandata', join('', map { "$_=". $cgi->param($_). "\n" } @plandata ) ); +$cgi->param('setuptax','') unless defined $cgi->param('setuptax'); +$cgi->param('recurtax','') unless defined $cgi->param('recurtax'); + $new = new FS::part_pkg ( { map { $_, scalar($cgi->param($_)); } fields('part_pkg') } ); +warn "setuptax: ". $new->setuptax; +warn "recurtax: ". $new->recurtax; + #most of the stuff below should move to part_pkg.pm foreach $part_svc ( qsearch('part_svc', {} ) ) { diff --git a/httemplate/edit/svc_acct.cgi b/httemplate/edit/svc_acct.cgi index 8646bb707..3d0bb0134 100755 --- a/httemplate/edit/svc_acct.cgi +++ b/httemplate/edit/svc_acct.cgi @@ -1,5 +1,5 @@ <% -#<!-- $Id: svc_acct.cgi,v 1.9 2001-09-27 21:12:15 ivan Exp $ --> +#<!-- $Id: svc_acct.cgi,v 1.10 2001-10-20 12:18:00 ivan Exp $ --> use strict; use vars qw( $conf $cgi @shells $action $svcnum $svc_acct $pkgnum $svcpart @@ -116,7 +116,7 @@ print 'Service # '. ( $svcnum ? "<B>$svcnum</B>" : " (NEW)" ). '<BR>'. <INPUT TYPE="hidden" NAME="svcpart" VALUE="$svcpart"> END -print &itable("#cccccc"), <<END; +print &itable("#cccccc",2), <<END; <TR><TD> <TR><TD ALIGN="right">Username</TD> <TD><INPUT TYPE="text" NAME="username" VALUE="$username" SIZE=$ulen2 MAXLENGTH=$ulen></TD></TR> |