diff --git a/src/main/java/org/iban4j/Iban.java b/src/main/java/org/iban4j/Iban.java index cebed6d..9cbd991 100644 --- a/src/main/java/org/iban4j/Iban.java +++ b/src/main/java/org/iban4j/Iban.java @@ -63,6 +63,15 @@ public String getCheckDigit() { return IbanUtil.getCheckDigit(value); } + /** + * Returns iban's account number prefix. + * + * @return accountNumberPrefix String + */ + public String getAccountNumberPrefix() { + return IbanUtil.getAccountNumberPrefix(value); + } + /** * Returns iban's account number. * @@ -224,6 +233,7 @@ public final static class Builder { private String branchCode; private String nationalCheckDigit; private String accountType; + private String accountNumberPrefix; private String accountNumber; private String ownerAccountType; private String identificationNumber; @@ -269,6 +279,17 @@ public Builder branchCode(final String branchCode) { return this; } + /** + * Sets iban's account number prefix + * + * @param accountNumberPrefix String + * @return builder Builder + */ + public Builder accountNumberPrefix(final String accountNumberPrefix) { + this.accountNumberPrefix = accountNumberPrefix; + return this; + } + /** * Sets iban's account number. * @@ -406,6 +427,9 @@ private String formatBban() { case branch_code: sb.append(branchCode); break; + case account_number_prefix: + sb.append(accountNumberPrefix); + break; case account_number: sb.append(accountNumber); break; @@ -477,6 +501,11 @@ private void fillMissingFieldsRandomly() { branchCode = entry.getRandom(); } break; + case account_number_prefix: + if (accountNumberPrefix == null) { + accountNumberPrefix = entry.getRandom(); + } + break; case account_number: if (accountNumber == null) { accountNumber = entry.getRandom(); diff --git a/src/main/java/org/iban4j/IbanUtil.java b/src/main/java/org/iban4j/IbanUtil.java index 3f17386..cb1e8be 100644 --- a/src/main/java/org/iban4j/IbanUtil.java +++ b/src/main/java/org/iban4j/IbanUtil.java @@ -178,6 +178,16 @@ public static String getBban(final String iban) { return iban.substring(BBAN_INDEX); } + /** + * Returns iban's account number. + * + * @param iban String + * @return accountNumberPrefix String + */ + public static String getAccountNumberPrefix(final String iban) { + return extractBbanEntry(iban, BbanEntryType.account_number_prefix); + } + /** * Returns iban's account number. * diff --git a/src/main/java/org/iban4j/bban/BbanEntryType.java b/src/main/java/org/iban4j/bban/BbanEntryType.java index c3d07d0..3d88032 100644 --- a/src/main/java/org/iban4j/bban/BbanEntryType.java +++ b/src/main/java/org/iban4j/bban/BbanEntryType.java @@ -21,6 +21,7 @@ public enum BbanEntryType { bank_code, branch_code, + account_number_prefix, account_number, national_check_digit, account_type, diff --git a/src/main/java/org/iban4j/bban/BbanStructure.java b/src/main/java/org/iban4j/bban/BbanStructure.java index 204ae0d..2d8f828 100644 --- a/src/main/java/org/iban4j/bban/BbanStructure.java +++ b/src/main/java/org/iban4j/bban/BbanStructure.java @@ -15,9 +15,13 @@ */ package org.iban4j.bban; -import org.iban4j.CountryCode; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.EnumMap; +import java.util.List; -import java.util.*; +import org.iban4j.CountryCode; /** @@ -118,7 +122,8 @@ private BbanStructure(final BbanStructureEntry... entries) { structures.put(CountryCode.CZ, new BbanStructure( BbanStructureEntry.bankCode(4, 'n'), - BbanStructureEntry.accountNumber(16, 'n'))); + BbanStructureEntry.accountNumberPrefix(6, 'n'), + BbanStructureEntry.accountNumber(10, 'n'))); structures.put(CountryCode.DK, new BbanStructure( @@ -370,7 +375,8 @@ private BbanStructure(final BbanStructureEntry... entries) { structures.put(CountryCode.SK, new BbanStructure( BbanStructureEntry.bankCode(4, 'n'), - BbanStructureEntry.accountNumber(16, 'n'))); + BbanStructureEntry.accountNumberPrefix(6, 'n'), + BbanStructureEntry.accountNumber(10, 'n'))); structures.put(CountryCode.SI, new BbanStructure( diff --git a/src/main/java/org/iban4j/bban/BbanStructureEntry.java b/src/main/java/org/iban4j/bban/BbanStructureEntry.java index ed797d1..78cf200 100644 --- a/src/main/java/org/iban4j/bban/BbanStructureEntry.java +++ b/src/main/java/org/iban4j/bban/BbanStructureEntry.java @@ -66,6 +66,11 @@ public static BbanStructureEntry branchCode(final int length, final char charact EntryCharacterType.valueOf(String.valueOf(characterType)), length); } + public static BbanStructureEntry accountNumberPrefix(final int length, final char characterType) { + return new BbanStructureEntry(BbanEntryType.account_number_prefix, + EntryCharacterType.valueOf(String.valueOf(characterType)), length); + } + public static BbanStructureEntry accountNumber(final int length, final char characterType) { return new BbanStructureEntry(BbanEntryType.account_number, EntryCharacterType.valueOf(String.valueOf(characterType)), length); diff --git a/src/test/java/org/iban4j/IbanTest.java b/src/test/java/org/iban4j/IbanTest.java index 77d8ddf..9c779cb 100644 --- a/src/test/java/org/iban4j/IbanTest.java +++ b/src/test/java/org/iban4j/IbanTest.java @@ -125,6 +125,18 @@ public void ibanShouldReturnValidBankCode() { assertThat(iban.getBankCode(), is(equalTo("19043"))); } + @Test + public void ibanShouldReturnValidAccountNumberPrefix() { + Iban iban = new Iban.Builder() + .countryCode(CountryCode.SK) + .bankCode("1200") + .accountNumberPrefix("000019") + .accountNumber("8742637541") + .build(); + + assertThat(iban.getAccountNumberPrefix(), is(equalTo("000019"))); + } + @Test public void ibanShouldReturnValidAccountNumber() { Iban iban = new Iban.Builder() @@ -377,6 +389,16 @@ public void ibanConstructionWithShortBankCodeShouldThrowException() { .build(); } + @Test(expected = IbanFormatException.class) + public void ibanConstructionWithShortAccountPrefixShouldThrowException() { + new Iban.Builder() + .countryCode(CountryCode.SK) + .bankCode("1200") + .accountNumberPrefix("19") + .accountNumber("8742637541") + .build(); + } + @Test(expected = IbanFormatException.class) public void ibanConstructionWithShortBankCodeShouldThrowExceptionIfValidationRequested() { new Iban.Builder() @@ -412,6 +434,15 @@ public void ibanContructionRandomRetainsSpecifiedBankCode() { assertThat(iban.getBankCode(), is(equalTo("12345"))); } + @Test + public void ibanContructionRandomDoesNotOverwriteBankAccountPrefix() { + Iban iban = new Iban.Builder() + .countryCode(CountryCode.SK) + .accountNumberPrefix("078901") + .buildRandom(); + assertThat(iban.getAccountNumberPrefix(), is(equalTo("078901"))); + } + @Test public void ibanContructionRandomDoesNotOverwriteBankAccount() { Iban iban = new Iban.Builder() diff --git a/src/test/java/org/iban4j/TestDataHelper.java b/src/test/java/org/iban4j/TestDataHelper.java index ad2967d..d8250ea 100644 --- a/src/test/java/org/iban4j/TestDataHelper.java +++ b/src/test/java/org/iban4j/TestDataHelper.java @@ -100,7 +100,8 @@ public static Collection getIbanData() { {new Iban.Builder() .countryCode(CountryCode.CZ) .bankCode("0800") - .accountNumber("0000192000145399") + .accountNumberPrefix("000019") + .accountNumber("2000145399") .build(), "CZ6508000000192000145399"}, {new Iban.Builder() .countryCode(CountryCode.DK) @@ -342,7 +343,8 @@ public static Collection getIbanData() { {new Iban.Builder() .countryCode(CountryCode.SK) .bankCode("1200") - .accountNumber("0000198742637541") + .accountNumberPrefix("000019") + .accountNumber("8742637541") .build(), "SK3112000000198742637541"}, {new Iban.Builder() .countryCode(CountryCode.SI)