import rt 2.0.14
[freeside.git] / FS / FS / svc_acct.pm
index 2bbbdcb..c95df94 100644 (file)
@@ -19,6 +19,7 @@ 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;
@@ -226,20 +227,27 @@ sub insert {
 
   #new duplicate username checking
 
+  my $part_svc = qsearchs('part_svc', { 'svcpart' => $self->svcpart } );
+  unless ( $part_svc ) {
+    $dbh->rollback if $oldAutoCommit;
+    return 'unknown svcpart '. $self->svcpart;
+  }
+
   my @dup_user = qsearch( 'svc_acct', { 'username' => $self->username } );
-  my @dup_userdomain = qsearchs( 'svc_acct', { 'username' => $self->username,
-                                               'domsvc'   => $self->domsvc } );
+  my @dup_userdomain = qsearch( 'svc_acct', { 'username' => $self->username,
+                                              'domsvc'   => $self->domsvc } );
+  my @dup_uid;
+  if ( $part_svc->part_svc_column('uid')->columnflag ne 'F'
+       && $self->username !~ /^(toor|(hyla)?fax)$/          ) {
+    @dup_uid = qsearch( 'svc_acct', { 'uid' => $self->uid } );
+  } else {
+    @dup_uid = ();
+  }
 
-  if ( @dup_user || @dup_userdomain ) {
+  if ( @dup_user || @dup_userdomain || @dup_uid ) {
     my $exports = FS::part_export::export_info('svc_acct');
     my( %conflict_user_svcpart, %conflict_userdomain_svcpart );
 
-    my $part_svc = qsearchs('part_svc', { 'svcpart' => $self->svcpart } );
-    unless ( $part_svc ) {
-      $dbh->rollback if $oldAutoCommit;
-      return 'unknown svcpart '. $self->svcpart;
-    }
-
     foreach my $part_export ( $part_svc->part_export ) {
 
       #this will catch to the same exact export
@@ -269,6 +277,7 @@ sub insert {
     foreach my $dup_user ( @dup_user ) {
       my $dup_svcpart = $dup_user->cust_svc->svcpart;
       if ( exists($conflict_user_svcpart{$dup_svcpart}) ) {
+        $dbh->rollback if $oldAutoCommit;
         return "duplicate username: conflicts with svcnum ". $dup_user->svcnum.
                " via exportnum ". $conflict_user_svcpart{$dup_svcpart};
       }
@@ -276,10 +285,22 @@ sub insert {
 
     foreach my $dup_userdomain ( @dup_userdomain ) {
       my $dup_svcpart = $dup_userdomain->cust_svc->svcpart;
-      if ( exists($conflict_user_svcpart{$dup_svcpart}) ) {
+      if ( exists($conflict_userdomain_svcpart{$dup_svcpart}) ) {
+        $dbh->rollback if $oldAutoCommit;
         return "duplicate username\@domain: conflicts with svcnum ".
                $dup_userdomain->svcnum. " via exportnum ".
-               $conflict_user_svcpart{$dup_svcpart};
+               $conflict_userdomain_svcpart{$dup_svcpart};
+      }
+    }
+
+    foreach my $dup_uid ( @dup_uid ) {
+      my $dup_svcpart = $dup_uid->cust_svc->svcpart;
+      if ( exists($conflict_user_svcpart{$dup_svcpart})
+           || exists($conflict_userdomain_svcpart{$dup_svcpart}) ) {
+        $dbh->rollback if $oldAutoCommit;
+        return "duplicate uid: conflicts with svcnum". $dup_uid->svcnum.
+               "via exportnum ". $conflict_user_svcpart{$dup_svcpart}
+                                 || $conflict_userdomain_svcpart{$dup_svcpart};
       }
     }
 
@@ -287,15 +308,6 @@ sub insert {
 
   #see?  i told you it was more complicated
 
-  my $part_svc = qsearchs( 'part_svc', { 'svcpart' => $self->svcpart } );
-  return "Unknown svcpart" unless $part_svc;
-  return "uid ". $self->uid. " in use"
-    if $part_svc->part_svc_column('uid')->columnflag ne 'F'
-      && qsearchs( 'svc_acct', { 'uid' => $self->uid } )
-      && $self->username !~ /^(hyla)?fax$/
-      && $self->username !~ /^toor$/ #FreeBSD
-    ;
-
   my @jobnums;
   $error = $self->SUPER::insert(\@jobnums);
   if ( $error ) {
@@ -826,8 +838,8 @@ sub radius_reply {
       #$attrib =~ s/_/\-/g;
       ( $FS::raddb::attrib{lc($attrib)}, $self->getfield($column) );
     } grep { /^radius_/ && $self->getfield($_) } fields( $self->table );
-  if ( $self->ip && $self->ip ne '0e0' ) {
-    $reply{'Framed-IP-Address'} = $self->ip;
+  if ( $self->slipip && $self->slipip ne '0e0' ) {
+    $reply{'Framed-IP-Address'} = $self->slipip;
   }
   %reply;
 }
@@ -876,7 +888,7 @@ sub domain {
 =item svc_domain
 
 Returns the FS::svc_domain record for this account's domain (see
-L<FS::svc_domain>.
+L<FS::svc_domain>).
 
 =cut