Add edit option for deposit account
This commit is contained in:
+14
@@ -10,6 +10,7 @@ import javax.ws.rs.Consumes;
|
|||||||
import javax.ws.rs.DELETE;
|
import javax.ws.rs.DELETE;
|
||||||
import javax.ws.rs.GET;
|
import javax.ws.rs.GET;
|
||||||
import javax.ws.rs.POST;
|
import javax.ws.rs.POST;
|
||||||
|
import javax.ws.rs.PUT;
|
||||||
import javax.ws.rs.Path;
|
import javax.ws.rs.Path;
|
||||||
import javax.ws.rs.PathParam;
|
import javax.ws.rs.PathParam;
|
||||||
import javax.ws.rs.Produces;
|
import javax.ws.rs.Produces;
|
||||||
@@ -87,6 +88,19 @@ public class DepositAccountsApiResource {
|
|||||||
return Response.ok().entity(entityIdentifier).build();
|
return Response.ok().entity(entityIdentifier).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@PUT
|
||||||
|
@Path("{accountId}")
|
||||||
|
@Consumes({MediaType.APPLICATION_JSON})
|
||||||
|
@Produces({MediaType.APPLICATION_JSON})
|
||||||
|
public Response updateDepositAccount(@PathParam("accountId") final Long accountId,final String jsonRequestBody){
|
||||||
|
|
||||||
|
final DepositAccountCommand command = this.apiDataConversionService.convertJsonToDepositAccountCommand(accountId, jsonRequestBody);
|
||||||
|
|
||||||
|
EntityIdentifier entityIdentifier = this.depositAccountWritePlatformService.updateDepositAccount(command);
|
||||||
|
|
||||||
|
return Response.ok().entity(entityIdentifier).build();
|
||||||
|
}
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Consumes({MediaType.APPLICATION_JSON})
|
@Consumes({MediaType.APPLICATION_JSON})
|
||||||
@Produces({MediaType.APPLICATION_JSON})
|
@Produces({MediaType.APPLICATION_JSON})
|
||||||
|
|||||||
+21
-1
@@ -123,19 +123,35 @@ public class DepositAccountCommand {
|
|||||||
public boolean isNoFieldChanged() {
|
public boolean isNoFieldChanged() {
|
||||||
return this.modifiedParameters.isEmpty();
|
return this.modifiedParameters.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isExternalIdChanged(){
|
||||||
|
return this.modifiedParameters.contains("externalId");
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isDepositAmountChanged(){
|
||||||
|
return this.modifiedParameters.contains("deposit");
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isTenureInMonthsChanged() {
|
public boolean isTenureInMonthsChanged() {
|
||||||
return this.modifiedParameters.contains("tenureInMonths");
|
return this.modifiedParameters.contains("tenureInMonths");
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isMaturityActualInterestRateChanged() {
|
public boolean isMaturityActualInterestRateChanged() {
|
||||||
return this.modifiedParameters.contains("interestRate");
|
return this.modifiedParameters.contains("maturityInterestRate");
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isPreClosureInterestRateChanged(){
|
public boolean isPreClosureInterestRateChanged(){
|
||||||
return this.modifiedParameters.contains("preClosureInterestRate");
|
return this.modifiedParameters.contains("preClosureInterestRate");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isCompoundingInterestEveryChanged(){
|
||||||
|
return this.modifiedParameters.contains("interestCompoundedEvery");
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isInterestCompoundedEveryPeriodTypeChaged(){
|
||||||
|
return this.modifiedParameters.contains("interestCompoundedEveryPeriodType");
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isRenewalAllowedChanged() {
|
public boolean isRenewalAllowedChanged() {
|
||||||
return this.modifiedParameters.contains("renewalAllowed");
|
return this.modifiedParameters.contains("renewalAllowed");
|
||||||
}
|
}
|
||||||
@@ -151,4 +167,8 @@ public class DepositAccountCommand {
|
|||||||
public boolean isInterestCompoundingAllowedChanged(){
|
public boolean isInterestCompoundingAllowedChanged(){
|
||||||
return this.modifiedParameters.contains("interestCompoundingAllowed");
|
return this.modifiedParameters.contains("interestCompoundingAllowed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isCommencementDateChanged() {
|
||||||
|
return this.modifiedParameters.contains("commencementDate");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+9
-1
@@ -1,14 +1,18 @@
|
|||||||
package org.mifosng.platform.api.commands;
|
package org.mifosng.platform.api.commands;
|
||||||
|
|
||||||
|
import org.joda.time.LocalDate;
|
||||||
|
|
||||||
|
|
||||||
public class DepositAccountWithdrawalCommand {
|
public class DepositAccountWithdrawalCommand {
|
||||||
|
|
||||||
private final Long accountId;
|
private final Long accountId;
|
||||||
private final String note;
|
private final String note;
|
||||||
|
private final LocalDate maturesOnDate;
|
||||||
|
|
||||||
public DepositAccountWithdrawalCommand(final Long accountId, final String note) {
|
public DepositAccountWithdrawalCommand(final Long accountId, final String note, final LocalDate maturesOnDate) {
|
||||||
this.accountId = accountId;
|
this.accountId = accountId;
|
||||||
this.note = note;
|
this.note = note;
|
||||||
|
this.maturesOnDate=maturesOnDate;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Long getAccountId() {
|
public Long getAccountId() {
|
||||||
@@ -18,4 +22,8 @@ public class DepositAccountWithdrawalCommand {
|
|||||||
public String getNote() {
|
public String getNote() {
|
||||||
return note;
|
return note;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public LocalDate getMaturesOnDate() {
|
||||||
|
return maturesOnDate;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-1
@@ -10,17 +10,20 @@ public class DepositStateTransitionApprovalCommand {
|
|||||||
private final Long productId;
|
private final Long productId;
|
||||||
private final LocalDate eventDate;
|
private final LocalDate eventDate;
|
||||||
private final BigDecimal depositAmount;
|
private final BigDecimal depositAmount;
|
||||||
|
private final BigDecimal maturityInterestRate;
|
||||||
private final Integer tenureInMonths;
|
private final Integer tenureInMonths;
|
||||||
private final Integer interestCompoundedEveryPeriodType;
|
private final Integer interestCompoundedEveryPeriodType;
|
||||||
private final Integer interestCompoundedEvery;
|
private final Integer interestCompoundedEvery;
|
||||||
|
|
||||||
private final String note;
|
private final String note;
|
||||||
|
|
||||||
public DepositStateTransitionApprovalCommand(Long resourceIdentifier, Long productId, LocalDate eventDate, Integer tenureInMonths, BigDecimal depositAmount, Integer interestCompoundedEveryPeriodType, Integer interestCompoundedEvery, String note) {
|
public DepositStateTransitionApprovalCommand(final Long resourceIdentifier,final Long productId,final LocalDate eventDate,final Integer tenureInMonths,
|
||||||
|
final BigDecimal depositAmount,final Integer interestCompoundedEveryPeriodType,final Integer interestCompoundedEvery,final String note,final BigDecimal maturityInterestRate) {
|
||||||
|
|
||||||
this.accountId=resourceIdentifier;
|
this.accountId=resourceIdentifier;
|
||||||
this.eventDate=eventDate;
|
this.eventDate=eventDate;
|
||||||
this.depositAmount=depositAmount;
|
this.depositAmount=depositAmount;
|
||||||
|
this.maturityInterestRate=maturityInterestRate;
|
||||||
this.tenureInMonths=tenureInMonths;
|
this.tenureInMonths=tenureInMonths;
|
||||||
this.interestCompoundedEveryPeriodType=interestCompoundedEveryPeriodType;
|
this.interestCompoundedEveryPeriodType=interestCompoundedEveryPeriodType;
|
||||||
this.productId=productId;
|
this.productId=productId;
|
||||||
@@ -42,6 +45,10 @@ public class DepositStateTransitionApprovalCommand {
|
|||||||
return depositAmount;
|
return depositAmount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public BigDecimal getMaturityInterestRate() {
|
||||||
|
return maturityInterestRate;
|
||||||
|
}
|
||||||
|
|
||||||
public Integer getTenureInMonths() {
|
public Integer getTenureInMonths() {
|
||||||
return tenureInMonths;
|
return tenureInMonths;
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-4
@@ -259,8 +259,8 @@ public class DepositAccountData {
|
|||||||
this.interestPaid =interestPaid;
|
this.interestPaid =interestPaid;
|
||||||
this.isInterestWithdrawable=isInterestWithdrawable;
|
this.isInterestWithdrawable=isInterestWithdrawable;
|
||||||
this.interestCompoundingAllowed = interestCompoundingAllowed;
|
this.interestCompoundingAllowed = interestCompoundingAllowed;
|
||||||
this.availableInterestForWithdrawal = new BigDecimal(0);
|
this.availableInterestForWithdrawal = BigDecimal.ZERO;
|
||||||
this.availableWithdrawalAmount = new BigDecimal(0);
|
this.availableWithdrawalAmount = BigDecimal.ZERO;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DepositAccountData(
|
public DepositAccountData(
|
||||||
@@ -313,8 +313,8 @@ public class DepositAccountData {
|
|||||||
this.interestPaid=null;
|
this.interestPaid=null;
|
||||||
this.isInterestWithdrawable=false;
|
this.isInterestWithdrawable=false;
|
||||||
this.interestCompoundingAllowed=interestCompoundingAllowed;
|
this.interestCompoundingAllowed=interestCompoundingAllowed;
|
||||||
this.availableInterestForWithdrawal= new BigDecimal(0);
|
this.availableInterestForWithdrawal= BigDecimal.ZERO;
|
||||||
this.availableWithdrawalAmount = new BigDecimal(0);
|
this.availableWithdrawalAmount = BigDecimal.ZERO;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Long getId() {
|
public Long getId() {
|
||||||
|
|||||||
+2
-2
@@ -98,10 +98,10 @@ public class DepositProductData {
|
|||||||
this.currencyCode=null;
|
this.currencyCode=null;
|
||||||
this.digitsAfterDecimal=Integer.valueOf(0);
|
this.digitsAfterDecimal=Integer.valueOf(0);
|
||||||
this.minimumBalance=BigDecimal.ZERO;
|
this.minimumBalance=BigDecimal.ZERO;
|
||||||
this.maximumBalance=null;
|
this.maximumBalance=BigDecimal.ZERO;
|
||||||
|
|
||||||
this.tenureInMonths=Integer.valueOf(0);
|
this.tenureInMonths=Integer.valueOf(0);
|
||||||
this.maturityDefaultInterestRate = null;
|
this.maturityDefaultInterestRate = BigDecimal.ZERO;
|
||||||
this.maturityMinInterestRate=BigDecimal.ZERO;
|
this.maturityMinInterestRate=BigDecimal.ZERO;
|
||||||
this.maturityMaxInterestRate=BigDecimal.ZERO;
|
this.maturityMaxInterestRate=BigDecimal.ZERO;
|
||||||
this.interestCompoundedEvery = Integer.valueOf(1);
|
this.interestCompoundedEvery = Integer.valueOf(1);
|
||||||
|
|||||||
+6
-4
@@ -1371,7 +1371,7 @@ public class ApiDataConversionServiceImpl implements ApiDataConversionService {
|
|||||||
Type typeOfMap = new TypeToken<Map<String, String>>(){}.getType();
|
Type typeOfMap = new TypeToken<Map<String, String>>(){}.getType();
|
||||||
Map<String, String> requestMap = gsonConverter.fromJson(json, typeOfMap);
|
Map<String, String> requestMap = gsonConverter.fromJson(json, typeOfMap);
|
||||||
|
|
||||||
Set<String> supportedParams = new HashSet<String>(Arrays.asList("locale","commencementDate", "locale", "dateFormat", "tenureInMonths", "deposit", "interestCompoundedEveryPeriodType", "productId","interestCompoundedEvery","note"));
|
Set<String> supportedParams = new HashSet<String>(Arrays.asList("locale","commencementDate", "locale", "dateFormat", "tenureInMonths", "deposit", "interestCompoundedEveryPeriodType", "productId","interestCompoundedEvery","note","maturityInterestRate"));
|
||||||
|
|
||||||
checkForUnsupportedParameters(requestMap, supportedParams);
|
checkForUnsupportedParameters(requestMap, supportedParams);
|
||||||
|
|
||||||
@@ -1379,13 +1379,14 @@ public class ApiDataConversionServiceImpl implements ApiDataConversionService {
|
|||||||
|
|
||||||
LocalDate commencementDate = extractLocalDateParameter("commencementDate", requestMap, modifiedParameters);
|
LocalDate commencementDate = extractLocalDateParameter("commencementDate", requestMap, modifiedParameters);
|
||||||
BigDecimal deposit=extractBigDecimalParameter("deposit", requestMap, modifiedParameters);
|
BigDecimal deposit=extractBigDecimalParameter("deposit", requestMap, modifiedParameters);
|
||||||
|
BigDecimal maturityInterestRate=extractBigDecimalParameter("maturityInterestRate", requestMap, modifiedParameters);
|
||||||
Integer tenureInMonths = extractIntegerParameter("tenureInMonths", requestMap, modifiedParameters);
|
Integer tenureInMonths = extractIntegerParameter("tenureInMonths", requestMap, modifiedParameters);
|
||||||
Integer interestCompoundedEveryPeriodType = extractIntegerParameter("interestCompoundedEveryPeriodType", requestMap, modifiedParameters);
|
Integer interestCompoundedEveryPeriodType = extractIntegerParameter("interestCompoundedEveryPeriodType", requestMap, modifiedParameters);
|
||||||
Integer interestCompoundedEvery = extractIntegerParameter("interestCompoundedEvery", requestMap, modifiedParameters);
|
Integer interestCompoundedEvery = extractIntegerParameter("interestCompoundedEvery", requestMap, modifiedParameters);
|
||||||
Long productId = extractLongParameter("productId", requestMap, modifiedParameters);
|
Long productId = extractLongParameter("productId", requestMap, modifiedParameters);
|
||||||
String note = extractStringParameter("note", requestMap, modifiedParameters);
|
String note = extractStringParameter("note", requestMap, modifiedParameters);
|
||||||
|
|
||||||
return new DepositStateTransitionApprovalCommand(resourceIdentifier, productId, commencementDate, tenureInMonths, deposit, interestCompoundedEveryPeriodType,interestCompoundedEvery, note);
|
return new DepositStateTransitionApprovalCommand(resourceIdentifier, productId, commencementDate, tenureInMonths, deposit, interestCompoundedEveryPeriodType,interestCompoundedEvery, note,maturityInterestRate);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1398,15 +1399,16 @@ public class ApiDataConversionServiceImpl implements ApiDataConversionService {
|
|||||||
Type typeOfMap = new TypeToken<Map<String, String>>(){}.getType();
|
Type typeOfMap = new TypeToken<Map<String, String>>(){}.getType();
|
||||||
Map<String, String> requestMap = gsonConverter.fromJson(json, typeOfMap);
|
Map<String, String> requestMap = gsonConverter.fromJson(json, typeOfMap);
|
||||||
|
|
||||||
Set<String> supportedParams = new HashSet<String>(Arrays.asList("note","locale"));
|
Set<String> supportedParams = new HashSet<String>(Arrays.asList("note","locale","maturesOnDate", "dateFormat"));
|
||||||
|
|
||||||
checkForUnsupportedParameters(requestMap, supportedParams);
|
checkForUnsupportedParameters(requestMap, supportedParams);
|
||||||
|
|
||||||
Set<String> modifiedParameters = new HashSet<String>();
|
Set<String> modifiedParameters = new HashSet<String>();
|
||||||
|
|
||||||
String note = extractStringParameter("note", requestMap, modifiedParameters);
|
String note = extractStringParameter("note", requestMap, modifiedParameters);
|
||||||
|
LocalDate maturesOnDate = extractLocalDateParameter("maturesOnDate", requestMap, modifiedParameters);
|
||||||
|
|
||||||
return new DepositAccountWithdrawalCommand(resourceIdentifier,note);
|
return new DepositAccountWithdrawalCommand(resourceIdentifier,note,maturesOnDate);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+59
-1
@@ -44,7 +44,7 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
|
|||||||
|
|
||||||
@ManyToOne
|
@ManyToOne
|
||||||
@JoinColumn(name = "product_id")
|
@JoinColumn(name = "product_id")
|
||||||
private final DepositProduct product;
|
private DepositProduct product;
|
||||||
|
|
||||||
@Column(name = "external_id")
|
@Column(name = "external_id")
|
||||||
private String externalId;
|
private String externalId;
|
||||||
@@ -266,9 +266,15 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
|
|||||||
this.tenureInMonths = command.getTenureInMonths();
|
this.tenureInMonths = command.getTenureInMonths();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(command.getMaturityInterestRate() != null){
|
||||||
|
this.interestRate = command.getMaturityInterestRate();
|
||||||
|
}
|
||||||
|
this.product.validateInterestRateInRange(this.interestRate);
|
||||||
|
|
||||||
if (command.getDepositAmount() != null) {
|
if (command.getDepositAmount() != null) {
|
||||||
this.depositAmount = command.getDepositAmount();
|
this.depositAmount = command.getDepositAmount();
|
||||||
}
|
}
|
||||||
|
this.product.validateDepositInRange(this.depositAmount);
|
||||||
|
|
||||||
if (command.getInterestCompoundedEveryPeriodType() != null) {
|
if (command.getInterestCompoundedEveryPeriodType() != null) {
|
||||||
this.interestCompoundedFrequencyType = PeriodFrequencyType.fromInt(command.getInterestCompoundedEveryPeriodType()).getValue();
|
this.interestCompoundedFrequencyType = PeriodFrequencyType.fromInt(command.getInterestCompoundedEveryPeriodType()).getValue();
|
||||||
@@ -418,6 +424,8 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
|
|||||||
this.depositStatus = statusEnum.getValue();
|
this.depositStatus = statusEnum.getValue();
|
||||||
|
|
||||||
this.actualCommencementDate = null;
|
this.actualCommencementDate = null;
|
||||||
|
this.projectedInterestAccruedOnMaturity=this.interestAccrued;
|
||||||
|
this.projectedTotalOnMaturity = this.depositAmount.add(this.projectedInterestAccruedOnMaturity);
|
||||||
this.maturesOnDate = getProjectedCommencementDate().plusMonths(this.tenureInMonths).toDate();
|
this.maturesOnDate = getProjectedCommencementDate().plusMonths(this.tenureInMonths).toDate();
|
||||||
this.total=null;
|
this.total=null;
|
||||||
this.interestAccrued=null;
|
this.interestAccrued=null;
|
||||||
@@ -580,4 +588,54 @@ public class DepositAccount extends AbstractAuditableCustom<AppUser, Long> {
|
|||||||
|
|
||||||
this.closedOnDate = new LocalDate().toDate();
|
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 DepositLifecycleStateMachine depositLifecycleStateMachine) {
|
||||||
|
|
||||||
|
Money futureValueOnMaturity =null;
|
||||||
|
|
||||||
|
if (isInterestCompoundingAllowed) {
|
||||||
|
futureValueOnMaturity = fixedTermDepositInterestCalculator.calculateInterestOnMaturityFor(deposit, tenureInMonths,
|
||||||
|
maturityInterestRate, interestCompoundedEvery,
|
||||||
|
compoundingInterestFrequency);
|
||||||
|
} else {
|
||||||
|
futureValueOnMaturity = fixedTermDepositInterestCalculator.calculateInterestOnMaturityForSimpleInterest(deposit,
|
||||||
|
tenureInMonths, maturityInterestRate,
|
||||||
|
interestCompoundedEvery,
|
||||||
|
compoundingInterestFrequency);
|
||||||
|
}
|
||||||
|
|
||||||
|
setExternalId(externalId);
|
||||||
|
if (commencementDate != null) {
|
||||||
|
this.projectedCommencementDate = commencementDate.toDate();
|
||||||
|
this.maturesOnDate = commencementDate.plusMonths(this.tenureInMonths).toDate();
|
||||||
|
}
|
||||||
|
this.product = product;
|
||||||
|
this.depositAmount = deposit.getAmount();
|
||||||
|
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.projectedInterestAccruedOnMaturity = futureValueOnMaturity.minus(deposit).getAmount();
|
||||||
|
this.projectedTotalOnMaturity = futureValueOnMaturity.getAmount();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void update(final boolean renewalAllowed, final boolean isInterestWithdrawable) {
|
||||||
|
this.renewalAllowed=renewalAllowed;
|
||||||
|
this.isInterestWithdrawable=isInterestWithdrawable;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+93
@@ -4,6 +4,7 @@ import java.math.BigDecimal;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.joda.time.LocalDate;
|
||||||
import org.mifosng.platform.api.commands.DepositAccountCommand;
|
import org.mifosng.platform.api.commands.DepositAccountCommand;
|
||||||
import org.mifosng.platform.client.domain.Client;
|
import org.mifosng.platform.client.domain.Client;
|
||||||
import org.mifosng.platform.client.domain.ClientRepository;
|
import org.mifosng.platform.client.domain.ClientRepository;
|
||||||
@@ -201,4 +202,96 @@ public class DepositAccountAssembler {
|
|||||||
public void adjustTotalAmountForPreclosureInterest(DepositAccount account) {
|
public void adjustTotalAmountForPreclosureInterest(DepositAccount account) {
|
||||||
account.adjustTotalAmountForPreclosureInterest(account,this.fixedTermDepositInterestCalculator);
|
account.adjustTotalAmountForPreclosureInterest(account,this.fixedTermDepositInterestCalculator);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void assembleUpdatedDepositAccount(DepositAccount account,DepositAccountCommand command) {
|
||||||
|
|
||||||
|
DepositProduct product = account.product();
|
||||||
|
if(command.getProductId() != null){
|
||||||
|
product = this.depositProductRepository.findOne(command.getProductId());
|
||||||
|
if (product == null || product.isDeleted()) {
|
||||||
|
throw new DepositProductNotFoundException(command.getProductId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String externalId = account.getExternalId();
|
||||||
|
if(command.isExternalIdChanged()){
|
||||||
|
externalId = command.getExternalId();
|
||||||
|
}
|
||||||
|
|
||||||
|
LocalDate commencementDate = account.getProjectedCommencementDate();
|
||||||
|
if(command.isCommencementDateChanged()){
|
||||||
|
commencementDate = new LocalDate(command.getCommencementDate());
|
||||||
|
}
|
||||||
|
|
||||||
|
Money deposit = account.getDeposit();
|
||||||
|
if(command.isDepositAmountChanged()){
|
||||||
|
deposit = Money.of(product.getCurrency(), command.getDepositAmount());
|
||||||
|
}
|
||||||
|
|
||||||
|
Integer tenureInMonths = account.getTenureInMonths();
|
||||||
|
if(command.isTenureInMonthsChanged()){
|
||||||
|
tenureInMonths =command.getTenureInMonths();
|
||||||
|
}
|
||||||
|
|
||||||
|
BigDecimal maturityInterestRate = account.getInterestRate();
|
||||||
|
if(command.isMaturityActualInterestRateChanged()){
|
||||||
|
maturityInterestRate = command.getMaturityInterestRate();
|
||||||
|
}
|
||||||
|
|
||||||
|
BigDecimal preClosureInterestRate = account.getPreClosureInterestRate();
|
||||||
|
if(command.isPreClosureInterestRateChanged()){
|
||||||
|
preClosureInterestRate = command.getPreClosureInterestRate();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(product.getMaturityMinInterestRate().compareTo(preClosureInterestRate)==-1){
|
||||||
|
throw new DepositAccounDataValidationtException(preClosureInterestRate, product.getMaturityMinInterestRate());
|
||||||
|
}
|
||||||
|
|
||||||
|
Integer compoundingInterestEvery = account.getInterestCompoundedEvery();
|
||||||
|
if(command.isCompoundingInterestEveryChanged()){
|
||||||
|
compoundingInterestEvery = command.getInterestCompoundedEvery();
|
||||||
|
}
|
||||||
|
|
||||||
|
PeriodFrequencyType compoundingInterestFrequency = account.getInterestCompoundedFrequencyType();
|
||||||
|
if(command.getInterestCompoundedEveryPeriodType() !=null){
|
||||||
|
compoundingInterestFrequency = PeriodFrequencyType.fromInt(command.getInterestCompoundedEveryPeriodType());
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean renewalAllowed = account.isRenewalAllowed();
|
||||||
|
if(command.isRenewalAllowedChanged()){
|
||||||
|
renewalAllowed = command.isRenewalAllowed();
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean preClosureAllowed = account.isPreClosureAllowed();
|
||||||
|
if(command.isPreClosureAllowedChanged()){
|
||||||
|
preClosureAllowed = command.isPreClosureAllowed();
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean isInterestWithdrawable = account.isInterestWithdrawable();
|
||||||
|
if(command.isInterestWithdrawableChanged()){
|
||||||
|
isInterestWithdrawable = command.isInterestWithdrawable();
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean isInterestCompoundingAllowed = account.isInterestCompoundingAllowed();
|
||||||
|
if(command.isInterestCompoundingAllowedChanged()){
|
||||||
|
isInterestCompoundingAllowed = command.isInterestCompoundingAllowed();
|
||||||
|
}
|
||||||
|
account.update(product,externalId,commencementDate,deposit,tenureInMonths,maturityInterestRate,preClosureInterestRate,compoundingInterestEvery,compoundingInterestFrequency,renewalAllowed,
|
||||||
|
preClosureAllowed,isInterestWithdrawable,isInterestCompoundingAllowed,this.fixedTermDepositInterestCalculator,defaultDepositLifecycleStateMachine());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateApprovedDepositAccount(DepositAccount account, DepositAccountCommand command) {
|
||||||
|
|
||||||
|
boolean renewalAllowed = account.isRenewalAllowed();
|
||||||
|
if(command.isRenewalAllowedChanged()){
|
||||||
|
renewalAllowed = command.isRenewalAllowed();
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean isInterestWithdrawable = account.isInterestWithdrawable();
|
||||||
|
if(command.isInterestWithdrawableChanged()){
|
||||||
|
isInterestWithdrawable = command.isInterestWithdrawable();
|
||||||
|
}
|
||||||
|
account.update(renewalAllowed,isInterestWithdrawable);
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+1
-1
@@ -27,7 +27,7 @@ public class DepositAccountCommandValidator {
|
|||||||
baseDataValidator.reset().parameter("productId").value(command.getProductId()).ignoreIfNull().notNull();
|
baseDataValidator.reset().parameter("productId").value(command.getProductId()).ignoreIfNull().notNull();
|
||||||
baseDataValidator.reset().parameter("externalId").value(command.getExternalId()).ignoreIfNull().notExceedingLengthOf(100);
|
baseDataValidator.reset().parameter("externalId").value(command.getExternalId()).ignoreIfNull().notExceedingLengthOf(100);
|
||||||
|
|
||||||
baseDataValidator.reset().parameter("depositAmount").value(command.getDepositAmount()).ignoreIfNull().notNull().integerGreaterThanZero();
|
baseDataValidator.reset().parameter("deposit").value(command.getDepositAmount()).ignoreIfNull().notNull().zeroOrPositiveAmount();
|
||||||
baseDataValidator.reset().parameter("maturityInterestRate").value(command.getMaturityInterestRate()).ignoreIfNull().notNull().zeroOrPositiveAmount();
|
baseDataValidator.reset().parameter("maturityInterestRate").value(command.getMaturityInterestRate()).ignoreIfNull().notNull().zeroOrPositiveAmount();
|
||||||
baseDataValidator.reset().parameter("tenureInMonths").value(command.getTenureInMonths()).ignoreIfNull().notNull().integerGreaterThanZero();
|
baseDataValidator.reset().parameter("tenureInMonths").value(command.getTenureInMonths()).ignoreIfNull().notNull().integerGreaterThanZero();
|
||||||
|
|
||||||
|
|||||||
+6
-1
@@ -234,7 +234,12 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead
|
|||||||
public DepositPermissionData retrieveDepositAccountsPermissions(DepositAccountData depositAccountData) {
|
public DepositPermissionData retrieveDepositAccountsPermissions(DepositAccountData depositAccountData) {
|
||||||
boolean pendingApproval = (depositAccountData.getStatus().getId().equals(100L));
|
boolean pendingApproval = (depositAccountData.getStatus().getId().equals(100L));
|
||||||
boolean undoApprovalAllowed = (depositAccountData.getStatus().getId().equals(300L));
|
boolean undoApprovalAllowed = (depositAccountData.getStatus().getId().equals(300L));
|
||||||
boolean renewelAllowed = depositAccountData.isRenewalAllowed()&&(new LocalDate().isAfter(depositAccountData.getMaturedOn())||depositAccountData.getMaturedOn().isEqual(new LocalDate()));
|
boolean renewelAllowed = false;
|
||||||
|
if(depositAccountData.getMaturedOn()!=null){
|
||||||
|
if(new LocalDate().isAfter(depositAccountData.getMaturedOn())||depositAccountData.getMaturedOn().isEqual(new LocalDate())){
|
||||||
|
renewelAllowed = depositAccountData.isRenewalAllowed();
|
||||||
|
}
|
||||||
|
}
|
||||||
boolean rejectAllowed = pendingApproval;
|
boolean rejectAllowed = pendingApproval;
|
||||||
boolean withdrawnByApplicantAllowed = pendingApproval;
|
boolean withdrawnByApplicantAllowed = pendingApproval;
|
||||||
boolean interestWithdrawAllowed = depositAccountData.isInterestWithdrawable();
|
boolean interestWithdrawAllowed = depositAccountData.isInterestWithdrawable();
|
||||||
|
|||||||
+3
@@ -40,4 +40,7 @@ public interface DepositAccountWritePlatformService {
|
|||||||
|
|
||||||
@PreAuthorize(value = "hasRole('ORGANISATION_ADMINISTRATION_SUPER_USER_ROLE')")
|
@PreAuthorize(value = "hasRole('ORGANISATION_ADMINISTRATION_SUPER_USER_ROLE')")
|
||||||
EntityIdentifier renewDepositAccount(DepositAccountCommand command);
|
EntityIdentifier renewDepositAccount(DepositAccountCommand command);
|
||||||
|
|
||||||
|
@PreAuthorize(value = "hasRole('ORGANISATION_ADMINISTRATION_SUPER_USER_ROLE')")
|
||||||
|
EntityIdentifier updateDepositAccount(DepositAccountCommand command);
|
||||||
}
|
}
|
||||||
|
|||||||
+29
-1
@@ -293,7 +293,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
|
|||||||
throw new DepositAccountNotFoundException(command.getAccountId());
|
throw new DepositAccountNotFoundException(command.getAccountId());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(new LocalDate().isBefore(account.maturesOnDate())){
|
if(command.getMaturesOnDate().isBefore(account.maturesOnDate())){
|
||||||
this.depositAccountAssembler.adjustTotalAmountForPreclosureInterest(account);
|
this.depositAccountAssembler.adjustTotalAmountForPreclosureInterest(account);
|
||||||
}
|
}
|
||||||
account.withdrawDepositAccountMoney(defaultDepositLifecycleStateMachine());
|
account.withdrawDepositAccountMoney(defaultDepositLifecycleStateMachine());
|
||||||
@@ -386,4 +386,32 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
|
|||||||
|
|
||||||
throw new DepositAccountReopenException(account.getMaturityDate());
|
throw new DepositAccountReopenException(account.getMaturityDate());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EntityIdentifier updateDepositAccount(DepositAccountCommand command) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
this.context.authenticatedUser();
|
||||||
|
|
||||||
|
DepositAccountCommandValidator validator = new DepositAccountCommandValidator(command);
|
||||||
|
validator.validateForUpdate();
|
||||||
|
|
||||||
|
DepositAccount account = this.depositAccountRepository.findOne(command.getId());
|
||||||
|
if (account == null || account.isDeleted()) {
|
||||||
|
throw new DepositAccountNotFoundException(command.getId());
|
||||||
|
}
|
||||||
|
if(account.getDepositStatus() == 100)
|
||||||
|
this.depositAccountAssembler.assembleUpdatedDepositAccount(account,command);
|
||||||
|
else if(account.getDepositStatus() == 300)
|
||||||
|
this.depositAccountAssembler.updateApprovedDepositAccount(account,command);
|
||||||
|
this.depositAccountRepository.save(account);
|
||||||
|
|
||||||
|
return new EntityIdentifier(account.getId());
|
||||||
|
} catch (DataIntegrityViolationException dve) {
|
||||||
|
handleDataIntegrityIssues(command, dve);
|
||||||
|
return new EntityIdentifier(Long.valueOf(-1));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+1
@@ -26,6 +26,7 @@ public class DepositStateTransitionApprovalCommandValidator {
|
|||||||
baseDataValidator.reset().parameter("commencementDate").value(command.getEventDate()).notNull();
|
baseDataValidator.reset().parameter("commencementDate").value(command.getEventDate()).notNull();
|
||||||
|
|
||||||
baseDataValidator.reset().parameter("deposit").value(command.getDepositAmount()).ignoreIfNull().zeroOrPositiveAmount();
|
baseDataValidator.reset().parameter("deposit").value(command.getDepositAmount()).ignoreIfNull().zeroOrPositiveAmount();
|
||||||
|
baseDataValidator.reset().parameter("maturityInterestRate").value(command.getMaturityInterestRate()).ignoreIfNull().zeroOrPositiveAmount();
|
||||||
baseDataValidator.reset().parameter("tenureInMonths").value(command.getTenureInMonths()).ignoreIfNull().integerGreaterThanZero();
|
baseDataValidator.reset().parameter("tenureInMonths").value(command.getTenureInMonths()).ignoreIfNull().integerGreaterThanZero();
|
||||||
baseDataValidator.reset().parameter("interestCompoundedEveryPeriodType").value(command.getInterestCompoundedEveryPeriodType()).ignoreIfNull().inMinMaxRange(2, 2);
|
baseDataValidator.reset().parameter("interestCompoundedEveryPeriodType").value(command.getInterestCompoundedEveryPeriodType()).ignoreIfNull().inMinMaxRange(2, 2);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user