From 40c8e3882f09649231e2ce9f8977e142a0832adf Mon Sep 17 00:00:00 2001 From: Adam Saghy Date: Sun, 7 Aug 2022 23:13:14 +0200 Subject: [PATCH 1/7] FINERACT-1670: Add auditable fields to Business date --- .../businessdate/domain/BusinessDate.java | 4 +- .../db/changelog/tenant/changelog-tenant.xml | 1 + ...030_add_audit_entries_to_business_date.xml | 74 +++++++++++++++++++ 3 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 fineract-provider/src/main/resources/db/changelog/tenant/parts/0030_add_audit_entries_to_business_date.xml diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/businessdate/domain/BusinessDate.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/businessdate/domain/BusinessDate.java index 2aef3a28704..1b4df3dbfe2 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/businessdate/domain/BusinessDate.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/businessdate/domain/BusinessDate.java @@ -28,12 +28,12 @@ import javax.persistence.Version; import javax.validation.constraints.NotNull; import lombok.Getter; -import org.apache.fineract.infrastructure.core.domain.AbstractAuditableCustom; +import org.apache.fineract.infrastructure.core.domain.AbstractAuditableWithUTCDateTimeCustom; @Getter @Entity @Table(name = "m_business_date", uniqueConstraints = { @UniqueConstraint(name = "uq_business_date_type", columnNames = { "type" }) }) -public class BusinessDate extends AbstractAuditableCustom { +public class BusinessDate extends AbstractAuditableWithUTCDateTimeCustom { @Enumerated(EnumType.STRING) @Column(name = "type") diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml index 8d208a8d500..1d3bb1cfd71 100644 --- a/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml +++ b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml @@ -49,4 +49,5 @@ + diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0030_add_audit_entries_to_business_date.xml b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0030_add_audit_entries_to_business_date.xml new file mode 100644 index 00000000000..60778212f12 --- /dev/null +++ b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0030_add_audit_entries_to_business_date.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select count(*) from m_business_date + + + + + + + select count(*) from m_business_date + + + + + + + + + From d0889f6f2c8dd16fa81decf8a085ca496e3fe6f6 Mon Sep 17 00:00:00 2001 From: Adam Saghy Date: Sun, 7 Aug 2022 23:13:56 +0200 Subject: [PATCH 2/7] FINERACT-1670: Add auditable fields to Client identifier --- .../client/domain/ClientIdentifier.java | 4 +- .../db/changelog/tenant/changelog-tenant.xml | 1 + ...add_audit_entries_to_client_identifier.xml | 77 +++++++++++++++++++ 3 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 fineract-provider/src/main/resources/db/changelog/tenant/parts/0031_add_audit_entries_to_client_identifier.xml diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientIdentifier.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientIdentifier.java index 58615477df5..9c954a39840 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientIdentifier.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientIdentifier.java @@ -29,13 +29,13 @@ import org.apache.commons.lang3.StringUtils; import org.apache.fineract.infrastructure.codes.domain.CodeValue; import org.apache.fineract.infrastructure.core.api.JsonCommand; -import org.apache.fineract.infrastructure.core.domain.AbstractAuditableCustom; +import org.apache.fineract.infrastructure.core.domain.AbstractAuditableWithUTCDateTimeCustom; @Entity @Table(name = "m_client_identifier", uniqueConstraints = { @UniqueConstraint(columnNames = { "document_type_id", "document_key" }, name = "unique_identifier_key"), @UniqueConstraint(columnNames = { "client_id", "document_key", "active" }, name = "unique_active_client_identifier") }) -public class ClientIdentifier extends AbstractAuditableCustom { +public class ClientIdentifier extends AbstractAuditableWithUTCDateTimeCustom { @ManyToOne @JoinColumn(name = "client_id", nullable = false) diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml index 1d3bb1cfd71..b1cbcb18f84 100644 --- a/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml +++ b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml @@ -50,4 +50,5 @@ + diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0031_add_audit_entries_to_client_identifier.xml b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0031_add_audit_entries_to_client_identifier.xml new file mode 100644 index 00000000000..fe3aca12086 --- /dev/null +++ b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0031_add_audit_entries_to_client_identifier.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select count(*) from m_client_identifier + + + + + + + select count(*) from m_client_identifier + + + + + + + select count(*) from m_client_identifier where created_by is null or last_modified_by is null + + + + + From f413d9dbc54946201d52992335e30eaeda4ec133 Mon Sep 17 00:00:00 2001 From: Adam Saghy Date: Sun, 7 Aug 2022 23:14:12 +0200 Subject: [PATCH 3/7] FINERACT-1670: Add some missing indexes --- .../db/changelog/tenant/changelog-tenant.xml | 2 ++ .../parts/0032_add_some_missing_indexes.xml | 36 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 fineract-provider/src/main/resources/db/changelog/tenant/parts/0032_add_some_missing_indexes.xml diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml index b1cbcb18f84..946fae60003 100644 --- a/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml +++ b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml @@ -51,4 +51,6 @@ + +>>>>>>> 92a62bc2d (FINERACT-1670: Add some missing indexes) diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0032_add_some_missing_indexes.xml b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0032_add_some_missing_indexes.xml new file mode 100644 index 00000000000..0935dea7851 --- /dev/null +++ b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0032_add_some_missing_indexes.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + From 5f6bc0bfc6c6dda654a31ee742ee44428b93e8b7 Mon Sep 17 00:00:00 2001 From: Adam Saghy Date: Mon, 8 Aug 2022 23:44:59 +0200 Subject: [PATCH 4/7] FINERACT-1670: Add auditable fields to Loan Repayment Schedule installment and history --- .../LoanRepaymentScheduleInstallment.java | 6 +- .../domain/LoanRepaymentScheduleHistory.java | 31 ++++-- ...oanScheduleHistoryReadPlatformService.java | 3 + ...cheduleHistoryReadPlatformServiceImpl.java | 7 ++ ...heduleHistoryWritePlatformServiceImpl.java | 43 +++++--- ...heduleRequestWritePlatformServiceImpl.java | 5 +- ...WritePlatformServiceJpaRepositoryImpl.java | 3 - ...to_loan_repayment_schedule_installment.xml | 103 ++++++++++++++++++ 8 files changed, 165 insertions(+), 36 deletions(-) create mode 100644 fineract-provider/src/main/resources/db/changelog/tenant/parts/0032_add_audit_entries_to_loan_repayment_schedule_installment.xml diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleInstallment.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleInstallment.java index 5430c4b6a4d..078e051b0bc 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleInstallment.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleInstallment.java @@ -31,14 +31,14 @@ import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.Table; -import org.apache.fineract.infrastructure.core.domain.AbstractAuditableCustom; +import org.apache.fineract.infrastructure.core.domain.AbstractAuditableWithUTCDateTimeCustom; import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency; import org.apache.fineract.organisation.monetary.domain.Money; import org.apache.fineract.portfolio.repaymentwithpostdatedchecks.domain.PostDatedChecks; @Entity @Table(name = "m_loan_repayment_schedule") -public final class LoanRepaymentScheduleInstallment extends AbstractAuditableCustom +public class LoanRepaymentScheduleInstallment extends AbstractAuditableWithUTCDateTimeCustom implements Comparable { @ManyToOne(optional = false) @@ -135,7 +135,7 @@ public final class LoanRepaymentScheduleInstallment extends AbstractAuditableCus @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY, mappedBy = "installment") private Set installmentCharges = new HashSet<>(); - LoanRepaymentScheduleInstallment() { + public LoanRepaymentScheduleInstallment() { this.installmentNumber = null; this.fromDate = null; this.dueDate = null; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanRepaymentScheduleHistory.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanRepaymentScheduleHistory.java index 7b2acca54b2..36147cc1a72 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanRepaymentScheduleHistory.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanRepaymentScheduleHistory.java @@ -21,6 +21,7 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.OffsetDateTime; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.JoinColumn; @@ -28,6 +29,8 @@ import javax.persistence.OneToOne; import javax.persistence.Table; import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; +import static org.apache.fineract.infrastructure.core.domain.AuditableFieldsConstants.CREATED_DATE_DB_FIELD; +import static org.apache.fineract.infrastructure.core.domain.AuditableFieldsConstants.LAST_MODIFIED_DATE_DB_FIELD; import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.rescheduleloan.domain.LoanRescheduleRequest; @@ -65,7 +68,7 @@ public class LoanRepaymentScheduleHistory extends AbstractPersistableCustom { private BigDecimal penaltyCharges; @Column(name = "created_date") - private LocalDateTime createdOnDate; + private LocalDateTime oldCreatedOnDate; @Column(name = "createdby_id") private Long createdByUser; @@ -74,7 +77,13 @@ public class LoanRepaymentScheduleHistory extends AbstractPersistableCustom { private Long lastModifiedByUser; @Column(name = "lastmodified_date") - private LocalDateTime lastModifiedOnDate; + private LocalDateTime oldLastModifiedOnDate; + + @Column(name = CREATED_DATE_DB_FIELD) + private OffsetDateTime createdDate; + + @Column(name = LAST_MODIFIED_DATE_DB_FIELD) + private OffsetDateTime lastModifiedDate; @Column(name = "version") private Integer version; @@ -90,8 +99,8 @@ protected LoanRepaymentScheduleHistory() {} private LoanRepaymentScheduleHistory(final Loan loan, final LoanRescheduleRequest loanRescheduleRequest, final Integer installmentNumber, final LocalDate fromDate, final LocalDate dueDate, final BigDecimal principal, final BigDecimal interestCharged, final BigDecimal feeChargesCharged, final BigDecimal penaltyCharges, - final LocalDateTime createdOnDate, final Long createdByUser, final Long lastModifiedByUser, - final LocalDateTime lastModifiedOnDate, final Integer version) { + final LocalDateTime oldCreatedOnDate, final Long createdByUser, final Long lastModifiedByUser, + final LocalDateTime oldLastModifiedOnDate, final Integer version, final OffsetDateTime createdDate, final OffsetDateTime lastModifiedDate) { this.loan = loan; this.loanRescheduleRequest = loanRescheduleRequest; @@ -102,11 +111,13 @@ private LoanRepaymentScheduleHistory(final Loan loan, final LoanRescheduleReques this.interestCharged = interestCharged; this.feeChargesCharged = feeChargesCharged; this.penaltyCharges = penaltyCharges; - this.createdOnDate = createdOnDate; + this.oldCreatedOnDate = oldCreatedOnDate; this.createdByUser = createdByUser; this.lastModifiedByUser = lastModifiedByUser; - this.lastModifiedOnDate = lastModifiedOnDate; + this.oldLastModifiedOnDate = oldLastModifiedOnDate; this.version = version; + this.createdDate = createdDate; + this.lastModifiedDate = lastModifiedDate; } /** @@ -115,12 +126,12 @@ private LoanRepaymentScheduleHistory(final Loan loan, final LoanRescheduleReques public static LoanRepaymentScheduleHistory instance(final Loan loan, final LoanRescheduleRequest loanRescheduleRequest, final Integer installmentNumber, final LocalDate fromDate, final LocalDate dueDate, final BigDecimal principal, final BigDecimal interestCharged, final BigDecimal feeChargesCharged, final BigDecimal penaltyCharges, - final LocalDateTime createdOnDate, final Long createdByUser, final Long lastModifiedByUser, - final LocalDateTime lastModifiedOnDate, final Integer version) { + final LocalDateTime oldCreatedOnDate, final Long createdByUser, final Long lastModifiedByUser, + final LocalDateTime oldLastModifiedOnDate, final Integer version, final OffsetDateTime createdDate, final OffsetDateTime lastModifiedDate) { return new LoanRepaymentScheduleHistory(loan, loanRescheduleRequest, installmentNumber, fromDate, dueDate, principal, - interestCharged, feeChargesCharged, penaltyCharges, createdOnDate, createdByUser, lastModifiedByUser, lastModifiedOnDate, - version); + interestCharged, feeChargesCharged, penaltyCharges, oldCreatedOnDate, createdByUser, lastModifiedByUser, oldLastModifiedOnDate, + version, createdDate, lastModifiedDate); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleHistoryReadPlatformService.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleHistoryReadPlatformService.java index cd2bf3e03ec..22270a17bd3 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleHistoryReadPlatformService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleHistoryReadPlatformService.java @@ -19,6 +19,7 @@ package org.apache.fineract.portfolio.loanaccount.loanschedule.service; import java.util.Collection; +import java.util.Map; import org.apache.fineract.portfolio.loanaccount.data.DisbursementData; import org.apache.fineract.portfolio.loanaccount.data.RepaymentScheduleRelatedLoanData; import org.apache.fineract.portfolio.loanaccount.loanschedule.data.LoanScheduleData; @@ -29,4 +30,6 @@ public interface LoanScheduleHistoryReadPlatformService { LoanScheduleData retrieveRepaymentArchiveSchedule(Long loanId, RepaymentScheduleRelatedLoanData repaymentScheduleRelatedLoanData, Collection disbursementData); + + Map fetchOldAuditDates(Long id); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleHistoryReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleHistoryReadPlatformServiceImpl.java index ebf48764336..4ab2750c970 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleHistoryReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleHistoryReadPlatformServiceImpl.java @@ -25,6 +25,7 @@ import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Collection; +import java.util.Map; import org.apache.commons.lang3.ObjectUtils; import org.apache.fineract.infrastructure.core.domain.JdbcSupport; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; @@ -86,6 +87,12 @@ public LoanScheduleData retrieveRepaymentArchiveSchedule(final Long loanId, } } + @Override + public Map fetchOldAuditDates(Long id) { + final String sql = "select lrs.created_date, lrs.lastmodified_date from m_loan_repayment_schedule lrs where lrs.id = ?"; + return this.jdbcTemplate.queryForMap(sql, id); + } + private static final class LoanScheduleArchiveResultSetExtractor implements ResultSetExtractor { private final CurrencyData currency; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleHistoryWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleHistoryWritePlatformServiceImpl.java index 12f5d2f7806..91f46815a91 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleHistoryWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleHistoryWritePlatformServiceImpl.java @@ -21,32 +21,31 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.OffsetDateTime; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import lombok.RequiredArgsConstructor; +import org.apache.fineract.infrastructure.core.service.DateUtils; +import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency; import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallment; import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanRepaymentScheduleHistory; import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanRepaymentScheduleHistoryRepository; import org.apache.fineract.portfolio.loanaccount.rescheduleloan.domain.LoanRescheduleRequest; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @Transactional +@RequiredArgsConstructor public class LoanScheduleHistoryWritePlatformServiceImpl implements LoanScheduleHistoryWritePlatformService { private final LoanScheduleHistoryReadPlatformService loanScheduleHistoryReadPlatformService; private final LoanRepaymentScheduleHistoryRepository loanRepaymentScheduleHistoryRepository; - @Autowired - public LoanScheduleHistoryWritePlatformServiceImpl(final LoanScheduleHistoryReadPlatformService loanScheduleHistoryReadPlatformService, - final LoanRepaymentScheduleHistoryRepository loanRepaymentScheduleHistoryRepository) { - this.loanScheduleHistoryReadPlatformService = loanScheduleHistoryReadPlatformService; - this.loanRepaymentScheduleHistoryRepository = loanRepaymentScheduleHistoryRepository; - - } + private final PlatformSecurityContext platformSecurityContext; @Override public List createLoanScheduleArchive( @@ -73,23 +72,33 @@ public List createLoanScheduleArchive( final BigDecimal feeChargesCharged = repaymentScheduleInstallment.getFeeChargesCharged(currency).getAmount(); final BigDecimal penaltyCharges = repaymentScheduleInstallment.getPenaltyChargesCharged(currency).getAmount(); - LocalDateTime createdOnDate = null; + Map oldDates = null; + OffsetDateTime createdOnDate = DateUtils.getOffsetDateTimeOfTenant(); + LocalDateTime oldCreatedOnDate = null; + LocalDateTime oldLastModifiedOnDate = null; if (repaymentScheduleInstallment.getCreatedDate().isPresent()) { - createdOnDate = repaymentScheduleInstallment.getCreatedDate().get(); // NOSONAR + createdOnDate = repaymentScheduleInstallment.getCreatedDate().get(); + } else if (repaymentScheduleInstallment.getId() != null) { + oldDates = loanScheduleHistoryReadPlatformService.fetchOldAuditDates(repaymentScheduleInstallment.getId()); + oldCreatedOnDate = (LocalDateTime) oldDates.get("created_date"); + oldLastModifiedOnDate = (LocalDateTime) oldDates.get("lastmodified_date"); } - final Long createdByUser = repaymentScheduleInstallment.getCreatedBy().orElse(null); - final Long lastModifiedByUser = repaymentScheduleInstallment.getLastModifiedBy().orElse(null); - - LocalDateTime lastModifiedOnDate = null; + final Long createdByUser = repaymentScheduleInstallment.getCreatedBy().orElse(platformSecurityContext.authenticatedUser().getId()); + final Long lastModifiedByUser = repaymentScheduleInstallment.getLastModifiedBy().orElse(platformSecurityContext.authenticatedUser().getId()); + OffsetDateTime lastModifiedOnDate = DateUtils.getOffsetDateTimeOfTenant(); if (repaymentScheduleInstallment.getLastModifiedDate().isPresent()) { - lastModifiedOnDate = repaymentScheduleInstallment.getLastModifiedDate().get(); // NOSONAR + lastModifiedOnDate = repaymentScheduleInstallment.getLastModifiedDate().get(); + } else if (repaymentScheduleInstallment.getId() != null && oldDates == null) { + oldDates = loanScheduleHistoryReadPlatformService.fetchOldAuditDates(repaymentScheduleInstallment.getId()); + oldCreatedOnDate = (LocalDateTime) oldDates.get("created_date"); + oldLastModifiedOnDate = (LocalDateTime) oldDates.get("lastmodified_date"); } LoanRepaymentScheduleHistory loanRepaymentScheduleHistory = LoanRepaymentScheduleHistory.instance(loan, loanRescheduleRequest, - installmentNumber, fromDate, dueDate, principal, interestCharged, feeChargesCharged, penaltyCharges, createdOnDate, - createdByUser, lastModifiedByUser, lastModifiedOnDate, version); + installmentNumber, fromDate, dueDate, principal, interestCharged, feeChargesCharged, penaltyCharges, oldCreatedOnDate, + createdByUser, lastModifiedByUser, oldLastModifiedOnDate, version, createdOnDate, lastModifiedOnDate); loanRepaymentScheduleHistoryList.add(loanRepaymentScheduleHistory); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java index 976b19ab251..6f7e37d87d5 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java @@ -475,9 +475,8 @@ public CommandProcessingResult approve(JsonCommand jsonCommand) { loan.recalculateAllCharges(); ChangedTransactionDetail changedTransactionDetail = loan.processTransactions(); - for (LoanRepaymentScheduleHistory loanRepaymentScheduleHistory : loanRepaymentScheduleHistoryList) { - this.loanRepaymentScheduleHistoryRepository.save(loanRepaymentScheduleHistory); - } + + this.loanRepaymentScheduleHistoryRepository.saveAll(loanRepaymentScheduleHistoryList); loan.updateRescheduledByUser(appUser); loan.updateRescheduledOnDate(DateUtils.getBusinessLocalDate()); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java index 936c3769010..029ca66e146 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java @@ -1943,9 +1943,6 @@ public CommandProcessingResult undoWaiveLoanCharge(final JsonCommand command) { // Subtract the amount waived from the existing fee charges waived amount. chargePerInstallment.getInstallment().setFeeChargesWaived(feeChargesWaivedAmount.subtract(amountWaived)); - // Set the last modification date. - chargePerInstallment.getInstallment().setLastModifiedDate(DateUtils.getLocalDateTimeOfSystem()); - // Update loan charge. loanCharge.setInstallmentLoanCharge(chargePerInstallment, chargePerInstallment.getInstallment().getInstallmentNumber()); diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0032_add_audit_entries_to_loan_repayment_schedule_installment.xml b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0032_add_audit_entries_to_loan_repayment_schedule_installment.xml new file mode 100644 index 00000000000..9144fea6613 --- /dev/null +++ b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0032_add_audit_entries_to_loan_repayment_schedule_installment.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select count(*) from m_loan_repayment_schedule + + + + + + + select count(*) from m_loan_repayment_schedule + + + + + + + select count(*) from m_loan_repayment_schedule where created_by is null or last_modified_by is null + + + + + + + + + + + + + + + + + + + select count(*) from m_loan_repayment_schedule_history + + + + + + + select count(*) from m_loan_repayment_schedule_history + + + + + From 0cc68d990be587064a022a85c64fa9402650b763 Mon Sep 17 00:00:00 2001 From: Adam Saghy Date: Mon, 8 Aug 2022 23:46:09 +0200 Subject: [PATCH 5/7] FINERACT-1670: Add auditable fields to Note --- .../portfolio/note/data/NoteData.java | 8 +- .../fineract/portfolio/note/domain/Note.java | 4 +- .../service/NoteReadPlatformServiceImpl.java | 24 ++++-- .../parts/0033_add_audit_entries_to_note.xml | 77 +++++++++++++++++++ 4 files changed, 101 insertions(+), 12 deletions(-) create mode 100644 fineract-provider/src/main/resources/db/changelog/tenant/parts/0033_add_audit_entries_to_note.xml diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/data/NoteData.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/data/NoteData.java index a973835ad2f..70101927af6 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/data/NoteData.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/data/NoteData.java @@ -18,7 +18,7 @@ */ package org.apache.fineract.portfolio.note.data; -import java.time.ZonedDateTime; +import java.time.OffsetDateTime; import org.apache.fineract.infrastructure.core.data.EnumOptionData; /** @@ -49,17 +49,17 @@ public class NoteData { @SuppressWarnings("unused") private final String createdByUsername; @SuppressWarnings("unused") - private final ZonedDateTime createdOn; + private final OffsetDateTime createdOn; @SuppressWarnings("unused") private final Long updatedById; @SuppressWarnings("unused") private final String updatedByUsername; @SuppressWarnings("unused") - private final ZonedDateTime updatedOn; + private final OffsetDateTime updatedOn; public NoteData(final Long id, final Long clientId, final Long groupId, final Long loanId, final Long transactionId, final Long depositAccountId, final Long savingAccountId, final EnumOptionData noteType, final String note, - final ZonedDateTime createdDate, final Long createdById, final String createdByUsername, final ZonedDateTime lastModifiedDate, + final OffsetDateTime createdDate, final Long createdById, final String createdByUsername, final OffsetDateTime lastModifiedDate, final Long lastModifiedById, final String updatedByUsername) { this.id = id; this.clientId = clientId; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/domain/Note.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/domain/Note.java index f52a7d972dd..5f288061945 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/domain/Note.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/domain/Note.java @@ -27,7 +27,7 @@ import javax.persistence.Table; import org.apache.commons.lang3.StringUtils; import org.apache.fineract.infrastructure.core.api.JsonCommand; -import org.apache.fineract.infrastructure.core.domain.AbstractAuditableCustom; +import org.apache.fineract.infrastructure.core.domain.AbstractAuditableWithUTCDateTimeCustom; import org.apache.fineract.portfolio.client.domain.Client; import org.apache.fineract.portfolio.group.domain.Group; import org.apache.fineract.portfolio.loanaccount.domain.Loan; @@ -38,7 +38,7 @@ @Entity @Table(name = "m_note") -public class Note extends AbstractAuditableCustom { +public class Note extends AbstractAuditableWithUTCDateTimeCustom { @ManyToOne @JoinColumn(name = "client_id", nullable = true) diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/service/NoteReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/service/NoteReadPlatformServiceImpl.java index f5610e06c70..3af2701a4b8 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/service/NoteReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/service/NoteReadPlatformServiceImpl.java @@ -20,7 +20,8 @@ import java.sql.ResultSet; import java.sql.SQLException; -import java.time.ZonedDateTime; +import java.time.LocalDateTime; +import java.time.OffsetDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -28,6 +29,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.fineract.infrastructure.core.data.EnumOptionData; import org.apache.fineract.infrastructure.core.domain.JdbcSupport; +import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.portfolio.note.data.NoteData; import org.apache.fineract.portfolio.note.domain.NoteType; import org.apache.fineract.portfolio.note.exception.NoteNotFoundException; @@ -47,9 +49,10 @@ private static final class NoteMapper implements RowMapper { public String schema() { return " select n.id as id, n.client_id as clientId, n.group_id as groupId, n.loan_id as loanId, n.loan_transaction_id as transactionId, " - + " n.note_type_enum as noteTypeEnum, n.note as note, n.created_date as createdDate, n.createdby_id as createdById, " - + " cb.username as createdBy, n.lastmodified_date as lastModifiedDate, n.lastmodifiedby_id as lastModifiedById, mb.username as modifiedBy " - + " from m_note n left join m_appuser cb on cb.id=n.createdby_id left join m_appuser mb on mb.id=n.lastmodifiedby_id "; + + " n.note_type_enum as noteTypeEnum, n.note as note, n.created_date as createdDate, n.created_by as createdById, " + + " n.created_on_utc as createdDateUtc, n.last_modified_on_utc as lastModifiedDateUtc, " + + " cb.username as createdBy, n.lastmodified_date as lastModifiedDate, n.last_modified_by as lastModifiedById, mb.username as modifiedBy " + + " from m_note n left join m_appuser cb on cb.id=n.created_by left join m_appuser mb on mb.id=n.last_modified_by "; } @Override @@ -67,12 +70,21 @@ public NoteData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int final Integer noteTypeId = JdbcSupport.getInteger(rs, "noteTypeEnum"); final EnumOptionData noteType = NoteEnumerations.noteType(noteTypeId); final String note = rs.getString("note"); - final ZonedDateTime createdDate = JdbcSupport.getDateTime(rs, "createdDate"); + final LocalDateTime createdDateLocal = JdbcSupport.getLocalDateTime(rs, "createdDate"); + final OffsetDateTime createdDateUtc = JdbcSupport.getOffsetDateTime(rs, "createdDateUtc"); final Long createdById = JdbcSupport.getLong(rs, "createdById"); - final ZonedDateTime lastModifiedDate = JdbcSupport.getDateTime(rs, "lastModifiedDate"); + final LocalDateTime lastModifiedDateLocal = JdbcSupport.getLocalDateTime(rs, "lastModifiedDate"); + final OffsetDateTime lastModifiedDateUtc = JdbcSupport.getOffsetDateTime(rs, "lastModifiedDateUtc"); final Long lastModifiedById = JdbcSupport.getLong(rs, "lastModifiedById"); final String createdByUsername = rs.getString("createdBy"); final String updatedByUsername = rs.getString("modifiedBy"); + final OffsetDateTime createdDate = createdDateUtc != null ? + createdDateUtc : + OffsetDateTime.of(createdDateLocal, DateUtils.getDateTimeZoneOfTenant().getRules().getOffset(createdDateLocal)); + final OffsetDateTime lastModifiedDate = lastModifiedDateUtc != null ? + lastModifiedDateUtc : + OffsetDateTime.of(lastModifiedDateLocal, + DateUtils.getDateTimeZoneOfTenant().getRules().getOffset(lastModifiedDateLocal)); return new NoteData(id, clientId, groupId, loanId, transactionId, null, null, noteType, note, createdDate, createdById, createdByUsername, lastModifiedDate, lastModifiedById, updatedByUsername); } diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0033_add_audit_entries_to_note.xml b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0033_add_audit_entries_to_note.xml new file mode 100644 index 00000000000..19f519cdd51 --- /dev/null +++ b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0033_add_audit_entries_to_note.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select count(*) from m_note + + + + + + + select count(*) from m_note + + + + + + + select count(*) from m_note where created_by is null or last_modified_by is null + + + + + From d422ac11dcd1ec72cc74f004d54717f3c92f39c8 Mon Sep 17 00:00:00 2001 From: Adam Saghy Date: Mon, 8 Aug 2022 23:46:21 +0200 Subject: [PATCH 6/7] FINERACT-1670: Add auditable fields to Calendar --- .../portfolio/calendar/data/CalendarData.java | 17 ++-- .../portfolio/calendar/domain/Calendar.java | 4 +- .../CalendarReadPlatformServiceImpl.java | 25 ++++-- .../db/changelog/tenant/changelog-tenant.xml | 4 +- ...o_loan_repayment_schedule_installment.xml} | 0 ...xml => 0034_add_audit_entries_to_note.xml} | 0 .../0035_add_audit_entries_to_calendar.xml | 77 +++++++++++++++++++ 7 files changed, 109 insertions(+), 18 deletions(-) rename fineract-provider/src/main/resources/db/changelog/tenant/parts/{0032_add_audit_entries_to_loan_repayment_schedule_installment.xml => 0033_add_audit_entries_to_loan_repayment_schedule_installment.xml} (100%) rename fineract-provider/src/main/resources/db/changelog/tenant/parts/{0033_add_audit_entries_to_note.xml => 0034_add_audit_entries_to_note.xml} (100%) create mode 100644 fineract-provider/src/main/resources/db/changelog/tenant/parts/0035_add_audit_entries_to_calendar.xml diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/data/CalendarData.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/data/CalendarData.java index 6b6a2f39b64..f19c1a82973 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/data/CalendarData.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/data/CalendarData.java @@ -21,6 +21,7 @@ import java.io.Serializable; import java.time.LocalDate; import java.time.LocalTime; +import java.time.OffsetDateTime; import java.util.Collection; import java.util.List; import java.util.Objects; @@ -65,8 +66,8 @@ public final class CalendarData implements Serializable { private final String humanReadable; private final LocalDate recentEligibleMeetingDate; - private final LocalDate createdDate; - private final LocalDate lastUpdatedDate; + private final OffsetDateTime createdDate; + private final OffsetDateTime lastUpdatedDate; private final Long createdByUserId; private final String createdByUsername; private final Long lastUpdatedByUserId; @@ -204,7 +205,7 @@ public static CalendarData instance(final Long id, final Long calendarInstanceId final Integer duration, final EnumOptionData type, final boolean repeating, final String recurrence, final EnumOptionData frequency, final Integer interval, final EnumOptionData repeatsOnDay, final EnumOptionData repeatsOnNthDayOfMonth, final EnumOptionData remindBy, final Integer firstReminder, - final Integer secondReminder, final String humanReadable, final LocalDate createdDate, final LocalDate lastUpdatedDate, + final Integer secondReminder, final String humanReadable, final OffsetDateTime createdDate, final OffsetDateTime lastUpdatedDate, final Long createdByUserId, final String createdByUsername, final Long lastUpdatedByUserId, final String lastUpdatedByUsername, final LocalTime meetingTime, final Integer repeatsOnDayOfMonth) { @@ -287,8 +288,8 @@ public static CalendarData sensibleDefaultsForNewCalendarCreation() { final List repeatsOnDayOptions = null; final List frequencyNthDayTypeOptions = null; - final LocalDate createdDate = null; - final LocalDate lastUpdatedDate = null; + final OffsetDateTime createdDate = null; + final OffsetDateTime lastUpdatedDate = null; final Long createdByUserId = null; final String createdByUsername = null; final Long lastUpdatedByUserId = null; @@ -326,8 +327,8 @@ private CalendarData(final Long id, final Long calendarInstanceId, final Long en final EnumOptionData frequency, final Integer interval, final EnumOptionData repeatsOnDay, final EnumOptionData repeatsOnNthDayOfMonth, final EnumOptionData remindBy, final Integer firstReminder, final Integer secondReminder, final Collection recurringDates, final Collection nextTenRecurringDates, - final String humanReadable, final LocalDate recentEligibleMeetingDate, final LocalDate createdDate, - final LocalDate lastUpdatedDate, final Long createdByUserId, final String createdByUsername, final Long lastUpdatedByUserId, + final String humanReadable, final LocalDate recentEligibleMeetingDate, final OffsetDateTime createdDate, + final OffsetDateTime lastUpdatedDate, final Long createdByUserId, final String createdByUsername, final Long lastUpdatedByUserId, final String lastUpdatedByUsername, final Integer repeatsOnDayOfMonth, final List entityTypeOptions, final List calendarTypeOptions, final List remindByOptions, final List repeatsOptions, final List repeatsOnDayOptions, final LocalTime meetingTime, @@ -404,7 +405,7 @@ public LocalDate getEndDate() { return this.endDate; } - public LocalDate getCreatedDate() { + public OffsetDateTime getCreatedDate() { return this.createdDate; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/Calendar.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/Calendar.java index 75fa4406cd8..a7eb4894f39 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/Calendar.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/Calendar.java @@ -18,6 +18,7 @@ */ package org.apache.fineract.portfolio.calendar.domain; +import org.apache.fineract.infrastructure.core.domain.AbstractAuditableWithUTCDateTimeCustom; import static org.apache.fineract.portfolio.calendar.CalendarConstants.CALENDAR_RESOURCE_NAME; import java.time.LocalDate; @@ -39,7 +40,6 @@ 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.domain.AbstractAuditableCustom; import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.portfolio.calendar.CalendarConstants.CalendarSupportedParameters; @@ -50,7 +50,7 @@ @Entity @Table(name = "m_calendar") -public class Calendar extends AbstractAuditableCustom { +public class Calendar extends AbstractAuditableWithUTCDateTimeCustom { @Column(name = "title", length = 50, nullable = false) private String title; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarReadPlatformServiceImpl.java index 85f964463c4..12a07ab69f3 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarReadPlatformServiceImpl.java @@ -21,7 +21,9 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.time.LocalDate; +import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.OffsetDateTime; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -56,9 +58,10 @@ public String schema() { + " c.duration as duration, c.calendar_type_enum as typeId, c.repeating as repeating, " + " c.recurrence as recurrence, c.remind_by_enum as remindById, c.first_reminder as firstReminder, c.second_reminder as secondReminder, " + " c.created_date as createdDate, c.lastmodified_date as updatedDate, creatingUser.id as creatingUserId, creatingUser.username as creatingUserName, " + + " c.created_on_utc as createdDateUtc, c.last_modified_on_utc as updatedDateUtc, " + " updatingUser.id as updatingUserId, updatingUser.username as updatingUserName,c.meeting_time as meetingTime " + " from m_calendar c join m_calendar_instance ci on ci.calendar_id=c.id, m_appuser as creatingUser, m_appuser as updatingUser" - + " where c.createdby_id=creatingUser.id and c.lastmodifiedby_id=updatingUser.id "; + + " where c.created_by=creatingUser.id and c.last_modified_by=updatingUser.id "; } @Override @@ -96,17 +99,25 @@ public CalendarData mapRow(final ResultSet rs, @SuppressWarnings("unused") final humanReadable = CalendarUtils.getRRuleReadable(startDate, recurrence); } Integer monthOnDay = CalendarUtils.getMonthOnDay(recurrence); - final LocalDate createdDate = JdbcSupport.getLocalDate(rs, "createdDate"); - final LocalDate lastUpdatedDate = JdbcSupport.getLocalDate(rs, "updatedDate"); + final LocalDateTime createdDateLocal = JdbcSupport.getLocalDateTime(rs, "createdDate"); + final OffsetDateTime createdDateUtc = JdbcSupport.getOffsetDateTime(rs, "createdDateUtc"); + final LocalDateTime lastModifiedDateLocal = JdbcSupport.getLocalDateTime(rs, "updatedDate"); + final OffsetDateTime lastModifiedDateUtc = JdbcSupport.getOffsetDateTime(rs, "updatedDateUtc"); final Long createdByUserId = rs.getLong("creatingUserId"); final String createdByUserName = rs.getString("creatingUserName"); final Long lastUpdatedByUserId = rs.getLong("updatingUserId"); final String lastUpdatedByUserName = rs.getString("updatingUserName"); final LocalTime meetingTime = JdbcSupport.getLocalTime(rs, "meetingTime"); - + final OffsetDateTime createdDate = createdDateUtc != null ? + createdDateUtc : + OffsetDateTime.of(createdDateLocal, DateUtils.getDateTimeZoneOfTenant().getRules().getOffset(createdDateLocal)); + final OffsetDateTime lastModifiedDate = lastModifiedDateUtc != null ? + lastModifiedDateUtc : + OffsetDateTime.of(lastModifiedDateLocal, + DateUtils.getDateTimeZoneOfTenant().getRules().getOffset(lastModifiedDateLocal)); return CalendarData.instance(id, calendarInstanceId, entityId, entityType, title, description, location, startDate, endDate, duration, type, repeating, recurrence, frequency, interval, repeatsOnDay, repeatsOnNthDayOfMonth, remindBy, - firstReminder, secondReminder, humanReadable, createdDate, lastUpdatedDate, createdByUserId, createdByUserName, + firstReminder, secondReminder, humanReadable, createdDate, lastModifiedDate, createdByUserId, createdByUserName, lastUpdatedByUserId, lastUpdatedByUserName, meetingTime, monthOnDay); } } @@ -487,8 +498,8 @@ public CalendarData mapRow(final ResultSet rs, @SuppressWarnings("unused") final humanReadable = CalendarUtils.getRRuleReadable(startDate, recurrence); } - final LocalDate createdDate = null; - final LocalDate lastUpdatedDate = null; + final OffsetDateTime createdDate = null; + final OffsetDateTime lastUpdatedDate = null; final Long createdByUserId = null; final String createdByUserName = null; final Long lastUpdatedByUserId = null; diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml index 946fae60003..4d60f259d33 100644 --- a/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml +++ b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml @@ -52,5 +52,7 @@ ->>>>>>> 92a62bc2d (FINERACT-1670: Add some missing indexes) + + + diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0032_add_audit_entries_to_loan_repayment_schedule_installment.xml b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0033_add_audit_entries_to_loan_repayment_schedule_installment.xml similarity index 100% rename from fineract-provider/src/main/resources/db/changelog/tenant/parts/0032_add_audit_entries_to_loan_repayment_schedule_installment.xml rename to fineract-provider/src/main/resources/db/changelog/tenant/parts/0033_add_audit_entries_to_loan_repayment_schedule_installment.xml diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0033_add_audit_entries_to_note.xml b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0034_add_audit_entries_to_note.xml similarity index 100% rename from fineract-provider/src/main/resources/db/changelog/tenant/parts/0033_add_audit_entries_to_note.xml rename to fineract-provider/src/main/resources/db/changelog/tenant/parts/0034_add_audit_entries_to_note.xml diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0035_add_audit_entries_to_calendar.xml b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0035_add_audit_entries_to_calendar.xml new file mode 100644 index 00000000000..43204ed69e7 --- /dev/null +++ b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0035_add_audit_entries_to_calendar.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select count(*) from m_calendar + + + + + + + select count(*) from m_calendar + + + + + + + select count(*) from m_calendar where created_by is null or last_modified_by is null + + + + + From 563f4733a9e26216accdd87fdd1cfc1031851e54 Mon Sep 17 00:00:00 2001 From: Adam Saghy Date: Mon, 8 Aug 2022 23:48:47 +0200 Subject: [PATCH 7/7] Spotless apply --- .../portfolio/calendar/data/CalendarData.java | 16 +++++++++------- .../portfolio/calendar/domain/Calendar.java | 2 +- .../CalendarReadPlatformServiceImpl.java | 10 ++++------ .../domain/LoanRepaymentScheduleHistory.java | 17 ++++++++++------- ...ScheduleHistoryWritePlatformServiceImpl.java | 6 ++++-- ...scheduleRequestWritePlatformServiceImpl.java | 1 - .../service/NoteReadPlatformServiceImpl.java | 10 ++++------ 7 files changed, 32 insertions(+), 30 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/data/CalendarData.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/data/CalendarData.java index f19c1a82973..406df835595 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/data/CalendarData.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/data/CalendarData.java @@ -205,9 +205,10 @@ public static CalendarData instance(final Long id, final Long calendarInstanceId final Integer duration, final EnumOptionData type, final boolean repeating, final String recurrence, final EnumOptionData frequency, final Integer interval, final EnumOptionData repeatsOnDay, final EnumOptionData repeatsOnNthDayOfMonth, final EnumOptionData remindBy, final Integer firstReminder, - final Integer secondReminder, final String humanReadable, final OffsetDateTime createdDate, final OffsetDateTime lastUpdatedDate, - final Long createdByUserId, final String createdByUsername, final Long lastUpdatedByUserId, final String lastUpdatedByUsername, - final LocalTime meetingTime, final Integer repeatsOnDayOfMonth) { + final Integer secondReminder, final String humanReadable, final OffsetDateTime createdDate, + final OffsetDateTime lastUpdatedDate, final Long createdByUserId, final String createdByUsername, + final Long lastUpdatedByUserId, final String lastUpdatedByUsername, final LocalTime meetingTime, + final Integer repeatsOnDayOfMonth) { final Collection recurringDates = null; final Collection nextTenRecurringDates = null; @@ -328,10 +329,11 @@ private CalendarData(final Long id, final Long calendarInstanceId, final Long en final EnumOptionData repeatsOnNthDayOfMonth, final EnumOptionData remindBy, final Integer firstReminder, final Integer secondReminder, final Collection recurringDates, final Collection nextTenRecurringDates, final String humanReadable, final LocalDate recentEligibleMeetingDate, final OffsetDateTime createdDate, - final OffsetDateTime lastUpdatedDate, final Long createdByUserId, final String createdByUsername, final Long lastUpdatedByUserId, - final String lastUpdatedByUsername, final Integer repeatsOnDayOfMonth, final List entityTypeOptions, - final List calendarTypeOptions, final List remindByOptions, - final List repeatsOptions, final List repeatsOnDayOptions, final LocalTime meetingTime, + final OffsetDateTime lastUpdatedDate, final Long createdByUserId, final String createdByUsername, + final Long lastUpdatedByUserId, final String lastUpdatedByUsername, final Integer repeatsOnDayOfMonth, + final List entityTypeOptions, final List calendarTypeOptions, + final List remindByOptions, final List repeatsOptions, + final List repeatsOnDayOptions, final LocalTime meetingTime, final List frequencyNthDayTypeOptions) { this.id = id; this.calendarInstanceId = calendarInstanceId; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/Calendar.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/Calendar.java index a7eb4894f39..1951580eb32 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/Calendar.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/Calendar.java @@ -18,7 +18,6 @@ */ package org.apache.fineract.portfolio.calendar.domain; -import org.apache.fineract.infrastructure.core.domain.AbstractAuditableWithUTCDateTimeCustom; import static org.apache.fineract.portfolio.calendar.CalendarConstants.CALENDAR_RESOURCE_NAME; import java.time.LocalDate; @@ -40,6 +39,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.domain.AbstractAuditableWithUTCDateTimeCustom; import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.portfolio.calendar.CalendarConstants.CalendarSupportedParameters; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarReadPlatformServiceImpl.java index 12a07ab69f3..2d63b125fc7 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarReadPlatformServiceImpl.java @@ -108,12 +108,10 @@ public CalendarData mapRow(final ResultSet rs, @SuppressWarnings("unused") final final Long lastUpdatedByUserId = rs.getLong("updatingUserId"); final String lastUpdatedByUserName = rs.getString("updatingUserName"); final LocalTime meetingTime = JdbcSupport.getLocalTime(rs, "meetingTime"); - final OffsetDateTime createdDate = createdDateUtc != null ? - createdDateUtc : - OffsetDateTime.of(createdDateLocal, DateUtils.getDateTimeZoneOfTenant().getRules().getOffset(createdDateLocal)); - final OffsetDateTime lastModifiedDate = lastModifiedDateUtc != null ? - lastModifiedDateUtc : - OffsetDateTime.of(lastModifiedDateLocal, + final OffsetDateTime createdDate = createdDateUtc != null ? createdDateUtc + : OffsetDateTime.of(createdDateLocal, DateUtils.getDateTimeZoneOfTenant().getRules().getOffset(createdDateLocal)); + final OffsetDateTime lastModifiedDate = lastModifiedDateUtc != null ? lastModifiedDateUtc + : OffsetDateTime.of(lastModifiedDateLocal, DateUtils.getDateTimeZoneOfTenant().getRules().getOffset(lastModifiedDateLocal)); return CalendarData.instance(id, calendarInstanceId, entityId, entityType, title, description, location, startDate, endDate, duration, type, repeating, recurrence, frequency, interval, repeatsOnDay, repeatsOnNthDayOfMonth, remindBy, diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanRepaymentScheduleHistory.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanRepaymentScheduleHistory.java index 36147cc1a72..25d8c148096 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanRepaymentScheduleHistory.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanRepaymentScheduleHistory.java @@ -18,6 +18,9 @@ */ package org.apache.fineract.portfolio.loanaccount.loanschedule.domain; +import static org.apache.fineract.infrastructure.core.domain.AuditableFieldsConstants.CREATED_DATE_DB_FIELD; +import static org.apache.fineract.infrastructure.core.domain.AuditableFieldsConstants.LAST_MODIFIED_DATE_DB_FIELD; + import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; @@ -29,8 +32,6 @@ import javax.persistence.OneToOne; import javax.persistence.Table; import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; -import static org.apache.fineract.infrastructure.core.domain.AuditableFieldsConstants.CREATED_DATE_DB_FIELD; -import static org.apache.fineract.infrastructure.core.domain.AuditableFieldsConstants.LAST_MODIFIED_DATE_DB_FIELD; import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.rescheduleloan.domain.LoanRescheduleRequest; @@ -83,7 +84,7 @@ public class LoanRepaymentScheduleHistory extends AbstractPersistableCustom { private OffsetDateTime createdDate; @Column(name = LAST_MODIFIED_DATE_DB_FIELD) - private OffsetDateTime lastModifiedDate; + private OffsetDateTime lastModifiedDate; @Column(name = "version") private Integer version; @@ -100,7 +101,8 @@ private LoanRepaymentScheduleHistory(final Loan loan, final LoanRescheduleReques final Integer installmentNumber, final LocalDate fromDate, final LocalDate dueDate, final BigDecimal principal, final BigDecimal interestCharged, final BigDecimal feeChargesCharged, final BigDecimal penaltyCharges, final LocalDateTime oldCreatedOnDate, final Long createdByUser, final Long lastModifiedByUser, - final LocalDateTime oldLastModifiedOnDate, final Integer version, final OffsetDateTime createdDate, final OffsetDateTime lastModifiedDate) { + final LocalDateTime oldLastModifiedOnDate, final Integer version, final OffsetDateTime createdDate, + final OffsetDateTime lastModifiedDate) { this.loan = loan; this.loanRescheduleRequest = loanRescheduleRequest; @@ -127,11 +129,12 @@ public static LoanRepaymentScheduleHistory instance(final Loan loan, final LoanR final Integer installmentNumber, final LocalDate fromDate, final LocalDate dueDate, final BigDecimal principal, final BigDecimal interestCharged, final BigDecimal feeChargesCharged, final BigDecimal penaltyCharges, final LocalDateTime oldCreatedOnDate, final Long createdByUser, final Long lastModifiedByUser, - final LocalDateTime oldLastModifiedOnDate, final Integer version, final OffsetDateTime createdDate, final OffsetDateTime lastModifiedDate) { + final LocalDateTime oldLastModifiedOnDate, final Integer version, final OffsetDateTime createdDate, + final OffsetDateTime lastModifiedDate) { return new LoanRepaymentScheduleHistory(loan, loanRescheduleRequest, installmentNumber, fromDate, dueDate, principal, - interestCharged, feeChargesCharged, penaltyCharges, oldCreatedOnDate, createdByUser, lastModifiedByUser, oldLastModifiedOnDate, - version, createdDate, lastModifiedDate); + interestCharged, feeChargesCharged, penaltyCharges, oldCreatedOnDate, createdByUser, lastModifiedByUser, + oldLastModifiedOnDate, version, createdDate, lastModifiedDate); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleHistoryWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleHistoryWritePlatformServiceImpl.java index 91f46815a91..ea75aee9bdd 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleHistoryWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleHistoryWritePlatformServiceImpl.java @@ -84,8 +84,10 @@ public List createLoanScheduleArchive( oldLastModifiedOnDate = (LocalDateTime) oldDates.get("lastmodified_date"); } - final Long createdByUser = repaymentScheduleInstallment.getCreatedBy().orElse(platformSecurityContext.authenticatedUser().getId()); - final Long lastModifiedByUser = repaymentScheduleInstallment.getLastModifiedBy().orElse(platformSecurityContext.authenticatedUser().getId()); + final Long createdByUser = repaymentScheduleInstallment.getCreatedBy() + .orElse(platformSecurityContext.authenticatedUser().getId()); + final Long lastModifiedByUser = repaymentScheduleInstallment.getLastModifiedBy() + .orElse(platformSecurityContext.authenticatedUser().getId()); OffsetDateTime lastModifiedOnDate = DateUtils.getOffsetDateTimeOfTenant(); if (repaymentScheduleInstallment.getLastModifiedDate().isPresent()) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java index 6f7e37d87d5..70dbc7452f7 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java @@ -475,7 +475,6 @@ public CommandProcessingResult approve(JsonCommand jsonCommand) { loan.recalculateAllCharges(); ChangedTransactionDetail changedTransactionDetail = loan.processTransactions(); - this.loanRepaymentScheduleHistoryRepository.saveAll(loanRepaymentScheduleHistoryList); loan.updateRescheduledByUser(appUser); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/service/NoteReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/service/NoteReadPlatformServiceImpl.java index 3af2701a4b8..be125097c05 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/service/NoteReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/service/NoteReadPlatformServiceImpl.java @@ -78,12 +78,10 @@ public NoteData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int final Long lastModifiedById = JdbcSupport.getLong(rs, "lastModifiedById"); final String createdByUsername = rs.getString("createdBy"); final String updatedByUsername = rs.getString("modifiedBy"); - final OffsetDateTime createdDate = createdDateUtc != null ? - createdDateUtc : - OffsetDateTime.of(createdDateLocal, DateUtils.getDateTimeZoneOfTenant().getRules().getOffset(createdDateLocal)); - final OffsetDateTime lastModifiedDate = lastModifiedDateUtc != null ? - lastModifiedDateUtc : - OffsetDateTime.of(lastModifiedDateLocal, + final OffsetDateTime createdDate = createdDateUtc != null ? createdDateUtc + : OffsetDateTime.of(createdDateLocal, DateUtils.getDateTimeZoneOfTenant().getRules().getOffset(createdDateLocal)); + final OffsetDateTime lastModifiedDate = lastModifiedDateUtc != null ? lastModifiedDateUtc + : OffsetDateTime.of(lastModifiedDateLocal, DateUtils.getDateTimeZoneOfTenant().getRules().getOffset(lastModifiedDateLocal)); return new NoteData(id, clientId, groupId, loanId, transactionId, null, null, noteType, note, createdDate, createdById, createdByUsername, lastModifiedDate, lastModifiedById, updatedByUsername);