in service/src/main/java/org/apache/fineract/cn/individuallending/internal/service/costcomponent/PeriodChargeCalculator.java [72:109]
static BigDecimal chargeAmountPerPeriod(
final ScheduledCharge scheduledCharge,
final BigDecimal amountInPercentagePoints,
final int precision)
{
final BigDecimal amountAsFraction = amountInPercentagePoints.divide(BigDecimal.valueOf(100), 4, BigDecimal.ROUND_HALF_EVEN);
final ChargeDefinition chargeDefinition = scheduledCharge.getChargeDefinition();
final ScheduledAction scheduledAction = scheduledCharge.getScheduledAction();
if (chargeDefinition.getForCycleSizeUnit() == null)
return amountAsFraction;
final BigDecimal actionPeriodDuration
= BigDecimal.valueOf(
scheduledAction.getActionPeriod()
.getDuration()
.getSeconds());
final Optional<BigDecimal> accrualPeriodDuration = Optional.ofNullable(chargeDefinition.getAccrueAction())
.flatMap(action -> ScheduledActionHelpers.getAccrualPeriodDurationForAction(Action.valueOf(action)))
.map(Duration::getSeconds)
.map(BigDecimal::valueOf);
final BigDecimal chargeDefinitionCycleSizeUnitDuration
= BigDecimal.valueOf(
Optional.ofNullable(chargeDefinition.getForCycleSizeUnit())
.orElse(ChronoUnit.YEARS)
.getDuration()
.getSeconds());
final BigDecimal accrualPeriodsInCycle = chargeDefinitionCycleSizeUnitDuration.divide(
accrualPeriodDuration.orElse(actionPeriodDuration), precision, BigDecimal.ROUND_HALF_EVEN);
final int accrualPeriodsInActionPeriod = actionPeriodDuration.divide(
accrualPeriodDuration.orElse(actionPeriodDuration), precision, BigDecimal.ROUND_HALF_EVEN)
.intValueExact();
final BigDecimal rateForAccrualPeriod = amountAsFraction.divide(
accrualPeriodsInCycle, precision, BigDecimal.ROUND_HALF_EVEN);
return createCompoundedRate(rateForAccrualPeriod, accrualPeriodsInActionPeriod, precision);
}