X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fcust_main%2FSearch.pm;h=31b89cd31e65fc3738bdcae103e4bbb2a0b5c767;hb=3ce70fff14b951189273348f4ddd06aa1069eafc;hp=06a4522f448f44fc251eb853eb07cd56e6ff375a;hpb=c34d1fcd9b979bb3598c32dfab4b6d79ccd5a010;p=freeside.git diff --git a/FS/FS/cust_main/Search.pm b/FS/FS/cust_main/Search.pm index 06a4522f4..31b89cd31 100644 --- a/FS/FS/cust_main/Search.pm +++ b/FS/FS/cust_main/Search.pm @@ -18,7 +18,7 @@ use FS::svc_acct; $DEBUG = 0; $me = '[FS::cust_main::Search]'; -@fuzzyfields = @FS::cust_main::fuzzyfields; +@fuzzyfields = ( 'first', 'last', 'company', 'address1' ); install_callback FS::UID sub { $conf = new FS::Conf; @@ -64,7 +64,8 @@ sub smart_search { my %options = @_; #here is the agent virtualization - my $agentnums_sql = $FS::CurrentUser::CurrentUser->agentnums_sql; + my $agentnums_sql = + $FS::CurrentUser::CurrentUser->agentnums_sql(table => 'cust_main'); my @cust_main = (); @@ -126,6 +127,12 @@ sub smart_search { || ( $conf->config('cust_main-agent_custid-format') eq 'ww?d+' && $search =~ /^\s*(\w\w?\d+)\s*$/ ) + || ( $conf->config('cust_main-custnum-display_special') + # it's not currently possible for special prefixes to contain + # digits, so just strip off any alphabetic prefix and match + # the rest to custnum + && $search =~ /^\s*[[:alpha:]]*(\d+)\s*$/ + ) || ( $conf->exists('address1-search' ) && $search =~ /^\s*(\d+\-?\w*)\s*$/ #i.e. 1234A or 9432-D ) @@ -142,10 +149,27 @@ sub smart_search { } ); } + # for all agents this user can see, if any of them have custnum prefixes + # that match the search string, include customers that match the rest + # of the custnum and belong to that agent + foreach my $agentnum ( $FS::CurrentUser::CurrentUser->agentnums ) { + my $p = $conf->config('cust_main-custnum-display_prefix', $agentnum); + next if !$p; + if ( $p eq substr($num, 0, length($p)) ) { + push @cust_main, qsearch( { + 'table' => 'cust_main', + 'hashref' => { 'custnum' => 0 + substr($num, length($p)), + 'agentnum' => $agentnum, + %options, + }, + } ); + } + } + push @cust_main, qsearch( { - 'table' => 'cust_main', - 'hashref' => { 'agent_custid' => $num, %options }, - 'extra_sql' => " AND $agentnums_sql", #agent virtualization + 'table' => 'cust_main', + 'hashref' => { 'agent_custid' => $num, %options }, + 'extra_sql' => " AND $agentnums_sql", #agent virtualization } ); if ( $conf->exists('address1-search') ) { @@ -433,6 +457,8 @@ HASHREF. Valid parameters are =item address +=item refnum + =item cancelled_pkgs bool @@ -471,6 +497,33 @@ sub search { my @where = (); my $orderby; + # initialize these to prevent warnings + $params = { + 'custnum' => '', + 'agentnum' => '', + 'usernum' => '', + 'status' => '', + 'address' => '', + 'paydate_year' => '', + 'invoice_terms' => '', + 'custbatch' => '', + %$params + }; + + ## + # explicit custnum(s) + ## + + if ( $params->{'custnum'} ) { + my @custnums = ref($params->{'custnum'}) ? + @{ $params->{'custnum'} } : + $params->{'custnum'}; + push @where, + 'cust_main.custnum IN (' . + join(',', map { $_ =~ /^(\d+)$/ ? $1 : () } @custnums ) . + ')' if scalar(@custnums) > 0; + } + ## # parse agent ## @@ -512,6 +565,13 @@ sub search { ')'; } + ### + # refnum + ### + if ( $params->{'refnum'} =~ /^(\d+)$/ ) { + push @where, "refnum = $1"; + } + ## # parse cancelled package checkbox ## @@ -690,11 +750,12 @@ sub search { $orderby ||= 'ORDER BY custnum'; # here is the agent virtualization - push @where, $FS::CurrentUser::CurrentUser->agentnums_sql; + push @where, + $FS::CurrentUser::CurrentUser->agentnums_sql(table => 'cust_main'); my $extra_sql = scalar(@where) ? ' WHERE '. join(' AND ', @where) : ''; - my $addl_from = 'LEFT JOIN cust_pkg USING ( custnum ) '; + my $addl_from = ''; my $count_query = "SELECT COUNT(*) FROM cust_main $extra_sql"; @@ -708,14 +769,18 @@ sub search { if ($params->{'flattened_pkgs'}) { + #my $pkg_join = ''; + if ($dbh->{Driver}->{Name} eq 'Pg') { push @select, "array_to_string(array(select pkg from cust_pkg left join part_pkg using ( pkgpart ) where cust_main.custnum = cust_pkg.custnum $pkgwhere),'|') as magic"; - }elsif ($dbh->{Driver}->{Name} =~ /^mysql/i) { - push @select, "GROUP_CONCAT(pkg SEPARATOR '|') as magic"; - $addl_from .= " LEFT JOIN part_pkg using ( pkgpart )"; - }else{ + } elsif ($dbh->{Driver}->{Name} =~ /^mysql/i) { + push @select, "GROUP_CONCAT(part_pkg.pkg SEPARATOR '|') as magic"; + $addl_from .= ' LEFT JOIN cust_pkg USING ( custnum ) '; #Pg too w/flatpkg? + $addl_from .= ' LEFT JOIN part_pkg USING ( pkgpart ) '; + #$pkg_join .= ' LEFT JOIN part_pkg USING ( pkgpart ) '; + } else { warn "warning: unknown database type ". $dbh->{Driver}->{Name}. "omitting packing information from report."; } @@ -755,6 +820,7 @@ sub search { my $sql_query = { 'table' => 'cust_main', 'select' => $select, + 'addl_from' => $addl_from, 'hashref' => {}, 'extra_sql' => $extra_sql, 'order_by' => $orderby, @@ -819,7 +885,7 @@ sub fuzzy_search { sub check_and_rebuild_fuzzyfiles { my $dir = $FS::UID::conf_dir. "/cache.". $FS::UID::datasrc; - rebuild_fuzzyfiles() if grep { ! -e "$dir/cust_main.$_" } @fuzzyfields + rebuild_fuzzyfiles() if grep { ! -e "$dir/cust_main.$_" } @fuzzyfields; } =item rebuild_fuzzyfiles @@ -840,7 +906,7 @@ sub rebuild_fuzzyfiles { flock(LOCK,LOCK_EX) or die "can't lock $dir/cust_main.$fuzzy: $!"; - open (CACHE,">$dir/cust_main.$fuzzy.tmp") + open (CACHE, '>:encoding(UTF-8)', "$dir/cust_main.$fuzzy.tmp") or die "can't open $dir/cust_main.$fuzzy.tmp: $!"; foreach my $field ( $fuzzy, "ship_$fuzzy" ) { @@ -862,6 +928,41 @@ sub rebuild_fuzzyfiles { } +=item append_fuzzyfiles FIRSTNAME LASTNAME COMPANY ADDRESS1 + +=cut + +sub append_fuzzyfiles { + #my( $first, $last, $company ) = @_; + + check_and_rebuild_fuzzyfiles(); + + use Fcntl qw(:flock); + + my $dir = $FS::UID::conf_dir. "/cache.". $FS::UID::datasrc; + + foreach my $field (@fuzzyfields) { + my $value = shift; + + if ( $value ) { + + open(CACHE, '>>:encoding(UTF-8)', "$dir/cust_main.$field" ) + or die "can't open $dir/cust_main.$field: $!"; + flock(CACHE,LOCK_EX) + or die "can't lock $dir/cust_main.$field: $!"; + + print CACHE "$value\n"; + + flock(CACHE,LOCK_UN) + or die "can't unlock $dir/cust_main.$field: $!"; + close CACHE; + } + + } + + 1; +} + =item all_X =cut @@ -869,7 +970,7 @@ sub rebuild_fuzzyfiles { sub all_X { my( $self, $field ) = @_; my $dir = $FS::UID::conf_dir. "/cache.". $FS::UID::datasrc; - open(CACHE,"<$dir/cust_main.$field") + open(CACHE, '<:encoding(UTF-8)', "$dir/cust_main.$field") or die "can't open $dir/cust_main.$field: $!"; my @array = map { chomp; $_; } ; close CACHE;