http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/3015747f/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/RecurringDepositProductData.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/RecurringDepositProductData.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/RecurringDepositProductData.java index c17ce43..184a7e7 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/RecurringDepositProductData.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/RecurringDepositProductData.java @@ -31,6 +31,7 @@ import org.apache.fineract.organisation.monetary.data.CurrencyData; import org.apache.fineract.portfolio.charge.data.ChargeData; import org.apache.fineract.portfolio.interestratechart.data.InterestRateChartData; import org.apache.fineract.portfolio.paymenttype.data.PaymentTypeData; +import org.apache.fineract.portfolio.tax.data.TaxGroupData; /** * Immutable data object represent a Recurring Deposit product. @@ -68,7 +69,7 @@ public class RecurringDepositProductData extends DepositProductData { final Map<String, List<GLAccountData>> accountingMappingOptions, final Collection<ChargeData> chargeOptions, final Collection<ChargeData> penaltyOptions, final InterestRateChartData chartTemplate, final Collection<EnumOptionData> preClosurePenalInterestOnTypeOptions, - final Collection<EnumOptionData> periodFrequencyTypeOptions) { + final Collection<EnumOptionData> periodFrequencyTypeOptions, final Collection<TaxGroupData> taxGroupOptions) { final Long id = null; final String name = null; @@ -101,6 +102,8 @@ public class RecurringDepositProductData extends DepositProductData { final BigDecimal minDepositAmount = null; final BigDecimal depositAmount = null; final BigDecimal maxDepositAmount = null; + final boolean withHoldTax = false; + final TaxGroupData taxGroup = null; return new RecurringDepositProductData(id, name, shortName, description, currency, nominalAnnualInterestRate, interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType, @@ -112,7 +115,8 @@ public class RecurringDepositProductData extends DepositProductData { penaltyToIncomeAccountMappings, interestRateCharts, chartTemplate, preClosurePenalApplicable, preClosurePenalInterest, preClosurePenalInterestOnType, preClosurePenalInterestOnTypeOptions, minDepositTerm, maxDepositTerm, minDepositTermType, maxDepositTermType, inMultiplesOfDepositTerm, inMultiplesOfDepositTermType, isMandatoryDeposit, allowWithdrawal, - adjustAdvanceTowardsFuturePayments, periodFrequencyTypeOptions, minDepositAmount, depositAmount, maxDepositAmount); + adjustAdvanceTowardsFuturePayments, periodFrequencyTypeOptions, minDepositAmount, depositAmount, maxDepositAmount, + withHoldTax, taxGroup, taxGroupOptions); } public static RecurringDepositProductData withCharges(final RecurringDepositProductData existingProduct, @@ -136,13 +140,16 @@ public class RecurringDepositProductData extends DepositProductData { existingProduct.maxDepositTermType, existingProduct.inMultiplesOfDepositTerm, existingProduct.inMultiplesOfDepositTermType, existingProduct.isMandatoryDeposit, existingProduct.allowWithdrawal, existingProduct.adjustAdvanceTowardsFuturePayments, existingProduct.periodFrequencyTypeOptions, existingProduct.minDepositAmount, existingProduct.depositAmount, - existingProduct.maxDepositAmount); + existingProduct.maxDepositAmount, existingProduct.withHoldTax, existingProduct.taxGroup, existingProduct.taxGroupOptions); } /** * Returns a {@link RecurringDepositProductData} that contains and exist * {@link RecurringDepositProductData} data with further template data for * dropdowns. + * + * @param taxGroupOptions + * TODO */ public static RecurringDepositProductData withTemplate(final RecurringDepositProductData existingProduct, final Collection<CurrencyData> currencyOptions, final Collection<EnumOptionData> interestCompoundingPeriodTypeOptions, @@ -154,7 +161,7 @@ public class RecurringDepositProductData extends DepositProductData { final Map<String, List<GLAccountData>> accountingMappingOptions, final Collection<ChargeData> chargeOptions, final Collection<ChargeData> penaltyOptions, final InterestRateChartData chartTemplate, final Collection<EnumOptionData> preClosurePenalInterestOnTypeOptions, - final Collection<EnumOptionData> periodFrequencyTypeOptions) { + final Collection<EnumOptionData> periodFrequencyTypeOptions, final Collection<TaxGroupData> taxGroupOptions) { return new RecurringDepositProductData(existingProduct.id, existingProduct.name, existingProduct.shortName, existingProduct.description, existingProduct.currency, existingProduct.nominalAnnualInterestRate, @@ -173,7 +180,8 @@ public class RecurringDepositProductData extends DepositProductData { existingProduct.minDepositTermType, existingProduct.maxDepositTermType, existingProduct.inMultiplesOfDepositTerm, existingProduct.inMultiplesOfDepositTermType, existingProduct.isMandatoryDeposit, existingProduct.allowWithdrawal, existingProduct.adjustAdvanceTowardsFuturePayments, periodFrequencyTypeOptions, existingProduct.minDepositAmount, - existingProduct.depositAmount, existingProduct.maxDepositAmount); + existingProduct.depositAmount, existingProduct.maxDepositAmount, existingProduct.withHoldTax, existingProduct.taxGroup, + taxGroupOptions); } @@ -213,7 +221,7 @@ public class RecurringDepositProductData extends DepositProductData { existingProduct.maxDepositTermType, existingProduct.inMultiplesOfDepositTerm, existingProduct.inMultiplesOfDepositTermType, existingProduct.isMandatoryDeposit, existingProduct.allowWithdrawal, existingProduct.adjustAdvanceTowardsFuturePayments, existingProduct.periodFrequencyTypeOptions, existingProduct.minDepositAmount, existingProduct.depositAmount, - existingProduct.maxDepositAmount); + existingProduct.maxDepositAmount, existingProduct.withHoldTax, existingProduct.taxGroup, existingProduct.taxGroupOptions); } public static RecurringDepositProductData instance(final DepositProductData depositProductData, @@ -246,6 +254,7 @@ public class RecurringDepositProductData extends DepositProductData { final InterestRateChartData chartTemplate = null; final Collection<EnumOptionData> preClosurePenalInterestOnTypeOptions = null; final Collection<EnumOptionData> periodFrequencyTypeOptions = null; + final Collection<TaxGroupData> taxGroupOptions = null; return new RecurringDepositProductData(depositProductData.id, depositProductData.name, depositProductData.shortName, depositProductData.description, depositProductData.currency, depositProductData.nominalAnnualInterestRate, @@ -260,7 +269,8 @@ public class RecurringDepositProductData extends DepositProductData { penaltyToIncomeAccountMappings, interestRateCharts, chartTemplate, preClosurePenalApplicable, preClosurePenalInterest, preClosurePenalInterestOnType, preClosurePenalInterestOnTypeOptions, minDepositTerm, maxDepositTerm, minDepositTermType, maxDepositTermType, inMultiplesOfDepositTerm, inMultiplesOfDepositTermType, isMandatoryDeposit, allowWithdrawal, - adjustAdvanceTowardsFuturePayments, periodFrequencyTypeOptions, minDepositAmount, depositAmount, maxDepositAmount); + adjustAdvanceTowardsFuturePayments, periodFrequencyTypeOptions, minDepositAmount, depositAmount, maxDepositAmount, + depositProductData.withHoldTax, depositProductData.taxGroup, taxGroupOptions); } public static RecurringDepositProductData lookup(final Long id, final String name) { @@ -316,6 +326,9 @@ public class RecurringDepositProductData extends DepositProductData { final BigDecimal minDepositAmount = null; final BigDecimal depositAmount = null; final BigDecimal maxDepositAmount = null; + final boolean withHoldTax = false; + final TaxGroupData taxGroup = null; + final Collection<TaxGroupData> taxGroupOptions = null; return new RecurringDepositProductData(id, name, shortName, description, currency, nominalAnnualInterestRate, interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType, @@ -327,7 +340,8 @@ public class RecurringDepositProductData extends DepositProductData { penaltyToIncomeAccountMappings, interestRateCharts, chartTemplate, preClosurePenalApplicable, preClosurePenalInterest, preClosurePenalInterestOnType, preClosurePenalInterestOnTypeOptions, minDepositTerm, maxDepositTerm, minDepositTermType, maxDepositTermType, inMultiplesOfDepositTerm, inMultiplesOfDepositTermType, isMandatoryDeposit, allowWithdrawal, - adjustAdvanceTowardsFuturePayments, periodFrequencyTypeOptions, minDepositAmount, depositAmount, maxDepositAmount); + adjustAdvanceTowardsFuturePayments, periodFrequencyTypeOptions, minDepositAmount, depositAmount, maxDepositAmount, + withHoldTax, taxGroup, taxGroupOptions); } public static RecurringDepositProductData withInterestChart(final RecurringDepositProductData product, @@ -347,7 +361,7 @@ public class RecurringDepositProductData extends DepositProductData { product.maxDepositTerm, product.minDepositTermType, product.maxDepositTermType, product.inMultiplesOfDepositTerm, product.inMultiplesOfDepositTermType, product.isMandatoryDeposit, product.allowWithdrawal, product.adjustAdvanceTowardsFuturePayments, product.periodFrequencyTypeOptions, product.minDepositAmount, - product.depositAmount, product.maxDepositAmount); + product.depositAmount, product.maxDepositAmount, product.withHoldTax, product.taxGroup, product.taxGroupOptions); } @@ -375,7 +389,8 @@ public class RecurringDepositProductData extends DepositProductData { final EnumOptionData maxDepositTermType, final Integer inMultiplesOfDepositTerm, final EnumOptionData inMultiplesOfDepositTermType, final boolean isMandatoryDeposit, boolean allowWithdrawal, boolean adjustAdvanceTowardsFuturePayments, final Collection<EnumOptionData> periodFrequencyTypeOptions, - final BigDecimal minDepositAmount, final BigDecimal depositAmount, final BigDecimal maxDepositAmount) { + final BigDecimal minDepositAmount, final BigDecimal depositAmount, final BigDecimal maxDepositAmount, + final boolean withHoldTax, final TaxGroupData taxGroup, final Collection<TaxGroupData> taxGroupOptions) { super(id, name, shortName, description, currency, nominalAnnualInterestRate, interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType, lockinPeriodFrequency, @@ -383,7 +398,8 @@ public class RecurringDepositProductData extends DepositProductData { interestCompoundingPeriodTypeOptions, interestPostingPeriodTypeOptions, interestCalculationTypeOptions, interestCalculationDaysInYearTypeOptions, lockinPeriodFrequencyTypeOptions, withdrawalFeeTypeOptions, paymentTypeOptions, accountingRuleOptions, accountingMappingOptions, charges, chargeOptions, penaltyOptions, feeToIncomeAccountMappings, - penaltyToIncomeAccountMappings, interestRateCharts, chartTemplate, minBalanceForInterestCalculation); + penaltyToIncomeAccountMappings, interestRateCharts, chartTemplate, minBalanceForInterestCalculation, withHoldTax, taxGroup, + taxGroupOptions); this.preClosurePenalApplicable = preClosurePenalApplicable; this.preClosurePenalInterest = preClosurePenalInterest;
http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/3015747f/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountData.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountData.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountData.java index a10ac9d..6df8f09 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountData.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountData.java @@ -28,6 +28,7 @@ import org.apache.fineract.infrastructure.core.data.EnumOptionData; import org.apache.fineract.organisation.monetary.data.CurrencyData; import org.apache.fineract.organisation.staff.data.StaffData; import org.apache.fineract.portfolio.charge.data.ChargeData; +import org.apache.fineract.portfolio.tax.data.TaxGroupData; /** * Immutable data object representing a savings account. @@ -64,6 +65,8 @@ public class SavingsAccountData { private final boolean enforceMinRequiredBalance; private final BigDecimal minBalanceForInterestCalculation; private final BigDecimal onHoldFunds; + private final boolean withHoldTax; + private final TaxGroupData taxGroup; // associations private final SavingsAccountSummaryData summary; @@ -87,8 +90,8 @@ public class SavingsAccountData { private final SavingsAccountChargeData withdrawalFee; @SuppressWarnings("unused") private final SavingsAccountChargeData annualFee; - private final BigDecimal nominalAnnualInterestRateOverdraft; - private final BigDecimal minOverdraftForInterestCalculation; + private final BigDecimal nominalAnnualInterestRateOverdraft; + private final BigDecimal minOverdraftForInterestCalculation; 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, @@ -101,7 +104,8 @@ public class SavingsAccountData { final SavingsAccountSummaryData summary, final boolean allowOverdraft, final BigDecimal overdraftLimit, final BigDecimal minRequiredBalance, final boolean enforceMinRequiredBalance, final BigDecimal minBalanceForInterestCalculation, final BigDecimal onHoldFunds, - final BigDecimal nominalAnnualInterestRateOverdraft, final BigDecimal minOverdraftForInterestCalculation) { + final BigDecimal nominalAnnualInterestRateOverdraft, final BigDecimal minOverdraftForInterestCalculation, + final boolean withHoldTax, final TaxGroupData taxGroup) { final Collection<SavingsProductData> productOptions = null; final Collection<StaffData> fieldOfficerOptions = null; @@ -123,8 +127,8 @@ public class SavingsAccountData { fieldOfficerOptions, interestCompoundingPeriodTypeOptions, interestPostingPeriodTypeOptions, interestCalculationTypeOptions, interestCalculationDaysInYearTypeOptions, lockinPeriodFrequencyTypeOptions, withdrawalFeeTypeOptions, charges, chargeOptions, allowOverdraft, overdraftLimit, minRequiredBalance, - enforceMinRequiredBalance, minBalanceForInterestCalculation, onHoldFunds, - nominalAnnualInterestRateOverdraft, minOverdraftForInterestCalculation); + enforceMinRequiredBalance, minBalanceForInterestCalculation, onHoldFunds, nominalAnnualInterestRateOverdraft, + minOverdraftForInterestCalculation, withHoldTax, taxGroup); } public static SavingsAccountData lookup(final Long accountId, final String accountNo, final EnumOptionData depositType) { @@ -178,6 +182,8 @@ public class SavingsAccountData { final Collection<SavingsAccountChargeData> charges = null; final Collection<ChargeData> chargeOptions = null; + final boolean withHoldTax = false; + final TaxGroupData taxGroup = null; return new SavingsAccountData(accountId, accountNo, depositType, externalId, groupId, groupName, clientId, clientName, productId, productName, fieldOfficerId, fieldOfficerName, status, timeline, currency, nominalAnnualInterestRate, interestPeriodType, @@ -186,8 +192,8 @@ public class SavingsAccountData { fieldOfficerOptions, interestCompoundingPeriodTypeOptions, interestPostingPeriodTypeOptions, interestCalculationTypeOptions, interestCalculationDaysInYearTypeOptions, lockinPeriodFrequencyTypeOptions, withdrawalFeeTypeOptions, charges, chargeOptions, allowOverdraft, overdraftLimit, minRequiredBalance, - enforceMinRequiredBalance, minBalanceForInterestCalculation, onHoldFunds, - nominalAnnualInterestRateOverdraft, minOverdraftForInterestCalculation); + enforceMinRequiredBalance, minBalanceForInterestCalculation, onHoldFunds, nominalAnnualInterestRateOverdraft, + minOverdraftForInterestCalculation, withHoldTax, taxGroup); } public static SavingsAccountData lookupWithProductDetails(final Long accountId, final String accountNo, @@ -239,6 +245,8 @@ public class SavingsAccountData { final Collection<SavingsAccountChargeData> charges = null; final Collection<ChargeData> chargeOptions = null; + final boolean withHoldTax = false; + final TaxGroupData taxGroup = null; return new SavingsAccountData(accountId, accountNo, depositType, externalId, groupId, groupName, clientId, clientName, productId, productName, fieldOfficerId, fieldOfficerName, status, timeline, currency, nominalAnnualInterestRate, interestPeriodType, @@ -247,8 +255,8 @@ public class SavingsAccountData { fieldOfficerOptions, interestCompoundingPeriodTypeOptions, interestPostingPeriodTypeOptions, interestCalculationTypeOptions, interestCalculationDaysInYearTypeOptions, lockinPeriodFrequencyTypeOptions, withdrawalFeeTypeOptions, charges, chargeOptions, allowOverdraft, overdraftLimit, minRequiredBalance, - enforceMinRequiredBalance, minBalanceForInterestCalculation, onHoldFunds, - nominalAnnualInterestRateOverdraft, minOverdraftForInterestCalculation); + enforceMinRequiredBalance, minBalanceForInterestCalculation, onHoldFunds, nominalAnnualInterestRateOverdraft, + minOverdraftForInterestCalculation, withHoldTax, taxGroup); } public static SavingsAccountData withTemplateOptions(final SavingsAccountData account, final SavingsAccountData template, @@ -281,7 +289,8 @@ public class SavingsAccountData { template.interestCalculationDaysInYearTypeOptions, template.lockinPeriodFrequencyTypeOptions, template.withdrawalFeeTypeOptions, charges, template.chargeOptions, account.allowOverdraft, account.overdraftLimit, account.minRequiredBalance, account.enforceMinRequiredBalance, account.minBalanceForInterestCalculation, - account.onHoldFunds, account.nominalAnnualInterestRateOverdraft, account.minOverdraftForInterestCalculation); + account.onHoldFunds, account.nominalAnnualInterestRateOverdraft, account.minOverdraftForInterestCalculation, + account.withHoldTax, account.taxGroup); } public static SavingsAccountData withTemplateOptions(final SavingsAccountData account, @@ -304,7 +313,8 @@ public class SavingsAccountData { interestCalculationTypeOptions, interestCalculationDaysInYearTypeOptions, lockinPeriodFrequencyTypeOptions, withdrawalFeeTypeOptions, charges, chargeOptions, account.allowOverdraft, account.overdraftLimit, account.minRequiredBalance, account.enforceMinRequiredBalance, account.minBalanceForInterestCalculation, - account.onHoldFunds, account.nominalAnnualInterestRateOverdraft, account.minOverdraftForInterestCalculation); + account.onHoldFunds, account.nominalAnnualInterestRateOverdraft, account.minOverdraftForInterestCalculation, + account.withHoldTax, account.taxGroup); } public static SavingsAccountData withClientTemplate(final Long clientId, final String clientName, final Long groupId, @@ -343,6 +353,8 @@ public class SavingsAccountData { final boolean enforceMinRequiredBalance = false; final BigDecimal minBalanceForInterestCalculation = null; final BigDecimal onHoldFunds = null; + final boolean withHoldTax = false; + final TaxGroupData taxGroup = null; final SavingsAccountSummaryData summary = null; final Collection<SavingsAccountTransactionData> transactions = null; @@ -366,8 +378,8 @@ public class SavingsAccountData { fieldOfficerOptions, interestCompoundingPeriodTypeOptions, interestPostingPeriodTypeOptions, interestCalculationTypeOptions, interestCalculationDaysInYearTypeOptions, lockinPeriodFrequencyTypeOptions, withdrawalFeeTypeOptions, charges, chargeOptions, allowOverdraft, overdraftLimit, minRequiredBalance, - enforceMinRequiredBalance, minBalanceForInterestCalculation, onHoldFunds, - nominalAnnualInterestRateOverdraft, minOverdraftForInterestCalculation); + enforceMinRequiredBalance, minBalanceForInterestCalculation, onHoldFunds, nominalAnnualInterestRateOverdraft, + minOverdraftForInterestCalculation, withHoldTax, taxGroup); } private SavingsAccountData(final Long id, final String accountNo, final EnumOptionData depositType, final String externalId, @@ -388,7 +400,8 @@ public class SavingsAccountData { final Collection<SavingsAccountChargeData> charges, final Collection<ChargeData> chargeOptions, final boolean allowOverdraft, final BigDecimal overdraftLimit, final BigDecimal minRequiredBalance, final boolean enforceMinRequiredBalance, final BigDecimal minBalanceForInterestCalculation, final BigDecimal onHoldFunds, - final BigDecimal nominalAnnualInterestRateOverdraft, final BigDecimal minOverdraftForInterestCalculation) { + final BigDecimal nominalAnnualInterestRateOverdraft, final BigDecimal minOverdraftForInterestCalculation, + final boolean withHoldTax, final TaxGroupData taxGroup) { this.id = id; this.accountNo = accountNo; this.depositType = depositType; @@ -446,6 +459,8 @@ public class SavingsAccountData { this.enforceMinRequiredBalance = enforceMinRequiredBalance; this.minBalanceForInterestCalculation = minBalanceForInterestCalculation; this.onHoldFunds = onHoldFunds; + this.withHoldTax = withHoldTax; + this.taxGroup = taxGroup; } private SavingsAccountChargeData getWithdrawalFee() { http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/3015747f/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountDataValidator.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountDataValidator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountDataValidator.java index 1f895ad..586ef25 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountDataValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountDataValidator.java @@ -42,6 +42,7 @@ import static org.apache.fineract.portfolio.savings.SavingsApiConstants.nominalA import static org.apache.fineract.portfolio.savings.SavingsApiConstants.overdraftLimitParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.productIdParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.submittedOnDateParamName; +import static org.apache.fineract.portfolio.savings.SavingsApiConstants.withHoldTaxParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.withdrawalFeeForTransfersParamName; import java.lang.reflect.Type; @@ -205,6 +206,11 @@ public class SavingsAccountDataValidator { baseDataValidator.reset().parameter(withdrawalFeeForTransfersParamName).value(isWithdrawalFeeApplicableForTransfers) .ignoreIfNull().validateForBooleanValue(); } + + if (this.fromApiJsonHelper.parameterExists(withHoldTaxParamName, element)) { + final String withHoldTax = this.fromApiJsonHelper.extractStringNamed(withHoldTaxParamName, element); + baseDataValidator.reset().parameter(withHoldTaxParamName).value(withHoldTax).ignoreIfNull().validateForBooleanValue(); + } validateSavingsCharges(element, baseDataValidator); @@ -384,6 +390,11 @@ public class SavingsAccountDataValidator { baseDataValidator.reset().parameter(withdrawalFeeForTransfersParamName).value(isWithdrawalFeeApplicableForTransfers) .ignoreIfNull().validateForBooleanValue(); } + + if (this.fromApiJsonHelper.parameterExists(withHoldTaxParamName, element)) { + final String withHoldTax = this.fromApiJsonHelper.extractStringNamed(withHoldTaxParamName, element); + baseDataValidator.reset().parameter(withHoldTaxParamName).value(withHoldTax).ignoreIfNull().validateForBooleanValue(); + } validateOverdraftParams(baseDataValidator, element); throwExceptionIfValidationWarningsExist(dataValidationErrors); http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/3015747f/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountStatusEnumData.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountStatusEnumData.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountStatusEnumData.java index 215a475..7e7bd76 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountStatusEnumData.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountStatusEnumData.java @@ -46,10 +46,12 @@ public class SavingsAccountStatusEnumData { private final boolean transferInProgress; @SuppressWarnings("unused") private final boolean transferOnHold; + @SuppressWarnings("unused") + private final boolean matured; public SavingsAccountStatusEnumData(final Long id, final String code, final String value, final boolean submittedAndPendingApproval, final boolean approved, final boolean rejected, final boolean withdrawnByApplicant, final boolean active, final boolean closed, - final boolean prematureClosed, final boolean transferInProgress, final boolean transferOnHold) { + final boolean prematureClosed, final boolean transferInProgress, final boolean transferOnHold, final boolean matured) { this.id = id; this.code = code; this.value = value; @@ -62,6 +64,7 @@ public class SavingsAccountStatusEnumData { this.prematureClosed = prematureClosed; this.transferInProgress = transferInProgress; this.transferOnHold = transferOnHold; + this.matured = matured; } public Long id() { http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/3015747f/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountSummaryData.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountSummaryData.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountSummaryData.java index 627169a..e2d3d0e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountSummaryData.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountSummaryData.java @@ -39,11 +39,12 @@ public class SavingsAccountSummaryData { private final BigDecimal totalFeeCharge; private final BigDecimal totalPenaltyCharge; private final BigDecimal totalOverdraftInterestDerived; + private final BigDecimal totalWithholdTax; public SavingsAccountSummaryData(final CurrencyData currency, final BigDecimal totalDeposits, final BigDecimal totalWithdrawals, final BigDecimal totalWithdrawalFees, final BigDecimal totalAnnualFees, final BigDecimal totalInterestEarned, final BigDecimal totalInterestPosted, final BigDecimal accountBalance, final BigDecimal totalFeeCharge, - final BigDecimal totalPenaltyCharge, final BigDecimal totalOverdraftInterestDerived) { + final BigDecimal totalPenaltyCharge, final BigDecimal totalOverdraftInterestDerived,final BigDecimal totalWithholdTax) { this.currency = currency; this.totalDeposits = totalDeposits; this.totalWithdrawals = totalWithdrawals; @@ -55,5 +56,6 @@ public class SavingsAccountSummaryData { this.totalFeeCharge = totalFeeCharge; this.totalPenaltyCharge = totalPenaltyCharge; this.totalOverdraftInterestDerived = totalOverdraftInterestDerived; + this.totalWithholdTax = totalWithholdTax; } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/3015747f/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionEnumData.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionEnumData.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionEnumData.java index 014bc32..d4b9cf1 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionEnumData.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionEnumData.java @@ -41,6 +41,7 @@ public class SavingsAccountTransactionEnumData { private final boolean overdraftInterest; private final boolean writtenoff; private final boolean overdraftFee = true; + private final boolean withholdTax; public SavingsAccountTransactionEnumData(final Long id, final String code, final String value) { this.id = id; @@ -58,6 +59,7 @@ public class SavingsAccountTransactionEnumData { this.rejectTransfer = Long.valueOf(SavingsAccountTransactionType.REJECT_TRANSFER.getValue()).equals(this.id); this.writtenoff = Long.valueOf(SavingsAccountTransactionType.WRITTEN_OFF.getValue()).equals(this.id); this.overdraftInterest = Long.valueOf(SavingsAccountTransactionType.OVERDRAFT_INTEREST.getValue()).equals(this.id); + this.withholdTax = Long.valueOf(SavingsAccountTransactionType.WITHHOLD_TAX.getValue()).equals(this.id); // this.overdraftFee = // Long.valueOf(SavingsAccountTransactionType.OVERDRAFT_INTEREST.getValue()).equals(this.id); } @@ -122,4 +124,8 @@ public class SavingsAccountTransactionEnumData { return this.overdraftFee; } + public boolean isWithholdTax() { + return this.withholdTax; + } + } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/3015747f/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsProductData.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsProductData.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsProductData.java index 94c6ed6..6741164 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsProductData.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsProductData.java @@ -31,6 +31,7 @@ import org.apache.fineract.infrastructure.core.data.EnumOptionData; import org.apache.fineract.organisation.monetary.data.CurrencyData; import org.apache.fineract.portfolio.charge.data.ChargeData; import org.apache.fineract.portfolio.paymenttype.data.PaymentTypeData; +import org.apache.fineract.portfolio.tax.data.TaxGroupData; /** * Immutable data object represent a savings product. @@ -56,6 +57,10 @@ public class SavingsProductData { private final BigDecimal minRequiredBalance; private final boolean enforceMinRequiredBalance; private final BigDecimal minBalanceForInterestCalculation; + private final BigDecimal nominalAnnualInterestRateOverdraft; + private final BigDecimal minOverdraftForInterestCalculation; + private final boolean withHoldTax; + private final TaxGroupData taxGroup; // accounting private final EnumOptionData accountingRule; @@ -80,8 +85,7 @@ public class SavingsProductData { private final Map<String, List<GLAccountData>> accountingMappingOptions; private final Collection<ChargeData> chargeOptions; private final Collection<ChargeData> penaltyOptions; - private final BigDecimal nominalAnnualInterestRateOverdraft; - private final BigDecimal minOverdraftForInterestCalculation; + private final Collection<TaxGroupData> taxGroupOptions; public static SavingsProductData template(final CurrencyData currency, final EnumOptionData interestCompoundingPeriodType, final EnumOptionData interestPostingPeriodType, final EnumOptionData interestCalculationType, @@ -93,7 +97,7 @@ public class SavingsProductData { final Collection<EnumOptionData> lockinPeriodFrequencyTypeOptions, final Collection<EnumOptionData> withdrawalFeeTypeOptions, final Collection<PaymentTypeData> paymentTypeOptions, final Collection<EnumOptionData> accountingRuleOptions, final Map<String, List<GLAccountData>> accountingMappingOptions, final Collection<ChargeData> chargeOptions, - final Collection<ChargeData> penaltyOptions) { + final Collection<ChargeData> penaltyOptions, final Collection<TaxGroupData> taxGroupOptions) { final Long id = null; final String name = null; @@ -116,7 +120,8 @@ public class SavingsProductData { final BigDecimal minBalanceForInterestCalculation = null; final BigDecimal nominalAnnualInterestRateOverdraft = null; final BigDecimal minOverdraftForInterestCalculation = null; - + final boolean withHoldTax = false; + final TaxGroupData taxGroup = null; return new SavingsProductData(id, name, shortName, description, currency, nominalAnnualInterestRate, interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType, minRequiredOpeningBalance, @@ -126,7 +131,8 @@ public class SavingsProductData { lockinPeriodFrequencyTypeOptions, withdrawalFeeTypeOptions, paymentTypeOptions, accountingRuleOptions, accountingMappingOptions, charges, chargeOptions, penaltyOptions, feeToIncomeAccountMappings, penaltyToIncomeAccountMappings, allowOverdraft, overdraftLimit, minRequiredBalance, enforceMinRequiredBalance, - minBalanceForInterestCalculation, nominalAnnualInterestRateOverdraft, minOverdraftForInterestCalculation); + minBalanceForInterestCalculation, nominalAnnualInterestRateOverdraft, minOverdraftForInterestCalculation, withHoldTax, + taxGroup, taxGroupOptions); } public static SavingsProductData withCharges(final SavingsProductData product, final Collection<ChargeData> charges) { @@ -141,12 +147,16 @@ public class SavingsProductData { product.accountingRuleOptions, product.accountingMappingOptions, charges, product.chargeOptions, product.penaltyOptions, product.feeToIncomeAccountMappings, product.penaltyToIncomeAccountMappings, product.allowOverdraft, product.overdraftLimit, product.minRequiredBalance, product.enforceMinRequiredBalance, product.minBalanceForInterestCalculation, - product.nominalAnnualInterestRateOverdraft, product.minOverdraftForInterestCalculation); + product.nominalAnnualInterestRateOverdraft, product.minOverdraftForInterestCalculation, product.withHoldTax, + product.taxGroup, product.taxGroupOptions); } /** * Returns a {@link SavingsProductData} that contains and exist * {@link SavingsProductData} data with further template data for dropdowns. + * + * @param taxGroupOptions + * TODO */ public static SavingsProductData withTemplate(final SavingsProductData existingProduct, final Collection<CurrencyData> currencyOptions, final Collection<EnumOptionData> interestCompoundingPeriodTypeOptions, @@ -156,7 +166,7 @@ public class SavingsProductData { final Collection<EnumOptionData> lockinPeriodFrequencyTypeOptions, final Collection<EnumOptionData> withdrawalFeeTypeOptions, final Collection<PaymentTypeData> paymentTypeOptions, final Collection<EnumOptionData> accountingRuleOptions, final Map<String, List<GLAccountData>> accountingMappingOptions, final Collection<ChargeData> chargeOptions, - final Collection<ChargeData> penaltyOptions) { + final Collection<ChargeData> penaltyOptions, Collection<TaxGroupData> taxGroupOptions) { return new SavingsProductData(existingProduct.id, existingProduct.name, existingProduct.shortName, existingProduct.description, existingProduct.currency, existingProduct.nominalAnnualInterestRate, existingProduct.interestCompoundingPeriodType, @@ -171,7 +181,7 @@ public class SavingsProductData { existingProduct.feeToIncomeAccountMappings, existingProduct.penaltyToIncomeAccountMappings, existingProduct.allowOverdraft, existingProduct.overdraftLimit, existingProduct.minRequiredBalance, existingProduct.enforceMinRequiredBalance, existingProduct.minBalanceForInterestCalculation, existingProduct.nominalAnnualInterestRateOverdraft, - existingProduct.minOverdraftForInterestCalculation); + existingProduct.minOverdraftForInterestCalculation, existingProduct.withHoldTax, existingProduct.taxGroup, taxGroupOptions); } public static SavingsProductData withAccountingDetails(final SavingsProductData existingProduct, @@ -206,7 +216,8 @@ public class SavingsProductData { penaltyToIncomeAccountMappings, existingProduct.allowOverdraft, existingProduct.overdraftLimit, existingProduct.minRequiredBalance, existingProduct.enforceMinRequiredBalance, existingProduct.minBalanceForInterestCalculation, existingProduct.nominalAnnualInterestRateOverdraft, - existingProduct.minOverdraftForInterestCalculation); + existingProduct.minOverdraftForInterestCalculation, existingProduct.withHoldTax, existingProduct.taxGroup, + existingProduct.taxGroupOptions); } public static SavingsProductData instance(final Long id, final String name, final String shortName, final String description, @@ -215,8 +226,9 @@ public class SavingsProductData { 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 BigDecimal minRequiredBalance, final boolean enforceMinRequiredBalance, final BigDecimal minBalanceForInterestCalculation, - final BigDecimal nominalAnnualInterestRateOverdraft, final BigDecimal minOverdraftForInterestCalculation) { + final BigDecimal minRequiredBalance, final boolean enforceMinRequiredBalance, + final BigDecimal minBalanceForInterestCalculation, final BigDecimal nominalAnnualInterestRateOverdraft, + final BigDecimal minOverdraftForInterestCalculation, final boolean withHoldTax, final TaxGroupData taxGroup) { final Map<String, Object> accountingMappings = null; final Collection<PaymentTypeToGLAccountMapper> paymentChannelToFundSourceMappings = null; @@ -236,6 +248,7 @@ public class SavingsProductData { final Collection<ChargeData> charges = null; final Collection<ChargeToGLAccountMapper> feeToIncomeAccountMappings = null; final Collection<ChargeToGLAccountMapper> penaltyToIncomeAccountMappings = null; + final Collection<TaxGroupData> taxGroupOptions = null; return new SavingsProductData(id, name, shortName, description, currency, nominalAnnualInterestRate, interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType, minRequiredOpeningBalance, @@ -245,7 +258,8 @@ public class SavingsProductData { lockinPeriodFrequencyTypeOptions, withdrawalFeeTypeOptions, paymentTypeOptions, accountingRuleOptions, accountingMappingOptions, charges, chargeOptions, penaltyOptions, feeToIncomeAccountMappings, penaltyToIncomeAccountMappings, allowOverdraft, overdraftLimit, minRequiredBalance, enforceMinRequiredBalance, - minBalanceForInterestCalculation, nominalAnnualInterestRateOverdraft, minOverdraftForInterestCalculation); + minBalanceForInterestCalculation, nominalAnnualInterestRateOverdraft, minOverdraftForInterestCalculation, withHoldTax, + taxGroup, taxGroupOptions); } public static SavingsProductData lookup(final Long id, final String name) { @@ -272,6 +286,8 @@ public class SavingsProductData { final BigDecimal minRequiredBalance = null; final boolean enforceMinRequiredBalance = false; final BigDecimal minBalanceForInterestCalculation = null; + final boolean withHoldTax = false; + final TaxGroupData taxGroup = null; final Collection<CurrencyData> currencyOptions = null; final Collection<EnumOptionData> interestCompoundingPeriodTypeOptions = null; @@ -288,6 +304,7 @@ public class SavingsProductData { final Collection<ChargeData> penaltyOptions = null; final Collection<ChargeToGLAccountMapper> feeToIncomeAccountMappings = null; final Collection<ChargeToGLAccountMapper> penaltyToIncomeAccountMappings = null; + final Collection<TaxGroupData> taxGroupOptions = null; return new SavingsProductData(id, name, shortName, description, currency, nominalAnnualInterestRate, interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType, minRequiredOpeningBalance, @@ -297,7 +314,8 @@ public class SavingsProductData { lockinPeriodFrequencyTypeOptions, withdrawalFeeTypeOptions, paymentTypeOptions, accountingRuleOptions, accountingMappingOptions, charges, chargeOptions, penaltyOptions, feeToIncomeAccountMappings, penaltyToIncomeAccountMappings, allowOverdraft, overdraftLimit, minRequiredBalance, enforceMinRequiredBalance, - minBalanceForInterestCalculation, nominalAnnualInterestRateOverdraft, minOverdraftForInterestCalculation); + minBalanceForInterestCalculation, nominalAnnualInterestRateOverdraft, minOverdraftForInterestCalculation, withHoldTax, + taxGroup, taxGroupOptions); } private SavingsProductData(final Long id, final String name, final String shortName, final String description, @@ -318,8 +336,9 @@ public class SavingsProductData { final Collection<ChargeToGLAccountMapper> feeToIncomeAccountMappings, final Collection<ChargeToGLAccountMapper> penaltyToIncomeAccountMappings, final boolean allowOverdraft, final BigDecimal overdraftLimit, final BigDecimal minRequiredBalance, final boolean enforceMinRequiredBalance, - final BigDecimal minBalanceForInterestCalculation, - final BigDecimal nominalAnnualInterestRateOverdraft, final BigDecimal minOverdraftForInterestCalculation) { + final BigDecimal minBalanceForInterestCalculation, final BigDecimal nominalAnnualInterestRateOverdraft, + final BigDecimal minOverdraftForInterestCalculation, final boolean withHoldTax, final TaxGroupData taxGroup, + final Collection<TaxGroupData> taxGroupOptions) { this.id = id; this.name = name; this.shortName = shortName; @@ -369,6 +388,9 @@ public class SavingsProductData { this.minBalanceForInterestCalculation = minBalanceForInterestCalculation; this.nominalAnnualInterestRateOverdraft = nominalAnnualInterestRateOverdraft; this.minOverdraftForInterestCalculation = minOverdraftForInterestCalculation; + this.taxGroup = taxGroup; + this.withHoldTax = withHoldTax; + this.taxGroupOptions = taxGroupOptions; } public boolean hasAccountingEnabled() { http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/3015747f/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsProductDataValidator.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsProductDataValidator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsProductDataValidator.java index af0b124..912a0c0 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsProductDataValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsProductDataValidator.java @@ -42,6 +42,8 @@ import static org.apache.fineract.portfolio.savings.SavingsApiConstants.nominalA import static org.apache.fineract.portfolio.savings.SavingsApiConstants.overdraftLimitParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.shortNameParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.withdrawalFeeForTransfersParamName; +import static org.apache.fineract.portfolio.savings.SavingsApiConstants.withHoldTaxParamName; +import static org.apache.fineract.portfolio.savings.SavingsApiConstants.taxGroupIdParamName; import java.lang.reflect.Type; import java.math.BigDecimal; @@ -295,6 +297,8 @@ public class SavingsProductDataValidator { .ignoreIfNull().zeroOrPositiveAmount(); } + validateTaxWithHoldingParams(baseDataValidator, element, true); + throwExceptionIfValidationWarningsExist(dataValidationErrors); } @@ -460,6 +464,8 @@ public class SavingsProductDataValidator { .ignoreIfNull().zeroOrPositiveAmount(); } + validateTaxWithHoldingParams(baseDataValidator, element, false); + throwExceptionIfValidationWarningsExist(dataValidationErrors); } @@ -553,13 +559,42 @@ public class SavingsProductDataValidator { } if (this.fromApiJsonHelper.parameterExists(nominalAnnualInterestRateOverdraftParamName, element)) { - final BigDecimal nominalAnnualInterestRateOverdraft = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(nominalAnnualInterestRateOverdraftParamName, element); - baseDataValidator.reset().parameter(nominalAnnualInterestRateOverdraftParamName).value(nominalAnnualInterestRateOverdraft).ignoreIfNull().zeroOrPositiveAmount(); + final BigDecimal nominalAnnualInterestRateOverdraft = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed( + nominalAnnualInterestRateOverdraftParamName, element); + baseDataValidator.reset().parameter(nominalAnnualInterestRateOverdraftParamName).value(nominalAnnualInterestRateOverdraft) + .ignoreIfNull().zeroOrPositiveAmount(); } if (this.fromApiJsonHelper.parameterExists(minOverdraftForInterestCalculationParamName, element)) { - final BigDecimal minOverdraftForInterestCalculation = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(minOverdraftForInterestCalculationParamName, element); - baseDataValidator.reset().parameter(minOverdraftForInterestCalculationParamName).value(minOverdraftForInterestCalculation).ignoreIfNull().zeroOrPositiveAmount(); + final BigDecimal minOverdraftForInterestCalculation = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed( + minOverdraftForInterestCalculationParamName, element); + baseDataValidator.reset().parameter(minOverdraftForInterestCalculationParamName).value(minOverdraftForInterestCalculation) + .ignoreIfNull().zeroOrPositiveAmount(); + } + + } + + private void validateTaxWithHoldingParams(final DataValidatorBuilder baseDataValidator, final JsonElement element, + final boolean isCreate) { + if (this.fromApiJsonHelper.parameterExists(withHoldTaxParamName, element)) { + final String withHoldTax = this.fromApiJsonHelper.extractStringNamed(withHoldTaxParamName, element); + baseDataValidator.reset().parameter(withHoldTaxParamName).value(withHoldTax).ignoreIfNull().validateForBooleanValue(); + } + Boolean withHoldTax = this.fromApiJsonHelper.extractBooleanNamed(withHoldTaxParamName, element); + if (withHoldTax == null) { + withHoldTax = false; + } + + if (this.fromApiJsonHelper.parameterExists(taxGroupIdParamName, element)) { + final Long taxGroupId = this.fromApiJsonHelper.extractLongNamed(taxGroupIdParamName, element); + baseDataValidator.reset().parameter(taxGroupIdParamName).value(taxGroupId).ignoreIfNull().longGreaterThanZero(); + if (withHoldTax) { + baseDataValidator.reset().parameter(taxGroupIdParamName).value(taxGroupId).notBlank(); + } + + } else if (withHoldTax && isCreate) { + final Long taxGroupId = null; + baseDataValidator.reset().parameter(taxGroupIdParamName).value(taxGroupId).notBlank(); } } http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/3015747f/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountAssembler.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountAssembler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountAssembler.java index c8b7605..2cffa6b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountAssembler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountAssembler.java @@ -48,10 +48,12 @@ import static org.apache.fineract.portfolio.savings.SavingsApiConstants.minRequi import static org.apache.fineract.portfolio.savings.SavingsApiConstants.nominalAnnualInterestRateParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.productIdParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.submittedOnDateParamName; +import static org.apache.fineract.portfolio.savings.SavingsApiConstants.withHoldTaxParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.withdrawalFeeForTransfersParamName; import java.math.BigDecimal; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Date; import java.util.Locale; @@ -60,6 +62,7 @@ import java.util.Set; import org.apache.commons.lang.StringUtils; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.exception.InvalidJsonException; +import org.apache.fineract.infrastructure.core.exception.UnsupportedParameterException; import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; @@ -166,6 +169,7 @@ public class DepositAccountAssembler { } if (product == null) { throw new SavingsProductNotFoundException(productId); } + Client client = null; Group group = null; @@ -286,6 +290,14 @@ public class DepositAccountAssembler { if (productChart != null) { accountChart = DepositAccountInterestRateChart.from(productChart); } + + boolean withHoldTax = product.withHoldTax(); + if (command.parameterExists(withHoldTaxParamName)) { + withHoldTax = command.booleanPrimitiveValueOfParameterNamed(withHoldTaxParamName); + if(withHoldTax && product.getTaxGroup() == null){ + throw new UnsupportedParameterException(Arrays.asList(withHoldTaxParamName)); + } + } SavingsAccount account = null; if (depositAccountType.isFixedDeposit()) { @@ -297,7 +309,7 @@ public class DepositAccountAssembler { accountNo, externalId, accountType, submittedOnDate, submittedBy, interestRate, interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType, minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType, iswithdrawalFeeApplicableForTransfer, charges, - accountTermAndPreClosure, accountChart); + accountTermAndPreClosure, accountChart, withHoldTax); accountTermAndPreClosure.updateAccountReference(fdAccount); fdAccount.validateDomainRules(); account = fdAccount; @@ -315,7 +327,7 @@ public class DepositAccountAssembler { fieldOfficer, accountNo, externalId, accountType, submittedOnDate, submittedBy, interestRate, interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType, minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType, iswithdrawalFeeApplicableForTransfer, - charges, accountTermAndPreClosure, accountRecurringDetail, accountChart); + charges, accountTermAndPreClosure, accountRecurringDetail, accountChart, withHoldTax); accountTermAndPreClosure.updateAccountReference(rdAccount); accountRecurringDetail.updateAccountReference(rdAccount); http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/3015747f/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountDomainServiceJpa.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountDomainServiceJpa.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountDomainServiceJpa.java index 0f2a1fa..2bd27c2 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountDomainServiceJpa.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountDomainServiceJpa.java @@ -25,6 +25,7 @@ import static org.apache.fineract.portfolio.savings.DepositsApiConstants.transfe import java.math.BigDecimal; import java.math.MathContext; import java.util.HashSet; +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; @@ -164,6 +165,9 @@ public class DepositAccountDomainServiceJpa implements DepositAccountDomainServi final boolean isPreMatureClosure = false; final Set<Long> existingTransactionIds = new HashSet<>(); final Set<Long> existingReversedTransactionIds = new HashSet<>(); + /*** + * Update account transactionIds for post journal entries. + */ updateExistingTransactionsDetails(account, existingTransactionIds, existingReversedTransactionIds); /* * <<<<<<< HEAD final SavingsAccountTransactionDTO transactionDTO = new @@ -207,16 +211,13 @@ public class DepositAccountDomainServiceJpa implements DepositAccountDomainServi null, null, null, AccountTransferType.ACCOUNT_TRANSFER.getValue(), null, null, null, null, toSavingsAccount, account, isAccountTransfer, isExceptionForBalanceCheck); this.accountTransfersWritePlatformService.transferFunds(accountTransferDTO); + updateAlreadyPostedTransactions(existingTransactionIds, account); } else { final SavingsAccountTransaction withdrawal = this.handleWithdrawal(account, fmt, closedDate, account.getAccountBalance(), paymentDetail, false, isRegularTransaction); savingsTransactionId = withdrawal.getId(); } - /*** - * Update account transactionIds for post journal entries. - */ - updateExistingTransactionsDetails(account, existingTransactionIds, existingReversedTransactionIds); account.close(user, command, tenantsTodayDate, changes); this.savingsAccountRepository.save(account); @@ -239,6 +240,9 @@ public class DepositAccountDomainServiceJpa implements DepositAccountDomainServi final boolean isPreMatureClosure = false; final Set<Long> existingTransactionIds = new HashSet<>(); final Set<Long> existingReversedTransactionIds = new HashSet<>(); + /*** + * Update account transactionIds for post journal entries. + */ updateExistingTransactionsDetails(account, existingTransactionIds, existingReversedTransactionIds); final MathContext mc = MathContext.DECIMAL64; @@ -282,16 +286,13 @@ public class DepositAccountDomainServiceJpa implements DepositAccountDomainServi null, null, null, AccountTransferType.ACCOUNT_TRANSFER.getValue(), null, null, null, null, toSavingsAccount, account, isRegularTransaction, isExceptionForBalanceCheck); this.accountTransfersWritePlatformService.transferFunds(accountTransferDTO); + updateAlreadyPostedTransactions(existingTransactionIds, account); } else { final SavingsAccountTransaction withdrawal = this.handleWithdrawal(account, fmt, closedDate, account.getAccountBalance(), paymentDetail, false, isRegularTransaction); savingsTransactionId = withdrawal.getId(); } - /*** - * Update account transactionIds for post journal entries. - */ - updateExistingTransactionsDetails(account, existingTransactionIds, existingReversedTransactionIds); account.close(user, command, tenantsTodayDate, changes); this.savingsAccountRepository.save(account); @@ -348,12 +349,17 @@ public class DepositAccountDomainServiceJpa implements DepositAccountDomainServi final boolean isPreMatureClosure = true; final Set<Long> existingTransactionIds = new HashSet<>(); final Set<Long> existingReversedTransactionIds = new HashSet<>(); + /*** + * Update account transactionIds for post journal entries. + */ updateExistingTransactionsDetails(account, existingTransactionIds, existingReversedTransactionIds); final LocalDate closedDate = command.localDateValueOfParameterNamed(SavingsApiConstants.closedOnDateParamName); final Locale locale = command.extractLocale(); final DateTimeFormatter fmt = DateTimeFormat.forPattern(command.dateFormat()).withLocale(locale); Long savingsTransactionId = null; + + // post interest account.postPreMaturityInterest(closedDate, isPreMatureClosure, isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth); @@ -372,16 +378,14 @@ public class DepositAccountDomainServiceJpa implements DepositAccountDomainServi null, null, null, AccountTransferType.ACCOUNT_TRANSFER.getValue(), null, null, null, null, toSavingsAccount, account, isRegularTransaction, isExceptionForBalanceCheck); this.accountTransfersWritePlatformService.transferFunds(accountTransferDTO); + updateAlreadyPostedTransactions(existingTransactionIds, account); } else { final SavingsAccountTransaction withdrawal = this.handleWithdrawal(account, fmt, closedDate, account.getAccountBalance(), paymentDetail, false, isRegularTransaction); savingsTransactionId = withdrawal.getId(); } - /*** - * Update account transactionIds for post journal entries. - */ - updateExistingTransactionsDetails(account, existingTransactionIds, existingReversedTransactionIds); + account.prematureClosure(user, command, tenantsTodayDate, changes); this.savingsAccountRepository.save(account); @@ -404,6 +408,9 @@ public class DepositAccountDomainServiceJpa implements DepositAccountDomainServi boolean isRegularTransaction = false; final Set<Long> existingTransactionIds = new HashSet<>(); final Set<Long> existingReversedTransactionIds = new HashSet<>(); + /*** + * Update account transactionIds for post journal entries. + */ updateExistingTransactionsDetails(account, existingTransactionIds, existingReversedTransactionIds); final LocalDate closedDate = command.localDateValueOfParameterNamed(SavingsApiConstants.closedOnDateParamName); @@ -428,16 +435,13 @@ public class DepositAccountDomainServiceJpa implements DepositAccountDomainServi null, null, null, AccountTransferType.ACCOUNT_TRANSFER.getValue(), null, null, null, null, toSavingsAccount, account, isRegularTransaction, isExceptionForBalanceCheck); this.accountTransfersWritePlatformService.transferFunds(accountTransferDTO); + updateAlreadyPostedTransactions(existingTransactionIds, account); } else { final SavingsAccountTransaction withdrawal = this.handleWithdrawal(account, fmt, closedDate, account.getAccountBalance(), paymentDetail, false, isRegularTransaction); savingsTransactionId = withdrawal.getId(); } - /*** - * Update account transactionIds for post journal entries. - */ - updateExistingTransactionsDetails(account, existingTransactionIds, existingReversedTransactionIds); account.prematureClosure(user, command, tenantsTodayDate, changes); this.savingsAccountRepository.save(account); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds, isAccountTransfer); @@ -460,4 +464,17 @@ public class DepositAccountDomainServiceJpa implements DepositAccountDomainServi existingTransactionIds, existingReversedTransactionIds, isAccountTransfer); this.journalEntryWritePlatformService.createJournalEntriesForSavings(accountingBridgeData); } + + private void updateAlreadyPostedTransactions(final Set<Long> existingTransactionIds, final SavingsAccount savingsAccount) { + List<SavingsAccountTransaction> transactions = savingsAccount.getTransactions(); + int size = transactions.size(); + for (int i = size - 1;; i--) { + SavingsAccountTransaction transaction = transactions.get(i); + if (transaction.isWithdrawal() || transaction.isWithdrawalFee()) { + existingTransactionIds.add(transaction.getId()); + } else { + break; + } + } + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/3015747f/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositProductAssembler.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositProductAssembler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositProductAssembler.java index dcd446c..3506f25 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositProductAssembler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositProductAssembler.java @@ -36,6 +36,7 @@ import static org.apache.fineract.portfolio.savings.DepositsApiConstants.minDepo import static org.apache.fineract.portfolio.savings.DepositsApiConstants.preClosurePenalApplicableParamName; import static org.apache.fineract.portfolio.savings.DepositsApiConstants.preClosurePenalInterestOnTypeIdParamName; import static org.apache.fineract.portfolio.savings.DepositsApiConstants.preClosurePenalInterestParamName; +import static org.apache.fineract.portfolio.savings.SavingsApiConstants.withHoldTaxParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.chargesParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.currencyCodeParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.descriptionParamName; @@ -52,6 +53,7 @@ import static org.apache.fineract.portfolio.savings.SavingsApiConstants.minBalan import static org.apache.fineract.portfolio.savings.SavingsApiConstants.nameParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.nominalAnnualInterestRateParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.shortNameParamName; +import static org.apache.fineract.portfolio.savings.SavingsApiConstants.taxGroupIdParamName; import java.math.BigDecimal; import java.util.ArrayList; @@ -77,6 +79,8 @@ import org.apache.fineract.portfolio.savings.SavingsInterestCalculationDaysInYea import org.apache.fineract.portfolio.savings.SavingsInterestCalculationType; import org.apache.fineract.portfolio.savings.SavingsPeriodFrequencyType; import org.apache.fineract.portfolio.savings.SavingsPostingInterestPeriodType; +import org.apache.fineract.portfolio.tax.domain.TaxGroup; +import org.apache.fineract.portfolio.tax.domain.TaxGroupRepositoryWrapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -88,11 +92,14 @@ public class DepositProductAssembler { private final ChargeRepositoryWrapper chargeRepository; private final InterestRateChartAssembler chartAssembler; + private final TaxGroupRepositoryWrapper taxGroupRepository; @Autowired - public DepositProductAssembler(final ChargeRepositoryWrapper chargeRepository, final InterestRateChartAssembler chartAssembler) { + public DepositProductAssembler(final ChargeRepositoryWrapper chargeRepository, final InterestRateChartAssembler chartAssembler, + final TaxGroupRepositoryWrapper taxGroupRepository) { this.chargeRepository = chargeRepository; this.chartAssembler = chartAssembler; + this.taxGroupRepository = taxGroupRepository; } public FixedDepositProduct assembleFixedDepositProduct(final JsonCommand command) { @@ -162,10 +169,18 @@ public class DepositProductAssembler { if (interestRate == null) { interestRate = BigDecimal.ZERO; } + boolean withHoldTax = command.booleanPrimitiveValueOfParameterNamed(withHoldTaxParamName); + + final Long taxGroupId = command.longValueOfParameterNamed(taxGroupIdParamName); + TaxGroup taxGroup = null; + if (taxGroupId != null) { + taxGroup = this.taxGroupRepository.findOneWithNotFoundDetection(taxGroupId); + } + FixedDepositProduct fixedDepositProduct = FixedDepositProduct.createNew(name, shortName, description, currency, interestRate, interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType, lockinPeriodFrequency, lockinPeriodFrequencyType, accountingRuleType, charges, productTermAndPreClosure, charts, - minBalanceForInterestCalculation); + minBalanceForInterestCalculation, withHoldTax, taxGroup); // update product reference productTermAndPreClosure.updateProductReference(fixedDepositProduct); @@ -250,10 +265,13 @@ public class DepositProductAssembler { interestRate = BigDecimal.ZERO; } + final boolean withHoldTax = command.booleanPrimitiveValueOfParameterNamed(withHoldTaxParamName); + final TaxGroup taxGroup = assembleTaxGroup(command); + RecurringDepositProduct recurringDepositProduct = RecurringDepositProduct.createNew(name, shortName, description, currency, interestRate, interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType, lockinPeriodFrequency, lockinPeriodFrequencyType, accountingRuleType, charges, - productTermAndPreClosure, productRecurringDetail, charts, minBalanceForInterestCalculation); + productTermAndPreClosure, productRecurringDetail, charts, minBalanceForInterestCalculation, taxGroup, withHoldTax); // update product reference productTermAndPreClosure.updateProductReference(recurringDepositProduct); @@ -491,4 +509,13 @@ public class DepositProductAssembler { return depositRecurringDetail; } + + public TaxGroup assembleTaxGroup(final JsonCommand command) { + final Long taxGroupId = command.longValueOfParameterNamed(taxGroupIdParamName); + TaxGroup taxGroup = null; + if (taxGroupId != null) { + taxGroup = this.taxGroupRepository.findOneWithNotFoundDetection(taxGroupId); + } + return taxGroup; + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/3015747f/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/FixedDepositAccount.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/FixedDepositAccount.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/FixedDepositAccount.java index f713836..1cbc725 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/FixedDepositAccount.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/FixedDepositAccount.java @@ -94,7 +94,7 @@ public class FixedDepositAccount extends SavingsAccount { final SavingsInterestCalculationDaysInYearType interestCalculationDaysInYearType, final BigDecimal minRequiredOpeningBalance, final Integer lockinPeriodFrequency, final SavingsPeriodFrequencyType lockinPeriodFrequencyType, final boolean withdrawalFeeApplicableForTransfer, final Set<SavingsAccountCharge> savingsAccountCharges, - final DepositAccountTermAndPreClosure accountTermAndPreClosure, final DepositAccountInterestRateChart chart) { + final DepositAccountTermAndPreClosure accountTermAndPreClosure, final DepositAccountInterestRateChart chart, boolean withHoldTax) { final SavingsAccountStatusType status = SavingsAccountStatusType.SUBMITTED_AND_PENDING_APPROVAL; final boolean allowOverdraft = false; @@ -103,7 +103,7 @@ public class FixedDepositAccount extends SavingsAccount { accountType, submittedOnDate, submittedBy, interestRate, interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType, minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType, withdrawalFeeApplicableForTransfer, savingsAccountCharges, accountTermAndPreClosure, chart, - allowOverdraft, overdraftLimit); + allowOverdraft, overdraftLimit, withHoldTax); return account; } @@ -117,12 +117,12 @@ public class FixedDepositAccount extends SavingsAccount { final Integer lockinPeriodFrequency, final SavingsPeriodFrequencyType lockinPeriodFrequencyType, final boolean withdrawalFeeApplicableForTransfer, final Set<SavingsAccountCharge> savingsAccountCharges, final DepositAccountTermAndPreClosure accountTermAndPreClosure, DepositAccountInterestRateChart chart, - final boolean allowOverdraft, final BigDecimal overdraftLimit) { + final boolean allowOverdraft, final BigDecimal overdraftLimit, boolean withHoldTax) { super(client, group, product, fieldOfficer, accountNo, externalId, status, accountType, submittedOnDate, submittedBy, nominalAnnualInterestRate, interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType, minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType, - withdrawalFeeApplicableForTransfer, savingsAccountCharges, allowOverdraft, overdraftLimit); + withdrawalFeeApplicableForTransfer, savingsAccountCharges, allowOverdraft, overdraftLimit, withHoldTax); this.accountTermAndPreClosure = accountTermAndPreClosure; this.chart = chart; @@ -525,7 +525,7 @@ public class FixedDepositAccount extends SavingsAccount { } } } - + recalucateDailyBalanceDetails = applyWithholdTaxForDepositAccounts(interestPostingUpToDate, recalucateDailyBalanceDetails); if (recalucateDailyBalanceDetails) { // update existing transactions so derived balance fields are // correct. @@ -555,6 +555,8 @@ public class FixedDepositAccount extends SavingsAccount { recalucateDailyBalance = true; } + recalucateDailyBalance = applyWithholdTaxForDepositAccounts(accountCloseDate, recalucateDailyBalance); + if (recalucateDailyBalance) { // update existing transactions so derived balance fields are // correct. @@ -768,11 +770,12 @@ public class FixedDepositAccount extends SavingsAccount { final Integer lockinPeriodFrequency = this.lockinPeriodFrequency; final boolean withdrawalFeeApplicableForTransfer = false; final String accountNumber = null; - final FixedDepositAccount reInvestedAccount = FixedDepositAccount - .createNewApplicationForSubmittal(client, group, product, savingsOfficer, accountNumber, externalId, accountType, - getClosedOnDate(), closedBy, interestRate, compoundingPeriodType, postingPeriodType, interestCalculationType, - daysInYearType, minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType, - withdrawalFeeApplicableForTransfer, savingsAccountCharges, newAccountTermAndPreClosure, newChart); + final boolean withHoldTax = this.withHoldTax; + final FixedDepositAccount reInvestedAccount = FixedDepositAccount.createNewApplicationForSubmittal(client, group, product, + savingsOfficer, accountNumber, externalId, accountType, getClosedOnDate(), closedBy, interestRate, compoundingPeriodType, + postingPeriodType, interestCalculationType, daysInYearType, minRequiredOpeningBalance, lockinPeriodFrequency, + lockinPeriodFrequencyType, withdrawalFeeApplicableForTransfer, savingsAccountCharges, newAccountTermAndPreClosure, + newChart, withHoldTax); newAccountTermAndPreClosure.updateAccountReference(reInvestedAccount); newChart.updateDepositAccountReference(reInvestedAccount); http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/3015747f/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/FixedDepositProduct.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/FixedDepositProduct.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/FixedDepositProduct.java index 9e4e075..65fc582 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/FixedDepositProduct.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/FixedDepositProduct.java @@ -59,6 +59,7 @@ import org.apache.fineract.portfolio.savings.SavingsInterestCalculationDaysInYea import org.apache.fineract.portfolio.savings.SavingsInterestCalculationType; import org.apache.fineract.portfolio.savings.SavingsPeriodFrequencyType; import org.apache.fineract.portfolio.savings.SavingsPostingInterestPeriodType; +import org.apache.fineract.portfolio.tax.domain.TaxGroup; import org.joda.time.LocalDate; import com.google.gson.JsonArray; @@ -89,7 +90,7 @@ public class FixedDepositProduct extends SavingsProduct { final SavingsInterestCalculationDaysInYearType interestCalculationDaysInYearType, final Integer lockinPeriodFrequency, final SavingsPeriodFrequencyType lockinPeriodFrequencyType, final AccountingRuleType accountingRuleType, final Set<Charge> charges, final DepositProductTermAndPreClosure productTermAndPreClosure, final Set<InterestRateChart> charts, - BigDecimal minBalanceForInterestCalculation) { + BigDecimal minBalanceForInterestCalculation, boolean withHoldTax, TaxGroup taxGroup) { final BigDecimal minRequiredOpeningBalance = null; final boolean withdrawalFeeApplicableForTransfer = false; @@ -99,7 +100,8 @@ public class FixedDepositProduct extends SavingsProduct { return new FixedDepositProduct(name, shortName, description, currency, interestRate, interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType, minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType, withdrawalFeeApplicableForTransfer, accountingRuleType, charges, - productTermAndPreClosure, charts, allowOverdraft, overdraftLimit, minBalanceForInterestCalculation); + productTermAndPreClosure, charts, allowOverdraft, overdraftLimit, minBalanceForInterestCalculation, withHoldTax, + taxGroup); } protected FixedDepositProduct(final String name, final String shortName, final String description, final MonetaryCurrency currency, @@ -109,12 +111,13 @@ public class FixedDepositProduct extends SavingsProduct { final Integer lockinPeriodFrequency, final SavingsPeriodFrequencyType lockinPeriodFrequencyType, final boolean withdrawalFeeApplicableForTransfer, final AccountingRuleType accountingRuleType, final Set<Charge> charges, final DepositProductTermAndPreClosure productTermAndPreClosure, final Set<InterestRateChart> charts, - final boolean allowOverdraft, final BigDecimal overdraftLimit, final BigDecimal minBalanceForInterestCalculation) { + final boolean allowOverdraft, final BigDecimal overdraftLimit, final BigDecimal minBalanceForInterestCalculation, + boolean withHoldTax, TaxGroup taxGroup) { super(name, shortName, description, currency, interestRate, interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType, minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType, withdrawalFeeApplicableForTransfer, accountingRuleType, charges, allowOverdraft, overdraftLimit, - minBalanceForInterestCalculation); + minBalanceForInterestCalculation, withHoldTax, taxGroup); if (charts != null) { this.charts = charts; @@ -198,7 +201,8 @@ public class FixedDepositProduct extends SavingsProduct { } } else { // assemble chart - final InterestRateChart newChart = this.chartAssembler.assembleFrom(chartElement, this.currency().getCode(), baseDataValidator); + final InterestRateChart newChart = this.chartAssembler.assembleFrom(chartElement, this.currency().getCode(), + baseDataValidator); this.addChart(newChart); } } http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/3015747f/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/RecurringDepositAccount.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/RecurringDepositAccount.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/RecurringDepositAccount.java index 1bf4e52..cc67fe2 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/RecurringDepositAccount.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/RecurringDepositAccount.java @@ -106,7 +106,7 @@ public class RecurringDepositAccount extends SavingsAccount { final Integer lockinPeriodFrequency, final SavingsPeriodFrequencyType lockinPeriodFrequencyType, final boolean withdrawalFeeApplicableForTransfer, final Set<SavingsAccountCharge> savingsAccountCharges, final DepositAccountTermAndPreClosure accountTermAndPreClosure, final DepositAccountRecurringDetail recurringDetail, - final DepositAccountInterestRateChart chart) { + final DepositAccountInterestRateChart chart, final boolean withHoldTax) { final boolean allowOverdraft = false; final BigDecimal overdraftLimit = new BigDecimal(0); @@ -116,7 +116,7 @@ public class RecurringDepositAccount extends SavingsAccount { submittedOnDate, submittedBy, interestRate, interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType, minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType, withdrawalFeeApplicableForTransfer, savingsAccountCharges, accountTermAndPreClosure, - recurringDetail, chart, allowOverdraft, overdraftLimit); + recurringDetail, chart, allowOverdraft, overdraftLimit, withHoldTax); } public static RecurringDepositAccount createNewActivatedAccount(final Client client, final Group group, final SavingsProduct product, @@ -128,7 +128,7 @@ public class RecurringDepositAccount extends SavingsAccount { final Integer lockinPeriodFrequency, final SavingsPeriodFrequencyType lockinPeriodFrequencyType, final boolean withdrawalFeeApplicableForTransfer, final Set<SavingsAccountCharge> savingsAccountCharges, final DepositAccountTermAndPreClosure accountTermAndPreClosure, final DepositAccountRecurringDetail recurringDetail, - final DepositAccountInterestRateChart chart) { + final DepositAccountInterestRateChart chart, final boolean withHoldTax) { final boolean allowOverdraft = false; final BigDecimal overdraftLimit = new BigDecimal(0); @@ -138,7 +138,7 @@ public class RecurringDepositAccount extends SavingsAccount { submittedOnDate, submittedBy, interestRate, interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType, minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType, withdrawalFeeApplicableForTransfer, savingsAccountCharges, accountTermAndPreClosure, - recurringDetail, chart, allowOverdraft, overdraftLimit); + recurringDetail, chart, allowOverdraft, overdraftLimit, withHoldTax); } private RecurringDepositAccount(final Client client, final Group group, final SavingsProduct product, final Staff fieldOfficer, @@ -150,12 +150,13 @@ public class RecurringDepositAccount extends SavingsAccount { final Integer lockinPeriodFrequency, final SavingsPeriodFrequencyType lockinPeriodFrequencyType, final boolean withdrawalFeeApplicableForTransfer, final Set<SavingsAccountCharge> savingsAccountCharges, final DepositAccountTermAndPreClosure accountTermAndPreClosure, final DepositAccountRecurringDetail recurringDetail, - final DepositAccountInterestRateChart chart, final boolean allowOverdraft, final BigDecimal overdraftLimit) { + final DepositAccountInterestRateChart chart, final boolean allowOverdraft, final BigDecimal overdraftLimit, + final boolean withHoldTax) { super(client, group, product, fieldOfficer, accountNo, externalId, status, accountType, submittedOnDate, submittedBy, nominalAnnualInterestRate, interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType, minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType, - withdrawalFeeApplicableForTransfer, savingsAccountCharges, allowOverdraft, overdraftLimit); + withdrawalFeeApplicableForTransfer, savingsAccountCharges, allowOverdraft, overdraftLimit, withHoldTax); this.accountTermAndPreClosure = accountTermAndPreClosure; this.recurringDetail = recurringDetail; @@ -632,7 +633,7 @@ public class RecurringDepositAccount extends SavingsAccount { } } } - + applyWithholdTaxForDepositAccounts(interestPostingUpToDate, recalucateDailyBalanceDetails); if (recalucateDailyBalanceDetails) { // update existing transactions so derived balance fields are // correct. @@ -663,6 +664,8 @@ public class RecurringDepositAccount extends SavingsAccount { recalucateDailyBalance = true; } + applyWithholdTaxForDepositAccounts(accountCloseDate, recalucateDailyBalance); + if (recalucateDailyBalance) { // update existing transactions so derived balance fields are // correct. @@ -1083,7 +1086,7 @@ public class RecurringDepositAccount extends SavingsAccount { accountNumber, externalId, accountType, getClosedOnDate(), closedBy, interestRate, compoundingPeriodType, postingPeriodType, interestCalculationType, daysInYearType, minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType, withdrawalFeeApplicableForTransfer, savingsAccountCharges, newAccountTermAndPreClosure, - recurringDetail, newChart); + recurringDetail, newChart, withHoldTax); rdAccount.setDatesFrom(now); newAccountTermAndPreClosure.updateAccountReference(rdAccount);
