& elements/search.html, 'title' => $title, 'html_init' => include('.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' ]; } elsif ( $eventtable eq 'cust_pay' ) { [ "${p}view/$eventtable.html?paynum=", 'tablenum' ]; } elsif ( $eventtable eq 'cust_statement' ) { [ "${p}view/$eventtable.html?", 'tablenum' ]; } elsif ( $eventtable eq 'cust_pay_batch' ) { [ "${p}search/cust_pay_batch.cgi?batchnum=", 'cust_pay_batch_batchnum' ]; } else { [ "${p}view/$eventtable.cgi?", 'tablenum' ]; } }; %once> <%shared> my @scalars = qw( agentnum status custnum invnum pkgnum failed ); my @lists = qw( eventpart event_status ); my %search; %shared> <%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 @statuses = $cgi->param('event_status'); my $title = 'Billing events'; if ( $statuses[0] eq 'failed' and !defined($statuses[1]) ) { # tweak the title if we're showing only failed events $title = 'Failed billing events'; } for my $param (@scalars) { $search{$param} = scalar( $cgi->param($param) ) if $cgi->param($param); } #lists 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() . # warning: does not show the true service address for package events. # the query to do that would be painfully slow. '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)'. # include link to referral in case it's in cust-fields # (maybe we should be using FS::UI::Web::join_cust_main instead?) 'LEFT JOIN (select refnum, referral from part_referral) AS part_referral_x '. 'ON (cust_main.refnum = part_referral_x.refnum) '; my $sql_query = { 'table' => 'cust_event', 'select' => join(', ', 'cust_event.*', 'part_event.*', #'cust_bill.custnum', #'cust_bill._date AS cust_bill_date', 'cust_pay_batch.batchnum AS cust_pay_batch_batchnum', '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 $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> <%def .init> % # action is part of the target URL, don't need to pass it as a param % foreach my $action (qw(print email fax)) { <& /elements/progress-init.html, $action.'_form', [ @scalars, @lists, 'beginning', 'ending' ], "../misc/${action}_events.cgi", { 'message' => "Invoices re-${action}ed" }, #would be nice to show the number of them, but... $action.'_', #key &>
% } # foreach $action %def>