X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=httemplate%2Fsearch%2Fcust_main.html;h=c050c5bd1a090196958743ada807df5440ec3a8c;hb=4f6170e806c20e9de9ce26b195d7f2e58b04a404;hp=8ef1ecb9a5dade3392afd3d591418e863a44c532;hpb=9509e5bfb7f9331303153cac24d7bfecbe2ea9f1;p=freeside.git diff --git a/httemplate/search/cust_main.html b/httemplate/search/cust_main.html index 8ef1ecb9a..c050c5bd1 100755 --- a/httemplate/search/cust_main.html +++ b/httemplate/search/cust_main.html @@ -1,47 +1,172 @@ - - - Customer Search - - - - Customer Search - -

-
- Search for last name: - - using search method: - -

Search for company: - - using search methods: - -

Note: Fuzzy searching can take a while. Please be patient. - -

- -
Explanation of search methods: - - - +<% include( 'elements/search.html', + 'title' => 'Customer Search Results', + 'name' => 'customers', + 'query' => $sql_query, + 'count_query' => $count_query, + 'header' => [ FS::UI::Web::cust_header( + $cgi->param('cust_fields') + ), + @extra_headers, + ], + 'fields' => [ + \&FS::UI::Web::cust_fields, + @extra_fields, + ], + 'color' => [ FS::UI::Web::cust_colors(), + map '', @extra_fields + ], + 'style' => [ FS::UI::Web::cust_styles(), + map '', @extra_fields + ], + 'align' => [ FS::UI::Web::cust_aligns(), + map '', @extra_fields + ], + 'links' => [ ( map { $_ ne 'Cust. Status' ? $link : '' } + FS::UI::Web::cust_header( + $cgi->param('cust_fields') + ) + ), + map '', @extra_fields + ], + ) +%> +<%once> + +my $link = [ "${p}view/cust_main.cgi?", 'custnum' ]; + + <%init> die "access denied" - unless $FS::CurrentUser::CurrentUser->access_right('List customers'); + unless ( $FS::CurrentUser::CurrentUser->access_right('List customers') && + $FS::CurrentUser::CurrentUser->access_right('List packages') + ); + +my $dbh = dbh; +my $conf = new FS::Conf; +my $countrydefault = $conf->config('countrydefault'); + +my($query) = $cgi->keywords; + +my @where = (); + +## +# parse agent +## + +if ( $cgi->param('agentnum') =~ /^(\d+)$/ and $1 ) { + push @where, + "agentnum = $1"; +} + +## +# parse cancelled package checkbox +## + +my $pkgwhere = ""; + +$pkgwhere .= "AND (cancel = 0 or cancel is null)" + unless $cgi->param('cancelled_pkgs'); + +my $orderby; + +## +# dates +## + +foreach my $field (qw( signupdate )) { + + my($beginning, $ending) = FS::UI::Web::parse_beginning_ending($cgi, $field); + + next if $beginning == 0 && $ending == 4294967295; + + push @where, + "cust_main.$field IS NOT NULL", + "cust_main.$field >= $beginning", + "cust_main.$field <= $ending"; + + $orderby ||= "ORDER BY cust_main.$field"; + +} + +### +# payby +### + +my @payby = grep /^([A-Z]{4})$/, $cgi->param('payby'); +if ( @payby ) { + push @where, '( '. join(' OR ', map "cust_main.payby = '$_'", @payby). ' )'; +} + +## +# amounts +## + +my $balance_sql = FS::cust_main->balance_sql(); + +push @where, map { s/current_balance/$balance_sql/; $_ } + FS::UI::Web::parse_lt_gt($cgi, 'current_balance'); + +## +# setup queries, subs, etc. for the search +## + +$orderby ||= 'ORDER BY custnum'; + +# here is the agent virtualization +push @where, $FS::CurrentUser::CurrentUser->agentnums_sql; + +my $extra_sql = scalar(@where) ? ' WHERE '. join(' AND ', @where) : ''; + +my $addl_from = 'LEFT JOIN cust_pkg USING ( custnum ) '; + +my $count_query = "SELECT COUNT(*) FROM cust_main $extra_sql"; + +my $select = join(', ', + 'cust_main.custnum', + FS::UI::Web::cust_sql_fields($cgi->param('cust_fields')), + ); + +my (@extra_headers) = (); +my (@extra_fields) = (); + +if ($cgi->param('flattened_pkgs')) { + + 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"; + + }elsif ($dbh->{Driver}->{Name} =~ /^mysql/i) { + $select .= ", GROUP_CONCAT(pkg SEPARATOR '|') as magic"; + $addl_from .= " LEFT JOIN part_pkg using ( pkgpart )"; + }else{ + warn "warning: unknown database type ". $dbh->{Driver}->{Name}. + "omitting packing information from report."; + } + + my $header_query = "SELECT COUNT(cust_pkg.custnum = cust_main.custnum) AS count FROM cust_main $addl_from $extra_sql $pkgwhere group by cust_main.custnum order by count desc limit 1"; + + my $sth = dbh->prepare($header_query) or die dbh->errstr; + $sth->execute() or die $sth->errstr; + my $headerrow = $sth->fetchrow_arrayref; + my $headercount = $headerrow ? $headerrow->[0] : 0; + while($headercount) { + unshift @extra_headers, "Package ". $headercount; + unshift @extra_fields, eval q!sub {my $c = shift; + my @a = split '\|', $c->magic; + my $p = $a[!.--$headercount. q!]; + $p; + };!; + } + +} + +my $sql_query = { + 'table' => 'cust_main', + 'select' => $select, + 'hashref' => {}, + 'extra_sql' => "$extra_sql $orderby", +}; +