Merge branch 'Remove_HibernateAnnotations' into develop

This commit is contained in:
Nazeer Hussain Shaik
2016-06-28 16:58:34 +05:30
56 changed files with 475 additions and 464 deletions
@@ -3805,6 +3805,7 @@ public class ClientLoanIntegrationTest {
final Integer loanID = applyForLoanApplicationForInterestRecalculation(clientID, loanProductID, LOAN_DISBURSEMENT_DATE,
REST_START_DATE, LoanApplicationTestBuilder.DEFAULT_STRATEGY, null);
Assert.assertNotNull(loanID);
HashMap loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, loanID);
LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap);
@@ -21,10 +21,12 @@ package org.apache.fineract.accounting.provisioning.domain;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
@@ -33,8 +35,6 @@ import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.apache.fineract.useradministration.domain.AppUser;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.springframework.data.jpa.domain.AbstractPersistable;
@Entity
@@ -44,9 +44,8 @@ public class ProvisioningEntry extends AbstractPersistable<Long> {
@Column(name = "journal_entry_created")
private Boolean isJournalEntryCreated;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "entry", orphanRemoval = true)
Collection<LoanProductProvisioningEntry> provisioningEntries = new HashSet<>();
@OneToMany(cascade = CascadeType.ALL, mappedBy = "entry", orphanRemoval = true, fetch=FetchType.EAGER)
Set<LoanProductProvisioningEntry> provisioningEntries = new HashSet<>();
@OneToOne
@JoinColumn(name = "createdby_id")
@@ -68,7 +67,7 @@ public class ProvisioningEntry extends AbstractPersistable<Long> {
}
public ProvisioningEntry(AppUser createdBy, Date createdDate, AppUser lastModifiedBy, Date lastModifiedDate, Collection<LoanProductProvisioningEntry> provisioningEntries ) {
public ProvisioningEntry(AppUser createdBy, Date createdDate, AppUser lastModifiedBy, Date lastModifiedDate, Set<LoanProductProvisioningEntry> provisioningEntries ) {
this.provisioningEntries = provisioningEntries ;
this.createdBy = createdBy ;
this.createdDate = createdDate ;
@@ -22,6 +22,7 @@ import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.apache.fineract.accounting.glaccount.domain.GLAccount;
import org.apache.fineract.accounting.glaccount.domain.GLAccountRepository;
@@ -58,8 +59,6 @@ import org.apache.fineract.portfolio.loanproduct.domain.LoanProduct;
import org.apache.fineract.portfolio.loanproduct.domain.LoanProductRepository;
import org.apache.fineract.useradministration.domain.AppUser;
import org.joda.time.LocalDate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.stereotype.Service;
@@ -69,8 +68,6 @@ import com.google.gson.JsonObject;
@Service
public class ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl implements ProvisioningEntriesWritePlatformService {
private final static Logger logger = LoggerFactory.getLogger(ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl.class);
private final ProvisioningEntriesReadPlatformService provisioningEntriesReadPlatformService;
private final ProvisioningCriteriaReadPlatformService provisioningCriteriaReadPlatformService ;
private final LoanProductRepository loanProductRepository;
@@ -192,7 +189,7 @@ public class ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl implements
AppUser currentUser = this.platformSecurityContext.authenticatedUser();
AppUser lastModifiedBy = null;
Date lastModifiedDate = null;
Collection<LoanProductProvisioningEntry> nullEntries = null;
Set<LoanProductProvisioningEntry> nullEntries = null;
ProvisioningEntry requestedEntry = new ProvisioningEntry(currentUser, date, lastModifiedBy, lastModifiedDate, nullEntries);
Collection<LoanProductProvisioningEntry> entries = generateLoanProvisioningEntry(requestedEntry, date);
requestedEntry.setProvisioningEntries(entries);
@@ -28,6 +28,7 @@ import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
@@ -40,8 +41,6 @@ import org.apache.fineract.accounting.journalentry.domain.JournalEntryType;
import org.apache.fineract.accounting.rule.api.AccountingRuleJsonInputParams;
import org.apache.fineract.infrastructure.core.api.JsonCommand;
import org.apache.fineract.organisation.office.domain.Office;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.springframework.data.jpa.domain.AbstractPersistable;
@Entity
@@ -69,8 +68,7 @@ public class AccountingRule extends AbstractPersistable<Long> {
@Column(name = "system_defined", nullable = false)
private Boolean systemDefined;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "accountingRule", orphanRemoval = true)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "accountingRule", orphanRemoval = true, fetch=FetchType.EAGER)
private final List<AccountingTagRule> accountingTagRules = new ArrayList<>();
@Column(name = "allow_multiple_credits", nullable = false)
@@ -29,6 +29,7 @@ import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
@@ -39,8 +40,6 @@ import org.apache.fineract.infrastructure.core.data.ApiParameterError;
import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder;
import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException;
import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.springframework.data.jpa.domain.AbstractPersistable;
import com.google.gson.JsonArray;
@@ -74,8 +73,7 @@ public final class Report extends AbstractPersistable<Long> {
@Column(name = "report_sql")
private String reportSql;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "report", orphanRemoval = true)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "report", orphanRemoval = true, fetch=FetchType.EAGER)
private final Set<ReportParameterUsage> reportParameterUsages = new HashSet<>();
public static Report fromJson(final JsonCommand command, final Collection<String> reportTypes) {
@@ -20,16 +20,16 @@ package org.apache.fineract.infrastructure.hooks.domain;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import org.apache.commons.lang.StringUtils;
import org.apache.fineract.infrastructure.core.api.JsonCommand;
import org.apache.fineract.infrastructure.core.domain.AbstractAuditableCustom;
import org.apache.fineract.template.domain.Template;
import org.apache.fineract.useradministration.domain.AppUser;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.springframework.util.CollectionUtils;
import javax.persistence.*;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -47,12 +47,10 @@ public class Hook extends AbstractAuditableCustom<AppUser, Long> {
@Column(name = "is_active", nullable = false)
private Boolean isActive;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "hook", orphanRemoval = true)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "hook", orphanRemoval = true, fetch=FetchType.EAGER)
private Set<HookResource> events = new HashSet<>();
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "hook", orphanRemoval = true)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "hook", orphanRemoval = true, fetch=FetchType.EAGER)
private Set<HookConfiguration> config = new HashSet<>();
@ManyToOne(optional = true)
@@ -26,13 +26,12 @@ import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.apache.commons.lang.StringUtils;
import org.apache.fineract.infrastructure.core.api.JsonCommand;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.springframework.data.jpa.domain.AbstractPersistable;
@Entity
@@ -42,8 +41,7 @@ public class HookTemplate extends AbstractPersistable<Long> {
@Column(name = "name", nullable = false, length = 100)
private String name;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "template", orphanRemoval = true)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "template", orphanRemoval = true, fetch=FetchType.EAGER)
private final Set<Schema> fields = new HashSet<>();
private HookTemplate(final String name) {
@@ -27,6 +27,7 @@ import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
@@ -38,8 +39,6 @@ import org.apache.fineract.organisation.provisioning.constants.ProvisioningCrite
import org.apache.fineract.organisation.provisioning.data.ProvisioningCriteriaDefinitionData;
import org.apache.fineract.portfolio.loanproduct.domain.LoanProduct;
import org.apache.fineract.useradministration.domain.AppUser;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.joda.time.DateTime;
@Entity
@@ -49,12 +48,10 @@ public class ProvisioningCriteria extends AbstractAuditableCustom<AppUser, Long>
@Column(name = "criteria_name", nullable = false)
private String criteriaName;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "criteria", orphanRemoval = true)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "criteria", orphanRemoval = true, fetch=FetchType.EAGER)
Set<ProvisioningCriteriaDefinition> provisioningCriteriaDefinition = new HashSet<>();
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "criteria", orphanRemoval = true)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "criteria", orphanRemoval = true, fetch=FetchType.EAGER)
Set<LoanProductProvisionCriteria> loanProductMapping = new HashSet<>();
public String getCriteriaName() {
@@ -35,8 +35,6 @@ import org.apache.fineract.organisation.office.domain.Office;
import org.apache.fineract.portfolio.client.domain.Client;
import org.apache.fineract.portfolio.loanaccount.domain.Loan;
import org.apache.fineract.portfolio.savings.domain.SavingsAccount;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.springframework.data.jpa.domain.AbstractPersistable;
@Entity
@@ -78,8 +76,7 @@ public class AccountTransferDetails extends AbstractPersistable<Long> {
@Column(name = "transfer_type")
private Integer transferType;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "accountTransferDetails", orphanRemoval = true)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "accountTransferDetails", orphanRemoval = true, fetch=FetchType.EAGER)
private final List<AccountTransferTransaction> accountTransferTransactions = new ArrayList<>();
@OneToOne(mappedBy = "accountTransferDetails", cascade = CascadeType.ALL, optional = true, orphanRemoval = true, fetch = FetchType.LAZY)
@@ -57,8 +57,6 @@ import org.apache.fineract.portfolio.group.domain.Group;
import org.apache.fineract.portfolio.savings.domain.SavingsAccount;
import org.apache.fineract.portfolio.savings.domain.SavingsProduct;
import org.apache.fineract.useradministration.domain.AppUser;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormatter;
import org.springframework.data.jpa.domain.AbstractPersistable;
@@ -134,8 +132,7 @@ public final class Client extends AbstractPersistable<Long> {
@JoinColumn(name = "staff_id")
private Staff staff;
@LazyCollection(LazyCollectionOption.FALSE)
@ManyToMany
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name = "m_group_client", joinColumns = @JoinColumn(name = "client_id"), inverseJoinColumns = @JoinColumn(name = "group_id"))
private Set<Group> groups;
@@ -30,6 +30,7 @@ import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
@@ -48,8 +49,6 @@ import org.apache.fineract.organisation.office.domain.Office;
import org.apache.fineract.organisation.office.domain.OrganisationCurrency;
import org.apache.fineract.portfolio.paymentdetail.domain.PaymentDetail;
import org.apache.fineract.useradministration.domain.AppUser;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.joda.time.LocalDate;
import org.springframework.data.jpa.domain.AbstractPersistable;
@@ -96,8 +95,7 @@ public class ClientTransaction extends AbstractPersistable<Long> {
@JoinColumn(name = "appuser_id", nullable = true)
private AppUser appUser;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "clientTransaction", orphanRemoval = true)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "clientTransaction", orphanRemoval = true, fetch=FetchType.EAGER)
private Set<ClientChargePaidBy> clientChargePaidByCollection = new HashSet<>();
@Transient
@@ -30,6 +30,7 @@ import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
@@ -43,8 +44,6 @@ import org.apache.fineract.infrastructure.core.service.DateUtils;
import org.apache.fineract.portfolio.floatingrates.data.FloatingRateDTO;
import org.apache.fineract.portfolio.floatingrates.data.FloatingRatePeriodData;
import org.apache.fineract.useradministration.domain.AppUser;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.joda.time.LocalDate;
import org.springframework.data.jpa.domain.AbstractPersistable;
@@ -66,8 +65,7 @@ public class FloatingRate extends AbstractPersistable<Long> {
private boolean isActive;
@OrderBy(value = "fromDate,id")
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "floatingRate", orphanRemoval = true)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "floatingRate", orphanRemoval = true, fetch=FetchType.EAGER)
private Set<FloatingRatePeriod> floatingRatePeriods;
@ManyToOne(optional = true)
@@ -48,7 +48,6 @@ import org.apache.fineract.portfolio.loanproduct.data.TransactionProcessingStrat
import org.apache.fineract.portfolio.loanproduct.domain.LoanProductConfigurableAttributes;
import org.apache.fineract.portfolio.loanproduct.domain.LoanProductValueConditionType;
import org.apache.fineract.portfolio.note.data.NoteData;
import org.hibernate.dialect.Sybase11Dialect;
import org.joda.time.LocalDate;
import org.springframework.util.CollectionUtils;
@@ -192,7 +192,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService {
for (Map.Entry<Long, LoanTransaction> mapEntry : changedTransactionDetail.getNewTransactionMappings().entrySet()) {
saveLoanTransactionWithDataIntegrityViolationChecks(mapEntry.getValue());
// update loan with references to the newly created transactions
loan.getLoanTransactions().add(mapEntry.getValue());
loan.addLoanTransaction(mapEntry.getValue());
updateLoanTransaction(mapEntry.getKey(), mapEntry.getValue());
}
}
@@ -235,7 +235,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService {
private void saveAndFlushLoanWithDataIntegrityViolationChecks(final Loan loan) {
try {
List<LoanRepaymentScheduleInstallment> installments = loan.fetchRepaymentScheduleInstallments();
List<LoanRepaymentScheduleInstallment> installments = loan.getRepaymentScheduleInstallments();
for (LoanRepaymentScheduleInstallment installment : installments) {
if (installment.getId() == null) {
this.repaymentScheduleInstallmentRepository.save(installment);
@@ -257,7 +257,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService {
@Override
public void saveLoanWithDataIntegrityViolationChecks(final Loan loan) {
try {
List<LoanRepaymentScheduleInstallment> installments = loan.fetchRepaymentScheduleInstallments();
List<LoanRepaymentScheduleInstallment> installments = loan.getRepaymentScheduleInstallments();
for (LoanRepaymentScheduleInstallment installment : installments) {
if (installment.getId() == null) {
this.repaymentScheduleInstallmentRepository.save(installment);
@@ -410,7 +410,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService {
LoanTransaction disbursementTransaction = LoanTransaction.disbursement(loan.getOffice(), amount, paymentDetail, transactionDate,
txnExternalId, DateUtils.getLocalDateTimeOfTenant(), currentUser);
disbursementTransaction.updateLoan(loan);
loan.getLoanTransactions().add(disbursementTransaction);
loan.addLoanTransaction(disbursementTransaction);
saveLoanTransactionWithDataIntegrityViolationChecks(disbursementTransaction);
saveAndFlushLoanWithDataIntegrityViolationChecks(loan);
@@ -448,7 +448,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService {
if (!loan.isPeriodicAccrualAccountingEnabledOnLoanProduct() || !loan.repaymentScheduleDetail().isInterestRecalculationEnabled()
|| accruedTill == null || loan.isNpa() || !loan.status().isActive()) { return; }
Collection<LoanScheduleAccrualData> loanScheduleAccrualDatas = new ArrayList<>();
List<LoanRepaymentScheduleInstallment> installments = loan.fetchRepaymentScheduleInstallments();
List<LoanRepaymentScheduleInstallment> installments = loan.getRepaymentScheduleInstallments();
Long loanId = loan.getId();
Long officeId = loan.getOfficeId();
LocalDate accrualStartDate = null;
@@ -53,8 +53,6 @@ import org.apache.fineract.portfolio.charge.domain.ChargeTimeType;
import org.apache.fineract.portfolio.charge.exception.LoanChargeWithoutMandatoryFieldException;
import org.apache.fineract.portfolio.loanaccount.command.LoanChargeCommand;
import org.apache.fineract.portfolio.loanaccount.data.LoanChargePaidDetail;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.joda.time.LocalDate;
import org.springframework.data.jpa.domain.AbstractPersistable;
@@ -122,8 +120,7 @@ public class LoanCharge extends AbstractPersistable<Long> {
@Column(name = "max_cap", scale = 6, precision = 19, nullable = true)
private BigDecimal maxCap;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "loancharge", orphanRemoval = true)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "loancharge", orphanRemoval = true, fetch=FetchType.EAGER)
private final Set<LoanInstallmentCharge> loanInstallmentCharge = new HashSet<>();
@Column(name = "is_active", nullable = false)
@@ -19,14 +19,15 @@
package org.apache.fineract.portfolio.loanaccount.domain;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
@@ -38,8 +39,6 @@ import org.apache.fineract.infrastructure.core.domain.AbstractAuditableCustom;
import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency;
import org.apache.fineract.organisation.monetary.domain.Money;
import org.apache.fineract.useradministration.domain.AppUser;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.joda.time.LocalDate;
@Entity
@@ -131,10 +130,9 @@ public final class LoanRepaymentScheduleInstallment extends AbstractAuditableCus
@Column(name = "recalculated_interest_component", nullable = false)
private boolean recalculatedInterestComponent;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch=FetchType.EAGER)
@JoinColumn(name = "loan_repayment_schedule_id", referencedColumnName = "id", nullable = false)
private List<LoanInterestRecalcualtionAdditionalDetails> loanCompoundingDetails = new ArrayList<>();
private Set<LoanInterestRecalcualtionAdditionalDetails> loanCompoundingDetails = new HashSet<>();
protected LoanRepaymentScheduleInstallment() {
this.installmentNumber = null;
this.fromDate = null;
@@ -145,7 +143,7 @@ public final class LoanRepaymentScheduleInstallment extends AbstractAuditableCus
public LoanRepaymentScheduleInstallment(final Loan loan, final Integer installmentNumber, final LocalDate fromDate,
final LocalDate dueDate, final BigDecimal principal, final BigDecimal interest, final BigDecimal feeCharges,
final BigDecimal penaltyCharges, final boolean recalculatedInterestComponent,
final List<LoanInterestRecalcualtionAdditionalDetails> compoundingDetails) {
final Set<LoanInterestRecalcualtionAdditionalDetails> compoundingDetails) {
this.loan = loan;
this.installmentNumber = installmentNumber;
this.fromDate = fromDate.toDateTimeAtStartOfDay().toDate();
@@ -782,7 +780,7 @@ public final class LoanRepaymentScheduleInstallment extends AbstractAuditableCus
public Money getDue(MonetaryCurrency currency) {
return getPrincipal(currency).plus(getInterestCharged(currency)).plus(getFeeChargesCharged(currency)).plus(getPenaltyChargesCharged(currency));
}
public List<LoanInterestRecalcualtionAdditionalDetails> getLoanCompoundingDetails() {
public Set<LoanInterestRecalcualtionAdditionalDetails> getLoanCompoundingDetails() {
return this.loanCompoundingDetails;
}
@@ -31,6 +31,7 @@ import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
@@ -51,8 +52,6 @@ import org.apache.fineract.portfolio.loanproduct.service.LoanEnumerations;
import org.apache.fineract.portfolio.paymentdetail.data.PaymentDetailData;
import org.apache.fineract.portfolio.paymentdetail.domain.PaymentDetail;
import org.apache.fineract.useradministration.domain.AppUser;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.joda.time.LocalDate;
import org.joda.time.LocalDateTime;
import org.springframework.data.jpa.domain.AbstractPersistable;
@@ -123,8 +122,7 @@ public final class LoanTransaction extends AbstractPersistable<Long> {
@JoinColumn(name = "appuser_id", nullable = true)
private final AppUser appUser;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "loanTransaction", orphanRemoval = true)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "loanTransaction", orphanRemoval = true, fetch=FetchType.EAGER)
private Set<LoanChargePaidBy> loanChargesPaid = new HashSet<>();
@Column(name = "outstanding_loan_balance_derived", scale = 6, precision = 19, nullable = true)
@@ -133,9 +131,8 @@ public final class LoanTransaction extends AbstractPersistable<Long> {
@Column(name = "manually_adjusted_or_reversed", nullable = false)
private boolean manuallyAdjustedOrReversed;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "loan_transaction_id", referencedColumnName = "id", nullable = false)
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch=FetchType.EAGER)
@JoinColumn(name = "loan_transaction_id", referencedColumnName= "id" , nullable = false)
private Set<LoanTransactionToRepaymentScheduleMapping> loanTransactionToRepaymentScheduleMappings = new HashSet<>();
protected LoanTransaction() {
@@ -27,6 +27,7 @@ import java.util.Map;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
@@ -39,8 +40,6 @@ import org.apache.fineract.infrastructure.codes.domain.CodeValue;
import org.apache.fineract.infrastructure.core.api.JsonCommand;
import org.apache.fineract.portfolio.loanaccount.domain.Loan;
import org.apache.fineract.portfolio.loanaccount.guarantor.GuarantorConstants.GUARANTOR_JSON_INPUT_PARAMS;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.springframework.data.jpa.domain.AbstractPersistable;
@Entity
@@ -101,8 +100,7 @@ public class Guarantor extends AbstractPersistable<Long> {
@Column(name = "is_active", nullable = false)
private boolean active;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "guarantor", orphanRemoval = true)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "guarantor", orphanRemoval = true, fetch=FetchType.EAGER)
private final List<GuarantorFundingDetails> guarantorFundDetails = new ArrayList<>();
protected Guarantor() {
@@ -25,6 +25,7 @@ import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
@@ -33,8 +34,6 @@ import javax.persistence.Table;
import org.apache.fineract.portfolio.account.domain.AccountAssociations;
import org.apache.fineract.portfolio.loanaccount.domain.Loan;
import org.apache.fineract.portfolio.savings.domain.SavingsAccount;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.springframework.data.jpa.domain.AbstractPersistable;
@Entity
@@ -64,8 +63,7 @@ public class GuarantorFundingDetails extends AbstractPersistable<Long> {
@Column(name = "amount_transfered_derived", scale = 6, precision = 19, nullable = true)
private BigDecimal amountTransfered;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "guarantorFundingDetails", orphanRemoval = true)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "guarantorFundingDetails", orphanRemoval = true, fetch=FetchType.EAGER)
private final List<GuarantorFundingTransaction> guarantorFundingTransactions = new ArrayList<>();
protected GuarantorFundingDetails() {}
@@ -2575,7 +2575,7 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener
currency);
}
Money amountCharged = getIncomeForCompounding(loanApplicationTerms, currency, installment);
final List<LoanInterestRecalcualtionAdditionalDetails> details = installment.getLoanCompoundingDetails();
final Set<LoanInterestRecalcualtionAdditionalDetails> details = installment.getLoanCompoundingDetails();
Money totalCompounded = Money.zero(currency);
Map<LocalDate, Money> compoundingMap = new TreeMap<>();
for (LoanInterestRecalcualtionAdditionalDetails additionalDetails : details) {
@@ -2754,7 +2754,7 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener
penaltyCharges = penaltyCharges.plus(currentInstallment.getPenaltyChargesOutstanding(currency));
}
}
final List<LoanInterestRecalcualtionAdditionalDetails> compoundingDetails = null;
final Set<LoanInterestRecalcualtionAdditionalDetails> compoundingDetails = null;
return new LoanRepaymentScheduleInstallment(null, 0, onDate, onDate, totalPrincipal.getAmount(), totalInterest.getAmount(),
feeCharges.getAmount(), penaltyCharges.getAmount(), false, compoundingDetails);
}
@@ -19,7 +19,7 @@
package org.apache.fineract.portfolio.loanaccount.loanschedule.domain;
import java.math.BigDecimal;
import java.util.List;
import java.util.Set;
import org.apache.fineract.organisation.monetary.domain.Money;
import org.apache.fineract.portfolio.loanaccount.domain.LoanInterestRecalcualtionAdditionalDetails;
@@ -125,7 +125,7 @@ public final class LoanScheduleModelDisbursementPeriod implements LoanScheduleMo
return;
}
@Override
public List<LoanInterestRecalcualtionAdditionalDetails> getLoanCompoundingDetails() {
public Set<LoanInterestRecalcualtionAdditionalDetails> getLoanCompoundingDetails() {
return null;
}
}
@@ -19,7 +19,7 @@
package org.apache.fineract.portfolio.loanaccount.loanschedule.domain;
import java.math.BigDecimal;
import java.util.List;
import java.util.Set;
import org.apache.fineract.organisation.monetary.domain.Money;
import org.apache.fineract.portfolio.loanaccount.domain.LoanInterestRecalcualtionAdditionalDetails;
@@ -53,5 +53,5 @@ public interface LoanScheduleModelPeriod {
void addPrincipalAmount(Money principalDue);
void addInterestAmount(Money interestDue);
List<LoanInterestRecalcualtionAdditionalDetails> getLoanCompoundingDetails();
Set<LoanInterestRecalcualtionAdditionalDetails> getLoanCompoundingDetails();
}
@@ -19,8 +19,8 @@
package org.apache.fineract.portfolio.loanaccount.loanschedule.domain;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.HashSet;
import java.util.Set;
import org.apache.fineract.organisation.monetary.domain.Money;
import org.apache.fineract.portfolio.loanaccount.domain.LoanInterestRecalcualtionAdditionalDetails;
@@ -43,7 +43,7 @@ public final class LoanScheduleModelRepaymentPeriod implements LoanScheduleModel
private Money penaltyChargesDue;
private Money totalDue;
private final boolean recalculatedInterestComponent;
private final List<LoanInterestRecalcualtionAdditionalDetails> loanCompoundingDetails = new ArrayList<>();
private final Set<LoanInterestRecalcualtionAdditionalDetails> loanCompoundingDetails = new HashSet<>();
public static LoanScheduleModelRepaymentPeriod repayment(final int periodNumber, final LocalDate startDate,
final LocalDate scheduledDueDate, final Money principalDue, final Money outstandingLoanBalance, final Money interestDue,
@@ -159,7 +159,7 @@ public final class LoanScheduleModelRepaymentPeriod implements LoanScheduleModel
this.totalDue = this.totalDue.plus(principalDue);
}
@Override
public List<LoanInterestRecalcualtionAdditionalDetails> getLoanCompoundingDetails() {
public Set<LoanInterestRecalcualtionAdditionalDetails> getLoanCompoundingDetails() {
return this.loanCompoundingDetails;
}
}
@@ -23,7 +23,6 @@ import java.math.MathContext;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@@ -87,7 +86,6 @@ import org.apache.fineract.portfolio.loanaccount.domain.LoanDisbursementDetails;
import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallment;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTermVariationType;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTermVariations;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTermVariationsComparator;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction;
import org.apache.fineract.portfolio.loanaccount.domain.transactionprocessor.LoanRepaymentScheduleTransactionProcessor;
import org.apache.fineract.portfolio.loanaccount.exception.LoanApplicationDateException;
@@ -663,7 +661,7 @@ public class LoanScheduleAssembler {
public void assempleVariableScheduleFrom(final Loan loan, final String json) {
this.variableLoanScheduleFromApiJsonValidator.validateSchedule(json, loan);
List<LoanTermVariations> variations = loan.getLoanTermVariations();
Set<LoanTermVariations> variations = loan.getLoanTermVariations();
List<LoanTermVariations> newVariations = new ArrayList<>();
extractLoanTermVariations(loan, json, newVariations);
@@ -674,8 +672,8 @@ public class LoanScheduleAssembler {
newVariations = retainVariations;
}
variations.addAll(newVariations);
Collections.sort(variations, new LoanTermVariationsComparator());
//Collections.sort(variations, new LoanTermVariationsComparator());
/*
* List<LoanTermVariationsData> loanTermVariationsDatas = new
* ArrayList<>();
@@ -686,7 +684,7 @@ public class LoanScheduleAssembler {
*/
// date validations
List<LoanRepaymentScheduleInstallment> installments = loan.fetchRepaymentScheduleInstallments();
List<LoanRepaymentScheduleInstallment> installments = loan.getRepaymentScheduleInstallments();
Set<LocalDate> dueDates = new TreeSet<>();
LocalDate graceApplicable = loan.getExpectedDisbursedOnLocalDate();
Integer graceOnPrincipal = loan.getLoanProductRelatedDetail().graceOnPrincipalPayment();
@@ -845,11 +843,12 @@ public class LoanScheduleAssembler {
loan.regenerateRepaymentSchedule(scheduleGeneratorDTO, currentUser);
}
private List<LoanTermVariations> adjustExistingVariations(List<LoanTermVariations> variations, List<LoanTermVariations> newVariations,
private List<LoanTermVariations> adjustExistingVariations(Set<LoanTermVariations> variations, List<LoanTermVariations> newVariations,
final Map<LocalDate, LocalDate> adjustDueDateVariations) {
Map<LocalDate, LoanTermVariations> amountVariations = new HashMap<>();
Map<LocalDate, LoanTermVariations> dueDateVariations = new HashMap<>();
Map<LocalDate, LoanTermVariations> insertVariations = new HashMap<>();
for (LoanTermVariations loanTermVariations : variations) {
switch (loanTermVariations.getTermType()) {
case EMI_AMOUNT:
@@ -161,7 +161,8 @@ public class LoanScheduleCalculationPlatformServiceImpl implements LoanScheduleC
MonetaryCurrency currency = loan.getCurrency();
Money totalPrincipal = Money.zero(currency);
final List<LoanSchedulePeriodData> futureInstallments = new ArrayList<>();
for (final LoanRepaymentScheduleInstallment currentInstallment : loan.fetchRepaymentScheduleInstallments()) {
List<LoanRepaymentScheduleInstallment> installments = loan.getRepaymentScheduleInstallments() ;
for (final LoanRepaymentScheduleInstallment currentInstallment : installments) {
if (currentInstallment.isNotFullyPaidOff()) {
if (!currentInstallment.getDueDate().isAfter(today)) {
totalPrincipal = totalPrincipal.plus(currentInstallment.getPrincipalOutstanding(currency));
@@ -172,7 +173,7 @@ public class LoanScheduleCalculationPlatformServiceImpl implements LoanScheduleC
LoanRepaymentScheduleInstallment loanRepaymentScheduleInstallment = this.loanScheduleAssembler.calculatePrepaymentAmount(currency,
today, loanApplicationTerms, loan.charges(), loan.getOfficeId(),
loan.retreiveListOfTransactionsPostDisbursementExcludeAccruals(), loanRepaymentScheduleTransactionProcessor,
loan.fetchRepaymentScheduleInstallments());
loan.getRepaymentScheduleInstallments());
Money totalAmount = totalPrincipal.plus(loanRepaymentScheduleInstallment.getFeeChargesOutstanding(currency)).plus(
loanRepaymentScheduleInstallment.getPenaltyChargesOutstanding(currency));
Money interestDue = Money.zero(currency);
@@ -193,7 +194,7 @@ public class LoanScheduleCalculationPlatformServiceImpl implements LoanScheduleC
}
LoanScheduleModel model = this.loanScheduleAssembler.assembleForInterestRecalculation(loanApplicationTerms, loan.getOfficeId(),
modifiedTransactions, loan.charges(), loanRepaymentScheduleTransactionProcessor, loan.fetchRepaymentScheduleInstallments(),
modifiedTransactions, loan.charges(), loanRepaymentScheduleTransactionProcessor, loan.getRepaymentScheduleInstallments(),
loan.fetchInterestRecalculateFromDate());
LoanScheduleData scheduleDate = model.toData();
Collection<LoanSchedulePeriodData> periodDatas = scheduleDate.getPeriods();
@@ -22,6 +22,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.fineract.infrastructure.core.api.JsonCommand;
import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
@@ -71,7 +72,7 @@ public class LoanScheduleWritePlatformServiceImpl implements LoanScheduleWritePl
this.loanAccountDomainService.saveLoanWithDataIntegrityViolationChecks(loan);
final Map<String, Object> changes = new HashMap<>();
List<LoanTermVariationsData> newVariationsData = new ArrayList<>();
List<LoanTermVariations> modifiedVariations = loan.getLoanTermVariations();
Set<LoanTermVariations> modifiedVariations = loan.getLoanTermVariations();
for (LoanTermVariations termVariations : modifiedVariations) {
if (loanTermVariations.containsKey(termVariations.getId())) {
loanTermVariations.remove(termVariations.getId());
@@ -93,7 +94,7 @@ public class LoanScheduleWritePlatformServiceImpl implements LoanScheduleWritePl
@Override
public CommandProcessingResult deleteLoanScheduleVariations(final Long loanId) {
final Loan loan = this.loanAssembler.assembleFrom(loanId);
List<LoanTermVariations> variations = loan.getLoanTermVariations();
Set<LoanTermVariations> variations = loan.getLoanTermVariations();
List<Long> deletedVariations = new ArrayList<>(variations.size());
for (LoanTermVariations loanTermVariations : variations) {
deletedVariations.add(loanTermVariations.getId());
@@ -28,6 +28,7 @@ import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.fineract.accounting.journalentry.service.JournalEntryWritePlatformService;
import org.apache.fineract.infrastructure.codes.domain.CodeValue;
@@ -371,7 +372,7 @@ public class LoanRescheduleRequestWritePlatformServiceImpl implements LoanResche
final Collection<LoanRescheduleModelRepaymentPeriod> periods = loanRescheduleModel.getPeriods();
List<LoanRepaymentScheduleInstallment> repaymentScheduleInstallments = loan.getRepaymentScheduleInstallments();
Collection<LoanCharge> waiveLoanCharges = new ArrayList<>();
final List<LoanInterestRecalcualtionAdditionalDetails> compoundingDetails = null;
final Set<LoanInterestRecalcualtionAdditionalDetails> compoundingDetails = null;
for (LoanRescheduleModelRepaymentPeriod period : periods) {
if (period.isNew()) {
@@ -379,7 +380,8 @@ public class LoanRescheduleRequestWritePlatformServiceImpl implements LoanResche
period.periodNumber(), period.periodFromDate(), period.periodDueDate(), period.principalDue(),
period.interestDue(), BigDecimal.ZERO, BigDecimal.ZERO, false, compoundingDetails);
repaymentScheduleInstallments.add(repaymentScheduleInstallment);
loan.addLoanRepaymentScheduleInstallment(repaymentScheduleInstallment);
repaymentScheduleInstallments.add(repaymentScheduleInstallment) ;
}
else {
@@ -423,8 +425,7 @@ public class LoanRescheduleRequestWritePlatformServiceImpl implements LoanResche
waiveLoanCharges(loan, waiveLoanCharges);
// update the Loan summary
loanSummary
.updateSummary(currency, loan.getPrincpal(), repaymentScheduleInstallments, new LoanSummaryWrapper(), true, null);
loanSummary.updateSummary(currency, loan.getPrincpal(), repaymentScheduleInstallments, new LoanSummaryWrapper(), true, null);
// update the total number of schedule repayments
loan.updateNumberOfRepayments(periods.size());
@@ -959,7 +959,7 @@ public final class LoanApplicationCommandFromApiJsonHelper {
if (loan.getFixedEmiAmount() != null) {
Integer minimumNoOfRepayments = loan.loanProduct().getMinNumberOfRepayments();
Integer maximumNoOfRepayments = loan.loanProduct().getMaxNumberOfRepayments();
Integer actualNumberOfRepayments = loan.getRepaymentScheduleInstallments().size();
Integer actualNumberOfRepayments = loan.getLoanRepaymentScheduleInstallmentsSize();
// validate actual number of repayments is > minimum number of
// repayments
if (minimumNoOfRepayments != null && minimumNoOfRepayments != 0 && actualNumberOfRepayments < minimumNoOfRepayments) {
@@ -1164,7 +1164,7 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
private void saveAndFlushLoanWithDataIntegrityViolationChecks(final Loan loan) {
try {
List<LoanRepaymentScheduleInstallment> installments = loan.fetchRepaymentScheduleInstallments();
List<LoanRepaymentScheduleInstallment> installments = loan.getRepaymentScheduleInstallments();
for (LoanRepaymentScheduleInstallment installment : installments) {
if (installment.getId() == null) {
this.repaymentScheduleInstallmentRepository.save(installment);
@@ -365,7 +365,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
LoanTransaction disbursementTransaction = LoanTransaction.disbursement(loan.getOffice(), disburseAmount, paymentDetail,
actualDisbursementDate, txnExternalId, DateUtils.getLocalDateTimeOfTenant(), currentUser);
disbursementTransaction.updateLoan(loan);
loan.getLoanTransactions().add(disbursementTransaction);
loan.addLoanTransaction(disbursementTransaction);
}
regenerateScheduleOnDisbursement(command, loan, recalculateSchedule, scheduleGeneratorDTO, nextPossibleRepaymentDate, rescheduledRepaymentDate);
@@ -508,7 +508,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
private void saveAndFlushLoanWithDataIntegrityViolationChecks(final Loan loan) {
try {
List<LoanRepaymentScheduleInstallment> installments = loan.fetchRepaymentScheduleInstallments();
List<LoanRepaymentScheduleInstallment> installments = loan.getRepaymentScheduleInstallments();
for (LoanRepaymentScheduleInstallment installment : installments) {
if (installment.getId() == null) {
this.repaymentScheduleInstallmentRepository.save(installment);
@@ -529,7 +529,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
private void saveLoanWithDataIntegrityViolationChecks(final Loan loan) {
try {
List<LoanRepaymentScheduleInstallment> installments = loan.fetchRepaymentScheduleInstallments();
List<LoanRepaymentScheduleInstallment> installments = loan.getRepaymentScheduleInstallments();
for (LoanRepaymentScheduleInstallment installment : installments) {
if (installment.getId() == null) {
this.repaymentScheduleInstallmentRepository.save(installment);
@@ -607,7 +607,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
LoanTransaction disbursementTransaction = LoanTransaction.disbursement(loan.getOffice(), disburseAmount, paymentDetail,
actualDisbursementDate, txnExternalId, DateUtils.getLocalDateTimeOfTenant(), currentUser);
disbursementTransaction.updateLoan(loan);
loan.getLoanTransactions().add(disbursementTransaction);
loan.addLoanTransaction(disbursementTransaction);
}
LocalDate recalculateFrom = null;
final ScheduleGeneratorDTO scheduleGeneratorDTO = this.loanUtilService.buildScheduleGeneratorDTO(loan, recalculateFrom);
@@ -903,7 +903,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
for (final Map.Entry<Long, LoanTransaction> mapEntry : changedTransactionDetail.getNewTransactionMappings().entrySet()) {
this.loanTransactionRepository.save(mapEntry.getValue());
// update loan with references to the newly created transactions
loan.getLoanTransactions().add(mapEntry.getValue());
loan.addLoanTransaction(mapEntry.getValue());
this.accountTransfersWritePlatformService.updateLoanTransaction(mapEntry.getKey(), mapEntry.getValue());
}
}
@@ -1017,7 +1017,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
for (final Map.Entry<Long, LoanTransaction> mapEntry : changedTransactionDetail.getNewTransactionMappings().entrySet()) {
this.loanTransactionRepository.save(mapEntry.getValue());
// update loan with references to the newly created transactions
loan.getLoanTransactions().add(mapEntry.getValue());
loan.addLoanTransaction(mapEntry.getValue());
this.accountTransfersWritePlatformService.updateLoanTransaction(mapEntry.getKey(), mapEntry.getValue());
}
}
@@ -1322,7 +1322,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
this.loanTransactionRepository.save(mapEntry.getValue());
// update loan with references to the newly created
// transactions
loan.getLoanTransactions().add(mapEntry.getValue());
loan.addLoanTransaction(mapEntry.getValue());
this.accountTransfersWritePlatformService.updateLoanTransaction(mapEntry.getKey(), mapEntry.getValue());
}
}
@@ -1384,7 +1384,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
this.loanTransactionRepository.save(mapEntry.getValue());
// update loan with references to the newly created
// transactions
loan.getLoanTransactions().add(mapEntry.getValue());
loan.addLoanTransaction(mapEntry.getValue());
this.accountTransfersWritePlatformService.updateLoanTransaction(mapEntry.getKey(), mapEntry.getValue());
}
}
@@ -1776,7 +1776,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
final LoanTransaction newTransferTransaction = LoanTransaction.initiateTransfer(loan.getOffice(), loan, transferDate,
DateUtils.getLocalDateTimeOfTenant(), currentUser);
loan.getLoanTransactions().add(newTransferTransaction);
loan.addLoanTransaction(newTransferTransaction);
loan.setLoanStatus(LoanStatus.TRANSFER_IN_PROGRESS.getValue());
this.loanTransactionRepository.save(newTransferTransaction);
@@ -1803,7 +1803,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
final LoanTransaction newTransferAcceptanceTransaction = LoanTransaction.approveTransfer(acceptedInOffice, loan, transferDate,
DateUtils.getLocalDateTimeOfTenant(), currentUser);
loan.getLoanTransactions().add(newTransferAcceptanceTransaction);
loan.addLoanTransaction(newTransferAcceptanceTransaction);
if (loan.getTotalOverpaid() != null) {
loan.setLoanStatus(LoanStatus.OVERPAID.getValue());
} else {
@@ -1838,7 +1838,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
final LoanTransaction newTransferAcceptanceTransaction = LoanTransaction.withdrawTransfer(loan.getOffice(), loan, transferDate,
DateUtils.getLocalDateTimeOfTenant(), currentUser);
loan.getLoanTransactions().add(newTransferAcceptanceTransaction);
loan.addLoanTransaction(newTransferAcceptanceTransaction);
loan.setLoanStatus(LoanStatus.ACTIVE.getValue());
this.loanTransactionRepository.save(newTransferAcceptanceTransaction);
@@ -2327,7 +2327,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
this.loanTransactionRepository.save(mapEntry.getValue());
// update loan with references to the newly created
// transactions
loan.getLoanTransactions().add(mapEntry.getValue());
loan.addLoanTransaction(mapEntry.getValue());
this.accountTransfersWritePlatformService.updateLoanTransaction(mapEntry.getKey(), mapEntry.getValue());
}
}
@@ -2348,7 +2348,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
private void addInstallmentIfPenaltyAppliedAfterLastDueDate(Loan loan, LocalDate lastChargeDate) {
if (lastChargeDate != null) {
List<LoanRepaymentScheduleInstallment> installments = loan.fetchRepaymentScheduleInstallments();
List<LoanRepaymentScheduleInstallment> installments = loan.getRepaymentScheduleInstallments();
LoanRepaymentScheduleInstallment lastInstallment = loan.fetchRepaymentScheduleInstallment(installments.size());
if (lastChargeDate.isAfter(lastInstallment.getDueDate())) {
if (lastInstallment.isRecalculatedInterestComponent()) {
@@ -2360,11 +2360,12 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
BigDecimal interest = BigDecimal.ZERO;
BigDecimal feeCharges = BigDecimal.ZERO;
BigDecimal penaltyCharges = BigDecimal.ONE;
final List<LoanInterestRecalcualtionAdditionalDetails> compoundingDetails = null;
final Set<LoanInterestRecalcualtionAdditionalDetails> compoundingDetails = null;
LoanRepaymentScheduleInstallment newEntry = new LoanRepaymentScheduleInstallment(loan, installments.size() + 1,
lastInstallment.getDueDate(), lastChargeDate, principal, interest, feeCharges, penaltyCharges,
recalculatedInterestComponent, compoundingDetails);
installments.add(newEntry);
loan.addLoanRepaymentScheduleInstallment(newEntry);
}
}
}
@@ -2722,7 +2723,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
this.loanTransactionRepository.save(mapEntry.getValue());
// update loan with references to the newly created
// transactions
loan.getLoanTransactions().add(mapEntry.getValue());
loan.addLoanTransaction(mapEntry.getValue());
this.accountTransfersWritePlatformService.updateLoanTransaction(mapEntry.getKey(), mapEntry.getValue());
}
}
@@ -60,8 +60,6 @@ import org.apache.fineract.portfolio.floatingrates.domain.FloatingRate;
import org.apache.fineract.portfolio.fund.domain.Fund;
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.AprCalculator;
import org.apache.fineract.portfolio.loanproduct.LoanProductConstants;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.joda.time.LocalDate;
import org.springframework.data.jpa.domain.AbstractPersistable;
@@ -133,8 +131,7 @@ public class LoanProduct extends AbstractPersistable<Long> {
@Column(name = "external_id", length = 100, nullable = true, unique = true)
private String externalId;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "loanProduct", orphanRemoval = true)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "loanProduct", orphanRemoval = true, fetch=FetchType.EAGER)
private Set<LoanProductBorrowerCycleVariations> borrowerCycleVariations = new HashSet<>();
@Column(name = "overdue_days_for_npa", nullable = true)
@@ -143,15 +140,13 @@ public class LoanProduct extends AbstractPersistable<Long> {
@Column(name = "min_days_between_disbursal_and_first_repayment", nullable = true)
private Integer minimumDaysBetweenDisbursalAndFirstRepayment;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToOne(cascade = CascadeType.ALL, mappedBy = "loanProduct", optional = true, orphanRemoval = true)
@OneToOne(cascade = CascadeType.ALL, mappedBy = "loanProduct", optional = true, orphanRemoval = true, fetch=FetchType.EAGER)
private LoanProductInterestRecalculationDetails productInterestRecalculationDetails;
@Column(name = "hold_guarantee_funds")
private boolean holdGuaranteeFunds;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToOne(cascade = CascadeType.ALL, mappedBy = "loanProduct", optional = true, orphanRemoval = true)
@OneToOne(cascade = CascadeType.ALL, mappedBy = "loanProduct", optional = true, orphanRemoval = true, fetch=FetchType.EAGER)
private LoanProductGuaranteeDetails loanProductGuaranteeDetails;
@OneToOne(cascade = CascadeType.ALL, mappedBy = "loanProduct", optional = true, orphanRemoval = true)
@@ -172,15 +167,13 @@ public class LoanProduct extends AbstractPersistable<Long> {
@Column(name = "is_linked_to_floating_interest_rates", nullable = false)
private boolean isLinkedToFloatingInterestRate;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToOne(cascade = CascadeType.ALL, mappedBy = "loanProduct", optional = true, orphanRemoval = true)
@OneToOne(cascade = CascadeType.ALL, mappedBy = "loanProduct", optional = true, orphanRemoval = true, fetch=FetchType.EAGER)
private LoanProductFloatingRates floatingRates;
@Column(name = "allow_variabe_installments", nullable = false)
private boolean allowVariabeInstallments;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToOne(cascade = CascadeType.ALL, mappedBy = "loanProduct", optional = true, orphanRemoval = true)
@OneToOne(cascade = CascadeType.ALL, mappedBy = "loanProduct", optional = true, orphanRemoval = true, fetch=FetchType.EAGER)
private LoanProductVariableInstallmentConfig variableInstallmentConfig;
public static LoanProduct assembleFromJson(final Fund fund, final LoanTransactionProcessingStrategy loanTransactionProcessingStrategy,
@@ -466,7 +466,7 @@ public class DepositAccountDomainServiceJpa implements DepositAccountDomainServi
}
private void updateAlreadyPostedTransactions(final Set<Long> existingTransactionIds, final SavingsAccount savingsAccount) {
List<SavingsAccountTransaction> transactions = savingsAccount.getTransactions();
List<SavingsAccountTransaction> transactions = savingsAccount.getTransactions() ;
int size = transactions.size();
for (int i = size - 1;; i--) {
SavingsAccountTransaction transaction = transactions.get(i);
@@ -25,6 +25,7 @@ import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
@@ -37,8 +38,6 @@ import org.apache.fineract.portfolio.interestratechart.domain.InterestRateChartS
import org.apache.fineract.portfolio.interestratechart.incentive.AttributeIncentiveCalculation;
import org.apache.fineract.portfolio.interestratechart.incentive.AttributeIncentiveCalculationFactory;
import org.apache.fineract.portfolio.interestratechart.incentive.IncentiveDTO;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.joda.time.LocalDate;
import org.springframework.data.jpa.domain.AbstractPersistable;
@@ -53,8 +52,7 @@ public class DepositAccountInterestRateChart extends AbstractPersistable<Long> {
@JoinColumn(name = "savings_account_id", nullable = false)
private SavingsAccount account;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(mappedBy = "depositAccountInterestRateChart", cascade = CascadeType.ALL, orphanRemoval = true)
@OneToMany(mappedBy = "depositAccountInterestRateChart", cascade = CascadeType.ALL, orphanRemoval = true, fetch=FetchType.EAGER)
private Set<DepositAccountInterestRateChartSlabs> chartSlabs = new HashSet<>();
protected DepositAccountInterestRateChart() {
@@ -24,6 +24,7 @@ import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
@@ -32,8 +33,6 @@ import javax.persistence.Table;
import org.apache.fineract.portfolio.interestratechart.domain.InterestIncentives;
import org.apache.fineract.portfolio.interestratechart.domain.InterestRateChartSlab;
import org.apache.fineract.portfolio.interestratechart.domain.InterestRateChartSlabFields;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.springframework.data.jpa.domain.AbstractPersistable;
@Entity
@@ -47,8 +46,7 @@ public class DepositAccountInterestRateChartSlabs extends AbstractPersistable<Lo
@JoinColumn(name = "savings_account_interest_rate_chart_id", referencedColumnName = "id", nullable = false)
private DepositAccountInterestRateChart depositAccountInterestRateChart;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(mappedBy = "depositAccountInterestRateChartSlabs", cascade = CascadeType.ALL, orphanRemoval = true)
@OneToMany(mappedBy = "depositAccountInterestRateChartSlabs", cascade = CascadeType.ALL, orphanRemoval = true, fetch=FetchType.EAGER)
private Set<DepositAccountInterestIncentives> interestIncentives = new HashSet<>();
protected DepositAccountInterestRateChartSlabs() {
@@ -28,7 +28,9 @@ import java.math.MathContext;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@@ -70,8 +72,6 @@ import org.apache.fineract.portfolio.savings.data.SavingsAccountTransactionDTO;
import org.apache.fineract.portfolio.savings.domain.interest.PostingPeriod;
import org.apache.fineract.portfolio.savings.service.SavingsEnumerations;
import org.apache.fineract.useradministration.domain.AppUser;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
@@ -89,10 +89,13 @@ public class RecurringDepositAccount extends SavingsAccount {
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "account")
private DepositAccountInterestRateChart chart;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "account", orphanRemoval = true)
private List<RecurringDepositScheduleInstallment> depositScheduleInstallments = new ArrayList<>();
@OneToMany(cascade = CascadeType.ALL, mappedBy = "account", orphanRemoval = true, fetch=FetchType.EAGER)
private Set<RecurringDepositScheduleInstallment> depositScheduleInstallments = new HashSet<>();
private transient List<RecurringDepositScheduleInstallment> sortedDepositInstallments = null ;
private transient boolean isDepositScheduleInstallmentDirty = false ;
protected RecurringDepositAccount() {
//
}
@@ -620,7 +623,7 @@ public class RecurringDepositAccount extends SavingsAccount {
if (postingTransaction == null) {
final SavingsAccountTransaction newPostingTransaction = SavingsAccountTransaction.interestPosting(this, office(),
interestPostingTransactionDate, interestEarnedToBePostedForPeriod);
this.transactions.add(newPostingTransaction);
addTransaction(newPostingTransaction);
recalucateDailyBalanceDetails = true;
} else {
final boolean correctionRequired = postingTransaction.hasNotAmount(interestEarnedToBePostedForPeriod);
@@ -628,7 +631,7 @@ public class RecurringDepositAccount extends SavingsAccount {
postingTransaction.reverse();
final SavingsAccountTransaction newPostingTransaction = SavingsAccountTransaction.interestPosting(this, office(),
interestPostingTransactionDate, interestEarnedToBePostedForPeriod);
this.transactions.add(newPostingTransaction);
addTransaction(newPostingTransaction);
recalucateDailyBalanceDetails = true;
}
}
@@ -660,7 +663,7 @@ public class RecurringDepositAccount extends SavingsAccount {
if (!remainigInterestToBePosted.isZero()) {
final SavingsAccountTransaction newPostingTransaction = SavingsAccountTransaction.interestPosting(this, office(),
accountCloseDate, remainigInterestToBePosted);
this.transactions.add(newPostingTransaction);
addTransaction(newPostingTransaction);
recalucateDailyBalance = true;
}
@@ -751,7 +754,8 @@ public class RecurringDepositAccount extends SavingsAccount {
private Money totalInterestPosted() {
Money interestPostedToDate = Money.zero(this.currency);
for (final SavingsAccountTransaction transaction : this.transactions) {
List<SavingsAccountTransaction> trans = getTransactions() ;
for (final SavingsAccountTransaction transaction : trans) {
if (transaction.isInterestPostingAndNotReversed()) {
interestPostedToDate = interestPostedToDate.plus(transaction.getAmount(currency));
}
@@ -1122,8 +1126,8 @@ public class RecurringDepositAccount extends SavingsAccount {
}
public void generateSchedule(final PeriodFrequencyType frequency, final Integer recurringEvery, final Calendar calendar) {
final List<RecurringDepositScheduleInstallment> depositScheduleInstallments = depositScheduleInstallments();
depositScheduleInstallments.clear();
this.depositScheduleInstallments.clear();
this.isDepositScheduleInstallmentDirty = true ;
LocalDate installmentDate = null;
if (this.isCalendarInherited()) {
installmentDate = CalendarUtils.getNextScheduleDate(calendar, accountSubmittedOrActivationDate());
@@ -1137,7 +1141,7 @@ public class RecurringDepositAccount extends SavingsAccount {
while (maturityDate.isAfter(installmentDate)) {
final RecurringDepositScheduleInstallment installment = RecurringDepositScheduleInstallment.installment(this,
installmentNumber, installmentDate.toDate(), depositAmount);
depositScheduleInstallments.add(installment);
addDepositScheduleInstallment(installment);
installmentDate = DepositAccountUtils.calculateNextDepositDate(installmentDate, frequency, recurringEvery);
installmentNumber += 1;
}
@@ -1155,12 +1159,19 @@ public class RecurringDepositAccount extends SavingsAccount {
}
private List<RecurringDepositScheduleInstallment> depositScheduleInstallments() {
if (this.depositScheduleInstallments == null) {
this.depositScheduleInstallments = new ArrayList<>();
if(this.isDepositScheduleInstallmentDirty || this.sortedDepositInstallments == null) {
this.sortedDepositInstallments = new ArrayList<>(this.depositScheduleInstallments) ;
this.sortedDepositInstallments.sort(new RecurringDepositScheduleInstallmentComparator());
this.isDepositScheduleInstallmentDirty = false ;
}
return this.depositScheduleInstallments;
return this.sortedDepositInstallments ;
}
private void addDepositScheduleInstallment(final RecurringDepositScheduleInstallment installment) {
this.depositScheduleInstallments.add(installment) ;
isDepositScheduleInstallmentDirty = true ;
}
public boolean isCalendarInherited() {
return this.recurringDetail.isCalendarInherited();
}
@@ -1200,5 +1211,13 @@ public class RecurringDepositAccount extends SavingsAccount {
public DepositAccountRecurringDetail getRecurringDetail() {
return this.recurringDetail;
}
class RecurringDepositScheduleInstallmentComparator implements Comparator<RecurringDepositScheduleInstallment> {
@Override
public int compare(final RecurringDepositScheduleInstallment o1, final RecurringDepositScheduleInstallment o2) {
final int comparsion = o1.installmentNumber().compareTo(o2.installmentNumber());
return comparsion ;
}
}
}
@@ -241,4 +241,8 @@ public class RecurringDepositScheduleInstallment extends AbstractAuditableCustom
this.depositAmount = newDepositAmount;
this.resetDerivedFields();
}
public Integer installmentNumber() {
return this.installmentNumber ;
}
}
@@ -54,6 +54,7 @@ import javax.persistence.DiscriminatorType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
@@ -108,13 +109,10 @@ import org.apache.fineract.portfolio.tax.domain.TaxComponent;
import org.apache.fineract.portfolio.tax.domain.TaxGroup;
import org.apache.fineract.portfolio.tax.service.TaxUtils;
import org.apache.fineract.useradministration.domain.AppUser;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.springframework.data.jpa.domain.AbstractPersistable;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import com.google.gson.JsonArray;
@@ -148,7 +146,7 @@ public class SavingsAccount extends AbstractPersistable<Long> {
@JoinColumn(name = "product_id", nullable = false)
protected SavingsProduct product;
@ManyToOne
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "field_officer_id", nullable = true)
protected Staff savingsOfficer;
@@ -165,7 +163,7 @@ public class SavingsAccount extends AbstractPersistable<Long> {
@Column(name = "submittedon_date", nullable = true)
protected Date submittedOnDate;
@ManyToOne(optional = true)
@ManyToOne(optional = true, fetch=FetchType.LAZY)
@JoinColumn(name = "submittedon_userid", nullable = true)
protected AppUser submittedBy;
@@ -173,7 +171,7 @@ public class SavingsAccount extends AbstractPersistable<Long> {
@Column(name = "rejectedon_date")
protected Date rejectedOnDate;
@ManyToOne(optional = true)
@ManyToOne(optional = true, fetch=FetchType.LAZY)
@JoinColumn(name = "rejectedon_userid", nullable = true)
protected AppUser rejectedBy;
@@ -181,7 +179,7 @@ public class SavingsAccount extends AbstractPersistable<Long> {
@Column(name = "withdrawnon_date")
protected Date withdrawnOnDate;
@ManyToOne(optional = true)
@ManyToOne(optional = true, fetch=FetchType.LAZY)
@JoinColumn(name = "withdrawnon_userid", nullable = true)
protected AppUser withdrawnBy;
@@ -189,7 +187,7 @@ public class SavingsAccount extends AbstractPersistable<Long> {
@Column(name = "approvedon_date")
protected Date approvedOnDate;
@ManyToOne(optional = true)
@ManyToOne(optional = true, fetch=FetchType.LAZY)
@JoinColumn(name = "approvedon_userid", nullable = true)
protected AppUser approvedBy;
@@ -197,7 +195,7 @@ public class SavingsAccount extends AbstractPersistable<Long> {
@Column(name = "activatedon_date", nullable = true)
protected Date activatedOnDate;
@ManyToOne(optional = true)
@ManyToOne(optional = true, fetch=FetchType.LAZY)
@JoinColumn(name = "activatedon_userid", nullable = true)
protected AppUser activatedBy;
@@ -205,7 +203,7 @@ public class SavingsAccount extends AbstractPersistable<Long> {
@Column(name = "closedon_date")
protected Date closedOnDate;
@ManyToOne(optional = true)
@ManyToOne(optional = true, fetch=FetchType.LAZY)
@JoinColumn(name = "closedon_userid", nullable = true)
protected AppUser closedBy;
@@ -294,16 +292,17 @@ public class SavingsAccount extends AbstractPersistable<Long> {
protected SavingsAccountSummary summary;
@OrderBy(value = "dateOf, createdDate, id")
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "savingsAccount", orphanRemoval = true)
protected final List<SavingsAccountTransaction> transactions = new ArrayList<>();
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "savingsAccount", orphanRemoval = true)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "savingsAccount", orphanRemoval = true, fetch=FetchType.EAGER)
protected final Set<SavingsAccountTransaction> transactions = new HashSet<>();
private transient List<SavingsAccountTransaction> orderedTransactions = null ;
private transient boolean isTransactionsDirty = false ;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "savingsAccount", orphanRemoval = true, fetch=FetchType.EAGER)
protected Set<SavingsAccountCharge> charges = new HashSet<>();
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "savingsAccount", orphanRemoval = true)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "savingsAccount", orphanRemoval = true, fetch=FetchType.EAGER)
private Set<SavingsOfficerAssignmentHistory> savingsOfficerHistory;
@Transient
@@ -500,7 +499,7 @@ public class SavingsAccount extends AbstractPersistable<Long> {
newPostingTransaction = SavingsAccountTransaction.overdraftInterest(this, office(), interestPostingTransactionDate,
interestEarnedToBePostedForPeriod.negated());
}
this.transactions.add(newPostingTransaction);
addTransaction(newPostingTransaction);
if (applyWithHoldTax) {
createWithHoldTransaction(interestEarnedToBePostedForPeriod.getAmount(), interestPostingTransactionDate);
}
@@ -529,7 +528,7 @@ public class SavingsAccount extends AbstractPersistable<Long> {
newPostingTransaction = SavingsAccountTransaction.overdraftInterest(this, office(),
interestPostingTransactionDate, interestEarnedToBePostedForPeriod.negated());
}
this.transactions.add(newPostingTransaction);
addTransaction(newPostingTransaction);
if (applyWithHoldTaxForOldTransaction) {
createWithHoldTransaction(interestEarnedToBePostedForPeriod.getAmount(), interestPostingTransactionDate);
}
@@ -555,7 +554,8 @@ public class SavingsAccount extends AbstractPersistable<Long> {
protected List<SavingsAccountTransaction> findWithHoldTransactions() {
final List<SavingsAccountTransaction> withholdTransactions = new ArrayList<>();
for (final SavingsAccountTransaction transaction : this.transactions) {
List<SavingsAccountTransaction> trans = getTransactions() ;
for (final SavingsAccountTransaction transaction : trans) {
if ((transaction.isWithHoldTaxAndNotReversed())) {
withholdTransactions.add(transaction);
}
@@ -569,7 +569,8 @@ public class SavingsAccount extends AbstractPersistable<Long> {
protected SavingsAccountTransaction findInterestPostingTransactionFor(final LocalDate postingDate) {
SavingsAccountTransaction postingTransation = null;
for (final SavingsAccountTransaction transaction : this.transactions) {
List<SavingsAccountTransaction> trans = getTransactions() ;
for (final SavingsAccountTransaction transaction : trans) {
if ((transaction.isInterestPostingAndNotReversed() || transaction.isOverdraftInterestAndNotReversed())
&& transaction.occursOn(postingDate)) {
postingTransation = transaction;
@@ -598,7 +599,7 @@ public class SavingsAccount extends AbstractPersistable<Long> {
if (totalTax.compareTo(BigDecimal.ZERO) == 1) {
SavingsAccountTransaction withholdTransaction = SavingsAccountTransaction.withHoldTax(this, office(), date,
Money.of(currency, totalTax), taxSplit);
this.transactions.add(withholdTransaction);
addTransaction(withholdTransaction);
isTaxAdded = true;
}
}
@@ -621,7 +622,7 @@ public class SavingsAccount extends AbstractPersistable<Long> {
withholdTransaction.reverse();
SavingsAccountTransaction newWithholdTransaction = SavingsAccountTransaction.withHoldTax(this, office(),
withholdTransaction.transactionLocalDate(), Money.of(currency, totalTax), taxSplit);
this.transactions.add(newWithholdTransaction);
addTransaction(newWithholdTransaction);
isTaxAdded = true;
}
}
@@ -633,8 +634,8 @@ public class SavingsAccount extends AbstractPersistable<Long> {
protected SavingsAccountTransaction findLastTransaction(final LocalDate date) {
SavingsAccountTransaction savingsTransaction = null;
for (final SavingsAccountTransaction transaction : this.transactions) {
List<SavingsAccountTransaction> trans = getTransactions() ;
for (final SavingsAccountTransaction transaction : trans) {
if (transaction.isNotReversed() && transaction.occursOn(date)) {
savingsTransaction = transaction;
break;
@@ -763,7 +764,7 @@ public class SavingsAccount extends AbstractPersistable<Long> {
orderedNonInterestPostingTransactions.add(transaction);
}
}
orderedNonInterestPostingTransactions.sort(new SavingsAccountTransactionComparator());
return orderedNonInterestPostingTransactions;
}
@@ -819,7 +820,7 @@ public class SavingsAccount extends AbstractPersistable<Long> {
accountTransaction.updateOverdraftAmount(overdraftAmount.getAmount());
}
accountTransaction.updateRunningBalance(runningBalance);
this.transactions.add(accountTransaction);
addTransaction(accountTransaction);
isTransactionsModified = true;
}
@@ -902,8 +903,7 @@ public class SavingsAccount extends AbstractPersistable<Long> {
final SavingsAccountTransaction transaction = SavingsAccountTransaction.deposit(this, office(), transactionDTO.getPaymentDetail(),
transactionDTO.getTransactionDate(), amount, transactionDTO.getCreatedDate(), transactionDTO.getAppUser(),
savingsAccountTransactionType);
this.transactions.add(transaction);
addTransaction(transaction);
this.summary.updateSummary(this.currency, this.savingsAccountTransactionSummaryWrapper, this.transactions);
if(this.sub_status.equals(SavingsAccountSubStatusEnum.INACTIVE.getValue())
@@ -990,8 +990,7 @@ public class SavingsAccount extends AbstractPersistable<Long> {
final SavingsAccountTransaction transaction = SavingsAccountTransaction.withdrawal(this, office(),
transactionDTO.getPaymentDetail(), transactionDTO.getTransactionDate(), transactionAmountMoney,
transactionDTO.getCreatedDate(), transactionDTO.getAppUser());
this.transactions.add(transaction);
addTransaction(transaction);
if (applyWithdrawFee) {
// auto pay withdrawal fee
payWithdrawalFee(transactionDTO.getTransactionAmount(), transactionDTO.getTransactionDate(), transactionDTO.getAppUser());
@@ -1410,7 +1409,8 @@ public class SavingsAccount extends AbstractPersistable<Long> {
accountingBridgeData.put("isAccountTransfer", isAccountTransfer);
final List<Map<String, Object>> newSavingsTransactions = new ArrayList<>();
for (final SavingsAccountTransaction transaction : this.transactions) {
List<SavingsAccountTransaction> trans = getTransactions() ;
for (final SavingsAccountTransaction transaction : trans) {
if (transaction.isReversed() && !existingReversedTransactionIds.contains(transaction.getId())) {
newSavingsTransactions.add(transaction.toMapData(currencyData));
} else if (!existingTransactionIds.contains(transaction.getId())) {
@@ -1425,8 +1425,8 @@ public class SavingsAccount extends AbstractPersistable<Long> {
public Collection<Long> findExistingTransactionIds() {
final Collection<Long> ids = new ArrayList<>();
for (final SavingsAccountTransaction transaction : this.transactions) {
List<SavingsAccountTransaction> trans = getTransactions() ;
for (final SavingsAccountTransaction transaction : trans) {
ids.add(transaction.getId());
}
@@ -1436,8 +1436,8 @@ public class SavingsAccount extends AbstractPersistable<Long> {
public Collection<Long> findExistingReversedTransactionIds() {
final Collection<Long> ids = new ArrayList<>();
for (final SavingsAccountTransaction transaction : this.transactions) {
List<SavingsAccountTransaction> trans = getTransactions() ;
for (final SavingsAccountTransaction transaction : trans) {
if (transaction.isReversed()) {
ids.add(transaction.getId());
}
@@ -2266,9 +2266,19 @@ public class SavingsAccount extends AbstractPersistable<Long> {
}
public List<SavingsAccountTransaction> getTransactions() {
return this.transactions;
if(this.orderedTransactions == null || isTransactionsDirty) {
this.orderedTransactions = new ArrayList<>(this.transactions) ;
this.orderedTransactions.sort(new SavingsAccountTransactionComparator());
this.isTransactionsDirty = false ;
}
return orderedTransactions;
}
public void addTransaction(final SavingsAccountTransaction transaction) {
this.transactions.add(transaction);
this.isTransactionsDirty = true ;
}
public void setStatus(final Integer status) {
this.status = status;
}
@@ -2555,7 +2565,7 @@ public class SavingsAccount extends AbstractPersistable<Long> {
final SavingsAccountChargePaidBy chargePaidBy = SavingsAccountChargePaidBy.instance(transaction, savingsAccountCharge, transaction
.getAmount(this.getCurrency()).getAmount());
transaction.getSavingsAccountChargesPaid().add(chargePaidBy);
this.getTransactions().add(transaction);
this.transactions.add(transaction);
}
private SavingsAccountCharge getCharge(final Long savingsAccountChargeId) {
@@ -2573,7 +2583,7 @@ public class SavingsAccount extends AbstractPersistable<Long> {
}
public Set<SavingsAccountCharge> charges() {
return (this.charges == null) ? new HashSet<SavingsAccountCharge>() : this.charges;
return (this.charges == null) ? new HashSet<>() : this.charges;
}
public void validateAccountValuesWithProduct() {
@@ -27,7 +27,6 @@ import static org.apache.fineract.portfolio.savings.SavingsApiConstants.localePa
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -709,7 +708,7 @@ public class SavingsAccountCharge extends AbstractPersistable<Long> {
public int hashCode() {
return new HashCodeBuilder(3, 5) //
.append(getId()) //
.append(this.charge.getId()) //
//.append(this.charge.getId()) //
.append(this.amount).append(getDueLocalDate()) //
.toHashCode();
}
@@ -21,6 +21,7 @@ package org.apache.fineract.portfolio.savings.domain;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Embeddable;
@@ -90,7 +91,7 @@ public final class SavingsAccountSummary {
}
public void updateSummary(final MonetaryCurrency currency, final SavingsAccountTransactionSummaryWrapper wrapper,
final List<SavingsAccountTransaction> transactions) {
final Set<SavingsAccountTransaction> transactions) {
this.totalDeposits = wrapper.calculateTotalDeposits(currency, transactions);
this.totalWithdrawals = wrapper.calculateTotalWithdrawals(currency, transactions);
@@ -31,6 +31,7 @@ import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
@@ -50,8 +51,6 @@ import org.apache.fineract.portfolio.savings.domain.interest.EndOfDayBalance;
import org.apache.fineract.portfolio.savings.service.SavingsEnumerations;
import org.apache.fineract.portfolio.tax.domain.TaxComponent;
import org.apache.fineract.useradministration.domain.AppUser;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.joda.time.LocalDate;
import org.springframework.data.jpa.domain.AbstractPersistable;
import org.springframework.util.CollectionUtils;
@@ -102,8 +101,7 @@ public final class SavingsAccountTransaction extends AbstractPersistable<Long> {
@Column(name = "balance_number_of_days_derived", nullable = false)
private Integer balanceNumberOfDays;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "savingsAccountTransaction", orphanRemoval = true)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "savingsAccountTransaction", orphanRemoval = true, fetch=FetchType.EAGER)
private final Set<SavingsAccountChargePaidBy> savingsAccountChargesPaid = new HashSet<>();
@Column(name = "overdraft_amount_derived", scale = 6, precision = 19, nullable = true)
@@ -117,8 +115,7 @@ public final class SavingsAccountTransaction extends AbstractPersistable<Long> {
@JoinColumn(name = "appuser_id", nullable = true)
private AppUser appUser;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch=FetchType.EAGER)
@JoinColumn(name = "savings_transaction_id", referencedColumnName = "id", nullable = false)
private final List<SavingsAccountTransactionTaxDetails> taxDetails = new ArrayList<>();
@@ -19,7 +19,7 @@
package org.apache.fineract.portfolio.savings.domain;
import java.math.BigDecimal;
import java.util.List;
import java.util.Set;
import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency;
import org.apache.fineract.organisation.monetary.domain.Money;
@@ -32,7 +32,7 @@ import org.springframework.stereotype.Component;
@Component
public final class SavingsAccountTransactionSummaryWrapper {
public BigDecimal calculateTotalDeposits(final MonetaryCurrency currency, final List<SavingsAccountTransaction> transactions) {
public BigDecimal calculateTotalDeposits(final MonetaryCurrency currency, final Set<SavingsAccountTransaction> transactions) {
Money total = Money.zero(currency);
for (final SavingsAccountTransaction transaction : transactions) {
if (transaction.isDepositAndNotReversed() || transaction.isDividendPayoutAndNotReversed()) {
@@ -42,7 +42,7 @@ public final class SavingsAccountTransactionSummaryWrapper {
return total.getAmountDefaultedToNullIfZero();
}
public BigDecimal calculateTotalWithdrawals(final MonetaryCurrency currency, final List<SavingsAccountTransaction> transactions) {
public BigDecimal calculateTotalWithdrawals(final MonetaryCurrency currency, final Set<SavingsAccountTransaction> transactions) {
Money total = Money.zero(currency);
for (final SavingsAccountTransaction transaction : transactions) {
if (transaction.isWithdrawal() && transaction.isNotReversed()) {
@@ -52,7 +52,7 @@ public final class SavingsAccountTransactionSummaryWrapper {
return total.getAmountDefaultedToNullIfZero();
}
public BigDecimal calculateTotalInterestPosted(final MonetaryCurrency currency, final List<SavingsAccountTransaction> transactions) {
public BigDecimal calculateTotalInterestPosted(final MonetaryCurrency currency, final Set<SavingsAccountTransaction> transactions) {
Money total = Money.zero(currency);
for (final SavingsAccountTransaction transaction : transactions) {
if (transaction.isInterestPostingAndNotReversed() && transaction.isNotReversed()) {
@@ -62,7 +62,7 @@ public final class SavingsAccountTransactionSummaryWrapper {
return total.getAmountDefaultedToNullIfZero();
}
public BigDecimal calculateTotalWithdrawalFees(final MonetaryCurrency currency, final List<SavingsAccountTransaction> transactions) {
public BigDecimal calculateTotalWithdrawalFees(final MonetaryCurrency currency, final Set<SavingsAccountTransaction> transactions) {
Money total = Money.zero(currency);
for (final SavingsAccountTransaction transaction : transactions) {
if (transaction.isWithdrawalFeeAndNotReversed() && transaction.isNotReversed()) {
@@ -72,7 +72,7 @@ public final class SavingsAccountTransactionSummaryWrapper {
return total.getAmountDefaultedToNullIfZero();
}
public BigDecimal calculateTotalAnnualFees(final MonetaryCurrency currency, final List<SavingsAccountTransaction> transactions) {
public BigDecimal calculateTotalAnnualFees(final MonetaryCurrency currency, final Set<SavingsAccountTransaction> transactions) {
Money total = Money.zero(currency);
for (final SavingsAccountTransaction transaction : transactions) {
if (transaction.isAnnualFeeAndNotReversed() && transaction.isNotReversed()) {
@@ -82,7 +82,7 @@ public final class SavingsAccountTransactionSummaryWrapper {
return total.getAmountDefaultedToNullIfZero();
}
public BigDecimal calculateTotalFeesCharge(final MonetaryCurrency currency, final List<SavingsAccountTransaction> transactions) {
public BigDecimal calculateTotalFeesCharge(final MonetaryCurrency currency, final Set<SavingsAccountTransaction> transactions) {
Money total = Money.zero(currency);
for (final SavingsAccountTransaction transaction : transactions) {
if (transaction.isFeeChargeAndNotReversed()) {
@@ -92,7 +92,7 @@ public final class SavingsAccountTransactionSummaryWrapper {
return total.getAmountDefaultedToNullIfZero();
}
public BigDecimal calculateTotalFeesChargeWaived(final MonetaryCurrency currency, final List<SavingsAccountTransaction> transactions) {
public BigDecimal calculateTotalFeesChargeWaived(final MonetaryCurrency currency, final Set<SavingsAccountTransaction> transactions) {
Money total = Money.zero(currency);
for (final SavingsAccountTransaction transaction : transactions) {
if (transaction.isWaiveFeeChargeAndNotReversed()) {
@@ -102,7 +102,7 @@ public final class SavingsAccountTransactionSummaryWrapper {
return total.getAmountDefaultedToNullIfZero();
}
public BigDecimal calculateTotalPenaltyCharge(final MonetaryCurrency currency, final List<SavingsAccountTransaction> transactions) {
public BigDecimal calculateTotalPenaltyCharge(final MonetaryCurrency currency, final Set<SavingsAccountTransaction> transactions) {
Money total = Money.zero(currency);
for (final SavingsAccountTransaction transaction : transactions) {
if (transaction.isPenaltyChargeAndNotReversed()) {
@@ -112,7 +112,7 @@ public final class SavingsAccountTransactionSummaryWrapper {
return total.getAmountDefaultedToNullIfZero();
}
public BigDecimal calculateTotalPenaltyChargeWaived(final MonetaryCurrency currency, final List<SavingsAccountTransaction> transactions) {
public BigDecimal calculateTotalPenaltyChargeWaived(final MonetaryCurrency currency, final Set<SavingsAccountTransaction> transactions) {
Money total = Money.zero(currency);
for (final SavingsAccountTransaction transaction : transactions) {
if (transaction.isWaivePenaltyChargeAndNotReversed()) {
@@ -122,7 +122,7 @@ public final class SavingsAccountTransactionSummaryWrapper {
return total.getAmountDefaultedToNullIfZero();
}
public BigDecimal calculateTotalOverdraftInterest(MonetaryCurrency currency, List<SavingsAccountTransaction> transactions) {
public BigDecimal calculateTotalOverdraftInterest(MonetaryCurrency currency, Set<SavingsAccountTransaction> transactions) {
Money total = Money.zero(currency);
for (final SavingsAccountTransaction transaction : transactions) {
if (transaction.isOverdraftInterestAndNotReversed()) {
@@ -131,7 +131,7 @@ public final class SavingsAccountTransactionSummaryWrapper {
}
return total.getAmountDefaultedToNullIfZero();
}
public BigDecimal calculateTotalWithholdTaxWithdrawal(MonetaryCurrency currency, List<SavingsAccountTransaction> transactions) {
public BigDecimal calculateTotalWithholdTaxWithdrawal(MonetaryCurrency currency, Set<SavingsAccountTransaction> transactions) {
Money total = Money.zero(currency);
for (final SavingsAccountTransaction transaction : transactions) {
if (transaction.isWithHoldTaxAndNotReversed()) {
@@ -918,7 +918,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
final SavingsAccountTransaction newTransferTransaction = SavingsAccountTransaction.initiateTransfer(savingsAccount,
savingsAccount.office(), transferDate, user);
savingsAccount.getTransactions().add(newTransferTransaction);
savingsAccount.addTransaction(newTransferTransaction);
savingsAccount.setStatus(SavingsAccountStatusType.TRANSFER_IN_PROGRESS.getValue());
final MathContext mc = MathContext.DECIMAL64;
boolean isInterestTransfer = false;
@@ -951,7 +951,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
final SavingsAccountTransaction withdrawtransferTransaction = SavingsAccountTransaction.withdrawTransfer(savingsAccount,
savingsAccount.office(), transferDate, user);
savingsAccount.getTransactions().add(withdrawtransferTransaction);
savingsAccount.addTransaction(withdrawtransferTransaction);
savingsAccount.setStatus(SavingsAccountStatusType.ACTIVE.getValue());
final MathContext mc = MathContext.DECIMAL64;
boolean isInterestTransfer = false;
@@ -991,7 +991,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo
final SavingsAccountTransaction acceptTransferTransaction = SavingsAccountTransaction.approveTransfer(savingsAccount,
acceptedInOffice, transferDate, user);
savingsAccount.getTransactions().add(acceptTransferTransaction);
savingsAccount.addTransaction(acceptTransferTransaction);
savingsAccount.setStatus(SavingsAccountStatusType.ACTIVE.getValue());
if (fieldOfficer != null) {
savingsAccount.reassignSavingsOfficer(fieldOfficer, transferDate);
@@ -18,6 +18,25 @@
*/
package org.apache.fineract.portfolio.savings.service;
import static org.apache.fineract.portfolio.savings.SavingsApiConstants.SAVINGS_ACCOUNT_CHARGE_RESOURCE_NAME;
import static org.apache.fineract.portfolio.savings.SavingsApiConstants.SAVINGS_ACCOUNT_RESOURCE_NAME;
import static org.apache.fineract.portfolio.savings.SavingsApiConstants.amountParamName;
import static org.apache.fineract.portfolio.savings.SavingsApiConstants.chargeIdParamName;
import static org.apache.fineract.portfolio.savings.SavingsApiConstants.dueAsOfDateParamName;
import static org.apache.fineract.portfolio.savings.SavingsApiConstants.withHoldTaxParamName;
import static org.apache.fineract.portfolio.savings.SavingsApiConstants.withdrawBalanceParamName;
import java.math.BigDecimal;
import java.math.MathContext;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.apache.fineract.accounting.journalentry.service.JournalEntryWritePlatformService;
import org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService;
@@ -88,25 +107,6 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.math.MathContext;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import static org.apache.fineract.portfolio.savings.SavingsApiConstants.SAVINGS_ACCOUNT_CHARGE_RESOURCE_NAME;
import static org.apache.fineract.portfolio.savings.SavingsApiConstants.SAVINGS_ACCOUNT_RESOURCE_NAME;
import static org.apache.fineract.portfolio.savings.SavingsApiConstants.amountParamName;
import static org.apache.fineract.portfolio.savings.SavingsApiConstants.chargeIdParamName;
import static org.apache.fineract.portfolio.savings.SavingsApiConstants.dueAsOfDateParamName;
import static org.apache.fineract.portfolio.savings.SavingsApiConstants.withdrawBalanceParamName;
import static org.apache.fineract.portfolio.savings.SavingsApiConstants.withHoldTaxParamName;
@Service
public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements SavingsAccountWritePlatformService {
@@ -673,7 +673,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
final SavingsAccountTransaction newTransferTransaction = SavingsAccountTransaction.initiateTransfer(savingsAccount,
savingsAccount.office(), transferDate, user);
savingsAccount.getTransactions().add(newTransferTransaction);
savingsAccount.addTransaction(newTransferTransaction);
savingsAccount.setStatus(SavingsAccountStatusType.TRANSFER_IN_PROGRESS.getValue());
final MathContext mc = MathContext.DECIMAL64;
boolean isInterestTransfer = false;
@@ -705,7 +705,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
final SavingsAccountTransaction withdrawtransferTransaction = SavingsAccountTransaction.withdrawTransfer(savingsAccount,
savingsAccount.office(), transferDate, user);
savingsAccount.getTransactions().add(withdrawtransferTransaction);
savingsAccount.addTransaction(withdrawtransferTransaction);
savingsAccount.setStatus(SavingsAccountStatusType.ACTIVE.getValue());
final MathContext mc = MathContext.DECIMAL64;
boolean isInterestTransfer = false;
@@ -745,7 +745,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi
final SavingsAccountTransaction acceptTransferTransaction = SavingsAccountTransaction.approveTransfer(savingsAccount,
acceptedInOffice, transferDate, user);
savingsAccount.getTransactions().add(acceptTransferTransaction);
savingsAccount.addTransaction(acceptTransferTransaction);
savingsAccount.setStatus(SavingsAccountStatusType.ACTIVE.getValue());
if (fieldOfficer != null) {
savingsAccount.reassignSavingsOfficer(fieldOfficer, transferDate);
@@ -28,6 +28,7 @@ import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
@@ -44,8 +45,6 @@ import org.apache.fineract.portfolio.common.domain.PeriodFrequencyType;
import org.apache.fineract.portfolio.savings.domain.SavingsAccount;
import org.apache.fineract.portfolio.shareproducts.domain.ShareProduct;
import org.apache.fineract.useradministration.domain.AppUser;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.springframework.data.jpa.domain.AbstractPersistable;
@Entity
@@ -133,8 +132,7 @@ public class ShareAccount extends AbstractPersistable<Long> {
@JoinColumn(name = "savings_account_id", nullable = true)
private SavingsAccount savingsAccount;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "shareAccount", orphanRemoval = true)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "shareAccount", orphanRemoval = true, fetch=FetchType.EAGER)
private Set<ShareAccountTransaction> shareAccountTransactions;
@Column(name = "lockin_period_frequency")
@@ -151,8 +149,7 @@ public class ShareAccount extends AbstractPersistable<Long> {
@Column(name = "minimum_active_period_frequency_enum", nullable = true)
private PeriodFrequencyType minimumActivePeriodFrequencyType;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "shareAccount", orphanRemoval = true)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "shareAccount", orphanRemoval = true, fetch=FetchType.EAGER)
private Set<ShareAccountCharge> charges;
@Transient
@@ -26,6 +26,7 @@ import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
@@ -33,8 +34,6 @@ import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.springframework.data.jpa.domain.AbstractPersistable;
@Entity
@@ -73,8 +72,7 @@ public class ShareAccountTransaction extends AbstractPersistable<Long> {
@Column(name = "is_active", nullable = false)
private boolean active = true ;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "shareAccountTransaction", orphanRemoval = true)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "shareAccountTransaction", orphanRemoval = true, fetch=FetchType.EAGER)
private final Set<ShareAccountChargePaidBy> shareAccountChargesPaid = new HashSet<>();
protected ShareAccountTransaction() {
@@ -46,8 +46,6 @@ import org.apache.fineract.portfolio.charge.domain.Charge;
import org.apache.fineract.portfolio.common.domain.PeriodFrequencyType;
import org.apache.fineract.portfolio.shareproducts.data.ShareProductMarketPriceData;
import org.apache.fineract.useradministration.domain.AppUser;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.joda.time.DateTime;
@Entity
@@ -102,8 +100,7 @@ public class ShareProduct extends AbstractAuditableCustom<AppUser, Long> {
private Long maximumShares;
@OrderBy(value = "fromDate,id")
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "product", orphanRemoval = true)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "product", orphanRemoval = true, fetch=FetchType.EAGER)
Set<ShareProductMarketPrice> marketPrice;
@ManyToMany(fetch = FetchType.EAGER)
@@ -26,6 +26,7 @@ import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@@ -35,8 +36,6 @@ import javax.persistence.TemporalType;
import org.apache.fineract.infrastructure.core.domain.AbstractAuditableCustom;
import org.apache.fineract.portfolio.shareaccounts.domain.ShareAccountDividendDetails;
import org.apache.fineract.useradministration.domain.AppUser;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.joda.time.LocalDate;
@Entity
@@ -60,8 +59,7 @@ public class ShareProductDividendPayOutDetails extends AbstractAuditableCustom<A
@Column(name = "status", nullable = false)
private Integer status;
@LazyCollection(LazyCollectionOption.TRUE)
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch=FetchType.EAGER)
@JoinColumn(name = "dividend_pay_out_id", referencedColumnName = "id", nullable = false)
private List<ShareAccountDividendDetails> accountDividendDetails = new ArrayList<>();
@@ -23,12 +23,15 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
@@ -44,8 +47,6 @@ import org.apache.fineract.infrastructure.core.domain.AbstractAuditableCustom;
import org.apache.fineract.infrastructure.core.service.DateUtils;
import org.apache.fineract.portfolio.tax.api.TaxApiConstants;
import org.apache.fineract.useradministration.domain.AppUser;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.joda.time.LocalDate;
@Entity
@@ -76,14 +77,12 @@ public class TaxComponent extends AbstractAuditableCustom<AppUser, Long> {
@Temporal(TemporalType.DATE)
private Date startDate;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch=FetchType.EAGER)
@JoinColumn(name = "tax_component_id", referencedColumnName = "id", nullable = false)
private List<TaxComponentHistory> taxComponentHistories = new ArrayList<>();
private Set<TaxComponentHistory> taxComponentHistories = new HashSet<>();
@LazyCollection(LazyCollectionOption.TRUE)
@OneToMany(cascade = CascadeType.DETACH, mappedBy = "taxComponent", orphanRemoval = false)
private List<TaxGroupMappings> taxGroupMappings = new ArrayList<>();
@OneToMany(cascade = CascadeType.DETACH, mappedBy = "taxComponent", orphanRemoval = false, fetch=FetchType.EAGER)
private Set<TaxGroupMappings> taxGroupMappings = new HashSet<>();
protected TaxComponent() {
@@ -182,11 +181,11 @@ public class TaxComponent extends AbstractAuditableCustom<AppUser, Long> {
return target != null && target.isAfter(startDate());
}
public List<TaxComponentHistory> getTaxComponentHistories() {
public Set<TaxComponentHistory> getTaxComponentHistories() {
return this.taxComponentHistories;
}
public List<TaxGroupMappings> getTaxGroupMappings() {
public Set<TaxGroupMappings> getTaxGroupMappings() {
return this.taxGroupMappings;
}
@@ -20,12 +20,15 @@ package org.apache.fineract.portfolio.tax.domain;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@@ -36,8 +39,6 @@ import org.apache.fineract.infrastructure.core.domain.AbstractAuditableCustom;
import org.apache.fineract.portfolio.tax.api.TaxApiConstants;
import org.apache.fineract.portfolio.tax.exception.TaxMappingNotFoundException;
import org.apache.fineract.useradministration.domain.AppUser;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
@Entity
@Table(name = "m_tax_group")
@@ -46,25 +47,24 @@ public class TaxGroup extends AbstractAuditableCustom<AppUser, Long> {
@Column(name = "name", length = 100)
private String name;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch=FetchType.EAGER)
@JoinColumn(name = "tax_group_id", referencedColumnName = "id", nullable = false)
private List<TaxGroupMappings> taxGroupMappings = new ArrayList<>();
private Set<TaxGroupMappings> taxGroupMappings = new HashSet<>();
protected TaxGroup() {
}
private TaxGroup(final String name, final List<TaxGroupMappings> taxGroupMappings) {
private TaxGroup(final String name, final Set<TaxGroupMappings> taxGroupMappings) {
this.name = name;
this.taxGroupMappings = taxGroupMappings;
}
public static TaxGroup createTaxGroup(final String name, final List<TaxGroupMappings> taxGroupMappings) {
public static TaxGroup createTaxGroup(final String name, final Set<TaxGroupMappings> taxGroupMappings) {
return new TaxGroup(name, taxGroupMappings);
}
public Map<String, Object> update(final JsonCommand command, final List<TaxGroupMappings> taxGroupMappings) {
public Map<String, Object> update(final JsonCommand command, final Set<TaxGroupMappings> taxGroupMappings) {
final Map<String, Object> changes = new HashMap<>();
if (command.isChangeInStringParameterNamed(TaxApiConstants.nameParamName, this.name)) {
@@ -106,7 +106,7 @@ public class TaxGroup extends AbstractAuditableCustom<AppUser, Long> {
return null;
}
public List<TaxGroupMappings> getTaxGroupMappings() {
public Set<TaxGroupMappings> getTaxGroupMappings() {
return this.taxGroupMappings;
}
@@ -266,7 +266,7 @@ public class TaxValidator {
throwExceptionIfValidationWarningsExist(dataValidationErrors);
}
public void validateTaxGroupEndDateAndTaxComponent(final TaxGroup taxGroup, final List<TaxGroupMappings> groupMappings) {
public void validateTaxGroupEndDateAndTaxComponent(final TaxGroup taxGroup, final Set<TaxGroupMappings> groupMappings) {
final List<ApiParameterError> dataValidationErrors = new ArrayList<>();
final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("tax.group");
@@ -293,7 +293,7 @@ public class TaxValidator {
public void validateTaxGroup(final TaxGroup taxGroup) {
final List<ApiParameterError> dataValidationErrors = new ArrayList<>();
final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("tax.group");
List<TaxGroupMappings> groupMappings = taxGroup.getTaxGroupMappings();
Set<TaxGroupMappings> groupMappings = taxGroup.getTaxGroupMappings();
validateGroupTotal(groupMappings, baseDataValidator, "total.percentage");
validateOverlappingComponents(groupMappings, baseDataValidator);
throwExceptionIfValidationWarningsExist(dataValidationErrors);
@@ -318,7 +318,7 @@ public class TaxValidator {
baseDataValidator.reset().parameter(TaxApiConstants.startDateParamName).value(startDate).validateDateAfter(existingStartDate);
}
private void validateOverlappingComponents(final List<TaxGroupMappings> taxMappings, final DataValidatorBuilder baseDataValidator) {
private void validateOverlappingComponents(final Set<TaxGroupMappings> taxMappings, final DataValidatorBuilder baseDataValidator) {
for (TaxGroupMappings groupMappingsOne : taxMappings) {
final List<TaxGroupMappings> mappings = new ArrayList<>(taxMappings);
mappings.remove(groupMappingsOne);
@@ -338,7 +338,7 @@ public class TaxValidator {
}
}
private void validateGroupTotal(final List<TaxGroupMappings> taxMappings, final DataValidatorBuilder baseDataValidator,
private void validateGroupTotal(final Set<TaxGroupMappings> taxMappings, final DataValidatorBuilder baseDataValidator,
final String paramenter) {
for (TaxGroupMappings groupMappingsOne : taxMappings) {
Collection<LocalDate> dates = groupMappingsOne.getTaxComponent().allStartDates();
@@ -20,8 +20,10 @@ package org.apache.fineract.portfolio.tax.service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import org.apache.fineract.accounting.glaccount.domain.GLAccount;
import org.apache.fineract.accounting.glaccount.domain.GLAccountRepositoryWrapper;
@@ -114,12 +116,12 @@ public class TaxAssembler {
final String name = this.fromApiJsonHelper.extractStringNamed(TaxApiConstants.nameParamName, element);
boolean isUpdate = false;
final List<TaxGroupMappings> groupMappings = assembleTaxGroupMappingsFrom(command, isUpdate);
final Set<TaxGroupMappings> groupMappings = assembleTaxGroupMappingsFrom(command, isUpdate);
return TaxGroup.createTaxGroup(name, groupMappings);
}
public List<TaxGroupMappings> assembleTaxGroupMappingsFrom(final JsonCommand command, boolean isUpdate) {
List<TaxGroupMappings> groupMappings = new ArrayList<>();
public Set<TaxGroupMappings> assembleTaxGroupMappingsFrom(final JsonCommand command, boolean isUpdate) {
Set<TaxGroupMappings> groupMappings = new HashSet<>();
final JsonElement element = command.parsedJson();
final JsonObject topLevelJsonElement = element.getAsJsonObject();
@@ -22,6 +22,7 @@ import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.fineract.organisation.monetary.domain.MoneyHelper;
import org.apache.fineract.portfolio.tax.domain.TaxComponent;
@@ -31,7 +32,7 @@ import org.joda.time.LocalDate;
public class TaxUtils {
public static Map<TaxComponent, BigDecimal> splitTax(final BigDecimal amount, final LocalDate date,
final List<TaxGroupMappings> taxGroupMappings, final int scale) {
final Set<TaxGroupMappings> taxGroupMappings, final int scale) {
Map<TaxComponent, BigDecimal> map = new HashMap<>(3);
if (amount != null) {
final double amountVal = amount.doubleValue();
@@ -51,7 +52,7 @@ public class TaxUtils {
return map;
}
public static BigDecimal incomeAmount(final BigDecimal amount, final LocalDate date, final List<TaxGroupMappings> taxGroupMappings,
public static BigDecimal incomeAmount(final BigDecimal amount, final LocalDate date, final Set<TaxGroupMappings> taxGroupMappings,
final int scale) {
Map<TaxComponent, BigDecimal> map = splitTax(amount, date, taxGroupMappings, scale);
return incomeAmount(amount, map);
@@ -18,8 +18,8 @@
*/
package org.apache.fineract.portfolio.tax.service;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.fineract.infrastructure.core.api.JsonCommand;
import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
@@ -98,7 +98,7 @@ public class TaxWritePlatformServiceImpl implements TaxWritePlatformService {
this.validator.validateForTaxGroupUpdate(command.json());
final TaxGroup taxGroup = this.taxGroupRepositoryWrapper.findOneWithNotFoundDetection(id);
final boolean isUpdate = true;
List<TaxGroupMappings> groupMappings = this.taxAssembler.assembleTaxGroupMappingsFrom(command, isUpdate);
Set<TaxGroupMappings> groupMappings = this.taxAssembler.assembleTaxGroupMappingsFrom(command, isUpdate);
this.validator.validateTaxGroupEndDateAndTaxComponent(taxGroup, groupMappings);
Map<String, Object> changes = taxGroup.update(command, groupMappings);
this.validator.validateTaxGroup(taxGroup);
@@ -52,8 +52,6 @@ import org.apache.fineract.organisation.office.domain.Office;
import org.apache.fineract.organisation.staff.domain.Staff;
import org.apache.fineract.portfolio.client.domain.Client;
import org.apache.fineract.useradministration.service.AppUserConstants;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.jpa.domain.AbstractPersistable;
@@ -122,8 +120,7 @@ public class AppUser extends AbstractPersistable<Long> implements PlatformUser {
@Column(name = "is_self_service_user", nullable = false)
private boolean isSelfServiceUser;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch=FetchType.EAGER)
@JoinColumn(name = "appuser_id", referencedColumnName= "id", nullable = false)
private Set<AppUserClientMapping> appUserClientMappings = new HashSet<>();
@@ -18,7 +18,7 @@
*/
package org.apache.fineract.portfolio.loanaccount;
import java.util.List;
import java.util.Set;
import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency;
import org.apache.fineract.organisation.monetary.domain.Money;
@@ -49,7 +49,7 @@ public class LoanRepaymentScheduleInstallmentBuilder {
}
public LoanRepaymentScheduleInstallment build() {
final List<LoanInterestRecalcualtionAdditionalDetails> compoundingDetails = null;
final Set<LoanInterestRecalcualtionAdditionalDetails> compoundingDetails = null;
final LoanRepaymentScheduleInstallment installment = new LoanRepaymentScheduleInstallment(this.loan, this.installmentNumber,
this.fromDate, this.dueDate, this.principal.getAmount(), this.interest.getAmount(), this.feeCharges.getAmount(),
this.penaltyCharges.getAmount(), this.recalculatedInterestComponent, compoundingDetails);