/** * Copyright since 2025 Mifos Initiative * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ import { Component, inject } from '@angular/core'; import { CommonModule, DecimalPipe } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { MAT_DIALOG_DATA, MatDialogRef, MatDialogModule } from '@angular/material/dialog'; import { MatButtonModule } from '@angular/material/button'; import { MatTooltipModule } from '@angular/material/tooltip'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; export type CimsFormCode = 'OSS-2' | 'PSA' | 'RAL' | 'RCP-UCB' | 'OSS-4' | 'OSS-5' | 'OSS-6' | 'OSS-7'; export interface CimsXbrlDialogData { initialForm?: CimsFormCode; } interface CimsField { ref: string; label: string; section: string; value: number | string; unit?: 'INR-Lakh' | 'INR-Cr' | 'Pure' | 'Percent' | 'Number'; type?: 'monetary' | 'numeric' | 'string' | 'percent'; } interface CimsForm { code: CimsFormCode; name: string; fullName: string; description: string; cimsCode: string; taxonomy: string; periodicity: 'Daily' | 'Monthly' | 'Quarterly' | 'Half-Yearly' | 'Annual'; lastFiled: string; nextDue: string; fields: CimsField[]; } @Component({ selector: 'mifosx-cims-xbrl-dialog', standalone: true, templateUrl: './cims-xbrl-dialog.component.html', styleUrls: ['./cims-xbrl-dialog.component.scss'], imports: [ CommonModule, DecimalPipe, FormsModule, MatDialogModule, MatButtonModule, MatTooltipModule, FaIconComponent ] }) export class CimsXbrlDialogComponent { private dialogRef = inject(MatDialogRef); activeForm: CimsFormCode; activeTab: 'filing' | 'data' | 'preview' = 'filing'; bank = { name: 'CBSNexora Bank Ltd', branch: 'Head Office', bsrCode: 'CBSN0000123', ifsc: 'CBSN0000123', legalEntityId: 'CBSN-LEI-2025', pan: 'AAACB1234L', asOnDate: '31-03-2026', quarter: 'Q4 FY 2025-26', fiscalYear: '2025-26', principalOfficer: 'Karthik Kamath', poDesignation: 'Chief Compliance Officer', poEmail: 'compliance@cbsnexorabank.in', poMobile: '+91-9988002211', cimsUserId: 'CBSN_CIMS_001', cimsPortal: 'https://cims.rbi.org.in/' }; forms: Record = { 'OSS-2': { code: 'OSS-2', name: 'OSS-2', fullName: 'Off-site Surveillance — Statement of Asset Quality & Capital Adequacy', description: 'Quarterly return on asset classification, NPA, capital adequacy and profitability indicators.', cimsCode: 'CIMS_OSS_002', taxonomy: 'rbi-cims-oss-2024-04-01', periodicity: 'Quarterly', lastFiled: '15-01-2026', nextDue: '15-04-2026', fields: [ { ref: 'oss2:CapAdq.CRAR', section: 'Capital Adequacy', label: 'CRAR (Total)', value: 21.82, unit: 'Percent', type: 'percent' }, { ref: 'oss2:CapAdq.Tier1', section: 'Capital Adequacy', label: 'Tier-I CRAR', value: 20.51, unit: 'Percent', type: 'percent' }, { ref: 'oss2:CapAdq.Tier2', section: 'Capital Adequacy', label: 'Tier-II CRAR', value: 1.31, unit: 'Percent', type: 'percent' }, { ref: 'oss2:Asset.Total', section: 'Asset Classification', label: 'Total Advances (₹ Lakh)', value: 4112.04, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'oss2:Asset.Standard', section: 'Asset Classification', label: 'Standard Assets (₹ Lakh)', value: 3845.88, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'oss2:Asset.SubStd', section: 'Asset Classification', label: 'Sub-Standard (₹ Lakh)', value: 102.41, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'oss2:Asset.Doubtful', section: 'Asset Classification', label: 'Doubtful (₹ Lakh)', value: 163.75, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'oss2:Asset.Loss', section: 'Asset Classification', label: 'Loss (₹ Lakh)', value: 0, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'oss2:Asset.GNPA', section: 'NPA Position', label: 'Gross NPA (₹ Lakh)', value: 266.16, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'oss2:Asset.NNPA', section: 'NPA Position', label: 'Net NPA (₹ Lakh)', value: -96.33, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'oss2:Asset.GNPAPct', section: 'NPA Position', label: 'GNPA %', value: 6.47, unit: 'Percent', type: 'percent' }, { ref: 'oss2:Asset.NNPAPct', section: 'NPA Position', label: 'NNPA %', value: -2.6, unit: 'Percent', type: 'percent' }, { ref: 'oss2:Asset.PCR', section: 'NPA Position', label: 'Provision Coverage Ratio', value: 136.24, unit: 'Percent', type: 'percent' }, { ref: 'oss2:Profit.NIM', section: 'Profitability', label: 'Net Interest Margin', value: 0.51, unit: 'Percent', type: 'percent' }, { ref: 'oss2:Profit.ROA', section: 'Profitability', label: 'Return on Assets', value: 0.67, unit: 'Percent', type: 'percent' }, { ref: 'oss2:Profit.ROE', section: 'Profitability', label: 'Return on Equity', value: 5.38, unit: 'Percent', type: 'percent' }, { ref: 'oss2:Liq.CRR', section: 'Liquidity', label: 'CRR Maintained', value: 4.52, unit: 'Percent', type: 'percent' }, { ref: 'oss2:Liq.SLR', section: 'Liquidity', label: 'SLR Maintained', value: 19.24, unit: 'Percent', type: 'percent' } ] }, PSA: { code: 'PSA', name: 'PSA', fullName: 'Priority Sector Advances — Annual Achievement Statement', description: 'Annual return on priority sector lending, sub-targets and weaker section coverage.', cimsCode: 'CIMS_PSA_001', taxonomy: 'rbi-cims-psa-2024-04-01', periodicity: 'Annual', lastFiled: '30-04-2025', nextDue: '30-04-2026', fields: [ { ref: 'psa:Reference.ANBC', section: 'Reference', label: 'Adjusted Net Bank Credit (₹ Lakh)', value: 3274.83, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'psa:Reference.OBE', section: 'Reference', label: 'Credit Equivalent of OBE (₹ Lakh)', value: 0, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'psa:PSL.Total', section: 'PSL Achievement', label: 'Total PSL Outstanding (₹ Lakh)', value: 2485.67, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'psa:PSL.TotalPct', section: 'PSL Achievement', label: 'Total PSL % of ANBC', value: 75.9, unit: 'Percent', type: 'percent' }, { ref: 'psa:PSL.Agri', section: 'Sub-targets', label: 'Agriculture (₹ Lakh)', value: 39.0, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'psa:PSL.AgriPct', section: 'Sub-targets', label: 'Agriculture % of ANBC', value: 1.19, unit: 'Percent', type: 'percent' }, { ref: 'psa:PSL.SMF', section: 'Sub-targets', label: 'Small & Marginal Farmers (₹ Lakh)', value: 0, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'psa:PSL.SMFPct', section: 'Sub-targets', label: 'SMF % of ANBC', value: 0, unit: 'Percent', type: 'percent' }, { ref: 'psa:PSL.MicroEnt', section: 'Sub-targets', label: 'MSME Enterprises (₹ Lakh)', value: 2313.83, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'psa:PSL.MicroPct', section: 'Sub-targets', label: 'MSME Enterprises % of ANBC', value: 70.65, unit: 'Percent', type: 'percent' }, { ref: 'psa:PSL.Weaker', section: 'Sub-targets', label: 'Weaker Sections (₹ Lakh)', value: 990.28, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'psa:PSL.WeakerPct', section: 'Sub-targets', label: 'Weaker Sections % of ANBC', value: 30.22, unit: 'Percent', type: 'percent' }, { ref: 'psa:PSL.Housing', section: 'Other Categories', label: 'Housing (₹ Lakh)', value: 115.12, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'psa:PSL.Education', section: 'Other Categories', label: 'Education (₹ Lakh)', value: 17.32, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'psa:PSL.Export', section: 'Other Categories', label: 'Export Credit (₹ Lakh)', value: 0, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'psa:PSL.RenEnergy', section: 'Other Categories', label: 'Renewable Energy (₹ Lakh)', value: 0, unit: 'INR-Lakh', type: 'monetary' } ] }, RAL: { code: 'RAL', name: 'RAL', fullName: 'Return on Assets & Liabilities (Half-Yearly)', description: 'Half-yearly statement of bank-wide assets and liabilities composition for cooperative banks.', cimsCode: 'CIMS_RAL_004', taxonomy: 'rbi-cims-ral-2024-04-01', periodicity: 'Half-Yearly', lastFiled: '30-10-2025', nextDue: '30-04-2026', fields: [ { ref: 'ral:Liab.Capital', section: 'Liabilities', label: 'Capital (₹ Lakh)', value: 272.78, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'ral:Liab.Reserves', section: 'Liabilities', label: 'Reserves, Surplus & Profit (₹ Lakh)', value: 712.6, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'ral:Liab.DepDemand', section: 'Liabilities', label: 'Demand Deposits (₹ Lakh)', value: 195.92, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'ral:Liab.DepSavings', section: 'Liabilities', label: 'Savings Deposits (₹ Lakh)', value: 2081.16, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'ral:Liab.DepTerm', section: 'Liabilities', label: 'Term Deposits (₹ Lakh)', value: 4066.01, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'ral:Liab.Borrow', section: 'Liabilities', label: 'Borrowings (₹ Lakh)', value: 0, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'ral:Liab.Other', section: 'Liabilities', label: 'Other Liabilities & Provisions (₹ Lakh)', value: 780.73, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'ral:Asset.Cash', section: 'Assets', label: 'Cash on Hand (₹ Lakh)', value: 99.96, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'ral:Asset.RBI', section: 'Assets', label: 'Balances with RBI (₹ Lakh)', value: 0, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'ral:Asset.Banks', section: 'Assets', label: 'Balances with Banks & Other Institutions (₹ Lakh)', value: 1349.53, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'ral:Asset.Money', section: 'Assets', label: 'Money at Call & Short Notice (₹ Lakh)', value: 0, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'ral:Asset.Invest', section: 'Assets', label: 'Investments (₹ Lakh)', value: 2342.97, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'ral:Asset.Adv', section: 'Assets', label: 'Advances (₹ Lakh)', value: 3912.88, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'ral:Asset.Fixed', section: 'Assets', label: 'Fixed Assets (₹ Lakh)', value: 49.48, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'ral:Asset.Other', section: 'Assets', label: 'Other Assets & Interest Receivable (₹ Lakh)', value: 354.38, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'ral:OBE.Guar', section: 'Off-Balance Sheet', label: 'Contingent Liabilities (₹ Lakh)', value: 26.38, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'ral:OBE.LC', section: 'Off-Balance Sheet', label: 'Letters of Credit (₹ Lakh)', value: 0, unit: 'INR-Lakh', type: 'monetary' } ] }, 'RCP-UCB': { code: 'RCP-UCB', name: 'RCP (UCB)', fullName: 'Return on Cash Position — Urban Cooperative Banks', description: 'Fortnightly statement of CRR/SLR maintenance, NDTL composition and reserve position.', cimsCode: 'CIMS_RCP_UCB_007', taxonomy: 'rbi-cims-rcp-ucb-2024-04-01', periodicity: 'Monthly', lastFiled: '14-04-2026', nextDue: '28-04-2026', fields: [ { ref: 'rcp:Liab.DemandDep', section: 'NDTL Composition', label: 'Demand Liabilities (₹ Lakh)', value: 84200, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'rcp:Liab.TimeDep', section: 'NDTL Composition', label: 'Time Liabilities (₹ Lakh)', value: 681400, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'rcp:Liab.NDTL', section: 'NDTL Composition', label: 'Net Demand & Time Liabilities (NDTL)', value: 740000, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'rcp:CRR.Required', section: 'CRR Maintenance', label: 'CRR Required (4.5%)', value: 33300, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'rcp:CRR.Maintained', section: 'CRR Maintenance', label: 'CRR Maintained (avg)', value: 33448, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'rcp:CRR.MaintainedPct', section: 'CRR Maintenance', label: 'CRR % Maintained', value: 4.52, unit: 'Percent', type: 'percent' }, { ref: 'rcp:CRR.Surplus', section: 'CRR Maintenance', label: 'CRR Surplus / Shortfall (₹ Lakh)', value: 148, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'rcp:SLR.Required', section: 'SLR Maintenance', label: 'SLR Required (18%)', value: 133200, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'rcp:SLR.Maintained', section: 'SLR Maintenance', label: 'SLR Maintained (avg)', value: 142376, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'rcp:SLR.MaintainedPct', section: 'SLR Maintenance', label: 'SLR % Maintained', value: 19.24, unit: 'Percent', type: 'percent' }, { ref: 'rcp:SLR.Surplus', section: 'SLR Maintenance', label: 'SLR Surplus / Shortfall (₹ Lakh)', value: 9176, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'rcp:Cash.OnHand', section: 'Cash Position', label: 'Cash on Hand (₹ Lakh)', value: 8420, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'rcp:Cash.AtRBI', section: 'Cash Position', label: 'Cash at RBI (₹ Lakh)', value: 33448, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'rcp:Cash.AtBanks', section: 'Cash Position', label: 'Cash at other Banks (₹ Lakh)', value: 24800, unit: 'INR-Lakh', type: 'monetary' } ] }, 'OSS-4': { code: 'OSS-4', name: 'OSS-4', fullName: 'Connected Lending & Large Exposure Statement', description: 'Quarterly statement of loans to directors/relatives, senior officers, and exposures exceeding prudential thresholds. Illustrative figures — no source filing was provided for this return; values are modelled on this bank\'s own capital/advances scale for consistency.', cimsCode: 'CIMS_OSS_004', taxonomy: 'rbi-cims-oss4-2024-04-01', periodicity: 'Quarterly', lastFiled: '15-01-2026', nextDue: '15-04-2026', fields: [ { ref: 'oss4:Connected.Directors', section: 'Connected Lending', label: 'Loans to Directors & Relatives (₹ Lakh)', value: 42.5, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'oss4:Connected.SrOfficers', section: 'Connected Lending', label: 'Loans to Senior Officers (₹ Lakh)', value: 18.75, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'oss4:Connected.Accounts', section: 'Connected Lending', label: 'Number of Connected Lending Accounts', value: 12, unit: 'Number', type: 'numeric' }, { ref: 'oss4:LargeExp.Amount', section: 'Large Exposures', label: 'Exposures > 10% of Capital Funds (₹ Lakh)', value: 285.0, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'oss4:LargeExp.Pct', section: 'Large Exposures', label: 'Large Exposures as % of Capital Funds', value: 30.58, unit: 'Percent', type: 'percent' }, { ref: 'oss4:LargeExp.SingleBreach', section: 'Large Exposures', label: 'Single Borrower Limit Breaches', value: 0, unit: 'Number', type: 'numeric' }, { ref: 'oss4:LargeExp.GroupBreach', section: 'Large Exposures', label: 'Group Borrower Limit Breaches', value: 0, unit: 'Number', type: 'numeric' } ] }, 'OSS-5': { code: 'OSS-5', name: 'OSS-5', fullName: 'Institutional & Membership Profile', description: 'Annual statement of branch network, staff strength, membership and depositor/borrower base. Illustrative figures — no source filing was provided for this return; membership share capital is aligned to this bank\'s real paid-up capital figure.', cimsCode: 'CIMS_OSS_005', taxonomy: 'rbi-cims-oss5-2024-04-01', periodicity: 'Annual', lastFiled: '30-04-2025', nextDue: '30-04-2026', fields: [ { ref: 'oss5:Profile.Branches', section: 'Network', label: 'Number of Branches', value: 8, unit: 'Number', type: 'numeric' }, { ref: 'oss5:Profile.Employees', section: 'Network', label: 'Number of Employees', value: 64, unit: 'Number', type: 'numeric' }, { ref: 'oss5:Profile.AreaOfOperation', section: 'Network', label: 'Area of Operation', value: 'Single District', type: 'string' }, { ref: 'oss5:Profile.Members', section: 'Membership', label: 'Number of Regular Members', value: 18450, unit: 'Number', type: 'numeric' }, { ref: 'oss5:Profile.ShareCapital', section: 'Membership', label: 'Membership Share Capital (₹ Lakh)', value: 272.78, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'oss5:Profile.Depositors', section: 'Customer Base', label: 'Number of Depositors', value: 42180, unit: 'Number', type: 'numeric' }, { ref: 'oss5:Profile.Borrowers', section: 'Customer Base', label: 'Number of Borrowers', value: 3860, unit: 'Number', type: 'numeric' } ] }, 'OSS-6': { code: 'OSS-6', name: 'OSS-6', fullName: 'Structural Liquidity & Interest Rate Sensitivity Statement', description: 'Fortnightly maturity-bucket gap analysis of rate-sensitive assets and liabilities. Illustrative figures — no source filing was provided for this return.', cimsCode: 'CIMS_OSS_006', taxonomy: 'rbi-cims-oss6-2024-04-01', periodicity: 'Monthly', lastFiled: '14-04-2026', nextDue: '28-04-2026', fields: [ { ref: 'oss6:Gap.1to14Days', section: 'Maturity Gap (₹ Lakh)', label: '1-14 Days', value: -45.2, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'oss6:Gap.15to28Days', section: 'Maturity Gap (₹ Lakh)', label: '15-28 Days', value: -12.8, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'oss6:Gap.29DaysTo3M', section: 'Maturity Gap (₹ Lakh)', label: '29 Days to 3 Months', value: 88.4, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'oss6:Gap.Over3To6M', section: 'Maturity Gap (₹ Lakh)', label: 'Over 3 Months to 6 Months', value: 62.15, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'oss6:Gap.Over6MTo1Y', section: 'Maturity Gap (₹ Lakh)', label: 'Over 6 Months to 1 Year', value: -28.9, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'oss6:Gap.Over1To3Y', section: 'Maturity Gap (₹ Lakh)', label: 'Over 1 Year to 3 Years', value: 210.6, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'oss6:Gap.Over3To5Y', section: 'Maturity Gap (₹ Lakh)', label: 'Over 3 Years to 5 Years', value: 95.3, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'oss6:Gap.Over5Y', section: 'Maturity Gap (₹ Lakh)', label: 'Over 5 Years', value: -18.75, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'oss6:Liq.CumNegGapPct', section: 'Liquidity Ratios', label: 'Cumulative Negative Gap (14-Day) as % of Cumulative Outflows', value: 4.85, unit: 'Percent', type: 'percent' } ] }, 'OSS-7': { code: 'OSS-7', name: 'OSS-7', fullName: 'Statement of Frauds & Customer Complaints', description: 'Quarterly statement of frauds reported and customer-complaint disposal. Illustrative figures — no source filing was provided for this return.', cimsCode: 'CIMS_OSS_007', taxonomy: 'rbi-cims-oss7-2024-04-01', periodicity: 'Quarterly', lastFiled: '15-01-2026', nextDue: '15-04-2026', fields: [ { ref: 'oss7:Fraud.Count', section: 'Frauds', label: 'Number of Frauds Reported', value: 1, unit: 'Number', type: 'numeric' }, { ref: 'oss7:Fraud.Amount', section: 'Frauds', label: 'Amount Involved in Frauds (₹ Lakh)', value: 2.4, unit: 'INR-Lakh', type: 'monetary' }, { ref: 'oss7:Complaints.Received', section: 'Customer Complaints', label: 'Complaints Received (Quarter)', value: 14, unit: 'Number', type: 'numeric' }, { ref: 'oss7:Complaints.Resolved', section: 'Customer Complaints', label: 'Complaints Resolved', value: 12, unit: 'Number', type: 'numeric' }, { ref: 'oss7:Complaints.Pending', section: 'Customer Complaints', label: 'Complaints Pending', value: 2, unit: 'Number', type: 'numeric' }, { ref: 'oss7:Complaints.PendingOver30', section: 'Customer Complaints', label: 'Complaints Pending > 30 Days', value: 0, unit: 'Number', type: 'numeric' } ] } }; formCodes: CimsFormCode[] = [ 'OSS-2', 'PSA', 'RAL', 'RCP-UCB', 'OSS-4', 'OSS-5', 'OSS-6', 'OSS-7' ]; data = inject(MAT_DIALOG_DATA, { optional: true }); constructor() { this.activeForm = this.data?.initialForm ?? 'OSS-2'; } get currentForm(): CimsForm { return this.forms[this.activeForm]; } get sections(): string[] { const s: string[] = []; for (const f of this.currentForm.fields) { if (!s.includes(f.section)) s.push(f.section); } return s; } fieldsBySection(section: string): CimsField[] { return this.currentForm.fields.filter((f) => f.section === section); } setForm(code: CimsFormCode): void { this.activeForm = code; this.activeTab = 'filing'; } setTab(tab: 'filing' | 'data' | 'preview'): void { this.activeTab = tab; } close(): void { this.dialogRef.close(); } /** Format a number for XBRL output (no commas, 2 dp for monetary/percent) */ private fmtXbrl(f: CimsField): string { if (typeof f.value === 'string') return f.value; if (f.type === 'monetary' || f.type === 'percent') return f.value.toFixed(2); return f.value.toString(); } /** Build XBRL XML document for a form (representative; real CIMS taxonomy differs) */ generateXbrlXml(): string { const f = this.currentForm; const period = `${this.bank.fiscalYear} (${this.bank.quarter})`; const ctxId = `ctx_${f.code.replace('-', '_')}`; const startDate = '2026-01-01'; const endDate = '2026-03-31'; const lines: string[] = []; lines.push(''); lines.push('`); lines.push(` `); lines.push(` `); lines.push(` `); lines.push(' '); lines.push(` ${this.bank.legalEntityId}`); lines.push(' '); lines.push(' '); lines.push(` ${startDate}`); lines.push(` ${endDate}`); lines.push(' '); lines.push(' '); lines.push(' iso4217:INR'); lines.push(' xbrli:pure'); lines.push(' '); lines.push(` ${this.bank.name}`); lines.push(` ${this.bank.bsrCode}`); lines.push(` ${f.cimsCode}`); lines.push(' '); for (const fld of f.fields) { const unitRef = fld.type === 'monetary' ? 'INR_Lakh' : 'Pure'; const decimals = fld.type === 'monetary' || fld.type === 'percent' ? '2' : '0'; lines.push( ` <${fld.ref} contextRef="${ctxId}" unitRef="${unitRef}" decimals="${decimals}">${this.fmtXbrl( fld )}` ); } lines.push(''); return lines.join('\n'); } /** Validation summary — counts fields, flags any zero/missing */ get validation(): { total: number; populated: number; empty: number; status: 'valid' | 'warning' } { const fields = this.currentForm.fields; const populated = fields.filter((f) => f.value !== '' && f.value !== 0).length; const empty = fields.length - populated; return { total: fields.length, populated, empty, status: empty === 0 ? 'valid' : 'warning' }; } // -------------------- Exports -------------------- exportXbrl(): void { const xml = this.generateXbrlXml(); this.saveBlob(xml, `${this.currentForm.cimsCode}-${this.dateTag()}.xml`, 'application/xml'); } copyXbrl(): void { const xml = this.generateXbrlXml(); if (navigator.clipboard) navigator.clipboard.writeText(xml); } exportExcel(): void { const f = this.currentForm; const rows: string[][] = []; rows.push([ this.bank.name, this.bank.branch ]); rows.push([ f.fullName, `As On ${this.bank.asOnDate}` ]); rows.push([ `CIMS Code: ${f.cimsCode}`, `Taxonomy: ${f.taxonomy}` ]); rows.push([ `Periodicity: ${f.periodicity}`, `Quarter: ${this.bank.quarter}` ]); rows.push([ `Principal Officer: ${this.bank.principalOfficer}`, `Email: ${this.bank.poEmail}` ]); rows.push([]); rows.push([ 'Section', 'Element Ref', 'Label', 'Value', 'Unit' ]); for (const fld of f.fields) { rows.push([ fld.section, fld.ref, fld.label.replace(/&/g, '&'), this.fmtXbrl(fld), fld.unit ?? '' ]); } rows.push([]); rows.push([ 'Certified by', this.bank.principalOfficer + ' — ' + this.bank.poDesignation ]); this.saveTsv(rows, `${f.cimsCode}-${this.dateTag()}.xls`); } // ---- helpers ---- private dateTag(): string { const d = new Date(); return `${String(d.getDate()).padStart(2, '0')}${String(d.getMonth() + 1).padStart(2, '0')}${d.getFullYear()}`; } private saveTsv(rows: string[][], filename: string): void { const tsv = rows.map((r) => r.map((v) => (v || '').replace(/\t/g, ' ')).join('\t')).join('\n'); this.saveBlob(tsv, filename, 'application/vnd.ms-excel'); } private saveBlob(content: string, filename: string, mime: string): void { const blob = new Blob([content], { type: `${mime};charset=utf-8` }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = filename; a.click(); URL.revokeObjectURL(url); } }