suspend later just like expire (#1487)
[freeside.git] / httemplate / search / cust_pkg.cgi
1 <% include( 'elements/search.html',
2                   'title'       => 'Package Search Results', 
3                   'name'        => 'packages',
4                   'query'       => $sql_query,
5                   'count_query' => $count_query,
6                   #'redirect'    => $link,
7                   'header'      => [ '#',
8                                      'Package',
9                                      'Class',
10                                      'Status',
11                                      'Freq.',
12                                      'Setup',
13                                      'Last bill',
14                                      'Next bill',
15                                      'Adjourn',
16                                      'Susp.',
17                                      'Expire',
18                                      'Cancel',
19                                      FS::UI::Web::cust_header(
20                                        $cgi->param('cust_fields')
21                                      ),
22                                      'Services',
23                                    ],
24                   'fields'      => [
25                     'pkgnum',
26                     sub { #my $part_pkg = $part_pkg{shift->pkgpart};
27                           #$part_pkg->pkg; # ' - '. $part_pkg->comment;
28                           $_[0]->pkg; # ' - '. $_[0]->comment;
29                         },
30                     'classname',
31                     sub { ucfirst(shift->status); },
32                     sub { #shift->part_pkg->freq_pretty;
33
34                           #my $part_pkg = $part_pkg{shift->pkgpart};
35                           #$part_pkg->freq_pretty;
36
37                           FS::part_pkg::freq_pretty(shift);
38                         },
39
40                     #sub { time2str('%b %d %Y', shift->setup); },
41                     #sub { time2str('%b %d %Y', shift->last_bill); },
42                     #sub { time2str('%b %d %Y', shift->bill); },
43                     #sub { time2str('%b %d %Y', shift->susp); },
44                     #sub { time2str('%b %d %Y', shift->expire); },
45                     #sub { time2str('%b %d %Y', shift->get('cancel')); },
46                     ( map { time_or_blank($_) }
47                           qw( setup last_bill bill adjourn susp expire cancel ) ),
48
49                     \&FS::UI::Web::cust_fields,
50                     #sub { '<table border=0 cellspacing=0 cellpadding=0 STYLE="border:none">'.
51                     #      join('', map { '<tr><td align="right" style="border:none">'. $_->[0].
52                     #                     ':</td><td style="border:none">'. $_->[1]. '</td></tr>' }
53                     #                   shift->labels
54                     #          ).
55                     #      '</table>';
56                     #    },
57                     sub {
58                           [ map {
59                                   [ 
60                                     { 'data' => $_->[0]. ':',
61                                       'align'=> 'right',
62                                     },
63                                     { 'data' => $_->[1],
64                                       'align'=> 'left',
65                                       'link' => $p. 'view/' .
66                                                 $_->[2]. '.cgi?'. $_->[3],
67                                     },
68                                   ];
69                                 } shift->labels
70                           ];
71                         },
72                   ],
73                   'color' => [
74                     '',
75                     '',
76                     '',
77                     sub { shift->statuscolor; },
78                     '',
79                     '',
80                     '',
81                     '',
82                     '',
83                     '',
84                     '',
85                     FS::UI::Web::cust_colors(),
86                     '',
87                   ],
88                   'style' => [ '', '', '', 'b', '', '', '', '', '', '', '',
89                                FS::UI::Web::cust_styles() ],
90                   'size'  => [ '', '', '', '-1', ],
91                   'align' => 'rllclrrrrrr'. FS::UI::Web::cust_aligns(). 'r',
92                   'links' => [
93                     $link,
94                     $link,
95                     '',
96                     '',
97                     '',
98                     '',
99                     '',
100                     '',
101                     '',
102                     '',
103                     '',
104                     ( map { $_ ne 'Cust. Status' ? $clink : '' }
105                           FS::UI::Web::cust_header(
106                                                     $cgi->param('cust_fields')
107                                                   )
108                     ),
109                     '',
110                   ],
111               )
112 %>
113 <%init>
114
115 die "access denied"
116   unless $FS::CurrentUser::CurrentUser->access_right('List packages');
117
118 # my %part_pkg = map { $_->pkgpart => $_ } qsearch('part_pkg', {});
119
120 my($query) = $cgi->keywords;
121
122 my @where = ();
123
124 ##
125 # parse agent
126 ##
127
128 if ( $cgi->param('agentnum') =~ /^(\d+)$/ and $1 ) {
129   push @where,
130     "agentnum = $1";
131 }
132
133 ##
134 # parse status
135 ##
136
137 if (    $cgi->param('magic')  eq 'active'
138      || $cgi->param('status') eq 'active' ) {
139
140   push @where, FS::cust_pkg->active_sql();
141
142 } elsif (    $cgi->param('magic')  eq 'inactive'
143           || $cgi->param('status') eq 'inactive' ) {
144
145   push @where, FS::cust_pkg->inactive_sql();
146
147
148 } elsif (    $cgi->param('magic')  eq 'suspended'
149           || $cgi->param('status') eq 'suspended'  ) {
150
151   push @where, FS::cust_pkg->suspended_sql();
152
153 } elsif (    $cgi->param('magic')  =~ /^cancell?ed$/
154           || $cgi->param('status') =~ /^cancell?ed$/ ) {
155
156   push @where, FS::cust_pkg->cancelled_sql();
157
158 } elsif ( $cgi->param('status') =~ /^(one-time charge|inactive)$/ ) {
159
160   push @where, FS::cust_pkg->inactive_sql();
161
162 }
163
164 ###
165 # parse package class
166 ###
167
168 #false lazinessish w/graph/cust_bill_pkg.cgi
169 my $classnum = 0;
170 my @pkg_class = ();
171 if ( exists($cgi->Vars->{'classnum'})
172      && $cgi->param('classnum') =~ /^(\d*)$/
173    )
174 {
175   $classnum = $1;
176   if ( $classnum ) { #a specific class
177     push @where, "classnum = $classnum";
178
179     #@pkg_class = ( qsearchs('pkg_class', { 'classnum' => $classnum } ) );
180     #die "classnum $classnum not found!" unless $pkg_class[0];
181     #$title .= $pkg_class[0]->classname.' ';
182
183   } elsif ( $classnum eq '' ) { #the empty class
184
185     push @where, "classnum IS NULL";
186     #$title .= 'Empty class ';
187     #@pkg_class = ( '(empty class)' );
188   } elsif ( $classnum eq '0' ) {
189     #@pkg_class = qsearch('pkg_class', {} ); # { 'disabled' => '' } );
190     #push @pkg_class, '(empty class)';
191   } else {
192     die "illegal classnum";
193   }
194 }
195 #eslaf
196
197 ###
198 # parse part_pkg
199 ###
200
201 my $pkgpart = join (' OR pkgpart=',
202                     grep {$_} map { /^(\d+)$/; } ($cgi->param('pkgpart')));
203 push @where,  '(pkgpart=' . $pkgpart . ')' if $pkgpart;
204
205 ###
206 # parse dates
207 ###
208
209 my $orderby = '';
210
211 #false laziness w/report_cust_pkg.html
212 my %disable = (
213   'all'             => {},
214   'one-time charge' => { 'last_bill'=>1, 'bill'=>1, 'adjourn'=>1, 'susp'=>1, 'expire'=>1, 'cancel'=>1, },
215   'active'          => { 'susp'=>1, 'cancel'=>1 },
216   'suspended'       => { 'cancel' => 1 },
217   'cancelled'       => {},
218   ''                => {},
219 );
220
221 foreach my $field (qw( setup last_bill bill adjourn susp expire cancel )) {
222
223   my($beginning, $ending) = FS::UI::Web::parse_beginning_ending($cgi, $field);
224
225   next if $beginning == 0 && $ending == 4294967295
226        or $disable{$cgi->param('status')}->{$field};
227
228   push @where,
229     "cust_pkg.$field IS NOT NULL",
230     "cust_pkg.$field >= $beginning",
231     "cust_pkg.$field <= $ending";
232
233   $orderby ||= "ORDER BY cust_pkg.$field";
234
235 }
236
237 $orderby ||= 'ORDER BY bill';
238
239 ###
240 # parse magic, legacy, etc.
241 ###
242
243 if ( $cgi->param('magic') &&
244      $cgi->param('magic') =~ /^(active|inactive|suspended|cancell?ed)$/
245 ) {
246
247   $orderby = 'ORDER BY pkgnum';
248
249   if ( $cgi->param('pkgpart') =~ /^(\d+)$/ ) {
250     push @where, "pkgpart = $1";
251   }
252
253 } elsif ( $query eq 'pkgnum' ) {
254
255   $orderby = 'ORDER BY pkgnum';
256
257 } elsif ( $query eq 'APKG_pkgnum' ) {
258
259   $orderby = 'ORDER BY pkgnum';
260
261   push @where, '0 < (
262     SELECT count(*) FROM pkg_svc
263      WHERE pkg_svc.pkgpart =  cust_pkg.pkgpart
264        AND pkg_svc.quantity > ( SELECT count(*) FROM cust_svc
265                                  WHERE cust_svc.pkgnum  = cust_pkg.pkgnum
266                                    AND cust_svc.svcpart = pkg_svc.svcpart
267                               )
268   )';
269   
270 }
271
272 ##
273 # setup queries, links, subs, etc. for the search
274 ##
275
276 # here is the agent virtualization
277 push @where, $FS::CurrentUser::CurrentUser->agentnums_sql;
278
279 my $extra_sql = scalar(@where) ? ' WHERE '. join(' AND ', @where) : '';
280
281 my $addl_from = 'LEFT JOIN cust_main USING ( custnum  ) '.
282                 'LEFT JOIN part_pkg  USING ( pkgpart  ) '.
283                 'LEFT JOIN pkg_class USING ( classnum ) ';
284
285 my $count_query = "SELECT COUNT(*) FROM cust_pkg $addl_from $extra_sql";
286
287 my $sql_query = {
288   'table'     => 'cust_pkg',
289   'hashref'   => {},
290   'select'    => join(', ',
291                             'cust_pkg.*',
292                             ( map "part_pkg.$_", qw( pkg freq ) ),
293                             'pkg_class.classname',
294                             'cust_main.custnum as cust_main_custnum',
295                             FS::UI::Web::cust_sql_fields(
296                               $cgi->param('cust_fields')
297                             ),
298                  ),
299   'extra_sql' => "$extra_sql $orderby",
300   'addl_from' => $addl_from,
301 };
302
303 my $link = sub {
304   [ "${p}view/cust_main.cgi?".shift->custnum.'#cust_pkg', 'pkgnum' ];
305 };
306
307 my $clink = sub {
308   my $cust_pkg = shift;
309   $cust_pkg->cust_main_custnum
310     ? [ "${p}view/cust_main.cgi?", 'custnum' ] 
311     : '';
312 };
313
314 #if ( scalar(@cust_pkg) == 1 ) {
315 #  print $cgi->redirect("${p}view/cust_main.cgi?". $cust_pkg[0]->custnum.
316 #                       "#cust_pkg". $cust_pkg[0]->pkgnum );
317
318 #    my @cust_svc = qsearch( 'cust_svc', { 'pkgnum' => $pkgnum } );
319 #    my $rowspan = scalar(@cust_svc) || 1;
320
321 #    my $n2 = '';
322 #    foreach my $cust_svc ( @cust_svc ) {
323 #      my($label, $value, $svcdb) = $cust_svc->label;
324 #      my $svcnum = $cust_svc->svcnum;
325 #      my $sview = $p. "view";
326 #      print $n2,qq!<TD><A HREF="$sview/$svcdb.cgi?$svcnum"><FONT SIZE=-1>$label</FONT></A></TD>!,
327 #            qq!<TD><A HREF="$sview/$svcdb.cgi?$svcnum"><FONT SIZE=-1>$value</FONT></A></TD>!;
328 #      $n2="</TR><TR>";
329 #    }
330
331 sub time_or_blank {
332    my $column = shift;
333    return sub {
334      my $record = shift;
335      my $value = $record->get($column); #mmm closures
336      $value ? time2str('%b %d %Y', $value ) : '';
337    };
338 }
339
340 </%init>