X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fpart_event%2FAction%2Fpkg_discount.pm;h=d245ef40be923ca438fb0078d20dc02c3d397f09;hb=72e4046329988c9a99b4aefc4e69b678f1e29fcb;hp=bae3c342a6df2d9c4249056bac5368bf29e1dcb5;hpb=19ecc46addd9225704aa524126169ec30d353822;p=freeside.git diff --git a/FS/FS/part_event/Action/pkg_discount.pm b/FS/FS/part_event/Action/pkg_discount.pm index bae3c342a..d245ef40b 100644 --- a/FS/FS/part_event/Action/pkg_discount.pm +++ b/FS/FS/part_event/Action/pkg_discount.pm @@ -23,16 +23,27 @@ 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, + }, 'discountnum' => { 'label' => 'Discount', 'type' => 'select-table', #we don't handle the select-discount create a discount case 'table' => 'discount', - 'name_col' => 'description', #well, method - 'order_by' => 'ORDER BY discountnum', #requied because name_col is a method + #(well, since 2013 it winds up calling select-discount + # anyway (but not tr-select-discount) + #'name_col' => 'description', #well, method + #'order_by' => 'ORDER BY discountnum', #requied because name_col is a method + 'disable_empty' => 1, 'hashref' => { 'disabled' => '', 'months' => { op=>'!=', value=>'0' }, }, - 'disable_empty' => 1, + 'disable_custom_discount' => 1, }, + 'once_percust' => { 'label' => 'Only discount one package per customer', + 'type' => 'checkbox', + 'value' => 'Y', + }, ); } @@ -43,6 +54,8 @@ 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 = map { $_=>1 } split(/\s*,\s*/, $self->option('if_pkg_class') ); + my $allpkgs = (keys %if_pkgpart) ? 0 : 1; my @cust_pkg = (); @@ -51,6 +64,9 @@ sub do_action { return 'Package is suspended' if $object->susp; 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 }; return 'Package frequency not monthly or a multiple' if $object->part_pkg->freq !~ /^\d+$/; @@ -58,11 +74,15 @@ sub do_action { } else { - @cust_pkg = grep { ( $allpkgs || $if_pkgpart{ $_->pkgpart } ) - && $_->part_pkg->freq - #remove after fixing discount bug with non-monthly pkgs - && ( $_->part_pkg->freq =~ /^\d+$/) } - $cust_main->unsuspended_pkgs; + @cust_pkg = grep { + ( $allpkgs || $if_pkgpart{ $_->pkgpart } ) + && ( ! 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+$/) + } + $cust_main->unsuspended_pkgs; + return 'No qualifying packages' unless @cust_pkg; } @@ -84,12 +104,20 @@ sub do_action { $gotit = 1; #it's already got this discount and discount never expires--great, move on - next unless $cust_pkg_discount[0]->discount->months; + unless ( $cust_pkg_discount[0]->discount->months ) { + if ( $self->option('once_percust') ) { + last; + } else { + next; + } + }; #reset the discount my $error = $cust_pkg_discount[0]->decrement_months_used( $cust_pkg_discount[0]->months_used ); die "Error extending discount: $error\n" if $error; + last if $self->option('once_percust'); + } elsif ( @cust_pkg_discount ) { #can't currently discount an already discounted package, @@ -107,6 +135,8 @@ sub do_action { my $error = $cust_pkg_discount->insert; die "Error discounting package: $error\n" if $error; + last if $self->option('once_percust'); + } }