#'exp', @date_type, '', '',
'exp', 'varchar', 'NULL', 11, '', '',
'payname', 'varchar', 'NULL', $char_d, '', '',
+ 'paytype', 'varchar', 'NULL', $char_d, '', '',
'amount', @money_type, '', '',
'currency', 'char', 'NULL', 3, '', '',
'status', 'varchar', 'NULL', $char_d, '', '',
}
+ # at the time we do this, also migrate paytype into cust_pay_batch
+ # so that batches that are open before the migration can still be
+ # processed
+ my @cust_pay_batch = qsearch('cust_pay_batch', {
+ 'custnum' => $cust_main->custnum,
+ 'payby' => 'CHEK',
+ 'paytype' => '',
+ });
+ foreach my $cust_pay_batch (@cust_pay_batch) {
+ $cust_pay_batch->set('paytype', $cust_main->get('paytype'));
+ my $error = $cust_pay_batch->replace;
+ die "$error (setting cust_pay_batch.paytype)" if $error;
+ }
+
$cust_main->complimentary('Y') if $cust_main->payby eq 'COMP';
$cust_main->invoice_attn( $cust_main->payname )
'payinfo' => $options{payinfo} || $cust_payby->payinfo,
'exp' => $options{paydate} || $cust_payby->paydate,
'payname' => $options{payname} || $cust_payby->payname,
+ 'paytype' => $options{paytype} || $cust_payby->paytype,
'amount' => $amount, # consolidating
} );
=cut
# some helper routines
+#
+# _bop_recurring_billing: Checks whether this payment should have the
+# recurring_billing flag used by some B:OP interfaces (IPPay, PlugnPay,
+# vSecure, etc.). This works in two different modes:
+# - actual_oncard (default): treat the payment as recurring if the customer
+# has made a payment using this card before.
+# - transaction_is_recur: treat the payment as recurring if the invoice
+# being paid has any recurring package charges.
+
sub _bop_recurring_billing {
my( $self, %opt ) = @_;
=item payname - name on card
+=item paytype - account type ((personal|business) (checking|savings))
+
=item first - name
=item last - name
$error = $self->payinfo_check();
return $error if $error;
+ if ( $self->payby eq 'CHEK' ) {
+ # because '' is on the list of paytypes:
+ my $paytype = $self->paytype or return "Bank account type required";
+ if (grep { $_ eq $paytype} FS::cust_payby->paytypes) {
+ #ok
+ } else {
+ return "Bank account type '$paytype' is not allowed"
+ }
+ } else {
+ $self->set('paytype', '');
+ }
+
if ( $self->exp eq '' ) {
return "Expiration date required"
unless $self->payby =~ /^(CHEK|DCHK|WEST)$/;
$self->payinfo =~ /(\d+)@(\d+)/; # or else what?
$payment{account_number} = $1;
$payment{routing_code} = $2;
- $payment{account_type} = $cust_main->paytype;
+ $payment{account_type} = $self->paytype;
# XXX what if this isn't their regular payment method?
} else {
die "unsupported BatchPayment method: ".$pay_batch->payby;
}
+ my $recurring;
+ if ( $cust_main->status =~ /^active|suspended|ordered$/ ) {
+ if ( $self->payinfo_used ) {
+ $recurring = 'S'; # subsequent
+ } else {
+ $recurring = 'F'; # first use
+ }
+ } else {
+ $recurring = 'N'; # non-recurring
+ }
+
Business::BatchPayment->create(Item =>
# required
action => 'payment',
( map { $_ => $location->$_ } qw(address2 city state country zip) ),
invoice_number => $self->invnum,
+ recurring_billing => $recurring,
%payment,
);
}
#XXX paytype should actually be in the batch, but this will do for now
#27 checking debit, 37 savings debit
- my $transaction_code = ( $cust_main->paytype =~ /savings/i ? '37' : '27' );
+ my $transaction_code = ( $cust_pay_batch->paytype =~ /savings/i ? '37' : '27' );
+ # not $self->payname?
my $cust_name = substr($cust_main->name. (' 'x22), 0, 22);
$i++;
my $tracenum = $dest. substr(('0'x7). $i, -6);
) : (
ecpCheckRT => ($_->payinfo =~ /@(\d+)/),
ecpCheckDDA => ($_->payinfo =~ /(\d+)@/),
- ecpBankAcctType => $paytype{lc($_->cust_main->paytype)},
+ ecpBankAcctType => $paytype{lc($_->paytype)},
ecpDelvMethod => 'A',
),
avsZip => bytes_substr($_->zip, 0, 10),
'payinfo' => $payinfo,
'paymask' => $paymask,
'payname' => $payname,
+ 'paytype => $paytype,
%saveopt
);