RT# 78356 - created import format for broadband service
[freeside.git] / FS / FS / part_pkg / discount_Mixin.pm
index 5de7d8e..f634913 100644 (file)
@@ -4,6 +4,7 @@ use strict;
 use vars qw( %info );
 use Time::Local qw( timelocal );
 use List::Util  qw( min );
+use FS::Record qw( qsearchs );
 use FS::cust_pkg;
 use FS::cust_bill_pkg_discount;
 
@@ -45,7 +46,11 @@ sub calc_discount {
   my $conf = new FS::Conf;
 
   my $br = $self->base_recur($cust_pkg, $sdate);
-  $br += $param->{'override_charges'} * ($cust_pkg->part_pkg->freq || 0) if $param->{'override_charges'};
+
+  ## can not multiply non monthly recurring frequency so skip.
+  unless ($cust_pkg->part_pkg->freq !~ /^\d+$/) {
+    $br += $param->{'override_charges'} * ($cust_pkg->part_pkg->freq || 0) if $param->{'override_charges'};
+  }
 
   my $tot_discount = 0;
   #UI enforces just 1 for now, will need ordering when they can be stacked
@@ -87,7 +92,10 @@ sub calc_discount {
     # $chg_months: the number of months we are charging recur for
     # $months: $chg_months or the months left on the discount, whchever is less
 
-    my $chg_months = $cust_pkg->part_pkg->freq || 1;
+    my $chg_months = 1;
+    unless ($cust_pkg->part_pkg->freq !~ /^\d+$/) {
+      $chg_months = $cust_pkg->part_pkg->freq || 1;
+    }
     if ( defined($param->{'months'}) ) { # then override
       $chg_months = $param->{'months'};
     }
@@ -122,26 +130,26 @@ sub calc_discount {
 
         if ( $discount->percent > 0 ) {
             $amount = $discount->percent * $param->{'setup_charge'} / 100;
-        } elsif ( $discount->amount > 0 && ($discount->months || 0) == 1) {
+        } elsif ( $discount->amount > 0 ) {
             # apply the discount amount, up to a maximum of the setup charge
             $amount = min($discount->amount, $param->{'setup_charge'});
             $discount_left = sprintf('%.2f', $discount->amount - $amount);
             # transfer remainder of discount, if any, to recur
             $param->{'discount_left_recur'}{$discount->discountnum} = $discount_left;
-        } else {
-          # I guess we don't allow multiple-month flat amount discounts to
-          # apply to setup?
-            next; 
-        }
+        } 
 
     } else {
       
       # we are calculating a recurring fee discount. estimate the recurring
-      # fee:
-      # XXX it would be more accurate for calc_recur to just _tell us_ what
-      # it's going to charge
+      # fee. Note we use $months here rather than $chg_months so that if the
+      # remaining discount amount is for less time than the package period,
+      # the "estimated recurring fee" is only for as long as the discount
+      # lasts.
+
+      # can not multiply non monthly recurring frequency so skip.
+      next if $self->freq !~ /^\d+$/;
 
-      my $recur_charge = $br * ($cust_pkg->quantity || 1) * $chg_months / $self->freq;
+      my $recur_charge = $br * $months / $self->freq;
       # round this, because the real recur charge is rounded
       $recur_charge = sprintf('%.2f', $recur_charge);
 
@@ -221,7 +229,7 @@ sub calc_discount {
       'pkgdiscountnum' => $cust_pkg_discount->pkgdiscountnum,
       'amount'         => $amount,
       'months'         => $months,
-      # XXX should have a 'setuprecur'
+      # XXX should have a 'setuprecur' (and on 4.x, it does)
     };
     push @{ $param->{'discounts'} }, $cust_bill_pkg_discount;
     $tot_discount += $amount;