Aman-Mittal opened a new pull request, #341:
URL: https://github.com/apache/fineract-backoffice-ui/pull/341

   ## What and why
   
   The transactions tables on the savings and term deposit screens could be 
read but never acted on. A teller who mis-keyed an amount had no reversal, and 
a hold placed against a claim could never be released from this application — 
money could be earmarked and then only freed outside the product.
   
   Closes #298. Also closes the last two rows of the table in #197 
(`holdAmount` / `releaseAmount`, which was half-built: funds could be held but 
not freed).
   
   ## Verified against a running Fineract
   
   Probing the command discriminator on each endpoint:
   
   | Endpoint | Commands |
   |---|---|
   | `POST /savingsaccounts/{id}/transactions/{txId}` | `undo`, `modify`, 
`releaseAmount`, `reverse` |
   | `POST /recurringdepositaccounts/{id}/transactions` | `deposit`, 
`withdrawal` |
   | `POST /recurringdepositaccounts/{id}/transactions/{txId}` | `undo`, 
`modify` |
   | `POST /fixeddepositaccounts/{id}/transactions` | `deposit`, `withdrawal` |
   | `POST /fixeddepositaccounts/{id}/transactions/{txId}` | `undo`, `modify` |
   
   What the discriminator does **not** say, and the platform does:
   
   - **A fixed deposit refuses a withdrawal.** The command is enumerated but 
answers `503 
error.msg.fixeddepositaccount.account.trasaction.withdraw.notallowed`. The 
screen offered *Withdraw* on every term deposit and navigated to a route that 
does not exist. It is now offered for recurring deposits only, where it works — 
money leaves a fixed deposit through maturity or premature closure, both 
already on the menu.
   - **`undo` is lenient.** It answers `200` against an already-reversed 
transaction, and against a hold or a release, doing nothing useful. 
**`releaseAmount` is strict**, refusing a second release with 
`validation.msg.amount.is.not.on.hold`. So the screens gate both themselves 
rather than offering a button that reports success and changes nothing.
   - **A hold records `releaseTransactionId` as `0` while it stands**, not as 
absent, so the release gate tests for a truthy id rather than for the key.
   
   ## The term deposit transactions tab was empty by construction
   
   It read `account['transactions']`, and neither `GET 
/fixeddepositaccounts/{id}` nor its recurring twin returns that key unless 
asked. So the tab showed nothing on every account regardless of activity.
   
   - **Fixed deposit** has a list endpoint and a generated method for it — that 
is the typed path and it is used.
   - **Recurring deposit** has neither. `GET 
/recurringdepositaccounts/{id}/transactions` answers `405`, and the upstream 
OpenAPI document describes no `associations` parameter for either deposit type 
— although it does for `/savingsaccounts/{accountId}`. That one read therefore 
goes through the same `HttpClient` escape hatch `group-view` already uses, with 
the condition for deleting it recorded in the comment.
   
   Worth raising upstream: `associations` is honoured by the platform on both 
deposit account GETs but missing from the spec.
   
   ## Reversed rows stay visible
   
   Struck through, marked, never removed — on both screens. Fineract flags 
`reversed` rather than deleting, and dropping the row would take the audit 
trail with it. Same failure class as #280.
   
   ## The fixed-deposit transaction form
   
   Did not exist. One trap worth flagging for reviewers: its generated 
operation is `(accountId, command, body)` where the recurring twin is 
`(accountId, request, command)`, and the body is typed `string`. A call copied 
from the twin binds the request object to `command` and **still compiles**. The 
spec asserts the argument positions explicitly.
   
   Two more spec-versus-platform gaps handled locally, both commented: 
`paymentTypeOptions` is typed `Array<number>` but arrives as objects (binding 
the raw element would render `[object Object]`), and `paymentTypeId` is absent 
from the request model although the platform accepts it and echoes it back 
under `changes`.
   
   ## Not touched
   
   `#279`/`#278` overlap with open PR #335, which fixes the recurring-deposit 
route and command. Nothing here changes that file or the recurring-deposit 
navigation.
   
   ## Verification
   
   - Unit: 909 pass, including the gating rules and the argument-order 
assertion.
   - Mocked e2e: 247 pass.
   - Real-backend e2e, both new:
     - a fixed deposit is approved, activated, a deposit recorded, listed on 
the tab, and reversed while staying on screen;
     - a savings hold is released and a savings deposit reversed.
   - `npm run lint`, `format:check`, `check:icons`, `i18n:check`, `build` all 
clean.
   
   ## Checklist
   
   - [x] I did not hand-edit generated files under `src/app/api/`.
   - [x] New component uses the adapter boundary (`| appTranslate`), per 
ADR-0003.
   - [x] New user-facing strings added to `en.json` and verified by hand — 
`scripts/check-translations.mjs` does not match `| appTranslate`.
   - [x] Commits are signed.
   


-- 
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