Example #1
0
        /// <summary>
        /// Determines whether the specified account number is valid. The account number
        /// is given as a full number including the hypothetical check digit.
        /// validation steps:
        /// * bank code can have 4 digits max
        /// * branch code can have 4 digits max
        /// * account number can have 13 digits max (including 2 check digits)
        /// * check digit is valid
        /// </summary>
        /// <param name="accountNumber">The account number including the hypothetical check digit.</param>
        /// <param name="validationErrors">Collection is filled up with the validation error messages</param>
        /// <returns>
        ///   <c>true</c> if the specified account number is valid; otherwise, <c>false</c>.
        /// </returns>
        public bool Validate(NationalAccountNumber accountNumber, ICollection <ValidationError> validationErrors)
        {
            if (accountNumber == null)
            {
                throw new ArgumentNullException("accountNumber", "Please provide an account number.");
            }

            validationErrors = validationErrors ?? new List <ValidationError>();

            var portugalAccountNumber = new PortugalAccountNumber(accountNumber);

            ValidationMethodsTools.ValidateMember(portugalAccountNumber.AccountNumber, 13, validationErrors, ValidationErrorCodes.AccountNumberMissing, ValidationErrorCodes.AccountNumberTooLong);
            ValidationMethodsTools.ValidateMember(portugalAccountNumber.BankCode, 4, validationErrors, ValidationErrorCodes.BankCodeMissing, ValidationErrorCodes.BankCodeTooLong);
            ValidationMethodsTools.ValidateMember(portugalAccountNumber.Branch, 4, validationErrors, ValidationErrorCodes.BranchCodeMissing, ValidationErrorCodes.BranchCodeTooLong);

            if (validationErrors.Count > 0)
            {
                return(false);
            }

            var fullAccountNumber =
                String.Format("{0,4}{1,4}{2,13}", portugalAccountNumber.BankCode, portugalAccountNumber.Branch, portugalAccountNumber.AccountNumber).Replace(' ', '0');

            if (!validationMethod.IsValid(fullAccountNumber))
            {
                validationErrors.AddValidationErrorMessage("The validation of the check digits failed.");
            }

            return(validationErrors.Count == 0);
        }
        /// <summary>
        /// Determines whether the specified account number is valid. The account number
        /// is given as a full number including the hypothetical check digit.
        /// validation steps:
        /// * bank code can have 3 digits max
        /// * account number can have 9 digits max (including the 2 check digits)
        /// * check digits are valid
        /// </summary>
        /// <param name="accountNumber">The account number including the hypothetical check digit.</param>
        /// <param name="validationErrors">Collection is filled up with the validation error messages</param>
        /// <returns>
        ///   <c>true</c> if the specified account number is valid; otherwise, <c>false</c>.
        /// </returns>
        public bool Validate(NationalAccountNumber accountNumber, ICollection <ValidationError> validationErrors)
        {
            if (accountNumber == null)
            {
                throw new ArgumentNullException("accountNumber", "Please provide an account number.");
            }

            validationErrors = validationErrors ?? new List <ValidationError>();

            var belgiumAccountNumber = new BelgiumAccountNumber(accountNumber);

            ValidationMethodsTools.ValidateMember(belgiumAccountNumber.AccountNumber, 9, validationErrors, ValidationErrorCodes.AccountNumberMissing, ValidationErrorCodes.AccountNumberTooLong);
            ValidationMethodsTools.ValidateMember(belgiumAccountNumber.BankCode, 3, validationErrors, ValidationErrorCodes.BankCodeMissing, ValidationErrorCodes.BankCodeTooLong);

            if (validationErrors.Count > 0)
            {
                return(false);
            }

            var accountNumberWithBankCode =
                String.Format("{0,3}{1,9}", belgiumAccountNumber.BankCode, belgiumAccountNumber.AccountNumber).Replace(' ', '0');

            if (!validationMethod.IsValid(accountNumberWithBankCode))
            {
                validationErrors.AddValidationErrorMessage("The validation of the check digits failed.");
            }

            return(validationErrors.Count == 0);
        }
        /// <summary>
        /// Determines whether the specified account number is valid. The given bank code will be
        /// mapped to an registered method which calculates the check digit. The account number
        /// is given as a full number including the hypothetical check digit.
        /// </summary>
        /// <param name="accountNumber">The account number including the hypothetical check digit.</param>
        /// <param name="validationErrors">Collection is filled up with the validation error messages</param>
        /// <returns>
        ///   <c>true</c> if the specified account number is valid; otherwise, <c>false</c>.
        /// </returns>
        public bool Validate(NationalAccountNumber accountNumber, ICollection <ValidationError> validationErrors)
        {
            if (accountNumber == null)
            {
                throw new ArgumentNullException("accountNumber", "Please provide an account number.");
            }

            validationErrors = validationErrors ?? new List <ValidationError>();

            var germanAccountNumber = new GermanyAccountNumber(accountNumber);

            ValidationMethodsTools.ValidateMember(germanAccountNumber.AccountNumber, 10, validationErrors, ValidationErrorCodes.AccountNumberMissing, ValidationErrorCodes.AccountNumberTooLong);
            ValidationMethodsTools.ValidateMember(germanAccountNumber.BankCode, 8, validationErrors, ValidationErrorCodes.BankCodeMissing, ValidationErrorCodes.BankCodeTooLong);

            if (validationErrors.Count > 0)
            {
                return(false);
            }

            var checkMethodCode = BankCodeMappingMethod.Resolve(germanAccountNumber.BankCode);

            if (string.IsNullOrEmpty(checkMethodCode))
            {
                throw new ArgumentException(String.Format("Can't resolve the check method for the given bank code {0}.", germanAccountNumber.BankCode), "accountNumber");
            }

            return(accountNumberValidationByMethodCode.IsValid(germanAccountNumber.AccountNumber, checkMethodCode));
        }
        /// <summary>
        /// Calculates the check digit for a given account number.
        /// </summary>
        /// <param name="accountNumber">The account number.</param>
        /// <returns></returns>
        virtual public string CalculateCheckDigit(string accountNumber)
        {
            var calculatedCheckDigit = ValidationMethodsTools.CalculateModulo(accountNumber, 97).ToString();

            Log.InfoFormat("Check digits for number {0} are {1}", accountNumber, calculatedCheckDigit);

            return(calculatedCheckDigit);
        }
        /// <summary>
        /// Determines whether the specified account number is valid.
        /// </summary>
        /// <param name="accountNumber">The account number.</param>
        /// <returns>
        ///   <c>true</c> if the specified account number is valid; otherwise, <c>false</c>.
        /// </returns>
        virtual public bool IsValid(string accountNumber)
        {
            string number;
            string checkdigit;

            ValidationMethodsTools.SplitNumber(accountNumber, 1, out number, out checkdigit);

            var calculatedCheckDigit = CalculateCheckDigitInternal(number).ToString();

            return(calculatedCheckDigit.Equals(checkdigit));
        }
Example #6
0
        /// <summary>
        /// converts the parts of a national account number to an IBAN.
        /// There are different parts needed in dependency of the selected country
        /// </summary>
        /// <param name="nationalAccountNumber">The national account number.</param>
        /// <returns></returns>
        public override string ToIBAN(NationalAccountNumber nationalAccountNumber)
        {
            if (nationalAccountNumber == null)
            {
                throw new ArgumentNullException("nationalAccountNumber");
            }

            var abAccountNumber = CreateInstance(nationalAccountNumber);

            var bankCode          = OnlyAllowedCharacters(abAccountNumber.BankCode);
            var accountNumber     = OnlyAllowedCharacters(abAccountNumber.AccountNumber);
            var branch            = OnlyAllowedCharacters(abAccountNumber.Branch);
            var holdersNationalId = OnlyAllowedCharacters(abAccountNumber.HoldersNationalId);

            if (String.IsNullOrEmpty(bankCode))
            {
                throw new ArgumentException("The bank code is missing.");
            }
            if (String.IsNullOrEmpty(branch))
            {
                throw new ArgumentException("The branch code is missing.");
            }
            if (String.IsNullOrEmpty(accountNumber))
            {
                throw new ArgumentException("The account number is missing.");
            }
            if (String.IsNullOrEmpty(holdersNationalId))
            {
                throw new ArgumentException("The holders national id is missing.");
            }

            var bban = String.Format(BBANFormatString, bankCode, branch, accountNumber, holdersNationalId);

            bban = bban.Replace(' ', '0');
            bban = ConvertCharactersToNumbers(bban);

            Log.DebugFormat("calculating checksum for bban {0}", bban);

            var modulo = 98 - ValidationMethodsTools.CalculateModulo(bban, 97);
            var iban   = String.Format(IBANFormatString, IBANPrefix, modulo, bankCode, branch, accountNumber, holdersNationalId);

            iban = iban.Replace(' ', '0');

            Log.DebugFormat("generated IBAN: {0}", iban);

            if (iban.Length != IBANLength)
            {
                throw new InvalidOperationException(String.Format("Couldn't generate a valid IBAN from the bankcode {0}, branch {1}, the account number {2} and the national holders id {3}.", bankCode, branch, accountNumber, holdersNationalId));
            }

            return(iban);
        }
        /// <summary>
        /// Determines whether the specified account number is valid.
        /// </summary>
        /// <param name="accountNumber">The account number.</param>
        /// <returns>
        ///   <c>true</c> if the specified account number is valid; otherwise, <c>false</c>.
        /// </returns>
        virtual public bool IsValid(string accountNumber)
        {
            string number;
            string checkdigit;

            ValidationMethodsTools.SplitNumber(accountNumber, 2, out number, out checkdigit);

            var calculatedCheckDigit = ValidationMethodsTools.CalculateModulo(number, 97).ToString("00");

            Log.InfoFormat("Validate {0} against check digits {1}, calculated check digits {2}", number, checkdigit, calculatedCheckDigit);

            return(calculatedCheckDigit.Equals(checkdigit));
        }
Example #8
0
        /// <summary>
        /// Determines whether the specified credit card number is formal valid.
        /// </summary>
        /// <param name="creditCardNumber">The credit card number.</param>
        /// <returns>
        ///   <c>true</c> if the specified credit card number is formal valid; otherwise, <c>false</c>.
        /// </returns>
        public bool IsValid(string creditCardNumber)
        {
            if (creditCardNumber.Length < minLength || creditCardNumber.Length > maxLength)
            {
                return(false);
            }

            string number;
            string checkdigit;

            ValidationMethodsTools.SplitNumber(creditCardNumber, 1, out number, out checkdigit);

            var calculatedCheckDigit = CalculateCheckDigitInternal(number).ToString();

            return(calculatedCheckDigit.Equals(checkdigit));
        }
Example #9
0
        /// <summary>
        /// converts the parts of a national account number to an IBAN.
        /// There are different parts needed in dependency of the selected country
        /// </summary>
        /// <param name="nationalAccountNumber">The national account number.</param>
        /// <returns></returns>
        public override string ToIBAN(NationalAccountNumber nationalAccountNumber)
        {
            if (nationalAccountNumber == null)
            {
                throw new ArgumentNullException("nationalAccountNumber");
            }

            var abAccountNumber = CreateInstance(nationalAccountNumber);

            var bic           = OnlyAllowedCharacters(abAccountNumber.BIC);
            var accountNumber = OnlyAllowedCharacters(abAccountNumber.AccountNumber);

            if (String.IsNullOrEmpty(bic))
            {
                throw new ArgumentException("The bic is missing.");
            }
            if (String.IsNullOrEmpty(accountNumber))
            {
                throw new ArgumentException("The account number is missing.");
            }

            var bban = String.Format(BBANFormatString, bic, accountNumber);

            bban = bban.Replace(' ', '0');
            bban = ConvertCharactersToNumbers(bban);

            Log.DebugFormat("calculating checksum for bban {0}", bban);

            var modulo = 98 - ValidationMethodsTools.CalculateModulo(bban, 97);
            var iban   = String.Format(IBANFormatString, IBANPrefix, modulo, bic, accountNumber);

            iban = iban.Replace(' ', '0');

            Log.DebugFormat("generated IBAN: {0}", iban);

            if (iban.Length != IBANLength)
            {
                throw new InvalidOperationException(String.Format("Couldn't generate a valid IBAN from the bic {0} and the account number {1}.", bic, accountNumber));
            }

            return(iban);
        }
Example #10
0
 /// <summary>
 /// Used to make some modifications to the product of digit and weight before is added to the sum
 /// </summary>
 /// <param name="product">The product.</param>
 /// <returns></returns>
 override protected int ModifyProductBeforeSum(int product)
 {
     return(ValidationMethodsTools.CalculateCrossSum(product));
 }