default to a session cookie instead of setting an explicit timeout, weird timezone...
[freeside.git] / FS / FS / contact.pm
index f59fef9..26f39ed 100644 (file)
@@ -168,7 +168,6 @@ sub insert {
   my $existing_contact = '';
   my @contact_emails = ();
   my %contact_nums = ();
-  $contact_nums{$self->contactnum} = '1' if $self->contactnum;
 
   if ( $self->get('emailaddress') =~ /\S/ ) {
 
@@ -202,6 +201,8 @@ sub insert {
     return $error;
   }
 
+  $contact_nums{$self->contactnum} = '1' if $self->contactnum;
+
   my $cust_contact = '';
   # if $self->custnum was set, then the customer-specific properties
   # (custnum, classnum, invoice_dest, selfservice_access, comment) are in
@@ -468,6 +469,13 @@ sub replace {
 
     }
 
+    ## were all emails duplicates?  if so reset original emails
+    if (scalar @contact_emails < 1 && scalar (keys %contact_nums) > 1) {
+      foreach (qsearch('contact_email', {'contactnum' => $self->contactnum})) {
+        push @contact_emails, $_->emailaddress;
+      }
+    }
+
     my $emails = join(' , ', @contact_emails);
     $self->emailaddress($emails);
 
@@ -820,7 +828,38 @@ or there isn't one, returns the empty string.
 =cut
 
 sub by_selfservice_email {
-  my($class, $email) = @_;
+  my($class, $email, $case_insensitive) = @_;
+
+  my $email_search = "emailaddress = '".$email."'";
+  $email_search = "LOWER(emailaddress) = LOWER('".$email."')" if $case_insensitive;
+
+  my $contact_email = qsearchs({
+    'table'     => 'contact_email',
+    'addl_from' => ' LEFT JOIN contact USING ( contactnum ) ',
+    'extra_sql' => "
+      WHERE $email_search
+      AND ( contact.disabled IS NULL )
+      AND EXISTS ( SELECT 1 FROM cust_contact
+                     WHERE contact.contactnum = cust_contact.contactnum
+                       AND cust_contact.selfservice_access = 'Y'
+                 )
+    ",
+  }) or return '';
+
+  $contact_email->contact;
+
+}
+
+=item by_selfservice_email_custnum EMAILADDRESS, CUSTNUM
+
+Alternate search constructor (class method).  Given an email address and custnum, returns
+the contact for that address and custnum. If that contact doesn't have selfservice access,
+or there isn't one, returns the empty string.
+
+=cut
+
+sub by_selfservice_email_custnum {
+  my($class, $email, $custnum) = @_;
 
   my $contact_email = qsearchs({
     'table'     => 'contact_email',
@@ -831,6 +870,7 @@ sub by_selfservice_email {
       AND EXISTS ( SELECT 1 FROM cust_contact
                      WHERE contact.contactnum = cust_contact.contactnum
                        AND cust_contact.selfservice_access = 'Y'
+                       AND cust_contact.custnum = $custnum
                  )
     ",
   }) or return '';