Replaces the in-memory mock (LOAN_APPLICATIONS array + seeded RNG, reset on
every refresh) with real Fineract-backed persistence: a new
LoanOriginationService for CRUD plus one API call per stage transition, a
loan-fineract-bridge that creates a real loan account (create + approve +
disburse) at disbursement for Existing Customers, and file uploads through
Fineract's generic document store keyed by a stable checklist slot so
"On file"/View controls survive a reload.
Also fixes several gaps found while verifying full-cycle persistence:
- CIC charge-account selection never saved (missing persist() call)
- Co-borrower relationship/monthly income lived in local-only component state
instead of on the application, so they reset on refresh
- Field Investigation "View Full Details" showed local-session photos only;
stored photos are now downloaded and shown as real thumbnails
- "Assign Field Officer" was free text; now a dropdown of real CBS loan
officers pulled from /staff
- site photos and cheque/signature images now open in the same zoomable,
pannable lightgallery viewer used elsewhere in the app
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>