diff options
| author | ivan <ivan> | 2008-04-01 08:43:33 +0000 | 
|---|---|---|
| committer | ivan <ivan> | 2008-04-01 08:43:33 +0000 | 
| commit | 4d3c77fe23ae72abb72e4cb9f8e77a84b2375e6a (patch) | |
| tree | 109f3e3e9feb6f39f1261eb8a9949c453bd883c1 | |
| parent | 2f673cd6e61a8c67c4ef89d11cae3e96a7fac306 (diff) | |
last bit of magic for RT ticket customer auto-association: look for requestor email addresses in cust_main_invoice and svc_acct, closes; RT#1160
| -rw-r--r-- | FS/FS/cust_main.pm | 66 | ||||
| -rw-r--r-- | FS/FS/cust_main_invoice.pm | 11 | ||||
| -rw-r--r-- | rt/lib/RT/Ticket_Overlay.pm | 25 | ||||
| -rw-r--r-- | rt/lib/RT/URI/freeside/Internal.pm | 6 | 
4 files changed, 108 insertions, 0 deletions
| diff --git a/FS/FS/cust_main.pm b/FS/FS/cust_main.pm index b58a52c45..37f98c69c 100644 --- a/FS/FS/cust_main.pm +++ b/FS/FS/cust_main.pm @@ -5515,6 +5515,72 @@ sub smart_search {  } +=item email_search + +Accepts the following options: I<email>, the email address to search for.  The +email address will be searched for as an email invoice destination and as an +svc_acct account. + +#Any additional options are treated as an additional qualifier on the search +#(i.e. I<agentnum>). + +Returns a (possibly empty) array of FS::cust_main objects (but usually just +none or one). + +=cut + +sub email_search { +  my %options = @_; + +  local($DEBUG) = 1; + +  my $email = delete $options{'email'}; + +  #we're only being used by RT at the moment... no agent virtualization yet +  #my $agentnums_sql = $FS::CurrentUser::CurrentUser->agentnums_sql; + +  my @cust_main = (); + +  if ( $email =~ /([^@]+)\@([^@]+)/ ) { + +    my ( $user, $domain ) = ( $1, $2 ); + +    warn "$me smart_search: searching for $user in domain $domain" +      if $DEBUG; + +    push @cust_main, +      map $_->cust_main, +          qsearch( { +                     'table'     => 'cust_main_invoice', +                     'hashref'   => { 'dest' => $email }, +                   } +                 ); + +    push @cust_main, +      map  $_->cust_main, +      grep $_, +      map  $_->cust_svc->cust_pkg, +          qsearch( { +                     'table'     => 'svc_acct', +                     'hashref'   => { 'username' => $user, }, +                     'extra_sql' => +                       'AND ( SELECT domain FROM svc_domain +                                WHERE svc_acct.domsvc = svc_domain.svcnum +                            ) = '. dbh->quote($domain), +                   } +                 ); +  } + +  my %saw = (); +  @cust_main = grep { !$saw{$_->custnum}++ } @cust_main; + +  warn "$me smart_search: found ". scalar(@cust_main). " unique customers" +    if $DEBUG; + +  @cust_main; + +} +  =item check_and_rebuild_fuzzyfiles  =cut diff --git a/FS/FS/cust_main_invoice.pm b/FS/FS/cust_main_invoice.pm index 71029d096..11d5a44b7 100644 --- a/FS/FS/cust_main_invoice.pm +++ b/FS/FS/cust_main_invoice.pm @@ -159,6 +159,17 @@ sub address {    }  } +=item cust_main + +Returns the parent customer object (see L<FS::cust_main>). + +=cut + +sub cust_main { +  my $self = shift; +  qsearchs( 'cust_main', { 'custnum' => $self->custnum } ); +} +  =back  =head1 BUGS diff --git a/rt/lib/RT/Ticket_Overlay.pm b/rt/lib/RT/Ticket_Overlay.pm index 1916bc463..c8b02e7ac 100644 --- a/rt/lib/RT/Ticket_Overlay.pm +++ b/rt/lib/RT/Ticket_Overlay.pm @@ -721,6 +721,31 @@ sub Create {      #unless we already have (a) customer(s)...      unless ( $self->Customers->Count ) { +      #first find any requestors with emails but *without* customer targets +      my @NoCust_Requestors = +        grep { $_->EmailAddress && ! $_->Customers->Count } +             @{ $self->Requestors->UserMembersObj->ItemsArrayRef }; + +      for my $Requestor (@NoCust_Requestors) { + +         #perhaps the stuff in here should be in a User method?? +         my @Customers = +           &RT::URI::freeside::email_search( email=>$Requestor->EmailAddress ); + +         foreach my $custnum ( map $_->{'custnum'}, @Customers ) { + +           ## false laziness w/RT/Interface/Web_Vendor.pm +           my @link = ( 'Type'   => 'MemberOf', +                        'Target' => "freeside://freeside/cust_main/$custnum", +                      ); + +           my( $val, $msg ) = $Requestor->AddLink(@link); +           #XXX should do something with $msg# push @non_fatal_errors, $msg; + +         } + +      } +        #find any requestors with customer targets        my %cust_target = (); diff --git a/rt/lib/RT/URI/freeside/Internal.pm b/rt/lib/RT/URI/freeside/Internal.pm index 9ca06306d..0bc4c9010 100644 --- a/rt/lib/RT/URI/freeside/Internal.pm +++ b/rt/lib/RT/URI/freeside/Internal.pm @@ -107,6 +107,12 @@ sub smart_search { #Subroutine  } +sub email_search { #Subroutine + +  return map { { $_->hash } } &FS::cust_main::email_search(@_); + +} +  sub small_custview {    return &FS::CGI::small_custview(@_); | 
