X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fcust_main%2FPackages.pm;h=8f96f81aa146527e1a94fcfa4c1d121b80e8c9fb;hb=f6a37fa1d6a30484ce8a268de170ecc8d5c31a23;hp=19ee63aa43f2588e81a74d9735be5abc77cd59f1;hpb=9049947bceb63fd795aab13ee5a17b17f180a4aa;p=freeside.git diff --git a/FS/FS/cust_main/Packages.pm b/FS/FS/cust_main/Packages.pm index 19ee63aa4..8f96f81aa 100644 --- a/FS/FS/cust_main/Packages.pm +++ b/FS/FS/cust_main/Packages.pm @@ -1,7 +1,7 @@ package FS::cust_main::Packages; use strict; -use vars qw( $DEBUG $me ); +use vars qw( $DEBUG $me $skip_label_sort ); use List::Util qw( min ); use FS::UID qw( dbh ); use FS::Record qw( qsearch qsearchs ); @@ -12,6 +12,7 @@ use FS::cust_location; # $DEBUG = 0; $me = '[FS::cust_main::Packages]'; +$skip_label_sort = 0; =head1 NAME @@ -419,7 +420,9 @@ sub all_pkgs { @cust_pkg = $self->_cust_pkg($extra_qsearch); } + local($skip_label_sort) = 1 if $extra_qsearch->{skip_label_sort}; map { $_ } sort sort_packages @cust_pkg; + } =item cust_pkg @@ -467,10 +470,31 @@ sub ncancelled_pkgs { } + local($skip_label_sort) = 1 if $extra_qsearch->{skip_label_sort}; sort sort_packages @cust_pkg; } +=item cancelled_pkgs [ EXTRA_QSEARCH_PARAMS_HASHREF ] + +Returns all cancelled packages (see L) 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 : {}; @@ -509,7 +533,8 @@ sub sort_packages { return 0 if !$a_num_cust_svc && !$b_num_cust_svc; return -1 if $a_num_cust_svc && !$b_num_cust_svc; return 1 if !$a_num_cust_svc && $b_num_cust_svc; - return 0 if $a_num_cust_svc + $b_num_cust_svc > 20; #for perf, just give up + return 0 if $skip_label_sort + || $a_num_cust_svc + $b_num_cust_svc > 20; #for perf, just give up my @a_cust_svc = $a->cust_svc_unsorted; my @b_cust_svc = $b->cust_svc_unsorted; return 0 if !scalar(@a_cust_svc) && !scalar(@b_cust_svc); @@ -532,12 +557,14 @@ sub suspended_pkgs { grep { $_->susp } $self->ncancelled_pkgs; } -=item unflagged_suspended_pkgs - -Returns all unflagged suspended packages (see L) for this -customer (thouse packages without the `manual_flag' set). - -=cut +### This appears to be unused, will be going away +# +#=item unflagged_suspended_pkgs +# +#Returns all unflagged suspended packages (see L) for this +#customer (thouse packages without the `manual_flag' set). +# +#=cut sub unflagged_suspended_pkgs { my $self = shift; @@ -574,6 +601,21 @@ sub active_pkgs { $self->unsuspended_pkgs; } +=item ncancelled_active_pkgs + +Returns all non-cancelled packages (see L) for this customer that +are active (recurring). + +=cut + +sub ncancelled_active_pkgs { + my $self = shift; + grep { my $part_pkg = $_->part_pkg; + $part_pkg->freq ne '' && $part_pkg->freq ne '0'; + } + $self->ncancelled_pkgs; +} + =item billing_pkgs Returns active packages, and also any suspended packages which are set to @@ -642,6 +684,28 @@ sub num_pkgs { $sth->fetchrow_arrayref->[0]; } +=item num_usage_pkgs + +Returns the number of packages for this customer that have services that +can have RADIUS usage statistics. + +=cut + +sub num_usage_pkgs { + my $self = shift; + # have to enumerate exportnums but it's not bad + my @exportnums = map { $_->exportnum } + grep { $_->can('usage_sessions') } + qsearch('part_export'); + return 0 if !@exportnums; + my $in_exportnums = join(',', @exportnums); + my $sql = "SELECT COUNT(DISTINCT pkgnum) FROM cust_pkg + JOIN cust_svc USING (pkgnum) + JOIN export_svc USING (svcpart) + WHERE exportnum IN( $in_exportnums ) AND custnum = ?"; + FS::Record->scalar_sql($sql, $self->custnum); +} + =back =head1 BUGS