formatting changes for savings related code.

This commit is contained in:
Keith Woodlock
2012-12-04 15:29:11 +00:00
parent d1a1ed60ab
commit 37ae6dae9e
66 changed files with 4414 additions and 4441 deletions
@@ -1,4 +1,4 @@
DROP TABLE IF EXISTS `m_saving_schedule`
DROP TABLE IF EXISTS `m_saving_schedule`;
CREATE TABLE `m_saving_schedule` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`saving_account_id` bigint(20) NOT NULL,
@@ -60,23 +60,25 @@ public class SavingsAccountApiResource {
@Autowired
private CalculateSavingSchedule calculateSavingSchedule;
private static final Set<String> typicalResponseParameters = new HashSet<String>(
Arrays.asList("id", "status", "externalId", "clientId", "clientName", "productId", "productName", "productType", "currencyData", "savingsDepostiAmountPerPeriod", "savingsFrequencyType",
"totalDepositAmount", "reccuringInterestRate", "savingInterestRate", "interestType", "interestCalculationMethod", "tenure", "tenureType", "projectedCommencementDate",
"actualCommencementDate", "maturesOnDate", "projectedInterestAccuredOnMaturity", "actualInterestAccured", "projectedMaturityAmount", "actualMaturityAmount", "preClosureAllowed",
"preClosureInterestRate", "withdrawnonDate", "rejectedonDate", "closedonDate", "isLockinPeriodAllowed", "lockinPeriod", "lockinPeriodType"));
private static final Set<String> typicalResponseParameters = new HashSet<String>(Arrays.asList("id", "status", "externalId",
"clientId", "clientName", "productId", "productName", "productType", "currencyData", "savingsDepostiAmountPerPeriod",
"savingsFrequencyType", "totalDepositAmount", "reccuringInterestRate", "savingInterestRate", "interestType",
"interestCalculationMethod", "tenure", "tenureType", "projectedCommencementDate", "actualCommencementDate", "maturesOnDate",
"projectedInterestAccuredOnMaturity", "actualInterestAccured", "projectedMaturityAmount", "actualMaturityAmount",
"preClosureAllowed", "preClosureInterestRate", "withdrawnonDate", "rejectedonDate", "closedonDate", "isLockinPeriodAllowed",
"lockinPeriod", "lockinPeriodType"));
@POST
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
public String createSavingAccount(@QueryParam("command") final String commandParam,
@Context final UriInfo uriInfo,final String jsonRequestBody){
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public String createSavingAccount(@QueryParam("command") final String commandParam, @Context final UriInfo uriInfo,
final String jsonRequestBody) {
final SavingAccountCommand command = this.apiDataConversionService.convertJsonToSavingAccountCommand(null, jsonRequestBody);
if (is(commandParam, "calculateSavingSchedule")) {
CalculateSavingScheduleCommand calculateSavingScheduleCommand = command.toCalculateSavingScheduleCommand();
return calculateSavingSchedule(uriInfo,calculateSavingScheduleCommand);
return calculateSavingSchedule(uriInfo, calculateSavingScheduleCommand);
}
EntityIdentifier entityIdentifier = this.savingAccountWritePlatformService.createSavingAccount(command);
@@ -95,9 +97,9 @@ public class SavingsAccountApiResource {
@PUT
@Path("{accountId}")
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
public Response updateSavingAccount(@PathParam("accountId") final Long accountId,final String jsonRequestBody){
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public Response updateSavingAccount(@PathParam("accountId") final Long accountId, final String jsonRequestBody) {
final SavingAccountCommand command = this.apiDataConversionService.convertJsonToSavingAccountCommand(accountId, jsonRequestBody);
@@ -107,8 +109,8 @@ public class SavingsAccountApiResource {
}
@GET
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public String retrieveAllDepositAccounts(@Context final UriInfo uriInfo) {
context.authenticatedUser().validateHasReadPermission(entityType);
@@ -126,8 +128,8 @@ public class SavingsAccountApiResource {
@GET
@Path("{accountId}")
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public String retrieveDepositAccount(@PathParam("accountId") final Long accountId, @Context final UriInfo uriInfo) {
context.authenticatedUser().validateHasReadPermission(entityType);
@@ -147,12 +149,10 @@ public class SavingsAccountApiResource {
@SuppressWarnings("unused")
@GET
@Path("template")
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
public String retrieveNewDepositAccountDetails(
@QueryParam("clientId") final Long clientId,
@QueryParam("productId") final Long productId,
@Context final UriInfo uriInfo) {
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public String retrieveNewDepositAccountDetails(@QueryParam("clientId") final Long clientId,
@QueryParam("productId") final Long productId, @Context final UriInfo uriInfo) {
context.authenticatedUser().validateHasReadPermission(entityType);
@@ -163,7 +163,8 @@ public class SavingsAccountApiResource {
boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters());
SavingAccountData account = null;
// this.savingAccountReadPlatformService.retrieveNewSavingsAccountDetails(clientId, productId);
// this.savingAccountReadPlatformService.retrieveNewSavingsAccountDetails(clientId,
// productId);
return this.apiJsonSerializerService.serializeSavingAccountsDataToJson(prettyPrint, responseParameters, account);
}
@@ -14,20 +14,16 @@ public class CalculateSavingScheduleCommand {
private final LocalDate paymentsStartingFromDate;
private final Integer tenure;
public CalculateSavingScheduleCommand(final Long productId,
final BigDecimal deposit,
final Integer payEvery,
final Integer paymentFrequencyType,
final BigDecimal interestRate,
final LocalDate paymentsStartingFromDate,
public CalculateSavingScheduleCommand(final Long productId, final BigDecimal deposit, final Integer payEvery,
final Integer paymentFrequencyType, final BigDecimal interestRate, final LocalDate paymentsStartingFromDate,
final Integer tenure) {
this.productId = productId;
this.deposit = deposit;
this.payEvery = payEvery;
this.paymentFrequencyType=paymentFrequencyType;
this.interestRate= interestRate;
this.paymentsStartingFromDate=paymentsStartingFromDate;
this.paymentFrequencyType = paymentFrequencyType;
this.interestRate = interestRate;
this.paymentsStartingFromDate = paymentsStartingFromDate;
this.tenure = tenure;
}
@@ -7,7 +7,6 @@ import org.joda.time.LocalDate;
public class SavingAccountCommand {
private final Long id;
private final Long clientId;
private final Long productId;
@@ -37,18 +36,13 @@ public class SavingAccountCommand {
private final Set<String> modifiedParameters;
public SavingAccountCommand(final Set<String> modifiedParameters,
final Long id,
final Long clientId,
final Long productId,
final String externalId,final String currencyCode, final Integer digitsAfterDecimal,
final BigDecimal savingsDepositAmount,
final BigDecimal recurringInterestRate, final BigDecimal savingInterestRate,
final Integer tenure, final LocalDate commencementDate,
final Integer savingProductType, final Integer tenureType, final Integer frequency, final Integer interestType,
final BigDecimal minimumBalanceForWithdrawal, final Integer interestCalculationMethod,
final boolean isLockinPeriodAllowed, final boolean isPartialDepositAllowed, final Integer lockInPeriod, final Integer lockinPeriodType,
final Integer payEvery) {
public SavingAccountCommand(final Set<String> modifiedParameters, final Long id, final Long clientId, final Long productId,
final String externalId, final String currencyCode, final Integer digitsAfterDecimal, final BigDecimal savingsDepositAmount,
final BigDecimal recurringInterestRate, final BigDecimal savingInterestRate, final Integer tenure,
final LocalDate commencementDate, final Integer savingProductType, final Integer tenureType, final Integer frequency,
final Integer interestType, final BigDecimal minimumBalanceForWithdrawal, final Integer interestCalculationMethod,
final boolean isLockinPeriodAllowed, final boolean isPartialDepositAllowed, final Integer lockInPeriod,
final Integer lockinPeriodType, final Integer payEvery) {
this.id = id;
this.clientId = clientId;
this.productId = productId;
@@ -64,18 +58,17 @@ public class SavingAccountCommand {
this.modifiedParameters = modifiedParameters;
this.commencementDate = commencementDate;
this.savingProductType=savingProductType;
this.tenureType=tenureType;
this.frequency=frequency;
this.interestType=interestType;
this.isPartialDepositAllowed=isPartialDepositAllowed;
this.savingProductType = savingProductType;
this.tenureType = tenureType;
this.frequency = frequency;
this.interestType = interestType;
this.isPartialDepositAllowed = isPartialDepositAllowed;
this.isLockinPeriodAllowed = isLockinPeriodAllowed;
this.lockinPeriod = lockInPeriod;
this.lockinPeriodType = lockinPeriodType;
this.minimumBalanceForWithdrawal=minimumBalanceForWithdrawal;
this.interestCalculationMethod=interestCalculationMethod;
this.minimumBalanceForWithdrawal = minimumBalanceForWithdrawal;
this.interestCalculationMethod = interestCalculationMethod;
this.payEvery = payEvery;
}
@@ -171,15 +164,15 @@ public class SavingAccountCommand {
return this.modifiedParameters.isEmpty();
}
public boolean isProductIdChanged(){
public boolean isProductIdChanged() {
return this.modifiedParameters.contains("productId");
}
public boolean isExternalIdChanged(){
public boolean isExternalIdChanged() {
return this.modifiedParameters.contains("externalId");
}
public boolean isDepositAmountChanged(){
public boolean isDepositAmountChanged() {
return this.modifiedParameters.contains("deposit");
}
@@ -191,7 +184,7 @@ public class SavingAccountCommand {
return this.modifiedParameters.contains("lockinPeriod");
}
public boolean isPreClosureInterestRateChanged(){
public boolean isPreClosureInterestRateChanged() {
return this.modifiedParameters.contains("preClosureInterestRate");
}
@@ -239,12 +232,13 @@ public class SavingAccountCommand {
return this.modifiedParameters.contains("isPartialDepositAllowed");
}
public boolean isPayEveryChanged(){
public boolean isPayEveryChanged() {
return this.modifiedParameters.contains("payEvery");
}
public CalculateSavingScheduleCommand toCalculateSavingScheduleCommand() {
return new CalculateSavingScheduleCommand(productId, savingsDepositAmount, payEvery, frequency, recurringInterestRate, commencementDate,tenure);
return new CalculateSavingScheduleCommand(productId, savingsDepositAmount, payEvery, frequency, recurringInterestRate,
commencementDate, tenure);
}
}
@@ -14,8 +14,8 @@ public class SavingScheduleData {
public SavingScheduleData(final CurrencyData currency, final BigDecimal cumulativeDepositDue,
final Collection<SavingSchedulePeriodData> periods) {
this.currency = currency;
this.cumulativeDepositDue= cumulativeDepositDue;
this.periods= periods;
this.cumulativeDepositDue = cumulativeDepositDue;
this.periods = periods;
}
@@ -14,11 +14,12 @@ public class SavingSchedulePeriodData {
public SavingSchedulePeriodData(final Integer period, final LocalDate dueDate, final BigDecimal depositDue, final BigDecimal depositPaid) {
this.period = period;
this.dueDate = dueDate;
this.depositDue= depositDue;
this.depositPaid= depositPaid;
this.depositDue = depositDue;
this.depositPaid = depositPaid;
}
public static SavingSchedulePeriodData addScheduleInformation(int periodNumber, LocalDate scheduleDate, BigDecimal depositAmountPerPeriod){
public static SavingSchedulePeriodData addScheduleInformation(int periodNumber, LocalDate scheduleDate,
BigDecimal depositAmountPerPeriod) {
return new SavingSchedulePeriodData(periodNumber, scheduleDate, depositAmountPerPeriod, BigDecimal.ZERO);
}
@@ -8,5 +8,4 @@ import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType;
public interface DepositScheduleDateGenerator {
List<LocalDate> generate(LocalDate startDate, Integer paymentPeriods, Integer depositFrequency, PeriodFrequencyType depositFrequencyType);
}
@@ -37,7 +37,7 @@ import org.mifosplatform.portfolio.savingsdepositproduct.domain.TenureTypeEnum;
import org.mifosplatform.useradministration.domain.AppUser;
@Entity
@Table(name = "m_saving_account", uniqueConstraints = @UniqueConstraint(name="saving_acc_external_id", columnNames = { "external_id" }))
@Table(name = "m_saving_account", uniqueConstraints = @UniqueConstraint(name = "saving_acc_external_id", columnNames = { "external_id" }))
public class SavingAccount extends AbstractAuditableCustom<AppUser, Long> {
@ManyToOne
@@ -48,8 +48,9 @@ public class SavingAccount extends AbstractAuditableCustom<AppUser, Long> {
@JoinColumn(name = "product_id")
private SavingProduct product;
// FIXME - MADHUKAR - Do not use the actual enum type here but instead use Integer e.g. private Integer savingProductType;
@Column(name = "savings_product_type", nullable=false)
// FIXME - MADHUKAR - Do not use the actual enum type here but instead use
// Integer e.g. private Integer savingProductType;
@Column(name = "savings_product_type", nullable = false)
private SavingProductType savingProductType;
@Column(name = "external_id")
@@ -72,21 +73,24 @@ public class SavingAccount extends AbstractAuditableCustom<AppUser, Long> {
@Column(name = "regular_saving_nominal_interest_rate", scale = 6, precision = 19, nullable = false)
private BigDecimal savingInterestRate;
@Column(name = "tenure", nullable=false)
@Column(name = "tenure", nullable = false)
private Integer tenure;
@Column(name = "tenure_type", nullable=false)
@Column(name = "tenure_type", nullable = false)
private TenureTypeEnum tenureType;
// FIXME - MADHUKAR - Do not use the actual enum type here but instead use Integer e.g. private Integer savingProductType;
@Column(name = "frequency", nullable=false)
// FIXME - MADHUKAR - Do not use the actual enum type here but instead use
// Integer e.g. private Integer savingProductType;
@Column(name = "frequency", nullable = false)
private SavingFrequencyType frequency;
// FIXME - MADHUKAR - Do not use the actual enum type here but instead use Integer e.g. private Integer savingProductType;
@Column(name = "interest_type", nullable=false)
// FIXME - MADHUKAR - Do not use the actual enum type here but instead use
// Integer e.g. private Integer savingProductType;
@Column(name = "interest_type", nullable = false)
private SavingsInterestType interestType;
// FIXME - MADHUKAR - Do not use the actual enum type here but instead use Integer e.g. private Integer savingProductType;
// FIXME - MADHUKAR - Do not use the actual enum type here but instead use
// Integer e.g. private Integer savingProductType;
@Column(name = "interest_calculation_method")
private SavingInterestCalculationMethod interestCalculationMethod;
@@ -126,7 +130,7 @@ public class SavingAccount extends AbstractAuditableCustom<AppUser, Long> {
@Column(name = "is_preclosure_allowed", nullable = false)
private boolean preClosureAllowed = false;
@Column(name = "is_deleted", nullable=false)
@Column(name = "is_deleted", nullable = false)
private boolean deleted = false;
@Column(name = "status_enum", nullable = false)
@@ -146,13 +150,13 @@ public class SavingAccount extends AbstractAuditableCustom<AppUser, Long> {
@Column(name = "withdrawnon_date")
private Date withdrawnOnDate;
@Column(name = "is_lock_in_period_allowed", nullable=false)
@Column(name = "is_lock_in_period_allowed", nullable = false)
private boolean isLockinPeriodAllowed = false;
@Column(name = "lock_in_period", nullable=false)
@Column(name = "lock_in_period", nullable = false)
private Integer lockinPeriod;
@Column(name = "lock_in_period_type", nullable=false)
@Column(name = "lock_in_period_type", nullable = false)
private PeriodFrequencyType lockinPeriodType;
// see
@@ -161,34 +165,20 @@ public class SavingAccount extends AbstractAuditableCustom<AppUser, Long> {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "savingAccount", orphanRemoval = true)
private final List<SavingScheduleInstallments> savingScheduleInstallments = new ArrayList<SavingScheduleInstallments>();
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) {
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) {
Money futureValueOnMaturity = null;
if(savingProductType.isReccuring()){
futureValueOnMaturity = reccuringDepositInterestCalculator.calculateInterestOnMaturityFor(savingsDeposit, tenure, reccuringInterestRate,
commencementDate, tenureTypeEnum, savingFrequencyType, savingInterestCalculationMethod);
} else if(savingProductType.isRegular()){
futureValueOnMaturity = reccuringDepositInterestCalculator.calculateInterestOnMaturityFor(savingsDeposit, tenure, savingInterestRate,
commencementDate, tenureTypeEnum, savingFrequencyType, savingInterestCalculationMethod);
if (savingProductType.isReccuring()) {
futureValueOnMaturity = reccuringDepositInterestCalculator.calculateInterestOnMaturityFor(savingsDeposit, tenure,
reccuringInterestRate, commencementDate, tenureTypeEnum, savingFrequencyType, savingInterestCalculationMethod);
} else if (savingProductType.isRegular()) {
futureValueOnMaturity = reccuringDepositInterestCalculator.calculateInterestOnMaturityFor(savingsDeposit, tenure,
savingInterestRate, commencementDate, tenureTypeEnum, savingFrequencyType, savingInterestCalculationMethod);
}
return new SavingAccount(client, externalId, product, savingsDeposit, reccuringInterestRate, savingInterestRate, tenure,
@@ -196,17 +186,11 @@ public class SavingAccount extends AbstractAuditableCustom<AppUser, Long> {
isLockinPeriodAllowed, lockinPeriod, lockinPeriodType, futureValueOnMaturity, lifecycleStateMachine);
}
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) {
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) {
DepositAccountStatus from = null;
if (accountStatus != null) {
@@ -216,8 +200,8 @@ public class SavingAccount extends AbstractAuditableCustom<AppUser, Long> {
DepositAccountStatus statusEnum = lifecycleStateMachine.transition(DepositAccountEvent.DEPOSIT_CREATED, from);
accountStatus = statusEnum.getValue();
this.total=BigDecimal.ZERO;
this.preClosureInterestRate=BigDecimal.ZERO;
this.total = BigDecimal.ZERO;
this.preClosureInterestRate = BigDecimal.ZERO;
this.totalSavingsAmount = BigDecimal.ZERO;
this.interestAccrued = BigDecimal.ZERO;
@@ -228,57 +212,46 @@ public class SavingAccount extends AbstractAuditableCustom<AppUser, Long> {
this.currency = savingsDeposit.getCurrency();
this.reccuringInterestRate = reccuringInterestRate;
this.savingInterestRate = savingInterestRate;
this.tenure =tenure;
this.projectedCommencementDate=commencementDate.toDate();
this.tenure = tenure;
this.projectedCommencementDate = commencementDate.toDate();
this.tenureType = tenureTypeEnum;
this.savingProductType = savingProductType;
this.frequency = savingFrequencyType;
this.interestType = interestType;
this.interestCalculationMethod= savingInterestCalculationMethod;
this.interestCalculationMethod = savingInterestCalculationMethod;
this.isLockinPeriodAllowed = isLockinPeriodAllowed;
this.lockinPeriod = lockinPeriod;
this.lockinPeriodType = lockinPeriodType;
this.projectedTotalOnMaturity = futureValueOnMaturity.getAmount();
this.projectedInterestAccruedOnMaturity =futureValueOnMaturity.getAmount().subtract(BigDecimal.valueOf(savingsDeposit.getAmount().doubleValue()*tenure.doubleValue()));
this.projectedInterestAccruedOnMaturity = futureValueOnMaturity.getAmount().subtract(
BigDecimal.valueOf(savingsDeposit.getAmount().doubleValue() * tenure.doubleValue()));
}
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) {
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) {
Money futureValueOnMaturity = null;
if(savingProductType.isReccuring()){
futureValueOnMaturity = reccuringDepositInterestCalculator.calculateInterestOnMaturityFor(savingsDeposit, tenure, reccuringInterestRate,
commencementDate, tenureTypeEnum, savingFrequencyType, savingInterestCalculationMethod);
} else if(savingProductType.isRegular()){
futureValueOnMaturity = reccuringDepositInterestCalculator.calculateInterestOnMaturityFor(savingsDeposit, tenure, savingInterestRate,
commencementDate, tenureTypeEnum, savingFrequencyType, savingInterestCalculationMethod);
if (savingProductType.isReccuring()) {
futureValueOnMaturity = reccuringDepositInterestCalculator.calculateInterestOnMaturityFor(savingsDeposit, tenure,
reccuringInterestRate, commencementDate, tenureTypeEnum, savingFrequencyType, savingInterestCalculationMethod);
} else if (savingProductType.isRegular()) {
futureValueOnMaturity = reccuringDepositInterestCalculator.calculateInterestOnMaturityFor(savingsDeposit, tenure,
savingInterestRate, commencementDate, tenureTypeEnum, savingFrequencyType, savingInterestCalculationMethod);
}
this.product = product;
this.externalId=externalId;
this.savingsDepositAmountPerPeriod=savingsDeposit.getAmount();
this.reccuringInterestRate=reccuringInterestRate;
this.externalId = externalId;
this.savingsDepositAmountPerPeriod = savingsDeposit.getAmount();
this.reccuringInterestRate = reccuringInterestRate;
this.savingInterestRate = savingInterestRate;
this.tenure = tenure;
this.projectedCommencementDate = commencementDate.toDate();
this.tenureType = tenureTypeEnum;
this.savingProductType = savingProductType;
this.frequency =savingFrequencyType;
this.frequency = savingFrequencyType;
this.interestCalculationMethod = savingInterestCalculationMethod;
this.isLockinPeriodAllowed = isLockinPeriodAllowed;
this.lockinPeriod = lockinPeriod;
@@ -286,7 +259,8 @@ public class SavingAccount extends AbstractAuditableCustom<AppUser, Long> {
// FIXME - MADHUKAR - futureValueOnMaturity is possibly null
this.projectedTotalOnMaturity = futureValueOnMaturity.getAmount();
this.projectedInterestAccruedOnMaturity =futureValueOnMaturity.getAmount().subtract(BigDecimal.valueOf(savingsDeposit.getAmount().doubleValue()*tenure.doubleValue()));
this.projectedInterestAccruedOnMaturity = futureValueOnMaturity.getAmount().subtract(
BigDecimal.valueOf(savingsDeposit.getAmount().doubleValue() * tenure.doubleValue()));
}
public boolean isDeleted() {
@@ -3,8 +3,6 @@ package org.mifosplatform.portfolio.savingsaccount.domain;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
public interface SavingAccountRepository extends
JpaRepository<SavingAccount, Long>,
JpaSpecificationExecutor<SavingAccount>{
public interface SavingAccountRepository extends JpaRepository<SavingAccount, Long>, JpaSpecificationExecutor<SavingAccount> {
}
@@ -15,35 +15,34 @@ import org.mifosplatform.infrastructure.core.domain.AbstractAuditableCustom;
import org.mifosplatform.useradministration.domain.AppUser;
@Entity
@Table(name="m_saving_schedule")
@Table(name = "m_saving_schedule")
public class SavingScheduleInstallments extends AbstractAuditableCustom<AppUser, Long> {
@ManyToOne(optional = false)
@JoinColumn(name = "saving_account_id", nullable=false)
@JoinColumn(name = "saving_account_id", nullable = false)
private SavingAccount savingAccount;
@Temporal(TemporalType.DATE)
@Column(name = "duedate", nullable=false)
@Column(name = "duedate", nullable = false)
private final Date dueDate;
@Column(name = "installment", nullable=false)
@Column(name = "installment", nullable = false)
private final Integer installmentNumber;
@Column(name = "deposit", scale=6, precision=19, nullable=false)
@Column(name = "deposit", scale = 6, precision = 19, nullable = false)
private BigDecimal deposit;
@Temporal(TemporalType.DATE)
@Column(name = "payment_date", nullable=true)
@Column(name = "payment_date", nullable = true)
private final Date paymentDate;
@Column(name = "deposit_paid", scale=6, precision=19, nullable=true)
@Column(name = "deposit_paid", scale = 6, precision = 19, nullable = true)
private BigDecimal depositPaid;
@Column(name="completed_derived", nullable=false)
@Column(name = "completed_derived", nullable = false)
private boolean completed;
public SavingScheduleInstallments(SavingAccount account, Date dueDate,
Integer installmentNumber, BigDecimal deposit) {
public SavingScheduleInstallments(SavingAccount account, Date dueDate, Integer installmentNumber, BigDecimal deposit) {
this.savingAccount = account;
this.dueDate = dueDate;
this.installmentNumber = installmentNumber;
@@ -53,7 +52,7 @@ public class SavingScheduleInstallments extends AbstractAuditableCustom<AppUser,
this.completed = false;
}
public void updateAccount(SavingAccount account){
public void updateAccount(SavingAccount account) {
this.savingAccount = account;
}
@@ -7,5 +7,4 @@ public class SavingAccountNotFoundException extends AbstractPlatformResourceNotF
public SavingAccountNotFoundException(final Long id) {
super("error.msg.saving.account.id.invalid", "Saving account with identifier " + id + " does not exist", id);
}
}
@@ -6,5 +6,4 @@ import org.mifosplatform.portfolio.savingsaccount.data.SavingScheduleData;
public interface CalculateSavingSchedule {
SavingScheduleData calculateSavingSchedule(CalculateSavingScheduleCommand command);
}
@@ -24,9 +24,7 @@ public class CalculateSavingScheduleImpl implements CalculateSavingSchedule {
private final ApplicationCurrencyRepository applicationCurrencyRepository;
@Autowired
public CalculateSavingScheduleImpl(
final PlatformSecurityContext context,
final SavingProductRepository savingProductRepository,
public CalculateSavingScheduleImpl(final PlatformSecurityContext context, final SavingProductRepository savingProductRepository,
final ApplicationCurrencyRepository applicationCurrencyRepository) {
this.context = context;
this.savingProductRepository = savingProductRepository;
@@ -41,8 +39,7 @@ public class CalculateSavingScheduleImpl implements CalculateSavingSchedule {
// FIXME Validations should write here
final SavingProduct savingProduct = this.savingProductRepository.findOne(command.getProductId());
if (savingProduct == null)
throw new SavingProductNotFoundException(command.getProductId());
if (savingProduct == null) throw new SavingProductNotFoundException(command.getProductId());
final Integer depositFrequency = command.getPayEvery();
final PeriodFrequencyType depositFrequencyType = PeriodFrequencyType.fromInt(command.getPaymentFrequencyType());
@@ -51,10 +48,11 @@ public class CalculateSavingScheduleImpl implements CalculateSavingSchedule {
final BigDecimal interestRate = command.getInterestRate();
final BigDecimal depositAmountPerPeriod = command.getDeposit();
final Integer tenure = command.getTenure();
final ApplicationCurrency applicationCurrency = this.applicationCurrencyRepository.findOneByCode(savingProduct.getCurrency().getCode());
final ApplicationCurrency applicationCurrency = this.applicationCurrencyRepository.findOneByCode(savingProduct.getCurrency()
.getCode());
SavingScheduleData savingScheduleData = savingScheduleGenerator.generate(scheduleStartDate,depositAmountPerPeriod,
depositFrequency,depositFrequencyType,savingProduct,tenure,applicationCurrency);
SavingScheduleData savingScheduleData = savingScheduleGenerator.generate(scheduleStartDate, depositAmountPerPeriod,
depositFrequency, depositFrequencyType, savingProduct, tenure, applicationCurrency);
return savingScheduleData;
}
@@ -10,12 +10,13 @@ import org.mifosplatform.portfolio.savingsaccount.domain.DepositScheduleDateGene
public class DefaultDepositScheduleDateGenerator implements DepositScheduleDateGenerator {
@Override
public List<LocalDate> generate(LocalDate scheuleStartDate, Integer paymentPeriods, Integer depositFrequency, PeriodFrequencyType depositFrequencyType) {
public List<LocalDate> generate(LocalDate scheuleStartDate, Integer paymentPeriods, Integer depositFrequency,
PeriodFrequencyType depositFrequencyType) {
List<LocalDate> duePaymentPeriodDates = new ArrayList<LocalDate>(depositFrequency);
LocalDate startDate = scheuleStartDate;
for (int period=1; period <= paymentPeriods; period++){
for (int period = 1; period <= paymentPeriods; period++) {
LocalDate duePaymentPeriodDate = startDate;
if (period == 1) {
@@ -40,45 +40,43 @@ public class SavingAccountAssembler {
private final CalculateSavingSchedule calculateSavingSchedule;
@Autowired
public SavingAccountAssembler(final ClientRepository clientRepository,final SavingProductRepository savingProductRepository,
final ReccuringDepositInterestCalculator reccuringDepositInterestCalculator,final CalculateSavingSchedule calculateSavingSchedule) {
this.clientRepository=clientRepository;
this.savingProductRepository=savingProductRepository;
this.reccuringDepositInterestCalculator=reccuringDepositInterestCalculator;
public SavingAccountAssembler(final ClientRepository clientRepository, final SavingProductRepository savingProductRepository,
final ReccuringDepositInterestCalculator reccuringDepositInterestCalculator,
final CalculateSavingSchedule calculateSavingSchedule) {
this.clientRepository = clientRepository;
this.savingProductRepository = savingProductRepository;
this.reccuringDepositInterestCalculator = reccuringDepositInterestCalculator;
this.calculateSavingSchedule = calculateSavingSchedule;
}
//minimumBalanceForWithdrawal,isPartialDepositAllowed
public SavingAccount assembleFrom(SavingAccountCommand command){
// minimumBalanceForWithdrawal,isPartialDepositAllowed
public SavingAccount assembleFrom(SavingAccountCommand command) {
Client client = this.clientRepository.findOne(command.getClientId());
if (client == null || client.isDeleted()) {
throw new ClientNotFoundException(command.getClientId());
}
if (client == null || client.isDeleted()) { throw new ClientNotFoundException(command.getClientId()); }
SavingProduct product=this.savingProductRepository.findOne(command.getProductId());
if(product == null || product.isDeleted()){
throw new SavingProductNotFoundException(command.getProductId());
}
SavingProduct product = this.savingProductRepository.findOne(command.getProductId());
if (product == null || product.isDeleted()) { throw new SavingProductNotFoundException(command.getProductId()); }
MonetaryCurrency currency = product.getCurrency();
if(command.getCurrencyCode() != null && command.getDigitsAfterDecimal() != null){
if (command.getCurrencyCode() != null && command.getDigitsAfterDecimal() != null) {
currency = new MonetaryCurrency(command.getCurrencyCode(), command.getDigitsAfterDecimal());
}
Money savingsDeposit = Money.of(currency, command.getSavingsDepositAmount());
Integer tenure = product.getSavingProductRelatedDetail().getTenure();
if(command.getTenure() != null){
tenure=command.getTenure();
if (command.getTenure() != null) {
tenure = command.getTenure();
}
TenureTypeEnum tenureTypeEnum=product.getSavingProductRelatedDetail().getTenureType();
TenureTypeEnum tenureTypeEnum = product.getSavingProductRelatedDetail().getTenureType();
if (command.getTenureType() != null) {
tenureTypeEnum = TenureTypeEnum.fromInt(command.getTenureType());
}
SavingProductType savingProductType= product.getSavingProductRelatedDetail().getSavingProductType();
if(command.getSavingProductType() != null){
SavingProductType savingProductType = product.getSavingProductRelatedDetail().getSavingProductType();
if (command.getSavingProductType() != null) {
savingProductType = SavingProductType.fromInt(command.getSavingProductType());
}
@@ -87,7 +85,8 @@ public class SavingAccountAssembler {
savingFrequencyType = SavingFrequencyType.fromInt(command.getFrequency());
}
SavingInterestCalculationMethod savingInterestCalculationMethod = product.getSavingProductRelatedDetail().getInterestCalculationMethod();
SavingInterestCalculationMethod savingInterestCalculationMethod = product.getSavingProductRelatedDetail()
.getInterestCalculationMethod();
if (command.getInterestCalculationMethod() != null) {
savingInterestCalculationMethod = SavingInterestCalculationMethod.fromInt(command.getInterestCalculationMethod());
}
@@ -99,37 +98,34 @@ public class SavingAccountAssembler {
BigDecimal reccuringInterestRate = command.getRecurringInterestRate();
BigDecimal savingInterestRate = product.getInterestRate();
if(command.getSavingInterestRate() != null)
savingInterestRate = command.getSavingInterestRate();
if (command.getSavingInterestRate() != null) savingInterestRate = command.getSavingInterestRate();
boolean isLockinPeriodAllowed = product.getSavingProductRelatedDetail().isLockinPeriodAllowed();
if(command.isLockinPeriodChanged()){
if (command.isLockinPeriodChanged()) {
isLockinPeriodAllowed = command.isLockinPeriodAllowed();
}
Integer lockinPeriod = product.getSavingProductRelatedDetail().getLockinPeriod();
if(command.getLockinPeriod() != null){
if (command.getLockinPeriod() != null) {
lockinPeriod = command.getLockinPeriod();
}
PeriodFrequencyType lockinPeriodType = product.getSavingProductRelatedDetail().getLockinPeriodType();
if(command.getLockinPeriodType() != null){
if (command.getLockinPeriodType() != null) {
lockinPeriodType = PeriodFrequencyType.fromInt(command.getLockinPeriodType());
}
SavingAccount account = SavingAccount.openNew(client, product, command.getExternalId(),savingsDeposit,
reccuringInterestRate,savingInterestRate,tenure,command.getCommencementDate(),tenureTypeEnum, savingProductType,
savingFrequencyType, interestType, savingInterestCalculationMethod, isLockinPeriodAllowed,lockinPeriod, lockinPeriodType,
SavingAccount account = SavingAccount.openNew(client, product, command.getExternalId(), savingsDeposit, reccuringInterestRate,
savingInterestRate, tenure, command.getCommencementDate(), tenureTypeEnum, savingProductType, savingFrequencyType,
interestType, savingInterestCalculationMethod, isLockinPeriodAllowed, lockinPeriod, lockinPeriodType,
this.reccuringDepositInterestCalculator, defaultDepositLifecycleStateMachine());
SavingScheduleData savingScheduleData = this.calculateSavingSchedule.calculateSavingSchedule(command.toCalculateSavingScheduleCommand());
for(SavingSchedulePeriodData savingSchedulePeriodData : savingScheduleData.getPeriods()){
SavingScheduleData savingScheduleData = this.calculateSavingSchedule.calculateSavingSchedule(command
.toCalculateSavingScheduleCommand());
for (SavingSchedulePeriodData savingSchedulePeriodData : savingScheduleData.getPeriods()) {
final SavingScheduleInstallments installment = new SavingScheduleInstallments(
account,
savingSchedulePeriodData.getDueDate().toDate(),
savingSchedulePeriodData.getPeriod(),
savingSchedulePeriodData.getDepositDue());
final SavingScheduleInstallments installment = new SavingScheduleInstallments(account, savingSchedulePeriodData.getDueDate()
.toDate(), savingSchedulePeriodData.getPeriod(), savingSchedulePeriodData.getDepositDue());
account.addSavingScheduleInstallment(installment);
}
@@ -138,26 +134,25 @@ public class SavingAccountAssembler {
public void assembleFrom(SavingAccountCommand command, SavingAccount account) {
SavingProduct product=account.getProduct();
if(command.isProductIdChanged()){
if(product.getId() != command.getProductId()){
SavingProduct product = account.getProduct();
if (command.isProductIdChanged()) {
if (product.getId() != command.getProductId()) {
product = this.savingProductRepository.findOne(command.getProductId());
if(product == null || product.isDeleted())
throw new SavingProductNotFoundException(command.getProductId());
if (product == null || product.isDeleted()) throw new SavingProductNotFoundException(command.getProductId());
}
}
String externalId = account.getExternalId();
if(command.isExternalIdChanged()){
if (command.isExternalIdChanged()) {
externalId = command.getExternalId();
}
Money savingsDeposit = Money.of(product.getCurrency(), account.getSavingsDepositAmountPerPeriod());
if(command.isDepositAmountChanged()){
if (command.isDepositAmountChanged()) {
savingsDeposit = Money.of(product.getCurrency(), command.getSavingsDepositAmount());
}
Integer tenure = account.getTenure();
if(command.isTenureInMonthsChanged()){
if (command.isTenureInMonthsChanged()) {
tenure = command.getTenure();
}
@@ -166,12 +161,12 @@ public class SavingAccountAssembler {
commencementDate = command.getCommencementDate();
}
TenureTypeEnum tenureTypeEnum=account.getTenureType();
if(command.isTenureTypeEnumChanged()){
TenureTypeEnum tenureTypeEnum = account.getTenureType();
if (command.isTenureTypeEnumChanged()) {
tenureTypeEnum = TenureTypeEnum.fromInt(command.getTenureType());
}
SavingProductType savingProductType= account.getSavingProductType();
SavingProductType savingProductType = account.getSavingProductType();
if (command.isSavingProductTypeChanged()) {
savingProductType = SavingProductType.fromInt(command.getSavingProductType());
}
@@ -181,7 +176,7 @@ public class SavingAccountAssembler {
savingFrequencyType = SavingFrequencyType.fromInt(command.getFrequency());
}
SavingInterestCalculationMethod savingInterestCalculationMethod =account.getInterestCalculationMethod();
SavingInterestCalculationMethod savingInterestCalculationMethod = account.getInterestCalculationMethod();
if (command.isSavingInterestCalculationMethodChanged()) {
savingInterestCalculationMethod = SavingInterestCalculationMethod.fromInt(command.getInterestCalculationMethod());
}
@@ -201,7 +196,7 @@ public class SavingAccountAssembler {
isLockinPeriodAllowed = command.isLockinPeriodAllowed();
}
Integer lockinPeriod =account.getLockinPeriod();
Integer lockinPeriod = account.getLockinPeriod();
if (command.isLockinPeriodChanged()) {
lockinPeriod = command.getLockinPeriod();
}
@@ -210,9 +205,9 @@ public class SavingAccountAssembler {
if (command.isLockinPeriodTypeChanged()) {
lockinPeriodType = PeriodFrequencyType.fromInt(command.getLockinPeriodType());
}
account.modifyAccount(product, externalId, savingsDeposit, reccuringInterestRate, savingInterestRate, tenure,
commencementDate, tenureTypeEnum, savingProductType, savingFrequencyType, savingInterestCalculationMethod,
isLockinPeriodAllowed, lockinPeriod, lockinPeriodType, this.reccuringDepositInterestCalculator);
account.modifyAccount(product, externalId, savingsDeposit, reccuringInterestRate, savingInterestRate, tenure, commencementDate,
tenureTypeEnum, savingProductType, savingFrequencyType, savingInterestCalculationMethod, isLockinPeriodAllowed,
lockinPeriod, lockinPeriodType, this.reccuringDepositInterestCalculator);
}
@@ -30,15 +30,11 @@ public class SavingProductRelatedDetailAssembler {
final Integer payEvery = command.getPayEvery();
final Integer paymentFrequencyType = command.getPaymentFrequencyType();
final SavingProduct savingProduct = this.savingProductRepository.findOne(command.getProductId());
if (savingProduct == null) {
throw new SavingProductNotFoundException(command.getProductId());
}
if (savingProduct == null) { throw new SavingProductNotFoundException(command.getProductId()); }
final MonetaryCurrency currency = savingProduct.getCurrency();
return null;
}
}
@@ -20,37 +20,30 @@ public class SavingScheduleGenerator {
private final DepositScheduleDateGenerator scheduledDateGenerator = new DefaultDepositScheduleDateGenerator();
public SavingScheduleData generate(
final LocalDate scheduleStartDate,
final BigDecimal depositAmountPerPeriod,
final Integer depositFrequency,
final PeriodFrequencyType depositFrequencyType,
final SavingProduct savingProduct,
final Integer tenure,
final ApplicationCurrency applicationCurrency) {
public SavingScheduleData generate(final LocalDate scheduleStartDate, final BigDecimal depositAmountPerPeriod,
final Integer depositFrequency, final PeriodFrequencyType depositFrequencyType, final SavingProduct savingProduct,
final Integer tenure, final ApplicationCurrency applicationCurrency) {
LocalDate startDate = scheduleStartDate;
int periodNumber = 1;
Integer paymentPeriods = tenure/depositFrequency;
Integer paymentPeriods = tenure / depositFrequency;
final Collection<SavingSchedulePeriodData> periods = new ArrayList<SavingSchedulePeriodData>();
final List<LocalDate> scheduledDates = this.scheduledDateGenerator.generate(startDate,paymentPeriods,depositFrequency,depositFrequencyType);
final List<LocalDate> scheduledDates = this.scheduledDateGenerator.generate(startDate, paymentPeriods, depositFrequency,
depositFrequencyType);
final MonetaryCurrency currency = savingProduct.getCurrency();
final Money depositAmount = Money.of(currency, depositAmountPerPeriod);
Money totalDeposit = Money.zero(currency);
for(LocalDate scheduleDate : scheduledDates){
for (LocalDate scheduleDate : scheduledDates) {
totalDeposit = totalDeposit.plus(depositAmount);
SavingSchedulePeriodData installment = SavingSchedulePeriodData.addScheduleInformation(periodNumber, scheduleDate, depositAmount.getAmount());
SavingSchedulePeriodData installment = SavingSchedulePeriodData.addScheduleInformation(periodNumber, scheduleDate,
depositAmount.getAmount());
periods.add(installment);
periodNumber++;
}
CurrencyData currencyData = new CurrencyData(
applicationCurrency.getCode(),
applicationCurrency.getName(),
currency.getDigitsAfterDecimal(),
applicationCurrency.getDisplaySymbol(),
applicationCurrency.getNameCode());
CurrencyData currencyData = new CurrencyData(applicationCurrency.getCode(), applicationCurrency.getName(),
currency.getDigitsAfterDecimal(), applicationCurrency.getDisplaySymbol(), applicationCurrency.getNameCode());
return new SavingScheduleData(currencyData, totalDeposit.getAmount(), periods);
}
@@ -67,39 +67,40 @@ public class SavingProductsApiResource {
private PlatformSecurityContext context;
@POST
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
public Response createSavingProduct(final String jsonRequestBody){
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public Response createSavingProduct(final String jsonRequestBody) {
final SavingProductCommand command=this.apiDataConversionService.convertJsonToSavingProductCommand(null, jsonRequestBody);
final SavingProductCommand command = this.apiDataConversionService.convertJsonToSavingProductCommand(null, jsonRequestBody);
EntityIdentifier entityIdentifier=this.savingProductWritePlatformService.createSavingProduct(command);
EntityIdentifier entityIdentifier = this.savingProductWritePlatformService.createSavingProduct(command);
return Response.ok().entity(entityIdentifier).build();
}
@PUT
@Path("{productId}")
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
public Response updateSavingProduct(@PathParam("productId") final Long productId, final String jsonRequestBody){
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public Response updateSavingProduct(@PathParam("productId") final Long productId, final String jsonRequestBody) {
SavingProductCommand command=this.apiDataConversionService.convertJsonToSavingProductCommand(productId, jsonRequestBody);
EntityIdentifier entityIdentifier=this.savingProductWritePlatformService.updateSavingProduct(command);
SavingProductCommand command = this.apiDataConversionService.convertJsonToSavingProductCommand(productId, jsonRequestBody);
EntityIdentifier entityIdentifier = this.savingProductWritePlatformService.updateSavingProduct(command);
return Response.ok().entity(entityIdentifier).build();
}
@GET
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public String retrieveAllSavingProducts(@Context final UriInfo uriInfo) {
context.authenticatedUser().validateHasReadPermission(entityType);
Set<String> typicalResponseParameters = new HashSet<String>(Arrays.asList("id", "createdOn", "lastModifedOn",
"locale", "name", "description","currencyCode", "digitsAfterDecimal","interstRate", "minInterestRate","maxInterestRate",
"savingsDepositAmount","savingProductType","tenureType","tenure", "frequency","interestType","interestCalculationMethod",
"minimumBalanceForWithdrawal","isPartialDepositAllowed","isLockinPeriodAllowed","lockinPeriod","lockinPeriodType"));
Set<String> typicalResponseParameters = new HashSet<String>(Arrays.asList("id", "createdOn", "lastModifedOn", "locale", "name",
"description", "currencyCode", "digitsAfterDecimal", "interstRate", "minInterestRate", "maxInterestRate",
"savingsDepositAmount", "savingProductType", "tenureType", "tenure", "frequency", "interestType",
"interestCalculationMethod", "minimumBalanceForWithdrawal", "isPartialDepositAllowed", "isLockinPeriodAllowed",
"lockinPeriod", "lockinPeriodType"));
Set<String> responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters());
if (responseParameters.isEmpty()) {
@@ -114,16 +115,17 @@ public class SavingProductsApiResource {
@GET
@Path("{productId}")
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public String retrieveSavingProductDetails(@PathParam("productId") final Long productId, @Context final UriInfo uriInfo) {
context.authenticatedUser().validateHasReadPermission(entityType);
Set<String> typicalResponseParameters = new HashSet<String>(Arrays.asList("id", "createdOn", "lastModifedOn",
"locale", "name", "description","currencyCode", "digitsAfterDecimal","interstRate", "minInterestRate","maxInterestRate",
"savingsDepositAmount","savingProductType","tenureType","tenure", "frequency","interestType","interestCalculationMethod",
"minimumBalanceForWithdrawal","isPartialDepositAllowed","isLockinPeriodAllowed","lockinPeriod","lockinPeriodType"));
Set<String> typicalResponseParameters = new HashSet<String>(Arrays.asList("id", "createdOn", "lastModifedOn", "locale", "name",
"description", "currencyCode", "digitsAfterDecimal", "interstRate", "minInterestRate", "maxInterestRate",
"savingsDepositAmount", "savingProductType", "tenureType", "tenure", "frequency", "interestType",
"interestCalculationMethod", "minimumBalanceForWithdrawal", "isPartialDepositAllowed", "isLockinPeriodAllowed",
"lockinPeriod", "lockinPeriodType"));
Set<String> responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters());
if (responseParameters.isEmpty()) {
@@ -142,17 +144,16 @@ public class SavingProductsApiResource {
@GET
@Path("template")
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public String retrieveNewSavingProductDetails(@Context final UriInfo uriInfo) {
context.authenticatedUser().validateHasReadPermission(entityType);
Set<String> typicalResponseParameters = new HashSet<String>(
Arrays.asList("id", "createdOn", "lastModifedOn",
"locale", "name", "description","currencyCode", "digitsAfterDecimal","interstRate",
"savingsDepositAmount","savingProductType","tenureType","tenure", "frequency","interestType","interestCalculationMethod",
"minimumBalanceForWithdrawal","isPartialDepositAllowed","isLockinPeriodAllowed","lockinPeriod","lockinPeriodType","currencyOptions"));
Set<String> typicalResponseParameters = new HashSet<String>(Arrays.asList("id", "createdOn", "lastModifedOn", "locale", "name",
"description", "currencyCode", "digitsAfterDecimal", "interstRate", "savingsDepositAmount", "savingProductType",
"tenureType", "tenure", "frequency", "interestType", "interestCalculationMethod", "minimumBalanceForWithdrawal",
"isPartialDepositAllowed", "isLockinPeriodAllowed", "lockinPeriod", "lockinPeriodType", "currencyOptions"));
Set<String> responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters());
if (responseParameters.isEmpty()) {
@@ -161,46 +162,48 @@ public class SavingProductsApiResource {
boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters());
SavingProductData savingProduct = this.savingProductReadPlatformService.retrieveNewSavingProductDetails();
savingProduct = handleTemplateRelatedData(responseParameters,savingProduct);
savingProduct = handleTemplateRelatedData(responseParameters, savingProduct);
return this.apiJsonSerializerService.serializeSavingProductDataToJson(prettyPrint, responseParameters, savingProduct);
}
private SavingProductData handleTemplateRelatedData(Set<String> responseParameters, SavingProductData savingProduct) {
responseParameters.addAll(Arrays.asList("currencyOptions", "savingsProductTypeOptions", "tenureTypeOptions", "savingFrequencyOptions", "savingsInterestTypeOptions",
"lockinPeriodTypeOptions", "interestCalculationOptions"));
responseParameters.addAll(Arrays.asList("currencyOptions", "savingsProductTypeOptions", "tenureTypeOptions",
"savingFrequencyOptions", "savingsInterestTypeOptions", "lockinPeriodTypeOptions", "interestCalculationOptions"));
List<CurrencyData> currencyOptions = this.currencyReadPlatformService.retrieveAllowedCurrencies();
EnumOptionData reccuring = SavingProductEnumerations.savingProductType(SavingProductType.RECCURING);
EnumOptionData regular = SavingProductEnumerations.savingProductType(SavingProductType.REGULAR);
List<EnumOptionData> savingsProductTypeOptions = Arrays.asList(reccuring,regular);
List<EnumOptionData> savingsProductTypeOptions = Arrays.asList(reccuring, regular);
EnumOptionData fixed = SavingProductEnumerations.tenureTypeEnum(TenureTypeEnum.FIXED_PERIOD);
EnumOptionData perpetual = SavingProductEnumerations.tenureTypeEnum(TenureTypeEnum.PERPETUAL);
List<EnumOptionData> tenureTypeOptions = Arrays.asList(fixed,perpetual);
List<EnumOptionData> tenureTypeOptions = Arrays.asList(fixed, perpetual);
EnumOptionData monthly = SavingProductEnumerations.interestFrequencyType(SavingFrequencyType.MONTHLY);
List<EnumOptionData> savingFrequencyOptions = Arrays.asList(monthly);
EnumOptionData simple = SavingProductEnumerations.savingInterestType(SavingsInterestType.SIMPLE);
EnumOptionData compounding = SavingProductEnumerations.savingInterestType(SavingsInterestType.COMPOUNDING);
List<EnumOptionData> savingsInterestTypeOptions = Arrays.asList(simple,compounding);
List<EnumOptionData> savingsInterestTypeOptions = Arrays.asList(simple, compounding);
EnumOptionData months = SavingProductEnumerations.savingsLockinPeriod(SavingsLockinPeriodEnum.MONTHS);
List<EnumOptionData> lockinPeriodTypeOptions = Arrays.asList(months);
EnumOptionData averagebal = SavingProductEnumerations.savingInterestCalculationMethod(SavingInterestCalculationMethod.AVERAGEBAL);
EnumOptionData minbal = SavingProductEnumerations.savingInterestCalculationMethod(SavingInterestCalculationMethod.MINBAL);
EnumOptionData monthlyCollection = SavingProductEnumerations.savingInterestCalculationMethod(SavingInterestCalculationMethod.MONTHLYCOLLECTION);
List<EnumOptionData> interestCalculationOptions= Arrays.asList(averagebal,minbal,monthlyCollection);
EnumOptionData monthlyCollection = SavingProductEnumerations
.savingInterestCalculationMethod(SavingInterestCalculationMethod.MONTHLYCOLLECTION);
List<EnumOptionData> interestCalculationOptions = Arrays.asList(averagebal, minbal, monthlyCollection);
return new SavingProductData(savingProduct,currencyOptions,savingsProductTypeOptions,tenureTypeOptions,savingFrequencyOptions,savingsInterestTypeOptions,lockinPeriodTypeOptions,interestCalculationOptions);
return new SavingProductData(savingProduct, currencyOptions, savingsProductTypeOptions, tenureTypeOptions, savingFrequencyOptions,
savingsInterestTypeOptions, lockinPeriodTypeOptions, interestCalculationOptions);
}
@DELETE
@Path("{productId}")
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public Response deleteProduct(@PathParam("productId") final Long productId) {
this.savingProductWritePlatformService.deleteSavingProduct(productId);
@@ -4,6 +4,7 @@ import java.math.BigDecimal;
import java.util.Set;
public class SavingProductCommand {
private final Long id;
private final String name;
private final String description;
@@ -27,20 +28,13 @@ public class SavingProductCommand {
private final Integer lockinPeriod;
private final Integer lockinPeriodType;
private final Set<String> modifiedParameters;
public SavingProductCommand(Set<String> modifiedParameters,
Long id, String name, String description,
String currencyCode, Integer digitsAfterDecimal,
BigDecimal interestRate, BigDecimal minInterestRate,
BigDecimal maxInterestRate, BigDecimal savingsDepositAmount,
Integer savingProductType, Integer tenureType, Integer tenure,
Integer frequency, Integer interestType,
Integer interestCalculationMethod,
BigDecimal minimumBalanceForWithdrawal,
boolean isPartialDepositAllowed, boolean isLockinPeriodAllowed,
Integer lockinPeriod, Integer lockinPeriodType) {
public SavingProductCommand(Set<String> modifiedParameters, Long id, String name, String description, String currencyCode,
Integer digitsAfterDecimal, BigDecimal interestRate, BigDecimal minInterestRate, BigDecimal maxInterestRate,
BigDecimal savingsDepositAmount, Integer savingProductType, Integer tenureType, Integer tenure, Integer frequency,
Integer interestType, Integer interestCalculationMethod, BigDecimal minimumBalanceForWithdrawal,
boolean isPartialDepositAllowed, boolean isLockinPeriodAllowed, Integer lockinPeriod, Integer lockinPeriodType) {
this.id = id;
this.name = name;
@@ -52,18 +46,18 @@ public class SavingProductCommand {
this.minInterestRate = minInterestRate;
this.maxInterestRate = maxInterestRate;
this.savingsDepositAmount=savingsDepositAmount;
this.savingProductType=savingProductType;
this.tenureType=tenureType;
this.tenure=tenure;
this.frequency=frequency;
this.interestType=interestType;
this.interestCalculationMethod=interestCalculationMethod;
this.minimumBalanceForWithdrawal=minimumBalanceForWithdrawal;
this.isPartialDepositAllowed=isPartialDepositAllowed;
this.isLockinPeriodAllowed=isLockinPeriodAllowed;
this.lockinPeriod=lockinPeriod;
this.lockinPeriodType=lockinPeriodType;
this.savingsDepositAmount = savingsDepositAmount;
this.savingProductType = savingProductType;
this.tenureType = tenureType;
this.tenure = tenure;
this.frequency = frequency;
this.interestType = interestType;
this.interestCalculationMethod = interestCalculationMethod;
this.minimumBalanceForWithdrawal = minimumBalanceForWithdrawal;
this.isPartialDepositAllowed = isPartialDepositAllowed;
this.isLockinPeriodAllowed = isLockinPeriodAllowed;
this.lockinPeriod = lockinPeriod;
this.lockinPeriodType = lockinPeriodType;
this.modifiedParameters = modifiedParameters;
}
@@ -168,7 +162,7 @@ public class SavingProductCommand {
return this.modifiedParameters.contains("interestRate");
}
public boolean isSavingsDepositAmountChanged(){
public boolean isSavingsDepositAmountChanged() {
return this.modifiedParameters.contains("savingsDepositAmount");
}
@@ -44,106 +44,96 @@ public class SavingProductData implements Serializable {
List<EnumOptionData> lockinPeriodTypeOptions = new ArrayList<EnumOptionData>();
List<EnumOptionData> interestCalculationOptions = new ArrayList<EnumOptionData>();
public SavingProductData(){
this.createdOn=new DateTime();
this.lastModifedOn=new DateTime();
this.id=null;
this.name=null;
this.description=null;
this.interestRate=BigDecimal.ZERO;
this.minInterestRate=BigDecimal.ZERO;
this.maxInterestRate=BigDecimal.ZERO;
this.currency=null;
this.digitsAfterDecimal=null;
this.savingsDepositAmount=null;
this.savingProductType=null;
public SavingProductData() {
this.createdOn = new DateTime();
this.lastModifedOn = new DateTime();
this.id = null;
this.name = null;
this.description = null;
this.interestRate = BigDecimal.ZERO;
this.minInterestRate = BigDecimal.ZERO;
this.maxInterestRate = BigDecimal.ZERO;
this.currency = null;
this.digitsAfterDecimal = null;
this.savingsDepositAmount = null;
this.savingProductType = null;
this.tenureType = null;
this.tenure = null;
this.savingFrequencyType=null;
this.interestType=null;
this.interestCalculationMethod=null;
this.minimumBalanceForWithdrawal=null;
this.isPartialDepositAllowed=true;
this.isLockinPeriodAllowed=true;
this.lockinPeriod=null;
this.lockinPeriodType=null;
this.savingFrequencyType = null;
this.interestType = null;
this.interestCalculationMethod = null;
this.minimumBalanceForWithdrawal = null;
this.isPartialDepositAllowed = true;
this.isLockinPeriodAllowed = true;
this.lockinPeriod = null;
this.lockinPeriodType = null;
}
public SavingProductData(DateTime createdOn, DateTime lastModifedOn,
Long id, String name, String description,
BigDecimal interestRate, BigDecimal minInterestRate, BigDecimal maxInterestRate, CurrencyData currency,
Integer digitsAfterDecimal, BigDecimal savingsDepositAmount,
EnumOptionData savingProductType,
EnumOptionData tenureType, Integer tenure,
EnumOptionData savingFrequencyType,
EnumOptionData savingInterestType,
EnumOptionData interestCalculationMethod,
BigDecimal minimumBalanceForWithdrawal,
boolean isPartialDepositAllowed, boolean isLockinPeriodAllowed,
Integer lockinPeriod, EnumOptionData lockinPeriodType) {
this.createdOn=createdOn;
this.lastModifedOn=lastModifedOn;
this.id=id;
this.name=name;
this.description=description;
this.interestRate=interestRate;
this.minInterestRate=minInterestRate;
this.maxInterestRate=maxInterestRate;
this.currency=currency;
this.digitsAfterDecimal=digitsAfterDecimal;
this.savingsDepositAmount=savingsDepositAmount;
this.savingProductType=savingProductType;
public SavingProductData(DateTime createdOn, DateTime lastModifedOn, Long id, String name, String description, BigDecimal interestRate,
BigDecimal minInterestRate, BigDecimal maxInterestRate, CurrencyData currency, Integer digitsAfterDecimal,
BigDecimal savingsDepositAmount, EnumOptionData savingProductType, EnumOptionData tenureType, Integer tenure,
EnumOptionData savingFrequencyType, EnumOptionData savingInterestType, EnumOptionData interestCalculationMethod,
BigDecimal minimumBalanceForWithdrawal, boolean isPartialDepositAllowed, boolean isLockinPeriodAllowed, Integer lockinPeriod,
EnumOptionData lockinPeriodType) {
this.createdOn = createdOn;
this.lastModifedOn = lastModifedOn;
this.id = id;
this.name = name;
this.description = description;
this.interestRate = interestRate;
this.minInterestRate = minInterestRate;
this.maxInterestRate = maxInterestRate;
this.currency = currency;
this.digitsAfterDecimal = digitsAfterDecimal;
this.savingsDepositAmount = savingsDepositAmount;
this.savingProductType = savingProductType;
this.tenureType = tenureType;
this.tenure = tenure;
this.savingFrequencyType=savingFrequencyType;
this.interestType=savingInterestType;
this.interestCalculationMethod=interestCalculationMethod;
this.minimumBalanceForWithdrawal=minimumBalanceForWithdrawal;
this.isPartialDepositAllowed=isPartialDepositAllowed;
this.isLockinPeriodAllowed=isLockinPeriodAllowed;
this.lockinPeriod=lockinPeriod;
this.lockinPeriodType=lockinPeriodType;
this.savingFrequencyType = savingFrequencyType;
this.interestType = savingInterestType;
this.interestCalculationMethod = interestCalculationMethod;
this.minimumBalanceForWithdrawal = minimumBalanceForWithdrawal;
this.isPartialDepositAllowed = isPartialDepositAllowed;
this.isLockinPeriodAllowed = isLockinPeriodAllowed;
this.lockinPeriod = lockinPeriod;
this.lockinPeriodType = lockinPeriodType;
}
public SavingProductData(SavingProductData product,
List<CurrencyData> currencyOptions,
List<EnumOptionData> savingsProductTypeOptions,
List<EnumOptionData> tenureTypeOptions,
List<EnumOptionData> savingFrequencyOptions,
List<EnumOptionData> savingsInterestTypeOptions,
List<EnumOptionData> lockinPeriodTypeOptions,
public SavingProductData(SavingProductData product, List<CurrencyData> currencyOptions, List<EnumOptionData> savingsProductTypeOptions,
List<EnumOptionData> tenureTypeOptions, List<EnumOptionData> savingFrequencyOptions,
List<EnumOptionData> savingsInterestTypeOptions, List<EnumOptionData> lockinPeriodTypeOptions,
List<EnumOptionData> interestCalculationOptions) {
this.createdOn=product.getCreatedOn();
this.lastModifedOn=product.getLastModifedOn();
this.id=product.getId();
this.name=product.getName();
this.description=product.getDescription();
this.interestRate=product.getInterestRate();
this.minInterestRate=product.getMinInterestRate();
this.maxInterestRate=product.getMaxInterestRate();
this.currency=product.getCurrency();
this.digitsAfterDecimal=product.getDigitsAfterDecimal();
this.savingsDepositAmount=product.getSavingsDepositAmount();
this.savingProductType=product.getSavingProductType();
this.createdOn = product.getCreatedOn();
this.lastModifedOn = product.getLastModifedOn();
this.id = product.getId();
this.name = product.getName();
this.description = product.getDescription();
this.interestRate = product.getInterestRate();
this.minInterestRate = product.getMinInterestRate();
this.maxInterestRate = product.getMaxInterestRate();
this.currency = product.getCurrency();
this.digitsAfterDecimal = product.getDigitsAfterDecimal();
this.savingsDepositAmount = product.getSavingsDepositAmount();
this.savingProductType = product.getSavingProductType();
this.tenureType = product.getTenureType();
this.tenure = product.getTenure();
this.savingFrequencyType=product.getSavingFrequencyType();
this.interestType=product.getInterestType();
this.interestCalculationMethod=product.getInterestCalculationMethod();
this.minimumBalanceForWithdrawal=product.getMinimumBalanceForWithdrawal();
this.isPartialDepositAllowed=product.isPartialDepositAllowed();
this.isLockinPeriodAllowed=product.isLockinPeriodAllowed();
this.lockinPeriod=product.getLockinPeriod();
this.lockinPeriodType=product.getLockinPeriodType();
this.savingFrequencyType = product.getSavingFrequencyType();
this.interestType = product.getInterestType();
this.interestCalculationMethod = product.getInterestCalculationMethod();
this.minimumBalanceForWithdrawal = product.getMinimumBalanceForWithdrawal();
this.isPartialDepositAllowed = product.isPartialDepositAllowed();
this.isLockinPeriodAllowed = product.isLockinPeriodAllowed();
this.lockinPeriod = product.getLockinPeriod();
this.lockinPeriodType = product.getLockinPeriodType();
this.currencyOptions=currencyOptions;
this.savingsProductTypeOptions=savingsProductTypeOptions;
this.tenureTypeOptions=tenureTypeOptions;
this.savingFrequencyOptions=savingFrequencyOptions;
this.savingsInterestTypeOptions=savingsInterestTypeOptions;
this.lockinPeriodTypeOptions=lockinPeriodTypeOptions;
this.interestCalculationOptions=interestCalculationOptions;
this.currencyOptions = currencyOptions;
this.savingsProductTypeOptions = savingsProductTypeOptions;
this.tenureTypeOptions = tenureTypeOptions;
this.savingFrequencyOptions = savingFrequencyOptions;
this.savingsInterestTypeOptions = savingsInterestTypeOptions;
this.lockinPeriodTypeOptions = lockinPeriodTypeOptions;
this.interestCalculationOptions = interestCalculationOptions;
}
@@ -3,6 +3,7 @@ package org.mifosplatform.portfolio.savingsaccountproduct.data;
import java.io.Serializable;
public class SavingProductLookup implements Serializable {
private Long id;
private String name;
@@ -1,26 +1,22 @@
package org.mifosplatform.portfolio.savingsaccountproduct.domain;
public enum SavingFrequencyType {
INVALID(0,"savingFrequencyType.invalid"),
DAILY(1,"savingFrequencyType.daily"),
MONTHLY(2,"savingFrequencyType.monthly"),
QUATERLY(3,"savingFrequencyType.quaterly"),
HALFYEARLY(4,"savingFrequencyType.halfyearly"),
YEARLY(5,"savingFrequencyType.yearly");
INVALID(0, "savingFrequencyType.invalid"), DAILY(1, "savingFrequencyType.daily"), MONTHLY(2, "savingFrequencyType.monthly"), QUATERLY(
3, "savingFrequencyType.quaterly"), HALFYEARLY(4, "savingFrequencyType.halfyearly"), YEARLY(5, "savingFrequencyType.yearly");
private final Integer value;
private final String code;
private SavingFrequencyType(final Integer value,final String code) {
this.value=value;
this.code=code;
private SavingFrequencyType(final Integer value, final String code) {
this.value = value;
this.code = code;
}
public Integer getValue() {
return value;
}
public String getCode() {
return code;
}
@@ -2,17 +2,15 @@ package org.mifosplatform.portfolio.savingsaccountproduct.domain;
public enum SavingInterestCalculationMethod {
AVERAGEBAL(1,"savinginterest.calculation.method.averagebal"),
MINBAL(2,"savinginterest.calculation.method.minbal"),
MONTHLYCOLLECTION(3,"savinginterest.calculation.method.monthlycllection"),
INVALID(0,"savinginterest.calculation.method.invalid");
AVERAGEBAL(1, "savinginterest.calculation.method.averagebal"), MINBAL(2, "savinginterest.calculation.method.minbal"), MONTHLYCOLLECTION(
3, "savinginterest.calculation.method.monthlycllection"), INVALID(0, "savinginterest.calculation.method.invalid");
private final Integer value;
private final String code;
private SavingInterestCalculationMethod(final Integer value,final String code) {
this.value=value;
this.code=code;
private SavingInterestCalculationMethod(final Integer value, final String code) {
this.value = value;
this.code = code;
}
public Integer getValue() {
@@ -22,6 +20,7 @@ public enum SavingInterestCalculationMethod {
public String getCode() {
return code;
}
public static SavingInterestCalculationMethod fromInt(final Integer frequency) {
SavingInterestCalculationMethod savingInterestCalculationMethod = SavingInterestCalculationMethod.INVALID;
@@ -25,7 +25,7 @@ public class SavingProduct extends AbstractAuditableCustom<AppUser, Long> {
@Column(name = "description")
private String description;
@Column(name = "is_deleted", nullable=false)
@Column(name = "is_deleted", nullable = false)
private boolean deleted = false;
@Embedded
@@ -37,10 +37,13 @@ public class SavingProduct extends AbstractAuditableCustom<AppUser, Long> {
this.savingProductRelatedDetail = null;
}
public SavingProduct(final String name, final String description, final MonetaryCurrency currency,final BigDecimal interestRate, final BigDecimal minInterestRate, final BigDecimal maxInterestRate, final BigDecimal savingsDepositAmount,
final SavingProductType savingProductType, final TenureTypeEnum tenureType, final Integer tenure, final SavingFrequencyType savingFrequencyType,
final SavingsInterestType savingsInterestType, SavingInterestCalculationMethod savingInterestCalculationMethod, final BigDecimal minimumBalanceForWithdrawal,
final boolean isPartialDepositAllowed, final boolean isLockinPeriodAllowed, final Integer lockinPeriod, final PeriodFrequencyType lockinPeriodType){
public SavingProduct(final String name, final String description, final MonetaryCurrency currency, final BigDecimal interestRate,
final BigDecimal minInterestRate, final BigDecimal maxInterestRate, final BigDecimal savingsDepositAmount,
final SavingProductType savingProductType, final TenureTypeEnum tenureType, final Integer tenure,
final SavingFrequencyType savingFrequencyType, final SavingsInterestType savingsInterestType,
SavingInterestCalculationMethod savingInterestCalculationMethod, final BigDecimal minimumBalanceForWithdrawal,
final boolean isPartialDepositAllowed, final boolean isLockinPeriodAllowed, final Integer lockinPeriod,
final PeriodFrequencyType lockinPeriodType) {
this.name = name.trim();
if (StringUtils.isNotBlank(description)) {
@@ -48,8 +51,10 @@ public class SavingProduct extends AbstractAuditableCustom<AppUser, Long> {
} else {
this.description = null;
}
this.savingProductRelatedDetail = new SavingProductRelatedDetail(currency, interestRate, minInterestRate, maxInterestRate, savingsDepositAmount, savingProductType, tenureType, tenure,
savingFrequencyType, savingsInterestType, savingInterestCalculationMethod, minimumBalanceForWithdrawal, isPartialDepositAllowed, isLockinPeriodAllowed, lockinPeriod, lockinPeriodType);
this.savingProductRelatedDetail = new SavingProductRelatedDetail(currency, interestRate, minInterestRate, maxInterestRate,
savingsDepositAmount, savingProductType, tenureType, tenure, savingFrequencyType, savingsInterestType,
savingInterestCalculationMethod, minimumBalanceForWithdrawal, isPartialDepositAllowed, isLockinPeriodAllowed, lockinPeriod,
lockinPeriodType);
}
public String getName() {
@@ -64,11 +69,11 @@ public class SavingProduct extends AbstractAuditableCustom<AppUser, Long> {
return this.savingProductRelatedDetail.getCurrency();
}
public BigDecimal getInterestRate(){
public BigDecimal getInterestRate() {
return this.savingProductRelatedDetail.getInterestRate();
}
public BigDecimal getMinimumBalance(){
public BigDecimal getMinimumBalance() {
return this.savingProductRelatedDetail.getMinimumBalance();
}
@@ -31,19 +31,19 @@ public class SavingProductRelatedDetail {
@Column(name = "savings_deposit_amount", scale = 6, precision = 19, nullable = false)
private BigDecimal savingsDepositAmount;
@Column(name = "savings_product_type", nullable=false)
@Column(name = "savings_product_type", nullable = false)
private SavingProductType savingProductType;
@Column(name = "tenure_type", nullable=false)
@Column(name = "tenure_type", nullable = false)
private TenureTypeEnum tenureType;
@Column(name = "tenure", nullable=false)
@Column(name = "tenure", nullable = false)
private Integer tenure;
@Column(name = "frequency", nullable=false)
@Column(name = "frequency", nullable = false)
private SavingFrequencyType frequency;
@Column(name = "interest_type", nullable=false)
@Column(name = "interest_type", nullable = false)
private SavingsInterestType interestType;
@Column(name = "interest_calculation_method")
@@ -52,47 +52,45 @@ public class SavingProductRelatedDetail {
@Column(name = "min_bal_for_withdrawal", scale = 6, precision = 19, nullable = false)
private BigDecimal minimumBalanceForWithdrawal;
@Column(name = "is_partial_deposit_allowed", nullable=false)
@Column(name = "is_partial_deposit_allowed", nullable = false)
private boolean isPartialDepositAllowed;
@Column(name = "is_lock_in_period_allowed", nullable=false)
@Column(name = "is_lock_in_period_allowed", nullable = false)
private boolean isLockinPeriodAllowed;
@Column(name = "lock_in_period", nullable=false)
@Column(name = "lock_in_period", nullable = false)
private Integer lockinPeriod;
@Column(name = "lock_in_period_type", nullable=false)
@Column(name = "lock_in_period_type", nullable = false)
private PeriodFrequencyType lockinPeriodType;
public SavingProductRelatedDetail() {
this.interestRate=null;
this.savingsDepositAmount=null;
this.interestRate = null;
this.savingsDepositAmount = null;
}
public SavingProductRelatedDetail(final MonetaryCurrency currency,final BigDecimal interestRate, final BigDecimal minInterestRate, final BigDecimal maxInterestRate,
final BigDecimal savingsDepositAmount, final SavingProductType savingProductType,
final TenureTypeEnum tenureType, final Integer tenure,
final SavingFrequencyType frequency, final SavingsInterestType interestType,
final SavingInterestCalculationMethod interestCalculationMethod,
final BigDecimal minimumBalanceForWithdrawal,
final boolean isPartialDepositAllowed, final boolean isLockinPeriodAllowed,
public SavingProductRelatedDetail(final MonetaryCurrency currency, final BigDecimal interestRate, final BigDecimal minInterestRate,
final BigDecimal maxInterestRate, final BigDecimal savingsDepositAmount, final SavingProductType savingProductType,
final TenureTypeEnum tenureType, final Integer tenure, final SavingFrequencyType frequency,
final SavingsInterestType interestType, final SavingInterestCalculationMethod interestCalculationMethod,
final BigDecimal minimumBalanceForWithdrawal, final boolean isPartialDepositAllowed, final boolean isLockinPeriodAllowed,
final Integer lockinPeriod, final PeriodFrequencyType lockinPeriodType) {
this.currency=currency;
this.interestRate=interestRate;
this.currency = currency;
this.interestRate = interestRate;
this.minInterestRate = minInterestRate;
this.maxInterestRate = maxInterestRate;
this.savingsDepositAmount=savingsDepositAmount;
this.savingProductType=savingProductType;
this.tenureType=tenureType;
this.tenure=tenure;
this.frequency=frequency;
this.interestType=interestType;
this.interestCalculationMethod=interestCalculationMethod;
this.minimumBalanceForWithdrawal=minimumBalanceForWithdrawal;
this.isPartialDepositAllowed=isPartialDepositAllowed;
this.isLockinPeriodAllowed=isLockinPeriodAllowed;
this.lockinPeriod=lockinPeriod;
this.lockinPeriodType=lockinPeriodType;
this.savingsDepositAmount = savingsDepositAmount;
this.savingProductType = savingProductType;
this.tenureType = tenureType;
this.tenure = tenure;
this.frequency = frequency;
this.interestType = interestType;
this.interestCalculationMethod = interestCalculationMethod;
this.minimumBalanceForWithdrawal = minimumBalanceForWithdrawal;
this.isPartialDepositAllowed = isPartialDepositAllowed;
this.isLockinPeriodAllowed = isLockinPeriodAllowed;
this.lockinPeriod = lockinPeriod;
this.lockinPeriodType = lockinPeriodType;
}
public MonetaryCurrency getCurrency() {
@@ -103,11 +101,11 @@ public class SavingProductRelatedDetail {
return BigDecimal.valueOf(Double.valueOf(this.interestRate.stripTrailingZeros().toString()));
}
public BigDecimal getMinimumBalance(){
public BigDecimal getMinimumBalance() {
return BigDecimal.valueOf(Double.valueOf(this.savingsDepositAmount.stripTrailingZeros().toString()));
}
public void update(SavingProductCommand command){
public void update(SavingProductCommand command) {
Integer digitsAfterDecimal = this.currency.getDigitsAfterDecimal();
if (command.isDigitsAfterDecimalChanged()) {
digitsAfterDecimal = command.getDigitsAfterDecimal();
@@ -126,23 +124,23 @@ public class SavingProductRelatedDetail {
this.interestRate = command.getInterestRate();
}
if(command.isSavingsDepositAmountChanged()){
this.savingsDepositAmount=command.getSavingsDepositAmount();
if (command.isSavingsDepositAmountChanged()) {
this.savingsDepositAmount = command.getSavingsDepositAmount();
}
if (command.isSavingProductTypeChanged()) {
this.savingProductType=SavingProductType.fromInt(command.getSavingProductType());
this.savingProductType = SavingProductType.fromInt(command.getSavingProductType());
}
if(command.isTenureTypeChanged()){
this.tenureType=TenureTypeEnum.fromInt(command.getTenureType());
if (command.isTenureTypeChanged()) {
this.tenureType = TenureTypeEnum.fromInt(command.getTenureType());
}
if (command.isTenureChanged()) {
this.tenure = command.getTenure();
}
if (command.isFrequencyChanged()){
if (command.isFrequencyChanged()) {
this.frequency = SavingFrequencyType.fromInt(command.getFrequency());
}
@@ -150,7 +148,7 @@ public class SavingProductRelatedDetail {
this.interestType = SavingsInterestType.fromInt(command.getInterestType());
}
if (command.isInterestCalculationMethodChanged()){
if (command.isInterestCalculationMethodChanged()) {
this.interestCalculationMethod = SavingInterestCalculationMethod.fromInt(command.getInterestCalculationMethod());
}
@@ -162,16 +160,16 @@ public class SavingProductRelatedDetail {
this.isPartialDepositAllowed = command.isPartialDepositAllowed();
}
if (command.isLockinPeriodAllowedChanged()){
if (command.isLockinPeriodAllowedChanged()) {
this.isLockinPeriodAllowed = command.isLockinPeriodAllowed();
}
if (command.isLockinPeriodChanged()){
if (command.isLockinPeriodChanged()) {
this.lockinPeriod = command.getLockinPeriod();
}
if (command.isLockinPeriodTypeChanged()){
this.lockinPeriodType=PeriodFrequencyType.fromInt(command.getLockinPeriodType());
if (command.isLockinPeriodTypeChanged()) {
this.lockinPeriodType = PeriodFrequencyType.fromInt(command.getLockinPeriodType());
}
}
@@ -3,8 +3,6 @@ package org.mifosplatform.portfolio.savingsaccountproduct.domain;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
public interface SavingProductRepository extends
JpaRepository<SavingProduct, Long>,
JpaSpecificationExecutor<SavingProduct> {
public interface SavingProductRepository extends JpaRepository<SavingProduct, Long>, JpaSpecificationExecutor<SavingProduct> {
//
}
@@ -1,23 +1,21 @@
package org.mifosplatform.portfolio.savingsaccountproduct.domain;
public enum SavingProductType {
INVALID(0,"savingProductType.invalid"),
RECCURING(1,"savingProductType.reccuring"),
REGULAR(2,"savingProductType.regular");
INVALID(0, "savingProductType.invalid"), RECCURING(1, "savingProductType.reccuring"), REGULAR(2, "savingProductType.regular");
private final Integer value;
private final String code;
private SavingProductType(final Integer value,final String code) {
this.value=value;
this.code=code;
private SavingProductType(final Integer value, final String code) {
this.value = value;
this.code = code;
}
public Integer getValue() {
return value;
}
public String getCode() {
return code;
}
@@ -39,11 +37,11 @@ public enum SavingProductType {
return savingProductType;
}
public boolean isReccuring(){
public boolean isReccuring() {
return this.value.equals(SavingProductType.RECCURING.getValue());
}
public boolean isRegular(){
public boolean isRegular() {
return this.value.equals(SavingProductType.REGULAR.getValue());
}
@@ -1,23 +1,21 @@
package org.mifosplatform.portfolio.savingsaccountproduct.domain;
public enum SavingsInterestType {
INVALID(0,"savingsInterestType.invalid"),
SIMPLE(1,"savingsInterestType.simple"),
COMPOUNDING(2,"savingsInterestType.compounding");
INVALID(0, "savingsInterestType.invalid"), SIMPLE(1, "savingsInterestType.simple"), COMPOUNDING(2, "savingsInterestType.compounding");
private final Integer value;
private final String code;
private SavingsInterestType(final Integer value,final String code) {
this.value=value;
this.code=code;
private SavingsInterestType(final Integer value, final String code) {
this.value = value;
this.code = code;
}
public Integer getValue() {
return value;
}
public String getCode() {
return code;
}
@@ -1,6 +1,5 @@
package org.mifosplatform.portfolio.savingsaccountproduct.domain;
public enum SavingsLockinPeriodEnum {
DAYS(0, "lockin.period.type.days"), //
@@ -48,5 +47,4 @@ public enum SavingsLockinPeriodEnum {
return lockinPeriodType;
}
}
@@ -2,11 +2,9 @@ package org.mifosplatform.portfolio.savingsaccountproduct.exception;
import org.mifosplatform.infrastructure.core.exception.AbstractPlatformResourceNotFoundException;
public class SavingProductNotFoundException extends
AbstractPlatformResourceNotFoundException {
public class SavingProductNotFoundException extends AbstractPlatformResourceNotFoundException {
public SavingProductNotFoundException(Long id) {
super("error.msg.savingproduct.id.invalid", "Saving product with identifier " + id + " does not exist", id);
}
}
@@ -13,7 +13,7 @@ public class SavingProductCommandValidator {
private final SavingProductCommand command;
public SavingProductCommandValidator(final SavingProductCommand command) {
this.command=command;
this.command = command;
}
public void validateForUpdate() {
@@ -29,25 +29,31 @@ public class SavingProductCommandValidator {
baseDataValidator.reset().parameter("interestRate").value(command.getInterestRate()).ignoreIfNull().notBlank();
baseDataValidator.reset().parameter("minInterestRate").value(command.getMinInterestRate()).ignoreIfNull().notBlank();
baseDataValidator.reset().parameter("maxInterestRate").value(command.getMaxInterestRate()).ignoreIfNull().notBlank();
baseDataValidator.reset().parameter("minInterestRate").comapareMinAndMaxOfTwoBigDecmimalNos(command.getMinInterestRate(), command.getMaxInterestRate());
baseDataValidator.reset().parameter("interestRate").comapareMinAndMaxOfTwoBigDecmimalNos(command.getInterestRate(), command.getMaxInterestRate());
baseDataValidator.reset().parameter("minInterestRate").comapareMinAndMaxOfTwoBigDecmimalNos(command.getMinInterestRate(), command.getInterestRate());
baseDataValidator.reset().parameter("savingsDepositAmount").value(command.getSavingsDepositAmount()).ignoreIfNull().zeroOrPositiveAmount();
baseDataValidator.reset().parameter("minInterestRate")
.comapareMinAndMaxOfTwoBigDecmimalNos(command.getMinInterestRate(), command.getMaxInterestRate());
baseDataValidator.reset().parameter("interestRate")
.comapareMinAndMaxOfTwoBigDecmimalNos(command.getInterestRate(), command.getMaxInterestRate());
baseDataValidator.reset().parameter("minInterestRate")
.comapareMinAndMaxOfTwoBigDecmimalNos(command.getMinInterestRate(), command.getInterestRate());
baseDataValidator.reset().parameter("savingsDepositAmount").value(command.getSavingsDepositAmount()).ignoreIfNull()
.zeroOrPositiveAmount();
baseDataValidator.reset().parameter("savingProductType").value(command.getSavingProductType()).ignoreIfNull();
baseDataValidator.reset().parameter("tenureType").value(command.getTenureType()).ignoreIfNull();
baseDataValidator.reset().parameter("tenure").value(command.getTenure()).ignoreIfNull();
baseDataValidator.reset().parameter("frequency").value(command.getFrequency()).ignoreIfNull();
baseDataValidator.reset().parameter("interestType").value(command.getInterestType()).ignoreIfNull();
baseDataValidator.reset().parameter("interestCalculationMethod").value(command.getInterestCalculationMethod()).ignoreIfNull();
baseDataValidator.reset().parameter("minimumBalanceForWithdrawal").value(command.getMinimumBalanceForWithdrawal()).ignoreIfNull().zeroOrPositiveAmount();
baseDataValidator.reset().parameter("isPartialDepositAllowed").value(command.isPartialDepositAllowed()).trueOrFalseRequired(command.isPartialDepositAllowedChanged()).ignoreIfNull();
baseDataValidator.reset().parameter("isLockinPeriodAllowed").value(command.isLockinPeriodAllowed()).trueOrFalseRequired(command.isLockinPeriodAllowedChanged()).ignoreIfNull();
baseDataValidator.reset().parameter("minimumBalanceForWithdrawal").value(command.getMinimumBalanceForWithdrawal()).ignoreIfNull()
.zeroOrPositiveAmount();
baseDataValidator.reset().parameter("isPartialDepositAllowed").value(command.isPartialDepositAllowed())
.trueOrFalseRequired(command.isPartialDepositAllowedChanged()).ignoreIfNull();
baseDataValidator.reset().parameter("isLockinPeriodAllowed").value(command.isLockinPeriodAllowed())
.trueOrFalseRequired(command.isLockinPeriodAllowedChanged()).ignoreIfNull();
baseDataValidator.reset().parameter("lockinPeriod").value(command.getLockinPeriod()).ignoreIfNull();
baseDataValidator.reset().parameter("lockinPeriodType").value(command.getLockinPeriodType()).ignoreIfNull();
if (!dataValidationErrors.isEmpty()) {
throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors);
}
if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist",
"Validation errors exist.", dataValidationErrors); }
}
public void validateForCreate() {
@@ -62,24 +68,30 @@ public class SavingProductCommandValidator {
baseDataValidator.reset().parameter("interestRate").value(command.getInterestRate()).notNull().zeroOrPositiveAmount();
baseDataValidator.reset().parameter("minInterestRate").value(command.getMinInterestRate()).notNull().zeroOrPositiveAmount();
baseDataValidator.reset().parameter("maxInterestRate").value(command.getMaxInterestRate()).notNull().zeroOrPositiveAmount();
baseDataValidator.reset().parameter("minInterestRate").comapareMinAndMaxOfTwoBigDecmimalNos(command.getMinInterestRate(), command.getMaxInterestRate());
baseDataValidator.reset().parameter("interestRate").comapareMinAndMaxOfTwoBigDecmimalNos(command.getInterestRate(), command.getMaxInterestRate());
baseDataValidator.reset().parameter("minInterestRate").comapareMinAndMaxOfTwoBigDecmimalNos(command.getMinInterestRate(), command.getInterestRate());
baseDataValidator.reset().parameter("savingsDepositAmount").value(command.getSavingsDepositAmount()).notNull().zeroOrPositiveAmount();
baseDataValidator.reset().parameter("minInterestRate")
.comapareMinAndMaxOfTwoBigDecmimalNos(command.getMinInterestRate(), command.getMaxInterestRate());
baseDataValidator.reset().parameter("interestRate")
.comapareMinAndMaxOfTwoBigDecmimalNos(command.getInterestRate(), command.getMaxInterestRate());
baseDataValidator.reset().parameter("minInterestRate")
.comapareMinAndMaxOfTwoBigDecmimalNos(command.getMinInterestRate(), command.getInterestRate());
baseDataValidator.reset().parameter("savingsDepositAmount").value(command.getSavingsDepositAmount()).notNull()
.zeroOrPositiveAmount();
baseDataValidator.reset().parameter("savingProductType").value(command.getSavingProductType()).notNull();
baseDataValidator.reset().parameter("tenureType").value(command.getTenureType()).notNull();
baseDataValidator.reset().parameter("tenure").value(command.getTenure()).notNull();
baseDataValidator.reset().parameter("frequency").value(command.getFrequency()).notNull();
baseDataValidator.reset().parameter("interestType").value(command.getInterestType()).notNull();
baseDataValidator.reset().parameter("interestCalculationMethod").value(command.getInterestCalculationMethod()).notNull();
baseDataValidator.reset().parameter("minimumBalanceForWithdrawal").value(command.getMinimumBalanceForWithdrawal()).notNull().zeroOrPositiveAmount();
baseDataValidator.reset().parameter("isPartialDepositAllowed").value(command.isPartialDepositAllowed()).trueOrFalseRequired(command.isPartialDepositAllowedChanged()).notNull();
baseDataValidator.reset().parameter("isLockinPeriodAllowed").value(command.isLockinPeriodAllowed()).trueOrFalseRequired(command.isLockinPeriodAllowedChanged()).notNull();
baseDataValidator.reset().parameter("minimumBalanceForWithdrawal").value(command.getMinimumBalanceForWithdrawal()).notNull()
.zeroOrPositiveAmount();
baseDataValidator.reset().parameter("isPartialDepositAllowed").value(command.isPartialDepositAllowed())
.trueOrFalseRequired(command.isPartialDepositAllowedChanged()).notNull();
baseDataValidator.reset().parameter("isLockinPeriodAllowed").value(command.isLockinPeriodAllowed())
.trueOrFalseRequired(command.isLockinPeriodAllowedChanged()).notNull();
baseDataValidator.reset().parameter("lockinPeriod").value(command.getLockinPeriod()).notNull();
baseDataValidator.reset().parameter("lockinPeriodType").value(command.getLockinPeriodType()).notNull();
if (!dataValidationErrors.isEmpty()) {
throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors);
}
if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist",
"Validation errors exist.", dataValidationErrors); }
}
}
@@ -30,7 +30,7 @@ public class SavingProductEnumerations {
return savingInterestCalculationMethod(SavingInterestCalculationMethod.fromInt(id));
}
public static EnumOptionData savingsLockinPeriod(final int id){
public static EnumOptionData savingsLockinPeriod(final int id) {
return savingsLockinPeriod(SavingsLockinPeriodEnum.fromInt(id));
}
@@ -39,19 +39,24 @@ public class SavingProductEnumerations {
EnumOptionData optionData = null;
switch (type) {
case DAYS:
optionData = new EnumOptionData(SavingsLockinPeriodEnum.DAYS.getValue().longValue(), codePrefix+SavingsLockinPeriodEnum.DAYS.getCode(), "Days");
optionData = new EnumOptionData(SavingsLockinPeriodEnum.DAYS.getValue().longValue(), codePrefix
+ SavingsLockinPeriodEnum.DAYS.getCode(), "Days");
break;
case MONTHS:
optionData = new EnumOptionData(SavingsLockinPeriodEnum.MONTHS.getValue().longValue(), codePrefix+SavingsLockinPeriodEnum.MONTHS.getCode(), "Months");
optionData = new EnumOptionData(SavingsLockinPeriodEnum.MONTHS.getValue().longValue(), codePrefix
+ SavingsLockinPeriodEnum.MONTHS.getCode(), "Months");
break;
case WEEKS:
optionData = new EnumOptionData(SavingsLockinPeriodEnum.WEEKS.getValue().longValue(), codePrefix+SavingsLockinPeriodEnum.WEEKS.getCode(), "Weeks");
optionData = new EnumOptionData(SavingsLockinPeriodEnum.WEEKS.getValue().longValue(), codePrefix
+ SavingsLockinPeriodEnum.WEEKS.getCode(), "Weeks");
break;
case YEARS:
optionData = new EnumOptionData(SavingsLockinPeriodEnum.YEARS.getValue().longValue(), codePrefix+SavingsLockinPeriodEnum.YEARS.getCode(), "Years");
optionData = new EnumOptionData(SavingsLockinPeriodEnum.YEARS.getValue().longValue(), codePrefix
+ SavingsLockinPeriodEnum.YEARS.getCode(), "Years");
break;
default:
optionData = new EnumOptionData(SavingsLockinPeriodEnum.INVALID.getValue().longValue(), codePrefix+SavingsLockinPeriodEnum.INVALID.getCode(), "Invalid");
optionData = new EnumOptionData(SavingsLockinPeriodEnum.INVALID.getValue().longValue(), codePrefix
+ SavingsLockinPeriodEnum.INVALID.getCode(), "Invalid");
break;
}
return optionData;
@@ -62,19 +67,24 @@ public class SavingProductEnumerations {
EnumOptionData optionData = null;
switch (type) {
case MINBAL:
optionData = new EnumOptionData(SavingInterestCalculationMethod.MINBAL.getValue().longValue(), codePrefix+SavingInterestCalculationMethod.MINBAL.getCode(), "Minimumbalance");
optionData = new EnumOptionData(SavingInterestCalculationMethod.MINBAL.getValue().longValue(), codePrefix
+ SavingInterestCalculationMethod.MINBAL.getCode(), "Minimumbalance");
break;
case AVERAGEBAL:
optionData = new EnumOptionData(SavingInterestCalculationMethod.AVERAGEBAL.getValue().longValue(), codePrefix+SavingInterestCalculationMethod.AVERAGEBAL.getCode(), "AverageBalance");
optionData = new EnumOptionData(SavingInterestCalculationMethod.AVERAGEBAL.getValue().longValue(), codePrefix
+ SavingInterestCalculationMethod.AVERAGEBAL.getCode(), "AverageBalance");
break;
case INVALID:
optionData = new EnumOptionData(SavingInterestCalculationMethod.INVALID.getValue().longValue(), codePrefix+SavingInterestCalculationMethod.INVALID.getCode(), "Invalid");
optionData = new EnumOptionData(SavingInterestCalculationMethod.INVALID.getValue().longValue(), codePrefix
+ SavingInterestCalculationMethod.INVALID.getCode(), "Invalid");
break;
case MONTHLYCOLLECTION:
optionData = new EnumOptionData(SavingInterestCalculationMethod.MONTHLYCOLLECTION.getValue().longValue(), codePrefix+SavingInterestCalculationMethod.MONTHLYCOLLECTION.getCode(), "MonthlyCollection");
optionData = new EnumOptionData(SavingInterestCalculationMethod.MONTHLYCOLLECTION.getValue().longValue(), codePrefix
+ SavingInterestCalculationMethod.MONTHLYCOLLECTION.getCode(), "MonthlyCollection");
break;
default:
optionData = new EnumOptionData(SavingInterestCalculationMethod.INVALID.getValue().longValue(), codePrefix+SavingInterestCalculationMethod.INVALID.getCode(), "Invalid");
optionData = new EnumOptionData(SavingInterestCalculationMethod.INVALID.getValue().longValue(), codePrefix
+ SavingInterestCalculationMethod.INVALID.getCode(), "Invalid");
break;
}
return optionData;
@@ -85,13 +95,16 @@ public class SavingProductEnumerations {
EnumOptionData optionData = null;
switch (type) {
case COMPOUNDING:
optionData = new EnumOptionData(SavingsInterestType.COMPOUNDING.getValue().longValue(), codePrefix+SavingsInterestType.COMPOUNDING.getCode(), "Compounding");
optionData = new EnumOptionData(SavingsInterestType.COMPOUNDING.getValue().longValue(), codePrefix
+ SavingsInterestType.COMPOUNDING.getCode(), "Compounding");
break;
case SIMPLE:
optionData = new EnumOptionData(SavingsInterestType.SIMPLE.getValue().longValue(), codePrefix+SavingsInterestType.SIMPLE.getCode(), "Simple");
optionData = new EnumOptionData(SavingsInterestType.SIMPLE.getValue().longValue(), codePrefix
+ SavingsInterestType.SIMPLE.getCode(), "Simple");
break;
default:
optionData = new EnumOptionData(SavingsInterestType.INVALID.getValue().longValue(), codePrefix+SavingsInterestType.INVALID.getCode(), "Invalid");
optionData = new EnumOptionData(SavingsInterestType.INVALID.getValue().longValue(), codePrefix
+ SavingsInterestType.INVALID.getCode(), "Invalid");
break;
}
return optionData;
@@ -102,22 +115,28 @@ public class SavingProductEnumerations {
EnumOptionData optionData = null;
switch (type) {
case DAILY:
optionData = new EnumOptionData(SavingFrequencyType.DAILY.getValue().longValue(), codePrefix + SavingFrequencyType.DAILY.getCode(), "Days");
optionData = new EnumOptionData(SavingFrequencyType.DAILY.getValue().longValue(), codePrefix
+ SavingFrequencyType.DAILY.getCode(), "Days");
break;
case MONTHLY:
optionData = new EnumOptionData(SavingFrequencyType.MONTHLY.getValue().longValue(), codePrefix + SavingFrequencyType.MONTHLY.getCode(), "Weeks");
optionData = new EnumOptionData(SavingFrequencyType.MONTHLY.getValue().longValue(), codePrefix
+ SavingFrequencyType.MONTHLY.getCode(), "Weeks");
break;
case QUATERLY:
optionData = new EnumOptionData(SavingFrequencyType.QUATERLY.getValue().longValue(), codePrefix + SavingFrequencyType.QUATERLY.getCode(), "Months");
optionData = new EnumOptionData(SavingFrequencyType.QUATERLY.getValue().longValue(), codePrefix
+ SavingFrequencyType.QUATERLY.getCode(), "Months");
break;
case HALFYEARLY:
optionData = new EnumOptionData(SavingFrequencyType.HALFYEARLY.getValue().longValue(), codePrefix + SavingFrequencyType.HALFYEARLY.getCode(), "Months");
optionData = new EnumOptionData(SavingFrequencyType.HALFYEARLY.getValue().longValue(), codePrefix
+ SavingFrequencyType.HALFYEARLY.getCode(), "Months");
break;
case YEARLY:
optionData = new EnumOptionData(SavingFrequencyType.YEARLY.getValue().longValue(), codePrefix + SavingFrequencyType.YEARLY.getCode(), "Yearly");
optionData = new EnumOptionData(SavingFrequencyType.YEARLY.getValue().longValue(), codePrefix
+ SavingFrequencyType.YEARLY.getCode(), "Yearly");
break;
default:
optionData = new EnumOptionData(SavingFrequencyType.INVALID.getValue().longValue(), SavingFrequencyType.INVALID.getCode(), "Invalid");
optionData = new EnumOptionData(SavingFrequencyType.INVALID.getValue().longValue(), SavingFrequencyType.INVALID.getCode(),
"Invalid");
break;
}
return optionData;
@@ -128,13 +147,16 @@ public class SavingProductEnumerations {
EnumOptionData optionData = null;
switch (type) {
case FIXED_PERIOD:
optionData = new EnumOptionData(TenureTypeEnum.FIXED_PERIOD.getValue().longValue(), codePrefix+TenureTypeEnum.FIXED_PERIOD.getCode(), "FixedPeriod");
optionData = new EnumOptionData(TenureTypeEnum.FIXED_PERIOD.getValue().longValue(), codePrefix
+ TenureTypeEnum.FIXED_PERIOD.getCode(), "FixedPeriod");
break;
case PERPETUAL:
optionData = new EnumOptionData(TenureTypeEnum.PERPETUAL.getValue().longValue(), codePrefix+TenureTypeEnum.PERPETUAL.getCode(), "Perpetual");
optionData = new EnumOptionData(TenureTypeEnum.PERPETUAL.getValue().longValue(), codePrefix
+ TenureTypeEnum.PERPETUAL.getCode(), "Perpetual");
break;
default:
optionData = new EnumOptionData(TenureTypeEnum.INVALID.getValue().longValue(), codePrefix+TenureTypeEnum.INVALID.getCode(), "Invalid");
optionData = new EnumOptionData(TenureTypeEnum.INVALID.getValue().longValue(), codePrefix
+ TenureTypeEnum.INVALID.getCode(), "Invalid");
break;
}
return optionData;
@@ -145,16 +167,20 @@ public class SavingProductEnumerations {
EnumOptionData optionData = null;
switch (type) {
case RECCURING:
optionData = new EnumOptionData(SavingProductType.RECCURING.getValue().longValue(), codePrefix + SavingProductType.RECCURING.getCode(), "Reccuring");
optionData = new EnumOptionData(SavingProductType.RECCURING.getValue().longValue(), codePrefix
+ SavingProductType.RECCURING.getCode(), "Reccuring");
break;
case REGULAR:
optionData = new EnumOptionData(SavingProductType.REGULAR.getValue().longValue(), codePrefix + SavingProductType.REGULAR.getCode(), "Regular");
optionData = new EnumOptionData(SavingProductType.REGULAR.getValue().longValue(), codePrefix
+ SavingProductType.REGULAR.getCode(), "Regular");
break;
case INVALID:
optionData = new EnumOptionData(SavingProductType.INVALID.getValue().longValue(), codePrefix + SavingProductType.INVALID.getCode(), "Invalid");
optionData = new EnumOptionData(SavingProductType.INVALID.getValue().longValue(), codePrefix
+ SavingProductType.INVALID.getCode(), "Invalid");
break;
default:
optionData = new EnumOptionData(SavingProductType.INVALID.getValue().longValue(), SavingProductType.INVALID.getCode(), "Invalid");
optionData = new EnumOptionData(SavingProductType.INVALID.getValue().longValue(), SavingProductType.INVALID.getCode(),
"Invalid");
break;
}
return optionData;
@@ -25,19 +25,19 @@ import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Service;
@Service
public class SavingProductReadPlatformServiceImpl implements
SavingProductReadPlatformService {
public class SavingProductReadPlatformServiceImpl implements SavingProductReadPlatformService {
private final PlatformSecurityContext context;
private final JdbcTemplate jdbcTemplate;
private final CurrencyReadPlatformService currencyReadPlatformService;
@Autowired
public SavingProductReadPlatformServiceImpl(final PlatformSecurityContext context,final TenantAwareRoutingDataSource dataSource,final CurrencyReadPlatformService currencyReadPlatformService) {
public SavingProductReadPlatformServiceImpl(final PlatformSecurityContext context, final TenantAwareRoutingDataSource dataSource,
final CurrencyReadPlatformService currencyReadPlatformService) {
this.context=context;
jdbcTemplate=new JdbcTemplate(dataSource);
this.currencyReadPlatformService=currencyReadPlatformService;
this.context = context;
jdbcTemplate = new JdbcTemplate(dataSource);
this.currencyReadPlatformService = currencyReadPlatformService;
}
@Override
@@ -45,11 +45,11 @@ public class SavingProductReadPlatformServiceImpl implements
this.context.authenticatedUser();
SavingProductMapper savingProductMapper=new SavingProductMapper();
SavingProductMapper savingProductMapper = new SavingProductMapper();
String sql = "select " + savingProductMapper.savingProductSchema() + " where sp.is_deleted=0";
return this.jdbcTemplate.query(sql,savingProductMapper, new Object[]{});
return this.jdbcTemplate.query(sql, savingProductMapper, new Object[] {});
}
@@ -58,22 +58,20 @@ public class SavingProductReadPlatformServiceImpl implements
this.context.authenticatedUser();
SavingProductLookupMapper savingProductLookupMapper=new SavingProductLookupMapper();
SavingProductLookupMapper savingProductLookupMapper = new SavingProductLookupMapper();
String sql="select"+savingProductLookupMapper.savingProductLookupSchema();
String sql = "select" + savingProductLookupMapper.savingProductLookupSchema();
return this.jdbcTemplate.query(sql, savingProductLookupMapper, new Object[]{});
return this.jdbcTemplate.query(sql, savingProductLookupMapper, new Object[] {});
}
@Override
public SavingProductData retrieveSavingProduct(Long savingProductId) {
try{
try {
this.context.authenticatedUser();
SavingProductMapper savingProductMapper=new SavingProductMapper();
String sql = "select " + savingProductMapper.savingProductSchema()
+ " where sp.id = ? and sp.is_deleted=0";
SavingProductData productData = this.jdbcTemplate.queryForObject(sql,
savingProductMapper, new Object[] { savingProductId });
SavingProductMapper savingProductMapper = new SavingProductMapper();
String sql = "select " + savingProductMapper.savingProductSchema() + " where sp.id = ? and sp.is_deleted=0";
SavingProductData productData = this.jdbcTemplate.queryForObject(sql, savingProductMapper, new Object[] { savingProductId });
populateProductDataWithDropdownOptions(productData);
@@ -86,7 +84,7 @@ public class SavingProductReadPlatformServiceImpl implements
@Override
public SavingProductData retrieveNewSavingProductDetails() {
SavingProductData productData=new SavingProductData();
SavingProductData productData = new SavingProductData();
populateProductDataWithDropdownOptions(productData);
@@ -95,7 +93,7 @@ public class SavingProductReadPlatformServiceImpl implements
private static final class SavingProductMapper implements RowMapper<SavingProductData> {
public String savingProductSchema(){
public String savingProductSchema() {
return "sp.id as id,sp.name as name, sp.description as description,sp.currency_code as currencyCode, sp.currency_digits as currencyDigits,sp.interest_rate as interestRate, "
+ "sp.min_interest_rate as minInterestRate, sp.max_interest_rate as maxInterstRate, "
+ " sp.savings_deposit_amount as savingsDepositAmount, sp.savings_product_type as savingProductType, sp.tenure_type as tenureType, sp.tenure as tenure, sp.frequency as frequency, "
@@ -107,8 +105,7 @@ public class SavingProductReadPlatformServiceImpl implements
}
@Override
public SavingProductData mapRow(ResultSet rs, @SuppressWarnings("unused") int rowNum)
throws SQLException {
public SavingProductData mapRow(ResultSet rs, @SuppressWarnings("unused") int rowNum) throws SQLException {
Long id = rs.getLong("id");
String name = rs.getString("name");
@@ -118,9 +115,10 @@ public class SavingProductReadPlatformServiceImpl implements
String currencyName = rs.getString("currencyName");
String currencyNameCode = rs.getString("currencyNameCode");
String currencyDisplaySymbol = rs.getString("currencyDisplaySymbol");
Integer currencyDigits = JdbcSupport.getInteger(rs,"currencyDigits");
Integer currencyDigits = JdbcSupport.getInteger(rs, "currencyDigits");
CurrencyData currencyData = new CurrencyData(currencyCode,currencyName, currencyDigits, currencyDisplaySymbol,currencyNameCode);
CurrencyData currencyData = new CurrencyData(currencyCode, currencyName, currencyDigits, currencyDisplaySymbol,
currencyNameCode);
BigDecimal interestRate = rs.getBigDecimal("interestRate");
BigDecimal minInterestRate = rs.getBigDecimal("minInterestRate");
BigDecimal maxInterestRate = rs.getBigDecimal("maxInterstRate");
@@ -128,35 +126,37 @@ public class SavingProductReadPlatformServiceImpl implements
DateTime createdOn = JdbcSupport.getDateTime(rs, "createdon");
DateTime lastModifedOn = JdbcSupport.getDateTime(rs, "modifiedon");
BigDecimal savingsDepositAmount=rs.getBigDecimal("savingsDepositAmount");
EnumOptionData savingProductTypeEnum=SavingProductEnumerations.savingProductType(SavingProductType.fromInt(JdbcSupport.getInteger(rs, "savingProductType")));
BigDecimal savingsDepositAmount = rs.getBigDecimal("savingsDepositAmount");
EnumOptionData savingProductTypeEnum = SavingProductEnumerations.savingProductType(SavingProductType.fromInt(JdbcSupport
.getInteger(rs, "savingProductType")));
EnumOptionData tenureTypeEnum = SavingProductEnumerations.tenureTypeEnum(JdbcSupport.getInteger(rs, "tenureType"));
Integer tenure = JdbcSupport.getInteger(rs, "tenure");
EnumOptionData savingFrequencyType = SavingProductEnumerations.interestFrequencyType(JdbcSupport.getInteger(rs, "frequency"));
EnumOptionData savingInterestType = SavingProductEnumerations.savingInterestType(JdbcSupport.getInteger(rs, "interestType"));
EnumOptionData interestCalculationMethodEnum=SavingProductEnumerations.savingInterestCalculationMethod(JdbcSupport.getInteger(rs, "interestCalculationMethod"));
BigDecimal minimumBalanceForWithdrawal=rs.getBigDecimal("minimumBalanceForWithdrawal");
EnumOptionData interestCalculationMethodEnum = SavingProductEnumerations.savingInterestCalculationMethod(JdbcSupport
.getInteger(rs, "interestCalculationMethod"));
BigDecimal minimumBalanceForWithdrawal = rs.getBigDecimal("minimumBalanceForWithdrawal");
boolean isPartialDepositAllowed = rs.getBoolean("isPartialDepositAllowed");
boolean isLockinPeriodAllowed =rs.getBoolean("isLockinPeriodAllowed");
Integer lockinPeriod=JdbcSupport.getInteger(rs, "lockinPeriod");
EnumOptionData lockinPeriodType= SavingsDepositEnumerations.interestCompoundingPeriodType(PeriodFrequencyType.fromInt(JdbcSupport.getInteger(rs, "lockinPeriodType")));
boolean isLockinPeriodAllowed = rs.getBoolean("isLockinPeriodAllowed");
Integer lockinPeriod = JdbcSupport.getInteger(rs, "lockinPeriod");
EnumOptionData lockinPeriodType = SavingsDepositEnumerations.interestCompoundingPeriodType(PeriodFrequencyType
.fromInt(JdbcSupport.getInteger(rs, "lockinPeriodType")));
return new SavingProductData(createdOn, lastModifedOn, id, name, description, interestRate, minInterestRate, maxInterestRate, currencyData, currencyDigits, savingsDepositAmount,
savingProductTypeEnum, tenureTypeEnum, tenure, savingFrequencyType, savingInterestType, interestCalculationMethodEnum,
minimumBalanceForWithdrawal, isPartialDepositAllowed, isLockinPeriodAllowed, lockinPeriod, lockinPeriodType);
return new SavingProductData(createdOn, lastModifedOn, id, name, description, interestRate, minInterestRate, maxInterestRate,
currencyData, currencyDigits, savingsDepositAmount, savingProductTypeEnum, tenureTypeEnum, tenure, savingFrequencyType,
savingInterestType, interestCalculationMethodEnum, minimumBalanceForWithdrawal, isPartialDepositAllowed,
isLockinPeriodAllowed, lockinPeriod, lockinPeriodType);
}
}
private static final class SavingProductLookupMapper implements
RowMapper<SavingProductLookup> {
private static final class SavingProductLookupMapper implements RowMapper<SavingProductLookup> {
public String savingProductLookupSchema() {
return "sp.id as id, sp.name as name from m_product_savings sp";
}
@Override
public SavingProductLookup mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum)
throws SQLException {
public SavingProductLookup mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException {
Long id = rs.getLong("id");
String name = rs.getString("name");
@@ -165,6 +165,7 @@ public class SavingProductReadPlatformServiceImpl implements
}
}
private void populateProductDataWithDropdownOptions(final SavingProductData productData) {
List<CurrencyData> currencyOptions = currencyReadPlatformService.retrieveAllowedCurrencies();
@@ -25,9 +25,10 @@ public class SavingProductWritePlatformServiceJpaRepositoryImpl implements Savin
private final SavingProductRepository savingProductRepository;
@Autowired
public SavingProductWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, final SavingProductRepository savingProductRepository) {
this.context=context;
this.savingProductRepository=savingProductRepository;
public SavingProductWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context,
final SavingProductRepository savingProductRepository) {
this.context = context;
this.savingProductRepository = savingProductRepository;
}
@Transactional
@@ -35,21 +36,23 @@ public class SavingProductWritePlatformServiceJpaRepositoryImpl implements Savin
public EntityIdentifier createSavingProduct(final SavingProductCommand command) {
this.context.authenticatedUser();
SavingProductCommandValidator validator=new SavingProductCommandValidator(command);
SavingProductCommandValidator validator = new SavingProductCommandValidator(command);
validator.validateForCreate();
SavingProductType savingProductType = SavingProductType.fromInt(command.getSavingProductType());
TenureTypeEnum tenureType = TenureTypeEnum.fromInt(command.getTenureType());
SavingFrequencyType savingFrequencyType=SavingFrequencyType.fromInt(command.getFrequency());
SavingFrequencyType savingFrequencyType = SavingFrequencyType.fromInt(command.getFrequency());
SavingsInterestType interestType = SavingsInterestType.fromInt(command.getInterestType());
PeriodFrequencyType lockinPeriodType = PeriodFrequencyType.fromInt(command.getLockinPeriodType());
SavingInterestCalculationMethod savingInterestCalculationMethod=SavingInterestCalculationMethod.fromInt(command.getInterestCalculationMethod());
SavingInterestCalculationMethod savingInterestCalculationMethod = SavingInterestCalculationMethod.fromInt(command
.getInterestCalculationMethod());
MonetaryCurrency currency = new MonetaryCurrency(command.getCurrencyCode(), command.getDigitsAfterDecimal());
SavingProduct product = new SavingProduct(command.getName(), command.getDescription(), currency, command.getInterestRate(), command.getMinInterestRate(), command.getMaxInterestRate(),
command.getSavingsDepositAmount(), savingProductType, tenureType, command.getTenure(), savingFrequencyType, interestType,
savingInterestCalculationMethod, command.getMinimumBalanceForWithdrawal(), command.isPartialDepositAllowed(),
command.isLockinPeriodAllowed(), command.getLockinPeriod(), lockinPeriodType);
SavingProduct product = new SavingProduct(command.getName(), command.getDescription(), currency, command.getInterestRate(),
command.getMinInterestRate(), command.getMaxInterestRate(), command.getSavingsDepositAmount(), savingProductType,
tenureType, command.getTenure(), savingFrequencyType, interestType, savingInterestCalculationMethod,
command.getMinimumBalanceForWithdrawal(), command.isPartialDepositAllowed(), command.isLockinPeriodAllowed(),
command.getLockinPeriod(), lockinPeriodType);
this.savingProductRepository.save(product);
return new EntityIdentifier(product.getId());
@@ -60,13 +63,11 @@ public class SavingProductWritePlatformServiceJpaRepositoryImpl implements Savin
public EntityIdentifier updateSavingProduct(final SavingProductCommand command) {
this.context.authenticatedUser();
SavingProductCommandValidator validator=new SavingProductCommandValidator(command);
SavingProductCommandValidator validator = new SavingProductCommandValidator(command);
validator.validateForUpdate();
SavingProduct product=this.savingProductRepository.findOne(command.getId());
if (product == null) {
throw new SavingProductNotFoundException(command.getId());
}
SavingProduct product = this.savingProductRepository.findOne(command.getId());
if (product == null) { throw new SavingProductNotFoundException(command.getId()); }
product.update(command);
this.savingProductRepository.save(product);
return new EntityIdentifier(Long.valueOf(product.getId()));
@@ -77,14 +78,11 @@ public class SavingProductWritePlatformServiceJpaRepositoryImpl implements Savin
public EntityIdentifier deleteSavingProduct(Long productId) {
this.context.authenticatedUser();
SavingProduct product=this.savingProductRepository.findOne(productId);
if (product==null || product.isDeleted()) {
throw new SavingsProductNotFoundException(productId);
}
SavingProduct product = this.savingProductRepository.findOne(productId);
if (product == null || product.isDeleted()) { throw new SavingsProductNotFoundException(productId); }
product.delete();
this.savingProductRepository.save(product);
return new EntityIdentifier(Long.valueOf(product.getId()));
}
}
@@ -14,16 +14,20 @@ public class SavingsDepositEnumerations {
EnumOptionData optionData = null;
switch (type) {
case DAYS:
optionData = new EnumOptionData(PeriodFrequencyType.DAYS.getValue().longValue(), codePrefix + PeriodFrequencyType.DAYS.getCode(), "Days");
optionData = new EnumOptionData(PeriodFrequencyType.DAYS.getValue().longValue(), codePrefix
+ PeriodFrequencyType.DAYS.getCode(), "Days");
break;
case WEEKS:
optionData = new EnumOptionData(PeriodFrequencyType.WEEKS.getValue().longValue(), codePrefix + PeriodFrequencyType.WEEKS.getCode(), "Weeks");
optionData = new EnumOptionData(PeriodFrequencyType.WEEKS.getValue().longValue(), codePrefix
+ PeriodFrequencyType.WEEKS.getCode(), "Weeks");
break;
case MONTHS:
optionData = new EnumOptionData(PeriodFrequencyType.MONTHS.getValue().longValue(), codePrefix + PeriodFrequencyType.MONTHS.getCode(), "Months");
optionData = new EnumOptionData(PeriodFrequencyType.MONTHS.getValue().longValue(), codePrefix
+ PeriodFrequencyType.MONTHS.getCode(), "Months");
break;
default:
optionData = new EnumOptionData(PeriodFrequencyType.INVALID.getValue().longValue(), PeriodFrequencyType.INVALID.getCode(), "Invalid");
optionData = new EnumOptionData(PeriodFrequencyType.INVALID.getValue().longValue(), PeriodFrequencyType.INVALID.getCode(),
"Invalid");
break;
}
return optionData;
@@ -259,13 +259,13 @@ public class DepositAccountsApiResource {
private boolean is(final String commandParam, final String commandValue) {
return StringUtils.isNotBlank(commandParam) && commandParam.trim().equalsIgnoreCase(commandValue);
}
@POST
@Path("postinterest")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public Response postInterest(){
public Response postInterest() {
Collection<DepositAccountsForLookup> accounts = this.depositAccountReadPlatformService.retrieveDepositAccountForLookup();
@SuppressWarnings("unused")
EntityIdentifier entityIdentifier = this.depositAccountWritePlatformService.postInterestToDepositAccount(accounts);
return Response.ok().entity(entityIdentifier).build();
@@ -244,7 +244,7 @@ public class DepositAccountData {
final boolean preClosureAllowed, final BigDecimal preClosureInterestRate, final LocalDate withdrawnonDate,
final LocalDate rejectedonDate, final LocalDate closedonDate, final boolean isInterestWithdrawable,
final BigDecimal interestPaid, final boolean interestCompoundingAllowed, final boolean isLockinPeriodAllowed,
final Integer lockinPeriod, final EnumOptionData lockinPeriodType,final BigDecimal availableInterest,
final Integer lockinPeriod, final EnumOptionData lockinPeriodType, final BigDecimal availableInterest,
final BigDecimal interestPostedAmount, final LocalDate lastInterestPostedDate, final LocalDate nextInterestPostedDate) {
this.id = id;
this.externalId = externalId;
@@ -523,21 +523,26 @@ public class DepositAccountData {
public LocalDate getNextInterestPostedDate() {
return this.nextInterestPostedDate;
}
private BigDecimal determineAvailableInterestForWithdrawal(final DepositAccountData account) {
BigDecimal availableInterestForWithdrawal = BigDecimal.ZERO;
if(this.status!=null){
if (this.status != null) {
if (account.getStatus().getId() == 300) {
BigDecimal interestGettingForPeriod = BigDecimal.valueOf(account.getActualInterestAccrued().doubleValue()/ new Double(account.getTenureInMonths()));
LocalDate interestWithdrawingDate= new LocalDate().isBefore(getMaturedOn())?new LocalDate():getMaturedOn().plusDays(1);
Integer noOfMonthsforInterestCal = Months.monthsBetween(account.getActualCommencementDate(), interestWithdrawingDate).getMonths();
Integer noOfPeriods = noOfMonthsforInterestCal/ account.getInterestCompoundedEvery();
BigDecimal interestGettingForPeriod = BigDecimal.valueOf(account.getActualInterestAccrued().doubleValue()
/ new Double(account.getTenureInMonths()));
LocalDate interestWithdrawingDate = new LocalDate().isBefore(getMaturedOn()) ? new LocalDate() : getMaturedOn().plusDays(1);
Integer noOfMonthsforInterestCal = Months.monthsBetween(account.getActualCommencementDate(), interestWithdrawingDate)
.getMonths();
Integer noOfPeriods = noOfMonthsforInterestCal / account.getInterestCompoundedEvery();
availableInterestForWithdrawal = BigDecimal.valueOf(interestGettingForPeriod.multiply(new BigDecimal(noOfPeriods)).doubleValue()- account.getInterestPaid().doubleValue());
}else {
availableInterestForWithdrawal = BigDecimal.valueOf(interestGettingForPeriod.multiply(new BigDecimal(noOfPeriods))
.doubleValue() - account.getInterestPaid().doubleValue());
} else {
return BigDecimal.ZERO;
}
}else return BigDecimal.ZERO;
} else
return BigDecimal.ZERO;
return availableInterestForWithdrawal;
}
@@ -545,30 +550,36 @@ public class DepositAccountData {
private BigDecimal determineAvalableWithdrawalAmount(final DepositAccountData account) {
BigDecimal avalablePreclosureWithdrawalAmount = BigDecimal.ZERO;
if(this.status != null){
if (this.status != null) {
if (account.getStatus().getId() == 300) {
// if(new LocalDate().isBefore(account.getMaturedOn()) || new LocalDate().isEqual(account.getMaturedOn())){
// if(new LocalDate().isBefore(account.getMaturedOn()) || new
// LocalDate().isEqual(account.getMaturedOn())){
Integer days = Days.daysBetween(account.getLastInterestPostedDate(), new LocalDate()).getDays();
avalablePreclosureWithdrawalAmount=account.getAvailableInterest().add(account.getDeposit()).add(determineRemainInerestAmount(account.getDeposit(), account.getPreClosureInterestRate(), days));
avalablePreclosureWithdrawalAmount = account.getAvailableInterest().add(account.getDeposit())
.add(determineRemainInerestAmount(account.getDeposit(), account.getPreClosureInterestRate(), days));
// }else if(new LocalDate().isAfter(account.getMaturedOn())){
// Integer days = Days.daysBetween(account.getLastInterestPostedDate(), new LocalDate()).getDays();
// avalablePreclosureWithdrawalAmount=account.getAvailableInterest().add(account.getDeposit()).add(determineRemainInerestAmount(account.getDeposit(), account.getPreClosureInterestRate(), days));
// Integer days =
// Days.daysBetween(account.getLastInterestPostedDate(), new
// LocalDate()).getDays();
// avalablePreclosureWithdrawalAmount=account.getAvailableInterest().add(account.getDeposit()).add(determineRemainInerestAmount(account.getDeposit(),
// account.getPreClosureInterestRate(), days));
// }
}else{
avalablePreclosureWithdrawalAmount=account.getDeposit();
} else {
avalablePreclosureWithdrawalAmount = account.getDeposit();
}
}
return avalablePreclosureWithdrawalAmount;
}
private BigDecimal determineRemainInerestAmount(final BigDecimal depsoitAmount, final BigDecimal interstRateApplicable, final Integer days){
private BigDecimal determineRemainInerestAmount(final BigDecimal depsoitAmount, final BigDecimal interstRateApplicable,
final Integer days) {
MathContext mc = new MathContext(8, RoundingMode.HALF_EVEN);
Integer daysInYear = 365;
BigDecimal interestRateAsFraction = interstRateApplicable.divide(BigDecimal.valueOf(100), mc);
BigDecimal interestRateForOneDay = interestRateAsFraction.divide(BigDecimal.valueOf(daysInYear.doubleValue()), mc);
return BigDecimal.valueOf(depsoitAmount.doubleValue()*days.doubleValue()*interestRateForOneDay.doubleValue());
return BigDecimal.valueOf(depsoitAmount.doubleValue() * days.doubleValue() * interestRateForOneDay.doubleValue());
}
}
@@ -18,9 +18,8 @@ public class DepositAccountTransactionData {
private final BigDecimal interestAmount;
private final BigDecimal total;
public DepositAccountTransactionData(
final Long transactionId, final Long accountId, final EnumOptionData transactionType,
final LocalDate transactionDate, final BigDecimal transactionAmount, final BigDecimal interstAmount, final BigDecimal total ) {
public DepositAccountTransactionData(final Long transactionId, final Long accountId, final EnumOptionData transactionType,
final LocalDate transactionDate, final BigDecimal transactionAmount, final BigDecimal interstAmount, final BigDecimal total) {
this.transactionId = transactionId;
this.accountId = accountId;
this.transactionType = transactionType;
@@ -12,9 +12,9 @@ public class DepositPermissionData {
private final boolean anyActionOnAccountAllowed;
public DepositPermissionData(final boolean rejectAllowed,final boolean withdrawnByApplicantAllowed,final boolean undoApprovalAllowed,
final boolean pendingApproval,final boolean interestWithdrawalAllowed, final boolean renewelAllowed, final boolean isMaturedDepositAccount) {
public DepositPermissionData(final boolean rejectAllowed, final boolean withdrawnByApplicantAllowed, final boolean undoApprovalAllowed,
final boolean pendingApproval, final boolean interestWithdrawalAllowed, final boolean renewelAllowed,
final boolean isMaturedDepositAccount) {
this.rejectAllowed = rejectAllowed;
this.withdrawnByApplicantAllowed = withdrawnByApplicantAllowed;
this.undoApprovalAllowed = undoApprovalAllowed;
@@ -22,8 +22,8 @@ public class DepositPermissionData {
this.isInterestWithdrawalAllowed = interestWithdrawalAllowed;
this.renewelAllowed = renewelAllowed;
this.isMaturedDepositAccount = isMaturedDepositAccount;
this.anyActionOnAccountAllowed = isRejectAllowed() || isPendingApproval() || isUndoApprovalAllowed() || isWithdrawnByApplicantAllowed() ||
isInterestWithdrawalAllowed() || isRenewelAllowed() || isMaturedDepositAccount();
this.anyActionOnAccountAllowed = isRejectAllowed() || isPendingApproval() || isUndoApprovalAllowed()
|| isWithdrawnByApplicantAllowed() || isInterestWithdrawalAllowed() || isRenewelAllowed() || isMaturedDepositAccount();
}
public boolean isRejectAllowed() {
@@ -36,7 +36,7 @@ import org.mifosplatform.portfolio.savingsdepositproduct.domain.DepositProduct;
import org.mifosplatform.useradministration.domain.AppUser;
@Entity
@Table(name = "m_deposit_account", uniqueConstraints = @UniqueConstraint(name="deposit_acc_external_id", columnNames = { "external_id" }))
@Table(name = "m_deposit_account", uniqueConstraints = @UniqueConstraint(name = "deposit_acc_external_id", columnNames = { "external_id" }))
public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
@ManyToOne
@@ -59,7 +59,7 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
@Column(name = "maturity_nominal_interest_rate", scale = 6, precision = 19, nullable = false)
private BigDecimal interestRate;
@Column(name = "tenure_months", nullable=false)
@Column(name = "tenure_months", nullable = false)
private Integer tenureInMonths;
@Column(name = "interest_compounded_every", nullable = false)
@@ -101,7 +101,7 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
@Column(name = "is_preclosure_allowed", nullable = false)
private boolean preClosureAllowed = false;
@Column(name = "is_deleted", nullable=false)
@Column(name = "is_deleted", nullable = false)
private boolean deleted = false;
@Column(name = "status_enum", nullable = false)
@@ -139,20 +139,20 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
private final List<DepositAccountTransaction> depositaccountTransactions = new ArrayList<DepositAccountTransaction>();
@SuppressWarnings("unused")
@OneToOne(optional=true, cascade={CascadeType.PERSIST})
@OneToOne(optional = true, cascade = { CascadeType.PERSIST })
@JoinColumn(name = "renewed_account_id")
private DepositAccount renewdAccount;
@Column(name = "is_lock_in_period_allowed", nullable=false)
@Column(name = "is_lock_in_period_allowed", nullable = false)
private boolean isLockinPeriodAllowed = false;
@Column(name = "lock_in_period", nullable=false)
@Column(name = "lock_in_period", nullable = false)
private Integer lockinPeriod;
@Column(name = "lock_in_period_type", nullable=false)
@Column(name = "lock_in_period_type", nullable = false)
private PeriodFrequencyType lockinPeriodType;
//for interest posting
// for interest posting
@Column(name = "available_interest", scale = 6, precision = 19)
private BigDecimal availableInterest;
@@ -167,33 +167,23 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
@Column(name = "next_interest_posting_date")
private Date nextInterestPostingDate;
public DepositAccount openNew(
final Client client, final DepositProduct product,
final String externalId, final Money deposit, final BigDecimal maturityInterestRate, final BigDecimal preClosureInterestRate, final Integer tenureInMonths,
final Integer interestCompoundedEvery,
final PeriodFrequencyType interestCompoundedFrequencyPeriodType,
final LocalDate commencementDate,
final boolean renewalAllowed,
final boolean preClosureAllowed,
public DepositAccount openNew(final Client client, final DepositProduct product, final String externalId, final Money deposit,
final BigDecimal maturityInterestRate, final BigDecimal preClosureInterestRate, final Integer tenureInMonths,
final Integer interestCompoundedEvery, final PeriodFrequencyType interestCompoundedFrequencyPeriodType,
final LocalDate commencementDate, final boolean renewalAllowed, final boolean preClosureAllowed,
final FixedTermDepositInterestCalculator fixedTermDepositInterestCalculator,
final DepositLifecycleStateMachine depositLifecycleStateMachine,
final boolean isInterstWithdrawable,final boolean interestCompoundingAllowed,
final boolean isLockinPeriodAllowed, final Integer lockinPeriod, final PeriodFrequencyType lockinPeriodType) {
final DepositLifecycleStateMachine depositLifecycleStateMachine, final boolean isInterstWithdrawable,
final boolean interestCompoundingAllowed, final boolean isLockinPeriodAllowed, final Integer lockinPeriod,
final PeriodFrequencyType lockinPeriodType) {
Money futureValueOnMaturity =null;
Money futureValueOnMaturity = null;
if (interestCompoundingAllowed) {
futureValueOnMaturity = fixedTermDepositInterestCalculator
.calculateInterestOnMaturityFor(deposit, tenureInMonths,
maturityInterestRate, interestCompoundedEvery,
interestCompoundedFrequencyPeriodType);
futureValueOnMaturity = fixedTermDepositInterestCalculator.calculateInterestOnMaturityFor(deposit, tenureInMonths,
maturityInterestRate, interestCompoundedEvery, interestCompoundedFrequencyPeriodType);
} else {
futureValueOnMaturity = fixedTermDepositInterestCalculator
.calculateInterestOnMaturityForSimpleInterest(deposit,
tenureInMonths, maturityInterestRate,
interestCompoundedEvery,
interestCompoundedFrequencyPeriodType);
futureValueOnMaturity = fixedTermDepositInterestCalculator.calculateInterestOnMaturityForSimpleInterest(deposit,
tenureInMonths, maturityInterestRate, interestCompoundedEvery, interestCompoundedFrequencyPeriodType);
}
DepositAccountStatus from = null;
@@ -206,27 +196,20 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
return new DepositAccount(client, product, externalId, deposit, maturityInterestRate, preClosureInterestRate, tenureInMonths,
interestCompoundedEvery, interestCompoundedFrequencyPeriodType, commencementDate, renewalAllowed, preClosureAllowed,
futureValueOnMaturity,depositStatus,isInterstWithdrawable, interestCompoundingAllowed,isLockinPeriodAllowed,lockinPeriod,lockinPeriodType);
futureValueOnMaturity, depositStatus, isInterstWithdrawable, interestCompoundingAllowed, isLockinPeriodAllowed,
lockinPeriod, lockinPeriodType);
}
public DepositAccount() {
this.product = null;
}
public DepositAccount(
final Client client, final DepositProduct product,
final String externalId, final Money deposit, final BigDecimal interestRate, final BigDecimal preClosureInterestRate, final Integer termInMonths,
final Integer interestCompoundedEvery,
final PeriodFrequencyType interestCompoundedFrequencyPeriodType,
final LocalDate commencementDate,
final boolean renewalAllowed,
final boolean preClosureAllowed,
final Money futureValueOnMaturity,
final Integer depositStatus,
final boolean isInterestWithdrawable,
final boolean interestCompoundingAllowed,
final boolean isLockinPeriodAllowed,
final Integer lockinPeriod,
public DepositAccount(final Client client, final DepositProduct product, final String externalId, final Money deposit,
final BigDecimal interestRate, final BigDecimal preClosureInterestRate, final Integer termInMonths,
final Integer interestCompoundedEvery, final PeriodFrequencyType interestCompoundedFrequencyPeriodType,
final LocalDate commencementDate, final boolean renewalAllowed, final boolean preClosureAllowed,
final Money futureValueOnMaturity, final Integer depositStatus, final boolean isInterestWithdrawable,
final boolean interestCompoundingAllowed, final boolean isLockinPeriodAllowed, final Integer lockinPeriod,
final PeriodFrequencyType lockinPeriodType) {
this.client = client;
this.product = product;
@@ -259,10 +242,10 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
// derived fields
this.projectedInterestAccruedOnMaturity = futureValueOnMaturity.minus(deposit).getAmount();
this.projectedTotalOnMaturity = futureValueOnMaturity.getAmount();
this.depositStatus=depositStatus;
this.interestAccrued=BigDecimal.ZERO;
this.interstPaid=BigDecimal.ZERO;
this.total=BigDecimal.ZERO;
this.depositStatus = depositStatus;
this.interestAccrued = BigDecimal.ZERO;
this.interstPaid = BigDecimal.ZERO;
this.total = BigDecimal.ZERO;
}
private void setExternalId(final String externalId) {
@@ -278,7 +261,8 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
}
/**
* Delete is a <i>soft delete</i>. Updates flag on account so it wont appear in query/report results.
* Delete is a <i>soft delete</i>. Updates flag on account so it wont appear
* in query/report results.
*
* Any fields with unique constraints and prepended with id of record.
*/
@@ -287,20 +271,18 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
this.externalId = this.getId() + "_" + this.externalId;
}
public void approve(
final LocalDate actualCommencementDate,
final DepositLifecycleStateMachine depositLifecycleStateMachine,
final DepositStateTransitionApprovalCommand command,
final FixedTermDepositInterestCalculator calculator) {
public void approve(final LocalDate actualCommencementDate, final DepositLifecycleStateMachine depositLifecycleStateMachine,
final DepositStateTransitionApprovalCommand command, final FixedTermDepositInterestCalculator calculator) {
DepositAccountStatus statusEnum = depositLifecycleStateMachine.transition(DepositAccountEvent.DEPOSIT_APPROVED, DepositAccountStatus.fromInt(this.depositStatus));
DepositAccountStatus statusEnum = depositLifecycleStateMachine.transition(DepositAccountEvent.DEPOSIT_APPROVED,
DepositAccountStatus.fromInt(this.depositStatus));
this.depositStatus = statusEnum.getValue();
if (command.getTenureInMonths() != null) {
this.tenureInMonths = command.getTenureInMonths();
}
if(command.getMaturityInterestRate() != null){
if (command.getMaturityInterestRate() != null) {
this.interestRate = command.getMaturityInterestRate();
}
this.product.validateInterestRateInRange(this.interestRate);
@@ -319,28 +301,24 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
this.actualCommencementDate = actualCommencementDate.toDate();
this.maturesOnDate = getActualCommencementDate().plusMonths(this.tenureInMonths).minusDays(1).toDate();
Money futureValueOnMaturity =null;
Money futureValueOnMaturity = null;
if (this.interestCompoundingAllowed) {
futureValueOnMaturity = calculator.calculateInterestOnMaturityFor(
getDeposit(), this.tenureInMonths, this.interestRate,
this.interestCompoundedEvery,
getInterestCompoundedFrequencyType());
futureValueOnMaturity = calculator.calculateInterestOnMaturityFor(getDeposit(), this.tenureInMonths, this.interestRate,
this.interestCompoundedEvery, getInterestCompoundedFrequencyType());
} else {
futureValueOnMaturity = calculator
.calculateInterestOnMaturityForSimpleInterest(getDeposit(),
this.tenureInMonths, this.interestRate,
this.interestCompoundedEvery,
getInterestCompoundedFrequencyType());
futureValueOnMaturity = calculator.calculateInterestOnMaturityForSimpleInterest(getDeposit(), this.tenureInMonths,
this.interestRate, this.interestCompoundedEvery, getInterestCompoundedFrequencyType());
}
this.interestAccrued = futureValueOnMaturity.minus(getDeposit()).getAmount();
this.total = futureValueOnMaturity.getAmount();
DepositAccountTransaction depositaccountTransaction = DepositAccountTransaction.deposit(getDeposit(), getActualCommencementDate(),getAccuredInterest());
DepositAccountTransaction depositaccountTransaction = DepositAccountTransaction.deposit(getDeposit(), getActualCommencementDate(),
getAccuredInterest());
depositaccountTransaction.updateAccount(this);
this.depositaccountTransactions.add(depositaccountTransaction);
//for interest posting initializing
// for interest posting initializing
this.lastInterestPostedDate = this.actualCommencementDate;
this.nextInterestPostingDate = new LocalDate(this.lastInterestPostedDate).plusMonths(this.interestCompoundedEvery).toDate();
this.availableInterest = BigDecimal.ZERO;
@@ -348,13 +326,16 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
LocalDate submittalDate = new LocalDate(this.projectedCommencementDate);
if (actualCommencementDate.isBefore(submittalDate)) {
final String errorMessage = "The date on which a deposit is approved cannot be before its submittal date: " + submittalDate.toString();
throw new InvalidDepositStateTransitionException("approval", "cannot.be.before.submittal.date", errorMessage, getActualCommencementDate(), submittalDate);
final String errorMessage = "The date on which a deposit is approved cannot be before its submittal date: "
+ submittalDate.toString();
throw new InvalidDepositStateTransitionException("approval", "cannot.be.before.submittal.date", errorMessage,
getActualCommencementDate(), submittalDate);
}
if (actualCommencementDate.isAfter(new LocalDate())) {
final String errorMessage = "The date on which a deposit is approved cannot be in the future.";
throw new InvalidDepositStateTransitionException("approval", "cannot.be.a.future.date", errorMessage, getActualCommencementDate());
throw new InvalidDepositStateTransitionException("approval", "cannot.be.a.future.date", errorMessage,
getActualCommencementDate());
}
}
@@ -410,15 +391,13 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
return lockinPeriodType;
}
public void reject(final LocalDate rejectedOn,
final 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.depositStatus));
this.depositStatus = statusEnum.getValue();
this.maturesOnDate=null;
this.maturesOnDate = null;
this.rejectedOnDate = rejectedOn.toDateTimeAtCurrentTime().toDate();
this.closedOnDate = rejectedOn.toDateTimeAtCurrentTime().toDate();
@@ -426,26 +405,22 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
final String errorMessage = "The date on which a deposit is rejected cannot be before its submittal date: "
+ getProjectedCommencementDate().toString();
throw new InvalidDepositStateTransitionException("reject",
"cannot.be.before.submittal.date", errorMessage,
rejectedOn, getProjectedCommencementDate());
throw new InvalidDepositStateTransitionException("reject", "cannot.be.before.submittal.date", errorMessage, rejectedOn,
getProjectedCommencementDate());
}
if (rejectedOn.isAfter(new LocalDate())) {
final String errorMessage = "The date on which a deposit is rejected cannot be in the future.";
throw new InvalidDepositStateTransitionException("reject",
"cannot.be.a.future.date", errorMessage, rejectedOn);
throw new InvalidDepositStateTransitionException("reject", "cannot.be.a.future.date", errorMessage, rejectedOn);
}
}
public void withdrawnByApplicant(final LocalDate withdrawnOn,
final 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.depositStatus));
this.depositStatus = statusEnum.getValue();
@@ -457,32 +432,29 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
final String errorMessage = "The date on which a deposit is rejected cannot be before its submittal date: "
+ getProjectedCommencementDate().toString();
throw new InvalidDepositStateTransitionException("reject",
"cannot.be.before.submittal.date", errorMessage,
withdrawnOn, getProjectedCommencementDate());
throw new InvalidDepositStateTransitionException("reject", "cannot.be.before.submittal.date", errorMessage, withdrawnOn,
getProjectedCommencementDate());
}
if (withdrawnOn.isAfter(new LocalDate())) {
final String errorMessage = "The date on which a deposit is rejected cannot be in the future.";
throw new InvalidDepositStateTransitionException("reject",
"cannot.be.a.future.date", errorMessage, withdrawnOn);
throw new InvalidDepositStateTransitionException("reject", "cannot.be.a.future.date", errorMessage, withdrawnOn);
}
}
public void undoDepositApproval(final DepositLifecycleStateMachine depositLifecycleStateMachine) {
DepositAccountStatus statusEnum = depositLifecycleStateMachine.transition(
DepositAccountEvent.DEPOSIT_APPROVAL_UNDO,
DepositAccountStatus statusEnum = depositLifecycleStateMachine.transition(DepositAccountEvent.DEPOSIT_APPROVAL_UNDO,
DepositAccountStatus.fromInt(this.depositStatus));
this.depositStatus = statusEnum.getValue();
this.actualCommencementDate = null;
this.projectedInterestAccruedOnMaturity=this.interestAccrued;
this.projectedInterestAccruedOnMaturity = this.interestAccrued;
this.projectedTotalOnMaturity = this.depositAmount.add(this.projectedInterestAccruedOnMaturity);
this.maturesOnDate = getProjectedCommencementDate().plusMonths(this.tenureInMonths).minusDays(1).toDate();
this.total=null;
this.interestAccrued=null;
this.total = null;
this.interestAccrued = null;
this.depositaccountTransactions.clear();
}
@@ -494,7 +466,7 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
return Money.of(this.currency, this.depositAmount);
}
public Money getAccuredInterest(){
public Money getAccuredInterest() {
return Money.of(this.currency, this.interestAccrued);
}
@@ -502,7 +474,7 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
return this.client;
}
public DepositProduct product(){
public DepositProduct product() {
return this.product;
}
@@ -564,25 +536,32 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
}
public void withdrawDepositAccountMoney(DepositLifecycleStateMachine depositLifecycleStateMachine, FixedTermDepositInterestCalculator fixedTermDepositInterestCalculator,LocalDate eventDate) {
public void withdrawDepositAccountMoney(DepositLifecycleStateMachine depositLifecycleStateMachine,
FixedTermDepositInterestCalculator fixedTermDepositInterestCalculator, LocalDate eventDate) {
if (eventDate.isBefore(getLastInterestPostedDate())) {
final String errorMessage = "Deposit Account Preclosed date \"" +eventDate+ "\"cannot before last interest posted date \"" + getLastInterestPostedDate()+"\"";
throw new InvalidDepositStateTransitionException("withdraw", "event.date.cannot.before.last.interest.posted.date",errorMessage, getLastInterestPostedDate(), eventDate);
final String errorMessage = "Deposit Account Preclosed date \"" + eventDate + "\"cannot before last interest posted date \""
+ getLastInterestPostedDate() + "\"";
throw new InvalidDepositStateTransitionException("withdraw", "event.date.cannot.before.last.interest.posted.date",
errorMessage, getLastInterestPostedDate(), eventDate);
}
if (eventDate.isAfter(maturesOnDate()) || eventDate.equals(maturesOnDate())) {
DepositAccountStatus statusEnum = depositLifecycleStateMachine.transition(DepositAccountEvent.DEPOSIT_CLOSED, DepositAccountStatus.fromInt(this.depositStatus));
DepositAccountStatus statusEnum = depositLifecycleStateMachine.transition(DepositAccountEvent.DEPOSIT_CLOSED,
DepositAccountStatus.fromInt(this.depositStatus));
this.depositStatus = statusEnum.getValue();
} else if(eventDate.isBefore(maturesOnDate())){
DepositAccountStatus statusEnum = depositLifecycleStateMachine.transition(DepositAccountEvent.DEPOSIT_PRECLOSED, DepositAccountStatus.fromInt(this.depositStatus));
} else if (eventDate.isBefore(maturesOnDate())) {
DepositAccountStatus statusEnum = depositLifecycleStateMachine.transition(DepositAccountEvent.DEPOSIT_PRECLOSED,
DepositAccountStatus.fromInt(this.depositStatus));
this.depositStatus = statusEnum.getValue();
}
Integer days = Days.daysBetween(getLastInterestPostedDate(), eventDate).getDays();
Money accuredInterestAfterMaturityToTillDate = fixedTermDepositInterestCalculator.calculateRemainInterest(getDeposit(), days, preClosureInterestRate);
Money accuredInterestAfterMaturityToTillDate = fixedTermDepositInterestCalculator.calculateRemainInterest(getDeposit(), days,
preClosureInterestRate);
this.interestAccrued = this.interestAccrued.add(accuredInterestAfterMaturityToTillDate.getAmount());
DepositAccountTransaction depositaccountTransaction = DepositAccountTransaction.withdraw(getDeposit(), eventDate,getAccuredInterest());
DepositAccountTransaction depositaccountTransaction = DepositAccountTransaction.withdraw(getDeposit(), eventDate,
getAccuredInterest());
depositaccountTransaction.updateAccount(this);
this.depositaccountTransactions.add(depositaccountTransaction);
@@ -592,46 +571,54 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
}
/*public void adjustTotalAmountForPreclosureInterest(DepositAccount account, FixedTermDepositInterestCalculator fixedTermDepositInterestCalculator,LocalDate eventDate) {
LocalDate commnencementDate = getActualCommencementDate();
LocalDate lastInterestPosedDate = getLastInterestPostedDate();
LocalDate preClosedDate = eventDate;
if (preClosedDate.isBefore(lastInterestPosedDate)) {
throw new DepositAccountTransactionsException("deposit.account.preclosed.date.should.be.after.last.interest.posted.date", null);
}
Integer tenure = Months.monthsBetween(lastInterestPosedDate, preClosedDate).getMonths();
LocalDate actualPrecloseCalculationDate = lastInterestPosedDate.plusMonths(tenure);
Integer missedDays = Days.daysBetween(actualPrecloseCalculationDate, preClosedDate).getDays();
Money deposit = Money.of(account.getDeposit().getCurrency(), account.getDeposit().getAmount());
Money accuredtotalAmount = null;
Money remainDaysAmount = fixedTermDepositInterestCalculator.calculateRemainInterest(deposit, missedDays, preClosureInterestRate);
if (account.isInterestCompoundingAllowed()) {
accuredtotalAmount = fixedTermDepositInterestCalculator
.calculateInterestOnMaturityFor(deposit, tenure,
preClosureInterestRate, interestCompoundedEvery,
this.product.getInterestCompoundedEveryPeriodType());
accuredtotalAmount = accuredtotalAmount.plus(remainDaysAmount);
} else {
accuredtotalAmount = fixedTermDepositInterestCalculator
.calculateInterestOnMaturityForSimpleInterest(deposit,
tenure, preClosureInterestRate,
interestCompoundedEvery,
this.product.getInterestCompoundedEveryPeriodType());
accuredtotalAmount = accuredtotalAmount.plus(remainDaysAmount);
}
this.total = account.isInterestCompoundingAllowed()?accuredtotalAmount.getAmount():BigDecimal.valueOf(accuredtotalAmount.getAmount().doubleValue()-this.interstPaid.doubleValue());
this.interestAccrued = accuredtotalAmount.minus(deposit).getAmount();
}*/
/*
* public void adjustTotalAmountForPreclosureInterest(DepositAccount
* account, FixedTermDepositInterestCalculator
* fixedTermDepositInterestCalculator,LocalDate eventDate) {
*
* LocalDate commnencementDate = getActualCommencementDate(); LocalDate
* lastInterestPosedDate = getLastInterestPostedDate(); LocalDate
* preClosedDate = eventDate;
*
* if (preClosedDate.isBefore(lastInterestPosedDate)) { throw new
* DepositAccountTransactionsException
* ("deposit.account.preclosed.date.should.be.after.last.interest.posted.date"
* , null); }
*
* Integer tenure = Months.monthsBetween(lastInterestPosedDate,
* preClosedDate).getMonths(); LocalDate actualPrecloseCalculationDate =
* lastInterestPosedDate.plusMonths(tenure); Integer missedDays =
* Days.daysBetween(actualPrecloseCalculationDate, preClosedDate).getDays();
*
* Money deposit = Money.of(account.getDeposit().getCurrency(),
* account.getDeposit().getAmount()); Money accuredtotalAmount = null; Money
* remainDaysAmount =
* fixedTermDepositInterestCalculator.calculateRemainInterest(deposit,
* missedDays, preClosureInterestRate); if
* (account.isInterestCompoundingAllowed()) { accuredtotalAmount =
* fixedTermDepositInterestCalculator
* .calculateInterestOnMaturityFor(deposit, tenure, preClosureInterestRate,
* interestCompoundedEvery,
* this.product.getInterestCompoundedEveryPeriodType()); accuredtotalAmount
* = accuredtotalAmount.plus(remainDaysAmount); } else { accuredtotalAmount
* = fixedTermDepositInterestCalculator
* .calculateInterestOnMaturityForSimpleInterest(deposit, tenure,
* preClosureInterestRate, interestCompoundedEvery,
* this.product.getInterestCompoundedEveryPeriodType()); accuredtotalAmount
* = accuredtotalAmount.plus(remainDaysAmount); } this.total =
* account.isInterestCompoundingAllowed
* ()?accuredtotalAmount.getAmount():BigDecimal
* .valueOf(accuredtotalAmount.getAmount
* ().doubleValue()-this.interstPaid.doubleValue()); this.interestAccrued =
* accuredtotalAmount.minus(deposit).getAmount();
*
* }
*/
public void withdrawInterest(Money interest) {
@SuppressWarnings("unused")
boolean statustest = isActive();
if(isActive()){
if (isActive()) {
DepositAccountTransaction depositAccountTransaction = DepositAccountTransaction.withdraw(null, new LocalDate(), interest);
depositAccountTransaction.updateAccount(this);
this.depositaccountTransactions.add(depositAccountTransaction);
@@ -641,40 +628,35 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
}
}
public void closeDepositAccount(DepositLifecycleStateMachine depositLifecycleStateMachine){
DepositAccountStatus statusEnumForClose = depositLifecycleStateMachine.transition(DepositAccountEvent.DEPOSIT_CLOSED, DepositAccountStatus.fromInt(this.depositStatus));
public void closeDepositAccount(DepositLifecycleStateMachine depositLifecycleStateMachine) {
DepositAccountStatus statusEnumForClose = depositLifecycleStateMachine.transition(DepositAccountEvent.DEPOSIT_CLOSED,
DepositAccountStatus.fromInt(this.depositStatus));
this.depositStatus = statusEnumForClose.getValue();
DepositAccountTransaction depositaccountTransaction = DepositAccountTransaction.withdraw(getDeposit(), new LocalDate(),Money.of(getDeposit().getCurrency(), getTotal()).minus(getDeposit()));
DepositAccountTransaction depositaccountTransaction = DepositAccountTransaction.withdraw(getDeposit(), new LocalDate(),
Money.of(getDeposit().getCurrency(), getTotal()).minus(getDeposit()));
depositaccountTransaction.updateAccount(this);
this.depositaccountTransactions.add(depositaccountTransaction);
this.closedOnDate = new LocalDate().toDate();
}
public void update(final DepositProduct product, final String externalId,
final LocalDate commencementDate, final Money deposit,
final Integer tenureInMonths, final BigDecimal maturityInterestRate,
final BigDecimal preClosureInterestRate, final Integer interestCompoundedEvery,
final PeriodFrequencyType compoundingInterestFrequency,
final boolean renewalAllowed, final boolean preClosureAllowed,
final boolean isInterestWithdrawable, final boolean isInterestCompoundingAllowed,
final FixedTermDepositInterestCalculator fixedTermDepositInterestCalculator,
final boolean isLockinPeriodAllowed,
final Integer lockinPeriod,
final PeriodFrequencyType lockinPeriodType) {
public void update(final DepositProduct product, final String externalId, final LocalDate commencementDate, final Money deposit,
final Integer tenureInMonths, final BigDecimal maturityInterestRate, final BigDecimal preClosureInterestRate,
final Integer interestCompoundedEvery, final PeriodFrequencyType compoundingInterestFrequency, final boolean renewalAllowed,
final boolean preClosureAllowed, final boolean isInterestWithdrawable, final boolean isInterestCompoundingAllowed,
final FixedTermDepositInterestCalculator fixedTermDepositInterestCalculator, final boolean isLockinPeriodAllowed,
final Integer lockinPeriod, final PeriodFrequencyType lockinPeriodType) {
Money futureValueOnMaturity =null;
Money futureValueOnMaturity = null;
if (isInterestCompoundingAllowed) {
futureValueOnMaturity = fixedTermDepositInterestCalculator.calculateInterestOnMaturityFor(deposit, tenureInMonths,
maturityInterestRate, interestCompoundedEvery,
compoundingInterestFrequency);
maturityInterestRate, interestCompoundedEvery, compoundingInterestFrequency);
} else {
futureValueOnMaturity = fixedTermDepositInterestCalculator.calculateInterestOnMaturityForSimpleInterest(deposit,
tenureInMonths, maturityInterestRate,
interestCompoundedEvery,
compoundingInterestFrequency);
tenureInMonths, maturityInterestRate, interestCompoundedEvery, compoundingInterestFrequency);
}
setExternalId(externalId);
@@ -687,25 +669,25 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
this.tenureInMonths = tenureInMonths;
this.interestRate = maturityInterestRate;
this.product.validateInterestRateInRange(maturityInterestRate);
this.preClosureInterestRate=preClosureInterestRate;
this.interestCompoundedEvery=interestCompoundedEvery;
this.interestCompoundedFrequencyType=compoundingInterestFrequency.getValue();
this.renewalAllowed=renewalAllowed;
this.preClosureAllowed=preClosureAllowed;
this.isInterestWithdrawable=isInterestWithdrawable;
this.interestCompoundingAllowed=isInterestCompoundingAllowed;
this.preClosureInterestRate = preClosureInterestRate;
this.interestCompoundedEvery = interestCompoundedEvery;
this.interestCompoundedFrequencyType = compoundingInterestFrequency.getValue();
this.renewalAllowed = renewalAllowed;
this.preClosureAllowed = preClosureAllowed;
this.isInterestWithdrawable = isInterestWithdrawable;
this.interestCompoundingAllowed = isInterestCompoundingAllowed;
this.projectedInterestAccruedOnMaturity = futureValueOnMaturity.minus(deposit).getAmount();
this.projectedTotalOnMaturity = futureValueOnMaturity.getAmount();
this.isLockinPeriodAllowed = isLockinPeriodAllowed;
this.lockinPeriod = lockinPeriod;
this.lockinPeriodType = lockinPeriodType;
this.interestAccrued=BigDecimal.ZERO;
this.interestAccrued = BigDecimal.ZERO;
}
public void update(final boolean renewalAllowed, final boolean isInterestWithdrawable) {
this.renewalAllowed=renewalAllowed;
this.isInterestWithdrawable=isInterestWithdrawable;
this.renewalAllowed = renewalAllowed;
this.isInterestWithdrawable = isInterestWithdrawable;
}
public boolean isSubmittedAndPendingApproval() {
@@ -721,24 +703,28 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
LocalDate lastInterestPostedDate = getLastInterestPostedDate();
LocalDate nextInterestPostingDate = getNextInterestPostedDate();
Integer monthsForInterestCalculation = Months.monthsBetween(lastInterestPostedDate, new LocalDate()).getMonths();
Integer postInterestItereations = monthsForInterestCalculation/this.interestCompoundedEvery;
Integer postInterestItereations = monthsForInterestCalculation / this.interestCompoundedEvery;
Money deposit = Money.of(this.currency, this.depositAmount);
while (postInterestItereations > 0) {
lastInterestPostedDate = getLastInterestPostedDate();
nextInterestPostingDate = getNextInterestPostedDate();
if (lastInterestPostedDate.isBefore(getMaturityDate())){
if (nextInterestPostingDate.isAfter(getMaturityDate())){
if (lastInterestPostedDate.isBefore(getMaturityDate())) {
if (nextInterestPostingDate.isAfter(getMaturityDate())) {
Integer noofRemainMonthsAfterMaturity = Months.monthsBetween(getMaturityDate(), nextInterestPostingDate).getMonths();
Integer noOfMonthsBeforeMaturity = Months.monthsBetween(lastInterestPostedDate, getMaturityDate()).getMonths();
Money futureValueOnMaturity =null;
if (noOfMonthsBeforeMaturity >0) {
Money futureValueOnMaturity = null;
if (noOfMonthsBeforeMaturity > 0) {
if (this.interestCompoundingAllowed) {
futureValueOnMaturity = fixedTermDepositInterestCalculator.calculateInterestOnMaturityFor(deposit, noOfMonthsBeforeMaturity,this.interestRate, this.interestCompoundedEvery, getInterestCompoundedFrequencyType());
futureValueOnMaturity = fixedTermDepositInterestCalculator.calculateInterestOnMaturityFor(deposit,
noOfMonthsBeforeMaturity, this.interestRate, this.interestCompoundedEvery,
getInterestCompoundedFrequencyType());
} else {
futureValueOnMaturity = fixedTermDepositInterestCalculator.calculateInterestOnMaturityForSimpleInterest(deposit, noOfMonthsBeforeMaturity, this.interestRate, this.interestCompoundedEvery, getInterestCompoundedFrequencyType());
futureValueOnMaturity = fixedTermDepositInterestCalculator.calculateInterestOnMaturityForSimpleInterest(
deposit, noOfMonthsBeforeMaturity, this.interestRate, this.interestCompoundedEvery,
getInterestCompoundedFrequencyType());
}
this.interestPostedAmount = this.interestPostedAmount.add(futureValueOnMaturity.minus(deposit).getAmount());
this.availableInterest = this.availableInterest.add(futureValueOnMaturity.minus(deposit).getAmount());
@@ -746,12 +732,16 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
this.nextInterestPostingDate = nextInterestPostingDate.plusMonths(this.interestCompoundedEvery).toDate();
}
if (noofRemainMonthsAfterMaturity >0){
if (noofRemainMonthsAfterMaturity > 0) {
if (this.interestCompoundingAllowed) {
futureValueOnMaturity = fixedTermDepositInterestCalculator.calculateInterestOnMaturityFor(deposit, noofRemainMonthsAfterMaturity, this.preClosureInterestRate, this.interestCompoundedEvery, getInterestCompoundedFrequencyType());
futureValueOnMaturity = fixedTermDepositInterestCalculator.calculateInterestOnMaturityFor(deposit,
noofRemainMonthsAfterMaturity, this.preClosureInterestRate, this.interestCompoundedEvery,
getInterestCompoundedFrequencyType());
} else {
futureValueOnMaturity = fixedTermDepositInterestCalculator.calculateInterestOnMaturityForSimpleInterest(deposit, noofRemainMonthsAfterMaturity, this.preClosureInterestRate, this.interestCompoundedEvery, getInterestCompoundedFrequencyType());
futureValueOnMaturity = fixedTermDepositInterestCalculator.calculateInterestOnMaturityForSimpleInterest(
deposit, noofRemainMonthsAfterMaturity, this.preClosureInterestRate, this.interestCompoundedEvery,
getInterestCompoundedFrequencyType());
}
this.interestPostedAmount = this.interestPostedAmount.add(futureValueOnMaturity.minus(deposit).getAmount());
this.availableInterest = this.availableInterest.add(futureValueOnMaturity.minus(deposit).getAmount());
@@ -760,15 +750,20 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
}
// add transaction entry for each interest posting
DepositAccountTransaction depositaccountTransaction = DepositAccountTransaction.postInterest(null, nextInterestPostingDate,futureValueOnMaturity.minus(deposit));
DepositAccountTransaction depositaccountTransaction = DepositAccountTransaction.postInterest(null,
nextInterestPostingDate, futureValueOnMaturity.minus(deposit));
depositaccountTransaction.updateAccount(this);
this.depositaccountTransactions.add(depositaccountTransaction);
} else {
Money futureValueOnMaturity =null;
Money futureValueOnMaturity = null;
if (this.interestCompoundingAllowed) {
futureValueOnMaturity = fixedTermDepositInterestCalculator.calculateInterestOnMaturityFor(deposit, this.interestCompoundedEvery, this.interestRate, this.interestCompoundedEvery, getInterestCompoundedFrequencyType());
futureValueOnMaturity = fixedTermDepositInterestCalculator.calculateInterestOnMaturityFor(deposit,
this.interestCompoundedEvery, this.interestRate, this.interestCompoundedEvery,
getInterestCompoundedFrequencyType());
} else {
futureValueOnMaturity = fixedTermDepositInterestCalculator.calculateInterestOnMaturityForSimpleInterest(deposit, this.interestCompoundedEvery, this.interestRate, this.interestCompoundedEvery, getInterestCompoundedFrequencyType());
futureValueOnMaturity = fixedTermDepositInterestCalculator.calculateInterestOnMaturityForSimpleInterest(deposit,
this.interestCompoundedEvery, this.interestRate, this.interestCompoundedEvery,
getInterestCompoundedFrequencyType());
}
this.interestPostedAmount = this.interestPostedAmount.add(futureValueOnMaturity.minus(deposit).getAmount());
this.availableInterest = this.availableInterest.add(futureValueOnMaturity.minus(deposit).getAmount());
@@ -776,16 +771,21 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
this.nextInterestPostingDate = nextInterestPostingDate.plusMonths(this.interestCompoundedEvery).toDate();
// add transaction entry for each interest posting
DepositAccountTransaction depositaccountTransaction = DepositAccountTransaction.postInterest(null, nextInterestPostingDate,futureValueOnMaturity.minus(deposit));
DepositAccountTransaction depositaccountTransaction = DepositAccountTransaction.postInterest(null,
nextInterestPostingDate, futureValueOnMaturity.minus(deposit));
depositaccountTransaction.updateAccount(this);
this.depositaccountTransactions.add(depositaccountTransaction);
}
} else{
Money futureValueOnMaturity =null;
if (this.interestCompoundingAllowed) {
futureValueOnMaturity = fixedTermDepositInterestCalculator.calculateInterestOnMaturityFor(deposit, this.interestCompoundedEvery, this.preClosureInterestRate, this.interestCompoundedEvery, getInterestCompoundedFrequencyType());
} else {
futureValueOnMaturity = fixedTermDepositInterestCalculator.calculateInterestOnMaturityForSimpleInterest(deposit, this.interestCompoundedEvery, this.preClosureInterestRate, this.interestCompoundedEvery, getInterestCompoundedFrequencyType());
Money futureValueOnMaturity = null;
if (this.interestCompoundingAllowed) {
futureValueOnMaturity = fixedTermDepositInterestCalculator.calculateInterestOnMaturityFor(deposit,
this.interestCompoundedEvery, this.preClosureInterestRate, this.interestCompoundedEvery,
getInterestCompoundedFrequencyType());
} else {
futureValueOnMaturity = fixedTermDepositInterestCalculator.calculateInterestOnMaturityForSimpleInterest(deposit,
this.interestCompoundedEvery, this.preClosureInterestRate, this.interestCompoundedEvery,
getInterestCompoundedFrequencyType());
}
this.interestPostedAmount = this.interestPostedAmount.add(futureValueOnMaturity.minus(deposit).getAmount());
this.availableInterest = this.availableInterest.add(futureValueOnMaturity.minus(deposit).getAmount());
@@ -793,7 +793,8 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
this.nextInterestPostingDate = nextInterestPostingDate.plusMonths(this.interestCompoundedEvery).toDate();
// add transaction entry for each interest posting
DepositAccountTransaction depositaccountTransaction = DepositAccountTransaction.postInterest(null, nextInterestPostingDate,futureValueOnMaturity.minus(deposit));
DepositAccountTransaction depositaccountTransaction = DepositAccountTransaction.postInterest(null, nextInterestPostingDate,
futureValueOnMaturity.minus(deposit));
depositaccountTransaction.updateAccount(this);
this.depositaccountTransactions.add(depositaccountTransaction);
}
@@ -804,7 +805,7 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
private final LocalDate getLastInterestPostedDate() {
LocalDate lastInterestPostedDate;
if (this.lastInterestPostedDate == null){
if (this.lastInterestPostedDate == null) {
lastInterestPostedDate = new LocalDate(this.actualCommencementDate);
} else {
lastInterestPostedDate = new LocalDate(this.lastInterestPostedDate);
@@ -814,7 +815,7 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
private final LocalDate getNextInterestPostedDate() {
LocalDate nextInterestPostingDate;
if (this.nextInterestPostingDate == null){
if (this.nextInterestPostingDate == null) {
nextInterestPostingDate = new LocalDate(this.nextInterestPostingDate).plusMonths(this.interestCompoundedEvery);
} else {
nextInterestPostingDate = new LocalDate(this.nextInterestPostingDate);
@@ -830,5 +831,4 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
return interestPostedAmount;
}
}
@@ -3,5 +3,4 @@ package org.mifosplatform.portfolio.savingsdepositaccount.domain;
public enum DepositAccountEvent {
DEPOSIT_CREATED, DEPOSIT_REJECTED, DEPOSIT_APPROVED, DEPOSIT_APPROVAL_UNDO, DEPOSIT_WITHDRAWN, DEPOSIT_MATURED, DEPOSIT_CLOSED, DEPOSIT_PRECLOSED;
}
@@ -3,8 +3,6 @@ package org.mifosplatform.portfolio.savingsdepositaccount.domain;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
public interface DepositAccountRepository extends
JpaRepository<DepositAccount, Long>,
JpaSpecificationExecutor<DepositAccount> {
public interface DepositAccountRepository extends JpaRepository<DepositAccount, Long>, JpaSpecificationExecutor<DepositAccount> {
//
}
@@ -4,13 +4,12 @@ public enum DepositAccountStatus {
INVALID(0, "depositStatusType.invalid"), //
SUBMITED_AND_PENDING_APPROVAL(100, "depositStatusType.submitted.and.pending.approval"), //
//APPROVED(200, "depositStatusType.approved"), //
// APPROVED(200, "depositStatusType.approved"), //
ACTIVE(300, "depositStatusType.active"), //
WITHDRAWN_BY_CLIENT(400, "depositStatusType.withdrawn.by.client"), //
REJECTED(500, "depositStatusType.rejected"), //
CLOSED(600, "depositStatusType.closed"), //
MATURED(700,"depositStatusType.matured"),
PRECLOSED(800,"depositStatusType.preclosed");
MATURED(700, "depositStatusType.matured"), PRECLOSED(800, "depositStatusType.preclosed");
private final Integer value;
private final String code;
@@ -36,9 +35,10 @@ public enum DepositAccountStatus {
return this.value.equals(DepositAccountStatus.SUBMITED_AND_PENDING_APPROVAL.getValue());
}
/*public boolean isApproved() {
return this.value.equals(DepositAccountStatus.APPROVED.getValue());
}*/
/*
* public boolean isApproved() { return
* this.value.equals(DepositAccountStatus.APPROVED.getValue()); }
*/
public boolean isActive() {
return this.value.equals(DepositAccountStatus.ACTIVE.getValue());
@@ -56,7 +56,7 @@ public enum DepositAccountStatus {
return this.value.equals(DepositAccountStatus.REJECTED.getValue());
}
public boolean isPreClosed(){
public boolean isPreClosed() {
return this.value.equals(DepositAccountStatus.PRECLOSED.getValue());
}
@@ -67,9 +67,9 @@ public enum DepositAccountStatus {
case 100:
enumeration = DepositAccountStatus.SUBMITED_AND_PENDING_APPROVAL;
break;
/*case 200:
enumeration = DepositAccountStatus.APPROVED;
break;*/
/*
* case 200: enumeration = DepositAccountStatus.APPROVED; break;
*/
case 300:
enumeration = DepositAccountStatus.ACTIVE;
break;
@@ -21,12 +21,12 @@ import org.mifosplatform.organisation.monetary.domain.Money;
import org.springframework.data.jpa.domain.AbstractPersistable;
@Entity
@Table(name="m_deposit_account_transaction")
@Table(name = "m_deposit_account_transaction")
public class DepositAccountTransaction extends AbstractPersistable<Long> {
@SuppressWarnings("unused")
@ManyToOne(optional = false)
@JoinColumn(name = "deposit_account_id", nullable=false)
@JoinColumn(name = "deposit_account_id", nullable = false)
private DepositAccount depositAccount;
@Enumerated(EnumType.ORDINAL)
@@ -34,12 +34,12 @@ public class DepositAccountTransaction extends AbstractPersistable<Long> {
private DepositAccountTransactionType typeOf;
@SuppressWarnings("unused")
@OneToOne(optional=true, cascade={CascadeType.PERSIST})
@JoinColumn(name="contra_id")
@OneToOne(optional = true, cascade = { CascadeType.PERSIST })
@JoinColumn(name = "contra_id")
private DepositAccountTransaction contra;
@Temporal(TemporalType.DATE)
@Column(name = "transaction_date", nullable=false)
@Column(name = "transaction_date", nullable = false)
private final Date dateOf;
@Column(name = "amount", scale = 6, precision = 19, nullable = false)
@@ -53,21 +53,22 @@ public class DepositAccountTransaction extends AbstractPersistable<Long> {
@Column(name = "total", scale = 6, precision = 19, nullable = false)
private final BigDecimal total;
protected DepositAccountTransaction(){
this.depositAccount=null;
this.typeOf=null;
this.amount=null;
this.dateOf=null;
this.interest=null;
this.total=null;
protected DepositAccountTransaction() {
this.depositAccount = null;
this.typeOf = null;
this.amount = null;
this.dateOf = null;
this.interest = null;
this.total = null;
}
private DepositAccountTransaction(DepositAccountTransactionType type, final BigDecimal amount, final LocalDate date, final BigDecimal interest) {
private DepositAccountTransaction(DepositAccountTransactionType type, final BigDecimal amount, final LocalDate date,
final BigDecimal interest) {
this.typeOf = type;
this.amount = amount;
this.dateOf = date.toDateMidnight().toDate();
this.interest = interest;
this.total = amount.doubleValue()==0?new BigDecimal(0):amount.add(interest);
this.total = amount.doubleValue() == 0 ? new BigDecimal(0) : amount.add(interest);
}
public Date getDateOf() {
@@ -90,23 +91,27 @@ public class DepositAccountTransaction extends AbstractPersistable<Long> {
return new LocalDate(this.dateOf);
}
public boolean isDeposit(){
public boolean isDeposit() {
return DepositAccountTransactionType.DEPOSIT.equals(typeOf);
}
public static DepositAccountTransaction deposit(Money amount, LocalDate paymentDate, Money interest) {
return new DepositAccountTransaction(DepositAccountTransactionType.DEPOSIT, amount == null ? new BigDecimal(0) : amount.getAmount(), paymentDate, interest==null ? new BigDecimal(0) : interest.getAmount());
return new DepositAccountTransaction(DepositAccountTransactionType.DEPOSIT,
amount == null ? new BigDecimal(0) : amount.getAmount(), paymentDate, interest == null ? new BigDecimal(0)
: interest.getAmount());
}
public static DepositAccountTransaction withdraw(Money amount, LocalDate paymentDate, Money interest) {
return new DepositAccountTransaction(DepositAccountTransactionType.WITHDRAW, amount == null ? new BigDecimal(0) : amount.getAmount(), paymentDate, interest==null ? new BigDecimal(0) : interest.getAmount());
return new DepositAccountTransaction(DepositAccountTransactionType.WITHDRAW, amount == null ? new BigDecimal(0)
: amount.getAmount(), paymentDate, interest == null ? new BigDecimal(0) : interest.getAmount());
}
public static DepositAccountTransaction postInterest(Money depositAmount, LocalDate paymentDate, Money interest) {
return new DepositAccountTransaction(DepositAccountTransactionType.INTEREST_POSTING, depositAmount == null ? new BigDecimal(0) : depositAmount.getAmount(), paymentDate, interest==null ? new BigDecimal(0) : interest.getAmount());
return new DepositAccountTransaction(DepositAccountTransactionType.INTEREST_POSTING, depositAmount == null ? new BigDecimal(0)
: depositAmount.getAmount(), paymentDate, interest == null ? new BigDecimal(0) : interest.getAmount());
}
public void updateAccount(DepositAccount depositAccount) {
this.depositAccount=depositAccount;
this.depositAccount = depositAccount;
}
}
@@ -5,15 +5,14 @@ public enum DepositAccountTransactionType {
INVALID(0, "depositTransactionType.invalid"), //
DEPOSIT(1, "depositTransactionType.deposit"), //
WITHDRAW(2, "depositTransactionType.withdraw"), //
REVERSAL(3, "depositTransactionType.reversal"),
INTEREST_POSTING(4,"depositTransactionType.interestPosting");
REVERSAL(3, "depositTransactionType.reversal"), INTEREST_POSTING(4, "depositTransactionType.interestPosting");
private final Integer value;
private final String code;
private DepositAccountTransactionType(final Integer value, final String code) {
this.value=value;
this.code=code;
this.value = value;
this.code = code;
}
public Integer getValue() {
@@ -24,32 +23,30 @@ public enum DepositAccountTransactionType {
return code;
}
public static DepositAccountTransactionType fromInt(final Integer transactionType){
public static DepositAccountTransactionType fromInt(final Integer transactionType) {
if (transactionType == null) {
return DepositAccountTransactionType.INVALID;
}
if (transactionType == null) { return DepositAccountTransactionType.INVALID; }
DepositAccountTransactionType depositTransactionType=null;
DepositAccountTransactionType depositTransactionType = null;
switch (transactionType) {
case 1:
depositTransactionType=DepositAccountTransactionType.DEPOSIT;
depositTransactionType = DepositAccountTransactionType.DEPOSIT;
break;
case 2:
depositTransactionType=DepositAccountTransactionType.WITHDRAW;
depositTransactionType = DepositAccountTransactionType.WITHDRAW;
break;
case 3:
depositTransactionType=DepositAccountTransactionType.REVERSAL;
depositTransactionType = DepositAccountTransactionType.REVERSAL;
break;
case 4:
depositTransactionType=DepositAccountTransactionType.INTEREST_POSTING;
depositTransactionType = DepositAccountTransactionType.INTEREST_POSTING;
break;
default :
depositTransactionType=DepositAccountTransactionType.INVALID;
default:
depositTransactionType = DepositAccountTransactionType.INVALID;
break;
}
@@ -1,8 +1,6 @@
package org.mifosplatform.portfolio.savingsdepositaccount.domain;
public interface DepositLifecycleStateMachine {
DepositAccountStatus transition(DepositAccountEvent loanEvent, DepositAccountStatus from);
}
@@ -4,13 +4,12 @@ import java.util.List;
import org.mifosplatform.portfolio.savingsdepositaccount.exception.InvalidDepositStateTransitionException;
public class DepositLifecycleStateMachineImpl implements
DepositLifecycleStateMachine {
public class DepositLifecycleStateMachineImpl implements DepositLifecycleStateMachine {
private final List<DepositAccountStatus> allowedDepositStatuses;
public DepositLifecycleStateMachineImpl(List<DepositAccountStatus> allowedDepositStatuses) {
this.allowedDepositStatuses=allowedDepositStatuses;
this.allowedDepositStatuses = allowedDepositStatuses;
}
@Override
@@ -27,64 +26,57 @@ public class DepositLifecycleStateMachineImpl implements
case DEPOSIT_REJECTED:
if (from.hasStateOf(DepositAccountStatus.SUBMITED_AND_PENDING_APPROVAL)) {
newState = stateOf(DepositAccountStatus.REJECTED, allowedDepositStatuses);
}
else{
final String errorMessage = "The DepositApplication can not be rejected from "+from.getCode() ;
throw new InvalidDepositStateTransitionException("rejection", "failed", errorMessage,from);
} else {
final String errorMessage = "The DepositApplication can not be rejected from " + from.getCode();
throw new InvalidDepositStateTransitionException("rejection", "failed", errorMessage, from);
}
break;
case DEPOSIT_APPROVED:
if (from.hasStateOf(DepositAccountStatus.SUBMITED_AND_PENDING_APPROVAL)) {
newState = stateOf(DepositAccountStatus.ACTIVE, allowedDepositStatuses);
}
else{
final String errorMessage = "The DepositApplication can not be approved from "+from.getCode() ;
throw new InvalidDepositStateTransitionException("approve", "failed", errorMessage,from);
} else {
final String errorMessage = "The DepositApplication can not be approved from " + from.getCode();
throw new InvalidDepositStateTransitionException("approve", "failed", errorMessage, from);
}
break;
case DEPOSIT_WITHDRAWN:
if (this.anyOfAllowedWhenComingFrom(from, DepositAccountStatus.SUBMITED_AND_PENDING_APPROVAL, DepositAccountStatus.ACTIVE)) {
newState = stateOf(DepositAccountStatus.WITHDRAWN_BY_CLIENT, allowedDepositStatuses);
}
else{
final String errorMessage = "The DepositApplication can not be withdrawn from "+from.getCode() ;
throw new InvalidDepositStateTransitionException("withdrawbyclient", "failed", errorMessage,from);
} else {
final String errorMessage = "The DepositApplication can not be withdrawn from " + from.getCode();
throw new InvalidDepositStateTransitionException("withdrawbyclient", "failed", errorMessage, from);
}
break;
case DEPOSIT_APPROVAL_UNDO:
if (from.hasStateOf(DepositAccountStatus.ACTIVE)) {
newState = stateOf(DepositAccountStatus.SUBMITED_AND_PENDING_APPROVAL, allowedDepositStatuses);
}
else{
final String errorMessage = "The DepositApplication can not be unapproved from "+from.getCode() ;
throw new InvalidDepositStateTransitionException("unapprove", "failed", errorMessage,from);
} else {
final String errorMessage = "The DepositApplication can not be unapproved from " + from.getCode();
throw new InvalidDepositStateTransitionException("unapprove", "failed", errorMessage, from);
}
break;
case DEPOSIT_MATURED:
if (from.hasStateOf(DepositAccountStatus.ACTIVE) ){
if (from.hasStateOf(DepositAccountStatus.ACTIVE)) {
newState = stateOf(DepositAccountStatus.MATURED, allowedDepositStatuses);
}
else{
final String errorMessage = "The DepositApplication can not be matured from "+from.getCode() ;
throw new InvalidDepositStateTransitionException("mature", "failed", errorMessage,from);
} else {
final String errorMessage = "The DepositApplication can not be matured from " + from.getCode();
throw new InvalidDepositStateTransitionException("mature", "failed", errorMessage, from);
}
break;
case DEPOSIT_CLOSED:
if (from.hasStateOf(DepositAccountStatus.ACTIVE) ){
if (from.hasStateOf(DepositAccountStatus.ACTIVE)) {
newState = stateOf(DepositAccountStatus.CLOSED, allowedDepositStatuses);
}
else{
final String errorMessage = "The DepositApplication can not be closed from "+from.getCode() ;
throw new InvalidDepositStateTransitionException("closed", "failed", errorMessage,from);
} else {
final String errorMessage = "The DepositApplication can not be closed from " + from.getCode();
throw new InvalidDepositStateTransitionException("closed", "failed", errorMessage, from);
}
break;
case DEPOSIT_PRECLOSED:
if (from.hasStateOf(DepositAccountStatus.ACTIVE) ){
if (from.hasStateOf(DepositAccountStatus.ACTIVE)) {
newState = stateOf(DepositAccountStatus.PRECLOSED, allowedDepositStatuses);
}
else{
final String errorMessage = "The DepositApplication can not be matured from "+from.getCode() ;
throw new InvalidDepositStateTransitionException("preclosure", "failed", errorMessage,from);
} else {
final String errorMessage = "The DepositApplication can not be matured from " + from.getCode();
throw new InvalidDepositStateTransitionException("preclosure", "failed", errorMessage, from);
}
break;
default:
@@ -12,16 +12,16 @@ import org.springframework.stereotype.Service;
public class FixedTermDepositInterestCalculator {
// FIXME - MADHUKAR - Are the unused field here needed?
public Money calculateInterestOnMaturityFor(
final Money deposit,
final Integer tenureInMonths,
final BigDecimal maturityInterestRate,
final Integer interestCompoundedEvery,
final PeriodFrequencyType interestCompoundedFrequencyPeriodType) {
public Money calculateInterestOnMaturityFor(final Money deposit, final Integer tenureInMonths, final BigDecimal maturityInterestRate,
final Integer interestCompoundedEvery, final PeriodFrequencyType interestCompoundedFrequencyPeriodType) {
// TODO - Can change 'interest compounding' fields into something simpler like interestCompoundedFrequency {None (Simple Interest), Monthly, Quarterly, Half-Yearly, Annually}
// - the 'interestCompoundedEvery' would then be inferred form the selected type.
// - the special case of 'simple interest' or 'no compounding' would use simple formula rather than 'future value' function.
// TODO - Can change 'interest compounding' fields into something
// simpler like interestCompoundedFrequency {None (Simple Interest),
// Monthly, Quarterly, Half-Yearly, Annually}
// - the 'interestCompoundedEvery' would then be inferred form the
// selected type.
// - the special case of 'simple interest' or 'no compounding' would use
// simple formula rather than 'future value' function.
// FIXME - assuming only monthly compounding period for now
MathContext mc = new MathContext(8, RoundingMode.HALF_EVEN);
@@ -30,7 +30,8 @@ public class FixedTermDepositInterestCalculator {
BigDecimal interestRateAsFraction = maturityInterestRate.divide(BigDecimal.valueOf(100), mc);
BigDecimal interestRateForOneMonth = interestRateAsFraction.divide(BigDecimal.valueOf(monthsInYear.doubleValue()), mc);
BigDecimal ratePerCompoundingPeriod = interestRateForOneMonth.multiply(BigDecimal.valueOf(interestCompoundedEvery.doubleValue()), mc);
BigDecimal ratePerCompoundingPeriod = interestRateForOneMonth.multiply(BigDecimal.valueOf(interestCompoundedEvery.doubleValue()),
mc);
Integer numberOfPeriods = tenureInMonths / interestCompoundedEvery;
@@ -53,45 +54,47 @@ public class FixedTermDepositInterestCalculator {
* payments are due at the beginning of period (false => payments are due at
* end of period)
*/
private static double fv(double ratePeriodCompoundingPeriod, double numberOfCompoundingPeriods, double pmtPerPeriod, double presentValue, boolean type) {
private static double fv(double ratePeriodCompoundingPeriod, double numberOfCompoundingPeriods, double pmtPerPeriod,
double presentValue, boolean type) {
double retval = 0;
if (ratePeriodCompoundingPeriod == 0) {
retval = -1 * (presentValue + (numberOfCompoundingPeriods * pmtPerPeriod));
} else {
double r1 = ratePeriodCompoundingPeriod + 1;
retval = ((1 - Math.pow(r1, numberOfCompoundingPeriods)) * (type ? r1 : 1) * pmtPerPeriod) / ratePeriodCompoundingPeriod - presentValue
* Math.pow(r1, numberOfCompoundingPeriods);
retval = ((1 - Math.pow(r1, numberOfCompoundingPeriods)) * (type ? r1 : 1) * pmtPerPeriod) / ratePeriodCompoundingPeriod
- presentValue * Math.pow(r1, numberOfCompoundingPeriods);
}
return retval;
}
public Money calculateInterestOnMaturityForSimpleInterest(Money deposit,
Integer tenureInMonths, BigDecimal maturityInterestRate,
Integer interestCompoundedEvery,
PeriodFrequencyType interestCompoundedFrequencyPeriodType) {
public Money calculateInterestOnMaturityForSimpleInterest(Money deposit, Integer tenureInMonths, BigDecimal maturityInterestRate,
Integer interestCompoundedEvery, PeriodFrequencyType interestCompoundedFrequencyPeriodType) {
MathContext mc = new MathContext(8, RoundingMode.HALF_EVEN);
Integer monthsInYear = 12;
BigDecimal interestRateAsFraction = maturityInterestRate.divide(BigDecimal.valueOf(100), mc);
BigDecimal interestRateForOneMonth = interestRateAsFraction.divide(BigDecimal.valueOf(monthsInYear.doubleValue()), mc);
BigDecimal ratePerCompoundingPeriod = interestRateForOneMonth.multiply(BigDecimal.valueOf(interestCompoundedEvery.doubleValue()), mc);
BigDecimal ratePerCompoundingPeriod = interestRateForOneMonth.multiply(BigDecimal.valueOf(interestCompoundedEvery.doubleValue()),
mc);
Integer numberOfPeriods = tenureInMonths / interestCompoundedEvery;
BigDecimal interest = ratePerCompoundingPeriod.multiply(deposit.getAmount()).multiply(BigDecimal.valueOf(new Double(numberOfPeriods)));
BigDecimal totalAmount =deposit.getAmount().add(interest);
BigDecimal interest = ratePerCompoundingPeriod.multiply(deposit.getAmount()).multiply(
BigDecimal.valueOf(new Double(numberOfPeriods)));
BigDecimal totalAmount = deposit.getAmount().add(interest);
return Money.of(deposit.getCurrency(), totalAmount);
}
public Money calculateRemainInterest(Money deposit, Integer days, BigDecimal interestRate){
public Money calculateRemainInterest(Money deposit, Integer days, BigDecimal interestRate) {
MathContext mc = new MathContext(8, RoundingMode.HALF_EVEN);
Integer daysInYear = 365;
BigDecimal interestRateAsFraction = interestRate.divide(BigDecimal.valueOf(100), mc);
BigDecimal interestRateForOneDay = interestRateAsFraction.divide(BigDecimal.valueOf(daysInYear.doubleValue()), mc);
BigDecimal interest = BigDecimal.valueOf(deposit.getAmount().doubleValue()*days.doubleValue()*interestRateForOneDay.doubleValue());
BigDecimal interest = BigDecimal.valueOf(deposit.getAmount().doubleValue() * days.doubleValue()
* interestRateForOneDay.doubleValue());
return Money.of(deposit.getCurrency(), interest);
}
@@ -4,11 +4,11 @@ import java.math.BigDecimal;
import org.mifosplatform.infrastructure.core.exception.AbstractPlatformDomainRuleException;
public class DepositAccounDataValidationtException extends
AbstractPlatformDomainRuleException {
public class DepositAccounDataValidationtException extends AbstractPlatformDomainRuleException {
public DepositAccounDataValidationtException(BigDecimal preClosureInterestRate, BigDecimal maturityMinInterestRate) {
super("error.msg.deposit.account.preClosureInterestRate.should.lessthanOrEqualTo.maturityMinInterestRate", "PreClosureInterestRate : "+preClosureInterestRate+"should lessthan or equal to maturityMinInterestRate : "+maturityMinInterestRate, preClosureInterestRate,maturityMinInterestRate);
super("error.msg.deposit.account.preClosureInterestRate.should.lessthanOrEqualTo.maturityMinInterestRate",
"PreClosureInterestRate : " + preClosureInterestRate + "should lessthan or equal to maturityMinInterestRate : "
+ maturityMinInterestRate, preClosureInterestRate, maturityMinInterestRate);
}
}
@@ -7,5 +7,4 @@ public class DepositAccountNotFoundException extends AbstractPlatformResourceNot
public DepositAccountNotFoundException(final Long id) {
super("error.msg.deposit.account.id.invalid", "Deposit account with identifier " + id + " does not exist", id);
}
}
@@ -3,10 +3,9 @@ package org.mifosplatform.portfolio.savingsdepositaccount.exception;
import org.joda.time.LocalDate;
import org.mifosplatform.infrastructure.core.exception.AbstractPlatformDomainRuleException;
public class DepositAccountReopenException extends AbstractPlatformDomainRuleException{
public class DepositAccountReopenException extends AbstractPlatformDomainRuleException {
public DepositAccountReopenException(LocalDate maturedDate) {
super("error.msg.depositaccount.cannot.reopen.before.mature", "You cannot renew the account that is not matured:"+maturedDate);
super("error.msg.depositaccount.cannot.reopen.before.mature", "You cannot renew the account that is not matured:" + maturedDate);
}
}
@@ -2,11 +2,9 @@ package org.mifosplatform.portfolio.savingsdepositaccount.exception;
import org.mifosplatform.infrastructure.core.exception.AbstractPlatformDomainRuleException;
public class DepositAccountTransactionsException extends AbstractPlatformDomainRuleException {
public DepositAccountTransactionsException(String errorcode, String remainInterestForWithdrawal) {
super(errorcode, "You can Withdraw "+remainInterestForWithdrawal+" only", remainInterestForWithdrawal);
super(errorcode, "You can Withdraw " + remainInterestForWithdrawal + " only", remainInterestForWithdrawal);
}
}
@@ -8,5 +8,4 @@ public class InvalidDepositStateTransitionException extends AbstractPlatformDoma
Object... defaultUserMessageArgs) {
super("error.msg.deposit." + action + "." + postFix, defaultUserMessage, defaultUserMessageArgs);
}
}
@@ -24,7 +24,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* An assembler for turning {@link DepositAccountCommand} into {@link DepositAccount}'s.
* An assembler for turning {@link DepositAccountCommand} into
* {@link DepositAccount}'s.
*/
@Service
public class DepositAccountAssembler {
@@ -44,18 +45,15 @@ public class DepositAccountAssembler {
public DepositAccount assembleFrom(final DepositAccountCommand command) {
Client client = this.clientRepository.findOne(command.getClientId());
if (client == null || client.isDeleted()) {
throw new ClientNotFoundException(command.getClientId());
}
if (client == null || client.isDeleted()) { throw new ClientNotFoundException(command.getClientId()); }
DepositProduct product = this.depositProductRepository.findOne(command.getProductId());
if (product == null || product.isDeleted()) {
throw new DepositProductNotFoundException(command.getProductId());
}
if (product == null || product.isDeleted()) { throw new DepositProductNotFoundException(command.getProductId()); }
boolean isInterestWithdrawable = command.isInterestWithdrawable();
// details inherited from product setting (unless allowed to be overridden through account creation api
// details inherited from product setting (unless allowed to be
// overridden through account creation api
Money deposit = Money.of(product.getCurrency(), command.getDepositAmount());
Integer tenureInMonths = product.getTenureInMonths();
@@ -69,13 +67,12 @@ public class DepositAccountAssembler {
}
BigDecimal preClosureInterestRate = product.getPreClosureInterestRate();
if(command.getPreClosureInterestRate()!=null){
if (command.getPreClosureInterestRate() != null) {
preClosureInterestRate = command.getPreClosureInterestRate();
}
if(product.getMaturityMinInterestRate().compareTo(preClosureInterestRate)==-1){
throw new DepositAccounDataValidationtException(preClosureInterestRate, product.getMaturityMinInterestRate());
}
if (product.getMaturityMinInterestRate().compareTo(preClosureInterestRate) == -1) { throw new DepositAccounDataValidationtException(
preClosureInterestRate, product.getMaturityMinInterestRate()); }
Integer compoundingInterestEvery = product.getInterestCompoundedEvery();
if (command.getInterestCompoundedEvery() != null) {
@@ -97,35 +94,32 @@ public class DepositAccountAssembler {
preClosureAllowed = command.isPreClosureAllowed();
}
boolean interestCompoundingAllowed= product.isInterestCompoundingAllowed();
if(command.isInterestCompoundingAllowedChanged()){
boolean interestCompoundingAllowed = product.isInterestCompoundingAllowed();
if (command.isInterestCompoundingAllowedChanged()) {
interestCompoundingAllowed = command.isInterestCompoundingAllowed();
}
boolean isLockinPeriodAllowed = product.isLockinPeriodAllowed();
if(command.isLockinPeriodChanged()){
if (command.isLockinPeriodChanged()) {
isLockinPeriodAllowed = command.isLockinPeriodAllowed();
}
Integer lockinPeriod = product.getLockinPeriod();
if(command.getLockinPeriod() != null){
if (command.getLockinPeriod() != null) {
lockinPeriod = command.getLockinPeriod();
}
PeriodFrequencyType lockinPeriodType = product.getLockinPeriodType();
if(command.getLockinPeriodType() != null){
if (command.getLockinPeriodType() != null) {
lockinPeriodType = PeriodFrequencyType.fromInt(command.getLockinPeriodType());
}
// end of details allowed to be overriden from product
DepositAccount account =new DepositAccount().openNew(client, product, command.getExternalId(),
deposit,
maturityInterestRate, preClosureInterestRate,
tenureInMonths, compoundingInterestEvery, compoundingInterestFrequency,
command.getCommencementDate(),
renewalAllowed, preClosureAllowed, this.fixedTermDepositInterestCalculator,
defaultDepositLifecycleStateMachine(),isInterestWithdrawable,interestCompoundingAllowed,
isLockinPeriodAllowed,lockinPeriod,lockinPeriodType);
DepositAccount account = new DepositAccount().openNew(client, product, command.getExternalId(), deposit, maturityInterestRate,
preClosureInterestRate, tenureInMonths, compoundingInterestEvery, compoundingInterestFrequency,
command.getCommencementDate(), renewalAllowed, preClosureAllowed, this.fixedTermDepositInterestCalculator,
defaultDepositLifecycleStateMachine(), isInterestWithdrawable, interestCompoundingAllowed, isLockinPeriodAllowed,
lockinPeriod, lockinPeriodType);
return account;
}
@@ -140,208 +134,204 @@ public class DepositAccountAssembler {
Client client = account.client();
DepositProduct product = account.product();
if(command.getProductId() != null){
if (command.getProductId() != null) {
product = this.depositProductRepository.findOne(command.getProductId());
if (product == null || product.isDeleted()) {
throw new DepositProductNotFoundException(command.getProductId());
}
if (product == null || product.isDeleted()) { throw new DepositProductNotFoundException(command.getProductId()); }
}
Money deposit = account.getDeposit();
if(command.getDepositAmount() != null){
if (command.getDepositAmount() != null) {
deposit = Money.of(account.getDeposit().getCurrency(), command.getDepositAmount());
}
Integer tenureInMonths = account.getTenureInMonths();
if(command.getTenureInMonths() != null){
tenureInMonths =command.getTenureInMonths();
if (command.getTenureInMonths() != null) {
tenureInMonths = command.getTenureInMonths();
}
BigDecimal maturityInterestRate = account.getInterestRate();
if(command.getMaturityInterestRate() != null){
if (command.getMaturityInterestRate() != null) {
maturityInterestRate = command.getMaturityInterestRate();
}
BigDecimal preClosureInterestRate = account.getPreClosureInterestRate();
if(command.getPreClosureInterestRate() != null){
if (command.getPreClosureInterestRate() != null) {
preClosureInterestRate = command.getPreClosureInterestRate();
}
if(product.getMaturityMinInterestRate().compareTo(preClosureInterestRate)==-1){
throw new DepositAccounDataValidationtException(preClosureInterestRate, product.getMaturityMinInterestRate());
}
if (product.getMaturityMinInterestRate().compareTo(preClosureInterestRate) == -1) { throw new DepositAccounDataValidationtException(
preClosureInterestRate, product.getMaturityMinInterestRate()); }
Integer compoundingInterestEvery = account.getInterestCompoundedEvery();
if(command.getInterestCompoundedEvery() != null){
if (command.getInterestCompoundedEvery() != null) {
compoundingInterestEvery = command.getInterestCompoundedEvery();
}
PeriodFrequencyType compoundingInterestFrequency = account.getInterestCompoundedFrequencyType();
if(command.getInterestCompoundedEveryPeriodType() !=null){
if (command.getInterestCompoundedEveryPeriodType() != null) {
compoundingInterestFrequency = PeriodFrequencyType.fromInt(command.getInterestCompoundedEveryPeriodType());
}
boolean renewalAllowed = account.isRenewalAllowed();
if(command.isRenewalAllowedChanged()){
if (command.isRenewalAllowedChanged()) {
renewalAllowed = command.isRenewalAllowed();
}
boolean preClosureAllowed = account.isPreClosureAllowed();
if(command.isPreClosureAllowedChanged()){
if (command.isPreClosureAllowedChanged()) {
preClosureAllowed = command.isPreClosureAllowed();
}
boolean isInterestWithdrawable = account.isInterestWithdrawable();
if(command.isInterestWithdrawableChanged()){
if (command.isInterestWithdrawableChanged()) {
isInterestWithdrawable = command.isInterestWithdrawable();
}
boolean isInterestCompoundingAllowed = account.isInterestCompoundingAllowed();
if(command.isInterestCompoundingAllowedChanged()){
if (command.isInterestCompoundingAllowedChanged()) {
isInterestCompoundingAllowed = command.isInterestCompoundingAllowed();
}
boolean isLockinPeriodAllowed = account.isLockinPeriodAllowed();
if(command.isLockinPeriodChanged()){
if (command.isLockinPeriodChanged()) {
isLockinPeriodAllowed = command.isLockinPeriodAllowed();
}
Integer lockinPeriod = account.getLockinPeriod();
if(command.getLockinPeriod() != null){
if (command.getLockinPeriod() != null) {
lockinPeriod = command.getLockinPeriod();
}
PeriodFrequencyType lockinPeriodType = account.getLockinPeriodType();
if(command.getLockinPeriodType() != null){
if (command.getLockinPeriodType() != null) {
lockinPeriodType = PeriodFrequencyType.fromInt(command.getLockinPeriodType());
}
DepositAccount newAccount =new DepositAccount().openNew(client, product, null,
deposit,
maturityInterestRate, preClosureInterestRate,
tenureInMonths, compoundingInterestEvery, compoundingInterestFrequency,
account.maturesOnDate().plusDays(1),
renewalAllowed, preClosureAllowed, this.fixedTermDepositInterestCalculator, defaultDepositLifecycleStateMachine(),
isInterestWithdrawable,isInterestCompoundingAllowed,isLockinPeriodAllowed,lockinPeriod,lockinPeriodType);
DepositAccount newAccount = new DepositAccount().openNew(client, product, null, deposit, maturityInterestRate,
preClosureInterestRate, tenureInMonths, compoundingInterestEvery, compoundingInterestFrequency, account.maturesOnDate()
.plusDays(1), renewalAllowed, preClosureAllowed, this.fixedTermDepositInterestCalculator,
defaultDepositLifecycleStateMachine(), isInterestWithdrawable, isInterestCompoundingAllowed, isLockinPeriodAllowed,
lockinPeriod, lockinPeriodType);
newAccount.updateAccount(account);
return newAccount;
}
/*public void adjustTotalAmountForPreclosureInterest(DepositAccount account,LocalDate eventDate) {
account.adjustTotalAmountForPreclosureInterest(account,this.fixedTermDepositInterestCalculator,eventDate);
}*/
/*
* public void adjustTotalAmountForPreclosureInterest(DepositAccount
* account,LocalDate eventDate) {
* account.adjustTotalAmountForPreclosureInterest
* (account,this.fixedTermDepositInterestCalculator,eventDate); }
*/
public void assembleUpdatedDepositAccount(DepositAccount account,DepositAccountCommand command) {
public void assembleUpdatedDepositAccount(DepositAccount account, DepositAccountCommand command) {
DepositProduct product = account.product();
if(command.getProductId() != null){
if (command.getProductId() != null) {
product = this.depositProductRepository.findOne(command.getProductId());
if (product == null || product.isDeleted()) {
throw new DepositProductNotFoundException(command.getProductId());
}
if (product == null || product.isDeleted()) { throw new DepositProductNotFoundException(command.getProductId()); }
}
String externalId = account.getExternalId();
if(command.isExternalIdChanged()){
if (command.isExternalIdChanged()) {
externalId = command.getExternalId();
}
LocalDate commencementDate = account.getProjectedCommencementDate();
if(command.isCommencementDateChanged()){
if (command.isCommencementDateChanged()) {
commencementDate = new LocalDate(command.getCommencementDate());
}
Money deposit = account.getDeposit();
if(command.isDepositAmountChanged()){
if (command.isDepositAmountChanged()) {
deposit = Money.of(product.getCurrency(), command.getDepositAmount());
}
Integer tenureInMonths = account.getTenureInMonths();
if(command.isTenureInMonthsChanged()){
tenureInMonths =command.getTenureInMonths();
if (command.isTenureInMonthsChanged()) {
tenureInMonths = command.getTenureInMonths();
}
BigDecimal maturityInterestRate = account.getInterestRate();
if(command.isMaturityActualInterestRateChanged()){
if (command.isMaturityActualInterestRateChanged()) {
maturityInterestRate = command.getMaturityInterestRate();
}
BigDecimal preClosureInterestRate = account.getPreClosureInterestRate();
if(command.isPreClosureInterestRateChanged()){
if (command.isPreClosureInterestRateChanged()) {
preClosureInterestRate = command.getPreClosureInterestRate();
}
if(product.getMaturityMinInterestRate().compareTo(preClosureInterestRate)==-1){
throw new DepositAccounDataValidationtException(preClosureInterestRate, product.getMaturityMinInterestRate());
}
if (product.getMaturityMinInterestRate().compareTo(preClosureInterestRate) == -1) { throw new DepositAccounDataValidationtException(
preClosureInterestRate, product.getMaturityMinInterestRate()); }
Integer compoundingInterestEvery = account.getInterestCompoundedEvery();
if(command.isCompoundingInterestEveryChanged()){
if (command.isCompoundingInterestEveryChanged()) {
compoundingInterestEvery = command.getInterestCompoundedEvery();
}
PeriodFrequencyType compoundingInterestFrequency = account.getInterestCompoundedFrequencyType();
if(command.getInterestCompoundedEveryPeriodType() !=null){
if (command.getInterestCompoundedEveryPeriodType() != null) {
compoundingInterestFrequency = PeriodFrequencyType.fromInt(command.getInterestCompoundedEveryPeriodType());
}
boolean renewalAllowed = account.isRenewalAllowed();
if(command.isRenewalAllowedChanged()){
if (command.isRenewalAllowedChanged()) {
renewalAllowed = command.isRenewalAllowed();
}
boolean preClosureAllowed = account.isPreClosureAllowed();
if(command.isPreClosureAllowedChanged()){
if (command.isPreClosureAllowedChanged()) {
preClosureAllowed = command.isPreClosureAllowed();
}
boolean isInterestWithdrawable = account.isInterestWithdrawable();
if(command.isInterestWithdrawableChanged()){
if (command.isInterestWithdrawableChanged()) {
isInterestWithdrawable = command.isInterestWithdrawable();
}
boolean isInterestCompoundingAllowed = account.isInterestCompoundingAllowed();
if(command.isInterestCompoundingAllowedChanged()){
if (command.isInterestCompoundingAllowedChanged()) {
isInterestCompoundingAllowed = command.isInterestCompoundingAllowed();
}
boolean isLockinPeriodAllowed = account.isLockinPeriodAllowed();
if(command.isLockinPeriodChanged()){
if (command.isLockinPeriodChanged()) {
isLockinPeriodAllowed = command.isLockinPeriodAllowed();
}
Integer lockinPeriod = account.getLockinPeriod();
if(command.getLockinPeriod() != null){
if (command.getLockinPeriod() != null) {
lockinPeriod = command.getLockinPeriod();
}
PeriodFrequencyType lockinPeriodType = account.getLockinPeriodType();
if(command.getLockinPeriodType() != null){
if (command.getLockinPeriodType() != null) {
lockinPeriodType = PeriodFrequencyType.fromInt(command.getLockinPeriodType());
}
account.update(product,externalId,commencementDate,deposit,tenureInMonths,maturityInterestRate,preClosureInterestRate,compoundingInterestEvery,compoundingInterestFrequency,renewalAllowed,
preClosureAllowed,isInterestWithdrawable,isInterestCompoundingAllowed,this.fixedTermDepositInterestCalculator,isLockinPeriodAllowed,lockinPeriod,lockinPeriodType);
account.update(product, externalId, commencementDate, deposit, tenureInMonths, maturityInterestRate, preClosureInterestRate,
compoundingInterestEvery, compoundingInterestFrequency, renewalAllowed, preClosureAllowed, isInterestWithdrawable,
isInterestCompoundingAllowed, this.fixedTermDepositInterestCalculator, isLockinPeriodAllowed, lockinPeriod,
lockinPeriodType);
}
public void updateApprovedDepositAccount(DepositAccount account, DepositAccountCommand command) {
boolean renewalAllowed = account.isRenewalAllowed();
if(command.isRenewalAllowedChanged()){
if (command.isRenewalAllowedChanged()) {
renewalAllowed = command.isRenewalAllowed();
}
boolean isInterestWithdrawable = account.isInterestWithdrawable();
if(command.isInterestWithdrawableChanged()){
if (command.isInterestWithdrawableChanged()) {
isInterestWithdrawable = command.isInterestWithdrawable();
}
account.update(renewalAllowed,isInterestWithdrawable);
account.update(renewalAllowed, isInterestWithdrawable);
}
public void postInterest(DepositAccount account) {
account.postInterestForDepositAccount(account,this.fixedTermDepositInterestCalculator);
account.postInterestForDepositAccount(account, this.fixedTermDepositInterestCalculator);
}
}
@@ -13,31 +13,42 @@ public class DepositAccountEnumerations {
EnumOptionData optionData = null;
switch (status) {
case SUBMITED_AND_PENDING_APPROVAL:
optionData = new EnumOptionData(DepositAccountStatus.SUBMITED_AND_PENDING_APPROVAL.getValue().longValue(), DepositAccountStatus.SUBMITED_AND_PENDING_APPROVAL.getCode(), "Submitted and pending approval");
optionData = new EnumOptionData(DepositAccountStatus.SUBMITED_AND_PENDING_APPROVAL.getValue().longValue(),
DepositAccountStatus.SUBMITED_AND_PENDING_APPROVAL.getCode(), "Submitted and pending approval");
break;
/*case APPROVED:
optionData = new EnumOptionData(DepositAccountStatus.APPROVED.getValue().longValue(), DepositAccountStatus.APPROVED.getCode(), "Approved");
break;*/
/*
* case APPROVED: optionData = new
* EnumOptionData(DepositAccountStatus
* .APPROVED.getValue().longValue(),
* DepositAccountStatus.APPROVED.getCode(), "Approved"); break;
*/
case ACTIVE:
optionData = new EnumOptionData(DepositAccountStatus.ACTIVE.getValue().longValue(), DepositAccountStatus.ACTIVE.getCode(), "Active");
optionData = new EnumOptionData(DepositAccountStatus.ACTIVE.getValue().longValue(), DepositAccountStatus.ACTIVE.getCode(),
"Active");
break;
case REJECTED:
optionData = new EnumOptionData(DepositAccountStatus.REJECTED.getValue().longValue(), DepositAccountStatus.REJECTED.getCode(), "Rejected");
optionData = new EnumOptionData(DepositAccountStatus.REJECTED.getValue().longValue(),
DepositAccountStatus.REJECTED.getCode(), "Rejected");
break;
case WITHDRAWN_BY_CLIENT:
optionData = new EnumOptionData(DepositAccountStatus.WITHDRAWN_BY_CLIENT.getValue().longValue(), DepositAccountStatus.WITHDRAWN_BY_CLIENT.getCode(), "Withdrawn by applicant");
optionData = new EnumOptionData(DepositAccountStatus.WITHDRAWN_BY_CLIENT.getValue().longValue(),
DepositAccountStatus.WITHDRAWN_BY_CLIENT.getCode(), "Withdrawn by applicant");
break;
case MATURED:
optionData = new EnumOptionData(DepositAccountStatus.MATURED.getValue().longValue(), DepositAccountStatus.MATURED.getCode(), "Matured");
optionData = new EnumOptionData(DepositAccountStatus.MATURED.getValue().longValue(),
DepositAccountStatus.MATURED.getCode(), "Matured");
break;
case CLOSED:
optionData = new EnumOptionData(DepositAccountStatus.CLOSED.getValue().longValue(), DepositAccountStatus.CLOSED.getCode(), "Closed");
optionData = new EnumOptionData(DepositAccountStatus.CLOSED.getValue().longValue(), DepositAccountStatus.CLOSED.getCode(),
"Closed");
break;
case PRECLOSED:
optionData = new EnumOptionData(DepositAccountStatus.PRECLOSED.getValue().longValue(), DepositAccountStatus.PRECLOSED.getCode(), "Preclosed");
optionData = new EnumOptionData(DepositAccountStatus.PRECLOSED.getValue().longValue(),
DepositAccountStatus.PRECLOSED.getCode(), "Preclosed");
break;
default:
optionData = new EnumOptionData(DepositAccountStatus.INVALID.getValue().longValue(), DepositAccountStatus.INVALID.getCode(), "Invalid");
optionData = new EnumOptionData(DepositAccountStatus.INVALID.getValue().longValue(),
DepositAccountStatus.INVALID.getCode(), "Invalid");
break;
}
return optionData;
@@ -219,7 +219,8 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead
projectedInterestAccrued, actualInterestAccrued, projectedMaturityAmount, actualMaturityAmount,
interestCompoundedEvery, interestCompoundedEveryPeriodType, renewalAllowed, preClosureAllowed, preClosureInterestRate,
withdrawnonDate, rejectedonDate, closedonDate, isInterestWithdrawable, interestPaid, interestCompoundingAllowed,
isLockinPeriodAllowed, lockinPeriod, lockinPeriodType, availableInterest, interestPostedAmount, lastInterestPostedDate, nextInterestPostedDate);
isLockinPeriodAllowed, lockinPeriod, lockinPeriodType, availableInterest, interestPostedAmount, lastInterestPostedDate,
nextInterestPostedDate);
}
}
@@ -254,7 +255,18 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead
boolean undoApprovalAllowed = (depositAccountData.getStatus().getId().equals(300L));
boolean renewelAllowed = false;
if (depositAccountData.getMaturedOn() != null) {
if (new LocalDate().isAfter(depositAccountData.getMaturedOn())/* || depositAccountData.getMaturedOn().isEqual(new LocalDate()) */) {
if (new LocalDate().isAfter(depositAccountData.getMaturedOn())/*
* ||
* depositAccountData
* .
* getMaturedOn
* ().
* isEqual
* (
* new
* LocalDate
* ())
*/) {
renewelAllowed = depositAccountData.isRenewalAllowed();
}
}
@@ -282,19 +294,19 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead
this.context.authenticatedUser();
DepositAccountLookupMapper mapper = new DepositAccountLookupMapper();
String sql = "select "+mapper.depositAccountLookupSchema();
return this.jdbcTemplate.query(sql, mapper, new Object[]{});
String sql = "select " + mapper.depositAccountLookupSchema();
return this.jdbcTemplate.query(sql, mapper, new Object[] {});
}
private static final class DepositAccountLookupMapper implements RowMapper<DepositAccountsForLookup> {
public String depositAccountLookupSchema(){
public String depositAccountLookupSchema() {
return " da.id as id from m_deposit_account da where da.status_enum=300 and da.is_deleted=0";
}
@Override
public DepositAccountsForLookup mapRow(ResultSet rs, int rowNum) throws SQLException {
public DepositAccountsForLookup mapRow(ResultSet rs, @SuppressWarnings("unused") int rowNum) throws SQLException {
Long id = rs.getLong("id");
return new DepositAccountsForLookup(id);
}
@@ -11,21 +11,25 @@ public class DepositAccountTransactionEnumerations {
private static EnumOptionData depositType(DepositAccountTransactionType transactionType) {
EnumOptionData optionData=null;
EnumOptionData optionData = null;
switch (transactionType) {
case DEPOSIT:
optionData=new EnumOptionData(DepositAccountTransactionType.DEPOSIT.getValue().longValue(), DepositAccountTransactionType.DEPOSIT.getCode(), "Deposit");
optionData = new EnumOptionData(DepositAccountTransactionType.DEPOSIT.getValue().longValue(),
DepositAccountTransactionType.DEPOSIT.getCode(), "Deposit");
break;
case WITHDRAW:
optionData=new EnumOptionData(DepositAccountTransactionType.WITHDRAW.getValue().longValue(), DepositAccountTransactionType.WITHDRAW.getCode(), "Withdraw");
optionData = new EnumOptionData(DepositAccountTransactionType.WITHDRAW.getValue().longValue(),
DepositAccountTransactionType.WITHDRAW.getCode(), "Withdraw");
break;
case REVERSAL:
optionData=new EnumOptionData(DepositAccountTransactionType.REVERSAL.getValue().longValue(), DepositAccountTransactionType.REVERSAL.getCode(), "Revarsal");
optionData = new EnumOptionData(DepositAccountTransactionType.REVERSAL.getValue().longValue(),
DepositAccountTransactionType.REVERSAL.getCode(), "Revarsal");
break;
default:
optionData=new EnumOptionData(DepositAccountTransactionType.INVALID.getValue().longValue(), DepositAccountTransactionType.INVALID.getCode(), "Invalid Transaction");
optionData = new EnumOptionData(DepositAccountTransactionType.INVALID.getValue().longValue(),
DepositAccountTransactionType.INVALID.getCode(), "Invalid Transaction");
break;
}
return optionData;
@@ -306,7 +306,8 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
"You can not withdraw your application before maturity date reached"); }
}
// if (eventDate.isBefore(account.maturesOnDate())) {
// this.depositAccountAssembler.adjustTotalAmountForPreclosureInterest(account, eventDate);
// this.depositAccountAssembler.adjustTotalAmountForPreclosureInterest(account,
// eventDate);
// }
account.withdrawDepositAccountMoney(defaultDepositLifecycleStateMachine(), fixedTermDepositInterestCalculator, eventDate);
this.depositAccountRepository.save(account);
@@ -428,12 +429,9 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
try {
for (DepositAccountsForLookup accountData : accounts)
{
for (DepositAccountsForLookup accountData : accounts) {
DepositAccount account = this.depositAccountRepository.findOne(accountData.getId());
if (account == null || account.isDeleted()) {
throw new DepositAccountNotFoundException(accountData.getId());
}
if (account == null || account.isDeleted()) { throw new DepositAccountNotFoundException(accountData.getId()); }
this.depositAccountAssembler.postInterest(account);
this.depositAccountRepository.save(account);
}
@@ -13,10 +13,10 @@ public class DepositStateTransitionCommandValidator {
private final DepositStateTransitionCommand command;
public DepositStateTransitionCommandValidator(final DepositStateTransitionCommand command) {
this.command=command;
this.command = command;
}
public void validate(){
public void validate() {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("deposit.transition");
@@ -24,9 +24,7 @@ public class DepositStateTransitionCommandValidator {
baseDataValidator.reset().parameter("eventDate").value(command.getEventDate()).notNull();
baseDataValidator.reset().parameter("note").value(command.getNote()).notNull();
if (!dataValidationErrors.isEmpty()) {
throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors);
if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist",
"Validation errors exist.", dataValidationErrors); }
}
}
}
@@ -13,7 +13,7 @@ public class RenewDepositAccountCommandValidator {
private final DepositAccountCommand command;
public RenewDepositAccountCommandValidator(final DepositAccountCommand command) {
this.command=command;
this.command = command;
}
public void validateForCreate() {
@@ -27,17 +27,20 @@ public class RenewDepositAccountCommandValidator {
baseDataValidator.reset().parameter("externalId").value(command.getExternalId()).ignoreIfNull().notExceedingLengthOf(100);
baseDataValidator.reset().parameter("deposit").value(command.getDepositAmount()).ignoreIfNull().zeroOrPositiveAmount();
baseDataValidator.reset().parameter("maturityInterestRate").value(command.getMaturityInterestRate()).ignoreIfNull().zeroOrPositiveAmount();
baseDataValidator.reset().parameter("preClosureInterestRate").value(command.getPreClosureInterestRate()).ignoreIfNull().zeroOrPositiveAmount();
baseDataValidator.reset().parameter("maturityInterestRate").value(command.getMaturityInterestRate()).ignoreIfNull()
.zeroOrPositiveAmount();
baseDataValidator.reset().parameter("preClosureInterestRate").value(command.getPreClosureInterestRate()).ignoreIfNull()
.zeroOrPositiveAmount();
baseDataValidator.reset().parameter("tenureInMonths").value(command.getTenureInMonths()).ignoreIfNull().integerGreaterThanZero();
baseDataValidator.reset().parameter("interestCompoundedEvery").value(command.getInterestCompoundedEvery()).ignoreIfNull().integerGreaterThanZero();
baseDataValidator.reset().parameter("interestCompoundedEveryPeriodType").value(command.getInterestCompoundedEveryPeriodType()).ignoreIfNull().inMinMaxRange(2, 2);
baseDataValidator.reset().parameter("interestCompoundedEvery").value(command.getInterestCompoundedEvery()).ignoreIfNull()
.integerGreaterThanZero();
baseDataValidator.reset().parameter("interestCompoundedEveryPeriodType").value(command.getInterestCompoundedEveryPeriodType())
.ignoreIfNull().inMinMaxRange(2, 2);
baseDataValidator.reset().parameter("commencementDate").value(command.getCommencementDate()).ignoreIfNull();
if (!dataValidationErrors.isEmpty()) {
throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors);
}
if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist",
"Validation errors exist.", dataValidationErrors); }
}
}