Initial commit: Financial Crime domain exemplar

This commit is contained in:
2026-06-01 21:18:19 +12:00
commit 2fc4dacd59
70 changed files with 5776 additions and 0 deletions
+152
View File
@@ -0,0 +1,152 @@
# [Financial Crime](../domain.md)
## Entities
### Account
An Account represents a financial record used to hold balances and process debits and credits for a customer relationship. In a dimensional model, Account is a key slowly-changing dimension — its status, type, and currency are required attributes for transaction risk analytics and account-level monitoring.
```mermaid
---
config:
layout: elk
---
classDiagram
class Account{
* Account Identifier : string
Account Number : string
Account Type : enum~AccountType~
Account Status : enum~AccountStatus~
Opened Date : date
Closed Date : date
}
Customer "0..*" --> "0..*" Account : holds
Account "0..*" --> "1" Product : instance of
Account "0..*" --> "1" Currency : denominated in
Branch "1" --> "0..*" Account : services
class AccountType["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/enums.md#account-type'>Account Type</a>"]{<<enumeration>>}
class AccountStatus["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/enums.md#account-status'>Account Status</a>"]{<<enumeration>>}
class Customer["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/customer.md'>Customer</a>"]
class Product["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/product.md'>Product</a>"]
class Currency["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/currency.md'>Currency</a>"]
class Branch["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/branch.md'>Branch</a>"]
```
```yaml
existence: independent
mutability: slowly_changing
temporal:
tracking: valid_time
description: >
Account status transitions (e.g., Active → Frozen → Active) must be tracked
with valid time to support point-in-time regulatory queries such as "was this
account frozen at the time of this transaction?". Opened Date and Closed Date
serve as the outer valid time boundaries.
attributes:
Account Identifier:
type: string
identifier: primary
description: >
Globally unique surrogate identifier for this account across all systems.
Immutable once assigned.
Account Number:
type: string
description: >
Human-facing account number as presented to the customer. May follow BSB+account
format for Australian accounts or IBAN format for international accounts.
Account Type:
type: enum:Account Type
description: >
Classification of the account by its primary purpose and product characteristics
(e.g., Savings, Current, Term Deposit, Loan). Used as a dimension key in transaction
risk analytics — different account types have different expected transaction patterns
and applicable AML typologies.
Account Status:
type: enum:Account Status
description: >
The current operational lifecycle state of the account. Frozen and Suspended statuses
are set by compliance or fraud operations and must be tracked with their effective dates
to support regulatory audit. Closed accounts must be retained — they must not be deleted.
Opened Date:
type: date
description: >
Date the account was opened and became operational. Establishes the start of the
account's valid time period. Used in dormancy calculations and account age risk factors.
Closed Date:
type: date
description: >
Date the account was permanently closed. A null value indicates the account is still
open. Accounts must not be deleted — the Closed Date and a status of Closed is the
only permitted termination mechanism.
```
```yaml
constraints:
Closed Account Requires Closed Date:
check: >
Account Status != 'Closed'
OR Closed Date IS NOT NULL
description: >
An account with status Closed must have a Closed Date recorded to preserve
valid time integrity.
Closed Date After Opened Date:
check: "Closed Date IS NULL OR Closed Date > Opened Date"
description: >
An account's closure date must be later than its opening date.
```
```yaml
governance:
pii: false
classification: Highly Confidential
retention: 10 years
retention_basis: Domain default retention aligned to AML/CTF record-keeping obligations
description: >
Account records must be retained for 7 years from Closed Date, aligned to AUSTRAC
AML/CTF Act 2006 record-keeping obligations. Accounts must not be deleted — closure
via Closed Date and status update is the only permitted termination mechanism.
access_role:
- FINANCIAL_CRIME_ANALYST
- KYC_OFFICER
- COMPLIANCE_OFFICER
- RELATIONSHIP_MANAGER
compliance_relevance:
- AUSTRAC AML/CTF Act 2006 — Part B account record-keeping
- AUSTRAC AML/CTF Amendment Act 2024
- RBNZ AML/CFT Act 2009 — section 58
- FATF Recommendation 10 — Customer Due Diligence
```
## Relationships
### Account Holds Product
An Account is an instance of one Product definition.
```yaml
source: Account
type: references
target: Product
cardinality: many-to-one
granularity: atomic
ownership: Account
```
### Account Denominated In Currency
An Account is denominated in exactly one Currency. All balances and transaction amounts on the account are expressed in this currency.
```yaml
source: Account
type: references
target: Currency
cardinality: many-to-one
granularity: atomic
ownership: Account
```
+126
View File
@@ -0,0 +1,126 @@
# [Financial Crime](../domain.md)
## Entities
### Address
An Address is the canonical record of a physical or postal location. It holds only the structured components of the location itself — no party association, no purpose, no verification metadata. Those belong on Contact Address.
Separating Address from Contact Address enables deduplication: a single Address record serves as the reference point for all parties associated with that location. This is significant in a financial crime context — when two or more unrelated parties share the same Address, that shared reference is a detectable network signal without requiring any fuzzy address matching across duplicated strings.
Address records are reference data. They are not owned by any party and must not be modified when a party changes their address — instead the party's Contact Address is closed and a new one opened referencing the correct Address record.
```mermaid
---
config:
layout: elk
---
classDiagram
class Address{
* Address Identifier : string
Address Type : enum~AddressType~
Address Line 1 : string
Address Line 2 : string
Suburb : string
City : string
State Or Region : string
Postcode : string
Country : string
}
ContactAddress "0..*" --> "1" Address : references
class AddressType["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/enums.md#address-type'>Address Type</a>"]{<<enumeration>>}
class ContactAddress["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/contact_address.md'>Contact Address</a>"]
```
```yaml
existence: independent
mutability: reference
attributes:
Address Identifier:
type: string
identifier: primary
description: >
Globally unique surrogate identifier for this physical location record. Immutable once assigned. Multiple parties may reference the same Address Identifier via their Contact Address records.
Address Type:
type: enum:Address Type
description: >
The structural type of the address. Determines which fields are applicable — a PO Box does not have Address Line 1 in the same sense as a street address, and an Overseas Address may not have a State Or Region.
Address Line 1:
type: string
description: >
The primary street address line, typically including street number and street name. For PO Box addresses, the PO Box number.
Address Line 2:
type: string
description: >
Secondary address line for suite, level, unit, or building name where applicable.
Suburb:
type: string
description: >
The suburb or locality component of the address. Retained as a distinct field from City to support Australian and New Zealand address formats where suburb and city are separate concepts.
City:
type: string
description: >
The city or town. For addresses in Australia and New Zealand this is typically the metropolitan area (e.g., Sydney, Auckland) where distinct from the suburb.
State Or Region:
type: string
description: >
The state, territory, or region. For Australia: NSW, VIC, QLD, etc. For New Zealand: region name. For international addresses: the equivalent administrative subdivision.
Postcode:
type: string
description: >
The postal code. Stored as a string to preserve leading zeros and support international formats.
Country:
type: string
description: >
The country in which the address is located, as an ISO 3166-1 alpha-2 country code. Mandatory for all address types.
```
```yaml
constraints:
Country Required:
not_null: Country
description: >
Every address must have a country. Country is the minimum information
required for jurisdiction risk assessment.
Street Address Requires Address Line 1:
check: >
Address Type != 'Street Address'
OR Address Line 1 IS NOT NULL
description: >
A street address must have at least Address Line 1 populated.
```
```yaml
governance:
pii: false
classification: Confidential
retention: 10 years
retention_basis: Domain default retention aligned to AML/CTF record-keeping obligations
description: >
Address records must be retained for 7 years from the date the last Contact Address referencing this record is closed. Address records must not be modified or deleted — they are immutable reference data.
Changes to an address (e.g., a street renamed) should result in a new Address record; existing Contact Address records are not retrospectively updated so that historical point-in-time queries remain accurate.
access_role:
- FINANCIAL_CRIME_ANALYST
- KYC_OFFICER
- COMPLIANCE_OFFICER
- RELATIONSHIP_MANAGER
compliance_relevance:
- AUSTRAC AML/CTF Act 2006 — Part B address record-keeping
- RBNZ AML/CFT Act 2009 — section 58
```
## Relationships
No relationships are sourced directly from Address in the current domain model.
+81
View File
@@ -0,0 +1,81 @@
# [Financial Crime](../domain.md)
## Entities
### Agreement
An Agreement defines the formal contractual terms that govern relationships between party roles and financial products.
```mermaid
---
config:
layout: elk
---
classDiagram
class Agreement{
* Agreement Identifier : string
Agreement Number : string
Agreement Status : enum~AgreementStatus~
Effective Date : date
Maturity Date : date
}
TermDepositAgreement --|> Agreement
LoanAgreement --|> Agreement
Agreement "1" --> "0..*" PartyRole : governs
class AgreementStatus["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/enums.md#agreement-status'>Agreement Status</a>"]{<<enumeration>>}
class TermDepositAgreement["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/term-deposit-agreement.md'>Term Deposit Agreement</a>"]
class LoanAgreement["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/loan-agreement.md'>Loan Agreement</a>"]
class PartyRole["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/party_role.md'>Party Role</a>"]
```
```yaml
existence: independent
mutability: slowly_changing
attributes:
Agreement Identifier:
type: string
identifier: primary
description: Unique identifier of the agreement record.
Agreement Number:
type: string
description: Human-facing agreement reference number.
Agreement Status:
type: enum:Agreement Status
description: >
The current lifecycle state of the agreement. Active agreements govern current
obligations; Terminated and Matured agreements must be retained for audit. Used
as a dimension attribute in agreement-level analytics and regulatory reporting
of active product holdings.
Effective Date:
type: date
description: Date the agreement became enforceable.
Maturity Date:
type: date
description: Date the agreement is scheduled to mature, if applicable.
```
```yaml
governance:
retention_basis: Inherited from domain default retention of 10 years post relationship end for AML/CTF record-keeping
```
## Relationships
### Agreement Involves Party Roles
An Agreement governs and involves one or more Party Roles participating in the contract.
```yaml
source: Agreement
type: governs
target: Party Role
cardinality: one-to-many
granularity: atomic
ownership: Agreement
```
+75
View File
@@ -0,0 +1,75 @@
# [Financial Crime](../domain.md)
## Entities
### Branch
A Branch is an operational location responsible for servicing accounts and branch-mediated transactions.
```mermaid
---
config:
layout: elk
---
classDiagram
class Branch{
* Branch Identifier : string
Branch Code : string
Branch Name : string
}
Branch "1" --> "0..*" Account : services
class Account["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/account.md'>Account</a>"]
```
```yaml
existence: independent
mutability: reference
attributes:
Branch Identifier:
type: string
identifier: primary
description: Unique identifier for the branch location.
Branch Code:
type: string
description: Operational code used to identify the branch.
Branch Name:
type: string
description: Human-readable branch name.
```
```yaml
governance:
retention_basis: Inherited from domain default retention of 10 years post relationship end for AML/CTF record-keeping
```
## Relationships
### Branch Services Account
A Branch services one or more Accounts.
```yaml
source: Branch
type: has
target: Account
cardinality: one-to-many
granularity: atomic
ownership: Branch
```
### Branch Transaction Summary
A Branch has a grouped relationship to Transactions processed through its serviced Accounts. This supports branch-level aggregated reporting for fraud pattern analysis.
```yaml
source: Branch
type: associates_with
target: Transaction
cardinality: one-to-many
granularity: group
ownership: Branch
```
+108
View File
@@ -0,0 +1,108 @@
# [Financial Crime](../domain.md)
## Entities
### Company
A Company is a legal entity that participates in financial relationships with the institution. It specialises Party and carries organisation-specific identification and registration attributes.
Company legal structure is a primary AML risk factor. Shell companies, special purpose vehicles, and trusts carry elevated money-laundering risk due to beneficial ownership complexity — structure must be recorded to support risk rating and Enhanced Due Diligence decisions.
```mermaid
---
config:
layout: elk
---
classDiagram
class Company{
Company Registration Number : string
Incorporation Country : string
Incorporation Date : date
Legal Structure : enum~CompanyLegalStructure~
Tax Identifier : string
}
Company --|> Party
class CompanyLegalStructure["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/enums.md#company-legal-structure'>Company Legal Structure</a>"]{<<enumeration>>}
class Party["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/party.md'>Party</a>"]
```
```yaml
extends: Party
existence: independent
mutability: slowly_changing
attributes:
Company Registration Number:
type: string
description: >
Government-issued registration identifier for the legal entity (e.g., ACN for Australian
companies, NZBN for New Zealand companies). Required for legal entity identification
under AML/CTF Act 2006 Part B.
Incorporation Country:
type: string
description: >
ISO 3166-1 alpha-2 country code where the company is incorporated. Used for
jurisdiction risk scoring — entities incorporated in FATF-listed high-risk
jurisdictions require Enhanced Due Diligence.
Incorporation Date:
type: date
description: >
Date the company was formally incorporated. Recently incorporated entities with
no operating history are a risk signal, particularly when associated with high-value
or complex transactions.
Legal Structure:
type: enum:Company Legal Structure
description: >
The legal form under which the company is constituted. Critical for AML risk
assessment — trusts, special purpose vehicles, and foreign entities carry elevated
beneficial ownership risk. The legal structure determines which additional due
diligence obligations apply under the AML/CTF Act 2006 and RBNZ AML/CFT Act 2009.
Tax Identifier:
type: string
description: >
Tax registration number issued by the relevant revenue authority (e.g., Australian
Business Number (ABN), New Zealand Business Number (NZBN), US Employer Identification
Number (EIN)). Used as a supplementary identity verification attribute and cross-reference
for adverse media and sanction screening.
```
```yaml
constraints:
Registration Number Required For Active Company:
not_null: Company Registration Number
lifecycle_stage: Onboarding
description: >
A company must have a valid Company Registration Number before any designated
service is provided. Required for legal entity identification under AML/CTF Act 2006
Part B customer identification obligations.
```
```yaml
governance:
pii: false
classification: Highly Confidential
retention: 10 years
retention_basis: Domain default retention aligned to AML/CTF record-keeping obligations
description: >
10-year retention from the end of the business relationship, aligned to AUSTRAC and
RBNZ record-keeping obligations. The regulatory minimum is 7 years under AUSTRAC
AML/CTF Act 2006; the domain default of 10 years is applied as the conservative standard.
access_role:
- FINANCIAL_CRIME_ANALYST
- KYC_OFFICER
- COMPLIANCE_OFFICER
compliance_relevance:
- AUSTRAC AML/CTF Act 2006 — Part B legal entity identification
- AUSTRAC AML/CTF Amendment Act 2024
- RBNZ AML/CFT Act 2009 — section 14
- FATF Recommendation 10 — Customer Due Diligence (legal persons)
- FATF Recommendation 24 — Transparency and beneficial ownership of legal persons
```
## Relationships
No relationships are sourced directly from Company in the current domain model.
+167
View File
@@ -0,0 +1,167 @@
# [Financial Crime](../domain.md)
## Entities
### Contact Address
A Contact Address is the association between a Party and a physical Address, qualified by purpose, verification status, and the period during which it was in use. It is not the address itself — the canonical physical location is held in the Address entity and reused across parties. Contact Address carries only the metadata that describes *how* and *when* a Party uses a given address.
This separation supports two critical financial crime capabilities. First, deduplication: if two parties share the same physical address, a single Address record exists and both Contact Address records point to it, enabling network analysis queries such as "which other parties are associated with this address". Second, temporal accuracy: the valid time period on Contact Address allows point-in-time queries — "what address did this party use at the time of this transaction" — which is essential for regulatory audit and SAR evidence.
A Party *has* Contact Addresses — it owns the association. A Party Role *uses* Contact Addresses — a role references which of the party's addresses applies for the specific purpose of that role. For example, the same Person may have a residential address used for identification and a mailing address used by their Customer role for correspondence.
```mermaid
---
config:
layout: elk
---
classDiagram
class ContactAddress{
* Contact Address Identifier : string
Address Purpose : enum~AddressPurpose~
Is Primary : boolean
Verification Status : enum~AddressVerificationStatus~
Verification Date : date
Verification Method : enum~VerificationMethod~
Valid From : date
Valid To : date
}
Party "1" --> "0..*" ContactAddress : has
PartyRole "0..*" --> "0..*" ContactAddress : uses
ContactAddress "0..*" --> "1" Address : references
class AddressPurpose["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/enums.md#address-purpose'>Address Purpose</a>"]{<<enumeration>>}
class AddressVerificationStatus["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/enums.md#address-verification-status'>Address Verification Status</a>"]{<<enumeration>>}
class VerificationMethod["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/enums.md#verification-method'>Verification Method</a>"]{<<enumeration>>}
class Party["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/party.md'>Party</a>"]
class PartyRole["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/party_role.md'>Party Role</a>"]
class Address["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/address.md'>Address</a>"]
```
```yaml
existence: associative
mutability: slowly_changing
temporal:
tracking: valid_time
description: >
Valid time is carried explicitly as Valid From and Valid To attributes rather than relying on generated temporal columns. This allows future-dated address changes (e.g. recording a new address before a customer moves) and supports point-in-time queries for regulatory audit.
attributes:
Contact Address Identifier:
type: string
identifier: primary
description: >
Globally unique surrogate identifier for this party-address association instance.
Address Purpose:
type: enum:Address Purpose
description: >
The purpose for which this address is used by the party. Determines regulatory significance — a Residential Address is required for individual identification under the AML/CTF Act 2006; a Registered Office Address is required for legal entity verification.
Is Primary:
type: boolean
default: false
description: >
Indicates whether this is the party's primary contact address for the given purpose. A party may have only one primary address per Address Purpose at any point in time.
Verification Status:
type: enum:Address Verification Status
description: >
The current verification status of this address association. Unverified addresses must not be used as the sole basis for satisfying AML/CTF identification obligations. Expired verification must be renewed at the next CDD review.
Verification Date:
type: date
description: >
The date on which the address was most recently verified against an acceptable document or electronic source. Used to determine whether re-verification is required at periodic CDD review.
Verification Method:
type: enum:Verification Method
description: >
The method used to verify this address. Documentary verification requires an acceptable identity or address document. Electronic verification uses a third-party data source. In-person verification is performed at a branch or by a third party.
Valid From:
type: date
description: >
The date from which the party began using this address for the stated purpose. Establishes the start of the valid time period for point-in-time queries.
Valid To:
type: date
description: >
The date on which the party ceased using this address for the stated purpose. A null value indicates the address is currently in use. Closed associations must not be deleted — Valid To must be set to preserve address history for regulatory audit.
```
```yaml
constraints:
One Primary Per Purpose:
check: >
COUNT(Contact Address WHERE Party == this.Party
AND Address Purpose == this.Address Purpose
AND Is Primary == true
AND (Valid To IS NULL OR Valid To >= Today)) <= 1
description: >
A party may have at most one primary Contact Address per Address Purpose
at any point in time.
Valid To After Valid From:
check: "Valid To IS NULL OR Valid To > Valid From"
description: >
The end of the address validity period must be later than the start.
Verification Date Required When Verified:
check: >
Verification Status != 'Verified'
OR Verification Date IS NOT NULL
description: >
A Contact Address with a status of Verified must have a Verification
Date recorded.
Residential Required Before Activation:
check: >
EXISTS (Contact Address WHERE Party == this.Party
AND Address Purpose == 'Residential'
AND Verification Status == 'Verified')
lifecycle_stage: Onboarding
description: >
An individual party must have at least one verified Residential Address
before any designated service is provided. Required for identification
under the AML/CTF Act 2006 Part B individual identification program.
```
```yaml
governance:
pii: true
classification: Highly Confidential
retention: 10 years
retention_basis: Domain default retention aligned to AML/CTF record-keeping obligations
description: >
Address association records must be retained for 7 years from Valid To
date, aligned to AUSTRAC and RBNZ record-keeping obligations. Records
must never be deleted — closure via Valid To is the only permitted
termination mechanism.
access_role:
- FINANCIAL_CRIME_ANALYST
- KYC_OFFICER
- COMPLIANCE_OFFICER
- RELATIONSHIP_MANAGER
compliance_relevance:
- AUSTRAC AML/CTF Act 2006 — Part B address identification obligations
- AUSTRAC AML/CTF Amendment Act 2024
- RBNZ AML/CFT Act 2009 — section 14
- FATF Recommendation 10 — Customer Due Diligence
```
## Relationships
### Contact Address References Address
Each Contact Address references exactly one canonical Address record.
```yaml
source: Contact Address
type: references
target: Address
cardinality: many-to-one
granularity: atomic
ownership: Contact Address
```
+52
View File
@@ -0,0 +1,52 @@
# [Financial Crime](../domain.md)
## Entities
### Currency
Currency defines a recognised monetary unit used for account balances and transactions.
```mermaid
---
config:
layout: elk
---
classDiagram
class Currency{
* Currency Code : string
Currency Name : string
Minor Unit : integer
}
ExchangeRate "0..*" --> "1" Currency : from
ExchangeRate "0..*" --> "1" Currency : to
class ExchangeRate["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/exchange-rate.md'>Exchange Rate</a>"]
```
```yaml
existence: independent
mutability: reference
attributes:
Currency Code:
type: string
identifier: primary
description: ISO 4217 alphabetic currency code.
Currency Name:
type: string
description: Official currency display name.
Minor Unit:
type: integer
description: Number of decimal places used for the currency.
```
```yaml
governance:
retention_basis: Inherited from domain default retention of 10 years post relationship end for AML/CTF record-keeping
```
## Relationships
No relationships are sourced directly from Currency in the current domain model.
@@ -0,0 +1,59 @@
# [Financial Crime](../domain.md)
## Entities
### Customer Preferences
Customer Preferences captures communication and consent preferences that apply to a specific customer relationship.
```mermaid
---
config:
layout: elk
---
classDiagram
class CustomerPreferences{
* Preference Identifier : string
Contact Preference : enum~ContactPreference~
Marketing Consent : boolean
Effective From : date
}
Customer "1" --> "0..1" CustomerPreferences : has
class ContactPreference["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/enums.md#contact-preference'>Contact Preference</a>"]{<<enumeration>>}
class Customer["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/customer.md'>Customer</a>"]
```
```yaml
existence: dependent
mutability: slowly_changing
attributes:
Preference Identifier:
type: string
identifier: primary
description: Unique identifier for the customer preference profile.
Contact Preference:
type: enum:Contact Preference
description: >
The customer's preferred channel for outbound communication from the institution.
Must be respected in all non-mandatory communications and drives CRM system routing.
Marketing Consent:
type: boolean
description: Indicates whether the customer has consented to marketing communications.
Effective From:
type: date
description: Date from which the current preference set applies.
```
```yaml
governance:
retention_basis: Inherited from domain default retention of 10 years post relationship end for AML/CTF record-keeping
```
## Relationships
No relationships are sourced directly from Customer Preferences in the current domain model.
+85
View File
@@ -0,0 +1,85 @@
# [Financial Crime](../domain.md)
## Entities
### Customer
A Customer is a Party Role representing an active or prospective relationship with the institution for products and services.
```mermaid
---
config:
layout: elk
---
classDiagram
class Customer{
* Customer Number : string
Onboarding Date : date
Relationship Start Date : date
}
Customer --|> PartyRole
Customer "0..*" --> "0..*" Account : holds
Customer "1" --> "0..1" CustomerPreferences : has
class PartyRole["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/party_role.md'>Party Role</a>"]
class Account["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/account.md'>Account</a>"]
class CustomerPreferences["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/customer-preferences.md'>Customer Preferences</a>"]
```
```yaml
extends: Party Role
existence: independent
mutability: slowly_changing
attributes:
Customer Number:
type: string
identifier: primary
description: Unique customer identifier used for service and support operations.
Onboarding Date:
type: date
description: Date the customer onboarding process was completed.
Relationship Start Date:
type: date
description: Date the customer relationship became effective.
```
```yaml
governance:
retention_basis: Inherited from domain default retention of 10 years post relationship end for AML/CTF record-keeping
```
## Relationships
### Customer Holds Account
A Customer can hold one or more Accounts, and an Account can be held by one or more Customers. Joint accounts, business accounts with multiple authorized signatories, and beneficial ownership structures all require many-to-many cardinality. In the Financial Crime domain this is the structural basis for network analysis — connecting Customers through shared Accounts.
```yaml
source: Customer
type: has
target: Account
cardinality: many-to-many
granularity: atomic
ownership: Customer
relationship_attributes:
- Holder Type (enum:Account Holder Type)
- Holder Start Date
- Holder End Date
- Is Primary Holder
```
### Customer Has Preferences
A Customer has at most one active Customer Preferences profile at a time.
```yaml
source: Customer
type: has
target: Customer Preferences
cardinality: one-to-one
granularity: atomic
ownership: Customer
```
+76
View File
@@ -0,0 +1,76 @@
# [Financial Crime](../domain.md)
## Entities
### Exchange Rate
An Exchange Rate records conversion values between a source and target currency at a specific effective time.
```mermaid
---
config:
layout: elk
---
classDiagram
class ExchangeRate{
* Exchange Rate Identifier : string
Rate Value : decimal
Effective Date Time : datetime
}
ExchangeRate "0..*" --> "1" Currency : base
ExchangeRate "0..*" --> "1" Currency : quote
class Currency["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/currency.md'>Currency</a>"]
```
```yaml
existence: dependent
mutability: append_only
attributes:
Exchange Rate Identifier:
type: string
identifier: primary
description: Unique identifier for the exchange rate observation.
Rate Value:
type: decimal
description: Conversion multiplier from base to quote currency.
Effective Date Time:
type: datetime
description: Timestamp at which the rate became effective.
```
```yaml
governance:
retention_basis: Inherited from domain default retention of 10 years post relationship end for AML/CTF record-keeping
```
## Relationships
### Exchange Rate References Base Currency
Each Exchange Rate references one base Currency.
```yaml
source: Exchange Rate
type: references
target: Currency
cardinality: many-to-one
granularity: atomic
ownership: Exchange Rate
```
### Exchange Rate References Quote Currency
Each Exchange Rate references one quote Currency.
```yaml
source: Exchange Rate
type: references
target: Currency
cardinality: many-to-one
granularity: atomic
ownership: Exchange Rate
```
@@ -0,0 +1,51 @@
# [Financial Crime](../domain.md)
## Entities
### Loan Agreement
A Loan Agreement is a specialised agreement defining loan amount, schedule, and repayment obligations.
```mermaid
---
config:
layout: elk
---
classDiagram
class LoanAgreement{
Principal Amount : decimal
Interest Rate : decimal
Repayment Frequency : string
}
LoanAgreement --|> Agreement
class Agreement["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/agreement.md'>Agreement</a>"]
```
```yaml
extends: Agreement
existence: independent
mutability: slowly_changing
attributes:
Principal Amount:
type: decimal
description: Principal amount disbursed under the loan.
Interest Rate:
type: decimal
description: Contracted annual interest rate for the loan.
Repayment Frequency:
type: string
description: Payment cadence for scheduled repayments.
```
```yaml
governance:
retention_basis: Inherited from domain default retention of 10 years post relationship end for AML/CTF record-keeping
```
## Relationships
No relationships are sourced directly from Loan Agreement in the current domain model.
+81
View File
@@ -0,0 +1,81 @@
# [Financial Crime](../domain.md)
## Entities
### Merchant
A Merchant is a Party Role that accepts payments for goods or services through institution channels.
```mermaid
---
config:
layout: elk
---
classDiagram
class Merchant{
* Merchant Identifier : string
Merchant Category Code : string
Settlement Account Identifier : string
}
Merchant --|> PartyRole
Merchant "1" --> "0..*" Transaction : processes
Merchant "0..*" --> "0..1" Account : settles into
class PartyRole["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/party_role.md'>Party Role</a>"]
class Transaction["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/transaction.md'>Transaction</a>"]
class Account["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/account.md'>Account</a>"]
```
```yaml
extends: Party Role
existence: independent
mutability: slowly_changing
attributes:
Merchant Identifier:
type: string
identifier: primary
description: Unique identifier for the merchant role instance.
Merchant Category Code:
type: string
description: >
ISO 18245 Merchant Category Code (MCC) representing the merchant's primary
business type. Used in transaction monitoring rule segmentation — certain MCCs
(e.g., cash-intensive businesses, money services) attract heightened scrutiny.
Settlement Account Identifier:
type: string
description: Account identifier used for merchant settlement.
```
```yaml
governance:
retention_basis: Inherited from domain default retention of 10 years post relationship end for AML/CTF record-keeping
```
## Relationships
### Merchant Receives Payment
A Merchant receives funds through one or more Transactions.
```yaml
source: Merchant
type: associates_with
target: Transaction
cardinality: one-to-many
granularity: atomic
ownership: Merchant
```
### Merchant Has Settlement Account
A Merchant may have a designated Account into which settlement funds are credited by the institution.
```yaml
source: Merchant
type: references
target: Account
cardinality: many-to-one
granularity: atomic
ownership: Merchant
```
+188
View File
@@ -0,0 +1,188 @@
# [Financial Crime](../domain.md)
## Entities
### Party
A Party is any individual or legal entity that has, or may have, a financial relationship with the institution. Aligned to the BIAN Party Reference Data Directory, Party is the foundational abstract concept from which all financial crime subjects are derived — it carries only the attributes that are universal across every party type.
In the Financial Crime domain a Party represents any subject that may be assessed for risk, screened against watchlists, investigated, or reported to a regulatory authority. A Party does not hold relationships directly — it participates through a Party Role (e.g., Account Holder, Beneficial Owner, Signatory). The same Party may hold multiple roles across multiple products simultaneously.
Specialisations of Party — Person and Legal Entity — carry the attributes that are specific to a natural person or an incorporated body respectively.
```mermaid
---
config:
layout: elk
---
classDiagram
class Party{
<<abstract>>
* Party Identifier : string
Legal Name : string
Also Known As : string[]
Party Status : enum~PartyStatus~
Risk Rating : enum~FinancialCrimeRiskRating~
Sanctions Screen Status : enum~SanctionsScreenStatus~
Next Review Date : date
}
class Person
class Company{
}
Person --|> Party
Company --|> Party
Party "1" --> "0..*" PartyRole
Party "1" --> "0..*" ContactAddress
class PartyStatus["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/enums.md#party-status'>Party Status</a>"]{<<enumeration>>}
class FinancialCrimeRiskRating["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/enums.md#financial-crime-risk-rating'>Financial Crime Risk Rating</a>"]{<<enumeration>>}
class SanctionsScreenStatus["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/enums.md#sanctions-screen-status'>Sanctions Screen Status</a>"]{<<enumeration>>}
class PartyRole["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/party_role.md'>Party Role</a>"]
class ContactAddress["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/contact_address.md'>Contact Address</a>"]
```
```yaml
existence: independent
mutability: slowly_changing
temporal:
tracking: bitemporal
description: >
Valid time captures when the party information was true in the real world (e.g., a name change effective date). Transaction time captures when the institution recorded or became aware of the information. Both dimensions are required to support regulatory audit trails and Suspicious Matter Report evidence under the AUSTRAC AML/CTF Act 2006.
attributes:
Party Identifier:
type: string
identifier: primary
description: >
Globally unique surrogate identifier for this party across all systems and jurisdictions. Immutable once assigned.
Legal Name:
type: string
pii: true
description: >
The full legal name of the party as it appears on the most recently verified official documentation. For individuals this is the full given and family name. For legal entities this is the registered name.
Also Known As:
type: string[]
pii: true
description: >
Alternative names, aliases, trading names, or former names. Critical for watchlist screening — a party may appear on a sanctions or adverse media list under an alias rather than their current legal name.
Party Status:
type: enum:Party Status
description: >
The current operational status of the party record within the institution. Controls whether new relationships may be established and flags parties under active investigation or restriction.
Risk Rating:
type: enum:Financial Crime Risk Rating
description: >
The institution's current assessed ML/TF risk rating for this party, derived from the most recent CDD or EDD review. Drives transaction monitoring thresholds, review frequency, and the level of due diligence required under the AML/CTF Act 2006 Part B program obligations.
Sanctions Screen Status:
type: enum:Sanctions Screen Status
description: >
The outcome of the most recent screening run against applicable consolidated sanctions lists. A potential or confirmed match must trigger an investigation before any designated service is provided or any
transaction is processed.
Next Review Date:
type: date
description: >
The date by which the next periodic CDD review must be completed. Calculated from the Risk Rating in accordance with the institution's Part A OCDD program — high-risk parties annually, medium-risk every
two years, low-risk every three years.
```
```yaml
constraints:
Legal Name Required:
not_null: Legal Name
description: >
Every party must have a verified legal name before any designated service is provided. Anonymous parties cannot be onboarded under the AML/CTF Act 2006 Part B identification obligations.
Review Date Must Not Be Overdue:
check: "Next Review Date >= Today OR Party Status == 'Under Review'"
description: >
A party whose Next Review Date has passed must be placed Under Review and must not be permitted to initiate new transactions until the CDD review is completed and a new review date is set.
Confirmed Sanctions Match Blocks Service:
check: "Sanctions Screen Status != 'Confirmed Match'"
lifecycle_stage: Onboarding
description: >
A party with a confirmed sanctions match must not be onboarded or permitted to transact. This is a hard stop pending review by the Financial Crime Compliance Officer.
```
```yaml
governance:
pii: true
classification: Highly Confidential
retention: 10 years
retention_basis: Domain default retention aligned to AML/CTF record-keeping obligations
description: >
Minimum 7-year retention from the end of the business relationship, aligned to AUSTRAC record-keeping obligations under the AML/CTF Act 2006 and RBNZ AML/CFT Act 2009 section 58.
access_role:
- FINANCIAL_CRIME_ANALYST
- KYC_OFFICER
- COMPLIANCE_OFFICER
compliance_relevance:
- AUSTRAC AML/CTF Act 2006
- AUSTRAC AML/CTF Amendment Act 2024
- RBNZ AML/CFT Act 2009
- APRA Prudential Standard CPS 234
- FATF Recommendations 10, 11, 12
regulatory_reporting:
- Suspicious Matter Report (SMR) — AUSTRAC
- Suspicious Transaction Report (STR) — RBNZ
- Threshold Transaction Report (TTR) — AUSTRAC
- International Funds Transfer Instruction (IFTI) — AUSTRAC
```
## Relationships
### Party Assumes Roles
A Party can assume one or more Party Roles across different business contexts.
```yaml
source: Party
type: has
target: Party Role
cardinality: one-to-many
granularity: atomic
ownership: Party
```
### Party Has Contact Addresses
A Party can have one or more contact addresses for communication and verification.
```yaml
source: Party
type: has
target: Contact Address
cardinality: one-to-many
granularity: atomic
ownership: Party
```
### Party Related To Party
A Party may be related to one or more other Parties through ownership, control, family, or association ties. This self-referential relationship is the structural basis for financial crime network analysis — establishing connections between parties for beneficial ownership mapping, PEP network screening, and suspicious activity investigation.
A relationship instance represents a directional association with a named type (e.g., "Ultimate Beneficial Owner of", "Director of", "Spouse of"). The same pair of parties may have multiple association instances of different types simultaneously.
```yaml
source: Party
type: related_to
target: Party
cardinality: many-to-many
granularity: atomic
ownership: Party
self_referential: true
relationship_attributes:
- Association Type (enum:Association Type)
- Association Start Date
- Association End Date
- Verified
```
+201
View File
@@ -0,0 +1,201 @@
# [Financial Crime](../domain.md)
## Entities
### Party Role
A Party Role represents the specific capacity or context in which a Party participates in a business relationship with the institution. Aligned to the BIAN BOM, Party Role is the abstract concept that separates *who* a party is (the Party) from *what they do* in a given context (the Role). The same Party may hold multiple Party Roles simultaneously — a natural person may be a Customer on a home loan, a Payer on a standing order, and a Beneficial Owner of a company that holds a business account, all at the same time.
In the Financial Crime domain, Party Role is significant because AML/CTF obligations attach to roles, not parties in isolation. The due diligence required for a Beneficial Owner differs from that required for an Account Holder, and the same individual may require different levels of scrutiny depending on which role they are assessed in.
Party Role is abstract — it is never instantiated directly. All roles are expressed through specialisations: Customer, Merchant, Payer, Payee, Teller, Instructing Agent, and others defined in the domain.
```mermaid
---
config:
layout: elk
---
classDiagram
class PartyRole{
<<abstract>>
* Role Identifier : string
Role Status : enum~PartyRoleStatus~
Role Start Date : date
Role End Date : date
Due Diligence Status : enum~DDStatus~
}
class Customer
class Merchant
class Payee
class Payer
class Teller
class PaymentInitiator
Customer --|> PartyRole
Merchant --|> PartyRole
Payee --|> PartyRole
Payer --|> PartyRole
Teller --|> PartyRole
PaymentInitiator --|> PartyRole
PartyRole "1" <-- "0..*" Party : assumes
PartyRole "0..*" --> "0..*" ContactAddress : uses
PartyRole "0..*" --> "0..1" Agreement : governed by
class PartyRoleStatus["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/enums.md#party-role-status'>Party Role Status</a>"]{<<enumeration>>}
class DDStatus["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/enums.md#due-diligence-status'>Due Diligence Status</a>"]{<<enumeration>>}
class Party["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/party.md'>Party</a>"]
class ContactAddress["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/contact_address.md'>Contact Address</a>"]
class Agreement["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/agreement.md'>Agreement</a>"]
```
```yaml
existence: independent
mutability: slowly_changing
temporal:
tracking: bitemporal
description: >
Bitemporal tracking captures both when the role was active in the real
world (valid time via Role Start Date and Role End Date) and when the
record was known to the system (transaction time). This supports
point-in-time queries required for regulatory audit — e.g. "was this
party a Beneficial Owner at the time of this transaction?" — while also
enabling reconstruction of what the system believed at any past moment,
critical for audit trail integrity and late-arriving corrections.
attributes:
Role Identifier:
type: string
identifier: primary
description: >
Globally unique surrogate identifier for this specific role instance.
Distinct from the Party Identifier — the same party holding two different
roles will have two Role Identifiers.
Role Status:
type: enum:Party Role Status
description: >
The current lifecycle status of this role. Controls whether the role
confers active privileges (e.g., ability to transact) and flags roles
under review or restriction.
Role Start Date:
type: date
description: >
The date from which this role became effective. Used to establish the
valid time period for regulatory audit and point-in-time queries.
Role End Date:
type: date
description: >
The date on which this role ceased to be effective, if applicable.
A null value indicates the role is currently active. Roles must not be
deleted — they must be closed with a Role End Date to preserve audit
history.
Due Diligence Status:
type: enum:Due Diligence Status
description: >
The completion status of the CDD or EDD obligations associated with
this specific role. AML/CTF obligations under the AML/CTF Act 2006
and RBNZ AML/CFT Act 2009 attach at the role level — a party may
have completed CDD as a Customer but still require separate CDD
assessment as a Beneficial Owner of a related entity.
```
```yaml
constraints:
Role End After Start:
check: "Role End Date IS NULL OR Role End Date > Role Start Date"
description: >
A role's end date must be later than its start date. A null end date
indicates the role is currently open.
Active Role Requires Complete Due Diligence:
check: >
Role Status != 'Active'
OR Due Diligence Status == 'Complete'
lifecycle_stage: Activation
description: >
A role must not be set to Active until the CDD or EDD obligations
associated with that role have been completed. This enforces the
AML/CTF Act 2006 obligation that designated services must not be
provided before identification and verification is complete.
Closed Role Requires End Date:
check: >
Role Status != 'Closed'
OR Role End Date IS NOT NULL
description: >
A role with a status of Closed must have a Role End Date recorded.
This ensures the valid time period is always closed correctly for
audit and regulatory reporting purposes.
```
```yaml
governance:
pii: false
classification: Confidential
retention: 10 years
retention_basis: Domain default retention aligned to AML/CTF record-keeping obligations
description: >
Role records must be retained for 7 years from Role End Date, aligned
to AUSTRAC and RBNZ record-keeping obligations. Roles must never be
deleted — closure via Role End Date and Role Status is the only
permitted termination mechanism.
access_role:
- FINANCIAL_CRIME_ANALYST
- KYC_OFFICER
- COMPLIANCE_OFFICER
- RELATIONSHIP_MANAGER
compliance_relevance:
- AUSTRAC AML/CTF Act 2006 — Part B role-level identification obligations
- AUSTRAC AML/CTF Amendment Act 2024
- RBNZ AML/CFT Act 2009
- FATF Recommendation 10 — Customer Due Diligence
```
## Relationships
### Party Role Uses Contact Addresses
A Party Role may use one or more Contact Addresses owned by the underlying Party.
```yaml
source: Party Role
type: associates_with
target: Contact Address
cardinality: many-to-many
granularity: atomic
ownership: Party Role
```
### Party Role Governed By Agreement
A Party Role may be governed by a specific Agreement that defines obligations and permissions.
```yaml
source: Party Role
type: references
target: Agreement
cardinality: many-to-one
granularity: atomic
ownership: Party Role
```
### Party Role At Point In Time
Captures the state of a Party Role as it stood at a specific point in time. Used for regulatory snapshots — e.g. quarterly compliance reporting requires the role state as of the reporting date, not the current state.
Party Role is declared bitemporal; this period-granularity relationship makes the temporal snapshot pattern explicit for physical generation, ensuring dimensional consumers can materialize point-in-time snapshots for regulatory reporting.
```yaml
source: Party Role
type: snapshots
target: Party Role
cardinality: one-to-one
granularity: period
ownership: Party Role
self_referential: true
```
+47
View File
@@ -0,0 +1,47 @@
# [Financial Crime](../domain.md)
## Entities
### Payee
A Payee is a Party Role representing the recipient of funds in a transaction.
```mermaid
---
config:
layout: elk
---
classDiagram
class Payee{
* Payee Identifier : string
Beneficiary Reference : string
}
Payee --|> PartyRole
class PartyRole["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/party_role.md'>Party Role</a>"]
```
```yaml
extends: Party Role
existence: independent
mutability: slowly_changing
attributes:
Payee Identifier:
type: string
identifier: primary
description: Unique identifier for the payee role instance.
Beneficiary Reference:
type: string
description: Reference used to identify the beneficiary in payment instructions.
```
```yaml
governance:
retention_basis: Inherited from domain default retention of 10 years post relationship end for AML/CTF record-keeping
```
## Relationships
No relationships are sourced directly from Payee. The canonical direction is Transaction-owned — see [Transaction Has Creditor](transaction.md#transaction-has-creditor).
+47
View File
@@ -0,0 +1,47 @@
# [Financial Crime](../domain.md)
## Entities
### Payer
A Payer is a Party Role representing the party from whom funds are debited in a transaction.
```mermaid
---
config:
layout: elk
---
classDiagram
class Payer{
* Payer Identifier : string
Funding Source Reference : string
}
Payer --|> PartyRole
class PartyRole["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/party_role.md'>Party Role</a>"]
```
```yaml
extends: Party Role
existence: independent
mutability: slowly_changing
attributes:
Payer Identifier:
type: string
identifier: primary
description: Unique identifier for the payer role instance.
Funding Source Reference:
type: string
description: Reference to the source account or instrument used to fund payments.
```
```yaml
governance:
retention_basis: Inherited from domain default retention of 10 years post relationship end for AML/CTF record-keeping
```
## Relationships
No relationships are sourced directly from Payer. The canonical direction is Transaction-owned — see [Transaction Has Debtor](transaction.md#transaction-has-debtor).
@@ -0,0 +1,47 @@
# [Financial Crime](../domain.md)
## Entities
### Payment Initiator
A Payment Initiator is a Party Role representing the party that instructs or initiates a transaction.
```mermaid
---
config:
layout: elk
---
classDiagram
class PaymentInitiator{
* Payment Initiator Identifier : string
Initiation Channel : string
}
PaymentInitiator --|> PartyRole
class PartyRole["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/party_role.md'>Party Role</a>"]
```
```yaml
extends: Party Role
existence: independent
mutability: slowly_changing
attributes:
Payment Initiator Identifier:
type: string
identifier: primary
description: Unique identifier for the payment initiator role instance.
Initiation Channel:
type: string
description: Channel used to initiate payment instructions.
```
```yaml
governance:
retention_basis: Inherited from domain default retention of 10 years post relationship end for AML/CTF record-keeping
```
## Relationships
No relationships are sourced directly from Payment Initiator. The canonical direction is Transaction-owned — see [Transaction Initiated By Instructing Agent](transaction.md#transaction-initiated-by-instructing-agent).
+115
View File
@@ -0,0 +1,115 @@
# [Financial Crime](../domain.md)
## Entities
### Person
A Person is a natural person who has, or may have, a financial relationship with the institution. Person specialises Party, inheriting all universal party attributes and adding those that are specific to a natural person — including identity verification details, biographic attributes, and PEP status.
Under the AUSTRAC AML/CTF Act 2006 and RBNZ AML/CFT Act 2009, the identification and verification requirements for individuals differ materially from those for legal entities, making Person a distinct and necessary specialisation.
```mermaid
---
config:
layout: elk
---
classDiagram
class Party{
<<abstract>>
}
class Person{
Date of Birth : date
Country of Birth : string
Nationality : string[]
Country of Residence : string
Politically Exposed Person Status : enum~PEPStatus~
}
Person --|> Party
class PEPStatus["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/enums.md#pep-status'>PEP Status</a>"]{<<enumeration>>}
class Party["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/party.md'>Party</a>"]
```
```yaml
extends: Party
existence: independent
mutability: slowly_changing
attributes:
Date of Birth:
type: date
pii: true
description: >
The individual's date of birth as recorded on their primary identity document. Required for identity verification under the AML/CTF Act 2006 Part B customer identification program.
Country of Birth:
type: string
pii: true
description: >
The country in which the individual was born. Used as a supplementary identity verification attribute and as an input to jurisdiction risk scoring.
Nationality:
type: string[1..*]
pii: true
description: >
One or more nationalities held by the individual. A key factor in sanctions jurisdiction screening — an individual may hold nationality in a sanctioned country while residing elsewhere.
Country of Residence:
type: string
pii: true
description: >
The country in which the individual currently resides. Used for jurisdiction risk scoring, FATF high-risk country screening, and determining applicable CDD obligations.
Politically Exposed Person Status:
type: enum:PEP Status
description: >
Indicates whether the individual is a Politically Exposed Person, a close associate of a PEP, or a family member of a PEP. PEP status applies only to natural persons. Triggers mandatory Enhanced Customer Due Diligence under the AML/CTF Act 2006 and RBNZ AML/CFT Act 2009 section 22.
```
```yaml
constraints:
Date of Birth Required at Onboarding:
not_null: Date of Birth
lifecycle_stage: Onboarding
description: >
Date of birth is a mandatory identification attribute for individuals under the AML/CTF Act 2006 Part B customer identification obligations. It must be collected and verified before any designated service is provided.
PEP Requires High Risk Rating:
check: >
Politically Exposed Person Status == 'Not PEP'
OR Risk Rating IN ('High', 'Very High')
description: >
Any individual identified as a PEP or PEP associate must be assigned a
minimum Risk Rating of High, inherited from Party. This triggers
Enhanced Customer Due Diligence obligations under the AML/CTF Act 2006
and RBNZ AML/CFT Act 2009. The Risk Rating constraint is evaluated
against the inherited attribute.
```
```yaml
governance:
pii: true
classification: Highly Confidential
retention: 10 years
retention_basis: Domain default retention aligned to AML/CTF record-keeping obligations
description: >
10-year retention from the end of the business relationship, aligned to
AUSTRAC and RBNZ record-keeping obligations. The regulatory minimum is 7
years under AUSTRAC AML/CTF Act 2006; the domain default of 10 years is
applied as the conservative standard.
access_role:
- FINANCIAL_CRIME_ANALYST
- KYC_OFFICER
- COMPLIANCE_OFFICER
compliance_relevance:
- AUSTRAC AML/CTF Act 2006 — Part B Individual Identification
- AUSTRAC AML/CTF Amendment Act 2024
- RBNZ AML/CFT Act 2009 — sections 14, 22
- FATF Recommendation 12 — Politically Exposed Persons
```
## Relationships
No relationships are sourced directly from Person in the current domain model.
+64
View File
@@ -0,0 +1,64 @@
# [Financial Crime](../domain.md)
## Entities
### Product
A Product is a financial offering whose terms are governed by an agreement and used by one or more accounts.
```mermaid
---
config:
layout: elk
---
classDiagram
class Product{
* Product Identifier : string
Product Name : string
Product Category : string
}
Product "0..*" --> "1" Agreement : in terms of
Account "0..*" --> "1" Product : holds
class Agreement["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/agreement.md'>Agreement</a>"]
class Account["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/account.md'>Account</a>"]
```
```yaml
existence: independent
mutability: slowly_changing
attributes:
Product Identifier:
type: string
identifier: primary
description: Unique identifier of the product definition.
Product Name:
type: string
description: Business name of the product offering.
Product Category:
type: string
description: Product classification used for reporting and controls.
```
```yaml
governance:
retention_basis: Inherited from domain default retention of 10 years post relationship end for AML/CTF record-keeping
```
## Relationships
### Product In Terms Of Agreement
A Product is defined in terms of an Agreement template or contractual framework.
```yaml
source: Product
type: references
target: Agreement
cardinality: many-to-one
granularity: atomic
ownership: Product
```
+80
View File
@@ -0,0 +1,80 @@
# [Financial Crime](../domain.md)
## Entities
### Teller
A Teller is a Party Role representing a bank employee who processes branch-based customer transactions.
```mermaid
---
config:
layout: elk
---
classDiagram
class Teller{
* Teller Identifier : string
Employee Number : string
Assigned Branch Identifier : string
}
Teller --|> PartyRole
Teller "1" --> "0..*" Transaction : processes
Teller "0..*" --> "1" Branch : assigned to
class PartyRole["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/party_role.md'>Party Role</a>"]
class Transaction["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/transaction.md'>Transaction</a>"]
class Branch["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/branch.md'>Branch</a>"]
```
```yaml
extends: Party Role
existence: independent
mutability: slowly_changing
attributes:
Teller Identifier:
type: string
identifier: primary
description: Unique identifier for the teller role instance.
Employee Number:
type: string
description: Internal identifier of the staff member acting as teller.
Assigned Branch Identifier:
type: string
description: Branch identifier where the teller is primarily assigned.
```
```yaml
governance:
retention_basis: Inherited from domain default retention of 10 years post relationship end for AML/CTF record-keeping
```
## Relationships
### Teller Processes Transaction
A Teller can process one or more branch-mediated Transactions.
```yaml
source: Teller
type: associates_with
target: Transaction
cardinality: one-to-many
granularity: atomic
ownership: Teller
```
### Teller Assigned To Branch
A Teller is assigned to a Branch for operational responsibilities.
```yaml
source: Teller
type: assigned_to
target: Branch
cardinality: many-to-one
granularity: atomic
ownership: Teller
```
@@ -0,0 +1,51 @@
# [Financial Crime](../domain.md)
## Entities
### Term Deposit Agreement
A Term Deposit Agreement is a specialised agreement defining fixed-term deposit terms.
```mermaid
---
config:
layout: elk
---
classDiagram
class TermDepositAgreement{
Deposit Amount : decimal
Term Length Months : integer
Interest Rate : decimal
}
TermDepositAgreement --|> Agreement
class Agreement["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/agreement.md'>Agreement</a>"]
```
```yaml
extends: Agreement
existence: independent
mutability: slowly_changing
attributes:
Deposit Amount:
type: decimal
description: Principal amount committed to the term deposit.
Term Length Months:
type: integer
description: Fixed term length in months.
Interest Rate:
type: decimal
description: Contracted annual interest rate for the term.
```
```yaml
governance:
retention_basis: Inherited from domain default retention of 10 years post relationship end for AML/CTF record-keeping
```
## Relationships
No relationships are sourced directly from Term Deposit Agreement in the current domain model.
+234
View File
@@ -0,0 +1,234 @@
# [Financial Crime](../domain.md)
## Entities
### Transaction
A Transaction represents a movement of value between parties and accounts. It is the primary fact entity in the Financial Crime domain — it carries the monetary amount, the timing, the mechanism, and the parties and accounts involved. Every transaction must be monitorable for suspicious activity patterns.
In a dimensional model, Transaction is the central fact table grain. Currency, Account (debit and credit), Channel, Type, Status, and temporal attributes are the dimension keys required for transaction risk analytics.
```mermaid
---
config:
layout: elk
---
classDiagram
class Transaction{
* Transaction Identifier : string
Transaction Date Time : datetime
Settlement Date Time : datetime
Amount : decimal
Transaction Type : enum~TransactionType~
Transaction Channel : enum~TransactionChannel~
Transaction Status : enum~TransactionStatus~
Reference : string
}
Transaction "0..*" --> "1" Payer : has debtor
Transaction "0..*" --> "1" Payee : has creditor
Transaction "0..*" --> "0..1" PaymentInitiator : initiated by
Transaction "0..*" --> "1" Currency : denominated in
Transaction "0..*" --> "0..1" Account : debits
Transaction "0..*" --> "0..1" Account : credits
class TransactionType["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/enums.md#transaction-type'>Transaction Type</a>"]{<<enumeration>>}
class TransactionChannel["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/enums.md#transaction-channel'>Transaction Channel</a>"]{<<enumeration>>}
class TransactionStatus["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/enums.md#transaction-status'>Transaction Status</a>"]{<<enumeration>>}
class Payer["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/payer.md'>Payer</a>"]
class Payee["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/payee.md'>Payee</a>"]
class PaymentInitiator["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/payment_initiator.md'>Payment Initiator</a>"]
class Currency["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/currency.md'>Currency</a>"]
class Account["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/account.md'>Account</a>"]
```
```yaml
existence: dependent
mutability: append_only
temporal:
tracking: transaction_time
description: >
Transactions are append-only records. Once settled they must not be modified.
Transaction time captures when the institution recorded the transaction.
Reversals are recorded as new transaction records referencing the original
Transaction Identifier, not as updates to the original.
attributes:
Transaction Identifier:
type: string
identifier: primary
description: >
Globally unique identifier for the transaction event. Immutable once assigned.
For reversed transactions, the reversal carries its own identifier and references
this identifier in the Reference field.
Transaction Date Time:
type: datetime
description: >
Timestamp when the transaction was initiated or instructed by the originating party.
Used as the primary event time for transaction monitoring rule evaluation.
Settlement Date Time:
type: datetime
description: >
Timestamp when final, irrevocable settlement occurred. May differ from Transaction Date
Time for transactions that clear across business days or time zones. Required for
accurate AML typology detection (e.g., structuring detection across settlement windows).
Amount:
type: decimal
description: >
Monetary value moved by the transaction, expressed in the denomination currency.
Always positive — direction (debit or credit) is determined by the Payer and Payee
relationships, not by sign.
Transaction Type:
type: enum:Transaction Type
description: >
The mechanism by which the transaction was processed (e.g., Wire Transfer, EFTPOS,
ATM Withdrawal, Direct Debit). Used for transaction monitoring rule segmentation —
different typologies apply to different transaction types.
Transaction Channel:
type: enum:Transaction Channel
description: >
The channel or medium through which the transaction was initiated. Used in conjunction
with Transaction Type for risk rule evaluation — a high-value cash deposit at branch
carries different risk signals than the same amount via online banking.
Transaction Status:
type: enum:Transaction Status
description: >
The current lifecycle state of the transaction. Under Review status suspends settlement
and is set by the transaction monitoring system. Failed and Reversed transactions must
be retained for AML audit — absence of completed transactions is itself a monitoring signal.
Reference:
type: string
description: >
Free-form transaction reference text as supplied by the initiating party. May contain
invoice numbers, payment descriptions, or, in the case of reversals, the original
Transaction Identifier being reversed.
```
```yaml
constraints:
Settlement After Initiation:
check: "Settlement Date Time IS NULL OR Settlement Date Time >= Transaction Date Time"
description: >
Settlement cannot precede initiation. A null Settlement Date Time indicates the
transaction has not yet settled (e.g., Pending, Authorised, or Under Review status).
Settled Transaction Has Settlement Time:
check: >
Transaction Status != 'Settled'
OR Settlement Date Time IS NOT NULL
description: >
A transaction with status Settled must have a Settlement Date Time recorded.
Amount Must Be Positive:
check: "Amount > 0"
description: >
Transaction amounts are always expressed as positive values. Direction is conveyed
by the Payer (debit) and Payee (credit) relationships.
```
```yaml
governance:
pii: false
classification: Highly Confidential
retention: 10 years
retention_basis: Domain default retention aligned to AML/CTF record-keeping obligations
description: >
Transaction records must be retained for 7 years from the transaction date, aligned
to AUSTRAC AML/CTF Act 2006 record-keeping obligations. Records are append-only and
must never be modified or deleted. Reversals are represented as new records.
access_role:
- FINANCIAL_CRIME_ANALYST
- TRANSACTION_MONITORING_SYSTEM
- COMPLIANCE_OFFICER
compliance_relevance:
- AUSTRAC AML/CTF Act 2006 — Part B transaction record-keeping
- AUSTRAC AML/CTF Amendment Act 2024
- RBNZ AML/CFT Act 2009 — section 58
- FATF Recommendation 10 — Customer Due Diligence (transaction context)
- FATF Recommendation 16 — Wire Transfers (for SWIFT and Wire Transfer types)
regulatory_reporting:
- Threshold Transaction Report (TTR) — AUSTRAC (cash transactions >= AUD 10,000)
- International Funds Transfer Instruction (IFTI) — AUSTRAC
- Suspicious Matter Report (SMR) — AUSTRAC
```
## Relationships
### Transaction Has Debtor
A Transaction has one Payer representing the party from whom funds are debited.
```yaml
source: Transaction
type: has
target: Payer
cardinality: one-to-many
granularity: atomic
ownership: Transaction
```
### Transaction Has Creditor
A Transaction has one Payee representing the party to whom funds are credited.
```yaml
source: Transaction
type: has
target: Payee
cardinality: one-to-many
granularity: atomic
ownership: Transaction
```
### Transaction Initiated By Instructing Agent
A Transaction may be initiated by one Payment Initiator acting as instructing agent on behalf of the originating party.
```yaml
source: Transaction
type: references
target: Payment Initiator
cardinality: many-to-one
granularity: atomic
ownership: Transaction
```
### Transaction Denominated In Currency
A Transaction is denominated in exactly one Currency.
```yaml
source: Transaction
type: references
target: Currency
cardinality: many-to-one
granularity: atomic
ownership: Transaction
```
### Transaction Has Debit Account
The internal account from which funds are debited. Null for transactions where the debit side is an external counterparty account not held at the institution (e.g., inbound wire transfers).
```yaml
source: Transaction
type: references
target: Account
cardinality: many-to-one
granularity: atomic
ownership: Transaction
```
### Transaction Has Credit Account
The internal account to which funds are credited. Null for transactions where the credit side is an external counterparty account not held at the institution (e.g., outbound wire transfers).
```yaml
source: Transaction
type: references
target: Account
cardinality: many-to-one
granularity: atomic
ownership: Transaction
```