multi-select for agent on RADIUS usage report, RT#73050
[freeside.git] / httemplate / search / cust_pkg.cgi
1 <& elements/search.html,
2                   'html_init'   => $html_init, 
3                   'title'       => emt('Package Search Results'), 
4                   'name'        => 'packages',
5                   'query'       => $sql_query,
6                   'count_query' => $count_query,
7                   'header'      => [ emt('#'),
8                                      emt('Quan.'),
9                                      emt('Package'),
10                                      emt('Class'),
11                                      emt('Status'),
12                                      emt('Sales Person'),
13                                      emt('Ordered by'),
14                                      emt('Setup'),
15                                      emt('Base Recur'),
16                                      emt('Freq.'),
17                                      emt('Setup'),
18                                      emt('Last bill'),
19                                      emt('Next bill'),
20                                      emt('Adjourn'),
21                                      emt('Susp.'),
22                                      emt('Susp. delay'),
23                                      emt('Expire'),
24                                      emt('Contract end'),
25                                      emt('Changed'),
26                                      emt('Cancel'),
27                                      emt('Reason'),
28                                      FS::UI::Web::cust_header(
29                                        $cgi->param('cust_fields')
30                                      ),
31                                      emt('Services'),
32                                    ],
33                   'fields'      => [
34                     'pkgnum',
35                     'quantity',
36                     sub { $_[0]->pkg; },
37                     'classname',
38                     sub { ucfirst(shift->status); },
39                     'salesperson',
40                     'otaker',
41                     sub { sprintf( $money_char.'%.2f',
42                                    shift->part_pkg->option('setup_fee'),
43                                  );
44                         },
45                     sub { my $c = shift;
46                           sprintf( $money_char.'%.2f',
47                                    $c->base_recur
48                                  );
49                         },
50                     sub { FS::part_pkg::freq_pretty(shift); },
51
52                     ( map { time_or_blank($_) }
53           qw( setup last_bill bill adjourn susp dundate expire contract_end change_date cancel ) ),
54
55                     sub { my $self = shift;
56                           my $return = '';
57                           foreach my $action ( qw ( cancel susp ) ) {
58                             my $reason = $self->last_reason($action);
59                             $return = $reason->reason if $reason;
60                             last if $return;
61                           }
62                           $return;
63                         },
64
65                     \&FS::UI::Web::cust_fields,
66                     sub {
67                       my $cust_pkg = shift;
68                       my $type = $cgi->param('_type') || '';
69                       if ($type =~ /xls|csv/) {
70                         my $cust_svc = $cust_pkg->primary_cust_svc;
71                         if($cust_svc) {
72                           return join ": ",($cust_svc->label)[0,1];
73                         }
74                         else {
75                           return '';
76                         }
77                       }
78                       else {
79                           [ $process_svc_labels->( $cust_pkg ) ]
80                       }
81                     }
82                   ],
83                   'color' => [
84                     '',
85                     '',
86                     '',
87                     '',
88                     sub { shift->statuscolor; },
89                     '',
90                     '',
91                     '',
92                     '',
93                     '',
94                     '',
95                     '',
96                     '',
97                     '',
98                     '',
99                     '',
100                     '',
101                     '',
102                     '',
103                     '',
104                     '',
105                     FS::UI::Web::cust_colors(),
106                     '',
107                   ],
108                   'style' => [ '', '', '', '', 'b', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
109                                FS::UI::Web::cust_styles() ],
110                   'size'  => [ '', '', '', '', '-1' ],
111                   'align' => 'rrlccccrrlrrrrrrrrrrl'. FS::UI::Web::cust_aligns(). 'r',
112                   'links' => [
113                     $link,
114                     $link,
115                     $link,
116                     '',
117                     '',
118                     '',
119                     '',
120                     '',
121                     '',
122                     '',
123                     '',
124                     '',
125                     '',
126                     '',
127                     '',
128                     '',
129                     '',
130                     '', # link to changed-from package?
131                     '',
132                     '',
133                     '',
134                     ( map { $_ ne 'Cust. Status' ? $clink : '' }
135                           FS::UI::Web::cust_header(
136                                                     $cgi->param('cust_fields')
137                                                   )
138                     ),
139                     '',
140                   ],
141 &>
142 <%init>
143
144 my $curuser = $FS::CurrentUser::CurrentUser;
145
146 die "access denied"
147   unless $curuser->access_right('List packages');
148
149 my $conf = new FS::Conf;
150 my $money_char = $conf->config('money_char') || '$';
151
152 my %search_hash = ();
153
154 #some false laziness w/misc/bulk_change_pkg.cgi
155   
156 $search_hash{'query'} = $cgi->keywords;
157
158 #scalars
159 for (qw( agentnum cust_status cust_main_salesnum salesnum custnum magic status
160          custom cust_fields pkgbatch zip
161          477part 477rownum date 
162     )) 
163 {
164   $search_hash{$_} = $cgi->param($_) if length($cgi->param($_));
165 }
166
167 #arrays
168 for my $param (qw( pkgpart classnum refnum towernum )) {
169   $search_hash{$param} = [ $cgi->param($param) ]
170     if grep { $_ eq $param } $cgi->param;
171 }
172
173 #scalars that need to be passed if empty
174 for my $param (qw( censustract censustract2 )) {
175   $search_hash{$param} = $cgi->param($param) || ''
176     if grep { $_ eq $param } $cgi->param;
177 }
178
179 #location flags (checkboxes)
180 my @loc = grep /^\w+$/, $cgi->param('loc');
181 $search_hash{"location_$_"} = 1 foreach @loc;
182
183 my $report_option = $cgi->param('report_option');
184 $search_hash{report_option} = $report_option if $report_option;
185
186 for my $param (grep /^report_option_any/, $cgi->param) {
187   $search_hash{$param} = $cgi->param($param);
188 }
189
190 ###
191 # parse dates
192 ###
193
194 #false laziness w/report_cust_pkg.html
195 my %disable = (
196   'all'             => {},
197   'one-time charge' => { 'last_bill'=>1, 'bill'=>1, 'adjourn'=>1, 'susp'=>1, 'expire'=>1, 'cancel'=>1, 'contract_end'=>1, 'dundate'=>1, },
198   'active'          => { 'susp'=>1, 'cancel'=>1 },
199   'suspended'       => { 'cancel' =>1, 'dundate'=>1, },
200   'cancelled'       => {},
201   ''                => {},
202 );
203
204 foreach my $field (qw( setup last_bill bill adjourn susp expire contract_end change_date cancel active )) {
205
206   my($beginning, $ending) = FS::UI::Web::parse_beginning_ending($cgi, $field);
207
208   next if $beginning == 0 && $ending == 4294967295
209        or $disable{$cgi->param('status')}->{$field};
210
211   $search_hash{$field} = [ $beginning, $ending ];
212
213 }
214
215 my $sql_query = FS::cust_pkg->search(\%search_hash);
216 my $count_query = delete($sql_query->{'count_query'});
217
218 my $show = $curuser->default_customer_view =~ /^(jumbo|packages)$/
219              ? ''
220              : ';show=packages';
221
222 my $link = sub {
223   my $self = shift;
224   my $frag = 'cust_pkg'. $self->pkgnum; #hack for IE ignoring real #fragment
225   [ "${p}view/cust_main.cgi?custnum=".$self->custnum.
226                            "$show;fragment=$frag#cust_pkg",
227     'pkgnum'
228   ];
229 };
230
231 my $clink = sub {
232   my $cust_pkg = shift;
233   $cust_pkg->cust_main_custnum
234     ? [ "${p}view/cust_main.cgi?", 'custnum' ] 
235     : '';
236 };
237
238 sub time_or_blank {
239    my $column = shift;
240    return sub {
241      my $record = shift;
242      my $value = $record->get($column); #mmm closures
243      $value ? time2str('%b %d %Y', $value ) : '';
244    };
245 }
246
247 my $html_init = sub {
248   my $query = shift;
249   my $text = '';
250   my $curuser = $FS::CurrentUser::CurrentUser;
251
252   if ( $curuser->access_right('Bulk change customer packages') ) {
253     $text .= include('/elements/init_overlib.html').
254              include( '/elements/popup_link.html',
255                'label'       => emt('Change these packages'),
256                'action'      => "${p}misc/bulk_change_pkg.cgi?$query",
257                'actionlabel' => emt('Change Packages'),
258                'width'       => 569,
259                'height'      => 210,
260              ). '<BR>';
261
262     if ( $curuser->access_right('Edit customer package dates') ) {
263       $text .= include( '/elements/popup_link.html',
264                  'label'       => emt('Increment next bill date'),
265                  'action'      => "${p}misc/bulk_pkg_increment_bill.cgi?$query",
266                  'actionlabel' => emt('Increment Bill Date'),
267                  'width'       => 569,
268                  'height'      => 210,
269               ). '<BR>';
270     }
271     $text .= include( '/elements/email-link.html',
272                 'search_hash' => \%search_hash,
273                 'table'       => 'cust_pkg',
274                 ). '<BR><BR>';
275   }
276   return $text;
277 };
278
279 my $large_pkg_size = $conf->config('cust_pkg-large_pkg_size');
280
281 my $process_svc_labels = sub {
282   my $cust_pkg = shift;
283   my @out;
284   foreach my $part_svc ( $cust_pkg->part_svc) {
285     # some false laziness with view/cust_main/packages/services.html
286
287     my $num_cust_svc = $cust_pkg->num_cust_svc( $part_svc->svcpart );
288
289     if ( $large_pkg_size > 0 and $large_pkg_size <= $num_cust_svc ) {
290       my $href = $p.'search/cust_pkg_svc.html?svcpart='.$part_svc->svcpart.
291           ';pkgnum='.$cust_pkg->pkgnum;
292       push @out, [
293         { 'data'  => $part_svc->svc . ':',
294           'align' => 'right',
295           'rowspan' => 2 },
296         { 'data'  => mt('(view all [_1])', $num_cust_svc),
297           'data_style' => 'b',
298           'align' => 'left',
299           'link'  => $href, },
300       ],
301       [
302         { 'data'  => include('/elements/search-cust_svc.html',
303                         'svcpart' => $part_svc->svcpart,
304                         'pkgnum'  => $cust_pkg->pkgnum,
305                     ),
306           'align' => 'left' },
307       ];
308     }
309     else {
310       foreach ( map { [ $_->label ] } @{ $part_svc->cust_pkg_svc } ) {
311         push @out, [ 
312         { 'data' => $_->[0]. ':',
313           'align'=> 'right',
314         },
315
316         { 'data' => $_->[1],
317           'align'=> 'left',
318           'link' => $p. 'view/cust_svc.cgi?' . $_->[3],
319         },
320
321         ];
322       }
323     }
324   } #foreach $cust_pkg
325   return @out;
326 };
327
328 </%init>