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