static BigDecimal chargeAmountPerPeriod()

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);
  }