From b667f6fc3b7d7552c4df286c22cca36b66ee26b5 Mon Sep 17 00:00:00 2001 From: jeff Date: Fri, 6 Nov 2009 22:25:11 +0000 Subject: [PATCH] oops! forgot an important file for applying tax credits #4729 --- httemplate/misc/xmlhttp-calculate_taxes.html | 105 +++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 httemplate/misc/xmlhttp-calculate_taxes.html diff --git a/httemplate/misc/xmlhttp-calculate_taxes.html b/httemplate/misc/xmlhttp-calculate_taxes.html new file mode 100644 index 000000000..774b89381 --- /dev/null +++ b/httemplate/misc/xmlhttp-calculate_taxes.html @@ -0,0 +1,105 @@ +<% objToJson($return) %> +<%init> + +my $DEBUG = 0; + +my $conf = new FS::Conf; + +my $sub = $cgi->param('sub'); + +my $return = {}; + +if ( $sub eq 'calculate_taxes' ) { + + { + my %arg = $cgi->param('arg'); + $return = \%arg; + warn join('', map "$_: $arg{$_}\n", keys %arg ) + if $DEBUG; + + my $cust_credit = qsearchs( 'cust_credit', { 'crednum' => $arg{crednum} } ); + unless ($cust_credit) { + $return->{error} = "No such credit: $arg{crednum}"; + last; + } + + my %cust_bill_pkg = (); + my @items = split(',', $arg{items}); + while ( @items ) { + my ($billpkgnum, $s_or_r, $amount ) = splice(@items, 0, 3); + unless ( defined($amount) ) { + $return->{error} = "Bad items argument list"; + last; + } + unless ( $cust_bill_pkg{$billpkgnum} ) { + my $cust_bill_pkg = + qsearchs( 'cust_bill_pkg', { 'billpkgnum' => $billpkgnum } ); + unless ($cust_bill_pkg) { + $return->{error} = "No such line item: $billpkgnum"; + last; + } + next unless $cust_bill_pkg->pkgnum > 0; #hmmm @ one shot (-1) + unless ($cust_bill_pkg->cust_pkg->custnum == $cust_credit->custnum) { + $return->{error} = "Credit/line item customer mismatch"; + last; + } + $cust_bill_pkg{$billpkgnum} = $cust_bill_pkg; + $cust_bill_pkg->setup(0); + $cust_bill_pkg->recur(0); + } + + last if $return->{error}; + + my $cust_bill_pkg = $cust_bill_pkg{$billpkgnum}; + $s_or_r = $s_or_r eq 'setup' ? 'setup' : 'recur'; + my $value = sprintf('%.2f', $cust_bill_pkg->$s_or_r + $amount); + $cust_bill_pkg->$s_or_r($value); + } + + last if $return->{error}; + + my $cust_main = $cust_credit->cust_main; + + my $taxlisthash = {}; + foreach my $cust_bill_pkg (values %cust_bill_pkg) { + my $part_pkg = $cust_bill_pkg->part_pkg; + $cust_main->_handle_taxes( $part_pkg, + $taxlisthash, + $cust_bill_pkg, + $cust_bill_pkg->cust_pkg, + $cust_bill_pkg->cust_bill->_date, + $cust_bill_pkg->cust_pkg->pkgpart, + ); + } + my $listref_or_error = + $cust_main->calculate_taxes( [ values %cust_bill_pkg ], $taxlisthash, [ values %cust_bill_pkg ]->[0]->cust_bill->_date ); + + unless ( ref( $listref_or_error ) ) { + $return->{error} = "No such credit: $arg{crednum}"; + last; + } + + my @taxlines = (); + $return->{taxlines} = \@taxlines; + foreach my $taxline ( @$listref_or_error ) { + my $amount = $taxline->setup; + my $desc = $taxline->desc; + foreach my $location ( @{$taxline->cust_bill_pkg_tax_location}, @{$taxline->cust_bill_pkg_tax_rate_location} ) { + my $taxlocnum = $location->locationnum || ''; + my $taxratelocnum = $location->taxratelocationnum || ''; + push @taxlines, + [ $location->desc, $taxline->setup, $taxlocnum, $taxratelocnum ]; + $amount -= $location->amount; + } + if ($amount > 0) { + push @taxlines, + [ $taxline->itemdesc. ' (default)', sprintf('%.2f', $amount), '', '' ]; + } + } + + $return->{taxlines} = \@taxlines; + + } +} + + -- 2.11.0