& elements/search.html, 'title' => $title, 'html_init' => $html_init, 'menubar' => $menubar, 'name' => 'billing events', 'query' => $sql_query, 'count_query' => $count_sql, 'header' => [ 'Event', 'Date', 'Status', 'Trigger', #'Inv #', 'Inv Date', 'Cust #', #'Invoice', FS::UI::Web::cust_header(), #'cust_main_custnum', ], 'fields' => [ 'event', sub { time2str("%b %d %Y %T", $_[0]->_date) }, $status_sub, $trigger_sub, #sub { # #my $cust_event = shift; # 'Invoice #'. $_[0]->invnum. # ' ('. # time2str("%D", $_[0]->cust_bill_date). # ')'; # }, \&FS::UI::Web::cust_fields, ], 'align' => 'lrll'.FS::UI::Web::cust_aligns(), 'links' => [ '', '', '', $trigger_link, #sub { # my $part_event = shift; # #XXX # my $template = $part_event->templatename; # $template .= '-' if $template; # [ "${p}view/cust_bill.cgi?$template", 'invnum']; #}, ( map { $_ ne 'Cust. Status' ? $link_cust : '' } FS::UI::Web::cust_header() ), ], 'color' => [ '', '', '', '', #'', FS::UI::Web::cust_colors(), ], 'style' => [ '', '', '', '', #'', FS::UI::Web::cust_styles(), ], &> <%once> my $status_sub = sub { my $cust_event = shift; my $status = $cust_event->status; $status .= ': '. encode_entities($cust_event->statustext) if $cust_event->statustext; my $part_event = $cust_event->part_event; if ( $part_event->eventtable eq 'cust_bill' && ( $part_event->templatename || $part_event->option('notice_name') ) ) { my $link = 'invnum='. $cust_event->tablenum; $link .= ';template='. uri_escape($part_event->templatename) if $part_event->templatename; $link .= ';notice_name='. uri_escape($part_event->option('notice_name')) if $part_event->option('notice_name'); my $conf = new FS::Conf; my $cust_bill = $cust_event->cust_X; $status .= qq{ ( view | view typeset | re-print }; if ( grep { $_ ne 'POST' } $cust_bill->cust_main->invoicing_list ) { $status .= qq{ | re-email }; } if ( $conf->exists('hylafax') && length($cust_bill->cust_main->fax) ) { $status .= qq{ | re-fax } } $status .= ' ) '; } $status; }; my $trigger_sub = sub { my $cust_event = shift; my $eventtable = $cust_event->eventtable; my $label = FS::part_event->eventtable_labels->{$eventtable}; #if ( $eventtable eq 'cust_pkg' || $eventtable eq 'cust_bill' ) { "$label #". $cust_event->tablenum; #} else { # $label; #} }; my $trigger_link = sub { my $cust_event = shift; my $eventtable = $cust_event->eventtable; if ( $eventtable eq 'cust_pkg' ) { my $custnum = $cust_event->cust_main_custnum; my $show = $FS::CurrentUser::CurrentUser->default_customer_view =~ /^(jumbo|packages)$/ ? '' : ';show=packages'; my $pkgnum = $cust_event->tablenum; my $frag = "cust_pkg$pkgnum"; #hack for IE ignoring real #fragment [ "${p}view/cust_main.cgi?custnum=$custnum$show;fragment=$frag#cust_pkg", 'tablenum' ]; } else { [ "${p}view/$eventtable.cgi?", 'tablenum' ]; } }; %once> <%init> my $curuser = $FS::CurrentUser::CurrentUser; die "access denied" unless $curuser->access_right('Billing event reports') or $curuser->access_right('View customer billing events') && ( $cgi->param('custnum') =~ /^(\d+)$/ || $cgi->param('invnum') =~ /^(\d+)$/ || $cgi->param('pkgnum') =~ /^(\d+)$/ ); my $title = $cgi->param('failed') ? 'Failed billing events' : 'Billing events'; my %search = (); my @scalars = qw( agentnum status custnum invnum pkgnum failed ); for my $param (@scalars) { $search{$param} = scalar( $cgi->param($param) ) if $cgi->param($param); } #lists my @lists = qw( payby eventpart ); foreach my $param (@lists) { $search{$param} = [ $cgi->param($param) ]; } my($beginning, $ending) = FS::UI::Web::parse_beginning_ending($cgi); $search{'beginning'} = $beginning; $search{'ending'} = $ending; my $where = ' WHERE '. FS::cust_event->search_sql_where( \%search ); my $join = FS::cust_event->join_sql() . 'LEFT JOIN cust_location bill_location '. 'ON (cust_main.bill_locationnum = bill_location.locationnum) '. 'LEFT JOIN cust_location ship_location '. 'ON (cust_main.ship_locationnum = ship_location.locationnum)'; # warning: does not show the true service address for package events. # the query to do that would be painfully slow. my $sql_query = { 'table' => 'cust_event', 'select' => join(', ', 'cust_event.*', 'part_event.*', #'cust_bill.custnum', #'cust_bill._date AS cust_bill_date', 'cust_main.custnum AS cust_main_custnum', FS::UI::Web::cust_sql_fields(), ), 'hashref' => {}, 'extra_sql' => $where, 'order_by' => 'ORDER BY _date ASC', 'addl_from' => $join, 'debug' => 2, }; my $count_sql = "SELECT COUNT(*) FROM cust_event $join $where"; my $conf = new FS::Conf; my @params = ( @scalars, qw( beginning ending ) ); my $html_init = join("\n", map { ( my $action = $_ ) =~ s/_$//; include('/elements/progress-init.html', $_.'form', [ 'action', @params ], "../misc/${_}events.cgi", { 'message' => "Invoices re-${action}ed" }, #would be nice to show the number of them, but... $_, #key ), qq!
! } qw( print_ email_ fax_ ) ). ''; my $menubar = []; if ( $curuser->access_right('Resend invoices') ) { push @$menubar, 'Re-print these events' => "javascript:confirm_print_process()", 'Re-email these events' => "javascript:confirm_email_process()", ; push @$menubar, 'Re-fax these events' => "javascript:confirm_fax_process()" if $conf->exists('hylafax'); } my $link_cust = sub { my $cust_event = shift; $cust_event->cust_main_custnum ? [ "${p}view/cust_main.cgi?", 'cust_main_custnum' ] : ''; }; %init>