# custnum search (also try agent_custid), with some tweaking options if your
# legacy cust "numbers" have letters
}
-
- if ( $search =~ /^\s*(\d+)\s*$/
+
+
+ if ( $search =~ /@/ ) {
+ push @cust_main,
+ map $_->cust_main,
+ qsearch( {
+ 'table' => 'cust_main_invoice',
+ 'hashref' => { 'dest' => $search },
+ }
+ );
+ } elsif ( $search =~ /^\s*(\d+)\s*$/
|| ( $conf->config('cust_main-agent_custid-format') eq 'ww?d+'
&& $search =~ /^\s*(\w\w?\d+)\s*$/
)
} elsif ( ! $NameParse->parse($value) ) {
my %name = $NameParse->components;
- $first = $name{'given_name_1'};
+ $first = $name{'given_name_1'} || $name{'initials_1'}; #wtf NameParse, Ed?
$last = $name{'surname_1'};
}
=item status
+=item address
+
=item cancelled_pkgs
bool
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
##
#push @where, $class->$method();
push @where, FS::cust_main->$method();
}
-
+
+ ##
+ # address
+ ##
+ if ( $params->{'address'} =~ /\S/ ) {
+ my $address = dbh->quote('%'. lc($params->{'address'}). '%');
+ push @where, '('. join(' OR ',
+ map "LOWER($_) LIKE $address",
+ qw(address1 address2 ship_address1 ship_address2)
+ ).
+ ')';
+ }
+
##
# parse cancelled package checkbox
##
push @where, "(censustract = '' or censustract is null)"
if $params->{'no_censustract'};
+ ##
+ # parse with hardcoded tax location checkbox
+ ##
+
+ push @where, "geocode is not null"
+ if $params->{'with_geocode'};
+
##
# dates
##
"cust_main.$field >= $beginning",
"cust_main.$field <= $ending";
- # XXX: do this for mysql and/or pull it out of here
if(defined $hour) {
- if ($dbh->{Driver}->{Name} eq 'Pg') {
+ if ($dbh->{Driver}->{Name} =~ /Pg/i) {
push @where, "extract(hour from to_timestamp(cust_main.$field)) = $hour";
}
+ elsif( $dbh->{Driver}->{Name} =~ /mysql/i) {
+ push @where, "hour(from_unixtime(cust_main.$field)) = $hour"
+ }
else {
warn "search by time of day not supported on ".$dbh->{Driver}->{Name}." databases";
}
push @where,
"cust_main.custbatch = '$1'";
}
+
+ if ( $params->{'tagnum'} ) {
+ my @tagnums = ref( $params->{'tagnum'} ) ? @{ $params->{'tagnum'} } : ( $params->{'tagnum'} );
+
+ @tagnums = grep /^(\d+)$/, @tagnums;
+
+ if ( @tagnums ) {
+ my $tags_where = "0 < (select count(1) from cust_tag where "
+ . " cust_tag.custnum = cust_main.custnum and tagnum in ("
+ . join(',', @tagnums) . "))";
+
+ push @where, $tags_where;
+ }
+ }
+
##
# setup queries, subs, etc. for the search
my $count_query = "SELECT COUNT(*) FROM cust_main $extra_sql";
- my $select = join(', ',
+ my @select = (
'cust_main.custnum',
FS::UI::Web::cust_sql_fields($params->{'cust_fields'}),
);
if ($dbh->{Driver}->{Name} eq 'Pg') {
- $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";
+ 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) {
- $select .= ", GROUP_CONCAT(pkg SEPARATOR '|') as magic";
+ push @select, "GROUP_CONCAT(pkg SEPARATOR '|') as magic";
$addl_from .= " LEFT JOIN part_pkg using ( pkgpart )";
}else{
warn "warning: unknown database type ". $dbh->{Driver}->{Name}.
}
+ if ( $params->{'with_geocode'} ) {
+
+ unshift @extra_headers, 'Tax location override', 'Calculated tax location';
+ unshift @extra_fields, sub { my $c = shift; $c->get('geocode'); },
+ sub { my $c = shift;
+ $c->set('geocode', '');
+ $c->geocode('cch'); #XXX only cch right now
+ };
+ push @select, 'geocode';
+ push @select, 'zip' unless grep { $_ eq 'zip' } @select;
+ push @select, 'ship_zip' unless grep { $_ eq 'ship_zip' } @select;
+ }
+
+ my $select = join(', ', @select);
+
my $sql_query = {
'table' => 'cust_main',
'select' => $select,