RT#15006: Bug? Cancelled customers shown in reports?
[freeside.git] / httemplate / search / cust_main.cgi
index e6ab195..da6c89d 100755 (executable)
 %    foreach my $cust_pkg ( @{$all_pkgs{$custnum}} ) {
 %      my %cust_svc_by_svcpart;
 %      my $rows = 0;
-%      local($FS::part_pkg::cache_enabled) = 1; #for $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
+%      #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 )
+%        #$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 = $part_svc->num_cust_svc;
 %          $rows += 2;
 %        }
 %        elsif ( $num_cust_svc ) {
-%          $cust_svc_by_svcpart{$svcpart} = $part_svc->cust_pkg_svc;
+%          #$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
 
 %    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;
 %
@@ -488,7 +501,7 @@ if ( $cgi->param('browse')
     );
   }
 
-  @cust_main = grep { $_->num_ncancelled_pkgs || ! $_->num_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
@@ -690,12 +703,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;
 }