diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/LoansApiResource.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/LoansApiResource.java index ae6ccd10d..758f04de8 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/LoansApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/LoansApiResource.java @@ -183,7 +183,7 @@ public class LoansApiResource { "repaymentFrequencyType", "interestRateFrequencyType", "amortizationType", "interestType", "interestCalculationPeriodType", "submittedOnDate", "approvedOnDate", "expectedDisbursementDate", "actualDisbursementDate", "expectedFirstRepaymentOnDate", "interestChargedFromDate", "closedOnDate", "expectedMaturityDate", - "status", "lifeCycleStatusDate", "loanOfficerName", "loanOfficerId") + "status", "lifeCycleStatusDate", "loanOfficerName", "loanOfficerId", "charges") ); Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); @@ -244,8 +244,8 @@ public class LoansApiResource { if(template) { responseParameters.addAll(Arrays.asList("productOptions", "amortizationTypeOptions", "interestTypeOptions", "interestCalculationPeriodTypeOptions", "repaymentFrequencyTypeOptions", "interestRateFrequencyTypeOptions", "fundOptions", "transactionProcessingStrategyOptions", "chargeOptions", - "loanOfficerOptions")); - + "loanOfficerOptions", "chargeTemplate")); + productOptions = this.loanProductReadPlatformService.retrieveAllLoanProductsForLookup(); loanTermFrequencyTypeOptions = dropdownReadPlatformService.retrieveLoanTermFrequencyTypeOptions(); repaymentFrequencyTypeOptions = dropdownReadPlatformService.retrieveRepaymentFrequencyTypeOptions(); @@ -262,7 +262,7 @@ public class LoansApiResource { chargeOptions.removeAll(charges); } allowedLoanOfficers = this.staffReadPlatformService.retrieveAllLoanOfficersByOffice(loanBasicDetails.getClientOfficeId()); - + chargeTemplate = this.chargeReadPlatformService.retrieveLoanChargeTemplate(); } final LoanAccountData loanAccount = new LoanAccountData(loanBasicDetails, convenienceDataRequired, summary, repaymentSchedule, loanRepayments, permissions, charges, diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/commands/LoanApplicationCommand.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/commands/LoanApplicationCommand.java index a779024f1..2cb679212 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/commands/LoanApplicationCommand.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/commands/LoanApplicationCommand.java @@ -267,6 +267,10 @@ public class LoanApplicationCommand { return this.modifiedParameters.contains("interestChargedFromDate"); } + public boolean isChargesChanged() { + return this.modifiedParameters.contains("charges"); + } + public Long getLoanOfficerId() { return loanOfficerId; } diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiDataConversionServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiDataConversionServiceImpl.java index edc594336..c2d511509 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiDataConversionServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiDataConversionServiceImpl.java @@ -504,7 +504,7 @@ public class ApiDataConversionServiceImpl implements ApiDataConversionService { if (loanCharge.has("amount")){ chargeModifiedParameters.add("amount"); - amount = loanCharge.get("amount").getAsBigDecimal(); + amount = convertFrom(loanCharge.get("amount").getAsString(), "amount", extractLocaleValue(requestMap)); } if (loanCharge.has("chargeTimeType")){ chargeModifiedParameters.add("chargeTimeType"); diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/Loan.java b/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/Loan.java index ddb087ffa..0557fd44e 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/Loan.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loan/domain/Loan.java @@ -209,9 +209,9 @@ public class Loan extends AbstractAuditableCustom { } public void modifyLoanApplication(final LoanApplicationCommand command, final Client client, final LoanProduct loanProduct, - final Fund fund, final LoanTransactionProcessingStrategy strategy, final LoanSchedule modifiedLoanSchedule, + final Fund fund, final LoanTransactionProcessingStrategy strategy, final LoanSchedule modifiedLoanSchedule, final Set charges, final Staff loanOfficer) { - + if (command.isClientChanged()) { this.client = client; } @@ -263,7 +263,12 @@ public class Loan extends AbstractAuditableCustom { this.interestChargedFromDate = null; } } - + + if (command.isChargesChanged()) { + this.charges.clear(); + this.charges.addAll(charges); + } + this.loanRepaymentScheduleDetail.update(command.toLoanProductCommand()); // FIXME - rewrite over loan schedule by default for now but worth putting in check to see if required diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanAssembler.java b/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanAssembler.java index c46ab50c0..a5f4afecd 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanAssembler.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanAssembler.java @@ -107,7 +107,7 @@ public class LoanAssembler { Loan loan = Loan.createNew(fund,loanOfficer, loanTransactionProcessingStrategy, loanProduct, client, loanRepaymentScheduleDetail); loan.setExternalId(command.getExternalId()); - final Set charges = this.assembleSetOfCharges(command, loan, loanProduct, currency.getCode()); + final Set charges = this.assembleSetOfCharges(command, loan, loanProduct); loan.setCharges(charges); for (ScheduledLoanInstallment scheduledLoanInstallment : loanRepaymentSchedule) { @@ -194,11 +194,15 @@ public class LoanAssembler { return strategy; } - private Set assembleSetOfCharges(final LoanApplicationCommand command, final Loan loan, - final LoanProduct product, final String currencyCode) { + public Set assembleSetOfCharges(final LoanApplicationCommand command, final Loan loan, + final LoanProduct product) { Set charges = new HashSet(); LoanChargeCommand[] loanChargesArray = command.getCharges(); + String loanCurrencyCode = loan.getCurrencyCode(); + if (loanCurrencyCode == null){ + loanCurrencyCode = product.getCurrency().getCode(); + } if (!ObjectUtils.isEmpty(loanChargesArray)) { for (LoanChargeCommand loanChargeCommand : loanChargesArray) { @@ -210,7 +214,7 @@ public class LoanAssembler { if (!charge.isActive()){ throw new ChargeIsNotActiveException(id); } - if (!currencyCode.equals(charge.getCurrencyCode())){ + if (!loanCurrencyCode.equals(charge.getCurrencyCode())){ String errorMessage = "Charge and Loan must have the same currency."; throw new InvalidCurrencyException("charge", "attach.to.loan", errorMessage); } diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanWritePlatformServiceJpaRepositoryImpl.java index af98125b1..04130fb4e 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanWritePlatformServiceJpaRepositoryImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanWritePlatformServiceJpaRepositoryImpl.java @@ -4,6 +4,7 @@ import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Set; import org.apache.commons.lang.StringUtils; import org.joda.time.LocalDate; @@ -31,6 +32,7 @@ import org.mifosng.platform.exceptions.NoAuthorizationException; import org.mifosng.platform.fund.domain.Fund; import org.mifosng.platform.loan.domain.DefaultLoanLifecycleStateMachine; import org.mifosng.platform.loan.domain.Loan; +import org.mifosng.platform.loan.domain.LoanCharge; import org.mifosng.platform.loan.domain.LoanLifecycleStateMachine; import org.mifosng.platform.loan.domain.LoanProduct; import org.mifosng.platform.loan.domain.LoanProductRepository; @@ -143,10 +145,11 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf Fund fund = this.loanAssembler.findFundByIdIfProvided(command.getFundId()); Staff loanOfficer = this.loanAssembler.findLoanOfficerByIdIfProvided(command.getLoanOfficerId()); LoanTransactionProcessingStrategy strategy = this.loanAssembler.findStrategyByIdIfProvided(command.getTransactionProcessingStrategyId()); - + Set charges = this.loanAssembler.assembleSetOfCharges(command, loan, loanProduct) ; + LoanSchedule loanSchedule = this.calculationPlatformService.calculateLoanSchedule(command.toCalculateLoanScheduleCommand()); - loan.modifyLoanApplication(command, client, loanProduct, fund, strategy, loanSchedule, loanOfficer); - + loan.modifyLoanApplication(command, client, loanProduct, fund, strategy, loanSchedule, charges, loanOfficer); + this.loanRepository.save(loan); if (StringUtils.isNotBlank(command.getSubmittedOnNote())) {