“STILL! SEID ENDLICH STILL! ICH WILL, DASS ES STILL BLEIBT UM MEINE KONTEN”
Vreneli
Die bank-account-validator Bibliothek validiert bislang BIC und IBAN Angaben auf syntaktische Korrektheit. Bei deutschen und österreichischen BIC und IBAN werden die Angaben zusätzlich gegen nationale Bankenlisten geprüft. Eine Liste Schweizer Banken ist von der SIX erhältlich. Basierend auf dieser Liste ist eine erweiterte Validierung von BIC und IBAN für der gesamten DACH Region möglich.
Der BankService
für die Schweiz entspricht in seinem Aufbau den beiden anderen Implementierungen. Wie bei der deutsche Implementierung wird eine Fixed Length Format Datei eigelesen und die benötigten Informationen aus den Zeilen ausgelesen.
@CountryCode("CH") public class SwissBankServiceImpl extends BankService { private static final String FILE_NAME = "bcbankenstamm.txt"; private final Map<String, List<Bank>> byBankIdentifierCode; private final Map<String, Bank> byBankCode; public SwissBankServiceImpl() { List<Bank> banks = getResourceAsLines(FILE_NAME).map(SwissBankServiceImpl::convert).toList(); byBankCode = banks.stream().collect(Collectors.toMap(Bank::bankCode, b -> b, (a, b) -> a)); byBankIdentifierCode = banks.stream().collect(Collectors.groupingBy(Bank::bankIdentifierCode)); } private static Bank convert(String x) { String name = x.substring(39, 54).trim(); String bankIdentifierCode = x.substring(x.length() - 14).trim(); return new Bank(name, getIid(x, 11).or(() -> getIid(x, 2)).orElseThrow(), bankIdentifierCode); } private static Optional<String> getIid(String x, int offset) { return Optional.of(x.substring(offset, offset + 5)).map(String::trim).filter(Predicate.not(String::isEmpty)).map(Integer::parseInt).map("%05d"::formatted); } @Override public List<Bank> byBankIdentifierCode(String bankIdentifierCode) { return byBankIdentifierCode.getOrDefault(bankIdentifierCode.length() == 8 ? bankIdentifierCode + "XXX" : bankIdentifierCode, List.of()); } @Override public Bank byBankCode(String bankCode) { return byBankCode.get(bankCode); } @Override public Bank byBasicBankAcountNumber(String basicBankAccountNumber) { return byBankCode(basicBankAccountNumber.substring(0, 5)); } }
Für die Konfiguration der BIC und IBAN Validierung ergibt sich eine Änderung zu den bestehenden Annotationen. Bislang konnte mit dem Attribut lenient
zwischen einem laxen und einem strengen Modus gewählt werden. Der strenge Modus setzte eine BankService
Implementierung voraus und der laxe Modus prüfte ohne BankService
Implementierung nur die syntaktische Korrektheit und die IBAN Checksumme.
Das Attribut lenient
wird abgelöst durch das Attribute check
, mit den möglichen Werten Check.LENIENT
, Check.PRAGMATIC
und Check.STRIC
T
.
@IBAN(type = IbanType.SEPA, check = Check.LENIENT) private String iban; @BIC(check = Check.STRICT) private String bic;
Mit dem Wert Check.STRIC
T
verhält sich die Validierung wie bisher im strikten Modus. Mit dem Wert Check.PRAGMATIC
verhält sich die Validierung, wie bisher im laxen Modus. Der Wert Check.LENIENT
prüft nur die syntaktische Korrektheit und die IBAN Checksumme. Existierende BankService Implementierungen werden also nur bei den Werten Check.PRAGMATIC
und Check.STRIC
T
genutzt.
Wer jetzt schnell ein paar Schweizer BIC und IBAN validieren möchte, kann sich die neue Version des bank-account-validator Bibliothek von Maven Central herunterladen.
<dependency> <groupId>de.schegge</groupId> <artifactId>bank-account-validator</artifactId> <version>0.5.0</version> </dependency>