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
@@ -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