% % %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; % % <% include('/elements/header.html', "$action Invoice Event Definition", menubar( 'Main Menu' => popurl(2), 'View all invoice events' => popurl(2). 'browse/part_bill_event.cgi', ) ) %> % if ( $cgi->param('error') ) { Error: <% $cgi->param('error') %> % }
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'}); % ''; %} % %my $conf = new FS::Conf; %my $money_char = $conf->config('money_char') || '$'; % %#this is pretty kludgy right here. %tie my %events, 'Tie::IxHash', % % 'fee' => { % 'name' => 'Late fee (flat)', % 'code' => '$cust_main->charge( %%%charge%%%, \'%%%reason%%%\' );', % 'html' => % 'Amount '. % '
Reason ', % 'weight' => 10, % }, % 'fee_percent' => { % 'name' => 'Late fee (percentage)', % 'code' => '$cust_main->charge( sprintf(\'%.2f\', $cust_bill->owed * %%%percent%%% / 100 ), \'%%%reason%%%\' );', % 'html' => % 'Percent %'. % '
Reason ', % 'weight' => 10, % }, % 'suspend' => { % 'name' => 'Suspend', % 'code' => '$cust_main->suspend(reason => %%%sreason%%%);', % '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%%%, );', % 'html' => " $money_char ". '', % 'weight' => 10, % 'reason' => 'S', % }, % 'suspend-if-pkgpart' => { % 'name' => 'Suspend packages', % 'code' => '$cust_main->suspend_if_pkgpart({pkgparts => [%%%if_pkgpart%%%,], reason => %%%sreason%%%,});', % 'html' => sub { &select_pkgpart('if_pkgpart', @_) }, % 'weight' => 10, % 'reason' => 'S', % }, % 'suspend-unless-pkgpart' => { % 'name' => 'Suspend packages except', % 'code' => '$cust_main->suspend_unless_pkgpart({unless_pkgpart => [%%%unless_pkgpart%%%], reason => %%%sreason%%%,});', % 'html' => sub { &select_pkgpart('unless_pkgpart', @_) }, % 'weight' => 10, % 'reason' => 'S', % }, % 'cancel' => { % 'name' => 'Cancel', % 'code' => '$cust_main->cancel(reason => %%%creason%%%);', % 'weight' => 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' => 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, \'%%%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%%%\');', % 'html' => sub { % ' % % % % % % % % % % % % %
only for agent(s) '. &select_agentnum(@_). '
with template % %
email From: % %
'; % }, % '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, % }, % % 'collect' => { % 'name' => 'Collect on invoices (normally only used with a Late Fee and Generate Invoice events)', % 'code' => '$cust_main->collect();', % 'weight' => 80, % }, % %; % %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 ''; %} % % 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!!; %