package FS::cust_main;
use strict;
-use vars qw(@ISA $conf $lpr $processor $xaction $E_NoErr);
+use vars qw(@ISA $conf $lpr $processor $xaction $E_NoErr $invoice_from);
use Safe;
use Carp;
use Time::Local;
use Date::Format;
use Date::Manip;
+use Mail::Internet;
+use Mail::Header;
use Business::CreditCard;
use FS::UID qw( getotaker );
use FS::Record qw( qsearchs qsearch );
$FS::UID::callback{'FS::cust_main'} = sub {
$conf = new FS::Conf;
$lpr = $conf->config('lpr');
+ $invoice_from = $conf->config('invoice_from');
if ( $conf->exists('cybercash3.2') ) {
require CCMckLib3_2;
my $self = shift;
my $error =
- $self->ut_number('agentnum')
+ $self->ut_numbern('custnum')
+ || $self->ut_number('agentnum')
|| $self->ut_number('refnum')
|| $self->ut_textn('company')
|| $self->ut_text('address1')
} );
}
- $self->zip =~ /^([\w\-]{10})$/ or return "Illegal zip";
+ $self->zip =~ /^([\w\-]{5,10})$/ or return "Illegal zip";
$self->zip($1);
$self->payby =~ /^(CARD|BILL|COMP)$/ or return "Illegal payby";
sub bill {
my( $self, %options ) = @_;
- my $time = $options{'time'} || $^T;
+ my $time = $options{'time'} || time;
my $error;
local $SIG{QUIT} = 'IGNORE';
local $SIG{TERM} = 'IGNORE';
local $SIG{TSTP} = 'IGNORE';
+ local $SIG{PIPE} = 'IGNORE';
# find the packages which are due for billing, find out how much they are
# & generate invoice database.
sub collect {
my( $self, %options ) = @_;
- my $invoice_time = $options{'invoice_time'} || $^T;
+ my $invoice_time = $options{'invoice_time'} || time;
my $total_owed = $self->balance;
return '' unless $total_owed > 0; #redundant?????
local $SIG{QUIT} = 'IGNORE';
local $SIG{TERM} = 'IGNORE';
local $SIG{TSTP} = 'IGNORE';
+ local $SIG{PIPE} = 'IGNORE';
foreach my $cust_bill (
qsearch('cust_bill', { 'custnum' => $self->custnum, } )
&& ( $cust_bill->printed * 2592000 ) <= $since
) {
- open(LPR, "|$lpr") or die "Can't open pipe to $lpr: $!";
- print LPR $cust_bill->print_text; #( date )
- close LPR
- or die $! ? "Error closing $lpr: $!"
- : "Exit status $? from $lpr";
+ #my @print_text = $cust_bill->print_text; #( date )
+ my @invoicing_list = $self->invoicing_list;
+ if ( grep { $_ ne 'POST' } @invoicing_list ) { #email invoice
+ my $header = new Mail::Header ( [
+ "From: $invoice_from",
+ "To: ". join(', ', grep { $_ ne 'POST' } @invoicing_list ),
+ "Sender: $invoice_from",
+ "Reply-To: $invoice_from",
+ "Date: ". time2str("%a, %d %b %Y %X %z", time),
+ "Subject: Invoice",
+ ] );
+ my $message = new Mail::Internet (
+ 'Header' => $header,
+ 'Body' => [ $cust_bill->print_text ], #( date)
+ );
+ $message->smtpsend or die "Can't send invoice email!"; #die? warn?
+
+ } elsif ( ! @invoicing_list || grep { $_ eq 'POST' } @invoicing_list ) {
+ open(LPR, "|$lpr") or die "Can't open pipe to $lpr: $!";
+ print LPR $cust_bill->print_text; #( date )
+ close LPR
+ or die $! ? "Error closing $lpr: $!"
+ : "Exit status $? from $lpr";
+ }
my %hash = $cust_bill->hash;
$hash{'printed'}++;
my $error = $cust_pay->insert;
return 'Error COMPing invnum #' . $cust_bill->invnum .
':' . $error if $error;
+
} elsif ( $self->payby eq 'CARD' ) {
if ( $options{'batch_card'} ne 'yes' ) {
return "Unknown payment type ". $self->payby;
}
+
+
+
+
}
'';
sprintf( "%.2f", $self->total_owed - $self->total_credited );
}
-=item invoicing_list [ ITEM, ITEM, ... ]
+=item invoicing_list [ ARRAYREF ]
-If arguements are given, sets these email addresses as invoice recipients
+If an arguement is given, sets these email addresses as invoice recipients
(see L<FS::cust_main_invoice>). Errors are not fatal and are not reported
(except as warnings), so use check_invoicing_list first.
Returns a list of email addresses (with svcnum entries expanded).
+Note: You can clear the invoicing list by passing an empty ARRAYREF. You can
+check it without disturbing anything by passing nothing.
+
+This interface may change in the future.
+
=cut
sub invoicing_list {
- my( $self, @addresses ) = @_;
- if ( @addresses ) {
+ my( $self, $arrayref ) = @_;
+ if ( $arrayref ) {
my @cust_main_invoice =
qsearch( 'cust_main_invoice', { 'custnum' => $self->custnum } );
foreach my $cust_main_invoice ( @cust_main_invoice ) {
- unless ( grep { $cust_main_invoice->address eq $_ } @addresses ) {
- $cust_main_invoice->delete;
+ #warn $cust_main_invoice->destnum;
+ unless ( grep { $cust_main_invoice->address eq $_ } @{$arrayref} ) {
+ #warn $cust_main_invoice->destnum;
+ my $error = $cust_main_invoice->delete;
+ warn $error if $error;
}
}
@cust_main_invoice =
qsearch( 'cust_main_invoice', { 'custnum' => $self->custnum } );
- foreach my $address ( @addresses ) {
+ foreach my $address ( @{$arrayref} ) {
unless ( grep { $address eq $_->address } @cust_main_invoice ) {
- my $cust_main_invoice = new FS::cust_main_invoice (
+ my $cust_main_invoice = new FS::cust_main_invoice ( {
'custnum' => $self->custnum,
'dest' => $address,
- );
+ } );
my $error = $cust_main_invoice->insert;
warn $error if $error;
}
qsearch( 'cust_main_invoice', { 'custnum' => $self->custnum } );
}
-=item check_invoicing_list ITEM, ITEM
+=item check_invoicing_list ARRAYREF
Checks these arguements as valid input for the invoicing_list method. If there
is an error, returns the error, otherwise returns false.
=cut
sub check_invoicing_list {
- my( $self, @addresses ) = @_;
- foreach my $address ( @addresses ) {
- my $cust_main_invoice = new FS::cust_main_invoice (
+ my( $self, $arrayref ) = @_;
+ foreach my $address ( @{$arrayref} ) {
+ my $cust_main_invoice = new FS::cust_main_invoice ( {
'custnum' => $self->custnum,
'dest' => $address,
- );
- my $error = $cust_main_invoice->check;
+ } );
+ my $error = $self->custnum
+ ? $cust_main_invoice->check
+ : $cust_main_invoice->checkdest
+ ;
return $error if $error;
}
'';
=head1 VERSION
-$Id: cust_main.pm,v 1.8 1998-12-29 11:59:39 ivan Exp $
+$Id: cust_main.pm,v 1.11 1999-02-23 08:09:27 ivan Exp $
=head1 BUGS
FS::UID::{datasrc,checkruid} ivan@sisd.com 98-sep-19-21
$Log: cust_main.pm,v $
-Revision 1.8 1998-12-29 11:59:39 ivan
+Revision 1.11 1999-02-23 08:09:27 ivan
+beginnings of one-screen new customer entry and some other miscellania
+
+Revision 1.10 1999/01/25 12:26:09 ivan
+yet more mod_perl stuff
+
+Revision 1.9 1999/01/18 09:22:41 ivan
+changes to track email addresses for email invoicing
+
+Revision 1.8 1998/12/29 11:59:39 ivan
mostly properly OO, some work still to be done with svc_ stuff
Revision 1.7 1998/12/16 09:58:52 ivan