Aman-Mittal opened a new pull request, #816:
URL: https://github.com/apache/fineract-backoffice-ui/pull/816
Three pieces of migration debt this module's own comments named, and the
defects that came out of doing the work. Everything below was measured against
a running Fineract, not inferred.
## 1. The last seven deposit screens leave `src/app/api` (ADR 0006)
The two account lists, the two transaction lists, both transaction forms and
the recurring-deposit account form now go through `DEPOSIT_ACCOUNT_API`. Twelve
entries leave `eslint-suppressions.json`.
Doing it found five reads a user could see were wrong:
| Screen | What it read | What the payload sends |
| --- | --- | --- |
| Recurring deposit list | `recurringDepositAmount` |
`mandatoryRecommendedDepositAmount` — so the Amount column was empty on every
row |
| Fixed deposit transactions | the row `date` as-is, and
`transactionType.code` | `[year, month, day]` and `transactionType.value` — so
a row read `2026,10,18` and `savingsAccountTransactionType.payCharge` |
| On-hold funds | `loanClientName` | not a field of that response; it sends
`savingsClientName`, `savingsAccountNo` and `loanId` — so the column was blank
on every row |
| Recurring deposit transaction form | the template without `?command=` |
that endpoint answers `400 error.msg.query.parameter.value.unsupported` without
one, so the payment-channel list was empty on every load |
| Recurring deposit account form (edit) | `savingsProductId` | a deposit
account answers `depositProductId`, so an edit opened with no product selected |
Also:
- both account lists gated Approve on `status.value === 'Submitted and
pending approval'`, the platform's own English label. They use the status flag
beside it now.
- `template()` takes an optional `clientId`, because `?clientId=0` answers
`404` *Client not found with valuer 0* — the fixed-deposit account form sent
`clientId ?? 0` and listed no products until a client was chosen.
- `paymentTypeOptions` is typed `Array<number>` by the document and sent as
objects; the recurring form bound the raw element, which renders `[object
Object]`.
- the transaction rows are modelled, so the two lists and the account view
share one date and one label. `IsoDatePipe` is new, for a template with no
formatter of its own; it reads the parts out rather than letting `new
Date('2026-10-18')` land a day early west of Greenwich.
Relates to #653 and #295.
## 2. A deposit product's rate chart was dated from the browser
`chartFromProduct` and `chartForRequest` built their `fromDate` from `new
Date()`. Fineract judges a date by its own reckoning — the business date when
one governs — so a browser ahead of it has the chart refused. That is #758's
class of defect, and the last place in the products module still seeding a date
from the client clock. The date is now a required parameter (this module is
pure and has no injector), and both product forms pass
`PlatformDateService.today()`.
## 3. NG01354: the accounting section's controls never joined the form
`NgModel` resolves its `ControlContainer` with `@Host()`, which stops at the
component boundary, so no control inside `app-product-accounting-section` or
`app-gl-account-select` could reach the `ngForm` it sits in. Angular logs
NG01354 once per control on all six product forms that embed the section.
The console noise was the smaller half: `required` on a mandatory GL slot
never reached the parent form either, so Save stayed enabled with the slots
empty and the platform refused the product — or took it unaccounted, which is
#288. Fixed with `viewProviders` resolved through a factory rather than
`useExisting: NgForm`, so each component still renders outside a form.
## Checks
- unit tests: 312 files, 2540 tests green; new specs for the two mappers,
the chart helpers, both lists, both transaction forms, the on-hold list and the
accounting section inside a form. The accounting spec's two assertions fail
without the fix.
- backend e2e against a running Fineract: `deposit-account-servicing`,
`deposit-lifecycle-backend`, `loan-product-accounting` and
`working-capital-product-accounting-backend` pass.
`deposit-product-configuration` has one failure on a long-reused instance — the
product is created (verified through the API) but the spec's list filter types
into the global header search and the new product is off page one with 103
products present. That is #664, reproducible on `main`.
- the screens were driven against the platform: the recurring list now shows
`$500.00`, the fixed-deposit transactions list `10/19/2026 · $ 10.00 ·
Deposit`, the on-hold list `10/19/2026 · 50.00 · hold · —`, and both
transaction forms list `Money Transfer` and the other two channels by name.
- lint 0 errors, `lint:prune` applied, `i18n:check`, `format:check`,
`api:surface`, `check:template-text`, `check:a11y-names`,
`check:ui-primitives`, `check:icons`, `check:responsive`,
`check:internal-endpoints` all clean.
## Not in this PR
The SMS campaign create form still cannot post: `runReportId` and
`paramValue` are mandatory and the form asks for neither. Measured, that
screen's own template answers `403
error.msg.mobile.service.provider.not.available` on a stock instance, so
neither the report picker nor the shape of `paramValue` can be established
without a configured message gateway — #790. Left where it is rather than
guessed at.
--
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]