/* * This file is part of Bitsquare. * * Bitsquare is free software: you can redistribute it and/or modify it * under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * Bitsquare is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public * License for more details. * * You should have received a copy of the GNU Affero General Public License * along with Bitsquare. If not, see <http://www.gnu.org/licenses/>. */ package io.bitsquare.gui.util.validation; import io.bitsquare.locale.BSResources; import io.bitsquare.locale.BankUtil; import org.apache.commons.lang3.StringUtils; public final class AccountNrValidator extends BankValidator { public AccountNrValidator(String countryCode) { super(countryCode); } @Override public ValidationResult validate(String input) { int length; String input2; switch (countryCode) { case "GB": length = 8; if (isNumberWithFixedLength(input, length)) return super.validate(input); else return new ValidationResult(false, BSResources.get("validation.accountNr", length)); case "US": if (isNumberInRange(input, 4, 17)) return super.validate(input); else return new ValidationResult(false, BSResources.get("validation.accountNr", "4 - 17")); case "BR": if (isStringInRange(input, 1, 20)) return super.validate(input); else return new ValidationResult(false, BSResources.get("validation.accountNrChars", "1 - 20")); case "NZ": input2 = input != null ? input.replaceAll("-", "") : null; if (isNumberInRange(input2, 15, 16)) return super.validate(input); else return new ValidationResult(false, "Account number must be of format: 03-1587-0050000-00"); case "AU": if (isNumberInRange(input, 4, 10)) return super.validate(input); else return new ValidationResult(false, BSResources.get("validation.accountNr", "4 - 10")); case "CA": if (isNumberInRange(input, 7, 12)) return super.validate(input); else return new ValidationResult(false, BSResources.get("validation.accountNr", "7 - 12")); case "MX": length = 18; if (isNumberWithFixedLength(input, length)) return super.validate(input); else return new ValidationResult(false, BSResources.get("validation.sortCodeNumber", getLabel(), length)); case "HK": input2 = input != null ? input.replaceAll("-", "") : null; if (isNumberInRange(input2, 9, 12)) return super.validate(input); else return new ValidationResult(false, "Account number must be of format: 005-231289-112"); case "NO": if (input != null) { length = 11; // Provided by sturles: // https://github.com/bitsquare/bitsquare/pull/707 // https://no.wikipedia.org/wiki/MOD11#Implementasjoner_i_forskjellige_programmeringspr.C3.A5k // https://en.wikipedia.org/wiki/International_Bank_Account_Number#Generating_IBAN_check_digits6 // 11 digits, last digit is checksum. Checksum algoritm is // MOD11 with weights 2,3,4,5,6,7,2,3,4,5 right to left. // First remove whitespace and periods. Normal formatting is: // 1234.56.78903 input2 = StringUtils.remove(input, " "); input2 = StringUtils.remove(input2, "."); // 11 digits, numbers only if (input2.length() != length || !StringUtils.isNumeric(input2)) return new ValidationResult(false, BSResources.get("validation.sortCodeNumber", getLabel(), length)); int lastDigit = Character.getNumericValue(input2.charAt(input2.length() - 1)); if (getMod11ControlDigit(input2) != lastDigit) return new ValidationResult(false, "Kontonummer har feil sjekksum"); else return super.validate(input); } else { return super.validate(input); } default: return super.validate(input); } } private int getMod11ControlDigit(String accountNrString) { int sumForMod = 0; int controlNumber = 2; char[] accountNr = accountNrString.toCharArray(); for (int i = accountNr.length - 2; i >= 0; i--) { sumForMod += (Character.getNumericValue(accountNr[i]) * controlNumber); controlNumber++; if (controlNumber > 7) { controlNumber = 2; } } int calculus = (11 - sumForMod % 11); if (calculus == 11) { return 0; } else { return calculus; } } private String getLabel() { String label = BankUtil.getAccountNrLabel(countryCode); return label.substring(0, label.length() - 1); } }