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]

Reply via email to