diff options
| -rw-r--r-- | FS/FS/ClientAPI/MyAccount.pm | 56 | ||||
| -rw-r--r-- | fs_selfservice/FS-SelfService/SelfService.pm | 9 | 
2 files changed, 40 insertions, 25 deletions
diff --git a/FS/FS/ClientAPI/MyAccount.pm b/FS/FS/ClientAPI/MyAccount.pm index ddd4367b7..5b2421b75 100644 --- a/FS/FS/ClientAPI/MyAccount.pm +++ b/FS/FS/ClientAPI/MyAccount.pm @@ -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 { diff --git a/fs_selfservice/FS-SelfService/SelfService.pm b/fs_selfservice/FS-SelfService/SelfService.pm index 8d9982618..ecbb6e932 100644 --- a/fs_selfservice/FS-SelfService/SelfService.pm +++ b/fs_selfservice/FS-SelfService/SelfService.pm @@ -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.  | 
