Files
cbsnexora/src/app/loan-origination/application-detail/field-visit-details-dialog/field-visit-details-dialog.component.html
T
niteshandClaude Sonnet 5 997e8920e4
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
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>
2026-08-13 15:14:39 +05:30

63 lines
2.1 KiB
HTML

<!--
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/.
-->
<h2 mat-dialog-title>{{ data.label }} — Visit Details</h2>
<mat-dialog-content class="fvd-content">
<span [class]="statusBadgeClass">{{ data.check.status }}</span>
<dl class="fvd-kv-grid">
<div class="fvd-kv-field">
<dt>Officer Assigned</dt>
<dd>{{ data.check.officerAssigned }}</dd>
</div>
<div class="fvd-kv-field">
<dt>Assigned On</dt>
<dd>{{ data.check.assignedDate }}</dd>
</div>
<div class="fvd-kv-field">
<dt>GPS Coordinates</dt>
<dd>{{ data.check.latitude || '—' }}, {{ data.check.longitude || '—' }}</dd>
</div>
<div class="fvd-kv-field">
<dt>{{ data.check.status === 'FAILED' ? 'Rejected By' : 'Verified By' }}</dt>
<dd>{{ data.check.verifiedBy }}</dd>
</div>
<div class="fvd-kv-field">
<dt>{{ data.check.status === 'FAILED' ? 'Rejected On' : 'Verified On' }}</dt>
<dd>{{ data.check.verifiedDate }}</dd>
</div>
<div class="fvd-kv-field">
<dt>Remarks</dt>
<dd>{{ data.check.remarks }}</dd>
</div>
</dl>
<p class="fvd-photos-title">Site Photos ({{ data.check.photoCount }})</p>
@if (data.photos.length > 0) {
<div class="fvd-photo-grid">
@for (photo of data.photos; track $index) {
<div class="fvd-photo">
@if (photo.previewUrl) {
<img [src]="photo.previewUrl" alt="Site photo {{ $index + 1 }}" />
} @else {
<span class="fvd-photo-label">{{ photo.file.name }}</span>
}
</div>
}
</div>
} @else {
<p class="fvd-no-photos">
No photo files available in this browser session -- they were captured earlier and aren't retained after a page
refresh, though the count above is.
</p>
}
</mat-dialog-content>
<mat-dialog-actions align="end">
<button type="button" mat-button mat-dialog-close>Close</button>
</mat-dialog-actions>