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