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