feat(cfcfrms): I4C Live screens for SOP layer chain, risk, bank holds and restorations

- Risk screen and shared I4C date field
- Bank Master: IFSC to I4C bank code map and unmapped IFSC list
- Holds, restorations, grievances, documents, outbox and dashboard updates
  for the backend I4C SOP / outward ledger changes

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-26 11:25:40 +05:30
co-authored by Claude Opus 5.5
parent fca550f4c4
commit 96bebd339b
32 changed files with 4368 additions and 302 deletions
+47 -1
View File
@@ -50,6 +50,21 @@ export interface I4cHold {
documents?: I4cDocument[];
released_amount?: number;
restored_amount?: number;
digital_suspended?: boolean;
lapse_on?: string;
lea_notice_due_on?: string;
lea_notice_sent_on?: string;
lea_notice_ref?: string;
extension_until?: string;
extension_ref?: string;
linkedAlerts?: any[];
relatedAccounts?: any[];
excludedKind?: { kind: string }[];
muleFlags?: any[];
fraudReports?: any[];
channelBlocks?: any[];
reportsOnAccount?: number;
canLapseRelease?: boolean;
auto_intimation_attempts?: number;
}
@@ -141,7 +156,7 @@ export interface I4cPage<T> {
export type I4cListParams = Record<string, string | number | boolean | null | undefined>;
export interface HoldActionRequest {
action: 'RELEASE' | 'FREEZE' | 'UNFREEZE' | 'UNFREEZE_AND_RELEASE';
action: 'RELEASE' | 'FREEZE' | 'UNFREEZE' | 'UNFREEZE_AND_RELEASE' | 'SUSPEND_DIGITAL' | 'RESTORE_DIGITAL';
/** RELEASE only: how much to release; empty releases all. */
amount?: number | null;
reasonType: string;
@@ -259,6 +274,19 @@ export class I4cService {
return this.http.get<I4cPage<any>>(`${this.base}/bank-master`, { params: this.params(query) });
}
/** The bank's IFSC / prefix -> I4C Bank Code map, and reported IFSCs that had no code. */
ifscMap(): Observable<{ mappings: any[]; unknown: any[] }> {
return this.http.get<{ mappings: any[]; unknown: any[] }>(`${this.cases}/ifsc-map`);
}
mapIfsc(body: { ifscKey: string; bankCode: number; note?: string }): Observable<{ resourceId: number }> {
return this.http.post<{ resourceId: number }>(`${this.cases}/ifsc-map`, body);
}
unmapIfsc(id: number): Observable<{ resourceId: number }> {
return this.http.post<{ resourceId: number }>(`${this.cases}/ifsc-map/${id}/remove`, {});
}
// ── GRM / MRM (/v1/i4c/cases) ──────────────────────────────────────────
grievances(query: I4cListParams = {}): Observable<I4cPage<any>> {
@@ -335,6 +363,24 @@ export class I4cService {
});
}
/** A POST on /i4c/cases/{path}, e.g. restorations/5/contest or holds/3/lea-notice. */
casePost(path: string, body: Record<string, any> = {}): Observable<any> {
return this.http.post<any>(`${this.cases}/${path}`, body);
}
casePut(path: string, body: Record<string, any> = {}): Observable<any> {
return this.http.put<any>(`${this.cases}/${path}`, body);
}
/** A paged register on /i4c/cases: mule-flags, fraud-reports, linked-alerts, channel-blocks. */
register(name: string, query: I4cListParams = {}): Observable<I4cPage<any>> {
return this.http.get<I4cPage<any>>(`${this.cases}/${name}`, { params: this.params(query) });
}
fraudReportsCsv(): Observable<Blob> {
return this.http.get(`${this.cases}/fraud-reports.csv`, { responseType: 'blob' });
}
documents(ownerType: I4cDocumentOwner, ownerId: number): Observable<I4cDocument[]> {
return this.http.get<I4cDocument[]>(`${this.cases}/documents`, { params: this.params({ ownerType, ownerId }) });
}