- document missing fields in cust_bill_event
[freeside.git] / FS / FS / svc_acct.pm
index 1411334..7be4a71 100644 (file)
@@ -1,12 +1,13 @@
 package FS::svc_acct;
 
 use strict;
-use vars qw( @ISA $DEBUG $me $noexport_hack $conf
+use vars qw( @ISA $DEBUG $me $conf
              $dir_prefix @shells $usernamemin
              $usernamemax $passwordmin $passwordmax
              $username_ampersand $username_letter $username_letterfirst
              $username_noperiod $username_nounderscore $username_nodash
              $username_uppercase
+             $mydomain
              $welcome_template $welcome_from $welcome_subject $welcome_mimetype
              $smtpmachine
              $radius_password
@@ -18,9 +19,11 @@ use FS::UID qw( datasrc );
 use FS::Conf;
 use FS::Record qw( qsearch qsearchs fields dbh );
 use FS::svc_Common;
+use Net::SSH;
 use FS::cust_svc;
 use FS::part_svc;
 use FS::svc_acct_pop;
+use FS::svc_acct_sm;
 use FS::cust_main_invoice;
 use FS::svc_domain;
 use FS::raddb;
@@ -51,6 +54,7 @@ $FS::UID::callback{'FS::svc_acct'} = sub {
   $username_nodash = $conf->exists('username-nodash');
   $username_uppercase = $conf->exists('username-uppercase');
   $username_ampersand = $conf->exists('username-ampersand');
+  $mydomain = $conf->config('domain');
   $dirhash = $conf->config('dirhash') || 0;
   if ( $conf->exists('welcome_email') ) {
     $welcome_template = new Text::Template (
@@ -62,6 +66,9 @@ $FS::UID::callback{'FS::svc_acct'} = sub {
     $welcome_mimetype = $conf->config('welcome_email-mimetype') || 'text/plain';
   } else {
     $welcome_template = '';
+    $welcome_from = '';
+    $welcome_subject = '';
+    $welcome_mimetype = '';
   }
   $smtpmachine = $conf->config('smtpmachine');
   $radius_password = $conf->config('radius-password') || 'Password';
@@ -186,7 +193,7 @@ sqlradius export only)
 
 (TODOC: L<FS::queue> and L<freeside-queued>)
 
-(TODOC: new exports! $noexport_hack)
+(TODOC: new exports!)
 
 =cut
 
@@ -266,7 +273,11 @@ sub insert {
       #    qsearch('export_svc', { 'exportnum' => $part_export->exportnum });
       #}
 
-      my $nodomain = $exports->{$part_export->exporttype}{'nodomain'};
+      #my $nodomain = $exports->{$part_export->exporttype}{'nodomain'};
+      #silly kludge to avoid uninitialized value errors
+      my $nodomain = exists( $exports->{$part_export->exporttype}{'nodomain'} )
+                     ? $exports->{$part_export->exporttype}{'nodomain'}
+                     : '';
       if ( $nodomain =~ /^Y/i ) {
         $conflict_user_svcpart{$_} = $part_export->exportnum
           foreach @svcparts;
@@ -362,13 +373,13 @@ sub insert {
           'svcnum' => $self->svcnum,
           'job'    => 'FS::svc_acct::send_email'
         };
-        warn "attempting to queue email to $to";
         my $error = $wqueue->insert(
           'to'       => $to,
           'from'     => $welcome_from,
           'subject'  => $welcome_subject,
           'mimetype' => $welcome_mimetype,
           'body'     => $welcome_template->fill_in( HASH => {
+                          'custnum'  => $self->custnum,
                           'username' => $self->username,
                           'password' => $self->_password,
                           'first'    => $cust_main->first,
@@ -378,14 +389,14 @@ sub insert {
         );
         if ( $error ) {
           $dbh->rollback if $oldAutoCommit;
-          return "queuing welcome email: $error";
+          return "error queuing welcome email: $error";
         }
 
         foreach my $jobnum ( @jobnums ) {
           my $error = $wqueue->depend_insert($jobnum);
           if ( $error ) {
             $dbh->rollback if $oldAutoCommit;
-            return "queuing welcome email job dependancy: $error";
+            return "error queuing welcome email job dependancy: $error";
           }
         }
 
@@ -406,13 +417,18 @@ error, otherwise returns false.
 
 The corresponding FS::cust_svc record will be deleted as well.
 
-(TODOC: new exports! $noexport_hack)
+(TODOC: new exports!)
 
 =cut
 
 sub delete {
   my $self = shift;
 
+  if ( defined( $FS::Record::dbdef->table('svc_acct_sm') ) ) {
+    return "Can't delete an account which has (svc_acct_sm) mail aliases!"
+      if $self->uid && qsearch( 'svc_acct_sm', { 'domuid' => $self->uid } );
+  }
+
   return "Can't delete an account which is a (svc_forward) source!"
     if qsearch( 'svc_forward', { 'srcsvc' => $self->svcnum } );
 
@@ -527,7 +543,7 @@ sub replace {
   my $dbh = dbh;
 
   # redundant, but so $new->usergroup gets set
-  my $error = $new->check;
+  $error = $new->check;
   return $error if $error;
 
   $old->usergroup( [ $old->radius_groups ] );
@@ -666,7 +682,8 @@ sub check {
   }
 
   my $error = $self->ut_numbern('svcnum')
-              || $self->ut_number('domsvc')
+              #|| $self->ut_number('domsvc')
+              || $self->ut_foreign_key('domsvc', 'svc_domain', 'svcnum' )
               || $self->ut_textn('sec_phrase')
   ;
   return $error if $error;
@@ -777,7 +794,7 @@ sub check {
   unless ( $part_svc->part_svc_column('slipip')->columnflag eq 'F' ) {
     unless ( $recref->{slipip} eq '0e0' ) {
       $recref->{slipip} =~ /^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/
-        or return "Illegal slipip". $self->slipip;
+        or return "Illegal slipip". $self->slipip;
       $recref->{slipip} = $1;
     } else {
       $recref->{slipip} = '0e0';
@@ -872,7 +889,7 @@ sub radius_check {
   my $self = shift;
   my $password = $self->_password;
   my $pw_attrib = length($password) <= 12 ? $radius_password : 'Crypt-Password';
-  ( $pw_attrib => $password,
+  ( $pw_attrib => $self->_password,
     map {
       /^(rc_(.*))$/;
       my($column, $attrib) = ($1, $2);
@@ -890,10 +907,14 @@ Returns the domain associated with this account.
 
 sub domain {
   my $self = shift;
-  die "svc_acct.domsvc is null for svcnum ". $self->svcnum unless $self->domsvc;
-  my $svc_domain = $self->svc_domain
-    or die "no svc_domain.svcnum for svc_acct.domsvc ". $self->domsvc;
-  $svc_domain->domain;
+  if ( $self->domsvc ) {
+    #$self->svc_domain->domain;
+    my $svc_domain = $self->svc_domain
+      or die "no svc_domain.svcnum for svc_acct.domsvc ". $self->domsvc;
+    $svc_domain->domain;
+  } else {
+    $mydomain or die "svc_acct.domsvc is null and no legacy domain config file";
+  }
 }
 
 =item svc_domain
@@ -914,6 +935,8 @@ sub svc_domain {
 
 Returns the FS::cust_svc record for this account (see L<FS::cust_svc>).
 
+=cut
+
 sub cust_svc {
   my $self = shift;
   qsearchs( 'cust_svc', { 'svcnum' => $self->svcnum } );
@@ -954,7 +977,7 @@ external SQL radacct table, specified via sqlradius export.  Sessions which
 started in the specified range but are still open are counted from session
 start to the end of the range (unless they are over 1 day old, in which case
 they are presumed missing their stop record and not counted).  Also, sessions
-which end in therange but started earlier are counted from the start of the
+which end in the range but started earlier are counted from the start of the
 range to session end.  Finally, sessions which start before the range but end
 after are counted for the entire range.
 
@@ -988,6 +1011,7 @@ sub attribute_since_sqlradacct {
   $self->cust_svc->attribute_since_sqlradacct(@_);
 }
 
+
 =item radius_groups
 
 Returns all RADIUS groups for this account (see L<FS::radius_usergroup>).
@@ -1194,7 +1218,7 @@ probably live somewhere else...
 L<FS::svc_Common>, edit/part_svc.cgi from an installed web interface,
 export.html from the base documentation, L<FS::Record>, L<FS::Conf>,
 L<FS::cust_svc>, L<FS::part_svc>, L<FS::cust_pkg>, L<FS::queue>,
-L<freeside-queued>), L<FS::svc_acct_pop>,
+L<freeside-queued>), L<Net::SSH>, L<ssh>, L<FS::svc_acct_pop>,
 schema.html from the base documentation.
 
 =cut