Add configurable daily auto-disable for quotations. See RT#74665.
[freeside.git] / FS / FS / quotation.pm
index 38b9cd2..1a6641f 100644 (file)
@@ -133,8 +133,9 @@ sub check {
 
   $self->usernum($FS::CurrentUser::CurrentUser->usernum) unless $self->usernum;
 
-  return 'confidence must be an integer between 1 and 100'
-    if length($self->confidence) && (($self->confidence < 1) || ($self->confidence > 100));
+  return 'confidence percentage must be an integer between 1 and 100'
+    if length($self->confidence)
+    && ( ($self->confidence < 1) || ($self->confidence > 100) );
 
   return 'prospectnum or custnum must be specified'
     if ! $self->prospectnum
@@ -364,9 +365,8 @@ sub _items_total {
       'total_amount' => sprintf('%.2f',$total_recur),
       'break_after'  => 1,
     };
-    # show 'first payment' line (setup + recur) if there are no prorated 
-    # packages included
-    my $disable_total = 0;
+
+    my $prorate_total = 0;
     foreach my $quotation_pkg ($self->quotation_pkg) {
       my $part_pkg = $quotation_pkg->part_pkg;
       if (    $part_pkg->plan =~ /^(prorate|torrus|agent$)/
@@ -376,17 +376,27 @@ sub _items_total {
                   && $self->cust_main->billing_pkgs #num_billing_pkgs when we have it
               )
       ) {
-        $disable_total = 1;
+        $prorate_total = 1;
         last;
       }
     }
-    if (!$disable_total) {
+
+    if ( $prorate_total ) {
+      push @items, {
+        'total_item'   => $self->mt('First payment (depending on day of month)'),
+        'total_amount' => [ sprintf('%.2f', $total_setup),
+                            sprintf('%.2f', $total_setup + $total_recur)
+                          ],
+        'break_after'  => 1,
+      };
+    } else {
       push @items, {
         'total_item'   => $self->mt('First payment'),
         'total_amount' => sprintf('%.2f', $total_setup + $total_recur),
         'break_after'  => 1,
       };
     }
+
   }
 
   return @items;
@@ -399,7 +409,7 @@ sub _items_total {
 
 sub enable_previous { 0 }
 
-=item convert_cust_main
+=item convert_cust_main [ PARAMS ]
 
 If this quotation already belongs to a customer, then returns that customer, as
 an FS::cust_main object.
@@ -411,10 +421,13 @@ packages as real packages for the customer.
 If there is an error, returns an error message, otherwise, returns the
 newly-created FS::cust_main object.
 
+Accepts the same params as L</order>.
+
 =cut
 
 sub convert_cust_main {
   my $self = shift;
+  my $params = shift || {};
 
   my $cust_main = $self->cust_main;
   return $cust_main if $cust_main; #already converted, don't again
@@ -431,7 +444,7 @@ sub convert_cust_main {
 
   $self->prospectnum('');
   $self->custnum( $cust_main->custnum );
-  my $error = $self->replace || $self->order;
+  my $error = $self->replace || $self->order(undef,$params);
   if ( $error ) {
     $dbh->rollback if $oldAutoCommit;
     return $error;
@@ -443,7 +456,7 @@ sub convert_cust_main {
 
 }
 
-=item order [ HASHREF ]
+=item order [ HASHREF ] [ PARAMS ]
 
 This method is for use with quotations which are already associated with a customer.
 
@@ -455,11 +468,16 @@ If HASHREF is passed, it will be filled with a hash mapping the
 C<quotationpkgnum> of each quoted package to the C<pkgnum> of the package
 as ordered.
 
+If PARAMS hashref is passed, the following params are accepted:
+
+onhold - if true, suspends newly ordered packages
+
 =cut
 
 sub order {
   my $self = shift;
   my $pkgnum_map = shift || {};
+  my $params = shift || {};
   my $details_map = {};
 
   tie my %all_cust_pkg, 'Tie::RefHash';
@@ -510,10 +528,11 @@ sub order {
     }
   }
 
-  foreach my $quotationpkgnum (keys %$pkgnum_map) {
-    # convert the objects to just pkgnums
-    my $cust_pkg = $pkgnum_map->{$quotationpkgnum};
-    $pkgnum_map->{$quotationpkgnum} = $cust_pkg->pkgnum;
+  if ($$params{'onhold'}) {
+    foreach my $quotationpkgnum (keys %$pkgnum_map) {
+      last if $error;
+      $error = $pkgnum_map->{$quotationpkgnum}->suspend();
+    }
   }
 
   if ($error) {
@@ -522,6 +541,13 @@ sub order {
   }
 
   $dbh->commit or die $dbh->errstr if $oldAutoCommit;
+
+  foreach my $quotationpkgnum (keys %$pkgnum_map) {
+    # convert the objects to just pkgnums
+    my $cust_pkg = $pkgnum_map->{$quotationpkgnum};
+    $pkgnum_map->{$quotationpkgnum} = $cust_pkg->pkgnum;
+  }
+
   ''; #no error
 
 }