diff options
author | Ivan Kohler <ivan@freeside.biz> | 2016-04-25 09:51:23 -0700 |
---|---|---|
committer | Ivan Kohler <ivan@freeside.biz> | 2016-04-25 09:51:23 -0700 |
commit | 7b5d2054b431a0fedf269bb98909a3c4cf8e1ba2 (patch) | |
tree | c9c31d2c8b71b270bc6472a91c2ef80fc97cbe2b | |
parent | 645a1c856120171b58bfb3eb5f326c06a9c49825 (diff) |
add conditions for customer cancelled packages, RT#42043
-rw-r--r-- | FS/FS/cust_main/Packages.pm | 20 | ||||
-rw-r--r-- | FS/FS/part_event/Condition/has_pkg_class_cancelled.pm | 43 | ||||
-rw-r--r-- | FS/FS/part_event/Condition/has_pkgpart_cancelled.pm | 45 |
3 files changed, 108 insertions, 0 deletions
diff --git a/FS/FS/cust_main/Packages.pm b/FS/FS/cust_main/Packages.pm index 03d9bab16..343112da1 100644 --- a/FS/FS/cust_main/Packages.pm +++ b/FS/FS/cust_main/Packages.pm @@ -475,6 +475,26 @@ sub ncancelled_pkgs { } +=item cancelled_pkgs [ EXTRA_QSEARCH_PARAMS_HASHREF ] + +Returns all cancelled packages (see L<FS::cust_pkg>) for this customer. + +=cut + +sub cancelled_pkgs { + my $self = shift; + my $extra_qsearch = ref($_[0]) ? shift : { @_ }; + + return $self->num_cancelled_pkgs($extra_qsearch) unless wantarray; + + $extra_qsearch->{'extra_sql'} .= + ' AND cust_pkg.cancel IS NOT NULL AND cust_pkg.cancel > 0 '; + + local($skip_label_sort) = 1 if $extra_qsearch->{skip_label_sort}; + + sort sort_packages $self->_cust_pkg($extra_qsearch); +} + sub _cust_pkg { my $self = shift; my $extra_qsearch = ref($_[0]) ? shift : {}; diff --git a/FS/FS/part_event/Condition/has_pkg_class_cancelled.pm b/FS/FS/part_event/Condition/has_pkg_class_cancelled.pm new file mode 100644 index 000000000..214d44565 --- /dev/null +++ b/FS/FS/part_event/Condition/has_pkg_class_cancelled.pm @@ -0,0 +1,43 @@ +package FS::part_event::Condition::has_pkg_class_cancelled; +use base qw( FS::part_event::Condition ); + +use strict; + +sub description { + 'Customer has cancelled package with class'; +} + +sub eventtable_hashref { + { 'cust_main' => 1, + 'cust_bill' => 1, + 'cust_pkg' => 1, + }; +} + +#something like this +sub option_fields { + ( + 'pkgclass' => { 'label' => 'Package Class', + 'type' => 'select-pkg_class', + 'multiple' => 1, + }, + 'age' => { 'label' => 'Cacnellation in last', + 'type' => 'freq', + }, + ); +} + +sub condition { + my( $self, $object, %opt ) = @_; + + my $cust_main = $self->cust_main($object); + + my $age = $self->option_age_from('age', $opt{'time'} ); + + #XXX test + my $hashref = $self->option('pkgclass') || {}; + grep { $hashref->{ $_->part_pkg->classnum } && $_->get('cancel') > $age } + $cust_main->cancelled_pkgs; +} + +1; diff --git a/FS/FS/part_event/Condition/has_pkgpart_cancelled.pm b/FS/FS/part_event/Condition/has_pkgpart_cancelled.pm new file mode 100644 index 000000000..992bfec4e --- /dev/null +++ b/FS/FS/part_event/Condition/has_pkgpart_cancelled.pm @@ -0,0 +1,45 @@ +package FS::part_event::Condition::has_pkgpart_cancelled; +use base qw( FS::part_event::Condition ); + +use strict; + +sub description { 'Customer has cancelled specific package(s)'; } + +sub eventtable_hashref { + { 'cust_main' => 1, + 'cust_bill' => 1, + 'cust_pkg' => 1, + }; +} + +sub option_fields { + ( + 'if_pkgpart' => { 'label' => 'Only packages: ', + 'type' => 'select-part_pkg', + 'multiple' => 1, + }, + 'age' => { 'label' => 'Cancellation in last', + 'type' => 'freq', + }, + ); +} + +sub condition { + my( $self, $object, %opt ) = @_; + + my $cust_main = $self->cust_main($object); + + my $age = $self->option_age_from('age', $opt{'time'} ); + + my $if_pkgpart = $self->option('if_pkgpart') || {}; + grep { $if_pkgpart->{ $_->pkgpart } && $_->get('cancel') > $age } + $cust_main->cancelled_pkgs; + +} + +#XXX +#sub condition_sql { +# +#} + +1; |