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