Dhanno98 opened a new pull request, #5940: URL: https://github.com/apache/fineract/pull/5940
## Description ## FINERACT-2284: Enforce charge rounding using Money rounding rules This PR fixes charge amount handling across Fineract by ensuring that charge values are rounded using the application's configured currency rules before they are persisted or processed. Previously, several charge flows stored or processed raw `BigDecimal` values directly. As a result, charge amounts could bypass currency rounding settings such as: * `digitsAfterDecimal` * `inMultiplesOf` This led to inconsistent behavior between charge calculations and other monetary operations that already rely on `Money`. This PR standardizes charge amount handling by using `Money` for charge rounding across all supported charge types: * Loan Charges * Savings Account Charges * Share Account Charges * Client Charges In addition, if a charge amount rounds to zero after applying currency rules, the charge is no longer persisted or created. ## Functional Changes ### Loan Charges * Applied currency rounding when enforcing minimum and maximum charge caps. * Ensured installment fee calculations and charge updates persist rounded values. * Prevented zero-value loan charges from being persisted. * Prevented creation of zero-value tranche disbursement charges. ### Savings Account Charges * Applied currency rounding through `Money`. * Prevented persistence of flat charges whose final rounded value is zero. ### Share Account Charges * Applied currency rounding when deriving charge amounts. * Applied currency rounding when updating charge amounts for additional share transactions. * Prevented creation of charge transactions for charges whose rounded value is zero. * Prevented zero-value activation, purchase, and redemption charge transactions from being generated. ### Client Charges * Applied currency rounding before charge creation. * Prevented persistence of client charges whose rounded value becomes zero after rounding. ## API Documentation Updated Swagger/OpenAPI schemas where required to improve request model documentation and examples. ## Why This Change Fineract already provides currency-specific monetary rules through `Money`, including support for: * Currency precision (`digitsAfterDecimal`) * Rounding increments (`inMultiplesOf`) Charges should follow the same monetary rules as all other financial amounts. By enforcing rounding consistently: * Charge calculations become predictable. * Persisted charge values match configured currency behavior. * Zero-value charges generated by rounding are avoided. * Charge processing remains consistent across all portfolio modules. ## Test Coverage Added integration test coverage for all supported charge types: * `LoanChargeRoundingTest` * `SavingsAccountChargeRoundingTest` * `ShareAccountChargeRoundingTest` * `ClientChargeRoundingTest` The tests verify: * Charge amounts respect configured currency rounding rules. * `inMultiplesOf` and `digitsAfterDecimal` rounding is enforced. * Rounded values are persisted correctly. * Charges that round to zero are not created or persisted. ## Verification Executed the complete charge rounding integration test suite successfully. **Result:** 44/44 tests passing. ## Checklist Please make sure these boxes are checked before submitting your pull request - thanks! - [ ] Write the commit message as per [our guidelines](https://github.com/apache/fineract/blob/develop/CONTRIBUTING.md#pull-requests) - [ ] Acknowledge that we will not review PRs that are not passing the build _("green")_ - it is your responsibility to get a proposed PR to pass the build, not primarily the project's maintainers. - [ ] Create/update [unit or integration tests](https://fineract.apache.org/docs/current/#_testing) for verifying the changes made. - [ ] Follow our [coding conventions](https://cwiki.apache.org/confluence/display/FINERACT/Coding+Conventions). - [ ] Add required Swagger annotation and update API documentation at fineract-provider/src/main/resources/static/legacy-docs/apiLive.htm with details of any API changes - [ ] [This PR must not be a "code dump"](https://cwiki.apache.org/confluence/display/FINERACT/Pull+Request+Size+Limit). Large changes can be made in a branch, with assistance. Ask for help on the [developer mailing list](https://fineract.apache.org/#contribute). Your assigned reviewer(s) will follow our [guidelines for code reviews](https://cwiki.apache.org/confluence/display/FINERACT/Code+Review+Guide). -- 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]
