add customer status to advanced package report, RT#24631
[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->part_pkg->base_recur($c)
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
161     )) 
162 {
163   $search_hash{$_} = $cgi->param($_) if length($cgi->param($_));
164 }
165
166 #arrays
167 for my $param (qw( pkgpart classnum )) {
168   $search_hash{$param} = [ $cgi->param($param) ]
169     if grep { $_ eq $param } $cgi->param;
170 }
171
172 #scalars that need to be passed if empty
173 for my $param (qw( censustract censustract2 )) {
174   $search_hash{$param} = $cgi->param($param) || ''
175     if grep { $_ eq $param } $cgi->param;
176 }
177
178 my $report_option = $cgi->param('report_option');
179 $search_hash{report_option} = $report_option if $report_option;
180
181 for my $param (grep /^report_option_any/, $cgi->param) {
182   $search_hash{$param} = $cgi->param($param);
183 }
184
185 ###
186 # parse dates
187 ###
188
189 #false laziness w/report_cust_pkg.html
190 my %disable = (
191   'all'             => {},
192   'one-time charge' => { 'last_bill'=>1, 'bill'=>1, 'adjourn'=>1, 'susp'=>1, 'expire'=>1, 'cancel'=>1, 'contract_end'=>1, 'dundate'=>1, },
193   'active'          => { 'susp'=>1, 'cancel'=>1 },
194   'suspended'       => { 'cancel' =>1, 'dundate'=>1, },
195   'cancelled'       => {},
196   ''                => {},
197 );
198
199 foreach my $field (qw( setup last_bill bill adjourn susp expire contract_end change_date cancel active )) {
200
201   my($beginning, $ending) = FS::UI::Web::parse_beginning_ending($cgi, $field);
202
203   next if $beginning == 0 && $ending == 4294967295
204        or $disable{$cgi->param('status')}->{$field};
205
206   $search_hash{$field} = [ $beginning, $ending ];
207
208 }
209
210 my $sql_query = FS::cust_pkg->search(\%search_hash);
211 my $count_query = delete($sql_query->{'count_query'});
212
213 my $show = $curuser->default_customer_view =~ /^(jumbo|packages)$/
214              ? ''
215              : ';show=packages';
216
217 my $link = sub {
218   my $self = shift;
219   my $frag = 'cust_pkg'. $self->pkgnum; #hack for IE ignoring real #fragment
220   [ "${p}view/cust_main.cgi?custnum=".$self->custnum.
221                            "$show;fragment=$frag#cust_pkg",
222     'pkgnum'
223   ];
224 };
225
226 my $clink = sub {
227   my $cust_pkg = shift;
228   $cust_pkg->cust_main_custnum
229     ? [ "${p}view/cust_main.cgi?", 'custnum' ] 
230     : '';
231 };
232
233 sub time_or_blank {
234    my $column = shift;
235    return sub {
236      my $record = shift;
237      my $value = $record->get($column); #mmm closures
238      $value ? time2str('%b %d %Y', $value ) : '';
239    };
240 }
241
242 my $html_init = sub {
243   my $query = shift;
244   my $text = '';
245   my $curuser = $FS::CurrentUser::CurrentUser;
246
247   if ( $curuser->access_right('Bulk change customer packages') ) {
248     $text .= include('/elements/init_overlib.html').
249              include( '/elements/popup_link.html',
250                'label'       => emt('Change these packages'),
251                'action'      => "${p}misc/bulk_change_pkg.cgi?$query",
252                'actionlabel' => emt('Change Packages'),
253                'width'       => 569,
254                'height'      => 210,
255              ). '<BR>';
256
257     if ( $curuser->access_right('Edit customer package dates') ) {
258       $text .= include( '/elements/popup_link.html',
259                  'label'       => emt('Increment next bill date'),
260                  'action'      => "${p}misc/bulk_pkg_increment_bill.cgi?$query",
261                  'actionlabel' => emt('Increment Bill Date'),
262                  'width'       => 569,
263                  'height'      => 210,
264               ). '<BR>';
265     }
266     $text .= include( '/elements/email-link.html',
267                 'search_hash' => \%search_hash,
268                 'table'       => 'cust_pkg',
269                 ). '<BR><BR>';
270   }
271   return $text;
272 };
273
274 my $large_pkg_size = $conf->config('cust_pkg-large_pkg_size');
275
276 my $process_svc_labels = sub {
277   my $cust_pkg = shift;
278   my @out;
279   foreach my $part_svc ( $cust_pkg->part_svc) {
280     # some false laziness with view/cust_main/packages/services.html
281
282     my $num_cust_svc = $cust_pkg->num_cust_svc( $part_svc->svcpart );
283
284     if ( $large_pkg_size > 0 and $large_pkg_size <= $num_cust_svc ) {
285       my $href = $p.'search/cust_pkg_svc.html?svcpart='.$part_svc->svcpart.
286           ';pkgnum='.$cust_pkg->pkgnum;
287       push @out, [
288         { 'data'  => $part_svc->svc . ':',
289           'align' => 'right',
290           'rowspan' => 2 },
291         { 'data'  => mt('(view all [_1])', $num_cust_svc),
292           'data_style' => 'b',
293           'align' => 'left',
294           'link'  => $href, },
295       ],
296       [
297         { 'data'  => include('/elements/search-cust_svc.html',
298                         'svcpart' => $part_svc->svcpart,
299                         'pkgnum'  => $cust_pkg->pkgnum,
300                     ),
301           'align' => 'left' },
302       ];
303     }
304     else {
305       foreach ( map { [ $_->label ] } @{ $part_svc->cust_pkg_svc } ) {
306         push @out, [ 
307         { 'data' => $_->[0]. ':',
308           'align'=> 'right', },
309         { 'data' => $_->[1],
310           'align'=> 'left',
311           'link' => $p. 'view/' .
312           $_->[2]. '.cgi?'. $_->[3], },
313         ];
314       }
315     }
316   } #foreach $cust_pkg
317   return @out;
318 };
319
320 </%init>