feat(loan-origination): product type, income/co-borrower affordability, bank statement & CIC analysis, richer Field Investigation, and meeting-scheduled Personal Discussion
- New Application: add Product Type (Term Loan/Overdraft) driven by product eligibility. - KYC: 3-year ITR capture with exceptions, product-specific document checklists with officer-added custom docs, Housing Loan co-owner Aadhaar/PAN capture+verify in a popup dialog. - Income & Affordability: editable income/amount/tenure with product bounds validation, 40% EMI rule, and a full co-borrower flow (relationship, salary slips, combined-income eligibility). - Bank Statement upload auto-opens a full CSV-driven cash-flow/FOIR/risk analysis dialog. - CIC report upload auto-opens a bureau-style credit report analysis (score gauge, accounts, DPD history, enquiries) generated from the application's own credit score. - Field Investigation reworked into per-address cards (Home/Office/Property/Shop) with officer assignment, 48-hour SLA tracking, GPS + multi-photo capture, verify/reject with remarks, a full-detail popup, real Fineract addresses for existing clients, and a calculated property valuation (market/guideline/realizable value, LTV). - Personal Discussion: meeting scheduler (date/time/mode/officer) gating the discussion report, plus a full Application Summary Report PDF (KYC, CIC, FI, valuation, stage history) for the meeting. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -268,6 +268,14 @@
|
||||
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
|
||||
gap: 12px 20px;
|
||||
padding: 18px;
|
||||
|
||||
&--tight-bottom {
|
||||
padding: 0 0 10px;
|
||||
}
|
||||
|
||||
&--tight-top {
|
||||
padding: 10px 0 0;
|
||||
}
|
||||
}
|
||||
|
||||
.loan-kv-field {
|
||||
@@ -594,6 +602,53 @@
|
||||
margin: -2px 0 0;
|
||||
}
|
||||
|
||||
// Field Investigation -- one card per address (Home/Office/Property/Shop) instead of stacked
|
||||
// full-width sections, since each visit's officer/SLA/GPS/photo capture is a self-contained unit.
|
||||
.loi-fi-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(340px, 1fr));
|
||||
gap: 14px;
|
||||
margin-bottom: 14px;
|
||||
}
|
||||
|
||||
.loi-fi-card {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
padding: 14px 16px;
|
||||
border: 1px solid #e2e8f0;
|
||||
border-radius: 12px;
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
.loi-fi-card-title {
|
||||
font-size: 12px;
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.05em;
|
||||
color: #1e40af;
|
||||
}
|
||||
|
||||
.loi-fi-view-details {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
align-self: flex-start;
|
||||
gap: 6px;
|
||||
height: 30px;
|
||||
padding: 0 12px;
|
||||
border: 1px solid #c7d2fe;
|
||||
border-radius: 999px;
|
||||
background: #eef2ff;
|
||||
color: #4338ca;
|
||||
font-size: 12px;
|
||||
font-weight: 700;
|
||||
cursor: pointer;
|
||||
|
||||
&:hover {
|
||||
background: #e0e7ff;
|
||||
}
|
||||
}
|
||||
|
||||
.loi-otp-digits {
|
||||
display: flex;
|
||||
gap: 5px;
|
||||
@@ -668,3 +723,53 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Re-opens the bank statement analysis dialog for a CSV already on file -- the analysis only
|
||||
// pops up once automatically (right after upload), so this is the only way back into it once an
|
||||
// officer has closed it and wants to double-check something.
|
||||
.loi-bsa-reopen {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
height: 34px;
|
||||
padding: 0 14px;
|
||||
border: 1px solid #c7d2fe;
|
||||
border-radius: 999px;
|
||||
background: #eef2ff;
|
||||
color: #4338ca;
|
||||
font-size: 12.5px;
|
||||
font-weight: 700;
|
||||
cursor: pointer;
|
||||
|
||||
&:hover {
|
||||
background: #e0e7ff;
|
||||
border-color: #a5b4fc;
|
||||
}
|
||||
}
|
||||
|
||||
// Loan-specific documents (Housing/KCC/Vehicle/... papers) -- an officer-added custom document
|
||||
// gets a small remove control right next to its title; the product's own required list never
|
||||
// shows one, since removeCustomProductDoc() is a no-op for a non-custom entry anyway.
|
||||
.loi-doc-remove {
|
||||
margin-left: 6px;
|
||||
border: none;
|
||||
background: none;
|
||||
color: #94a3b8;
|
||||
font-size: 12px;
|
||||
cursor: pointer;
|
||||
padding: 0 2px;
|
||||
|
||||
&:hover {
|
||||
color: #dc2626;
|
||||
}
|
||||
}
|
||||
|
||||
.loi-custom-doc-input {
|
||||
height: 36px;
|
||||
padding: 0 12px;
|
||||
border: 1px solid #cbd5e1;
|
||||
border-radius: 6px;
|
||||
font-size: 13px;
|
||||
min-width: 260px;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user