IBAN Validierung aus der Schweiz

“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.STRICT.

@IBAN(type = IbanType.SEPA, check = Check.LENIENT) 
private String iban;

@BIC(check = Check.STRICT) 
private String bic;

Mit dem Wert Check.STRICT 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.STRICT 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>

Leave a Comment