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/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..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 @@ -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,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 LocalDate createdDate, final LocalDate 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; @@ -287,8 +289,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,11 +328,12 @@ 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 lastUpdatedByUsername, final Integer repeatsOnDayOfMonth, final List entityTypeOptions, - final List calendarTypeOptions, final List remindByOptions, - final List repeatsOptions, final List repeatsOnDayOptions, final LocalTime meetingTime, + 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 List frequencyNthDayTypeOptions) { this.id = id; this.calendarInstanceId = calendarInstanceId; @@ -404,7 +407,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..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 @@ -39,7 +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.AbstractAuditableCustom; +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; @@ -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..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 @@ -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,23 @@ 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 +496,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/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/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..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,9 +18,13 @@ */ 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; +import java.time.OffsetDateTime; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.JoinColumn; @@ -65,7 +69,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 +78,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 +100,9 @@ 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 +113,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 +128,13 @@ 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..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 @@ -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,35 @@ 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..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,9 +475,7 @@ 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/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..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 @@ -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,19 @@ 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/changelog-tenant.xml b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml index 8d208a8d500..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 @@ -49,4 +49,10 @@ + + + + + + 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 + + + + + + + + + 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 + + + + + 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 @@ + + + + + + + + + + + + + + + diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0033_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 new file mode 100644 index 00000000000..9144fea6613 --- /dev/null +++ b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0033_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 + + + + + diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0034_add_audit_entries_to_note.xml b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0034_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/0034_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 + + + + + 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 + + + + +