Esempio n. 1
0
        //TODO: Get rid of the exceptions used for logic and add tryparse instead
        public static BankAccountSe CreateBankAccount(string accountNumber)
        {
            var cleaned = AccountNumberValidator.Clean(accountNumber) ?? "";

            if (cleaned.Length < 6)
            {
                throw new ArgumentException("An account number is at least 6 digits");
            }
            BankAccountSe     a4          = null;
            ArgumentException a4Exception = null;

            try
            {
                a4 = CreateBankAccount(cleaned.Substring(0, 4), cleaned.Substring(4));
            }
            catch (ArgumentException ex)
            {
                a4Exception = ex;
            }
            BankAccountSe     a5          = null;
            ArgumentException a5Exception = null;

            try
            {
                //Assuming clearingnumber of length 5
                a5 = CreateBankAccount(cleaned.Substring(0, 5), cleaned.Substring(5));
                if (a5.Bank != ClearingNumberRange.SwebankName)
                {
                    throw new ArgumentException("5 digits clearing number are only allowed for Swedbank.");
                }
            }
            catch (ArgumentException ex)
            {
                a5Exception = ex;
            }

            //This should be impossible. Both length 4 and length 5 seem valid. This is an error
            if (a4Exception == null && a5Exception == null)
            {
                if (a4.Bank == ClearingNumberRange.SwebankName)
                {
                    //Both are valid and we have swedbank. We want a5 in this case
                    return(a5);
                }
                else
                {
                    throw new Exception("Bank account '" + accountNumber + "' seems to be valid both with 4 and 5 clearing digits. This is an error in the parsing logic.");
                }
            }

            //This is not a valid account number by either method. We pick one of the exceptions at random (may be improved by checking length or similar)
            if (a4Exception != null && a5Exception != null)
            {
                throw a4Exception;
            }

            return(a4Exception != null ? a5 : a4);
        }
Esempio n. 2
0
        /// <summary>
        /// Returns the bank name and account number type from a clearing number. If no bank could be matched to the
        /// clearing number, AccountNumberType.Unkown will be returned.
        /// </summary>
        /// <param name="clearingNumber">The clearing number to match.</param>
        /// <returns>A tuple object with bank name and account number type.</returns>
        public static Tuple <string, AccountNumberType> GetBankAndAccountNumberType(string clearingNumber)
        {
            if (!AccountNumberValidator.IsInteger(clearingNumber))
            {
                throw new ArgumentException("clearingNumber must be numeric.");
            }

            // Item1: Bank, Item2: AccountNumberType
            // Swedbank uses 5 digit clearing numbers. Only the 4 first digits are used, the 5th digit is a check digit
            return(GetBankAndAccountNumberType(int.Parse(clearingNumber.Substring(0, 4))));
        }
Esempio n. 3
0
        /// <summary>
        /// Creates a BankAccount object. Throws an argument exception if the clearing number or account number is malformatted.
        /// </summary>
        /// <param name="clearingNumber">The clearing number part of the bank account.</param>
        /// <param name="accountNumber">The account number part of the bank account.</param>
        /// <returns>A BankAccount object.</returns>
        public static BankAccountSe CreateBankAccount(string clearingNumber, string accountNumber)
        {
            if (string.IsNullOrEmpty(clearingNumber))
            {
                throw new ArgumentException("clearingNumber must not be null or empty string.");
            }
            if (string.IsNullOrEmpty(accountNumber))
            {
                throw new ArgumentException("accountNumber must not be null or empty string.");
            }

            BankAccountSe bankAccount = new BankAccountSe();

            // Remove any redundant characters
            clearingNumber = AccountNumberValidator.Clean(clearingNumber);
            accountNumber  = AccountNumberValidator.Clean(accountNumber);
            accountNumber  = accountNumber.TrimStart('0');

            // Assign clearing number
            AccountNumberValidator.CheckClearingNumber(clearingNumber);

            // Assign account type and bank
            var bankAndAccountNumberType = ClearingNumberRange.GetBankAndAccountNumberType(clearingNumber);

            if ((bankAccount.AccountNumberType = bankAndAccountNumberType.Item2) == AccountNumberType.Unknown)
            {
                throw new ArgumentException("Unknown clearingNumber. Could not match clearingNumber to a known bank.");
            }
            bankAccount.Bank = bankAndAccountNumberType.Item1;

            // Assign account number
            AccountNumberValidator.CheckAccountNumber(ref clearingNumber, ref accountNumber, bankAndAccountNumberType.Item2, bankAccount.Bank == ClearingNumberRange.SwebankName);
            bankAccount.AccountNumber  = accountNumber;
            bankAccount.ClearingNumber = clearingNumber;

            if (bankAccount.AccountNumberType == AccountNumberType.Type5 && bankAccount.Bank == ClearingNumberRange.SwebankName && bankAccount.ClearingNumber.Length == 5)
            {
                bankAccount.ClearingNumber = bankAccount.ClearingNumber.Substring(0, 4);
            }

            return(bankAccount);
        }