Skip to content

finoid/bank-domain-values

Repository files navigation

Finoid Bank Domain Values

Java library for Domain-Driven Design (DDD), providing essential building blocks such as value classes for the bank domain

Modules

  • bankdomain-values-core – Core domain value classes for modeling banking identity concepts in a DDD style.
  • bankdomain-values-maven-plugin – A Maven plugin that generates the Bank enum from a CSV file published by bankinfrastruktur.se.
  • bankdomain-values-wasm-graalvm – A GraalVM WebAssembly module that provides a browser-based validation page.
  • bankdomain-values-wasm-teavm – A TeaVM WebAssembly module that provides a browser-based validation page.

What is a domain value class?

A domain value class represents a well-defined concept in the domain model with built-in validation and constraints. Typically immutable, these classes ensure data integrity, enforce domain rules, and increase clarity and maintainability in your codebase.

Requirements

  • GraalVM 25 (required for compiling the bankdomain-values-wasm-graalvm module)
  • Binaryen toolchain in version 119 or later and on the system path (required for compiling the bankdomain-values-wasm-graalvm module)

Installation

<dependency>
    <groupId>io.github.finoid</groupId>
    <artifactId>bankdomain-values-core</artifactId>
    <version>${bankdomain-values.version}</version>
</dependency>

API

Parse and validate from raw input

Accepts spaces, hyphens, and other formatting characters. The input is stripped down to digits internally.

BankAccountNumber account = BankAccountNumber.ofString("8351-9, 392 242 224-5");

From numeric input

BankAccountNumber account = BankAccountNumber.ofNumber(97891111113L);

From clearing and account number

BankAccountNumber account = BankAccountNumber.ofClearingAndAccountNumber(3300, 6205124);

Validation

boolean isValid = BankAccountNumber.isValid("7000-123456789"); // true or false

Formatting

BankAccountNumber account = BankAccountNumber.ofString("83519 3922422245");

account.toFormatted(BankAccountFormatter.Format.PRETTY);  // "8351-9,392 242 224-5"
account.toFormatted(BankAccountFormatter.Format.DEFAULT);  // "835193922422245"

Accessing account components

BankAccountNumber account = BankAccountNumber.ofString("3300 6205124");

// Clearing number
ClearingNumber clearing = account.getClearingNumber();
clearing.getClearingNumber();    // 3300
clearing.toFormatted();          // "3300"
clearing.hasSortingNumber();     // false

// Account number
AccountNumber accountNumber = account.getAccountNumber();
accountNumber.getNumber();       // "6205124"

Bank and account type resolution

The bank and its account type configuration are automatically resolved from the clearing number.

BankAccountNumber account = BankAccountNumber.ofString("3300 6205124");

BankAndType bankAndType = account.getBankAndType();

// Bank information
Bank bank = bankAndType.getBank();
bank.getName();                         // "Nordea"

// Account type information
BankType bankType = bankAndType.getBankType();
bankType.getType();                     // BankAccountType.TWO
bankType.getSubType();                  // BankAccountSubType.ONE
bankType.typesAsString();               // "2:1"

Resolve bank from clearing number

Optional<Bank> bank = Bank.ofClearingNumber(ClearingNumber.ofNumber(5000));
bank.ifPresent(b -> b.getName()); // "SEB"

Error handling

All factory methods throw BankDomainException (or its subclass IllegalNumberBankDomainException) on invalid input.

try {
    BankAccountNumber.ofString("0000-1234567");
} catch (IllegalNumberBankDomainException e) {
    // "Unknown clearing number: 0000"
}

try {
    BankAccountNumber.ofString("abc");
} catch (IllegalNumberBankDomainException e) {
    // "Account number is too short: abc"
}

About

Java library for Domain-Driven Design (DDD), providing essential building blocks such as value objects for the bank domain

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors