From: Christopher Burger Date: Mon, 4 Dec 2017 18:06:20 +0000 (-0500) Subject: RT# 33362 - fixed discount_mixin to not throw perl error when trying to discount... X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=72e4046329988c9a99b4aefc4e69b678f1e29fcb RT# 33362 - fixed discount_mixin to not throw perl error when trying to discount non monthly recuring. --- diff --git a/FS/FS/part_event/Action/pkg_discount.pm b/FS/FS/part_event/Action/pkg_discount.pm index dd85ada9b..d245ef40b 100644 --- a/FS/FS/part_event/Action/pkg_discount.pm +++ b/FS/FS/part_event/Action/pkg_discount.pm @@ -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+$/) diff --git a/FS/FS/part_pkg/discount_Mixin.pm b/FS/FS/part_pkg/discount_Mixin.pm index 801737b04..1e4653639 100644 --- a/FS/FS/part_pkg/discount_Mixin.pm +++ b/FS/FS/part_pkg/discount_Mixin.pm @@ -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 @@ -147,6 +151,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);