git.iko.soy/typeable/credit-card
on master help sign in
Merge pull request #7 from typeable/ville/B2B-2693-mastercard-validation
commit26b148fef91738a6d9346e41dd6359e1047519b7 authorVille Tirronen <ville.tirronen@jyu.fi> dateMon 10 Jun 2024, 10:54 (2 years ago) parent60e18bac493dcf
1 file changed+18−13
src/Data/CreditCard.hs+18−13
src/Data/CreditCard.hs+18−13
@@ -370,22 +370,27 @@ guessCreditCardType n
370370 | otherwise = Nothing
371371 where
372372 isVisa = (4 == firstDigits 1) && (digitsLength `elem` [13,16,19])
373− isMasterCard = (inRange (51, 55) (firstDigits 2)) && (digitsLength == 16)
373+ isMasterCard = or
374+ [ inRange (51, 55) (firstDigits 2) && (digitsLength == 16)
375+ , inRange (2221, 2720) (firstDigits 4) && (digitsLength == 16)]
374376 isAmEx = (firstDigits 2 `elem` [34, 37]) && (digitsLength == 15)
375377 isUnionPay = (firstDigits 2 `elem` [62]) && (digitsLength `elem` [16,17,18,19])
376− isDiscoverCard =
377− (firstDigits 4 == 6011 || inRange (644, 649) (firstDigits 3)
378− || inRange (622126, 622925) (firstDigits 6) || firstDigits 2 == 65)
378+ isDiscoverCard = or
379+ [ firstDigits 4 == 6011
380+ , inRange (644, 649) (firstDigits 3)
381+ , inRange (622126, 622925) (firstDigits 6)
382+ , firstDigits 2 == 65]
379383 && (digitsLength `elem` [16, 19])
380− isDinersClub =
381− ((inRange (300, 305) (firstDigits 3) || firstDigits 3 == 309
382− || firstDigits 2 == 36 || inRange (38, 39) (firstDigits 2))
383− && digitsLength == 14)
384− || (firstDigits 2 `elem` [54, 55] && digitsLength == 16)
385− isJCB =
386− (inRange (3528, 3589) (firstDigits 4) && digitsLength `elem` [15, 16])
387− || (firstDigits 4 `elem` [1800, 2131] && digitsLength == 15)
388− || (firstDigits 6 == 357266 && digitsLength == 19)
384+ isDinersClub = or
385+ [ inRange (300, 305) (firstDigits 3) && digitsLength == 14
386+ , firstDigits 3 == 309 && digitsLength == 14
387+ , firstDigits 2 == 36 && digitsLength == 14
388+ , inRange (38, 39) (firstDigits 2) && digitsLength == 14
389+ , firstDigits 2 `elem` [54, 55] && digitsLength == 16]
390+ isJCB = or
391+ [ inRange (3528, 3589) (firstDigits 4) && digitsLength `elem` [15, 16]
392+ , firstDigits 4 `elem` [1800, 2131] && digitsLength == 15
393+ , firstDigits 6 == 357266 && digitsLength == 19]
389394 digitsLength = L.length $ n ^. _CreditCardNumber
390395 firstDigits x = poly10 @Integer $ L.take x
391396 $ n ^.. _CreditCardNumber . folded . to digitToNum