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.
This commit is contained in:
@@ -256,15 +256,37 @@
|
||||
}
|
||||
<label class="inv-form-field">
|
||||
<span>* Customer Type</span>
|
||||
<select [(ngModel)]="newApp.customerType">
|
||||
<select [(ngModel)]="newApp.customerType" (ngModelChange)="onCustomerTypeChange()">
|
||||
<option value="NEW">New Customer</option>
|
||||
<option value="EXISTING">Existing Customer</option>
|
||||
</select>
|
||||
</label>
|
||||
<label class="inv-form-field">
|
||||
<span>* Applicant Name</span>
|
||||
<input type="text" [(ngModel)]="newApp.applicantName" placeholder="Full name" />
|
||||
</label>
|
||||
@if (newApp.customerType === 'EXISTING') {
|
||||
@if (!newApp.clientId) {
|
||||
<label class="inv-form-field">
|
||||
<span>* Search Existing Client</span>
|
||||
<input
|
||||
type="text"
|
||||
[(ngModel)]="existingClientSearchText"
|
||||
(ngModelChange)="onExistingClientSearch($event)"
|
||||
placeholder="Name, account no., mobile..."
|
||||
/>
|
||||
</label>
|
||||
} @else {
|
||||
<label class="inv-form-field">
|
||||
<span>* Applicant</span>
|
||||
<div class="loi-selected-client">
|
||||
<span>{{ newApp.applicantName }}</span>
|
||||
<button type="button" class="pg-btn" (click)="clearExistingClient()">Change</button>
|
||||
</div>
|
||||
</label>
|
||||
}
|
||||
} @else {
|
||||
<label class="inv-form-field">
|
||||
<span>* Applicant Name</span>
|
||||
<input type="text" [(ngModel)]="newApp.applicantName" placeholder="Full name" />
|
||||
</label>
|
||||
}
|
||||
<label class="inv-form-field">
|
||||
<span>* Branch</span>
|
||||
<select [(ngModel)]="newApp.branchCode" [disabled]="!isHeadOffice">
|
||||
@@ -290,6 +312,25 @@
|
||||
<input type="number" [(ngModel)]="newApp.tenureMonths" placeholder="e.g. 36" />
|
||||
</label>
|
||||
</div>
|
||||
|
||||
@if (newApp.customerType === 'EXISTING' && !newApp.clientId) {
|
||||
@if (searchingExistingClient) {
|
||||
<p class="loi-search-hint">Searching…</p>
|
||||
} @else if (existingClientSearchText.length >= 2 && existingClientSearchResults.length === 0) {
|
||||
<p class="loi-search-hint">No clients found.</p>
|
||||
}
|
||||
@if (existingClientSearchResults.length > 0) {
|
||||
<div class="loi-search-results">
|
||||
@for (client of existingClientSearchResults; track client.id) {
|
||||
<button type="button" class="loi-search-row" (click)="selectExistingClient(client)">
|
||||
<span class="loi-search-name">{{ client.displayName }}</span>
|
||||
<span class="loi-search-meta">{{ client.accountNo ?? client.officeName ?? '' }}</span>
|
||||
</button>
|
||||
}
|
||||
</div>
|
||||
}
|
||||
}
|
||||
|
||||
<div class="inv-form-actions">
|
||||
<button type="button" class="pg-btn pg-btn--primary" (click)="saveNewApplication()">Submit Application</button>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user