blob: fbc80a24ff660a0ef5da0bad0d14dbb8d9651660 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.fineract.portfolio.interestratechart.service;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.fineract.infrastructure.codes.data.CodeValueData;
import org.apache.fineract.infrastructure.codes.service.CodeValueReadPlatformService;
import org.apache.fineract.infrastructure.core.data.EnumOptionData;
import org.apache.fineract.infrastructure.core.domain.JdbcSupport;
import org.apache.fineract.infrastructure.core.service.RoutingDataSource;
import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
import org.apache.fineract.organisation.monetary.data.CurrencyData;
import org.apache.fineract.portfolio.client.api.ClientApiConstants;
import org.apache.fineract.portfolio.common.service.CommonEnumerations;
import org.apache.fineract.portfolio.interestratechart.data.InterestIncentiveData;
import org.apache.fineract.portfolio.interestratechart.data.InterestRateChartSlabData;
import org.apache.fineract.portfolio.interestratechart.exception.InterestRateChartSlabNotFoundException;
import org.apache.fineract.portfolio.interestratechart.incentive.InterestIncentiveAttributeName;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Service;
@Service
public class InterestRateChartSlabReadPlatformServiceImpl implements InterestRateChartSlabReadPlatformService {
private final PlatformSecurityContext context;
private final JdbcTemplate jdbcTemplate;
private final InterestRateChartSlabExtractor chartSlabExtractor = new InterestRateChartSlabExtractor();
private final InterestRateChartDropdownReadPlatformService chartDropdownReadPlatformService;
private final InterestIncentiveDropdownReadPlatformService interestIncentiveDropdownReadPlatformService;
private final CodeValueReadPlatformService codeValueReadPlatformService;
@Autowired
public InterestRateChartSlabReadPlatformServiceImpl(PlatformSecurityContext context, final RoutingDataSource dataSource,
InterestRateChartDropdownReadPlatformService chartDropdownReadPlatformService,
final InterestIncentiveDropdownReadPlatformService interestIncentiveDropdownReadPlatformService,
final CodeValueReadPlatformService codeValueReadPlatformService) {
this.context = context;
this.jdbcTemplate = new JdbcTemplate(dataSource);
this.chartDropdownReadPlatformService = chartDropdownReadPlatformService;
this.interestIncentiveDropdownReadPlatformService = interestIncentiveDropdownReadPlatformService;
this.codeValueReadPlatformService = codeValueReadPlatformService;
}
@Override
public Collection<InterestRateChartSlabData> retrieveAll(Long chartId) {
this.context.authenticatedUser();
final String sql = "select " + this.chartSlabExtractor.schema() + " where ircd.interest_rate_chart_id = ? order by ircd.id";
return this.jdbcTemplate.query(sql, this.chartSlabExtractor, new Object[] { chartId });
}
@Override
public InterestRateChartSlabData retrieveOne(Long chartId, Long chartSlabId) {
this.context.authenticatedUser();
final String sql = "select " + this.chartSlabExtractor.schema() + " where irc.id = ? order by ircd.id asc";
Collection<InterestRateChartSlabData> chartDatas = this.jdbcTemplate.query(sql, this.chartSlabExtractor, new Object[] {
chartSlabId, chartId });
if (chartDatas == null || chartDatas.isEmpty()) { throw new InterestRateChartSlabNotFoundException(chartSlabId, chartId); }
return chartDatas.iterator().next();
}
@Override
public InterestRateChartSlabData retrieveWithTemplate(InterestRateChartSlabData chartSlab) {
final List<CodeValueData> genderOptions = new ArrayList<>(
this.codeValueReadPlatformService.retrieveCodeValuesByCode(ClientApiConstants.GENDER));
final List<CodeValueData> clientTypeOptions = new ArrayList<>(
this.codeValueReadPlatformService.retrieveCodeValuesByCode(ClientApiConstants.CLIENT_TYPE));
final List<CodeValueData> clientClassificationOptions = new ArrayList<>(
this.codeValueReadPlatformService.retrieveCodeValuesByCode(ClientApiConstants.CLIENT_CLASSIFICATION));
return InterestRateChartSlabData.withTemplate(chartSlab, this.chartDropdownReadPlatformService.retrievePeriodTypeOptions(),
this.interestIncentiveDropdownReadPlatformService.retrieveEntityTypeOptions(),
this.interestIncentiveDropdownReadPlatformService.retrieveAttributeNameOptions(),
this.interestIncentiveDropdownReadPlatformService.retrieveConditionTypeOptions(),
this.interestIncentiveDropdownReadPlatformService.retrieveIncentiveTypeOptions(), genderOptions, clientTypeOptions,
clientClassificationOptions);
}
@Override
public InterestRateChartSlabData retrieveTemplate() {
final List<CodeValueData> genderOptions = new ArrayList<>(
this.codeValueReadPlatformService.retrieveCodeValuesByCode(ClientApiConstants.GENDER));
final List<CodeValueData> clientTypeOptions = new ArrayList<>(
this.codeValueReadPlatformService.retrieveCodeValuesByCode(ClientApiConstants.CLIENT_TYPE));
final List<CodeValueData> clientClassificationOptions = new ArrayList<>(
this.codeValueReadPlatformService.retrieveCodeValuesByCode(ClientApiConstants.CLIENT_CLASSIFICATION));
return InterestRateChartSlabData.template(this.chartDropdownReadPlatformService.retrievePeriodTypeOptions(),
this.interestIncentiveDropdownReadPlatformService.retrieveEntityTypeOptions(),
this.interestIncentiveDropdownReadPlatformService.retrieveAttributeNameOptions(),
this.interestIncentiveDropdownReadPlatformService.retrieveConditionTypeOptions(),
this.interestIncentiveDropdownReadPlatformService.retrieveIncentiveTypeOptions(), genderOptions, clientTypeOptions,
clientClassificationOptions);
}
private static final class InterestRateChartSlabsMapper implements RowMapper<InterestRateChartSlabData> {
private final String schemaSql;
public String schema() {
return this.schemaSql;
}
private InterestRateChartSlabsMapper() {
final StringBuilder sqlBuilder = new StringBuilder(400);
sqlBuilder
.append("ircd.id as ircdId, ircd.description as ircdDescription, ircd.period_type_enum ircdPeriodTypeId, ")
.append("ircd.from_period as ircdFromPeriod, ircd.to_period as ircdToPeriod, ircd.amount_range_from as ircdAmountRangeFrom, ")
.append("ircd.amount_range_to as ircdAmountRangeTo, ircd.annual_interest_rate as ircdAnnualInterestRate, ")
.append("curr.code as currencyCode, curr.name as currencyName, curr.internationalized_name_code as currencyNameCode, ")
.append("curr.display_symbol as currencyDisplaySymbol, curr.decimal_places as currencyDigits, curr.currency_multiplesof as inMultiplesOf, ")
.append("iri.id as iriId, ").append(" iri.entiry_type as entityType, iri.attribute_name as attributeName ,")
.append(" iri.condition_type as conditionType, iri.attribute_value as attributeValue, ")
.append(" iri.incentive_type as incentiveType, iri.amount as amount, ")
.append("code.code_value as attributeValueDesc ").append("from ").append("m_interest_rate_slab ircd ")
.append(" left join m_interest_incentives iri on iri.interest_rate_slab_id = ircd.id ")
.append(" left join m_code_value code on code.id = iri.attribute_value ")
.append("left join m_currency curr on ircd.currency_code= curr.code ");
this.schemaSql = sqlBuilder.toString();
}
@Override
public InterestRateChartSlabData mapRow(ResultSet rs, @SuppressWarnings("unused") int rowNum) throws SQLException {
final Long id = JdbcSupport.getLongDefaultToNullIfZero(rs, "ircdId");
// If there are not chart Slabs are associated then in
// InterestRateChartExtractor the chart Slabs id will be null.
if (id == null) { return null; }
final String description = rs.getString("ircdDescription");
final Integer fromPeriod = JdbcSupport.getInteger(rs, "ircdFromPeriod");
final Integer toPeriod = JdbcSupport.getInteger(rs, "ircdToPeriod");
final Integer periodTypeId = JdbcSupport.getInteger(rs, "ircdPeriodTypeId");
final EnumOptionData periodType = InterestRateChartEnumerations.periodType(periodTypeId);
final BigDecimal amountRangeFrom = rs.getBigDecimal("ircdAmountRangeFrom");
final BigDecimal amountRangeTo = rs.getBigDecimal("ircdAmountRangeTo");
final BigDecimal annualInterestRate = rs.getBigDecimal("ircdAnnualInterestRate");
// currency Slabs
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");
// currency
final CurrencyData currency = new CurrencyData(currencyCode, currencyName, currencyDigits, inMultiplesOf,
currencyDisplaySymbol, currencyNameCode);
return InterestRateChartSlabData.instance(id, description, periodType, fromPeriod, toPeriod, amountRangeFrom, amountRangeTo,
annualInterestRate, currency);
}
}
private static final class InterestRateChartSlabExtractor implements ResultSetExtractor<Collection<InterestRateChartSlabData>> {
InterestRateChartSlabsMapper chartSlabsMapper = new InterestRateChartSlabsMapper();
InterestIncentiveMapper incentiveMapper = new InterestIncentiveMapper();
private final String schemaSql;
public String schema() {
return this.schemaSql;
}
private InterestRateChartSlabExtractor() {
this.schemaSql = chartSlabsMapper.schema();
}
@Override
public Collection<InterestRateChartSlabData> extractData(ResultSet rs) throws SQLException, DataAccessException {
List<InterestRateChartSlabData> chartDataList = new ArrayList<>();
InterestRateChartSlabData chartSlabData = null;
Long interestRateChartSlabId = null;
int ircIndex = 0;// Interest rate chart index
int ircdIndex = 0;// Interest rate chart Slabs index
while (rs.next()) {
Long tempIrcdId = rs.getLong("ircdId");
if (chartSlabData == null || (interestRateChartSlabId != null && !interestRateChartSlabId.equals(tempIrcdId))) {
interestRateChartSlabId = tempIrcdId;
chartSlabData = chartSlabsMapper.mapRow(rs, ircIndex++);
chartDataList.add(chartSlabData);
}
final InterestIncentiveData incentiveData = incentiveMapper.mapRow(rs, ircdIndex++);
if (incentiveData != null) {
chartSlabData.addIncentives(incentiveData);
}
}
return chartDataList;
}
}
private static final class InterestIncentiveMapper implements RowMapper<InterestIncentiveData> {
@Override
public InterestIncentiveData mapRow(ResultSet rs, @SuppressWarnings("unused") int rowNum) throws SQLException {
final Long id = JdbcSupport.getLongDefaultToNullIfZero(rs, "iriId");
// If there are not Incentive are associated then in
// InterestRateChartExtractor the incentive id will be null.
if (id == null) { return null; }
final String attributeValue = rs.getString("attributeValue");
String attributeValueDesc = null;
final Integer entityType = JdbcSupport.getInteger(rs, "entityType");
final EnumOptionData entityTypeData = InterestIncentivesEnumerations.entityType(entityType);
final Integer attributeName = JdbcSupport.getInteger(rs, "attributeName");
if (InterestIncentiveAttributeName.isCodeValueAttribute(InterestIncentiveAttributeName.fromInt(attributeName))) {
attributeValueDesc = rs.getString("attributeValueDesc");
}
final EnumOptionData attributeNameData = InterestIncentivesEnumerations.attributeName(attributeName);
final Integer conditionType = JdbcSupport.getInteger(rs, "conditionType");
final EnumOptionData conditionTypeData = CommonEnumerations.conditionType(conditionType, "incentive");
final Integer incentiveType = JdbcSupport.getInteger(rs, "incentiveType");
final EnumOptionData incentiveTypeData = InterestIncentivesEnumerations.incentiveType(incentiveType);
final BigDecimal amount = rs.getBigDecimal("amount");
return InterestIncentiveData.instance(id, entityTypeData, attributeNameData, conditionTypeData, attributeValue,
attributeValueDesc, incentiveTypeData, amount);
}
}
}