X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fcust_main%2FSearch.pm;h=6c79315f000fb955c89d3e7d09cf49b60a6d79d4;hb=1d41419b8faaf6ffb0fc51ba4fbea15bd452e30e;hp=7dbb7a859fca5876c79993767dd047563899e35b;hpb=110a9f8a594aa5cf5ac1cc9c91aee90fea67c949;p=freeside.git diff --git a/FS/FS/cust_main/Search.pm b/FS/FS/cust_main/Search.pm index 7dbb7a859..6c79315f0 100644 --- a/FS/FS/cust_main/Search.pm +++ b/FS/FS/cust_main/Search.pm @@ -9,6 +9,7 @@ use FS::Record qw( qsearch ); use FS::cust_main; use FS::cust_main_invoice; use FS::svc_acct; +use FS::payinfo_Mixin; @EXPORT_OK = qw( smart_search ); @@ -50,8 +51,12 @@ FS::cust_main::Search - Customer searching Accepts the following options: I, the string to search for. The string will be searched for as a customer number, phone number, name or company name, -as an exact, or, in some cases, a substring or fuzzy match (see the source code -for the exact heuristics used); I, causes smart_search to +address (if address1-search is on), invoicing email address, or credit card +number. + +Searches match as an exact, or, in some cases, a substring or fuzzy match (see +the source code for the exact heuristics used); I, causes +smart_search to skip fuzzy matching when an exact match is found. Any additional options are treated as an additional qualifier on the search @@ -109,12 +114,10 @@ sub smart_search { } - # custnum search (also try agent_custid), with some tweaking options if your - # legacy cust "numbers" have letters } - if ( $search =~ /@/ ) { + if ( $search =~ /@/ ) { #invoicing email address push @cust_main, map $_->cust_main, qsearch( { @@ -122,6 +125,9 @@ sub smart_search { 'hashref' => { 'dest' => $search }, } ); + + # custnum search (also try agent_custid), with some tweaking options if your + # legacy cust "numbers" have letters } elsif ( $search =~ /^\s*(\d+)\s*$/ || ( $conf->config('cust_main-agent_custid-format') eq 'ww?d+' && $search =~ /^\s*(\w\w?\d+)\s*$/ @@ -364,6 +370,28 @@ sub smart_search { } + ( my $nospace_search = $search ) =~ s/\s//g; + ( my $card_search = $nospace_search ) =~ s/\-//g; + $card_search =~ s/[x\*\.\_]/x/gi; + + if ( $nospace_search =~ /^[\dx]{16}$/i ) { #credit card search + + ( my $like_search = $card_search ) =~ s/x/_/g; + my $mask_search = FS::payinfo_Mixin->mask_payinfo('CARD', $card_search); + + push @cust_main, qsearch({ + 'table' => 'cust_main', + 'hashref' => {}, + 'extra_sql' => " WHERE ( payinfo LIKE '$like_search' + OR paymask = '$mask_search' + ) ". + " AND payby IN ('CARD','DCRD') ". + " AND $agentnums_sql", #agent virtulization + }); + + } + + #eliminate duplicates my %saw = (); @cust_main = grep { !$saw{$_->custnum}++ } @cust_main; @@ -624,14 +652,14 @@ sub search { # parse without census tract checkbox ## - push @where, "(censustract = '' or censustract is null)" + push @where, "(ship_location.censustract = '' or ship_location.censustract is null)" if $params->{'no_censustract'}; ## # parse with hardcoded tax location checkbox ## - push @where, "geocode is not null" + push @where, "ship_location.geocode is not null" if $params->{'with_geocode'}; ## @@ -841,7 +869,7 @@ sub search { 'ON (cust_main.'.$pre.'locationnum = '.$pre.'location.locationnum) '; } - my $count_query = "SELECT COUNT(*) FROM cust_main $extra_sql"; + my $count_query = "SELECT COUNT(*) FROM cust_main $addl_from $extra_sql"; my @select = ( 'cust_main.custnum', @@ -927,6 +955,8 @@ sub search { 'extra_headers' => \@extra_headers, 'extra_fields' => \@extra_fields, }; + warn Data::Dumper::Dumper($sql_query); + $sql_query; }