show data usage report link only for customers that might have data usage, #42310
[freeside.git] / FS / FS / cust_main / Packages.pm
index 19ee63a..8f96f81 100644 (file)
@@ -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<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 : {};
@@ -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<FS::cust_pkg>) 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<FS::cust_pkg>) 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<FS::cust_pkg>) 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