remove warnings for unused code, formating in savings area.

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