Merge branch 'master' of git.freeside.biz:/home/git/freeside
[freeside.git] / FS / FS / cust_main / Status.pm
1 package FS::cust_main::Status;
2
3 use strict;
4 use vars qw( $conf ); # $module ); #$DEBUG $me );
5 use Tie::IxHash;
6 use FS::UID;
7 use FS::cust_pkg;
8
9 #$DEBUG = 0;
10 #$me = '[FS::cust_main::Status]';
11
12 install_callback FS::UID sub { 
13   $conf = new FS::Conf;
14   #$module = $conf->config('cust_main-status_module') || 'Classic';
15 };
16
17 =head1 NAME
18
19 FS::cust_main::Status - Status mixin for cust_main
20
21 =head1 SYNOPSIS
22
23 =head1 DESCRIPTION
24
25 These methods are available on FS::cust_main objects:
26
27 =head1 METHODS
28
29 =over 4
30
31 =item statuscolors
32
33 Returns an (ordered with Tie::IxHash) hash reference of possible status
34 names and colors.
35
36 =cut
37
38 sub statuscolors {
39   #my $self = shift; #i guess i'm a class method
40
41   my %statuscolors;
42
43   my $module = $conf->config('cust_main-status_module') || 'Classic';
44
45   if ( $module eq 'Classic' ) {
46     tie %statuscolors, 'Tie::IxHash',
47       'prospect'  => '7e0079', #'000000', #black?  naw, purple
48       'active'    => '00CC00', #green
49       'ordered'   => '009999', #teal? cyan?
50       'inactive'  => '0000CC', #blue
51       'suspended' => 'FF9900', #yellow
52       'cancelled' => 'FF0000', #red
53     ;
54   } elsif ( $module eq 'Recurring' ) {
55     tie %statuscolors, 'Tie::IxHash',
56       'prospect'  => '7e0079', #'000000', #black?  naw, purple
57       'active'    => '00CC00', #green
58       'ordered'   => '009999', #teal? cyan?
59       'suspended' => 'FF9900', #yellow
60       'cancelled' => 'FF0000', #red
61       'inactive'  => '0000CC', #blue
62     ;
63   } else {
64     die "unknown status module $module";
65   }
66
67   \%statuscolors;
68
69 }
70
71 sub statuslabels {
72   #my $self = shift; #i guess i'm a class method
73
74   my %statuslabels = (
75       'prospect'  => 'No packages',
76       'active'    => 'Active',
77       'ordered'   => 'Ordered',
78       'inactive'  => 'Inactive',
79       'suspended' => 'Suspended',
80       'cancelled' => 'Cancelled',
81   );
82
83   \%statuslabels;
84 }
85
86 =item cancelled_sql
87
88 =cut
89
90 sub cancelled_sql {
91   my $self = shift;
92
93   my $recurring_sql = FS::cust_pkg->recurring_sql;
94   my $cancelled_sql = FS::cust_pkg->cancelled_sql;
95   my $select_count_pkgs = $self->select_count_pkgs_sql;
96
97   my $sql = "
98         0 < ( $select_count_pkgs )
99     AND 0 = ( $select_count_pkgs AND $recurring_sql
100                   AND ( cust_pkg.cancel IS NULL OR cust_pkg.cancel = 0 )
101             )
102     AND 0 < ( $select_count_pkgs AND $cancelled_sql   )
103   ";
104
105   my $module = $conf->config('cust_main-status_module') || 'Classic';
106
107   if ( $module eq 'Classic' ) {
108     $sql .=
109       " AND 0 = (  $select_count_pkgs AND ". FS::cust_pkg->inactive_sql. " ) ";
110   #} elsif ( $module eq 'Recurring' ) {
111   #} else {
112   #  die "unknown status module $module";
113   }
114
115   $sql;
116
117 }
118
119 =back
120
121 =head1 CLASS METHODS
122
123 =over 4
124
125 =item churn_sql START, END
126
127 Returns an SQL statement for the customer churn status query.  The columns
128 returned are the custnum and the number of active, suspended, and cancelled
129 packages (excluding one-time packages) at the start date ("s_active",
130 "s_suspended", and "s_cancelled") and the end date ("e_active", etc.).
131
132 =cut
133
134 # not sure this belongs here...FS::cust_main::Packages?
135
136 sub churn_sql {
137   my $self = shift;
138   my ($speriod, $eperiod) = @_;
139
140   my $s_sql = FS::h_cust_pkg->status_as_of_sql($speriod);
141   my $e_sql = FS::h_cust_pkg->status_as_of_sql($eperiod);
142
143   my @select = (
144     'custnum',
145     'COALESCE(SUM(s.is_active::int),0)     as s_active',
146     'COALESCE(SUM(s.is_suspended::int),0)  as s_suspended',
147     'COALESCE(SUM(s.is_cancelled::int),0)  as s_cancelled',
148     'COALESCE(SUM(e.is_active::int),0)     as e_active',
149     'COALESCE(SUM(e.is_suspended::int),0)  as e_suspended',
150     'COALESCE(SUM(e.is_cancelled::int),0)  as e_cancelled',
151   );
152   my $from = "($s_sql) AS s FULL JOIN ($e_sql) AS e USING (custnum)";
153
154   return "SELECT ".join(',', @select)." FROM $from GROUP BY custnum";
155 }
156
157 =head1 BUGS
158
159 =head1 SEE ALSO
160
161 L<FS::cust_main>
162
163 =cut
164
165 1;
166