summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Wells <mark@freeside.biz>2016-07-16 15:48:18 -0700
committerMark Wells <mark@freeside.biz>2016-08-11 15:34:05 -0700
commit27b0b17db98192df66fc51cc8f27dc7cc1b4ab8e (patch)
treec5ec5beaf488c1838199d1d6b2b78bc0644a744a
parent77e088ce10a52b40743ff9ae7e82336f167db2f8 (diff)
backport cust_payby changes onto cust_main instead
-rw-r--r--FS/FS/Schema.pm1
-rw-r--r--FS/FS/Upgrade.pm3
-rw-r--r--FS/FS/cust_main.pm27
3 files changed, 22 insertions, 9 deletions
diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm
index 63c113c66..a49566772 100644
--- a/FS/FS/Schema.pm
+++ b/FS/FS/Schema.pm
@@ -1178,6 +1178,7 @@ sub tables_hashref {
'ship_mobile', 'varchar', 'NULL', 12, '', '',
'payby', 'char', '', 4, '', '',
'payinfo', 'varchar', 'NULL', 512, '', '',
+ 'paycardtype', 'varchar', 'NULL', $char_d, '', '',
'paycvv', 'varchar', 'NULL', 512, '', '',
'paymask', 'varchar', 'NULL', $char_d, '', '',
#'paydate', @date_type, '', '',
diff --git a/FS/FS/Upgrade.pm b/FS/FS/Upgrade.pm
index 481646d58..377a0b17f 100644
--- a/FS/FS/Upgrade.pm
+++ b/FS/FS/Upgrade.pm
@@ -391,9 +391,6 @@ sub upgrade_data {
'cust_refund' => [],
'banned_pay' => [],
- #paycardtype
- 'cust_payby' => [],
-
#default namespace
'payment_gateway' => [],
diff --git a/FS/FS/cust_main.pm b/FS/FS/cust_main.pm
index 8496684e3..bd463072c 100644
--- a/FS/FS/cust_main.pm
+++ b/FS/FS/cust_main.pm
@@ -239,6 +239,10 @@ Name on card or billing name
IP address from which payment information was received
+=item paycardtype
+
+The credit card type (deduced from the card number).
+
=item tax
Tax exempt, empty or `Y'
@@ -1962,9 +1966,12 @@ sub check {
validate($payinfo)
or return gettext('invalid_card'); # . ": ". $self->payinfo;
- return gettext('unknown_card_type')
- if $self->payinfo !~ /^99\d{14}$/ #token
- && cardtype($self->payinfo) eq "Unknown";
+ my $cardtype = cardtype($payinfo);
+ $cardtype = 'Tokenized' if $self->payinfo !~ /^99\d{14}$/; # token
+
+ return gettext('unknown_card_type') if $cardtype eq 'Unknown';
+
+ $self->set('paycardtype', $cardtype);
unless ( $ignore_banned_card ) {
my $ban = FS::banned_pay->ban_search( %{ $self->_banned_pay_hashref } );
@@ -1986,7 +1993,7 @@ sub check {
}
if (length($self->paycvv) && !$self->is_encrypted($self->paycvv)) {
- if ( cardtype($self->payinfo) eq 'American Express card' ) {
+ if ( $cardtype eq 'American Express card' ) {
$self->paycvv =~ /^(\d{4})$/
or return "CVV2 (CID) for American Express cards is four digits.";
$self->paycvv($1);
@@ -1999,7 +2006,6 @@ sub check {
$self->paycvv('');
}
- my $cardtype = cardtype($payinfo);
if ( $cardtype =~ /^(Switch|Solo)$/i ) {
return "Start date or issue number is required for $cardtype cards"
@@ -2096,6 +2102,11 @@ sub check {
unless qsearchs('prepay_credit', { 'identifier' => $self->payinfo } );
$self->paycvv('');
+ } elsif ( $self->payby =~ /^CARD|DCRD$/ and $self->paymask ) {
+ # either ignoring invalid cards, or we can't decrypt the payinfo, but
+ # try to detect the card type anyway. this never returns failure, so
+ # the contract of $ignore_invalid_cards is maintained.
+ $self->set('paycardtype', cardtype($self->paymask));
}
if ( $self->paydate eq '' || $self->paydate eq '-' ) {
@@ -2168,10 +2179,14 @@ sub check_payinfo_cardtype {
my $payinfo = $self->payinfo;
$payinfo =~ s/\D//g;
- return '' if $payinfo =~ /^99\d{14}$/; #token
+ if ( $payinfo =~ /^99\d{14}$/ ) {
+ $self->set('paycardtype', 'Tokenized');
+ return '';
+ }
my %bop_card_types = map { $_=>1 } values %{ card_types() };
my $cardtype = cardtype($payinfo);
+ $self->set('paycardtype', $cardtype);
return "$cardtype not accepted" unless $bop_card_types{$cardtype};