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