okay. counts are needed for the package sort, so push the embedded counting into...
authorivan <ivan>
Mon, 30 Mar 2009 06:10:18 +0000 (06:10 +0000)
committerivan <ivan>
Mon, 30 Mar 2009 06:10:18 +0000 (06:10 +0000)
FS/FS/cust_main.pm
FS/FS/cust_pkg.pm
httemplate/view/cust_main/packages.html

index 256eb73..cc39983 100644 (file)
@@ -1819,17 +1819,13 @@ sub all_pkgs {
   my $self = shift;
   my $extra_qsearch = ref($_[0]) ? shift : {};
 
-  return $self->num_pkgs unless wantarray; #XXX doesn't work w/$extra_qsearch
+  return $self->num_pkgs unless wantarray || keys(%$extra_qsearch);
 
   my @cust_pkg = ();
   if ( $self->{'_pkgnum'} ) {
     @cust_pkg = values %{ $self->{'_pkgnum'}->cache };
   } else {
-    @cust_pkg = qsearch({
-      %$extra_qsearch,
-      'table'   => 'cust_pkg',
-      'hashref' => { 'custnum' => $self->custnum },
-    });
+    @cust_pkg = $self->_cust_pkg($extra_qsearch);
   }
 
   sort sort_packages @cust_pkg;
@@ -1885,11 +1881,7 @@ sub ncancelled_pkgs {
 
     $extra_qsearch->{'extra_sql'} .= ' AND ( cancel IS NULL OR cancel = 0 ) ';
 
-    @cust_pkg = qsearch({
-      %$extra_qsearch,
-      'table'     => 'cust_pkg',
-      'hashref'   => { 'custnum' => $self->custnum },
-    });
+    @cust_pkg = $self->_cust_pkg($extra_qsearch);
 
   }
 
@@ -1897,6 +1889,27 @@ sub ncancelled_pkgs {
 
 }
 
+sub _cust_pkg {
+  my $self = shift;
+  my $extra_qsearch = ref($_[0]) ? shift : {};
+
+  $extra_qsearch->{'select'} ||= '*';
+  $extra_qsearch->{'select'} .=
+   ',( SELECT COUNT(*) FROM cust_svc WHERE cust_pkg.pkgnum = cust_svc.pkgnum )
+     AS _num_cust_svc';
+
+  map {
+        $_->{'_num_cust_svc'} = $_->get('_num_cust_svc');
+        $_;
+      }
+  qsearch({
+    %$extra_qsearch,
+    'table'   => 'cust_pkg',
+    'hashref' => { 'custnum' => $self->custnum },
+  });
+
+}
+
 # This should be generalized to use config options to determine order.
 sub sort_packages {
   
@@ -1906,11 +1919,13 @@ sub sort_packages {
     #shouldn't get here...
     return 0;
   } else {
+    my $a_num_cust_svc = $a->num_cust_svc;
+    my $b_num_cust_svc = $b->num_cust_svc;
+    return 0  if !$a_num_cust_svc && !$b_num_cust_svc;
+    return -1 if  $a_num_cust_svc && !$b_num_cust_svc;
+    return 1  if !$a_num_cust_svc &&  $b_num_cust_svc;
     my @a_cust_svc = $a->cust_svc;
     my @b_cust_svc = $b->cust_svc;
-    return 0  if !scalar(@a_cust_svc) && !scalar(@b_cust_svc);
-    return -1 if  scalar(@a_cust_svc) && !scalar(@b_cust_svc);
-    return 1  if !scalar(@a_cust_svc) &&  scalar(@b_cust_svc);
     $a_cust_svc[0]->svc_x->label cmp $b_cust_svc[0]->svc_x->label;
   }
 
index 348b1e4..902b1d3 100644 (file)
@@ -1500,6 +1500,9 @@ sub num_cust_svc {
        && exists($self->{'_num_cust_svc'})
        && $self->{'_num_cust_svc'} =~ /\d/;
 
+  cluck "cust_pkg->num_cust_svc called, _num_cust_svc:".$self->{'_num_cust_svc'}
+    if $DEBUG > 2;
+
   my $sql = 'SELECT COUNT(*) FROM cust_svc WHERE pkgnum = ?';
   $sql .= ' AND svcpart = ?' if @_;
 
index 53ed6bf..d55560f 100755 (executable)
@@ -177,13 +177,9 @@ sub get_packages {
     join(', ', map "cust_pkg.$_", fields('cust_pkg') ). ', '.
     join(', ', map "part_pkg.$_", fields('part_pkg') );
 
-  my $num_cust_svc = 
-    '( SELECT COUNT(*) FROM cust_svc WHERE cust_pkg.pkgnum = cust_svc.pkgnum )';
-
   my @packages = $cust_main->$method( {
-    'select'    => " $cust_pkg_fields, $part_pkg_fields, ".
-                   " $num_cust_svc AS num_cust_svc ",
-    'addl_from' => ' LEFT JOIN part_pkg USING ( pkgpart ) ',
+    'select'    => "$cust_pkg_fields, $part_pkg_fields",
+    'addl_from' => 'LEFT JOIN part_pkg USING ( pkgpart )',
   } );
   my $num_old_packages = scalar(@packages);
 
@@ -192,7 +188,6 @@ sub get_packages {
     my %part_pkg = map  { /^part_pkg_(.+)$/ or die; ( $1 => $hash{$_} ); }
                    grep { /^part_pkg_/ } keys %hash;
     $cust_pkg->{'_pkgpart'} = new FS::part_pkg \%part_pkg;
-    $cust_pkg->{'_num_cust_svc'} = $cust_pkg->get('num_cust_svc');
   }
 
   unless ( $cgi->param('showoldpackages') ) {