package FS::cust_bill;
use strict;
-use vars qw( @ISA $conf $invoice_template $money_char );
+use vars qw( @ISA $conf $money_char );
use vars qw( $lpr $invoice_from $smtpmachine );
use vars qw( $processor );
use vars qw( $xaction $E_NoErr );
use FS::cust_pkg;
use FS::cust_credit_bill;
use FS::cust_pay_batch;
+use FS::cust_bill_event;
@ISA = qw( FS::Record );
$money_char = $conf->config('money_char') || '$';
- my @invoice_template = $conf->config('invoice_template')
- or die "cannot load config file invoice_template";
- $invoice_lines = 0;
- foreach ( grep /invoice_lines\(\d+\)/, @invoice_template ) { #kludgy
- /invoice_lines\((\d+)\)/;
- $invoice_lines += $1;
- }
- die "no invoice_lines() functions in template?" unless $invoice_lines;
- $invoice_template = new Text::Template (
- TYPE => 'ARRAY',
- SOURCE => [ map "$_\n", @invoice_template ],
- ) or die "can't create new Text::Template object: $Text::Template::ERROR";
- $invoice_template->compile()
- or die "can't compile template: $Text::Template::ERROR";
-
$lpr = $conf->config('lpr');
$invoice_from = $conf->config('invoice_from');
$smtpmachine = $conf->config('smtpmachine');
qsearch( 'cust_bill_pkg', { 'invnum' => $self->invnum } );
}
+=item cust_bill_event
+
+Returns the completed invoice events (see L<FS::cust_bill_event>) for this
+invoice.
+
+=cut
+
+sub cust_bill_event {
+ my $self = shift;
+ qsearch( 'cust_bill_event', { 'invnum' => $self->invnum } );
+}
+
+
=item cust_main
Returns the customer (see L<FS::cust_main>) for this invoice.
=cut
sub send {
- my $self = shift;
+ my($self,$template) = @_;
#my @print_text = $cust_bill->print_text; #( date )
my @invoicing_list = $self->cust_main->invoicing_list;
if ( grep { $_ ne 'POST' } @invoicing_list ) { #email invoice
- $ENV{SMTPHOSTS} = $smtpmachine;
+ #false laziness w/FS::cust_pay::delete & fs_signup_server && ::realtime_card
+ #$ENV{SMTPHOSTS} = $smtpmachine;
$ENV{MAILADDRESS} = $invoice_from;
my $header = new Mail::Header ( [
"From: $invoice_from",
] );
my $message = new Mail::Internet (
'Header' => $header,
- 'Body' => [ $self->print_text ], #( date)
+ 'Body' => [ $self->print_text('', $template) ], #( date)
);
- $message->smtpsend
- or return "Can't send invoice email to server $smtpmachine!";
+ $!=0;
+ $message->smtpsend( Host => $smtpmachine )
+ or $message->smtpsend( Host => $smtpmachine, Debug => 1 )
+ or return "(customer # ". $self->custnum. ") can't send invoice email".
+ " to ". join(', ', grep { $_ ne 'POST' } @invoicing_list ).
+ " via server $smtpmachine with SMTP: $!";
#} elsif ( grep { $_ eq 'POST' } @invoicing_list ) {
} elsif ( ! @invoicing_list || grep { $_ eq 'POST' } @invoicing_list ) {
my($payname, $payfirst, $paylast);
if ( $cust_main->payname ) {
$payname = $cust_main->payname;
- $payname =~ /^\s*([\w \,\.\-\']*\w)?\s+([\w\,\.\-\']+)$/
+ $payname =~ /^\s*([\w \,\.\-\']*)?\s+([\w\,\.\-\']+)$/
or do {
#$dbh->rollback if $oldAutoCommit;
return "Illegal payname $payname";
my $email = $invoicing_list[0];
my( $action1, $action2 ) = split(/\s*\,\s*/, $bop_action );
+
+ my $description = 'Internet Services';
+ if ( $conf->exists('business-onlinepayment-description') ) {
+ my $dtempl = $conf->config('business-onlinepayment-description');
+
+ my $agent_obj = $cust_main->agent
+ or die "can't retreive agent for $cust_main (agentnum ".
+ $cust_main->agentnum. ")";
+ my $agent = $agent_obj->agent;
+ my $pkgs = join(', ',
+ map { $_->cust_pkg->part_pkg->pkg }
+ grep { $_->pkgnum } $self->cust_bill_pkg
+ );
+ $description = eval qq("$dtempl");
+
+ }
my $transaction =
new Business::OnlinePayment( $bop_processor, @bop_options );
'login' => $bop_login,
'password' => $bop_password,
'action' => $action1,
- 'description' => 'Internet Services',
+ 'description' => $description,
'amount' => $amount,
'invoice_number' => $self->invnum,
'customer_id' => $self->custnum,
order_number => $ordernum,
amount => $amount,
authorization => $auth,
- description => 'Internet Services',
+ description => $description,
);
$capture->submit();
}
#} elsif ( $options{'report_badcard'} ) {
} else {
- return "$processor error, invnum #". $self->invnum. ': '.
- $transaction->result_code. ": ". $transaction->error_message;
+
+ my $perror = "$processor error, invnum #". $self->invnum. ': '.
+ $transaction->result_code. ": ". $transaction->error_message;
+
+ if ( $conf->exists('emaildecline')
+ && grep { $_ ne 'POST' } $cust_main->invoicing_list
+ ) {
+ my @templ = $conf->config('declinetemplate');
+ my $template = new Text::Template (
+ TYPE => 'ARRAY',
+ SOURCE => [ map "$_\n", @templ ],
+ ) or return "($perror) can't create template: $Text::Template::ERROR";
+ $template->compile()
+ or return "($perror) can't compile template: $Text::Template::ERROR";
+
+ my $error = $transaction->error_message;
+
+ #false laziness w/FS::cust_pay::delete & fs_signup_server && ::send
+ $ENV{MAILADDRESS} = $invoice_from;
+ my $header = new Mail::Header ( [
+ "From: $invoice_from",
+ "To: ". join(', ', grep { $_ ne 'POST' } $cust_main->invoicing_list ),
+ "Sender: $invoice_from",
+ "Reply-To: $invoice_from",
+ "Date: ". time2str("%a, %d %b %Y %X %z", time),
+ "Subject: Your credit card could not be processed",
+ ] );
+ my $message = new Mail::Internet (
+ 'Header' => $header,
+ 'Body' => [ $template->fill_in() ],
+ );
+ $!=0;
+ $message->smtpsend( Host => $smtpmachine )
+ or $message->smtpsend( Host => $smtpmachine, Debug => 1 )
+ or return "($perror) (customer # ". $self->custnum.
+ ") can't send card decline email to ".
+ join(', ', grep { $_ ne 'POST' } $cust_main->invoicing_list ).
+ " via server $smtpmachine with SMTP: $!";
+ }
+
+ return $perror;
}
}
sub print_text {
- my( $self, $today ) = ( shift, shift );
+ my( $self, $today, $template ) = @_;
$today ||= time;
# my $invnum = $self->invnum;
my $cust_main = qsearchs('cust_main', { 'custnum', $self->custnum } );
push @buf,['Balance Due', $money_char.
sprintf("%10.2f", $balance_due ) ];
+ #create the template
+ my $templatefile = 'invoice_template';
+ $templatefile .= "_$template" if $template;
+ my @invoice_template = $conf->config($templatefile)
+ or die "cannot load config file $templatefile";
+ $invoice_lines = 0;
+ my $wasfunc = 0;
+ foreach ( grep /invoice_lines\(\d+\)/, @invoice_template ) { #kludgy
+ /invoice_lines\((\d+)\)/;
+ $invoice_lines += $1;
+ $wasfunc=1;
+ }
+ die "no invoice_lines() functions in template?" unless $wasfunc;
+ my $invoice_template = new Text::Template (
+ TYPE => 'ARRAY',
+ SOURCE => [ map "$_\n", @invoice_template ],
+ ) or die "can't create new Text::Template object: $Text::Template::ERROR";
+ $invoice_template->compile()
+ or die "can't compile template: $Text::Template::ERROR";
+
#setup template variables
-
package FS::cust_bill::_template; #!
use vars qw( $invnum $date $page $total_pages @address $overdue @buf );
$date = $self->_date;
$page = 1;
- $total_pages =
- int( scalar(@FS::cust_bill::buf) / $FS::cust_bill::invoice_lines );
- $total_pages++
- if scalar(@FS::cust_bill::buf) % $FS::cust_bill::invoice_lines;
-
+ if ( $FS::cust_bill::invoice_lines ) {
+ $total_pages =
+ int( scalar(@FS::cust_bill::buf) / $FS::cust_bill::invoice_lines );
+ $total_pages++
+ if scalar(@FS::cust_bill::buf) % $FS::cust_bill::invoice_lines;
+ } else {
+ $total_pages = 1;
+ }
#format address (variable for the template)
my $l = 0;
$FS::cust_bill::_template::address[$l++] = $cust_main->country
unless $cust_main->country eq 'US';
- #overdue? (variable for the template)
- $FS::cust_bill::_template::overdue = (
- $balance_due > 0
- && $today > $self->_date
-# && $self->printed > 1
- && $self->printed > 0
- );
+ # #overdue? (variable for the template)
+ # $FS::cust_bill::_template::overdue = (
+ # $balance_due > 0
+ # && $today > $self->_date
+ ## && $self->printed > 1
+ # && $self->printed > 0
+ # );
#and subroutine for the template
sub FS::cust_bill::_template::invoice_lines {
- my $lines = shift;
+ my $lines = shift or return @buf;
map {
scalar(@buf) ? shift @buf : [ '', '' ];
}
( 1 .. $lines );
}
-
+
+
+ #and fill it in
$FS::cust_bill::_template::page = 1;
my $lines;
my @collect;
=head1 VERSION
-$Id: cust_bill.pm,v 1.17 2002-02-06 15:50:54 ivan Exp $
+$Id: cust_bill.pm,v 1.32 2002-04-16 22:56:58 ivan Exp $
=head1 BUGS