You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fineract.apache.org by al...@apache.org on 2023/02/19 20:59:47 UTC

[fineract] branch 1.8.4 updated: FINERACT-1857: Backport Flyway migrations to Liquibase for version 1.4 to 1.6 for releases 1.8.x

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

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


The following commit(s) were added to refs/heads/1.8.4 by this push:
     new 22e085416 FINERACT-1857: Backport Flyway migrations to Liquibase for version 1.4 to 1.6 for releases 1.8.x
22e085416 is described below

commit 22e08541623fee42a4d79c0f6785284541470b15
Author: Aleks <al...@apache.org>
AuthorDate: Wed Jan 25 12:04:38 2023 +0100

    FINERACT-1857: Backport Flyway migrations to Liquibase for version 1.4 to 1.6 for releases 1.8.x
---
 fineract-provider/build.gradle                     |  20 +
 .../tenant-store/upgrades/0000_upgrade_to_1.6.xml  |  35 ++
 .../tenant/upgrades/0000_upgrade_to_1.5.xml        | 100 ++++
 .../tenant/upgrades/0000_upgrade_to_1.6.xml        | 526 +++++++++++++++++++++
 4 files changed, 681 insertions(+)

diff --git a/fineract-provider/build.gradle b/fineract-provider/build.gradle
index edafbab2d..a477deb14 100644
--- a/fineract-provider/build.gradle
+++ b/fineract-provider/build.gradle
@@ -303,6 +303,26 @@ jib {
     }
 }
 
+task migrateDatabase {
+    doFirst {
+        println "Executing liquibase database migration to version $dbVersion"
+
+        def dbUrl = "jdbc:$dbType://$dbHost:$dbPort/$dbName"
+        def changeLogFilePath = "fineract-provider/src/main/resources/db/changelog/tenant/upgrades/0000_upgrade_to_$dbVersion.xml"
+
+        liquibase {
+            activities {
+                main {
+                    changeLogFile changeLogFilePath
+                    url dbUrl
+                    username project.ext.mysqlUser
+                    password project.ext.mysqlPassword
+                }
+            }
+        }
+    }
+}
+
 tasks.jibDockerBuild.dependsOn(bootJar)
 
 // Configuration for git properties gradle plugin
diff --git a/fineract-provider/src/main/resources/db/changelog/tenant-store/upgrades/0000_upgrade_to_1.6.xml b/fineract-provider/src/main/resources/db/changelog/tenant-store/upgrades/0000_upgrade_to_1.6.xml
new file mode 100644
index 000000000..83e384d5f
--- /dev/null
+++ b/fineract-provider/src/main/resources/db/changelog/tenant-store/upgrades/0000_upgrade_to_1.6.xml
@@ -0,0 +1,35 @@
+<?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.1.xsd">
+    <!-- V5__add_schema_connection_parameters.sql -->
+    <changeSet author="fineract" id="5">
+        <addColumn tableName="tenant_server_connections">
+            <column name="schema_connection_parameters" type="TEXT" defaultValueComputed="NULL"/>
+        </addColumn>
+    </changeSet>
+    <!-- V6__add_unique_tenant_identifier.sql -->
+    <changeSet author="fineract" id="6">
+        <addUniqueConstraint tableName="tenants" columnNames="identifier" />
+    </changeSet>
+</databaseChangeLog>
diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/upgrades/0000_upgrade_to_1.5.xml b/fineract-provider/src/main/resources/db/changelog/tenant/upgrades/0000_upgrade_to_1.5.xml
new file mode 100644
index 000000000..832b65aee
--- /dev/null
+++ b/fineract-provider/src/main/resources/db/changelog/tenant/upgrades/0000_upgrade_to_1.5.xml
@@ -0,0 +1,100 @@
+<?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.1.xsd">
+    <!-- V362__reschedule_interest_to_lrs.sql -->
+    <changeSet author="fineract" id="362">
+        <addColumn tableName="m_loan_repayment_schedule">
+            <column name="reschedule_interest_portion" type="decimal(19,6)" defaultValueComputed="NULL" position="14" />
+        </addColumn>
+    </changeSet>
+    <!-- V363__mnote_indexing_for_performance.sql -->
+    <changeSet author="fineract" id="363">
+        <createIndex indexName="savings_account_transaction_id" tableName="m_note">
+            <column defaultValueComputed="NULL" name="savings_account_transaction_id"/>
+        </createIndex>
+    </changeSet>
+    <!-- V364__elastic_hook_template.sql -->
+    <changeSet author="fineract" id="364">
+        <insert tableName="m_hook_templates">
+            <column name="id" valueNumeric="3"/>
+            <column name="name" value="Elastic Search"/>
+        </insert>
+        <insert tableName="m_hook_schema">
+            <column name="id" valueNumeric="8"/>
+            <column name="hook_template_id" valueNumeric="3"/>
+            <column name="field_type" value="string"/>
+            <column name="field_name" value="Payload URL"/>
+            <column name="placeholder" value="http://&lt;host&gt;/&lt;index name&gt;/&lt;type name&gt;"/>
+            <column name="optional" valueBoolean="false"/>
+        </insert>
+        <insert tableName="m_hook_schema">
+            <column name="id" valueNumeric="9"/>
+            <column name="hook_template_id" valueNumeric="3"/>
+            <column name="field_type" value="string"/>
+            <column name="field_name" value="Content Type"/>
+            <column name="placeholder" value="json"/>
+            <column name="optional" valueBoolean="false"/>
+        </insert>
+        <insert tableName="m_hook_schema">
+            <column name="id" valueNumeric="10"/>
+            <column name="hook_template_id" valueNumeric="3"/>
+            <column name="field_type" value="string"/>
+            <column name="field_name" value="Index Name"/>
+            <column name="placeholder"/>
+            <column name="optional" valueBoolean="true"/>
+        </insert>
+    </changeSet>
+    <!-- V365__reportCategoryList-FINERACT-1306.sql -->
+    <changeSet author="fineract" id="365">
+        <insert tableName="stretchy_parameter">
+            <column name="id" valueNumeric="1003"/>
+            <column name="parameter_name" value="reportCategoryList"/>
+            <column name="parameter_variable"/>
+            <column name="parameter_label" value="n/a"/>
+            <column name="parameter_displayType" value="n/a"/>
+            <column name="parameter_FormatType" value="n/a"/>
+            <column name="parameter_default" value="n/a"/>
+            <column name="special" value="Y"/>
+            <column name="selectOne"/>
+            <column name="selectAll"/>
+            <column name="parameter_sql"
+                    value="select  r.id as report_id, r.report_name, r.report_type, r.report_subtype, r.report_category,&#10;  rp.id as parameter_id, rp.report_parameter_name, p.parameter_name&#10;  from stretchy_report r&#10;  left join stretchy_report_parameter rp on rp.report_id = r.id&#10;  left join stretchy_parameter p on p.id = rp.parameter_id&#10;  where r.report_category = '${reportCategory}'&#10;  and r.use_report is true and r.self_service_user_report = '${isSelfServiceUser}'  [...]
+            <column name="parent_id"/>
+        </insert>
+        <insert tableName="stretchy_parameter">
+            <column name="id" valueNumeric="1004"/>
+            <column name="parameter_name" value="selectAccount"/>
+            <column name="parameter_variable" value="accountNo"/>
+            <column name="parameter_label" value="Enter Account No"/>
+            <column name="parameter_displayType" value="text"/>
+            <column name="parameter_FormatType" value="string"/>
+            <column name="parameter_default" value="n/a"/>
+            <column name="special"/>
+            <column name="selectOne"/>
+            <column name="selectAll"/>
+            <column name="parameter_sql"/>
+            <column name="parent_id"/>
+        </insert>
+    </changeSet>
+</databaseChangeLog>
diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/upgrades/0000_upgrade_to_1.6.xml b/fineract-provider/src/main/resources/db/changelog/tenant/upgrades/0000_upgrade_to_1.6.xml
new file mode 100644
index 000000000..d031036ce
--- /dev/null
+++ b/fineract-provider/src/main/resources/db/changelog/tenant/upgrades/0000_upgrade_to_1.6.xml
@@ -0,0 +1,526 @@
+<?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.1.xsd">
+    <!-- V366_remove_leading_or_trailing_spaces_in_reportnames.sql -->
+    <changeSet author="fineract" id="366">
+        <sql>
+            UPDATE stretchy_report SET report_name = TRIM(report_name) WHERE id IN (SELECT id FROM (SELECT id FROM stretchy_report WHERE CHAR_LENGTH(report_name) != CHAR_LENGTH(TRIM(report_name)))Y);
+        </sql>
+    </changeSet>
+    <!-- V367__reports_for_email_campaigns.sql -->
+    <changeSet author="fineract" id="367">
+        <preConditions onFail="MARK_RAN">
+            <sqlCheck expectedResult="0">
+                SELECT COUNT(*) FROM stretchy_report WHERE report_name IN ('Loan Approved - Email','Loan Rejected - Email','Loan Repayment - Email');
+            </sqlCheck>
+        </preConditions>
+        <insert tableName="stretchy_report">
+            <column name="report_name" value="Loan Approved - Email"/>
+            <column name="report_type" value="Email"/>
+            <column name="report_subtype" value="Triggered"/>
+            <column name="report_category"/>
+            <column name="report_sql"
+                    value="select  ml.id as loanId,  ifnull(mc.id,mc2.id) as id,  ifnull(mc.firstname,mc2.firstname) as firstname,  &#10;ifnull(mc.middlename,ifnull(mc2.middlename,(''))) as middlename,  ifnull(mc.lastname,mc2.lastname) as lastname,  &#10;ifnull(mc.display_name,mc2.display_name) as display_name,  ifnull(mc.status_enum,mc2.status_enum) as status_enum, &#10;ifnull(mc.mobile_no,mc2.mobile_no) as mobile_no, ifnull(mg.office_id,mc2.office_id) as office_id, ifnull(mg.staff_id,m [...]
+            <column name="description" value="Loan and client data of approved loan"/>
+            <column name="core_report" valueBoolean="false"/>
+            <column name="use_report" valueBoolean="true"/>
+            <column name="self_service_user_report" valueBoolean="false"/>
+        </insert>
+        <insert tableName="stretchy_report">
+            <column name="report_name" value="Loan Rejected - Email"/>
+            <column name="report_type" value="Email"/>
+            <column name="report_subtype" value="Triggered"/>
+            <column name="report_category"/>
+            <column name="report_sql"
+                    value="select  ml.id as loanId,  ifnull(mc.id,mc2.id) as id,  ifnull(mc.firstname,mc2.firstname) as firstname,  &#10;ifnull(mc.middlename,ifnull(mc2.middlename,(''))) as middlename,  ifnull(mc.lastname,mc2.lastname) as lastname,  &#10;ifnull(mc.display_name,mc2.display_name) as display_name,  ifnull(mc.status_enum,mc2.status_enum) as status_enum, &#10;ifnull(mc.mobile_no,mc2.mobile_no) as mobile_no, ifnull(mg.office_id,mc2.office_id) as office_id, ifnull(mg.staff_id,m [...]
+            <column name="description" value="Loan and client data of rejected loan"/>
+            <column name="core_report" valueBoolean="false"/>
+            <column name="use_report" valueBoolean="true"/>
+            <column name="self_service_user_report" valueBoolean="false"/>
+        </insert>
+        <insert tableName="stretchy_report">
+            <column name="report_name" value="Loan Repayment - Email"/>
+            <column name="report_type" value="Email"/>
+            <column name="report_subtype" value="Triggered"/>
+            <column name="report_category"/>
+            <column name="report_sql"
+                    value="select  ml.id as loanId,  ifnull(mc.id,mc2.id) as id,  ifnull(mc.firstname,mc2.firstname) as firstname,  &#10;ifnull(mc.middlename,ifnull(mc2.middlename,(''))) as middlename,  ifnull(mc.lastname,mc2.lastname) as lastname,  &#10;ifnull(mc.display_name,mc2.display_name) as display_name,  ifnull(mc.status_enum,mc2.status_enum) as status_enum, &#10;ifnull(mc.mobile_no,mc2.mobile_no) as mobile_no, ifnull(mg.office_id,mc2.office_id) as office_id, ifnull(mg.staff_id,m [...]
+            <column name="description" value="Loan and client data of rejected loan"/>
+            <column name="core_report" valueBoolean="false"/>
+            <column name="use_report" valueBoolean="true"/>
+            <column name="self_service_user_report" valueBoolean="false"/>
+        </insert>
+        <modifyDataType tableName="scheduled_email_campaign" columnName="email_attachment_file_format" newDataType="VARCHAR(10) NULL"/>
+        <modifyDataType tableName="scheduled_email_campaign" columnName="stretchy_report_id" newDataType="INT NULL"/>
+    </changeSet>
+    <!-- V368__collateral_management.sql -->
+    <changeSet author="fineract" id="368">
+        <createTable tableName="m_collateral_management">
+            <column autoIncrement="true" name="id" type="BIGINT">
+                <constraints nullable="false" primaryKey="true"/>
+            </column>
+            <column name="name" type="VARCHAR(50)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="quality" type="VARCHAR(40)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="base_price" type="DECIMAL(20, 5)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="unit_type" type="VARCHAR(10)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="pct_to_base" type="DECIMAL(20, 5)">
+                <constraints nullable="false"/>
+            </column>
+            <column defaultValueComputed="NULL" name="currency" type="BIGINT"/>
+        </createTable>
+        <createIndex indexName="fkCurrencyCode" tableName="m_collateral_management">
+            <column defaultValueComputed="NULL" name="currency"/>
+        </createIndex>
+        <createTable tableName="m_client_collateral_management">
+            <column autoIncrement="true" name="id" type="BIGINT">
+                <constraints nullable="false" primaryKey="true"/>
+            </column>
+            <column name="quantity" type="DECIMAL(20, 5)">
+                <constraints nullable="false"/>
+            </column>
+            <column defaultValueComputed="NULL" name="client_id" type="BIGINT"/>
+            <column defaultValueComputed="NULL" name="collateral_id" type="BIGINT"/>
+        </createTable>
+        <createIndex indexName="fkClient" tableName="m_client_collateral_management">
+            <column defaultValueComputed="NULL" name="client_id"/>
+        </createIndex>
+        <createIndex indexName="fkCollateral" tableName="m_client_collateral_management">
+            <column defaultValueComputed="NULL" name="collateral_id"/>
+        </createIndex>
+        <createTable tableName="m_loan_collateral_management">
+            <column autoIncrement="true" name="id" type="BIGINT">
+                <constraints nullable="false" primaryKey="true"/>
+            </column>
+            <column name="quantity" type="DECIMAL(20, 5)">
+                <constraints nullable="false"/>
+            </column>
+            <column defaultValueComputed="NULL" name="loan_id" type="BIGINT"/>
+            <column defaultValueComputed="NULL" name="client_collateral_id" type="BIGINT"/>
+            <column defaultValueBoolean="false" name="is_released" type="boolean"/>
+            <column defaultValueComputed="NULL" name="transaction_id" type="BIGINT"/>
+        </createTable>
+        <createIndex indexName="fkClientCollateral" tableName="m_loan_collateral_management">
+            <column defaultValueComputed="NULL" name="client_collateral_id"/>
+        </createIndex>
+        <createIndex indexName="fkLoan" tableName="m_loan_collateral_management">
+            <column defaultValueComputed="NULL" name="loan_id"/>
+        </createIndex>
+        <createIndex indexName="fkTransaction" tableName="m_loan_collateral_management">
+            <column defaultValueComputed="NULL" name="transaction_id"/>
+        </createIndex>
+        <addForeignKeyConstraint baseColumnNames="collateral_id" baseTableName="m_client_collateral_management"
+                                 constraintName="fkCollateral" deferrable="false" initiallyDeferred="false"
+                                 onDelete="CASCADE" onUpdate="CASCADE" referencedColumnNames="id"
+                                 referencedTableName="m_collateral_management" validate="true"/>
+        <addForeignKeyConstraint baseColumnNames="currency" baseTableName="m_collateral_management"
+                                 constraintName="fkCurrencyCode" deferrable="false" initiallyDeferred="false"
+                                 onDelete="CASCADE" onUpdate="RESTRICT" referencedColumnNames="id"
+                                 referencedTableName="m_currency" validate="true"/>
+        <addForeignKeyConstraint baseColumnNames="client_id" baseTableName="m_client_collateral_management"
+                                 constraintName="fkClient" deferrable="false" initiallyDeferred="false"
+                                 onDelete="CASCADE" onUpdate="CASCADE" referencedColumnNames="id"
+                                 referencedTableName="m_client" validate="true"/>
+        <addForeignKeyConstraint baseColumnNames="client_collateral_id" baseTableName="m_loan_collateral_management"
+                                 constraintName="fkClientCollateral" deferrable="false" initiallyDeferred="false"
+                                 onDelete="CASCADE" onUpdate="CASCADE" referencedColumnNames="id"
+                                 referencedTableName="m_client_collateral_management" validate="true"/>
+        <addForeignKeyConstraint baseColumnNames="loan_id" baseTableName="m_loan_collateral_management"
+                                 constraintName="fkLoan" deferrable="false" initiallyDeferred="false" onDelete="CASCADE"
+                                 onUpdate="CASCADE" referencedColumnNames="id" referencedTableName="m_loan"
+                                 validate="true"/>
+        <addForeignKeyConstraint baseColumnNames="transaction_id" baseTableName="m_loan_collateral_management"
+                                 constraintName="fkTransaction" deferrable="false" initiallyDeferred="false"
+                                 onDelete="CASCADE" onUpdate="CASCADE" referencedColumnNames="id"
+                                 referencedTableName="m_loan_transaction" validate="true"/>
+        <insert tableName="m_permission">
+            <column name="grouping" value="portfolio"/>
+            <column name="code" value="CREATE_CLIENT_COLLATERAL_PRODUCT"/>
+            <column name="entity_name" value="CLIENT_COLLATERAL_PRODUCT"/>
+            <column name="action_name" value="CREATE"/>
+            <column name="can_maker_checker" valueBoolean="false"/>
+        </insert>
+        <insert tableName="m_permission">
+            <column name="grouping" value="portfolio"/>
+            <column name="code" value="CREATE_COLLATERAL_PRODUCT"/>
+            <column name="entity_name" value="COLLATERAL_PRODUCT"/>
+            <column name="action_name" value="CREATE"/>
+            <column name="can_maker_checker" valueBoolean="false"/>
+        </insert>
+        <insert tableName="m_permission">
+            <column name="grouping" value="portfolio"/>
+            <column name="code" value="DELETE_CLIENT_COLLATERAL_PRODUCT"/>
+            <column name="entity_name" value="CLIENT_COLLATERAL_PRODUCT"/>
+            <column name="action_name" value="DELETE"/>
+            <column name="can_maker_checker" valueBoolean="false"/>
+        </insert>
+        <insert tableName="m_permission">
+            <column name="grouping" value="portfolio"/>
+            <column name="code" value="DELETE_COLLATERAL_PRODUCT"/>
+            <column name="entity_name" value="COLLATERAL_PRODUCT"/>
+            <column name="action_name" value="DELETE"/>
+            <column name="can_maker_checker" valueBoolean="false"/>
+        </insert>
+        <insert tableName="m_permission">
+            <column name="grouping" value="portfolio"/>
+            <column name="code" value="DELETE_LOAN_COLLATERAL_PRODUCT"/>
+            <column name="entity_name" value="LOAN_COLLATERAL_PRODUCT"/>
+            <column name="action_name" value="DELETE"/>
+            <column name="can_maker_checker" valueBoolean="false"/>
+        </insert>
+        <insert tableName="m_permission">
+            <column name="grouping" value="portfolio"/>
+            <column name="code" value="UPDATE_CLIENT_COLLATERAL_PRODUCT"/>
+            <column name="entity_name" value="CLIENT_COLLATERAL_PRODUCT"/>
+            <column name="action_name" value="UPDATE"/>
+            <column name="can_maker_checker" valueBoolean="false"/>
+        </insert>
+        <insert tableName="m_permission">
+            <column name="grouping" value="portfolio"/>
+            <column name="code" value="UPDATE_COLLATERAL_PRODUCT"/>
+            <column name="entity_name" value="COLLATERAL_PRODUCT"/>
+            <column name="action_name" value="UPDATE"/>
+            <column name="can_maker_checker" valueBoolean="false"/>
+        </insert>
+    </changeSet>
+    <!-- V369__repayment_with_post_dated_checks.sql -->
+    <changeSet author="fineract" id="369">
+        <createTable tableName="m_repayment_with_post_dated_checks">
+            <column autoIncrement="true" name="id" type="BIGINT">
+                <constraints nullable="false" primaryKey="true"/>
+            </column>
+            <column name="check_no" type="BIGINT">
+                <constraints nullable="false" unique="true"/>
+            </column>
+            <column name="amount" type="DECIMAL(20, 5)">
+                <constraints nullable="false"/>
+            </column>
+            <column defaultValueComputed="NULL" name="loan_id" type="BIGINT"/>
+            <column defaultValueComputed="NULL" name="repayment_id" type="BIGINT"/>
+            <column name="account_no" type="BIGINT">
+                <constraints nullable="false"/>
+            </column>
+            <column name="bank_name" type="VARCHAR(200)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="repayment_date" type="date">
+                <constraints nullable="false"/>
+            </column>
+            <column defaultValueNumeric="0" name="status" type="SMALLINT"/>
+        </createTable>
+        <createIndex indexName="fkloanrepayment" tableName="m_repayment_with_post_dated_checks">
+            <column defaultValueComputed="NULL" name="loan_id"/>
+        </createIndex>
+        <createIndex indexName="fkrepaymentwithpostdated" tableName="m_repayment_with_post_dated_checks">
+            <column defaultValueComputed="NULL" name="repayment_id"/>
+        </createIndex>
+        <addForeignKeyConstraint baseColumnNames="loan_id" baseTableName="m_repayment_with_post_dated_checks"
+                                 constraintName="fkloanrepayment" deferrable="false" initiallyDeferred="false"
+                                 onDelete="CASCADE" onUpdate="CASCADE" referencedColumnNames="id"
+                                 referencedTableName="m_loan" validate="true"/>
+        <addForeignKeyConstraint baseColumnNames="repayment_id" baseTableName="m_repayment_with_post_dated_checks"
+                                 constraintName="fkrepaymentwithpostdated" deferrable="false" initiallyDeferred="false"
+                                 onDelete="CASCADE" onUpdate="CASCADE" referencedColumnNames="id"
+                                 referencedTableName="m_loan_repayment_schedule" validate="true"/>
+        <insert tableName="m_permission">
+            <column name="grouping" value="portfolio"/>
+            <column name="code" value="UPDATE_REPAYMENT_WITH_POSTDATEDCHECKS"/>
+            <column name="entity_name" value="REPAYMENT_WITH_POSTDATEDCHECKS"/>
+            <column name="action_name" value="UPDATE"/>
+            <column name="can_maker_checker" valueBoolean="false"/>
+        </insert>
+        <insert tableName="m_permission">
+            <column name="grouping" value="portfolio"/>
+            <column name="code" value="DELETE_REPAYMENT_WITH_POSTDATEDCHECKS"/>
+            <column name="entity_name" value="REPAYMENT_WITH_POSTDATEDCHECKS"/>
+            <column name="action_name" value="DELETE"/>
+            <column name="can_maker_checker" valueBoolean="false"/>
+        </insert>
+        <insert tableName="m_permission">
+            <column name="grouping" value="portfolio"/>
+            <column name="code" value="BOUNCE_REPAYMENT_WITH_POSTDATEDCHECKS"/>
+            <column name="entity_name" value="REPAYMENT_WITH_POSTDATEDCHECKS"/>
+            <column name="action_name" value="BOUNCE"/>
+            <column name="can_maker_checker" valueBoolean="false"/>
+        </insert>
+    </changeSet>
+    <!-- V370__message_gateway_hook_template.sql -->
+    <changeSet author="fineract" id="370">
+        <insert tableName="m_hook_templates">
+            <column name="id" valueNumeric="4"/>
+            <column name="name" value="Message Gateway"/>
+        </insert>
+        <insert tableName="m_hook_schema">
+            <column name="id" valueNumeric="11"/>
+            <column name="hook_template_id" valueNumeric="4"/>
+            <column name="field_type" value="string"/>
+            <column name="field_name" value="SMS Provider Id"/>
+            <column name="placeholder"/>
+            <column name="optional" valueBoolean="false"/>
+        </insert>
+    </changeSet>
+    <!-- V371__loan_net_disbursal_amount.sql -->
+    <changeSet author="fineract" id="371">
+        <addColumn tableName="m_loan">
+            <column name="net_disbursal_amount"
+                    type="DECIMAL(19, 6)">
+                <constraints nullable="false" />
+            </column>
+        </addColumn>
+        <addColumn tableName="m_loan_disbursement_detail">
+            <column name="net_disbursal_amount"
+                    type="DECIMAL(19, 6)" defaultValueComputed="NULL" />
+        </addColumn>
+    </changeSet>
+    <!-- V372__fixed_principal_percentage.sql -->
+    <changeSet author="fineract" id="372">
+        <addColumn tableName="m_product_loan">
+            <column name="fixed_principal_percentage_per_installment"
+                    type="DECIMAL(5, 2)" defaultValueComputed="NULL" />
+        </addColumn>
+        <addColumn tableName="m_loan">
+            <column name="fixed_principal_percentage_per_installment"
+                    type="DECIMAL(5, 2)" defaultValueComputed="NULL" />
+        </addColumn>
+    </changeSet>
+    <!-- V373__node_aware_scheduler_jobs.sql -->
+    <changeSet author="fineract" id="373">
+        <addColumn tableName="job">
+            <column name="node_id"
+                    type="INT" defaultValueComputed="1" />
+        </addColumn>
+        <addColumn tableName="job">
+            <column name="is_mismatched_job"
+                    type="boolean" defaultValueBoolean="true" />
+        </addColumn>
+        <insert tableName="job">
+            <column name="id" valueNumeric="31"/>
+            <column name="name" value="Execute All Dirty Jobs"/>
+            <column name="display_name" value="Execute All Dirty Jobs"/>
+            <column name="cron_expression" value="0 1 0 1/1 * ? *"/>
+            <column name="create_time" valueDate="CURRENT_TIMESTAMP"/>
+            <column name="task_priority" valueNumeric="5"/>
+            <column name="group_name"/>
+            <column name="previous_run_start_time"/>
+            <column name="job_key" value="Execute All Dirty JobsJobDetail1 _ DEFAULT"/>
+            <column name="initializing_errorlog"/>
+            <column name="is_active" valueBoolean="true"/>
+            <column name="currently_running" valueBoolean="false"/>
+            <column name="updates_allowed" valueBoolean="true"/>
+            <column name="scheduler_group" valueNumeric="0"/>
+            <column name="is_misfired" valueBoolean="false"/>
+            <column name="node_id" valueNumeric="0"/>
+            <column name="is_mismatched_job" valueBoolean="false"/>
+        </insert>
+    </changeSet>
+    <!-- V374__adding_expenseliablity_to_paymentorfeetype.sql -->
+    <changeSet author="fineract" id="374">
+        <addColumn tableName="c_configuration">
+            <column name="string_value"
+                    type="VARCHAR(100)" defaultValueComputed="NULL" position="5"/>
+        </addColumn>
+        <insert tableName="c_configuration">
+            <column name="id" valueNumeric="35"/>
+            <column name="name" value="account-mapping-for-payment-type"/>
+            <column name="value"/>
+            <column name="date_value"/>
+            <column name="string_value" value="Asset"/>
+            <column name="enabled" valueBoolean="true"/>
+            <column name="is_trap_door" valueBoolean="false"/>
+            <column name="description"
+                    value="Asset: default for asset, Use comma seperated values for Liability, Asset and Expense accounts"/>
+        </insert>
+        <insert tableName="c_configuration">
+            <column name="id" valueNumeric="36"/>
+            <column name="name" value="account-mapping-for-charge"/>
+            <column name="value"/>
+            <column name="date_value"/>
+            <column name="string_value" value="Income"/>
+            <column name="enabled" valueBoolean="true"/>
+            <column name="is_trap_door" valueBoolean="false"/>
+            <column name="description"
+                    value="Income: default for Income, Use comma seperated values for Income, Liability and Expense accounts"/>
+        </insert>
+    </changeSet>
+    <!-- V375__transfer_fixed_deposit_interest_next_day_for_period_end_posting.sql -->
+    <changeSet author="fineract" id="375">
+        <insert tableName="c_configuration">
+            <column name="id" valueNumeric="37"/>
+            <column name="name" value="fixed-deposit-transfer-interest-next-day-for-period-end-posting"/>
+            <column name="value"/>
+            <column name="date_value"/>
+            <column name="string_value"/>
+            <column name="enabled" valueBoolean="false"/>
+            <column name="is_trap_door" valueBoolean="false"/>
+            <column name="description" value="Transfer fixed transfer interest next day(t+1) for period end posting"/>
+        </insert>
+    </changeSet>
+    <!-- V376__savings_last_transaction_date.sql -->
+    <changeSet author="fineract" id="376">
+        <addColumn tableName="m_savings_account">
+            <column name="interest_posted_till_date"
+                    type="date" defaultValueComputed="NULL" />
+        </addColumn>
+        <insert tableName="c_configuration">
+            <column name="id" valueNumeric="38"/>
+            <column name="name" value="allow-backdated-transaction-before-interest-posting"/>
+            <column name="value" valueNumeric="0"/>
+            <column name="date_value"/>
+            <column name="string_value"/>
+            <column name="enabled" valueBoolean="true"/>
+            <column name="is_trap_door" valueBoolean="false"/>
+            <column name="description" value="Avoid retrieving all transactions in a savings account"/>
+        </insert>
+        <insert tableName="c_configuration">
+            <column name="id" valueNumeric="39"/>
+            <column name="name" value="allow-backdated-transaction-before-interest-posting-date-for-days"/>
+            <column name="value" valueNumeric="0"/>
+            <column name="date_value"/>
+            <column name="string_value"/>
+            <column name="enabled" valueBoolean="false"/>
+            <column name="is_trap_door" valueBoolean="false"/>
+            <column name="description" value="One time configuration to relax the backdated transactions"/>
+        </insert>
+    </changeSet>
+    <!-- V377__job_prams_for_parallelizing_savings_interest_posting.sql -->
+    <changeSet author="fineract" id="377">
+        <insert tableName="job_parameters">
+            <column name="id" valueNumeric="4"/>
+            <column name="job_id" valueNumeric="6"/>
+            <column name="parameter_name" value="thread-pool-size"/>
+            <column name="parameter_value" valueNumeric="10"/>
+        </insert>
+        <insert tableName="job_parameters">
+            <column name="id" valueNumeric="5"/>
+            <column name="job_id" valueNumeric="6"/>
+            <column name="parameter_name" value="batch-size"/>
+            <column name="parameter_value" valueNumeric="100"/>
+        </insert>
+    </changeSet>
+    <!-- V378__configuration_for_variable_length_acoountNumber.sql -->
+    <changeSet author="fineract" id="378">
+        <insert tableName="c_configuration">
+            <column name="id" valueNumeric="40"/>
+            <column name="name" value="custom-account-number-length"/>
+            <column name="value"/>
+            <column name="date_value"/>
+            <column name="string_value"/>
+            <column name="enabled" valueBoolean="false"/>
+            <column name="is_trap_door" valueBoolean="false"/>
+            <column name="description"
+                    value="if enabled, the value if this configuration will set accounnumber length"/>
+        </insert>
+    </changeSet>
+    <!-- V379__user_cannot_change_password.sql -->
+    <changeSet author="fineract" id="379">
+        <addColumn tableName="m_appuser">
+            <column defaultValueBoolean="false" name="cannot_change_password" type="boolean"/>
+        </addColumn>
+    </changeSet>
+    <!-- V380__configuration_for_random_account_number.sql -->
+    <changeSet author="fineract" id="380">
+        <insert tableName="c_configuration">
+            <column name="id" valueNumeric="41"/>
+            <column name="name" value="random-account-number"/>
+            <column name="value"/>
+            <column name="date_value"/>
+            <column name="string_value"/>
+            <column name="enabled" valueBoolean="false"/>
+            <column name="is_trap_door" valueBoolean="false"/>
+            <column name="description"
+                    value="if enabled, the client accounts, saving accounts, loan accounts will be created with Random Account Number"/>
+        </insert>
+    </changeSet>
+    <!-- V381__update_currencies_new_currencies.sql -->
+    <changeSet author="fineract" id="381">
+        <insert tableName="m_currency">
+            <column name="id" valueNumeric="164"/>
+            <column name="code" value="SSP"/>
+            <column name="decimal_places" valueNumeric="2"/>
+            <column name="currency_multiplesof"/>
+            <column name="display_symbol" value="SSĀ£"/>
+            <column name="name" value="South Sudanese Pound"/>
+            <column name="internationalized_name_code" value="currency.SSP"/>
+        </insert>
+        <update tableName="m_currency">
+            <column name="name" value="Eswatini Lilangeni"/>
+            <where>code = 'SZL'</where>
+        </update>
+        <update tableName="m_organisation_currency">
+            <column name="name" value="Eswatini Lilangeni"/>
+            <where>code = 'SZL'</where>
+        </update>
+    </changeSet>
+    <!-- V390__clientdoc-code.sql -->
+    <changeSet author="fineract" id="390">
+        <insert tableName="m_code">
+            <column name="id" valueNumeric="34"/>
+            <column name="code_name" value="Customer Documents"/>
+            <column name="is_system_defined" valueBoolean="true"/>
+        </insert>
+    </changeSet>
+    <!-- V391__add_transaction_ref_column.sql -->
+    <changeSet author="fineract" id="391">
+        <addColumn tableName="m_savings_account_transaction">
+            <column name="ref_no" type="VARCHAR(128)">
+                <constraints unique="true"/>
+            </column>
+        </addColumn>
+    </changeSet>
+    <!-- V392__interest_recovery_conf_for_rescedule.sql -->
+    <changeSet author="fineract" id="392">
+        <delete tableName="c_configuration">
+            <where>name = 'is-interest-to-be-appropriated-equally-when-greater-than-emi'</where>
+        </delete>
+        <insert tableName="c_configuration">
+            <column name="id" valueNumeric="42"/>
+            <column name="name" value="is-interest-to-be-recovered-first-when-greater-than-emi"/>
+            <column name="value" valueNumeric="0"/>
+            <column name="date_value"/>
+            <column name="string_value"/>
+            <column name="enabled" valueBoolean="false"/>
+            <column name="is_trap_door" valueBoolean="false"/>
+            <column name="description"
+                    value="If enabled, when interest amount is greater than EMI, the additional interest is recovered first before principal"/>
+        </insert>
+        <insert tableName="c_configuration">
+            <column name="id" valueNumeric="43"/>
+            <column name="name" value="is-principal-compounding-disabled-for-overdue-loans"/>
+            <column name="value" valueNumeric="0"/>
+            <column name="date_value"/>
+            <column name="string_value"/>
+            <column name="enabled" valueBoolean="false"/>
+            <column name="is_trap_door" valueBoolean="false"/>
+            <column name="description"
+                    value="If enabled, it donot consider principal of an unpaid installment for calculating interest of next installment. this is for testing back-dated loan schedule"/>
+        </insert>
+    </changeSet>
+</databaseChangeLog>