diff options
author | Mark Wells <mark@freeside.biz> | 2016-07-14 23:32:19 -0700 |
---|---|---|
committer | Mark Wells <mark@freeside.biz> | 2016-07-14 23:32:19 -0700 |
commit | ad6c73ef3ac6288a8bf22a4adb15261ac22470b8 (patch) | |
tree | d299857e1f8e7803c2a99772b2f302b0aaba00dc /FS/FS/payinfo_Mixin.pm | |
parent | a7a655a033bb6913e721d0cb8105244b894331b9 (diff) |
store credit card type in cust_payby and transaction records, #71291, schema support
Diffstat (limited to 'FS/FS/payinfo_Mixin.pm')
-rw-r--r-- | FS/FS/payinfo_Mixin.pm | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/FS/FS/payinfo_Mixin.pm b/FS/FS/payinfo_Mixin.pm index 4176818..b32f13b 100644 --- a/FS/FS/payinfo_Mixin.pm +++ b/FS/FS/payinfo_Mixin.pm @@ -5,6 +5,7 @@ use Business::CreditCard; use FS::payby; use FS::Record qw(qsearch); use FS::UID qw(driver_name); +use FS::Cursor; use Time::Local qw(timelocal); use vars qw($ignore_masked_payinfo); @@ -194,6 +195,8 @@ sub payinfo_check { if ( $self->payby eq 'CARD' && ! $self->is_encrypted($self->payinfo) ) { my $payinfo = $self->payinfo; + my $cardtype = cardtype($payinfo); + $self->set('cardtype', $cardtype); if ( $ignore_masked_payinfo and $self->mask_payinfo eq $self->payinfo ) { # allow it } else { @@ -205,12 +208,18 @@ sub payinfo_check { $self->payinfo($1); validate($self->payinfo) or return "Illegal credit card number"; return "Unknown card type" if $self->payinfo !~ /^99\d{14}$/ #token - && cardtype($self->payinfo) eq "Unknown"; + && $cardtype eq "Unknown"; } else { $self->payinfo('N/A'); #??? } } } else { + if ( $self->payby eq 'CARD' and $self->paymask ) { + # if we can't decrypt the card, at least detect the cardtype + $self->set('cardtype', cardtype($self->paymask)); + } else { + $self->set('cardtype', ''); + } if ( $self->is_encrypted($self->payinfo) ) { #something better? all it would cause is a decryption error anyway? my $error = $self->ut_anything('payinfo'); @@ -404,6 +413,28 @@ sub paydate_epoch_sql { END" } +=item upgrade_set_cardtype + +Find all records with a credit card payment type and no cardtype, and +replace them in order to set their cardtype. + +=cut + +sub upgrade_set_cardtype { + my $class = shift; + # assign cardtypes to CARD/DCRDs that need them; check_payinfo_cardtype + # will do this. ignore any problems with the cards. + local $ignore_masked_payinfo = 1; + my $search = FS::Cursor->new({ + table => $class->table, + extra_sql => q[ WHERE payby IN('CARD','DCRD') AND cardtype IS NULL ], + }); + while (my $record = $search->fetch) { + my $error = $record->replace; + die $error if $error; + } +} + =back =head1 BUGS |