<% include('/elements/header.html', "$action Invoice Event Definition", menubar( 'View all invoice events' => popurl(2). 'browse/part_bill_event.cgi', ) ) %> <% include('/elements/error.html') %>
Invoice Event #<% $hashref->{eventpart} ? $hashref->{eventpart} : "(NEW)" %> <% ntable("#cccccc",2) %> Event name For customers % my $days = $hashref->{seconds}/86400; After days Test event Disabled {disabled} eq 'Y' ? ' CHECKED' : '' %>> Action % % %#print ntable(); % %sub select_pkgpart { % my $label = shift; % my $plandata = shift; % my %selected = map { $_=>1 } split(/,\s*/, $plandata->{$label}); % qq('; %} % %sub select_agentnum { % my $plandata = shift; % #my $agentnum = $plandata->{'agentnum'}; % my %agentnums = map { $_=>1 } split(/,\s*/, $plandata->{'agentnum'}); % ''; %} % %sub honor_dundate { % my $label = shift; % my $plandata = shift; % ''. % ''. % qq('. % '
Allow delay until dun date? {$label} eq "$label => 1," ? 'CHECKED' : '' ). % '>'. % '
' %} % %my $conf = new FS::Conf; %my $money_char = $conf->config('money_char') || '$'; % %my $late_taxclass = ''; %my $late_percent_taxclass = ''; %if ( $conf->exists('enable_taxclasses') ) { % $late_taxclass = % '
Taxclass '. % include('/elements/select-taxclass.html', % 'curr_value' => '%%%late_taxclass%%%', % 'name' => 'late_taxclass' ); % $late_percent_taxclass = % '
Taxclass '. % include('/elements/select-taxclass.html', % 'curr_value' => '%%%late_percent_taxclass%%%', % 'name' => 'late_percent_taxclass' ); %} % %#this is pretty kludgy right here. %tie my %events, 'Tie::IxHash', % % 'fee' => { % 'name' => 'Late fee (flat)', % 'code' => '$cust_main->charge( %%%charge%%%, \'%%%reason%%%\', \'$%%%charge%%%\', \'%%%late_taxclass%%%\' );', % 'html' => % 'Amount '. % '
Reason '. % $late_taxclass, % 'weight' => 10, % }, % 'fee_percent' => { % 'name' => 'Late fee (percentage)', % 'code' => '$cust_main->charge( sprintf(\'%.2f\', $cust_bill->owed * %%%percent%%% / 100 ), \'%%%percent_reason%%%\', \'%%%percent%%% percent\', \'%%%late_percent_taxclass%%%\' );', % 'html' => % 'Percent %'. % '
Reason '. % $late_percent_taxclass, % 'weight' => 10, % }, % 'suspend' => { % 'name' => 'Suspend', % 'code' => '$cust_main->suspend(reason => %%%sreason%%%, %%%honor_dundate%%% );', % 'html' => sub { &honor_dundate('honor_dundate', @_) }, % 'weight' => 10, % 'reason' => 'S', % }, % 'suspend-if-balance' => { % 'name' => 'Suspend if balance (this invoice and previous) over', % 'code' => '$cust_bill->cust_suspend_if_balance_over( %%%balanceover%%%, reason => %%%sreason%%%, %%%balance_honor_dundate%%% );', % 'html' => sub { " $money_char ". ' '. &honor_dundate('balance_honor_dundate', @_) }, % 'weight' => 10, % 'reason' => 'S', % }, % 'suspend-if-pkgpart' => { % 'name' => 'Suspend packages', % 'code' => '$cust_main->suspend_if_pkgpart({pkgparts => [%%%if_pkgpart%%%,], reason => %%%sreason%%%, %%%if_pkgpart_honor_dundate%%% });', % 'html' => sub { &select_pkgpart('if_pkgpart', @_). &honor_dundate('if_pkgpart_honor_dundate', @_) }, % 'weight' => 10, % 'reason' => 'S', % }, % 'suspend-unless-pkgpart' => { % 'name' => 'Suspend packages except', % 'code' => '$cust_main->suspend_unless_pkgpart({unless_pkgpart => [%%%unless_pkgpart%%%], reason => %%%sreason%%%, %%%unless_pkgpart_honor_dundate%%% });', % 'html' => sub { &select_pkgpart('unless_pkgpart', @_). &honor_dundate('unless_pkgpart_honor_dundate' => @_) }, % 'weight' => 10, % 'reason' => 'S', % }, % 'cancel' => { % 'name' => 'Cancel', % 'code' => '$cust_main->cancel(reason => %%%creason%%%);', % 'weight' => 80, #10, % 'reason' => 'C', % }, % % 'addpost' => { % 'name' => 'Add postal invoicing', % 'code' => '$cust_main->invoicing_list_addpost(); "";', % 'weight' => 20, % }, % % 'comp' => { % 'name' => 'Pay invoice with a complimentary "payment"', % 'code' => '$cust_bill->comp();', % 'weight' => 90, #30, % }, % % 'credit' => { % 'name' => "Create and apply a credit for the customer's balance (i.e. write off as bad debt)", % 'code' => '$cust_main->credit( $cust_main->balance, \'%%%credit_reason%%%\' );', % 'html' => '', % 'weight' => 30, % }, % % 'realtime-card' => { % 'name' => 'Run card with a Business::OnlinePayment realtime gateway', % 'code' => '$cust_bill->realtime_card();', % 'weight' => 30, % }, % % 'realtime-check' => { % 'name' => 'Run check with a Business::OnlinePayment realtime gateway', % 'code' => '$cust_bill->realtime_ach();', % 'weight' => 30, % }, % % 'realtime-lec' => { % 'name' => 'Run phone bill ("LEC") billing with a Business::OnlinePayment realtime gateway', % 'code' => '$cust_bill->realtime_lec();', % 'weight' => 30, % }, % % 'batch-card' => { % 'name' => 'Add card or check to a pending batch', % 'code' => '$cust_bill->batch_card(%options);', % 'weight' => 40, % }, % % % #'retriable' => { % # 'name' => 'Mark batched card event as retriable', % # 'code' => '$cust_pay_batch->retriable();', % # 'weight' => 60, % #}, % % 'send' => { % 'name' => 'Send invoice (email/print/fax)', % 'code' => '$cust_bill->send();', % 'weight' => 50, % }, % % 'send_email' => { % 'name' => 'Send invoice (email only)', % 'code' => '$cust_bill->email();', % 'weight' => 50, % }, % % 'send_alternate' => { % 'name' => 'Send invoice (email/print/fax) with alternate template', % 'code' => '$cust_bill->send(\'%%%templatename%%%\');', % 'html' => % '', % 'weight' => 50, % }, % % 'send_if_newest' => { % 'name' => 'Send invoice (email/print/fax) with alternate template, if it is still the newest invoice (useful for late notices - set to 31 days or later)', % 'code' => '$cust_bill->send_if_newest(\'%%%if_newest_templatename%%%\');', % 'html' => % '', % 'weight' => 50, % }, % % 'send_agent' => { % 'name' => 'Send invoice (email/print/fax) ', % 'code' => '$cust_bill->send( \'%%%agent_templatename%%%\', % [ %%%agentnum%%% ], % \'%%%agent_invoice_from%%%\', % %%%agent_balanceover%%% % );', % 'html' => sub { % ' % % % % % % % % % % % % % % % % %
only for agent(s) '. &select_agentnum(@_). '
with template % %
email From: % %
if balance (this invoice and previous) over % % '. $money_char. ' %
'; % }, % 'weight' => 50, % }, % % 'send_csv_ftp' => { % 'name' => 'Upload CSV invoice data to an FTP server', % 'code' => '$cust_bill->send_csv( protocol => \'ftp\', % server => \'%%%ftpserver%%%\', % username => \'%%%ftpusername%%%\', % password => \'%%%ftppassword%%%\', % dir => \'%%%ftpdir%%%\', % \'format\' => \'%%%ftpformat%%%\', % );', % 'html' => % ''. % ''. % ''. % ''. % ''. % ''. % ''. % ''. % ''. % '
Format ("default" or "billco"): '. % ''. % ''. % '
FTP server: '. % '
FTP username: '. % ''. % '
FTP password: '. % ''. % '
FTP directory: '. % '
', % 'weight' => 50, % }, % % 'spool_csv' => { % 'name' => 'Spool CSV invoice data', % 'code' => '$cust_bill->spool_csv( % \'format\' => \'%%%spoolformat%%%\', % \'dest\' => \'%%%spooldest%%%\', % \'balanceover\' => \'%%%spoolbalanceover%%%\', % \'agent_spools\' => \'%%%spoolagent_spools%%%\', % );', % 'html' => sub { % my $plandata = shift; % % my $html = % ''. % ''. % ''. % ''. % ''. % % ''. % ''. % ''. % ''. % ''. % '
Format: '. % ''. % '
For destination: '. % ''. % '
if balance (this invoice and previous) over '. % "$money_char ". % ''. % '
Individual per-agent spools? {'spoolagent_spools'} ? 'CHECKED' : '' ). % '>'. % '
'; % % $html; % }, % 'weight' => 50, % }, % % 'bill' => { % 'name' => 'Generate invoices (normally only used with a Late Fee event)', % 'code' => '$cust_main->bill();', % 'weight' => 60, % }, % % 'apply' => { % 'name' => 'Apply unapplied payments and credits', % 'code' => '$cust_main->apply_payments_and_credits; "";', % 'weight' => 70, % }, % %; % %foreach my $event ( keys %events ) { % my %plandata = map { /^(\w+) (.*)$/; ($1, $2); } % split(/\n/, $part_bill_event->plandata); % my $html = $events{$event}{html}; % if ( ref($html) eq 'CODE' ) { % $html = &{$html}(\%plandata); % } % while ( $html =~ /%%%(\w+)%%%/ ) { % my $field = $1; % $html =~ s/%%%$field%%%/$plandata{$field}/; % } % % if ($event eq $part_bill_event->plan){ % $currentreasonclass=$events{$event}{reason}; % } % print ntable( "#cccccc", 2). % qq!plan; % print qq!onClick="showhide_table()" !; % print qq!VALUE="!. $event. ":". $events{$event}{weight}. ":". % encode_entities($events{$event}{code}). % qq!">$events{$event}{name}!; % print ''. $html. '' if $html; % print qq!!; % print ''; % print qq!
!; %} % % if ($currentreasonclass eq 'C'){ % if ($cgi->param('creason') =~ /^(-?\d+)$/){ % $creason = $1; % }else{ % $creason = $part_bill_event->reason; % } % if ($cgi->param('newcreasonT') =~ /^(\d+)$/){ % $newcreasonT = $1; % } % if ($cgi->param('newcreason') =~ /^([\w\s]+)$/){ % $newcreason = $1; % } % }elsif ($currentreasonclass eq 'S'){ % if ($cgi->param('sreason') =~ /^(-?\d+)$/){ % $sreason = $1; % }else{ % $sreason = $part_bill_event->reason; % } % if ($cgi->param('newsreasonT') =~ /^(\d+)$/){ % $newsreasonT = $1; % } % if ($cgi->param('newsreason') =~ /^([\w\s]+)$/){ % $newsreason = $1; % } % } %
<% include('/elements/tr-select-reason.html', 'field' => 'creason', 'reason_class' => 'C', 'curr_value' => $creason, 'init_type' => $newcreasonT, 'init_newreason' => $newcreason ) %>
<% include('/elements/tr-select-reason.html', 'field' => 'sreason', 'reason_class' => 'S', 'curr_value' => $sreason, 'init_type' => $newsreasonT, 'init_newreason' => $newsreason ) %>
% %print qq!!; %
<% include('/elements/footer.html') %> <%init> die "access denied" unless $FS::CurrentUser::CurrentUser->access_right('Configuration'); if ( $cgi->param('eventpart') && $cgi->param('eventpart') =~ /^(\d+)$/ ) { $cgi->param('eventpart', $1); } else { $cgi->param('eventpart', ''); } my ($creason, $newcreasonT, $newcreason); my ($sreason, $newsreasonT, $newsreason); my ($query) = $cgi->keywords; my $action = ''; my $part_bill_event = ''; my $currentreasonclass = ''; if ( $cgi->param('error') ) { $part_bill_event = new FS::part_bill_event ( { map { $_, scalar($cgi->param($_)) } fields('part_bill_event') } ); } if ( $query && $query =~ /^(\d+)$/ ) { $part_bill_event ||= qsearchs('part_bill_event',{'eventpart'=>$1}); } else { $part_bill_event ||= new FS::part_bill_event {}; } $action ||= $part_bill_event->eventpart ? 'Edit' : 'Add'; my $hashref = $part_bill_event->hashref;