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