} else {
$part_bill_event ||= new FS::part_bill_event {};
}
-$action ||= $part_bill_event->pkgpart ? 'Edit' : 'Add';
+$action ||= $part_bill_event->eventpart ? 'Edit' : 'Add';
my $hashref = $part_bill_event->hashref;
print header("$action Invoice Event Definition", menubar(
<TR><TD ALIGN="right">Payby</TD><TD><SELECT NAME="payby">
END
-for (qw(CARD BILL COMP)) {
+for (qw(CARD DCRD CHEK DCHK LECB BILL COMP)) {
print qq!<OPTION VALUE="$_"!;
if ($part_bill_event->payby eq $_) {
print " SELECTED>$_</OPTION>";
#print ntable();
+sub select_pkgpart {
+ my $label = shift;
+ my $plandata = shift;
+ my %selected = map { $_=>1 } split(/,\s*/, $plandata->{$label});
+ qq(<SELECT NAME="$label" MULTIPLE>).
+ join("\n", map {
+ '<OPTION VALUE="'. $_->pkgpart. '"'.
+ ( $selected{$_->pkgpart} ? ' SELECTED' : '' ).
+ '>'. $_->pkg. ' - '. $_->comment
+ } qsearch('part_pkg', { 'disabled' => '' } ) ).
+ '</SELECT>';
+}
+
+sub select_agentnum {
+ my $plandata = shift;
+ #my $agentnum = $plandata->{'agentnum'};
+ my %agentnums = map { $_=>1 } split(/,\s*/, $plandata->{'agentnum'});
+ '<SELECT NAME="agentnum" MULTIPLE>'.
+ join("\n", map {
+ '<OPTION VALUE="'. $_->agentnum. '"'.
+ ( $agentnums{$_->agentnum} ? ' SELECTED' : '' ).
+ '>'. $_->agent
+ } qsearch('agent', { 'disabled' => '' } ) ).
+ '</SELECT>';
+}
+
#this is pretty kludgy right here.
tie my %events, 'Tie::IxHash',
'code' => '$cust_main->suspend();',
'weight' => 10,
},
+ 'suspend-if-pkgpart' => {
+ 'name' => 'Suspend packages',
+ 'code' => '$cust_main->suspend_if_pkgpart(%%%if_pkgpart%%%);',
+ 'html' => sub { &select_pkgpart('if_pkgpart', @_) },
+ 'weight' => 10,
+ },
+ 'suspend-unless-pkgpart' => {
+ 'name' => 'Suspend packages except',
+ 'code' => '$cust_main->suspend_unless_pkgpart(%%%unless_pkgpart%%%);',
+ 'html' => sub { &select_pkgpart('unless_pkgpart', @_) },
+ 'weight' => 10,
+ },
'cancel' => {
'name' => 'Cancel',
'code' => '$cust_main->cancel();',
'weight' => 30,
},
- 'realtime-card-cybercash' => {
- 'name' => '(<b>deprecated</b>) Run card with <a href="http://www.cybercash.com/cashregister">CyberCash CashRegister</a> realtime gateway',
- 'code' => '$cust_bill->realtime_card_cybercash();',
+ 'realtime-check' => {
+ 'name' => 'Run check with a <a href="http://search.cpan.org/search?mode=module&query=Business%3A%3AOnlinePayment">Business::OnlinePayment</a> realtime gateway',
+ 'code' => '$cust_bill->realtime_ach();',
+ 'weight' => 30,
+ },
+
+ 'realtime-lec' => {
+ 'name' => 'Run phone bill ("LEC") billing with a <a href="http://search.cpan.org/search?mode=module&query=Business%3A%3AOnlinePayment">Business::OnlinePayment</a> realtime gateway',
+ 'code' => '$cust_bill->realtime_lec();',
'weight' => 30,
},
'weight' => 50,
},
+ 'send_alternate' => {
+ 'name' => 'Send invoice (email/print) with alternate template',
+ 'code' => '$cust_bill->send(\'%%%templatename%%%\');',
+ 'html' =>
+ '<INPUT TYPE="text" NAME="templatename" VALUE="%%%templatename%%%">',
+ 'weight' => 50,
+ },
+
+ 'send_if_newest' => {
+ 'name' => 'Send invoice (email/print) 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' =>
+ '<INPUT TYPE="text" NAME="if_newest_templatename" VALUE="%%%if_newest_templatename%%%">',
+ 'weight' => 50,
+ },
+
+ 'send_agent' => {
+ 'name' => 'Send invoice (email/print) ',
+ 'code' => '$cust_bill->send(\'%%%agent_templatename%%%\', [ %%%agentnum%%% ], \'%%%agent_invoice_from%%%\');',
+ 'html' => sub {
+ '<TABLE BORDER=0>
+ <TR>
+ <TD ALIGN="right">only for agent(s) </TD>
+ <TD>'. &select_agentnum(@_). '</TD>
+ </TR>
+ <TR>
+ <TD ALIGN="right">with template </TD>
+ <TD>
+ <INPUT TYPE="text" NAME="agent_templatename" VALUE="%%%agent_templatename%%%">
+ </TD>
+ </TR>
+ <TR>
+ <TD ALIGN="right">email From: </TD>
+ <TD>
+ <INPUT TYPE="text" NAME="agent_invoice_from" VALUE="%%%agent_invoice_from%%%">
+ </TD>
+ </TR>
+ </TABLE>';
+ },
+ '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' =>
+ '<TABLE BORDER=0>'.
+ '<TR><TD ALIGN="right">Format ("default" or "billco"): </TD>'.
+ '<TD>'.
+ '<!--'.
+ '<SELECT NAME="ftpformat">'.
+ '<OPTION VALUE="default">Default'.
+ '<OPTION VALUE="billco">Billco'.
+ '</SELECT>'.
+ '-->'.
+ '<INPUT TYPE="text" NAME="ftpformat" VALUE="%%%ftpformat%%%">'.
+ '</TD></TR>'.
+ '<TR><TD ALIGN="right">FTP server: </TD>'.
+ '<TD><INPUT TYPE="text" NAME="ftpserver" VALUE="%%%ftpserver%%%">'.
+ '</TD></TR>'.
+ '<TR><TD ALIGN="right">FTP username: </TD><TD>'.
+ '<INPUT TYPE="text" NAME="ftpusername" VALUE="%%%ftpusername%%%">'.
+ '</TD></TR>'.
+ '<TR><TD ALIGN="right">FTP password: </TD><TD>'.
+ '<INPUT TYPE="text" NAME="ftppassword" VALUE="%%%ftppassword%%%">'.
+ '</TD></TR>'.
+ '<TR><TD ALIGN="right">FTP directory: </TD>'.
+ '<TD><INPUT TYPE="text" NAME="ftpdir" VALUE="%%%ftpdir%%%">'.
+ '</TD></TR>'.
+ '</TABLE>',
+ 'weight' => 50,
+ },
+
+ 'spool_csv' => {
+ 'name' => 'Spool CSV invoice data',
+ 'code' => '$cust_bill->spool_csv(
+ \'format\' => \'%%%spoolformat%%%\',
+ \'dest\' => \'%%%spooldest%%%\',
+ \'agent_spools\' => \'%%%spoolagent_spools%%%\',
+ );',
+ 'html' => sub {
+ my $plandata = shift;
+
+ my $html =
+ '<TABLE BORDER=0>'.
+ '<TR><TD ALIGN="right">Format: </TD>'.
+ '<TD>'.
+ '<SELECT NAME="spoolformat">';
+
+ foreach my $option (qw( default billco )) {
+ $html .= qq(<OPTION VALUE="$option");
+ $html .= ' SELECTED' if $option eq $plandata->{'spoolformat'};
+ $html .= ">\u$option";
+ }
+
+ $html .=
+ '</SELECT>'.
+ '</TD></TR>'.
+ '<TR><TD ALIGN="right">For destination: </TD>'.
+ '<TD>'.
+ '<SELECT NAME="spooldest">';
+
+ tie my %dest, 'Tie::IxHash',
+ '' => '(all)',
+ 'POST' => 'Postal Mail',
+ 'EMAIL' => 'Email',
+ 'FAX' => 'Fax',
+ ;
+
+ foreach my $dest (keys %dest) {
+ $html .= qq(<OPTION VALUE="$dest");
+ $html .= ' SELECTED' if $dest eq $plandata->{'spooldest'};
+ $html .= '>'. $dest{$dest};
+ }
+
+ $html .=
+ '</SELECT>'.
+ '</TD></TR>'.
+ '<TR><TD ALIGN="right">Individual per-agent spools? </TD>'.
+ '<TD><INPUT TYPE="checkbox" NAME="spoolagent_spools" VALUE="1" '.
+ ( $plandata->{'spoolagent_spools'} ? 'CHECKED' : '' ).
+ '>'.
+ '</TD></TR>'.
+ '</TABLE>';
+
+ $html;
+ },
+ 'weight' => 50,
+ },
+
'bill' => {
'name' => 'Generate invoices (normally only used with a <i>Late Fee</i> event)',
'code' => '$cust_main->bill();',
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}/;