http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountCharge.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountCharge.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountCharge.java index 1c8f85c..2ef69a5 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountCharge.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountCharge.java @@ -42,6 +42,7 @@ import javax.persistence.TemporalType; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.apache.fineract.infrastructure.core.api.JsonCommand; +import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency; import org.apache.fineract.organisation.monetary.domain.Money; import org.apache.fineract.organisation.monetary.domain.MoneyHelper; @@ -51,7 +52,6 @@ import org.apache.fineract.portfolio.charge.domain.ChargeTimeType; import org.apache.fineract.portfolio.charge.exception.SavingsAccountChargeWithoutMandatoryFieldException; import org.joda.time.LocalDate; import org.joda.time.MonthDay; -import org.springframework.data.jpa.domain.AbstractPersistable; /** * @author dv6 @@ -59,7 +59,7 @@ import org.springframework.data.jpa.domain.AbstractPersistable; */ @Entity @Table(name = "m_savings_account_charge") -public class SavingsAccountCharge extends AbstractPersistable<Long> { +public class SavingsAccountCharge extends AbstractPersistableCustom<Long> { @ManyToOne(optional = false) @JoinColumn(name = "savings_account_id", referencedColumnName = "id", nullable = false) @@ -704,15 +704,6 @@ public class SavingsAccountCharge extends AbstractPersistable<Long> { .isEquals(); } - @Override - public int hashCode() { - return new HashCodeBuilder(3, 5) // - .append(getId()) // - //.append(this.charge.getId()) // - .append(this.amount).append(getDueLocalDate()) // - .toHashCode(); - } - public BigDecimal updateWithdralFeeAmount(final BigDecimal transactionAmount) { BigDecimal amountPaybale = BigDecimal.ZERO; if (ChargeCalculationType.fromInt(this.chargeCalculation).isFlat()) {
http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountChargePaidBy.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountChargePaidBy.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountChargePaidBy.java index 0d0bb17..04d6c6b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountChargePaidBy.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountChargePaidBy.java @@ -26,11 +26,11 @@ import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; -import org.springframework.data.jpa.domain.AbstractPersistable; +import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; @Entity @Table(name = "m_savings_account_charge_paid_by") -public class SavingsAccountChargePaidBy extends AbstractPersistable<Long> { +public class SavingsAccountChargePaidBy extends AbstractPersistableCustom<Long> { @ManyToOne @JoinColumn(name = "savings_account_transaction_id", nullable = false) http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountChargeRepository.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountChargeRepository.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountChargeRepository.java index bc0652a..bd9645c 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountChargeRepository.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountChargeRepository.java @@ -31,6 +31,6 @@ public interface SavingsAccountChargeRepository extends JpaRepository<SavingsAcc SavingsAccountCharge findByIdAndSavingsAccountId(Long id, Long savingsAccountId); - @Query("from SavingsAccountCharge sac where sac.dueDate <=:transactionDate and sac.waived = 0 and sac.paid=0 order by sac.dueDate") + @Query("select sac from SavingsAccountCharge sac where sac.dueDate <=:transactionDate and sac.waived = 0 and sac.paid=0 order by sac.dueDate") List<SavingsAccountCharge> findPendingCharges(@Param("transactionDate") Date transactionDate); } http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountRepository.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountRepository.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountRepository.java index 5a28d66..df939f6 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountRepository.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountRepository.java @@ -28,25 +28,25 @@ import org.springframework.data.repository.query.Param; //Use SavingsAccountRepositoryWrapper. public interface SavingsAccountRepository extends JpaRepository<SavingsAccount, Long>, JpaSpecificationExecutor<SavingsAccount> { - @Query("from SavingsAccount s_acc where s_acc.client.id = :clientId") + @Query("select s_acc from SavingsAccount s_acc where s_acc.client.id = :clientId") List<SavingsAccount> findSavingAccountByClientId(@Param("clientId") Long clientId); - @Query("from SavingsAccount s_acc where s_acc.status = :status") + @Query("select s_acc from SavingsAccount s_acc where s_acc.status = :status") List<SavingsAccount> findSavingAccountByStatus(@Param("status") Integer status); - @Query("from SavingsAccount sa where sa.client.id = :clientId and sa.group.id = :groupId") + @Query("select sa from SavingsAccount sa where sa.client.id = :clientId and sa.group.id = :groupId") List<SavingsAccount> findByClientIdAndGroupId(@Param("clientId") Long clientId, @Param("groupId") Long groupId); - @Query("select case when (count (saving) > 0) then true else false end from SavingsAccount saving where saving.client.id = :clientId and saving.status in (100,200,300,303,304)") + @Query("select case when (count (saving) > 0) then 'true' else 'false' end from SavingsAccount saving where saving.client.id = :clientId and saving.status in (100,200,300,303,304)") boolean doNonClosedSavingAccountsExistForClient(@Param("clientId") Long clientId); - @Query("from SavingsAccount sa where sa.client.id is null and sa.group.id = :groupId") + @Query("select sa from SavingsAccount sa where sa.client.id is null and sa.group.id = :groupId") List<SavingsAccount> findByGroupId(@Param("groupId") Long groupId); - @Query("from SavingsAccount sa where sa.id = :accountId and sa.depositType = :depositAccountTypeId") + @Query("select sa from SavingsAccount sa where sa.id = :accountId and sa.depositType = :depositAccountTypeId") SavingsAccount findByIdAndDepositAccountType(@Param("accountId") Long accountId, @Param("depositAccountTypeId") Integer depositAccountTypeId); - @Query("from SavingsAccount sa where sa.accountNumber = :accountNumber and sa.status in (100, 200, 300, 303, 304) ") + @Query("select sa from SavingsAccount sa where sa.accountNumber = :accountNumber and sa.status in (100, 200, 300, 303, 304) ") SavingsAccount findNonClosedAccountByAccountNumber(@Param("accountNumber") String accountNumber); } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransaction.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransaction.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransaction.java index c2f2cf4..166f6ed 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransaction.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransaction.java @@ -39,6 +39,7 @@ import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; +import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; import org.apache.fineract.infrastructure.core.domain.LocalDateInterval; import org.apache.fineract.organisation.monetary.data.CurrencyData; import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency; @@ -52,7 +53,6 @@ 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.joda.time.LocalDate; -import org.springframework.data.jpa.domain.AbstractPersistable; import org.springframework.util.CollectionUtils; /** @@ -61,10 +61,10 @@ import org.springframework.util.CollectionUtils; */ @Entity @Table(name = "m_savings_account_transaction") -public final class SavingsAccountTransaction extends AbstractPersistable<Long> { +public final class SavingsAccountTransaction extends AbstractPersistableCustom<Long> { @ManyToOne(optional = false) - @JoinColumn(name = "savings_account_id", nullable = false) + @JoinColumn(name = "savings_account_id", referencedColumnName="id", nullable = false) private SavingsAccount savingsAccount; @ManyToOne @@ -76,11 +76,11 @@ public final class SavingsAccountTransaction extends AbstractPersistable<Long> { private PaymentDetail paymentDetail; @Column(name = "transaction_type_enum", nullable = false) - private final Integer typeOf; + private Integer typeOf; @Temporal(TemporalType.DATE) @Column(name = "transaction_date", nullable = false) - private final Date dateOf; + private Date dateOf; @Column(name = "amount", scale = 6, precision = 19, nullable = false) private BigDecimal amount; @@ -88,28 +88,28 @@ public final class SavingsAccountTransaction extends AbstractPersistable<Long> { @Column(name = "is_reversed", nullable = false) private boolean reversed; - @Column(name = "running_balance_derived", scale = 6, precision = 19, nullable = false) + @Column(name = "running_balance_derived", scale = 6, precision = 19, nullable = true) private BigDecimal runningBalance; - @Column(name = "cumulative_balance_derived", scale = 6, precision = 19, nullable = false) + @Column(name = "cumulative_balance_derived", scale = 6, precision = 19, nullable = true) private BigDecimal cumulativeBalance; @Temporal(TemporalType.DATE) - @Column(name = "balance_end_date_derived", nullable = false) + @Column(name = "balance_end_date_derived", nullable = true) private Date balanceEndDate; - @Column(name = "balance_number_of_days_derived", nullable = false) + @Column(name = "balance_number_of_days_derived", nullable = true) private Integer balanceNumberOfDays; @OneToMany(cascade = CascadeType.ALL, mappedBy = "savingsAccountTransaction", orphanRemoval = true, fetch=FetchType.EAGER) - private final Set<SavingsAccountChargePaidBy> savingsAccountChargesPaid = new HashSet<>(); + private Set<SavingsAccountChargePaidBy> savingsAccountChargesPaid = new HashSet<>(); @Column(name = "overdraft_amount_derived", scale = 6, precision = 19, nullable = true) private BigDecimal overdraftAmount; @Temporal(TemporalType.TIMESTAMP) @Column(name = "created_date", nullable = false) - private final Date createdDate; + private Date createdDate; @ManyToOne @JoinColumn(name = "appuser_id", nullable = true) @@ -117,7 +117,7 @@ public final class SavingsAccountTransaction extends AbstractPersistable<Long> { @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<>(); + private List<SavingsAccountTransactionTaxDetails> taxDetails = new ArrayList<>(); protected SavingsAccountTransaction() { this.dateOf = null; http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransactionTaxDetails.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransactionTaxDetails.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransactionTaxDetails.java index 4c13b67..38d5878 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransactionTaxDetails.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransactionTaxDetails.java @@ -26,13 +26,13 @@ import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; +import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; import org.apache.fineract.organisation.monetary.domain.Money; import org.apache.fineract.portfolio.tax.domain.TaxComponent; -import org.springframework.data.jpa.domain.AbstractPersistable; @Entity @Table(name = "m_savings_account_transaction_tax_details") -public class SavingsAccountTransactionTaxDetails extends AbstractPersistable<Long> { +public class SavingsAccountTransactionTaxDetails extends AbstractPersistableCustom<Long> { @ManyToOne @JoinColumn(name = "tax_component_id", nullable = false) http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsProduct.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsProduct.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsProduct.java index aadf2ca..ba4b4f7 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsProduct.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsProduct.java @@ -23,6 +23,9 @@ import static org.apache.fineract.portfolio.savings.SavingsApiConstants.accounti import static org.apache.fineract.portfolio.savings.SavingsApiConstants.allowOverdraftParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.chargesParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.currencyCodeParamName; +import static org.apache.fineract.portfolio.savings.SavingsApiConstants.daysToDormancyParamName; +import static org.apache.fineract.portfolio.savings.SavingsApiConstants.daysToEscheatParamName; +import static org.apache.fineract.portfolio.savings.SavingsApiConstants.daysToInactiveParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.descriptionParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.digitsAfterDecimalParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.enforceMinRequiredBalanceParamName; @@ -31,6 +34,7 @@ import static org.apache.fineract.portfolio.savings.SavingsApiConstants.interest import static org.apache.fineract.portfolio.savings.SavingsApiConstants.interestCalculationTypeParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.interestCompoundingPeriodTypeParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.interestPostingPeriodTypeParamName; +import static org.apache.fineract.portfolio.savings.SavingsApiConstants.isDormancyTrackingActiveParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.localeParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.lockinPeriodFrequencyParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.lockinPeriodFrequencyTypeParamName; @@ -43,13 +47,9 @@ import static org.apache.fineract.portfolio.savings.SavingsApiConstants.nominalA import static org.apache.fineract.portfolio.savings.SavingsApiConstants.nominalAnnualInterestRateParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.overdraftLimitParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.shortNameParamName; -import static org.apache.fineract.portfolio.savings.SavingsApiConstants.withdrawalFeeForTransfersParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.taxGroupIdParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.withHoldTaxParamName; -import static org.apache.fineract.portfolio.savings.SavingsApiConstants.isDormancyTrackingActiveParamName; -import static org.apache.fineract.portfolio.savings.SavingsApiConstants.daysToInactiveParamName; -import static org.apache.fineract.portfolio.savings.SavingsApiConstants.daysToDormancyParamName; -import static org.apache.fineract.portfolio.savings.SavingsApiConstants.daysToEscheatParamName; +import static org.apache.fineract.portfolio.savings.SavingsApiConstants.withdrawalFeeForTransfersParamName; import java.math.BigDecimal; import java.util.ArrayList; @@ -78,6 +78,7 @@ import org.apache.fineract.infrastructure.core.api.JsonCommand; 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.domain.AbstractPersistableCustom; import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency; import org.apache.fineract.organisation.monetary.domain.Money; import org.apache.fineract.portfolio.charge.domain.Charge; @@ -89,7 +90,6 @@ import org.apache.fineract.portfolio.savings.SavingsPeriodFrequencyType; import org.apache.fineract.portfolio.savings.SavingsPostingInterestPeriodType; import org.apache.fineract.portfolio.tax.domain.TaxGroup; import org.joda.time.LocalDate; -import org.springframework.data.jpa.domain.AbstractPersistable; import com.google.gson.JsonArray; @@ -99,7 +99,7 @@ import com.google.gson.JsonArray; @Inheritance @DiscriminatorColumn(name = "deposit_type_enum", discriminatorType = DiscriminatorType.INTEGER) @DiscriminatorValue("100") -public class SavingsProduct extends AbstractPersistable<Long> { +public class SavingsProduct extends AbstractPersistableCustom<Long> { @Column(name = "name", nullable = false, unique = true) protected String name; http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountWritePlatformServiceJpaRepositoryImpl.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountWritePlatformServiceJpaRepositoryImpl.java index 5f2834d..51ffb4f 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountWritePlatformServiceJpaRepositoryImpl.java @@ -256,7 +256,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo depositAccountOnHoldTransactions = this.depositAccountOnHoldTransactionRepository.findBySavingsAccountAndReversedFalseOrderByCreatedDateAsc(account); } account.validateAccountBalanceDoesNotBecomeNegative(SavingsAccountTransactionType.PAY_CHARGE.name(),depositAccountOnHoldTransactions); - this.savingAccountRepositoryWrapper.save(account); + this.savingAccountRepositoryWrapper.saveAndFlush(account); } postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); @@ -354,7 +354,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo account.validateAccountBalanceDoesNotBecomeNegative(SavingsAccountTransactionType.PAY_CHARGE.name(),depositAccountOnHoldTransactions); - this.savingAccountRepositoryWrapper.save(account); + this.savingAccountRepositoryWrapper.saveAndFlush(account); } postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); @@ -440,7 +440,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo } private Long saveTransactionToGenerateTransactionId(final SavingsAccountTransaction transaction) { - this.savingsAccountTransactionRepository.save(transaction); + this.savingsAccountTransactionRepository.saveAndFlush(transaction); return transaction.getId(); } @@ -538,7 +538,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo final MathContext mc = new MathContext(10, MoneyHelper.getRoundingMode()); boolean isInterestTransfer = false; account.postInterest(mc, today, isInterestTransfer, isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth); - this.savingAccountRepositoryWrapper.save(account); + this.savingAccountRepositoryWrapper.saveAndFlush(account); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); } @@ -629,6 +629,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo account.updateOverduePayments(overdueUptoDate); + this.savingAccountRepositoryWrapper.saveAndFlush(account); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); return new CommandProcessingResultBuilder() // @@ -725,6 +726,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo final LocalDate overdueUptoDate = DateUtils.getLocalDateOfTenant(); account.updateOverduePayments(overdueUptoDate); + this.savingAccountRepositoryWrapper.saveAndFlush(account); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); return new CommandProcessingResultBuilder() // .withEntityId(newtransactionId) // @@ -926,7 +928,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo financialYearBeginningMonth); this.savingsAccountTransactionRepository.save(newTransferTransaction); - this.savingAccountRepositoryWrapper.save(savingsAccount); + this.savingAccountRepositoryWrapper.saveAndFlush(savingsAccount); postJournalEntries(savingsAccount, existingTransactionIds, existingReversedTransactionIds); @@ -959,7 +961,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo financialYearBeginningMonth); this.savingsAccountTransactionRepository.save(withdrawtransferTransaction); - this.savingAccountRepositoryWrapper.save(savingsAccount); + this.savingAccountRepositoryWrapper.saveAndFlush(savingsAccount); postJournalEntries(savingsAccount, existingTransactionIds, existingReversedTransactionIds); @@ -1002,7 +1004,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo financialYearBeginningMonth); this.savingsAccountTransactionRepository.save(acceptTransferTransaction); - this.savingAccountRepositoryWrapper.save(savingsAccount); + this.savingAccountRepositoryWrapper.saveAndFlush(savingsAccount); postJournalEntries(savingsAccount, existingTransactionIds, existingReversedTransactionIds); @@ -1289,7 +1291,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo account.validateAccountBalanceDoesNotBecomeNegative("." + SavingsAccountTransactionType.PAY_CHARGE.getCode(),depositAccountOnHoldTransactions); - this.savingAccountRepositoryWrapper.save(account); + this.savingAccountRepositoryWrapper.saveAndFlush(account); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); } @@ -1313,7 +1315,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo ((RecurringDepositAccount) account).updateMaturityStatus(isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth); } - + this.savingAccountRepositoryWrapper.saveAndFlush(account) ; postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); } http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl.java index 9dac460..1da6e8f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl.java @@ -30,7 +30,10 @@ import java.util.List; import java.util.Map; import java.util.Set; +import javax.persistence.PersistenceException; + import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.fineract.infrastructure.accountnumberformat.domain.AccountNumberFormat; import org.apache.fineract.infrastructure.accountnumberformat.domain.AccountNumberFormatRepositoryWrapper; import org.apache.fineract.infrastructure.accountnumberformat.domain.EntityAccountType; @@ -88,7 +91,6 @@ import org.apache.fineract.portfolio.savings.domain.SavingsProductRepository; import org.apache.fineract.portfolio.savings.exception.SavingsProductNotFoundException; import org.apache.fineract.useradministration.domain.AppUser; import org.joda.time.LocalDate; -import org.joda.time.LocalTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -160,12 +162,11 @@ public class DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl impl * Guaranteed to throw an exception no matter what the data integrity issue * is. */ - private void handleDataIntegrityIssues(final JsonCommand command, final DataAccessException dve) { + private void handleDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dve) { final StringBuilder errorCodeBuilder = new StringBuilder("error.msg.").append(SavingsApiConstants.SAVINGS_ACCOUNT_RESOURCE_NAME); - final Throwable realCause = dve.getMostSpecificCause(); - if (realCause.getMessage().contains("sa_account_no_UNIQUE")) { + if (realCause.getMessage().contains("'sa_account_no_UNIQUE'")) { final String accountNo = command.stringValueOfParameterNamed("accountNo"); errorCodeBuilder.append(".duplicate.accountNo"); throw new PlatformDataIntegrityException(errorCodeBuilder.toString(), "Savings account with accountNo " + accountNo @@ -235,7 +236,11 @@ public class DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl impl .withSavingsId(savingsId) // .build(); } catch (final DataAccessException dve) { - handleDataIntegrityIssues(command, dve); + handleDataIntegrityIssues(command, dve.getMostSpecificCause(), dve); + return CommandProcessingResult.empty(); + }catch (final PersistenceException dve) { + Throwable throwable = ExceptionUtils.getRootCause(dve.getCause()) ; + handleDataIntegrityIssues(command, throwable, dve); return CommandProcessingResult.empty(); } } @@ -289,7 +294,11 @@ public class DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl impl .withSavingsId(savingsId) // .build(); } catch (final DataAccessException dve) { - handleDataIntegrityIssues(command, dve); + handleDataIntegrityIssues(command, dve.getMostSpecificCause(), dve); + return CommandProcessingResult.empty(); + }catch (final PersistenceException dve) { + Throwable throwable = ExceptionUtils.getRootCause(dve.getCause()) ; + handleDataIntegrityIssues(command, throwable, dve); return CommandProcessingResult.empty(); } } @@ -435,8 +444,12 @@ public class DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl impl .with(changes) // .build(); } catch (final DataAccessException dve) { - handleDataIntegrityIssues(command, dve); + handleDataIntegrityIssues(command, dve.getMostSpecificCause(), dve); return new CommandProcessingResult(Long.valueOf(-1)); + }catch (final PersistenceException dve) { + Throwable throwable = ExceptionUtils.getRootCause(dve.getCause()) ; + handleDataIntegrityIssues(command, throwable, dve); + return new CommandProcessingResult(Long.valueOf(-1)); } } @@ -502,8 +515,12 @@ public class DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl impl .with(changes) // .build(); } catch (final DataAccessException dve) { - handleDataIntegrityIssues(command, dve); + handleDataIntegrityIssues(command, dve.getMostSpecificCause(), dve); return new CommandProcessingResult(Long.valueOf(-1)); + }catch (final PersistenceException dve) { + Throwable throwable = ExceptionUtils.getRootCause(dve.getCause()) ; + handleDataIntegrityIssues(command, throwable, dve); + return new CommandProcessingResult(Long.valueOf(-1)); } } http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/FixedDepositProductWritePlatformServiceJpaRepositoryImpl.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/FixedDepositProductWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/FixedDepositProductWritePlatformServiceJpaRepositoryImpl.java index 3da5ef8..73bbcd5 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/FixedDepositProductWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/FixedDepositProductWritePlatformServiceJpaRepositoryImpl.java @@ -28,6 +28,9 @@ import java.util.List; import java.util.Map; import java.util.Set; +import javax.persistence.PersistenceException; + +import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.fineract.accounting.producttoaccountmapping.service.ProductToGLAccountMappingWritePlatformService; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.ApiParameterError; @@ -98,8 +101,12 @@ public class FixedDepositProductWritePlatformServiceJpaRepositoryImpl implements .withEntityId(product.getId()) // .build(); } catch (final DataAccessException e) { - handleDataIntegrityIssues(command, e); + handleDataIntegrityIssues(command, e.getMostSpecificCause(), e); return CommandProcessingResult.empty(); + }catch (final PersistenceException dve) { + Throwable throwable = ExceptionUtils.getRootCause(dve.getCause()) ; + handleDataIntegrityIssues(command, throwable, dve); + return CommandProcessingResult.empty(); } } @@ -154,8 +161,12 @@ public class FixedDepositProductWritePlatformServiceJpaRepositoryImpl implements .withEntityId(product.getId()) // .with(changes).build(); } catch (final DataAccessException e) { - handleDataIntegrityIssues(command, e); + handleDataIntegrityIssues(command, e.getMostSpecificCause(), e); return CommandProcessingResult.empty(); + }catch (final PersistenceException dve) { + Throwable throwable = ExceptionUtils.getRootCause(dve.getCause()) ; + handleDataIntegrityIssues(command, throwable, dve); + return CommandProcessingResult.empty(); } } @@ -178,9 +189,8 @@ public class FixedDepositProductWritePlatformServiceJpaRepositoryImpl implements * Guaranteed to throw an exception no matter what the data integrity issue * is. */ - private void handleDataIntegrityIssues(final JsonCommand command, final DataAccessException dae) { + private void handleDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dae) { - final Throwable realCause = dae.getMostSpecificCause(); if (realCause.getMessage().contains("sp_unq_name")) { final String name = command.stringValueOfParameterNamed("name"); @@ -198,7 +208,7 @@ public class FixedDepositProductWritePlatformServiceJpaRepositoryImpl implements "Unknown data integrity issue with resource."); } - private void logAsErrorUnexpectedDataIntegrityException(final DataAccessException dae) { + private void logAsErrorUnexpectedDataIntegrityException(final Exception dae) { this.logger.error(dae.getMessage(), dae); } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/RecurringDepositProductWritePlatformServiceJpaRepositoryImpl.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/RecurringDepositProductWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/RecurringDepositProductWritePlatformServiceJpaRepositoryImpl.java index 3309816..66b448d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/RecurringDepositProductWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/RecurringDepositProductWritePlatformServiceJpaRepositoryImpl.java @@ -19,7 +19,6 @@ package org.apache.fineract.portfolio.savings.service; import static org.apache.fineract.portfolio.savings.DepositsApiConstants.RECURRING_DEPOSIT_PRODUCT_RESOURCE_NAME; -import static org.apache.fineract.portfolio.savings.SavingsApiConstants.SAVINGS_PRODUCT_RESOURCE_NAME; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.accountingRuleParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.chargesParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.taxGroupIdParamName; @@ -29,6 +28,9 @@ import java.util.List; import java.util.Map; import java.util.Set; +import javax.persistence.PersistenceException; + +import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.fineract.accounting.producttoaccountmapping.service.ProductToGLAccountMappingWritePlatformService; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.ApiParameterError; @@ -99,8 +101,12 @@ public class RecurringDepositProductWritePlatformServiceJpaRepositoryImpl implem .withEntityId(product.getId()) // .build(); } catch (final DataAccessException e) { - handleDataIntegrityIssues(command, e); + handleDataIntegrityIssues(command, e.getMostSpecificCause(), e); return CommandProcessingResult.empty(); + }catch (final PersistenceException dve) { + Throwable throwable = ExceptionUtils.getRootCause(dve.getCause()) ; + handleDataIntegrityIssues(command, throwable, dve); + return CommandProcessingResult.empty(); } } @@ -155,8 +161,12 @@ public class RecurringDepositProductWritePlatformServiceJpaRepositoryImpl implem .withEntityId(product.getId()) // .with(changes).build(); } catch (final DataAccessException e) { - handleDataIntegrityIssues(command, e); + handleDataIntegrityIssues(command, e.getMostSpecificCause(), e); return CommandProcessingResult.empty(); + }catch (final PersistenceException dve) { + Throwable throwable = ExceptionUtils.getRootCause(dve.getCause()) ; + handleDataIntegrityIssues(command, throwable, dve); + return CommandProcessingResult.empty(); } } @@ -179,9 +189,8 @@ public class RecurringDepositProductWritePlatformServiceJpaRepositoryImpl implem * Guaranteed to throw an exception no matter what the data integrity issue * is. */ - private void handleDataIntegrityIssues(final JsonCommand command, final DataAccessException dae) { + private void handleDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dae) { - final Throwable realCause = dae.getMostSpecificCause(); if (realCause.getMessage().contains("sp_unq_name")) { final String name = command.stringValueOfParameterNamed("name"); @@ -199,7 +208,7 @@ public class RecurringDepositProductWritePlatformServiceJpaRepositoryImpl implem "Unknown data integrity issue with resource."); } - private void logAsErrorUnexpectedDataIntegrityException(final DataAccessException dae) { + private void logAsErrorUnexpectedDataIntegrityException(final Exception dae) { this.logger.error(dae.getMessage(), dae); } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformServiceJpaRepositoryImpl.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformServiceJpaRepositoryImpl.java index 30ce57b..4c1451c 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformServiceJpaRepositoryImpl.java @@ -202,7 +202,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi final DateTimeFormatter fmt = DateTimeFormat.forPattern(command.dateFormat()).withLocale(locale); processPostActiveActions(account, fmt, existingTransactionIds, existingReversedTransactionIds); - this.savingAccountRepositoryWrapper.save(account); + this.savingAccountRepositoryWrapper.saveAndFlush(account); } postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); @@ -280,7 +280,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi } private Long saveTransactionToGenerateTransactionId(final SavingsAccountTransaction transaction) { - this.savingsAccountTransactionRepository.save(transaction); + this.savingsAccountTransactionRepository.saveAndFlush(transaction); return transaction.getId(); } @@ -413,7 +413,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi } } - this.savingAccountRepositoryWrapper.save(account); + this.savingAccountRepositoryWrapper.saveAndFlush(account); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); } @@ -478,6 +478,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi } account.validateAccountBalanceDoesNotBecomeNegative(SavingsApiConstants.undoTransactionAction, depositAccountOnHoldTransactions); account.activateAccountBasedOnBalance(); + this.savingAccountRepositoryWrapper.saveAndFlush(account); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); return new CommandProcessingResultBuilder() // @@ -566,6 +567,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi } account.validateAccountBalanceDoesNotBecomeNegative(SavingsApiConstants.adjustTransactionAction, depositAccountOnHoldTransactions); account.activateAccountBasedOnBalance(); + this.savingAccountRepositoryWrapper.saveAndFlush(account); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); return new CommandProcessingResultBuilder() // .withEntityId(newtransactionId) // @@ -687,7 +689,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi financialYearBeginningMonth); this.savingsAccountTransactionRepository.save(newTransferTransaction); - this.savingAccountRepositoryWrapper.save(savingsAccount); + this.savingAccountRepositoryWrapper.saveAndFlush(savingsAccount); postJournalEntries(savingsAccount, existingTransactionIds, existingReversedTransactionIds); @@ -717,7 +719,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi financialYearBeginningMonth); this.savingsAccountTransactionRepository.save(withdrawtransferTransaction); - this.savingAccountRepositoryWrapper.save(savingsAccount); + this.savingAccountRepositoryWrapper.saveAndFlush(savingsAccount); postJournalEntries(savingsAccount, existingTransactionIds, existingReversedTransactionIds); @@ -758,7 +760,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi financialYearBeginningMonth); this.savingsAccountTransactionRepository.save(acceptTransferTransaction); - this.savingAccountRepositoryWrapper.save(savingsAccount); + this.savingAccountRepositoryWrapper.saveAndFlush(savingsAccount); postJournalEntries(savingsAccount, existingTransactionIds, existingReversedTransactionIds); @@ -815,7 +817,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException(dataValidationErrors); } savingsAccount.addCharge(fmt, savingsAccountCharge, chargeDefinition); - + this.savingsAccountChargeRepository.save(savingsAccountCharge); this.savingAccountRepositoryWrapper.saveAndFlush(savingsAccount); return new CommandProcessingResultBuilder() // @@ -1054,7 +1056,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi account.validateAccountBalanceDoesNotBecomeNegative("." + SavingsAccountTransactionType.PAY_CHARGE.getCode(), depositAccountOnHoldTransactions); - this.savingAccountRepositoryWrapper.save(account); + this.savingAccountRepositoryWrapper.saveAndFlush(account); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); } @@ -1245,7 +1247,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi final Set<Long> existingReversedTransactionIds = new HashSet<>(); updateExistingTransactionsDetails(account, existingTransactionIds, existingReversedTransactionIds); account.setSubStatusInactive(appuserRepository.fetchSystemUser()); - this.savingAccountRepositoryWrapper.save(account); + this.savingAccountRepositoryWrapper.saveAndFlush(account); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); } @@ -1265,7 +1267,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi final Set<Long> existingReversedTransactionIds = new HashSet<>(); updateExistingTransactionsDetails(account, existingTransactionIds, existingReversedTransactionIds); account.escheat(appuserRepository.fetchSystemUser()); - this.savingAccountRepositoryWrapper.save(account); + this.savingAccountRepositoryWrapper.saveAndFlush(account); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); } http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsApplicationProcessWritePlatformServiceJpaRepositoryImpl.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsApplicationProcessWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsApplicationProcessWritePlatformServiceJpaRepositoryImpl.java index 32e763d..a63b49c 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsApplicationProcessWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsApplicationProcessWritePlatformServiceJpaRepositoryImpl.java @@ -27,7 +27,10 @@ import java.util.List; import java.util.Map; import java.util.Set; +import javax.persistence.PersistenceException; + import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.fineract.commands.domain.CommandWrapper; import org.apache.fineract.commands.service.CommandProcessingService; import org.apache.fineract.commands.service.CommandWrapperBuilder; @@ -133,11 +136,10 @@ public class SavingsApplicationProcessWritePlatformServiceJpaRepositoryImpl impl * Guaranteed to throw an exception no matter what the data integrity issue * is. */ - private void handleDataIntegrityIssues(final JsonCommand command, final DataAccessException dve) { + private void handleDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dve) { final StringBuilder errorCodeBuilder = new StringBuilder("error.msg.").append(SavingsApiConstants.SAVINGS_ACCOUNT_RESOURCE_NAME); - final Throwable realCause = dve.getMostSpecificCause(); if (realCause.getMessage().contains("sa_account_no_UNIQUE")) { final String accountNo = command.stringValueOfParameterNamed("accountNo"); errorCodeBuilder.append(".duplicate.accountNo"); @@ -179,8 +181,12 @@ public class SavingsApplicationProcessWritePlatformServiceJpaRepositoryImpl impl .withSavingsId(savingsId) // .build(); } catch (final DataAccessException dve) { - handleDataIntegrityIssues(command, dve); + handleDataIntegrityIssues(command, dve.getMostSpecificCause(), dve); return CommandProcessingResult.empty(); + }catch (final PersistenceException dve) { + Throwable throwable = ExceptionUtils.getRootCause(dve.getCause()) ; + handleDataIntegrityIssues(command, throwable, dve); + return CommandProcessingResult.empty(); } } @@ -278,8 +284,12 @@ public class SavingsApplicationProcessWritePlatformServiceJpaRepositoryImpl impl .with(changes) // .build(); } catch (final DataAccessException dve) { - handleDataIntegrityIssues(command, dve); + handleDataIntegrityIssues(command, dve.getMostSpecificCause(), dve); return new CommandProcessingResult(Long.valueOf(-1)); + }catch (final PersistenceException dve) { + Throwable throwable = ExceptionUtils.getRootCause(dve.getCause()) ; + handleDataIntegrityIssues(command, throwable, dve); + return CommandProcessingResult.empty(); } } http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsProductWritePlatformServiceJpaRepositoryImpl.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsProductWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsProductWritePlatformServiceJpaRepositoryImpl.java index a5d4f9c..7b0711e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsProductWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsProductWritePlatformServiceJpaRepositoryImpl.java @@ -28,6 +28,9 @@ import java.util.List; import java.util.Map; import java.util.Set; +import javax.persistence.PersistenceException; + +import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.fineract.accounting.producttoaccountmapping.service.ProductToGLAccountMappingWritePlatformService; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.ApiParameterError; @@ -37,7 +40,6 @@ 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.apache.fineract.infrastructure.entityaccess.domain.FineractEntityAccessType; -import org.apache.fineract.infrastructure.entityaccess.domain.FineractEntityType; import org.apache.fineract.infrastructure.entityaccess.service.FineractEntityAccessUtil; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.portfolio.charge.domain.Charge; @@ -85,9 +87,8 @@ public class SavingsProductWritePlatformServiceJpaRepositoryImpl implements Savi * Guaranteed to throw an exception no matter what the data integrity issue * is. */ - private void handleDataIntegrityIssues(final JsonCommand command, final DataAccessException dae) { + private void handleDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dae) { - final Throwable realCause = dae.getMostSpecificCause(); if (realCause.getMessage().contains("sp_unq_name")) { final String name = command.stringValueOfParameterNamed("name"); @@ -105,7 +106,7 @@ public class SavingsProductWritePlatformServiceJpaRepositoryImpl implements Savi "Unknown data integrity issue with resource."); } - private void logAsErrorUnexpectedDataIntegrityException(final DataAccessException dae) { + private void logAsErrorUnexpectedDataIntegrityException(final Exception dae) { this.logger.error(dae.getMessage(), dae); } @@ -134,8 +135,12 @@ public class SavingsProductWritePlatformServiceJpaRepositoryImpl implements Savi .withEntityId(product.getId()) // .build(); } catch (final DataAccessException e) { - handleDataIntegrityIssues(command, e); + handleDataIntegrityIssues(command, e.getMostSpecificCause(), e); return CommandProcessingResult.empty(); + }catch (final PersistenceException dve) { + Throwable throwable = ExceptionUtils.getRootCause(dve.getCause()) ; + handleDataIntegrityIssues(command, throwable, dve); + return CommandProcessingResult.empty(); } } @@ -189,8 +194,12 @@ public class SavingsProductWritePlatformServiceJpaRepositoryImpl implements Savi .withEntityId(product.getId()) // .with(changes).build(); } catch (final DataAccessException e) { - handleDataIntegrityIssues(command, e); + handleDataIntegrityIssues(command, e.getMostSpecificCause(), e); return CommandProcessingResult.empty(); + }catch (final PersistenceException dve) { + Throwable throwable = ExceptionUtils.getRootCause(dve.getCause()) ; + handleDataIntegrityIssues(command, throwable, dve); + return CommandProcessingResult.empty(); } } http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/account/domain/SelfBeneficiariesTPT.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/account/domain/SelfBeneficiariesTPT.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/account/domain/SelfBeneficiariesTPT.java index 76d0432..30e0e20 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/account/domain/SelfBeneficiariesTPT.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/account/domain/SelfBeneficiariesTPT.java @@ -28,12 +28,12 @@ import javax.persistence.Entity; import javax.persistence.Table; import javax.persistence.UniqueConstraint; -import org.springframework.data.jpa.domain.AbstractPersistable; +import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; @Entity @Table(name = "m_selfservice_beneficiaries_tpt", uniqueConstraints = { @UniqueConstraint(columnNames = { "name", "app_user_id", "is_active" }, name = "name") }) -public class SelfBeneficiariesTPT extends AbstractPersistable<Long> { +public class SelfBeneficiariesTPT extends AbstractPersistableCustom<Long> { @Column(name = "app_user_id", nullable = false) private Long appUserId; http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccount.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccount.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccount.java index 7467c43..0851268 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccount.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccount.java @@ -45,11 +45,11 @@ 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.springframework.data.jpa.domain.AbstractPersistable; +import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; @Entity @Table(name = "m_share_account") -public class ShareAccount extends AbstractPersistable<Long> { +public class ShareAccount extends AbstractPersistableCustom<Long> { @ManyToOne @JoinColumn(name = "client_id", nullable = true) http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountCharge.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountCharge.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountCharge.java index 7b8a356..feed817 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountCharge.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountCharge.java @@ -28,18 +28,17 @@ import javax.persistence.ManyToOne; import javax.persistence.Table; import org.apache.commons.lang.builder.EqualsBuilder; -import org.apache.commons.lang.builder.HashCodeBuilder; +import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency; import org.apache.fineract.organisation.monetary.domain.Money; import org.apache.fineract.organisation.monetary.domain.MoneyHelper; import org.apache.fineract.portfolio.charge.domain.Charge; import org.apache.fineract.portfolio.charge.domain.ChargeCalculationType; import org.apache.fineract.portfolio.charge.domain.ChargeTimeType; -import org.springframework.data.jpa.domain.AbstractPersistable; @Entity @Table(name = "m_share_account_charge") -public class ShareAccountCharge extends AbstractPersistable<Long> { +public class ShareAccountCharge extends AbstractPersistableCustom<Long> { @ManyToOne(optional = false) @JoinColumn(name = "account_id", referencedColumnName = "id", nullable = false) @@ -428,13 +427,4 @@ public class ShareAccountCharge extends AbstractPersistable<Long> { .append(this.amount, rhs.amount) // .isEquals(); } - - @Override - public int hashCode() { - return new HashCodeBuilder(3, 5) // - .append(getId()) // - .append(this.charge.getId()) // - .append(this.amount)// - .toHashCode(); - } } http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountChargePaidBy.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountChargePaidBy.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountChargePaidBy.java index d9843eb..d52d777 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountChargePaidBy.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountChargePaidBy.java @@ -26,12 +26,12 @@ import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; -import org.springframework.data.jpa.domain.AbstractPersistable; +import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; @Entity @Table(name = "m_share_account_charge_paid_by") -public class ShareAccountChargePaidBy extends AbstractPersistable<Long>{ +public class ShareAccountChargePaidBy extends AbstractPersistableCustom<Long>{ @ManyToOne(optional = false) @JoinColumn(name = "share_transaction_id", referencedColumnName = "id", nullable = false) http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountDividendDetails.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountDividendDetails.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountDividendDetails.java index 40821cb..5a3d5df 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountDividendDetails.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountDividendDetails.java @@ -24,11 +24,11 @@ import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Table; -import org.springframework.data.jpa.domain.AbstractPersistable; +import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; @Entity @Table(name = "m_share_account_dividend_details") -public class ShareAccountDividendDetails extends AbstractPersistable<Long> { +public class ShareAccountDividendDetails extends AbstractPersistableCustom<Long> { @Column(name = "account_id", nullable = false) private Long shareAccountId; http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountTransaction.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountTransaction.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountTransaction.java index 186b189..9910421 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountTransaction.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/domain/ShareAccountTransaction.java @@ -34,11 +34,11 @@ import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; -import org.springframework.data.jpa.domain.AbstractPersistable; +import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; @Entity @Table(name = "m_share_account_transactions") -public class ShareAccountTransaction extends AbstractPersistable<Long> { +public class ShareAccountTransaction extends AbstractPersistableCustom<Long> { @ManyToOne(optional = false) @JoinColumn(name = "account_id", referencedColumnName = "id", nullable = false) @@ -73,7 +73,7 @@ public class ShareAccountTransaction extends AbstractPersistable<Long> { private boolean active = true ; @OneToMany(cascade = CascadeType.ALL, mappedBy = "shareAccountTransaction", orphanRemoval = true, fetch=FetchType.EAGER) - private final Set<ShareAccountChargePaidBy> shareAccountChargesPaid = new HashSet<>(); + private Set<ShareAccountChargePaidBy> shareAccountChargesPaid = new HashSet<>(); protected ShareAccountTransaction() { http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/serialization/ShareAccountDataSerializer.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/serialization/ShareAccountDataSerializer.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/serialization/ShareAccountDataSerializer.java index 11daee9..80812af 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/serialization/ShareAccountDataSerializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/serialization/ShareAccountDataSerializer.java @@ -944,6 +944,7 @@ public class ShareAccountDataSerializer { JsonElement element = jsonCommand.parsedJson(); LocalDate closedDate = this.fromApiJsonHelper.extractLocalDateNamed(ShareAccountApiConstants.closeddate_paramname, element); baseDataValidator.reset().parameter(ShareAccountApiConstants.approveddate_paramname).value(closedDate).notNull(); + if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException(dataValidationErrors); } boolean isTransactionBeforeExistingTransactions = false ; Set<ShareAccountTransaction> transactions = account.getShareAccountTransactions() ; for(ShareAccountTransaction transaction: transactions) { http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountWritePlatformServiceJpaRepositoryImpl.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountWritePlatformServiceJpaRepositoryImpl.java index 4bf7a85..7a2a422 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountWritePlatformServiceJpaRepositoryImpl.java @@ -27,7 +27,10 @@ import java.util.List; import java.util.Map; import java.util.Set; +import javax.persistence.PersistenceException; + import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.fineract.accounting.journalentry.service.JournalEntryWritePlatformService; import org.apache.fineract.infrastructure.accountnumberformat.domain.AccountNumberFormat; import org.apache.fineract.infrastructure.accountnumberformat.domain.AccountNumberFormatRepositoryWrapper; @@ -35,6 +38,7 @@ import org.apache.fineract.infrastructure.accountnumberformat.domain.EntityAccou import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.organisation.monetary.data.CurrencyData; import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency; @@ -102,8 +106,12 @@ public class ShareAccountWritePlatformServiceJpaRepositoryImpl implements ShareA .withEntityId(account.getId()) // .build(); } catch (final DataIntegrityViolationException dve) { - handleDataIntegrityIssues(jsonCommand, dve); + handleDataIntegrityIssues(jsonCommand, dve.getMostSpecificCause(), dve); return CommandProcessingResult.empty(); + }catch (final PersistenceException dve) { + Throwable throwable = ExceptionUtils.getRootCause(dve.getCause()) ; + handleDataIntegrityIssues(jsonCommand, throwable, dve); + return CommandProcessingResult.empty(); } } @@ -196,8 +204,12 @@ public class ShareAccountWritePlatformServiceJpaRepositoryImpl implements ShareA .with(changes) // .build(); } catch (DataIntegrityViolationException dve) { - handleDataIntegrityIssues(jsonCommand, dve); + handleDataIntegrityIssues(jsonCommand, dve.getMostSpecificCause(), dve); return CommandProcessingResult.empty(); + }catch (final PersistenceException dve) { + Throwable throwable = ExceptionUtils.getRootCause(dve.getCause()) ; + handleDataIntegrityIssues(jsonCommand, throwable, dve); + return CommandProcessingResult.empty(); } } @@ -226,7 +238,7 @@ public class ShareAccountWritePlatformServiceJpaRepositoryImpl implements ShareA .with(changes) // .build(); } catch (final DataIntegrityViolationException dve) { - handleDataIntegrityIssues(jsonCommand, dve); + handleDataIntegrityIssues(jsonCommand, dve.getMostSpecificCause(), dve); return CommandProcessingResult.empty(); } } @@ -267,7 +279,7 @@ public class ShareAccountWritePlatformServiceJpaRepositoryImpl implements ShareA .with(changes) // .build(); } catch (DataIntegrityViolationException dve) { - handleDataIntegrityIssues(jsonCommand, dve); + handleDataIntegrityIssues(jsonCommand, dve.getMostSpecificCause(), dve); return CommandProcessingResult.empty(); } } @@ -301,7 +313,7 @@ public class ShareAccountWritePlatformServiceJpaRepositoryImpl implements ShareA .with(changes) // .build(); } catch (DataIntegrityViolationException dve) { - handleDataIntegrityIssues(jsonCommand, dve); + handleDataIntegrityIssues(jsonCommand, dve.getMostSpecificCause(), dve); return CommandProcessingResult.empty(); } } @@ -338,7 +350,7 @@ public class ShareAccountWritePlatformServiceJpaRepositoryImpl implements ShareA .with(changes) // .build(); } catch (DataIntegrityViolationException dve) { - handleDataIntegrityIssues(jsonCommand, dve); + handleDataIntegrityIssues(jsonCommand, dve.getMostSpecificCause(), dve); return CommandProcessingResult.empty(); } } @@ -360,7 +372,7 @@ public class ShareAccountWritePlatformServiceJpaRepositoryImpl implements ShareA .with(changes) // .build(); } catch (DataIntegrityViolationException dve) { - handleDataIntegrityIssues(jsonCommand, dve); + handleDataIntegrityIssues(jsonCommand, dve.getMostSpecificCause(), dve); return CommandProcessingResult.empty(); } } @@ -397,7 +409,7 @@ public class ShareAccountWritePlatformServiceJpaRepositoryImpl implements ShareA .with(changes) // .build(); } catch (DataIntegrityViolationException dve) { - handleDataIntegrityIssues(jsonCommand, dve); + handleDataIntegrityIssues(jsonCommand, dve.getMostSpecificCause(), dve); return CommandProcessingResult.empty(); } } @@ -426,7 +438,7 @@ public class ShareAccountWritePlatformServiceJpaRepositoryImpl implements ShareA .with(changes) // .build(); } catch (DataIntegrityViolationException dve) { - handleDataIntegrityIssues(jsonCommand, dve); + handleDataIntegrityIssues(jsonCommand, dve.getMostSpecificCause(), dve); return CommandProcessingResult.empty(); } } @@ -461,7 +473,7 @@ public class ShareAccountWritePlatformServiceJpaRepositoryImpl implements ShareA .with(changes) // .build(); } catch (DataIntegrityViolationException dve) { - handleDataIntegrityIssues(jsonCommand, dve); + handleDataIntegrityIssues(jsonCommand, dve.getMostSpecificCause(), dve); return CommandProcessingResult.empty(); } } @@ -495,12 +507,13 @@ public class ShareAccountWritePlatformServiceJpaRepositoryImpl implements ShareA .with(changes) // .build(); } catch (DataIntegrityViolationException dve) { - handleDataIntegrityIssues(jsonCommand, dve); + handleDataIntegrityIssues(jsonCommand, dve.getMostSpecificCause(), dve); return CommandProcessingResult.empty(); } } - private void handleDataIntegrityIssues(final JsonCommand command, final DataIntegrityViolationException dve) { - + private void handleDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dve) { + throw new PlatformDataIntegrityException("error.msg.shareaccount.unknown.data.integrity.issue", + "Unknown data integrity issue with resource."); } } http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/domain/ShareProduct.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/domain/ShareProduct.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/domain/ShareProduct.java index 14cc73a..a06427f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/domain/ShareProduct.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/domain/ShareProduct.java @@ -81,7 +81,7 @@ public class ShareProduct extends AbstractAuditableCustom<AppUser, Long> { @Column(name = "issued_shares", nullable = false) private Long totalSharesIssued; - @Column(name = "totalsubscribed_shares", nullable = false) + @Column(name = "totalsubscribed_shares", nullable = true) private Long totalSubscribedShares; @Column(name = "unit_price", nullable = false) http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/domain/ShareProductMarketPrice.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/domain/ShareProductMarketPrice.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/domain/ShareProductMarketPrice.java index 6042149..2ca7e66 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/domain/ShareProductMarketPrice.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/domain/ShareProductMarketPrice.java @@ -29,11 +29,11 @@ import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; -import org.springframework.data.jpa.domain.AbstractPersistable; +import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; @Entity @Table(name = "m_share_product_market_price") -public class ShareProductMarketPrice extends AbstractPersistable<Long> { +public class ShareProductMarketPrice extends AbstractPersistableCustom<Long> { @ManyToOne(optional = false) @JoinColumn(name = "product_id", referencedColumnName = "id", nullable = false) http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/service/ShareProductWritePlatformServiceJpaRepositoryImpl.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/service/ShareProductWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/service/ShareProductWritePlatformServiceJpaRepositoryImpl.java index e9aaac7..2a310a2 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/service/ShareProductWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/service/ShareProductWritePlatformServiceJpaRepositoryImpl.java @@ -21,6 +21,9 @@ package org.apache.fineract.portfolio.shareproducts.service; import java.math.BigDecimal; import java.util.Map; +import javax.persistence.PersistenceException; + +import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.fineract.accounting.producttoaccountmapping.service.ProductToGLAccountMappingWritePlatformService; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; @@ -78,9 +81,13 @@ public class ShareProductWritePlatformServiceJpaRepositoryImpl implements ShareP .withCommandId(jsonCommand.commandId()) // .withEntityId(product.getId()) // .build(); - } catch (final DataIntegrityViolationException dve) { - handleDataIntegrityIssues(jsonCommand, dve); + }catch (DataIntegrityViolationException dve) { + handleDataIntegrityIssues(jsonCommand, dve.getMostSpecificCause(), dve); return CommandProcessingResult.empty(); + }catch (PersistenceException dve) { + Throwable throwable = ExceptionUtils.getRootCause(dve.getCause()) ; + handleDataIntegrityIssues(jsonCommand, throwable, dve); + return CommandProcessingResult.empty(); } } @@ -105,9 +112,13 @@ public class ShareProductWritePlatformServiceJpaRepositoryImpl implements ShareP .withEntityId(productId) // .with(changes) // .build(); - } catch (DataIntegrityViolationException dve) { - handleDataIntegrityIssues(jsonCommand, dve); + }catch (DataIntegrityViolationException dve) { + handleDataIntegrityIssues(jsonCommand, dve.getMostSpecificCause(), dve); return CommandProcessingResult.empty(); + }catch (PersistenceException dve) { + Throwable throwable = ExceptionUtils.getRootCause(dve.getCause()) ; + handleDataIntegrityIssues(jsonCommand, throwable, dve); + return CommandProcessingResult.empty(); } } @@ -135,7 +146,7 @@ public class ShareProductWritePlatformServiceJpaRepositoryImpl implements ShareP .withSubEntityId(dividendPayOutDetails.getId())// .build(); } catch (DataIntegrityViolationException dve) { - handleDataIntegrityIssues(jsonCommand, dve); + handleDataIntegrityIssues(dve); return CommandProcessingResult.empty(); } } @@ -175,16 +186,22 @@ public class ShareProductWritePlatformServiceJpaRepositoryImpl implements ShareP } } - private void handleDataIntegrityIssues(final DataIntegrityViolationException dve) { - final Throwable realCause = dve.getMostSpecificCause(); - throw new PlatformDataIntegrityException("error.msg.glClosure.unknown.data.integrity.issue", - "Unknown data integrity issue with resource GL Closure: " + realCause.getMessage()); + private void handleDataIntegrityIssues(final Exception e) { + throw new PlatformDataIntegrityException("error.msg.shareproduct.unknown.data.integrity.issue", + "Unknown data integrity issue with resource."); } - private void handleDataIntegrityIssues(@SuppressWarnings("unused") final JsonCommand command, final DataIntegrityViolationException dve) { - final Throwable realCause = dve.getMostSpecificCause(); - throw new PlatformDataIntegrityException("error.msg.glClosure.unknown.data.integrity.issue", - "Unknown data integrity issue with resource GL Closure: " + realCause.getMessage()); + + private void handleDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dve) { + + if (realCause.getMessage().contains("'name'")) { + final String name = command.stringValueOfParameterNamed(ShareProductApiConstants.name_paramname); + throw new PlatformDataIntegrityException("error.msg.shareproduct.duplicate.name", "Share Product with name `" + name + + "` already exists", "name", name); + } + + throw new PlatformDataIntegrityException("error.msg.shareproduct.unknown.data.integrity.issue", + "Unknown data integrity issue with resource."); } } http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Component.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Component.java b/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Component.java index 5e7b4a2..8a3191b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Component.java +++ b/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Component.java @@ -18,13 +18,13 @@ */ package org.apache.fineract.spm.domain; -import org.springframework.data.jpa.domain.AbstractPersistable; +import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; import javax.persistence.*; @Entity @Table(name = "m_survey_components") -public class Component extends AbstractPersistable<Long> { +public class Component extends AbstractPersistableCustom<Long> { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "survey_id") http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/spm/domain/LookupTable.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/spm/domain/LookupTable.java b/fineract-provider/src/main/java/org/apache/fineract/spm/domain/LookupTable.java index 1448798..26e4ad9 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/spm/domain/LookupTable.java +++ b/fineract-provider/src/main/java/org/apache/fineract/spm/domain/LookupTable.java @@ -18,13 +18,13 @@ */ package org.apache.fineract.spm.domain; -import org.springframework.data.jpa.domain.AbstractPersistable; +import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; import javax.persistence.*; @Entity @Table(name = "m_survey_lookup_tables") -public class LookupTable extends AbstractPersistable<Long> { +public class LookupTable extends AbstractPersistableCustom<Long> { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "survey_id") http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Question.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Question.java b/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Question.java index 861a5c8..c33d356 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Question.java +++ b/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Question.java @@ -18,20 +18,20 @@ */ package org.apache.fineract.spm.domain; -import org.springframework.data.jpa.domain.AbstractPersistable; +import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; import javax.persistence.*; import java.util.List; @Entity @Table(name = "m_survey_questions") -public class Question extends AbstractPersistable<Long> { +public class Question extends AbstractPersistableCustom<Long> { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "survey_id") private Survey survey; - @OneToMany(mappedBy = "question", fetch = FetchType.LAZY, cascade = CascadeType.ALL) + @OneToMany(mappedBy = "question", fetch = FetchType.EAGER, cascade = CascadeType.ALL) @OrderBy("sequenceNo") private List<Response> responses; http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Response.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Response.java b/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Response.java index 1b742d8..3c9fe33 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Response.java +++ b/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Response.java @@ -18,13 +18,13 @@ */ package org.apache.fineract.spm.domain; -import org.springframework.data.jpa.domain.AbstractPersistable; +import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; import javax.persistence.*; @Entity @Table(name = "m_survey_responses") -public class Response extends AbstractPersistable<Long> { +public class Response extends AbstractPersistableCustom<Long> { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "question_id") http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Scorecard.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Scorecard.java b/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Scorecard.java index 40a9268..0588ca6 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Scorecard.java +++ b/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Scorecard.java @@ -20,14 +20,14 @@ package org.apache.fineract.spm.domain; import org.apache.fineract.portfolio.client.domain.Client; import org.apache.fineract.useradministration.domain.AppUser; -import org.springframework.data.jpa.domain.AbstractPersistable; +import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; import javax.persistence.*; import java.util.Date; @Entity @Table(name = "m_survey_scorecards") -public class Scorecard extends AbstractPersistable<Long> { +public class Scorecard extends AbstractPersistableCustom<Long> { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "survey_id") http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Survey.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Survey.java b/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Survey.java index 8728cdd..bd68905 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Survey.java +++ b/fineract-provider/src/main/java/org/apache/fineract/spm/domain/Survey.java @@ -18,7 +18,7 @@ */ package org.apache.fineract.spm.domain; -import org.springframework.data.jpa.domain.AbstractPersistable; +import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; import javax.persistence.*; import java.util.Date; @@ -26,13 +26,13 @@ import java.util.List; @Entity @Table(name = "m_surveys") -public class Survey extends AbstractPersistable<Long> { +public class Survey extends AbstractPersistableCustom<Long> { - @OneToMany(mappedBy = "survey", fetch = FetchType.LAZY, cascade = CascadeType.ALL) + @OneToMany(mappedBy = "survey", fetch = FetchType.EAGER, cascade = CascadeType.ALL) @OrderBy("sequenceNo") private List<Component> components; - @OneToMany(mappedBy = "survey", fetch = FetchType.LAZY, cascade = CascadeType.ALL) + @OneToMany(mappedBy = "survey", fetch = FetchType.EAGER, cascade = CascadeType.ALL) @OrderBy("sequenceNo") private List<Question> questions;