1 package FS::part_event::Action::pkg_discount;
4 use base qw( FS::part_event::Action );
6 sub description { "Discount active customer packages"; }
8 sub eventtable_hashref {
12 sub event_stage { 'pre-bill'; }
16 'if_pkgpart' => { 'label' => 'Only packages',
17 'type' => 'select-table',
18 'table' => 'part_pkg',
20 #can tweak after fixing discount bug with non-monthly recurring pkgs
21 'extra_sql' => q(AND freq NOT LIKE '0%' AND freq NOT LIKE '%d' AND freq NOT LIKE '%h' AND freq NOT LIKE '%w'),
24 'discountnum' => { 'label' => 'Discount',
25 'type' => 'select-table', #we don't handle the select-discount create a discount case
26 'table' => 'discount',
27 'name_col' => 'description', #well, method
28 'order_by' => 'ORDER BY discountnum', #requied because name_col is a method
29 'hashref' => { 'disabled' => '',
30 'months' => { op=>'!=', value=>'0' },
37 #lots of false laziness with referral_pkg_discount
38 #but also lots of doing it differently...and better???
40 my( $self, $object, $cust_event ) = @_;
42 my $cust_main = $self->cust_main($object);
43 my %if_pkgpart = map { $_=>1 } split(/\s*,\s*/, $self->option('if_pkgpart') );
44 my @cust_pkg = grep { $if_pkgpart{ $_->pkgpart } && $_->part_pkg->freq
45 #can remove after fixing discount bug with non-monthly pkgs
46 && ( $_->part_pkg->freq =~ /^\d+$/) }
47 $cust_main->active_pkgs;
48 return 'No qualifying packages' unless @cust_pkg;
51 foreach my $cust_pkg (@cust_pkg) {
53 my @cust_pkg_discount = $cust_pkg->cust_pkg_discount_active;
55 #our logic here only makes sense insomuch as you can't have multiple discounts
56 die "Unexpected multiple discounts, contact developers"
57 if scalar(@cust_pkg_discount) > 1;
59 my @my_cust_pkg_discount =
60 grep { $_->discountnum == $self->option('discountnum') } @cust_pkg_discount;
62 if ( @my_cust_pkg_discount ) { #reset the existing one instead
66 #it's already got this discount and discount never expires--great, move on
67 next unless $cust_pkg_discount[0]->discount->months;
70 my $error = $cust_pkg_discount[0]->decrement_months_used( $cust_pkg_discount[0]->months_used );
71 die "Error extending discount: $error\n" if $error;
73 } elsif ( @cust_pkg_discount ) {
75 #can't currently discount an already discounted package,
76 #but maybe we can discount a different package
79 } else { #normal case, create a new one
82 my $cust_pkg_discount = new FS::cust_pkg_discount {
83 'pkgnum' => $cust_pkg->pkgnum,
84 'discountnum' => $self->option('discountnum'),
87 my $error = $cust_pkg_discount->insert;
88 die "Error discounting package: $error\n" if $error;
93 return $gotit ? '' : 'Discount not applied due to existing discounts';