Foo Developer created FINERACT-2996:
---------------------------------------

             Summary: Percentage specified-due-date loan charge ignores its 
min/max cap in the repayment schedule
                 Key: FINERACT-2996
                 URL: https://issues.apache.org/jira/browse/FINERACT-2996
             Project: Apache Fineract
          Issue Type: Bug
          Components: Loan
            Reporter: Foo Developer
            Assignee: Foo Developer


h3. Summary

A loan charge calculated as a percentage, with a specified due date and a 
minimum/maximum cap, is capped correctly on the charge itself, but the 
repayment schedule puts the uncapped percentage on the installment that holds 
the due date. The loan summary's fees charged is overstated by the difference. 
A repayment then allocates the excess to the loan's other fee charges.

h3. Steps to reproduce
# Create a loan charge: charge applies to Loan, charge time type "Specified due 
date", charge calculation "% Amount", amount {{10}}, minimum cap {{50}}, 
maximum cap {{200}}.
# Create two flat "Installment Fee" loan charges, for example {{36}} and {{57}}.
# Create a loan of {{10000}} with 12 monthly installments (cumulative schedule, 
{{mifos-standard-strategy}}) carrying all three charges, with the 
specified-due-date charge due on the disbursement date. Approve and disburse it.
# {{GET /loans/{loanId}?associations=repaymentSchedule,charges}}
# Make a repayment equal to installment 1's total due.

h3. Expected
* The specified-due-date charge's {{amount}} is {{200}} (10% of 10000 = 1000, 
capped at 200).
* Installment 1 {{feeChargesDue}} is {{293}} (200 + 36 + 57).
* {{summary.feeChargesCharged}} includes {{200}} for this charge.

h3. Actual
* The charge's {{amount}} is {{200}} (correct).
* Installment 1 {{feeChargesDue}} is {{1093}}: the schedule uses the uncapped 
{{1000}}.
* {{summary.feeChargesCharged}} is {{800}} too high.
* On the repayment, the fee portion is {{1093}}. The specified-due-date charge 
is paid {{200}} and the remaining {{800}} is spent on the installment-fee 
charges, so the fees of later installments look already collected while those 
installments still show them as due.

h3. Root cause

The charge's own amount is capped at creation 
({{LoanCharge.minimumAndMaximumCap}}). The schedule code recomputes the 
period's charge as {{base × percentage / 100}}, where the base can differ from 
creation time (for example the amount disbursed by the due date on a 
multi-disbursement loan), and never applies the same cap. There are four places:
* 
{{AbstractCumulativeLoanScheduleGenerator.calculateSpecificDueDateChargeWithPercentage}}
 (schedule generation, cumulative)
* 
{{ProgressiveLoanScheduleGenerator.calculateSpecificDueDateChargeWithPercentage}}
 (schedule generation, progressive)
* {{LoanRepaymentScheduleProcessingWrapper.cumulativeFeeChargesDueWithin}} / 
{{cumulativePenaltyChargesDueWithin}} (reprocessing all charges, e.g. on a 
repayment)
* {{SingleLoanChargeRepaymentScheduleProcessingWrapper.calcChargeDue}} 
(reprocessing one charge, e.g. when a charge is added)

h3. Proposed fix

Pass each of the four calculated amounts through 
{{loanCharge.minimumAndMaximumCap(...)}}, so the installment carries the same 
amount as the charge. Flat charges, overdue charges and installment fees take 
other branches and are unchanged.

Tests: two unit tests in 
{{SingleLoanChargeRepaymentScheduleProcessingWrapperTest}} for a percentage 
specified-due-date charge, one capped at the maximum and one raised to the 
minimum. Both fail on the current code.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to