@Override
  public Collection<EnumOptionData> retrievewithdrawalFeeTypeOptions() {
    List<EnumOptionData> allowedOptions =
        Arrays.asList( //
            SavingsEnumerations.withdrawalFeeType(SavingsWithdrawalFeesType.FLAT), //
            SavingsEnumerations.withdrawalFeeType(SavingsWithdrawalFeesType.PERCENT_OF_AMOUNT) //
            );

    return allowedOptions;
  }
  @Override
  public Collection<EnumOptionData> retrieveInterestCalculationDaysInYearTypeOptions() {
    List<EnumOptionData> allowedOptions =
        Arrays.asList( //
            SavingsEnumerations.interestCalculationDaysInYearType(
                SavingsInterestCalculationDaysInYearType.DAYS_360), //
            SavingsEnumerations.interestCalculationDaysInYearType(
                SavingsInterestCalculationDaysInYearType.DAYS_365) //
            );

    return allowedOptions;
  }
  @Override
  public Collection<EnumOptionData> retrieveInterestCalculationTypeOptions() {
    List<EnumOptionData> allowedOptions =
        Arrays.asList( //
            SavingsEnumerations.interestCalculationType(
                SavingsInterestCalculationType.DAILY_BALANCE), //
            SavingsEnumerations.interestCalculationType(
                SavingsInterestCalculationType.AVERAGE_DAILY_BALANCE) //
            );

    return allowedOptions;
  }
  @Override
  public List<EnumOptionData> retrieveLockinPeriodFrequencyTypeOptions() {
    List<EnumOptionData> allowedLockinPeriodFrequencyTypeOptions =
        Arrays.asList( //
            SavingsEnumerations.lockinPeriodFrequencyType(SavingsPeriodFrequencyType.DAYS), //
            SavingsEnumerations.lockinPeriodFrequencyType(SavingsPeriodFrequencyType.WEEKS), //
            SavingsEnumerations.lockinPeriodFrequencyType(SavingsPeriodFrequencyType.MONTHS), //
            SavingsEnumerations.lockinPeriodFrequencyType(SavingsPeriodFrequencyType.YEARS) //
            );

    return allowedLockinPeriodFrequencyTypeOptions;
  }
  @Override
  public Collection<EnumOptionData> retrieveInterestPostingPeriodTypeOptions() {
    List<EnumOptionData> allowedOptions =
        Arrays.asList( //
            SavingsEnumerations.interestPostingPeriodType(
                SavingsPostingInterestPeriodType.MONTHLY), //
            SavingsEnumerations.interestPostingPeriodType(
                SavingsPostingInterestPeriodType.QUATERLY), //
            SavingsEnumerations.interestPostingPeriodType(
                SavingsPostingInterestPeriodType.ANNUAL) //
            );

    return allowedOptions;
  }
  @Override
  public Collection<EnumOptionData> retrieveCompoundingInterestPeriodTypeOptions() {
    List<EnumOptionData> allowedOptions =
        Arrays.asList( //
            SavingsEnumerations.compoundingInterestPeriodType(
                SavingsCompoundingInterestPeriodType.DAILY), //
            //
            // SavingsEnumerations.compoundingInterestPeriodType(SavingsCompoundingInterestPeriodType.WEEKLY), //
            //
            // SavingsEnumerations.compoundingInterestPeriodType(SavingsCompoundingInterestPeriodType.BIWEEKLY), //
            SavingsEnumerations.compoundingInterestPeriodType(
                SavingsCompoundingInterestPeriodType.MONTHLY)
            //
            // SavingsEnumerations.compoundingInterestPeriodType(SavingsCompoundingInterestPeriodType.QUATERLY), //
            //
            // SavingsEnumerations.compoundingInterestPeriodType(SavingsCompoundingInterestPeriodType.BI_ANNUAL), //
            //
            // SavingsEnumerations.compoundingInterestPeriodType(SavingsCompoundingInterestPeriodType.ANNUAL), //
            //
            // SavingsEnumerations.compoundingInterestPeriodType(SavingsCompoundingInterestPeriodType.NO_COMPOUNDING_SIMPLE_INTEREST) //
            );

    return allowedOptions;
  }
    @Override
    public SavingsProductData mapRow(
        final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException {

      final Long id = rs.getLong("id");
      final String name = rs.getString("name");
      final String shortName = rs.getString("shortName");
      final String description = rs.getString("description");

      final String currencyCode = rs.getString("currencyCode");
      final String currencyName = rs.getString("currencyName");
      final String currencyNameCode = rs.getString("currencyNameCode");
      final String currencyDisplaySymbol = rs.getString("currencyDisplaySymbol");
      final Integer currencyDigits = JdbcSupport.getInteger(rs, "currencyDigits");
      final Integer inMultiplesOf = JdbcSupport.getInteger(rs, "inMultiplesOf");
      final CurrencyData currency =
          new CurrencyData(
              currencyCode,
              currencyName,
              currencyDigits,
              inMultiplesOf,
              currencyDisplaySymbol,
              currencyNameCode);
      final BigDecimal nominalAnnualInterestRate = rs.getBigDecimal("nominalAnnualInterestRate");

      final Integer compoundingInterestPeriodTypeValue =
          JdbcSupport.getInteger(rs, "compoundingInterestPeriodType");
      final EnumOptionData compoundingInterestPeriodType =
          SavingsEnumerations.compoundingInterestPeriodType(compoundingInterestPeriodTypeValue);

      final Integer interestPostingPeriodTypeValue =
          JdbcSupport.getInteger(rs, "interestPostingPeriodType");
      final EnumOptionData interestPostingPeriodType =
          SavingsEnumerations.interestPostingPeriodType(interestPostingPeriodTypeValue);

      final Integer interestCalculationTypeValue =
          JdbcSupport.getInteger(rs, "interestCalculationType");
      final EnumOptionData interestCalculationType =
          SavingsEnumerations.interestCalculationType(interestCalculationTypeValue);

      EnumOptionData interestCalculationDaysInYearType = null;
      final Integer interestCalculationDaysInYearTypeValue =
          JdbcSupport.getInteger(rs, "interestCalculationDaysInYearType");
      if (interestCalculationDaysInYearTypeValue != null) {
        interestCalculationDaysInYearType =
            SavingsEnumerations.interestCalculationDaysInYearType(
                interestCalculationDaysInYearTypeValue);
      }

      final Integer accountingRuleId = JdbcSupport.getInteger(rs, "accountingType");
      final EnumOptionData accountingRuleType =
          AccountingEnumerations.accountingRuleType(accountingRuleId);

      final BigDecimal minRequiredOpeningBalance = rs.getBigDecimal("minRequiredOpeningBalance");

      final Integer lockinPeriodFrequency = JdbcSupport.getInteger(rs, "lockinPeriodFrequency");
      EnumOptionData lockinPeriodFrequencyType = null;
      final Integer lockinPeriodFrequencyTypeValue =
          JdbcSupport.getInteger(rs, "lockinPeriodFrequencyType");
      if (lockinPeriodFrequencyTypeValue != null) {
        lockinPeriodFrequencyType =
            SavingsEnumerations.lockinPeriodFrequencyType(lockinPeriodFrequencyTypeValue);
      }

      final boolean withdrawalFeeForTransfers = rs.getBoolean("withdrawalFeeForTransfers");
      final boolean allowOverdraft = rs.getBoolean("allowOverdraft");
      final BigDecimal overdraftLimit = rs.getBigDecimal("overdraftLimit");
      return SavingsProductData.instance(
          id,
          name,
          shortName,
          description,
          currency,
          nominalAnnualInterestRate,
          compoundingInterestPeriodType,
          interestPostingPeriodType,
          interestCalculationType,
          interestCalculationDaysInYearType,
          minRequiredOpeningBalance,
          lockinPeriodFrequency,
          lockinPeriodFrequencyType,
          withdrawalFeeForTransfers,
          accountingRuleType,
          allowOverdraft,
          overdraftLimit);
    }
    @Override
    public RecurringDepositProductData mapRow(
        final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException {

      final DepositProductData depositProductData = super.mapRow(rs);

      final boolean interestFreePeriodApplicable = rs.getBoolean("interestFreePeriodApplicable");
      final Integer interestFreeFromPeriod = JdbcSupport.getInteger(rs, "interestFreeFromPeriod");
      final Integer interestFreeToPeriod = JdbcSupport.getInteger(rs, "interestFreeToPeriod");
      final Integer periodFrequencyTypeId =
          JdbcSupport.getInteger(rs, "interestFreePeriodFrequencyId");
      final EnumOptionData interestFreePeriodFrequencyType =
          (periodFrequencyTypeId == null)
              ? null
              : InterestRateChartEnumerations.periodType(periodFrequencyTypeId);
      final boolean preClosurePenalApplicable = rs.getBoolean("preClosurePenalApplicable");
      final BigDecimal preClosurePenalInterest =
          JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "preClosurePenalInterest");
      final Integer preClosurePenalInterestOnTypeId =
          JdbcSupport.getInteger(rs, "preClosurePenalInterestOnId");
      final EnumOptionData preClosurePenalInterestOnType =
          (preClosurePenalInterestOnTypeId == null)
              ? null
              : SavingsEnumerations.preClosurePenaltyInterestOnType(
                  preClosurePenalInterestOnTypeId);
      final Integer recurringDepositTypeId = JdbcSupport.getInteger(rs, "recurringDepositTypeId");
      final EnumOptionData recurringDepositType =
          (recurringDepositTypeId == null)
              ? null
              : SavingsEnumerations.recurringDepositType(recurringDepositTypeId);
      final Integer recurringDepositFrequency =
          JdbcSupport.getInteger(rs, "recurringDepositFrequency");
      final Integer recurringDepositFrequencyTypeId =
          JdbcSupport.getInteger(rs, "recurringDepositFrequencyTypeId");
      final BigDecimal minDepositAmount =
          JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "minDepositAmount");
      final BigDecimal depositAmount =
          JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "depositAmount");
      final BigDecimal maxDepositAmount =
          JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "maxDepositAmount");
      final EnumOptionData recurringDepositFrequencyType =
          (recurringDepositFrequencyTypeId == null)
              ? null
              : SavingsEnumerations.recurringDepositFrequencyType(recurringDepositFrequencyTypeId);

      final Integer minDepositTerm = JdbcSupport.getInteger(rs, "minDepositTerm");
      final Integer maxDepositTerm = JdbcSupport.getInteger(rs, "maxDepositTerm");
      final Integer minDepositTermTypeId = JdbcSupport.getInteger(rs, "minDepositTermTypeId");
      final EnumOptionData minDepositTermType =
          (minDepositTermTypeId == null)
              ? null
              : SavingsEnumerations.depositTermFrequencyType(minDepositTermTypeId);
      final Integer maxDepositTermTypeId = JdbcSupport.getInteger(rs, "maxDepositTermTypeId");
      final EnumOptionData maxDepositTermType =
          (maxDepositTermTypeId == null)
              ? null
              : SavingsEnumerations.depositTermFrequencyType(maxDepositTermTypeId);
      final Integer inMultiplesOfDepositTerm =
          JdbcSupport.getInteger(rs, "inMultiplesOfDepositTerm");
      final Integer inMultiplesOfDepositTermTypeId =
          JdbcSupport.getInteger(rs, "inMultiplesOfDepositTermTypeId");
      final EnumOptionData inMultiplesOfDepositTermType =
          (inMultiplesOfDepositTermTypeId == null)
              ? null
              : SavingsEnumerations.depositTermFrequencyType(inMultiplesOfDepositTermTypeId);

      return RecurringDepositProductData.instance(
          depositProductData,
          interestFreePeriodApplicable,
          interestFreeFromPeriod,
          interestFreeToPeriod,
          interestFreePeriodFrequencyType,
          preClosurePenalApplicable,
          preClosurePenalInterest,
          preClosurePenalInterestOnType,
          minDepositTerm,
          maxDepositTerm,
          minDepositTermType,
          maxDepositTermType,
          inMultiplesOfDepositTerm,
          inMultiplesOfDepositTermType,
          recurringDepositType,
          recurringDepositFrequency,
          recurringDepositFrequencyType,
          minDepositAmount,
          depositAmount,
          maxDepositAmount);
    }
    public DepositProductData mapRow(final ResultSet rs) throws SQLException {

      final Long id = rs.getLong("id");
      final String name = rs.getString("name");
      final String shortName = rs.getString("shortName");
      final String description = rs.getString("description");

      final String currencyCode = rs.getString("currencyCode");
      final String currencyName = rs.getString("currencyName");
      final String currencyNameCode = rs.getString("currencyNameCode");
      final String currencyDisplaySymbol = rs.getString("currencyDisplaySymbol");
      final Integer currencyDigits = JdbcSupport.getInteger(rs, "currencyDigits");
      final Integer inMultiplesOf = JdbcSupport.getInteger(rs, "inMultiplesOf");
      final CurrencyData currency =
          new CurrencyData(
              currencyCode,
              currencyName,
              currencyDigits,
              inMultiplesOf,
              currencyDisplaySymbol,
              currencyNameCode);
      final BigDecimal nominalAnnualInterestRate = rs.getBigDecimal("nominalAnnualInterestRate");

      final Integer compoundingInterestPeriodTypeValue =
          JdbcSupport.getInteger(rs, "compoundingInterestPeriodType");
      final EnumOptionData compoundingInterestPeriodType =
          SavingsEnumerations.compoundingInterestPeriodType(compoundingInterestPeriodTypeValue);

      final Integer interestPostingPeriodTypeValue =
          JdbcSupport.getInteger(rs, "interestPostingPeriodType");
      final EnumOptionData interestPostingPeriodType =
          SavingsEnumerations.interestPostingPeriodType(interestPostingPeriodTypeValue);

      final Integer interestCalculationTypeValue =
          JdbcSupport.getInteger(rs, "interestCalculationType");
      final EnumOptionData interestCalculationType =
          SavingsEnumerations.interestCalculationType(interestCalculationTypeValue);

      EnumOptionData interestCalculationDaysInYearType = null;
      final Integer interestCalculationDaysInYearTypeValue =
          JdbcSupport.getInteger(rs, "interestCalculationDaysInYearType");
      if (interestCalculationDaysInYearTypeValue != null) {
        interestCalculationDaysInYearType =
            SavingsEnumerations.interestCalculationDaysInYearType(
                interestCalculationDaysInYearTypeValue);
      }

      final Integer accountingRuleId = JdbcSupport.getInteger(rs, "accountingType");
      final EnumOptionData accountingRuleType =
          AccountingEnumerations.accountingRuleType(accountingRuleId);

      final Integer lockinPeriodFrequency = JdbcSupport.getInteger(rs, "lockinPeriodFrequency");
      EnumOptionData lockinPeriodFrequencyType = null;
      final Integer lockinPeriodFrequencyTypeValue =
          JdbcSupport.getInteger(rs, "lockinPeriodFrequencyType");
      if (lockinPeriodFrequencyTypeValue != null) {
        lockinPeriodFrequencyType =
            SavingsEnumerations.lockinPeriodFrequencyType(lockinPeriodFrequencyTypeValue);
      }

      return DepositProductData.instance(
          id,
          name,
          shortName,
          description,
          currency,
          nominalAnnualInterestRate,
          compoundingInterestPeriodType,
          interestPostingPeriodType,
          interestCalculationType,
          interestCalculationDaysInYearType,
          lockinPeriodFrequency,
          lockinPeriodFrequencyType,
          accountingRuleType);
    }