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 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.ApiRequestParameterHelper;
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.ToApiJsonSerializer;
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
@@ -56,7 +53,7 @@ public class GroupsApiResource {
"clientMembers", "allowedClients", "allowedOffices"));
private final PlatformSecurityContext context;
private GroupReadPlatformService groupReadPlatformService;
private final GroupReadPlatformService groupReadPlatformService;
private final GroupWritePlatformService groupWritePlatformService;
private final ClientReadPlatformService clientReadPlatformService;
private final OfficeReadPlatformService officeReadPlatformService;
@@ -240,7 +237,7 @@ public class GroupsApiResource {
// 'g.' preffix because of ERROR 1052 (23000): Column 'column_name' in where
// clause is ambiguous
// 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 = "";
@@ -272,8 +269,4 @@ public class GroupsApiResource {
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")
public class Group extends AbstractPersistable<Long> {
@SuppressWarnings("unused")
@ManyToOne
@JoinColumn(name = "office_id", nullable = false)
private Office office;
@SuppressWarnings("unused")
@ManyToOne
@JoinColumn(name = "loan_officer_id", nullable = true)
private Staff loanOfficer;
@@ -56,11 +54,11 @@ public class Group extends AbstractPersistable<Long> {
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);
}
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.loanOfficer = loanOfficer;
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()) {
this.loanOfficer = null;
}
@@ -78,16 +78,18 @@ public class SavingAccountData {
return new SavingAccountData(clientId, clientDisplayName);
}
public SavingAccountData(Long id, EnumOptionData status, String externalId, Long clientId, String clientName, Long productId,
String productName, EnumOptionData productType, CurrencyData currencyData, BigDecimal savingsDepositAmountPerPeriod,
EnumOptionData savingsFrequencyType, BigDecimal totalDepositAmount, BigDecimal recurringInterestRate,
BigDecimal savingInterestRate, EnumOptionData interestType, EnumOptionData interestCalculationMethod, Integer tenure,
EnumOptionData tenureType, LocalDate projectedCommencementDate, LocalDate actualCommencementDate, LocalDate maturesOnDate,
BigDecimal projectedInterestAccuredOnMaturity, BigDecimal actualInterestAccured, BigDecimal projectedMaturityAmount,
BigDecimal actualMaturityAmount, boolean preClosureAllowed, BigDecimal preClosureInterestRate, LocalDate withdrawnonDate,
LocalDate rejectedonDate, LocalDate closedonDate, boolean isLockinPeriodAllowed, Integer lockinPeriod,
EnumOptionData lockinPeriodType, Integer depositEvery, BigDecimal outstandingAmount, Integer interestPostEvery,
EnumOptionData interestPostFrequency) {
public SavingAccountData(final Long id, final EnumOptionData status, final String externalId, final Long clientId,
final String clientName, final Long productId, final String productName, final EnumOptionData productType,
final CurrencyData currencyData, final BigDecimal savingsDepositAmountPerPeriod, final EnumOptionData savingsFrequencyType,
final BigDecimal totalDepositAmount, final BigDecimal recurringInterestRate, final BigDecimal savingInterestRate,
final EnumOptionData interestType, final EnumOptionData interestCalculationMethod, final Integer tenure,
final EnumOptionData tenureType, final LocalDate projectedCommencementDate, final LocalDate actualCommencementDate,
final LocalDate maturesOnDate, final BigDecimal projectedInterestAccuredOnMaturity, final BigDecimal actualInterestAccured,
final BigDecimal projectedMaturityAmount, final BigDecimal actualMaturityAmount, final boolean preClosureAllowed,
final BigDecimal preClosureInterestRate, final LocalDate withdrawnonDate, final LocalDate rejectedonDate,
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.status = status;
this.externalId = externalId;
@@ -140,7 +142,7 @@ public class SavingAccountData {
this.interestPostFrequency = interestPostFrequency;
}
public SavingAccountData(Long clientId, String clientName) {
public SavingAccountData(final Long clientId, final String clientName) {
this.id = null;
this.status = null;
this.externalId = null;
@@ -193,11 +195,11 @@ public class SavingAccountData {
this.interestPostFrequency = null;
}
public SavingAccountData(SavingAccountData account, Collection<SavingProductLookup> productOptions,
Collection<CurrencyData> currencyOptions, List<EnumOptionData> savingsProductTypeOptions,
List<EnumOptionData> tenureTypeOptions, List<EnumOptionData> savingFrequencyOptions,
List<EnumOptionData> savingsInterestTypeOptions, List<EnumOptionData> lockinPeriodTypeOptions,
List<EnumOptionData> interestCalculationOptions, BigDecimal dueAmount) {
public SavingAccountData(final SavingAccountData account, final Collection<SavingProductLookup> productOptions,
final Collection<CurrencyData> currencyOptions, final List<EnumOptionData> savingsProductTypeOptions,
final List<EnumOptionData> tenureTypeOptions, final List<EnumOptionData> savingFrequencyOptions,
final List<EnumOptionData> savingsInterestTypeOptions, final List<EnumOptionData> lockinPeriodTypeOptions,
final List<EnumOptionData> interestCalculationOptions, final BigDecimal dueAmount) {
this.id = account.id;
this.status = account.status;
this.externalId = account.externalId;
@@ -252,12 +254,11 @@ public class SavingAccountData {
this.interestPostFrequency = account.interestPostFrequency;
}
// FIXME - Madhukar - unused variables been passed into construction - why?
public SavingAccountData(Long clientId, String clientName, Long productId, String productName, CurrencyData currency,
BigDecimal interestRate, BigDecimal savingsDepositAmountPerPeriod, EnumOptionData productType, EnumOptionData tenureType,
Integer tenure, EnumOptionData savingsFrequencyType, EnumOptionData interestType, EnumOptionData interestCalculationMethod,
BigDecimal minimumBalanceForWithdrawal, boolean partialDepositAllowed, boolean lockinPeriodAllowed, Integer lockinPeriod,
EnumOptionData lockinPeriodType, Integer depositEvery) {
public SavingAccountData(final Long clientId, final String clientName, final Long productId, final String productName,
final CurrencyData currency, final BigDecimal interestRate, final BigDecimal savingsDepositAmountPerPeriod,
final EnumOptionData productType, final EnumOptionData tenureType, final Integer tenure,
final EnumOptionData savingsFrequencyType, final EnumOptionData interestType, final EnumOptionData interestCalculationMethod,
final boolean lockinPeriodAllowed, final Integer lockinPeriod, final EnumOptionData lockinPeriodType, final Integer depositEvery) {
this.id = null;
this.status = null;
this.externalId = null;
@@ -310,7 +311,7 @@ public class SavingAccountData {
this.interestPostFrequency = savingsFrequencyType;
}
public SavingAccountData(SavingAccountData account, SavingPermissionData permissions) {
public SavingAccountData(final SavingAccountData account, final SavingPermissionData permissions) {
this.id = account.id;
this.status = account.status;
this.externalId = account.externalId;
@@ -364,7 +365,7 @@ public class SavingAccountData {
this.interestPostFrequency = account.interestPostFrequency;
}
public SavingAccountData(SavingAccountData account, SavingScheduleData savingScheduleData) {
public SavingAccountData(final SavingAccountData account, final SavingScheduleData savingScheduleData) {
this.id = account.id;
this.status = account.status;
this.externalId = account.externalId;
@@ -418,7 +419,7 @@ public class SavingAccountData {
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.status = account.status;
this.externalId = account.externalId;
@@ -9,110 +9,110 @@ import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import org.joda.time.LocalDate;
import org.mifosplatform.organisation.monetary.domain.Money;
import org.mifosplatform.portfolio.savingsaccountproduct.domain.SavingFrequencyType;
import org.mifosplatform.portfolio.savingsaccountproduct.domain.SavingInterestCalculationMethod;
import org.mifosplatform.portfolio.savingsdepositproduct.domain.TenureTypeEnum;
import org.springframework.stereotype.Service;
@Service
public class ReccuringDepositInterestCalculator {
private final Integer monthsInYear = 12;
// FIXME - MADHUKAR - Are the unused field here needed?
public Money calculateInterestOnMaturityFor(Money savingsDepositPerPeriod, Integer tenure, BigDecimal reccuringInterestRate,
LocalDate commencementDate, TenureTypeEnum tenureTypeEnum, SavingFrequencyType savingFrequencyType,
SavingInterestCalculationMethod savingInterestCalculationMethod, Integer depositEvery) {
BigDecimal finalAmount = BigDecimal.ZERO;
MathContext mc = new MathContext(8, RoundingMode.HALF_EVEN);
private final Integer monthsInYear = 12;
public Money calculateInterestOnMaturityFor(final Money savingsDepositPerPeriod, final Integer tenure,
final BigDecimal reccuringInterestRate, final SavingFrequencyType savingFrequencyType,
final SavingInterestCalculationMethod savingInterestCalculationMethod, Integer depositEvery) {
BigDecimal finalAmount = BigDecimal.ZERO;
MathContext mc = new MathContext(8, RoundingMode.HALF_EVEN);
BigDecimal interestRateAsFraction = reccuringInterestRate.divide(BigDecimal.valueOf(100), mc);
Integer noofTimesInterestCompoundPerYear = determineIntValue(savingFrequencyType);
BigDecimal interestRatePerPeriod = BigDecimal.valueOf(interestRateAsFraction.doubleValue()
/ noofTimesInterestCompoundPerYear.doubleValue());
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");
Integer noOfTimestobeCalculated = tenure / depositEvery;
}
return noofTimesInterestCompoundPerYear;
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(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;
@Column(name = "is_preclosure_allowed", nullable = false)
private boolean preClosureAllowed = false;
private final boolean preClosureAllowed = false;
@Column(name = "is_deleted", nullable = 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,
BigDecimal reccuringInterestRate, BigDecimal savingInterestRate, Integer tenure, LocalDate commencementDate,
TenureTypeEnum tenureTypeEnum, SavingProductType savingProductType, SavingFrequencyType savingFrequencyType,
SavingsInterestType interestType, SavingInterestCalculationMethod savingInterestCalculationMethod,
boolean isLockinPeriodAllowed, Integer lockinPeriod, PeriodFrequencyType lockinPeriodType,
ReccuringDepositInterestCalculator reccuringDepositInterestCalculator,
final DepositLifecycleStateMachine lifecycleStateMachine, Integer depositEvery, Integer interestPostEvery,
Integer interestPostFrequency) {
public static SavingAccount openNew(final Client client, final SavingProduct product, final String externalId,
final Money savingsDeposit, final BigDecimal reccuringInterestRate, final BigDecimal savingInterestRate, final Integer tenure,
final LocalDate commencementDate, final TenureTypeEnum tenureTypeEnum, final SavingProductType savingProductType,
final SavingFrequencyType savingFrequencyType, final SavingsInterestType interestType,
final SavingInterestCalculationMethod savingInterestCalculationMethod, final boolean isLockinPeriodAllowed,
final Integer lockinPeriod, final PeriodFrequencyType lockinPeriodType,
final ReccuringDepositInterestCalculator reccuringDepositInterestCalculator,
final DepositLifecycleStateMachine lifecycleStateMachine, final Integer depositEvery, final Integer interestPostEvery,
final Integer interestPostFrequency) {
Money futureValueOnMaturity = null;
if (savingProductType.isReccuring() && tenureTypeEnum.isFixedPeriod()) {
futureValueOnMaturity = reccuringDepositInterestCalculator.calculateInterestOnMaturityFor(savingsDeposit, tenure,
reccuringInterestRate, commencementDate, tenureTypeEnum, savingFrequencyType, savingInterestCalculationMethod,
depositEvery);
reccuringInterestRate, savingFrequencyType, savingInterestCalculationMethod, depositEvery);
} else if (savingProductType.isReccuring() && tenureTypeEnum.isPerpetual()) {
futureValueOnMaturity = savingsDeposit;
} else {
@@ -223,12 +223,14 @@ public class SavingAccount extends AbstractAuditableCustom<AppUser, Long> {
interestPostEvery, interestPostFrequency);
}
public SavingAccount(Client client, String externalId, SavingProduct product, Money savingsDeposit, BigDecimal reccuringInterestRate,
BigDecimal savingInterestRate, Integer tenure, LocalDate commencementDate, TenureTypeEnum tenureTypeEnum,
SavingProductType savingProductType, SavingFrequencyType savingFrequencyType, SavingsInterestType interestType,
SavingInterestCalculationMethod savingInterestCalculationMethod, boolean isLockinPeriodAllowed, Integer lockinPeriod,
PeriodFrequencyType lockinPeriodType, Money futureValueOnMaturity, final DepositLifecycleStateMachine lifecycleStateMachine,
Integer payEvery, Integer interestPostEvery, Integer interestPostFrequency) {
public SavingAccount(final Client client, final String externalId, final SavingProduct product, final Money savingsDeposit,
final BigDecimal reccuringInterestRate, final BigDecimal savingInterestRate, final Integer tenure,
final LocalDate commencementDate, final TenureTypeEnum tenureTypeEnum, final SavingProductType savingProductType,
final SavingFrequencyType savingFrequencyType, final SavingsInterestType interestType,
final SavingInterestCalculationMethod savingInterestCalculationMethod, final boolean isLockinPeriodAllowed,
final Integer lockinPeriod, final PeriodFrequencyType lockinPeriodType, final Money futureValueOnMaturity,
final DepositLifecycleStateMachine lifecycleStateMachine, final Integer payEvery, final Integer interestPostEvery,
final Integer interestPostFrequency) {
DepositAccountStatus from = null;
if (accountStatus != null) {
@@ -274,18 +276,18 @@ public class SavingAccount extends AbstractAuditableCustom<AppUser, Long> {
this.interestPostFrequency = interestPostFrequency;
}
public void modifyAccount(SavingProduct product, String externalId, Money savingsDeposit, BigDecimal reccuringInterestRate,
BigDecimal savingInterestRate, Integer tenure, LocalDate commencementDate, TenureTypeEnum tenureTypeEnum,
SavingProductType savingProductType, SavingFrequencyType savingFrequencyType,
SavingInterestCalculationMethod savingInterestCalculationMethod, boolean isLockinPeriodAllowed, Integer lockinPeriod,
PeriodFrequencyType lockinPeriodType, ReccuringDepositInterestCalculator reccuringDepositInterestCalculator, Integer payEvery,
SavingsInterestType interestType, Integer interestPostEvery, Integer interestPostFrequency) {
public void modifyAccount(final SavingProduct product, final String externalId, final Money savingsDeposit,
final BigDecimal reccuringInterestRate, final BigDecimal savingInterestRate, final Integer tenure,
final LocalDate commencementDate, final TenureTypeEnum tenureTypeEnum, final SavingProductType savingProductType,
final SavingFrequencyType savingFrequencyType, final SavingInterestCalculationMethod savingInterestCalculationMethod,
final boolean isLockinPeriodAllowed, final Integer lockinPeriod, final PeriodFrequencyType lockinPeriodType,
final ReccuringDepositInterestCalculator reccuringDepositInterestCalculator, final Integer payEvery,
final SavingsInterestType interestType, final Integer interestPostEvery, final Integer interestPostFrequency) {
Money futureValueOnMaturity = null;
if (savingProductType.isReccuring() && tenureTypeEnum.isFixedPeriod()) {
futureValueOnMaturity = reccuringDepositInterestCalculator
.calculateInterestOnMaturityFor(savingsDeposit, tenure, reccuringInterestRate, commencementDate, tenureTypeEnum,
savingFrequencyType, savingInterestCalculationMethod, payEvery);
futureValueOnMaturity = reccuringDepositInterestCalculator.calculateInterestOnMaturityFor(savingsDeposit, tenure,
reccuringInterestRate, savingFrequencyType, savingInterestCalculationMethod, payEvery);
} else if (savingProductType.isReccuring() && tenureTypeEnum.isPerpetual()) {
futureValueOnMaturity = savingsDeposit;
} else {
@@ -432,7 +434,7 @@ public class SavingAccount extends AbstractAuditableCustom<AppUser, Long> {
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.fromInt(this.accountStatus));
@@ -467,7 +469,7 @@ public class SavingAccount extends AbstractAuditableCustom<AppUser, Long> {
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.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.fromInt(this.accountStatus));
this.accountStatus = statusEnum.getValue();
@@ -501,10 +503,12 @@ public class SavingAccount extends AbstractAuditableCustom<AppUser, Long> {
this.closedOnDate = new Date();
}
public void approveSavingAccount(LocalDate approvalDate, BigDecimal savingsDepositAmountPerPeriod, BigDecimal recurringInterestRate,
BigDecimal savingInterestRate, Integer interestType, Integer tenure, Integer tenureType, Integer frequency, Integer payEvery,
DepositLifecycleStateMachine depositLifecycleStateMachine,
ReccuringDepositInterestCalculator reccuringDepositInterestCalculator, Integer interestPostEvery, Integer interestPostFrequency) {
public void approveSavingAccount(final LocalDate approvalDate, final BigDecimal savingsDepositAmountPerPeriod,
final BigDecimal recurringInterestRate, final BigDecimal savingInterestRate, final Integer interestType, final Integer tenure,
final Integer tenureType, final Integer frequency, final Integer payEvery,
final DepositLifecycleStateMachine depositLifecycleStateMachine,
final ReccuringDepositInterestCalculator reccuringDepositInterestCalculator, final Integer interestPostEvery,
final Integer interestPostFrequency) {
DepositAccountStatus statusEnum = depositLifecycleStateMachine.transition(DepositAccountEvent.DEPOSIT_APPROVED,
DepositAccountStatus.fromInt(this.accountStatus));
@@ -518,7 +522,7 @@ public class SavingAccount extends AbstractAuditableCustom<AppUser, Long> {
Money futureValueOnMaturity = null;
if (SavingProductType.fromInt(this.savingProductType).isReccuring() && tenureTypeEnum.isFixedPeriod()) {
futureValueOnMaturity = reccuringDepositInterestCalculator.calculateInterestOnMaturityFor(savingsAmountPerPeriod, tenure,
recurringInterestRate, approvalDate, tenureTypeEnum, savingFrequencyType, interestCalculationMethod, payEvery);
recurringInterestRate, savingFrequencyType, interestCalculationMethod, payEvery);
} else if (SavingProductType.fromInt(this.savingProductType).isReccuring() && tenureTypeEnum.isPerpetual()) {
futureValueOnMaturity = savingsAmountPerPeriod;
} else {
@@ -552,7 +556,7 @@ public class SavingAccount extends AbstractAuditableCustom<AppUser, Long> {
this.interestPostedAmount = BigDecimal.ZERO;
}
public void depositMoney(SavingAccountDepositCommand command) {
public void depositMoney(final SavingAccountDepositCommand command) {
BigDecimal depositAmount = BigDecimal.ZERO;
BigDecimal remainAmountToBePaid = BigDecimal.ZERO;
@@ -600,7 +604,7 @@ public class SavingAccount extends AbstractAuditableCustom<AppUser, Long> {
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);
SavingAccountTransaction savingAccountTransaction = SavingAccountTransaction.withdraw(amount, transactionDate);
savingAccountTransaction.updateAccount(this);
@@ -26,12 +26,12 @@ import org.mifosplatform.useradministration.domain.AppUser;
@Entity
@Table(name = "m_saving_account_transaction")
public class SavingAccountTransaction extends AbstractAuditableCustom<AppUser, Long> {
@SuppressWarnings("unused")
@ManyToOne(optional = false)
@JoinColumn(name = "saving_account_id", nullable = false)
private SavingAccount savingAccount;
// @Enumerated(EnumType.ORDINAL)
@Column(name = "transaction_type_enum", nullable = false)
private Integer typeOf;
@@ -46,49 +46,51 @@ public class SavingAccountTransaction extends AbstractAuditableCustom<AppUser, L
@Column(name = "amount", scale = 6, precision = 19, nullable = false)
private final BigDecimal amount;
public SavingAccountTransaction() {
this.transactionDate = null;
this.amount = BigDecimal.ZERO;
}
this.transactionDate = null;
this.amount = BigDecimal.ZERO;
}
public SavingAccountTransaction(DepositAccountTransactionType transactionType, BigDecimal amount, LocalDate paymentDate) {
this.typeOf = transactionType.getValue();
this.amount = amount;
this.transactionDate =paymentDate.toDate();
}
public SavingAccountTransaction(final DepositAccountTransactionType transactionType, final BigDecimal amount,
final LocalDate paymentDate) {
this.typeOf = transactionType.getValue();
this.amount = amount;
this.transactionDate = paymentDate.toDate();
}
public static SavingAccountTransaction deposit(BigDecimal amount, LocalDate 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 static SavingAccountTransaction deposit(final BigDecimal amount, final LocalDate paymentDate) {
return new SavingAccountTransaction(DepositAccountTransactionType.DEPOSIT, amount == null ? new BigDecimal(0) : amount, paymentDate);
}
public void updateAccount(SavingAccount savingAccount) {
this.savingAccount = savingAccount;
}
public static SavingAccountTransaction withdraw(final BigDecimal amount, final LocalDate paymentDate) {
return new SavingAccountTransaction(DepositAccountTransactionType.WITHDRAW, amount == null ? new BigDecimal(0) : amount,
paymentDate);
}
public DepositAccountTransactionType getTypeOf() {
return DepositAccountTransactionType.fromInt(this.typeOf);
}
public static SavingAccountTransaction postInterest(final BigDecimal amount, final LocalDate paymentDate) {
return new SavingAccountTransaction(DepositAccountTransactionType.INTEREST_POSTING, amount == null ? new BigDecimal(0) : amount,
paymentDate);
}
public BigDecimal getAmount() {
return this.amount;
}
public void updateAccount(final SavingAccount savingAccount) {
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
public SavingAccountReadPlatformServiceImpl(final PlatformSecurityContext context, final TenantAwareRoutingDataSource dataSource,
ClientReadPlatformService clientReadPlatformService, SavingProductReadPlatformService savingProductReadPlatformService) {
final ClientReadPlatformService clientReadPlatformService,
final SavingProductReadPlatformService savingProductReadPlatformService) {
this.context = context;
this.jdbcTemplate = new JdbcTemplate(dataSource);
this.clientReadPlatformService = clientReadPlatformService;
@@ -66,7 +67,7 @@ public class SavingAccountReadPlatformServiceImpl implements SavingAccountReadPl
}
@Override
public SavingAccountData retrieveSavingsAccount(Long accountId) {
public SavingAccountData retrieveSavingsAccount(final Long accountId) {
this.context.authenticatedUser();
SavingAccountMapper mapper = new SavingAccountMapper();
@@ -100,7 +101,7 @@ public class SavingAccountReadPlatformServiceImpl implements SavingAccountReadPl
}
@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");
String externalId = rs.getString("externalId");
@@ -174,7 +175,7 @@ public class SavingAccountReadPlatformServiceImpl implements SavingAccountReadPl
}
@Override
public SavingAccountData retrieveNewSavingsAccountDetails(Long clientId, Long productId) {
public SavingAccountData retrieveNewSavingsAccountDetails(final Long clientId, final Long productId) {
context.authenticatedUser();
ClientData clientAccount = this.clientReadPlatformService.retrieveIndividualClient(clientId);
@@ -190,9 +191,8 @@ public class SavingAccountReadPlatformServiceImpl implements SavingAccountReadPl
selectedProduct.getName(), currency, selectedProduct.getInterestRate(), selectedProduct.getSavingsDepositAmount(),
selectedProduct.getSavingProductType(), selectedProduct.getTenureType(), selectedProduct.getTenure(),
selectedProduct.getSavingFrequencyType(), selectedProduct.getInterestType(),
selectedProduct.getInterestCalculationMethod(), selectedProduct.getMinimumBalanceForWithdrawal(),
selectedProduct.isPartialDepositAllowed(), selectedProduct.isLockinPeriodAllowed(), selectedProduct.getLockinPeriod(),
selectedProduct.getLockinPeriodType(), selectedProduct.getDepositEvery());
selectedProduct.getInterestCalculationMethod(), selectedProduct.isLockinPeriodAllowed(),
selectedProduct.getLockinPeriod(), selectedProduct.getLockinPeriodType(), selectedProduct.getDepositEvery());
} else {
accountData = SavingAccountData.createFrom(clientAccount.id(), clientAccount.displayName());
@@ -200,7 +200,7 @@ public class SavingAccountReadPlatformServiceImpl implements SavingAccountReadPl
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();
for (SavingProductLookup savingProductLookup : savingProducts) {
if (savingProductLookup.hasId(productId)) {
@@ -212,7 +212,7 @@ public class SavingAccountReadPlatformServiceImpl implements SavingAccountReadPl
}
@Override
public SavingPermissionData retrieveSavingAccountPermissions(SavingAccountData savingAccountData) {
public SavingPermissionData retrieveSavingAccountPermissions(final SavingAccountData savingAccountData) {
boolean pendingApproval = (savingAccountData.getStatus().getId().equals(100L));
boolean undoApprovalAllowed = (savingAccountData.getStatus().getId().equals(300L));
boolean renewelAllowed = false;
@@ -230,7 +230,7 @@ public class SavingAccountReadPlatformServiceImpl implements SavingAccountReadPl
@SuppressWarnings("unused")
@Override
public BigDecimal deriveSavingDueAmount(SavingAccountData account) {
public BigDecimal deriveSavingDueAmount(final SavingAccountData account) {
BigDecimal dueAmount = BigDecimal.ZERO;
EnumOptionData status = account.getStatus();
@@ -254,7 +254,7 @@ public class SavingAccountReadPlatformServiceImpl implements SavingAccountReadPl
}
@Override
public SavingScheduleData retrieveSavingsAccountSchedule(Long accountId, CurrencyData currency) {
public SavingScheduleData retrieveSavingsAccountSchedule(final Long accountId, final CurrencyData currency) {
this.context.authenticatedUser();
SavingAccountScheduleMapper mapper = new SavingAccountScheduleMapper();
String sql = "Select " + mapper.savingScheduleSchema() + " where ss.saving_account_id =? order by ss.installment";
@@ -281,7 +281,7 @@ public class SavingAccountReadPlatformServiceImpl implements SavingAccountReadPl
}
@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");
Integer installment = JdbcSupport.getInteger(rs, "installment");
@@ -308,7 +308,7 @@ public class SavingAccountReadPlatformServiceImpl implements SavingAccountReadPl
}
@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");
return new SavingAccountForLookup(id);
}
@@ -316,7 +316,7 @@ public class SavingAccountReadPlatformServiceImpl implements SavingAccountReadPl
}
@Override
public Collection<SavingAccountTransactionsData> retrieveSavingsAccountTransactions(Long accountId) {
public Collection<SavingAccountTransactionsData> retrieveSavingsAccountTransactions(final Long accountId) {
this.context.authenticatedUser();
SavingAccountTransactionMapper savingAccountTransactionMapper = new SavingAccountTransactionMapper();
String sql = "select " + savingAccountTransactionMapper.schema() + " where stxn.saving_account_id = ? ";
@@ -330,7 +330,7 @@ public class SavingAccountReadPlatformServiceImpl implements SavingAccountReadPl
}
@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");
LocalDate transactionDate = JdbcSupport.getLocalDate(rs, "transactionDate");
Integer transactionTypeValue = JdbcSupport.getInteger(rs, "type");
@@ -562,14 +562,14 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
return date;
}
public void updateAccount(DepositAccount account) {
public void updateAccount(final DepositAccount account) {
this.renewdAccount = account;
}
public void withdrawDepositAccountMoney(DepositLifecycleStateMachine depositLifecycleStateMachine,
FixedTermDepositInterestCalculator fixedTermDepositInterestCalculator, LocalDate eventDate) {
public void withdrawDepositAccountMoney(final DepositLifecycleStateMachine depositLifecycleStateMachine,
final FixedTermDepositInterestCalculator fixedTermDepositInterestCalculator, final LocalDate eventDate) {
if (eventDate.isBefore(getLastInterestPostedDate())) {
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")
boolean statustest = 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.fromInt(this.depositStatus));
this.depositStatus = statusEnumForClose.getValue();
@@ -732,7 +732,7 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
return DepositAccountStatus.fromInt(this.depositStatus).isActive();
}
public void postInterestForDepositAccount(DepositAccount account, FixedTermDepositInterestCalculator fixedTermDepositInterestCalculator) {
public void postInterestForDepositAccount(final FixedTermDepositInterestCalculator fixedTermDepositInterestCalculator) {
LocalDate lastInterestPostedDate = getLastInterestPostedDate();
LocalDate nextInterestPostingDate = getNextInterestPostedDate();
@@ -57,26 +57,31 @@ public class DepositAccountAssembler {
}
public DepositAccount assembleFrom(final JsonCommand command) {
final JsonElement element = command.parsedJson();
final Long clientId = fromApiJsonHelper.extractLongNamed("clientId", element);
final Long productId = fromApiJsonHelper.extractLongNamed("productId", element);
final String externalId = fromApiJsonHelper.extractStringNamed("externalId", element);
final Boolean isInterestWithdrawable = fromApiJsonHelper.extractBooleanNamed("isInterestWithdrawable", element);
final BigDecimal depositValue = fromApiJsonHelper.extractBigDecimalWithLocaleNamed("deposit", element);
final Integer tenureInMonthsCommandValue = fromApiJsonHelper.extractIntegerNamed("tenureInMonths", element, Locale.getDefault());
final BigDecimal maturityInterestRateCommandValue = fromApiJsonHelper.extractBigDecimalWithLocaleNamed("maturityInterestRate", element);
final BigDecimal preClosureInterestRateCommandValue = fromApiJsonHelper.extractBigDecimalWithLocaleNamed("preClosureInterestRate", element);
final Integer interestCompoundedEveryCommandValue = fromApiJsonHelper.extractIntegerNamed("interestCompoundedEvery", element, Locale.getDefault());
final Integer interestCompoundedEveryPeriodTypeCommandValue = fromApiJsonHelper.extractIntegerNamed("interestCompoundedEveryPeriodType", element, Locale.getDefault());
final Boolean renewalAllowedCommandValue = fromApiJsonHelper.extractBooleanNamed("renewalAllowed", element);
final Boolean preClosureAllowedCommandValue = fromApiJsonHelper.extractBooleanNamed("preClosureAllowed", 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);
final JsonElement element = command.parsedJson();
final Long clientId = fromApiJsonHelper.extractLongNamed("clientId", element);
final Long productId = fromApiJsonHelper.extractLongNamed("productId", element);
final String externalId = fromApiJsonHelper.extractStringNamed("externalId", element);
final Boolean isInterestWithdrawable = fromApiJsonHelper.extractBooleanNamed("isInterestWithdrawable", element);
final BigDecimal depositValue = fromApiJsonHelper.extractBigDecimalWithLocaleNamed("deposit", element);
final Integer tenureInMonthsCommandValue = fromApiJsonHelper.extractIntegerNamed("tenureInMonths", element, Locale.getDefault());
final BigDecimal maturityInterestRateCommandValue = fromApiJsonHelper.extractBigDecimalWithLocaleNamed("maturityInterestRate",
element);
final BigDecimal preClosureInterestRateCommandValue = fromApiJsonHelper.extractBigDecimalWithLocaleNamed("preClosureInterestRate",
element);
final Integer interestCompoundedEveryCommandValue = fromApiJsonHelper.extractIntegerNamed("interestCompoundedEvery", element,
Locale.getDefault());
final Integer interestCompoundedEveryPeriodTypeCommandValue = fromApiJsonHelper.extractIntegerNamed(
"interestCompoundedEveryPeriodType", element, Locale.getDefault());
final Boolean renewalAllowedCommandValue = fromApiJsonHelper.extractBooleanNamed("renewalAllowed", element);
final Boolean preClosureAllowedCommandValue = fromApiJsonHelper.extractBooleanNamed("preClosureAllowed", 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);
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
DepositAccount account = new DepositAccount().openNew(client, product, externalId, deposit, maturityInterestRate,
preClosureInterestRate, tenureInMonths, compoundingInterestEvery, compoundingInterestFrequency,
commencementDate, renewalAllowed, preClosureAllowed, this.fixedTermDepositInterestCalculator,
defaultDepositLifecycleStateMachine(), isInterestWithdrawable, interestCompoundingAllowed, isLockinPeriodAllowed,
lockinPeriod, lockinPeriodType);
preClosureInterestRate, tenureInMonths, compoundingInterestEvery, compoundingInterestFrequency, commencementDate,
renewalAllowed, preClosureAllowed, this.fixedTermDepositInterestCalculator, defaultDepositLifecycleStateMachine(),
isInterestWithdrawable, interestCompoundingAllowed, isLockinPeriodAllowed, lockinPeriod, lockinPeriodType);
return account;
}
@@ -160,10 +164,10 @@ public class DepositAccountAssembler {
return new DepositLifecycleStateMachineImpl(allowedDepositStatuses);
}
public DepositAccount assembleFrom(DepositAccount account, JsonCommand command) {
final Map<String, Object> actualChanges = new LinkedHashMap<String, Object>(20);
final String localeAsInput = command.locale();
public DepositAccount assembleFrom(final DepositAccount account, final JsonCommand command) {
final Map<String, Object> actualChanges = new LinkedHashMap<String, Object>(20);
final String localeAsInput = command.locale();
Client client = account.client();
@@ -178,7 +182,7 @@ public class DepositAccountAssembler {
actualChanges.put(productIdParamName, newValue);
actualChanges.put("locale", localeAsInput);
}
Money deposit = account.getDeposit();
final String depositParamName = "deposit";
if (command.isChangeInBigDecimalParameterNamed(depositParamName, deposit.getAmount())) {
@@ -229,7 +233,8 @@ public class DepositAccountAssembler {
PeriodFrequencyType interestCompoundedEveryPeriodType = account.getInterestCompoundedFrequencyType();
final String interestCompoundedEveryPeriodTypeParamName = "interestCompoundedEveryPeriodType";
if (command.isChangeInIntegerParameterNamed(interestCompoundedEveryPeriodTypeParamName, interestCompoundedEveryPeriodType.getValue())) {
if (command.isChangeInIntegerParameterNamed(interestCompoundedEveryPeriodTypeParamName,
interestCompoundedEveryPeriodType.getValue())) {
final Integer newValue = command.integerValueOfParameterNamed(interestCompoundedEveryPeriodTypeParamName);
actualChanges.put(interestCompoundedEveryPeriodTypeParamName, newValue);
actualChanges.put("locale", localeAsInput);
@@ -239,7 +244,7 @@ public class DepositAccountAssembler {
Boolean renewalAllowed = account.isRenewalAllowed();
final String 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("locale", localeAsInput);
renewalAllowed = newValue;
@@ -248,7 +253,7 @@ public class DepositAccountAssembler {
Boolean preClosureAllowed = account.isPreClosureAllowed();
final String 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("locale", localeAsInput);
preClosureAllowed = newValue;
@@ -257,7 +262,7 @@ public class DepositAccountAssembler {
Boolean isInterestWithdrawable = account.isInterestWithdrawable();
final String 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("locale", localeAsInput);
isInterestWithdrawable = newValue;
@@ -266,7 +271,7 @@ public class DepositAccountAssembler {
Boolean isInterestCompoundingAllowed = account.isInterestCompoundingAllowed();
final String isInterestCompoundingAllowedParamName = "interestCompoundingAllowed";
if (command.isChangeInBooleanParameterNamed(isInterestCompoundingAllowedParamName, isInterestCompoundingAllowed)) {
final Boolean newValue = command.booleanObjectValueOfParameterNamed(isInterestCompoundingAllowedParamName);
final Boolean newValue = command.booleanObjectValueOfParameterNamed(isInterestCompoundingAllowedParamName);
actualChanges.put(isInterestCompoundingAllowedParamName, newValue);
actualChanges.put("locale", localeAsInput);
isInterestCompoundingAllowed = newValue;
@@ -275,14 +280,14 @@ public class DepositAccountAssembler {
Boolean isLockinPeriodAllowed = account.isLockinPeriodAllowed();
final String 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("locale", localeAsInput);
isLockinPeriodAllowed = newValue;
}
Integer lockinPeriod = account.getLockinPeriod();
final String lockinPeriodParamName = "lockinPeriod";
final String lockinPeriodParamName = "lockinPeriod";
if (command.isChangeInIntegerParameterNamed(lockinPeriodParamName, lockinPeriod)) {
final Integer newValue = command.integerValueOfParameterNamed(lockinPeriodParamName);
actualChanges.put(lockinPeriodParamName, newValue);
@@ -291,7 +296,7 @@ public class DepositAccountAssembler {
}
PeriodFrequencyType lockinPeriodType = account.getLockinPeriodType();
final String lockinPeriodTypeParamName = "lockinPeriodType";
final String lockinPeriodTypeParamName = "lockinPeriodType";
if (command.isChangeInIntegerParameterNamed(lockinPeriodTypeParamName, lockinPeriodType.getValue())) {
final Integer newValue = command.integerValueOfParameterNamed(lockinPeriodTypeParamName);
actualChanges.put(lockinPeriodTypeParamName, newValue);
@@ -310,13 +315,13 @@ public class DepositAccountAssembler {
return newAccount;
}
public Map<String, Object> assembleUpdatedDepositAccount(DepositAccount account, JsonCommand command) {
final Map<String, Object> actualChanges = new LinkedHashMap<String, Object>(20);
final String localeAsInput = command.locale();
DepositProduct product = account.product();
final String productIdParamName = "productId";
public Map<String, Object> assembleUpdatedDepositAccount(final DepositAccount account, final JsonCommand command) {
final Map<String, Object> actualChanges = new LinkedHashMap<String, Object>(20);
final String localeAsInput = command.locale();
DepositProduct product = account.product();
final String productIdParamName = "productId";
if (command.isChangeInLongParameterNamed(productIdParamName, account.product().getId())) {
final Long newValue = command.longValueOfParameterNamed(productIdParamName);
if (newValue != null) {
@@ -326,7 +331,7 @@ public class DepositAccountAssembler {
actualChanges.put(productIdParamName, newValue);
actualChanges.put("locale", localeAsInput);
}
String externalId = account.getExternalId();
final String externalIdParamName = "externalId";
if (command.isChangeInStringParameterNamed(externalIdParamName, externalId)) {
@@ -334,15 +339,15 @@ public class DepositAccountAssembler {
actualChanges.put(externalIdParamName, newValue);
externalId = newValue;
}
LocalDate commencementDate = account.getProjectedCommencementDate();
final String commencementDateParamName = "commencementDate";
if (command.isChangeInLocalDateParameterNamed("commencementDate", commencementDate)) {
final LocalDate newValue = command.localDateValueOfParameterNamed(commencementDateParamName);
actualChanges.put(commencementDateParamName, newValue);
commencementDate = newValue;
}
final LocalDate newValue = command.localDateValueOfParameterNamed(commencementDateParamName);
actualChanges.put(commencementDateParamName, newValue);
commencementDate = newValue;
}
Money deposit = account.getDeposit();
final String depositParamName = "deposit";
if (command.isChangeInBigDecimalParameterNamed(depositParamName, deposit.getAmount())) {
@@ -351,7 +356,7 @@ public class DepositAccountAssembler {
actualChanges.put("locale", localeAsInput);
deposit = Money.of(deposit.getCurrency(), newValue);
}
Integer tenureInMonths = account.getTenureInMonths();
final String tenureInMonthsParamName = "tenureInMonths";
if (command.isChangeInIntegerParameterNamed(tenureInMonthsParamName, tenureInMonths)) {
@@ -360,7 +365,7 @@ public class DepositAccountAssembler {
actualChanges.put("locale", localeAsInput);
tenureInMonths = newValue;
}
BigDecimal maturityInterestRate = account.getInterestRate();
final String maturityInterestRateParamName = "maturityInterestRate";
if (command.isChangeInBigDecimalParameterNamed(maturityInterestRateParamName, maturityInterestRate)) {
@@ -369,7 +374,7 @@ public class DepositAccountAssembler {
actualChanges.put("locale", localeAsInput);
maturityInterestRate = newValue;
}
BigDecimal preClosureInterestRate = account.getPreClosureInterestRate();
final String preClosureInterestRateParamName = "preClosureInterestRate";
if (command.isChangeInBigDecimalParameterNamed(preClosureInterestRateParamName, preClosureInterestRate)) {
@@ -378,10 +383,10 @@ public class DepositAccountAssembler {
actualChanges.put("locale", localeAsInput);
preClosureInterestRate = newValue;
}
if (product.getMaturityMinInterestRate().compareTo(preClosureInterestRate) == -1) { throw new DepositAccounDataValidationtException(
preClosureInterestRate, product.getMaturityMinInterestRate()); }
Integer interestCompoundedEvery = account.getInterestCompoundedEvery();
final String interestCompoundedEveryParamName = "interestCompoundedEvery";
if (command.isChangeInIntegerParameterNamed(interestCompoundedEveryParamName, interestCompoundedEvery)) {
@@ -390,96 +395,97 @@ public class DepositAccountAssembler {
actualChanges.put("locale", localeAsInput);
interestCompoundedEvery = newValue;
}
PeriodFrequencyType interestCompoundedEveryPeriodType = account.getInterestCompoundedFrequencyType();
final String interestCompoundedEveryPeriodTypeParamName = "interestCompoundedEveryPeriodType";
if (command.isChangeInIntegerParameterNamed(interestCompoundedEveryPeriodTypeParamName, interestCompoundedEveryPeriodType.getValue())) {
if (command.isChangeInIntegerParameterNamed(interestCompoundedEveryPeriodTypeParamName,
interestCompoundedEveryPeriodType.getValue())) {
final Integer newValue = command.integerValueOfParameterNamed(interestCompoundedEveryPeriodTypeParamName);
actualChanges.put(interestCompoundedEveryPeriodTypeParamName, newValue);
actualChanges.put("locale", localeAsInput);
interestCompoundedEveryPeriodType = PeriodFrequencyType.fromInt(newValue);
}
Boolean renewalAllowed = account.isRenewalAllowed();
final String 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("locale", localeAsInput);
renewalAllowed = newValue;
}
Boolean preClosureAllowed = account.isPreClosureAllowed();
final String 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("locale", localeAsInput);
preClosureAllowed = newValue;
}
Boolean isInterestWithdrawable = account.isInterestWithdrawable();
final String 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("locale", localeAsInput);
isInterestWithdrawable = newValue;
}
Boolean isInterestCompoundingAllowed = account.isInterestCompoundingAllowed();
final String isInterestCompoundingAllowedParamName = "interestCompoundingAllowed";
if (command.isChangeInBooleanParameterNamed(isInterestCompoundingAllowedParamName, isInterestCompoundingAllowed)) {
final Boolean newValue = command.booleanObjectValueOfParameterNamed(isInterestCompoundingAllowedParamName);
final Boolean newValue = command.booleanObjectValueOfParameterNamed(isInterestCompoundingAllowedParamName);
actualChanges.put(isInterestCompoundingAllowedParamName, newValue);
actualChanges.put("locale", localeAsInput);
isInterestCompoundingAllowed = newValue;
}
Boolean isLockinPeriodAllowed = account.isLockinPeriodAllowed();
final String 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("locale", localeAsInput);
isLockinPeriodAllowed = newValue;
}
Integer lockinPeriod = account.getLockinPeriod();
final String lockinPeriodParamName = "lockinPeriod";
final String lockinPeriodParamName = "lockinPeriod";
if (command.isChangeInIntegerParameterNamed(lockinPeriodParamName, lockinPeriod)) {
final Integer newValue = command.integerValueOfParameterNamed(lockinPeriodParamName);
actualChanges.put(lockinPeriodParamName, newValue);
actualChanges.put("locale", localeAsInput);
lockinPeriod = newValue;
}
PeriodFrequencyType lockinPeriodType = account.getLockinPeriodType();
final String lockinPeriodTypeParamName = "lockinPeriodType";
final String lockinPeriodTypeParamName = "lockinPeriodType";
if (command.isChangeInIntegerParameterNamed(lockinPeriodTypeParamName, lockinPeriodType.getValue())) {
final Integer newValue = command.integerValueOfParameterNamed(lockinPeriodTypeParamName);
actualChanges.put(lockinPeriodTypeParamName, newValue);
actualChanges.put("locale", localeAsInput);
lockinPeriodType = PeriodFrequencyType.fromInt(newValue);
}
account.update(product, externalId, commencementDate, deposit, tenureInMonths, maturityInterestRate, preClosureInterestRate,
interestCompoundedEvery, interestCompoundedEveryPeriodType, renewalAllowed, preClosureAllowed, isInterestWithdrawable,
interestCompoundedEvery, interestCompoundedEveryPeriodType, renewalAllowed, preClosureAllowed, isInterestWithdrawable,
isInterestCompoundingAllowed, this.fixedTermDepositInterestCalculator, isLockinPeriodAllowed, lockinPeriod,
lockinPeriodType);
return actualChanges;
}
public Map<String, Object> updateApprovedDepositAccount(DepositAccount account, JsonCommand command) {
final Map<String, Object> actualChanges = new LinkedHashMap<String, Object>(20);
final String localeAsInput = command.locale();
Boolean renewalAllowed = account.isRenewalAllowed();
public Map<String, Object> updateApprovedDepositAccount(final DepositAccount account, final JsonCommand command) {
final Map<String, Object> actualChanges = new LinkedHashMap<String, Object>(20);
final String localeAsInput = command.locale();
Boolean renewalAllowed = account.isRenewalAllowed();
final String 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("locale", localeAsInput);
renewalAllowed = newValue;
@@ -488,28 +494,28 @@ public class DepositAccountAssembler {
Boolean isInterestWithdrawable = account.isInterestWithdrawable();
final String 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("locale", localeAsInput);
isInterestWithdrawable = newValue;
}
account.update(renewalAllowed, isInterestWithdrawable);
return actualChanges;
}
public void postInterest(DepositAccount account) {
account.postInterestForDepositAccount(account, this.fixedTermDepositInterestCalculator);
public void postInterest(final DepositAccount account) {
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;
@Entity
@Table(name = "m_product_deposit", uniqueConstraints={
@UniqueConstraint(columnNames = {"name"}, name="name_deposit_product"),
@UniqueConstraint(columnNames = {"external_id"}, name="externalid_deposit_product")
})
@Table(name = "m_product_deposit", uniqueConstraints = { @UniqueConstraint(columnNames = { "name" }, name = "name_deposit_product"),
@UniqueConstraint(columnNames = { "external_id" }, name = "externalid_deposit_product") })
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 = "description")
private String description;
@Column(name = "is_deleted", nullable=false)
private boolean deleted = false;
@Column(name = "name", nullable = false)
private String name;
@Column(name = "external_id", length = 100)
private String externalId;
@Column(name = "description")
private String description;
@Column(name = "is_deleted", nullable = false)
private boolean deleted = false;
@Embedded
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;
}
private MonetaryCurrency currency;
public PeriodFrequencyType getInterestCompoundedEveryPeriodType() {
return interestCompoundedEveryPeriodType;
}
@Column(name = "minimum_balance", scale = 6, precision = 19, nullable = false)
private BigDecimal minimumBalance;
public Integer getTenureInMonths() {
return tenureInMonths;
}
public BigDecimal getMaturityDefaultInterestRate() {
return maturityDefaultInterestRate;
}
@Column(name = "maximum_balance", scale = 6, precision = 19, nullable = false)
private BigDecimal maximumBalance;
public BigDecimal getMaturityMinInterestRate() {
return maturityMinInterestRate;
}
@Column(name = "interest_compounded_every", nullable = false)
private Integer interestCompoundedEvery;
public BigDecimal getPreClosureInterestRate() {
return preClosureInterestRate;
}
@Column(name = "interest_compounded_every_period_enum", nullable = false)
private PeriodFrequencyType interestCompoundedEveryPeriodType;
public boolean isRenewalAllowed() {
return this.renewalAllowed;
}
@Column(name = "maturity_default_interest_rate", scale = 6, precision = 19, nullable = false)
private BigDecimal maturityDefaultInterestRate;
public boolean isPreClosureAllowed() {
return this.preClosureAllowed;
}
public boolean isInterestCompoundingAllowed() {
return interestCompoundingAllowed;
}
@Column(name = "maturity_min_interest_rate", scale = 6, precision = 19, nullable = false)
private BigDecimal maturityMinInterestRate;
public boolean isLockinPeriodAllowed() {
return isLockinPeriodAllowed;
}
@Column(name = "maturity_max_interest_rate", scale = 6, precision = 19, nullable = false)
private BigDecimal maturityMaxInterestRate;
public Integer getLockinPeriod() {
return lockinPeriod;
}
@Column(name = "tenure_months", nullable = false)
private Integer tenureInMonths;
public PeriodFrequencyType getLockinPeriodType() {
return lockinPeriodType;
}
@Column(name = "is_renewal_allowed", nullable = false)
private boolean renewalAllowed = false;
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);
@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;
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();
@@ -227,17 +248,17 @@ public class DepositProduct extends AbstractAuditableCustom<AppUser, Long> {
actualChanges.put(descriptionParamName, newValue);
this.description = newValue;
}
final String externalIdParamName = "externalId";
if (command.isChangeInStringParameterNamed(externalIdParamName, this.externalId)) {
final String newValue = command.stringValueOfParameterNamed(externalIdParamName);
actualChanges.put(externalIdParamName, newValue);
this.externalId = newValue;
}
String currencyCode = this.currency.getCode();
Integer digitsAfterDecimal = this.currency.getDigitsAfterDecimal();
final String digitsAfterDecimalParamName = "digitsAfterDecimal";
if (command.isChangeInIntegerParameterNamed(digitsAfterDecimalParamName, digitsAfterDecimal)) {
final Integer newValue = command.integerValueOfParameterNamed(digitsAfterDecimalParamName);
@@ -254,7 +275,7 @@ public class DepositProduct extends AbstractAuditableCustom<AppUser, Long> {
currencyCode = newValue;
this.currency = new MonetaryCurrency(currencyCode, digitsAfterDecimal);
}
final String minimumBalanceParamName = "minimumBalance";
if (command.isChangeInBigDecimalParameterNamed(minimumBalanceParamName, this.minimumBalance)) {
final BigDecimal newValue = command.bigDecimalValueOfParameterNamed(minimumBalanceParamName);
@@ -262,7 +283,7 @@ public class DepositProduct extends AbstractAuditableCustom<AppUser, Long> {
actualChanges.put("locale", localeAsInput);
this.minimumBalance = newValue;
}
final String maximumBalanceParamName = "maximumBalance";
if (command.isChangeInBigDecimalParameterNamed(maximumBalanceParamName, this.maximumBalance)) {
final BigDecimal newValue = command.bigDecimalValueOfParameterNamed(maximumBalanceParamName);
@@ -270,7 +291,7 @@ public class DepositProduct extends AbstractAuditableCustom<AppUser, Long> {
actualChanges.put("locale", localeAsInput);
this.maximumBalance = newValue;
}
final String tenureInMonthsParamName = "tenureInMonths";
if (command.isChangeInIntegerParameterNamed(tenureInMonthsParamName, this.tenureInMonths)) {
final Integer newValue = command.integerValueOfParameterNamed(tenureInMonthsParamName);
@@ -278,7 +299,7 @@ public class DepositProduct extends AbstractAuditableCustom<AppUser, Long> {
actualChanges.put("locale", localeAsInput);
this.tenureInMonths = newValue;
}
final String defaultInterestRateParamName = "maturityDefaultInterestRate";
if (command.isChangeInBigDecimalParameterNamed(defaultInterestRateParamName, this.maturityDefaultInterestRate)) {
final BigDecimal newValue = command.bigDecimalValueOfParameterNamed(defaultInterestRateParamName);
@@ -286,7 +307,7 @@ public class DepositProduct extends AbstractAuditableCustom<AppUser, Long> {
actualChanges.put("locale", localeAsInput);
this.maturityDefaultInterestRate = newValue;
}
final String minInterestRateParamName = "maturityMinInterestRate";
if (command.isChangeInBigDecimalParameterNamed(minInterestRateParamName, this.maturityMinInterestRate)) {
final BigDecimal newValue = command.bigDecimalValueOfParameterNamed(minInterestRateParamName);
@@ -294,7 +315,7 @@ public class DepositProduct extends AbstractAuditableCustom<AppUser, Long> {
actualChanges.put("locale", localeAsInput);
this.maturityMinInterestRate = newValue;
}
final String maxInterestRateParamName = "maturityMaxInterestRate";
if (command.isChangeInBigDecimalParameterNamed(maxInterestRateParamName, this.maturityMaxInterestRate)) {
final BigDecimal newValue = command.bigDecimalValueOfParameterNamed(maxInterestRateParamName);
@@ -302,7 +323,7 @@ public class DepositProduct extends AbstractAuditableCustom<AppUser, Long> {
actualChanges.put("locale", localeAsInput);
this.maturityMaxInterestRate = newValue;
}
final String interestCompoundedEveryParamName = "interestCompoundedEvery";
if (command.isChangeInIntegerParameterNamed(interestCompoundedEveryParamName, this.interestCompoundedEvery)) {
final Integer newValue = command.integerValueOfParameterNamed(interestCompoundedEveryParamName);
@@ -310,31 +331,32 @@ public class DepositProduct extends AbstractAuditableCustom<AppUser, Long> {
actualChanges.put("locale", localeAsInput);
this.interestCompoundedEvery = newValue;
}
final String interestCompoundedEveryPeriodTypeParamName = "interestCompoundedEveryPeriodType";
if (command.isChangeInIntegerParameterNamed(interestCompoundedEveryPeriodTypeParamName, this.interestCompoundedEveryPeriodType.getValue())) {
if (command.isChangeInIntegerParameterNamed(interestCompoundedEveryPeriodTypeParamName,
this.interestCompoundedEveryPeriodType.getValue())) {
final Integer newValue = command.integerValueOfParameterNamed(interestCompoundedEveryPeriodTypeParamName);
actualChanges.put(interestCompoundedEveryPeriodTypeParamName, newValue);
actualChanges.put("locale", localeAsInput);
this.interestCompoundedEveryPeriodType = PeriodFrequencyType.fromInt(newValue);
}
final String renewalAllowedParamName = "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("locale", localeAsInput);
this.renewalAllowed = newValue;
}
final String preClosureAllowedParamName = "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("locale", localeAsInput);
this.preClosureAllowed = newValue;
}
final String preClosureInterestRateParamName = "preClosureInterestRate";
if (command.isChangeInBigDecimalParameterNamed(preClosureInterestRateParamName, this.preClosureInterestRate)) {
final BigDecimal newValue = command.bigDecimalValueOfParameterNamed(preClosureInterestRateParamName);
@@ -343,106 +365,74 @@ public class DepositProduct extends AbstractAuditableCustom<AppUser, Long> {
this.preClosureInterestRate = newValue;
}
final String interestCompoundingAllowedParamName = "interestCompoundingAllowed";
final String interestCompoundingAllowedParamName = "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("locale", localeAsInput);
this.interestCompoundingAllowed = newValue;
}
final String isLockinPeriodAllowedParamName = "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("locale", localeAsInput);
this.isLockinPeriodAllowed = newValue;
}
final String lockinPeriodParamName = "lockinPeriod";
final String lockinPeriodParamName = "lockinPeriod";
if (command.isChangeInIntegerParameterNamed(lockinPeriodParamName, this.lockinPeriod)) {
final Integer newValue = command.integerValueOfParameterNamed(lockinPeriodParamName);
actualChanges.put(lockinPeriodParamName, newValue);
actualChanges.put("locale", localeAsInput);
this.lockinPeriod = newValue;
}
final String lockinPeriodTypeParamName = "lockinPeriodType";
final String lockinPeriodTypeParamName = "lockinPeriodType";
if (command.isChangeInIntegerParameterNamed(lockinPeriodTypeParamName, this.lockinPeriodType.getValue())) {
final Integer newValue = command.integerValueOfParameterNamed(lockinPeriodTypeParamName);
actualChanges.put(lockinPeriodTypeParamName, newValue);
actualChanges.put("locale", localeAsInput);
this.lockinPeriodType = PeriodFrequencyType.fromInt(newValue);
}
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) {
boolean inRange = true;
if (depositAmount.compareTo(this.minimumBalance) < 0) {
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 void validateInterestRateInRange(final BigDecimal interestRate) {
boolean inRange = true;
if (interestRate.compareTo(this.maturityMinInterestRate) < 0) {
inRange = false;
}
public static DepositProduct assembleFromJson(JsonCommand command, PeriodFrequencyType interestCompoundingPeriodType,
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);
}
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) {
boolean inRange = true;
if (depositAmount.compareTo(this.minimumBalance) < 0) {
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");
}
}
}
@@ -12,7 +12,8 @@ import org.mifosplatform.infrastructure.core.exception.AbstractPlatformDomainRul
*/
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 + ", "
+ rangeMax + "].", actualValue, rangeMin, rangeMax);
}
@@ -9,17 +9,16 @@ import org.springframework.stereotype.Service;
@Service
public class CreateDepositProductCommandHandler implements NewCommandSourceHandler {
private final DepositProductWritePlatformService depositProductWritePlatformService;
@Autowired
public CreateDepositProductCommandHandler(final DepositProductWritePlatformService depositProductWritePlatformService) {
this.depositProductWritePlatformService = depositProductWritePlatformService;
}
@Override
public CommandProcessingResult processCommand(JsonCommand command) {
return this.depositProductWritePlatformService.createDepositProduct(command);
}
private final DepositProductWritePlatformService depositProductWritePlatformService;
}
@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);
@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')")
CommandProcessingResult deleteDepositProduct(Long productId);
}
@@ -49,77 +49,77 @@ public class DepositProductWritePlatformServiceJpaRepositoryImpl implements Depo
private void handleDataIntegrityIssues(final JsonCommand command, final DataIntegrityViolationException dve) {
Throwable realCause = dve.getMostSpecificCause();
if (realCause.getMessage().contains("name_deposit_product")) {
final String name = command.stringValueOfParameterNamed("name");
throw new PlatformDataIntegrityException(
"error.msg.desposit.product.duplicate.name", "Deposit product with name: " + name + " already exists", "name",
name); }
if (realCause.getMessage().contains("name_deposit_product")) {
final String name = command.stringValueOfParameterNamed("name");
throw new PlatformDataIntegrityException("error.msg.desposit.product.duplicate.name", "Deposit product with name: " + name
+ " already exists", "name", name);
}
if (realCause.getMessage().contains("externalid_deposit_product")) {
final String externalId = command.stringValueOfParameterNamed("externalId");
throw new PlatformDataIntegrityException(
"error.msg.desposit.product.duplicate.externalId", "Deposit product with externalId " + externalId
+ " already exists", "externalId", externalId); }
final String externalId = command.stringValueOfParameterNamed("externalId");
throw new PlatformDataIntegrityException("error.msg.desposit.product.duplicate.externalId", "Deposit product with externalId "
+ externalId + " already exists", "externalId", externalId);
}
logger.error(dve.getMessage(), dve);
throw new PlatformDataIntegrityException("error.msg.deposit.product.unknown.data.integrity.issue",
"Unknown data integrity issue with resource.");
}
@Transactional
@Transactional
@Override
public CommandProcessingResult createDepositProduct(JsonCommand command) {
try {
this.context.authenticatedUser();
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));
}
}
public CommandProcessingResult createDepositProduct(final JsonCommand command) {
try {
this.context.authenticatedUser();
this.fromApiJsonDeserializer.validateForCreate(command.json());
@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);
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
@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); }
final Map<String, Object> changes = product.update(command);
if (!changes.isEmpty()) {
final Map<String, Object> changes = product.update(command);
if (!changes.isEmpty()) {
this.depositProductRepository.saveAndFlush(product);
}
return new CommandProcessingResultBuilder() //
.withCommandId(command.commandId()) //
.withEntityId(productId) //
.with(changes) //
.build();
} catch (DataIntegrityViolationException dve) {
handleDataIntegrityIssues(command, dve);
return new CommandProcessingResult(Long.valueOf(-1));
}
}
return new CommandProcessingResultBuilder() //
.withCommandId(command.commandId()) //
.withEntityId(productId) //
.with(changes) //
.build();
} catch (DataIntegrityViolationException dve) {
handleDataIntegrityIssues(command, dve);
return new CommandProcessingResult(Long.valueOf(-1));
}
}
@Transactional
@Override
@@ -136,5 +136,4 @@ public class DepositProductWritePlatformServiceJpaRepositoryImpl implements Depo
.withEntityId(product.getId()) //
.build();
}
}