Merge branch 'master' of git.freeside.biz:/home/git/freeside
[freeside.git] / FS / FS / cust_main / Packages.pm
index ab7bde3..11c13e5 100644 (file)
@@ -17,7 +17,7 @@ FS::cust_main::Packages - Packages mixin for cust_main
 
 =head1 SYNOPSIS
 
-=head1 DESRIPTION
+=head1 DESCRIPTION
 
 These methods are available on FS::cust_main objects;
 
@@ -40,7 +40,8 @@ FS::cust_pkg object
 
 =item cust_location
 
-Optional FS::cust_location object
+Optional FS::cust_location object.  If not specified, the customer's 
+ship_location will be used.
 
 =item svcs
 
@@ -105,6 +106,9 @@ sub order_pkg {
     }
     $cust_pkg->locationnum($opt->{'cust_location'}->locationnum);
   }
+  else {
+    $cust_pkg->locationnum($self->ship_locationnum);
+  }
 
   $cust_pkg->custnum( $self->custnum );
 
@@ -142,7 +146,6 @@ sub order_pkg {
 
 }
 
-#deprecated #=item order_pkgs HASHREF [ , SECONDSREF ] [ , OPTION => VALUE ... ]
 =item order_pkgs HASHREF [ , OPTION => VALUE ... ]
 
 Like the insert method on an existing record, this method orders multiple
@@ -185,9 +188,7 @@ values of the prepaid card.`
 sub order_pkgs {
   my $self = shift;
   my $cust_pkgs = shift;
-  my $seconds_ref = ref($_[0]) ? shift : ''; #deprecated
   my %options = @_;
-  $seconds_ref ||= $options{'seconds_ref'};
 
   local($DEBUG) = $FS::cust_main::DEBUG if $FS::cust_main::DEBUG > $DEBUG;
 
@@ -213,10 +214,8 @@ sub order_pkgs {
     my $error = $self->order_pkg(
       'cust_pkg'     => $cust_pkg,
       'svcs'         => $cust_pkgs->{$cust_pkg},
-      'seconds_ref'  => $seconds_ref,
-      map { $_ => $options{$_} } qw( upbytes_ref downbytes_ref totalbytes_ref
-                                     depend_jobnum
-                                   )
+      map { $_ => $options{$_} }
+        qw( seconds_ref upbytes_ref downbytes_ref totalbytes_ref depend_jobnum )
     );
     if ( $error ) {
       $dbh->rollback if $oldAutoCommit;
@@ -356,6 +355,7 @@ Returns all suspended packages (see L<FS::cust_pkg>) for this customer.
 
 sub suspended_pkgs {
   my $self = shift;
+  return $self->num_suspended_pkgs unless wantarray;
   grep { $_->susp } $self->ncancelled_pkgs;
 }
 
@@ -382,6 +382,7 @@ this customer.
 
 sub unsuspended_pkgs {
   my $self = shift;
+  return $self->num_unsuspended_pkgs unless wantarray;
   grep { ! $_->susp } $self->ncancelled_pkgs;
 }
 
@@ -400,16 +401,36 @@ sub active_pkgs {
        $self->unsuspended_pkgs;
 }
 
+=item billing_pkgs
+
+Returns active packages, and also any suspended packages which are set to
+continue billing while suspended.
+
+=cut
+
+sub billing_pkgs {
+  my $self = shift;
+  grep { my $part_pkg = $_->part_pkg;
+         $part_pkg->freq ne '' && $part_pkg->freq ne '0'
+           && ( ! $_->susp || $_->option('suspend_bill',1)
+                           || ( $part_pkg->option('suspend_bill', 1)
+                                  && ! $_->option('no_suspend_bill',1)
+                              )
+              );
+       }
+       $self->ncancelled_pkgs;
+}
+
 =item next_bill_date
 
 Returns the next date this customer will be billed, as a UNIX timestamp, or
-undef if no active package has a next bill date.
+undef if no billing package has a next bill date.
 
 =cut
 
 sub next_bill_date {
   my $self = shift;
-  min( map $_->get('bill'), grep $_->get('bill'), $self->active_pkgs );
+  min( map $_->get('bill'), grep $_->get('bill'), $self->billing_pkgs );
 }
 
 =item num_cancelled_pkgs
@@ -427,6 +448,16 @@ sub num_ncancelled_pkgs {
   shift->num_pkgs("( cust_pkg.cancel IS NULL OR cust_pkg.cancel = 0 )");
 }
 
+sub num_suspended_pkgs {
+  shift->num_pkgs("     ( cust_pkg.cancel IS NULL OR cust_pkg.cancel = 0 )
+                    AND cust_pkg.susp IS NOT NULL AND cust_pkg.susp != 0   ");
+}
+
+sub num_unsuspended_pkgs {
+  shift->num_pkgs("     ( cust_pkg.cancel IS NULL OR cust_pkg.cancel = 0 )
+                    AND ( cust_pkg.susp   IS NULL OR cust_pkg.susp   = 0 ) ");
+}
+
 sub num_pkgs {
   my( $self ) = shift;
   my $sql = scalar(@_) ? shift : '';