X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fpayinfo_Mixin.pm;h=99cca6a8a162e7e6c517cb0b771cff5579594ffb;hp=652dc4149b5775b836ab2c528aac87d9f187ae7d;hb=7b125e587a4d1ee0aca692e23ea7897f671855ae;hpb=a0ddcb6b2ac38076c48e8f0b69e0758d5283303a diff --git a/FS/FS/payinfo_Mixin.pm b/FS/FS/payinfo_Mixin.pm index 652dc4149..99cca6a8a 100644 --- a/FS/FS/payinfo_Mixin.pm +++ b/FS/FS/payinfo_Mixin.pm @@ -14,7 +14,7 @@ package FS::some_table; use vars qw(@ISA); @ISA = qw( FS::payinfo_Mixin FS::Record ); -=had1 DESCRIPTION +=head1 DESCRIPTION This is a mixin class for records that contain payinfo. @@ -22,9 +22,7 @@ This class handles the following functions for payinfo... Payment Mask (Generation and Storage) Data Validation (parent checks need to be sure to call this) -Encryption - In the Future (Pull from Record.pm) -Bad Card Stuff - In the Future (Integrate Banned Pay) -Currency - In the Future +Pretty printing =head1 FIELDS @@ -110,21 +108,26 @@ sub paycvv { =cut sub paymask { - my($self,$paymask)=@_; + my($self, $paymask) = @_; - - if ($paymask ne '') { - # I hate this little bit of magic... I don't expect it to cause a problem, but who knows... - # If the payinfo is passed in masked then ignore it and set it based on the payinfo - # The only guy that should call this in this way is... $self->payinfo + if ( defined($paymask) && $paymask ne '' ) { + # I hate this little bit of magic... I don't expect it to cause a problem, + # but who knows... If the payinfo is passed in masked then ignore it and + # set it based on the payinfo. The only guy that should call this in this + # way is... $self->payinfo $self->setfield('paymask', $self->mask_payinfo()); + } else { + $paymask=$self->getfield('paymask'); if (!defined($paymask) || $paymask eq '') { - # Generate it if it's blank - Note that we're not going to set it - just generate + # Generate it if it's blank - Note that we're not going to set it - just + # generate $paymask = $self->mask_payinfo(); } + } + return $paymask; } @@ -134,28 +137,42 @@ sub paymask { =over 4 -=item mask_payinfo +=item mask_payinfo [ PAYBY, PAYINFO ] + +This method converts the payment info (credit card, bank account, etc.) into a +masked string. -This method converts the payment info (credit card, bank account, etc.) into a masked string. +Optionally, an arbitrary payby and payinfo can be passed. =cut sub mask_payinfo { my $self = shift; - my $paymask; - my $payinfo = $self->payinfo; - my $payby = $self->payby; + my $payby = scalar(@_) ? shift : $self->payby; + my $payinfo = scalar(@_) ? shift : $self->payinfo; + # Check to see if it's encrypted... - if ($self->is_encrypted($payinfo)) { + my $paymask; + if ( $self->is_encrypted($payinfo) ) { $paymask = 'N/A'; } else { # if not, mask it... - if ($payby eq 'CARD' || $payby eq 'DCRD' || $payby eq 'MCRD') { # Credit Cards (Show first and last four) - $paymask = substr($payinfo,0,6). 'x'x(length($payinfo)-10). substr($payinfo,(length($payinfo)-4)); - } elsif ($payby eq 'CHEK' || - $payby eq 'DCHK' ) { # Checks (Show last 2 @ bank) + if ($payby eq 'CARD' || $payby eq 'DCRD' || $payby eq 'MCRD') { + # Credit Cards + 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)); + } 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; + $paymask = 'x'x(length($account)-2). + substr($account,(length($account)-2))."@".$aba; } else { # Tie up loose ends $paymask = $payinfo; } @@ -190,9 +207,9 @@ sub payinfo_check { my $self = shift; FS::payby->can_payby($self->table, $self->payby) - or return "Illegal payby"; + or return "Illegal payby: ". $self->payby; - if ( $self->payby eq 'CARD' ) { + if ( $self->payby eq 'CARD' && ! $self->is_encrypted($self->payinfo) ) { my $payinfo = $self->payinfo; $payinfo =~ s/\D//g; $self->payinfo($payinfo); @@ -203,17 +220,65 @@ sub payinfo_check { validate($self->payinfo) or return "Illegal credit card number"; return "Unknown card type" if cardtype($self->payinfo) eq "Unknown"; } else { - $self->payinfo('N/A'); + $self->payinfo('N/A'); #??? } } else { - my $error = $self->ut_textn('payinfo'); - return $error if $error; + if ( $self->is_encrypted($self->payinfo) ) { + #something better? all it would cause is a decryption error anyway? + my $error = $self->ut_anything('payinfo'); + return $error if $error; + } else { + my $error = $self->ut_textn('payinfo'); + return $error if $error; + } } + + ''; + } +=item payby_payinfo_pretty + +Returns payment method and information (suitably masked, if applicable) as +a human-readable string, such as: + + Card #54xxxxxxxxxxxx32 + +or + + Check #119006 + +=cut + +sub payby_payinfo_pretty { + my $self = shift; + if ( $self->payby eq 'CARD' ) { + 'Card #'. $self->paymask; + } elsif ( $self->payby eq 'CHEK' ) { + 'E-check acct#'. $self->payinfo; + } elsif ( $self->payby eq 'BILL' ) { + 'Check #'. $self->payinfo; + } elsif ( $self->payby eq 'PREP' ) { + 'Prepaid card #'. $self->payinfo; + } elsif ( $self->payby eq 'CASH' ) { + 'Cash '. $self->payinfo; + } elsif ( $self->payby eq 'WEST' ) { + 'Western Union'; #. $self->payinfo; + } elsif ( $self->payby eq 'MCRD' ) { + 'Manual credit card'; #. $self->payinfo; + } else { + $self->payby. ' '. $self->payinfo; + } +} + +=back + =head1 BUGS -Have to add the future items... +Future items? + Encryption - In the Future (Pull from Record.pm) + Bad Card Stuff - In the Future (Integrate Banned Pay) + Currency - In the Future =head1 SEE ALSO