- 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>
63 lines
2.1 KiB
HTML
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>
|