This is an automated email from the ASF dual-hosted git repository.

aleks pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git

commit 4029464e32d8494875de970b3bb4ab60eb79d8a9
Author: Adam Saghy <[email protected]>
AuthorDate: Mon Aug 8 23:44:59 2022 +0200

    FINERACT-1670: Add auditable fields to Loan Repayment Schedule installment 
and history
---
 .../domain/LoanRepaymentScheduleInstallment.java   |   6 +-
 .../domain/LoanRepaymentScheduleHistory.java       |  31 +++++--
 .../LoanScheduleHistoryReadPlatformService.java    |   3 +
 ...LoanScheduleHistoryReadPlatformServiceImpl.java |   7 ++
 ...oanScheduleHistoryWritePlatformServiceImpl.java |  43 +++++----
 ...nRescheduleRequestWritePlatformServiceImpl.java |   5 +-
 .../LoanWritePlatformServiceJpaRepositoryImpl.java |   3 -
 ...ries_to_loan_repayment_schedule_installment.xml | 103 +++++++++++++++++++++
 8 files changed, 165 insertions(+), 36 deletions(-)

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 5430c4b6a..078e051b0 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.JoinColumn;
 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<LoanRepaymentScheduleInstallment> {
 
     @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<LoanInstallmentCharge> 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 7b2acca54..36147cc1a 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 @@ package 
org.apache.fineract.portfolio.loanaccount.loanschedule.domain;
 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.ManyToOne;
 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 @@ public class LoanRepaymentScheduleHistory extends 
AbstractPersistableCustom {
     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 @@ public class LoanRepaymentScheduleHistory extends 
AbstractPersistableCustom {
         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 @@ public class LoanRepaymentScheduleHistory extends 
AbstractPersistableCustom {
     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 cd2bf3e03..22270a17b 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> disbursementData);
+
+    Map<String, Object> 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 ebf487643..4ab2750c9 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.LocalDate;
 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 class LoanScheduleHistoryReadPlatformServiceImpl 
implements LoanScheduleH
         }
     }
 
+    @Override
+    public Map<String, Object> 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<LoanScheduleData> {
 
         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 12f5d2f78..91f46815a 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 @@ package 
org.apache.fineract.portfolio.loanaccount.loanschedule.service;
 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<LoanRepaymentScheduleHistory> createLoanScheduleArchive(
@@ -73,23 +72,33 @@ public class LoanScheduleHistoryWritePlatformServiceImpl 
implements LoanSchedule
             final BigDecimal feeChargesCharged = 
repaymentScheduleInstallment.getFeeChargesCharged(currency).getAmount();
             final BigDecimal penaltyCharges = 
repaymentScheduleInstallment.getPenaltyChargesCharged(currency).getAmount();
 
-            LocalDateTime createdOnDate = null;
+            Map<String, Object> 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 976b19ab2..6f7e37d87 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 class LoanRescheduleRequestWritePlatformServiceImpl 
implements LoanResche
             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 936c37690..029ca66e1 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 class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
                 // 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 000000000..9144fea66
--- /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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements. See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership. The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License. You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied. See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog";
+                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+                   
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog 
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.3.xsd";>
+    <changeSet author="fineract" id="loan_repayment_schedule-1" 
context="mysql">
+        <addColumn tableName="m_loan_repayment_schedule">
+            <column name="created_on_utc" type="DATETIME"/>
+            <column name="last_modified_on_utc" type="DATETIME"/>
+        </addColumn>
+    </changeSet>
+    <changeSet author="fineract" id="loan_repayment_schedule-1" 
context="postgresql">
+        <addColumn tableName="m_loan_repayment_schedule">
+            <column name="created_on_utc" type="TIMESTAMP WITH TIME ZONE"/>
+            <column name="last_modified_on_utc" type="TIMESTAMP WITH TIME 
ZONE"/>
+        </addColumn>
+    </changeSet>
+
+    <changeSet id="loan_repayment_schedule-2" author="fineract">
+        <dropNotNullConstraint tableName="m_loan_repayment_schedule" 
columnName="created_date" columnDataType="datetime"/>
+        <dropNotNullConstraint tableName="m_loan_repayment_schedule" 
columnName="lastmodified_date" columnDataType="datetime"/>
+    </changeSet>
+    <changeSet id="loan_repayment_schedule-3" author="fineract">
+        <renameColumn tableName="m_loan_repayment_schedule" 
oldColumnName="createdby_id" newColumnName="created_by" 
columnDataType="BIGINT"/>
+        <renameColumn tableName="m_loan_repayment_schedule" 
oldColumnName="lastmodifiedby_id" newColumnName="last_modified_by" 
columnDataType="BIGINT"/>
+    </changeSet>
+    <changeSet author="fineract" id="loan_repayment_schedule-4">
+        <addForeignKeyConstraint baseColumnNames="created_by" 
baseTableName="m_loan_repayment_schedule"
+                                 
constraintName="FK_loan_repayment_schedule_created_by" deferrable="false" 
initiallyDeferred="false"
+                                 onDelete="RESTRICT" onUpdate="RESTRICT" 
referencedColumnNames="id"
+                                 referencedTableName="m_appuser" 
validate="true"/>
+        <addForeignKeyConstraint baseColumnNames="last_modified_by" 
baseTableName="m_loan_repayment_schedule"
+                                 
constraintName="FK_loan_repayment_schedule_last_modified_by" deferrable="false" 
initiallyDeferred="false"
+                                 onDelete="RESTRICT" onUpdate="RESTRICT" 
referencedColumnNames="id"
+                                 referencedTableName="m_appuser" 
validate="true"/>
+    </changeSet>
+    <changeSet id="loan_repayment_schedule-5" author="fineract" 
context="mysql">
+        <preConditions onFail="MARK_RAN">
+            <sqlCheck expectedResult="0">select count(*) from 
m_loan_repayment_schedule</sqlCheck>
+        </preConditions>
+        <addNotNullConstraint tableName="m_loan_repayment_schedule" 
columnName="created_on_utc" columnDataType="DATETIME"/>
+        <addNotNullConstraint tableName="m_loan_repayment_schedule" 
columnName="last_modified_on_utc" columnDataType="DATETIME"/>
+    </changeSet>
+    <changeSet id="loan_repayment_schedule-5" author="fineract" 
context="postgresql">
+        <preConditions onFail="MARK_RAN">
+            <sqlCheck expectedResult="0">select count(*) from 
m_loan_repayment_schedule</sqlCheck>
+        </preConditions>
+        <addNotNullConstraint tableName="m_loan_repayment_schedule" 
columnName="created_on_utc" columnDataType="TIMESTAMP WITH TIME ZONE"/>
+        <addNotNullConstraint tableName="m_loan_repayment_schedule" 
columnName="last_modified_on_utc" columnDataType="TIMESTAMP WITH TIME ZONE"/>
+    </changeSet>
+    <changeSet id="loan_repayment_schedule-6" author="fineract">
+        <preConditions onFail="MARK_RAN">
+            <sqlCheck expectedResult="0">select count(*) from 
m_loan_repayment_schedule where created_by is null or last_modified_by is 
null</sqlCheck>
+        </preConditions>
+        <addNotNullConstraint tableName="m_loan_repayment_schedule" 
columnName="created_by" columnDataType="BIGINT"/>
+        <addNotNullConstraint tableName="m_loan_repayment_schedule" 
columnName="last_modified_by" columnDataType="BIGINT"/>
+    </changeSet>
+    <changeSet author="fineract" id="loan_repayment_schedule_history-1" 
context="mysql">
+        <addColumn tableName="m_loan_repayment_schedule_history">
+            <column name="created_on_utc" type="DATETIME"/>
+            <column name="last_modified_on_utc" type="DATETIME"/>
+        </addColumn>
+    </changeSet>
+    <changeSet author="fineract" id="loan_repayment_schedule_history-1" 
context="postgresql">
+        <addColumn tableName="m_loan_repayment_schedule_history">
+            <column name="created_on_utc" type="TIMESTAMP WITH TIME ZONE"/>
+            <column name="last_modified_on_utc" type="TIMESTAMP WITH TIME 
ZONE"/>
+        </addColumn>
+    </changeSet>
+    <changeSet id="loan_repayment_schedule_history-2" author="fineract" 
context="mysql">
+        <preConditions onFail="MARK_RAN">
+            <sqlCheck expectedResult="0">select count(*) from 
m_loan_repayment_schedule_history</sqlCheck>
+        </preConditions>
+        <addNotNullConstraint tableName="m_loan_repayment_schedule_history" 
columnName="created_on_utc" columnDataType="DATETIME"/>
+        <addNotNullConstraint tableName="m_loan_repayment_schedule_history" 
columnName="last_modified_on_utc" columnDataType="DATETIME"/>
+    </changeSet>
+    <changeSet id="loan_repayment_schedule_history-2" author="fineract" 
context="postgresql">
+        <preConditions onFail="MARK_RAN">
+            <sqlCheck expectedResult="0">select count(*) from 
m_loan_repayment_schedule_history</sqlCheck>
+        </preConditions>
+        <addNotNullConstraint tableName="m_loan_repayment_schedule_history" 
columnName="created_on_utc" columnDataType="TIMESTAMP WITH TIME ZONE"/>
+        <addNotNullConstraint tableName="m_loan_repayment_schedule_history" 
columnName="last_modified_on_utc" columnDataType="TIMESTAMP WITH TIME ZONE"/>
+    </changeSet>
+</databaseChangeLog>

Reply via email to