diff --git a/mifosng-db/migrations/core_db/V175__added_min_required_balance_to_savings_product.sql b/mifosng-db/migrations/core_db/V175__added_min_required_balance_to_savings_product.sql new file mode 100644 index 000000000..c5be4a734 --- /dev/null +++ b/mifosng-db/migrations/core_db/V175__added_min_required_balance_to_savings_product.sql @@ -0,0 +1,7 @@ +ALTER TABLE `m_savings_product` + ADD COLUMN `min_required_balance` DECIMAL(19,6) NULL AFTER `overdraft_limit`, + ADD COLUMN `allow_overdraft_min_balance` TINYINT(1) NOT NULL DEFAULT '0' AFTER `min_required_balance`; + +ALTER TABLE `m_savings_account` + ADD COLUMN `min_required_balance` DECIMAL(19,6) NULL AFTER `account_balance_derived`, + ADD COLUMN `allow_overdraft_min_balance` TINYINT(1) NOT NULL DEFAULT '0' AFTER `min_required_balance`; diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/SavingsApiConstants.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/SavingsApiConstants.java index 38e604a5c..b13965152 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/SavingsApiConstants.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/SavingsApiConstants.java @@ -95,6 +95,8 @@ public class SavingsApiConstants { public static final String bankNumberParamName = "bankNumber"; public static final String allowOverdraftParamName = "allowOverdraft"; public static final String overdraftLimitParamName = "overdraftLimit"; + public static final String minRequiredBalanceParamName = "minRequiredBalance"; + public static final String allowOverdraftMinBalanceParamName = "allowOverdraftMinBalance"; // transaction parameters public static final String transactionDateParamName = "transactionDate"; @@ -149,7 +151,8 @@ public class SavingsApiConstants { SAVINGS_PRODUCT_ACCOUNTING_PARAMS.PENALTY_INCOME_ACCOUNT_MAPPING.getValue(), SAVINGS_PRODUCT_ACCOUNTING_PARAMS.OVERDRAFT_PORTFOLIO_CONTROL.getValue(), SAVINGS_PRODUCT_ACCOUNTING_PARAMS.LOSSES_WRITTEN_OFF.getValue(), - SAVINGS_PRODUCT_ACCOUNTING_PARAMS.INCOME_FROM_INTEREST.getValue(), allowOverdraftParamName, overdraftLimitParamName)); + SAVINGS_PRODUCT_ACCOUNTING_PARAMS.INCOME_FROM_INTEREST.getValue(), allowOverdraftParamName, overdraftLimitParamName, + minRequiredBalanceParamName, allowOverdraftMinBalanceParamName)); /** * These parameters will match the class level parameters of @@ -173,7 +176,7 @@ public class SavingsApiConstants { lockinPeriodFrequencyTypeParamName, // withdrawalFeeAmountParamName, withdrawalFeeTypeParamName, withdrawalFeeForTransfersParamName, feeAmountParamName, feeOnMonthDayParamName, chargesParamName, allowOverdraftParamName, - overdraftLimitParamName)); + overdraftLimitParamName, minRequiredBalanceParamName, allowOverdraftMinBalanceParamName)); /** * These parameters will match the class level parameters of diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/data/SavingsAccountData.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/data/SavingsAccountData.java index a9614d51f..3214cfb28 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/data/SavingsAccountData.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/data/SavingsAccountData.java @@ -46,6 +46,8 @@ public class SavingsAccountData { private final boolean withdrawalFeeForTransfers; private final boolean allowOverdraft; private final BigDecimal overdraftLimit; + private final BigDecimal minRequiredBalance; + private final boolean allowOverdraftMinBalance; // associations private final SavingsAccountSummaryData summary; @@ -78,7 +80,8 @@ public class SavingsAccountData { final EnumOptionData interestCalculationType, final EnumOptionData interestCalculationDaysInYearType, final BigDecimal minRequiredOpeningBalance, final Integer lockinPeriodFrequency, final EnumOptionData lockinPeriodFrequencyType, final boolean withdrawalFeeForTransfers, - final SavingsAccountSummaryData summary, final boolean allowOverdraft, final BigDecimal overdraftLimit) { + final SavingsAccountSummaryData summary, final boolean allowOverdraft, final BigDecimal overdraftLimit, + final BigDecimal minRequiredBalance, final boolean allowOverdraftMinBalance) { final Collection productOptions = null; final Collection fieldOfficerOptions = null; @@ -99,7 +102,8 @@ public class SavingsAccountData { lockinPeriodFrequency, lockinPeriodFrequencyType, withdrawalFeeForTransfers, summary, transactions, productOptions, fieldOfficerOptions, interestCompoundingPeriodTypeOptions, interestPostingPeriodTypeOptions, interestCalculationTypeOptions, interestCalculationDaysInYearTypeOptions, lockinPeriodFrequencyTypeOptions, - withdrawalFeeTypeOptions, charges, chargeOptions, allowOverdraft, overdraftLimit); + withdrawalFeeTypeOptions, charges, chargeOptions, allowOverdraft, overdraftLimit, minRequiredBalance, + allowOverdraftMinBalance); } public static SavingsAccountData lookup(final Long accountId, final String accountNo) { @@ -132,6 +136,8 @@ public class SavingsAccountData { // final LocalDate annualFeeNextDueDate = null; final boolean allowOverdraft = false; final BigDecimal overdraftLimit = null; + final BigDecimal minRequiredBalance = null; + final boolean allowOverdraftMinBalance = false; final SavingsAccountSummaryData summary = null; final Collection transactions = null; @@ -154,7 +160,7 @@ public class SavingsAccountData { lockinPeriodFrequency, lockinPeriodFrequencyType, withdrawalFeeForTransfers, summary, transactions, productOptions, fieldOfficerOptions, interestCompoundingPeriodTypeOptions, interestPostingPeriodTypeOptions, interestCalculationTypeOptions, interestCalculationDaysInYearTypeOptions, lockinPeriodFrequencyTypeOptions, - withdrawalFeeTypeOptions, charges, chargeOptions, allowOverdraft, overdraftLimit); + withdrawalFeeTypeOptions, charges, chargeOptions, allowOverdraft, overdraftLimit, minRequiredBalance, allowOverdraftMinBalance); } public static SavingsAccountData lookupWithProductDetails(final Long accountId, final String accountNo, final Long productId, @@ -185,6 +191,8 @@ public class SavingsAccountData { // final LocalDate annualFeeNextDueDate = null; final boolean allowOverdraft = false; final BigDecimal overdraftLimit = null; + final BigDecimal minRequiredBalance = null; + final boolean allowOverdraftMinBalance = false; final SavingsAccountSummaryData summary = null; final Collection transactions = null; @@ -207,7 +215,8 @@ public class SavingsAccountData { lockinPeriodFrequency, lockinPeriodFrequencyType, withdrawalFeeForTransfers, summary, transactions, productOptions, fieldOfficerOptions, interestCompoundingPeriodTypeOptions, interestPostingPeriodTypeOptions, interestCalculationTypeOptions, interestCalculationDaysInYearTypeOptions, lockinPeriodFrequencyTypeOptions, - withdrawalFeeTypeOptions, charges, chargeOptions, allowOverdraft, overdraftLimit); + withdrawalFeeTypeOptions, charges, chargeOptions, allowOverdraft, overdraftLimit, minRequiredBalance, + allowOverdraftMinBalance); } public static SavingsAccountData withTemplateOptions(final SavingsAccountData account, final SavingsAccountData template, @@ -238,7 +247,8 @@ public class SavingsAccountData { template.productOptions, template.fieldOfficerOptions, template.interestCompoundingPeriodTypeOptions, template.interestPostingPeriodTypeOptions, template.interestCalculationTypeOptions, template.interestCalculationDaysInYearTypeOptions, template.lockinPeriodFrequencyTypeOptions, - template.withdrawalFeeTypeOptions, charges, template.chargeOptions, account.allowOverdraft, account.overdraftLimit); + template.withdrawalFeeTypeOptions, charges, template.chargeOptions, account.allowOverdraft, account.overdraftLimit, + account.minRequiredBalance, account.allowOverdraftMinBalance); } public static SavingsAccountData withTemplateOptions(final SavingsAccountData account, @@ -259,7 +269,8 @@ public class SavingsAccountData { account.lockinPeriodFrequencyType, account.withdrawalFeeForTransfers, account.summary, transactions, productOptions, fieldOfficerOptions, interestCompoundingPeriodTypeOptions, interestPostingPeriodTypeOptions, interestCalculationTypeOptions, interestCalculationDaysInYearTypeOptions, lockinPeriodFrequencyTypeOptions, - withdrawalFeeTypeOptions, charges, chargeOptions, account.allowOverdraft, account.overdraftLimit); + withdrawalFeeTypeOptions, charges, chargeOptions, account.allowOverdraft, account.overdraftLimit, + account.minRequiredBalance, account.allowOverdraftMinBalance); } public static SavingsAccountData withClientTemplate(final Long clientId, final String clientName, final Long groupId, @@ -291,6 +302,8 @@ public class SavingsAccountData { // final LocalDate annualFeeNextDueDate = null; final boolean allowOverdraft = false; final BigDecimal overdraftLimit = null; + final BigDecimal minRequiredBalance = null; + final boolean allowOverdraftMinBalance = false; final SavingsAccountSummaryData summary = null; final Collection transactions = null; @@ -313,7 +326,8 @@ public class SavingsAccountData { lockinPeriodFrequency, lockinPeriodFrequencyType, withdrawalFeeForTransfers, summary, transactions, productOptions, fieldOfficerOptions, interestCompoundingPeriodTypeOptions, interestPostingPeriodTypeOptions, interestCalculationTypeOptions, interestCalculationDaysInYearTypeOptions, lockinPeriodFrequencyTypeOptions, - withdrawalFeeTypeOptions, charges, chargeOptions, allowOverdraft, overdraftLimit); + withdrawalFeeTypeOptions, charges, chargeOptions, allowOverdraft, overdraftLimit, minRequiredBalance, + allowOverdraftMinBalance); } private SavingsAccountData(final Long id, final String accountNo, final String externalId, final Long groupId, final String groupName, @@ -331,7 +345,7 @@ public class SavingsAccountData { final Collection interestCalculationDaysInYearTypeOptions, final Collection lockinPeriodFrequencyTypeOptions, final Collection withdrawalFeeTypeOptions, final Collection charges, final Collection chargeOptions, final boolean allowOverdraft, - final BigDecimal overdraftLimit) { + final BigDecimal overdraftLimit, final BigDecimal minRequiredBalance, final boolean allowOverdraftMinBalance) { this.id = id; this.accountNo = accountNo; this.externalId = externalId; @@ -382,6 +396,8 @@ public class SavingsAccountData { this.annualFee = getAnnualFee(); this.allowOverdraft = allowOverdraft; this.overdraftLimit = overdraftLimit; + this.minRequiredBalance = minRequiredBalance; + this.allowOverdraftMinBalance = allowOverdraftMinBalance; } private SavingsAccountChargeData getWithdrawalFee() { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/data/SavingsProductData.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/data/SavingsProductData.java index 52df0b5f9..7a1054e23 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/data/SavingsProductData.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/data/SavingsProductData.java @@ -10,6 +10,7 @@ import java.util.Collection; import java.util.List; import java.util.Map; +import org.codehaus.jackson.map.deser.std.StdDeserializer; import org.mifosplatform.accounting.common.AccountingRuleType; import org.mifosplatform.accounting.glaccount.data.GLAccountData; import org.mifosplatform.accounting.producttoaccountmapping.data.ChargeToGLAccountMapper; @@ -40,6 +41,8 @@ public class SavingsProductData { private final boolean withdrawalFeeForTransfers; private final boolean allowOverdraft; private final BigDecimal overdraftLimit; + private final BigDecimal minRequiredBalance; + private final boolean allowOverdraftMinBalance; // accounting private final EnumOptionData accountingRule; @@ -93,6 +96,8 @@ public class SavingsProductData { final Collection penaltyToIncomeAccountMappings = null; final boolean allowOverdraft = false; final BigDecimal overdraftLimit = null; + final BigDecimal minRequiredBalance = null; + final boolean allowOverdraftMinBalance = false; return new SavingsProductData(id, name, shortName, description, currency, nominalAnnualInterestRate, interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType, minRequiredOpeningBalance, @@ -101,7 +106,7 @@ public class SavingsProductData { interestPostingPeriodTypeOptions, interestCalculationTypeOptions, interestCalculationDaysInYearTypeOptions, lockinPeriodFrequencyTypeOptions, withdrawalFeeTypeOptions, paymentTypeOptions, accountingRuleOptions, accountingMappingOptions, charges, chargeOptions, penaltyOptions, feeToIncomeAccountMappings, - penaltyToIncomeAccountMappings, allowOverdraft, overdraftLimit); + penaltyToIncomeAccountMappings, allowOverdraft, overdraftLimit, minRequiredBalance, allowOverdraftMinBalance); } public static SavingsProductData withCharges(final SavingsProductData product, final Collection charges) { @@ -114,7 +119,8 @@ public class SavingsProductData { product.interestCalculationTypeOptions, product.interestCalculationDaysInYearTypeOptions, product.lockinPeriodFrequencyTypeOptions, product.withdrawalFeeTypeOptions, product.paymentTypeOptions, product.accountingRuleOptions, product.accountingMappingOptions, charges, product.chargeOptions, product.penaltyOptions, - product.feeToIncomeAccountMappings, product.penaltyToIncomeAccountMappings, product.allowOverdraft, product.overdraftLimit); + product.feeToIncomeAccountMappings, product.penaltyToIncomeAccountMappings, product.allowOverdraft, + product.overdraftLimit, product.minRequiredBalance, product.allowOverdraftMinBalance); } /** @@ -142,7 +148,7 @@ public class SavingsProductData { lockinPeriodFrequencyTypeOptions, withdrawalFeeTypeOptions, paymentTypeOptions, accountingRuleOptions, accountingMappingOptions, existingProduct.charges, chargeOptions, penaltyOptions, existingProduct.feeToIncomeAccountMappings, existingProduct.penaltyToIncomeAccountMappings, existingProduct.allowOverdraft, - existingProduct.overdraftLimit); + existingProduct.overdraftLimit, existingProduct.minRequiredBalance, existingProduct.allowOverdraftMinBalance); } public static SavingsProductData withAccountingDetails(final SavingsProductData existingProduct, @@ -174,7 +180,8 @@ public class SavingsProductData { interestPostingPeriodTypeOptions, interestCalculationTypeOptions, interestCalculationDaysInYearTypeOptions, lockinPeriodFrequencyTypeOptions, withdrawalFeeTypeOptions, paymentTypeOptions, accountingRuleOptions, accountingMappingOptions, existingProduct.charges, chargeOptions, penaltyOptions, feeToIncomeAccountMappings, - penaltyToIncomeAccountMappings, existingProduct.allowOverdraft, existingProduct.overdraftLimit); + penaltyToIncomeAccountMappings, existingProduct.allowOverdraft, existingProduct.overdraftLimit, + existingProduct.minRequiredBalance, existingProduct.allowOverdraftMinBalance); } public static SavingsProductData instance(final Long id, final String name, final String shortName, final String description, @@ -182,7 +189,8 @@ public class SavingsProductData { final EnumOptionData interestPostingPeriodType, final EnumOptionData interestCalculationType, final EnumOptionData interestCalculationDaysInYearType, final BigDecimal minRequiredOpeningBalance, final Integer lockinPeriodFrequency, final EnumOptionData lockinPeriodFrequencyType, final boolean withdrawalFeeForTransfers, - final EnumOptionData accountingType, final boolean allowOverdraft, final BigDecimal overdraftLimit) { + final EnumOptionData accountingType, final boolean allowOverdraft, final BigDecimal overdraftLimit, + final BigDecimal minRequiredBalance, final boolean allowOverdraftMinBalance) { final Map accountingMappings = null; final Collection paymentChannelToFundSourceMappings = null; @@ -210,7 +218,7 @@ public class SavingsProductData { interestPostingPeriodTypeOptions, interestCalculationTypeOptions, interestCalculationDaysInYearTypeOptions, lockinPeriodFrequencyTypeOptions, withdrawalFeeTypeOptions, paymentTypeOptions, accountingRuleOptions, accountingMappingOptions, charges, chargeOptions, penaltyOptions, feeToIncomeAccountMappings, - penaltyToIncomeAccountMappings, allowOverdraft, overdraftLimit); + penaltyToIncomeAccountMappings, allowOverdraft, overdraftLimit, minRequiredBalance, allowOverdraftMinBalance); } public static SavingsProductData lookup(final Long id, final String name) { @@ -232,6 +240,8 @@ public class SavingsProductData { final Collection paymentChannelToFundSourceMappings = null; final boolean allowOverdraft = false; final BigDecimal overdraftLimit = null; + final BigDecimal minRequiredBalance = null; + final boolean allowOverdraftMinBalance = false; final Collection currencyOptions = null; final Collection interestCompoundingPeriodTypeOptions = null; @@ -256,7 +266,7 @@ public class SavingsProductData { interestPostingPeriodTypeOptions, interestCalculationTypeOptions, interestCalculationDaysInYearTypeOptions, lockinPeriodFrequencyTypeOptions, withdrawalFeeTypeOptions, paymentTypeOptions, accountingRuleOptions, accountingMappingOptions, charges, chargeOptions, penaltyOptions, feeToIncomeAccountMappings, - penaltyToIncomeAccountMappings, allowOverdraft, overdraftLimit); + penaltyToIncomeAccountMappings, allowOverdraft, overdraftLimit, minRequiredBalance, allowOverdraftMinBalance); } private SavingsProductData(final Long id, final String name, final String shortName, final String description, @@ -276,7 +286,7 @@ public class SavingsProductData { final Collection chargeOptions, final Collection penaltyOptions, final Collection feeToIncomeAccountMappings, final Collection penaltyToIncomeAccountMappings, final boolean allowOverdraft, - final BigDecimal overdraftLimit) { + final BigDecimal overdraftLimit, final BigDecimal minRequiredBalance, final boolean allowOverdraftMinBalance) { this.id = id; this.name = name; this.shortName = shortName; @@ -321,6 +331,8 @@ public class SavingsProductData { this.penaltyToIncomeAccountMappings = penaltyToIncomeAccountMappings; this.allowOverdraft = allowOverdraft; this.overdraftLimit = overdraftLimit; + this.minRequiredBalance = minRequiredBalance; + this.allowOverdraftMinBalance = allowOverdraftMinBalance; } public boolean hasAccountingEnabled() { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/FixedDepositProduct.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/FixedDepositProduct.java index 9036bafcb..b8eae8136 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/FixedDepositProduct.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/FixedDepositProduct.java @@ -99,7 +99,8 @@ public class FixedDepositProduct extends SavingsProduct { super(name, shortName, description, currency, interestRate, interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType, minRequiredOpeningBalance, lockinPeriodFrequency, - lockinPeriodFrequencyType, withdrawalFeeApplicableForTransfer, accountingRuleType, charges, allowOverdraft, overdraftLimit); + lockinPeriodFrequencyType, withdrawalFeeApplicableForTransfer, accountingRuleType, charges, allowOverdraft, + overdraftLimit); if (charts != null) { this.charts = charts; diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsAccount.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsAccount.java index 8701a3ecc..042797814 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsAccount.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsAccount.java @@ -13,6 +13,8 @@ import static org.mifosplatform.portfolio.savings.SavingsApiConstants.lockinPeri import static org.mifosplatform.portfolio.savings.SavingsApiConstants.lockinPeriodFrequencyTypeParamName; import static org.mifosplatform.portfolio.savings.SavingsApiConstants.overdraftLimitParamName; import static org.mifosplatform.portfolio.savings.SavingsApiConstants.withdrawalFeeForTransfersParamName; +import static org.mifosplatform.portfolio.savings.SavingsApiConstants.minRequiredBalanceParamName; +import static org.mifosplatform.portfolio.savings.SavingsApiConstants.allowOverdraftMinBalanceParamName; import java.math.BigDecimal; import java.math.MathContext; @@ -239,6 +241,12 @@ public class SavingsAccount extends AbstractPersistable { @Column(name = "overdraft_limit", scale = 6, precision = 19, nullable = true) private BigDecimal overdraftLimit; + @Column(name = "allow_overdraft_min_balance") + private boolean allowOverdraftMinBalance; + + @Column(name = "min_required_balance", scale = 6, precision = 19, nullable = true) + private BigDecimal minRequiredBalance; + @Embedded protected SavingsAccountSummary summary; @@ -273,13 +281,30 @@ public class SavingsAccount extends AbstractPersistable { final SavingsInterestCalculationDaysInYearType interestCalculationDaysInYearType, final BigDecimal minRequiredOpeningBalance, final Integer lockinPeriodFrequency, final SavingsPeriodFrequencyType lockinPeriodFrequencyType, final boolean withdrawalFeeApplicableForTransfer, final Set savingsAccountCharges, - final boolean allowOverdraft, final BigDecimal overdraftLimit) { + final boolean allowOverdraft, final BigDecimal overdraftLimit, final boolean allowOverdraftMinBalance, + final BigDecimal minRequiredBalance) { final SavingsAccountStatusType status = SavingsAccountStatusType.SUBMITTED_AND_PENDING_APPROVAL; return new SavingsAccount(client, group, product, fieldOfficer, accountNo, externalId, status, accountType, submittedOnDate, submittedBy, interestRate, interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType, minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType, - withdrawalFeeApplicableForTransfer, savingsAccountCharges, allowOverdraft, overdraftLimit); + withdrawalFeeApplicableForTransfer, savingsAccountCharges, allowOverdraft, overdraftLimit, allowOverdraftMinBalance, + minRequiredBalance); + } + + protected SavingsAccount(final Client client, final Group group, final SavingsProduct product, final Staff fieldOfficer, + final String accountNo, final String externalId, final SavingsAccountStatusType status, final AccountType accountType, + final LocalDate submittedOnDate, final AppUser submittedBy, final BigDecimal nominalAnnualInterestRate, + final SavingsCompoundingInterestPeriodType interestCompoundingPeriodType, + final SavingsPostingInterestPeriodType interestPostingPeriodType, final SavingsInterestCalculationType interestCalculationType, + final SavingsInterestCalculationDaysInYearType interestCalculationDaysInYearType, final BigDecimal minRequiredOpeningBalance, + final Integer lockinPeriodFrequency, final SavingsPeriodFrequencyType lockinPeriodFrequencyType, + final boolean withdrawalFeeApplicableForTransfer, final Set savingsAccountCharges, + final boolean allowOverdraft, final BigDecimal overdraftLimit) { + this(client, group, product, fieldOfficer, accountNo, externalId, status, accountType, submittedOnDate, + submittedBy, nominalAnnualInterestRate, interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, + interestCalculationDaysInYearType, minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType, + withdrawalFeeApplicableForTransfer, savingsAccountCharges, allowOverdraft, overdraftLimit, false, null); } protected SavingsAccount(final Client client, final Group group, final SavingsProduct product, final Staff fieldOfficer, @@ -290,7 +315,8 @@ public class SavingsAccount extends AbstractPersistable { final SavingsInterestCalculationDaysInYearType interestCalculationDaysInYearType, final BigDecimal minRequiredOpeningBalance, final Integer lockinPeriodFrequency, final SavingsPeriodFrequencyType lockinPeriodFrequencyType, final boolean withdrawalFeeApplicableForTransfer, final Set savingsAccountCharges, - final boolean allowOverdraft, final BigDecimal overdraftLimit) { + final boolean allowOverdraft, final BigDecimal overdraftLimit, final boolean allowOverdraftMinBalance, + final BigDecimal minRequiredBalance) { this.client = client; this.group = group; this.product = product; @@ -327,6 +353,9 @@ public class SavingsAccount extends AbstractPersistable { this.summary = new SavingsAccountSummary(); this.allowOverdraft = allowOverdraft; this.overdraftLimit = overdraftLimit; + + this.allowOverdraftMinBalance = allowOverdraftMinBalance; + this.minRequiredBalance = minRequiredBalance; } /** @@ -993,6 +1022,23 @@ public class SavingsAccount extends AbstractPersistable { this.overdraftLimit = null; } + if (command.isChangeInBooleanParameterNamed(allowOverdraftMinBalanceParamName, this.allowOverdraftMinBalance)) { + final boolean newValue = command.booleanPrimitiveValueOfParameterNamed(allowOverdraftMinBalanceParamName); + actualChanges.put(allowOverdraftMinBalanceParamName, newValue); + this.allowOverdraftMinBalance = newValue; + } + + if (command.isChangeInBigDecimalParameterNamedDefaultingZeroToNull(minRequiredBalanceParamName, this.minRequiredBalance)) { + final BigDecimal newValue = command.bigDecimalValueOfParameterNamedDefaultToNullIfZero(minRequiredBalanceParamName); + actualChanges.put(minRequiredBalanceParamName, newValue); + actualChanges.put(localeParamName, localeAsInput); + this.minRequiredBalance = newValue; + } + + if (!this.allowOverdraftMinBalance) { + this.minRequiredBalance = null; + } + validateLockinDetails(baseDataValidator); } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsAccountAssembler.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsAccountAssembler.java index 868dd25fb..11701d10b 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsAccountAssembler.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsAccountAssembler.java @@ -24,6 +24,8 @@ import static org.mifosplatform.portfolio.savings.SavingsApiConstants.overdraftL import static org.mifosplatform.portfolio.savings.SavingsApiConstants.productIdParamName; import static org.mifosplatform.portfolio.savings.SavingsApiConstants.submittedOnDateParamName; import static org.mifosplatform.portfolio.savings.SavingsApiConstants.withdrawalFeeForTransfersParamName; +import static org.mifosplatform.portfolio.savings.SavingsApiConstants.minRequiredBalanceParamName; +import static org.mifosplatform.portfolio.savings.SavingsApiConstants.allowOverdraftMinBalanceParamName; import java.math.BigDecimal; import java.util.Set; @@ -214,11 +216,18 @@ public class SavingsAccountAssembler { final BigDecimal overdraftLimit = command.bigDecimalValueOfParameterNamedDefaultToNullIfZero(overdraftLimitParamName); + boolean allowOverdraftMinBalance = false; + if (command.parameterExists(allowOverdraftMinBalanceParamName)) { + allowOverdraft = command.booleanPrimitiveValueOfParameterNamed(allowOverdraftMinBalanceParamName); + } + + final BigDecimal minRequiredBalance = command.bigDecimalValueOfParameterNamedDefaultToNullIfZero(minRequiredBalanceParamName); + final SavingsAccount account = SavingsAccount.createNewApplicationForSubmittal(client, group, product, fieldOfficer, accountNo, externalId, accountType, submittedOnDate, submittedBy, interestRate, interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType, minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType, iswithdrawalFeeApplicableForTransfer, charges, allowOverdraft, - overdraftLimit); + overdraftLimit, allowOverdraftMinBalance, minRequiredBalance); account.setHelpers(this.savingsAccountTransactionSummaryWrapper, this.savingsHelper); account.validateNewApplicationState(DateUtils.getLocalDateOfTenant(), SAVINGS_ACCOUNT_RESOURCE_NAME); @@ -271,7 +280,8 @@ public class SavingsAccountAssembler { accountType, appliedonDate, appliedBy, product.nominalAnnualInterestRate(), product.interestCompoundingPeriodType(), product.interestPostingPeriodType(), product.interestCalculationType(), product.interestCalculationDaysInYearType(), product.minRequiredOpeningBalance(), product.lockinPeriodFrequency(), product.lockinPeriodFrequencyType(), - product.isWithdrawalFeeApplicableForTransfer(), charges, product.isAllowOverdraft(), product.overdraftLimit()); + product.isWithdrawalFeeApplicableForTransfer(), charges, product.isAllowOverdraft(), product.overdraftLimit(), + product.isAllowOverdraftMinBalance(), product.minRequiredBalance()); account.setHelpers(this.savingsAccountTransactionSummaryWrapper, this.savingsHelper); account.validateNewApplicationState(DateUtils.getLocalDateOfTenant(), SAVINGS_ACCOUNT_RESOURCE_NAME); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsProduct.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsProduct.java index 62ea84add..8f67f7ec0 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsProduct.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsProduct.java @@ -26,6 +26,8 @@ import static org.mifosplatform.portfolio.savings.SavingsApiConstants.nominalAnn import static org.mifosplatform.portfolio.savings.SavingsApiConstants.overdraftLimitParamName; import static org.mifosplatform.portfolio.savings.SavingsApiConstants.shortNameParamName; import static org.mifosplatform.portfolio.savings.SavingsApiConstants.withdrawalFeeForTransfersParamName; +import static org.mifosplatform.portfolio.savings.SavingsApiConstants.minRequiredBalanceParamName; +import static org.mifosplatform.portfolio.savings.SavingsApiConstants.allowOverdraftMinBalanceParamName; import java.math.BigDecimal; import java.util.ArrayList; @@ -147,6 +149,12 @@ public class SavingsProduct extends AbstractPersistable { @Column(name = "overdraft_limit", scale = 6, precision = 19, nullable = true) private BigDecimal overdraftLimit; + @Column(name = "allow_overdraft_min_balance") + private boolean allowOverdraftMinBalance; + + @Column(name = "min_required_balance", scale = 6, precision = 19, nullable = true) + private BigDecimal minRequiredBalance; + public static SavingsProduct createNew(final String name, final String shortName, final String description, final MonetaryCurrency currency, final BigDecimal interestRate, final SavingsCompoundingInterestPeriodType interestCompoundingPeriodType, @@ -154,12 +162,13 @@ public class SavingsProduct extends AbstractPersistable { final SavingsInterestCalculationDaysInYearType interestCalculationDaysInYearType, final BigDecimal minRequiredOpeningBalance, final Integer lockinPeriodFrequency, final SavingsPeriodFrequencyType lockinPeriodFrequencyType, final boolean withdrawalFeeApplicableForTransfer, final AccountingRuleType accountingRuleType, final Set charges, - final boolean allowOverdraft, final BigDecimal overdraftLimit) { + final boolean allowOverdraft, final BigDecimal overdraftLimit, final boolean allowOverdraftMinBalance, + final BigDecimal minRequiredBalance) { return new SavingsProduct(name, shortName, description, currency, interestRate, interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType, minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType, withdrawalFeeApplicableForTransfer, accountingRuleType, charges, - allowOverdraft, overdraftLimit); + allowOverdraft, overdraftLimit, allowOverdraftMinBalance, minRequiredBalance); } protected SavingsProduct() { @@ -167,13 +176,27 @@ public class SavingsProduct extends AbstractPersistable { this.description = null; } + protected SavingsProduct(final String name, final String shortName, final String description, final MonetaryCurrency currency, final BigDecimal interestRate, + final SavingsCompoundingInterestPeriodType interestCompoundingPeriodType, + final SavingsPostingInterestPeriodType interestPostingPeriodType, final SavingsInterestCalculationType interestCalculationType, + final SavingsInterestCalculationDaysInYearType interestCalculationDaysInYearType, final BigDecimal minRequiredOpeningBalance, + final Integer lockinPeriodFrequency, final SavingsPeriodFrequencyType lockinPeriodFrequencyType, + final boolean withdrawalFeeApplicableForTransfer, final AccountingRuleType accountingRuleType, final Set charges, + final boolean allowOverdraft, final BigDecimal overdraftLimit) { + this(name, shortName, description, currency, interestRate, interestCompoundingPeriodType, + interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType, minRequiredOpeningBalance, + lockinPeriodFrequency, lockinPeriodFrequencyType, withdrawalFeeApplicableForTransfer, accountingRuleType, charges, + allowOverdraft, overdraftLimit, false, null); + } + protected SavingsProduct(final String name, final String shortName, final String description, final MonetaryCurrency currency, final BigDecimal interestRate, final SavingsCompoundingInterestPeriodType interestCompoundingPeriodType, final SavingsPostingInterestPeriodType interestPostingPeriodType, final SavingsInterestCalculationType interestCalculationType, final SavingsInterestCalculationDaysInYearType interestCalculationDaysInYearType, final BigDecimal minRequiredOpeningBalance, final Integer lockinPeriodFrequency, final SavingsPeriodFrequencyType lockinPeriodFrequencyType, final boolean withdrawalFeeApplicableForTransfer, final AccountingRuleType accountingRuleType, final Set charges, - final boolean allowOverdraft, final BigDecimal overdraftLimit) { + final boolean allowOverdraft, final BigDecimal overdraftLimit, final boolean allowOverdraftMinBalance, + final BigDecimal minRequiredBalance) { this.name = name; this.shortName = shortName; @@ -208,6 +231,9 @@ public class SavingsProduct extends AbstractPersistable { validateLockinDetails(); this.allowOverdraft = allowOverdraft; this.overdraftLimit = overdraftLimit; + + this.allowOverdraftMinBalance = allowOverdraftMinBalance; + this.minRequiredBalance = minRequiredBalance; } public MonetaryCurrency currency() { @@ -394,6 +420,23 @@ public class SavingsProduct extends AbstractPersistable { this.overdraftLimit = null; } + if (command.isChangeInBooleanParameterNamed(allowOverdraftMinBalanceParamName, this.allowOverdraftMinBalance)) { + final boolean newValue = command.booleanPrimitiveValueOfParameterNamed(allowOverdraftMinBalanceParamName); + actualChanges.put(allowOverdraftMinBalanceParamName, newValue); + this.allowOverdraftMinBalance = newValue; + } + + if (command.isChangeInBigDecimalParameterNamedDefaultingZeroToNull(minRequiredBalanceParamName, this.minRequiredBalance)) { + final BigDecimal newValue = command.bigDecimalValueOfParameterNamedDefaultToNullIfZero(minRequiredBalanceParamName); + actualChanges.put(minRequiredBalanceParamName, newValue); + actualChanges.put(localeParamName, localeAsInput); + this.minRequiredBalance = newValue; + } + + if (!this.allowOverdraftMinBalance) { + this.minRequiredBalance = null; + } + validateLockinDetails(); return actualChanges; @@ -476,6 +519,14 @@ public class SavingsProduct extends AbstractPersistable { return this.allowOverdraft; } + public BigDecimal minRequiredBalance() { + return this.minRequiredBalance; + } + + public boolean isAllowOverdraftMinBalance() { + return this.allowOverdraftMinBalance; + } + public Set charges() { return this.charges; } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsProductAssembler.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsProductAssembler.java index da1473147..2bfe3de7e 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsProductAssembler.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsProductAssembler.java @@ -24,6 +24,8 @@ import static org.mifosplatform.portfolio.savings.SavingsApiConstants.withdrawal import static org.mifosplatform.portfolio.savings.SavingsApiConstants.shortNameParamName; import static org.mifosplatform.portfolio.savings.SavingsApiConstants.allowOverdraftParamName; import static org.mifosplatform.portfolio.savings.SavingsApiConstants.overdraftLimitParamName; +import static org.mifosplatform.portfolio.savings.SavingsApiConstants.minRequiredBalanceParamName; +import static org.mifosplatform.portfolio.savings.SavingsApiConstants.allowOverdraftMinBalanceParamName; import java.math.BigDecimal; import java.util.HashSet; @@ -122,10 +124,17 @@ public class SavingsProductAssembler { final BigDecimal overdraftLimit = command.bigDecimalValueOfParameterNamedDefaultToNullIfZero(overdraftLimitParamName); + boolean allowOverdraftMinBalance = false; + if (command.parameterExists(allowOverdraftMinBalanceParamName)) { + allowOverdraftMinBalance = command.booleanPrimitiveValueOfParameterNamed(allowOverdraftMinBalanceParamName); + } + + final BigDecimal minRequiredBalance = command.bigDecimalValueOfParameterNamedDefaultToNullIfZero(minRequiredBalanceParamName); + return SavingsProduct.createNew(name, shortName, description, currency, interestRate, interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType, minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType, iswithdrawalFeeApplicableForTransfer, accountingRuleType, charges, - allowOverdraft, overdraftLimit); + allowOverdraft, overdraftLimit, allowOverdraftMinBalance, minRequiredBalance); } public Set assembleListOfSavingsProductCharges(final JsonCommand command, final String savingsProductCurrencyCode) { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/service/SavingsAccountReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/service/SavingsAccountReadPlatformServiceImpl.java index 11217704d..693ef09df 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/service/SavingsAccountReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/service/SavingsAccountReadPlatformServiceImpl.java @@ -249,6 +249,8 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead sqlBuilder.append("sa.account_balance_derived as accountBalance, "); sqlBuilder.append("sa.total_fees_charge_derived as totalFeeCharge, "); sqlBuilder.append("sa.total_penalty_charge_derived as totalPenaltyCharge "); + sqlBuilder.append("sp.min_required_balance as minRequiredBalance, "); + sqlBuilder.append("sp.allow_overdraft_min_balance as allowOverdraftMinBalance, "); sqlBuilder.append("from m_savings_account sa "); sqlBuilder.append("join m_savings_product sp ON sa.product_id = sp.id "); sqlBuilder.append("join m_currency curr on curr.code = sa.currency_code "); @@ -378,6 +380,9 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead final boolean allowOverdraft = rs.getBoolean("allowOverdraft"); final BigDecimal overdraftLimit = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "overdraftLimit"); + final BigDecimal minRequiredBalance = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "minRequiredBalance"); + final boolean allowOverdraftMinBalance = rs.getBoolean("allowOverdraftMinBalance"); + /* * final BigDecimal annualFeeAmount = * JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, @@ -411,7 +416,8 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead return SavingsAccountData.instance(id, accountNo, externalId, groupId, groupName, clientId, clientName, productId, productName, fieldOfficerId, fieldOfficerName, status, timeline, currency, nominalAnnualInterestRate, interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType, minRequiredOpeningBalance, - lockinPeriodFrequency, lockinPeriodFrequencyType, withdrawalFeeForTransfers, summary, allowOverdraft, overdraftLimit); + lockinPeriodFrequency, lockinPeriodFrequencyType, withdrawalFeeForTransfers, summary, allowOverdraft, overdraftLimit, + minRequiredBalance, allowOverdraftMinBalance); } } @@ -866,6 +872,10 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead final boolean allowOverdraft = rs.getBoolean("allowOverdraft"); final BigDecimal overdraftLimit = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "overdraftLimit"); + final BigDecimal minRequiredBalance = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "minRequiredBalance"); + final boolean allowOverdraftMinBalance = rs.getBoolean("allowOverdraftMinBalance"); + + // final BigDecimal annualFeeAmount = // JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, // "annualFeeAmount"); @@ -904,7 +914,8 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead return SavingsAccountData.instance(null, null, null, groupId, groupName, clientId, clientName, productId, productName, fieldOfficerId, fieldOfficerName, status, timeline, currency, nominalAnnualIterestRate, interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType, minRequiredOpeningBalance, - lockinPeriodFrequency, lockinPeriodFrequencyType, withdrawalFeeForTransfers, summary, allowOverdraft, overdraftLimit); + lockinPeriodFrequency, lockinPeriodFrequencyType, withdrawalFeeForTransfers, summary, allowOverdraft, overdraftLimit, + minRequiredBalance, allowOverdraftMinBalance); } } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/service/SavingsProductReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/service/SavingsProductReadPlatformServiceImpl.java index 4629eedf4..52b1564fe 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/service/SavingsProductReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/service/SavingsProductReadPlatformServiceImpl.java @@ -92,6 +92,8 @@ public class SavingsProductReadPlatformServiceImpl implements SavingsProductRead sqlBuilder.append("sp.withdrawal_fee_for_transfer as withdrawalFeeForTransfers, "); sqlBuilder.append("sp.allow_overdraft as allowOverdraft, "); sqlBuilder.append("sp.overdraft_limit as overdraftLimit, "); + sqlBuilder.append("sp.min_required_balance as minRequiredBalance, "); + sqlBuilder.append("sp.allow_overdraft_min_balance as allowOverdraftMinBalance, "); sqlBuilder.append("sp.accounting_type as accountingType "); sqlBuilder.append("from m_savings_product sp "); sqlBuilder.append("join m_currency curr on curr.code = sp.currency_code "); @@ -153,10 +155,14 @@ public class SavingsProductReadPlatformServiceImpl implements SavingsProductRead final boolean withdrawalFeeForTransfers = rs.getBoolean("withdrawalFeeForTransfers"); final boolean allowOverdraft = rs.getBoolean("allowOverdraft"); final BigDecimal overdraftLimit = rs.getBigDecimal("overdraftLimit"); + + final BigDecimal minRequiredBalance = rs.getBigDecimal("minRequiredBalance"); + final boolean allowOverdraftMinBalance = rs.getBoolean("allowOverdraftMinBalance"); + return SavingsProductData.instance(id, name, shortName, description, currency, nominalAnnualInterestRate, compoundingInterestPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType, minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType, withdrawalFeeForTransfers, - accountingRuleType, allowOverdraft, overdraftLimit); + accountingRuleType, allowOverdraft, overdraftLimit, minRequiredBalance, allowOverdraftMinBalance); } }