diff options
| author | Mark Wells <mark@freeside.biz> | 2016-09-20 11:39:37 -0700 | 
|---|---|---|
| committer | Mark Wells <mark@freeside.biz> | 2016-09-20 12:59:58 -0700 | 
| commit | c9c285c2c5b01a8eb1318f1954629379e31318d2 (patch) | |
| tree | 3dc10a92b67752de127877df109c7e8d1a69ccaf | |
| parent | 8a25843377c336b59696ba5d809fbccc7e2fd102 (diff) | |
when crediting unused time on packages, also credit any tax that was charged, #42729
Conflicts:
	FS/FS/part_pkg/flat.pm
| -rw-r--r-- | FS/FS/part_pkg/flat.pm | 16 | ||||
| -rwxr-xr-x | FS/t/suite/09-sales_tax_credit_change.t | 90 | 
2 files changed, 105 insertions, 1 deletions
diff --git a/FS/FS/part_pkg/flat.pm b/FS/FS/part_pkg/flat.pm index e10094e8e..f2f1b3f14 100644 --- a/FS/FS/part_pkg/flat.pm +++ b/FS/FS/part_pkg/flat.pm @@ -264,8 +264,22 @@ sub calc_remain {        $amount = $amount * ($edate - $time) / ($edate - $cust_bill_pkg->sdate);      } +    # calculate tax adjustment. we're not doing full credit_lineitems here +    # (e.g. not applying the credit to the past billing of this package) +    # so just include the adjustment in the source record with the rest +    # of the credit +    my %tax_adjust = FS::cust_credit->calculate_tax_adjustment( +      'custnum'     => $cust_pkg->custnum, +      'billpkgnums' => [ $cust_bill_pkg->billpkgnum ], +      'setuprecurs' => [ 'recur' ], +      'amounts'     => [ $amount ], +    ); +    $amount += $tax_adjust{taxtotal}; + +    $amount = sprintf('%.2f', $amount); # ensure that amounts add up right      $credit += $amount; -  }  +  } # foreach $cust_bill_pkg +    sprintf('%.2f', $credit);  } diff --git a/FS/t/suite/09-sales_tax_credit_change.t b/FS/t/suite/09-sales_tax_credit_change.t new file mode 100755 index 000000000..5af7ae038 --- /dev/null +++ b/FS/t/suite/09-sales_tax_credit_change.t @@ -0,0 +1,90 @@ +#!/usr/bin/perl + +=head2 DESCRIPTION + +Tests crediting a package for unused time when it has sales tax. See +RT#42729. + +The package will be billed for $30.00 with 10% tax, then credited for 1/3 +of the billing period. + +Correct: The credit amount will be $11.00. + +=cut + +use strict; +use Test::More tests => 2; +use FS::Test; +use Date::Parse 'str2time'; +use Date::Format 'time2str'; +use Test::MockTime qw(set_fixed_time); +use FS::cust_main; +use FS::cust_pkg; +use FS::part_pkg; +use FS::Conf; +my $FS= FS::Test->new; + +# Create a package def +my $error; +my $part_pkg = FS::part_pkg->new({ +  pkg     => 'Tax credit test', +  plan    => 'flat', +  freq    => '1', +  agentnum => 1, +}); +my %options = ( +  'setup_fee' => 0, +  'recur_fee' => 30.00, +  'recur_temporality' => 'upcoming', +  'unused_credit_cancel' => '1', +); +$error = $part_pkg->insert(options => \%options); +BAIL_OUT("can't create package def: $error") if $error; + +# Create the customer and order a package +my $cust = $FS->new_customer('Credit unused with taxes'); +$cust->bill_location->state('AK'); +$error = $cust->insert; +BAIL_OUT("can't create test customer: $error") if $error; + +my $pkg = FS::cust_pkg->new({ pkgpart => $part_pkg->pkgpart }); +$error = $cust->order_pkg({ cust_pkg => $pkg }); +BAIL_OUT("can't create test charges: $error") if $error; + +# Create tax def +my $cust_main_county = FS::cust_main_county->new({ +  'country'       => 'US', +  'state'         => 'AK', +  'exempt_amount' => 0.00, +  'taxname'       => 'Test tax', +  'tax'           => '10', +}); +$error = $cust_main_county->insert; +BAIL_OUT("can't create tax definitions: $error") if $error; + +# Bill the customer on Apr 1 +# (April because it's 30 days, and also doesn't have DST) +set_fixed_time(str2time('2016-04-01 00:00')); +my @return; +$error = $cust->bill( return_bill => \@return ); +BAIL_OUT("can't bill charges: $error") if $error; +my $cust_bill = $return[0] or BAIL_OUT("no invoice generated"); + +# Check amount +my ($tax_item) = grep { $_->itemdesc eq $cust_main_county->taxname } +                $cust_bill->cust_bill_pkg; +ok ( $tax_item && $tax_item->setup == 3.00, "Tax charged = 3.00" ); + +# sync +$pkg = $pkg->replace_old; + +# Now cancel with 1/3 of the period left +set_fixed_time(str2time('2016-04-21 00:00')); +$error = $pkg->cancel(); +BAIL_OUT("can't cancel package: $error") if $error; + +# and find the credit +my ($credit) = $cust->cust_credit +  or BAIL_OUT("no credit was created"); +ok ( $credit->amount == 11.00, "Credited 1/3 of package charge with tax" ) +  or diag("is ". $credit->amount );  | 
