FINERACT-130:AccountHold
This commit is contained in:
committed by
Arnold Gálovics
parent
e65d896c38
commit
9329b99185
+1
@@ -80,6 +80,7 @@ public class SavingsApiConstants {
|
|||||||
public static final String externalIdParamName = "externalId";
|
public static final String externalIdParamName = "externalId";
|
||||||
public static final String statusParamName = "status";
|
public static final String statusParamName = "status";
|
||||||
public static final String subStatusParamName = "subStatus";
|
public static final String subStatusParamName = "subStatus";
|
||||||
|
public static final String reasonForBlockParamName = "reasonForBlock";
|
||||||
public static final String clientIdParamName = "clientId";
|
public static final String clientIdParamName = "clientId";
|
||||||
public static final String isRetailAccountParamName = "isRetailAccount";
|
public static final String isRetailAccountParamName = "isRetailAccount";
|
||||||
public static final String autogenerateTransactionIdParamName = "autogenerateTransactionId";
|
public static final String autogenerateTransactionIdParamName = "autogenerateTransactionId";
|
||||||
|
|||||||
+2
-2
@@ -479,10 +479,10 @@ public class SavingsAccountsApiResource {
|
|||||||
final CommandWrapper commandRequest = builder.unblockCreditsToSavingsAccount(accountId).build();
|
final CommandWrapper commandRequest = builder.unblockCreditsToSavingsAccount(accountId).build();
|
||||||
result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
|
result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
|
||||||
} else if (is(commandParam, SavingsApiConstants.COMMAND_BLOCK_ACCOUNT)) {
|
} else if (is(commandParam, SavingsApiConstants.COMMAND_BLOCK_ACCOUNT)) {
|
||||||
final CommandWrapper commandRequest = builder.withNoJsonBody().blockSavingsAccount(accountId).build();
|
final CommandWrapper commandRequest = builder.blockSavingsAccount(accountId).build();
|
||||||
result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
|
result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
|
||||||
} else if (is(commandParam, SavingsApiConstants.COMMAND_UNBLOCK_ACCOUNT)) {
|
} else if (is(commandParam, SavingsApiConstants.COMMAND_UNBLOCK_ACCOUNT)) {
|
||||||
final CommandWrapper commandRequest = builder.withNoJsonBody().unblockSavingsAccount(accountId).build();
|
final CommandWrapper commandRequest = builder.unblockSavingsAccount(accountId).build();
|
||||||
result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
|
result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+69
-60
@@ -64,6 +64,7 @@ public final class SavingsAccountData implements Serializable {
|
|||||||
private final String fieldOfficerName;
|
private final String fieldOfficerName;
|
||||||
private final SavingsAccountStatusEnumData status;
|
private final SavingsAccountStatusEnumData status;
|
||||||
private final SavingsAccountSubStatusEnumData subStatus;
|
private final SavingsAccountSubStatusEnumData subStatus;
|
||||||
|
private final String reasonForBlock;
|
||||||
private final SavingsAccountApplicationTimelineData timeline;
|
private final SavingsAccountApplicationTimelineData timeline;
|
||||||
private final CurrencyData currency;
|
private final CurrencyData currency;
|
||||||
private final BigDecimal nominalAnnualInterestRate;
|
private final BigDecimal nominalAnnualInterestRate;
|
||||||
@@ -174,6 +175,7 @@ public final class SavingsAccountData implements Serializable {
|
|||||||
this.fieldOfficerName = null;
|
this.fieldOfficerName = null;
|
||||||
this.status = null;
|
this.status = null;
|
||||||
this.subStatus = null;
|
this.subStatus = null;
|
||||||
|
this.reasonForBlock = null;
|
||||||
this.timeline = null;
|
this.timeline = null;
|
||||||
this.currency = null;
|
this.currency = null;
|
||||||
this.nominalAnnualInterestRate = nominalAnnualInterestRate;
|
this.nominalAnnualInterestRate = nominalAnnualInterestRate;
|
||||||
@@ -528,6 +530,7 @@ public final class SavingsAccountData implements Serializable {
|
|||||||
this.fieldOfficerName = null;
|
this.fieldOfficerName = null;
|
||||||
this.status = null;
|
this.status = null;
|
||||||
this.subStatus = null;
|
this.subStatus = null;
|
||||||
|
this.reasonForBlock = null;
|
||||||
this.timeline = null;
|
this.timeline = null;
|
||||||
this.currency = null;
|
this.currency = null;
|
||||||
this.nominalAnnualInterestRate = nominalAnnualInterestRate;
|
this.nominalAnnualInterestRate = nominalAnnualInterestRate;
|
||||||
@@ -584,7 +587,7 @@ public final class SavingsAccountData implements Serializable {
|
|||||||
public static SavingsAccountData instance(final Long id, final String accountNo, final EnumOptionData depositType,
|
public static SavingsAccountData instance(final Long id, final String accountNo, final EnumOptionData depositType,
|
||||||
final String externalId, final Long groupId, final String groupName, final Long clientId, final String clientName,
|
final String externalId, final Long groupId, final String groupName, final Long clientId, final String clientName,
|
||||||
final Long productId, final String productName, final Long fieldOfficerId, final String fieldOfficerName,
|
final Long productId, final String productName, final Long fieldOfficerId, final String fieldOfficerName,
|
||||||
final SavingsAccountStatusEnumData status, SavingsAccountSubStatusEnumData subStatus,
|
final SavingsAccountStatusEnumData status, SavingsAccountSubStatusEnumData subStatus, final String reasonForBlock,
|
||||||
final SavingsAccountApplicationTimelineData timeline, final CurrencyData currency, final BigDecimal interestRate,
|
final SavingsAccountApplicationTimelineData timeline, final CurrencyData currency, final BigDecimal interestRate,
|
||||||
final EnumOptionData interestCompoundingPeriodType, final EnumOptionData interestPostingPeriodType,
|
final EnumOptionData interestCompoundingPeriodType, final EnumOptionData interestPostingPeriodType,
|
||||||
final EnumOptionData interestCalculationType, final EnumOptionData interestCalculationDaysInYearType,
|
final EnumOptionData interestCalculationType, final EnumOptionData interestCalculationDaysInYearType,
|
||||||
@@ -611,7 +614,7 @@ public final class SavingsAccountData implements Serializable {
|
|||||||
final Collection<ChargeData> chargeOptions = null;
|
final Collection<ChargeData> chargeOptions = null;
|
||||||
|
|
||||||
return new SavingsAccountData(id, accountNo, depositType, externalId, groupId, groupName, clientId, clientName, productId,
|
return new SavingsAccountData(id, accountNo, depositType, externalId, groupId, groupName, clientId, clientName, productId,
|
||||||
productName, fieldOfficerId, fieldOfficerName, status, subStatus, timeline, currency, interestRate,
|
productName, fieldOfficerId, fieldOfficerName, status, subStatus, reasonForBlock, timeline, currency, interestRate,
|
||||||
interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType,
|
interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType,
|
||||||
minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType, withdrawalFeeForTransfers, summary,
|
minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType, withdrawalFeeForTransfers, summary,
|
||||||
transactions, productOptions, fieldOfficerOptions, interestCompoundingPeriodTypeOptions, interestPostingPeriodTypeOptions,
|
transactions, productOptions, fieldOfficerOptions, interestCompoundingPeriodTypeOptions, interestPostingPeriodTypeOptions,
|
||||||
@@ -676,6 +679,7 @@ public final class SavingsAccountData implements Serializable {
|
|||||||
final boolean withHoldTax = false;
|
final boolean withHoldTax = false;
|
||||||
final TaxGroupData taxGroup = null;
|
final TaxGroupData taxGroup = null;
|
||||||
final SavingsAccountSubStatusEnumData subStatus = null;
|
final SavingsAccountSubStatusEnumData subStatus = null;
|
||||||
|
final String reasonForBlock = null;
|
||||||
final LocalDate lastActiveTransactionDate = null;
|
final LocalDate lastActiveTransactionDate = null;
|
||||||
final boolean isDormancyTrackingActive = false;
|
final boolean isDormancyTrackingActive = false;
|
||||||
final Integer daysToInactive = null;
|
final Integer daysToInactive = null;
|
||||||
@@ -684,15 +688,15 @@ public final class SavingsAccountData implements Serializable {
|
|||||||
final BigDecimal savingsAmountOnHold = null;
|
final BigDecimal savingsAmountOnHold = null;
|
||||||
|
|
||||||
return new SavingsAccountData(accountId, accountNo, depositType, externalId, groupId, groupName, clientId, clientName, productId,
|
return new SavingsAccountData(accountId, accountNo, depositType, externalId, groupId, groupName, clientId, clientName, productId,
|
||||||
productName, fieldOfficerId, fieldOfficerName, status, subStatus, timeline, currency, nominalAnnualInterestRate,
|
productName, fieldOfficerId, fieldOfficerName, status, subStatus, reasonForBlock, timeline, currency,
|
||||||
interestPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType,
|
nominalAnnualInterestRate, interestPeriodType, interestPostingPeriodType, interestCalculationType,
|
||||||
minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType, withdrawalFeeForTransfers, summary,
|
interestCalculationDaysInYearType, minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType,
|
||||||
transactions, productOptions, fieldOfficerOptions, interestCompoundingPeriodTypeOptions, interestPostingPeriodTypeOptions,
|
withdrawalFeeForTransfers, summary, transactions, productOptions, fieldOfficerOptions, interestCompoundingPeriodTypeOptions,
|
||||||
interestCalculationTypeOptions, interestCalculationDaysInYearTypeOptions, lockinPeriodFrequencyTypeOptions,
|
interestPostingPeriodTypeOptions, interestCalculationTypeOptions, interestCalculationDaysInYearTypeOptions,
|
||||||
withdrawalFeeTypeOptions, charges, chargeOptions, allowOverdraft, overdraftLimit, minRequiredBalance,
|
lockinPeriodFrequencyTypeOptions, withdrawalFeeTypeOptions, charges, chargeOptions, allowOverdraft, overdraftLimit,
|
||||||
enforceMinRequiredBalance, minBalanceForInterestCalculation, onHoldFunds, nominalAnnualInterestRateOverdraft,
|
minRequiredBalance, enforceMinRequiredBalance, minBalanceForInterestCalculation, onHoldFunds,
|
||||||
minOverdraftForInterestCalculation, withHoldTax, taxGroup, lastActiveTransactionDate, isDormancyTrackingActive,
|
nominalAnnualInterestRateOverdraft, minOverdraftForInterestCalculation, withHoldTax, taxGroup, lastActiveTransactionDate,
|
||||||
daysToInactive, daysToDormancy, daysToEscheat, savingsAmountOnHold);
|
isDormancyTrackingActive, daysToInactive, daysToDormancy, daysToEscheat, savingsAmountOnHold);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SavingsAccountData lookupWithProductDetails(final Long accountId, final String accountNo,
|
public static SavingsAccountData lookupWithProductDetails(final Long accountId, final String accountNo,
|
||||||
@@ -747,6 +751,7 @@ public final class SavingsAccountData implements Serializable {
|
|||||||
final boolean withHoldTax = false;
|
final boolean withHoldTax = false;
|
||||||
final TaxGroupData taxGroup = null;
|
final TaxGroupData taxGroup = null;
|
||||||
final SavingsAccountSubStatusEnumData subStatus = null;
|
final SavingsAccountSubStatusEnumData subStatus = null;
|
||||||
|
final String reasonForBlock = null;
|
||||||
final LocalDate lastActiveTransactionDate = null;
|
final LocalDate lastActiveTransactionDate = null;
|
||||||
final boolean isDormancyTrackingActive = false;
|
final boolean isDormancyTrackingActive = false;
|
||||||
final Integer daysToInactive = null;
|
final Integer daysToInactive = null;
|
||||||
@@ -755,15 +760,15 @@ public final class SavingsAccountData implements Serializable {
|
|||||||
final BigDecimal savingsAmountOnHold = null;
|
final BigDecimal savingsAmountOnHold = null;
|
||||||
|
|
||||||
return new SavingsAccountData(accountId, accountNo, depositType, externalId, groupId, groupName, clientId, clientName, productId,
|
return new SavingsAccountData(accountId, accountNo, depositType, externalId, groupId, groupName, clientId, clientName, productId,
|
||||||
productName, fieldOfficerId, fieldOfficerName, status, subStatus, timeline, currency, nominalAnnualInterestRate,
|
productName, fieldOfficerId, fieldOfficerName, status, subStatus, reasonForBlock, timeline, currency,
|
||||||
interestPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType,
|
nominalAnnualInterestRate, interestPeriodType, interestPostingPeriodType, interestCalculationType,
|
||||||
minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType, withdrawalFeeForTransfers, summary,
|
interestCalculationDaysInYearType, minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType,
|
||||||
transactions, productOptions, fieldOfficerOptions, interestCompoundingPeriodTypeOptions, interestPostingPeriodTypeOptions,
|
withdrawalFeeForTransfers, summary, transactions, productOptions, fieldOfficerOptions, interestCompoundingPeriodTypeOptions,
|
||||||
interestCalculationTypeOptions, interestCalculationDaysInYearTypeOptions, lockinPeriodFrequencyTypeOptions,
|
interestPostingPeriodTypeOptions, interestCalculationTypeOptions, interestCalculationDaysInYearTypeOptions,
|
||||||
withdrawalFeeTypeOptions, charges, chargeOptions, allowOverdraft, overdraftLimit, minRequiredBalance,
|
lockinPeriodFrequencyTypeOptions, withdrawalFeeTypeOptions, charges, chargeOptions, allowOverdraft, overdraftLimit,
|
||||||
enforceMinRequiredBalance, minBalanceForInterestCalculation, onHoldFunds, nominalAnnualInterestRateOverdraft,
|
minRequiredBalance, enforceMinRequiredBalance, minBalanceForInterestCalculation, onHoldFunds,
|
||||||
minOverdraftForInterestCalculation, withHoldTax, taxGroup, lastActiveTransactionDate, isDormancyTrackingActive,
|
nominalAnnualInterestRateOverdraft, minOverdraftForInterestCalculation, withHoldTax, taxGroup, lastActiveTransactionDate,
|
||||||
daysToInactive, daysToDormancy, daysToEscheat, savingsAmountOnHold);
|
isDormancyTrackingActive, daysToInactive, daysToDormancy, daysToEscheat, savingsAmountOnHold);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SavingsAccountData withTemplateOptions(final SavingsAccountData account, final SavingsAccountData template,
|
public static SavingsAccountData withTemplateOptions(final SavingsAccountData account, final SavingsAccountData template,
|
||||||
@@ -787,18 +792,19 @@ public final class SavingsAccountData implements Serializable {
|
|||||||
|
|
||||||
return new SavingsAccountData(account.id, account.accountNo, account.depositType, account.externalId, account.groupId,
|
return new SavingsAccountData(account.id, account.accountNo, account.depositType, account.externalId, account.groupId,
|
||||||
account.groupName, account.clientId, account.clientName, account.savingsProductId, account.savingsProductName,
|
account.groupName, account.clientId, account.clientName, account.savingsProductId, account.savingsProductName,
|
||||||
account.fieldOfficerId, account.fieldOfficerName, account.status, account.subStatus, account.timeline, account.currency,
|
account.fieldOfficerId, account.fieldOfficerName, account.status, account.subStatus, account.reasonForBlock,
|
||||||
account.nominalAnnualInterestRate, account.interestCompoundingPeriodType, account.interestPostingPeriodType,
|
account.timeline, account.currency, account.nominalAnnualInterestRate, account.interestCompoundingPeriodType,
|
||||||
account.interestCalculationType, account.interestCalculationDaysInYearType, account.minRequiredOpeningBalance,
|
account.interestPostingPeriodType, account.interestCalculationType, account.interestCalculationDaysInYearType,
|
||||||
account.lockinPeriodFrequency, account.lockinPeriodFrequencyType, account.withdrawalFeeForTransfers, account.summary,
|
account.minRequiredOpeningBalance, account.lockinPeriodFrequency, account.lockinPeriodFrequencyType,
|
||||||
transactions, template.productOptions, template.fieldOfficerOptions, template.interestCompoundingPeriodTypeOptions,
|
account.withdrawalFeeForTransfers, account.summary, transactions, template.productOptions, template.fieldOfficerOptions,
|
||||||
template.interestPostingPeriodTypeOptions, template.interestCalculationTypeOptions,
|
template.interestCompoundingPeriodTypeOptions, template.interestPostingPeriodTypeOptions,
|
||||||
template.interestCalculationDaysInYearTypeOptions, template.lockinPeriodFrequencyTypeOptions,
|
template.interestCalculationTypeOptions, template.interestCalculationDaysInYearTypeOptions,
|
||||||
template.withdrawalFeeTypeOptions, charges, template.chargeOptions, account.allowOverdraft, account.overdraftLimit,
|
template.lockinPeriodFrequencyTypeOptions, template.withdrawalFeeTypeOptions, charges, template.chargeOptions,
|
||||||
account.minRequiredBalance, account.enforceMinRequiredBalance, account.minBalanceForInterestCalculation,
|
account.allowOverdraft, account.overdraftLimit, account.minRequiredBalance, account.enforceMinRequiredBalance,
|
||||||
account.onHoldFunds, account.nominalAnnualInterestRateOverdraft, account.minOverdraftForInterestCalculation,
|
account.minBalanceForInterestCalculation, account.onHoldFunds, account.nominalAnnualInterestRateOverdraft,
|
||||||
account.withHoldTax, account.taxGroup, account.lastActiveTransactionDate, account.isDormancyTrackingActive,
|
account.minOverdraftForInterestCalculation, account.withHoldTax, account.taxGroup, account.lastActiveTransactionDate,
|
||||||
account.daysToInactive, account.daysToDormancy, account.daysToEscheat, account.savingsAmountOnHold);
|
account.isDormancyTrackingActive, account.daysToInactive, account.daysToDormancy, account.daysToEscheat,
|
||||||
|
account.savingsAmountOnHold);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SavingsAccountData withTemplateOptions(final SavingsAccountData account,
|
public static SavingsAccountData withTemplateOptions(final SavingsAccountData account,
|
||||||
@@ -813,17 +819,18 @@ public final class SavingsAccountData implements Serializable {
|
|||||||
|
|
||||||
return new SavingsAccountData(account.id, account.accountNo, account.depositType, account.externalId, account.groupId,
|
return new SavingsAccountData(account.id, account.accountNo, account.depositType, account.externalId, account.groupId,
|
||||||
account.groupName, account.clientId, account.clientName, account.savingsProductId, account.savingsProductName,
|
account.groupName, account.clientId, account.clientName, account.savingsProductId, account.savingsProductName,
|
||||||
account.fieldOfficerId, account.fieldOfficerName, account.status, account.subStatus, account.timeline, account.currency,
|
account.fieldOfficerId, account.fieldOfficerName, account.status, account.subStatus, account.reasonForBlock,
|
||||||
account.nominalAnnualInterestRate, account.interestCompoundingPeriodType, account.interestPostingPeriodType,
|
account.timeline, account.currency, account.nominalAnnualInterestRate, account.interestCompoundingPeriodType,
|
||||||
account.interestCalculationType, account.interestCalculationDaysInYearType, account.minRequiredOpeningBalance,
|
account.interestPostingPeriodType, account.interestCalculationType, account.interestCalculationDaysInYearType,
|
||||||
account.lockinPeriodFrequency, account.lockinPeriodFrequencyType, account.withdrawalFeeForTransfers, account.summary,
|
account.minRequiredOpeningBalance, account.lockinPeriodFrequency, account.lockinPeriodFrequencyType,
|
||||||
transactions, productOptions, fieldOfficerOptions, interestCompoundingPeriodTypeOptions, interestPostingPeriodTypeOptions,
|
account.withdrawalFeeForTransfers, account.summary, transactions, productOptions, fieldOfficerOptions,
|
||||||
interestCalculationTypeOptions, interestCalculationDaysInYearTypeOptions, lockinPeriodFrequencyTypeOptions,
|
interestCompoundingPeriodTypeOptions, interestPostingPeriodTypeOptions, interestCalculationTypeOptions,
|
||||||
withdrawalFeeTypeOptions, charges, chargeOptions, account.allowOverdraft, account.overdraftLimit,
|
interestCalculationDaysInYearTypeOptions, lockinPeriodFrequencyTypeOptions, withdrawalFeeTypeOptions, charges,
|
||||||
account.minRequiredBalance, account.enforceMinRequiredBalance, account.minBalanceForInterestCalculation,
|
chargeOptions, account.allowOverdraft, account.overdraftLimit, account.minRequiredBalance,
|
||||||
account.onHoldFunds, account.nominalAnnualInterestRateOverdraft, account.minOverdraftForInterestCalculation,
|
account.enforceMinRequiredBalance, account.minBalanceForInterestCalculation, account.onHoldFunds,
|
||||||
account.withHoldTax, account.taxGroup, account.lastActiveTransactionDate, account.isDormancyTrackingActive,
|
account.nominalAnnualInterestRateOverdraft, account.minOverdraftForInterestCalculation, account.withHoldTax,
|
||||||
account.daysToInactive, account.daysToDormancy, account.daysToEscheat, account.savingsAmountOnHold);
|
account.taxGroup, account.lastActiveTransactionDate, account.isDormancyTrackingActive, account.daysToInactive,
|
||||||
|
account.daysToDormancy, account.daysToEscheat, account.savingsAmountOnHold);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SavingsAccountData withClientTemplate(final Long clientId, final String clientName, final Long groupId,
|
public static SavingsAccountData withClientTemplate(final Long clientId, final String clientName, final Long groupId,
|
||||||
@@ -880,6 +887,7 @@ public final class SavingsAccountData implements Serializable {
|
|||||||
final Collection<SavingsAccountChargeData> charges = null;
|
final Collection<SavingsAccountChargeData> charges = null;
|
||||||
final Collection<ChargeData> chargeOptions = null;
|
final Collection<ChargeData> chargeOptions = null;
|
||||||
final SavingsAccountSubStatusEnumData subStatus = null;
|
final SavingsAccountSubStatusEnumData subStatus = null;
|
||||||
|
final String reasonForBlock = null;
|
||||||
final LocalDate lastActiveTransactionDate = null;
|
final LocalDate lastActiveTransactionDate = null;
|
||||||
final boolean isDormancyTrackingActive = false;
|
final boolean isDormancyTrackingActive = false;
|
||||||
final Integer daysToInactive = null;
|
final Integer daysToInactive = null;
|
||||||
@@ -888,28 +896,28 @@ public final class SavingsAccountData implements Serializable {
|
|||||||
final BigDecimal savingsAmountOnHold = null;
|
final BigDecimal savingsAmountOnHold = null;
|
||||||
|
|
||||||
return new SavingsAccountData(id, accountNo, depositType, externalId, groupId, groupName, clientId, clientName, productId,
|
return new SavingsAccountData(id, accountNo, depositType, externalId, groupId, groupName, clientId, clientName, productId,
|
||||||
productName, fieldOfficerId, fieldOfficerName, status, subStatus, timeline, currency, nominalAnnualInterestRate,
|
productName, fieldOfficerId, fieldOfficerName, status, subStatus, reasonForBlock, timeline, currency,
|
||||||
interestPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType,
|
nominalAnnualInterestRate, interestPeriodType, interestPostingPeriodType, interestCalculationType,
|
||||||
minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType, withdrawalFeeForTransfers, summary,
|
interestCalculationDaysInYearType, minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType,
|
||||||
transactions, productOptions, fieldOfficerOptions, interestCompoundingPeriodTypeOptions, interestPostingPeriodTypeOptions,
|
withdrawalFeeForTransfers, summary, transactions, productOptions, fieldOfficerOptions, interestCompoundingPeriodTypeOptions,
|
||||||
interestCalculationTypeOptions, interestCalculationDaysInYearTypeOptions, lockinPeriodFrequencyTypeOptions,
|
interestPostingPeriodTypeOptions, interestCalculationTypeOptions, interestCalculationDaysInYearTypeOptions,
|
||||||
withdrawalFeeTypeOptions, charges, chargeOptions, allowOverdraft, overdraftLimit, minRequiredBalance,
|
lockinPeriodFrequencyTypeOptions, withdrawalFeeTypeOptions, charges, chargeOptions, allowOverdraft, overdraftLimit,
|
||||||
enforceMinRequiredBalance, minBalanceForInterestCalculation, onHoldFunds, nominalAnnualInterestRateOverdraft,
|
minRequiredBalance, enforceMinRequiredBalance, minBalanceForInterestCalculation, onHoldFunds,
|
||||||
minOverdraftForInterestCalculation, withHoldTax, taxGroup, lastActiveTransactionDate, isDormancyTrackingActive,
|
nominalAnnualInterestRateOverdraft, minOverdraftForInterestCalculation, withHoldTax, taxGroup, lastActiveTransactionDate,
|
||||||
daysToInactive, daysToDormancy, daysToEscheat, savingsAmountOnHold);
|
isDormancyTrackingActive, daysToInactive, daysToDormancy, daysToEscheat, savingsAmountOnHold);
|
||||||
}
|
}
|
||||||
|
|
||||||
private SavingsAccountData(final Long id, final String accountNo, final EnumOptionData depositType, final String externalId,
|
private SavingsAccountData(final Long id, final String accountNo, final EnumOptionData depositType, final String externalId,
|
||||||
final Long groupId, final String groupName, final Long clientId, final String clientName, final Long productId,
|
final Long groupId, final String groupName, final Long clientId, final String clientName, final Long productId,
|
||||||
final String productName, final Long fieldOfficerId, final String fieldOfficerName, final SavingsAccountStatusEnumData status,
|
final String productName, final Long fieldOfficerId, final String fieldOfficerName, final SavingsAccountStatusEnumData status,
|
||||||
final SavingsAccountSubStatusEnumData subStatus, final SavingsAccountApplicationTimelineData timeline,
|
final SavingsAccountSubStatusEnumData subStatus, final String reasonForBlock,
|
||||||
final CurrencyData currency, final BigDecimal nominalAnnualInterestRate, final EnumOptionData interestPeriodType,
|
final SavingsAccountApplicationTimelineData timeline, final CurrencyData currency, final BigDecimal nominalAnnualInterestRate,
|
||||||
final EnumOptionData interestPostingPeriodType, final EnumOptionData interestCalculationType,
|
final EnumOptionData interestPeriodType, final EnumOptionData interestPostingPeriodType,
|
||||||
final EnumOptionData interestCalculationDaysInYearType, final BigDecimal minRequiredOpeningBalance,
|
final EnumOptionData interestCalculationType, final EnumOptionData interestCalculationDaysInYearType,
|
||||||
final Integer lockinPeriodFrequency, final EnumOptionData lockinPeriodFrequencyType, final boolean withdrawalFeeForTransfers,
|
final BigDecimal minRequiredOpeningBalance, final Integer lockinPeriodFrequency, final EnumOptionData lockinPeriodFrequencyType,
|
||||||
final SavingsAccountSummaryData summary, final Collection<SavingsAccountTransactionData> transactions,
|
final boolean withdrawalFeeForTransfers, final SavingsAccountSummaryData summary,
|
||||||
final Collection<SavingsProductData> productOptions, final Collection<StaffData> fieldOfficerOptions,
|
final Collection<SavingsAccountTransactionData> transactions, final Collection<SavingsProductData> productOptions,
|
||||||
final Collection<EnumOptionData> interestCompoundingPeriodTypeOptions,
|
final Collection<StaffData> fieldOfficerOptions, final Collection<EnumOptionData> interestCompoundingPeriodTypeOptions,
|
||||||
final Collection<EnumOptionData> interestPostingPeriodTypeOptions,
|
final Collection<EnumOptionData> interestPostingPeriodTypeOptions,
|
||||||
final Collection<EnumOptionData> interestCalculationTypeOptions,
|
final Collection<EnumOptionData> interestCalculationTypeOptions,
|
||||||
final Collection<EnumOptionData> interestCalculationDaysInYearTypeOptions,
|
final Collection<EnumOptionData> interestCalculationDaysInYearTypeOptions,
|
||||||
@@ -935,6 +943,7 @@ public final class SavingsAccountData implements Serializable {
|
|||||||
this.fieldOfficerName = fieldOfficerName;
|
this.fieldOfficerName = fieldOfficerName;
|
||||||
this.status = status;
|
this.status = status;
|
||||||
this.subStatus = subStatus;
|
this.subStatus = subStatus;
|
||||||
|
this.reasonForBlock = reasonForBlock;
|
||||||
this.timeline = timeline;
|
this.timeline = timeline;
|
||||||
this.currency = currency;
|
this.currency = currency;
|
||||||
this.nominalAnnualInterestRate = nominalAnnualInterestRate;
|
this.nominalAnnualInterestRate = nominalAnnualInterestRate;
|
||||||
|
|||||||
+55
-4
@@ -73,6 +73,8 @@ public final class SavingsAccountTransactionData implements Serializable {
|
|||||||
private final boolean isManualTransaction;
|
private final boolean isManualTransaction;
|
||||||
private final Boolean isReversal;
|
private final Boolean isReversal;
|
||||||
private final Long originalTransactionId;
|
private final Long originalTransactionId;
|
||||||
|
private final Long releaseTransactionId;
|
||||||
|
private final String reasonForBlock;
|
||||||
private Set<SavingsAccountChargesPaidByData> chargesPaidByData = new HashSet<>();
|
private Set<SavingsAccountChargesPaidByData> chargesPaidByData = new HashSet<>();
|
||||||
|
|
||||||
// templates
|
// templates
|
||||||
@@ -347,6 +349,8 @@ public final class SavingsAccountTransactionData implements Serializable {
|
|||||||
this.note = null;
|
this.note = null;
|
||||||
this.isReversal = null;
|
this.isReversal = null;
|
||||||
this.originalTransactionId = null;
|
this.originalTransactionId = null;
|
||||||
|
this.releaseTransactionId = null;
|
||||||
|
this.reasonForBlock = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isChargeTransaction() {
|
public boolean isChargeTransaction() {
|
||||||
@@ -544,7 +548,8 @@ public final class SavingsAccountTransactionData implements Serializable {
|
|||||||
this.isManualTransaction = isManualTransaction;
|
this.isManualTransaction = isManualTransaction;
|
||||||
this.isReversal = null;
|
this.isReversal = null;
|
||||||
this.originalTransactionId = null;
|
this.originalTransactionId = null;
|
||||||
|
this.releaseTransactionId = null;
|
||||||
|
this.reasonForBlock = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private SavingsAccountTransactionData(BigDecimal transactionAmount, LocalDate transactionDate, Long paymentTypeId, String accountNumber,
|
private SavingsAccountTransactionData(BigDecimal transactionAmount, LocalDate transactionDate, Long paymentTypeId, String accountNumber,
|
||||||
@@ -582,6 +587,8 @@ public final class SavingsAccountTransactionData implements Serializable {
|
|||||||
this.isManualTransaction = false;
|
this.isManualTransaction = false;
|
||||||
this.isReversal = null;
|
this.isReversal = null;
|
||||||
this.originalTransactionId = null;
|
this.originalTransactionId = null;
|
||||||
|
this.releaseTransactionId = null;
|
||||||
|
this.reasonForBlock = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private SavingsAccountTransactionData(Integer id, BigDecimal transactionAmount, LocalDate transactionDate, Long paymentTypeId,
|
private SavingsAccountTransactionData(Integer id, BigDecimal transactionAmount, LocalDate transactionDate, Long paymentTypeId,
|
||||||
@@ -621,6 +628,8 @@ public final class SavingsAccountTransactionData implements Serializable {
|
|||||||
this.isManualTransaction = false;
|
this.isManualTransaction = false;
|
||||||
this.isReversal = null;
|
this.isReversal = null;
|
||||||
this.originalTransactionId = null;
|
this.originalTransactionId = null;
|
||||||
|
this.releaseTransactionId = null;
|
||||||
|
this.reasonForBlock = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Integer getRowIndex() {
|
public Integer getRowIndex() {
|
||||||
@@ -753,6 +762,8 @@ public final class SavingsAccountTransactionData implements Serializable {
|
|||||||
this.isManualTransaction = false;
|
this.isManualTransaction = false;
|
||||||
this.isReversal = null;
|
this.isReversal = null;
|
||||||
this.originalTransactionId = null;
|
this.originalTransactionId = null;
|
||||||
|
this.releaseTransactionId = null;
|
||||||
|
this.reasonForBlock = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SavingsAccountTransactionData create(final Long id, final SavingsAccountTransactionEnumData transactionType,
|
public static SavingsAccountTransactionData create(final Long id, final SavingsAccountTransactionEnumData transactionType,
|
||||||
@@ -770,11 +781,12 @@ public final class SavingsAccountTransactionData implements Serializable {
|
|||||||
final PaymentDetailData paymentDetailData, final Long savingsId, final String savingsAccountNo, final LocalDate date,
|
final PaymentDetailData paymentDetailData, final Long savingsId, final String savingsAccountNo, final LocalDate date,
|
||||||
final CurrencyData currency, final BigDecimal amount, final BigDecimal outstandingChargeAmount, final BigDecimal runningBalance,
|
final CurrencyData currency, final BigDecimal amount, final BigDecimal outstandingChargeAmount, final BigDecimal runningBalance,
|
||||||
final boolean reversed, final AccountTransferData transfer, final LocalDate submittedOnDate, final boolean interestedPostedAsOn,
|
final boolean reversed, final AccountTransferData transfer, final LocalDate submittedOnDate, final boolean interestedPostedAsOn,
|
||||||
final String submittedByUsername, final String note, final Boolean isReversal, final Long originalTransactionId) {
|
final String submittedByUsername, final String note, final Boolean isReversal, final Long originalTransactionId,
|
||||||
|
final Long releaseTransactionId, final String reasonForBlock) {
|
||||||
final Collection<PaymentTypeData> paymentTypeOptions = null;
|
final Collection<PaymentTypeData> paymentTypeOptions = null;
|
||||||
return new SavingsAccountTransactionData(id, transactionType, paymentDetailData, savingsId, savingsAccountNo, date, currency,
|
return new SavingsAccountTransactionData(id, transactionType, paymentDetailData, savingsId, savingsAccountNo, date, currency,
|
||||||
amount, outstandingChargeAmount, runningBalance, reversed, transfer, paymentTypeOptions, submittedOnDate,
|
amount, outstandingChargeAmount, runningBalance, reversed, transfer, paymentTypeOptions, submittedOnDate,
|
||||||
interestedPostedAsOn, submittedByUsername, note, isReversal, originalTransactionId);
|
interestedPostedAsOn, submittedByUsername, note, isReversal, originalTransactionId, releaseTransactionId, reasonForBlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SavingsAccountTransactionData create(final Long id) {
|
public static SavingsAccountTransactionData create(final Long id) {
|
||||||
@@ -827,7 +839,7 @@ public final class SavingsAccountTransactionData implements Serializable {
|
|||||||
final CurrencyData currency, final BigDecimal amount, final BigDecimal outstandingChargeAmount, final BigDecimal runningBalance,
|
final CurrencyData currency, final BigDecimal amount, final BigDecimal outstandingChargeAmount, final BigDecimal runningBalance,
|
||||||
final boolean reversed, final AccountTransferData transfer, final Collection<PaymentTypeData> paymentTypeOptions,
|
final boolean reversed, final AccountTransferData transfer, final Collection<PaymentTypeData> paymentTypeOptions,
|
||||||
final LocalDate submittedOnDate, final boolean interestedPostedAsOn, final String submittedByUsername, final String note,
|
final LocalDate submittedOnDate, final boolean interestedPostedAsOn, final String submittedByUsername, final String note,
|
||||||
final Boolean isReversal, final Long originalTransactionId) {
|
final Boolean isReversal, final Long originalTransactionId, final Long releaseTransactionId, final String reasonForBlock) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.transactionType = transactionType;
|
this.transactionType = transactionType;
|
||||||
this.paymentDetailData = paymentDetailData;
|
this.paymentDetailData = paymentDetailData;
|
||||||
@@ -853,6 +865,8 @@ public final class SavingsAccountTransactionData implements Serializable {
|
|||||||
this.isManualTransaction = false;
|
this.isManualTransaction = false;
|
||||||
this.isReversal = isReversal;
|
this.isReversal = isReversal;
|
||||||
this.originalTransactionId = originalTransactionId;
|
this.originalTransactionId = originalTransactionId;
|
||||||
|
this.releaseTransactionId = releaseTransactionId;
|
||||||
|
this.reasonForBlock = reasonForBlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
private SavingsAccountTransactionData(final Long id, final SavingsAccountTransactionEnumData transactionType,
|
private SavingsAccountTransactionData(final Long id, final SavingsAccountTransactionEnumData transactionType,
|
||||||
@@ -886,6 +900,43 @@ public final class SavingsAccountTransactionData implements Serializable {
|
|||||||
this.isManualTransaction = false;
|
this.isManualTransaction = false;
|
||||||
this.isReversal = null;
|
this.isReversal = null;
|
||||||
this.originalTransactionId = null;
|
this.originalTransactionId = null;
|
||||||
|
this.releaseTransactionId = null;
|
||||||
|
this.reasonForBlock = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private SavingsAccountTransactionData(final Long id, final SavingsAccountTransactionEnumData transactionType,
|
||||||
|
final PaymentDetailData paymentDetailData, final Long savingsId, final String savingsAccountNo, final LocalDate date,
|
||||||
|
final CurrencyData currency, final BigDecimal amount, final BigDecimal outstandingChargeAmount, final BigDecimal runningBalance,
|
||||||
|
final boolean reversed, final AccountTransferData transfer, final Collection<PaymentTypeData> paymentTypeOptions,
|
||||||
|
final LocalDate submittedOnDate, final boolean interestedPostedAsOn, final String submittedByUsername, final String note,
|
||||||
|
final Boolean isReversal, final Long originalTransactionId) {
|
||||||
|
this.id = id;
|
||||||
|
this.transactionType = transactionType;
|
||||||
|
this.paymentDetailData = paymentDetailData;
|
||||||
|
this.accountId = savingsId;
|
||||||
|
this.accountNo = savingsAccountNo;
|
||||||
|
this.date = date;
|
||||||
|
this.currency = currency;
|
||||||
|
this.amount = amount;
|
||||||
|
this.outstandingChargeAmount = outstandingChargeAmount;
|
||||||
|
this.runningBalance = runningBalance;
|
||||||
|
this.reversed = reversed;
|
||||||
|
this.transfer = transfer;
|
||||||
|
this.paymentTypeOptions = paymentTypeOptions;
|
||||||
|
if (submittedOnDate != null) {
|
||||||
|
this.submittedOnDate = Date.from(submittedOnDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
|
||||||
|
} else {
|
||||||
|
this.submittedOnDate = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.interestedPostedAsOn = interestedPostedAsOn;
|
||||||
|
this.submittedByUsername = submittedByUsername;
|
||||||
|
this.note = note;
|
||||||
|
this.isManualTransaction = false;
|
||||||
|
this.isReversal = isReversal;
|
||||||
|
this.originalTransactionId = originalTransactionId;
|
||||||
|
this.releaseTransactionId = null;
|
||||||
|
this.reasonForBlock = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SavingsAccountTransactionData withWithDrawalTransactionDetails(
|
public static SavingsAccountTransactionData withWithDrawalTransactionDetails(
|
||||||
|
|||||||
+29
-14
@@ -57,6 +57,8 @@ import org.apache.fineract.organisation.monetary.domain.Money;
|
|||||||
import org.apache.fineract.portfolio.paymentdetail.domain.PaymentDetail;
|
import org.apache.fineract.portfolio.paymentdetail.domain.PaymentDetail;
|
||||||
import org.apache.fineract.portfolio.savings.SavingsApiConstants;
|
import org.apache.fineract.portfolio.savings.SavingsApiConstants;
|
||||||
import org.apache.fineract.portfolio.savings.domain.SavingsAccount;
|
import org.apache.fineract.portfolio.savings.domain.SavingsAccount;
|
||||||
|
import org.apache.fineract.portfolio.savings.domain.SavingsAccountAssembler;
|
||||||
|
import org.apache.fineract.portfolio.savings.domain.SavingsAccountSubStatusEnum;
|
||||||
import org.apache.fineract.portfolio.savings.domain.SavingsAccountTransaction;
|
import org.apache.fineract.portfolio.savings.domain.SavingsAccountTransaction;
|
||||||
import org.apache.fineract.portfolio.savings.exception.TransactionBeforePivotDateNotAllowed;
|
import org.apache.fineract.portfolio.savings.exception.TransactionBeforePivotDateNotAllowed;
|
||||||
import org.apache.fineract.useradministration.domain.AppUser;
|
import org.apache.fineract.useradministration.domain.AppUser;
|
||||||
@@ -69,14 +71,17 @@ public class SavingsAccountTransactionDataValidator {
|
|||||||
private final FromJsonHelper fromApiJsonHelper;
|
private final FromJsonHelper fromApiJsonHelper;
|
||||||
private static final Set<String> SAVINGS_ACCOUNT_HOLD_AMOUNT_REQUEST_DATA_PARAMETERS = new HashSet<>(
|
private static final Set<String> SAVINGS_ACCOUNT_HOLD_AMOUNT_REQUEST_DATA_PARAMETERS = new HashSet<>(
|
||||||
Arrays.asList(transactionDateParamName, SavingsApiConstants.dateFormatParamName, SavingsApiConstants.localeParamName,
|
Arrays.asList(transactionDateParamName, SavingsApiConstants.dateFormatParamName, SavingsApiConstants.localeParamName,
|
||||||
transactionAmountParamName, lienParamName));
|
transactionAmountParamName, lienParamName, SavingsApiConstants.reasonForBlockParamName));
|
||||||
|
|
||||||
private final ConfigurationDomainService configurationDomainService;
|
private final ConfigurationDomainService configurationDomainService;
|
||||||
|
private final SavingsAccountAssembler savingAccountAssembler;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public SavingsAccountTransactionDataValidator(final FromJsonHelper fromApiJsonHelper,
|
public SavingsAccountTransactionDataValidator(final FromJsonHelper fromApiJsonHelper,
|
||||||
final ConfigurationDomainService configurationDomainService) {
|
final ConfigurationDomainService configurationDomainService, final SavingsAccountAssembler savingAccountAssembler) {
|
||||||
this.fromApiJsonHelper = fromApiJsonHelper;
|
this.fromApiJsonHelper = fromApiJsonHelper;
|
||||||
this.configurationDomainService = configurationDomainService;
|
this.configurationDomainService = configurationDomainService;
|
||||||
|
this.savingAccountAssembler = savingAccountAssembler;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void validateTransactionWithPivotDate(final LocalDate transactionDate, final SavingsAccount savingsAccount) {
|
public void validateTransactionWithPivotDate(final LocalDate transactionDate, final SavingsAccount savingsAccount) {
|
||||||
@@ -179,6 +184,13 @@ public class SavingsAccountTransactionDataValidator {
|
|||||||
account.getId());
|
account.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (account.getSubStatus().equals(SavingsAccountSubStatusEnum.BLOCK.getValue())
|
||||||
|
|| account.getSubStatus().equals(SavingsAccountSubStatusEnum.BLOCK_CREDIT.getValue())
|
||||||
|
|| account.getSubStatus().equals(SavingsAccountSubStatusEnum.BLOCK_DEBIT.getValue())) {
|
||||||
|
baseDataValidator.reset().parameter(SavingsApiConstants.subStatusParamName)
|
||||||
|
.failWithCodeNoParameterAddedToErrorCode("account.is.in.blocked.state");
|
||||||
|
}
|
||||||
|
|
||||||
validatePaymentTypeDetails(baseDataValidator, element);
|
validatePaymentTypeDetails(baseDataValidator, element);
|
||||||
|
|
||||||
throwExceptionIfValidationWarningsExist(dataValidationErrors);
|
throwExceptionIfValidationWarningsExist(dataValidationErrors);
|
||||||
@@ -225,6 +237,10 @@ public class SavingsAccountTransactionDataValidator {
|
|||||||
baseDataValidator.reset().parameter(transactionAmountParamName).value(amount).notNull().positiveAmount();
|
baseDataValidator.reset().parameter(transactionAmountParamName).value(amount).notNull().positiveAmount();
|
||||||
final LocalDate transactionDate = this.fromApiJsonHelper.extractLocalDateNamed(transactionDateParamName, element);
|
final LocalDate transactionDate = this.fromApiJsonHelper.extractLocalDateNamed(transactionDateParamName, element);
|
||||||
|
|
||||||
|
final String reasonForBlock = this.fromApiJsonHelper.extractStringNamed(SavingsApiConstants.reasonForBlockParamName, element);
|
||||||
|
baseDataValidator.reset().parameter(SavingsApiConstants.reasonForBlockParamName).value(reasonForBlock).notBlank()
|
||||||
|
.notExceedingLengthOf(100);
|
||||||
|
|
||||||
baseDataValidator.reset().parameter(transactionDateParamName).value(transactionDate).notNull();
|
baseDataValidator.reset().parameter(transactionDateParamName).value(transactionDate).notNull();
|
||||||
boolean isActive = account.isActive();
|
boolean isActive = account.isActive();
|
||||||
|
|
||||||
@@ -232,21 +248,18 @@ public class SavingsAccountTransactionDataValidator {
|
|||||||
baseDataValidator.reset().parameter(SavingsApiConstants.statusParamName)
|
baseDataValidator.reset().parameter(SavingsApiConstants.statusParamName)
|
||||||
.failWithCodeNoParameterAddedToErrorCode(SavingsApiConstants.ERROR_MSG_SAVINGS_ACCOUNT_NOT_ACTIVE);
|
.failWithCodeNoParameterAddedToErrorCode(SavingsApiConstants.ERROR_MSG_SAVINGS_ACCOUNT_NOT_ACTIVE);
|
||||||
}
|
}
|
||||||
account.holdAmount(amount);
|
|
||||||
|
Boolean lien = false;
|
||||||
|
if (this.fromApiJsonHelper.parameterExists(lienParamName, element)) {
|
||||||
|
lien = this.fromApiJsonHelper.extractBooleanNamed(lienParamName, element);
|
||||||
|
}
|
||||||
|
|
||||||
if (account.getEnforceMinRequiredBalance()) {
|
if (account.getEnforceMinRequiredBalance()) {
|
||||||
if (account.getWithdrawableBalance().compareTo(BigDecimal.ZERO) < 0) {
|
if (account.getWithdrawableBalance().compareTo(BigDecimal.ZERO) < 0) {
|
||||||
baseDataValidator.reset().failWithCodeNoParameterAddedToErrorCode("insufficient balance", account.getId());
|
if (!lien) {
|
||||||
}
|
if (account.getWithdrawableBalanceWithoutMinimumBalance().compareTo(account.getMinRequiredBalance()) < 0) {
|
||||||
}
|
baseDataValidator.reset().failWithCodeNoParameterAddedToErrorCode("insufficient balance", account.getId());
|
||||||
|
}
|
||||||
Boolean lien = false;
|
|
||||||
|
|
||||||
if (this.fromApiJsonHelper.parameterExists(lienParamName, element)) {
|
|
||||||
lien = this.fromApiJsonHelper.extractBooleanNamed(lienParamName, element);
|
|
||||||
if (!lien) {
|
|
||||||
if (account.getWithdrawableBalanceWithoutMinimumBalance().compareTo(BigDecimal.ZERO) < 0) {
|
|
||||||
baseDataValidator.reset().failWithCodeNoParameterAddedToErrorCode("insufficient balance", account.getId());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -271,6 +284,7 @@ public class SavingsAccountTransactionDataValidator {
|
|||||||
|
|
||||||
SavingsAccountTransaction transaction = SavingsAccountTransaction.holdAmount(account, account.office(), paymentDetails,
|
SavingsAccountTransaction transaction = SavingsAccountTransaction.holdAmount(account, account.office(), paymentDetails,
|
||||||
transactionDate, Money.of(account.getCurrency(), amount), createdDate, createdUser);
|
transactionDate, Money.of(account.getCurrency(), amount), createdDate, createdUser);
|
||||||
|
|
||||||
return transaction;
|
return transaction;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -298,6 +312,7 @@ public class SavingsAccountTransactionDataValidator {
|
|||||||
throwExceptionIfValidationWarningsExist(dataValidationErrors);
|
throwExceptionIfValidationWarningsExist(dataValidationErrors);
|
||||||
Date createdDate = new Date();
|
Date createdDate = new Date();
|
||||||
LocalDate transactionDate = DateUtils.getLocalDateOfTenant();
|
LocalDate transactionDate = DateUtils.getLocalDateOfTenant();
|
||||||
|
|
||||||
SavingsAccountTransaction transaction = SavingsAccountTransaction.releaseAmount(holdTransaction, transactionDate, createdDate,
|
SavingsAccountTransaction transaction = SavingsAccountTransaction.releaseAmount(holdTransaction, transactionDate, createdDate,
|
||||||
createdUser);
|
createdUser);
|
||||||
return transaction;
|
return transaction;
|
||||||
|
|||||||
+17
-2
@@ -220,6 +220,9 @@ public class SavingsAccount extends AbstractPersistableCustom {
|
|||||||
@JoinColumn(name = "closedon_userid", nullable = true)
|
@JoinColumn(name = "closedon_userid", nullable = true)
|
||||||
protected AppUser closedBy;
|
protected AppUser closedBy;
|
||||||
|
|
||||||
|
@Column(name = "reason_for_block", nullable = true)
|
||||||
|
protected String reasonForBlock;
|
||||||
|
|
||||||
@Embedded
|
@Embedded
|
||||||
protected MonetaryCurrency currency;
|
protected MonetaryCurrency currency;
|
||||||
|
|
||||||
@@ -1442,8 +1445,16 @@ public class SavingsAccount extends AbstractPersistableCustom {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (this.getSavingsHoldAmount().compareTo(BigDecimal.ZERO) > 0) {
|
if (this.getSavingsHoldAmount().compareTo(BigDecimal.ZERO) > 0) {
|
||||||
if (runningBalance.minus(this.getSavingsHoldAmount()).isLessThanZero()) {
|
if (this.enforceMinRequiredBalance) {
|
||||||
throw new InsufficientAccountBalanceException("transactionAmount", getAccountBalance(), withdrawalFee, transactionAmount);
|
if (runningBalance.minus(minRequiredBalance.plus(this.getSavingsHoldAmount())).isLessThanZero()) {
|
||||||
|
throw new InsufficientAccountBalanceException("transactionAmount", getAccountBalance(), withdrawalFee,
|
||||||
|
transactionAmount);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (runningBalance.minus(this.getSavingsHoldAmount()).isLessThanZero()) {
|
||||||
|
throw new InsufficientAccountBalanceException("transactionAmount", getAccountBalance(), withdrawalFee,
|
||||||
|
transactionAmount);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3500,6 +3511,10 @@ public class SavingsAccount extends AbstractPersistableCustom {
|
|||||||
this.summary.updateSummary(this.currency, this.savingsAccountTransactionSummaryWrapper, transactions);
|
this.summary.updateSummary(this.currency, this.savingsAccountTransactionSummaryWrapper, transactions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void updateReason(final String reasonForBlock) {
|
||||||
|
this.reasonForBlock = reasonForBlock;
|
||||||
|
}
|
||||||
|
|
||||||
public Map<String, Object> block() {
|
public Map<String, Object> block() {
|
||||||
|
|
||||||
final Map<String, Object> actualChanges = new LinkedHashMap<>();
|
final Map<String, Object> actualChanges = new LinkedHashMap<>();
|
||||||
|
|||||||
+4
@@ -262,6 +262,10 @@ public final class SavingsAccountSummary {
|
|||||||
return this.accountBalance;
|
return this.accountBalance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setAccountBalance(BigDecimal accountBalance) {
|
||||||
|
this.accountBalance = accountBalance;
|
||||||
|
}
|
||||||
|
|
||||||
public BigDecimal getTotalInterestPosted() {
|
public BigDecimal getTotalInterestPosted() {
|
||||||
return this.totalInterestPosted;
|
return this.totalInterestPosted;
|
||||||
}
|
}
|
||||||
|
|||||||
+7
@@ -127,6 +127,9 @@ public final class SavingsAccountTransaction extends AbstractPersistableCustom {
|
|||||||
@Column(name = "release_id_of_hold_amount", length = 20)
|
@Column(name = "release_id_of_hold_amount", length = 20)
|
||||||
private Long releaseIdOfHoldAmountTransaction;
|
private Long releaseIdOfHoldAmountTransaction;
|
||||||
|
|
||||||
|
@Column(name = "reason_for_block", nullable = true)
|
||||||
|
private String reasonForBlock;
|
||||||
|
|
||||||
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
|
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
|
||||||
@JoinColumn(name = "savings_account_transaction_id", referencedColumnName = "id")
|
@JoinColumn(name = "savings_account_transaction_id", referencedColumnName = "id")
|
||||||
private List<Note> notes = new ArrayList<>();
|
private List<Note> notes = new ArrayList<>();
|
||||||
@@ -843,6 +846,10 @@ public final class SavingsAccountTransaction extends AbstractPersistableCustom {
|
|||||||
this.releaseIdOfHoldAmountTransaction = releaseId;
|
this.releaseIdOfHoldAmountTransaction = releaseId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void updateReason(String reasonForBlock) {
|
||||||
|
this.reasonForBlock = reasonForBlock;
|
||||||
|
}
|
||||||
|
|
||||||
public Long getReleaseIdOfHoldAmountTransaction() {
|
public Long getReleaseIdOfHoldAmountTransaction() {
|
||||||
return this.releaseIdOfHoldAmountTransaction;
|
return this.releaseIdOfHoldAmountTransaction;
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -41,7 +41,7 @@ public class BlockCreditsToSavingsAccountCommandHandler implements NewCommandSou
|
|||||||
@Transactional
|
@Transactional
|
||||||
@Override
|
@Override
|
||||||
public CommandProcessingResult processCommand(JsonCommand command) {
|
public CommandProcessingResult processCommand(JsonCommand command) {
|
||||||
return this.writePlatformService.blockCredits(command.getSavingsId());
|
return this.writePlatformService.blockCredits(command.getSavingsId(), command);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -41,7 +41,7 @@ public class BlockDebitsFromSavingsAccountCommandHandler implements NewCommandSo
|
|||||||
@Transactional
|
@Transactional
|
||||||
@Override
|
@Override
|
||||||
public CommandProcessingResult processCommand(JsonCommand command) {
|
public CommandProcessingResult processCommand(JsonCommand command) {
|
||||||
return this.writePlatformService.blockDebits(command.getSavingsId());
|
return this.writePlatformService.blockDebits(command.getSavingsId(), command);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -41,7 +41,7 @@ public class BlockSavingsAccountCommandHandler implements NewCommandSourceHandle
|
|||||||
@Transactional
|
@Transactional
|
||||||
@Override
|
@Override
|
||||||
public CommandProcessingResult processCommand(JsonCommand command) {
|
public CommandProcessingResult processCommand(JsonCommand command) {
|
||||||
return this.writePlatformService.blockAccount(command.getSavingsId());
|
return this.writePlatformService.blockAccount(command.getSavingsId(), command);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+23
-16
@@ -576,7 +576,7 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead
|
|||||||
final BigDecimal minRequiredBalance = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "minRequiredBalance");
|
final BigDecimal minRequiredBalance = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "minRequiredBalance");
|
||||||
final boolean enforceMinRequiredBalance = rs.getBoolean("enforceMinRequiredBalance");
|
final boolean enforceMinRequiredBalance = rs.getBoolean("enforceMinRequiredBalance");
|
||||||
savingsAccountData = SavingsAccountData.instance(id, accountNo, depositType, externalId, null, null, null, null,
|
savingsAccountData = SavingsAccountData.instance(id, accountNo, depositType, externalId, null, null, null, null,
|
||||||
productId, null, null, null, status, subStatus, timeline, currency, nominalAnnualInterestRate,
|
productId, null, null, null, status, subStatus, null, timeline, currency, nominalAnnualInterestRate,
|
||||||
interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType,
|
interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType,
|
||||||
interestCalculationDaysInYearType, minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType,
|
interestCalculationDaysInYearType, minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType,
|
||||||
withdrawalFeeForTransfers, summary, allowOverdraft, overdraftLimit, minRequiredBalance,
|
withdrawalFeeForTransfers, summary, allowOverdraft, overdraftLimit, minRequiredBalance,
|
||||||
@@ -746,6 +746,7 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead
|
|||||||
sqlBuilder.append("s.id fieldOfficerId, s.display_name as fieldOfficerName, ");
|
sqlBuilder.append("s.id fieldOfficerId, s.display_name as fieldOfficerName, ");
|
||||||
sqlBuilder.append("sa.status_enum as statusEnum, ");
|
sqlBuilder.append("sa.status_enum as statusEnum, ");
|
||||||
sqlBuilder.append("sa.sub_status_enum as subStatusEnum, ");
|
sqlBuilder.append("sa.sub_status_enum as subStatusEnum, ");
|
||||||
|
sqlBuilder.append("sa.reason_for_block as reasonForBlock, ");
|
||||||
sqlBuilder.append("sa.submittedon_date as submittedOnDate,");
|
sqlBuilder.append("sa.submittedon_date as submittedOnDate,");
|
||||||
sqlBuilder.append("sbu.username as submittedByUsername,");
|
sqlBuilder.append("sbu.username as submittedByUsername,");
|
||||||
sqlBuilder.append("sbu.firstname as submittedByFirstname, sbu.lastname as submittedByLastname,");
|
sqlBuilder.append("sbu.firstname as submittedByFirstname, sbu.lastname as submittedByLastname,");
|
||||||
@@ -874,6 +875,7 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead
|
|||||||
|
|
||||||
final Integer subStatusEnum = JdbcSupport.getInteger(rs, "subStatusEnum");
|
final Integer subStatusEnum = JdbcSupport.getInteger(rs, "subStatusEnum");
|
||||||
final SavingsAccountSubStatusEnumData subStatus = SavingsEnumerations.subStatus(subStatusEnum);
|
final SavingsAccountSubStatusEnumData subStatus = SavingsEnumerations.subStatus(subStatusEnum);
|
||||||
|
final String reasonForBlock = rs.getString("reasonForBlock");
|
||||||
|
|
||||||
final LocalDate lastActiveTransactionDate = JdbcSupport.getLocalDate(rs, "lastActiveTransactionDate");
|
final LocalDate lastActiveTransactionDate = JdbcSupport.getLocalDate(rs, "lastActiveTransactionDate");
|
||||||
final boolean isDormancyTrackingActive = rs.getBoolean("isDormancyTrackingActive");
|
final boolean isDormancyTrackingActive = rs.getBoolean("isDormancyTrackingActive");
|
||||||
@@ -1022,7 +1024,6 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead
|
|||||||
|
|
||||||
BigDecimal availableBalance = accountBalance;
|
BigDecimal availableBalance = accountBalance;
|
||||||
if (availableBalance != null && onHoldFunds != null) {
|
if (availableBalance != null && onHoldFunds != null) {
|
||||||
|
|
||||||
availableBalance = availableBalance.subtract(onHoldFunds);
|
availableBalance = availableBalance.subtract(onHoldFunds);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1052,12 +1053,13 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead
|
|||||||
}
|
}
|
||||||
|
|
||||||
return SavingsAccountData.instance(id, accountNo, depositType, externalId, groupId, groupName, clientId, clientName, productId,
|
return SavingsAccountData.instance(id, accountNo, depositType, externalId, groupId, groupName, clientId, clientName, productId,
|
||||||
productName, fieldOfficerId, fieldOfficerName, status, subStatus, timeline, currency, nominalAnnualInterestRate,
|
productName, fieldOfficerId, fieldOfficerName, status, subStatus, reasonForBlock, timeline, currency,
|
||||||
interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType,
|
nominalAnnualInterestRate, interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType,
|
||||||
minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType, withdrawalFeeForTransfers, summary,
|
interestCalculationDaysInYearType, minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType,
|
||||||
allowOverdraft, overdraftLimit, minRequiredBalance, enforceMinRequiredBalance, minBalanceForInterestCalculation,
|
withdrawalFeeForTransfers, summary, allowOverdraft, overdraftLimit, minRequiredBalance, enforceMinRequiredBalance,
|
||||||
onHoldFunds, nominalAnnualInterestRateOverdraft, minOverdraftForInterestCalculation, withHoldTax, taxGroupData,
|
minBalanceForInterestCalculation, onHoldFunds, nominalAnnualInterestRateOverdraft, minOverdraftForInterestCalculation,
|
||||||
lastActiveTransactionDate, isDormancyTrackingActive, daysToInactive, daysToDormancy, daysToEscheat, onHoldAmount);
|
withHoldTax, taxGroupData, lastActiveTransactionDate, isDormancyTrackingActive, daysToInactive, daysToDormancy,
|
||||||
|
daysToEscheat, onHoldAmount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1312,6 +1314,8 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead
|
|||||||
final StringBuilder sqlBuilder = new StringBuilder(400);
|
final StringBuilder sqlBuilder = new StringBuilder(400);
|
||||||
sqlBuilder.append("tr.id as transactionId, tr.transaction_type_enum as transactionType, ");
|
sqlBuilder.append("tr.id as transactionId, tr.transaction_type_enum as transactionType, ");
|
||||||
sqlBuilder.append("tr.transaction_date as transactionDate, tr.amount as transactionAmount,");
|
sqlBuilder.append("tr.transaction_date as transactionDate, tr.amount as transactionAmount,");
|
||||||
|
sqlBuilder.append(" tr.release_id_of_hold_amount as releaseTransactionId,");
|
||||||
|
sqlBuilder.append(" tr.reason_for_block as reasonForBlock,");
|
||||||
sqlBuilder.append("tr.created_date as submittedOnDate,");
|
sqlBuilder.append("tr.created_date as submittedOnDate,");
|
||||||
sqlBuilder.append(" au.username as submittedByUsername, ");
|
sqlBuilder.append(" au.username as submittedByUsername, ");
|
||||||
sqlBuilder.append(" nt.note as transactionNote, ");
|
sqlBuilder.append(" nt.note as transactionNote, ");
|
||||||
@@ -1357,6 +1361,8 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead
|
|||||||
final LocalDate date = JdbcSupport.getLocalDate(rs, "transactionDate");
|
final LocalDate date = JdbcSupport.getLocalDate(rs, "transactionDate");
|
||||||
final LocalDate submittedOnDate = JdbcSupport.getLocalDate(rs, "submittedOnDate");
|
final LocalDate submittedOnDate = JdbcSupport.getLocalDate(rs, "submittedOnDate");
|
||||||
final BigDecimal amount = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "transactionAmount");
|
final BigDecimal amount = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "transactionAmount");
|
||||||
|
final Long releaseTransactionId = rs.getLong("releaseTransactionId");
|
||||||
|
final String reasonForBlock = rs.getString("reasonForBlock");
|
||||||
final BigDecimal outstandingChargeAmount = null;
|
final BigDecimal outstandingChargeAmount = null;
|
||||||
final BigDecimal runningBalance = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "runningBalance");
|
final BigDecimal runningBalance = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "runningBalance");
|
||||||
final boolean reversed = rs.getBoolean("reversed");
|
final boolean reversed = rs.getBoolean("reversed");
|
||||||
@@ -1416,7 +1422,7 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead
|
|||||||
final String note = rs.getString("transactionNote");
|
final String note = rs.getString("transactionNote");
|
||||||
return SavingsAccountTransactionData.create(id, transactionType, paymentDetailData, savingsId, accountNo, date, currency,
|
return SavingsAccountTransactionData.create(id, transactionType, paymentDetailData, savingsId, accountNo, date, currency,
|
||||||
amount, outstandingChargeAmount, runningBalance, reversed, transfer, submittedOnDate, postInterestAsOn,
|
amount, outstandingChargeAmount, runningBalance, reversed, transfer, submittedOnDate, postInterestAsOn,
|
||||||
submittedByUsername, note, isReversal, originalTransactionId);
|
submittedByUsername, note, isReversal, originalTransactionId, releaseTransactionId, reasonForBlock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1619,6 +1625,7 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead
|
|||||||
final BigDecimal savingsAmountOnHold = null;
|
final BigDecimal savingsAmountOnHold = null;
|
||||||
|
|
||||||
final SavingsAccountSubStatusEnumData subStatus = null;
|
final SavingsAccountSubStatusEnumData subStatus = null;
|
||||||
|
final String reasonForBlock = null;
|
||||||
final LocalDate lastActiveTransactionDate = null;
|
final LocalDate lastActiveTransactionDate = null;
|
||||||
final boolean isDormancyTrackingActive = false;
|
final boolean isDormancyTrackingActive = false;
|
||||||
final Integer daysToInactive = null;
|
final Integer daysToInactive = null;
|
||||||
@@ -1628,13 +1635,13 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead
|
|||||||
final SavingsAccountApplicationTimelineData timeline = SavingsAccountApplicationTimelineData.templateDefault();
|
final SavingsAccountApplicationTimelineData timeline = SavingsAccountApplicationTimelineData.templateDefault();
|
||||||
final EnumOptionData depositType = null;
|
final EnumOptionData depositType = null;
|
||||||
return SavingsAccountData.instance(null, null, depositType, null, groupId, groupName, clientId, clientName, productId,
|
return SavingsAccountData.instance(null, null, depositType, null, groupId, groupName, clientId, clientName, productId,
|
||||||
productName, fieldOfficerId, fieldOfficerName, status, subStatus, timeline, currency, nominalAnnualIterestRate,
|
productName, fieldOfficerId, fieldOfficerName, status, subStatus, reasonForBlock, timeline, currency,
|
||||||
interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType,
|
nominalAnnualIterestRate, interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType,
|
||||||
minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType, withdrawalFeeForTransfers, summary,
|
interestCalculationDaysInYearType, minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType,
|
||||||
allowOverdraft, overdraftLimit, minRequiredBalance, enforceMinRequiredBalance, minBalanceForInterestCalculation,
|
withdrawalFeeForTransfers, summary, allowOverdraft, overdraftLimit, minRequiredBalance, enforceMinRequiredBalance,
|
||||||
onHoldFunds, nominalAnnualInterestRateOverdraft, minOverdraftForInterestCalculation, withHoldTax, taxGroupData,
|
minBalanceForInterestCalculation, onHoldFunds, nominalAnnualInterestRateOverdraft, minOverdraftForInterestCalculation,
|
||||||
lastActiveTransactionDate, isDormancyTrackingActive, daysToInactive, daysToDormancy, daysToEscheat,
|
withHoldTax, taxGroupData, lastActiveTransactionDate, isDormancyTrackingActive, daysToInactive, daysToDormancy,
|
||||||
savingsAmountOnHold);
|
daysToEscheat, savingsAmountOnHold);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -96,17 +96,17 @@ public interface SavingsAccountWritePlatformService {
|
|||||||
SavingsAccountData postInterest(SavingsAccountData account, boolean postInterestAs, LocalDate transactionDate,
|
SavingsAccountData postInterest(SavingsAccountData account, boolean postInterestAs, LocalDate transactionDate,
|
||||||
boolean backdatedTxnsAllowedTill);
|
boolean backdatedTxnsAllowedTill);
|
||||||
|
|
||||||
CommandProcessingResult blockAccount(Long savingsId);
|
CommandProcessingResult blockAccount(Long savingsId, JsonCommand command);
|
||||||
|
|
||||||
CommandProcessingResult unblockAccount(Long savingsId);
|
CommandProcessingResult unblockAccount(Long savingsId);
|
||||||
|
|
||||||
CommandProcessingResult holdAmount(Long savingsId, JsonCommand command);
|
CommandProcessingResult holdAmount(Long savingsId, JsonCommand command);
|
||||||
|
|
||||||
CommandProcessingResult blockCredits(Long savingsId);
|
CommandProcessingResult blockCredits(Long savingsId, JsonCommand command);
|
||||||
|
|
||||||
CommandProcessingResult unblockCredits(Long savingsId);
|
CommandProcessingResult unblockCredits(Long savingsId);
|
||||||
|
|
||||||
CommandProcessingResult blockDebits(Long savingsId);
|
CommandProcessingResult blockDebits(Long savingsId, JsonCommand command);
|
||||||
|
|
||||||
CommandProcessingResult unblockDebits(Long savingsId);
|
CommandProcessingResult unblockDebits(Long savingsId);
|
||||||
|
|
||||||
|
|||||||
+62
-8
@@ -23,6 +23,7 @@ import static org.apache.fineract.portfolio.savings.SavingsApiConstants.SAVINGS_
|
|||||||
import static org.apache.fineract.portfolio.savings.SavingsApiConstants.amountParamName;
|
import static org.apache.fineract.portfolio.savings.SavingsApiConstants.amountParamName;
|
||||||
import static org.apache.fineract.portfolio.savings.SavingsApiConstants.chargeIdParamName;
|
import static org.apache.fineract.portfolio.savings.SavingsApiConstants.chargeIdParamName;
|
||||||
import static org.apache.fineract.portfolio.savings.SavingsApiConstants.dueAsOfDateParamName;
|
import static org.apache.fineract.portfolio.savings.SavingsApiConstants.dueAsOfDateParamName;
|
||||||
|
import static org.apache.fineract.portfolio.savings.SavingsApiConstants.transactionAmountParamName;
|
||||||
import static org.apache.fineract.portfolio.savings.SavingsApiConstants.withHoldTaxParamName;
|
import static org.apache.fineract.portfolio.savings.SavingsApiConstants.withHoldTaxParamName;
|
||||||
import static org.apache.fineract.portfolio.savings.SavingsApiConstants.withdrawBalanceParamName;
|
import static org.apache.fineract.portfolio.savings.SavingsApiConstants.withdrawBalanceParamName;
|
||||||
|
|
||||||
@@ -53,6 +54,7 @@ import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuild
|
|||||||
import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder;
|
import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder;
|
||||||
import org.apache.fineract.infrastructure.core.exception.GeneralPlatformDomainRuleException;
|
import org.apache.fineract.infrastructure.core.exception.GeneralPlatformDomainRuleException;
|
||||||
import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException;
|
import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException;
|
||||||
|
import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException;
|
||||||
import org.apache.fineract.infrastructure.core.exception.PlatformServiceUnavailableException;
|
import org.apache.fineract.infrastructure.core.exception.PlatformServiceUnavailableException;
|
||||||
import org.apache.fineract.infrastructure.core.service.DateUtils;
|
import org.apache.fineract.infrastructure.core.service.DateUtils;
|
||||||
import org.apache.fineract.infrastructure.dataqueries.data.EntityTables;
|
import org.apache.fineract.infrastructure.dataqueries.data.EntityTables;
|
||||||
@@ -1762,7 +1764,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CommandProcessingResult blockAccount(final Long savingsId) {
|
public CommandProcessingResult blockAccount(final Long savingsId, final JsonCommand command) {
|
||||||
|
|
||||||
this.context.authenticatedUser();
|
this.context.authenticatedUser();
|
||||||
|
|
||||||
@@ -1770,6 +1772,11 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
|
|||||||
checkClientOrGroupActive(account);
|
checkClientOrGroupActive(account);
|
||||||
|
|
||||||
final Map<String, Object> changes = account.block();
|
final Map<String, Object> changes = account.block();
|
||||||
|
|
||||||
|
final String reasonForBlock = command.stringValueOfParameterNamed(SavingsApiConstants.reasonForBlockParamName);
|
||||||
|
validateReasonForHold(reasonForBlock);
|
||||||
|
account.updateReason(reasonForBlock);
|
||||||
|
|
||||||
if (!changes.isEmpty()) {
|
if (!changes.isEmpty()) {
|
||||||
|
|
||||||
this.savingAccountRepositoryWrapper.save(account);
|
this.savingAccountRepositoryWrapper.save(account);
|
||||||
@@ -1786,6 +1793,9 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
|
|||||||
checkClientOrGroupActive(account);
|
checkClientOrGroupActive(account);
|
||||||
|
|
||||||
final Map<String, Object> changes = account.unblock();
|
final Map<String, Object> changes = account.unblock();
|
||||||
|
|
||||||
|
account.updateReason(null);
|
||||||
|
|
||||||
if (!changes.isEmpty()) {
|
if (!changes.isEmpty()) {
|
||||||
|
|
||||||
this.savingAccountRepositoryWrapper.save(account);
|
this.savingAccountRepositoryWrapper.save(account);
|
||||||
@@ -1804,12 +1814,29 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
|
|||||||
|
|
||||||
checkClientOrGroupActive(account);
|
checkClientOrGroupActive(account);
|
||||||
|
|
||||||
SavingsAccountTransaction transacton = this.savingsAccountTransactionDataValidator.validateHoldAndAssembleForm(command.json(),
|
final BigDecimal amount = command.bigDecimalValueOfParameterNamed(transactionAmountParamName);
|
||||||
|
|
||||||
|
Money runningBalance = Money.of(account.getCurrency(), account.getAccountBalance());
|
||||||
|
if (account.getSavingsHoldAmount() != null) {
|
||||||
|
runningBalance = runningBalance.minus(account.getSavingsHoldAmount()).minus(amount);
|
||||||
|
} else {
|
||||||
|
runningBalance = runningBalance.minus(amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
account.holdAmount(amount);
|
||||||
|
|
||||||
|
SavingsAccountTransaction transaction = this.savingsAccountTransactionDataValidator.validateHoldAndAssembleForm(command.json(),
|
||||||
account, submittedBy, backdatedTxnsAllowedTill);
|
account, submittedBy, backdatedTxnsAllowedTill);
|
||||||
|
|
||||||
this.savingsAccountTransactionDataValidator.validateTransactionWithPivotDate(transacton.getTransactionLocalDate(), account);
|
transaction.updateRunningBalance(runningBalance);
|
||||||
|
|
||||||
this.savingsAccountTransactionRepository.saveAndFlush(transacton);
|
final String reasonForBlock = command.stringValueOfParameterNamed(SavingsApiConstants.reasonForBlockParamName);
|
||||||
|
transaction.updateReason(reasonForBlock);
|
||||||
|
|
||||||
|
account.getAccountBalance();
|
||||||
|
this.savingsAccountTransactionDataValidator.validateTransactionWithPivotDate(transaction.getTransactionLocalDate(), account);
|
||||||
|
|
||||||
|
this.savingsAccountTransactionRepository.saveAndFlush(transaction);
|
||||||
|
|
||||||
if (backdatedTxnsAllowedTill) {
|
if (backdatedTxnsAllowedTill) {
|
||||||
// Check again whether transactions are modified
|
// Check again whether transactions are modified
|
||||||
@@ -1818,7 +1845,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
|
|||||||
|
|
||||||
this.savingAccountRepositoryWrapper.saveAndFlush(account);
|
this.savingAccountRepositoryWrapper.saveAndFlush(account);
|
||||||
|
|
||||||
return new CommandProcessingResultBuilder().withEntityId(transacton.getId()).withOfficeId(account.officeId())
|
return new CommandProcessingResultBuilder().withEntityId(transaction.getId()).withOfficeId(account.officeId())
|
||||||
.withClientId(account.clientId()).withGroupId(account.groupId()).withSavingsId(savingsId).build();
|
.withClientId(account.clientId()).withGroupId(account.groupId()).withSavingsId(savingsId).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1830,6 +1857,8 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
|
|||||||
SavingsAccountTransaction holdTransaction = this.savingsAccountTransactionRepository
|
SavingsAccountTransaction holdTransaction = this.savingsAccountTransactionRepository
|
||||||
.findOneByIdAndSavingsAccountId(savingsTransactionId, savingsId);
|
.findOneByIdAndSavingsAccountId(savingsTransactionId, savingsId);
|
||||||
|
|
||||||
|
holdTransaction.updateReason(null);
|
||||||
|
|
||||||
final SavingsAccountTransaction transaction = this.savingsAccountTransactionDataValidator
|
final SavingsAccountTransaction transaction = this.savingsAccountTransactionDataValidator
|
||||||
.validateReleaseAmountAndAssembleForm(holdTransaction, submittedBy);
|
.validateReleaseAmountAndAssembleForm(holdTransaction, submittedBy);
|
||||||
|
|
||||||
@@ -1837,6 +1866,15 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
|
|||||||
final SavingsAccount account = this.savingAccountAssembler.assembleFrom(savingsId, backdatedTxnsAllowedTill);
|
final SavingsAccount account = this.savingAccountAssembler.assembleFrom(savingsId, backdatedTxnsAllowedTill);
|
||||||
checkClientOrGroupActive(account);
|
checkClientOrGroupActive(account);
|
||||||
|
|
||||||
|
Money runningBalance = Money.of(account.getCurrency(), account.getAccountBalance());
|
||||||
|
|
||||||
|
Money savingsOnHold = Money.of(account.getCurrency(), account.getSavingsHoldAmount());
|
||||||
|
|
||||||
|
runningBalance = runningBalance.minus(savingsOnHold);
|
||||||
|
|
||||||
|
runningBalance = runningBalance.plus(transaction.getAmount());
|
||||||
|
transaction.updateRunningBalance(runningBalance);
|
||||||
|
|
||||||
this.savingsAccountTransactionDataValidator.validateTransactionWithPivotDate(transaction.getTransactionLocalDate(), account);
|
this.savingsAccountTransactionDataValidator.validateTransactionWithPivotDate(transaction.getTransactionLocalDate(), account);
|
||||||
account.releaseOnHoldAmount(transaction.getAmount());
|
account.releaseOnHoldAmount(transaction.getAmount());
|
||||||
|
|
||||||
@@ -1855,12 +1893,16 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
|
|||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
@Override
|
@Override
|
||||||
public CommandProcessingResult blockCredits(final Long savingsId) {
|
public CommandProcessingResult blockCredits(final Long savingsId, final JsonCommand command) {
|
||||||
this.context.authenticatedUser();
|
this.context.authenticatedUser();
|
||||||
|
|
||||||
final SavingsAccount account = this.savingAccountAssembler.assembleFrom(savingsId, false);
|
final SavingsAccount account = this.savingAccountAssembler.assembleFrom(savingsId, false);
|
||||||
checkClientOrGroupActive(account);
|
checkClientOrGroupActive(account);
|
||||||
|
|
||||||
|
final String reasonForBlock = command.stringValueOfParameterNamed(SavingsApiConstants.reasonForBlockParamName);
|
||||||
|
validateReasonForHold(reasonForBlock);
|
||||||
|
account.updateReason(reasonForBlock);
|
||||||
|
|
||||||
final Map<String, Object> changes = account.blockCredits(account.getSubStatus());
|
final Map<String, Object> changes = account.blockCredits(account.getSubStatus());
|
||||||
if (!changes.isEmpty()) {
|
if (!changes.isEmpty()) {
|
||||||
|
|
||||||
@@ -1877,7 +1919,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
|
|||||||
|
|
||||||
final SavingsAccount account = this.savingAccountAssembler.assembleFrom(savingsId, false);
|
final SavingsAccount account = this.savingAccountAssembler.assembleFrom(savingsId, false);
|
||||||
checkClientOrGroupActive(account);
|
checkClientOrGroupActive(account);
|
||||||
|
account.updateReason(null);
|
||||||
final Map<String, Object> changes = account.unblockCredits();
|
final Map<String, Object> changes = account.unblockCredits();
|
||||||
if (!changes.isEmpty()) {
|
if (!changes.isEmpty()) {
|
||||||
|
|
||||||
@@ -1889,12 +1931,16 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
|
|||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
@Override
|
@Override
|
||||||
public CommandProcessingResult blockDebits(final Long savingsId) {
|
public CommandProcessingResult blockDebits(final Long savingsId, final JsonCommand command) {
|
||||||
this.context.authenticatedUser();
|
this.context.authenticatedUser();
|
||||||
|
|
||||||
final SavingsAccount account = this.savingAccountAssembler.assembleFrom(savingsId, false);
|
final SavingsAccount account = this.savingAccountAssembler.assembleFrom(savingsId, false);
|
||||||
checkClientOrGroupActive(account);
|
checkClientOrGroupActive(account);
|
||||||
|
|
||||||
|
final String reasonForBlock = command.stringValueOfParameterNamed(SavingsApiConstants.reasonForBlockParamName);
|
||||||
|
validateReasonForHold(reasonForBlock);
|
||||||
|
account.updateReason(reasonForBlock);
|
||||||
|
|
||||||
final Map<String, Object> changes = account.blockDebits(account.getSubStatus());
|
final Map<String, Object> changes = account.blockDebits(account.getSubStatus());
|
||||||
if (!changes.isEmpty()) {
|
if (!changes.isEmpty()) {
|
||||||
|
|
||||||
@@ -1912,6 +1958,8 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
|
|||||||
final SavingsAccount account = this.savingAccountAssembler.assembleFrom(savingsId, false);
|
final SavingsAccount account = this.savingAccountAssembler.assembleFrom(savingsId, false);
|
||||||
checkClientOrGroupActive(account);
|
checkClientOrGroupActive(account);
|
||||||
|
|
||||||
|
account.updateReason(null);
|
||||||
|
|
||||||
final Map<String, Object> changes = account.unblockDebits();
|
final Map<String, Object> changes = account.unblockDebits();
|
||||||
if (!changes.isEmpty()) {
|
if (!changes.isEmpty()) {
|
||||||
|
|
||||||
@@ -1934,4 +1982,10 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void validateReasonForHold(String reasonForBlock) {
|
||||||
|
if (StringUtils.isBlank(reasonForBlock)) {
|
||||||
|
throw new PlatformDataIntegrityException("Reason For Block is Mandatory", "error.msg.reason.for.block.mandatory");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,4 +28,5 @@
|
|||||||
<include file="parts/0006_product_loan_disallow_expected_disbursements.xml" relativeToChangelogFile="true"/>
|
<include file="parts/0006_product_loan_disallow_expected_disbursements.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="parts/0007_product_loan_higher_than_applied_loan_amount_management.xml" relativeToChangelogFile="true"/>
|
<include file="parts/0007_product_loan_higher_than_applied_loan_amount_management.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="parts/0008_loan_charge_add_external_id.xml" relativeToChangelogFile="true"/>
|
<include file="parts/0008_loan_charge_add_external_id.xml" relativeToChangelogFile="true"/>
|
||||||
|
<include file="parts/0009_hold_reason_savings_account.xml" relativeToChangelogFile="true"/>
|
||||||
</databaseChangeLog>
|
</databaseChangeLog>
|
||||||
|
|||||||
+53
@@ -0,0 +1,53 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
|
||||||
|
-->
|
||||||
|
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.1.xsd">
|
||||||
|
<changeSet author="fineract" id="1">
|
||||||
|
<addColumn tableName="m_savings_account">
|
||||||
|
<column name="reason_for_block" type="VARCHAR(256)"/>
|
||||||
|
</addColumn>
|
||||||
|
</changeSet>
|
||||||
|
<changeSet author="fineract" id="2">
|
||||||
|
<addColumn tableName="m_savings_account_transaction">
|
||||||
|
<column name="reason_for_block" type="VARCHAR(256)"/>
|
||||||
|
</addColumn>
|
||||||
|
</changeSet>
|
||||||
|
<changeSet author="fineract" id="3">
|
||||||
|
<insert tableName="m_code">
|
||||||
|
<column name="code_name" value="SavingsAccountBlockReasons"/>
|
||||||
|
<column name="is_system_defined" valueBoolean="true"/>
|
||||||
|
</insert>
|
||||||
|
<insert tableName="m_code">
|
||||||
|
<column name="code_name" value="DebitTransactionFreezeReasons"/>
|
||||||
|
<column name="is_system_defined" valueBoolean="true"/>
|
||||||
|
</insert>
|
||||||
|
<insert tableName="m_code">
|
||||||
|
<column name="code_name" value="CreditTransactionFreezeReasons"/>
|
||||||
|
<column name="is_system_defined" valueBoolean="true"/>
|
||||||
|
</insert>
|
||||||
|
<insert tableName="m_code">
|
||||||
|
<column name="code_name" value="SavingsTransactionFreezeReasons"/>
|
||||||
|
<column name="is_system_defined" valueBoolean="true"/>
|
||||||
|
</insert>
|
||||||
|
</changeSet>
|
||||||
|
</databaseChangeLog>
|
||||||
+1
-1
@@ -2193,7 +2193,7 @@ public class ClientSavingsIntegrationTest {
|
|||||||
|
|
||||||
final String minBalanceForInterestCalculation = null;
|
final String minBalanceForInterestCalculation = null;
|
||||||
final String minRequiredBalance = null;
|
final String minRequiredBalance = null;
|
||||||
final String enforceMinRequiredBalance = "false";
|
final String enforceMinRequiredBalance = "true";
|
||||||
final boolean allowOverdraft = false;
|
final boolean allowOverdraft = false;
|
||||||
final Integer savingsProductID = createSavingsProduct(this.requestSpec, this.responseSpec, MINIMUM_OPENING_BALANCE,
|
final Integer savingsProductID = createSavingsProduct(this.requestSpec, this.responseSpec, MINIMUM_OPENING_BALANCE,
|
||||||
minBalanceForInterestCalculation, minRequiredBalance, enforceMinRequiredBalance, allowOverdraft);
|
minBalanceForInterestCalculation, minRequiredBalance, enforceMinRequiredBalance, allowOverdraft);
|
||||||
|
|||||||
+16
-4
@@ -338,8 +338,8 @@ public class SavingsAccountHelper {
|
|||||||
public HashMap blockSavings(final Integer savingsID) {
|
public HashMap blockSavings(final Integer savingsID) {
|
||||||
LOG.info("---------------------------------- BLOCKING SAVINGS ACCOUNT ----------------------------------");
|
LOG.info("---------------------------------- BLOCKING SAVINGS ACCOUNT ----------------------------------");
|
||||||
Boolean isBlock = true;
|
Boolean isBlock = true;
|
||||||
return performSavingApplicationActions(createSavingsOperationURL(BLOCK_SAVINGS_COMMAND, savingsID), getActivatedSavingsAsJSON(),
|
return performSavingApplicationActions(createSavingsOperationURL(BLOCK_SAVINGS_COMMAND, savingsID),
|
||||||
isBlock);
|
getActivatedSavingsAsForHoldJSON(), isBlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
public HashMap unblockSavings(final Integer savingsID) {
|
public HashMap unblockSavings(final Integer savingsID) {
|
||||||
@@ -353,7 +353,7 @@ public class SavingsAccountHelper {
|
|||||||
LOG.info("---------------------------------- BLOCKING DEBIT TRANSACTIONS ----------------------------------");
|
LOG.info("---------------------------------- BLOCKING DEBIT TRANSACTIONS ----------------------------------");
|
||||||
Boolean isBlock = true;
|
Boolean isBlock = true;
|
||||||
return performSavingApplicationActions(createSavingsOperationURL(BLOCK_DEBITS_SAVINGS_COMMAND, savingsID),
|
return performSavingApplicationActions(createSavingsOperationURL(BLOCK_DEBITS_SAVINGS_COMMAND, savingsID),
|
||||||
getActivatedSavingsAsJSON(), isBlock);
|
getActivatedSavingsAsForHoldJSON(), isBlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
public HashMap unblockDebit(final Integer savingsID) {
|
public HashMap unblockDebit(final Integer savingsID) {
|
||||||
@@ -367,7 +367,7 @@ public class SavingsAccountHelper {
|
|||||||
LOG.info("---------------------------------- BLOCKING CREDIT TRANSACTIONS ----------------------------------");
|
LOG.info("---------------------------------- BLOCKING CREDIT TRANSACTIONS ----------------------------------");
|
||||||
Boolean isBlock = true;
|
Boolean isBlock = true;
|
||||||
return performSavingApplicationActions(createSavingsOperationURL(BLOCK_CREDITS_SAVINGS_COMMAND, savingsID),
|
return performSavingApplicationActions(createSavingsOperationURL(BLOCK_CREDITS_SAVINGS_COMMAND, savingsID),
|
||||||
getActivatedSavingsAsJSON(), isBlock);
|
getActivatedSavingsAsForHoldJSON(), isBlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
public HashMap unblockCredit(final Integer savingsID) {
|
public HashMap unblockCredit(final Integer savingsID) {
|
||||||
@@ -437,6 +437,17 @@ public class SavingsAccountHelper {
|
|||||||
return savingsAccountActivateJson;
|
return savingsAccountActivateJson;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String getActivatedSavingsAsForHoldJSON() {
|
||||||
|
final HashMap<String, String> map = new HashMap<>();
|
||||||
|
map.put("locale", CommonConstants.LOCALE);
|
||||||
|
map.put("dateFormat", CommonConstants.DATE_FORMAT);
|
||||||
|
map.put("activatedOnDate", TRANSACTION_DATE);
|
||||||
|
map.put("reasonForBlock", "unUsualActivity");
|
||||||
|
String savingsAccountActivateJson = new Gson().toJson(map);
|
||||||
|
LOG.info(savingsAccountActivateJson);
|
||||||
|
return savingsAccountActivateJson;
|
||||||
|
}
|
||||||
|
|
||||||
private String getSavingsTransactionJSON(final String amount, final String transactionDate) {
|
private String getSavingsTransactionJSON(final String amount, final String transactionDate) {
|
||||||
final HashMap<String, String> map = new HashMap<>();
|
final HashMap<String, String> map = new HashMap<>();
|
||||||
map.put("locale", CommonConstants.LOCALE);
|
map.put("locale", CommonConstants.LOCALE);
|
||||||
@@ -455,6 +466,7 @@ public class SavingsAccountHelper {
|
|||||||
map.put("transactionDate", transactionDate);
|
map.put("transactionDate", transactionDate);
|
||||||
map.put("transactionAmount", amount);
|
map.put("transactionAmount", amount);
|
||||||
map.put("lien", lien);
|
map.put("lien", lien);
|
||||||
|
map.put("reasonForBlock", "unUsualActivity");
|
||||||
String savingsAccountWithdrawalJson = new Gson().toJson(map);
|
String savingsAccountWithdrawalJson = new Gson().toJson(map);
|
||||||
LOG.info(savingsAccountWithdrawalJson);
|
LOG.info(savingsAccountWithdrawalJson);
|
||||||
return savingsAccountWithdrawalJson;
|
return savingsAccountWithdrawalJson;
|
||||||
|
|||||||
Reference in New Issue
Block a user