run_bill_events option for order_pkg, RT#42053
authorIvan Kohler <ivan@freeside.biz>
Mon, 25 Apr 2016 18:54:04 +0000 (11:54 -0700)
committerIvan Kohler <ivan@freeside.biz>
Mon, 25 Apr 2016 18:54:04 +0000 (11:54 -0700)
FS/FS/ClientAPI/MyAccount.pm
fs_selfservice/FS-SelfService/SelfService.pm

index ddd4367..5b2421b 100644 (file)
@@ -2342,7 +2342,7 @@ sub order_pkg {
   my $conf = new FS::Conf;
   if ( $conf->exists('signup_server-realtime') ) {
 
-    my $bill_error = _do_bop_realtime( $cust_main, $status );
+    my $bill_error = _do_bop_realtime( $cust_main, $status, 'collect'=>$p->{run_bill_events} );
 
     if ($bill_error) {
       $cust_pkg->cancel('quiet'=>1);
@@ -2468,39 +2468,45 @@ sub order_recharge {
 sub _do_bop_realtime {
   my ($cust_main, $status, %opt) = @_;
 
-    my $old_balance = $cust_main->balance;
+  my $old_balance = $cust_main->balance;
 
-    my @cust_bill;
-    my $bill_error = $cust_main->bill(
-      'return_bill'   => \@cust_bill,
-    );
-
-    $bill_error ||= $cust_main->apply_payments_and_credits;
+  my @cust_bill;
+  my $bill_error = $cust_main->bill(
+    'return_bill'   => \@cust_bill,
+  );
 
-    $bill_error ||= $cust_main->realtime_collect('selfservice' => 1)
-      if $cust_main->payby =~ /^(CARD|CHEK)$/;
+  $bill_error ||= $cust_main->apply_payments_and_credits;
 
-    if (    $cust_main->balance > $old_balance
-         && $cust_main->balance > 0
-         && ( $cust_main->payby !~ /^(BILL|DCRD|DCHK)$/
-                || $status eq 'suspended'
-            )
-       )
-    {
-      unless ( $opt{'no_invoice_void'} ) {
+  $bill_error ||= $cust_main->realtime_collect('selfservice' => 1)
+    if $cust_main->payby =~ /^(CARD|CHEK)$/;
 
-        #this used to apply a credit, but now we can void invoices...
-        foreach my $cust_bill (@cust_bill) {
-          my $voiderror = $cust_bill->void('automatic payment failed');
-          warn "Error voiding cust bill after decline: $voiderror" if $voiderror;
-        }
+  if (    $cust_main->balance > $old_balance
+       && $cust_main->balance > 0
+       && ( $cust_main->payby !~ /^(BILL|DCRD|DCHK)$/
+              || $status eq 'suspended'
+          )
+     )
+  {
+    unless ( $opt{'no_invoice_void'} ) {
 
+      #this used to apply a credit, but now we can void invoices...
+      foreach my $cust_bill (@cust_bill) {
+        my $voiderror = $cust_bill->void('automatic payment failed');
+        warn "Error voiding cust bill after decline: $voiderror" if $voiderror;
       }
 
-      return { 'error' => '_decline', 'bill_error' => $bill_error };
     }
 
-    '';
+    return { 'error' => '_decline', 'bill_error' => $bill_error };
+  }
+
+  if ( $opt{'collect'} ) {
+    my $collect_error = $cust_main->collect();
+    return { 'error' => '_decline', 'bill_error' => $collect_error }
+     if $collect_error; #?
+  }
+
+  '';
 }
 
 sub renew_info {
index 8d99826..ecbb6e9 100644 (file)
@@ -930,6 +930,10 @@ Number of total bytes gained by recharge
 
 Orders a package for this customer.
 
+If signup_server-realtime is set, bills the new package, attemps to collect
+payment and (for auto-payment customers) cancels the package if the payment is
+declined.
+
 Takes a hash reference as parameter with the following keys:
 
 =over 4
@@ -946,6 +950,11 @@ Package to order (see L<FS::part_pkg>).
 
 Quantity for this package order (default 1).
 
+=item run_bill_events
+
+If true, runs billing events for the customer after ordering and billing the
+package (signup_server-realtime must be set).
+
 =item locationnum
 
 Optional locationnum for this package order, for existing locations.