X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fcust_bill_pkg.pm;h=f94bf9b19321ff9f03770d3e26e95679e2b937f7;hb=4109791a9b80df968edaf2e71da8ebcfb8882be3;hp=5cff140bb855214a423af9992078b1c663ce6315;hpb=d7e62d5ea2b5d3f3c7b8ba3da39cce1a606dc3d3;p=freeside.git diff --git a/FS/FS/cust_bill_pkg.pm b/FS/FS/cust_bill_pkg.pm index 5cff140bb..f94bf9b19 100644 --- a/FS/FS/cust_bill_pkg.pm +++ b/FS/FS/cust_bill_pkg.pm @@ -201,16 +201,50 @@ sub insert { my $tax_location = $self->get('cust_bill_pkg_tax_location'); if ( $tax_location ) { - foreach my $cust_bill_pkg_tax_location ( @$tax_location ) { - $cust_bill_pkg_tax_location->billpkgnum($self->billpkgnum); - $error = $cust_bill_pkg_tax_location->insert; - if ( $error ) { - $dbh->rollback if $oldAutoCommit; - return "error inserting cust_bill_pkg_tax_location: $error"; + foreach my $link ( @$tax_location ) { + next if $link->billpkgtaxlocationnum; # don't try to double-insert + # This cust_bill_pkg can be linked on either side (i.e. it can be the + # tax or the taxed item). If the other side is already inserted, + # then set billpkgnum to ours, and insert the link. Otherwise, + # set billpkgnum to ours and pass the link off to the cust_bill_pkg + # on the other side, to be inserted later. + + my $tax_cust_bill_pkg = $link->get('tax_cust_bill_pkg'); + if ( $tax_cust_bill_pkg && $tax_cust_bill_pkg->billpkgnum ) { + $link->set('billpkgnum', $tax_cust_bill_pkg->billpkgnum); + # break circular links when doing this + $link->set('tax_cust_bill_pkg', ''); } - } + my $taxable_cust_bill_pkg = $link->get('taxable_cust_bill_pkg'); + if ( $taxable_cust_bill_pkg && $taxable_cust_bill_pkg->billpkgnum ) { + $link->set('taxable_billpkgnum', $taxable_cust_bill_pkg->billpkgnum); + # XXX if we ever do tax-on-tax for these, this will have to change + # since pkgnum will be zero + $link->set('pkgnum', $taxable_cust_bill_pkg->pkgnum); + $link->set('locationnum', + $taxable_cust_bill_pkg->cust_pkg->tax_locationnum); + $link->set('taxable_cust_bill_pkg', ''); + } + + if ( $link->billpkgnum and $link->taxable_billpkgnum ) { + $error = $link->insert; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return "error inserting cust_bill_pkg_tax_location: $error"; + } + } else { # handoff + my $other; + $other = $link->billpkgnum ? $link->get('taxable_cust_bill_pkg') + : $link->get('tax_cust_bill_pkg'); + my $link_array = $other->get('cust_bill_pkg_tax_location') || []; + push @$link_array, $link; + $other->set('cust_bill_pkg_tax_location' => $link_array); + } + } #foreach my $link } + # someday you will be as awesome as cust_bill_pkg_tax_location... + # but not today my $tax_rate_location = $self->get('cust_bill_pkg_tax_rate_location'); if ( $tax_rate_location ) { foreach my $cust_bill_pkg_tax_rate_location ( @$tax_rate_location ) { @@ -400,7 +434,13 @@ sub check { || $self->ut_snumber('pkgnum') || $self->ut_number('invnum') || $self->ut_money('setup') + || $self->ut_moneyn('unitsetup') + || $self->ut_currencyn('setup_billed_currency') + || $self->ut_moneyn('setup_billed_amount') || $self->ut_money('recur') + || $self->ut_moneyn('unitrecur') + || $self->ut_currencyn('recur_billed_currency') + || $self->ut_moneyn('recur_billed_amount') || $self->ut_numbern('sdate') || $self->ut_numbern('edate') || $self->ut_textn('itemdesc') @@ -915,8 +955,8 @@ Returns an SQL expression for the sum of payments applied to this item. sub paid_sql { my ($class, $start, $end, %opt) = @_; - my $s = $start ? "AND cust_bill_pay._date <= $start" : ''; - my $e = $end ? "AND cust_bill_pay._date > $end" : ''; + my $s = $start ? "AND cust_pay._date <= $start" : ''; + my $e = $end ? "AND cust_pay._date > $end" : ''; my $setuprecur = $opt{setuprecur} =~ /^s/ ? 'setup' : $opt{setuprecur} =~ /^r/ ? 'recur' : @@ -925,6 +965,7 @@ sub paid_sql { my $paid = "( SELECT COALESCE(SUM(cust_bill_pay_pkg.amount),0) FROM cust_bill_pay_pkg JOIN cust_bill_pay USING (billpaynum) + JOIN cust_pay USING (paynum) WHERE cust_bill_pay_pkg.billpkgnum = cust_bill_pkg.billpkgnum $s $e $setuprecur )"; @@ -943,8 +984,8 @@ sub paid_sql { sub credited_sql { my ($class, $start, $end, %opt) = @_; - my $s = $start ? "AND cust_credit_bill._date <= $start" : ''; - my $e = $end ? "AND cust_credit_bill._date > $end" : ''; + my $s = $start ? "AND cust_credit._date <= $start" : ''; + my $e = $end ? "AND cust_credit._date > $end" : ''; my $setuprecur = $opt{setuprecur} =~ /^s/ ? 'setup' : $opt{setuprecur} =~ /^r/ ? 'recur' : @@ -953,6 +994,7 @@ sub credited_sql { my $credited = "( SELECT COALESCE(SUM(cust_credit_bill_pkg.amount),0) FROM cust_credit_bill_pkg JOIN cust_credit_bill USING (creditbillnum) + JOIN cust_credit USING (crednum) WHERE cust_credit_bill_pkg.billpkgnum = cust_bill_pkg.billpkgnum $s $e $setuprecur )"; @@ -1070,16 +1112,12 @@ sub upgrade_tax_location { delete @hash{qw(censustract censusyear latitude longitude coord_auto)}; $hash{custnum} = $h_cust_main->custnum; - my $tax_loc = qsearchs('cust_location', \%hash) # unlikely - || FS::cust_location->new({ %hash }); - if ( !$tax_loc->locationnum ) { - $tax_loc->disabled('Y'); - my $error = $tax_loc->insert; - if ( $error ) { - warn "couldn't create historical location record for cust#". - $h_cust_main->custnum.": $error\n"; - next INVOICE; - } + my $tax_loc = FS::cust_location->new(\%hash); + my $error = $tax_loc->find_or_insert || $tax_loc->disable_if_unused; + if ( $error ) { + warn "couldn't create historical location record for cust#". + $h_cust_main->custnum.": $error\n"; + next INVOICE; } my $exempt_cust = 1 if $h_cust_main->tax;