verify credit card changes via $1 auth, RT#37632
[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   if ( $module eq 'Classic' ) {
44     tie %statuscolors, 'Tie::IxHash',
45       'prospect'  => 'FF00F5', #'000000', #black?  naw, purple
46       'active'    => '00CC00', #green
47       'ordered'   => '009999', #teal? cyan?
48       'inactive'  => '0000CC', #blue
49       'suspended' => 'FF9900', #yellow
50       'cancelled' => 'FF0000', #red
51     ;
52   } elsif ( $module eq 'Recurring' ) {
53     tie %statuscolors, 'Tie::IxHash',
54       'prospect'  => 'FF00F5', #'000000', #black?  naw, purple
55       'active'    => '00CC00', #green
56       'ordered'   => '009999', #teal? cyan?
57       'suspended' => 'FF9900', #yellow
58       'cancelled' => 'FF0000', #red
59       'inactive'  => '0000CC', #blue
60     ;
61   } else {
62     die "unknown status module $module";
63   }
64
65   \%statuscolors;
66
67 }
68
69 =item cancelled_sql
70
71 =cut
72
73 sub cancelled_sql {
74   my $self = shift;
75
76   my $recurring_sql = FS::cust_pkg->recurring_sql;
77   my $cancelled_sql = FS::cust_pkg->cancelled_sql;
78   my $select_count_pkgs = $self->select_count_pkgs_sql;
79
80   my $sql = "
81         0 < ( $select_count_pkgs )
82     AND 0 = ( $select_count_pkgs AND $recurring_sql
83                   AND ( cust_pkg.cancel IS NULL OR cust_pkg.cancel = 0 )
84             )
85     AND 0 < ( $select_count_pkgs AND $cancelled_sql   )
86   ";
87
88   if ( $module eq 'Classic' ) {
89     $sql .=
90       " AND 0 = (  $select_count_pkgs AND ". FS::cust_pkg->inactive_sql. " ) ";
91   #} elsif ( $module eq 'Recurring' ) {
92   #} else {
93   #  die "unknown status module $module";
94   }
95
96   $sql;
97
98 }
99
100 =back
101
102 =head1 CLASS METHODS
103
104 =over 4
105
106 =item churn_sql START, END
107
108 Returns an SQL statement for the customer churn status query.  The columns
109 returned are the custnum and the number of active, suspended, and cancelled
110 packages (excluding one-time packages) at the start date ("s_active",
111 "s_suspended", and "s_cancelled") and the end date ("e_active", etc.).
112
113 =cut
114
115 # not sure this belongs here...FS::cust_main::Packages?
116
117 sub churn_sql {
118   my $self = shift;
119   my ($speriod, $eperiod) = @_;
120
121   my $s_sql = FS::h_cust_pkg->status_as_of_sql($speriod);
122   my $e_sql = FS::h_cust_pkg->status_as_of_sql($eperiod);
123
124   my @select = (
125     'custnum',
126     'COALESCE(SUM(s.is_active::int),0)     as s_active',
127     'COALESCE(SUM(s.is_suspended::int),0)  as s_suspended',
128     'COALESCE(SUM(s.is_cancelled::int),0)  as s_cancelled',
129     'COALESCE(SUM(e.is_active::int),0)     as e_active',
130     'COALESCE(SUM(e.is_suspended::int),0)  as e_suspended',
131     'COALESCE(SUM(e.is_cancelled::int),0)  as e_cancelled',
132   );
133   my $from = "($s_sql) AS s FULL JOIN ($e_sql) AS e USING (custnum)";
134
135   return "SELECT ".join(',', @select)." FROM $from GROUP BY custnum";
136 }
137
138 =head1 BUGS
139
140 =head1 SEE ALSO
141
142 L<FS::cust_main>
143
144 =cut
145
146 1;
147