X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=httemplate%2Fsearch%2Fcust_main.cgi;h=24d49c588130828813bcdc9ab40ec983bb0f53d2;hp=2c09c692cd03e1a000bf27d7a4721106116fc43d;hb=1fc8addc56f8daf12397da568eb1ac1b27fd3984;hpb=63973c641c4be00765fa27e55c57cc5b9aa4da19 diff --git a/httemplate/search/cust_main.cgi b/httemplate/search/cust_main.cgi index 2c09c692c..24d49c588 100755 --- a/httemplate/search/cust_main.cgi +++ b/httemplate/search/cust_main.cgi @@ -4,6 +4,7 @@ % } else { <% $cgi->redirect(popurl(2). "view/cust_main.cgi?". $cust_main[0]->custnum) %> % } +% $m->abort; %} elsif ( scalar(@cust_main) == 0 ) { % errorpage(emt("No matching customers found!")); % } # errorpage quits, so we don't need an 'else' below @@ -37,6 +38,10 @@ ( <% mt("$linklabel canceled customers") |h %> ) % } +% unless ($cgi->param('browse')) { + <& /elements/agent_transfer_link.html, {'list' => \@cust_main} &> +% } + % if ( $cgi->param('referral_custnum') ) { % $cgi->param('referral_custnum') =~ /^(\d+)$/ % or errorpage(emt("Illegal referral_custnum")); @@ -119,9 +124,24 @@ % foreach my $cust_pkg ( @{$all_pkgs{$custnum}} ) { % my %cust_svc_by_svcpart; % my $rows = 0; -% foreach my $part_svc ( $cust_pkg->part_svc ) { +% #local($FS::part_pkg::cache_enabled) = 1; #for $cust_pkg->part_svc +% local($FS::cust_svc::cache_enabled) = 1; #for $cust_svc->part_svc +% #local($FS::pkg_svc::cache_enabled) = 1; #for $pkg_svc->part_svc +% foreach my $part_svc ( +% #$cust_pkg->part_svc( summarize_size=>$large_pkg_size ) +% qsearch({ +% 'select' => 'part_svc.*, COUNT(*) AS num_cust_svc', +% 'table' => 'part_svc', +% 'addl_from' => 'LEFT JOIN cust_svc USING ( svcpart )', +% 'extra_sql' => 'WHERE pkgnum = ? '. +% ' GROUP BY '. join(', ', +% map "part_svc.$_", fields('part_svc') +% ), +% 'extra_param' => [ [$cust_pkg->pkgnum,'int'] ], +% }) +% ) { % my $svcpart = $part_svc->svcpart; -% my $num_cust_svc = $cust_pkg->num_cust_svc($svcpart); +% my $num_cust_svc = $part_svc->num_cust_svc; % if ( $large_pkg_size > 0 and $num_cust_svc >= $large_pkg_size ) { % # don't retrieve the cust_svc records, just stash the % # part_svc and num_cust_svc for later @@ -130,7 +150,9 @@ % $rows += 2; % } % elsif ( $num_cust_svc ) { -% $cust_svc_by_svcpart{$svcpart} = [ $cust_pkg->cust_svc($svcpart) ]; +% #$cust_svc_by_svcpart{$svcpart} = $part_svc->cust_pkg_svc; +% #further optimization opportunities: don't need to re-pull in another $part_svc object, sorting this is expensive, etc. +% $cust_svc_by_svcpart{$svcpart} = [ $cust_pkg->cust_svc($part_svc->svcpart) ]; % $rows += $num_cust_svc; % } #if summarize % } #foreach $part_svc @@ -150,15 +172,15 @@ % ? qq!!. encode_entities($company). '' % : ' '; % -% my $status = $cust_main->status; -% my $statuscol = $cust_main->statuscolor; +% my $status_label = $cust_main->status_label; +% my $statuscolor = $cust_main->statuscolor; > <% $cust_main->display_custnum %> > - <% ucfirst($status) %> + <% $status_label %> > <% "$last, $first" |h %> @@ -230,11 +252,12 @@ % my $n1 = ''; % foreach ( @{$all_pkgs{$custnum}} ) { +% local($FS::cust_svc::cache_enabled) = 1; #for $cust_svc->part_svc % my $pkgnum = $_->pkgnum; % my $part_pkg = $_->part_pkg; % -% my $pkg_comment = $part_pkg->pkg_comment(nopkgpart => 1); -% my $show = $curuser->default_customer_view =~ /^(jumbo|packages)$/ +% my $pkg_comment = $part_pkg->pkg_comment( cust_pkg=>$_, nopkgpart=>1 ); +% my $show = $default_customer_view =~ /^(jumbo|packages)$/ % ? '' % : ';show=packages'; % my $frag = "cust_pkg$pkgnum"; #hack for IE ignoring real #fragment @@ -277,12 +300,13 @@ % } % elsif ( scalar @$these ) { # do not summarize % foreach my $cust_svc ( @$these ) { +% my $part_svc = $cust_svc->part_svc; <% $n2 %> <% $td %> - <% FS::UI::Web::svc_link($m, $cust_svc->part_svc, $cust_svc) %> + <% FS::UI::Web::svc_link($m, $part_svc, $cust_svc) %> <% $td %> - <% FS::UI::Web::svc_label_link($m, $cust_svc->part_svc, $cust_svc) %> + <% FS::UI::Web::svc_label_link($m, $part_svc, $cust_svc) %> % $n2=""; % } #foreach $cust_svc @@ -310,13 +334,16 @@ my $curuser = $FS::CurrentUser::CurrentUser; die "access denied" - unless $curuser->access_right('List all customers'); + unless $curuser->access_right('List all customers') + || $curuser->access_right('List customers'); my $conf = new FS::Conf; -my $maxrecords = $conf->config('maxsearchrecordsperpage'); +my $maxrecords = $conf->config('maxsearchrecordsperpage') || 100; # summarize more than this many services of the same svcpart my $large_pkg_size = $conf->config('cust_pkg-large_pkg_size') || 0; +my $default_customer_view = $curuser->default_customer_view; + my $limit = ''; $limit .= "LIMIT $maxrecords" if $maxrecords; @@ -329,9 +356,11 @@ my(@cust_main, $sortby, $orderby); my @select = (); my @addl_headers = (); my @addl_cols = (); -if ( $cgi->param('browse') - || $cgi->param('otaker_on') - || $cgi->param('agentnum_on') +if ( ( $cgi->param('browse') + || $cgi->param('otaker_on') + || $cgi->param('agentnum_on') + ) + and $curuser->access_right('List all customers') ) { my %search = (); @@ -341,7 +370,12 @@ if ( $cgi->param('browse') if ( $query eq 'custnum' ) { if ( $conf->exists('cust_main-default_agent_custid') ) { $sortby=\*display_custnum_sort; - $orderby = "ORDER BY CASE WHEN agent_custid IS NOT NULL AND agent_custid != '' THEN CAST(agent_custid AS BIGINT) ELSE custnum END"; + $orderby = "ORDER BY CASE WHEN agent_custid IS NOT NULL + AND agent_custid != '' + AND agent_custid ". regexp_sql. " '^[0-9]+\$' + THEN CAST(agent_custid AS BIGINT) + ELSE custnum + END"; } else { $sortby=\*custnum_sort; $orderby = "ORDER BY custnum"; @@ -393,6 +427,7 @@ if ( $cgi->param('browse') push @qual, FS::cust_main->cancel_sql if $cgi->param('cancelled'); push @qual, FS::cust_main->prospect_sql if $cgi->param('prospect'); + push @qual, FS::cust_main->ordered_sql if $cgi->param('ordered'); push @qual, FS::cust_main->active_sql if $cgi->param('active'); push @qual, FS::cust_main->inactive_sql if $cgi->param('inactive'); push @qual, FS::cust_main->susp_sql if $cgi->param('suspended'); @@ -470,11 +505,10 @@ if ( $cgi->param('browse') $orderby = "ORDER BY LOWER(company || ' ' || last || ' ' || first )"; push @cust_main, smart_search( 'search' => scalar($cgi->param('search_cust')), - 'no_fuzzy_on_exact' => ! $curuser->option('enable_fuzzy_on_exact'), ); } - @cust_main = grep { $_->ncancelled_pkgs || ! $_->all_pkgs } @cust_main + @cust_main = grep { $_->status ne 'cancelled' } @cust_main if ! $cgi->param('cancelled') && ( $cgi->param('showcancelledcustomers') eq '0' #see if it was set by me @@ -486,11 +520,34 @@ if ( $cgi->param('browse') @cust_main = grep { !$saw{$_->custnum}++ } @cust_main; } -my %all_pkgs; -if ( $conf->exists('hidecancelledpackages' ) ) { - %all_pkgs = map { $_->custnum => [ $_->ncancelled_pkgs ] } @cust_main; -} else { - %all_pkgs = map { $_->custnum => [ $_->all_pkgs ] } @cust_main; +my %all_pkgs = (); +if ( scalar(@cust_main) > 1 || $cgi->param('referral_custnum') ) { + + my $pkgs_method = $conf->exists('hidecancelledpackages') + ? 'ncancelled_pkgs' + : 'all_pkgs'; + + #false laziness w/httemplate/view/cust_main/packages.html + my $select = join(',', + 'cust_pkg.*', + 'part_pkg.*', + 'setup_option.optionvalue AS _opt_setup_fee', + 'recur_option.optionvalue AS _opt_recur_fee', + ); + + my $addl_from = ' LEFT JOIN part_pkg USING ( pkgpart ) '. + FS::part_pkg->join_options_sql; + + local($FS::cust_pkg::cache_enabled) = 1; #for $cust_pkg->part_pkg + %all_pkgs = map { $_->custnum => + [ $_->$pkgs_method({ select => $select, + addl_from => $addl_from, + skip_label_sort => 1, + }) + ]; + } + @cust_main; + } sub last_sort { @@ -532,7 +589,7 @@ sub cardsearch { my($card)=$cgi->param('card'); $card =~ s/\D//g; - $card =~ /^(\d{13,16}|\d{8,9})$/ or errorpage(emt("Illegal card number")); + $card =~ /^(\d{13,19}|\d{8,9})$/ or errorpage(emt("Illegal card number")); my($payinfo)=$1; [ qsearch('cust_main',{'payinfo'=>$payinfo, 'payby'=>'CARD'}), @@ -653,12 +710,20 @@ sub address2search { or errorpage(emt("Illegal address2")); my $address2 = $1; - push @cust_main, qsearch( 'cust_main', - { 'address2' => { 'op' => 'ILIKE', - 'value' => $address2 } } ); - push @cust_main, qsearch( 'cust_main', - { 'ship_address2' => { 'op' => 'ILIKE', - 'value' => $address2 } } ); + # matching at the start or end of an address, but not in the middle + my @where; + foreach my $toggle (0,1) { + push @where, 'LOWER(cust_location.address2) LIKE LOWER(' + . dbh->quote($toggle ? $address2 . '%' : '%' . $address2) + . ')'; + } + + push @cust_main, qsearch({ + 'debug' => 1, + 'table' => 'cust_main', + 'addl_from' => 'JOIN cust_location ON (cust_location.locationnum IN (cust_main.bill_locationnum, cust_main.ship_locationnum))', + 'extra_sql' => 'WHERE ' . join(' OR ',@where), + }); \@cust_main; }