show credit balance on invoices, #11564
[freeside.git] / FS / FS / cust_main_invoice.pm
index eb0162f..ec01842 100644 (file)
@@ -1,21 +1,16 @@
 package FS::cust_main_invoice;
 
 use strict;
-use vars qw(@ISA $conf $mydomain);
+use vars qw(@ISA);
 use Exporter;
 use FS::Record qw( qsearchs );
 use FS::Conf;
 use FS::cust_main;
 use FS::svc_acct;
+use FS::Msgcat qw(gettext);
 
 @ISA = qw( FS::Record );
 
-#ask FS::UID to run this stuff for us later
-$FS::UID::callback{'FS::cust_main_invoice'} = sub { 
-  $conf = new FS::Conf;
-  $mydomain = $conf->config('domain');
-};
-
 =head1 NAME
 
 FS::cust_main_invoice - Object methods for cust_main_invoice records
@@ -48,7 +43,7 @@ FS::Record.  The following fields are currently supported:
 
 =item custnum - customer (see L<FS::cust_main>)
 
-=item dest - Invoice destination: If numeric, a svcnum (see L<FS::svc_acct>), if string, a literal email address, or `POST' to enable mailing (the default if no cust_main_invoice records exist)
+=item dest - Invoice destination: If numeric, a svcnum (see L<FS::svc_acct>), if string, a literal email address, `POST' to enable mailing (the default if no cust_main_invoice records exist), or `FAX' to enable faxing via a HylaFAX server.
 
 =back
 
@@ -88,7 +83,7 @@ sub replace {
 
   return "Can't change custnum!" unless $old->custnum == $new->custnum;
 
-  $new->SUPER::replace;
+  $new->SUPER::replace($old);
 }
 
 
@@ -96,7 +91,7 @@ sub replace {
 
 Checks all fields to make sure this is a valid invoice destination.  If there is
 an error, returns the error, otherwise returns false.  Called by the insert
-and repalce methods.
+and replace methods.
 
 =cut
 
@@ -112,15 +107,17 @@ sub check {
   return "Unknown customer"
     unless qsearchs('cust_main',{ 'custnum' => $self->custnum });
 
-  ''; #noerror
+  $self->SUPER::check;
 }
 
 =item checkdest
 
-Checks the dest field only.  If it finds that the account ends in the
-same domain configured as the B<domain> configuration file, it will change the
-invoice destination from an email address to a service number (see
-L<FS::svc_acct>).
+Checks the dest field only.
+
+#If it finds that the account ends in the
+#same domain configured as the B<domain> configuration file, it will change the
+#invoice destination from an email address to a service number (see
+#L<FS::svc_acct>).
 
 =cut
 
@@ -130,21 +127,20 @@ sub checkdest {
   my $error = $self->ut_text('dest');
   return $error if $error;
 
-  if ( $self->dest eq 'POST' ) {
+  my $conf = new FS::Conf;
+
+  if ( $self->dest =~ /^(POST|FAX)$/ ) {
     #contemplate our navel
   } elsif ( $self->dest =~ /^(\d+)$/ ) {
-    return "Unknown local account (specified by svcnum)"
+    return "Unknown local account (specified by svcnum: ". $self->dest. ")"
       unless qsearchs( 'svc_acct', { 'svcnum' => $self->dest } );
-  } elsif ( $self->dest =~ /^([\w\.\-]+)\@(([\w\.\-]+\.)+\w+)$/ ) {
+  } elsif ( $conf->exists('emailinvoice-apostrophe')
+              ? $self->dest =~ /^\s*([\w\.\-\&\+\']+)\@(([\w\.\-]+\.)+\w+)\s*$/
+              : $self->dest =~ /^\s*([\w\.\-\&\+]+)\@(([\w\.\-]+\.)+\w+)\s*$/ ){
     my($user, $domain) = ($1, $2);
-    if ( $domain eq $mydomain ) {
-      my $svc_acct = qsearchs( 'svc_acct', { 'username' => $user } );
-      return "Unknown local account (specified literally)" unless $svc_acct;
-      $svc_acct->svcnum =~ /^(\d+)$/ or die "Non-numeric svcnum?!";
-      $self->dest($1);
-    }
+    $self->dest("$1\@$2");
   } else {
-    return "Illegal destination!";
+    return gettext("illegal_email_invoice_address"). ': '. $self->dest;
   }
 
   ''; #no error
@@ -152,7 +148,7 @@ sub checkdest {
 
 =item address
 
-Returns the literal email address for this record (or `POST').
+Returns the literal email address for this record (or `POST' or `FAX').
 
 =cut
 
@@ -161,17 +157,24 @@ sub address {
   if ( $self->dest =~ /^(\d+)$/ ) {
     my $svc_acct = qsearchs( 'svc_acct', { 'svcnum' => $1 } )
       or return undef;
-    $svc_acct->username . '@' . $mydomain;
+    $svc_acct->email;
   } else {
     $self->dest;
   }
 }
 
-=back
+=item cust_main
+
+Returns the parent customer object (see L<FS::cust_main>).
 
-=head1 VERSION
+=cut
 
-$Id: cust_main_invoice.pm,v 1.5 2001-08-11 00:01:39 ivan Exp $
+sub cust_main {
+  my $self = shift;
+  qsearchs( 'cust_main', { 'custnum' => $self->custnum } );
+}
+
+=back
 
 =head1 BUGS