add internal user disable-ing
[freeside.git] / httemplate / browse / part_pkg.cgi
1 <%
2
3 #false laziness w/access_user.html
4 my %search = ();
5 my $search = '';
6 unless ( $cgi->param('showdisabled') ) {
7   %search = ( 'disabled' => '' );
8   $search = "( disabled = '' OR disabled IS NULL )";
9 }
10
11 my $select = '*';
12 my $orderby = 'pkgpart';
13 if ( $cgi->param('active') ) {
14
15   $orderby = 'num_active DESC';
16 }
17   $select = "
18
19     *,
20
21     ( SELECT COUNT(*) FROM cust_pkg WHERE cust_pkg.pkgpart = part_pkg.pkgpart
22        AND ( cancel IS NULL OR cancel = 0 )
23        AND ( susp IS NULL OR susp = 0 )
24     ) AS num_active,
25
26     ( SELECT COUNT(*) FROM cust_pkg WHERE cust_pkg.pkgpart = part_pkg.pkgpart
27         AND ( cancel IS NULL OR cancel = 0 )
28         AND susp IS NOT NULL AND susp != 0
29     ) AS num_suspended,
30
31     ( SELECT COUNT(*) FROM cust_pkg WHERE cust_pkg.pkgpart = part_pkg.pkgpart
32         AND cancel IS NOT NULL AND cancel != 0
33     ) AS num_cancelled
34
35   ";
36
37 #}
38
39 my $conf = new FS::Conf;
40 my $taxclasses = $conf->exists('enable_taxclasses');
41
42 my $html_init;
43 #unless ( $cgi->param('active') ) {
44   $html_init = qq!
45     One or more service definitions are grouped together into a package 
46     definition and given pricing information.  Customers purchase packages
47     rather than purchase services directly.<BR><BR>
48     <A HREF="${p}edit/part_pkg.cgi"><I>Add a new package definition</I></A>
49     <BR><BR>
50   !;
51 #}
52
53 my $posttotal;
54 if ( $cgi->param('showdisabled') ) {
55   $cgi->param('showdisabled', 0);
56   $posttotal = '( <a href="'. $cgi->self_url. '">hide disabled packages</a> )';
57   $cgi->param('showdisabled', 1);
58 } else {
59   $cgi->param('showdisabled', 1);
60   $posttotal = '( <a href="'. $cgi->self_url. '">show disabled packages</a> )';
61   $cgi->param('showdisabled', 0);
62 }
63
64
65 # ------
66
67 my $link = [ $p.'edit/part_pkg.cgi?', 'pkgpart' ];
68
69 my @header = ( '#', 'Package', 'Comment' );
70 my @fields = ( 'pkgpart', 'pkg', 'comment' );
71 my $align = 'rll';
72 my @links = ( $link, $link, '' );
73 my @style = ( '', '', '' );
74
75 #false laziness w/access_user.html
76 #unless ( $cgi->param('showdisabled') ) { #its been reversed already
77 if ( $cgi->param('showdisabled') ) { #its been reversed already
78   push @header, 'Status';
79   push @fields, sub { shift->disabled
80                         ? '<FONT COLOR="#FF0000">DISABLED</FONT>'
81                         : '<FONT COLOR="#00CC00">Active</FONT>'
82                     };
83   push @links, '';
84   $align .= 'c';
85   push @style, 'b';
86 }
87
88 unless ( 0 ) { #already showing only one class or something?
89   push @header, 'Class';
90   push @fields, sub { shift->classname || '(none)'; };
91   $align .= 'l';
92 }
93
94 #if ( $cgi->param('active') ) {
95   push @header, 'Customer<BR>packages';
96   my %col = (
97     'active'      => '00CC00',
98     'suspended'   => 'FF9900',
99     'cancelled'   => 'FF0000',
100   );
101   my $cust_pkg_link = $p. 'search/cust_pkg.cgi?pkgpart=';
102   push @fields, sub { my $part_pkg = shift;
103                       [
104                         map {
105                               [
106                                 {
107                                  'data'  => '<B><FONT COLOR="#'. $col{$_}. '">'.
108                                             $part_pkg->get("num_$_").
109                                             '</FONT></B>',
110                                  'align' => 'right',
111                                 },
112                                 {
113                                  'data'  => $_,
114                                  'align' => 'left',
115                                  'link'  => ( $part_pkg->get("num_$_")
116                                                 ? $cust_pkg_link.
117                                                   $part_pkg->pkgpart.
118                                                   ";magic=$_"
119                                                 : ''
120                                             ),
121                                 },
122                               ],
123                             } (qw( active suspended cancelled ))
124                       ]; };
125   $align .= 'r';
126 #}
127
128 push @header, 'Frequency';
129 push @fields, sub { shift->freq_pretty; };
130 $align .= 'l';
131
132 if ( $taxclasses ) {
133   push @header, 'Taxclass';
134   push @fields, sub { shift->taxclass() || '&nbsp;'; };
135   $align .= 'l';
136 }
137
138 push @header, 'Plan',
139               'Data',
140               'Services';
141               #'Service', 'Quan', 'Primary';
142
143 push @fields, sub { shift->plan || '(legacy)' }, 
144
145               sub {
146                     my $part_pkg = shift;
147                     if ( $part_pkg->plan ) {
148
149                       [ map { 
150                               /^(\w+)=(.*)$/; #or something;
151                               [
152                                 { 'data'  => $1,
153                                   'align' => 'right',
154                                 },
155                                 { 'data'  => $2,
156                                   'align' => 'left',
157                                 },
158                               ];
159                             }
160                         split(/\n/, $part_pkg->plandata)
161                       ];
162
163                     } else {
164
165                       [ map { [
166                                 { 'data'  => uc($_),
167                                   'align' => 'right',
168                                 },
169                                 {
170                                   'data'  => $part_pkg->$_(),
171                                   'align' => 'left',
172                                 },
173                               ];
174                             }
175                         (qw(setup recur))
176                       ];
177
178                     }
179
180                   },
181
182               sub {
183                     my $part_pkg = shift;
184
185                     [ map  {
186                              my $pkg_svc = $_;
187                              my $part_svc = $pkg_svc->part_svc;
188                              my $svc = $part_svc->svc;
189                              if ( $pkg_svc->primary_svc =~ /^Y/i ) {
190                                $svc = "<B>$svc (PRIMARY)</B>";
191                              }
192                              $svc =~ s/ +/&nbsp;/g;
193
194                              [
195                                {
196                                  'data'  => '<B>'. $pkg_svc->quantity. '</B>',
197                                  'align' => 'right'
198                                },
199                                {
200                                  'data'  => $svc,
201                                  'align' => 'left',
202                                  'link'  => $p. 'edit/part_svc.cgi?'.
203                                             $part_svc->svcpart,
204                                },
205                              ];
206                            }
207                       sort {     $b->primary_svc =~ /^Y/i
208                              <=> $a->primary_svc =~ /^Y/i
209                            }
210                            $part_pkg->pkg_svc
211
212                     ];
213
214                   };
215
216 $align .= 'lrl'; #rr';
217
218 # --------
219
220 my $count_query = 'SELECT COUNT(*) FROM part_pkg';
221 $count_query .= " WHERE $search"
222   if $search;
223
224 %><%= include( 'elements/browse.html',
225                  'title'          => 'Package Definitions',
226                  'menubar'        => [ 'Main Menu' => $p ],
227                  'html_init'      => $html_init,
228                  'html_posttotal' => $posttotal,
229                  'name'           => 'package definitions',
230                  'query'          => { 'select'    => $select,
231                                        'table'     => 'part_pkg',
232                                        'hashref'   => \%search,
233                                        'extra_sql' => "ORDER BY $orderby",
234                                      },
235                  'count_query'    => $count_query,
236                  'header'         => \@header,
237                  'fields'         => \@fields,
238                  'links'          => \@links,
239                  'align'          => $align,
240                  'style'          => \@style,
241              )
242 %>