% include( '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 .= ': '.$cust_event->statustext if $cust_event->statustext; my $part_event = $cust_event->part_event; if ( $part_event->eventtable eq 'cust_bill' && $part_event->templatename ) { my $alt_templatename = $part_event->templatename; my $alt_link = "$alt_templatename-". $cust_event->tablenum; 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 = (); if ( $cgi->param('agentnum') && $cgi->param('agentnum') =~ /^(\d+)$/ ) { push @search, "cust_main.agentnum = $1"; #my $agent = qsearchs('agent', { 'agentnum' => $1 } ); #die "unknown agentnum $1" unless $agent; } my($beginning, $ending) = FS::UI::Web::parse_beginning_ending($cgi); push @search, "cust_event._date >= $beginning", "cust_event._date <= $ending"; if ( $cgi->param('failed') ) { push @search, "statustext != ''", "statustext IS NOT NULL", "statustext != 'N/A'"; } #if ( $cgi->param('part_event.payby') =~ /^(\w+)$/ ) { # push @search, "part_event.payby = '$1'"; #} if ( $cgi->param('custnum') =~ /^(\d+)$/ ) { push @search, "cust_main.custnum = '$1'"; } if ( $cgi->param('invnum') =~ /^(\d+)$/ ) { push @search, "part_event.eventtable = 'cust_bill'", "tablenum = '$1'"; } if ( $cgi->param('pkgnum') =~ /^(\d+)$/ ) { push @search, "part_event.eventtable = 'cust_pkg'", "tablenum = '$1'"; } #here is the agent virtualization push @search, $curuser->agentnums_sql( 'table' => 'cust_main' ); my $where = 'WHERE '. join(' AND ', @search ); my $join = " JOIN part_event USING ( eventpart ) LEFT JOIN cust_bill ON ( eventtable = 'cust_bill' AND tablenum = invnum ) LEFT JOIN cust_pkg ON ( eventtable = 'cust_pkg' AND tablenum = pkgnum ) LEFT JOIN cust_main ON ( ( eventtable = 'cust_main' AND tablenum = cust_main.custnum ) OR ( eventtable = 'cust_bill' AND cust_bill.custnum = cust_main.custnum ) OR ( eventtable = 'cust_pkg' AND cust_pkg.custnum = cust_main.custnum ) ) "; #'LEFT JOIN cust_main USING ( custnum ) '; 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 _date ASC", 'addl_from' => $join, }; my $count_sql = "SELECT COUNT(*) FROM cust_event $join $where"; my $conf = new FS::Conf; my $failed = $cgi->param('failed'); my $html_init = join("\n", map { ( my $action = $_ ) =~ s/_$//; include('/elements/progress-init.html', $_.'form', [ 'action', 'beginning', 'ending', 'failed' ], "../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>