diff --git a/Dockerfile b/Dockerfile
index 14de81c0c1e..27f4e688fe5 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -51,6 +51,13 @@ COPY ./docker/server.xml /opt/bitnami/tomcat/conf
RUN chmod 664 /opt/bitnami/tomcat/conf/server.xml
WORKDIR /opt/bitnami/tomcat/lib
-# org.drizzle.jdbc.DrizzleDriver is used in docker/server.xml for jdbc/fineract_tenants DataSource
-# (But note that connections to individual tenant DBs may use another driver...)
+# org.drizzle.jdbc.DrizzleDriver is used by default for both the all tenants and demo tenant DB DataSource
RUN wget https://repo1.maven.org/maven2/org/drizzle/jdbc/drizzle-jdbc/1.4/drizzle-jdbc-1.4.jar
+
+# https://issues.apache.org/jira/browse/LEGAL-462
+# https://issues.apache.org/jira/browse/FINERACT-762
+# We include an alternative JDBC driver (which is faster, but not allowed to be default in Apache distribution)
+# allowing implementations to switch the driver used by changing start-up parameters (for both tenants and each tenant DB)
+# The commented out lines in the docker-compose.yml illustrate how to do this.
+# To be sure that this instead of Drizlle is used, comment out wget above.
+RUN wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.19/mysql-connector-java-8.0.19.jar
diff --git a/docker-compose.yml b/docker-compose.yml
index e74b99620fc..0469be54458 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -43,8 +43,20 @@ services:
depends_on:
- fineractmysql
environment:
- - JAVA_OPTS=-Dfineract_tenants_url=jdbc:mysql:thin://fineractmysql:3306/fineract_tenants -Dfineract_tenants_driver=org.drizzle.jdbc.DrizzleDriver -Dfineract_tenants_uid=root -Dfineract_tenants_pwd=skdcnwauicn2ucnaecasdsajdnizucawencascdca -Djava.awt.headless=true -XX:+UseG1GC -Dfile.encoding=UTF-8
+ - DRIVERCLASS_NAME=org.drizzle.jdbc.DrizzleDriver
+ - PROTOCOL=jdbc
+ - SUB_PROTOCOL=mysql:thin
+ - fineract_tenants_driver=org.drizzle.jdbc.DrizzleDriver
+ - fineract_tenants_url=jdbc:mysql:thin://fineractmysql:3306/fineract_tenants
+ - fineract_tenants_uid=root
+ - fineract_tenants_pwd=skdcnwauicn2ucnaecasdsajdnizucawencascdca
- FINERACT_DEFAULT_TENANTDB_HOSTNAME=fineractmysql
- FINERACT_DEFAULT_TENANTDB_PORT=3306
- FINERACT_DEFAULT_TENANTDB_UID=root
- FINERACT_DEFAULT_TENANTDB_PWD=skdcnwauicn2ucnaecasdsajdnizucawencascdca
+
+# https://issues.apache.org/jira/browse/FINERACT-762
+# To use an altnerative JDBC driver (which is faster, but not allowed to be default in Apache distribution)
+# replace org.drizzle.jdbc.DrizzleDriver with com.mysql.jdbc.Driver in DRIVERCLASS_NAME and fineract_tenants_driver,
+# and remove ":thin:" from SUB_PROTOCOL and fineract_tenants_url. Note that the mysql-connector-java-*.jar is already
+# bundled in the container by the Dockerfile, but just not used by default.
diff --git a/fineract-provider/config/checkstyle/checkstyle.xml b/fineract-provider/config/checkstyle/checkstyle.xml
index 84195dbfd92..e70bca1f0f1 100644
--- a/fineract-provider/config/checkstyle/checkstyle.xml
+++ b/fineract-provider/config/checkstyle/checkstyle.xml
@@ -58,6 +58,7 @@
+
- com.mysql.jdbc.log.StandardLogger
+
true
true
diff --git a/fineract-provider/src/main/resources/META-INF/spring/jdbc.properties b/fineract-provider/src/main/resources/META-INF/spring/jdbc.properties
index 625774edee8..069839b184d 100644
--- a/fineract-provider/src/main/resources/META-INF/spring/jdbc.properties
+++ b/fineract-provider/src/main/resources/META-INF/spring/jdbc.properties
@@ -20,7 +20,6 @@
DRIVERCLASS_NAME:org.drizzle.jdbc.DrizzleDriver
PROTOCOL:jdbc
SUB_PROTOCOL:mysql:thin
-PORT:3306
fineract_tenants_driver:org.drizzle.jdbc.DrizzleDriver
fineract_tenants_url:jdbc:mysql:thin://localhost:3306/fineract_tenants
diff --git a/fineract-provider/src/main/resources/sql/migrations/core_db/V134_2__permissions_spelling_correction.sql b/fineract-provider/src/main/resources/sql/migrations/core_db/V134_2__permissions_spelling_correction.sql
index 333819e3a50..ca0bda27a92 100644
--- a/fineract-provider/src/main/resources/sql/migrations/core_db/V134_2__permissions_spelling_correction.sql
+++ b/fineract-provider/src/main/resources/sql/migrations/core_db/V134_2__permissions_spelling_correction.sql
@@ -17,4 +17,4 @@
-- under the License.
--
-update m_permission set grouping="organisation" where grouping = "organistion";
+update m_permission set `grouping`="organisation" where grouping = "organistion";
diff --git a/fineract-provider/src/main/resources/sql/migrations/core_db/V13__add_group_and_client_pending_configuration.sql b/fineract-provider/src/main/resources/sql/migrations/core_db/V13__add_group_and_client_pending_configuration.sql
index 7d355ef2edf..828cecf7724 100644
--- a/fineract-provider/src/main/resources/sql/migrations/core_db/V13__add_group_and_client_pending_configuration.sql
+++ b/fineract-provider/src/main/resources/sql/migrations/core_db/V13__add_group_and_client_pending_configuration.sql
@@ -26,13 +26,13 @@ INSERT INTO c_configuration (`name`, `enabled`) VALUES ('allow-pending-client-st
INSERT INTO c_configuration (`name`, `enabled`) VALUES ('allow-pending-group-status', '0');
-INSERT INTO .`r_enum_value` (`enum_name`, `enum_id`, `enum_message_property`, `enum_value`)
+INSERT INTO `r_enum_value` (`enum_name`, `enum_id`, `enum_message_property`, `enum_value`)
VALUES ('status_id', '0', 'Invalid', 'Invalid');
-INSERT INTO .`r_enum_value` (`enum_name`, `enum_id`, `enum_message_property`, `enum_value`)
+INSERT INTO `r_enum_value` (`enum_name`, `enum_id`, `enum_message_property`, `enum_value`)
VALUES ('status_id', '100', 'Pending', 'Pending');
-INSERT INTO .`r_enum_value` (`enum_name`, `enum_id`, `enum_message_property`, `enum_value`)
+INSERT INTO `r_enum_value` (`enum_name`, `enum_id`, `enum_message_property`, `enum_value`)
VALUES ('status_id', '300', 'Active', 'Active');
-INSERT INTO .`r_enum_value` (`enum_name`, `enum_id`, `enum_message_property`, `enum_value`)
+INSERT INTO `r_enum_value` (`enum_name`, `enum_id`, `enum_message_property`, `enum_value`)
VALUES ('status_id', '600', 'Closed', 'Closed');
-INSERT INTO .`r_enum_value` (`enum_name`, `enum_id`, `enum_message_property`, `enum_value`)
- VALUES ('loan_status_id', '0', 'Invalid', 'Invalid');
\ No newline at end of file
+INSERT INTO `r_enum_value` (`enum_name`, `enum_id`, `enum_message_property`, `enum_value`)
+ VALUES ('loan_status_id', '0', 'Invalid', 'Invalid');
diff --git a/fineract-provider/src/main/resources/sql/migrations/core_db/V202__savings_officer_history_table.sql b/fineract-provider/src/main/resources/sql/migrations/core_db/V202__savings_officer_history_table.sql
index e43ee03d529..f258414bec1 100644
--- a/fineract-provider/src/main/resources/sql/migrations/core_db/V202__savings_officer_history_table.sql
+++ b/fineract-provider/src/main/resources/sql/migrations/core_db/V202__savings_officer_history_table.sql
@@ -34,6 +34,6 @@ CREATE TABLE `m_savings_officer_assignment_history` (
CONSTRAINT `fk_m_savings_officer_assignment_history_0002` FOREIGN KEY (`savings_officer_id`) REFERENCES `m_staff` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-insert into m_permission (grouping,code,entity_name,action_name) values ('portfolio','REMOVESAVINGSOFFICER_SAVINGSACCOUNT','SAVINGSACCOUNT','REMOVESAVINGSOFFICER');
-insert into m_permission (grouping,code,entity_name,action_name) values ('portfolio','UPDATESAVINGSOFFICER_SAVINGSACCOUNT','SAVINGSACCOUNT','UPDATESAVINGSOFFICER');
+insert into m_permission (`grouping`,code,entity_name,action_name) values ('portfolio','REMOVESAVINGSOFFICER_SAVINGSACCOUNT','SAVINGSACCOUNT','REMOVESAVINGSOFFICER');
+insert into m_permission (`grouping`,code,entity_name,action_name) values ('portfolio','UPDATESAVINGSOFFICER_SAVINGSACCOUNT','SAVINGSACCOUNT','UPDATESAVINGSOFFICER');
diff --git a/fineract-provider/src/main/resources/sql/migrations/core_db/V20__report_maint_perms_really_configuration.sql b/fineract-provider/src/main/resources/sql/migrations/core_db/V20__report_maint_perms_really_configuration.sql
index 31ba00f7192..8e511e08187 100644
--- a/fineract-provider/src/main/resources/sql/migrations/core_db/V20__report_maint_perms_really_configuration.sql
+++ b/fineract-provider/src/main/resources/sql/migrations/core_db/V20__report_maint_perms_really_configuration.sql
@@ -18,4 +18,4 @@
--
-update m_permission set grouping = 'configuration' where entity_name = 'report';
+update m_permission set `grouping` = 'configuration' where entity_name = 'report';
diff --git a/fineract-provider/src/main/resources/sql/migrations/core_db/V229__teller_cash_management.sql b/fineract-provider/src/main/resources/sql/migrations/core_db/V229__teller_cash_management.sql
index 41c2d946d21..659d25fc87c 100644
--- a/fineract-provider/src/main/resources/sql/migrations/core_db/V229__teller_cash_management.sql
+++ b/fineract-provider/src/main/resources/sql/migrations/core_db/V229__teller_cash_management.sql
@@ -69,42 +69,42 @@ CREATE TABLE `m_cashier_transactions` (
INSERT INTO m_permission (
- grouping, code, entity_name, action_name, can_maker_checker
+ `grouping`, code, entity_name, action_name, can_maker_checker
) values (
'cash_mgmt', 'CREATE_TELLER', 'TELLER', 'CREATE', 1
);
INSERT INTO m_permission (
- grouping, code, entity_name, action_name, can_maker_checker
+ `grouping`, code, entity_name, action_name, can_maker_checker
) values (
'cash_mgmt', 'UPDATE_TELLER', 'TELLER', 'CREATE', 1
);
INSERT INTO m_permission (
- grouping, code, entity_name, action_name, can_maker_checker
+ `grouping`, code, entity_name, action_name, can_maker_checker
) values (
'cash_mgmt', 'ALLOCATECASHIER_TELLER', 'TELLER', 'ALLOCATE', 1
);
INSERT INTO m_permission (
- grouping, code, entity_name, action_name, can_maker_checker
+ `grouping`, code, entity_name, action_name, can_maker_checker
) values (
'cash_mgmt', 'UPDATECASHIERALLOCATION_TELLER', 'TELLER', 'UPDATECASHIERALLOCATION', 1
);
INSERT INTO m_permission (
- grouping, code, entity_name, action_name, can_maker_checker
+ `grouping`, code, entity_name, action_name, can_maker_checker
) values (
'cash_mgmt', 'DELETECASHIERALLOCATION_TELLER', 'TELLER', 'DELETECASHIERALLOCATION', 1
);
INSERT INTO m_permission (
- grouping, code, entity_name, action_name, can_maker_checker
+ `grouping`, code, entity_name, action_name, can_maker_checker
) values (
'cash_mgmt', 'ALLOCATECASHTOCASHIER_TELLER', 'TELLER', 'ALLOCATECASHTOCASHIER', 1
);
INSERT INTO m_permission (
- grouping, code, entity_name, action_name, can_maker_checker
+ `grouping`, code, entity_name, action_name, can_maker_checker
) values (
'cash_mgmt', 'SETTLECASHFROMCASHIER_TELLER', 'TELLER', 'SETTLECASHFROMCASHIER', 1
);
@@ -123,4 +123,4 @@ CREATE TABLE `m_cashier_transactions` (
enum_name, enum_id, enum_message_property, enum_value, enum_type
) values (
'teller_status', 600, 'Closed', 'Closed',0
- );
\ No newline at end of file
+ );
diff --git a/fineract-provider/src/main/resources/sql/migrations/core_db/V250__password_validation_policy.sql b/fineract-provider/src/main/resources/sql/migrations/core_db/V250__password_validation_policy.sql
index 5bb1d2790a9..770d293a48a 100644
--- a/fineract-provider/src/main/resources/sql/migrations/core_db/V250__password_validation_policy.sql
+++ b/fineract-provider/src/main/resources/sql/migrations/core_db/V250__password_validation_policy.sql
@@ -47,13 +47,13 @@ VALUES (
NULL , '^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\\s).{6,50}$', 'Password must be at least 6 characters, no more than 50 characters long, must include at least one upper case letter, one lower case letter, one numeric digit and no space', '0'
);
-INSERT INTO m_permission (grouping, code, entity_name, action_name, can_maker_checker)
+INSERT INTO m_permission (`grouping`, code, entity_name, action_name, can_maker_checker)
VALUE ("authorisation","READ_PASSWORD_PREFERENCES","PASSWORD_PREFERENCES","READ",0);
-INSERT INTO m_permission (grouping, code, entity_name, action_name, can_maker_checker)
+INSERT INTO m_permission (`grouping`, code, entity_name, action_name, can_maker_checker)
VALUE ("authorisation","UPDATE_PASSWORD_PREFERENCES","PASSWORD_PREFERENCES","UPDATE",0);
-INSERT INTO m_permission (grouping, code, entity_name, action_name, can_maker_checker)
+INSERT INTO m_permission (`grouping`, code, entity_name, action_name, can_maker_checker)
VALUE ("authorisation","UPDATE_PASSWORD_PREFERENCES_CHECKER","PASSWORD_PREFERENCES","UPDATE_CHECKER",0);
diff --git a/fineract-provider/src/main/resources/sql/migrations/core_db/V257__staff_image_association.sql b/fineract-provider/src/main/resources/sql/migrations/core_db/V257__staff_image_association.sql
index 7bbc3d2a584..38d987c11e2 100644
--- a/fineract-provider/src/main/resources/sql/migrations/core_db/V257__staff_image_association.sql
+++ b/fineract-provider/src/main/resources/sql/migrations/core_db/V257__staff_image_association.sql
@@ -22,7 +22,7 @@ ALTER TABLE `m_staff`
ADD CONSTRAINT `FK_m_staff_m_image` FOREIGN KEY (`image_id`) REFERENCES `m_image` (`id`);
INSERT INTO m_permission (
-grouping ,
+`grouping` ,
code ,
entity_name ,
action_name ,
@@ -32,4 +32,4 @@ can_maker_checker
('portfolio', 'CREATE_STAFFIMAGE', 'STAFFIMAGE', 'CREATE', '1'),
('portfolio', 'CREATE_STAFFIMAGE_CHECKER', 'STAFFIMAGE', 'CREATE', '0'),
('portfolio', 'DELETE_STAFFIMAGE', 'STAFFIMAGE', 'DELETE', '1'),
-('portfolio', 'DELETE_STAFFIMAGE_CHECKER', 'STAFFIMAGE', 'DELETE', '0');
\ No newline at end of file
+('portfolio', 'DELETE_STAFFIMAGE_CHECKER', 'STAFFIMAGE', 'DELETE', '0');
diff --git a/fineract-provider/src/main/resources/sql/migrations/core_db/V264__insert_paymenttype_and_report_read_permission.sql b/fineract-provider/src/main/resources/sql/migrations/core_db/V264__insert_paymenttype_and_report_read_permission.sql
index cde3ee76449..d4239adeab1 100644
--- a/fineract-provider/src/main/resources/sql/migrations/core_db/V264__insert_paymenttype_and_report_read_permission.sql
+++ b/fineract-provider/src/main/resources/sql/migrations/core_db/V264__insert_paymenttype_and_report_read_permission.sql
@@ -17,5 +17,5 @@
-- under the License.
--
-INSERT INTO m_permission (grouping,code,entity_name,action_name,can_maker_checker) VALUES ('portfolio','READ_PAYMENTTYPE','PAYMENTTYPE','READ',0);
-INSERT INTO m_permission (grouping,code,entity_name,action_name,can_maker_checker) VALUES ('report','READ_Staff Assignment History','Staff Assignment History(Pentaho)','READ',0);
\ No newline at end of file
+INSERT INTO m_permission (`grouping`,code,entity_name,action_name,can_maker_checker) VALUES ('portfolio','READ_PAYMENTTYPE','PAYMENTTYPE','READ',0);
+INSERT INTO m_permission (`grouping`,code,entity_name,action_name,can_maker_checker) VALUES ('report','READ_Staff Assignment History','Staff Assignment History(Pentaho)','READ',0);
diff --git a/fineract-provider/src/main/resources/sql/migrations/core_db/V324__datatable_checks.sql b/fineract-provider/src/main/resources/sql/migrations/core_db/V324__datatable_checks.sql
index 6ba065813a9..e1acacee44a 100644
--- a/fineract-provider/src/main/resources/sql/migrations/core_db/V324__datatable_checks.sql
+++ b/fineract-provider/src/main/resources/sql/migrations/core_db/V324__datatable_checks.sql
@@ -36,11 +36,11 @@ ENGINE=InnoDB
;
-INSERT INTO m_permission (grouping, code, entity_name, action_name, can_maker_checker)
+INSERT INTO m_permission (`grouping`, code, entity_name, action_name, can_maker_checker)
VALUE ("datatable","READ_ENTITY_DATATABLE_CHECK","ENTITY_DATATABLE_CHECK","READ",0);
-INSERT INTO m_permission (grouping, code, entity_name, action_name, can_maker_checker)
+INSERT INTO m_permission (`grouping`, code, entity_name, action_name, can_maker_checker)
VALUE ("datatable","CREATE_ENTITY_DATATABLE_CHECK","ENTITY_DATATABLE_CHECK","CREATE",0);
-INSERT INTO m_permission (grouping, code, entity_name, action_name, can_maker_checker)
+INSERT INTO m_permission (`grouping`, code, entity_name, action_name, can_maker_checker)
VALUE ("datatable","DELETE_ENTITY_DATATABLE_CHECK","ENTITY_DATATABLE_CHECK","DELETE",0);
diff --git a/fineract-provider/src/main/resources/sql/migrations/core_db/V352__interop_init.sql b/fineract-provider/src/main/resources/sql/migrations/core_db/V352__interop_init.sql
index c2b4e5f8f91..cec53dc6c3b 100644
--- a/fineract-provider/src/main/resources/sql/migrations/core_db/V352__interop_init.sql
+++ b/fineract-provider/src/main/resources/sql/migrations/core_db/V352__interop_init.sql
@@ -48,28 +48,28 @@ INSERT INTO `m_appuser_role` VALUES ((SELECT id FROM m_appuser WHERE username =
-- Interoperation permissions
-INSERT INTO m_permission (grouping, code, entity_name, action_name, can_maker_checker)
+INSERT INTO m_permission (`grouping`, code, entity_name, action_name, can_maker_checker)
VALUES ('interop', 'READ_INTERID', 'INTERID', 'READ', 0);
-INSERT INTO m_permission (grouping, code, entity_name, action_name, can_maker_checker)
+INSERT INTO m_permission (`grouping`, code, entity_name, action_name, can_maker_checker)
VALUES ('interop', 'READ_INTERREQUEST', 'INTERREQUEST', 'READ', 0);
-INSERT INTO m_permission (grouping, code, entity_name, action_name, can_maker_checker)
+INSERT INTO m_permission (`grouping`, code, entity_name, action_name, can_maker_checker)
VALUES ('interop', 'READ_INTERQUOTE', 'INTERQUOTE', 'READ', 0);
-INSERT INTO m_permission (grouping, code, entity_name, action_name, can_maker_checker)
+INSERT INTO m_permission (`grouping`, code, entity_name, action_name, can_maker_checker)
VALUES ('interop', 'READ_INTERTRANSFER', 'INTERTRANSFER', 'READ', 0);
-INSERT INTO m_permission (grouping, code, entity_name, action_name, can_maker_checker)
+INSERT INTO m_permission (`grouping`, code, entity_name, action_name, can_maker_checker)
VALUES ('interop', 'PREPARE_INTERTRANSFER', 'INTERTRANSFER', 'PREPARE', 0);
-INSERT INTO m_permission (grouping, code, entity_name, action_name, can_maker_checker)
+INSERT INTO m_permission (`grouping`, code, entity_name, action_name, can_maker_checker)
VALUES ('interop', 'CREATE_INTERID', 'INTERID', 'CREATE', 0);
-INSERT INTO m_permission (grouping, code, entity_name, action_name, can_maker_checker)
+INSERT INTO m_permission (`grouping`, code, entity_name, action_name, can_maker_checker)
VALUES ('interop', 'CREATE_INTERREQUEST', 'INTERREQUEST', 'CREATE', 0);
-INSERT INTO m_permission (grouping, code, entity_name, action_name, can_maker_checker)
+INSERT INTO m_permission (`grouping`, code, entity_name, action_name, can_maker_checker)
VALUES ('interop', 'CREATE_INTERQUOTE', 'INTERQUOTE', 'CREATE', 0);
-INSERT INTO m_permission (grouping, code, entity_name, action_name, can_maker_checker)
+INSERT INTO m_permission (`grouping`, code, entity_name, action_name, can_maker_checker)
VALUES ('interop', 'CREATE_INTERTRANSFER', 'INTERTRANSFER', 'CREATE', 0);
-INSERT INTO m_permission (grouping, code, entity_name, action_name, can_maker_checker)
+INSERT INTO m_permission (`grouping`, code, entity_name, action_name, can_maker_checker)
VALUES ('interop', 'DELETE_INTERID', 'INTERID', 'DELETE', 0);
@@ -80,4 +80,4 @@ SELECT id INTO @code_id FROM m_code WHERE code_name = 'PaymentType';
INSERT IGNORE INTO m_code_value (code_id, code_value, order_position) VALUES (@code_id, 'Money Transfer', 1);
-INSERT IGNORE INTO m_payment_type (value, description, order_position) VALUES ('Money Transfer', 'Money Transfer', 1);
\ No newline at end of file
+INSERT IGNORE INTO m_payment_type (value, description, order_position) VALUES ('Money Transfer', 'Money Transfer', 1);
diff --git a/fineract-provider/src/main/resources/sql/migrations/core_db/V366__income_and_expense_booking_table.sql b/fineract-provider/src/main/resources/sql/migrations/core_db/V366__income_and_expense_booking_table.sql
new file mode 100644
index 00000000000..034c2b2dd5f
--- /dev/null
+++ b/fineract-provider/src/main/resources/sql/migrations/core_db/V366__income_and_expense_booking_table.sql
@@ -0,0 +1,33 @@
+--
+-- 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.
+--
+
+CREATE TABLE `acc_income_and_expense_bookings` (
+ `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
+ `gl_closure_id` BIGINT(20) NOT NULL,
+ `journal_entry_transaction_id` VARCHAR(60) NOT NULL,
+ `office_id` BIGINT(20) NOT NULL,
+ `is_reversed` tinyint(1) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ FOREIGN KEY (`gl_closure_id`) REFERENCES `acc_gl_closure` (`id`),
+ FOREIGN KEY (`office_id`) REFERENCES `m_office` (`id`),
+ UNIQUE (journal_entry_transaction_id)
+);
+
+ALTER TABLE `acc_gl_closure`
+DROP INDEX office_id_closing_date;
\ No newline at end of file
diff --git a/fineract-provider/src/main/resources/sql/migrations/core_db/V3__mifosx-permissions-and-authorisation-utf8.sql b/fineract-provider/src/main/resources/sql/migrations/core_db/V3__mifosx-permissions-and-authorisation-utf8.sql
index fb2561cac3a..6c9d94880b7 100644
--- a/fineract-provider/src/main/resources/sql/migrations/core_db/V3__mifosx-permissions-and-authorisation-utf8.sql
+++ b/fineract-provider/src/main/resources/sql/migrations/core_db/V3__mifosx-permissions-and-authorisation-utf8.sql
@@ -330,19 +330,19 @@ INSERT INTO `m_appuser_role` (`appuser_id`, `role_id`) VALUES (1,1);
-- This needs to always happen at end of the script
/* add a create, read, update and delete permission for each registered datatable */
-insert into m_permission(grouping, `code`, entity_name, action_name)
+insert into m_permission(`grouping`, `code`, entity_name, action_name)
select 'datatable', concat('CREATE_', r.registered_table_name), r.registered_table_name, 'CREATE'
from x_registered_table r;
-insert into m_permission(grouping, `code`, entity_name, action_name)
+insert into m_permission(`grouping`, `code`, entity_name, action_name)
select 'datatable', concat('READ_', r.registered_table_name), r.registered_table_name, 'READ'
from x_registered_table r;
-insert into m_permission(grouping, `code`, entity_name, action_name)
+insert into m_permission(`grouping`, `code`, entity_name, action_name)
select 'datatable', concat('UPDATE_', r.registered_table_name), r.registered_table_name, 'UPDATE'
from x_registered_table r;
-insert into m_permission(grouping, `code`, entity_name, action_name)
+insert into m_permission(`grouping`, `code`, entity_name, action_name)
select 'datatable', concat('DELETE_', r.registered_table_name), r.registered_table_name, 'DELETE'
from x_registered_table r;
@@ -350,4 +350,4 @@ from x_registered_table r;
/* regardless of inserted permission settings above, no permissions (transactions) are preselected as being part of the maker-checker process
so, just set the flag to false... the end-user can decide which permissions should be maker-checkerable
*/
-update m_permission set can_maker_checker = false;
\ No newline at end of file
+update m_permission set can_maker_checker = false;
diff --git a/fineract-provider/src/main/resources/sql/migrations/core_db/V4__mifosx-core-reports-utf8.sql b/fineract-provider/src/main/resources/sql/migrations/core_db/V4__mifosx-core-reports-utf8.sql
index 3804054b27b..9a238cccfa8 100644
--- a/fineract-provider/src/main/resources/sql/migrations/core_db/V4__mifosx-core-reports-utf8.sql
+++ b/fineract-provider/src/main/resources/sql/migrations/core_db/V4__mifosx-core-reports-utf8.sql
@@ -25,6 +25,6 @@ INSERT INTO `stretchy_report` VALUES (1,'Client Listing','Table',NULL,'Client','
INSERT INTO `stretchy_parameter` VALUES (1,'startDateSelect','startDate','startDate','date','date','today',NULL,NULL,NULL,NULL,NULL),(2,'endDateSelect','endDate','endDate','date','date','today',NULL,NULL,NULL,NULL,NULL),(3,'obligDateTypeSelect','obligDateType','obligDateType','select','number','0',NULL,NULL,NULL,'select * from\r\n(select 1 as id, \"Closed\" as `name` union all\r\nselect 2, \"Disbursal\" ) x\r\norder by x.`id`',NULL),(5,'OfficeIdSelectOne','officeId','Office','select','number','0',NULL,'Y',NULL,'select id, \r\nconcat(substring(\"........................................\", 1, \r\n \n\n((LENGTH(`hierarchy`) - LENGTH(REPLACE(`hierarchy`, \'.\', \'\')) - 1) * 4)), \r\n `name`) as tc\r\nfrom m_office\r\nwhere hierarchy like concat\n\n(\'${currentUserHierarchy}\', \'%\')\r\norder by hierarchy',NULL),(6,'loanOfficerIdSelectAll','loanOfficerId','Loan Officer','select','number','0',NULL,NULL,'Y','(select lo.id, lo.display_name as `Name` \r\nfrom m_office o \r\njoin m_office ounder on ounder.hierarchy like concat(o.hierarchy, \'%\')\r\njoin m_staff lo on lo.office_id = ounder.id\r\nwhere lo.is_loan_officer = true\r\nand o.id = ${officeId})\r\nunion all\r\n(select -10, \'-\')\r\norder by 2',5),(10,'currencyIdSelectAll','currencyId','Currency','select','number','0',NULL,NULL,'Y','select `code`, `name`\r\nfrom m_organisation_currency\r\norder by `code`',NULL),(20,'fundIdSelectAll','fundId','Fund','select','number','0',NULL,NULL,'Y','(select id, `name`\r\nfrom m_fund)\r\nunion all\r\n(select -10, \'-\')\r\norder by 2',NULL),(25,'loanProductIdSelectAll','loanProductId','Product','select','number','0',NULL,NULL,'Y','select p.id, p.`name`\r\nfrom m_product_loan p\r\nwhere p.currency_code = \'${currencyId}\'\r\norder by 2',10),(26,'loanPurposeIdSelectAll','loanPurposeId','Loan Purpose','select','number','0',NULL,NULL,'Y','select -10 as id, \'-\' as code_value\r\nunion all\r\nselect * from (select v.id, v.code_value\r\nfrom m_code c\r\njoin m_code_value v on v.code_id = c.id\r\nwhere c.code_name = \"loanPurpose\"\r\norder by v.order_position) x',NULL),(100,'parTypeSelect','parType','parType','select','number','0',NULL,NULL,NULL,'select * from\r\n(select 1 as id, \"Principal Only\" as `name` union all\r\nselect 2, \"Principal + Interest\" union all\r\nselect 3, \"Principal + Interest + Fees\" union all\r\nselect 4, \"Principal + Interest + Fees + Penalties\") x\r\norder by x.`id`',NULL),(1001,'FullReportList',NULL,'n/a','n/a','n/a','n/a','Y',NULL,NULL,'select r.report_id, r.report_name, r.report_type, r.report_subtype, r.report_category,\r\n \n\nrp.parameter_id, rp.report_parameter_name, p.parameter_name\r\n from stretchy_report r\r\n left join stretchy_report_parameter rp on rp.report_id = r.report_id\r\n \n\nleft join stretchy_parameter p on p.parameter_id = rp.parameter_id\r\n where r.use_report is true\r\n and exists\r\n (\r\n select \'f\'\r\n from m_appuser_role ur \n\n\r\n join m_role r on r.id = ur.role_id\r\n join m_role_permission rp on rp.role_id = r.id\r\n join m_permission p on p.id = rp.permission_id\r\n where \n\nur.appuser_id = ${currentUserId}\r\n and (p.code in (\'ALL_FUNCTIONS_READ\', \'ALL_FUNCTIONS\') or p.code = concat(\"READ_\", r.report_name))\r\n )\r\n order by \n\nr.report_category, r.report_name, rp.parameter_id',NULL),(1002,'FullParameterList',NULL,'n/a','n/a','n/a','n/a','Y',NULL,NULL,'select sp.parameter_name, sp.parameter_variable, sp.parameter_label, sp.parameter_displayType, \r\nsp.parameter_FormatType, sp.parameter_default, sp.selectOne, sp.selectAll, spp.parameter_name as parentParameterName\r\nfrom stretchy_parameter sp\r\nleft join stretchy_parameter spp on spp.parameter_id = sp.parent_parameter_id\r\nwhere sp.special is null\r\nand exists \r\n (select \'f\' \r\n from stretchy_report sr\r\n join stretchy_report_parameter srp on srp.report_id = sr.report_id\r\n where sr.report_name in(${reportListing})\r\n and srp.parameter_id = sp.parameter_id\r\n )\r\norder by sp.parameter_id',NULL),(1003,'reportCategoryList',NULL,'n/a','n/a','n/a','n/a','Y',NULL,NULL,'select r.report_id, r.report_name, r.report_type, r.report_subtype, \n\nr.report_category,\r\n rp.parameter_id, rp.report_parameter_name, p.parameter_name\r\n from stretchy_report r\r\n left join stretchy_report_parameter rp on \n\nrp.report_id = r.report_id\r\n left join stretchy_parameter p on p.parameter_id = rp.parameter_id\r\n where r.report_category = \'${reportCategory}\'\r\n and \n\nr.use_report is true\r\n and exists\r\n (\r\n select \'f\'\r\n from m_appuser_role ur \r\n join m_role r on r.id = ur.role_id\r\n join m_role_permission rp on \n\nrp.role_id = r.id\r\n join m_permission p on p.id = rp.permission_id\r\n where ur.appuser_id = ${currentUserId}\r\n and (p.code in (\'ALL_FUNCTIONS_READ\', \n\n\'ALL_FUNCTIONS\') or p.code = concat(\"READ_\", r.report_name))\r\n )\r\n order by r.report_category, r.report_name, rp.parameter_id',NULL);
INSERT INTO `stretchy_report_parameter` VALUES (1,5,NULL),(2,5,NULL),(2,6,NULL),(2,10,NULL),(2,20,NULL),(2,25,NULL),(2,26,NULL),(5,5,NULL),(5,6,NULL),(5,10,NULL),(5,20,NULL),(5,25,NULL),(5,26,NULL),(6,5,NULL),(6,6,NULL),(6,10,NULL),(6,20,NULL),(6,25,NULL),(6,26,NULL),(7,5,NULL),(7,6,NULL),(7,10,NULL),(7,20,NULL),(7,25,NULL),(7,26,NULL),(8,5,NULL),(8,6,NULL),(8,10,NULL),(8,25,NULL),(8,26,NULL),(11,5,NULL),(11,6,NULL),(11,10,NULL),(11,20,NULL),(11,25,NULL),(11,26,NULL),(11,100,NULL),(12,5,NULL),(12,6,NULL),(12,10,NULL),(12,20,NULL),(12,25,NULL),(12,26,NULL),(13,1,NULL),(13,2,NULL),(13,3,NULL),(13,5,NULL),(13,6,NULL),(13,10,NULL),(13,20,NULL),(13,25,NULL),(13,26,NULL),(14,1,NULL),(14,2,NULL),(14,3,NULL),(14,5,NULL),(14,6,NULL),(14,10,NULL),(14,20,NULL),(14,25,NULL),(14,26,NULL),(15,5,NULL),(15,6,NULL),(15,10,NULL),(15,20,NULL),(15,25,NULL),(15,26,NULL),(15,100,NULL),(16,5,NULL),(16,6,NULL),(16,10,NULL),(16,20,NULL),(16,25,NULL),(16,26,NULL),(16,100,NULL),(20,1,NULL),(20,2,NULL),(20,10,NULL),(20,20,NULL),(21,1,NULL),(21,2,NULL),(21,5,NULL),(21,10,NULL),(21,20,NULL),(48,5,'branch'),(48,2,'date'),(49,5,'branch'),(49,1,'fromDate'),(49,2,'toDate'),(50,5,'branch'),(50,1,'fromDate'),(50,2,'toDate'),(51,1,NULL),(51,2,NULL),(51,5,NULL),(51,10,NULL),(51,25,NULL),(52,5,NULL),(53,5,NULL),(53,10,NULL),(54,1,NULL),(54,2,NULL),(54,5,NULL),(54,10,NULL),(54,25,NULL),(55,5,NULL),(55,6,NULL),(55,10,NULL),(55,20,NULL),(55,25,NULL),(55,26,NULL),(56,5,NULL),(56,6,NULL),(56,10,NULL),(56,20,NULL),(56,25,NULL),(56,26,NULL),(56,100,NULL),(57,5,NULL),(57,6,NULL),(57,10,NULL),(57,20,NULL),(57,25,NULL),(57,26,NULL),(58,5,NULL),(58,6,NULL),(58,10,NULL),(58,20,NULL),(58,25,NULL),(58,26,NULL),(58,100,NULL),(59,1,NULL),(59,2,NULL),(59,5,NULL),(59,6,NULL),(59,10,NULL),(59,20,NULL),(59,25,NULL),(59,26,NULL),(61,5,NULL),(61,10,NULL),(92,1,'fromDate'),(92,5,'selectOffice'),(92,2,'toDate'),(93,1,NULL),(93,2,NULL),(93,5,NULL),(93,6,NULL),(94,2,'endDate'),(94,6,'loanOfficerId'),(94,5,'officeId'),(94,1,'startDate');
-insert into m_permission(grouping, `code`, entity_name, action_name, can_maker_checker)
+insert into m_permission(`grouping`, `code`, entity_name, action_name, can_maker_checker)
select 'report', concat('READ_', r.report_name), r.report_name, 'READ', false
from stretchy_report r;
diff --git a/fineract-provider/src/main/resources/sql/migrations/core_db/V76__rename_permission_grouping.sql b/fineract-provider/src/main/resources/sql/migrations/core_db/V76__rename_permission_grouping.sql
index 5def9a6ef60..06565dc4885 100644
--- a/fineract-provider/src/main/resources/sql/migrations/core_db/V76__rename_permission_grouping.sql
+++ b/fineract-provider/src/main/resources/sql/migrations/core_db/V76__rename_permission_grouping.sql
@@ -20,12 +20,12 @@
/* break-out center and group permissions from porfolio grouping */
update m_permission
-set grouping = "portfolio_center"
+set `grouping` = "portfolio_center"
where code like '%center%'
-and grouping like 'portfolio';
+and `grouping` like 'portfolio';
update m_permission
-set grouping = "portfolio_group"
+set `grouping` = "portfolio_group"
where code like '%group%'
-and grouping like 'portfolio';
\ No newline at end of file
+and `grouping` like 'portfolio';
diff --git a/fineract-provider/src/main/resources/sql/migrations/core_db/V78__breakdown_portfolio_grouping.sql b/fineract-provider/src/main/resources/sql/migrations/core_db/V78__breakdown_portfolio_grouping.sql
index acc3bef0968..50f28d34f33 100644
--- a/fineract-provider/src/main/resources/sql/migrations/core_db/V78__breakdown_portfolio_grouping.sql
+++ b/fineract-provider/src/main/resources/sql/migrations/core_db/V78__breakdown_portfolio_grouping.sql
@@ -20,5 +20,5 @@
/* grouping is misspelt but also should be under accounting */
update m_permission
-set grouping = 'accounting'
-where grouping = 'organistion';
\ No newline at end of file
+set `grouping` = 'accounting'
+where `grouping` = 'organistion';
diff --git a/fineract-provider/src/main/resources/sql/migrations/core_db/V8__deposit-transaction-permissions-if-they-exist.sql b/fineract-provider/src/main/resources/sql/migrations/core_db/V8__deposit-transaction-permissions-if-they-exist.sql
index 9901d0818b2..d9fc0ae26bf 100644
--- a/fineract-provider/src/main/resources/sql/migrations/core_db/V8__deposit-transaction-permissions-if-they-exist.sql
+++ b/fineract-provider/src/main/resources/sql/migrations/core_db/V8__deposit-transaction-permissions-if-they-exist.sql
@@ -17,5 +17,5 @@
-- under the License.
--
-delete from m_permission where grouping = 'transaction_deposit';
+delete from m_permission where `grouping` = 'transaction_deposit';
diff --git a/fineract-provider/src/main/resources/sql/migrations/core_db/V92__group_center_assign_staff_permission.sql b/fineract-provider/src/main/resources/sql/migrations/core_db/V92__group_center_assign_staff_permission.sql
index c6c4f049ab3..c8c00c1882d 100644
--- a/fineract-provider/src/main/resources/sql/migrations/core_db/V92__group_center_assign_staff_permission.sql
+++ b/fineract-provider/src/main/resources/sql/migrations/core_db/V92__group_center_assign_staff_permission.sql
@@ -17,5 +17,5 @@
-- under the License.
--
-INSERT INTO `m_permission` (grouping,code,`entity_name`,`action_name`,`can_maker_checker`)
-values('portfolio_group','ASSIGNSTAFF_GROUP','GROUP','ASSIGNSTAFF',0);
\ No newline at end of file
+INSERT INTO `m_permission` (`grouping`,code,`entity_name`,`action_name`,`can_maker_checker`)
+values('portfolio_group','ASSIGNSTAFF_GROUP','GROUP','ASSIGNSTAFF',0);