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