Merge branch 'Remove_HibernateAnnotations' into develop
This commit is contained in:
+1
@@ -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);
|
||||
|
||||
+5
-6
@@ -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 ;
|
||||
|
||||
+2
-5
@@ -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);
|
||||
|
||||
+2
-4
@@ -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)
|
||||
|
||||
+2
-4
@@ -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) {
|
||||
|
||||
+4
-6
@@ -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)
|
||||
|
||||
+2
-4
@@ -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) {
|
||||
|
||||
+3
-6
@@ -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() {
|
||||
|
||||
+1
-4
@@ -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)
|
||||
|
||||
+1
-4
@@ -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;
|
||||
|
||||
|
||||
+2
-4
@@ -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
|
||||
|
||||
+2
-4
@@ -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)
|
||||
|
||||
-1
@@ -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;
|
||||
|
||||
|
||||
+197
-160
File diff suppressed because it is too large
Load Diff
+5
-5
@@ -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;
|
||||
|
||||
+1
-4
@@ -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)
|
||||
|
||||
+7
-9
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+4
-7
@@ -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() {
|
||||
|
||||
+2
-4
@@ -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() {
|
||||
|
||||
+2
-4
@@ -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() {}
|
||||
|
||||
+2
-2
@@ -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);
|
||||
}
|
||||
|
||||
+2
-2
@@ -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;
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -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();
|
||||
}
|
||||
|
||||
+4
-4
@@ -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;
|
||||
}
|
||||
}
|
||||
+6
-7
@@ -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:
|
||||
|
||||
+4
-3
@@ -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();
|
||||
|
||||
+3
-2
@@ -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());
|
||||
|
||||
+5
-4
@@ -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());
|
||||
|
||||
+1
-1
@@ -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) {
|
||||
|
||||
+1
-1
@@ -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);
|
||||
|
||||
+16
-15
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
+5
-12
@@ -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,
|
||||
|
||||
+1
-1
@@ -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);
|
||||
|
||||
+2
-4
@@ -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() {
|
||||
|
||||
+2
-4
@@ -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() {
|
||||
|
||||
+34
-15
@@ -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 ;
|
||||
}
|
||||
}
|
||||
}
|
||||
+4
@@ -241,4 +241,8 @@ public class RecurringDepositScheduleInstallment extends AbstractAuditableCustom
|
||||
this.depositAmount = newDepositAmount;
|
||||
this.resetDerivedFields();
|
||||
}
|
||||
|
||||
public Integer installmentNumber() {
|
||||
return this.installmentNumber ;
|
||||
}
|
||||
}
|
||||
+50
-40
@@ -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() {
|
||||
|
||||
+1
-2
@@ -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();
|
||||
}
|
||||
|
||||
+2
-1
@@ -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);
|
||||
|
||||
+3
-6
@@ -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<>();
|
||||
|
||||
|
||||
+12
-12
@@ -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()) {
|
||||
|
||||
+3
-3
@@ -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);
|
||||
|
||||
+22
-22
@@ -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);
|
||||
|
||||
+3
-6
@@ -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
|
||||
|
||||
+2
-4
@@ -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() {
|
||||
|
||||
+1
-4
@@ -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)
|
||||
|
||||
+2
-4
@@ -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<>();
|
||||
|
||||
|
||||
+9
-10
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+9
-9
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+4
-4
@@ -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();
|
||||
|
||||
+5
-3
@@ -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();
|
||||
|
||||
+3
-2
@@ -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);
|
||||
|
||||
+2
-2
@@ -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);
|
||||
|
||||
+1
-4
@@ -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<>();
|
||||
|
||||
|
||||
+2
-2
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user