RT# 33362 - fixed discount_mixin to not throw perl error when trying to discount...
authorChristopher Burger <burgerc@freeside.biz>
Mon, 4 Dec 2017 18:06:20 +0000 (13:06 -0500)
committerChristopher Burger <burgerc@freeside.biz>
Mon, 2 Apr 2018 16:53:45 +0000 (12:53 -0400)
FS/FS/part_event/Action/pkg_discount.pm
FS/FS/part_pkg/discount_Mixin.pm

index dd85ada..d245ef4 100644 (file)
@@ -23,10 +23,10 @@ sub option_fields {
                        'extra_sql' => q(AND freq NOT LIKE '0%' AND freq NOT LIKE '%d' AND freq NOT LIKE '%h' AND freq NOT LIKE '%w'), 
                        'multiple' => 1,
                      },
-    'if_pkg_class'    => { label    => 'Only package class',
-                           type     => 'select-pkg_class',
-                           multiple => 1,
-                         },
+    'if_pkg_class' => { 'label'    => 'Only package class',
+                        'type'     => 'select-pkg_class',
+                        'multiple' => 1,
+                      },
     'discountnum' => { 'label'    => 'Discount',
                        'type'     => 'select-table', #we don't handle the select-discount create a discount case
                        'table'    => 'discount',
@@ -54,7 +54,7 @@ sub do_action {
 
   my $cust_main = $self->cust_main($object);
   my %if_pkgpart = map { $_=>1 } split(/\s*,\s*/, $self->option('if_pkgpart') );
-  my $if_pkg_class = $self->option('if_pkg_class') || {};
+  my %if_pkg_class = map { $_=>1 } split(/\s*,\s*/, $self->option('if_pkg_class') );
 
   my $allpkgs = (keys %if_pkgpart) ? 0 : 1;
 
@@ -65,8 +65,8 @@ sub do_action {
     return 'Package not selected'
       if ! $allpkgs && ! $if_pkgpart{ $object->pkgpart };
     return 'Package not of selected class'
-      if keys %$if_pkg_class
-      && ! $if_pkg_class->{ $object->part_pkg->classnum };
+      if keys %if_pkg_class
+      && ! $if_pkg_class{ $object->part_pkg->classnum };
     return 'Package frequency not monthly or a multiple'
       if $object->part_pkg->freq !~ /^\d+$/;
 
@@ -76,7 +76,7 @@ sub do_action {
 
     @cust_pkg = grep {
          ( $allpkgs || $if_pkgpart{ $_->pkgpart } ) 
-      && ( ! keys %$if_pkg_class || $if_pkg_class->{ $_->part_pkg->classnum } )
+      && ( ! keys %if_pkg_class || $if_pkg_class{ $_->part_pkg->classnum } )
       && $_->part_pkg->freq
       #remove after fixing discount bug with non-monthly pkgs
       && ( $_->part_pkg->freq =~ /^\d+$/)
index 5b3f100..5bcf561 100644 (file)
@@ -46,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
@@ -139,6 +143,9 @@ sub calc_discount {
       # 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 * $months / $self->freq;
       # round this, because the real recur charge is rounded
       $recur_charge = sprintf('%.2f', $recur_charge);