Option to ignore old CDRs, RT#81480
[freeside.git] / httemplate / search / cust_event.html
1 <& elements/search.html,
2                  'title'       => $title,
3                  'html_init'   => include('.init'),
4                  'menubar'     => $menubar,
5                  'name'        => 'billing events',
6                  'query'       => $sql_query,
7                  'count_query' => $count_sql,
8                  'header'      => [ 'Event',
9                                     'Date',
10                                     'Status',
11                                     'Trigger',
12                                     #'Inv #', 'Inv Date', 'Cust #',
13                                     #'Invoice',
14                                     
15                                     FS::UI::Web::cust_header(), #'cust_main_custnum',
16                                   ],
17                  'fields' => [
18                                'event',
19                                sub { time2str("%b %d %Y %T", $_[0]->_date) },
20                                $status_sub,
21                                $trigger_sub,
22                                #sub {
23                                #      #my $cust_event = shift;
24                                #      'Invoice #'. $_[0]->invnum.
25                                #      ' ('.
26                                #        time2str("%D", $_[0]->cust_bill_date).
27                                #      ')';
28                                #    },
29                                \&FS::UI::Web::cust_fields,
30                              ],
31                 'align' => 'lrll'.FS::UI::Web::cust_aligns(),
32                 'links' => [
33                               '',
34                               '',
35                               '',
36                               $trigger_link,
37                               #sub {
38                               #  my $part_event = shift;
39                               #  #XXX
40                               #  my $template = $part_event->templatename;
41                               #  $template .= '-' if $template;
42                               #  [ "${p}view/cust_bill.cgi?$template", 'invnum'];
43                               #},
44
45                               ( map { $_ ne 'Cust. Status' ? $link_cust : '' }
46                                     FS::UI::Web::cust_header()
47                               ),
48                             ],
49                  'color' => [ 
50                               '',
51                               '',
52                               '',
53                               '',
54                               #'',
55                               FS::UI::Web::cust_colors(),
56                             ],
57                  'style' => [ 
58                               '',
59                               '',
60                               '',
61                               '',
62                               #'',
63                               FS::UI::Web::cust_styles(),
64                             ],
65 &>
66 <%once>
67
68 my $status_sub = sub { 
69   my $cust_event = shift;
70
71   my $status = $cust_event->status;
72   $status .= ': '. encode_entities($cust_event->statustext)
73     if $cust_event->statustext;
74
75   my $part_event = $cust_event->part_event;
76
77   if ( $part_event->eventtable eq 'cust_bill'
78        && ( $part_event->templatename || $part_event->option('notice_name') )
79      )
80   {
81     my $link = 'invnum='. $cust_event->tablenum;
82     $link .= ';template='. uri_escape($part_event->templatename)
83       if $part_event->templatename;
84     $link .= ';notice_name='. uri_escape($part_event->option('notice_name'))
85       if $part_event->option('notice_name');
86
87     my $conf = new FS::Conf;
88     my $cust_bill = $cust_event->cust_X;
89
90     $status .= qq{
91           ( <A HREF="${p}view/cust_bill.cgi?$link">view</A>
92           | <A HREF="${p}view/cust_bill-pdf.cgi?$link">view&nbsp;typeset</A>
93           | <A HREF="${p}misc/send-invoice.cgi?method=print;$link">re-print</A>
94     };
95
96     if ( grep { $_ ne 'POST' } $cust_bill->cust_main->invoicing_list ) { 
97       $status .= qq{
98             | <A HREF="${p}misc/send-invoice.cgi?method=email;$link">re-email</A>
99       };
100     } 
101    
102     if ( $conf->exists('hylafax') && length($cust_bill->cust_main->fax) ) { 
103       $status .= qq{
104             | <A HREF="${p}misc/send-invoice.cgi?method=fax;$link">re-fax</A>
105       }
106     } 
107
108     $status .= ' ) ';
109
110   }
111
112   $status;
113 };
114
115 my $trigger_sub = sub {
116   my $cust_event = shift;
117   my $eventtable = $cust_event->eventtable;
118   my $label = FS::part_event->eventtable_labels->{$eventtable};
119   #if ( $eventtable eq 'cust_pkg' || $eventtable eq 'cust_bill' ) {
120     "$label #". $cust_event->tablenum;
121   #} else {
122   #  $label;
123   #}
124 };
125
126 my $trigger_link = sub {
127   my $cust_event = shift;
128   my $eventtable = $cust_event->eventtable;
129   if ( $eventtable eq 'cust_pkg' ) {
130     my $custnum = $cust_event->cust_main_custnum;
131     my $show = $FS::CurrentUser::CurrentUser->default_customer_view =~ /^(jumbo|packages)$/
132                  ? ''
133                  : ';show=packages';
134     my $pkgnum = $cust_event->tablenum;
135     my $frag = "cust_pkg$pkgnum"; #hack for IE ignoring real #fragment
136     [ "${p}view/cust_main.cgi?custnum=$custnum$show;fragment=$frag#cust_pkg", 'tablenum' ];
137   } elsif ( $eventtable eq 'cust_pay' ) {
138     [ "${p}view/$eventtable.html?paynum=", 'tablenum' ];
139   } elsif ( $eventtable eq 'cust_statement' ) {
140     [ "${p}view/$eventtable.html?", 'tablenum' ];
141   } elsif ( $eventtable eq 'cust_pay_batch' ) {
142     [ "${p}search/cust_pay_batch.cgi?batchnum=", 'cust_pay_batch_batchnum' ];
143   } else {
144     [ "${p}view/$eventtable.cgi?", 'tablenum' ];
145   }
146 };
147
148 </%once>
149 <%shared>
150 my @scalars = qw( agentnum status custnum invnum pkgnum failed );
151 my @lists = qw( eventpart event_status );
152 my %search;
153 </%shared>
154 <%init>
155
156 my $curuser = $FS::CurrentUser::CurrentUser;
157
158 die "access denied"
159   unless $curuser->access_right('Billing event reports')
160       or $curuser->access_right('View customer billing events')
161          && (    $cgi->param('custnum') =~ /^(\d+)$/
162               || $cgi->param('invnum')  =~ /^(\d+)$/
163               || $cgi->param('pkgnum')  =~ /^(\d+)$/
164             );
165
166 my @statuses = $cgi->param('event_status');
167 my $title = 'Billing events';
168 if ( $statuses[0] eq 'failed' and !defined($statuses[1]) ) {
169   # tweak the title if we're showing only failed events
170   $title = 'Failed billing events';
171 }
172
173 for my $param (@scalars) {
174   $search{$param} = scalar( $cgi->param($param) )
175     if $cgi->param($param);
176 }
177
178 #lists
179 foreach my $param (@lists) {
180   $search{$param} = [ $cgi->param($param) ];
181 }
182
183 my($beginning, $ending) = FS::UI::Web::parse_beginning_ending($cgi);
184 $search{'beginning'} = $beginning;
185 $search{'ending'}    = $ending;
186
187 my $where = ' WHERE '. FS::cust_event->search_sql_where( \%search );
188
189 my $join = FS::cust_event->join_sql() .
190   # warning: does not show the true service address for package events.
191   # the query to do that would be painfully slow.
192   'LEFT JOIN cust_location bill_location '.
193   'ON (cust_main.bill_locationnum = bill_location.locationnum) '.
194   'LEFT JOIN cust_location ship_location '.
195   'ON (cust_main.ship_locationnum = ship_location.locationnum)'.
196   # include link to referral in case it's in cust-fields
197   #   (maybe we should be using FS::UI::Web::join_cust_main instead?)
198   'LEFT JOIN (select refnum, referral from part_referral) AS part_referral_x '.
199   'ON (cust_main.refnum = part_referral_x.refnum) ';
200
201 my $sql_query = {
202   'table'     => 'cust_event',
203   'select'    => join(', ',
204                     'cust_event.*',
205                     'part_event.*',
206                     #'cust_bill.custnum',
207                     #'cust_bill._date AS cust_bill_date',
208                     'cust_pay_batch.batchnum AS cust_pay_batch_batchnum',
209                     'cust_main.custnum AS cust_main_custnum',
210                     FS::UI::Web::cust_sql_fields(),
211                   ),
212   'hashref'   => {}, 
213   'extra_sql' => $where,
214   'order_by'  => 'ORDER BY _date ASC',
215   'addl_from' => $join,
216 };
217
218 my $count_sql = "SELECT COUNT(*) FROM cust_event $join $where";
219
220 my $conf = new FS::Conf;
221
222 my $menubar = [];
223
224 if ( $curuser->access_right('Resend invoices') ) {
225
226   push @$menubar, 'Re-print these events' =>
227                     "javascript:confirm_print_process()",
228                   'Re-email these events' =>
229                     "javascript:confirm_email_process()",
230                 ;
231
232   push @$menubar, 'Re-fax these events' =>
233                     "javascript:confirm_fax_process()"
234     if $conf->exists('hylafax');
235
236 }
237
238 my $link_cust = sub {
239   my $cust_event = shift;
240   $cust_event->cust_main_custnum
241     ? [ "${p}view/cust_main.cgi?", 'cust_main_custnum' ]
242     : '';
243 };
244
245 </%init>
246 <%def .init>
247 % # action is part of the target URL, don't need to pass it as a param
248 % foreach my $action (qw(print email fax)) {
249 <& /elements/progress-init.html,
250   $action.'_form',
251   [ @scalars, @lists, 'beginning', 'ending' ],
252   "../misc/${action}_events.cgi",
253   { 'message' => "Invoices re-${action}ed" }, #would be nice to show the number of them, but...
254   $action.'_', #key
255 &>
256 <FORM NAME="<% $action %>_form">
257 %   foreach my $param (@scalars, 'beginning', 'ending') {
258   <INPUT TYPE="hidden" NAME="<% $param %>" VALUE="<% $search{$param} |h %>">
259 %   }
260 %   foreach my $param (@lists) {
261 %     foreach my $value (@{ $search{$param} }) {
262   <INPUT TYPE="hidden" NAME="<% $param %>" VALUE="<% $value |h %>">
263 %     }
264 %   }
265 </FORM>
266 % } # foreach $action
267 <SCRIPT TYPE="text/javascript">
268
269 function confirm_print_process() {
270   if ( ! confirm("Are you sure you want to reprint these invoices?") ) {
271     return;
272   }
273   print_process();
274 }
275 function confirm_email_process() {
276   if ( ! confirm("Are you sure you want to re-email these invoices?") ) {
277     return;
278   }
279   email_process();
280 }
281 function confirm_fax_process() {
282   if ( ! confirm("Are you sure you want to re-fax these invoices?") ) {
283     return;
284   }
285   fax_process();
286 }
287 </SCRIPT>
288 </%def>