{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TupleSections #-} module Finance.IBAN.Germany ( BIC , BLZ , AccountNr , blzBICs , ibanFromLegacy , legacyFromIBAN ) where import Control.Arrow (second) import Data.Char (isDigit) import Data.Text (Text) import Finance.IBAN.Internal import Finance.IBAN.Germany.Core import Finance.IBAN.Germany.Data import qualified Data.ISO3166_CountryCodes as CC import qualified Data.HashMap.Strict as HM import qualified Data.Text as T ibanFromLegacy :: BLZ -> AccountNr -> (IBAN, Maybe BIC) ibanFromLegacy blz' account' = (IBAN (ibanWithChecksum checksum), mBIC) where mBIC = HM.lookup blz blzBICs ibanWithChecksum c = T.concat [cc, c, blz, accountStr] accountStr = T.justifyRight 10 '0' account cc = T.pack $ show CC.DE ibanCandidate = ibanWithChecksum "00" checksum = T.pack $ case show (98 - mod97_10 ibanCandidate) of [d,d'] -> [ d, d'] [d'] -> ['0', d'] filterNumbers = T.filter isDigit blz = filterNumbers blz' account = filterNumbers account' legacyFromIBAN :: IBAN -> (BLZ, AccountNr) legacyFromIBAN = second (T.dropWhile (== '0')) . T.splitAt 8 . T.drop 4 . rawIBAN