Aman-Mittal opened a new issue, #622: URL: https://github.com/apache/fineract-backoffice-ui/issues/622
Found by diffing the generated client in `src/app/api/` against `api-surface.json` — the manifest of operations this application actually calls — and then exercising each candidate against a real Fineract rather than a mock. Every defect below fails silently, or fails identically to "there is no data". That is why none of them had been reported: nothing on screen distinguishes a broken call from an empty tenant. A mock cannot see any of them. The mock accepts the payload the platform rejects, and answers the entity token the screen sent rather than the one the platform knows. ## 1. Delinquency ranges and buckets can only be deleted `/system/delinquency` renders "Create Range", "Create Bucket" and a per-row Edit on each of the two tables. All four route to `ranges/…` and `buckets/…` paths that have no route and no component, so all four land on "Page not found". Delete works. The screen can therefore only remove delinquency configuration, with no way to put it back. Delinquency buckets are attached to loan products, so this is not recoverable from elsewhere in the UI. `GET /delinquency/buckets/template` — which supplies the selectable ranges and the bucket types — is never called by anything. **Steps:** go to `/system/delinquency` → click Create Range → "Page not found". ## 2. A report mailing job can never be submitted `POST /reportmailingjobs` is refused on every attempt. The form sends five fewer parameters than the platform requires: - `locale` — `stretchyReportId` is locale-sensitive, so any payload carrying it without a locale is refused outright - `startDateTime` - `emailMessage` - `emailAttachmentFileFormatId` - `dateFormat` `dateFormat` also cannot be the `dd MMMM yyyy` used elsewhere in this codebase: with a time appended the platform throws a 500 rather than a validation error. `yyyy-MM-dd HH:mm:ss` parses. There is a second, separate problem underneath, **in the platform and not in this UI**: with every mandatory parameter present, the insert fails on `null value in column "number_of_runs" ... violates not-null constraint`, and `numberOfRuns` is rejected as an unsupported request parameter. No client can satisfy that column. Reproduced with curl, independently of this UI, against `develop`. That half belongs in [FINERACT Jira](https://issues.apache.org/jira/projects/FINERACT) and is filed separately; fixing the payload here is still worth doing and is a prerequisite for the screen ever working. **Steps:** `/system/report-mailing-jobs/create` → fill the form → Submit → refused. ## 3. Interest rate charts always error `productId` is optional in the OpenAPI spec and required by the platform. A bare `GET /interestratecharts` answers 500; `GET /interestratecharts?productId=1` answers 200. The list screen made exactly the bare call, so it showed "No records found." under a toast containing the raw request URL, on every load, for every tenant. Charts belong to a deposit product, so the list has to gather them per product. **Steps:** `/products/interest-rate-charts`. ## 4. Bulk import offers seven entity types the platform refuses Seven of the eighteen tokens in the entity-type picker are not the tokens the import endpoints use. All seven answer 404: | Offered | Accepted | | --- | --- | | `clients` | `client` | | `savingsaccounts` | `savingsaccount` | | `glaccounts` | `chartofaccounts` | | `journalentries` | `gljournalentries` | | `recurringdepositaccounts` | `recurringdeposits` | | `loanrepayments` | `loantransactions` | | `recurringdeposittransactions` | `recurringdepositstransactions` | `clients` is the initial selection, so `GET /imports` 404s on first load of the screen. The error goes only to `console.error`. **Steps:** `/system/bulk-import` → the network tab shows a 404 before anything is clicked. ## 5. Buy-down fees and capitalized income are permanently empty on any loan without an external id Both tabs are shown when the product's `enableBuyDownFee` / `enableIncomeCapitalization` flag is set, but both fetched through the `/loans/external-id/{externalId}/…` endpoints and bailed out when the loan had no external id. External ids are optional, so on an ordinary loan the tab appears and stays empty forever, with the error swallowed. There is a unit test asserting this behaviour (`still skips the request when the loan has no external id to fetch by`), so it was encoded as intended rather than found. Both should address the loan by id — `GET /loans/{loanId}/buydown-fees` and `GET /loans/{loanId}/capitalized-incomes` exist. ## 6. The reschedule work queue opens the wrong record Rows in the reschedule queue carry the reschedule **request** id, which is what the batch approve/reject command needs. `openRecord` navigated to `/loans/view/{that id}`, so clicking a row opens an unrelated loan, or a "not found", depending on what happens to hold that id. The row needs to carry `loanId` for navigation while the command keeps using the request id. ## 7. Every `.form-grid` collapses to a single 4px column at 320px `.form-grid` is `grid-template-columns: repeat(2, 1fr)` in `src/styles/_common.scss` and in 32 feature components. `1fr` is `minmax(auto, 1fr)`, so a column cannot narrow past its own content: the column holding the widest control keeps its intrinsic width and the other one collapses to whatever is left. At 320px — the minimum `scripts/check-responsive.mjs` declares — measured: - **Create GL Account**: GL Code and Account Usage render **4px** wide - **Create Loan**: the right-hand column extends **52px** past its card and 16px past the viewport Neither moves `document.documentElement.scrollWidth`, so `check-responsive.mjs` and every page-overflow assertion pass while the form is unusable. It needs a measurement of the fields themselves. `.full-width` is `grid-column: span 2`, which conjures a second column back once the grid has collapsed to one. `repeat(auto-fit, minmax(min(240px, 100%), 1fr))` and `grid-column: 1 / -1` fix both without pinning a column count. ## Also, two things that are missing rather than broken **Holidays cannot be edited or deleted.** `PUT` and `DELETE /holidays/{id}` both exist and the platform accepts them while the holiday is pending activation. The list offers only Activate, so a holiday entered with the wrong dates is permanent — and holidays move repayment dates for every loan in the office. **Selecting a loan product does not fill the terms it defines.** `GET /loanproducts/{id}` is already fetched on selection, and its response is used only for the schedule-type chip. Principal, term, number of repayments, repayment frequency, interest rate, interest type and amortization all stay empty, so the officer retypes the product's own defaults by hand on every application — and any value they mistype is accepted. ## Environment - Backend: local docker stack (`deploy/docker-compose-e2e.yml`), Fineract `develop` - Browser: Chromium via Playwright, plus manual confirmation - Each defect above was reproduced against the real backend, not a mock ## Related #620 is item 8 of the same audit, already filed. -- 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]
