X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fpayinfo_Mixin.pm;h=7b713efd3b81af55cc63d729d22c2ce0e1a518d2;hb=96783bdc58be6e4f2fc56d516a9ceba57af00ba8;hp=9995183d803941c8cb764353eb9d9365d2b0f173;hpb=db5ec932751add5d462c9fc9be90152c1b7565d0;p=freeside.git diff --git a/FS/FS/payinfo_Mixin.pm b/FS/FS/payinfo_Mixin.pm index 9995183d8..7b713efd3 100644 --- a/FS/FS/payinfo_Mixin.pm +++ b/FS/FS/payinfo_Mixin.pm @@ -3,6 +3,7 @@ package FS::payinfo_Mixin; use strict; use Business::CreditCard; use FS::payby; +use FS::Record qw(qsearch); =head1 NAME @@ -132,34 +133,47 @@ sub mask_payinfo { my $payinfo = scalar(@_) ? shift : $self->payinfo; # Check to see if it's encrypted... - my $paymask; if ( $self->is_encrypted($payinfo) ) { - $paymask = 'N/A'; + return 'N/A'; } elsif ( $payinfo =~ /^99\d{14}$/ || $payinfo eq 'N/A' ) { #token - $paymask = 'N/A (tokenized)'; #? - } else { - # if not, mask it... + return 'N/A (tokenized)'; #? + } else { # if not, mask it... + if ($payby eq 'CARD' || $payby eq 'DCRD' || $payby eq 'MCRD') { + # Credit Cards + + # special handling for Local Isracards: always show last 4 + if ( $payinfo =~ /^(\d{8,9})$/ ) { + + return 'x'x(length($payinfo)-4). + substr($payinfo,(length($payinfo)-4)); + + } + my $conf = new FS::Conf; my $mask_method = $conf->config('card_masking_method') || 'first6last4'; $mask_method =~ /^first(\d+)last(\d+)$/ or die "can't parse card_masking_method $mask_method"; my($first, $last) = ($1, $2); - $paymask = substr($payinfo,0,$first). - 'x'x(length($payinfo)-$first-$last). - substr($payinfo,(length($payinfo)-$last)); + return substr($payinfo,0,$first). + 'x'x(length($payinfo)-$first-$last). + substr($payinfo,(length($payinfo)-$last)); + } elsif ($payby eq 'CHEK' || $payby eq 'DCHK' ) { + # Checks (Show last 2 @ bank) my( $account, $aba ) = split('@', $payinfo ); - $paymask = 'x'x(length($account)-2). - substr($account,(length($account)-2))."@".$aba; + return 'x'x(length($account)-2). + substr($account,(length($account)-2)). + ( length($aba) ? "@".$aba : ''); + } else { # Tie up loose ends - $paymask = $payinfo; + return $payinfo; } } - $paymask; + #die "shouldn't be reached"; } =item payinfo_check @@ -196,7 +210,7 @@ sub payinfo_check { $payinfo =~ s/\D//g; $self->payinfo($payinfo); if ( $self->payinfo ) { - $self->payinfo =~ /^(\d{13,16})$/ + $self->payinfo =~ /^(\d{13,16}|\d{8,9})$/ or return "Illegal (mistyped?) credit card number (payinfo)"; $self->payinfo($1); validate($self->payinfo) or return "Illegal credit card number"; @@ -254,6 +268,30 @@ sub payby_payinfo_pretty { } } +=item payinfo_used [ PAYINFO ] + +Returns 1 if there's an existing payment using this payinfo. This can be +used to set the 'recurring payment' flag required by some processors. + +=cut + +sub payinfo_used { + my $self = shift; + my $payinfo = shift || $self->payinfo; + my %hash = ( + 'custnum' => $self->custnum, + 'payby' => 'CARD', + ); + + return 1 + if qsearch('cust_pay', { %hash, 'payinfo' => $payinfo } ) + || qsearch('cust_pay', + { %hash, 'paymask' => $self->mask_payinfo('CARD', $payinfo) } ) + ; + + return 0; +} + =back =head1 BUGS