Risk Review Report

Customers whose transactions tripped an AML rule and whose risk profile therefore needs a look. For each case the reviewer decides one of four things — keep the rating, move it, call for a KYC update, or refer it to the Principal Officer for an STR.
@for (m of periodModes; track m.key) { }
@switch (periodMode) { @case ('day') { } @case ('week') { Week: {{ rangeLabel }} } @case ('month') { } @default { } }
@if (!canSelectBranch) {
Showing {{ branchLabel }} only. Head Office logins can select any branch.
}
@if (loading) {
Loading AML alerts…
} @else {
@if (summary.byRule.length) {
Rules triggered @for (r of summary.byRule; track r.code) { }
}
{{ view === 'customer' ? customerRows.length + ' customers' : view === 'alert' ? alertRows.length + ' alerts' : txnRows.length + ' transactions' }}
@if (view === 'customer') { @for (g of customerGroups; track g.key) {
@if (!collapsedGroups[g.key]) {
@for (c of g.rows; track c.clientId) { @if (expanded === c.clientId) { } }
Customer ID Customer Name Account Number Branch Rating on file Review says Alerts AML Rules Triggered Amount under review Last Alert Action
{{ c.clientId }} {{ c.customerName }} @if (c.openCount > 0) { {{ c.openCount }} open } {{ c.accountNo || '—' }} {{ c.branchCode || '—' }} {{ riskText(c.currentRisk) }} {{ directionText(c) }} @if (c.directionReason) {
{{ c.directionReason }}
}
{{ c.alertCount }} @for (label of c.ruleLabels; track label) { {{ label }} } {{ c.totalAmount | number: '1.0-0' }} {{ c.lastAlertDate }}
@for (a of c.alerts; track a.alertId) {
{{ a.rule.label }} {{ a.rule.category }} {{ a.alertId }} · raised {{ a.alertDate }} ₹{{ a.amount | number: '1.0-0' }} {{ statusMeta[a.status].label }}
Why it triggered: {{ a.rule.description }} — {{ txnDetail(a) }}
@for (t of a.txns; track t.txnId) { }
Txn Date Txn ID Channel Dr/Cr Amount Balance After Narration Counterparty AML Rule Triggered
{{ t.date }} {{ t.txnId }} {{ channelLabel(t.channel) }} {{ t.drCr }} {{ t.amount | number: '1.0-0' }} @if (t.ctrReportable) { CTR } {{ t.balanceAfter ? (t.balanceAfter | number: '1.0-0') : '—' }} {{ t.narration || '—' }} {{ t.counterparty || '—' }} {{ a.rule.label }} @if (a.txns.length > 1) { leg {{ $index + 1 }} of {{ a.txns.length }} }
{{ a.rule.suggestedAction }}
Reviewer: {{ a.reviewedBy || 'not yet assigned' }} — {{ a.remarks || 'no remarks recorded' }}
}
}
} @empty {
No customer tripped an AML rule for {{ rangeLabel }} at {{ branchLabel }}.
} } @if (view === 'alert') {
@for (a of alertRows; track a.alertId) { } @empty { }
Alert ID Alert Date Customer ID Customer Name Account Number Branch Current Risk Transaction Details AML Rule Triggered Amount Review Status Reviewer Remarks
{{ a.alertId }} {{ a.alertDate }} {{ a.clientId }} {{ a.customerName }} {{ a.accountNo || '—' }} {{ a.branchCode || '—' }} {{ riskText(a.currentRisk) }} {{ txnDetail(a) }} {{ a.rule.label }} {{ a.rule.category }}
{{ a.rule.description }}
{{ a.amount | number: '1.0-0' }} {{ statusMeta[a.status].label }} @if (a.reviewedBy) {
by {{ a.reviewedBy }}
}
{{ a.remarks || '—' }}
{{ a.rule.suggestedAction }}
No AML rule was triggered for {{ rangeLabel }} at {{ branchLabel }}.
} @if (view === 'txn') {
@for (t of txnRows; track t.txnId) { } @empty { }
Txn Date Txn ID Customer ID Customer Name Account Number Branch Current Risk Channel Dr/Cr Amount Balance After Narration Counterparty AML Rule Triggered Alert Review Status
{{ t.date }} {{ t.txnId }} {{ t.clientId }} {{ t.customerName }} {{ t.accountNo || '—' }} {{ t.branchCode || '—' }} {{ riskText(t.currentRisk) }} {{ channelLabel(t.channel) }} {{ t.drCr }} {{ t.amount | number: '1.0-0' }} @if (t.ctrReportable) { CTR } {{ t.balanceAfter ? (t.balanceAfter | number: '1.0-0') : '—' }} {{ t.narration || '—' }} {{ t.counterparty || '—' }} {{ t.rule.label }} {{ t.rule.category }} @if (t.legCount > 1) { leg {{ t.legIndex }} of {{ t.legCount }} }
{{ t.rule.description }}
{{ t.alertId }} {{ statusMeta[t.status].label }}
No transaction tripped an AML rule for {{ rangeLabel }} at {{ branchLabel }}.
}

Pending review awaiting a reviewer · Risk retained explained, rating unchanged · Risk upgraded / KYC update profile changed · Escalated / STR filed with the Principal Officer

}
{{ toastMsg }}