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]

Reply via email to