@for (v of views; track v.value) { }
Account / acknowledgement / customer {{ total }} holds
Account type All accounts Savings Current Customer intimation Any Customer told Not yet told Layer All layers Layer 0 Layer 1+ Debits frozen only
@if (loading || busy) { } @if (error) {
{{ error }}
}
I4C Account Holds Register Only disputed amounts are restricted; remaining balance stays usable by customer.
@for (h of rows; track h.id) { } @empty { }
Customer Account Account Holder / Branch Ack No. Layer Disputed (₹) Held (₹) Short (₹) Hold Status Customer Intimation 90-Day Review
{{ h.account_no }} {{ h.account_type }}
{{ h.client_name || 'N/A' }}
{{ h.office_name }}
{{ h.acknowledgement_no }}
{{ h.layer }} ₹{{ h.disputed_amount | number: '1.2-2' }} ₹{{ h.amount_held | number: '1.2-2' }} @if (h.shortfall > 0) { ₹{{ h.shortfall | number: '1.2-2' }} } @else { - } {{ h.status }} @if (h.debit_frozen) { DEBIT FROZEN } @if (h.pending_actions) { APPROVAL PENDING } @if (h.customer_intimated_at) { {{ h.customer_intimated_at | date: 'dd MMM' }} ({{ h.intimation_mode }}) } @else if (isOverdue(h)) { OVERDUE } @else if (h.amount_held > 0 && h.status === 'ACTIVE') { INTIMATION DUE } @else { - } @if (isReviewDue(h)) { } {{ h.review_due_on }}
No holds found in this view.
@if (selected; as h) {
Customer: {{ h.client_name || 'N/A' }} ({{ h.office_name }}) • Ack: {{ h.acknowledgement_no }}
@if ((h.status === 'ACTIVE' && h.amount_held > 0) || h.intimationLog?.length) { } @if (allowedActions.length > 0) { } @if (h.actions?.length) { }
@if (modalTab === 'overview') {
Hold Balances & Account
Customer Name
{{ h.client_name || '-' }} ({{ h.office_name }})
Account Number
{{ h.account_no }} ({{ h.account_type }})
I4C Complaint Ack
{{ h.acknowledgement_no }} (Layer {{ h.layer }})
Disputed Amount
₹{{ h.disputed_amount | number: '1.2-2' }}
Amount Held
₹{{ h.amount_held | number: '1.2-2' }}
Shortfall
@if (h.shortfall > 0) { ₹{{ h.shortfall | number: '1.2-2' }} (Prospective hold) } @else { Fully covered (₹0.00) }
Compliance & Directions
Hold Placed On
{{ h.held_at | date: 'dd MMM yyyy, HH:mm:ss' }} (System automated)
90-Day Review Due
{{ h.review_due_on }}
Debit Freeze Status
@if (h.debit_frozen) { FROZEN } @else { Active (Debit Not Frozen) }
Customer Intimation
@if (h.customer_intimated_at) { {{ h.customer_intimated_at | date: 'dd MMM yyyy, HH:mm' }} by {{ h.intimated_by }} ({{ h.intimation_mode }}{{ h.intimation_reference ? ', ' + h.intimation_reference : '' }}) } @else { Not told yet{{ h.intimation_due_by ? ' - due by ' + (h.intimation_due_by | date: 'dd MMM yyyy, HH:mm') : '' }} }
@if (h.status === 'RELEASED') {
Released On
{{ h.released_at | date: 'dd MMM yyyy, HH:mm' }} - {{ reasonLabel(h.release_reason_type || '') }} {{ h.release_reference }}
}
} @if (modalTab === 'txns') {
Account Hold Transactions
@for (t of h.transactions; track t.id) { } @empty { }
Account Txn ID Held Amount (₹) Placed Timestamp Released Timestamp
{{ t.account_txn_id }} ₹{{ t.amount | number: '1.2-2' }} {{ t.placed_at | date: 'dd MMM yyyy, HH:mm' }} {{ t.released_at ? (t.released_at | date: 'dd MMM yyyy, HH:mm') : '-' }}
No money held yet (prospective hold waiting for funds deposit).
} @if (modalTab === 'intimation') { @if (h.customer_intimated_at) {
Customer told on {{ h.customer_intimated_at | date: 'dd MMM yyyy, HH:mm' }} by {{ channelLabel(h.intimation_mode || '') }}{{ h.intimation_reference ? ' - ' + h.intimation_reference : '' }} ({{ h.intimated_by }})
} @else if (h.automaticChannels?.length) {
Automatic intimation is on ({{ autoChannelsText(h) }}). @if (h.intimationLog?.length) { The last automatic attempt did not reach the customer; the system retries up to 3 times. You can send again now, or call the customer and record it below. } @else { The notice is sent as soon as the hold is placed. If it has not gone yet, send it now. }
} @else {
No automatic channel is configured. Call the customer (or send a letter / meet in person), then record it below. Channels are switched on under Intimation Settings.
} @if (!h.customer_intimated_at && h.status === 'ACTIVE' && h.amount_held > 0) {
Record Customer Intimation (manual)
RBI draft directions mandate that the account holder be notified of an account hold by the end of the next day, including reason, restoration options, and Grievance Officer contacts.
How the customer was told @for (m of intimationModes; track m) { {{ channelLabel(m) }} } Reference (call note, letter no.)
}
Intimation History ({{ h.intimationLog?.length || 0 }})
@for (l of h.intimationLog || []; track l.id) { } @empty { }
When Channel Type Status Sent to Reference / Reason By
{{ l.created_at | date: 'dd MMM yyyy, HH:mm' }} {{ channelLabel(l.channel) }} {{ l.mode === 'AUTO' ? 'Automatic' : l.mode === 'RESEND' ? 'Sent by officer' : 'Recorded' }} {{ l.status }} {{ l.destination_masked || '-' }} {{ l.failure_reason || l.provider_reference || '-' }} {{ l.actor || '-' }}
No notice sent or recorded yet.
} @if (modalTab === 'action') {
Raise Request on Hold (Maker)
@if (hasPendingAction) {
A request on this hold is already waiting for checker approval on the Approvals page.
} @else {
Requested Action @for (a of allowedActions; track a.value) { {{ a.label }} } @if (action.action === 'RELEASE') { Amount to release (₹, empty = all) @if (remainingAfterRelease !== null) { ₹{{ remainingAfterRelease | number: '1.2-2' }} stays on hold (order names the amount to keep) } } Reason @for (r of reasonTypes; track r.value) { {{ r.label }} } Order / Reference No.{{ orderRequired ? ' *' : '' }} Issuing Authority (IO, Court, DGRO...) Maker Remarks
}
} @if (modalTab === 'cases') {
GRM Grievance
Customer contests the hold (MHA SOP 9.1)
@if (openGrievance) { Open Contest } @else if ((h.grievances || []).length) { Logged ({{ h.grievances?.length }}) } @else { No Grievance }
@for (g of h.grievances || []; track g.id) {
{{ g.grievance_no || 'Draft #' + g.id }} {{ g.stage }} {{ g.status }}
} @if (h.status === 'ACTIVE' && !openGrievance) {
Open Customer Grievance
Customer asks to Remove the hold Unfreeze the account Restore digital services Customer's reason / grounds
} @else if (!h.grievances?.length) {
No contestation received. Customer can contest the hold under MHA SOP 9.1(ii).
}
MRM Money Restoration
Restitution to genuine victims
@if (openRestoration) { In Progress } @else if ((h.restorations || []).length) { Logged ({{ h.restorations?.length }}) } @else { No Restoration }
@for (r of h.restorations || []; track r.id) {
{{ r.mrm_request_no || 'Restoration #' + r.id }} {{ r.status }} @if (r.restorable_amount) { ₹{{ r.restorable_amount | number: '1.2-2' }} }
} @if (h.status === 'ACTIVE' && !openRestoration) {
Assess for Money Restoration
Restoration Basis @for (b of mrmBases; track b.value) { {{ b.label }} } @if (assessForm.basis === 'ATTRIBUTION' || assessForm.basis === 'PRO_RATA') { Restorable amount (₹, max {{ h.amount_held | number: '1.2-2' }}) } Officer remarks / justification
} @else if (!h.restorations?.length) {
No restitution assessed yet. Victim claims are processed under MHA SOP 9.1(iv).
}
Account Statement for Investigation
Official statement required for GRM / MRM verification and LEA requests
CSV Export
Legal & Regulatory Documents
IO notices, court orders (freeze/unfreeze), FIR copies, and customer affidavits
{{ h.documents?.length || 0 }} Attached
} @if (modalTab === 'risk') {
@if (h.linkedAlerts?.length || (h.reportsOnAccount || 0) > 1) {
Mandatory MHA SOP & Risk Attention Required Compliance Priority
@if ((h.reportsOnAccount || 0) > 1) { Account flagged in {{ h.reportsOnAccount }} complaints (suspected mule pattern). } @if (h.linkedAlerts?.length) { {{ h.linkedAlerts.length }} internal transfer alert(s) requiring action. } Review mule registration status, fraud reporting (STR/FMR), and LEA 90-day review timelines below.
}
90-Day Lapse (MHA SOP)
{{ isPast(h.lapse_on) ? 'Lapsed' : 'In Review' }}
Review due {{ h.review_due_on ? (h.review_due_on | date: 'dd MMM yyyy') : '-' }}
Lapses on {{ h.lapse_on ? (h.lapse_on | date: 'dd MMM yyyy') : 'Counted from a GRM grievance' }}
Tell LEA by {{ h.lea_notice_due_on ? (h.lea_notice_due_on | date: 'dd MMM yyyy') : '-' }} @if (h.lea_notice_sent_on) { Sent {{ h.lea_notice_sent_on | date: 'dd MMM' }} }
LEA Extension @if (h.extension_until) { Until {{ h.extension_until | date: 'dd MMM yyyy' }} } @else { None }
Release without order {{ h.canLapseRelease ? 'Allowed now (90-day)' : 'Not yet' }}
@if (h.status === 'ACTIVE') {
Record Notice to LEA
Notice reference
Record LEA Extension
Order reference
}
Fraud Reporting (RBI / FIU-IND)
{{ (h.fraudReports || []).length ? 'Case Logged' : 'Pending' }}
@for (r of h.fraudReports || []; track r.id) { @if (r.status === 'SHOW_CAUSE') {
UCB Fraud Directions 2026: Show-cause notice required (21 days for response). STR to FIU-IND due by {{ r.str_due_on | date: 'dd MMM yyyy' }}.
@if (!r.show_cause_sent_on) {
Issue Show-Cause Notice
} @else {
Sent: {{ r.show_cause_sent_on | date: 'dd MMM yyyy' }} Reply due: {{ r.show_cause_due_on | date: 'dd MMM yyyy' }} @if (r.show_cause_responded_on) { Replied {{ r.show_cause_responded_on | date: 'dd MMM' }} }
@if (!r.show_cause_responded_on) {
Record Customer Reply
Reply summary
}
Final Classification Order
Order reference
} }
Classified {{ r.classified_on ? (r.classified_on | date: 'dd MMM yyyy') : 'Not yet' }} • {{ r.status }}
Police / LEA {{ r.police_ref || 'Not yet' }} {{ r.police_reported_on ? '· ' + (r.police_reported_on | date: 'dd MMM yyyy') : '' }}
RBI FMR {{ r.fmr_ref ? r.fmr_ref + ' · filed ' + (r.fmr_filed_on | date: 'dd MMM yyyy') : 'Due ' + (r.fmr_due_on | date: 'dd MMM yyyy') }}
FIU-IND STR {{ r.str_ref ? r.str_ref + ' · filed ' + (r.str_filed_on | date: 'dd MMM yyyy') : 'Due ' + (r.str_due_on | date: 'dd MMM yyyy') }}
@if ((r.status === 'OPEN' || r.status === 'SHOW_CAUSE') && fraudForm['id'] !== r.id) { } } @if (fraudForm['id']) {
Update Regulatory Filings
Police / LEA ref FMR ref STR ref
} @if (!(h.fraudReports || []).length) {
No fraud case initiated yet. Opening one starts the mandatory STR (7 days) and show-cause notice (21 days) workflows.
}
Mule-Account Register
{{ (h.reportsOnAccount || 0) > 1 ? 'Mule Flagged' : 'Standard' }}
In {{ h.reportsOnAccount || 1 }} I4C complaint(s) • Flags automatically at ≥ 2
@for (f of h.muleFlags || []; track f.id) {
{{ f.status }} {{ f.source }} {{ f.flagged_at | date: 'dd MMM yyyy' }}
{{ f.reason }}
@if (f.review_remarks) {
Remarks: {{ f.review_remarks }}
}
@if (f.status === 'SUSPECTED') {
Review Mule Flag
Outcome Confirmed mule Not a mule (clear) Basis / Evidence
} } @if (!(h.muleFlags || []).length) {
Flag Account as Suspected Mule
Source Officer LEA Reason
}
Money Moved Inside Bank
{{ (h.linkedAlerts || []).length ? h.linkedAlerts.length + ' Alert' : 'Clean' }}
@for (a of h.linkedAlerts || []; track a.id) {
{{ a.kind === 'INTERNAL_TRANSFER' ? (a.target_type | titlecase) + ' account' : 'Loan' }} {{ a.target_no }} ₹{{ a.amount | number: '1.2-2' }} {{ a.status }}
Moved on {{ a.moved_on | date: 'dd MMM yyyy' }} @if (a.remarks) { • {{ a.remarks }} }
@if (a.status === 'OPEN') {
Resolve Transfer Alert
Action taken / remarks
}
} @empty {
No internal transfers or loan repayments detected from this account.
}
Digital Channels
{{ h.digital_suspended ? 'Suspended' : 'Operational' }}
@for (b of h.channelBlocks || []; track b.id) {
{{ b.status }} {{ b.channels }}
Placed {{ b.placed_at | date: 'dd MMM yyyy' }} by {{ b.placed_by }}{{ b.lifted_at ? ' · lifted ' + (b.lifted_at | date: 'dd MMM') : '' }}
} @empty {
All digital channels active (UPI, IMPS, NEFT, RTGS, ATM, cards).
To suspend or restore access, submit a request under Request Action (Maker).
}
@if (h.excludedKind?.length) {
Nodal / Escrow Account
Listed as a {{ h.excludedKind[0].kind | lowercase }} account: disputed amount held, but no prospective hold on future credits and no suspension (MHA SOP 9.1(iii)).
} @if (repaidLoan(h) && h.relatedAccounts?.length) {
Suspect's Other Accounts (CFCFRMS)
Fraud money repaid a loan here; notify suspect's other accounts on CFCFRMS (MHA SOP 9.1(v)).
@for (r of h.relatedAccounts; track r.account_no) {
{{ r.account_type | titlecase }} {{ r.account_no }} ₹{{ r.balance | number: '1.2-2' }}
}
}
} @if (modalTab === 'history') {
Requests Audit History on this Hold
@for (a of h.actions; track a.id) { }
Action Reason / Order Status Maker Details Checker Details
{{ a.action }} {{ reasonLabel(a.reason_type) }}
{{ a.order_reference }} {{ a.authority ? '- ' + a.authority : '' }}
{{ a.status }} @if (a.rejection_reason || a.failure_message) {
{{ a.rejection_reason || a.failure_message }}
}
{{ a.maker_name }}
{{ a.maker_at | date: 'dd MMM, HH:mm' }}
{{ a.checker_name || '-' }} @if (a.checker_at) {
{{ a.checker_at | date: 'dd MMM, HH:mm' }}
}
}
}