/** * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ package org.mifosplatform.portfolio.savings.domain; import java.math.BigDecimal; import java.util.List; import javax.persistence.Column; import javax.persistence.Embeddable; import javax.persistence.Transient; import org.mifosplatform.organisation.monetary.domain.MonetaryCurrency; import org.mifosplatform.organisation.monetary.domain.Money; import org.mifosplatform.portfolio.savings.domain.interest.PostingPeriod; /** * {@link SavingsAccountSummary} encapsulates all the summary details of a * {@link SavingsAccount}. */ @Embeddable public final class SavingsAccountSummary { @Column(name = "total_deposits_derived", scale = 6, precision = 19) private BigDecimal totalDeposits; @Column(name = "total_withdrawals_derived", scale = 6, precision = 19) private BigDecimal totalWithdrawals; @Column(name = "total_interest_earned_derived", scale = 6, precision = 19) private BigDecimal totalInterestEarned; @Column(name = "total_interest_posted_derived", scale = 6, precision = 19) private BigDecimal totalInterestPosted; @Column(name = "total_withdrawal_fees_derived", scale = 6, precision = 19) private BigDecimal totalWithdrawalFees; @Column(name = "total_fees_charge_derived", scale = 6, precision = 19) private BigDecimal totalFeeCharge; @Column(name = "total_penalty_charge_derived", scale = 6, precision = 19) private BigDecimal totalPenaltyCharge; @Column(name = "total_annual_fees_derived", scale = 6, precision = 19) private BigDecimal totalAnnualFees; @Column(name = "account_balance_derived", scale = 6, precision = 19) private BigDecimal accountBalance = BigDecimal.ZERO; // TODO: AA do we need this data to be persisted. @Transient private BigDecimal totalFeeChargesWaived = BigDecimal.ZERO; @Transient private BigDecimal totalPenaltyChargesWaived = BigDecimal.ZERO; @Column(name = "total_overdraft_interest_derived", scale = 6, precision = 19) private BigDecimal totalOverdraftInterestDerived; protected SavingsAccountSummary() { // } public void updateSummary(final MonetaryCurrency currency, final SavingsAccountTransactionSummaryWrapper wrapper, final List<SavingsAccountTransaction> transactions) { this.totalDeposits = wrapper.calculateTotalDeposits(currency, transactions); this.totalWithdrawals = wrapper.calculateTotalWithdrawals(currency, transactions); this.totalInterestPosted = wrapper.calculateTotalInterestPosted(currency, transactions); this.totalWithdrawalFees = wrapper.calculateTotalWithdrawalFees(currency, transactions); this.totalAnnualFees = wrapper.calculateTotalAnnualFees(currency, transactions); this.totalFeeCharge = wrapper.calculateTotalFeesCharge(currency, transactions); this.totalPenaltyCharge = wrapper.calculateTotalPenaltyCharge(currency, transactions); this.totalFeeChargesWaived = wrapper.calculateTotalFeesChargeWaived(currency, transactions); this.totalPenaltyChargesWaived = wrapper.calculateTotalPenaltyChargeWaived(currency, transactions); this.totalOverdraftInterestDerived = wrapper.calculateTotalOverdraftInterest(currency, transactions); this.accountBalance = Money.of(currency, this.totalDeposits).plus(this.totalInterestPosted).minus(this.totalWithdrawals) .minus(this.totalWithdrawalFees).minus(this.totalAnnualFees).minus(this.totalFeeCharge).minus(this.totalPenaltyCharge) .minus(totalOverdraftInterestDerived).getAmount(); } public void updateFromInterestPeriodSummaries(final MonetaryCurrency currency, final List<PostingPeriod> allPostingPeriods) { Money totalEarned = Money.zero(currency); for (final PostingPeriod period : allPostingPeriods) { Money interestEarned = period.interest(); interestEarned = interestEarned == null ? Money.zero(currency) : interestEarned; totalEarned = totalEarned.plus(interestEarned); } this.totalInterestEarned = totalEarned.getAmount(); } public boolean isLessThanOrEqualToAccountBalance(final Money amount) { final Money accountBalance = getAccountBalance(amount.getCurrency()); return accountBalance.isGreaterThanOrEqualTo(amount); } public Money getAccountBalance(final MonetaryCurrency currency) { return Money.of(currency, this.accountBalance); } public BigDecimal getAccountBalance() { return this.accountBalance; } }