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.
@if (sampleCount) {
{{ sampleCount }} demonstration rows are included alongside {{ hasLive ? 'the live alerts' : 'the live feed, which has raised nothing' }}. Sample rows carry a Sample tag in the table and must not be acted on as compliance data.
}
@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 {
{{ summary.customers }}
Customers for review
{{ summary.byRisk.LOW }} Low · {{ summary.byRisk.MEDIUM }} Medium · {{ summary.byRisk.HIGH }} High
{{ summary.alerts }}
AML alerts triggered
on {{ summary.txns }} transactions · {{ summary.openAlerts }} awaiting a decision
{{ summary.upgradeCandidates + summary.downgradeCandidates }}
Ratings to be moved
{{ summary.upgradeCandidates }} upward · {{ summary.downgradeCandidates }} downward
{{ summary.escalatedCustomers }}
Escalated to STR
₹{{ summary.totalAmount | number: '1.0-0' }} under review
@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 (c of customerRows; track c.clientId) { @if (expanded === c.clientId) { } } @empty { }
Customer ID Customer Name Account Number Branch Current Risk Alerts AML Rules Triggered Amount under review Last Alert Position
{{ c.clientId }} {{ c.customerName }} @if (c.openCount > 0) { {{ c.openCount }} open } {{ c.accountNo || '—' }} {{ c.branchCode || '—' }} {{ riskText(c.currentRisk) }} {{ c.alertCount }} @for (label of c.ruleLabels; track label) { {{ label }} } {{ c.totalAmount | number: '1.0-0' }} {{ c.lastAlertDate }} {{ verdictText(c) }} @if (c.directionReason) {
{{ c.directionReason }}
}
@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' }}
}
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 }} @if (!a.live) { Sample } {{ 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 }}