From 27b0b17db98192df66fc51cc8f27dc7cc1b4ab8e Mon Sep 17 00:00:00 2001 From: Mark Wells Date: Sat, 16 Jul 2016 15:48:18 -0700 Subject: [PATCH] backport cust_payby changes onto cust_main instead --- FS/FS/Schema.pm | 1 + FS/FS/Upgrade.pm | 3 --- FS/FS/cust_main.pm | 27 +++++++++++++++++++++------ 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}; -- 2.11.0