MIFOSX-1161: Adding new properties

Adding fields minRequiredBalance and allowOverdraftMinBalance to
SavingsProduct and SavingsAccount. No enforcement yet.
This commit is contained in:
rainerh
2014-06-13 17:15:16 -07:00
parent 8bd0e29ba5
commit 2aa8b89d65
11 changed files with 203 additions and 31 deletions
@@ -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`;
@@ -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
@@ -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<SavingsProductData> productOptions = null;
final Collection<StaffData> 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<SavingsAccountTransactionData> 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<SavingsAccountTransactionData> 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<SavingsAccountTransactionData> 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<EnumOptionData> interestCalculationDaysInYearTypeOptions,
final Collection<EnumOptionData> lockinPeriodFrequencyTypeOptions, final Collection<EnumOptionData> withdrawalFeeTypeOptions,
final Collection<SavingsAccountChargeData> charges, final Collection<ChargeData> 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() {
@@ -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<ChargeToGLAccountMapper> 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<ChargeData> 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<String, Object> accountingMappings = null;
final Collection<PaymentTypeToGLAccountMapper> 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<PaymentTypeToGLAccountMapper> paymentChannelToFundSourceMappings = null;
final boolean allowOverdraft = false;
final BigDecimal overdraftLimit = null;
final BigDecimal minRequiredBalance = null;
final boolean allowOverdraftMinBalance = false;
final Collection<CurrencyData> currencyOptions = null;
final Collection<EnumOptionData> 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<ChargeData> chargeOptions, final Collection<ChargeData> penaltyOptions,
final Collection<ChargeToGLAccountMapper> feeToIncomeAccountMappings,
final Collection<ChargeToGLAccountMapper> 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() {
@@ -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;
@@ -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<Long> {
@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<Long> {
final SavingsInterestCalculationDaysInYearType interestCalculationDaysInYearType, final BigDecimal minRequiredOpeningBalance,
final Integer lockinPeriodFrequency, final SavingsPeriodFrequencyType lockinPeriodFrequencyType,
final boolean withdrawalFeeApplicableForTransfer, final Set<SavingsAccountCharge> 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<SavingsAccountCharge> 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<Long> {
final SavingsInterestCalculationDaysInYearType interestCalculationDaysInYearType, final BigDecimal minRequiredOpeningBalance,
final Integer lockinPeriodFrequency, final SavingsPeriodFrequencyType lockinPeriodFrequencyType,
final boolean withdrawalFeeApplicableForTransfer, final Set<SavingsAccountCharge> 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<Long> {
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<Long> {
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);
}
@@ -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);
@@ -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<Long> {
@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<Long> {
final SavingsInterestCalculationDaysInYearType interestCalculationDaysInYearType, final BigDecimal minRequiredOpeningBalance,
final Integer lockinPeriodFrequency, final SavingsPeriodFrequencyType lockinPeriodFrequencyType,
final boolean withdrawalFeeApplicableForTransfer, final AccountingRuleType accountingRuleType, final Set<Charge> 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<Long> {
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<Charge> 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<Charge> 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<Long> {
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<Long> {
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<Long> {
return this.allowOverdraft;
}
public BigDecimal minRequiredBalance() {
return this.minRequiredBalance;
}
public boolean isAllowOverdraftMinBalance() {
return this.allowOverdraftMinBalance;
}
public Set<Charge> charges() {
return this.charges;
}
@@ -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<Charge> assembleListOfSavingsProductCharges(final JsonCommand command, final String savingsProductCurrencyCode) {
@@ -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);
}
}
@@ -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);
}
}