[freeside-commits] branch master updated. 438c813bf5a71dc6c09396acac85656b15139adf

Christopher Burger burgerc at freeside.biz
Mon Jan 21 18:39:05 PST 2019


The branch, master has been updated
       via  438c813bf5a71dc6c09396acac85656b15139adf (commit)
       via  8994fc466c8ef3e7ba30d0a4e54cdf77be667e05 (commit)
       via  e589d0b948c4a8f01a705c82a4885cee699cdc61 (commit)
      from  916a15d2fb5cdcbb0d7ba94236a799ee627cf467 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 438c813bf5a71dc6c09396acac85656b15139adf
Author: Christopher Burger <burgerc at freeside.biz>
Date:   Mon Jan 21 21:37:38 2019 -0500

    RT# 79352 - fixed so contact replace would not add duplicate cust_contacts.

diff --git a/FS/FS/contact.pm b/FS/FS/contact.pm
index 957f96cf8..f59fef927 100644
--- a/FS/FS/contact.pm
+++ b/FS/FS/contact.pm
@@ -449,7 +449,8 @@ sub replace {
   ## if found, just add that contact to cust_contact with link_hash credentials
   ## as email can not be tied to two contacts.
   my @contact_emails = ();
-  my @contact_nums = ($self->contactnum,);
+  my %contact_nums = ();
+  $contact_nums{$self->contactnum} = '1' if $self->contactnum;
   if ( $self->get('emailaddress') =~ /\S/ ) {
 
     foreach my $email ( split(/\s*,\s*/, $self->get('emailaddress') ) ) {
@@ -462,7 +463,7 @@ sub replace {
         push @contact_emails, $email;
       }
       else {
-        push @contact_nums, $contact->contactnum;
+        $contact_nums{$contact->contactnum} = '1';
       }
 
     }
@@ -488,9 +489,9 @@ sub replace {
   # fields.
   if ( $custnum ) {
 
-    foreach my $contactnum (@contact_nums) {
+    foreach my $contactnum (keys %contact_nums) {
 
-      my %hash = ( 'contactnum' => $contactnum, #$self->contactnum,
+      my %hash = ( 'contactnum' => $contactnum,
                    'custnum'    => $custnum,
                  );
       my $error;

commit 8994fc466c8ef3e7ba30d0a4e54cdf77be667e05
Author: Christopher Burger <burgerc at freeside.biz>
Date:   Mon Jan 21 20:10:36 2019 -0500

    RT# 79352 - update contact insert to search email list for existing contacts and attach those contacts to current customer on insert

diff --git a/FS/FS/contact.pm b/FS/FS/contact.pm
index fc7cca3eb..957f96cf8 100644
--- a/FS/FS/contact.pm
+++ b/FS/FS/contact.pm
@@ -160,44 +160,42 @@ sub insert {
     $self->$_('');
   }
 
-  #look for an existing contact with this email address
+
+  ## check for an existing contact with this email address other than current customer
+  ## if found, just add that contact to cust_contact with link_hash credentials
+  ## as email can not be tied to two contacts.
+  my $no_new_contact;
   my $existing_contact = '';
+  my @contact_emails = ();
+  my %contact_nums = ();
+  $contact_nums{$self->contactnum} = '1' if $self->contactnum;
+
   if ( $self->get('emailaddress') =~ /\S/ ) {
-  
-    my %existing_contact = ();
 
     foreach my $email ( split(/\s*,\s*/, $self->get('emailaddress') ) ) {
  
-      my $contact_email = qsearchs('contact_email', { emailaddress=>$email } )
-        or next;
+      my $contact_email = qsearchs('contact_email', { emailaddress=>$email } );
+        unless ($contact_email) { push @contact_emails, $email; next; }
 
       my $contact = $contact_email->contact;
-      $existing_contact{ $contact->contactnum } = $contact;
+      if ($contact->contactnum eq $self->contactnum) {
+        push @contact_emails, $email;
+      }
+      else {
+        $contact_nums{$contact->contactnum} = '1';
+      }
 
     }
 
-    if ( scalar( keys %existing_contact ) > 1 ) {
-      $dbh->rollback if $oldAutoCommit;
-      return 'Multiple email addresses specified '.
-             ' that already belong to separate contacts';
-    } elsif ( scalar( keys %existing_contact ) ) {
-      ($existing_contact) = values %existing_contact;
-    }
+    my $emails = join(' , ', @contact_emails);
+    $self->emailaddress($emails);
+
+    $no_new_contact = '1' unless $self->emailaddress;
 
   }
 
   my $error;
-  if ( $existing_contact ) {
-
-    $self->$_($existing_contact->$_())
-      for qw( contactnum _password _password_encoding );
-    $error = $self->SUPER::replace($existing_contact);
-
-  } else {
-
-    $error = $self->SUPER::insert;
-
-  }
+  $error = $self->SUPER::insert unless $no_new_contact;
 
   if ( $error ) {
     $dbh->rollback if $oldAutoCommit;
@@ -210,20 +208,22 @@ sub insert {
   # pseudo-fields, and are now in %link_hash. otherwise, ignore all those
   # fields.
   if ( $custnum ) {
-    my %hash = ( 'contactnum' => $self->contactnum,
-                 'custnum'    => $custnum,
-               );
-    $cust_contact =  qsearchs('cust_contact', \%hash )
-                  || new FS::cust_contact { %hash, %link_hash };
-    my $error = $cust_contact->custcontactnum ? $cust_contact->replace
+    foreach my $contactnum (keys %contact_nums) {
+      my %hash = ( 'contactnum' => $contactnum,
+                   'custnum'    => $custnum,
+                 );
+      $cust_contact =  qsearchs('cust_contact', \%hash )
+                    || new FS::cust_contact { %hash, %link_hash };
+      my $error = $cust_contact->custcontactnum ? $cust_contact->replace
                                               : $cust_contact->insert;
-    if ( $error ) {
-      $dbh->rollback if $oldAutoCommit;
-      return $error;
+      if ( $error ) {
+        $dbh->rollback if $oldAutoCommit;
+        return $error;
+      }
     }
   }
 
-  if ( $prospectnum ) {
+  if ( $prospectnum && !$no_new_contact) {
     my %hash = ( 'contactnum'  => $self->contactnum,
                  'prospectnum' => $prospectnum,
                );
@@ -238,6 +238,7 @@ sub insert {
     }
   }
 
+  unless ($no_new_contact) {
   foreach my $pf ( grep { /^phonetypenum(\d+)$/ && $self->get($_) =~ /\S/ }
                         keys %{ $self->hashref } ) {
     $pf =~ /^phonetypenum(\d+)$/ or die "wtf (daily, the)";
@@ -256,6 +257,7 @@ sub insert {
       return $error;
     }
   }
+  }
 
   if ( $self->get('emailaddress') =~ /\S/ ) {
 

commit e589d0b948c4a8f01a705c82a4885cee699cdc61
Author: Christopher Burger <burgerc at freeside.biz>
Date:   Mon Jan 21 14:12:14 2019 -0500

    RT# 79352 - updated contact replace to attach existing contact to customer

diff --git a/FS/FS/contact.pm b/FS/FS/contact.pm
index a2fc99c34..fc7cca3eb 100644
--- a/FS/FS/contact.pm
+++ b/FS/FS/contact.pm
@@ -443,6 +443,33 @@ sub replace {
     $self->$_('');
   }
 
+  ## check for an existing contact with this email address other than current customer
+  ## if found, just add that contact to cust_contact with link_hash credentials
+  ## as email can not be tied to two contacts.
+  my @contact_emails = ();
+  my @contact_nums = ($self->contactnum,);
+  if ( $self->get('emailaddress') =~ /\S/ ) {
+
+    foreach my $email ( split(/\s*,\s*/, $self->get('emailaddress') ) ) {
+
+      my $contact_email = qsearchs('contact_email', { emailaddress=>$email } );
+        unless ($contact_email) { push @contact_emails, $email; next; }
+
+      my $contact = $contact_email->contact;
+      if ($contact->contactnum eq $self->contactnum) {
+        push @contact_emails, $email;
+      }
+      else {
+        push @contact_nums, $contact->contactnum;
+      }
+
+    }
+
+    my $emails = join(' , ', @contact_emails);
+    $self->emailaddress($emails);
+
+  }
+
   my $error = $self->SUPER::replace($old);
   if ( $old->_password ne $self->_password ) {
     $error ||= $self->insert_password_history;
@@ -458,20 +485,24 @@ sub replace {
   # pseudo-fields, and are now in %link_hash. otherwise, ignore all those
   # fields.
   if ( $custnum ) {
-    my %hash = ( 'contactnum' => $self->contactnum,
-                 'custnum'    => $custnum,
-               );
-    my $error;
-    if ( $cust_contact = qsearchs('cust_contact', \%hash ) ) {
-      $cust_contact->$_($link_hash{$_}) for keys %link_hash;
-      $error = $cust_contact->replace;
-    } else {
-      $cust_contact = new FS::cust_contact { %hash, %link_hash };
-      $error = $cust_contact->insert;
-    }
-    if ( $error ) {
-      $dbh->rollback if $oldAutoCommit;
-      return $error;
+
+    foreach my $contactnum (@contact_nums) {
+
+      my %hash = ( 'contactnum' => $contactnum, #$self->contactnum,
+                   'custnum'    => $custnum,
+                 );
+      my $error;
+      if ( $cust_contact = qsearchs('cust_contact', \%hash ) ) {
+        $cust_contact->$_($link_hash{$_}) for keys %link_hash;
+        $error = $cust_contact->replace;
+      } else {
+        $cust_contact = new FS::cust_contact { %hash, %link_hash };
+        $error = $cust_contact->insert;
+      }
+      if ( $error ) {
+        $dbh->rollback if $oldAutoCommit;
+        return $error;
+      }
     }
   }
 

-----------------------------------------------------------------------

Summary of changes:
 FS/FS/contact.pm | 130 +++++++++++++++++++++++++++++++++++--------------------
 1 file changed, 82 insertions(+), 48 deletions(-)




More information about the freeside-commits mailing list