/// <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)); }
/// <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)); }
/// <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)); }
/// <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); }
/// <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)); }