diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/api/LoanTransactionsApiResource.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/api/LoanTransactionsApiResource.java index 5180e6f98..1a661dd3a 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/api/LoanTransactionsApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/api/LoanTransactionsApiResource.java @@ -7,6 +7,7 @@ package org.mifosplatform.portfolio.loanaccount.api; import java.util.Arrays; import java.util.HashSet; +import java.util.List; import java.util.Set; import javax.ws.rs.Consumes; @@ -26,12 +27,15 @@ import org.mifosplatform.commands.service.CommandWrapperBuilder; import org.mifosplatform.commands.service.PortfolioCommandSourceWritePlatformService; import org.mifosplatform.infrastructure.core.api.ApiRequestParameterHelper; import org.mifosplatform.infrastructure.core.data.CommandProcessingResult; +import org.mifosplatform.infrastructure.core.data.EnumOptionData; import org.mifosplatform.infrastructure.core.exception.UnrecognizedQueryParamException; import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSerializationSettings; import org.mifosplatform.infrastructure.core.serialization.DefaultToApiJsonSerializer; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.portfolio.loanaccount.data.LoanTransactionData; +import org.mifosplatform.portfolio.loanaccount.domain.PaymentType; import org.mifosplatform.portfolio.loanaccount.service.LoanReadPlatformService; +import org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -104,9 +108,13 @@ public class LoanTransactionsApiResource { context.authenticatedUser().validateHasReadPermission(resourceNameForPermissions); - final LoanTransactionData transactionData = this.loanReadPlatformService.retrieveLoanTransaction(loanId, transactionId); - + LoanTransactionData transactionData = this.loanReadPlatformService.retrieveLoanTransaction(loanId, transactionId); final ApiRequestJsonSerializationSettings settings = apiRequestParameterHelper.process(uriInfo.getQueryParameters()); + if (settings.isTemplate()) { + final List paymentTypeOptions = LoanEnumerations.paymentTypes(PaymentType.values()); + transactionData = LoanTransactionData.templateOnTop(transactionData, paymentTypeOptions); + } + return this.toApiJsonSerializer.serialize(settings, transactionData, RESPONSE_DATA_PARAMETERS); } @@ -150,10 +158,10 @@ public class LoanTransactionsApiResource { CommandWrapperBuilder builder = new CommandWrapperBuilder().withJson(apiRequestBodyAsJson); final CommandWrapper commandRequest = builder.adjustTransaction(loanId, transactionId).build(); - + final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest); - + return this.toApiJsonSerializer.serialize(result); } - + } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanTransactionData.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanTransactionData.java index 1276fabbd..5af5a048b 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanTransactionData.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanTransactionData.java @@ -6,8 +6,10 @@ package org.mifosplatform.portfolio.loanaccount.data; import java.math.BigDecimal; +import java.util.List; import org.joda.time.LocalDate; +import org.mifosplatform.infrastructure.core.data.EnumOptionData; import org.mifosplatform.organisation.monetary.data.CurrencyData; /** @@ -15,32 +17,42 @@ import org.mifosplatform.organisation.monetary.data.CurrencyData; */ public class LoanTransactionData { - @SuppressWarnings("unused") private final Long id; private final LoanTransactionEnumData type; private final LocalDate date; - @SuppressWarnings("unused") private final CurrencyData currency; - @SuppressWarnings("unused") private final PaymentDetailData paymentDetailData; - @SuppressWarnings("unused") private final BigDecimal amount; - @SuppressWarnings("unused") private final BigDecimal principalPortion; - @SuppressWarnings("unused") private final BigDecimal interestPortion; - @SuppressWarnings("unused") private final BigDecimal feeChargesPortion; - @SuppressWarnings("unused") private final BigDecimal penaltyChargesPortion; + // templates + final List paymentTypeOptions; + + public static LoanTransactionData templateOnTop(LoanTransactionData loanTransactionData, List paymentTypeOptions) { + return new LoanTransactionData(loanTransactionData.id, loanTransactionData.type, loanTransactionData.paymentDetailData, + loanTransactionData.currency, loanTransactionData.date, loanTransactionData.amount, loanTransactionData.principalPortion, + loanTransactionData.interestPortion, loanTransactionData.feeChargesPortion, loanTransactionData.penaltyChargesPortion, + paymentTypeOptions); + } + public LoanTransactionData(final Long id, final LoanTransactionEnumData transactionType, final PaymentDetailData paymentDetailData, final CurrencyData currency, final LocalDate date, final BigDecimal amount, final BigDecimal principalPortion, final BigDecimal interestPortion, final BigDecimal feeChargesPortion, final BigDecimal penaltyChargesPortion) { + this(id, transactionType, paymentDetailData, currency, date, amount, principalPortion, interestPortion, feeChargesPortion, + penaltyChargesPortion, null); + } + + public LoanTransactionData(final Long id, final LoanTransactionEnumData transactionType, final PaymentDetailData paymentDetailData, + final CurrencyData currency, final LocalDate date, final BigDecimal amount, final BigDecimal principalPortion, + final BigDecimal interestPortion, final BigDecimal feeChargesPortion, final BigDecimal penaltyChargesPortion, + final List paymentTypeOptions) { this.id = id; this.type = transactionType; this.paymentDetailData = paymentDetailData; @@ -51,6 +63,7 @@ public class LoanTransactionData { this.interestPortion = interestPortion; this.feeChargesPortion = feeChargesPortion; this.penaltyChargesPortion = penaltyChargesPortion; + this.paymentTypeOptions = paymentTypeOptions; } public LocalDate dateOf() { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java index 79f4f4a92..c54fccf39 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java @@ -10,6 +10,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; +import java.util.List; import org.joda.time.Days; import org.joda.time.LocalDate; @@ -47,6 +48,7 @@ import org.mifosplatform.portfolio.loanaccount.exception.LoanTransactionNotFound import org.mifosplatform.portfolio.loanaccount.loanschedule.data.LoanScheduleData; import org.mifosplatform.portfolio.loanaccount.loanschedule.data.LoanSchedulePeriodData; import org.mifosplatform.portfolio.loanproduct.data.LoanProductData; +import org.mifosplatform.portfolio.loanproduct.service.LoanDropdownReadPlatformService; import org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations; import org.mifosplatform.portfolio.loanproduct.service.LoanProductReadPlatformService; import org.springframework.beans.factory.annotation.Autowired; @@ -68,13 +70,15 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { private final ClientReadPlatformService clientReadPlatformService; private final GroupReadPlatformService groupReadPlatformService; private final LoanTransactionRepository loanTransactionRepository; + private final LoanDropdownReadPlatformService loanDropdownReadPlatformService; @Autowired public LoanReadPlatformServiceImpl(final PlatformSecurityContext context, final LoanRepository loanRepository, final LoanTransactionRepository loanTransactionRepository, final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository, final LoanProductReadPlatformService loanProductReadPlatformService, final ClientReadPlatformService clientReadPlatformService, - final GroupReadPlatformService groupReadPlatformService, final TenantAwareRoutingDataSource dataSource) { + final GroupReadPlatformService groupReadPlatformService, final LoanDropdownReadPlatformService loanDropdownReadPlatformService, + final TenantAwareRoutingDataSource dataSource) { this.context = context; this.loanRepository = loanRepository; this.loanTransactionRepository = loanTransactionRepository; @@ -82,6 +86,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { this.loanProductReadPlatformService = loanProductReadPlatformService; this.clientReadPlatformService = clientReadPlatformService; this.groupReadPlatformService = groupReadPlatformService; + this.loanDropdownReadPlatformService = loanDropdownReadPlatformService; this.jdbcTemplate = new JdbcTemplate(dataSource); } @@ -210,8 +215,9 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { final Money possibleNextRepaymentAmount = loan.possibleNextRepaymentAmount(); final LoanTransactionEnumData transactionType = LoanEnumerations.transactionType(LoanTransactionType.REPAYMENT); + final List paymentOptions = loanDropdownReadPlatformService.retrievePaymentTypeOptions(); return new LoanTransactionData(null, transactionType, null, currencyData, earliestUnpaidInstallmentDate, - possibleNextRepaymentAmount.getAmount(), null, null, null, null); + possibleNextRepaymentAmount.getAmount(), null, null, null, null, paymentOptions); } @Override diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanDropdownReadPlatformService.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanDropdownReadPlatformService.java index f16492abc..21d621547 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanDropdownReadPlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanDropdownReadPlatformService.java @@ -13,19 +13,21 @@ import org.mifosplatform.portfolio.loanproduct.data.TransactionProcessingStrateg public interface LoanDropdownReadPlatformService { - List retrieveLoanAmortizationTypeOptions(); + List retrieveLoanAmortizationTypeOptions(); - List retrieveLoanInterestTypeOptions(); - - List retrieveLoanInterestRateCalculatedInPeriodOptions(); + List retrieveLoanInterestTypeOptions(); - List retrieveLoanTermFrequencyTypeOptions(); - - List retrieveRepaymentFrequencyTypeOptions(); + List retrieveLoanInterestRateCalculatedInPeriodOptions(); - List retrieveInterestRateFrequencyTypeOptions(); + List retrieveLoanTermFrequencyTypeOptions(); - Collection retreiveTransactionProcessingStrategies(); - - List retrieveAccountingRuleTypeOptions(); + List retrieveRepaymentFrequencyTypeOptions(); + + List retrieveInterestRateFrequencyTypeOptions(); + + Collection retreiveTransactionProcessingStrategies(); + + List retrieveAccountingRuleTypeOptions(); + + List retrievePaymentTypeOptions(); } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanDropdownReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanDropdownReadPlatformServiceImpl.java index cd180b752..c12b3b2d8 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanDropdownReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanDropdownReadPlatformServiceImpl.java @@ -20,6 +20,7 @@ import java.util.List; import org.mifosplatform.infrastructure.core.data.EnumOptionData; import org.mifosplatform.portfolio.loanaccount.domain.LoanTransactionProcessingStrategyRepository; +import org.mifosplatform.portfolio.loanaccount.domain.PaymentType; import org.mifosplatform.portfolio.loanproduct.data.TransactionProcessingStrategyData; import org.mifosplatform.portfolio.loanproduct.domain.AccountingRuleType; import org.mifosplatform.portfolio.loanproduct.domain.AmortizationMethod; @@ -33,88 +34,85 @@ import org.springframework.stereotype.Service; @Service public class LoanDropdownReadPlatformServiceImpl implements LoanDropdownReadPlatformService { - private final LoanTransactionProcessingStrategyRepository loanTransactionProcessingStrategyRepository; + private final LoanTransactionProcessingStrategyRepository loanTransactionProcessingStrategyRepository; - @Autowired - public LoanDropdownReadPlatformServiceImpl(final LoanTransactionProcessingStrategyRepository loanTransactionProcessingStrategyRepository) { - this.loanTransactionProcessingStrategyRepository = loanTransactionProcessingStrategyRepository; - } - - @Override - public List retrieveLoanAmortizationTypeOptions() { + @Autowired + public LoanDropdownReadPlatformServiceImpl(final LoanTransactionProcessingStrategyRepository loanTransactionProcessingStrategyRepository) { + this.loanTransactionProcessingStrategyRepository = loanTransactionProcessingStrategyRepository; + } - List allowedAmortizationMethods = Arrays.asList( - amortizationType(AmortizationMethod.EQUAL_INSTALLMENTS), - amortizationType(AmortizationMethod.EQUAL_PRINCIPAL)); + @Override + public List retrieveLoanAmortizationTypeOptions() { - return allowedAmortizationMethods; - } + List allowedAmortizationMethods = Arrays.asList(amortizationType(AmortizationMethod.EQUAL_INSTALLMENTS), + amortizationType(AmortizationMethod.EQUAL_PRINCIPAL)); - @Override - public List retrieveLoanInterestTypeOptions() { - List allowedRepaymentScheduleCalculationMethods = Arrays - .asList(interestType(InterestMethod.FLAT), - interestType(InterestMethod.DECLINING_BALANCE)); + return allowedAmortizationMethods; + } - return allowedRepaymentScheduleCalculationMethods; - } + @Override + public List retrieveLoanInterestTypeOptions() { + List allowedRepaymentScheduleCalculationMethods = Arrays.asList(interestType(InterestMethod.FLAT), + interestType(InterestMethod.DECLINING_BALANCE)); - @Override - public List retrieveLoanInterestRateCalculatedInPeriodOptions() { + return allowedRepaymentScheduleCalculationMethods; + } - List allowedOptions = Arrays - .asList(interestCalculationPeriodType(InterestCalculationPeriodMethod.DAILY), - interestCalculationPeriodType(InterestCalculationPeriodMethod.SAME_AS_REPAYMENT_PERIOD)); + @Override + public List retrieveLoanInterestRateCalculatedInPeriodOptions() { - return allowedOptions; - } - - @Override - public List retrieveLoanTermFrequencyTypeOptions() { - List loanTermFrequencyOptions = Arrays.asList( - loanTermFrequencyType(PeriodFrequencyType.DAYS), - loanTermFrequencyType(PeriodFrequencyType.WEEKS), - loanTermFrequencyType(PeriodFrequencyType.MONTHS), - loanTermFrequencyType(PeriodFrequencyType.YEARS)); - return loanTermFrequencyOptions; - } + List allowedOptions = Arrays.asList(interestCalculationPeriodType(InterestCalculationPeriodMethod.DAILY), + interestCalculationPeriodType(InterestCalculationPeriodMethod.SAME_AS_REPAYMENT_PERIOD)); - @Override - public List retrieveRepaymentFrequencyTypeOptions() { + return allowedOptions; + } - List repaymentFrequencyOptions = Arrays.asList( - repaymentFrequencyType(PeriodFrequencyType.DAYS), - repaymentFrequencyType(PeriodFrequencyType.WEEKS), - repaymentFrequencyType(PeriodFrequencyType.MONTHS)); - return repaymentFrequencyOptions; - } + @Override + public List retrieveLoanTermFrequencyTypeOptions() { + List loanTermFrequencyOptions = Arrays.asList(loanTermFrequencyType(PeriodFrequencyType.DAYS), + loanTermFrequencyType(PeriodFrequencyType.WEEKS), loanTermFrequencyType(PeriodFrequencyType.MONTHS), + loanTermFrequencyType(PeriodFrequencyType.YEARS)); + return loanTermFrequencyOptions; + } - @Override - public List retrieveInterestRateFrequencyTypeOptions() { - // support for monthly and annual percentage rate (MPR) and (APR) - List interestRateFrequencyTypeOptions = Arrays.asList( - interestRateFrequencyType(PeriodFrequencyType.MONTHS), - interestRateFrequencyType(PeriodFrequencyType.YEARS)); - return interestRateFrequencyTypeOptions; - } + @Override + public List retrieveRepaymentFrequencyTypeOptions() { - @Override - public Collection retreiveTransactionProcessingStrategies() { - - Collection strategyOptions = new ArrayList(); - - List strategies = this.loanTransactionProcessingStrategyRepository.findAll(); - for (LoanTransactionProcessingStrategy strategy : strategies) { - strategyOptions.add(strategy.toData()); - } - - return strategyOptions; - } + List repaymentFrequencyOptions = Arrays.asList(repaymentFrequencyType(PeriodFrequencyType.DAYS), + repaymentFrequencyType(PeriodFrequencyType.WEEKS), repaymentFrequencyType(PeriodFrequencyType.MONTHS)); + return repaymentFrequencyOptions; + } + + @Override + public List retrieveInterestRateFrequencyTypeOptions() { + // support for monthly and annual percentage rate (MPR) and (APR) + List interestRateFrequencyTypeOptions = Arrays.asList(interestRateFrequencyType(PeriodFrequencyType.MONTHS), + interestRateFrequencyType(PeriodFrequencyType.YEARS)); + return interestRateFrequencyTypeOptions; + } + + @Override + public Collection retreiveTransactionProcessingStrategies() { + + Collection strategyOptions = new ArrayList(); + + List strategies = this.loanTransactionProcessingStrategyRepository.findAll(); + for (LoanTransactionProcessingStrategy strategy : strategies) { + strategyOptions.add(strategy.toData()); + } + + return strategyOptions; + } @Override public List retrieveAccountingRuleTypeOptions() { List accountingRuleTypeOptions = Arrays.asList(accountingRuleType(AccountingRuleType.NONE), - accountingRuleType(AccountingRuleType.CASH_BASED),accountingRuleType(AccountingRuleType.ACCRUAL_BASED)); + accountingRuleType(AccountingRuleType.CASH_BASED), accountingRuleType(AccountingRuleType.ACCRUAL_BASED)); return accountingRuleTypeOptions; } + + @Override + public List retrievePaymentTypeOptions() { + return LoanEnumerations.paymentTypes(PaymentType.values()); + } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanEnumerations.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanEnumerations.java index 00bb83876..2f3cb75ff 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanEnumerations.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanEnumerations.java @@ -5,6 +5,9 @@ */ package org.mifosplatform.portfolio.loanproduct.service; +import java.util.ArrayList; +import java.util.List; + import org.mifosplatform.infrastructure.core.data.EnumOptionData; import org.mifosplatform.portfolio.loanaccount.data.LoanStatusEnumData; import org.mifosplatform.portfolio.loanaccount.data.LoanTransactionEnumData; @@ -198,6 +201,20 @@ public class LoanEnumerations { return optionData; } + public static List paymentTypes(final PaymentType[] paymentTypes) { + final List optionDatas = new ArrayList(); + for (final PaymentType paymentType : paymentTypes) { + optionDatas.add(paymentType(paymentType)); + } + return optionDatas; + } + + public static EnumOptionData paymentType(final PaymentType paymentType) { + final EnumOptionData optionData = new EnumOptionData(paymentType.getValue().longValue(), paymentType.getCode(), + paymentType.toString()); + return optionData; + } + public static EnumOptionData paymentType(final Integer id) { PaymentType paymentType = PaymentType.fromInt(id); EnumOptionData enumOptionData = new EnumOptionData(paymentType.getValue().longValue(), paymentType.getCode(), paymentType