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
+80
View File
@@ -0,0 +1,80 @@
# Lifecycle - Financial Crime
This file records the current lifecycle state of the Financial Crime domain and
its published products. It combines machine-readable change intent with a
human-readable history so lifecycle, reconciliation, and migration planning can
work from the same source.
## Current State
```yaml
domain_version: "1.0.0"
domain_status: Active
products:
- name: Canonical Party
status: Active
version: "1.0.0"
- name: Transaction Risk Summary
status: Active
version: "1.0.0"
- name: Salesforce CRM Raw Feed
status: Active
version: "1.0.0"
- name: Party Risk Report (Legacy)
status: Deprecated
version: "1.0.0"
```
## Version History
### Domain 1.0.0 - 2026-03-15
#### Change Manifest
```yaml
changes:
- type: additive
scope: entity
entity: Party
description: "Established the Party, Party Role, Account, Agreement, and Transaction backbone for financial crime modelling."
- type: additive
scope: relationship
entity: Party
description: "Declared role, account, agreement, and self-referential relationship patterns needed for AML, KYC, and network analysis."
- type: additive
scope: event
entity: Transaction
description: "Added core lifecycle and detection events for onboarding, execution, account change, and suspicious activity workflows."
- type: additive
scope: entity
entity: Exchange Rate
description: "Included currency and exchange-rate concepts for cross-border and multi-currency monitoring."
affected_products:
- name: Canonical Party
impact: additive
reason: "Initial domain-aligned publication of core identity and relationship entities."
- name: Transaction Risk Summary
impact: additive
reason: "Initial consumer-aligned analytics product for transaction monitoring."
- name: Salesforce CRM Raw Feed
impact: additive
reason: "Initial source-aligned replay and audit feed for Salesforce CRM."
- name: Party Risk Report (Legacy)
impact: none
reason: "Retained as a deprecated legacy product while consumers migrate to Transaction Risk Summary."
```
#### Changelog
### Added
- Initial Financial Crime domain release with party, account, agreement, transaction, branch, currency, and exchange-rate concepts.
- Relationship patterns for party role assignment, customer account holding, party association, and agreement governance.
- Events covering onboarding, transaction execution, account status change, agreement activation, KYC updates, and suspicious activity detection.
- Three active products: Canonical Party, Transaction Risk Summary, and Salesforce CRM Raw Feed.
### Deprecated
- Party Risk Report (Legacy) retained for migration support while downstream consumers move to Transaction Risk Summary.
+238
View File
@@ -0,0 +1,238 @@
# Financial Crime
This domain encompasses all concepts required for financial crime detection, investigation, and reporting. It includes party identification, transaction monitoring, relationship analysis, and regulatory compliance for AML (Anti-Money Laundering), KYC (Know Your Customer), and CTF (Counter-Terrorist Financing).
This is a business-aligned domain that draws concepts from BIAN Business Object Model (BOM) rather than mapping directly to BIAN Service Domains.
## Metadata
```yaml
# Accountability
owners:
- financial.crime@bank.com
stewards:
- compliance.officer@bank.com
technical_leads:
- data.architecture@bank.com
# Governance & Security
classification: "Highly Confidential"
pii: true
regulatory_scope:
- AML (Anti-Money Laundering)
- KYC (Know Your Customer)
- CTF (Counter-Terrorist Financing)
- FATF Recommendations
- BSA (Bank Secrecy Act)
- EU 5AMLD / 6AMLD
- USA PATRIOT Act
default_retention: "10 years post relationship end"
# Lifecycle & Discovery
status: "Active"
version: "1.0.0"
tags:
- Compliance
- Risk
- Regulatory
- Core
```
### Domain Overview Diagram
```mermaid
---
config:
layout: elk
elk:
mergeEdges: false
nodePlacementStrategy: LINEAR_SEGMENTS
look: classic
theme: dark
---
graph TD
Person --> |is a|Party
Company --> |is a|Party
TermDepositAgreement --> |is a|Agreement
LoanAgreement --> |is a|Agreement
Party <--> |related to|Party
Party --> |assumes|PartyRole
Customer --> |is a|PartyRole
Merchant --> |is a|PartyRole
Payee --> |is a|PartyRole
Payer --> |is a|PartyRole
Teller --> |is a|PartyRole
PaymentInitiator --> |is a|PartyRole
Party --> |has|ContactAddress
PartyRole --> |uses|ContactAddress
Customer --> |holds|Account
Customer --> |has|CustomerPreferences
PartyRole --> |governed by|Agreement
Transaction --> |has debtor|Payer
Transaction --> |has creditor|Payee
Transaction --> |initiated by|PaymentInitiator
Transaction --> |denominated in|Currency
Transaction --> |debits|Account
Transaction --> |credits|Account
Teller --> |processes|Transaction
Teller --> |assigned to|Branch
Merchant --> |receives payment via|Transaction
Merchant --> |settles into|Account
Account --> |instance of|Product
Account --> |denominated in|Currency
Branch --> |services|Account
Product --> |in terms of|Agreement
Agreement --> |governs|PartyRole
ContactAddress --> |references|Address
ExchangeRate --> |base|Currency
ExchangeRate --> |quote|Currency
Party["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/party.md'>Party</a>"]
Person["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/person.md'>Person</a>"]
Company["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/company.md'>Company</a>"]
PartyRole["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/party_role.md'>Party Role</a>"]
Customer["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/customer.md'>Customer</a>"]
Merchant["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/merchant.md'>Merchant</a>"]
Payer["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/payer.md'>Payer</a>"]
Payee["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/payee.md'>Payee</a>"]
Teller["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/teller.md'>Teller</a>"]
PaymentInitiator["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/payment_initiator.md'>Payment Initiator</a>"]
Address["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/address.md'>Address</a>"]
ContactAddress["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/contact_address.md'>Contact Address</a>"]
CustomerPreferences["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/customer-preferences.md'>Customer Preferences</a>"]
Account["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/account.md'>Account</a>"]
Product["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/product.md'>Product</a>"]
Agreement["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/agreement.md'>Agreement</a>"]
LoanAgreement["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/loan-agreement.md'>Loan Agreement</a>"]
TermDepositAgreement["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/term-deposit-agreement.md'>Term Deposit Agreement</a>"]
Transaction["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/transaction.md'>Transaction</a>"]
Branch["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/branch.md'>Branch</a>"]
Currency["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/currency.md'>Currency</a>"]
ExchangeRate["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/exchange-rate.md'>Exchange Rate</a>"]
```
## Source Systems
Business Application | Platform | Capability Domain
--- | --- | ---
[Temenos Payment](sources/temenos-payment/source.md) | Temenos SaaS | Payment Execution
[SAP Fraud Management](sources/sap-fraud-management/source.md) | SAP | Fraud
[Salesforce CRM](sources/salesforce-crm/source.md) | Salesforce | Customer Relationship Management
## Entities
Name | Specializes | Description | Reference
--- | --- | --- | ---
[Party](entities/party.md#party) | | The abstract representation of any individual or organization that can participate in financial activities. Core business object that abstracts concepts like customer, correspondent, and supplier. | [BIAN BOM - Party](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Party)
[Person](entities/person.md#person) | [Party](entities/party.md#party) | A natural person who participates in financial activities. | [BIAN BOM - Person](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Person)
[Company](entities/company.md#company) | [Party](entities/party.md#party) | An organization, corporation, or other legally recognized entity. Also referred to as Legal Entity or Organisation in BIAN. | [BIAN BOM - Legal Entity](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/LegalEntity)
[Party Role](entities/party_role.md#party-role) | | The abstract representation of a Party's involvement in a specific business context. Serves as base for specific role types like Customer, Merchant, Creditor, etc. | [BIAN BOM - Party Role](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/PartyRole)
[Customer](entities/customer.md#customer) | [Party Role](entities/party_role.md#party-role) | A Party that holds accounts, uses products/services, or has an active relationship with the institution. First-class business concept with distinct ownership and governance. | [BIAN BOM - Party Role](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/PartyRole)
[Merchant](entities/merchant.md#merchant) | [Party Role](entities/party_role.md#party-role) | A Party that accepts payments for goods or services, typically through the institution's payment systems. | [BIAN BOM - Party Role](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/PartyRole)
[Payee](entities/payee.md#payee) | [Party Role](entities/party_role.md#party-role) | A Party to whom money is owed in a transaction or agreement. | [BIAN BOM - Party Role](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/PartyRole)
[Payer](entities/payer.md#payer) | [Party Role](entities/party_role.md#party-role) | A Party who owes money in a transaction or agreement. | [BIAN BOM - Party Role](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/PartyRole)
[Teller](entities/teller.md#teller) | [Party Role](entities/party_role.md#party-role) | A bank employee who processes customer transactions at a branch location. | [BIAN BOM - Party Role](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/PartyRole)
[Payment Initiator](entities/payment_initiator.md#payment-initiator) | [Party Role](entities/party_role.md#party-role) | A Party that instructs or initiates a transaction on behalf of another party. | [BIAN BOM - Party Role](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/PartyRole)
[Account](entities/account.md#account) | | A financial account held with the institution. | [BIAN BOM - Account](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Account)
[Contact Address](entities/contact_address.md#contact-address) | | Physical, postal, or electronic address associated with a Party. | [BIAN BOM - Contact Point](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/ContactPoint)
[Address](entities/address.md#address) | | The canonical record of a physical or postal location. Reference data shared across parties — a single Address record is referenced by all Contact Addresses at that location, enabling network analysis without fuzzy matching. | [BIAN BOM - Location](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Location)
[Customer Preferences](entities/customer-preferences.md#customer-preferences) | | Customer-specific settings for communication, privacy, and interaction preferences. | [BIAN BOM - Party Preference](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/PartyPreference)
[Product](entities/product.md#product) | | A financial product or service offered by the institution. | [BIAN BOM - Product](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Product)
[Agreement](entities/agreement.md#agreement) | | A formal agreement between the institution and one or more Parties. In BIAN called Agreement or Arrangement. | [BIAN BOM - Agreement](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Agreement)
[Term Deposit Agreement](entities/term-deposit-agreement.md#term-deposit-agreement) | [Agreement](entities/agreement.md#agreement) | An agreement for a term deposit product. | [BIAN BOM - Agreement](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Agreement)
[Loan Agreement](entities/loan-agreement.md#loan-agreement) | [Agreement](entities/agreement.md#agreement) | An agreement for a loan product. | [BIAN BOM - Loan Agreement](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/LoanAgreement)
[Transaction](entities/transaction.md#transaction) | | A financial transaction involving the movement of funds. | [BIAN BOM - Payment](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Payment)
[Currency](entities/currency.md#currency) | | A currency recognized by the system for transactions and positions. | [BIAN BOM - Currency](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Currency)
[Exchange Rate](entities/exchange-rate.md#exchange-rate) | | The rate at which one currency can be exchanged for another at a specific point in time. | [BIAN BOM - Exchange Rate](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/ExchangeRate)
[Branch](entities/branch.md#branch) | | A physical or operational branch of the financial institution. In BIAN called Location. | [BIAN BOM - Location](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Location)
## Enums
Name | Description | Reference
--- | --- | ---
[Party Status](enums.md#party-status) | Operational status of a party record. | [BIAN BOM - Party](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Party)
[Financial Crime Risk Rating](enums.md#financial-crime-risk-rating) | Institution-assessed ML/TF risk level for a party. | [BIAN BOM - Rating](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Rating)
[Sanctions Screen Status](enums.md#sanctions-screen-status) | Outcome of sanctions screening checks. | [BIAN BOM - Party](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Party)
[Party Role Status](enums.md#party-role-status) | Lifecycle status of a specific party role instance. | [BIAN BOM - Party Role](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/PartyRole)
[Due Diligence Status](enums.md#due-diligence-status) | CDD/EDD completion state for a role. | [BIAN BOM - Party Role](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/PartyRole)
[PEP Status](enums.md#pep-status) | Politically exposed person classification for individuals. | [BIAN BOM - Person](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Person)
[Address Type](enums.md#address-type) | Structural type of an address record. | [BIAN BOM - Location](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Location)
[Address Purpose](enums.md#address-purpose) | Business purpose for which a party uses an address. | [BIAN BOM - Contact Point](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/ContactPoint)
[Address Verification Status](enums.md#address-verification-status) | Current verification state of a contact address association. | [BIAN BOM - Contact Point](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/ContactPoint)
[Verification Method](enums.md#verification-method) | Method used to verify an address. | [BIAN BOM - Contact Point](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/ContactPoint)
[Currency Code](enums.md#currency-code) | ISO 4217 currency codes for transaction and account values. | [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html)
[Transaction Type](enums.md#transaction-type) | Payment mechanism and clearing pathway classification. | [BIAN BOM - Payment](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Payment)
[Transaction Status](enums.md#transaction-status) | Lifecycle state of a transaction from initiation through settlement. | [BIAN BOM - Payment](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Payment)
[Transaction Channel](enums.md#transaction-channel) | Channel through which a transaction was initiated or processed. | [BIAN BOM - Payment](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Payment)
[Account Status](enums.md#account-status) | Operational lifecycle state of an account. | [BIAN BOM - Account](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Account)
[Account Type](enums.md#account-type) | Classification of an account by primary purpose and product characteristics. | [BIAN BOM - Account](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Account)
[Agreement Status](enums.md#agreement-status) | Lifecycle state of a formal agreement. | [BIAN BOM - Agreement](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Agreement)
[Contact Preference](enums.md#contact-preference) | Customer's preferred outbound communication channel. | [BIAN BOM - Party Preference](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/PartyPreference)
[Company Legal Structure](enums.md#company-legal-structure) | Legal form under which a company or organisation is constituted. | [BIAN BOM - Legal Entity](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/LegalEntity)
[Association Type](enums.md#association-type) | Nature of the relationship between two parties in a network association. | [BIAN BOM - Party](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Party)
[Account Holder Type](enums.md#account-holder-type) | Nature of a customer's holding relationship with an account. | [BIAN BOM - Account](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Account)
## Relationships
Name | Description | Reference
--- | --- | ---
[Party Assumes Roles](entities/party.md#party-assumes-roles) | A Party can assume multiple Party Roles (Customer, Merchant, Creditor, etc.) across different contexts and time periods. | [BIAN BOM - Party Role](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/PartyRole)
[Party Has Contact Addresses](entities/party.md#party-has-contact-addresses) | A Party can have multiple contact addresses for different purposes. | [BIAN BOM - Contact Point](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/ContactPoint)
[Customer Holds Account](entities/customer.md#customer-holds-account) | A Customer can hold one or more Accounts. | [BIAN BOM - Account](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Account)
[Customer Has Preferences](entities/customer.md#customer-has-preferences) | A Customer has associated preferences for communication and interaction. | [BIAN BOM - Party Preference](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/PartyPreference)
[Party Role Uses Contact Addresses](entities/party_role.md#party-role-uses-contact-addresses) | A Party Role can use one or more contact addresses associated with the Party. | [BIAN BOM - Contact Point](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/ContactPoint)
[Party Role Governed By Agreement](entities/party_role.md#party-role-governed-by-agreement) | A Party Role may be governed by a specific Agreement. | [BIAN BOM - Agreement](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Agreement)
[Agreement Involves Party Roles](entities/agreement.md#agreement-involves-party-roles) | Agreements involve multiple Parties in specific roles (Customer as borrower, Company as guarantor, etc.). | [BIAN BOM - Agreement](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Agreement)
[Transaction Has Debtor](entities/transaction.md#transaction-has-debtor) | A Transaction has one or more Debtors (parties from whom funds are debited). | [BIAN BOM - Payment](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Payment)
[Transaction Has Creditor](entities/transaction.md#transaction-has-creditor) | A Transaction has one or more Creditors (parties to whom funds are credited). | [BIAN BOM - Payment](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Payment)
[Transaction Initiated By Instructing Agent](entities/transaction.md#transaction-initiated-by-instructing-agent) | An Instructing Agent initiates or instructs a transaction on behalf of another party. | [BIAN BOM - Payment](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Payment)
[Teller Processes Transaction](entities/teller.md#teller-processes-transaction) | A Teller processes transactions at a branch location. | [BIAN BOM - Payment](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Payment)
[Merchant Receives Payment](entities/merchant.md#merchant-receives-payment) | A Merchant receives payment through transactions. | [BIAN BOM - Payment](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Payment)
[Account Holds Product](entities/account.md#account-holds-product) | An Account is an instance of a Product. | [BIAN BOM - Account](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Account)
[Branch Services Account](entities/branch.md#branch-services-account) | Accounts are serviced by a specific Branch (Location). | [BIAN BOM - Location](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Location)
[Product In Terms Of Agreement](entities/product.md#product-in-terms-of-agreement) | A Product is defined in terms of an Agreement. | [BIAN BOM - Agreement](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Agreement)
[Contact Address References Address](entities/contact_address.md#contact-address-references-address) | Each Contact Address references a canonical Address record. | [BIAN BOM - Contact Point](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/ContactPoint)
[Branch Transaction Summary](entities/branch.md#branch-transaction-summary) | Grouped relationship from Branch to Transactions for branch-level fraud analysis. | -
[Party Role At Point In Time](entities/party_role.md#party-role-at-point-in-time) | Period snapshot of Party Role state for regulatory reporting. | -
[Party Related To Party](entities/party.md#party-related-to-party) | A Party may be related to one or more other Parties through ownership, control, family, or association ties. Structural basis for beneficial ownership mapping and PEP network analysis. | [BIAN BOM - Party](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Party)
[Teller Assigned To Branch](entities/teller.md#teller-assigned-to-branch) | A Teller is assigned to a Branch for operational responsibilities. | [BIAN BOM - Party Role](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/PartyRole)
[Exchange Rate References Base Currency](entities/exchange-rate.md#exchange-rate-references-base-currency) | Each Exchange Rate references one base Currency. | [BIAN BOM - Exchange Rate](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/ExchangeRate)
[Exchange Rate References Quote Currency](entities/exchange-rate.md#exchange-rate-references-quote-currency) | Each Exchange Rate references one quote Currency. | [BIAN BOM - Exchange Rate](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/ExchangeRate)
[Transaction Denominated In Currency](entities/transaction.md#transaction-denominated-in-currency) | A Transaction is denominated in exactly one Currency. | [BIAN BOM - Payment](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Payment)
[Transaction Has Debit Account](entities/transaction.md#transaction-has-debit-account) | A Transaction debits one internal Account. Null for externally-held debit accounts. | [BIAN BOM - Payment](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Payment)
[Transaction Has Credit Account](entities/transaction.md#transaction-has-credit-account) | A Transaction credits one internal Account. Null for externally-held credit accounts. | [BIAN BOM - Payment](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Payment)
[Account Denominated In Currency](entities/account.md#account-denominated-in-currency) | An Account is denominated in exactly one Currency. | [BIAN BOM - Account](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/Account)
[Merchant Has Settlement Account](entities/merchant.md#merchant-has-settlement-account) | A Merchant may have a designated Account for settlement credit. | [BIAN BOM - Party Role](https://bian-modelapi-v4.azurewebsites.net/BOClassByName/PartyRole)
## Events
Name | Actor | Entity | Description
--- | --- | --- | ---
[Party Role Assigned](events/party-role-assigned.md#party-role-assigned) | Party | Party Role | Emitted when a Party assumes a new role (becomes a Customer, Merchant, etc.).
[Customer Onboarded](events/customer-onboarded.md#customer-onboarded) | Party | Customer | Emitted when a new Customer relationship is established.
[Transaction Executed](events/transaction-executed.md#transaction-executed) | Instructing Agent | Transaction | Emitted when a financial transaction is successfully executed.
[Account Status Changed](events/account-status-changed.md#account-status-changed) | Customer | Account | Emitted when an account status changes (e.g. Active → Frozen).
[High Risk Transaction Detected](events/high-risk-transaction-detected.md#high-risk-transaction-detected) | Transaction Monitoring System | Transaction | Emitted when a transaction is flagged as potentially suspicious.
[Agreement Activated](events/agreement-activated.md#agreement-activated) | Party Role | Agreement | Emitted when an agreement becomes active and enforceable.
[KYC Status Updated](events/kyc-status-updated.md#kyc-status-updated) | Compliance Officer | Party | Emitted when a Party's KYC status is updated.
## Data Products
Name | Class | Consumers | Status
--- | --- | --- | ---
[Canonical Party](products/canonical.md#canonical-party) | domain-aligned | Cross-domain Integration | Active
[Transaction Risk Summary](products/analytics.md#transaction-risk-summary) | consumer-aligned | Financial Crime Analytics | Active
[Salesforce CRM Raw Feed](products/source-feeds.md#salesforce-crm-raw-feed) | source-aligned | Data Engineering | Active
[Party Risk Report (Legacy)](products/party-risk-report-legacy.md#party-risk-report-legacy) | consumer-aligned | Financial Crime Analytics | Deprecated
---
+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
```
+464
View File
@@ -0,0 +1,464 @@
# [Financial Crime](domain.md)
## Enums
### Party Status
Operational status of a party record.
```yaml
values:
Active:
description: Party is active and may participate in relationships and transactions
Under Review:
description: Party is under compliance review and must not initiate new transactions
Restricted:
description: Party is restricted pending investigation outcome or risk remediation
Inactive:
description: Party relationship is dormant or no longer operational
Closed:
description: Party record is closed and no new activity is permitted
```
---
### Financial Crime Risk Rating
Institution-assessed ML/TF risk level for a party.
```yaml
values:
Low:
description: Low financial crime risk profile
score: 1
Medium:
description: Moderate financial crime risk profile
score: 2
High:
description: Elevated financial crime risk requiring enhanced controls
score: 3
Very High:
description: Severe financial crime risk requiring intensive monitoring
score: 4
```
---
### Sanctions Screen Status
Outcome of sanctions screening checks.
```yaml
values:
Not Screened:
description: Screening has not yet been performed
Clear:
description: No match found against applicable sanctions lists
Potential Match:
description: Possible match detected and pending investigation
Confirmed Match:
description: Match confirmed and services must be blocked
False Positive:
description: Potential match reviewed and cleared as not the sanctioned subject
```
---
### Party Role Status
Lifecycle status of a specific party role instance.
```yaml
values:
Pending:
description: Role created but not yet activated
Active:
description: Role is active and confers its business permissions
Suspended:
description: Role is temporarily paused pending review or remediation
Closed:
description: Role has ended and is no longer effective
```
---
### Due Diligence Status
CDD/EDD completion state for a role.
```yaml
values:
Not Started:
description: Due diligence process has not commenced
In Progress:
description: Due diligence activities are underway
Complete:
description: Required due diligence is complete
Expired:
description: Prior due diligence is no longer current and revalidation is required
Failed:
description: Due diligence failed and role must not be activated
```
---
### PEP Status
Politically exposed person classification for individuals.
```yaml
values:
Not PEP:
description: Individual is not identified as a politically exposed person or associate
Domestic PEP:
description: Individual holds a prominent public function domestically
Foreign PEP:
description: Individual holds a prominent public function in a foreign jurisdiction
International Organisation PEP:
description: Individual holds a prominent function in an international organisation
PEP Family Member:
description: Individual is an immediate family member of a PEP
PEP Close Associate:
description: Individual is a known close associate of a PEP
```
---
### Address Type
Structural type of an address record.
```yaml
values:
Street Address:
description: Standard physical street address
PO Box:
description: Postal box address
Registered Office:
description: Registered office address for a legal entity
Overseas Address:
description: Address located outside the primary operating jurisdiction
```
---
### Address Purpose
Business purpose for which a party uses an address.
```yaml
values:
Residential:
description: Residential/home address for an individual
Mailing:
description: Address used for correspondence
Business:
description: Primary business operating address
Registered Office:
description: Registered legal address for a company
Billing:
description: Address used for billing and statement delivery
```
---
### Address Verification Status
Current verification state of a contact address association.
```yaml
values:
Unverified:
description: Address not yet verified
Verified:
description: Address verified against acceptable evidence
Pending Reverification:
description: Existing verification is aging and requires refresh
Rejected:
description: Verification attempt failed or evidence was insufficient
Expired:
description: Verification is out of date and not valid for current obligations
```
---
### Verification Method
Method used to verify an address.
```yaml
values:
Documentary:
description: Verified using accepted documentary evidence
Electronic:
description: Verified using an approved electronic data source
In Person:
description: Verified face-to-face at branch or approved representative location
Third Party Attestation:
description: Verified via trusted attestation from an approved third party
```
---
### Currency Code
ISO 4217 alphabetic currency codes used across account balances and transaction amounts. This is a representative subset — the full ISO 4217 code list is the normative reference.
Standard: [ISO 4217 — Currency codes](https://www.iso.org/iso-4217-currency-codes.html)
```yaml
values:
AUD:
description: Australian Dollar
NZD:
description: New Zealand Dollar
USD:
description: United States Dollar
EUR:
description: Euro
GBP:
description: Pound Sterling
JPY:
description: Japanese Yen
SGD:
description: Singapore Dollar
HKD:
description: Hong Kong Dollar
CHF:
description: Swiss Franc
CAD:
description: Canadian Dollar
```
---
### Transaction Type
Category of financial transaction representing the movement mechanism and clearing pathway.
```yaml
values:
Wire Transfer:
description: Domestic or international credit transfer processed via the local RTGS or wire network
SWIFT Transfer:
description: International payment instruction transmitted via the SWIFT network
EFTPOS:
description: Electronic funds transfer at point of sale via a card-present terminal
ATM Withdrawal:
description: Cash withdrawal initiated at an automated teller machine
ATM Deposit:
description: Cash or cheque deposit lodged at an automated teller machine
Direct Debit:
description: Pull payment authorised by the account holder and initiated by a creditor
Direct Credit:
description: Push payment credited directly to a beneficiary account
Internal Transfer:
description: Movement of funds between two accounts held within the same institution
BPay:
description: Bill payment processed through the BPAY scheme
Cash Deposit:
description: Physical cash lodged to an account at a branch or agency
Cash Withdrawal:
description: Physical cash disbursed from an account at a branch or agency
Cheque:
description: Payment by paper cheque presented for clearing
RTGS:
description: High-value same-day settlement payment processed through the Real-Time Gross Settlement system
```
---
### Transaction Status
Lifecycle state of a transaction from initiation through to final settlement or failure.
```yaml
values:
Pending:
description: Transaction has been submitted and is awaiting authorisation or clearing
Authorised:
description: Transaction has been authorised but not yet cleared or settled
Cleared:
description: Transaction has been cleared through the relevant payment scheme
Settled:
description: Final irrevocable settlement has occurred and funds have moved
Failed:
description: Transaction could not be processed and no funds were moved
Reversed:
description: A previously settled transaction has been reversed and funds returned
Cancelled:
description: Transaction was cancelled before settlement at the request of an authorised party
Under Review:
description: Transaction has been flagged and is under financial crime or fraud review; settlement is suspended pending outcome
```
---
### Transaction Channel
The channel or medium through which a transaction was initiated or processed.
```yaml
values:
Branch:
description: Transaction initiated or processed at a physical branch location by a teller or officer
Online Banking:
description: Transaction initiated by a customer through the institution's internet banking platform
Mobile Banking:
description: Transaction initiated by a customer through the institution's mobile application
ATM:
description: Transaction self-served by a customer at an automated teller machine
EFTPOS Terminal:
description: Transaction initiated at a merchant point-of-sale EFTPOS terminal
SWIFT:
description: Payment instruction transmitted via the SWIFT network, typically for international transfers
Direct Entry:
description: Batch payment submitted directly via the Direct Entry (DE) system
Third Party:
description: Transaction initiated by an authorised third party or payment service provider on behalf of a customer
Internal System:
description: Transaction generated automatically by an internal system process (e.g., interest capitalisation, fee deduction)
```
---
### Account Status
Operational lifecycle state of an account.
```yaml
values:
Pending:
description: Account has been created but has not yet been activated for transacting
Active:
description: Account is open and available for deposits, withdrawals, and other permitted operations
Dormant:
description: Account has had no customer-initiated transactions for an extended period as defined by the institution's dormancy policy
Frozen:
description: Account has been administratively frozen; no debits or credits are permitted pending investigation or regulatory instruction
Suspended:
description: Account is temporarily suspended pending compliance review or fraud investigation
Closed:
description: Account has been permanently closed; no further transactions are permitted
```
---
### Account Type
Classification of the financial account by its primary purpose and product characteristics.
```yaml
values:
Savings:
description: Interest-bearing deposit account intended for accumulation of funds
Current:
description: Transaction account (also called cheque or demand deposit account) used for day-to-day banking
Term Deposit:
description: Fixed-term deposit account where funds are locked in for a specified period at a contracted interest rate
Loan:
description: Credit account representing a disbursed loan obligation
Line Of Credit:
description: Revolving credit facility where the customer may draw down and repay up to an approved limit
Mortgage:
description: Secured loan account used to finance the purchase of real property
Offset:
description: Transaction account linked to a mortgage, where the balance offsets interest charged on the mortgage
Foreign Currency:
description: Account denominated in a currency other than the institution's base currency
```
---
### Agreement Status
Lifecycle state of a formal agreement between the institution and a party.
```yaml
values:
Draft:
description: Agreement has been created but not yet executed by all required parties
Active:
description: Agreement is fully executed and currently in force
Suspended:
description: Agreement is temporarily suspended by one or both parties pending resolution of a dispute or compliance matter
Matured:
description: Agreement has reached its scheduled maturity date and obligations have been fulfilled
Terminated:
description: Agreement has been terminated before its natural maturity, by mutual consent or by one party under agreed termination rights
Cancelled:
description: Agreement was cancelled before it became active and never took effect
```
---
### Contact Preference
The customer's preferred channel for outbound communication from the institution.
```yaml
values:
Email:
description: Customer prefers communications delivered by email
SMS:
description: Customer prefers short message service (text message) notifications
Post:
description: Customer prefers physical mail correspondence
Phone:
description: Customer prefers to be contacted by telephone call
In App:
description: Customer prefers push notifications and messages delivered within the institution's mobile application
No Contact:
description: Customer has opted out of all non-essential outbound communications
```
---
### Company Legal Structure
The legal form under which a company or organisation is incorporated or constituted. Relevant to AML risk assessment — certain structures (trusts, shell companies, special purpose vehicles) carry elevated money-laundering risk due to opacity of beneficial ownership.
```yaml
values:
Private Company:
description: Privately held limited liability company not listed on a public exchange (e.g., Pty Ltd, Ltd)
Public Company:
description: Company whose shares are listed and traded on a public stock exchange
Partnership:
description: Business entity where two or more persons carry on a business in common with a view to profit
Sole Trader:
description: Unincorporated individual carrying on business in their own name
Trust:
description: Legal arrangement where a trustee holds assets for the benefit of beneficiaries; elevated AML risk due to beneficial ownership complexity
Cooperative:
description: Member-owned and democratically controlled organisation
Government Entity:
description: Entity owned or controlled by a national, state, or local government
Non-Profit:
description: Organisation operating for a purpose other than profit; subject to specific AML obligations due to potential misuse for terrorist financing
Foreign Entity:
description: Entity incorporated or constituted under the laws of a foreign jurisdiction
Special Purpose Vehicle:
description: Entity created for a specific, narrow purpose (e.g., asset securitisation); elevated AML scrutiny due to potential use in layering structures
```
---
### Association Type
The nature of the relationship between two Parties in the Party Related To Party network. Used for beneficial ownership mapping, PEP network screening, and suspicious activity investigation.
```yaml
values:
Ultimate Beneficial Owner:
description: Individual who ultimately owns or controls 25% or more of the entity, directly or indirectly
Beneficial Owner:
description: Individual with a beneficial interest in the entity below the UBO threshold but still subject to disclosure obligations
Director:
description: Individual appointed to the board of directors or equivalent governing body
Shareholder:
description: Entity or individual holding shares in a company
Guarantor:
description: Party who has provided a guarantee for another party's obligations
Controlling Person:
description: Individual who exercises control over an entity through means other than shareholding (e.g., power of attorney, contractual rights)
Spouse:
description: Legal spouse or domestic partner; relevant for PEP close associate screening
Parent:
description: Direct parent of an individual; relevant for PEP family member screening
Child:
description: Direct child of an individual; relevant for PEP family member screening
Sibling:
description: Sibling of an individual; relevant for PEP family member screening
Close Associate:
description: Individual known to be in close personal or professional relationship with a PEP
Employer:
description: Organisation that employs the related party
Employee:
description: Individual employed by the related organisation
Signatory:
description: Individual authorised to sign on behalf of an entity
```
---
### Account Holder Type
The nature of a customer's holding relationship with an account. Used as a relationship attribute on Customer Holds Account.
```yaml
values:
Primary Holder:
description: The principal account owner responsible for the account relationship
Joint Holder:
description: Co-owner of the account with equal rights to the Primary Holder
Signatory:
description: Individual authorised to transact on the account but without ownership rights
Beneficial Owner:
description: Individual who benefits from the account but whose name may not appear as a legal owner
Guardian:
description: Individual acting as legal guardian for a minor or incapacitated account holder
Attorney:
description: Individual holding power of attorney to operate the account on behalf of the primary holder
```
@@ -0,0 +1,22 @@
# [Financial Crime](../domain.md)
## Events
### Account Status Changed
Emitted when an account status changes in a way that affects operational behavior.
```yaml
actor: Customer
entity: Account
emitted_on:
- update
business_meaning: The account lifecycle status has changed and associated controls may differ
downstream_impact:
- Transaction permissions and servicing controls may be recalculated
- Compliance and customer notification workflows may be initiated
attributes:
event_timestamp:
type: datetime
description: Time the account status change was recorded
```
@@ -0,0 +1,22 @@
# [Financial Crime](../domain.md)
## Events
### Agreement Activated
Emitted when an agreement becomes active and enforceable.
```yaml
actor: Party Role
entity: Agreement
emitted_on:
- update
business_meaning: Contractual terms are now active and govern in-scope roles and products
downstream_impact:
- Product and servicing rules can be applied under the active agreement
- Contract lifecycle and compliance timelines are started
attributes:
event_timestamp:
type: datetime
description: Time the agreement became active
```
@@ -0,0 +1,22 @@
# [Financial Crime](../domain.md)
## Events
### Customer Onboarded
Emitted when a new Customer relationship is established and approved for service.
```yaml
actor: Party
entity: Customer
emitted_on:
- create
business_meaning: A party has completed onboarding and is now recognized as a customer
downstream_impact:
- Customer profile is activated for product and service interactions
- Ongoing due diligence schedule is initialized
attributes:
event_timestamp:
type: datetime
description: Time the customer onboarding status became active
```
@@ -0,0 +1,37 @@
# [Financial Crime](../domain.md)
## Events
### High Risk Transaction Detected
Emitted when transaction monitoring identifies a transaction with high financial crime risk indicators.
```yaml
actor: Transaction Monitoring System
entity: Transaction
emitted_on:
- create
business_meaning: A transaction has been identified for enhanced investigation due to elevated risk
downstream_impact:
- Alert and case management workflows are initiated
- Potential reporting obligations may be triggered
attributes:
event_timestamp:
type: datetime
description: Time the high-risk detection decision was produced
alert_type:
type: string
description: Category of the detection rule that triggered (e.g. structuring, velocity, geographic)
severity:
type: string
description: Assessed severity level of the alert (low, medium, high, critical)
detection_method:
type: string
description: Name of the detection model or rule that produced the alert
threshold_breached:
type: string
description: The specific threshold or limit that was exceeded
risk_score:
type: decimal
description: Numeric risk score assigned by the detection engine
```
@@ -0,0 +1,22 @@
# [Financial Crime](../domain.md)
## Events
### KYC Status Updated
Emitted when the KYC status of a Party is updated following review or remediation.
```yaml
actor: Compliance Officer
entity: Party
emitted_on:
- update
business_meaning: The due diligence posture of a party has changed and risk treatment may be updated
downstream_impact:
- Risk scoring and monitoring thresholds may be recalculated
- Relationship restrictions or approvals may be adjusted
attributes:
event_timestamp:
type: datetime
description: Time the KYC status update took effect
```
@@ -0,0 +1,22 @@
# [Financial Crime](../domain.md)
## Events
### Party Role Assigned
Emitted when a Party assumes a new Party Role in a business context.
```yaml
actor: Party
entity: Party Role
emitted_on:
- create
business_meaning: A party has been assigned a role that changes participation context and controls
downstream_impact:
- Access and entitlements can be updated for the new role
- Role-based monitoring and due diligence workflows are triggered
attributes:
event_timestamp:
type: datetime
description: Time the role assignment became effective
```
@@ -0,0 +1,37 @@
# [Financial Crime](../domain.md)
## Events
### Transaction Executed
Emitted when a financial transaction is successfully executed.
```yaml
actor: Payment Initiator
entity: Transaction
emitted_on:
- create
business_meaning: Funds movement has been executed and committed as a business transaction
downstream_impact:
- Ledger and balance updates are triggered
- Transaction monitoring and screening pipelines are triggered
attributes:
event_timestamp:
type: datetime
description: Time the transaction was executed
amount:
type: decimal
description: Monetary value moved by the transaction
currency_code:
type: string
description: ISO 4217 currency code of the transaction amount
payer_role_identifier:
type: string
description: Role identifier of the payer party
payee_role_identifier:
type: string
description: Role identifier of the payee party
channel:
type: string
description: Channel through which the transaction was initiated (e.g. branch, online, mobile)
```
+40
View File
@@ -0,0 +1,40 @@
---
from: agent-ontology
to: agent-artifact
domain: Financial Crime
domain_path: examples/Financial Crime/domain.md
created: 2026-03-14
status: archived
---
## Handoff Context — Agent Ontology → Agent Artifact
**Scope:** Party, Person, Company, Party Role, Contact Address, Address
**Key decisions:**
- Party uses bitemporal tracking — both valid-time and transaction-time
required. AUSTRAC audit trail obligation drives this, not a modelling
preference. Do not collapse to append-only.
- Company is a concrete specialisation of Party, not abstract. Enables direct
instantiation without requiring a subtype record.
- self_referential relationship on Party carries relationship_attributes as
edge properties (Association Type, Verified). Generate a bridge table for
the many-to-many, not a FK on Party.
**Rejected alternatives:**
- Separate PartyAssociation entity — creates unnecessary indirection for
graph traversal and was explicitly rejected by the domain owner.
- Append-only mutability for Party — rejected because AUSTRAC requires
point-in-time reconstruction, not just event log replay.
**Do not re-open:**
- Risk Rating and Sanctions Screen Status are enums, not FK lookups.
- Next Review Date does not require a NOT NULL constraint — it is calculated
and will be null at creation.
- The Financial Crime domain classification is Highly Confidential throughout.
No override discussion needed.
**Task for next agent:**
Generate dimensional DDL for Party, Person, Company, Party Role, Contact
Address, and Address. Target: Snowflake. Apply SCD Type 2 for slowly_changing
entities. Party Identifier is the natural primary key — no surrogate needed.
+116
View File
@@ -0,0 +1,116 @@
# [Financial Crime](../domain.md)
## Data Products
### Transaction Risk Summary
A denormalized wide-column view combining transaction details with party
identity, account context, and risk indicators for the financial crime
analytics team. Designed for high-volume scan queries without joins.
```yaml
class: consumer-aligned
schema_type: wide-column
owner: fincrime.analytics@bank.com
consumers:
- Financial Crime Analytics
- Transaction Monitoring Dashboard
status: Active
version: "1.0.0"
entities:
- Transaction Risk Summary
lineage:
- domain: Financial Crime
entities:
- Transaction
- Party
- Person
- Party Role
- Payer
- Payee
- Customer
- Account
- Branch
governance:
classification: Highly Confidential
pii: true
retention: "10 years"
masking:
- attribute: "Date of Birth"
strategy: year-only
- attribute: "Tax Identification Number"
strategy: hash
sla:
freshness: "< 15 minutes"
availability: "99.9%"
refresh: real-time
```
#### Logical Model
This product denormalizes transaction, party, account, and branch context
into a single wide-column structure. Every attribute maps to a canonical
entity — consumer-aligned products do not source from source systems.
```mermaid
---
config:
layout: elk
---
classDiagram
class TransactionRiskSummary{
%% Transaction
* Transaction Identifier : string
Transaction Date Time : datetime
Amount : decimal
Reference : string
%% Payer (Party + Person via Party Role)
Payer Party Identifier : string
Payer Legal Name : string
Payer Risk Rating : enum~FinancialCrimeRiskRating~
Payer Sanctions Screen Status : enum~SanctionsScreenStatus~
Payer PEP Status : enum~PEPStatus~
Payer Date of Birth : date
%% Payee (Party + Person via Party Role)
Payee Party Identifier : string
Payee Legal Name : string
Payee Risk Rating : enum~FinancialCrimeRiskRating~
Payee Sanctions Screen Status : enum~SanctionsScreenStatus~
%% Account
Account Identifier : string
Account Number : string
Account Opened Date : date
%% Branch
Branch Code : string
Branch Name : string
}
```
#### Attribute Mapping
Product Attribute | Source | Path | Transform
--- | --- | --- | ---
Transaction Identifier | Transaction.Transaction Identifier | — | —
Transaction Date Time | Transaction.Transaction Date Time | — | —
Amount | Transaction.Amount | — | —
Reference | Transaction.Reference | — | —
Payer Party Identifier | Party.Party Identifier | Transaction → Payer → Party | —
Payer Legal Name | Party.Legal Name | Transaction → Payer → Party | —
Payer Risk Rating | Party.Risk Rating | Transaction → Payer → Party | —
Payer Sanctions Screen Status | Party.Sanctions Screen Status | Transaction → Payer → Party | —
Payer PEP Status | Person.Politically Exposed Person Status | Transaction → Payer → Party → Person | —
Payer Date of Birth | Person.Date of Birth | Transaction → Payer → Party → Person | —
Payee Party Identifier | Party.Party Identifier | Transaction → Payee → Party | —
Payee Legal Name | Party.Legal Name | Transaction → Payee → Party | —
Payee Risk Rating | Party.Risk Rating | Transaction → Payee → Party | —
Payee Sanctions Screen Status | Party.Sanctions Screen Status | Transaction → Payee → Party | —
Account Identifier | Account.Account Identifier | Transaction → Payer → Customer → Account | —
Account Number | Account.Account Number | Transaction → Payer → Customer → Account | —
Account Opened Date | Account.Opened Date | Transaction → Payer → Customer → Account | —
Branch Code | Branch.Branch Code | Transaction → Payer → Customer → Account → Branch | —
Branch Name | Branch.Branch Name | Transaction → Payer → Customer → Account → Branch | —
+135
View File
@@ -0,0 +1,135 @@
# [Financial Crime](../domain.md)
## Data Products
### Canonical Party
The governed canonical representation of Party, Party Role, and related
identity entities for consumption by downstream domains and cross-domain
integration points.
```yaml
class: domain-aligned
schema_type: normalized
owner: data.architecture@bank.com
consumers:
- Cross-domain Integration
- Customer Domain
- Regulatory Reporting
status: Active
version: "1.0.0"
entities:
- Party
- Person
- Company
- Party Role
- Customer
- Contact Address
- Address
lineage:
- source: salesforce-crm
tables:
- table_account
- table_contact
- table_contact_point
- source: sap-fraud-management
tables:
- table_sanctions_screening
- table_customer_risk_profile
sla:
freshness: "< 1 hour"
availability: "99.95%"
refresh: hourly
```
#### Logical Model
```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{
Date of Birth : date
Country of Birth : string
Nationality : string[]
Country of Residence : string
Politically Exposed Person Status : enum~PEPStatus~
}
class Company{
Company Registration Number : string
Incorporation Country : string
Incorporation Date : date
}
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{
* Customer Number : string
Onboarding Date : date
Relationship Start Date : date
}
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
}
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
}
Person --|> Party
Company --|> Party
Customer --|> PartyRole
Party "1" --> "0..*" PartyRole : assumes
Party "1" --> "0..*" ContactAddress : has
PartyRole "0..*" --> "0..*" ContactAddress : uses
ContactAddress "0..*" --> "1" Address : references
class Party["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/party.md'>Party</a>"]
class Person["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/person.md'>Person</a>"]
class Company["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/company.md'>Company</a>"]
class PartyRole["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/party_role.md'>Party Role</a>"]
class Customer["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/customer.md'>Customer</a>"]
class ContactAddress["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/contact_address.md'>Contact Address</a>"]
class Address["<a href='https://github.com/Semprini/md-ddl/blob/main/examples/Financial%20Crime/entities/address.md'>Address</a>"]
```
@@ -0,0 +1,31 @@
# [Financial Crime](../domain.md)
## Data Products
### Party Risk Report (Legacy)
Legacy denormalized party risk view that combined party identity with
risk rating and due diligence status. Superseded by the Transaction Risk
Summary product which provides richer transaction-level context.
```yaml
class: consumer-aligned
schema_type: wide-column
owner: fincrime.analytics@bank.com
consumers:
- Financial Crime Analytics (migrating)
status: Deprecated
deprecated_date: "2025-01-15"
successor: "Transaction Risk Summary"
version: "1.0.0"
entities:
- Party
- Party Role
- Customer
governance:
classification: Highly Confidential
pii: true
retention: "10 years"
```
+29
View File
@@ -0,0 +1,29 @@
# [Financial Crime](../domain.md)
## Data Products
### Salesforce CRM Raw Feed
Raw audit feed from Salesforce CRM preserving source schema and change
events for replay, integration debugging, and compliance audit trails.
```yaml
class: source-aligned
source: salesforce-crm
owner: data.engineering@bank.com
consumers:
- Data Engineering
- Audit & Compliance
status: Active
version: "1.0.0"
governance:
classification: Internal
retention: "3 years"
sla:
freshness: "< 5 minutes"
availability: "99.9%"
refresh: real-time
```
@@ -0,0 +1,34 @@
# Salesforce CRM
Salesforce CRM is the customer relationship source for onboarding, profile maintenance, and communication preferences. It contributes party identity, customer profile, and contact data used by KYC and due diligence workflows.
## Metadata
```yaml
id: salesforce-crm
owner: crm.platform@bank.com
steward: data.governance@bank.com
change_model: real-time-cdc
change_events:
- Customer Created
- Customer Updated
- Contact Address Updated
- Customer Preference Updated
update_frequency: real-time
data_quality_tier: 1
status: Production
version: "1.0.0"
```
## [Financial Crime](../../domain.md) Feeds
Canonical Entity | Transform File | Attributes Contributed | Change Model
--- | --- | --- | ---
[Party](../../entities/party.md#party) | [table_account](transforms/table_account.md) | Party Identifier, Party Status | real-time-cdc
[Person](../../entities/person.md#person) | [table_contact](transforms/table_contact.md) | Given Name, Family Name, Date of Birth, PEP Status | real-time-cdc
[Company](../../entities/company.md#company) | [table_account](transforms/table_account.md) | Legal Name, Registration Identifier | real-time-cdc
[Customer](../../entities/customer.md#customer) | [table_account](transforms/table_account.md) | Customer Number, Onboarding Date, Segment | real-time-cdc
[Contact Address](../../entities/contact_address.md#contact-address) | [table_contact_point](transforms/table_contact_point.md) | Address Purpose, Verification Status, Effective Dates | real-time-cdc
[Customer Preferences](../../entities/customer-preferences.md#customer-preferences) | [table_preference](transforms/table_preference.md) | Preferred Contact Channel, Marketing Consent | event-driven
@@ -0,0 +1,30 @@
# [Salesforce CRM](../source.md)
## Account
Pos | Column Name | Data Type | Max Len | Precision | Scale | Nulls | Comment | Destination
--- | --- | --- | --- | --- | --- | --- | --- | ---
1 | ExternalPartyId | Text | 40 | | | no | Account-scoped party identifier | Party.Party Identifier
2 | RecordStatus | Text | 20 | | | yes | Account lifecycle status from CRM | [Map Party Status](#map-party-status)
3 | LegalEntityName | Text | 200 | | | yes | Registered legal entity name | Company.Legal Name
4 | CompanyRegistrationNumber | Text | 80 | | | yes | Jurisdictional registration number | Company.Registration Identifier
5 | CustomerNumber | Text | 100 | | | yes | CRM customer reference | Customer.Customer Number
6 | OnboardingCompletedDate | Date | | | | yes | Date onboarding completed | Customer.Onboarding Date
7 | CustomerSegmentCode | Text | 30 | | | yes | Commercial segment classification code | Customer.Segment
### Map Party Status
Translates CRM lifecycle status values into canonical party status.
```yaml
type: conditional
target: Party · Party Status
source:
field: Account.RecordStatus
cases:
Active: "RecordStatus == 'Active'"
Inactive: "RecordStatus == 'Inactive'"
Suspended: "RecordStatus == 'Suspended'"
Closed: "RecordStatus == 'Closed'"
fallback: Inactive
```
@@ -0,0 +1,26 @@
# [Salesforce CRM](../source.md)
## Contact
Pos | Column Name | Data Type | Max Len | Precision | Scale | Nulls | Comment | Destination
--- | --- | --- | --- | --- | --- | --- | --- | ---
1 | FirstName | Text | 120 | | | yes | Contact given name | Person.Given Name
2 | LastName | Text | 120 | | | yes | Contact family name | Person.Family Name
3 | Birthdate | Date | | | | yes | Contact date of birth | Person.Date of Birth
4 | CompliancePepFlag | Text | 1 | | | yes | PEP indicator from compliance screening | [Derive PEP Status](#derive-pep-status)
### Derive PEP Status
Derives politically exposed person status from CRM compliance flag.
```yaml
type: conditional
target: Person · PEP Status
source:
field: Contact.CompliancePepFlag
cases:
Confirmed: "CompliancePepFlag == 'Y'"
Not PEP: "CompliancePepFlag == 'N'"
Unknown: "CompliancePepFlag == null"
fallback: Unknown
```
@@ -0,0 +1,41 @@
# [Salesforce CRM](../source.md)
## ContactPoint
Pos | Column Name | Data Type | Max Len | Precision | Scale | Nulls | Comment | Destination
--- | --- | --- | --- | --- | --- | --- | --- | ---
1 | PurposeCode | Text | 40 | | | yes | Purpose classification for contact point | Contact Address.Address Purpose
2 | VerificationResult | Text | 20 | | | yes | Verification workflow result | [Map Verification Status](#map-verification-status)
3 | ValidFromDate | Date | | | | yes | Effective-from date | [Derive Effective Dates](#derive-effective-dates)
4 | ValidToDate | Date | | | | yes | Effective-to date | [Derive Effective Dates](#derive-effective-dates)
### Map Verification Status
Maps verification outcome from CRM verification workflow.
```yaml
type: conditional
target: Contact Address · Verification Status
source:
field: ContactPoint.VerificationResult
cases:
Verified: "VerificationResult == 'PASS'"
Pending: "VerificationResult == 'PENDING'"
Failed: "VerificationResult == 'FAIL'"
fallback: Pending
```
### Derive Effective Dates
Builds effective date range token from valid-from and valid-to values.
```yaml
type: derived
target: Contact Address · Effective Dates
expression: "coalesce(Valid From, '') + '|' + coalesce(Valid To, '')"
inputs:
Valid From:
field: ContactPoint.ValidFromDate
Valid To:
field: ContactPoint.ValidToDate
```
@@ -0,0 +1,24 @@
# [Salesforce CRM](../source.md)
## Preference
Pos | Column Name | Data Type | Max Len | Precision | Scale | Nulls | Comment | Destination
--- | --- | --- | --- | --- | --- | --- | --- | ---
1 | PreferredChannelCode | Text | 30 | | | yes | Preferred communication channel code | Customer Preferences.Preferred Contact Channel
2 | MarketingOptInFlag | Text | 1 | | | yes | Opt-in indicator for marketing messages | [Map Marketing Consent](#map-marketing-consent)
### Map Marketing Consent
Maps marketing consent flag into canonical consent status.
```yaml
type: conditional
target: Customer Preferences · Marketing Consent
source:
field: Preference.MarketingOptInFlag
cases:
Consented: "MarketingOptInFlag == 'Y'"
Declined: "MarketingOptInFlag == 'N'"
Unknown: "MarketingOptInFlag == null"
fallback: Unknown
```
@@ -0,0 +1,36 @@
# SAP Fraud Management
SAP Fraud Management is the analytical source for fraud and suspicious activity detection signals. It contributes risk outcomes and case-oriented enrichment used by AML, KYC, and transaction monitoring controls.
## Metadata
```yaml
id: sap-fraud-management
owner: fraud.operations@bank.com
steward: compliance.officer@bank.com
change_model: event-driven
change_events:
- Fraud Alert Raised
- Fraud Alert Closed
- Transaction Risk Scored
- Case Escalated
update_frequency: real-time
data_quality_tier: 2
status: Production
version: "1.0.0"
tags:
- Fraud
- AML
- Financial Crime
```
## [Financial Crime](../../domain.md) Feeds
Canonical Entity | Transform File | Attributes Contributed | Change Model
--- | --- | --- | ---
[Transaction](../../entities/transaction.md#transaction) | [table_alert_case](transforms/table_alert_case.md) | Financial Crime Risk Score, Monitoring Outcome, Alert Reference | event-driven
[Party](../../entities/party.md#party) | [table_sanctions_screening](transforms/table_sanctions_screening.md) | Sanctions Screen Status, Watchlist Match Indicator | batch-intraday
[Customer](../../entities/customer.md#customer) | [table_customer_risk_profile](transforms/table_customer_risk_profile.md) | Risk Review Flag, Enhanced Due Diligence Trigger | event-driven
@@ -0,0 +1,37 @@
# [SAP Fraud Management](../source.md)
## AlertCase
Pos | Column Name | Data Type | Max Len | Precision | Scale | Nulls | Comment | Destination
--- | --- | --- | --- | --- | --- | --- | --- | ---
1 | TxRiskScore | Decimal | | 18 | 6 | yes | Computed transaction ML/TF risk score | Transaction.Financial Crime Risk Score
2 | DecisionStatus | Text | 30 | | | yes | Alert workflow decision status | [Map Monitoring Outcome](#map-monitoring-outcome)
3 | CaseId | Text | 64 | | | no | Unique SAP alert case identifier | Transaction.Alert Reference
### Map Monitoring Outcome
Maps alert decision outcome into canonical monitoring outcome.
```yaml
type: conditional
target: Transaction · Monitoring Outcome
source:
field: AlertCase.DecisionStatus
cases:
Escalated: "DecisionStatus == 'ESCALATED'"
Cleared: "DecisionStatus == 'CLEARED'"
Under Review: "DecisionStatus == 'OPEN'"
fallback: Under Review
```
### Map Alert Reference
Maps SAP alert case identifier for downstream investigations.
```yaml
type: direct
target: Transaction · Alert Reference
source:
field: AlertCase.CaseId
cast: string
```
@@ -0,0 +1,24 @@
# [SAP Fraud Management](../source.md)
## CustomerRiskProfile
Pos | Column Name | Data Type | Max Len | Precision | Scale | Nulls | Comment | Destination
--- | --- | --- | --- | --- | --- | --- | --- | ---
1 | ReviewRequiredFlag | Boolean | | | | yes | Indicates whether formal review is required | Customer.Risk Review Flag
2 | EddTriggerCode | Text | 20 | | | yes | Enhanced due diligence trigger status code | [Map Enhanced Due Diligence Trigger](#map-enhanced-due-diligence-trigger)
### Map Enhanced Due Diligence Trigger
Derives EDD trigger based on high-risk profile and unresolved alerts.
```yaml
type: conditional
target: Customer · Enhanced Due Diligence Trigger
source:
field: CustomerRiskProfile.EddTriggerCode
cases:
Triggered: "EddTriggerCode == 'TRIGGERED'"
Not Triggered: "EddTriggerCode == 'NOT_TRIGGERED'"
Pending: "EddTriggerCode == 'PENDING'"
fallback: Pending
```
@@ -0,0 +1,24 @@
# [SAP Fraud Management](../source.md)
## SanctionsScreening
Pos | Column Name | Data Type | Max Len | Precision | Scale | Nulls | Comment | Destination
--- | --- | --- | --- | --- | --- | --- | --- | ---
1 | ResultCode | Text | 32 | | | yes | Screening engine outcome code | [Map Sanctions Screen Status](#map-sanctions-screen-status)
2 | MatchFlag | Boolean | | | | yes | Whether a watchlist match was detected | Party.Watchlist Match Indicator
### Map Sanctions Screen Status
Maps sanctions screening outcome from SAP sanctions service.
```yaml
type: conditional
target: Party · Sanctions Screen Status
source:
field: SanctionsScreening.ResultCode
cases:
Clear: "ResultCode == 'CLEAR'"
Potential Match: "ResultCode == 'POTENTIAL_MATCH'"
Confirmed Match: "ResultCode == 'CONFIRMED_MATCH'"
fallback: Clear
```
@@ -0,0 +1,38 @@
# Temenos Payment
Temenos Payment is the operational source for payment initiation and execution records. It emits high-volume transaction changes used for financial crime monitoring and downstream payment analytics.
## Metadata
```yaml
id: temenos-payment
owner: payments.platform@bank.com
steward: data.governance@bank.com
change_model: real-time-cdc
change_events:
- Payment Initiated
- Payment Executed
- Payment Reversed
- Payment Rejected
update_frequency: real-time
data_quality_tier: 1
status: Production
version: "1.0.0"
tags:
- Payments
- Core Banking
- Financial Crime
```
## [Financial Crime](../../domain.md) Feeds
Canonical Entity | Transform File | Attributes Contributed | Change Model
--- | --- | --- | ---
[Transaction](../../entities/transaction.md#transaction) | [table_payment_event](transforms/table_payment_event.md) | Transaction Identifier, Amount, Currency, Execution Timestamp, Status | real-time-cdc
[Account](../../entities/account.md#account) | [table_account_ref](transforms/table_account_ref.md) | Account Identifier, Account Status, Product Identifier | real-time-cdc
[Payment Initiator](../../entities/payment_initiator.md#payment-initiator) | [table_initiation](transforms/table_initiation.md) | Initiator Role Identifier, Initiation Channel | event-driven
[Payer](../../entities/payer.md#payer) | [table_payment_parties](transforms/table_payment_parties.md) | Payer Role Identifier | event-driven
[Payee](../../entities/payee.md#payee) | [table_payment_parties](transforms/table_payment_parties.md) | Payee Role Identifier | event-driven
@@ -0,0 +1,25 @@
# [Temenos Payment](../source.md)
## AccountRef
Pos | Column Name | Data Type | Max Len | Precision | Scale | Nulls | Comment | Destination
--- | --- | --- | --- | --- | --- | --- | --- | ---
1 | AccountNumber | Text | 34 | | | no | Account reference number | Account.Account Identifier
2 | AccountState | Text | 20 | | | yes | Lifecycle/account servicing state | [Map Account Status](#map-account-status)
3 | ProductCode | Text | 30 | | | yes | Linked product code | Account.Product Identifier
### Map Account Status
Maps account servicing status from Temenos account state.
```yaml
type: conditional
target: Account · Account Status
source:
field: AccountRef.AccountState
cases:
Active: "AccountState == 'ACTIVE'"
Frozen: "AccountState == 'FROZEN'"
Closed: "AccountState == 'CLOSED'"
fallback: Active
```
@@ -0,0 +1,25 @@
# [Temenos Payment](../source.md)
## Initiation
Pos | Column Name | Data Type | Max Len | Precision | Scale | Nulls | Comment | Destination
--- | --- | --- | --- | --- | --- | --- | --- | ---
1 | ActorRoleId | Text | 64 | | | no | Role identifier that initiated payment | Payment Initiator.Initiator Role Identifier
2 | ChannelCode | Text | 20 | | | yes | Channel where initiation occurred | [Map Initiation Channel](#map-initiation-channel)
### Map Initiation Channel
Maps channel used to initiate payment to canonical channel.
```yaml
type: conditional
target: Payment Initiator · Initiation Channel
source:
field: Initiation.ChannelCode
cases:
Branch: "ChannelCode == 'BRANCH'"
Mobile: "ChannelCode == 'MOBILE'"
Internet Banking: "ChannelCode == 'ONLINE'"
API: "ChannelCode == 'API'"
fallback: API
```
@@ -0,0 +1,28 @@
# [Temenos Payment](../source.md)
## PaymentEvent
Pos | Column Name | Data Type | Max Len | Precision | Scale | Nulls | Comment | Destination
--- | --- | --- | --- | --- | --- | --- | --- | ---
1 | PaymentId | Text | 64 | | | no | Unique payment event identifier | Transaction.Transaction Identifier
2 | SettlementAmount | Decimal | | 18 | 4 | no | Settled payment amount | Transaction.Amount
3 | SettlementCurrency | Text | 3 | | | no | ISO currency code | Transaction.Currency
4 | ExecutionDateTime | DateTime | | | | yes | Timestamp at execution | Transaction.Execution Timestamp
5 | PaymentStatus | Text | 20 | | | yes | Payment lifecycle status | [Map Status](#map-status)
### Map Status
Maps payment state into canonical transaction status.
```yaml
type: conditional
target: Transaction · Status
source:
field: PaymentEvent.PaymentStatus
cases:
Pending: "PaymentStatus == 'PENDING'"
Completed: "PaymentStatus == 'EXECUTED'"
Reversed: "PaymentStatus == 'REVERSED'"
Rejected: "PaymentStatus == 'REJECTED'"
fallback: Pending
```
@@ -0,0 +1,8 @@
# [Temenos Payment](../source.md)
## PaymentParties
Pos | Column Name | Data Type | Max Len | Precision | Scale | Nulls | Comment | Destination
--- | --- | --- | --- | --- | --- | --- | --- | ---
1 | DebtorRoleId | Text | 64 | | | no | Debtor role identifier in payment context | Payer.Payer Role Identifier
2 | CreditorRoleId | Text | 64 | | | no | Creditor role identifier in payment context | Payee.Payee Role Identifier