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