also supress sending invoices w/selfservice-hide_invoices-taxclass, RT#15327
[freeside.git] / FS / FS / cust_bill.pm
index 77c571b..79c78d8 100644 (file)
@@ -796,6 +796,23 @@ sub owed_pkgnum {
   $balance;
 }
 
+=item hide
+
+Returns true if this invoice should be hidden.  See the
+selfservice-hide_invoices-taxclass configuraiton setting.
+
+=cut
+
+sub hide {
+  my $self = shift;
+  my $conf = $self->conf;
+  my $hide_taxclass = $conf->config('selfservice-hide_invoices-taxclass')
+    or return '';
+  my @cust_bill_pkg = $self->cust_bill_pkg;
+  my @part_pkg = grep $_, map $_->part_pkg, @cust_bill_pkg;
+  ! grep { $_->taxclass ne $hide_taxclass } @part_pkg;
+}
+
 =item apply_payments_and_credits [ OPTION => VALUE ... ]
 
 Applies unapplied payments and credits to this invoice.
@@ -1335,6 +1352,7 @@ sub queueable_email {
 #sub email_invoice {
 sub email {
   my $self = shift;
+  return if $self->hide;
   my $conf = $self->conf;
 
   my( $template, $invoice_from, $notice_name, $no_coupon );
@@ -1453,7 +1471,9 @@ I<notice_name>, if specified, overrides "Invoice" as the name of the sent docume
 #sub print_invoice {
 sub print {
   my $self = shift;
+  return if $self->hide;
   my $conf = $self->conf;
+
   my( $template, $notice_name );
   if ( ref($_[0]) ) {
     my $opt = shift;
@@ -1493,7 +1513,9 @@ I<notice_name>, if specified, overrides "Invoice" as the name of the sent docume
 
 sub fax_invoice {
   my $self = shift;
+  return if $self->hide;
   my $conf = $self->conf;
+
   my( $template, $notice_name );
   if ( ref($_[0]) ) {
     my $opt = shift;
@@ -5203,44 +5225,52 @@ sub _items_discounts_avail {
     foreach my $cust_bill_pkg ( $self->cust_bill_pkg ) {
       my $cust_pkg = $cust_bill_pkg->cust_pkg or next;
       my $part_pkg = $cust_pkg->part_pkg or next;
-
-      next if $part_pkg->freq ne '1';
+      my $freq = $part_pkg->freq;
       my $setup = $cust_bill_pkg->setup || 0;
       my $recur = $cust_bill_pkg->recur || 0;
-      my $permonth = $part_pkg->base_recur_permonth || 0;
 
-      my ($discount) = grep { $_->months == $months } 
-                       map { $_->discount } $part_pkg->part_pkg_discount;
+      if ( $freq eq '1' ) { #monthly
+        my $permonth = $part_pkg->base_recur_permonth || 0;
 
-      $hash->{base} += $setup + $recur + ($months - 1) * $permonth;
-      if ($discount) {
+        my ($discount) = grep { $_->months == $months } 
+                         map { $_->discount } $part_pkg->part_pkg_discount;
 
-        my $discountable;
-        if ( $discount->setup ) {
-          $discountable += $setup;
-        }
-        else {
-          $hash->{discounted} += $setup;
-        }
+        $hash->{base} += $setup + $recur + ($months - 1) * $permonth;
+
+        if ( $discount ) {
+
+          my $discountable;
+          if ( $discount->setup ) {
+            $discountable += $setup;
+          }
+          else {
+            $hash->{discounted} += $setup;
+          }
+
+          if ( $discount->percent ) {
+            $discountable += $months * $permonth;
+            $discountable -= ($discountable * $discount->percent / 100);
+            $discountable -= ($permonth - $recur); # correct for prorate
+            $hash->{discounted} += $discountable;
+          }
+          else {
+            $discountable += $recur;
+            $discountable -= $discount->amount * $recur/$permonth;
+
+            $discountable += ($months - 1) * max($permonth - $discount->amount,0);
+          }
 
-        if ( $discount->percent ) {
-          $discountable += $months * $permonth;
-          $discountable -= ($discountable * $discount->percent / 100);
-          $discountable -= ($permonth - $recur); # correct for prorate
           $hash->{discounted} += $discountable;
+          push @{ $hash->{pkgnums} }, $cust_pkg->pkgnum;
         }
-        else {
-          $discountable += $recur;
-          $discountable -= $discount->amount * $recur/$permonth;
-
-          $discountable += ($months - 1) * max($permonth - $discount->amount,0);
+        else { #no discount
+          $hash->{discounted} += $setup + $recur + ($months - 1) * $permonth;
+          $hash->{list_pkgnums} = 1;
         }
-
-        $hash->{discounted} += $discountable;
-        push @{ $hash->{pkgnums} }, $cust_pkg->pkgnum;
-      }
-      else { #no discount
-        $hash->{discounted} += $setup + $recur + ($months - 1) * $permonth;
+      } #if $freq eq '1'
+      else { # all non-monthly packages: include current charges only
+        $hash->{discounted} += $setup + $recur;
+        $hash->{base} += $setup + $recur;
         $hash->{list_pkgnums} = 1;
       }
     } #foreach $cust_bill_pkg