1 package FS::cust_main::Status;
4 use vars qw( $conf ); # $module ); #$DEBUG $me );
10 use FS::UID qw( getotaker dbh driver_name );
13 #$me = '[FS::cust_main::Status]';
15 install_callback FS::UID sub {
17 #$module = $conf->config('cust_main-status_module') || 'Classic';
22 FS::cust_main::Status - Status mixin for cust_main
28 These methods are available on FS::cust_main objects:
36 Returns an (ordered with Tie::IxHash) hash reference of possible status
42 #my $self = shift; #i guess i'm a class method
46 my $module = $conf->config('cust_main-status_module') || 'Classic';
48 if ( $module eq 'Classic' ) {
49 tie %statuscolors, 'Tie::IxHash',
50 'prospect' => 'FF00F5', #'000000', #black? naw, purple
51 'active' => '00CC00', #green
52 'ordered' => '009999', #teal? cyan?
53 'inactive' => '0000CC', #blue
54 'suspended' => 'FF9900', #yellow
55 'cancelled' => 'FF0000', #red
57 } elsif ( $module eq 'Recurring' ) {
58 tie %statuscolors, 'Tie::IxHash',
59 'prospect' => 'FF00F5', #'000000', #black? naw, purple
60 'active' => '00CC00', #green
61 'ordered' => '009999', #teal? cyan?
62 'suspended' => 'FF9900', #yellow
63 'cancelled' => 'FF0000', #red
64 'inactive' => '0000CC', #blue
67 die "unknown status module $module";
81 my $recurring_sql = FS::cust_pkg->recurring_sql;
82 my $cancelled_sql = FS::cust_pkg->cancelled_sql;
83 my $select_count_pkgs = $self->select_count_pkgs_sql;
86 0 < ( $select_count_pkgs )
87 AND 0 = ( $select_count_pkgs AND $recurring_sql
88 AND ( cust_pkg.cancel IS NULL OR cust_pkg.cancel = 0 )
90 AND 0 < ( $select_count_pkgs AND $cancelled_sql )
93 my $module = $conf->config('cust_main-status_module') || 'Classic';
95 if ( $module eq 'Classic' ) {
97 " AND 0 = ( $select_count_pkgs AND ". FS::cust_pkg->inactive_sql. " ) ";
98 #} elsif ( $module eq 'Recurring' ) {
100 # die "unknown status module $module";
113 =item churn_sql START, END
115 Returns an SQL statement for the customer churn status query. The columns
116 returned are the custnum and the number of active, suspended, and cancelled
117 packages (excluding one-time packages) at the start date ("s_active",
118 "s_suspended", and "s_cancelled") and the end date ("e_active", etc.).
122 # not sure this belongs here...FS::cust_main::Packages?
126 my ($speriod, $eperiod) = @_;
128 my $s_sql = FS::h_cust_pkg->status_as_of_sql($speriod);
129 my $e_sql = FS::h_cust_pkg->status_as_of_sql($eperiod);
133 'COALESCE(SUM(s.is_active::int),0) as s_active',
134 'COALESCE(SUM(s.is_suspended::int),0) as s_suspended',
135 'COALESCE(SUM(s.is_cancelled::int),0) as s_cancelled',
136 'COALESCE(SUM(e.is_active::int),0) as e_active',
137 'COALESCE(SUM(e.is_suspended::int),0) as e_suspended',
138 'COALESCE(SUM(e.is_cancelled::int),0) as e_cancelled',
140 my $from = "($s_sql) AS s FULL JOIN ($e_sql) AS e USING (custnum)";
142 return "SELECT ".join(',', @select)." FROM $from GROUP BY custnum";