optimize customer list, RT#20173
[freeside.git] / FS / FS / cust_main / Status.pm
index c17bb57..66ba33f 100644 (file)
@@ -1,7 +1,7 @@
 package FS::cust_main::Status;
 
 use strict;
-use vars qw( $conf ); # $module ); #$DEBUG $me );
+use vars qw( $conf $module ); #$DEBUG $me );
 use Tie::IxHash;
 use FS::UID;
 use FS::cust_pkg;
@@ -11,7 +11,7 @@ use FS::cust_pkg;
 
 install_callback FS::UID sub { 
   $conf = new FS::Conf;
-  #$module = $conf->config('cust_main-status_module') || 'Classic';
+  $module = $conf->config('cust_main-status_module') || 'Classic';
 };
 
 =head1 NAME
@@ -40,11 +40,9 @@ sub statuscolors {
 
   my %statuscolors;
 
-  my $module = $conf->config('cust_main-status_module') || 'Classic';
-
   if ( $module eq 'Classic' ) {
     tie %statuscolors, 'Tie::IxHash',
-      'prospect'  => '7e0079', #'000000', #black?  naw, purple
+      'prospect'  => 'FF00F5', #'000000', #black?  naw, purple
       'active'    => '00CC00', #green
       'ordered'   => '009999', #teal? cyan?
       'inactive'  => '0000CC', #blue
@@ -53,7 +51,7 @@ sub statuscolors {
     ;
   } elsif ( $module eq 'Recurring' ) {
     tie %statuscolors, 'Tie::IxHash',
-      'prospect'  => '7e0079', #'000000', #black?  naw, purple
+      'prospect'  => 'FF00F5', #'000000', #black?  naw, purple
       'active'    => '00CC00', #green
       'ordered'   => '009999', #teal? cyan?
       'suspended' => 'FF9900', #yellow
@@ -102,8 +100,6 @@ sub cancelled_sql {
     AND 0 < ( $select_count_pkgs AND $cancelled_sql   )
   ";
 
-  my $module = $conf->config('cust_main-status_module') || 'Classic';
-
   if ( $module eq 'Classic' ) {
     $sql .=
       " AND 0 = (  $select_count_pkgs AND ". FS::cust_pkg->inactive_sql. " ) ";
@@ -118,6 +114,42 @@ sub cancelled_sql {
 
 =back
 
+=head1 CLASS METHODS
+
+=over 4
+
+=item churn_sql START, END
+
+Returns an SQL statement for the customer churn status query.  The columns
+returned are the custnum and the number of active, suspended, and cancelled
+packages (excluding one-time packages) at the start date ("s_active",
+"s_suspended", and "s_cancelled") and the end date ("e_active", etc.).
+
+=cut
+
+# not sure this belongs here...FS::cust_main::Packages?
+
+sub churn_sql {
+  my $self = shift;
+  my ($speriod, $eperiod) = @_;
+
+  my $s_sql = FS::h_cust_pkg->status_as_of_sql($speriod);
+  my $e_sql = FS::h_cust_pkg->status_as_of_sql($eperiod);
+
+  my @select = (
+    'custnum',
+    'COALESCE(SUM(s.is_active::int),0)     as s_active',
+    'COALESCE(SUM(s.is_suspended::int),0)  as s_suspended',
+    'COALESCE(SUM(s.is_cancelled::int),0)  as s_cancelled',
+    'COALESCE(SUM(e.is_active::int),0)     as e_active',
+    'COALESCE(SUM(e.is_suspended::int),0)  as e_suspended',
+    'COALESCE(SUM(e.is_cancelled::int),0)  as e_cancelled',
+  );
+  my $from = "($s_sql) AS s FULL JOIN ($e_sql) AS e USING (custnum)";
+
+  return "SELECT ".join(',', @select)." FROM $from GROUP BY custnum";
+}
+
 =head1 BUGS
 
 =head1 SEE ALSO