remove warnings for unused code, formating in savings area.

This commit is contained in:
Keith Woodlock
2013-02-18 10:55:55 +00:00
parent cc27eccd79
commit e20869ad9b
14 changed files with 656 additions and 664 deletions
@@ -24,12 +24,9 @@ import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriInfo; import javax.ws.rs.core.UriInfo;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.mifosplatform.commands.domain.CommandWrapper;
import org.mifosplatform.commands.service.CommandWrapperBuilder;
import org.mifosplatform.infrastructure.core.api.ApiParameterHelper; import org.mifosplatform.infrastructure.core.api.ApiParameterHelper;
import org.mifosplatform.infrastructure.core.api.ApiRequestParameterHelper; import org.mifosplatform.infrastructure.core.api.ApiRequestParameterHelper;
import org.mifosplatform.infrastructure.core.data.CommandProcessingResult; import org.mifosplatform.infrastructure.core.data.CommandProcessingResult;
import org.mifosplatform.infrastructure.core.exception.UnrecognizedQueryParamException;
import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSerializationSettings; import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
import org.mifosplatform.infrastructure.core.serialization.ToApiJsonSerializer; import org.mifosplatform.infrastructure.core.serialization.ToApiJsonSerializer;
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
@@ -56,7 +53,7 @@ public class GroupsApiResource {
"clientMembers", "allowedClients", "allowedOffices")); "clientMembers", "allowedClients", "allowedOffices"));
private final PlatformSecurityContext context; private final PlatformSecurityContext context;
private GroupReadPlatformService groupReadPlatformService; private final GroupReadPlatformService groupReadPlatformService;
private final GroupWritePlatformService groupWritePlatformService; private final GroupWritePlatformService groupWritePlatformService;
private final ClientReadPlatformService clientReadPlatformService; private final ClientReadPlatformService clientReadPlatformService;
private final OfficeReadPlatformService officeReadPlatformService; private final OfficeReadPlatformService officeReadPlatformService;
@@ -240,7 +237,7 @@ public class GroupsApiResource {
// 'g.' preffix because of ERROR 1052 (23000): Column 'column_name' in where // 'g.' preffix because of ERROR 1052 (23000): Column 'column_name' in where
// clause is ambiguous // clause is ambiguous
// caused by the same name of columns in m_office and m_group tables // caused by the same name of columns in m_office and m_group tables
private String getGroupExtraCriteria(String sqlSearch, Long officeId, String externalId, String name, String hierarchy) { private String getGroupExtraCriteria(String sqlSearch, final Long officeId, final String externalId, final String name, final String hierarchy) {
String extraCriteria = ""; String extraCriteria = "";
@@ -272,8 +269,4 @@ public class GroupsApiResource {
return extraCriteria; return extraCriteria;
} }
private boolean is(final String commandParam, final String commandValue) {
return StringUtils.isNotBlank(commandParam) && commandParam.trim().equalsIgnoreCase(commandValue);
}
} }
@@ -27,12 +27,10 @@ import org.springframework.data.jpa.domain.AbstractPersistable;
@Table(name = "m_group") @Table(name = "m_group")
public class Group extends AbstractPersistable<Long> { public class Group extends AbstractPersistable<Long> {
@SuppressWarnings("unused")
@ManyToOne @ManyToOne
@JoinColumn(name = "office_id", nullable = false) @JoinColumn(name = "office_id", nullable = false)
private Office office; private Office office;
@SuppressWarnings("unused")
@ManyToOne @ManyToOne
@JoinColumn(name = "loan_officer_id", nullable = true) @JoinColumn(name = "loan_officer_id", nullable = true)
private Staff loanOfficer; private Staff loanOfficer;
@@ -56,11 +54,11 @@ public class Group extends AbstractPersistable<Long> {
this.clientMembers = new HashSet<Client>(); this.clientMembers = new HashSet<Client>();
} }
public static Group newGroup(Office office, Staff loanOfficer , String name, String externalId, Set<Client> clientMembers) { public static Group newGroup(final Office office, final Staff loanOfficer , final String name, final String externalId, final Set<Client> clientMembers) {
return new Group(office, loanOfficer , name, externalId, clientMembers); return new Group(office, loanOfficer , name, externalId, clientMembers);
} }
public Group(Office office, Staff loanOfficer , String name, String externalId, Set<Client> clientMembers) { public Group(final Office office, final Staff loanOfficer , final String name, final String externalId, final Set<Client> clientMembers) {
this.office = office; this.office = office;
this.loanOfficer = loanOfficer; this.loanOfficer = loanOfficer;
if (StringUtils.isNotBlank(name)) { if (StringUtils.isNotBlank(name)) {
@@ -114,7 +112,7 @@ public class Group extends AbstractPersistable<Long> {
} }
} }
public void unassigLoanOfficer(GroupCommand command) { public void unassigLoanOfficer(final GroupCommand command) {
if (command.isLoanOfficerChanged()) { if (command.isLoanOfficerChanged()) {
this.loanOfficer = null; this.loanOfficer = null;
} }
@@ -78,16 +78,18 @@ public class SavingAccountData {
return new SavingAccountData(clientId, clientDisplayName); return new SavingAccountData(clientId, clientDisplayName);
} }
public SavingAccountData(Long id, EnumOptionData status, String externalId, Long clientId, String clientName, Long productId, public SavingAccountData(final Long id, final EnumOptionData status, final String externalId, final Long clientId,
String productName, EnumOptionData productType, CurrencyData currencyData, BigDecimal savingsDepositAmountPerPeriod, final String clientName, final Long productId, final String productName, final EnumOptionData productType,
EnumOptionData savingsFrequencyType, BigDecimal totalDepositAmount, BigDecimal recurringInterestRate, final CurrencyData currencyData, final BigDecimal savingsDepositAmountPerPeriod, final EnumOptionData savingsFrequencyType,
BigDecimal savingInterestRate, EnumOptionData interestType, EnumOptionData interestCalculationMethod, Integer tenure, final BigDecimal totalDepositAmount, final BigDecimal recurringInterestRate, final BigDecimal savingInterestRate,
EnumOptionData tenureType, LocalDate projectedCommencementDate, LocalDate actualCommencementDate, LocalDate maturesOnDate, final EnumOptionData interestType, final EnumOptionData interestCalculationMethod, final Integer tenure,
BigDecimal projectedInterestAccuredOnMaturity, BigDecimal actualInterestAccured, BigDecimal projectedMaturityAmount, final EnumOptionData tenureType, final LocalDate projectedCommencementDate, final LocalDate actualCommencementDate,
BigDecimal actualMaturityAmount, boolean preClosureAllowed, BigDecimal preClosureInterestRate, LocalDate withdrawnonDate, final LocalDate maturesOnDate, final BigDecimal projectedInterestAccuredOnMaturity, final BigDecimal actualInterestAccured,
LocalDate rejectedonDate, LocalDate closedonDate, boolean isLockinPeriodAllowed, Integer lockinPeriod, final BigDecimal projectedMaturityAmount, final BigDecimal actualMaturityAmount, final boolean preClosureAllowed,
EnumOptionData lockinPeriodType, Integer depositEvery, BigDecimal outstandingAmount, Integer interestPostEvery, final BigDecimal preClosureInterestRate, final LocalDate withdrawnonDate, final LocalDate rejectedonDate,
EnumOptionData interestPostFrequency) { final LocalDate closedonDate, final boolean isLockinPeriodAllowed, final Integer lockinPeriod,
final EnumOptionData lockinPeriodType, final Integer depositEvery, final BigDecimal outstandingAmount,
final Integer interestPostEvery, final EnumOptionData interestPostFrequency) {
this.id = id; this.id = id;
this.status = status; this.status = status;
this.externalId = externalId; this.externalId = externalId;
@@ -140,7 +142,7 @@ public class SavingAccountData {
this.interestPostFrequency = interestPostFrequency; this.interestPostFrequency = interestPostFrequency;
} }
public SavingAccountData(Long clientId, String clientName) { public SavingAccountData(final Long clientId, final String clientName) {
this.id = null; this.id = null;
this.status = null; this.status = null;
this.externalId = null; this.externalId = null;
@@ -193,11 +195,11 @@ public class SavingAccountData {
this.interestPostFrequency = null; this.interestPostFrequency = null;
} }
public SavingAccountData(SavingAccountData account, Collection<SavingProductLookup> productOptions, public SavingAccountData(final SavingAccountData account, final Collection<SavingProductLookup> productOptions,
Collection<CurrencyData> currencyOptions, List<EnumOptionData> savingsProductTypeOptions, final Collection<CurrencyData> currencyOptions, final List<EnumOptionData> savingsProductTypeOptions,
List<EnumOptionData> tenureTypeOptions, List<EnumOptionData> savingFrequencyOptions, final List<EnumOptionData> tenureTypeOptions, final List<EnumOptionData> savingFrequencyOptions,
List<EnumOptionData> savingsInterestTypeOptions, List<EnumOptionData> lockinPeriodTypeOptions, final List<EnumOptionData> savingsInterestTypeOptions, final List<EnumOptionData> lockinPeriodTypeOptions,
List<EnumOptionData> interestCalculationOptions, BigDecimal dueAmount) { final List<EnumOptionData> interestCalculationOptions, final BigDecimal dueAmount) {
this.id = account.id; this.id = account.id;
this.status = account.status; this.status = account.status;
this.externalId = account.externalId; this.externalId = account.externalId;
@@ -252,12 +254,11 @@ public class SavingAccountData {
this.interestPostFrequency = account.interestPostFrequency; this.interestPostFrequency = account.interestPostFrequency;
} }
// FIXME - Madhukar - unused variables been passed into construction - why? public SavingAccountData(final Long clientId, final String clientName, final Long productId, final String productName,
public SavingAccountData(Long clientId, String clientName, Long productId, String productName, CurrencyData currency, final CurrencyData currency, final BigDecimal interestRate, final BigDecimal savingsDepositAmountPerPeriod,
BigDecimal interestRate, BigDecimal savingsDepositAmountPerPeriod, EnumOptionData productType, EnumOptionData tenureType, final EnumOptionData productType, final EnumOptionData tenureType, final Integer tenure,
Integer tenure, EnumOptionData savingsFrequencyType, EnumOptionData interestType, EnumOptionData interestCalculationMethod, final EnumOptionData savingsFrequencyType, final EnumOptionData interestType, final EnumOptionData interestCalculationMethod,
BigDecimal minimumBalanceForWithdrawal, boolean partialDepositAllowed, boolean lockinPeriodAllowed, Integer lockinPeriod, final boolean lockinPeriodAllowed, final Integer lockinPeriod, final EnumOptionData lockinPeriodType, final Integer depositEvery) {
EnumOptionData lockinPeriodType, Integer depositEvery) {
this.id = null; this.id = null;
this.status = null; this.status = null;
this.externalId = null; this.externalId = null;
@@ -310,7 +311,7 @@ public class SavingAccountData {
this.interestPostFrequency = savingsFrequencyType; this.interestPostFrequency = savingsFrequencyType;
} }
public SavingAccountData(SavingAccountData account, SavingPermissionData permissions) { public SavingAccountData(final SavingAccountData account, final SavingPermissionData permissions) {
this.id = account.id; this.id = account.id;
this.status = account.status; this.status = account.status;
this.externalId = account.externalId; this.externalId = account.externalId;
@@ -364,7 +365,7 @@ public class SavingAccountData {
this.interestPostFrequency = account.interestPostFrequency; this.interestPostFrequency = account.interestPostFrequency;
} }
public SavingAccountData(SavingAccountData account, SavingScheduleData savingScheduleData) { public SavingAccountData(final SavingAccountData account, final SavingScheduleData savingScheduleData) {
this.id = account.id; this.id = account.id;
this.status = account.status; this.status = account.status;
this.externalId = account.externalId; this.externalId = account.externalId;
@@ -418,7 +419,7 @@ public class SavingAccountData {
this.interestPostFrequency = account.interestPostFrequency; this.interestPostFrequency = account.interestPostFrequency;
} }
public SavingAccountData(SavingAccountData account, Collection<SavingAccountTransactionsData> transactions) { public SavingAccountData(final SavingAccountData account, final Collection<SavingAccountTransactionsData> transactions) {
this.id = account.id; this.id = account.id;
this.status = account.status; this.status = account.status;
this.externalId = account.externalId; this.externalId = account.externalId;
@@ -9,110 +9,110 @@ import java.math.BigDecimal;
import java.math.MathContext; import java.math.MathContext;
import java.math.RoundingMode; import java.math.RoundingMode;
import org.joda.time.LocalDate;
import org.mifosplatform.organisation.monetary.domain.Money; import org.mifosplatform.organisation.monetary.domain.Money;
import org.mifosplatform.portfolio.savingsaccountproduct.domain.SavingFrequencyType; import org.mifosplatform.portfolio.savingsaccountproduct.domain.SavingFrequencyType;
import org.mifosplatform.portfolio.savingsaccountproduct.domain.SavingInterestCalculationMethod; import org.mifosplatform.portfolio.savingsaccountproduct.domain.SavingInterestCalculationMethod;
import org.mifosplatform.portfolio.savingsdepositproduct.domain.TenureTypeEnum;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@Service @Service
public class ReccuringDepositInterestCalculator { public class ReccuringDepositInterestCalculator {
private final Integer monthsInYear = 12;
// FIXME - MADHUKAR - Are the unused field here needed? private final Integer monthsInYear = 12;
public Money calculateInterestOnMaturityFor(Money savingsDepositPerPeriod, Integer tenure, BigDecimal reccuringInterestRate,
LocalDate commencementDate, TenureTypeEnum tenureTypeEnum, SavingFrequencyType savingFrequencyType, public Money calculateInterestOnMaturityFor(final Money savingsDepositPerPeriod, final Integer tenure,
SavingInterestCalculationMethod savingInterestCalculationMethod, Integer depositEvery) { final BigDecimal reccuringInterestRate, final SavingFrequencyType savingFrequencyType,
final SavingInterestCalculationMethod savingInterestCalculationMethod, Integer depositEvery) {
BigDecimal finalAmount = BigDecimal.ZERO;
MathContext mc = new MathContext(8, RoundingMode.HALF_EVEN); BigDecimal finalAmount = BigDecimal.ZERO;
MathContext mc = new MathContext(8, RoundingMode.HALF_EVEN);
BigDecimal interestRateAsFraction = reccuringInterestRate.divide(BigDecimal.valueOf(100), mc); BigDecimal interestRateAsFraction = reccuringInterestRate.divide(BigDecimal.valueOf(100), mc);
Integer noofTimesInterestCompoundPerYear = determineIntValue(savingFrequencyType); Integer noofTimesInterestCompoundPerYear = determineIntValue(savingFrequencyType);
BigDecimal interestRatePerPeriod = BigDecimal.valueOf(interestRateAsFraction.doubleValue() BigDecimal interestRatePerPeriod = BigDecimal.valueOf(interestRateAsFraction.doubleValue()
/ noofTimesInterestCompoundPerYear.doubleValue()); / noofTimesInterestCompoundPerYear.doubleValue());
Integer noOfTimestobeCalculated = tenure/depositEvery; Integer noOfTimestobeCalculated = tenure / depositEvery;
if(savingInterestCalculationMethod.isAverageBalance()){
BigDecimal termAmount = BigDecimal.ZERO;
BigDecimal totalInterest = BigDecimal.ZERO;
BigDecimal closingBalance = BigDecimal.ZERO;
BigDecimal amountPerPeriod = savingsDepositPerPeriod.getAmount();
Integer depositEveryOriginalValue = depositEvery;
BigDecimal amountPermonth = BigDecimal.valueOf(amountPerPeriod.doubleValue()/depositEvery.doubleValue());
while (noOfTimestobeCalculated > 0) {
while (depositEvery > 0) {
closingBalance = closingBalance.add(amountPermonth);
termAmount = termAmount.add(closingBalance);
depositEvery--;
}
BigDecimal averageAmount = BigDecimal.valueOf(termAmount.doubleValue()/depositEveryOriginalValue.doubleValue());
BigDecimal interestRatePerTerm = BigDecimal.valueOf(interestRateAsFraction.doubleValue()/monthsInYear.doubleValue()*depositEveryOriginalValue.doubleValue());
BigDecimal interestperTerm = averageAmount.multiply(interestRatePerTerm);
totalInterest = totalInterest.add(interestperTerm);
depositEvery = depositEveryOriginalValue;
termAmount = BigDecimal.ZERO;
noOfTimestobeCalculated--;
}
finalAmount = closingBalance.add(totalInterest);
} else if(savingInterestCalculationMethod.isMonthlyCollection()){
/*
* // Assuming tenure in months // see
* http://www.onemint.com/2012/04/03/
* how-to-calculate-interest-on-recurring-deposits/
*
* A=P(1+r/n)^nt
*
* A = final amount P = principal amount (initial investment) r = annual
* nominal interest rate (as a decimal, not in percentage) n = number of
* times the interest is compounded per year t = number of years
*/
BigDecimal onePlusInterestRatePerPeriod = BigDecimal.ONE.add(interestRatePerPeriod);
BigDecimal monthsExpressedInYears;
BigDecimal timeforOneCalculationPeriod;
BigDecimal amountPerPeriod;
Integer tempTenure = tenure;
while (noOfTimestobeCalculated > 0) {
monthsExpressedInYears = BigDecimal.valueOf(tempTenure.doubleValue() / monthsInYear.doubleValue());
timeforOneCalculationPeriod = BigDecimal.valueOf(noofTimesInterestCompoundPerYear * monthsExpressedInYears.doubleValue());
amountPerPeriod = savingsDepositPerPeriod.getAmount().multiply(
BigDecimal.valueOf(Math.pow(onePlusInterestRatePerPeriod.doubleValue(), timeforOneCalculationPeriod.doubleValue())));
finalAmount = finalAmount.add(amountPerPeriod);
noOfTimestobeCalculated--;
tempTenure = tempTenure-depositEvery;
}
}
return Money.of(savingsDepositPerPeriod.getCurrency(), finalAmount);
}
private Integer determineIntValue(SavingFrequencyType frequencyType){
Integer noofTimesInterestCompoundPerYear = Integer.valueOf(0);
switch (frequencyType) {
case MONTHLY:
noofTimesInterestCompoundPerYear = monthsInYear;
break;
case QUATERLY:
noofTimesInterestCompoundPerYear = monthsInYear / 3;
break;
case HALFYEARLY:
noofTimesInterestCompoundPerYear = monthsInYear / 6;
break;
case YEARLY:
noofTimesInterestCompoundPerYear = monthsInYear / 12;
break;
default:
throw new RuntimeException("The specified frequency not supported");
} if (savingInterestCalculationMethod.isAverageBalance()) {
return noofTimesInterestCompoundPerYear;
BigDecimal termAmount = BigDecimal.ZERO;
BigDecimal totalInterest = BigDecimal.ZERO;
BigDecimal closingBalance = BigDecimal.ZERO;
BigDecimal amountPerPeriod = savingsDepositPerPeriod.getAmount();
Integer depositEveryOriginalValue = depositEvery;
BigDecimal amountPermonth = BigDecimal.valueOf(amountPerPeriod.doubleValue() / depositEvery.doubleValue());
while (noOfTimestobeCalculated > 0) {
while (depositEvery > 0) {
closingBalance = closingBalance.add(amountPermonth);
termAmount = termAmount.add(closingBalance);
depositEvery--;
}
BigDecimal averageAmount = BigDecimal.valueOf(termAmount.doubleValue() / depositEveryOriginalValue.doubleValue());
BigDecimal interestRatePerTerm = BigDecimal.valueOf(interestRateAsFraction.doubleValue() / monthsInYear.doubleValue()
* depositEveryOriginalValue.doubleValue());
BigDecimal interestperTerm = averageAmount.multiply(interestRatePerTerm);
totalInterest = totalInterest.add(interestperTerm);
depositEvery = depositEveryOriginalValue;
termAmount = BigDecimal.ZERO;
noOfTimestobeCalculated--;
}
finalAmount = closingBalance.add(totalInterest);
} else if (savingInterestCalculationMethod.isMonthlyCollection()) {
/*
* // Assuming tenure in months // see
* http://www.onemint.com/2012/04/03/
* how-to-calculate-interest-on-recurring-deposits/
*
* A=P(1+r/n)^nt
*
* A = final amount P = principal amount (initial investment) r =
* annual nominal interest rate (as a decimal, not in percentage) n
* = number of times the interest is compounded per year t = number
* of years
*/
BigDecimal onePlusInterestRatePerPeriod = BigDecimal.ONE.add(interestRatePerPeriod);
BigDecimal monthsExpressedInYears;
BigDecimal timeforOneCalculationPeriod;
BigDecimal amountPerPeriod;
Integer tempTenure = tenure;
while (noOfTimestobeCalculated > 0) {
monthsExpressedInYears = BigDecimal.valueOf(tempTenure.doubleValue() / monthsInYear.doubleValue());
timeforOneCalculationPeriod = BigDecimal.valueOf(noofTimesInterestCompoundPerYear * monthsExpressedInYears.doubleValue());
amountPerPeriod = savingsDepositPerPeriod.getAmount()
.multiply(
BigDecimal.valueOf(Math.pow(onePlusInterestRatePerPeriod.doubleValue(),
timeforOneCalculationPeriod.doubleValue())));
finalAmount = finalAmount.add(amountPerPeriod);
noOfTimestobeCalculated--;
tempTenure = tempTenure - depositEvery;
}
}
return Money.of(savingsDepositPerPeriod.getCurrency(), finalAmount);
}
private Integer determineIntValue(final SavingFrequencyType frequencyType) {
Integer noofTimesInterestCompoundPerYear = Integer.valueOf(0);
switch (frequencyType) {
case MONTHLY:
noofTimesInterestCompoundPerYear = monthsInYear;
break;
case QUATERLY:
noofTimesInterestCompoundPerYear = monthsInYear / 3;
break;
case HALFYEARLY:
noofTimesInterestCompoundPerYear = monthsInYear / 6;
break;
case YEARLY:
noofTimesInterestCompoundPerYear = monthsInYear / 12;
break;
default:
throw new RuntimeException("The specified frequency not supported");
}
return noofTimesInterestCompoundPerYear;
} }
} }
@@ -131,7 +131,7 @@ public class SavingAccount extends AbstractAuditableCustom<AppUser, Long> {
private BigDecimal outstandingAmount; private BigDecimal outstandingAmount;
@Column(name = "is_preclosure_allowed", nullable = false) @Column(name = "is_preclosure_allowed", nullable = false)
private boolean preClosureAllowed = false; private final boolean preClosureAllowed = false;
@Column(name = "is_deleted", nullable = false) @Column(name = "is_deleted", nullable = false)
private boolean deleted = false; private boolean deleted = false;
@@ -197,20 +197,20 @@ public class SavingAccount extends AbstractAuditableCustom<AppUser, Long> {
// //
} }
public static SavingAccount openNew(Client client, SavingProduct product, String externalId, Money savingsDeposit, public static SavingAccount openNew(final Client client, final SavingProduct product, final String externalId,
BigDecimal reccuringInterestRate, BigDecimal savingInterestRate, Integer tenure, LocalDate commencementDate, final Money savingsDeposit, final BigDecimal reccuringInterestRate, final BigDecimal savingInterestRate, final Integer tenure,
TenureTypeEnum tenureTypeEnum, SavingProductType savingProductType, SavingFrequencyType savingFrequencyType, final LocalDate commencementDate, final TenureTypeEnum tenureTypeEnum, final SavingProductType savingProductType,
SavingsInterestType interestType, SavingInterestCalculationMethod savingInterestCalculationMethod, final SavingFrequencyType savingFrequencyType, final SavingsInterestType interestType,
boolean isLockinPeriodAllowed, Integer lockinPeriod, PeriodFrequencyType lockinPeriodType, final SavingInterestCalculationMethod savingInterestCalculationMethod, final boolean isLockinPeriodAllowed,
ReccuringDepositInterestCalculator reccuringDepositInterestCalculator, final Integer lockinPeriod, final PeriodFrequencyType lockinPeriodType,
final DepositLifecycleStateMachine lifecycleStateMachine, Integer depositEvery, Integer interestPostEvery, final ReccuringDepositInterestCalculator reccuringDepositInterestCalculator,
Integer interestPostFrequency) { final DepositLifecycleStateMachine lifecycleStateMachine, final Integer depositEvery, final Integer interestPostEvery,
final Integer interestPostFrequency) {
Money futureValueOnMaturity = null; Money futureValueOnMaturity = null;
if (savingProductType.isReccuring() && tenureTypeEnum.isFixedPeriod()) { if (savingProductType.isReccuring() && tenureTypeEnum.isFixedPeriod()) {
futureValueOnMaturity = reccuringDepositInterestCalculator.calculateInterestOnMaturityFor(savingsDeposit, tenure, futureValueOnMaturity = reccuringDepositInterestCalculator.calculateInterestOnMaturityFor(savingsDeposit, tenure,
reccuringInterestRate, commencementDate, tenureTypeEnum, savingFrequencyType, savingInterestCalculationMethod, reccuringInterestRate, savingFrequencyType, savingInterestCalculationMethod, depositEvery);
depositEvery);
} else if (savingProductType.isReccuring() && tenureTypeEnum.isPerpetual()) { } else if (savingProductType.isReccuring() && tenureTypeEnum.isPerpetual()) {
futureValueOnMaturity = savingsDeposit; futureValueOnMaturity = savingsDeposit;
} else { } else {
@@ -223,12 +223,14 @@ public class SavingAccount extends AbstractAuditableCustom<AppUser, Long> {
interestPostEvery, interestPostFrequency); interestPostEvery, interestPostFrequency);
} }
public SavingAccount(Client client, String externalId, SavingProduct product, Money savingsDeposit, BigDecimal reccuringInterestRate, public SavingAccount(final Client client, final String externalId, final SavingProduct product, final Money savingsDeposit,
BigDecimal savingInterestRate, Integer tenure, LocalDate commencementDate, TenureTypeEnum tenureTypeEnum, final BigDecimal reccuringInterestRate, final BigDecimal savingInterestRate, final Integer tenure,
SavingProductType savingProductType, SavingFrequencyType savingFrequencyType, SavingsInterestType interestType, final LocalDate commencementDate, final TenureTypeEnum tenureTypeEnum, final SavingProductType savingProductType,
SavingInterestCalculationMethod savingInterestCalculationMethod, boolean isLockinPeriodAllowed, Integer lockinPeriod, final SavingFrequencyType savingFrequencyType, final SavingsInterestType interestType,
PeriodFrequencyType lockinPeriodType, Money futureValueOnMaturity, final DepositLifecycleStateMachine lifecycleStateMachine, final SavingInterestCalculationMethod savingInterestCalculationMethod, final boolean isLockinPeriodAllowed,
Integer payEvery, Integer interestPostEvery, Integer interestPostFrequency) { final Integer lockinPeriod, final PeriodFrequencyType lockinPeriodType, final Money futureValueOnMaturity,
final DepositLifecycleStateMachine lifecycleStateMachine, final Integer payEvery, final Integer interestPostEvery,
final Integer interestPostFrequency) {
DepositAccountStatus from = null; DepositAccountStatus from = null;
if (accountStatus != null) { if (accountStatus != null) {
@@ -274,18 +276,18 @@ public class SavingAccount extends AbstractAuditableCustom<AppUser, Long> {
this.interestPostFrequency = interestPostFrequency; this.interestPostFrequency = interestPostFrequency;
} }
public void modifyAccount(SavingProduct product, String externalId, Money savingsDeposit, BigDecimal reccuringInterestRate, public void modifyAccount(final SavingProduct product, final String externalId, final Money savingsDeposit,
BigDecimal savingInterestRate, Integer tenure, LocalDate commencementDate, TenureTypeEnum tenureTypeEnum, final BigDecimal reccuringInterestRate, final BigDecimal savingInterestRate, final Integer tenure,
SavingProductType savingProductType, SavingFrequencyType savingFrequencyType, final LocalDate commencementDate, final TenureTypeEnum tenureTypeEnum, final SavingProductType savingProductType,
SavingInterestCalculationMethod savingInterestCalculationMethod, boolean isLockinPeriodAllowed, Integer lockinPeriod, final SavingFrequencyType savingFrequencyType, final SavingInterestCalculationMethod savingInterestCalculationMethod,
PeriodFrequencyType lockinPeriodType, ReccuringDepositInterestCalculator reccuringDepositInterestCalculator, Integer payEvery, final boolean isLockinPeriodAllowed, final Integer lockinPeriod, final PeriodFrequencyType lockinPeriodType,
SavingsInterestType interestType, Integer interestPostEvery, Integer interestPostFrequency) { final ReccuringDepositInterestCalculator reccuringDepositInterestCalculator, final Integer payEvery,
final SavingsInterestType interestType, final Integer interestPostEvery, final Integer interestPostFrequency) {
Money futureValueOnMaturity = null; Money futureValueOnMaturity = null;
if (savingProductType.isReccuring() && tenureTypeEnum.isFixedPeriod()) { if (savingProductType.isReccuring() && tenureTypeEnum.isFixedPeriod()) {
futureValueOnMaturity = reccuringDepositInterestCalculator futureValueOnMaturity = reccuringDepositInterestCalculator.calculateInterestOnMaturityFor(savingsDeposit, tenure,
.calculateInterestOnMaturityFor(savingsDeposit, tenure, reccuringInterestRate, commencementDate, tenureTypeEnum, reccuringInterestRate, savingFrequencyType, savingInterestCalculationMethod, payEvery);
savingFrequencyType, savingInterestCalculationMethod, payEvery);
} else if (savingProductType.isReccuring() && tenureTypeEnum.isPerpetual()) { } else if (savingProductType.isReccuring() && tenureTypeEnum.isPerpetual()) {
futureValueOnMaturity = savingsDeposit; futureValueOnMaturity = savingsDeposit;
} else { } else {
@@ -432,7 +434,7 @@ public class SavingAccount extends AbstractAuditableCustom<AppUser, Long> {
this.savingScheduleInstallments.add(installment); this.savingScheduleInstallments.add(installment);
} }
public void reject(LocalDate rejectedOn, DepositLifecycleStateMachine depositLifecycleStateMachine) { public void reject(final LocalDate rejectedOn, final DepositLifecycleStateMachine depositLifecycleStateMachine) {
DepositAccountStatus statusEnum = depositLifecycleStateMachine.transition(DepositAccountEvent.DEPOSIT_REJECTED, DepositAccountStatus statusEnum = depositLifecycleStateMachine.transition(DepositAccountEvent.DEPOSIT_REJECTED,
DepositAccountStatus.fromInt(this.accountStatus)); DepositAccountStatus.fromInt(this.accountStatus));
@@ -467,7 +469,7 @@ public class SavingAccount extends AbstractAuditableCustom<AppUser, Long> {
return date; return date;
} }
public void withdrawnByApplicant(LocalDate withdrawnOn, DepositLifecycleStateMachine depositLifecycleStateMachine) { public void withdrawnByApplicant(final LocalDate withdrawnOn, final DepositLifecycleStateMachine depositLifecycleStateMachine) {
DepositAccountStatus statusEnum = depositLifecycleStateMachine.transition(DepositAccountEvent.DEPOSIT_WITHDRAWN, DepositAccountStatus statusEnum = depositLifecycleStateMachine.transition(DepositAccountEvent.DEPOSIT_WITHDRAWN,
DepositAccountStatus.fromInt(this.accountStatus)); DepositAccountStatus.fromInt(this.accountStatus));
@@ -493,7 +495,7 @@ public class SavingAccount extends AbstractAuditableCustom<AppUser, Long> {
} }
} }
public void undoSavingAccountApproval(DepositLifecycleStateMachine depositLifecycleStateMachine) { public void undoSavingAccountApproval(final DepositLifecycleStateMachine depositLifecycleStateMachine) {
DepositAccountStatus statusEnum = depositLifecycleStateMachine.transition(DepositAccountEvent.DEPOSIT_APPROVAL_UNDO, DepositAccountStatus statusEnum = depositLifecycleStateMachine.transition(DepositAccountEvent.DEPOSIT_APPROVAL_UNDO,
DepositAccountStatus.fromInt(this.accountStatus)); DepositAccountStatus.fromInt(this.accountStatus));
this.accountStatus = statusEnum.getValue(); this.accountStatus = statusEnum.getValue();
@@ -501,10 +503,12 @@ public class SavingAccount extends AbstractAuditableCustom<AppUser, Long> {
this.closedOnDate = new Date(); this.closedOnDate = new Date();
} }
public void approveSavingAccount(LocalDate approvalDate, BigDecimal savingsDepositAmountPerPeriod, BigDecimal recurringInterestRate, public void approveSavingAccount(final LocalDate approvalDate, final BigDecimal savingsDepositAmountPerPeriod,
BigDecimal savingInterestRate, Integer interestType, Integer tenure, Integer tenureType, Integer frequency, Integer payEvery, final BigDecimal recurringInterestRate, final BigDecimal savingInterestRate, final Integer interestType, final Integer tenure,
DepositLifecycleStateMachine depositLifecycleStateMachine, final Integer tenureType, final Integer frequency, final Integer payEvery,
ReccuringDepositInterestCalculator reccuringDepositInterestCalculator, Integer interestPostEvery, Integer interestPostFrequency) { final DepositLifecycleStateMachine depositLifecycleStateMachine,
final ReccuringDepositInterestCalculator reccuringDepositInterestCalculator, final Integer interestPostEvery,
final Integer interestPostFrequency) {
DepositAccountStatus statusEnum = depositLifecycleStateMachine.transition(DepositAccountEvent.DEPOSIT_APPROVED, DepositAccountStatus statusEnum = depositLifecycleStateMachine.transition(DepositAccountEvent.DEPOSIT_APPROVED,
DepositAccountStatus.fromInt(this.accountStatus)); DepositAccountStatus.fromInt(this.accountStatus));
@@ -518,7 +522,7 @@ public class SavingAccount extends AbstractAuditableCustom<AppUser, Long> {
Money futureValueOnMaturity = null; Money futureValueOnMaturity = null;
if (SavingProductType.fromInt(this.savingProductType).isReccuring() && tenureTypeEnum.isFixedPeriod()) { if (SavingProductType.fromInt(this.savingProductType).isReccuring() && tenureTypeEnum.isFixedPeriod()) {
futureValueOnMaturity = reccuringDepositInterestCalculator.calculateInterestOnMaturityFor(savingsAmountPerPeriod, tenure, futureValueOnMaturity = reccuringDepositInterestCalculator.calculateInterestOnMaturityFor(savingsAmountPerPeriod, tenure,
recurringInterestRate, approvalDate, tenureTypeEnum, savingFrequencyType, interestCalculationMethod, payEvery); recurringInterestRate, savingFrequencyType, interestCalculationMethod, payEvery);
} else if (SavingProductType.fromInt(this.savingProductType).isReccuring() && tenureTypeEnum.isPerpetual()) { } else if (SavingProductType.fromInt(this.savingProductType).isReccuring() && tenureTypeEnum.isPerpetual()) {
futureValueOnMaturity = savingsAmountPerPeriod; futureValueOnMaturity = savingsAmountPerPeriod;
} else { } else {
@@ -552,7 +556,7 @@ public class SavingAccount extends AbstractAuditableCustom<AppUser, Long> {
this.interestPostedAmount = BigDecimal.ZERO; this.interestPostedAmount = BigDecimal.ZERO;
} }
public void depositMoney(SavingAccountDepositCommand command) { public void depositMoney(final SavingAccountDepositCommand command) {
BigDecimal depositAmount = BigDecimal.ZERO; BigDecimal depositAmount = BigDecimal.ZERO;
BigDecimal remainAmountToBePaid = BigDecimal.ZERO; BigDecimal remainAmountToBePaid = BigDecimal.ZERO;
@@ -600,7 +604,7 @@ public class SavingAccount extends AbstractAuditableCustom<AppUser, Long> {
return DepositAccountStatus.fromInt(this.accountStatus).isActive(); return DepositAccountStatus.fromInt(this.accountStatus).isActive();
} }
public void withdrawAmount(BigDecimal amount, LocalDate transactionDate) { public void withdrawAmount(final BigDecimal amount, final LocalDate transactionDate) {
this.outstandingAmount = this.outstandingAmount.subtract(amount); this.outstandingAmount = this.outstandingAmount.subtract(amount);
SavingAccountTransaction savingAccountTransaction = SavingAccountTransaction.withdraw(amount, transactionDate); SavingAccountTransaction savingAccountTransaction = SavingAccountTransaction.withdraw(amount, transactionDate);
savingAccountTransaction.updateAccount(this); savingAccountTransaction.updateAccount(this);
@@ -26,12 +26,12 @@ import org.mifosplatform.useradministration.domain.AppUser;
@Entity @Entity
@Table(name = "m_saving_account_transaction") @Table(name = "m_saving_account_transaction")
public class SavingAccountTransaction extends AbstractAuditableCustom<AppUser, Long> { public class SavingAccountTransaction extends AbstractAuditableCustom<AppUser, Long> {
@SuppressWarnings("unused")
@ManyToOne(optional = false) @ManyToOne(optional = false)
@JoinColumn(name = "saving_account_id", nullable = false) @JoinColumn(name = "saving_account_id", nullable = false)
private SavingAccount savingAccount; private SavingAccount savingAccount;
// @Enumerated(EnumType.ORDINAL)
@Column(name = "transaction_type_enum", nullable = false) @Column(name = "transaction_type_enum", nullable = false)
private Integer typeOf; private Integer typeOf;
@@ -46,49 +46,51 @@ public class SavingAccountTransaction extends AbstractAuditableCustom<AppUser, L
@Column(name = "amount", scale = 6, precision = 19, nullable = false) @Column(name = "amount", scale = 6, precision = 19, nullable = false)
private final BigDecimal amount; private final BigDecimal amount;
public SavingAccountTransaction() { public SavingAccountTransaction() {
this.transactionDate = null; this.transactionDate = null;
this.amount = BigDecimal.ZERO; this.amount = BigDecimal.ZERO;
} }
public SavingAccountTransaction(DepositAccountTransactionType transactionType, BigDecimal amount, LocalDate paymentDate) { public SavingAccountTransaction(final DepositAccountTransactionType transactionType, final BigDecimal amount,
this.typeOf = transactionType.getValue(); final LocalDate paymentDate) {
this.amount = amount; this.typeOf = transactionType.getValue();
this.transactionDate =paymentDate.toDate(); this.amount = amount;
} this.transactionDate = paymentDate.toDate();
}
public static SavingAccountTransaction deposit(BigDecimal amount, LocalDate paymentDate) { public static SavingAccountTransaction deposit(final BigDecimal amount, final LocalDate paymentDate) {
return new SavingAccountTransaction(DepositAccountTransactionType.DEPOSIT, amount == null ? new BigDecimal(0) : amount, paymentDate); return new SavingAccountTransaction(DepositAccountTransactionType.DEPOSIT, amount == null ? new BigDecimal(0) : amount, paymentDate);
} }
public static SavingAccountTransaction withdraw(BigDecimal amount, LocalDate paymentDate) {
return new SavingAccountTransaction(DepositAccountTransactionType.WITHDRAW, amount == null ? new BigDecimal(0) : amount, paymentDate);
}
public static SavingAccountTransaction postInterest(BigDecimal amount, LocalDate paymentDate) {
return new SavingAccountTransaction(DepositAccountTransactionType.INTEREST_POSTING, amount == null ? new BigDecimal(0) : amount, paymentDate);
}
public void updateAccount(SavingAccount savingAccount) { public static SavingAccountTransaction withdraw(final BigDecimal amount, final LocalDate paymentDate) {
this.savingAccount = savingAccount; return new SavingAccountTransaction(DepositAccountTransactionType.WITHDRAW, amount == null ? new BigDecimal(0) : amount,
} paymentDate);
}
public DepositAccountTransactionType getTypeOf() { public static SavingAccountTransaction postInterest(final BigDecimal amount, final LocalDate paymentDate) {
return DepositAccountTransactionType.fromInt(this.typeOf); return new SavingAccountTransaction(DepositAccountTransactionType.INTEREST_POSTING, amount == null ? new BigDecimal(0) : amount,
} paymentDate);
}
public BigDecimal getAmount() { public void updateAccount(final SavingAccount savingAccount) {
return this.amount; this.savingAccount = savingAccount;
} }
public DepositAccountTransactionType getTypeOf() {
return DepositAccountTransactionType.fromInt(this.typeOf);
}
public BigDecimal getAmount() {
return this.amount;
}
public LocalDate getTransactionDate() {
LocalDate transactionDate = null;
if (this.transactionDate != null) {
transactionDate = new LocalDate(this.transactionDate);
}
return transactionDate;
}
public LocalDate getTransactionDate() {
LocalDate transactionDate = null;
if(this.transactionDate != null){
transactionDate = new LocalDate(this.transactionDate);
}
return transactionDate;
}
} }
@@ -48,7 +48,8 @@ public class SavingAccountReadPlatformServiceImpl implements SavingAccountReadPl
@Autowired @Autowired
public SavingAccountReadPlatformServiceImpl(final PlatformSecurityContext context, final TenantAwareRoutingDataSource dataSource, public SavingAccountReadPlatformServiceImpl(final PlatformSecurityContext context, final TenantAwareRoutingDataSource dataSource,
ClientReadPlatformService clientReadPlatformService, SavingProductReadPlatformService savingProductReadPlatformService) { final ClientReadPlatformService clientReadPlatformService,
final SavingProductReadPlatformService savingProductReadPlatformService) {
this.context = context; this.context = context;
this.jdbcTemplate = new JdbcTemplate(dataSource); this.jdbcTemplate = new JdbcTemplate(dataSource);
this.clientReadPlatformService = clientReadPlatformService; this.clientReadPlatformService = clientReadPlatformService;
@@ -66,7 +67,7 @@ public class SavingAccountReadPlatformServiceImpl implements SavingAccountReadPl
} }
@Override @Override
public SavingAccountData retrieveSavingsAccount(Long accountId) { public SavingAccountData retrieveSavingsAccount(final Long accountId) {
this.context.authenticatedUser(); this.context.authenticatedUser();
SavingAccountMapper mapper = new SavingAccountMapper(); SavingAccountMapper mapper = new SavingAccountMapper();
@@ -100,7 +101,7 @@ public class SavingAccountReadPlatformServiceImpl implements SavingAccountReadPl
} }
@Override @Override
public SavingAccountData mapRow(ResultSet rs, @SuppressWarnings("unused") int rowNum) throws SQLException { public SavingAccountData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException {
Long id = rs.getLong("id"); Long id = rs.getLong("id");
String externalId = rs.getString("externalId"); String externalId = rs.getString("externalId");
@@ -174,7 +175,7 @@ public class SavingAccountReadPlatformServiceImpl implements SavingAccountReadPl
} }
@Override @Override
public SavingAccountData retrieveNewSavingsAccountDetails(Long clientId, Long productId) { public SavingAccountData retrieveNewSavingsAccountDetails(final Long clientId, final Long productId) {
context.authenticatedUser(); context.authenticatedUser();
ClientData clientAccount = this.clientReadPlatformService.retrieveIndividualClient(clientId); ClientData clientAccount = this.clientReadPlatformService.retrieveIndividualClient(clientId);
@@ -190,9 +191,8 @@ public class SavingAccountReadPlatformServiceImpl implements SavingAccountReadPl
selectedProduct.getName(), currency, selectedProduct.getInterestRate(), selectedProduct.getSavingsDepositAmount(), selectedProduct.getName(), currency, selectedProduct.getInterestRate(), selectedProduct.getSavingsDepositAmount(),
selectedProduct.getSavingProductType(), selectedProduct.getTenureType(), selectedProduct.getTenure(), selectedProduct.getSavingProductType(), selectedProduct.getTenureType(), selectedProduct.getTenure(),
selectedProduct.getSavingFrequencyType(), selectedProduct.getInterestType(), selectedProduct.getSavingFrequencyType(), selectedProduct.getInterestType(),
selectedProduct.getInterestCalculationMethod(), selectedProduct.getMinimumBalanceForWithdrawal(), selectedProduct.getInterestCalculationMethod(), selectedProduct.isLockinPeriodAllowed(),
selectedProduct.isPartialDepositAllowed(), selectedProduct.isLockinPeriodAllowed(), selectedProduct.getLockinPeriod(), selectedProduct.getLockinPeriod(), selectedProduct.getLockinPeriodType(), selectedProduct.getDepositEvery());
selectedProduct.getLockinPeriodType(), selectedProduct.getDepositEvery());
} else { } else {
accountData = SavingAccountData.createFrom(clientAccount.id(), clientAccount.displayName()); accountData = SavingAccountData.createFrom(clientAccount.id(), clientAccount.displayName());
@@ -200,7 +200,7 @@ public class SavingAccountReadPlatformServiceImpl implements SavingAccountReadPl
return accountData; return accountData;
} }
private SavingProductData findSavingProductById(Collection<SavingProductLookup> savingProducts, Long productId) { private SavingProductData findSavingProductById(final Collection<SavingProductLookup> savingProducts, final Long productId) {
SavingProductData match = this.savingProductReadPlatformService.retrieveNewSavingProductDetails(); SavingProductData match = this.savingProductReadPlatformService.retrieveNewSavingProductDetails();
for (SavingProductLookup savingProductLookup : savingProducts) { for (SavingProductLookup savingProductLookup : savingProducts) {
if (savingProductLookup.hasId(productId)) { if (savingProductLookup.hasId(productId)) {
@@ -212,7 +212,7 @@ public class SavingAccountReadPlatformServiceImpl implements SavingAccountReadPl
} }
@Override @Override
public SavingPermissionData retrieveSavingAccountPermissions(SavingAccountData savingAccountData) { public SavingPermissionData retrieveSavingAccountPermissions(final SavingAccountData savingAccountData) {
boolean pendingApproval = (savingAccountData.getStatus().getId().equals(100L)); boolean pendingApproval = (savingAccountData.getStatus().getId().equals(100L));
boolean undoApprovalAllowed = (savingAccountData.getStatus().getId().equals(300L)); boolean undoApprovalAllowed = (savingAccountData.getStatus().getId().equals(300L));
boolean renewelAllowed = false; boolean renewelAllowed = false;
@@ -230,7 +230,7 @@ public class SavingAccountReadPlatformServiceImpl implements SavingAccountReadPl
@SuppressWarnings("unused") @SuppressWarnings("unused")
@Override @Override
public BigDecimal deriveSavingDueAmount(SavingAccountData account) { public BigDecimal deriveSavingDueAmount(final SavingAccountData account) {
BigDecimal dueAmount = BigDecimal.ZERO; BigDecimal dueAmount = BigDecimal.ZERO;
EnumOptionData status = account.getStatus(); EnumOptionData status = account.getStatus();
@@ -254,7 +254,7 @@ public class SavingAccountReadPlatformServiceImpl implements SavingAccountReadPl
} }
@Override @Override
public SavingScheduleData retrieveSavingsAccountSchedule(Long accountId, CurrencyData currency) { public SavingScheduleData retrieveSavingsAccountSchedule(final Long accountId, final CurrencyData currency) {
this.context.authenticatedUser(); this.context.authenticatedUser();
SavingAccountScheduleMapper mapper = new SavingAccountScheduleMapper(); SavingAccountScheduleMapper mapper = new SavingAccountScheduleMapper();
String sql = "Select " + mapper.savingScheduleSchema() + " where ss.saving_account_id =? order by ss.installment"; String sql = "Select " + mapper.savingScheduleSchema() + " where ss.saving_account_id =? order by ss.installment";
@@ -281,7 +281,7 @@ public class SavingAccountReadPlatformServiceImpl implements SavingAccountReadPl
} }
@Override @Override
public SavingSchedulePeriodData mapRow(ResultSet rs, @SuppressWarnings("unused") int rowNum) throws SQLException { public SavingSchedulePeriodData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException {
LocalDate dueDate = JdbcSupport.getLocalDate(rs, "dueDate"); LocalDate dueDate = JdbcSupport.getLocalDate(rs, "dueDate");
Integer installment = JdbcSupport.getInteger(rs, "installment"); Integer installment = JdbcSupport.getInteger(rs, "installment");
@@ -308,7 +308,7 @@ public class SavingAccountReadPlatformServiceImpl implements SavingAccountReadPl
} }
@Override @Override
public SavingAccountForLookup mapRow(ResultSet rs, @SuppressWarnings("unused") int rowNum) throws SQLException { public SavingAccountForLookup mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException {
Long id = rs.getLong("id"); Long id = rs.getLong("id");
return new SavingAccountForLookup(id); return new SavingAccountForLookup(id);
} }
@@ -316,7 +316,7 @@ public class SavingAccountReadPlatformServiceImpl implements SavingAccountReadPl
} }
@Override @Override
public Collection<SavingAccountTransactionsData> retrieveSavingsAccountTransactions(Long accountId) { public Collection<SavingAccountTransactionsData> retrieveSavingsAccountTransactions(final Long accountId) {
this.context.authenticatedUser(); this.context.authenticatedUser();
SavingAccountTransactionMapper savingAccountTransactionMapper = new SavingAccountTransactionMapper(); SavingAccountTransactionMapper savingAccountTransactionMapper = new SavingAccountTransactionMapper();
String sql = "select " + savingAccountTransactionMapper.schema() + " where stxn.saving_account_id = ? "; String sql = "select " + savingAccountTransactionMapper.schema() + " where stxn.saving_account_id = ? ";
@@ -330,7 +330,7 @@ public class SavingAccountReadPlatformServiceImpl implements SavingAccountReadPl
} }
@Override @Override
public SavingAccountTransactionsData mapRow(ResultSet rs, @SuppressWarnings("unused") int rowNum) throws SQLException { public SavingAccountTransactionsData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException {
Long id = rs.getLong("id"); Long id = rs.getLong("id");
LocalDate transactionDate = JdbcSupport.getLocalDate(rs, "transactionDate"); LocalDate transactionDate = JdbcSupport.getLocalDate(rs, "transactionDate");
Integer transactionTypeValue = JdbcSupport.getInteger(rs, "type"); Integer transactionTypeValue = JdbcSupport.getInteger(rs, "type");
@@ -562,14 +562,14 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
return date; return date;
} }
public void updateAccount(DepositAccount account) { public void updateAccount(final DepositAccount account) {
this.renewdAccount = account; this.renewdAccount = account;
} }
public void withdrawDepositAccountMoney(DepositLifecycleStateMachine depositLifecycleStateMachine, public void withdrawDepositAccountMoney(final DepositLifecycleStateMachine depositLifecycleStateMachine,
FixedTermDepositInterestCalculator fixedTermDepositInterestCalculator, LocalDate eventDate) { final FixedTermDepositInterestCalculator fixedTermDepositInterestCalculator, final LocalDate eventDate) {
if (eventDate.isBefore(getLastInterestPostedDate())) { if (eventDate.isBefore(getLastInterestPostedDate())) {
final String errorMessage = "Deposit Account Preclosed date \"" + eventDate + "\"cannot before last interest posted date \"" final String errorMessage = "Deposit Account Preclosed date \"" + eventDate + "\"cannot before last interest posted date \""
@@ -647,7 +647,7 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
* } * }
*/ */
public void withdrawInterest(Money interest) { public void withdrawInterest(final Money interest) {
@SuppressWarnings("unused") @SuppressWarnings("unused")
boolean statustest = isActive(); boolean statustest = isActive();
if (isActive()) { if (isActive()) {
@@ -662,7 +662,7 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
} }
public void closeDepositAccount(DepositLifecycleStateMachine depositLifecycleStateMachine) { public void closeDepositAccount(final DepositLifecycleStateMachine depositLifecycleStateMachine) {
DepositAccountStatus statusEnumForClose = depositLifecycleStateMachine.transition(DepositAccountEvent.DEPOSIT_CLOSED, DepositAccountStatus statusEnumForClose = depositLifecycleStateMachine.transition(DepositAccountEvent.DEPOSIT_CLOSED,
DepositAccountStatus.fromInt(this.depositStatus)); DepositAccountStatus.fromInt(this.depositStatus));
this.depositStatus = statusEnumForClose.getValue(); this.depositStatus = statusEnumForClose.getValue();
@@ -732,7 +732,7 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
return DepositAccountStatus.fromInt(this.depositStatus).isActive(); return DepositAccountStatus.fromInt(this.depositStatus).isActive();
} }
public void postInterestForDepositAccount(DepositAccount account, FixedTermDepositInterestCalculator fixedTermDepositInterestCalculator) { public void postInterestForDepositAccount(final FixedTermDepositInterestCalculator fixedTermDepositInterestCalculator) {
LocalDate lastInterestPostedDate = getLastInterestPostedDate(); LocalDate lastInterestPostedDate = getLastInterestPostedDate();
LocalDate nextInterestPostingDate = getNextInterestPostedDate(); LocalDate nextInterestPostingDate = getNextInterestPostedDate();
@@ -57,26 +57,31 @@ public class DepositAccountAssembler {
} }
public DepositAccount assembleFrom(final JsonCommand command) { public DepositAccount assembleFrom(final JsonCommand command) {
final JsonElement element = command.parsedJson(); final JsonElement element = command.parsedJson();
final Long clientId = fromApiJsonHelper.extractLongNamed("clientId", element); final Long clientId = fromApiJsonHelper.extractLongNamed("clientId", element);
final Long productId = fromApiJsonHelper.extractLongNamed("productId", element); final Long productId = fromApiJsonHelper.extractLongNamed("productId", element);
final String externalId = fromApiJsonHelper.extractStringNamed("externalId", element); final String externalId = fromApiJsonHelper.extractStringNamed("externalId", element);
final Boolean isInterestWithdrawable = fromApiJsonHelper.extractBooleanNamed("isInterestWithdrawable", element); final Boolean isInterestWithdrawable = fromApiJsonHelper.extractBooleanNamed("isInterestWithdrawable", element);
final BigDecimal depositValue = fromApiJsonHelper.extractBigDecimalWithLocaleNamed("deposit", element); final BigDecimal depositValue = fromApiJsonHelper.extractBigDecimalWithLocaleNamed("deposit", element);
final Integer tenureInMonthsCommandValue = fromApiJsonHelper.extractIntegerNamed("tenureInMonths", element, Locale.getDefault()); final Integer tenureInMonthsCommandValue = fromApiJsonHelper.extractIntegerNamed("tenureInMonths", element, Locale.getDefault());
final BigDecimal maturityInterestRateCommandValue = fromApiJsonHelper.extractBigDecimalWithLocaleNamed("maturityInterestRate", element); final BigDecimal maturityInterestRateCommandValue = fromApiJsonHelper.extractBigDecimalWithLocaleNamed("maturityInterestRate",
final BigDecimal preClosureInterestRateCommandValue = fromApiJsonHelper.extractBigDecimalWithLocaleNamed("preClosureInterestRate", element); element);
final Integer interestCompoundedEveryCommandValue = fromApiJsonHelper.extractIntegerNamed("interestCompoundedEvery", element, Locale.getDefault()); final BigDecimal preClosureInterestRateCommandValue = fromApiJsonHelper.extractBigDecimalWithLocaleNamed("preClosureInterestRate",
final Integer interestCompoundedEveryPeriodTypeCommandValue = fromApiJsonHelper.extractIntegerNamed("interestCompoundedEveryPeriodType", element, Locale.getDefault()); element);
final Boolean renewalAllowedCommandValue = fromApiJsonHelper.extractBooleanNamed("renewalAllowed", element); final Integer interestCompoundedEveryCommandValue = fromApiJsonHelper.extractIntegerNamed("interestCompoundedEvery", element,
final Boolean preClosureAllowedCommandValue = fromApiJsonHelper.extractBooleanNamed("preClosureAllowed", element); Locale.getDefault());
final Boolean interestCompoundingAllowedCommandValue = fromApiJsonHelper.extractBooleanNamed("interestCompoundingAllowed", element); final Integer interestCompoundedEveryPeriodTypeCommandValue = fromApiJsonHelper.extractIntegerNamed(
final Boolean isLockinPeriodAllowedCommandValue = fromApiJsonHelper.extractBooleanNamed("isLockinPeriodAllowed", element); "interestCompoundedEveryPeriodType", element, Locale.getDefault());
final Integer lockinPeriodCommandValue = fromApiJsonHelper.extractIntegerNamed("lockinPeriod", element, Locale.getDefault()); final Boolean renewalAllowedCommandValue = fromApiJsonHelper.extractBooleanNamed("renewalAllowed", element);
final Integer lockinPeriodTypeCommandValue = fromApiJsonHelper.extractIntegerNamed("lockinPeriodType", element, Locale.getDefault()); final Boolean preClosureAllowedCommandValue = fromApiJsonHelper.extractBooleanNamed("preClosureAllowed", element);
final LocalDate commencementDate = fromApiJsonHelper.extractLocalDateNamed("commencementDate", element); final Boolean interestCompoundingAllowedCommandValue = fromApiJsonHelper.extractBooleanNamed("interestCompoundingAllowed", element);
final Boolean isLockinPeriodAllowedCommandValue = fromApiJsonHelper.extractBooleanNamed("isLockinPeriodAllowed", element);
final Integer lockinPeriodCommandValue = fromApiJsonHelper.extractIntegerNamed("lockinPeriod", element, Locale.getDefault());
final Integer lockinPeriodTypeCommandValue = fromApiJsonHelper
.extractIntegerNamed("lockinPeriodType", element, Locale.getDefault());
final LocalDate commencementDate = fromApiJsonHelper.extractLocalDateNamed("commencementDate", element);
Client client = this.clientRepository.findOne(clientId); Client client = this.clientRepository.findOne(clientId);
if (client == null || client.isDeleted()) { throw new ClientNotFoundException(clientId); } if (client == null || client.isDeleted()) { throw new ClientNotFoundException(clientId); }
@@ -147,10 +152,9 @@ public class DepositAccountAssembler {
// end of details allowed to be overriden from product // end of details allowed to be overriden from product
DepositAccount account = new DepositAccount().openNew(client, product, externalId, deposit, maturityInterestRate, DepositAccount account = new DepositAccount().openNew(client, product, externalId, deposit, maturityInterestRate,
preClosureInterestRate, tenureInMonths, compoundingInterestEvery, compoundingInterestFrequency, preClosureInterestRate, tenureInMonths, compoundingInterestEvery, compoundingInterestFrequency, commencementDate,
commencementDate, renewalAllowed, preClosureAllowed, this.fixedTermDepositInterestCalculator, renewalAllowed, preClosureAllowed, this.fixedTermDepositInterestCalculator, defaultDepositLifecycleStateMachine(),
defaultDepositLifecycleStateMachine(), isInterestWithdrawable, interestCompoundingAllowed, isLockinPeriodAllowed, isInterestWithdrawable, interestCompoundingAllowed, isLockinPeriodAllowed, lockinPeriod, lockinPeriodType);
lockinPeriod, lockinPeriodType);
return account; return account;
} }
@@ -160,10 +164,10 @@ public class DepositAccountAssembler {
return new DepositLifecycleStateMachineImpl(allowedDepositStatuses); return new DepositLifecycleStateMachineImpl(allowedDepositStatuses);
} }
public DepositAccount assembleFrom(DepositAccount account, JsonCommand command) { public DepositAccount assembleFrom(final DepositAccount account, final JsonCommand command) {
final Map<String, Object> actualChanges = new LinkedHashMap<String, Object>(20); final Map<String, Object> actualChanges = new LinkedHashMap<String, Object>(20);
final String localeAsInput = command.locale(); final String localeAsInput = command.locale();
Client client = account.client(); Client client = account.client();
@@ -178,7 +182,7 @@ public class DepositAccountAssembler {
actualChanges.put(productIdParamName, newValue); actualChanges.put(productIdParamName, newValue);
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
} }
Money deposit = account.getDeposit(); Money deposit = account.getDeposit();
final String depositParamName = "deposit"; final String depositParamName = "deposit";
if (command.isChangeInBigDecimalParameterNamed(depositParamName, deposit.getAmount())) { if (command.isChangeInBigDecimalParameterNamed(depositParamName, deposit.getAmount())) {
@@ -229,7 +233,8 @@ public class DepositAccountAssembler {
PeriodFrequencyType interestCompoundedEveryPeriodType = account.getInterestCompoundedFrequencyType(); PeriodFrequencyType interestCompoundedEveryPeriodType = account.getInterestCompoundedFrequencyType();
final String interestCompoundedEveryPeriodTypeParamName = "interestCompoundedEveryPeriodType"; final String interestCompoundedEveryPeriodTypeParamName = "interestCompoundedEveryPeriodType";
if (command.isChangeInIntegerParameterNamed(interestCompoundedEveryPeriodTypeParamName, interestCompoundedEveryPeriodType.getValue())) { if (command.isChangeInIntegerParameterNamed(interestCompoundedEveryPeriodTypeParamName,
interestCompoundedEveryPeriodType.getValue())) {
final Integer newValue = command.integerValueOfParameterNamed(interestCompoundedEveryPeriodTypeParamName); final Integer newValue = command.integerValueOfParameterNamed(interestCompoundedEveryPeriodTypeParamName);
actualChanges.put(interestCompoundedEveryPeriodTypeParamName, newValue); actualChanges.put(interestCompoundedEveryPeriodTypeParamName, newValue);
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
@@ -239,7 +244,7 @@ public class DepositAccountAssembler {
Boolean renewalAllowed = account.isRenewalAllowed(); Boolean renewalAllowed = account.isRenewalAllowed();
final String renewalAllowedParamName = "renewalAllowed"; final String renewalAllowedParamName = "renewalAllowed";
if (command.isChangeInBooleanParameterNamed(renewalAllowedParamName, renewalAllowed)) { if (command.isChangeInBooleanParameterNamed(renewalAllowedParamName, renewalAllowed)) {
final Boolean newValue = command.booleanObjectValueOfParameterNamed(renewalAllowedParamName); final Boolean newValue = command.booleanObjectValueOfParameterNamed(renewalAllowedParamName);
actualChanges.put(renewalAllowedParamName, newValue); actualChanges.put(renewalAllowedParamName, newValue);
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
renewalAllowed = newValue; renewalAllowed = newValue;
@@ -248,7 +253,7 @@ public class DepositAccountAssembler {
Boolean preClosureAllowed = account.isPreClosureAllowed(); Boolean preClosureAllowed = account.isPreClosureAllowed();
final String preClosureAllowedParamName = "preClosureAllowed"; final String preClosureAllowedParamName = "preClosureAllowed";
if (command.isChangeInBooleanParameterNamed(preClosureAllowedParamName, preClosureAllowed)) { if (command.isChangeInBooleanParameterNamed(preClosureAllowedParamName, preClosureAllowed)) {
final Boolean newValue = command.booleanObjectValueOfParameterNamed(preClosureAllowedParamName); final Boolean newValue = command.booleanObjectValueOfParameterNamed(preClosureAllowedParamName);
actualChanges.put(preClosureAllowedParamName, newValue); actualChanges.put(preClosureAllowedParamName, newValue);
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
preClosureAllowed = newValue; preClosureAllowed = newValue;
@@ -257,7 +262,7 @@ public class DepositAccountAssembler {
Boolean isInterestWithdrawable = account.isInterestWithdrawable(); Boolean isInterestWithdrawable = account.isInterestWithdrawable();
final String isInterestWithdrawableParamName = "isInterestWithdrawable"; final String isInterestWithdrawableParamName = "isInterestWithdrawable";
if (command.isChangeInBooleanParameterNamed(isInterestWithdrawableParamName, isInterestWithdrawable)) { if (command.isChangeInBooleanParameterNamed(isInterestWithdrawableParamName, isInterestWithdrawable)) {
final Boolean newValue = command.booleanObjectValueOfParameterNamed(isInterestWithdrawableParamName); final Boolean newValue = command.booleanObjectValueOfParameterNamed(isInterestWithdrawableParamName);
actualChanges.put(isInterestWithdrawableParamName, newValue); actualChanges.put(isInterestWithdrawableParamName, newValue);
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
isInterestWithdrawable = newValue; isInterestWithdrawable = newValue;
@@ -266,7 +271,7 @@ public class DepositAccountAssembler {
Boolean isInterestCompoundingAllowed = account.isInterestCompoundingAllowed(); Boolean isInterestCompoundingAllowed = account.isInterestCompoundingAllowed();
final String isInterestCompoundingAllowedParamName = "interestCompoundingAllowed"; final String isInterestCompoundingAllowedParamName = "interestCompoundingAllowed";
if (command.isChangeInBooleanParameterNamed(isInterestCompoundingAllowedParamName, isInterestCompoundingAllowed)) { if (command.isChangeInBooleanParameterNamed(isInterestCompoundingAllowedParamName, isInterestCompoundingAllowed)) {
final Boolean newValue = command.booleanObjectValueOfParameterNamed(isInterestCompoundingAllowedParamName); final Boolean newValue = command.booleanObjectValueOfParameterNamed(isInterestCompoundingAllowedParamName);
actualChanges.put(isInterestCompoundingAllowedParamName, newValue); actualChanges.put(isInterestCompoundingAllowedParamName, newValue);
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
isInterestCompoundingAllowed = newValue; isInterestCompoundingAllowed = newValue;
@@ -275,14 +280,14 @@ public class DepositAccountAssembler {
Boolean isLockinPeriodAllowed = account.isLockinPeriodAllowed(); Boolean isLockinPeriodAllowed = account.isLockinPeriodAllowed();
final String isLockinPeriodAllowedParamName = "isLockinPeriodAllowed"; final String isLockinPeriodAllowedParamName = "isLockinPeriodAllowed";
if (command.isChangeInBooleanParameterNamed(isLockinPeriodAllowedParamName, isLockinPeriodAllowed)) { if (command.isChangeInBooleanParameterNamed(isLockinPeriodAllowedParamName, isLockinPeriodAllowed)) {
final Boolean newValue = command.booleanObjectValueOfParameterNamed(isLockinPeriodAllowedParamName); final Boolean newValue = command.booleanObjectValueOfParameterNamed(isLockinPeriodAllowedParamName);
actualChanges.put(isLockinPeriodAllowedParamName, newValue); actualChanges.put(isLockinPeriodAllowedParamName, newValue);
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
isLockinPeriodAllowed = newValue; isLockinPeriodAllowed = newValue;
} }
Integer lockinPeriod = account.getLockinPeriod(); Integer lockinPeriod = account.getLockinPeriod();
final String lockinPeriodParamName = "lockinPeriod"; final String lockinPeriodParamName = "lockinPeriod";
if (command.isChangeInIntegerParameterNamed(lockinPeriodParamName, lockinPeriod)) { if (command.isChangeInIntegerParameterNamed(lockinPeriodParamName, lockinPeriod)) {
final Integer newValue = command.integerValueOfParameterNamed(lockinPeriodParamName); final Integer newValue = command.integerValueOfParameterNamed(lockinPeriodParamName);
actualChanges.put(lockinPeriodParamName, newValue); actualChanges.put(lockinPeriodParamName, newValue);
@@ -291,7 +296,7 @@ public class DepositAccountAssembler {
} }
PeriodFrequencyType lockinPeriodType = account.getLockinPeriodType(); PeriodFrequencyType lockinPeriodType = account.getLockinPeriodType();
final String lockinPeriodTypeParamName = "lockinPeriodType"; final String lockinPeriodTypeParamName = "lockinPeriodType";
if (command.isChangeInIntegerParameterNamed(lockinPeriodTypeParamName, lockinPeriodType.getValue())) { if (command.isChangeInIntegerParameterNamed(lockinPeriodTypeParamName, lockinPeriodType.getValue())) {
final Integer newValue = command.integerValueOfParameterNamed(lockinPeriodTypeParamName); final Integer newValue = command.integerValueOfParameterNamed(lockinPeriodTypeParamName);
actualChanges.put(lockinPeriodTypeParamName, newValue); actualChanges.put(lockinPeriodTypeParamName, newValue);
@@ -310,13 +315,13 @@ public class DepositAccountAssembler {
return newAccount; return newAccount;
} }
public Map<String, Object> assembleUpdatedDepositAccount(DepositAccount account, JsonCommand command) { public Map<String, Object> assembleUpdatedDepositAccount(final DepositAccount account, final JsonCommand command) {
final Map<String, Object> actualChanges = new LinkedHashMap<String, Object>(20); final Map<String, Object> actualChanges = new LinkedHashMap<String, Object>(20);
final String localeAsInput = command.locale(); final String localeAsInput = command.locale();
DepositProduct product = account.product(); DepositProduct product = account.product();
final String productIdParamName = "productId"; final String productIdParamName = "productId";
if (command.isChangeInLongParameterNamed(productIdParamName, account.product().getId())) { if (command.isChangeInLongParameterNamed(productIdParamName, account.product().getId())) {
final Long newValue = command.longValueOfParameterNamed(productIdParamName); final Long newValue = command.longValueOfParameterNamed(productIdParamName);
if (newValue != null) { if (newValue != null) {
@@ -326,7 +331,7 @@ public class DepositAccountAssembler {
actualChanges.put(productIdParamName, newValue); actualChanges.put(productIdParamName, newValue);
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
} }
String externalId = account.getExternalId(); String externalId = account.getExternalId();
final String externalIdParamName = "externalId"; final String externalIdParamName = "externalId";
if (command.isChangeInStringParameterNamed(externalIdParamName, externalId)) { if (command.isChangeInStringParameterNamed(externalIdParamName, externalId)) {
@@ -334,15 +339,15 @@ public class DepositAccountAssembler {
actualChanges.put(externalIdParamName, newValue); actualChanges.put(externalIdParamName, newValue);
externalId = newValue; externalId = newValue;
} }
LocalDate commencementDate = account.getProjectedCommencementDate(); LocalDate commencementDate = account.getProjectedCommencementDate();
final String commencementDateParamName = "commencementDate"; final String commencementDateParamName = "commencementDate";
if (command.isChangeInLocalDateParameterNamed("commencementDate", commencementDate)) { if (command.isChangeInLocalDateParameterNamed("commencementDate", commencementDate)) {
final LocalDate newValue = command.localDateValueOfParameterNamed(commencementDateParamName); final LocalDate newValue = command.localDateValueOfParameterNamed(commencementDateParamName);
actualChanges.put(commencementDateParamName, newValue); actualChanges.put(commencementDateParamName, newValue);
commencementDate = newValue; commencementDate = newValue;
} }
Money deposit = account.getDeposit(); Money deposit = account.getDeposit();
final String depositParamName = "deposit"; final String depositParamName = "deposit";
if (command.isChangeInBigDecimalParameterNamed(depositParamName, deposit.getAmount())) { if (command.isChangeInBigDecimalParameterNamed(depositParamName, deposit.getAmount())) {
@@ -351,7 +356,7 @@ public class DepositAccountAssembler {
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
deposit = Money.of(deposit.getCurrency(), newValue); deposit = Money.of(deposit.getCurrency(), newValue);
} }
Integer tenureInMonths = account.getTenureInMonths(); Integer tenureInMonths = account.getTenureInMonths();
final String tenureInMonthsParamName = "tenureInMonths"; final String tenureInMonthsParamName = "tenureInMonths";
if (command.isChangeInIntegerParameterNamed(tenureInMonthsParamName, tenureInMonths)) { if (command.isChangeInIntegerParameterNamed(tenureInMonthsParamName, tenureInMonths)) {
@@ -360,7 +365,7 @@ public class DepositAccountAssembler {
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
tenureInMonths = newValue; tenureInMonths = newValue;
} }
BigDecimal maturityInterestRate = account.getInterestRate(); BigDecimal maturityInterestRate = account.getInterestRate();
final String maturityInterestRateParamName = "maturityInterestRate"; final String maturityInterestRateParamName = "maturityInterestRate";
if (command.isChangeInBigDecimalParameterNamed(maturityInterestRateParamName, maturityInterestRate)) { if (command.isChangeInBigDecimalParameterNamed(maturityInterestRateParamName, maturityInterestRate)) {
@@ -369,7 +374,7 @@ public class DepositAccountAssembler {
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
maturityInterestRate = newValue; maturityInterestRate = newValue;
} }
BigDecimal preClosureInterestRate = account.getPreClosureInterestRate(); BigDecimal preClosureInterestRate = account.getPreClosureInterestRate();
final String preClosureInterestRateParamName = "preClosureInterestRate"; final String preClosureInterestRateParamName = "preClosureInterestRate";
if (command.isChangeInBigDecimalParameterNamed(preClosureInterestRateParamName, preClosureInterestRate)) { if (command.isChangeInBigDecimalParameterNamed(preClosureInterestRateParamName, preClosureInterestRate)) {
@@ -378,10 +383,10 @@ public class DepositAccountAssembler {
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
preClosureInterestRate = newValue; preClosureInterestRate = newValue;
} }
if (product.getMaturityMinInterestRate().compareTo(preClosureInterestRate) == -1) { throw new DepositAccounDataValidationtException( if (product.getMaturityMinInterestRate().compareTo(preClosureInterestRate) == -1) { throw new DepositAccounDataValidationtException(
preClosureInterestRate, product.getMaturityMinInterestRate()); } preClosureInterestRate, product.getMaturityMinInterestRate()); }
Integer interestCompoundedEvery = account.getInterestCompoundedEvery(); Integer interestCompoundedEvery = account.getInterestCompoundedEvery();
final String interestCompoundedEveryParamName = "interestCompoundedEvery"; final String interestCompoundedEveryParamName = "interestCompoundedEvery";
if (command.isChangeInIntegerParameterNamed(interestCompoundedEveryParamName, interestCompoundedEvery)) { if (command.isChangeInIntegerParameterNamed(interestCompoundedEveryParamName, interestCompoundedEvery)) {
@@ -390,96 +395,97 @@ public class DepositAccountAssembler {
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
interestCompoundedEvery = newValue; interestCompoundedEvery = newValue;
} }
PeriodFrequencyType interestCompoundedEveryPeriodType = account.getInterestCompoundedFrequencyType(); PeriodFrequencyType interestCompoundedEveryPeriodType = account.getInterestCompoundedFrequencyType();
final String interestCompoundedEveryPeriodTypeParamName = "interestCompoundedEveryPeriodType"; final String interestCompoundedEveryPeriodTypeParamName = "interestCompoundedEveryPeriodType";
if (command.isChangeInIntegerParameterNamed(interestCompoundedEveryPeriodTypeParamName, interestCompoundedEveryPeriodType.getValue())) { if (command.isChangeInIntegerParameterNamed(interestCompoundedEveryPeriodTypeParamName,
interestCompoundedEveryPeriodType.getValue())) {
final Integer newValue = command.integerValueOfParameterNamed(interestCompoundedEveryPeriodTypeParamName); final Integer newValue = command.integerValueOfParameterNamed(interestCompoundedEveryPeriodTypeParamName);
actualChanges.put(interestCompoundedEveryPeriodTypeParamName, newValue); actualChanges.put(interestCompoundedEveryPeriodTypeParamName, newValue);
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
interestCompoundedEveryPeriodType = PeriodFrequencyType.fromInt(newValue); interestCompoundedEveryPeriodType = PeriodFrequencyType.fromInt(newValue);
} }
Boolean renewalAllowed = account.isRenewalAllowed(); Boolean renewalAllowed = account.isRenewalAllowed();
final String renewalAllowedParamName = "renewalAllowed"; final String renewalAllowedParamName = "renewalAllowed";
if (command.isChangeInBooleanParameterNamed(renewalAllowedParamName, renewalAllowed)) { if (command.isChangeInBooleanParameterNamed(renewalAllowedParamName, renewalAllowed)) {
final Boolean newValue = command.booleanObjectValueOfParameterNamed(renewalAllowedParamName); final Boolean newValue = command.booleanObjectValueOfParameterNamed(renewalAllowedParamName);
actualChanges.put(renewalAllowedParamName, newValue); actualChanges.put(renewalAllowedParamName, newValue);
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
renewalAllowed = newValue; renewalAllowed = newValue;
} }
Boolean preClosureAllowed = account.isPreClosureAllowed(); Boolean preClosureAllowed = account.isPreClosureAllowed();
final String preClosureAllowedParamName = "preClosureAllowed"; final String preClosureAllowedParamName = "preClosureAllowed";
if (command.isChangeInBooleanParameterNamed(preClosureAllowedParamName, preClosureAllowed)) { if (command.isChangeInBooleanParameterNamed(preClosureAllowedParamName, preClosureAllowed)) {
final Boolean newValue = command.booleanObjectValueOfParameterNamed(preClosureAllowedParamName); final Boolean newValue = command.booleanObjectValueOfParameterNamed(preClosureAllowedParamName);
actualChanges.put(preClosureAllowedParamName, newValue); actualChanges.put(preClosureAllowedParamName, newValue);
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
preClosureAllowed = newValue; preClosureAllowed = newValue;
} }
Boolean isInterestWithdrawable = account.isInterestWithdrawable(); Boolean isInterestWithdrawable = account.isInterestWithdrawable();
final String isInterestWithdrawableParamName = "isInterestWithdrawable"; final String isInterestWithdrawableParamName = "isInterestWithdrawable";
if (command.isChangeInBooleanParameterNamed(isInterestWithdrawableParamName, isInterestWithdrawable)) { if (command.isChangeInBooleanParameterNamed(isInterestWithdrawableParamName, isInterestWithdrawable)) {
final Boolean newValue = command.booleanObjectValueOfParameterNamed(isInterestWithdrawableParamName); final Boolean newValue = command.booleanObjectValueOfParameterNamed(isInterestWithdrawableParamName);
actualChanges.put(isInterestWithdrawableParamName, newValue); actualChanges.put(isInterestWithdrawableParamName, newValue);
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
isInterestWithdrawable = newValue; isInterestWithdrawable = newValue;
} }
Boolean isInterestCompoundingAllowed = account.isInterestCompoundingAllowed(); Boolean isInterestCompoundingAllowed = account.isInterestCompoundingAllowed();
final String isInterestCompoundingAllowedParamName = "interestCompoundingAllowed"; final String isInterestCompoundingAllowedParamName = "interestCompoundingAllowed";
if (command.isChangeInBooleanParameterNamed(isInterestCompoundingAllowedParamName, isInterestCompoundingAllowed)) { if (command.isChangeInBooleanParameterNamed(isInterestCompoundingAllowedParamName, isInterestCompoundingAllowed)) {
final Boolean newValue = command.booleanObjectValueOfParameterNamed(isInterestCompoundingAllowedParamName); final Boolean newValue = command.booleanObjectValueOfParameterNamed(isInterestCompoundingAllowedParamName);
actualChanges.put(isInterestCompoundingAllowedParamName, newValue); actualChanges.put(isInterestCompoundingAllowedParamName, newValue);
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
isInterestCompoundingAllowed = newValue; isInterestCompoundingAllowed = newValue;
} }
Boolean isLockinPeriodAllowed = account.isLockinPeriodAllowed(); Boolean isLockinPeriodAllowed = account.isLockinPeriodAllowed();
final String isLockinPeriodAllowedParamName = "isLockinPeriodAllowed"; final String isLockinPeriodAllowedParamName = "isLockinPeriodAllowed";
if (command.isChangeInBooleanParameterNamed(isLockinPeriodAllowedParamName, isLockinPeriodAllowed)) { if (command.isChangeInBooleanParameterNamed(isLockinPeriodAllowedParamName, isLockinPeriodAllowed)) {
final Boolean newValue = command.booleanObjectValueOfParameterNamed(isLockinPeriodAllowedParamName); final Boolean newValue = command.booleanObjectValueOfParameterNamed(isLockinPeriodAllowedParamName);
actualChanges.put(isLockinPeriodAllowedParamName, newValue); actualChanges.put(isLockinPeriodAllowedParamName, newValue);
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
isLockinPeriodAllowed = newValue; isLockinPeriodAllowed = newValue;
} }
Integer lockinPeriod = account.getLockinPeriod(); Integer lockinPeriod = account.getLockinPeriod();
final String lockinPeriodParamName = "lockinPeriod"; final String lockinPeriodParamName = "lockinPeriod";
if (command.isChangeInIntegerParameterNamed(lockinPeriodParamName, lockinPeriod)) { if (command.isChangeInIntegerParameterNamed(lockinPeriodParamName, lockinPeriod)) {
final Integer newValue = command.integerValueOfParameterNamed(lockinPeriodParamName); final Integer newValue = command.integerValueOfParameterNamed(lockinPeriodParamName);
actualChanges.put(lockinPeriodParamName, newValue); actualChanges.put(lockinPeriodParamName, newValue);
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
lockinPeriod = newValue; lockinPeriod = newValue;
} }
PeriodFrequencyType lockinPeriodType = account.getLockinPeriodType(); PeriodFrequencyType lockinPeriodType = account.getLockinPeriodType();
final String lockinPeriodTypeParamName = "lockinPeriodType"; final String lockinPeriodTypeParamName = "lockinPeriodType";
if (command.isChangeInIntegerParameterNamed(lockinPeriodTypeParamName, lockinPeriodType.getValue())) { if (command.isChangeInIntegerParameterNamed(lockinPeriodTypeParamName, lockinPeriodType.getValue())) {
final Integer newValue = command.integerValueOfParameterNamed(lockinPeriodTypeParamName); final Integer newValue = command.integerValueOfParameterNamed(lockinPeriodTypeParamName);
actualChanges.put(lockinPeriodTypeParamName, newValue); actualChanges.put(lockinPeriodTypeParamName, newValue);
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
lockinPeriodType = PeriodFrequencyType.fromInt(newValue); lockinPeriodType = PeriodFrequencyType.fromInt(newValue);
} }
account.update(product, externalId, commencementDate, deposit, tenureInMonths, maturityInterestRate, preClosureInterestRate, account.update(product, externalId, commencementDate, deposit, tenureInMonths, maturityInterestRate, preClosureInterestRate,
interestCompoundedEvery, interestCompoundedEveryPeriodType, renewalAllowed, preClosureAllowed, isInterestWithdrawable, interestCompoundedEvery, interestCompoundedEveryPeriodType, renewalAllowed, preClosureAllowed, isInterestWithdrawable,
isInterestCompoundingAllowed, this.fixedTermDepositInterestCalculator, isLockinPeriodAllowed, lockinPeriod, isInterestCompoundingAllowed, this.fixedTermDepositInterestCalculator, isLockinPeriodAllowed, lockinPeriod,
lockinPeriodType); lockinPeriodType);
return actualChanges; return actualChanges;
} }
public Map<String, Object> updateApprovedDepositAccount(DepositAccount account, JsonCommand command) { public Map<String, Object> updateApprovedDepositAccount(final DepositAccount account, final JsonCommand command) {
final Map<String, Object> actualChanges = new LinkedHashMap<String, Object>(20); final Map<String, Object> actualChanges = new LinkedHashMap<String, Object>(20);
final String localeAsInput = command.locale(); final String localeAsInput = command.locale();
Boolean renewalAllowed = account.isRenewalAllowed(); Boolean renewalAllowed = account.isRenewalAllowed();
final String renewalAllowedParamName = "renewalAllowed"; final String renewalAllowedParamName = "renewalAllowed";
if (command.isChangeInBooleanParameterNamed(renewalAllowedParamName, renewalAllowed)) { if (command.isChangeInBooleanParameterNamed(renewalAllowedParamName, renewalAllowed)) {
final Boolean newValue = command.booleanObjectValueOfParameterNamed(renewalAllowedParamName); final Boolean newValue = command.booleanObjectValueOfParameterNamed(renewalAllowedParamName);
actualChanges.put(renewalAllowedParamName, newValue); actualChanges.put(renewalAllowedParamName, newValue);
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
renewalAllowed = newValue; renewalAllowed = newValue;
@@ -488,28 +494,28 @@ public class DepositAccountAssembler {
Boolean isInterestWithdrawable = account.isInterestWithdrawable(); Boolean isInterestWithdrawable = account.isInterestWithdrawable();
final String isInterestWithdrawableParamName = "isInterestWithdrawable"; final String isInterestWithdrawableParamName = "isInterestWithdrawable";
if (command.isChangeInBooleanParameterNamed(isInterestWithdrawableParamName, isInterestWithdrawable)) { if (command.isChangeInBooleanParameterNamed(isInterestWithdrawableParamName, isInterestWithdrawable)) {
final Boolean newValue = command.booleanObjectValueOfParameterNamed(isInterestWithdrawableParamName); final Boolean newValue = command.booleanObjectValueOfParameterNamed(isInterestWithdrawableParamName);
actualChanges.put(isInterestWithdrawableParamName, newValue); actualChanges.put(isInterestWithdrawableParamName, newValue);
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
isInterestWithdrawable = newValue; isInterestWithdrawable = newValue;
} }
account.update(renewalAllowed, isInterestWithdrawable); account.update(renewalAllowed, isInterestWithdrawable);
return actualChanges; return actualChanges;
} }
public void postInterest(DepositAccount account) { public void postInterest(final DepositAccount account) {
account.postInterestForDepositAccount(account, this.fixedTermDepositInterestCalculator); account.postInterestForDepositAccount(this.fixedTermDepositInterestCalculator);
}
private Boolean isBooleanValueUpdated(final Boolean actualValue) {
Boolean isUpdated = false;
if (actualValue != null) {
isUpdated = true;
}
return isUpdated;
} }
private Boolean isBooleanValueUpdated(Boolean actualValue) {
Boolean isUpdated = false;
if(actualValue != null){
isUpdated = true;
}
return isUpdated;
}
} }
@@ -24,193 +24,214 @@ import org.mifosplatform.portfolio.savingsdepositproduct.exception.DepositProduc
import org.mifosplatform.useradministration.domain.AppUser; import org.mifosplatform.useradministration.domain.AppUser;
@Entity @Entity
@Table(name = "m_product_deposit", uniqueConstraints={ @Table(name = "m_product_deposit", uniqueConstraints = { @UniqueConstraint(columnNames = { "name" }, name = "name_deposit_product"),
@UniqueConstraint(columnNames = {"name"}, name="name_deposit_product"), @UniqueConstraint(columnNames = { "external_id" }, name = "externalid_deposit_product") })
@UniqueConstraint(columnNames = {"external_id"}, name="externalid_deposit_product")
})
public class DepositProduct extends AbstractAuditableCustom<AppUser, Long> { public class DepositProduct extends AbstractAuditableCustom<AppUser, Long> {
@Column(name = "name", nullable = false)
private String name;
@Column(name = "external_id", length=100)
private String externalId;
@SuppressWarnings("unused") @Column(name = "name", nullable = false)
@Column(name = "description") private String name;
private String description;
@Column(name = "external_id", length = 100)
@Column(name = "is_deleted", nullable=false) private String externalId;
private boolean deleted = false;
@Column(name = "description")
private String description;
@Column(name = "is_deleted", nullable = false)
private boolean deleted = false;
@Embedded @Embedded
private MonetaryCurrency currency; private MonetaryCurrency currency;
@Column(name = "minimum_balance", scale = 6, precision = 19, nullable = false)
private BigDecimal minimumBalance;
@Column(name = "maximum_balance", scale = 6, precision = 19, nullable = false)
private BigDecimal maximumBalance;
@Column(name = "interest_compounded_every", nullable=false)
private Integer interestCompoundedEvery;
@Column(name = "interest_compounded_every_period_enum", nullable=false)
private PeriodFrequencyType interestCompoundedEveryPeriodType;
@Column(name = "maturity_default_interest_rate", scale = 6, precision = 19, nullable = false)
private BigDecimal maturityDefaultInterestRate;
@Column(name = "maturity_min_interest_rate", scale = 6, precision = 19, nullable = false)
private BigDecimal maturityMinInterestRate;
@Column(name = "maturity_max_interest_rate", scale = 6, precision = 19, nullable = false)
private BigDecimal maturityMaxInterestRate;
@Column(name = "tenure_months", nullable=false)
private Integer tenureInMonths;
@Column(name = "is_renewal_allowed", nullable=false)
private boolean renewalAllowed = false;
@Column(name = "is_preclosure_allowed", nullable=false)
private boolean preClosureAllowed = false;
@Column(name = "is_compounding_interest_allowed", nullable=false)
private boolean interestCompoundingAllowed = false;
@Column(name = "pre_closure_interest_rate", scale = 6, precision = 19, nullable = false)
private BigDecimal preClosureInterestRate;
@Column(name = "is_lock_in_period_allowed", nullable=false)
private boolean isLockinPeriodAllowed = false;
@Column(name = "lock_in_period", nullable=false)
private Integer lockinPeriod;
@Column(name = "lock_in_period_type", nullable=false)
private PeriodFrequencyType lockinPeriodType;
protected DepositProduct() {
//
}
public DepositProduct(final String name, final String externalId,
final String description,
final MonetaryCurrency currency, final BigDecimal minimumBalance,
final BigDecimal maximumBalance, final Integer tenureMonths,
final BigDecimal maturityDefaultInterestRate,
final BigDecimal maturityMinInterestRate,
final BigDecimal maturityMaxInterestRate,
final Integer interestCompoundedEvery,
final PeriodFrequencyType interestCompoundedEveryPeriodType,
final boolean canRenew,
final boolean canPreClose,
final BigDecimal preClosureInterestRate,
final boolean isInterestCompoundingAllowed,
final boolean isLockinPeriodAllowed,
final Integer lockinPeriod,
final PeriodFrequencyType lockinPeriodType) {
this.name = name.trim();
if (StringUtils.isNotBlank(description)) {
this.description = description.trim();
} else {
this.description = null;
}
if (StringUtils.isNotBlank(externalId)) {
this.externalId = externalId.trim();
} else {
this.externalId = null;
}
this.currency = currency;
this.minimumBalance = minimumBalance;
this.maximumBalance = maximumBalance;
this.tenureInMonths = tenureMonths;
this.maturityDefaultInterestRate = maturityDefaultInterestRate;
this.maturityMinInterestRate = maturityMinInterestRate;
this.maturityMaxInterestRate = maturityMaxInterestRate;
this.interestCompoundedEvery = interestCompoundedEvery;
this.interestCompoundedEveryPeriodType = interestCompoundedEveryPeriodType;
this.renewalAllowed = canRenew;
this.preClosureAllowed = canPreClose;
this.preClosureInterestRate = preClosureInterestRate;
this.interestCompoundingAllowed = isInterestCompoundingAllowed;
this.isLockinPeriodAllowed = isLockinPeriodAllowed;
this.lockinPeriod = lockinPeriod;
this.lockinPeriodType = lockinPeriodType;
}
public MonetaryCurrency getCurrency() {
return currency;
}
public Integer getInterestCompoundedEvery() {
return interestCompoundedEvery;
}
public PeriodFrequencyType getInterestCompoundedEveryPeriodType() { @Column(name = "minimum_balance", scale = 6, precision = 19, nullable = false)
return interestCompoundedEveryPeriodType; private BigDecimal minimumBalance;
}
public Integer getTenureInMonths() { @Column(name = "maximum_balance", scale = 6, precision = 19, nullable = false)
return tenureInMonths; private BigDecimal maximumBalance;
}
public BigDecimal getMaturityDefaultInterestRate() {
return maturityDefaultInterestRate;
}
public BigDecimal getMaturityMinInterestRate() { @Column(name = "interest_compounded_every", nullable = false)
return maturityMinInterestRate; private Integer interestCompoundedEvery;
}
public BigDecimal getPreClosureInterestRate() { @Column(name = "interest_compounded_every_period_enum", nullable = false)
return preClosureInterestRate; private PeriodFrequencyType interestCompoundedEveryPeriodType;
}
public boolean isRenewalAllowed() { @Column(name = "maturity_default_interest_rate", scale = 6, precision = 19, nullable = false)
return this.renewalAllowed; private BigDecimal maturityDefaultInterestRate;
}
public boolean isPreClosureAllowed() { @Column(name = "maturity_min_interest_rate", scale = 6, precision = 19, nullable = false)
return this.preClosureAllowed; private BigDecimal maturityMinInterestRate;
}
public boolean isInterestCompoundingAllowed() {
return interestCompoundingAllowed;
}
public boolean isLockinPeriodAllowed() { @Column(name = "maturity_max_interest_rate", scale = 6, precision = 19, nullable = false)
return isLockinPeriodAllowed; private BigDecimal maturityMaxInterestRate;
}
public Integer getLockinPeriod() { @Column(name = "tenure_months", nullable = false)
return lockinPeriod; private Integer tenureInMonths;
}
public PeriodFrequencyType getLockinPeriodType() { @Column(name = "is_renewal_allowed", nullable = false)
return lockinPeriodType; private boolean renewalAllowed = false;
}
public boolean isDeleted() { @Column(name = "is_preclosure_allowed", nullable = false)
return deleted; private boolean preClosureAllowed = false;
}
@Column(name = "is_compounding_interest_allowed", nullable = false)
/** private boolean interestCompoundingAllowed = false;
* Delete is a <i>soft delete</i>. Updates flag on product so it wont appear in query/report results.
* @Column(name = "pre_closure_interest_rate", scale = 6, precision = 19, nullable = false)
* Any fields with unique constraints and prepended with id of record. private BigDecimal preClosureInterestRate;
*/
public void delete() { @Column(name = "is_lock_in_period_allowed", nullable = false)
this.deleted = true; private boolean isLockinPeriodAllowed = false;
this.name = this.getId() + "_DELETED_" + this.name;
this.externalId = this.getId() + "_DELETED_" + this.externalId; @Column(name = "lock_in_period", nullable = false)
} private Integer lockinPeriod;
public Map<String, Object> update(final JsonCommand command){ @Column(name = "lock_in_period_type", nullable = false)
private PeriodFrequencyType lockinPeriodType;
final Map<String, Object> actualChanges = new LinkedHashMap<String, Object>(20);
public static DepositProduct assembleFromJson(final JsonCommand command, final PeriodFrequencyType interestCompoundingPeriodType,
final PeriodFrequencyType lockinPeriodType) {
final String name = command.stringValueOfParameterNamed("name");
final String externalId = command.stringValueOfParameterNamed("externalId");
final String description = command.stringValueOfParameterNamed("description");
final String currencyCode = command.stringValueOfParameterNamed("currencyCode");
final Integer digitsAfterDecimal = command.integerValueOfParameterNamed("digitsAfterDecimal");
final MonetaryCurrency currency = new MonetaryCurrency(currencyCode, digitsAfterDecimal);
final BigDecimal minimumBalance = command.bigDecimalValueOfParameterNamed("minimumBalance");
final BigDecimal maximumBalance = command.bigDecimalValueOfParameterNamed("maximumBalance");
final Integer tenureMonths = command.integerValueOfParameterNamed("tenureInMonths");
final BigDecimal maturityDefaultInterestRate = command.bigDecimalValueOfParameterNamed("maturityDefaultInterestRate");
final BigDecimal maturityMinInterestRate = command.bigDecimalValueOfParameterNamed("maturityMinInterestRate");
final BigDecimal maturityMaxInterestRate = command.bigDecimalValueOfParameterNamed("maturityMaxInterestRate");
final Integer interestCompoundedEvery = command.integerValueOfParameterNamed("interestCompoundedEvery");
final boolean canRenew = command.booleanPrimitiveValueOfParameterNamed("canRenew");
final boolean canPreClose = command.booleanPrimitiveValueOfParameterNamed("canPreClose");
final BigDecimal preClosureInterestRate = command.bigDecimalValueOfParameterNamed("preClosureInterestRate");
final boolean isInterestCompoundingAllowed = command.booleanPrimitiveValueOfParameterNamed("isInterestCompoundingAllowed");
final boolean isLockinPeriodAllowed = command.booleanPrimitiveValueOfParameterNamed("isLockinPeriodAllowed");
final Integer lockinPeriod = command.integerValueOfParameterNamed("lockinPeriod");
return new DepositProduct(name, externalId, description, currency, minimumBalance, maximumBalance, tenureMonths,
maturityDefaultInterestRate, maturityMinInterestRate, maturityMaxInterestRate, interestCompoundedEvery,
interestCompoundingPeriodType, canRenew, canPreClose, preClosureInterestRate, isInterestCompoundingAllowed,
isLockinPeriodAllowed, lockinPeriod, lockinPeriodType);
}
protected DepositProduct() {
//
}
private DepositProduct(final String name, final String externalId, final String description, final MonetaryCurrency currency,
final BigDecimal minimumBalance, final BigDecimal maximumBalance, final Integer tenureMonths,
final BigDecimal maturityDefaultInterestRate, final BigDecimal maturityMinInterestRate,
final BigDecimal maturityMaxInterestRate, final Integer interestCompoundedEvery,
final PeriodFrequencyType interestCompoundedEveryPeriodType, final boolean canRenew, final boolean canPreClose,
final BigDecimal preClosureInterestRate, final boolean isInterestCompoundingAllowed, final boolean isLockinPeriodAllowed,
final Integer lockinPeriod, final PeriodFrequencyType lockinPeriodType) {
this.name = name.trim();
if (StringUtils.isNotBlank(description)) {
this.description = description.trim();
} else {
this.description = null;
}
if (StringUtils.isNotBlank(externalId)) {
this.externalId = externalId.trim();
} else {
this.externalId = null;
}
this.currency = currency;
this.minimumBalance = minimumBalance;
this.maximumBalance = maximumBalance;
this.tenureInMonths = tenureMonths;
this.maturityDefaultInterestRate = maturityDefaultInterestRate;
this.maturityMinInterestRate = maturityMinInterestRate;
this.maturityMaxInterestRate = maturityMaxInterestRate;
this.interestCompoundedEvery = interestCompoundedEvery;
this.interestCompoundedEveryPeriodType = interestCompoundedEveryPeriodType;
this.renewalAllowed = canRenew;
this.preClosureAllowed = canPreClose;
this.preClosureInterestRate = preClosureInterestRate;
this.interestCompoundingAllowed = isInterestCompoundingAllowed;
this.isLockinPeriodAllowed = isLockinPeriodAllowed;
this.lockinPeriod = lockinPeriod;
this.lockinPeriodType = lockinPeriodType;
}
public MonetaryCurrency getCurrency() {
return currency;
}
public Integer getInterestCompoundedEvery() {
return interestCompoundedEvery;
}
public PeriodFrequencyType getInterestCompoundedEveryPeriodType() {
return interestCompoundedEveryPeriodType;
}
public Integer getTenureInMonths() {
return tenureInMonths;
}
public BigDecimal getMaturityDefaultInterestRate() {
return maturityDefaultInterestRate;
}
public BigDecimal getMaturityMinInterestRate() {
return maturityMinInterestRate;
}
public BigDecimal getPreClosureInterestRate() {
return preClosureInterestRate;
}
public boolean isRenewalAllowed() {
return this.renewalAllowed;
}
public boolean isPreClosureAllowed() {
return this.preClosureAllowed;
}
public boolean isInterestCompoundingAllowed() {
return interestCompoundingAllowed;
}
public boolean isLockinPeriodAllowed() {
return isLockinPeriodAllowed;
}
public Integer getLockinPeriod() {
return lockinPeriod;
}
public PeriodFrequencyType getLockinPeriodType() {
return lockinPeriodType;
}
public boolean isDeleted() {
return deleted;
}
/**
* Delete is a <i>soft delete</i>. Updates flag on product so it wont appear
* in query/report results.
*
* Any fields with unique constraints and prepended with id of record.
*/
public void delete() {
this.deleted = true;
this.name = this.getId() + "_DELETED_" + this.name;
this.externalId = this.getId() + "_DELETED_" + this.externalId;
}
public Map<String, Object> update(final JsonCommand command) {
final Map<String, Object> actualChanges = new LinkedHashMap<String, Object>(20);
final String localeAsInput = command.locale(); final String localeAsInput = command.locale();
@@ -227,17 +248,17 @@ public class DepositProduct extends AbstractAuditableCustom<AppUser, Long> {
actualChanges.put(descriptionParamName, newValue); actualChanges.put(descriptionParamName, newValue);
this.description = newValue; this.description = newValue;
} }
final String externalIdParamName = "externalId"; final String externalIdParamName = "externalId";
if (command.isChangeInStringParameterNamed(externalIdParamName, this.externalId)) { if (command.isChangeInStringParameterNamed(externalIdParamName, this.externalId)) {
final String newValue = command.stringValueOfParameterNamed(externalIdParamName); final String newValue = command.stringValueOfParameterNamed(externalIdParamName);
actualChanges.put(externalIdParamName, newValue); actualChanges.put(externalIdParamName, newValue);
this.externalId = newValue; this.externalId = newValue;
} }
String currencyCode = this.currency.getCode(); String currencyCode = this.currency.getCode();
Integer digitsAfterDecimal = this.currency.getDigitsAfterDecimal(); Integer digitsAfterDecimal = this.currency.getDigitsAfterDecimal();
final String digitsAfterDecimalParamName = "digitsAfterDecimal"; final String digitsAfterDecimalParamName = "digitsAfterDecimal";
if (command.isChangeInIntegerParameterNamed(digitsAfterDecimalParamName, digitsAfterDecimal)) { if (command.isChangeInIntegerParameterNamed(digitsAfterDecimalParamName, digitsAfterDecimal)) {
final Integer newValue = command.integerValueOfParameterNamed(digitsAfterDecimalParamName); final Integer newValue = command.integerValueOfParameterNamed(digitsAfterDecimalParamName);
@@ -254,7 +275,7 @@ public class DepositProduct extends AbstractAuditableCustom<AppUser, Long> {
currencyCode = newValue; currencyCode = newValue;
this.currency = new MonetaryCurrency(currencyCode, digitsAfterDecimal); this.currency = new MonetaryCurrency(currencyCode, digitsAfterDecimal);
} }
final String minimumBalanceParamName = "minimumBalance"; final String minimumBalanceParamName = "minimumBalance";
if (command.isChangeInBigDecimalParameterNamed(minimumBalanceParamName, this.minimumBalance)) { if (command.isChangeInBigDecimalParameterNamed(minimumBalanceParamName, this.minimumBalance)) {
final BigDecimal newValue = command.bigDecimalValueOfParameterNamed(minimumBalanceParamName); final BigDecimal newValue = command.bigDecimalValueOfParameterNamed(minimumBalanceParamName);
@@ -262,7 +283,7 @@ public class DepositProduct extends AbstractAuditableCustom<AppUser, Long> {
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
this.minimumBalance = newValue; this.minimumBalance = newValue;
} }
final String maximumBalanceParamName = "maximumBalance"; final String maximumBalanceParamName = "maximumBalance";
if (command.isChangeInBigDecimalParameterNamed(maximumBalanceParamName, this.maximumBalance)) { if (command.isChangeInBigDecimalParameterNamed(maximumBalanceParamName, this.maximumBalance)) {
final BigDecimal newValue = command.bigDecimalValueOfParameterNamed(maximumBalanceParamName); final BigDecimal newValue = command.bigDecimalValueOfParameterNamed(maximumBalanceParamName);
@@ -270,7 +291,7 @@ public class DepositProduct extends AbstractAuditableCustom<AppUser, Long> {
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
this.maximumBalance = newValue; this.maximumBalance = newValue;
} }
final String tenureInMonthsParamName = "tenureInMonths"; final String tenureInMonthsParamName = "tenureInMonths";
if (command.isChangeInIntegerParameterNamed(tenureInMonthsParamName, this.tenureInMonths)) { if (command.isChangeInIntegerParameterNamed(tenureInMonthsParamName, this.tenureInMonths)) {
final Integer newValue = command.integerValueOfParameterNamed(tenureInMonthsParamName); final Integer newValue = command.integerValueOfParameterNamed(tenureInMonthsParamName);
@@ -278,7 +299,7 @@ public class DepositProduct extends AbstractAuditableCustom<AppUser, Long> {
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
this.tenureInMonths = newValue; this.tenureInMonths = newValue;
} }
final String defaultInterestRateParamName = "maturityDefaultInterestRate"; final String defaultInterestRateParamName = "maturityDefaultInterestRate";
if (command.isChangeInBigDecimalParameterNamed(defaultInterestRateParamName, this.maturityDefaultInterestRate)) { if (command.isChangeInBigDecimalParameterNamed(defaultInterestRateParamName, this.maturityDefaultInterestRate)) {
final BigDecimal newValue = command.bigDecimalValueOfParameterNamed(defaultInterestRateParamName); final BigDecimal newValue = command.bigDecimalValueOfParameterNamed(defaultInterestRateParamName);
@@ -286,7 +307,7 @@ public class DepositProduct extends AbstractAuditableCustom<AppUser, Long> {
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
this.maturityDefaultInterestRate = newValue; this.maturityDefaultInterestRate = newValue;
} }
final String minInterestRateParamName = "maturityMinInterestRate"; final String minInterestRateParamName = "maturityMinInterestRate";
if (command.isChangeInBigDecimalParameterNamed(minInterestRateParamName, this.maturityMinInterestRate)) { if (command.isChangeInBigDecimalParameterNamed(minInterestRateParamName, this.maturityMinInterestRate)) {
final BigDecimal newValue = command.bigDecimalValueOfParameterNamed(minInterestRateParamName); final BigDecimal newValue = command.bigDecimalValueOfParameterNamed(minInterestRateParamName);
@@ -294,7 +315,7 @@ public class DepositProduct extends AbstractAuditableCustom<AppUser, Long> {
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
this.maturityMinInterestRate = newValue; this.maturityMinInterestRate = newValue;
} }
final String maxInterestRateParamName = "maturityMaxInterestRate"; final String maxInterestRateParamName = "maturityMaxInterestRate";
if (command.isChangeInBigDecimalParameterNamed(maxInterestRateParamName, this.maturityMaxInterestRate)) { if (command.isChangeInBigDecimalParameterNamed(maxInterestRateParamName, this.maturityMaxInterestRate)) {
final BigDecimal newValue = command.bigDecimalValueOfParameterNamed(maxInterestRateParamName); final BigDecimal newValue = command.bigDecimalValueOfParameterNamed(maxInterestRateParamName);
@@ -302,7 +323,7 @@ public class DepositProduct extends AbstractAuditableCustom<AppUser, Long> {
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
this.maturityMaxInterestRate = newValue; this.maturityMaxInterestRate = newValue;
} }
final String interestCompoundedEveryParamName = "interestCompoundedEvery"; final String interestCompoundedEveryParamName = "interestCompoundedEvery";
if (command.isChangeInIntegerParameterNamed(interestCompoundedEveryParamName, this.interestCompoundedEvery)) { if (command.isChangeInIntegerParameterNamed(interestCompoundedEveryParamName, this.interestCompoundedEvery)) {
final Integer newValue = command.integerValueOfParameterNamed(interestCompoundedEveryParamName); final Integer newValue = command.integerValueOfParameterNamed(interestCompoundedEveryParamName);
@@ -310,31 +331,32 @@ public class DepositProduct extends AbstractAuditableCustom<AppUser, Long> {
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
this.interestCompoundedEvery = newValue; this.interestCompoundedEvery = newValue;
} }
final String interestCompoundedEveryPeriodTypeParamName = "interestCompoundedEveryPeriodType"; final String interestCompoundedEveryPeriodTypeParamName = "interestCompoundedEveryPeriodType";
if (command.isChangeInIntegerParameterNamed(interestCompoundedEveryPeriodTypeParamName, this.interestCompoundedEveryPeriodType.getValue())) { if (command.isChangeInIntegerParameterNamed(interestCompoundedEveryPeriodTypeParamName,
this.interestCompoundedEveryPeriodType.getValue())) {
final Integer newValue = command.integerValueOfParameterNamed(interestCompoundedEveryPeriodTypeParamName); final Integer newValue = command.integerValueOfParameterNamed(interestCompoundedEveryPeriodTypeParamName);
actualChanges.put(interestCompoundedEveryPeriodTypeParamName, newValue); actualChanges.put(interestCompoundedEveryPeriodTypeParamName, newValue);
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
this.interestCompoundedEveryPeriodType = PeriodFrequencyType.fromInt(newValue); this.interestCompoundedEveryPeriodType = PeriodFrequencyType.fromInt(newValue);
} }
final String renewalAllowedParamName = "renewalAllowed"; final String renewalAllowedParamName = "renewalAllowed";
if (command.isChangeInBooleanParameterNamed(renewalAllowedParamName, this.renewalAllowed)) { if (command.isChangeInBooleanParameterNamed(renewalAllowedParamName, this.renewalAllowed)) {
final Boolean newValue = command.booleanObjectValueOfParameterNamed(renewalAllowedParamName); final Boolean newValue = command.booleanObjectValueOfParameterNamed(renewalAllowedParamName);
actualChanges.put(renewalAllowedParamName, newValue); actualChanges.put(renewalAllowedParamName, newValue);
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
this.renewalAllowed = newValue; this.renewalAllowed = newValue;
} }
final String preClosureAllowedParamName = "preClosureAllowed"; final String preClosureAllowedParamName = "preClosureAllowed";
if (command.isChangeInBooleanParameterNamed(preClosureAllowedParamName, this.preClosureAllowed)) { if (command.isChangeInBooleanParameterNamed(preClosureAllowedParamName, this.preClosureAllowed)) {
final Boolean newValue = command.booleanObjectValueOfParameterNamed(preClosureAllowedParamName); final Boolean newValue = command.booleanObjectValueOfParameterNamed(preClosureAllowedParamName);
actualChanges.put(preClosureAllowedParamName, newValue); actualChanges.put(preClosureAllowedParamName, newValue);
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
this.preClosureAllowed = newValue; this.preClosureAllowed = newValue;
} }
final String preClosureInterestRateParamName = "preClosureInterestRate"; final String preClosureInterestRateParamName = "preClosureInterestRate";
if (command.isChangeInBigDecimalParameterNamed(preClosureInterestRateParamName, this.preClosureInterestRate)) { if (command.isChangeInBigDecimalParameterNamed(preClosureInterestRateParamName, this.preClosureInterestRate)) {
final BigDecimal newValue = command.bigDecimalValueOfParameterNamed(preClosureInterestRateParamName); final BigDecimal newValue = command.bigDecimalValueOfParameterNamed(preClosureInterestRateParamName);
@@ -343,106 +365,74 @@ public class DepositProduct extends AbstractAuditableCustom<AppUser, Long> {
this.preClosureInterestRate = newValue; this.preClosureInterestRate = newValue;
} }
final String interestCompoundingAllowedParamName = "interestCompoundingAllowed"; final String interestCompoundingAllowedParamName = "interestCompoundingAllowed";
if (command.isChangeInBooleanParameterNamed(interestCompoundingAllowedParamName, this.interestCompoundingAllowed)) { if (command.isChangeInBooleanParameterNamed(interestCompoundingAllowedParamName, this.interestCompoundingAllowed)) {
final Boolean newValue = command.booleanObjectValueOfParameterNamed(interestCompoundingAllowedParamName); final Boolean newValue = command.booleanObjectValueOfParameterNamed(interestCompoundingAllowedParamName);
actualChanges.put(interestCompoundingAllowedParamName, newValue); actualChanges.put(interestCompoundingAllowedParamName, newValue);
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
this.interestCompoundingAllowed = newValue; this.interestCompoundingAllowed = newValue;
} }
final String isLockinPeriodAllowedParamName = "isLockinPeriodAllowed"; final String isLockinPeriodAllowedParamName = "isLockinPeriodAllowed";
if (command.isChangeInBooleanParameterNamed(isLockinPeriodAllowedParamName, this.isLockinPeriodAllowed)) { if (command.isChangeInBooleanParameterNamed(isLockinPeriodAllowedParamName, this.isLockinPeriodAllowed)) {
final Boolean newValue = command.booleanObjectValueOfParameterNamed(isLockinPeriodAllowedParamName); final Boolean newValue = command.booleanObjectValueOfParameterNamed(isLockinPeriodAllowedParamName);
actualChanges.put(isLockinPeriodAllowedParamName, newValue); actualChanges.put(isLockinPeriodAllowedParamName, newValue);
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
this.isLockinPeriodAllowed = newValue; this.isLockinPeriodAllowed = newValue;
} }
final String lockinPeriodParamName = "lockinPeriod"; final String lockinPeriodParamName = "lockinPeriod";
if (command.isChangeInIntegerParameterNamed(lockinPeriodParamName, this.lockinPeriod)) { if (command.isChangeInIntegerParameterNamed(lockinPeriodParamName, this.lockinPeriod)) {
final Integer newValue = command.integerValueOfParameterNamed(lockinPeriodParamName); final Integer newValue = command.integerValueOfParameterNamed(lockinPeriodParamName);
actualChanges.put(lockinPeriodParamName, newValue); actualChanges.put(lockinPeriodParamName, newValue);
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
this.lockinPeriod = newValue; this.lockinPeriod = newValue;
} }
final String lockinPeriodTypeParamName = "lockinPeriodType";
final String lockinPeriodTypeParamName = "lockinPeriodType";
if (command.isChangeInIntegerParameterNamed(lockinPeriodTypeParamName, this.lockinPeriodType.getValue())) { if (command.isChangeInIntegerParameterNamed(lockinPeriodTypeParamName, this.lockinPeriodType.getValue())) {
final Integer newValue = command.integerValueOfParameterNamed(lockinPeriodTypeParamName); final Integer newValue = command.integerValueOfParameterNamed(lockinPeriodTypeParamName);
actualChanges.put(lockinPeriodTypeParamName, newValue); actualChanges.put(lockinPeriodTypeParamName, newValue);
actualChanges.put("locale", localeAsInput); actualChanges.put("locale", localeAsInput);
this.lockinPeriodType = PeriodFrequencyType.fromInt(newValue); this.lockinPeriodType = PeriodFrequencyType.fromInt(newValue);
} }
return actualChanges; return actualChanges;
} }
public void validateInterestRateInRange(final BigDecimal interestRate) {
boolean inRange = true;
if (interestRate.compareTo(this.maturityMinInterestRate) < 0) {
inRange = false;
}
if (this.maturityMaxInterestRate.compareTo(interestRate) < 0) {
inRange = false;
}
if (!inRange) {
final String actualValue = interestRate.toPlainString();
final String minValue = (this.maturityMinInterestRate == null) ? "" : this.maturityMinInterestRate.toPlainString();
final String maxValue = (this.maturityMaxInterestRate == null) ? "" : this.maturityMaxInterestRate.toPlainString();
throw new DepositProductValueOutsideRangeException(actualValue, minValue, maxValue, "deposit.account.maturityInterestRate");
}
}
public void validateDepositInRange(final BigDecimal depositAmount) { public void validateInterestRateInRange(final BigDecimal interestRate) {
boolean inRange = true; boolean inRange = true;
if (depositAmount.compareTo(this.minimumBalance) < 0) { if (interestRate.compareTo(this.maturityMinInterestRate) < 0) {
inRange = false; inRange = false;
} }
if (this.maximumBalance != null && this.maximumBalance.compareTo(depositAmount) < 0) {
inRange = false;
}
if (!inRange) {
final String actualValue = depositAmount.toPlainString();
final String minValue = (this.minimumBalance == null) ? "" : this.minimumBalance.toPlainString();
final String maxValue = (this.maximumBalance == null) ? "" : this.maximumBalance.toPlainString();
throw new DepositProductValueOutsideRangeException(actualValue, minValue, maxValue, "deposit.account.deposit.amount");
}
}
public static DepositProduct assembleFromJson(JsonCommand command, PeriodFrequencyType interestCompoundingPeriodType, if (this.maturityMaxInterestRate.compareTo(interestRate) < 0) {
PeriodFrequencyType lockinPeriodType) { inRange = false;
}
final String name = command.stringValueOfParameterNamed("name");
final String externalId = command.stringValueOfParameterNamed("externalId"); if (!inRange) {
final String description = command.stringValueOfParameterNamed("description"); final String actualValue = interestRate.toPlainString();
final String currencyCode = command.stringValueOfParameterNamed("currencyCode"); final String minValue = (this.maturityMinInterestRate == null) ? "" : this.maturityMinInterestRate.toPlainString();
final Integer digitsAfterDecimal = command.integerValueOfParameterNamed("digitsAfterDecimal"); final String maxValue = (this.maturityMaxInterestRate == null) ? "" : this.maturityMaxInterestRate.toPlainString();
throw new DepositProductValueOutsideRangeException(actualValue, minValue, maxValue, "deposit.account.maturityInterestRate");
final MonetaryCurrency currency = new MonetaryCurrency(currencyCode, digitsAfterDecimal); }
final BigDecimal minimumBalance = command.bigDecimalValueOfParameterNamed("minimumBalance"); }
final BigDecimal maximumBalance = command.bigDecimalValueOfParameterNamed("maximumBalance");
public void validateDepositInRange(final BigDecimal depositAmount) {
final Integer tenureMonths = command.integerValueOfParameterNamed("tenureInMonths"); boolean inRange = true;
final BigDecimal maturityDefaultInterestRate = command.bigDecimalValueOfParameterNamed("maturityDefaultInterestRate"); if (depositAmount.compareTo(this.minimumBalance) < 0) {
final BigDecimal maturityMinInterestRate = command.bigDecimalValueOfParameterNamed("maturityMinInterestRate"); inRange = false;
final BigDecimal maturityMaxInterestRate = command.bigDecimalValueOfParameterNamed("maturityMaxInterestRate"); }
final Integer interestCompoundedEvery = command.integerValueOfParameterNamed("interestCompoundedEvery");
if (this.maximumBalance != null && this.maximumBalance.compareTo(depositAmount) < 0) {
final boolean canRenew = command.booleanPrimitiveValueOfParameterNamed("canRenew"); inRange = false;
final boolean canPreClose = command.booleanPrimitiveValueOfParameterNamed("canPreClose"); }
final BigDecimal preClosureInterestRate = command.bigDecimalValueOfParameterNamed("preClosureInterestRate");
final boolean isInterestCompoundingAllowed = command.booleanPrimitiveValueOfParameterNamed("isInterestCompoundingAllowed"); if (!inRange) {
final boolean isLockinPeriodAllowed = command.booleanPrimitiveValueOfParameterNamed("isLockinPeriodAllowed"); final String actualValue = depositAmount.toPlainString();
final Integer lockinPeriod = command.integerValueOfParameterNamed("lockinPeriod"); final String minValue = (this.minimumBalance == null) ? "" : this.minimumBalance.toPlainString();
final String maxValue = (this.maximumBalance == null) ? "" : this.maximumBalance.toPlainString();
return new DepositProduct(name, externalId, description, currency, minimumBalance, maximumBalance, tenureMonths, maturityDefaultInterestRate, throw new DepositProductValueOutsideRangeException(actualValue, minValue, maxValue, "deposit.account.deposit.amount");
maturityMinInterestRate, maturityMaxInterestRate, interestCompoundedEvery, interestCompoundingPeriodType, canRenew, canPreClose, }
preClosureInterestRate, isInterestCompoundingAllowed, isLockinPeriodAllowed, lockinPeriod, lockinPeriodType); }
}
} }
@@ -12,7 +12,8 @@ import org.mifosplatform.infrastructure.core.exception.AbstractPlatformDomainRul
*/ */
public class DepositProductValueOutsideRangeException extends AbstractPlatformDomainRuleException { public class DepositProductValueOutsideRangeException extends AbstractPlatformDomainRuleException {
public DepositProductValueOutsideRangeException(final String actualValue, final String rangeMin, final String rangeMax, final String fieldCode) { public DepositProductValueOutsideRangeException(final String actualValue, final String rangeMin, final String rangeMax,
final String fieldCode) {
super("error.msg." + fieldCode + ".outside.of.allowed.range", actualValue + " is outside of allowed range of [" + rangeMin + ", " super("error.msg." + fieldCode + ".outside.of.allowed.range", actualValue + " is outside of allowed range of [" + rangeMin + ", "
+ rangeMax + "].", actualValue, rangeMin, rangeMax); + rangeMax + "].", actualValue, rangeMin, rangeMax);
} }
@@ -9,17 +9,16 @@ import org.springframework.stereotype.Service;
@Service @Service
public class CreateDepositProductCommandHandler implements NewCommandSourceHandler { public class CreateDepositProductCommandHandler implements NewCommandSourceHandler {
private final DepositProductWritePlatformService depositProductWritePlatformService;
@Autowired
public CreateDepositProductCommandHandler(final DepositProductWritePlatformService depositProductWritePlatformService) {
this.depositProductWritePlatformService = depositProductWritePlatformService;
}
@Override private final DepositProductWritePlatformService depositProductWritePlatformService;
public CommandProcessingResult processCommand(JsonCommand command) {
return this.depositProductWritePlatformService.createDepositProduct(command);
}
} @Autowired
public CreateDepositProductCommandHandler(final DepositProductWritePlatformService depositProductWritePlatformService) {
this.depositProductWritePlatformService = depositProductWritePlatformService;
}
@Override
public CommandProcessingResult processCommand(final JsonCommand command) {
return this.depositProductWritePlatformService.createDepositProduct(command);
}
}
@@ -15,9 +15,8 @@ public interface DepositProductWritePlatformService {
CommandProcessingResult createDepositProduct(JsonCommand command); CommandProcessingResult createDepositProduct(JsonCommand command);
@PreAuthorize(value = "hasAnyRole('ALL_FUNCTIONS', 'UPDATE_DEPOSITPRODUCT')") @PreAuthorize(value = "hasAnyRole('ALL_FUNCTIONS', 'UPDATE_DEPOSITPRODUCT')")
CommandProcessingResult updateDepositProduct(Long productId,JsonCommand command); CommandProcessingResult updateDepositProduct(Long productId, JsonCommand command);
@PreAuthorize(value = "hasAnyRole('ALL_FUNCTIONS', 'DELETE_DEPOSITPRODUCT')") @PreAuthorize(value = "hasAnyRole('ALL_FUNCTIONS', 'DELETE_DEPOSITPRODUCT')")
CommandProcessingResult deleteDepositProduct(Long productId); CommandProcessingResult deleteDepositProduct(Long productId);
} }
@@ -49,77 +49,77 @@ public class DepositProductWritePlatformServiceJpaRepositoryImpl implements Depo
private void handleDataIntegrityIssues(final JsonCommand command, final DataIntegrityViolationException dve) { private void handleDataIntegrityIssues(final JsonCommand command, final DataIntegrityViolationException dve) {
Throwable realCause = dve.getMostSpecificCause(); Throwable realCause = dve.getMostSpecificCause();
if (realCause.getMessage().contains("name_deposit_product")) { if (realCause.getMessage().contains("name_deposit_product")) {
final String name = command.stringValueOfParameterNamed("name"); final String name = command.stringValueOfParameterNamed("name");
throw new PlatformDataIntegrityException( throw new PlatformDataIntegrityException("error.msg.desposit.product.duplicate.name", "Deposit product with name: " + name
"error.msg.desposit.product.duplicate.name", "Deposit product with name: " + name + " already exists", "name", + " already exists", "name", name);
name); } }
if (realCause.getMessage().contains("externalid_deposit_product")) { if (realCause.getMessage().contains("externalid_deposit_product")) {
final String externalId = command.stringValueOfParameterNamed("externalId"); final String externalId = command.stringValueOfParameterNamed("externalId");
throw new PlatformDataIntegrityException( throw new PlatformDataIntegrityException("error.msg.desposit.product.duplicate.externalId", "Deposit product with externalId "
"error.msg.desposit.product.duplicate.externalId", "Deposit product with externalId " + externalId + externalId + " already exists", "externalId", externalId);
+ " already exists", "externalId", externalId); } }
logger.error(dve.getMessage(), dve); logger.error(dve.getMessage(), dve);
throw new PlatformDataIntegrityException("error.msg.deposit.product.unknown.data.integrity.issue", throw new PlatformDataIntegrityException("error.msg.deposit.product.unknown.data.integrity.issue",
"Unknown data integrity issue with resource."); "Unknown data integrity issue with resource.");
} }
@Transactional @Transactional
@Override @Override
public CommandProcessingResult createDepositProduct(JsonCommand command) { public CommandProcessingResult createDepositProduct(final JsonCommand command) {
try { try {
this.context.authenticatedUser(); this.context.authenticatedUser();
this.fromApiJsonDeserializer.validateForCreate(command.json()); this.fromApiJsonDeserializer.validateForCreate(command.json());
final Integer interestCompoundingPeriodTypeIntValue = command.integerValueOfParameterNamed("interestCompoundedEveryPeriodType");
PeriodFrequencyType interestCompoundingPeriodType = PeriodFrequencyType.fromInt(interestCompoundingPeriodTypeIntValue);
final Integer lockinPeriodTypeIntValue = command.integerValueOfParameterNamed("lockinPeriodType");
PeriodFrequencyType lockinPeriodType = PeriodFrequencyType.fromInt(lockinPeriodTypeIntValue);
DepositProduct product = DepositProduct.assembleFromJson(command,interestCompoundingPeriodType,lockinPeriodType);
this.depositProductRepository.save(product);
return new CommandProcessingResultBuilder() //
.withEntityId(product.getId()) //
.build();
} catch (DataIntegrityViolationException dve) {
handleDataIntegrityIssues(command, dve);
return new CommandProcessingResult(Long.valueOf(-1));
}
}
@Transactional final Integer interestCompoundingPeriodTypeIntValue = command.integerValueOfParameterNamed("interestCompoundedEveryPeriodType");
@Override PeriodFrequencyType interestCompoundingPeriodType = PeriodFrequencyType.fromInt(interestCompoundingPeriodTypeIntValue);
public CommandProcessingResult updateDepositProduct(final Long productId, final JsonCommand command) {
try { final Integer lockinPeriodTypeIntValue = command.integerValueOfParameterNamed("lockinPeriodType");
PeriodFrequencyType lockinPeriodType = PeriodFrequencyType.fromInt(lockinPeriodTypeIntValue);
this.context.authenticatedUser();
DepositProduct product = DepositProduct.assembleFromJson(command, interestCompoundingPeriodType, lockinPeriodType);
this.fromApiJsonDeserializer.validateForUpdate(command.json());
this.depositProductRepository.save(product);
DepositProduct product = this.depositProductRepository.findOne(productId);
return new CommandProcessingResultBuilder() //
.withEntityId(product.getId()) //
.build();
} catch (DataIntegrityViolationException dve) {
handleDataIntegrityIssues(command, dve);
return new CommandProcessingResult(Long.valueOf(-1));
}
}
@Transactional
@Override
public CommandProcessingResult updateDepositProduct(final Long productId, final JsonCommand command) {
try {
this.context.authenticatedUser();
this.fromApiJsonDeserializer.validateForUpdate(command.json());
DepositProduct product = this.depositProductRepository.findOne(productId);
if (product == null || product.isDeleted()) { throw new DepositProductNotFoundException(productId); } if (product == null || product.isDeleted()) { throw new DepositProductNotFoundException(productId); }
final Map<String, Object> changes = product.update(command); final Map<String, Object> changes = product.update(command);
if (!changes.isEmpty()) { if (!changes.isEmpty()) {
this.depositProductRepository.saveAndFlush(product); this.depositProductRepository.saveAndFlush(product);
} }
return new CommandProcessingResultBuilder() // return new CommandProcessingResultBuilder() //
.withCommandId(command.commandId()) // .withCommandId(command.commandId()) //
.withEntityId(productId) // .withEntityId(productId) //
.with(changes) // .with(changes) //
.build(); .build();
} catch (DataIntegrityViolationException dve) { } catch (DataIntegrityViolationException dve) {
handleDataIntegrityIssues(command, dve); handleDataIntegrityIssues(command, dve);
return new CommandProcessingResult(Long.valueOf(-1)); return new CommandProcessingResult(Long.valueOf(-1));
} }
} }
@Transactional @Transactional
@Override @Override
@@ -136,5 +136,4 @@ public class DepositProductWritePlatformServiceJpaRepositoryImpl implements Depo
.withEntityId(product.getId()) // .withEntityId(product.getId()) //
.build(); .build();
} }
} }