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