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]

Reply via email to