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