#avoid posix regexes for portability
$search =
+ # Visa
" ( ( substring($table.payinfo from 1 for 1) = '4' ".
+ # is not Switch
" AND substring($table.payinfo from 1 for 4) != '4936' ".
" AND substring($table.payinfo from 1 for 6) ".
" NOT $similar_to '49030[2-9]' ".
" AND substring($table.payinfo from 1 for 6) ".
" NOT $similar_to '49118[1-2]' ".
" )".
+ # MasterCard
" OR substring($table.payinfo from 1 for 2) = '51' ".
" OR substring($table.payinfo from 1 for 2) = '52' ".
" OR substring($table.payinfo from 1 for 2) = '53' ".
" OR substring($table.payinfo from 1 for 2) = '54' ".
" OR substring($table.payinfo from 1 for 2) = '54' ".
" OR substring($table.payinfo from 1 for 2) = '55' ".
-# " OR substring($table.payinfo from 1 for 2) = '36' ". #Diner's int'l was processed as Visa/MC inside US, now Discover
+ " OR substring($table.payinfo from 1 for 4) $similar_to '222[1-9]' ".
+ " OR substring($table.payinfo from 1 for 3) $similar_to '22[3-9]' ".
+ " OR substring($table.payinfo from 1 for 2) $similar_to '2[3-6]' ".
+ " OR substring($table.payinfo from 1 for 3) $similar_to '27[0-1]' ".
+ " OR substring($table.payinfo from 1 for 4) = '2720' ".
" ) ";
} elsif ( $cardtype eq 'Amex' ) {
$search =
" ( substring($table.payinfo from 1 for 4 ) = '6011' ".
" OR substring($table.payinfo from 1 for 2 ) = '65' ".
- " OR substring($table.payinfo from 1 for 3 ) = '300' ".
+ " OR substring($table.payinfo from 1 for 3 ) = '300' ". # diner's 300-305
" OR substring($table.payinfo from 1 for 3 ) = '301' ".
" OR substring($table.payinfo from 1 for 3 ) = '302' ".
" OR substring($table.payinfo from 1 for 3 ) = '303' ".
" OR substring($table.payinfo from 1 for 3 ) = '304' ".
" OR substring($table.payinfo from 1 for 3 ) = '305' ".
- " OR substring($table.payinfo from 1 for 4 ) = '3095' ".
- " OR substring($table.payinfo from 1 for 2 ) = '36' ".
+ " OR substring($table.payinfo from 1 for 4 ) = '3095' ". # diner's 3095
+ " OR substring($table.payinfo from 1 for 2 ) = '36' ". # diner's 36, 38, 39
" OR substring($table.payinfo from 1 for 2 ) = '38' ".
" OR substring($table.payinfo from 1 for 2 ) = '39' ".
" OR substring($table.payinfo from 1 for 3 ) = '644' ".
" OR substring($table.payinfo from 1 for 3 ) = '647' ".
" OR substring($table.payinfo from 1 for 3 ) = '648' ".
" OR substring($table.payinfo from 1 for 3 ) = '649' ".
- ( $country =~ /^(US|CA)$/
- ?" OR substring($table.payinfo from 1 for 4 ) = '3528' ". # JCB cards in the 3528-3589 range identified as Discover inside US/CA
+ ( $country =~ /^(US|PR|VI|MP|PW|GU)$/
+ ?" OR substring($table.payinfo from 1 for 4 ) = '3528' ". # JCB cards in the 3528-3589 range identified as Discover inside US & territories (NOT Canada)
" OR substring($table.payinfo from 1 for 4 ) = '3529' ".
" OR substring($table.payinfo from 1 for 3 ) = '353' ".
" OR substring($table.payinfo from 1 for 3 ) = '354' ".
" OR substring($table.payinfo from 1 for 3 ) = '358' "
:""
).
- " OR substring($table.payinfo from 1 for 3 ) = '622' ". #China Union Pay processed as Discover outside CN
+ ( $country =~ /^(US|MX|AI|AG|AW|BS|BB|BM|BQ|VG|KY|CW|DM|DO|GD|GP|JM|MQ|MS|BL|KN|LC|VC|MF|SX|TT|TC)$/
+ ?" OR substring($table.payinfo from 1 for 3 ) $similar_to '62[24-68]' " #China Union Pay processed as Discover outside CN
+ :""
+ ).
" ) ";
} elsif ( $cardtype eq 'Maestro' ) {