show available term discounts on invoice, #14210
[freeside.git] / FS / FS / part_pkg / discount_Mixin.pm
index 17e2f53..3dc3f6e 100644 (file)
@@ -1,14 +1,12 @@
 package FS::part_pkg::discount_Mixin;
 
 use strict;
-use vars qw(@ISA %info);
-use FS::part_pkg;
+use vars qw( %info );
+use Time::Local qw( timelocal );
+use List::Util  qw( min );
 use FS::cust_pkg;
 use FS::cust_bill_pkg_discount;
-use Time::Local qw(timelocal);
-use List::Util 'min';
 
-@ISA = qw(FS::part_pkg);
 %info = ( 'disabled' => 1 );
 
 =head1 NAME
@@ -40,6 +38,7 @@ discount and generates an invoice detail describing it.
 
 sub calc_discount {
   my($self, $cust_pkg, $sdate, $details, $param ) = @_;
+  my $conf = new FS::Conf;
 
   my $br = $self->base_recur_permonth($cust_pkg, $sdate);
   $br += $param->{'override_charges'} if $param->{'override_charges'};
@@ -120,6 +119,9 @@ sub calc_discount {
         $param->{'discount_left_recur'}{$discount->discountnum} = 0;
         $months = 1;
     }
+    elsif ( $discount->setup && $discount->months == 1 && $discount->amount ) {
+        next;
+    }
 
     my $error = $cust_pkg_discount->increment_months_used($months)
         if (defined $param->{'real_pkgpart'} 
@@ -127,11 +129,12 @@ sub calc_discount {
             && ! defined $param->{'setup_charge'});
     die "error discounting: $error" if $error;
 
+    $amount = min($amount, $br);
     $amount *= $months;
     $amount = sprintf('%.2f', $amount);
 
     next unless $amount > 0;
-            
+
     # transfer remainder of discount, if any, to setup
     if ( $discount->setup && $discount->amount
         && (!$discount->months || $discount->months != 1)
@@ -151,7 +154,6 @@ sub calc_discount {
     push @{ $param->{'discounts'} }, $cust_bill_pkg_discount;
 
     #add details on discount to invoice
-    my $conf = new FS::Conf;
     my $money_char = $conf->config('money_char') || '$';
     $months = sprintf('%.2f', $months) if $months =~ /\./;