Aman-Mittal opened a new pull request, #219:
URL: https://github.com/apache/fineract-backoffice-ui/pull/219
Closes #218. Part of #197.
Three more groups of savings commands had no UI. Every contract below was
probed against a running
Fineract before any code was written.
| Command | Offered when |
|---|---|
| `reject`, `withdrawnByApplicant` | application is pending |
| `assignSavingsOfficer` | account is active |
| `unassignSavingsOfficer` | active **and** an officer is assigned |
| `holdAmount` | account is active |
### What was actually missing
- **A pending application could only be approved.** If the applicant failed
KYC or withdrew, there
was no way to record it — the account sat pending, or someone resolved it
outside the system and
the screens stopped matching reality. Decline and withdrawn-by-applicant
are different outcomes
with different reporting treatment, so each confirmation says which is
which and points at the
other.
- **No account could be assigned to an officer**, so every account created
here was unassigned and
reassignment on staff changes happened elsewhere. Only *active* staff are
offered — assigning to
someone who has left is a silent way to lose an account from a portfolio.
- **Funds could not be held.** The only tool available was freezing the
whole account, which stops
a customer using money that was never in dispute. A hold ring-fences the
disputed amount and
leaves the rest of the account working.
### Two contract details a mocked test could not catch
- **`holdAmount` is on the transactions endpoint, not the account one**, and
takes
`transactionAmount` — sending `amount` is rejected with *"The parameter
amount is not
supported"*.
- **`releaseAmount` targets the hold's own transaction id**
(`/transactions/{txnId}`) and takes an
empty body.
Also worth flagging: Fineract reports "no officer" as `fieldOfficerId: 0`
rather than omitting the
field. A truthiness check would be right by accident and a null check wrong,
so there is a unit
test for the sentinel specifically.
### Adapter boundary
The new components go through the boundary rather than past it — `OVERLAY`
instead of
`ModalController`, and the `appTranslate` pipe instead of ngx-translate's.
That needed **one addition to the contract**: `dismissModal`, the
counterpart to `modal()` that
lets dialog *content* hand a result back to its opener. The contract had
`modal()` (which resolves
with a value) and `ModalHandle.dismiss()` (the opener closing a modal it
holds), but no way for the
content to supply the value — so every existing dialog reaches for
`ModalController` to do it, and
each is a recorded violation. New ones no longer have to.
`FakeOverlayAdapter` records dismissals,
so a spec can assert the value a dialog returns rather than inspecting the
DOM.
Suppression baseline **431 → 429**.
### Verification
| Check | Result |
|---|---|
| Unit tests | **768 passing** (766 → 768) |
| Mocked Playwright | **210/210 passing** |
| `npm run ga:check` | 7/8, 0 blocking (unchanged) |
| `tsc` (app + spec), build, lint, format, i18n, icons, licence | clean |
Four icons were unregistered and would have rendered as blank space; the
icon check caught them.
### On "all savings features"
This finishes the **account-servicing commands** on #197 — interest, annual
fees, all three block
types, officer assignment, decline paths and holds are now covered between
this PR and #199.
**GSIM (group savings) is deliberately not here.** It is not another command
on this screen: it is
a different account type with its own creation flow, its own member-level
breakdown, and an
endpoint that returns an unparsed JSON string
(`getGroupsGroupIdGsimaccounts`) rather than a typed
model. Folding it into this PR would mean shipping a second, largely
untested feature under a
commit message about servicing commands. It wants its own issue and its own
backend verification,
and #197 stays open to track it.
--
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]