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