@Override
    public SavingsAccountChargeData mapRow(
        final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException {

      final Long id = rs.getLong("id");
      final Long chargeId = rs.getLong("chargeId");
      final Long accountId = rs.getLong("accountId");
      final String name = rs.getString("name");
      final BigDecimal amount = rs.getBigDecimal("amountDue");
      final BigDecimal amountPaid = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "amountPaid");
      final BigDecimal amountWaived =
          JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "amountWaived");
      final BigDecimal amountWrittenOff =
          JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "amountWrittenOff");
      final BigDecimal amountOutstanding = rs.getBigDecimal("amountOutstanding");

      final BigDecimal percentageOf =
          JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "percentageOf");
      final BigDecimal amountPercentageAppliedTo =
          JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "amountPercentageAppliedTo");

      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 currencyDecimalPlaces = JdbcSupport.getInteger(rs, "currencyDecimalPlaces");
      final Integer inMultiplesOf = JdbcSupport.getInteger(rs, "inMultiplesOf");

      final CurrencyData currency =
          new CurrencyData(
              currencyCode,
              currencyName,
              currencyDecimalPlaces,
              inMultiplesOf,
              currencyDisplaySymbol,
              currencyNameCode);

      final int chargeTime = rs.getInt("chargeTime");
      final EnumOptionData chargeTimeType = ChargeEnumerations.chargeTimeType(chargeTime);

      final LocalDate dueAsOfDate = JdbcSupport.getLocalDate(rs, "dueAsOfDate");
      final Integer feeInterval = JdbcSupport.getInteger(rs, "feeInterval");
      MonthDay feeOnMonthDay = null;
      final Integer feeOnMonth = JdbcSupport.getInteger(rs, "feeOnMonth");
      final Integer feeOnDay = JdbcSupport.getInteger(rs, "feeOnDay");
      if (feeOnDay != null) {
        feeOnMonthDay = new MonthDay(feeOnMonth, feeOnDay);
      }

      final int chargeCalculation = rs.getInt("chargeCalculation");
      final EnumOptionData chargeCalculationType =
          ChargeEnumerations.chargeCalculationType(chargeCalculation);
      final boolean penalty = rs.getBoolean("penalty");

      final Collection<ChargeData> chargeOptions = null;

      return SavingsAccountChargeData.instance(
          id,
          chargeId,
          accountId,
          name,
          currency,
          amount,
          amountPaid,
          amountWaived,
          amountWrittenOff,
          amountOutstanding,
          chargeTimeType,
          dueAsOfDate,
          chargeCalculationType,
          percentageOf,
          amountPercentageAppliedTo,
          chargeOptions,
          penalty,
          feeOnMonthDay,
          feeInterval);
    }
    @Override
    public AccountTransferData mapRow(
        final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException {

      final Long id = rs.getLong("id");
      final boolean reversed = rs.getBoolean("isReversed");

      final LocalDate transferDate = JdbcSupport.getLocalDate(rs, "transferDate");
      final BigDecimal transferAmount =
          JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "transferAmount");
      final String transferDescription = rs.getString("transferDescription");

      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 Long fromOfficeId = JdbcSupport.getLong(rs, "fromOfficeId");
      final String fromOfficeName = rs.getString("fromOfficeName");
      final OfficeData fromOffice = OfficeData.dropdown(fromOfficeId, fromOfficeName, null);

      final Long toOfficeId = JdbcSupport.getLong(rs, "toOfficeId");
      final String toOfficeName = rs.getString("toOfficeName");
      final OfficeData toOffice = OfficeData.dropdown(toOfficeId, toOfficeName, null);

      final Long fromClientId = JdbcSupport.getLong(rs, "fromClientId");
      final String fromClientName = rs.getString("fromClientName");
      final ClientData fromClient =
          ClientData.lookup(fromClientId, fromClientName, fromOfficeId, fromOfficeName);

      final Long toClientId = JdbcSupport.getLong(rs, "toClientId");
      final String toClientName = rs.getString("toClientName");
      final ClientData toClient =
          ClientData.lookup(toClientId, toClientName, toOfficeId, toOfficeName);

      final Long fromSavingsAccountId = JdbcSupport.getLong(rs, "fromSavingsAccountId");
      final String fromSavingsAccountNo = rs.getString("fromSavingsAccountNo");
      final Long fromLoanAccountId = JdbcSupport.getLong(rs, "fromLoanAccountId");
      final String fromLoanAccountNo = rs.getString("fromLoanAccountNo");
      PortfolioAccountData fromAccount = null;
      EnumOptionData fromAccountType = null;
      if (fromSavingsAccountId != null) {
        fromAccount = PortfolioAccountData.lookup(fromSavingsAccountId, fromSavingsAccountNo);
        fromAccountType = AccountTransferEnumerations.accountType(PortfolioAccountType.SAVINGS);
      } else if (fromLoanAccountId != null) {
        fromAccount = PortfolioAccountData.lookup(fromLoanAccountId, fromLoanAccountNo);
        fromAccountType = AccountTransferEnumerations.accountType(PortfolioAccountType.LOAN);
      }

      PortfolioAccountData toAccount = null;
      EnumOptionData toAccountType = null;
      final Long toSavingsAccountId = JdbcSupport.getLong(rs, "toSavingsAccountId");
      final String toSavingsAccountNo = rs.getString("toSavingsAccountNo");
      final Long toLoanAccountId = JdbcSupport.getLong(rs, "toLoanAccountId");
      final String toLoanAccountNo = rs.getString("toLoanAccountNo");

      if (toSavingsAccountId != null) {
        toAccount = PortfolioAccountData.lookup(toSavingsAccountId, toSavingsAccountNo);
        toAccountType = AccountTransferEnumerations.accountType(PortfolioAccountType.SAVINGS);
      } else if (toLoanAccountId != null) {
        toAccount = PortfolioAccountData.lookup(toLoanAccountId, toLoanAccountNo);
        toAccountType = AccountTransferEnumerations.accountType(PortfolioAccountType.LOAN);
      }

      return AccountTransferData.instance(
          id,
          reversed,
          transferDate,
          currency,
          transferAmount,
          transferDescription,
          fromOffice,
          toOffice,
          fromClient,
          toClient,
          fromAccountType,
          fromAccount,
          toAccountType,
          toAccount);
    }