Files
cbsnexora/src/app/loan-origination/rbi-compliance-step/rbi-compliance-rules.data.ts
T
nitesh 75df8865dd
build-run / Run Lint, Build and Deploy (push) Canceled after 0s
Publish Image in Docker Hub / build (push) Canceled after 0s
Playwright E2E Tests / Run Playwright Tests (push) Canceled after 0s
Tests / testRigor (push) Canceled after 0s
feat(loan-origination): RBI compliance checklist, real client integration, and CIC consent/charge flows
- Add standalone RBI Eligibility Checklist and RBI Rules Reference pages (11 real RBI-circular
  based rules: age-at-maturity, area of operation, PSL, director/related-party, wilful defaulter,
  exposure norms, LTV/margin, fair practices code, prepayment charges, own-shares security,
  insurance bundling), wired into the Loan Origination menu.
- Bridge the mock Loan Origination Pipeline to real Fineract data wherever an application is
  raised against a real Existing Customer: client search in the pipeline intake form, real Share
  Member accounts (with a details popup), and real KYC (Aadhaar/PAN verified status + masked
  numbers + document image view, generic document lookup for Income Proof/Bank Statement/
  Electricity Bill) on the Application Detail page.
- Add local-only capture UI for New Customer / no-account applications: front/back document
  images with crop + simulated Aadhaar OTP / PAN verification, employment-type-aware income proof,
  and an expiry-validated electricity bill upload.
- Add an EMI Calculation Basis breakdown (principal, rate, tenure, total interest/payable, and the
  substituted reducing-balance formula) to the KYC stage's income assessment.
- Add a CIC/Credit Bureau Check consent flow: a generated declaration letter (print for Branch,
  share for BC/Self-Apply), gated on the signed copy being uploaded before the credit score can be
  checked, plus a CIC check charge collected either by debiting a real linked account or via a
  mock payment-link flow for customers with none.
- Let the stage stepper jump directly to any already-reached stage (forward or backward) via a new
  furthestStageIndex, without losing any data already recorded on the application.
2026-08-13 10:15:28 +05:30

185 lines
8.1 KiB
TypeScript

/**
* 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/.
*/
/** A rule computed automatically from data already entered in the wizard (age, LTV). */
export type RbiRuleCheckType = 'AUTO' | 'MANUAL';
/** HARD rules are legal prohibitions with no override path; SOFT rules require a written
* override reason to proceed past a failure. */
export type RbiRuleBlockLevel = 'HARD' | 'SOFT';
export interface RbiComplianceRule {
code: string;
title: string;
rbiReference: string;
statement: string;
checkType: RbiRuleCheckType;
blockLevel: RbiRuleBlockLevel;
}
/**
* RBI-circular-based loan origination checklist. Age is the only rule computed from data this
* app already tracks (client date of birth) -- area of operation, PSL classification,
* director/related-party status, and wilful-defaulter/credit-bureau status have no backing data
* anywhere in this system yet, so those are officer manual attestations rather than automated
* checks. See CBS_UPDATE plan notes for the underlying RBI source for each rule.
*/
export const RBI_COMPLIANCE_RULES: RbiComplianceRule[] = [
{
code: 'AGE_AT_MATURITY',
title: 'Age at Loan Maturity',
rbiReference:
'Bank credit policy (standard practice, formalised for pension loans under RBI Master Circular on Pension Loans)',
statement: "Borrower's age at loan maturity must not exceed the bank's policy threshold.",
checkType: 'AUTO',
blockLevel: 'SOFT'
},
{
code: 'AREA_OF_OPERATION',
title: 'Area of Operation / Local Membership',
rbiReference:
"RBI Licensing Framework for UCBs -- a bank's area of operation is confined to its registered district(s)",
statement:
"I confirm the borrower's registered/communication address falls within this bank's declared area of operation.",
checkType: 'MANUAL',
blockLevel: 'SOFT'
},
{
code: 'PSL_CLASSIFICATION',
title: 'Priority Sector Lending (PSL) Classification',
rbiReference: 'RBI Master Directions -- Priority Sector Lending (Targets and Classification), 2025',
statement:
"Select this loan's PSL category, if any. Portfolio-level RBI targets: Agriculture 18% of ANBC (10% sub-target for small/marginal farmers within it), Weaker Sections 12%, and a UCB-specific Small Value Loan target of 50% of aggregate loans by 31 Mar 2026 (40% interim by 31 Mar 2025).",
checkType: 'MANUAL',
blockLevel: 'SOFT'
},
{
code: 'DIRECTOR_RELATED_PARTY',
title: 'Lending to Directors / Related Parties',
rbiReference: 'Section 20, Banking Regulation Act 1949 + RBI (UCBs -- Lending to Related Parties) Directions',
statement:
'I confirm the borrower and any guarantor are NOT a director, senior officer, or relative thereof of this bank -- or, if they are, that this loan falls within a board-approved permitted exception.',
checkType: 'MANUAL',
blockLevel: 'HARD'
},
{
code: 'WILFUL_DEFAULTER',
title: 'Wilful Defaulter / Credit Information Check',
rbiReference: 'RBI Master Direction on Treatment of Wilful Defaulters and Large Defaulters',
statement:
'I confirm a credit bureau (CIBIL) check has been run and the applicant is NOT listed as a wilful defaulter.',
checkType: 'MANUAL',
blockLevel: 'HARD'
},
{
code: 'EXPOSURE_NORMS',
title: 'Single / Group Borrower Exposure Limit',
rbiReference: 'RBI Master Circular -- Exposure Norms and Statutory/Other Restrictions for UCBs',
statement:
"This borrower's total exposure (existing + this loan) must not exceed 15% of the bank's Tier-I capital (25% for a borrower group).",
checkType: 'AUTO',
blockLevel: 'SOFT'
},
{
code: 'LTV_MARGIN',
title: 'Loan-to-Value / Margin Requirement',
rbiReference:
'RBI LTV norms -- Gold Loans (75-85% tiered by loan size) and Housing Loans (80-90% tiered by property value)',
statement:
'For a gold or housing loan, the loan amount must stay within the RBI-prescribed LTV cap for the collateral value entered.',
checkType: 'AUTO',
blockLevel: 'SOFT'
},
{
code: 'FAIR_PRACTICES_CODE',
title: 'Fair Practices Code / Key Facts Statement',
rbiReference: 'RBI Fair Practices Code for Lenders + Key Facts Statement (KFS) circular, 2024',
statement:
'I confirm the borrower has been, or will be, given the Key Facts Statement disclosing interest rate, fees and charges before sanction.',
checkType: 'MANUAL',
blockLevel: 'SOFT'
},
{
code: 'PREPAYMENT_CHARGES',
title: 'No Prepayment / Foreclosure Charges (Floating Rate)',
rbiReference:
'RBI (Pre-payment Charges on Loans) Directions, 2025 -- applies to loans sanctioned/renewed on or after 1 Jan 2026',
statement:
'I confirm that if this is a floating-rate loan to an individual or MSE, no prepayment or foreclosure charge is included in its terms for full or part prepayment, regardless of source of funds or co-obligants -- no exception is permitted.',
checkType: 'MANUAL',
blockLevel: 'HARD'
},
{
code: 'OWN_SHARES_SECURITY',
title: "Loan Against the Bank's Own Shares",
rbiReference: 'Section 20(1), Banking Regulation Act 1949',
statement:
"I confirm this loan's collateral does NOT include shares of this bank itself, or of its subsidiary -- absolutely prohibited, no exception is permitted.",
checkType: 'MANUAL',
blockLevel: 'HARD'
},
{
code: 'INSURANCE_BUNDLING',
title: 'No Compulsory Insurance / Third-Party Product Bundling',
rbiReference: 'RBI (Commercial Banks -- Responsible Business Conduct) Second Amendment Directions, 2026',
statement:
'I confirm the borrower has not been required to buy insurance or any third-party financial product from a specific tied provider as a condition for this loan -- any credit-linked cover the bank requires must let the borrower choose their own provider.',
checkType: 'MANUAL',
blockLevel: 'SOFT'
}
];
/** Reuses the same PSL category taxonomy already shown in the bank's PSL achievement dashboard
* (see psl-report-dialog.component.ts) so the two screens speak the same vocabulary. */
export const PSL_CATEGORY_OPTIONS: { code: string; name: string }[] = [
{ code: 'NOT_APPLICABLE', name: 'Not Applicable' },
{ code: 'AGRI', name: 'Agriculture' },
{ code: 'AGRI-SMF', name: 'Agriculture -- Small & Marginal Farmers' },
{ code: 'MSME-MICRO', name: 'MSME -- Micro Enterprises' },
{ code: 'MSME-SMALL', name: 'MSME -- Small Enterprises' },
{ code: 'MSME-MED', name: 'MSME -- Medium Enterprises' },
{ code: 'EDU', name: 'Education' },
{ code: 'HOUSE', name: 'Housing' },
{ code: 'SOC-INFRA', name: 'Social Infrastructure' },
{ code: 'REN-ENERGY', name: 'Renewable Energy' },
{ code: 'EXPORT', name: 'Export Credit' },
{ code: 'WEAKER', name: 'Weaker Sections' }
];
/** Collateral type drives which RBI LTV/margin cap table applies. */
export const COLLATERAL_TYPE_OPTIONS: { code: string; name: string }[] = [
{ code: 'NONE', name: 'Not Applicable / Unsecured' },
{ code: 'GOLD', name: 'Gold Loan' },
{ code: 'HOUSING', name: 'Housing Loan' },
{ code: 'SHARES_PHYSICAL', name: 'Shares / Debentures (Physical Form)' },
{ code: 'SHARES_DEMAT', name: 'Shares / Debentures (Demat Form)' }
];
/** Gold Loan LTV cap, tiered by loan amount (RBI circular, effective April 2026). */
export function goldLoanLtvCapPct(loanAmount: number): number {
if (loanAmount <= 250000) {
return 85;
}
if (loanAmount <= 500000) {
return 80;
}
return 75;
}
/** Housing Loan LTV cap, tiered by property (collateral) value. */
export function housingLoanLtvCapPct(collateralValue: number): number {
return collateralValue < 3000000 ? 90 : 80;
}
/** Max LTV against shares/debentures is the inverse of RBI's minimum margin -- 50% margin on
* physical-form securities caps the loan at 50% of market value; 25% margin on demat-form
* securities caps it at 75%. */
export function sharesLoanLtvCapPct(isDemat: boolean): number {
return isDemat ? 75 : 50;
}