Revert "remove old test files"
[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   $search_hash{$field.'_null'} = scalar( $cgi->param($field.'_null') );
207
208   my($beginning, $ending) = FS::UI::Web::parse_beginning_ending($cgi, $field);
209
210   next if $beginning == 0 && $ending == 4294967295
211        or $disable{$cgi->param('status')}->{$field};
212
213   $search_hash{$field} = [ $beginning, $ending ];
214
215 }
216
217 my $sql_query = FS::cust_pkg->search(\%search_hash);
218 my $count_query = delete($sql_query->{'count_query'});
219
220 my $show = $curuser->default_customer_view =~ /^(jumbo|packages)$/
221              ? ''
222              : ';show=packages';
223
224 my $link = sub {
225   my $self = shift;
226   my $frag = 'cust_pkg'. $self->pkgnum; #hack for IE ignoring real #fragment
227   [ "${p}view/cust_main.cgi?custnum=".$self->custnum.
228                            "$show;fragment=$frag#cust_pkg",
229     'pkgnum'
230   ];
231 };
232
233 my $clink = sub {
234   my $cust_pkg = shift;
235   $cust_pkg->cust_main_custnum
236     ? [ "${p}view/cust_main.cgi?", 'custnum' ] 
237     : '';
238 };
239
240 sub time_or_blank {
241    my $column = shift;
242    return sub {
243      my $record = shift;
244      my $value = $record->get($column); #mmm closures
245      $value ? time2str('%b %d %Y', $value ) : '';
246    };
247 }
248
249 my $html_init = sub {
250   my $query = shift;
251   my $text = '';
252   my $curuser = $FS::CurrentUser::CurrentUser;
253
254   if ( $curuser->access_right('Bulk change customer packages') ) {
255     $text .= include('/elements/init_overlib.html').
256              include( '/elements/popup_link.html',
257                'label'       => emt('Change these packages'),
258                'action'      => "${p}misc/bulk_change_pkg.cgi?$query",
259                'actionlabel' => emt('Change Packages'),
260                'width'       => 569,
261                'height'      => 210,
262              ). '<BR>';
263
264     if ( $curuser->access_right('Edit customer package dates') ) {
265       $text .= include( '/elements/popup_link.html',
266                  'label'       => emt('Increment next bill date'),
267                  'action'      => "${p}misc/bulk_pkg_increment_bill.cgi?$query",
268                  'actionlabel' => emt('Increment Bill Date'),
269                  'width'       => 569,
270                  'height'      => 210,
271               ). '<BR>';
272     }
273     $text .= include( '/elements/email-link.html',
274                 'search_hash' => \%search_hash,
275                 'table'       => 'cust_pkg',
276                 ). '<BR><BR>';
277   }
278   return $text;
279 };
280
281 my $large_pkg_size = $conf->config('cust_pkg-large_pkg_size');
282
283 my $process_svc_labels = sub {
284   my $cust_pkg = shift;
285   my @out;
286   foreach my $part_svc ( $cust_pkg->part_svc) {
287     # some false laziness with view/cust_main/packages/services.html
288
289     my $num_cust_svc = $cust_pkg->num_cust_svc( $part_svc->svcpart );
290
291     if ( $large_pkg_size > 0 and $large_pkg_size <= $num_cust_svc ) {
292       my $href = $p.'search/cust_pkg_svc.html?svcpart='.$part_svc->svcpart.
293           ';pkgnum='.$cust_pkg->pkgnum;
294       push @out, [
295         { 'data'  => $part_svc->svc . ':',
296           'align' => 'right',
297           'rowspan' => 2 },
298         { 'data'  => mt('(view all [_1])', $num_cust_svc),
299           'data_style' => 'b',
300           'align' => 'left',
301           'link'  => $href, },
302       ],
303       [
304         { 'data'  => include('/elements/search-cust_svc.html',
305                         'svcpart' => $part_svc->svcpart,
306                         'pkgnum'  => $cust_pkg->pkgnum,
307                     ),
308           'align' => 'left' },
309       ];
310     }
311     else {
312       foreach ( map { [ $_->label ] } @{ $part_svc->cust_pkg_svc } ) {
313         push @out, [ 
314         { 'data' => $_->[0]. ':',
315           'align'=> 'right',
316         },
317
318         { 'data' => $_->[1],
319           'align'=> 'left',
320           'link' => $p. 'view/cust_svc.cgi?' . $_->[3],
321         },
322
323         ];
324       }
325     }
326   } #foreach $cust_pkg
327   return @out;
328 };
329
330 </%init>