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