feat(loan-origination): product type, income/co-borrower affordability, bank statement & CIC analysis, richer Field Investigation, and meeting-scheduled Personal Discussion
Publish Image in Docker Hub / build (push) Canceled after 0s
build-run / Run Lint, Build and Deploy (push) Canceled after 0s
Playwright E2E Tests / Run Playwright Tests (push) Canceled after 0s
Tests / testRigor (push) Canceled after 0s

- 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:
2026-08-13 15:14:39 +05:30
co-authored by Claude Sonnet 5
parent 5581d4180d
commit 997e8920e4
20 changed files with 4747 additions and 241 deletions
@@ -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;
}