Aman-Mittal opened a new issue, #268:
URL: https://github.com/apache/fineract-backoffice-ui/issues/268
Follow-up to #266, which closed the loan gaps that were a menu entry or a
tab over data already fetched. What is left needs its own UI, which is why it
was kept out of that PR rather than rushed into it.
Every command below was confirmed against a running platform before this was
written. The discriminator is reliable: an unrecognised command answers `400`
with the message `command`, exactly as an invented name like
`totallyNotACommand` does. Each of these answered with a specific missing
parameter or domain rule instead, which is what "recognised" looks like.
| Command / endpoint | Probe result | Why it needs UI |
|---|---|---|
| `POST /loans/{id}?command=disburseToSavings` | `400` —
`actualDisbursementDate` is mandatory | needs a savings-account picker as well
as a date |
| `POST /loans/{id}?command=undoLastDisbursal` | `403` —
`loan.product.does.not.support.multiple.disbursals` | only meaningful on a
multi-tranche loan, so it has to be offered conditionally |
| `POST /loans/{id}?command=unassignloanofficer` | `400` — `unassignedDate`
is mandatory | needs a date form; the app has assign, but no way back |
| `GET /external-asset-owners/transfers?loanId={id}` | `200`, page envelope
| a tab, but a paged one — not the local-filter shape the other tabs use |
None of the three commands appears anywhere in `src/app/features/loans`.
## Scope
1. **Disburse to savings** — offered for an approved loan, collecting the
disbursement date and the destination savings account.
2. **Undo last disbursal** — offered only where the product allows multiple
disbursals, so the user is not handed an action that can only answer 403.
3. **Unassign loan officer** — the counterpart to the assign action already
on the menu, collecting the unassignment date.
4. **External asset owner transfers tab** — server-paged rather than
filtered locally, since the endpoint returns a page envelope.
New components go through the adapter boundary (ADR-0003) and hold state in
signals.
## Not included, and not yet possible
The **original schedule** tab. `GET /loans/{id}/schedule` answers **405
Method Not Allowed**, so there is no verified way to fetch a loan's schedule as
first generated. It stays out until someone establishes the right endpoint;
building a tab against a guess would ship one that silently shows nothing,
which is worse than its absence.
## Testing
Mocked e2e pinning each command's request — the request body is where this
class of work goes wrong, as #266 found when `undoapproval` turned out to
reject the `locale` and `dateFormat` that the shared action form sends on every
call. Real-backend coverage for unassign loan officer and disburse to savings,
which can both be driven end to end through the UI. Undo last disbursal needs a
multi-tranche product; if seeding one through the screens proves
disproportionate, its coverage stays mocked and this issue says so rather than
quietly skipping it.
## Business Value
**Unassign loan officer** is the one with a daily cost. Officers leave, go
on leave, and change branch, and their loans have to move. The app can assign
an officer but cannot take one off, so a portfolio ends up attributed to
someone who no longer works there — which quietly corrupts every per-officer
report, arrears list and performance figure derived from it, and there is no
way to correct it from this app.
**Disburse to savings** is how group and savings-linked lending normally
pays out: the money lands in the member's account rather than as cash over the
counter, leaving a traceable transfer instead of a manual reconciliation.
Without it those institutions cannot disburse here at all.
**Undo last disbursal** matters only for tranche lending, but there it is
the sole correction for a tranche released early or for the wrong amount —
otherwise the whole loan has to be unwound.
**External asset owner transfers** answers who currently owns a loan that
has been sold on. An officer looking at a loan the institution no longer holds
has no indication of it today.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]