Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@
<dep.snakeyaml-engine.version>3.0.1</dep.snakeyaml-engine.version>
<dep.jspecify.version>1.0.0</dep.jspecify.version>
<dep.slf4j.version>2.0.17</dep.slf4j.version>
<dep.iban4j.version>3.2.13-RELEASE</dep.iban4j.version>
<dep.iban-commons.version>1.8.4</dep.iban-commons.version>
<dep.commons-validator.version>1.10.1</dep.commons-validator.version>
<dep.spock.version>2.4-groovy-4.0</dep.spock.version>
<dep.groovy.version>4.0.30</dep.groovy.version>
Expand Down Expand Up @@ -135,9 +135,9 @@
<version>${dep.slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.iban4j</groupId>
<artifactId>iban4j</artifactId>
<version>${dep.iban4j.version}</version>
<groupId>de.speedbanking</groupId>
<artifactId>iban-commons</artifactId>
<version>${dep.iban-commons.version}</version>
</dependency>
<dependency>
<groupId>commons-validator</groupId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ public void readResources(String path) throws IOException {
final Load load = new Load(loadSettings);
final URL url = resources.nextElement();
try (InputStream is = url.openStream()) {
@SuppressWarnings("unchecked")
final Map<String, Object> data = (Map<String, Object>) load.loadFromInputStream(is);
appendData(data);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,31 +1,25 @@
package com.devskiller.jfairy.producer.payment;

import java.util.IllegalFormatCodePointException;
import java.util.List;
import java.util.Optional;

import org.iban4j.CountryCode;
import org.iban4j.Iban;
import org.iban4j.UnsupportedCountryException;
import de.speedbanking.iban.Iban;
import de.speedbanking.iban.IbanRegistry;
import de.speedbanking.iban.RandomIban;
import org.jspecify.annotations.Nullable;

import com.devskiller.jfairy.data.DataMaster;
import com.devskiller.jfairy.producer.BaseProducer;
import com.devskiller.jfairy.producer.person.Country;

import static com.devskiller.jfairy.producer.util.StringUtils.isNotEmpty;

/**
* ALPHA: Under development
*/
public class DefaultIBANProvider implements IBANProvider {

protected final DataMaster dataMaster;
protected final BaseProducer baseProducer;
protected CountryCode countryCode;
protected String accountNumber;
protected String bankCode;
protected String branchCode;
protected String nationalCheckDigit;
protected String countryCode;

public DefaultIBANProvider(BaseProducer baseProducer,
DataMaster dataMaster,
Expand All @@ -39,72 +33,37 @@ public DefaultIBANProvider(BaseProducer baseProducer,

@Override
public @Nullable IBAN get() {
try {

fillCountryCode();

try {

Iban.Builder builder = new Iban.Builder()
.countryCode(countryCode)
.bankCode(bankCode)
.branchCode(branchCode)
.nationalCheckDigit(nationalCheckDigit);
if (isNotEmpty(accountNumber)) {
builder.accountNumber(accountNumber);
}
Iban iban = builder.buildRandom();

String identificationNumber = iban.getIdentificationNumber();
String checkDigit = iban.getCheckDigit();
String accountType = iban.getAccountType();
String bban = iban.getBban();
String ownerAccountType = iban.getOwnerAccountType();
String ibanNumber = iban.toString();
fillCountryCode();

return new IBAN(accountNumber, identificationNumber, branchCode, checkDigit,
accountType, bankCode, bban, countryCode.getName(), nationalCheckDigit,
ownerAccountType, ibanNumber);
} catch (UnsupportedCountryException ex) {
return null;
}
} catch (IllegalFormatCodePointException ex) {
throw new IllegalArgumentException("Invalid iban " + ex.getMessage(), ex);
IbanRegistry reg = IbanRegistry.getByCode(countryCode);
if (reg == null) {
return null;
}
Iban iban = RandomIban.of(countryCode);

return new IBAN(iban.getAccountNumber(),
iban.getCheckDigits(),
iban.getBankCode(),
iban.getBban(),
iban.getCountryCode(),
iban.getNationalCheckDigit(),
iban.toString());
}

@Override
public void fillCountryCode() {
if (countryCode == null) {
List<Country> countries = Country.findCountryForLanguage(dataMaster.getLanguage());
Country country = baseProducer.randomElement(countries);
countryCode = CountryCode.valueOf(country.getCode());
}
}

@Override
public void setNationalCheckDigit(String nationalCheckDigit) {
this.nationalCheckDigit = nationalCheckDigit;
}

@Override
public void setBranchCode(String branchCode) {
this.branchCode = branchCode;
IbanRegistry r = IbanRegistry.getByCode(country.getCode());
countryCode = Optional.ofNullable(r).map(IbanRegistry::name).orElse(null);
}
}

@Override
public void setCountry(String country) {
this.countryCode = CountryCode.valueOf(country);
}

@Override
public void setAccountNumber(String accountNumber) {
this.accountNumber = accountNumber;
}

@Override
public void setBankCode(String bankCode) {
this.bankCode = bankCode;
this.countryCode = country;
}

}
28 changes: 2 additions & 26 deletions src/main/java/com/devskiller/jfairy/producer/payment/IBAN.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,52 +3,32 @@
public class IBAN {

private final String accountNumber;
private final String identificationNumber;
private final String branchCode;
private final String checkDigit;
private final String accountType;
private final String bankCode;
private final String bban;
private final String country;
private final String nationalCheckDigit;
private final String ownerAccountType;
private final String ibanNumber;

public IBAN(String accountNumber, String identificationNumber, String branchCode, String checkDigit,
String accountType, String bankCode, String bban, String country, String nationalCheckDigit, String ownerAccountType, String ibanNumber) {
public IBAN(String accountNumber, String checkDigit, String bankCode, String bban,
String country, String nationalCheckDigit, String ibanNumber) {
this.accountNumber = accountNumber;
this.identificationNumber = identificationNumber;
this.branchCode = branchCode;
this.checkDigit = checkDigit;
this.accountType = accountType;
this.bankCode = bankCode;
this.bban = bban;
this.country = country;
this.nationalCheckDigit = nationalCheckDigit;
this.ownerAccountType = ownerAccountType;
this.ibanNumber = ibanNumber;
}

public String getAccountNumber() {
return accountNumber;
}

public String getIdentificationNumber() {
return identificationNumber;
}

public String getBranchCode() {
return branchCode;
}

public String getCheckDigit() {
return checkDigit;
}

public String getAccountType() {
return accountType;
}

public String getBankCode() {
return bankCode;
}
Expand All @@ -65,10 +45,6 @@ public String getNationalCheckDigit() {
return nationalCheckDigit;
}

public String getOwnerAccountType() {
return ownerAccountType;
}

public String getIbanNumber() {
return ibanNumber;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,24 @@
import java.util.HashMap;
import java.util.Map;

import org.iban4j.CountryCode;
import de.speedbanking.iban.IbanRegistry;

import com.devskiller.jfairy.producer.util.LanguageCode;

public final class IBANProperties {

private static final HashMap<LanguageCode, CountryCode> COUNTRIES = new HashMap<>();
private static final Map<LanguageCode, IbanRegistry> COUNTRIES = new HashMap<>();

static {
COUNTRIES.put(LanguageCode.PL, CountryCode.PL);
COUNTRIES.put(LanguageCode.EN, CountryCode.GB);
COUNTRIES.put(LanguageCode.ES, CountryCode.ES);
COUNTRIES.put(LanguageCode.FR, CountryCode.FR);
COUNTRIES.put(LanguageCode.KA, CountryCode.GE);
COUNTRIES.put(LanguageCode.IT, CountryCode.IT);
COUNTRIES.put(LanguageCode.DE, CountryCode.DE);
COUNTRIES.put(LanguageCode.SK, CountryCode.SK);
COUNTRIES.put(LanguageCode.SV, CountryCode.SV);
COUNTRIES.put(LanguageCode.ZH, CountryCode.TW);
COUNTRIES.put(LanguageCode.PL, IbanRegistry.PL);
COUNTRIES.put(LanguageCode.EN, IbanRegistry.GB);
COUNTRIES.put(LanguageCode.ES, IbanRegistry.ES);
COUNTRIES.put(LanguageCode.FR, IbanRegistry.FR);
COUNTRIES.put(LanguageCode.KA, IbanRegistry.GE);
COUNTRIES.put(LanguageCode.IT, IbanRegistry.IT);
COUNTRIES.put(LanguageCode.DE, IbanRegistry.DE);
COUNTRIES.put(LanguageCode.SK, IbanRegistry.SK);
COUNTRIES.put(LanguageCode.SV, IbanRegistry.SV);
}

private IBANProperties() {
Expand All @@ -33,33 +32,6 @@ public abstract static class Property {

}

public static Property branchCode(final String branchCode) {
return new Property() {
@Override
public void apply(IBANProvider provider) {
provider.setBranchCode(branchCode);
}
};
}

public static Property nationalCheckDigit(final String nationalCheckDigit) {
return new Property() {
@Override
public void apply(IBANProvider provider) {
provider.setNationalCheckDigit(nationalCheckDigit);
}
};
}

public static Property accountNumber(final String accountNumber) {
return new Property() {
@Override
public void apply(IBANProvider provider) {
provider.setAccountNumber(accountNumber);
}
};
}

public static Property country(final String country) {
return new Property() {
@Override
Expand All @@ -82,18 +54,9 @@ private static String countryFromLanguage(String lang) {
return COUNTRIES.entrySet().stream()
.filter(locale -> locale.getKey().name().equals(lang))
.map(Map.Entry::getValue)
.map(CountryCode::getAlpha2)
.map(IbanRegistry::name)
.findFirst()
.orElse("PL");
}

public static Property bankCode(final String bankCode) {
return new Property() {
@Override
public void apply(IBANProvider provider) {
provider.setBankCode(bankCode);
}
};
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,6 @@ public interface IBANProvider extends Supplier<IBAN> {

void fillCountryCode();

void setNationalCheckDigit(String nationalCheckDigit);

void setBranchCode(String branchCode);

void setCountry(String country);

void setAccountNumber(String accountNumber);

void setBankCode(String bankCode);
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.devskiller.jfairy.producer.payment

import org.iban4j.IbanUtil
import de.speedbanking.iban.IbanValidator
import spock.lang.Specification

import com.devskiller.jfairy.Fairy
Expand All @@ -25,23 +25,21 @@ class IBANSpec extends Specification {
* ATkk bbbb bccc cccc cccc
*
* b = National bank code
c = Account number
*/
def "should return valid iban"() {
when:
IBANProvider iban = new DefaultIBANProvider(
baseProducer,
dataMaster,
IBANProperties.accountNumber("00234573201"),
IBANProperties.country("AT")
)

then:
IbanUtil.validate(iban.get().ibanNumber)
IbanValidator.validate(iban.get().ibanNumber)
}

/**
* Poland 28 24n PLkk bbbs sssx cccc cccc cccc cccc b = National bank code
Poland 28 24n PLkk bbbs sssx cccc cccc cccc cccc b = National bank code
s = Branch code
x = National check digit
c = Account number,
Expand All @@ -53,7 +51,7 @@ class IBANSpec extends Specification {
when:
IBANProvider iban = new DefaultIBANProvider(baseProducer, dataMaster)
then:
IbanUtil.validate(iban.get().ibanNumber)
IbanValidator.validate(iban.get().ibanNumber)
}

def "should be usable directly from Fairy"() {
Expand Down
Loading