From: ivan Date: Tue, 1 Apr 2008 08:43:33 +0000 (+0000) Subject: last bit of magic for RT ticket customer auto-association: look for requestor email... X-Git-Tag: root_of_webpay_support~761 X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=4d3c77fe23ae72abb72e4cb9f8e77a84b2375e6a 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 --- 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, 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). + +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). + +=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(@_);