- 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));
+ if ( ref($self) && $self->is_encrypted($payinfo) ) {
+ return 'N/A';
+ } elsif ( $payinfo =~ /^99\d{14}$/ || $payinfo eq 'N/A' ) { #token
+ return 'N/A (tokenized)'; #?
+ } else { # if not, mask it...
+
+ if ($payby eq 'CARD' || $payby eq 'DCRD') {
+ #|| $payby eq 'MCRD') {
+ #MCRD isn't a card in payinfo,
+ #its a record of an _offline_
+ #card
+
+ # 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);
+
+ return substr($payinfo,0,$first).
+ 'x'x(length($payinfo)-$first-$last).
+ substr($payinfo,(length($payinfo)-$last));
+