- 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.
185 lines
8.1 KiB
TypeScript
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;
|
|
}
|