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

[fineract] 01/02: Fineract Asset Externalization models - [x] Liquibase database model - [x] JPA model - [x] API endpoint without implementation - [x] API endpoint requirements - [x] Json Serialization and Deserialization and dependencies - [x] New Authentication check interface to the core level - [x] CommandWrapperBuilder and dependencies

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

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

commit da1aa9e5a87db5c1e9a78f6ae14462e2fabfa3b2
Author: Janos Haber <ja...@finesolution.hu>
AuthorDate: Tue May 16 00:45:03 2023 +0200

    Fineract Asset Externalization models
    - [x] Liquibase database model
    - [x] JPA model
    - [x] API endpoint without implementation
    - [x] API endpoint requirements
      - [x] Json Serialization and Deserialization and dependencies
      - [x] New Authentication check interface to the core level
      - [x] CommandWrapperBuilder and dependencies
---
 custom/docker/build.gradle                         |   1 +
 fineract-core/dependencies.gradle                  |   8 +-
 .../accounting/common/AccountingConstants.java     |   0
 .../data/FinancialActivityData.java                |   0
 .../accounting/glaccount/domain/GLAccountType.java |   0
 .../fineract/commands/domain/CommandWrapper.java   |   0
 .../commands/service/CommandWrapperBuilder.java    |   0
 .../data/AccountNumberFormatData.java              |   0
 .../service/AccountNumberFormatConstants.java      |   0
 .../core/api/ApiParameterHelper.java               |   0
 .../core/api/ApiRequestParameterHelper.java        |   0
 .../infrastructure/core/api/DateAdapter.java       |   0
 .../infrastructure/core/api/ExternalIdAdapter.java |   0
 .../core/api/JodaDateTimeAdapter.java              |   0
 .../core/api/JodaMonthDayAdapter.java              |   0
 .../infrastructure/core/api/LocalDateAdapter.java  |   0
 .../core/api/LocalDateTimeAdapter.java             |   0
 .../infrastructure/core/api/LocalTimeAdapter.java  |   0
 .../core/api/OffsetDateTimeAdapter.java            |   0
 .../core/api/ParameterListExclusionStrategy.java   |   0
 .../core/api/ParameterListInclusionStrategy.java   |   0
 .../infrastructure/core/data/EnumOptionData.java   |   0
 .../core/domain/AbstractAuditableCustom.java       |   0
 .../core/domain/AbstractPersistableCustom.java     |   0
 .../ApiRequestJsonSerializationSettings.java       |   0
 .../CommandProcessingResultJsonSerializer.java     |   0
 .../core/serialization/CommandSerializer.java      |   0
 .../CommandSerializerDefaultToJson.java            |   0
 .../serialization/DefaultToApiJsonSerializer.java  |   0
 ...hPrettyPrintingOffJsonSerializerGoogleGson.java |   0
 ...thPrettyPrintingOnJsonSerializerGoogleGson.java |   0
 .../serialization/GoogleGsonSerializerHelper.java  |   0
 .../core/serialization/ToApiJsonSerializer.java    |   0
 .../fineract/infrastructure/core/service/Page.java |   0
 .../service/PlatformUserRightsContext.java         |  15 +-
 .../portfolio/client/api/ClientApiConstants.java   |   5 +-
 .../api/PaymentTypeApiResourceConstants.java       |   0
 .../portfolio/savings/DepositsApiConstants.java    |   0
 .../portfolio/savings/SavingsApiConstants.java     |   0
 .../self/pockets/api/PocketApiConstants.java       |   0
 .../api/PasswordPreferencesApiConstants.java       |   0
 fineract-investor/dependencies.gradle              |  33 +++-
 .../api/ExternalAssetOwnersApiResource.java        |  79 ++++++++
 .../investor/data/ExternalTransferData.java        |  21 +-
 .../data/ExternalTransferLoanMappingData.java      |  10 +-
 .../investor/data/ExternalTransferOwnerData.java   |   9 +-
 .../investor/data/ExternalTransferStatus.java      |  16 +-
 .../investor/domain/ExternalAssetOwner.java        |  31 +--
 .../domain/ExternalAssetOwnerRepository.java       |  13 +-
 .../domain/ExternalAssetOwnerTransfer.java         |  60 ++++++
 .../ExternalAssetOwnerTransferLoanMapping.java     |  34 ++--
 .../ExternalAssetOwnerTransferRepository.java      |  13 +-
 .../module/investor/module-changelog-master.xml    |   3 +-
 .../module/investor/parts/0002_asset_schemas.xml   | 220 +++++++++++++++++++++
 .../security/service/PlatformSecurityContext.java  |   2 +-
 .../SpringSecurityPlatformSecurityContext.java     |   5 +
 56 files changed, 480 insertions(+), 98 deletions(-)

diff --git a/custom/docker/build.gradle b/custom/docker/build.gradle
index 50253a22c..b2259a9a7 100644
--- a/custom/docker/build.gradle
+++ b/custom/docker/build.gradle
@@ -68,6 +68,7 @@ jib {
     allowInsecureRegistries = true
 
     dependencies {
+        implementation project(':fineract-core')
         implementation project(':fineract-provider')
         // NOTE: dynamically load all custom modules
         file("${rootDir}/custom").eachDir { companyDir ->
diff --git a/fineract-core/dependencies.gradle b/fineract-core/dependencies.gradle
index 1c41c9971..c13b498a2 100644
--- a/fineract-core/dependencies.gradle
+++ b/fineract-core/dependencies.gradle
@@ -35,7 +35,6 @@ dependencies {
             'com.google.code.gson:gson',
 
             'org.apache.commons:commons-lang3',
-            'org.liquibase:liquibase-core',
 
             'com.jayway.jsonpath:json-path',
 
@@ -49,7 +48,12 @@ dependencies {
 
             'io.github.resilience4j:resilience4j-spring-boot2',
             )
-
+    implementation ('org.springframework.boot:spring-boot-starter-data-jpa') {
+        exclude group: 'org.hibernate'
+    }
+    implementation('org.eclipse.persistence:org.eclipse.persistence.jpa') {
+        exclude group: 'org.eclipse.persistence', module: 'jakarta.persistence'
+    }
     implementation('org.springframework.boot:spring-boot-starter-jersey') {
         exclude group: 'org.glassfish.hk2.external', module: 'aopalliance-repackaged'
         exclude group: 'org.glassfish.hk2', module: 'hk2-runlevel'
diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/common/AccountingConstants.java b/fineract-core/src/main/java/org/apache/fineract/accounting/common/AccountingConstants.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/accounting/common/AccountingConstants.java
rename to fineract-core/src/main/java/org/apache/fineract/accounting/common/AccountingConstants.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/financialactivityaccount/data/FinancialActivityData.java b/fineract-core/src/main/java/org/apache/fineract/accounting/financialactivityaccount/data/FinancialActivityData.java
similarity index 100%
copy from fineract-provider/src/main/java/org/apache/fineract/accounting/financialactivityaccount/data/FinancialActivityData.java
copy to fineract-core/src/main/java/org/apache/fineract/accounting/financialactivityaccount/data/FinancialActivityData.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/glaccount/domain/GLAccountType.java b/fineract-core/src/main/java/org/apache/fineract/accounting/glaccount/domain/GLAccountType.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/accounting/glaccount/domain/GLAccountType.java
rename to fineract-core/src/main/java/org/apache/fineract/accounting/glaccount/domain/GLAccountType.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/commands/domain/CommandWrapper.java b/fineract-core/src/main/java/org/apache/fineract/commands/domain/CommandWrapper.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/commands/domain/CommandWrapper.java
rename to fineract-core/src/main/java/org/apache/fineract/commands/domain/CommandWrapper.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/commands/service/CommandWrapperBuilder.java b/fineract-core/src/main/java/org/apache/fineract/commands/service/CommandWrapperBuilder.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/commands/service/CommandWrapperBuilder.java
rename to fineract-core/src/main/java/org/apache/fineract/commands/service/CommandWrapperBuilder.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/data/AccountNumberFormatData.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/data/AccountNumberFormatData.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/data/AccountNumberFormatData.java
rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/data/AccountNumberFormatData.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/service/AccountNumberFormatConstants.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/service/AccountNumberFormatConstants.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/service/AccountNumberFormatConstants.java
rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/service/AccountNumberFormatConstants.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/ApiParameterHelper.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/ApiParameterHelper.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/ApiParameterHelper.java
rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/ApiParameterHelper.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/ApiRequestParameterHelper.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/ApiRequestParameterHelper.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/ApiRequestParameterHelper.java
rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/ApiRequestParameterHelper.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/DateAdapter.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/DateAdapter.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/DateAdapter.java
rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/DateAdapter.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/ExternalIdAdapter.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/ExternalIdAdapter.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/ExternalIdAdapter.java
rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/ExternalIdAdapter.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/JodaDateTimeAdapter.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/JodaDateTimeAdapter.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/JodaDateTimeAdapter.java
rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/JodaDateTimeAdapter.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/JodaMonthDayAdapter.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/JodaMonthDayAdapter.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/JodaMonthDayAdapter.java
rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/JodaMonthDayAdapter.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/LocalDateAdapter.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/LocalDateAdapter.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/LocalDateAdapter.java
rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/LocalDateAdapter.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/LocalDateTimeAdapter.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/LocalDateTimeAdapter.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/LocalDateTimeAdapter.java
rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/LocalDateTimeAdapter.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/LocalTimeAdapter.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/LocalTimeAdapter.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/LocalTimeAdapter.java
rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/LocalTimeAdapter.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/OffsetDateTimeAdapter.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/OffsetDateTimeAdapter.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/OffsetDateTimeAdapter.java
rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/OffsetDateTimeAdapter.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/ParameterListExclusionStrategy.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/ParameterListExclusionStrategy.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/ParameterListExclusionStrategy.java
rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/ParameterListExclusionStrategy.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/ParameterListInclusionStrategy.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/ParameterListInclusionStrategy.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/ParameterListInclusionStrategy.java
rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/ParameterListInclusionStrategy.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/data/EnumOptionData.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/data/EnumOptionData.java
similarity index 100%
copy from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/data/EnumOptionData.java
copy to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/data/EnumOptionData.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/AbstractAuditableCustom.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/domain/AbstractAuditableCustom.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/AbstractAuditableCustom.java
rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/domain/AbstractAuditableCustom.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/AbstractPersistableCustom.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/domain/AbstractPersistableCustom.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/AbstractPersistableCustom.java
rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/domain/AbstractPersistableCustom.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/ApiRequestJsonSerializationSettings.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/serialization/ApiRequestJsonSerializationSettings.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/ApiRequestJsonSerializationSettings.java
rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/serialization/ApiRequestJsonSerializationSettings.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/CommandProcessingResultJsonSerializer.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/serialization/CommandProcessingResultJsonSerializer.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/CommandProcessingResultJsonSerializer.java
rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/serialization/CommandProcessingResultJsonSerializer.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/CommandSerializer.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/serialization/CommandSerializer.java
similarity index 100%
copy from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/CommandSerializer.java
copy to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/serialization/CommandSerializer.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/CommandSerializerDefaultToJson.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/serialization/CommandSerializerDefaultToJson.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/CommandSerializerDefaultToJson.java
rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/serialization/CommandSerializerDefaultToJson.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/DefaultToApiJsonSerializer.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/serialization/DefaultToApiJsonSerializer.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/DefaultToApiJsonSerializer.java
rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/serialization/DefaultToApiJsonSerializer.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/ExcludeNothingWithPrettyPrintingOffJsonSerializerGoogleGson.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/serialization/ExcludeNothingWithPrettyPrintingOffJsonSerializerGoogleGson.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/ExcludeNothingWithPrettyPrintingOffJsonSerializerGoogleGson.java
rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/serialization/ExcludeNothingWithPrettyPrintingOffJsonSerializerGoogleGson.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/ExcludeNothingWithPrettyPrintingOnJsonSerializerGoogleGson.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/serialization/ExcludeNothingWithPrettyPrintingOnJsonSerializerGoogleGson.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/ExcludeNothingWithPrettyPrintingOnJsonSerializerGoogleGson.java
rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/serialization/ExcludeNothingWithPrettyPrintingOnJsonSerializerGoogleGson.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/GoogleGsonSerializerHelper.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/serialization/GoogleGsonSerializerHelper.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/GoogleGsonSerializerHelper.java
rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/serialization/GoogleGsonSerializerHelper.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/ToApiJsonSerializer.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/serialization/ToApiJsonSerializer.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/ToApiJsonSerializer.java
rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/serialization/ToApiJsonSerializer.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/Page.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/Page.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/Page.java
rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/Page.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/CommandSerializer.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/security/service/PlatformUserRightsContext.java
similarity index 72%
copy from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/CommandSerializer.java
copy to fineract-core/src/main/java/org/apache/fineract/infrastructure/security/service/PlatformUserRightsContext.java
index b06b1f433..519be83d7 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/CommandSerializer.java
+++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/security/service/PlatformUserRightsContext.java
@@ -16,18 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.infrastructure.core.serialization;
+package org.apache.fineract.infrastructure.security.service;
 
-/**
- * Service for serializing commands into another format.
- *
- * <p>
- * Known implementations:
- * </p>
- *
- * @see CommandSerializerDefaultToJson
- */
-public interface CommandSerializer {
+public interface PlatformUserRightsContext {
 
-    String serializeCommandToJson(Object command);
+    void isAuthenticated();
 }
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientApiConstants.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/client/api/ClientApiConstants.java
similarity index 98%
rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientApiConstants.java
rename to fineract-core/src/main/java/org/apache/fineract/portfolio/client/api/ClientApiConstants.java
index 334a12992..86bd93231 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientApiConstants.java
+++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/client/api/ClientApiConstants.java
@@ -21,7 +21,6 @@ package org.apache.fineract.portfolio.client.api;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Set;
-import org.apache.fineract.portfolio.client.data.ClientData;
 
 @SuppressWarnings({ "HideUtilityClassConstructor" })
 public class ClientApiConstants {
@@ -189,8 +188,8 @@ public class ClientApiConstants {
             Arrays.asList("loanAccounts", "savingsAccounts", "shareAccounts"));
 
     /**
-     * These parameters will match the class level parameters of {@link ClientData}. Where possible, we try to get
-     * response parameters to match those of request parameters.
+     * These parameters will match the class level parameters of ClientData. Where possible, we try to get response
+     * parameters to match those of request parameters.
      */
     protected static final Set<String> CLIENT_RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList(idParamName, accountNoParamName,
             externalIdParamName, statusParamName, activeParamName, activationDateParamName, firstnameParamName, middlenameParamName,
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/api/PaymentTypeApiResourceConstants.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/paymenttype/api/PaymentTypeApiResourceConstants.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/api/PaymentTypeApiResourceConstants.java
rename to fineract-core/src/main/java/org/apache/fineract/portfolio/paymenttype/api/PaymentTypeApiResourceConstants.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/DepositsApiConstants.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/DepositsApiConstants.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/DepositsApiConstants.java
rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/DepositsApiConstants.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsApiConstants.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/SavingsApiConstants.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsApiConstants.java
rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/SavingsApiConstants.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/pockets/api/PocketApiConstants.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/self/pockets/api/PocketApiConstants.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/self/pockets/api/PocketApiConstants.java
rename to fineract-core/src/main/java/org/apache/fineract/portfolio/self/pockets/api/PocketApiConstants.java
diff --git a/fineract-provider/src/main/java/org/apache/fineract/useradministration/api/PasswordPreferencesApiConstants.java b/fineract-core/src/main/java/org/apache/fineract/useradministration/api/PasswordPreferencesApiConstants.java
similarity index 100%
rename from fineract-provider/src/main/java/org/apache/fineract/useradministration/api/PasswordPreferencesApiConstants.java
rename to fineract-core/src/main/java/org/apache/fineract/useradministration/api/PasswordPreferencesApiConstants.java
diff --git a/fineract-investor/dependencies.gradle b/fineract-investor/dependencies.gradle
index d6f93f2c3..c2c6fb8dd 100644
--- a/fineract-investor/dependencies.gradle
+++ b/fineract-investor/dependencies.gradle
@@ -24,11 +24,40 @@ dependencies {
 
     // implementation dependencies are directly used (compiled against) in src/main (and src/test)
     //
-    api(project(path: ':fineract-core'))
+    implementation(project(path: ':fineract-core'))
+
+    implementation(
+            'org.springframework.boot:spring-boot-starter-web',
+            'org.springframework.boot:spring-boot-starter-security',
+            'jakarta.ws.rs:jakarta.ws.rs-api',
+            'org.glassfish.jersey.media:jersey-media-multipart',
+
+            'com.google.guava:guava',
+            'com.google.code.gson:gson',
+
+            'org.apache.commons:commons-lang3',
+
+            'com.jayway.jsonpath:json-path',
+
+            'com.github.spotbugs:spotbugs-annotations',
+            'io.swagger.core.v3:swagger-annotations',
+
+            'com.squareup.retrofit2:converter-gson',
+
+            'org.springdoc:springdoc-openapi-security',
+            'org.mapstruct:mapstruct',
+
+            'io.github.resilience4j:resilience4j-spring-boot2',
+            )
     compileOnly 'org.projectlombok:lombok'
     annotationProcessor 'org.projectlombok:lombok'
     annotationProcessor 'org.mapstruct:mapstruct-processor'
-
+    implementation ('org.springframework.boot:spring-boot-starter-data-jpa') {
+        exclude group: 'org.hibernate'
+    }
+    implementation('org.eclipse.persistence:org.eclipse.persistence.jpa') {
+        exclude group: 'org.eclipse.persistence', module: 'jakarta.persistence'
+    }
     // testCompile dependencies are ONLY used in src/test, not src/main.
     // Do NOT repeat dependencies which are ALREADY in implementation or runtimeOnly!
     //
diff --git a/fineract-investor/src/main/java/org/apache/fineract/investor/api/ExternalAssetOwnersApiResource.java b/fineract-investor/src/main/java/org/apache/fineract/investor/api/ExternalAssetOwnersApiResource.java
new file mode 100644
index 000000000..0213e26af
--- /dev/null
+++ b/fineract-investor/src/main/java/org/apache/fineract/investor/api/ExternalAssetOwnersApiResource.java
@@ -0,0 +1,79 @@
+/**
+ * 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.
+ */
+package org.apache.fineract.investor.api;
+
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang3.NotImplementedException;
+import org.apache.fineract.infrastructure.security.service.PlatformUserRightsContext;
+import org.springframework.stereotype.Component;
+
+@Path("/external-asset-owners")
+@Component
+@Tag(name = "External Asset Owners", description = "External Asset Owners")
+@RequiredArgsConstructor
+public class ExternalAssetOwnersApiResource {
+
+    private final PlatformUserRightsContext platformUserRightsContext;
+
+    @POST
+    @Path("/transfers/loans/{loanId}")
+    @Consumes({ MediaType.APPLICATION_JSON })
+    @Produces({ MediaType.APPLICATION_JSON })
+    public String transferRequestWithLoanId(@PathParam("loanId") final Long loanId,
+            @QueryParam("command") @Parameter(description = "command") final String commandParam,
+            @Parameter(hidden = true) final String apiRequestBodyAsJson) {
+        platformUserRightsContext.isAuthenticated();
+
+        throw new NotImplementedException("Not implemented yet");
+    }
+
+    @POST
+    @Path("/transfers/loans//external-id/{loanExternalId}")
+    @Consumes({ MediaType.APPLICATION_JSON })
+    @Produces({ MediaType.APPLICATION_JSON })
+    public String transferRequestWithLoanExternalId(@PathParam("loanExternalId") final Long loanId,
+            @QueryParam("command") @Parameter(description = "command") final String commandParam,
+            @Parameter(hidden = true) final String apiRequestBodyAsJson) {
+        platformUserRightsContext.isAuthenticated();
+
+        throw new NotImplementedException("Not implemented yet");
+    }
+
+    @GET
+    @Path("/transfers")
+    @Produces({ MediaType.APPLICATION_JSON })
+    public String getTransfer(
+            @QueryParam("transferExternalId") @Parameter(description = "transferExternalId") final String transferExternalId,
+            @QueryParam("loanId") @Parameter(description = "loanId") final String loanId,
+            @QueryParam("loanExternalId") @Parameter(description = "loanExternalId") final String loanExternalId) {
+        platformUserRightsContext.isAuthenticated();
+
+        throw new NotImplementedException("Not implemented yet");
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/financialactivityaccount/data/FinancialActivityData.java b/fineract-investor/src/main/java/org/apache/fineract/investor/data/ExternalTransferData.java
similarity index 57%
copy from fineract-provider/src/main/java/org/apache/fineract/accounting/financialactivityaccount/data/FinancialActivityData.java
copy to fineract-investor/src/main/java/org/apache/fineract/investor/data/ExternalTransferData.java
index 004f9c0aa..83dec6e34 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/accounting/financialactivityaccount/data/FinancialActivityData.java
+++ b/fineract-investor/src/main/java/org/apache/fineract/investor/data/ExternalTransferData.java
@@ -16,15 +16,24 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.accounting.financialactivityaccount.data;
+package org.apache.fineract.investor.data;
 
+import java.math.BigDecimal;
+import java.time.LocalDate;
 import lombok.Data;
-import org.apache.fineract.accounting.glaccount.domain.GLAccountType;
 
 @Data
-public class FinancialActivityData {
+public class ExternalTransferData {
 
-    private final Integer id;
-    private final String name;
-    private final GLAccountType mappedGLAccountType;
+    private final Long transferId;
+    private final ExternalTransferOwnerData owner;
+    private final ExternalTransferLoanMappingData loan;
+    private final String transferExternalId;
+    private final BigDecimal purchasePriceRatio;
+    private final LocalDate settlementDate;
+    private final ExternalTransferStatus status;
+    private final LocalDate effectiveFrom;
+    private final LocalDate effectiveTo;
+    private final String dateFormat;
+    private final String locale;
 }
diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/financialactivityaccount/data/FinancialActivityData.java b/fineract-investor/src/main/java/org/apache/fineract/investor/data/ExternalTransferLoanMappingData.java
similarity index 74%
copy from fineract-provider/src/main/java/org/apache/fineract/accounting/financialactivityaccount/data/FinancialActivityData.java
copy to fineract-investor/src/main/java/org/apache/fineract/investor/data/ExternalTransferLoanMappingData.java
index 004f9c0aa..0dfd8fa8d 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/accounting/financialactivityaccount/data/FinancialActivityData.java
+++ b/fineract-investor/src/main/java/org/apache/fineract/investor/data/ExternalTransferLoanMappingData.java
@@ -16,15 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.accounting.financialactivityaccount.data;
+package org.apache.fineract.investor.data;
 
 import lombok.Data;
-import org.apache.fineract.accounting.glaccount.domain.GLAccountType;
 
 @Data
-public class FinancialActivityData {
+public class ExternalTransferLoanMappingData {
 
-    private final Integer id;
-    private final String name;
-    private final GLAccountType mappedGLAccountType;
+    private final Long loanId;
+    private final String externalId;
 }
diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/financialactivityaccount/data/FinancialActivityData.java b/fineract-investor/src/main/java/org/apache/fineract/investor/data/ExternalTransferOwnerData.java
similarity index 74%
copy from fineract-provider/src/main/java/org/apache/fineract/accounting/financialactivityaccount/data/FinancialActivityData.java
copy to fineract-investor/src/main/java/org/apache/fineract/investor/data/ExternalTransferOwnerData.java
index 004f9c0aa..edc1602bd 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/accounting/financialactivityaccount/data/FinancialActivityData.java
+++ b/fineract-investor/src/main/java/org/apache/fineract/investor/data/ExternalTransferOwnerData.java
@@ -16,15 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.accounting.financialactivityaccount.data;
+package org.apache.fineract.investor.data;
 
 import lombok.Data;
-import org.apache.fineract.accounting.glaccount.domain.GLAccountType;
 
 @Data
-public class FinancialActivityData {
+public class ExternalTransferOwnerData {
 
-    private final Integer id;
-    private final String name;
-    private final GLAccountType mappedGLAccountType;
+    private final String externalId;
 }
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/CommandSerializer.java b/fineract-investor/src/main/java/org/apache/fineract/investor/data/ExternalTransferStatus.java
similarity index 72%
rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/CommandSerializer.java
rename to fineract-investor/src/main/java/org/apache/fineract/investor/data/ExternalTransferStatus.java
index b06b1f433..74a410cdf 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/CommandSerializer.java
+++ b/fineract-investor/src/main/java/org/apache/fineract/investor/data/ExternalTransferStatus.java
@@ -16,18 +16,8 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.infrastructure.core.serialization;
+package org.apache.fineract.investor.data;
 
-/**
- * Service for serializing commands into another format.
- *
- * <p>
- * Known implementations:
- * </p>
- *
- * @see CommandSerializerDefaultToJson
- */
-public interface CommandSerializer {
-
-    String serializeCommandToJson(Object command);
+public enum ExternalTransferStatus {
+    ACTIVE, DECLINED, PENDING, BUYBACK, CANCELLED
 }
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/data/EnumOptionData.java b/fineract-investor/src/main/java/org/apache/fineract/investor/domain/ExternalAssetOwner.java
similarity index 58%
copy from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/data/EnumOptionData.java
copy to fineract-investor/src/main/java/org/apache/fineract/investor/domain/ExternalAssetOwner.java
index 6f2251e9f..ba186a81b 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/data/EnumOptionData.java
+++ b/fineract-investor/src/main/java/org/apache/fineract/investor/domain/ExternalAssetOwner.java
@@ -16,24 +16,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.infrastructure.core.data;
+package org.apache.fineract.investor.domain;
 
-import java.io.Serializable;
-import lombok.AllArgsConstructor;
-import lombok.EqualsAndHashCode;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import lombok.AccessLevel;
 import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import org.apache.fineract.infrastructure.core.domain.AbstractAuditableCustom;
 
-/**
- * <p>
- * Immutable data object representing generic enumeration value.
- * </p>
- */
 @Getter
-@EqualsAndHashCode
-@AllArgsConstructor
-public class EnumOptionData implements Serializable {
+@Setter
+@Entity
+@NoArgsConstructor(access = AccessLevel.PROTECTED)
+@Table(name = "m_external_asset_owner")
+public class ExternalAssetOwner extends AbstractAuditableCustom {
+
+    @Column(name = "external_id", nullable = false, length = 100, unique = true)
+    private String externalId;
 
-    private final Long id;
-    private final String code;
-    private final String value;
 }
diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/financialactivityaccount/data/FinancialActivityData.java b/fineract-investor/src/main/java/org/apache/fineract/investor/domain/ExternalAssetOwnerRepository.java
similarity index 71%
copy from fineract-provider/src/main/java/org/apache/fineract/accounting/financialactivityaccount/data/FinancialActivityData.java
copy to fineract-investor/src/main/java/org/apache/fineract/investor/domain/ExternalAssetOwnerRepository.java
index 004f9c0aa..eee4e5d8e 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/accounting/financialactivityaccount/data/FinancialActivityData.java
+++ b/fineract-investor/src/main/java/org/apache/fineract/investor/domain/ExternalAssetOwnerRepository.java
@@ -16,15 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.accounting.financialactivityaccount.data;
+package org.apache.fineract.investor.domain;
 
-import lombok.Data;
-import org.apache.fineract.accounting.glaccount.domain.GLAccountType;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 
-@Data
-public class FinancialActivityData {
+public interface ExternalAssetOwnerRepository
+        extends JpaRepository<ExternalAssetOwner, Long>, JpaSpecificationExecutor<ExternalAssetOwner> {
 
-    private final Integer id;
-    private final String name;
-    private final GLAccountType mappedGLAccountType;
 }
diff --git a/fineract-investor/src/main/java/org/apache/fineract/investor/domain/ExternalAssetOwnerTransfer.java b/fineract-investor/src/main/java/org/apache/fineract/investor/domain/ExternalAssetOwnerTransfer.java
new file mode 100644
index 000000000..a638ec802
--- /dev/null
+++ b/fineract-investor/src/main/java/org/apache/fineract/investor/domain/ExternalAssetOwnerTransfer.java
@@ -0,0 +1,60 @@
+/**
+ * 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.
+ */
+package org.apache.fineract.investor.domain;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import org.apache.fineract.infrastructure.core.domain.AbstractAuditableCustom;
+
+@Getter
+@Setter
+@Table(name = "m_external_asset_owner_transfer")
+@NoArgsConstructor(access = AccessLevel.PROTECTED)
+@Entity
+public class ExternalAssetOwnerTransfer extends AbstractAuditableCustom {
+
+    @Column(name = "owner_id")
+    private Long ownerId;
+
+    @Column(name = "external_id", length = 100)
+    private String externalId;
+
+    @Column(name = "status", length = 50)
+    private String status;
+
+    @Column(name = "purchase_price_ratio", precision = 19, scale = 6)
+    private BigDecimal purchasePriceRatio;
+
+    @Column(name = "settlement_date")
+    private LocalDate settlementDate;
+
+    @Column(name = "effective_date_from")
+    private LocalDate effectiveDateFrom;
+
+    @Column(name = "effective_date_to")
+    private LocalDate effectiveDateTo;
+
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/data/EnumOptionData.java b/fineract-investor/src/main/java/org/apache/fineract/investor/domain/ExternalAssetOwnerTransferLoanMapping.java
similarity index 55%
rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/data/EnumOptionData.java
rename to fineract-investor/src/main/java/org/apache/fineract/investor/domain/ExternalAssetOwnerTransferLoanMapping.java
index 6f2251e9f..37a9d4ac3 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/data/EnumOptionData.java
+++ b/fineract-investor/src/main/java/org/apache/fineract/investor/domain/ExternalAssetOwnerTransferLoanMapping.java
@@ -16,24 +16,28 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.infrastructure.core.data;
+package org.apache.fineract.investor.domain;
 
-import java.io.Serializable;
-import lombok.AllArgsConstructor;
-import lombok.EqualsAndHashCode;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import lombok.AccessLevel;
 import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import org.apache.fineract.infrastructure.core.domain.AbstractAuditableCustom;
 
-/**
- * <p>
- * Immutable data object representing generic enumeration value.
- * </p>
- */
 @Getter
-@EqualsAndHashCode
-@AllArgsConstructor
-public class EnumOptionData implements Serializable {
+@Setter
+@Table(name = "m_external_asset_owner_transfer_loan_mapping")
+@NoArgsConstructor(access = AccessLevel.PROTECTED)
+@Entity
+public class ExternalAssetOwnerTransferLoanMapping extends AbstractAuditableCustom {
+
+    @Column(name = "loan_id", nullable = false)
+    private Long loanId;
+
+    @Column(name = "owner_transfer_id")
+    private Long ownerTransferId;
 
-    private final Long id;
-    private final String code;
-    private final String value;
 }
diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/financialactivityaccount/data/FinancialActivityData.java b/fineract-investor/src/main/java/org/apache/fineract/investor/domain/ExternalAssetOwnerTransferRepository.java
similarity index 69%
rename from fineract-provider/src/main/java/org/apache/fineract/accounting/financialactivityaccount/data/FinancialActivityData.java
rename to fineract-investor/src/main/java/org/apache/fineract/investor/domain/ExternalAssetOwnerTransferRepository.java
index 004f9c0aa..68675d870 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/accounting/financialactivityaccount/data/FinancialActivityData.java
+++ b/fineract-investor/src/main/java/org/apache/fineract/investor/domain/ExternalAssetOwnerTransferRepository.java
@@ -16,15 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.accounting.financialactivityaccount.data;
+package org.apache.fineract.investor.domain;
 
-import lombok.Data;
-import org.apache.fineract.accounting.glaccount.domain.GLAccountType;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 
-@Data
-public class FinancialActivityData {
+public interface ExternalAssetOwnerTransferRepository
+        extends JpaRepository<ExternalAssetOwnerTransfer, Long>, JpaSpecificationExecutor<ExternalAssetOwnerTransfer> {
 
-    private final Integer id;
-    private final String name;
-    private final GLAccountType mappedGLAccountType;
 }
diff --git a/fineract-investor/src/main/resources/db/changelog/tenant/module/investor/module-changelog-master.xml b/fineract-investor/src/main/resources/db/changelog/tenant/module/investor/module-changelog-master.xml
index 065386811..7f959be36 100644
--- a/fineract-investor/src/main/resources/db/changelog/tenant/module/investor/module-changelog-master.xml
+++ b/fineract-investor/src/main/resources/db/changelog/tenant/module/investor/module-changelog-master.xml
@@ -22,5 +22,6 @@
 <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">
-  <include relativeToChangelogFile="true" file="parts/0001_initial_schema.xml" />
+  <include relativeToChangelogFile="true" file="parts/0001_initial_schema.xml"/>
+  <include relativeToChangelogFile="true" file="parts/0002_asset_schemas.xml"/>
 </databaseChangeLog>
diff --git a/fineract-investor/src/main/resources/db/changelog/tenant/module/investor/parts/0002_asset_schemas.xml b/fineract-investor/src/main/resources/db/changelog/tenant/module/investor/parts/0002_asset_schemas.xml
new file mode 100644
index 000000000..1cb1f6c36
--- /dev/null
+++ b/fineract-investor/src/main/resources/db/changelog/tenant/module/investor/parts/0002_asset_schemas.xml
@@ -0,0 +1,220 @@
+<?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">
+
+  <!-- Create the m_external_asset_owner table -->
+  <changeSet author="fineract" id="1" context="postgresql">
+    <createTable tableName="m_external_asset_owner">
+      <column autoIncrement="true" name="id" type="BIGINT" remarks="Internal ID">
+        <constraints nullable="false" primaryKey="true"/>
+      </column>
+      <column name="external_id" type="varchar(100)" remarks="External id of asset owner">
+        <constraints nullable="false" unique="true"
+          uniqueConstraintName="UQ_external_asset_owner_external_id"/>
+      </column>
+      <column name="created_by" type="bigint" remarks=""/>
+      <column name="created_on_utc" type="TIMESTAMP WITH TIME ZONE" remarks=""/>
+      <column name="last_modified_by" type="bigint" remarks=""/>
+      <column name="last_modified_on_utc" type="TIMESTAMP WITH TIME ZONE" remarks=""/>
+    </createTable>
+  </changeSet>
+
+  <changeSet author="fineract" id="1" context="mysql">
+    <createTable tableName="m_external_asset_owner">
+      <column autoIncrement="true" name="id" type="BIGINT" remarks="Internal ID">
+        <constraints nullable="false" primaryKey="true"/>
+      </column>
+      <column name="external_id" type="varchar(100)" remarks="External id of asset owner">
+        <constraints nullable="false" unique="true"
+          uniqueConstraintName="UQ_external_asset_owner_external_id"/>
+      </column>
+      <column name="created_by" type="bigint" remarks=""/>
+      <column name="created_on_utc" type="DATETIME" remarks=""/>
+      <column name="last_modified_by" type="bigint" remarks=""/>
+      <column name="last_modified_on_utc" type="DATETIME" remarks=""/>
+    </createTable>
+  </changeSet>
+
+  <changeSet author="fineract" id="2">
+    <addForeignKeyConstraint baseColumnNames="created_by" baseTableName="m_external_asset_owner"
+      constraintName="FK_external_asset_owner_created_by" deferrable="false"
+      initiallyDeferred="false"
+      onDelete="RESTRICT" onUpdate="RESTRICT" referencedColumnNames="id"
+      referencedTableName="m_appuser" validate="true"/>
+    <addForeignKeyConstraint baseColumnNames="last_modified_by"
+      baseTableName="m_external_asset_owner"
+      constraintName="FK_external_asset_owner_modified_by" deferrable="false"
+      initiallyDeferred="false"
+      onDelete="RESTRICT" onUpdate="RESTRICT" referencedColumnNames="id"
+      referencedTableName="m_appuser" validate="true"/>
+  </changeSet>
+
+  <!-- Create m_external_asset_owner_transfer table -->
+  <changeSet author="fineract" id="3" context="mysql">
+    <createTable tableName="m_external_asset_owner_transfer">
+      <column autoIncrement="true" name="id" type="BIGINT" remarks="Internal ID">
+        <constraints nullable="false" primaryKey="true"/>
+      </column>
+      <column name="owner_id" type="BIGINT"/>
+      <column name="external_id" type="VARCHAR(100)"/>
+      <column name="status" type="VARCHAR(50)"/>
+      <column name="purchase_price_ratio" type="NUMERIC(19,6)"/>
+      <column name="settlement_date" type="DATE"/>
+      <column name="effective_date_from" type="DATE"/>
+      <column name="effective_date_to" type="DATe"/>
+      <column name="created_by" type="bigint" remarks=""/>
+      <column name="created_on_utc" type="DATETIME" remarks=""/>
+      <column name="last_modified_by" type="bigint" remarks=""/>
+      <column name="last_modified_on_utc" type="DATETIME" remarks=""/>
+    </createTable>
+  </changeSet>
+
+  <changeSet author="fineract" id="3" context="postgresql">
+    <createTable tableName="m_external_asset_owner_transfer">
+      <column autoIncrement="true" name="id" type="BIGINT" remarks="Internal ID">
+        <constraints nullable="false" primaryKey="true"/>
+      </column>
+      <column name="owner_id" type="BIGINT"/>
+      <column name="external_id" type="VARCHAR(100)"/>
+      <column name="status" type="VARCHAR(50)"/>
+      <column name="purchase_price_ratio" type="NUMERIC(19,6)"/>
+      <column name="settlement_date" type="DATE"/>
+      <column name="effective_date_from" type="DATE"/>
+      <column name="effective_date_to" type="DATe"/>
+      <column name="created_by" type="bigint" remarks=""/>
+      <column name="created_on_utc" type="TIMESTAMP WITH TIME ZONE" remarks=""/>
+      <column name="last_modified_by" type="bigint" remarks=""/>
+      <column name="last_modified_on_utc" type="TIMESTAMP WITH TIME ZONE" remarks=""/>
+    </createTable>
+  </changeSet>
+
+  <changeSet author="fineract" id="4">
+    <createIndex tableName="m_external_asset_owner_transfer"
+      indexName="external_asset_owner_transfer_external_id">
+      <column name="external_id"/>
+    </createIndex>
+    <createIndex tableName="m_external_asset_owner_transfer"
+      indexName="external_asset_owner_transfer_status">
+      <column name="status"/>
+    </createIndex>
+    <createIndex tableName="m_external_asset_owner_transfer"
+      indexName="external_asset_owner_transfer_settlement_date">
+      <column name="settlement_date"/>
+    </createIndex>
+    <createIndex tableName="m_external_asset_owner_transfer"
+      indexName="external_asset_owner_transfer_effective_date_from">
+      <column name="effective_date_from"/>
+    </createIndex>
+    <createIndex tableName="m_external_asset_owner_transfer"
+      indexName="external_asset_owner_transfer_effective_date_to">
+      <column name="effective_date_to"/>
+    </createIndex>
+
+    <addForeignKeyConstraint baseColumnNames="created_by"
+      baseTableName="m_external_asset_owner_transfer"
+      constraintName="FK_external_asset_owner_transfer_created_by" deferrable="false"
+      initiallyDeferred="false"
+      onDelete="RESTRICT" onUpdate="RESTRICT" referencedColumnNames="id"
+      referencedTableName="m_appuser" validate="true"/>
+    <addForeignKeyConstraint baseColumnNames="last_modified_by"
+      baseTableName="m_external_asset_owner_transfer"
+      constraintName="FK_external_asset_owner_transfer_modified_by" deferrable="false"
+      initiallyDeferred="false"
+      onDelete="RESTRICT" onUpdate="RESTRICT" referencedColumnNames="id"
+      referencedTableName="m_appuser" validate="true"/>
+
+    <addForeignKeyConstraint baseColumnNames="owner_id"
+      baseTableName="m_external_asset_owner_transfer"
+      constraintName="FK_external_asset_owner_transfer_owner_id" deferrable="false"
+      initiallyDeferred="false"
+      onDelete="RESTRICT" onUpdate="RESTRICT" referencedColumnNames="id"
+      referencedTableName="m_external_asset_owner" validate="true"/>
+  </changeSet>
+
+  <!-- Create table m_external_asset_owner_transfer_loan_mapping -->
+
+  <changeSet author="fineract" id="5" context="mysql">
+    <createTable tableName="m_external_asset_owner_transfer_loan_mapping">
+      <column autoIncrement="true" name="id" type="BIGINT" remarks="Internal ID">
+        <constraints nullable="false" primaryKey="true"/>
+      </column>
+      <column name="loan_id" type="bigint" remarks="Loan ID">
+        <constraints nullable="false"/>
+      </column>
+      <column name="owner_transfer_id" type="bigint" remarks="Owner">
+      </column>
+      <column name="created_by" type="bigint" remarks=""/>
+      <column name="created_on_utc" type="DATETIME" remarks=""/>
+      <column name="last_modified_by" type="bigint" remarks=""/>
+      <column name="last_modified_on_utc" type="DATETIME" remarks=""/>
+    </createTable>
+  </changeSet>
+
+  <changeSet author="fineract" id="5" context="postgresql">
+    <createTable tableName="m_external_asset_owner_transfer_loan_mapping">
+      <column autoIncrement="true" name="id" type="BIGINT" remarks="Internal ID">
+        <constraints nullable="false" primaryKey="true"/>
+      </column>
+      <column name="loan_id" type="bigint" remarks="Loan ID">
+        <constraints nullable="false"/>
+      </column>
+      <column name="owner_transfer_id" type="bigint" remarks="Owner">
+      </column>
+      <column name="created_by" type="bigint" remarks=""/>
+      <column name="created_on_utc" type="TIMESTAMP WITH TIME ZONE" remarks=""/>
+      <column name="last_modified_by" type="bigint" remarks=""/>
+      <column name="last_modified_on_utc" type="TIMESTAMP WITH TIME ZONE" remarks=""/>
+    </createTable>
+  </changeSet>
+
+  <changeSet author="fineract" id="6">
+    <addForeignKeyConstraint baseColumnNames="created_by"
+      baseTableName="m_external_asset_owner_transfer_loan_mapping"
+      constraintName="FK_external_asset_owner_transfer_loan_mapping_created_by" deferrable="false"
+      initiallyDeferred="false"
+      onDelete="RESTRICT" onUpdate="RESTRICT" referencedColumnNames="id"
+      referencedTableName="m_appuser" validate="true"/>
+    <addForeignKeyConstraint baseColumnNames="last_modified_by"
+      baseTableName="m_external_asset_owner_transfer_loan_mapping"
+      constraintName="FK_external_asset_owner_transfer_loan_mapping_modified_by" deferrable="false"
+      initiallyDeferred="false"
+      onDelete="RESTRICT" onUpdate="RESTRICT" referencedColumnNames="id"
+      referencedTableName="m_appuser" validate="true"/>
+
+    <addForeignKeyConstraint baseColumnNames="loan_id"
+      baseTableName="m_external_asset_owner_transfer_loan_mapping"
+      constraintName="FK_external_asset_owner_transfer_loan_mapping_loan_id" deferrable="false"
+      initiallyDeferred="false"
+      onDelete="RESTRICT" onUpdate="RESTRICT" referencedColumnNames="id"
+      referencedTableName="m_loan" validate="true"/>
+    <addForeignKeyConstraint baseColumnNames="owner_transfer_id"
+      baseTableName="m_external_asset_owner_transfer_loan_mapping"
+      constraintName="FK_external_asset_owner_transfer_loan_mapping_owner_transfer_id"
+      deferrable="false" initiallyDeferred="false"
+      onDelete="RESTRICT" onUpdate="RESTRICT" referencedColumnNames="id"
+      referencedTableName="m_external_asset_owner_transfer" validate="true"/>
+  </changeSet>
+
+
+</databaseChangeLog>
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/service/PlatformSecurityContext.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/service/PlatformSecurityContext.java
index 55831ce21..c02bce647 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/service/PlatformSecurityContext.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/service/PlatformSecurityContext.java
@@ -21,7 +21,7 @@ package org.apache.fineract.infrastructure.security.service;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.useradministration.domain.AppUser;
 
-public interface PlatformSecurityContext {
+public interface PlatformSecurityContext extends PlatformUserRightsContext {
 
     AppUser authenticatedUser();
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/service/SpringSecurityPlatformSecurityContext.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/service/SpringSecurityPlatformSecurityContext.java
index 3052ca416..2c44e11da 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/service/SpringSecurityPlatformSecurityContext.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/service/SpringSecurityPlatformSecurityContext.java
@@ -78,6 +78,11 @@ public class SpringSecurityPlatformSecurityContext implements PlatformSecurityCo
         return currentUser;
     }
 
+    @Override
+    public void isAuthenticated() {
+        authenticatedUser();
+    }
+
     @Override
     public AppUser getAuthenticatedUserIfPresent() {