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]

Reply via email to