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

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


The following commit(s) were added to refs/heads/develop by this push:
     new ae3e2a6343 FINERACT-2245: New command processing - mix taxonomy
ae3e2a6343 is described below

commit ae3e2a6343ec12a317eab34871c6b2567e9ad6b3
Author: Aleks <[email protected]>
AuthorDate: Wed Feb 18 11:56:13 2026 +0100

    FINERACT-2245: New command processing - mix taxonomy
---
 build.gradle                                       |  1 +
 .../commands/service/CommandWrapperBuilder.java    | 85 -------------------
 fineract-mix/build.gradle                          | 75 +++++++++++++++++
 fineract-mix/dependencies.gradle                   | 70 ++++++++++++++++
 .../fineract/mix/api/MixReportApiResource.java     | 15 ++--
 .../fineract/mix/api/MixTaxonomyApiResource.java   | 10 +--
 .../mix/api/MixTaxonomyMappingApiResource.java     | 40 +++++----
 .../command/MixTaxonomyMappingUpdateCommand.java   | 19 ++---
 .../mix/data/MixReportXBRLContextData.java         | 11 ++-
 .../fineract/mix/data/MixReportXBRLData.java       | 15 +++-
 .../mix/data/MixReportXBRLNamespaceData.java       | 13 ++-
 .../apache/fineract/mix/data/MixTaxonomyData.java  | 16 +++-
 .../fineract/mix/data/MixTaxonomyMappingData.java  |  7 +-
 .../mix/data/MixTaxonomyMappingUpdateRequest.java  |  6 +-
 .../mix/data/MixTaxonomyMappingUpdateResponse.java |  7 +-
 .../mix/domain/MixReportXBRLNamespace.java         | 25 ++++--
 .../domain/MixReportXBRLNamespaceRepository.java   | 10 ++-
 .../apache/fineract/mix/domain/MixTaxonomy.java    | 46 +++++++----
 .../fineract/mix/domain/MixTaxonomyMapping.java    | 28 +++++--
 .../mix/domain/MixTaxonomyMappingRepository.java   |  8 +-
 .../fineract/mix/domain/MixTaxonomyRepository.java |  9 ++-
 .../MixReportXBRLMappingInvalidException.java      |  4 +-
 .../MixTaxonomyMappingUpdateCommandHandler.java    | 51 ++++++++++++
 .../mix/mapping/MixReportXBRLNamespaceMapper.java  | 21 ++---
 .../fineract/mix/mapping/MixTaxonomyMapper.java    | 15 ++--
 .../mix/mapping/MixTaxonomyMappingMapper.java      | 10 ++-
 .../MixTaxonomyMappingUpdateRequestMapper.java     | 21 ++---
 .../fineract/mix/service/MixReportXBRLBuilder.java | 47 ++++++-----
 .../service/MixReportXBRLNamespaceReadService.java |  8 +-
 .../MixReportXBRLNamespaceReadServiceImpl.java     | 21 +++--
 .../mix/service/MixReportXBRLResultService.java    |  6 +-
 .../service/MixReportXBRLResultServiceImpl.java    | 94 +++++++++++-----------
 .../mix/service/MixTaxonomyMappingReadService.java |  2 +-
 .../service/MixTaxonomyMappingReadServiceImpl.java | 18 ++++-
 .../service/MixTaxonomyMappingWriteService.java    |  8 +-
 .../MixTaxonomyMappingWriteServiceImpl.java        | 48 +++++++++++
 .../mix/service/MixTaxonomyReadService.java        |  2 +-
 .../mix/service/MixTaxonomyReadServiceImpl.java    | 23 +++++-
 fineract-provider/dependencies.gradle              |  3 +-
 .../infrastructure/core/config/SecurityConfig.java | 28 +++++++
 .../org/apache/fineract/mix/data/ContextData.java  | 79 ------------------
 .../fineract/mix/domain/MixTaxonomyMapping.java    | 70 ----------------
 .../UpdateTaxonomyMappingCommandHandler.java       | 47 -----------
 .../MixTaxonomyMappingReadPlatformServiceImpl.java | 60 --------------
 ...MixTaxonomyMappingWritePlatformServiceImpl.java | 55 -------------
 .../MixTaxonomyReadPlatformServiceImpl.java        | 71 ----------------
 .../service/NamespaceReadPlatformServiceImpl.java  | 66 ---------------
 .../fineract/mix/starter/MixConfiguration.java     | 62 --------------
 .../src/main/resources/application.properties      |  8 ++
 .../module/fineract-provider/persistence.xml       |  3 -
 .../mix/report/MixXbrlBuilderStepDefinitions.java  | 16 ++--
 .../mix/report/MixXbrlTaxonomyStepDefinitions.java |  6 +-
 fineract-war/build.gradle                          |  1 +
 settings.gradle                                    |  1 +
 54 files changed, 642 insertions(+), 849 deletions(-)

diff --git a/build.gradle b/build.gradle
index aa541da18d..6df313b1a3 100644
--- a/build.gradle
+++ b/build.gradle
@@ -42,6 +42,7 @@ buildscript {
                 'fineract-loan',
                 'fineract-savings',
                 'fineract-report',
+                'fineract-mix',
                 'integration-tests',
                 'twofactor-tests',
                 'oauth2-tests',
diff --git 
a/fineract-core/src/main/java/org/apache/fineract/commands/service/CommandWrapperBuilder.java
 
b/fineract-core/src/main/java/org/apache/fineract/commands/service/CommandWrapperBuilder.java
index 61b339618b..dbdc9d83f4 100644
--- 
a/fineract-core/src/main/java/org/apache/fineract/commands/service/CommandWrapperBuilder.java
+++ 
b/fineract-core/src/main/java/org/apache/fineract/commands/service/CommandWrapperBuilder.java
@@ -426,13 +426,6 @@ public class CommandWrapperBuilder {
         return this;
     }
 
-    public CommandWrapperBuilder updateCurrencies() {
-        this.actionName = "UPDATE";
-        this.entityName = "CURRENCY";
-        this.href = "/currencies";
-        return this;
-    }
-
     public CommandWrapperBuilder createSms() {
         this.actionName = "CREATE";
         this.entityName = "SMS";
@@ -1862,55 +1855,6 @@ public class CommandWrapperBuilder {
         return this;
     }
 
-    public CommandWrapperBuilder createNote(final CommandWrapper 
resourceDetails, final String resourceType, final Long resourceId) {
-        this.actionName = "CREATE";
-        this.entityName = resourceDetails.entityName();// Note supports 
multiple
-                                                       // resources. Note
-                                                       // Permissions are set
-                                                       // for each resource.
-        this.clientId = resourceDetails.getClientId();
-        this.loanId = resourceDetails.getLoanId();
-        this.savingsId = resourceDetails.getSavingsId();
-        this.groupId = resourceDetails.getGroupId();
-        this.subentityId = resourceDetails.subresourceId();
-        this.href = "/" + resourceType + "/" + resourceId + "/notes/template";
-        return this;
-    }
-
-    public CommandWrapperBuilder updateNote(final CommandWrapper 
resourceDetails, final String resourceType, final Long resourceId,
-            final Long noteId) {
-        this.actionName = "UPDATE";
-        this.entityName = resourceDetails.entityName();// Note supports 
multiple
-                                                       // resources. Note
-                                                       // Permissions are set
-                                                       // for each resource.
-        this.entityId = noteId;
-        this.clientId = resourceDetails.getClientId();
-        this.loanId = resourceDetails.getLoanId();
-        this.savingsId = resourceDetails.getSavingsId();
-        this.groupId = resourceDetails.getGroupId();
-        this.subentityId = resourceDetails.subresourceId();
-        this.href = "/" + resourceType + "/" + resourceId + "/notes";
-        return this;
-    }
-
-    public CommandWrapperBuilder deleteNote(final CommandWrapper 
resourceDetails, final String resourceType, final Long resourceId,
-            final Long noteId) {
-        this.actionName = "DELETE";
-        this.entityName = resourceDetails.entityName();// Note supports 
multiple
-                                                       // resources. Note
-                                                       // Permissions are set
-                                                       // for each resource.
-        this.entityId = noteId;
-        this.clientId = resourceDetails.getClientId();
-        this.loanId = resourceDetails.getLoanId();
-        this.savingsId = resourceDetails.getSavingsId();
-        this.groupId = resourceDetails.getGroupId();
-        this.subentityId = resourceDetails.subresourceId();
-        this.href = "/" + resourceType + "/" + resourceId + "/calendars/" + 
noteId;
-        return this;
-    }
-
     public CommandWrapperBuilder createGroup() {
         this.actionName = "CREATE";
         this.entityName = "GROUP";
@@ -2193,14 +2137,6 @@ public class CommandWrapperBuilder {
         return this;
     }
 
-    public CommandWrapperBuilder updateTaxonomyMapping(final Long mappingId) {
-        this.actionName = "UPDATE";
-        this.entityName = "XBRLMAPPING";
-        this.entityId = mappingId;
-        this.href = "/xbrlmapping";
-        return this;
-    }
-
     public CommandWrapperBuilder createHoliday() {
         this.actionName = "CREATE";
         this.entityName = "HOLIDAY";
@@ -2387,13 +2323,6 @@ public class CommandWrapperBuilder {
         return this;
     }
 
-    public CommandWrapperBuilder updateCache() {
-        this.actionName = "UPDATE";
-        this.entityName = "CACHE";
-        this.href = "/cache";
-        return this;
-    }
-
     /**
      * Deposit account mappings
      */
@@ -3582,13 +3511,6 @@ public class CommandWrapperBuilder {
         return this;
     }
 
-    public CommandWrapperBuilder updateBusinessDate() {
-        this.actionName = "UPDATE";
-        this.entityName = "BUSINESS_DATE";
-        this.href = "/businessdate";
-        return this;
-    }
-
     public CommandWrapperBuilder createDelinquencyRange() {
         this.actionName = "CREATE";
         this.entityName = "DELINQUENCY_RANGE";
@@ -3651,13 +3573,6 @@ public class CommandWrapperBuilder {
         return this;
     }
 
-    public CommandWrapperBuilder updateExternalEventConfigurations() {
-        this.actionName = "UPDATE";
-        this.entityName = "EXTERNAL_EVENT_CONFIGURATION";
-        this.href = "/externaleventconfiguration";
-        return this;
-    }
-
     public CommandWrapperBuilder chargeOff(final Long loanId) {
         this.actionName = "CHARGEOFF";
         this.entityName = "LOAN";
diff --git a/fineract-mix/build.gradle b/fineract-mix/build.gradle
new file mode 100644
index 0000000000..bbde376699
--- /dev/null
+++ b/fineract-mix/build.gradle
@@ -0,0 +1,75 @@
+/**
+ * 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.
+ */
+description = 'Fineract Mix'
+
+apply plugin: 'java'
+apply plugin: 'eclipse'
+
+compileJava {
+    dependsOn ':fineract-avro-schemas:buildJavaSdk'
+}
+
+configurations {
+    providedRuntime // needed for Spring Boot executable WAR
+    providedCompile
+    compile() {
+        exclude module: 'hibernate-entitymanager'
+        exclude module: 'hibernate-validator'
+        exclude module: 'activation'
+        exclude module: 'bcmail-jdk14'
+        exclude module: 'bcprov-jdk14'
+        exclude module: 'bctsp-jdk14'
+        exclude module: 'c3p0'
+        exclude module: 'stax-api'
+        exclude module: 'jaxb-api'
+        exclude module: 'jaxb-impl'
+        exclude module: 'jboss-logging'
+        exclude module: 'itext-rtf'
+        exclude module: 'classworlds'
+    }
+    runtime
+}
+
+apply from: 'dependencies.gradle'
+
+// Configuration for the modernizer plugin
+// https://github.com/andygoossens/gradle-modernizer-plugin
+modernizer {
+    ignoreClassNamePatterns = [
+        '.*AbstractPersistableCustom',
+        '.*EntityTables',
+        '.*domain.*'
+    ]
+}
+
+// If we are running Gradle within Eclipse to enhance classes with OpenJPA,
+// set the classes directory to point to Eclipse's default build directory
+if (project.hasProperty('env') && project.getProperty('env') == 'eclipse') {
+    sourceSets.main.java.outputDir = new File(rootProject.projectDir, 
"fineract-core/bin/main")
+}
+
+if (!(project.hasProperty('env') && project.getProperty('env') == 'dev')) {
+    sourceSets {
+        test {
+            java {
+                exclude '**/core/boot/tests/**'
+            }
+        }
+    }
+}
diff --git a/fineract-mix/dependencies.gradle b/fineract-mix/dependencies.gradle
new file mode 100644
index 0000000000..cf82361669
--- /dev/null
+++ b/fineract-mix/dependencies.gradle
@@ -0,0 +1,70 @@
+/**
+ * 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.
+ */
+
+dependencies {
+    // Never use "compile" scope, but make all dependencies either 
'implementation', 'runtimeOnly' or 'testCompile'.
+    // Note that we never use 'api', because Fineract at least currently is a 
simple monolithic application ("WAR"), not a library.
+    // We also (normally should have) no need to ever use 'compileOnly'.
+
+    // implementation dependencies are directly used (compiled against) in 
src/main (and src/test)
+    //
+    implementation(
+            project(path: ':fineract-core'),
+            project(path: ':fineract-command'),
+            )
+
+    implementation(
+            'org.springframework.boot:spring-boot-starter-web',
+            'org.springframework.boot:spring-boot-starter-validation',
+            'org.springframework.boot:spring-boot-starter-security',
+            'org.springframework.boot:spring-boot-starter-data-jdbc',
+            'jakarta.ws.rs:jakarta.ws.rs-api',
+
+            'org.apache.commons:commons-lang3',
+
+            'com.google.guava:guava',
+            // TODO: try to get rid of this as soon as we get hands on the MIX 
XSD file from 2009; then we can use JAXB
+            'com.google.code.gson:gson',
+
+            'com.github.spotbugs:spotbugs-annotations',
+            'io.swagger.core.v3:swagger-annotations-jakarta',
+
+            'org.mapstruct:mapstruct',
+
+            'io.github.resilience4j:resilience4j-spring-boot3',
+            )
+    compileOnly 'org.projectlombok:lombok'
+    annotationProcessor 'org.projectlombok:lombok'
+    annotationProcessor 'org.mapstruct:mapstruct-processor'
+    implementation('org.dom4j:dom4j') {
+        exclude group: 'javax.xml.bind'
+    }
+    // testCompile dependencies are ONLY used in src/test, not src/main.
+    // Do NOT repeat dependencies which are ALREADY in implementation or 
runtimeOnly!
+    //
+    testImplementation( 'io.github.classgraph:classgraph' )
+    testImplementation ('org.springframework.boot:spring-boot-starter-test') {
+        exclude group: 'com.jayway.jsonpath', module: 'json-path'
+        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
+        exclude group: 'jakarta.activation'
+        exclude group: 'javax.activation'
+        exclude group: 'org.skyscreamer'
+    }
+    testImplementation ('org.mockito:mockito-inline')
+}
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/api/MixReportApiResource.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/api/MixReportApiResource.java
similarity index 78%
rename from 
fineract-provider/src/main/java/org/apache/fineract/mix/api/MixReportApiResource.java
rename to 
fineract-mix/src/main/java/org/apache/fineract/mix/api/MixReportApiResource.java
index bbdccc2b48..b381b58704 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/api/MixReportApiResource.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/api/MixReportApiResource.java
@@ -26,27 +26,28 @@ import jakarta.ws.rs.QueryParam;
 import jakarta.ws.rs.core.MediaType;
 import java.sql.Date;
 import lombok.RequiredArgsConstructor;
-import org.apache.fineract.mix.data.XBRLData;
-import org.apache.fineract.mix.service.XBRLBuilder;
-import org.apache.fineract.mix.service.XBRLResultService;
+import org.apache.fineract.mix.service.MixReportXBRLBuilder;
+import org.apache.fineract.mix.service.MixReportXBRLResultService;
 import org.springframework.stereotype.Component;
 
 @Path("/v1/mixreport")
 @Component
-@Tag(name = "Mix Report", description = "")
+@Tag(name = "Mix Report", description = """
+        """)
 @RequiredArgsConstructor
 public class MixReportApiResource {
 
-    private final XBRLResultService xbrlResultService;
-    private final XBRLBuilder xbrlBuilder;
+    private final MixReportXBRLResultService xbrlResultService;
+    private final MixReportXBRLBuilder xbrlBuilder;
 
     @GET
     @Produces({ MediaType.APPLICATION_XML })
     public String retrieveXBRLReport(@QueryParam("startDate") final Date 
startDate, @QueryParam("endDate") final Date endDate,
             @QueryParam("currency") final String currency) {
 
-        final XBRLData data = this.xbrlResultService.getXBRLResult(startDate, 
endDate, currency);
+        final var data = xbrlResultService.getXBRLResult(startDate, endDate, 
currency);
 
+        // TODO: make this type safe?
         return this.xbrlBuilder.build(data);
     }
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/api/MixTaxonomyApiResource.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/api/MixTaxonomyApiResource.java
similarity index 79%
rename from 
fineract-provider/src/main/java/org/apache/fineract/mix/api/MixTaxonomyApiResource.java
rename to 
fineract-mix/src/main/java/org/apache/fineract/mix/api/MixTaxonomyApiResource.java
index f53b317195..bb036cd8f5 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/api/MixTaxonomyApiResource.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/api/MixTaxonomyApiResource.java
@@ -26,9 +26,8 @@ import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.core.MediaType;
 import java.util.List;
 import lombok.RequiredArgsConstructor;
-import 
org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
 import org.apache.fineract.mix.data.MixTaxonomyData;
-import org.apache.fineract.mix.service.MixTaxonomyReadPlatformService;
+import org.apache.fineract.mix.service.MixTaxonomyReadService;
 import org.springframework.stereotype.Component;
 
 @Path("/v1/mixtaxonomy")
@@ -37,17 +36,12 @@ import org.springframework.stereotype.Component;
 @RequiredArgsConstructor
 public class MixTaxonomyApiResource {
 
-    private final PlatformSecurityContext context;
-    private final MixTaxonomyReadPlatformService readTaxonomyService;
+    private final MixTaxonomyReadService readTaxonomyService;
 
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
     public List<MixTaxonomyData> retrieveAll() {
-
-        // FIXME - KW - no check for permission to read mix taxonomy data.
-        this.context.authenticatedUser();
-
         return readTaxonomyService.retrieveAll();
     }
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/api/MixTaxonomyMappingApiResource.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/api/MixTaxonomyMappingApiResource.java
similarity index 53%
rename from 
fineract-provider/src/main/java/org/apache/fineract/mix/api/MixTaxonomyMappingApiResource.java
rename to 
fineract-mix/src/main/java/org/apache/fineract/mix/api/MixTaxonomyMappingApiResource.java
index 1b259780e6..7ad31ccbad 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/api/MixTaxonomyMappingApiResource.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/api/MixTaxonomyMappingApiResource.java
@@ -25,16 +25,14 @@ import jakarta.ws.rs.PUT;
 import jakarta.ws.rs.Path;
 import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.core.MediaType;
+import java.util.function.Supplier;
 import lombok.RequiredArgsConstructor;
-import org.apache.fineract.commands.domain.CommandWrapper;
-import org.apache.fineract.commands.service.CommandWrapperBuilder;
-import 
org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
-import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
-import 
org.apache.fineract.infrastructure.core.serialization.ToApiJsonSerializer;
-import 
org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
+import org.apache.fineract.command.core.CommandPipeline;
+import org.apache.fineract.mix.command.MixTaxonomyMappingUpdateCommand;
 import org.apache.fineract.mix.data.MixTaxonomyMappingData;
-import org.apache.fineract.mix.data.MixTaxonomyRequest;
-import org.apache.fineract.mix.service.MixTaxonomyMappingReadPlatformService;
+import org.apache.fineract.mix.data.MixTaxonomyMappingUpdateRequest;
+import org.apache.fineract.mix.data.MixTaxonomyMappingUpdateResponse;
+import org.apache.fineract.mix.service.MixTaxonomyMappingReadService;
 import org.springframework.stereotype.Component;
 
 @Path("/v1/mixmapping")
@@ -43,31 +41,31 @@ import org.springframework.stereotype.Component;
 @RequiredArgsConstructor
 public class MixTaxonomyMappingApiResource {
 
-    private final PlatformSecurityContext context;
-    private final ToApiJsonSerializer<MixTaxonomyMappingData> 
toApiJsonSerializer;
-    private final MixTaxonomyMappingReadPlatformService 
readTaxonomyMappingService;
-    private final PortfolioCommandSourceWritePlatformService 
commandsSourceWritePlatformService;
+    private final MixTaxonomyMappingReadService readTaxonomyMappingService;
+    private final CommandPipeline commandPipeline;
 
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
     public MixTaxonomyMappingData retrieveTaxonomyMapping() {
-        this.context.authenticatedUser();
         return this.readTaxonomyMappingService.retrieveTaxonomyMapping();
     }
 
     @PUT
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String updateTaxonomyMapping(final MixTaxonomyRequest 
mixTaxonomyRequest) {
-        // TODO support multiple configuration file loading
-        final Long mappingId = (long) 1;
-        final CommandWrapper commandRequest = new 
CommandWrapperBuilder().updateTaxonomyMapping(mappingId)
-                
.withJson(toApiJsonSerializer.serialize(mixTaxonomyRequest)).build();
+    public MixTaxonomyMappingUpdateResponse updateTaxonomyMapping(final 
MixTaxonomyMappingUpdateRequest request) {
+        // TODO support multiple configuration file loading; this is the 
legacy behavior
+        if (request.getId() == null) {
+            request.setId(1L);
+        }
 
-        final CommandProcessingResult result = 
this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
+        final var command = new MixTaxonomyMappingUpdateCommand();
 
-        return this.toApiJsonSerializer.serialize(result);
-    }
+        command.setPayload(request);
+
+        final Supplier<MixTaxonomyMappingUpdateResponse> response = 
commandPipeline.send(command);
 
+        return response.get();
+    }
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/data/NamespaceData.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/command/MixTaxonomyMappingUpdateCommand.java
similarity index 71%
copy from 
fineract-provider/src/main/java/org/apache/fineract/mix/data/NamespaceData.java
copy to 
fineract-mix/src/main/java/org/apache/fineract/mix/command/MixTaxonomyMappingUpdateCommand.java
index 954301a560..fa59fe6a50 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/data/NamespaceData.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/command/MixTaxonomyMappingUpdateCommand.java
@@ -16,20 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.mix.data;
+package org.apache.fineract.mix.command;
 
 import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
+import lombok.EqualsAndHashCode;
+import org.apache.fineract.command.core.Command;
+import org.apache.fineract.mix.data.MixTaxonomyMappingUpdateRequest;
 
 @Data
-@NoArgsConstructor
-@Accessors(chain = true)
-public class NamespaceData {
-
-    @SuppressWarnings("unused")
-    private Long id;
-    @SuppressWarnings("unused")
-    private String prefix;
-    private String url;
-}
+@EqualsAndHashCode(callSuper = true)
+public class MixTaxonomyMappingUpdateCommand extends 
Command<MixTaxonomyMappingUpdateRequest> {}
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/data/MixTaxonomyRequest.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/data/MixReportXBRLContextData.java
similarity index 81%
copy from 
fineract-provider/src/main/java/org/apache/fineract/mix/data/MixTaxonomyRequest.java
copy to 
fineract-mix/src/main/java/org/apache/fineract/mix/data/MixReportXBRLContextData.java
index 4a37e7262d..d70d6abe5f 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/data/MixTaxonomyRequest.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/data/MixReportXBRLContextData.java
@@ -21,17 +21,22 @@ package org.apache.fineract.mix.data;
 import java.io.Serial;
 import java.io.Serializable;
 import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
 
+@Builder
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class MixTaxonomyRequest implements Serializable {
+@Accessors(chain = true)
+public class MixReportXBRLContextData implements Serializable {
 
     @Serial
     private static final long serialVersionUID = 1L;
 
-    private String identifier;
-    private String config;
+    private String dimensionType;
+    private String dimension;
+    private Integer periodType;
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/data/XBRLData.java 
b/fineract-mix/src/main/java/org/apache/fineract/mix/data/MixReportXBRLData.java
similarity index 76%
rename from 
fineract-provider/src/main/java/org/apache/fineract/mix/data/XBRLData.java
rename to 
fineract-mix/src/main/java/org/apache/fineract/mix/data/MixReportXBRLData.java
index f53c1785c7..a6f60929ac 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/mix/data/XBRLData.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/data/MixReportXBRLData.java
@@ -18,19 +18,28 @@
  */
 package org.apache.fineract.mix.data;
 
+import java.io.Serial;
+import java.io.Serializable;
 import java.math.BigDecimal;
 import java.sql.Date;
-import java.util.HashMap;
+import java.util.Map;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
 
+@Builder
 @Data
 @NoArgsConstructor
+@AllArgsConstructor
 @Accessors(chain = true)
-public class XBRLData {
+public class MixReportXBRLData implements Serializable {
 
-    private HashMap<MixTaxonomyData, BigDecimal> resultMap;
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Map<MixTaxonomyData, BigDecimal> resultMap;
     private Date startDate;
     private Date endDate;
     private String currency;
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/data/NamespaceData.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/data/MixReportXBRLNamespaceData.java
similarity index 79%
copy from 
fineract-provider/src/main/java/org/apache/fineract/mix/data/NamespaceData.java
copy to 
fineract-mix/src/main/java/org/apache/fineract/mix/data/MixReportXBRLNamespaceData.java
index 954301a560..6e256bc663 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/data/NamespaceData.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/data/MixReportXBRLNamespaceData.java
@@ -18,18 +18,25 @@
  */
 package org.apache.fineract.mix.data;
 
+import java.io.Serial;
+import java.io.Serializable;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
 
+@Builder
 @Data
 @NoArgsConstructor
+@AllArgsConstructor
 @Accessors(chain = true)
-public class NamespaceData {
+public class MixReportXBRLNamespaceData implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
 
-    @SuppressWarnings("unused")
     private Long id;
-    @SuppressWarnings("unused")
     private String prefix;
     private String url;
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/data/MixTaxonomyData.java
 b/fineract-mix/src/main/java/org/apache/fineract/mix/data/MixTaxonomyData.java
similarity index 78%
copy from 
fineract-provider/src/main/java/org/apache/fineract/mix/data/MixTaxonomyData.java
copy to 
fineract-mix/src/main/java/org/apache/fineract/mix/data/MixTaxonomyData.java
index 57fc937da4..857df912a3 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/data/MixTaxonomyData.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/data/MixTaxonomyData.java
@@ -19,29 +19,37 @@
 package org.apache.fineract.mix.data;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
+import java.io.Serial;
+import java.io.Serializable;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
 
+@Builder
 @Data
 @NoArgsConstructor
+@AllArgsConstructor
 @Accessors(chain = true)
-public class MixTaxonomyData {
+public class MixTaxonomyData implements Serializable {
 
     public static final Integer PORTFOLIO = 0;
-    public static final Integer BALANCESHEET = 1;
+    public static final Integer BALANCE_SHEET = 1;
     public static final Integer INCOME = 2;
     public static final Integer EXPENSE = 3;
 
-    @SuppressWarnings("unused")
+    @Serial
+    private static final long serialVersionUID = 1L;
+
     private Long id;
     private String name;
     private String namespace;
     private String dimension;
     private Integer type;
-    @SuppressWarnings("unused")
     private String description;
 
+    // TODO: why is this different from the PORTFOLIO constant? This doesn't 
seem right!
     @JsonIgnore
     public boolean isPortfolio() {
         return this.type == 5;
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/data/MixTaxonomyMappingData.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/data/MixTaxonomyMappingData.java
similarity index 90%
rename from 
fineract-provider/src/main/java/org/apache/fineract/mix/data/MixTaxonomyMappingData.java
rename to 
fineract-mix/src/main/java/org/apache/fineract/mix/data/MixTaxonomyMappingData.java
index 7d52bba70b..26e71b3a58 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/data/MixTaxonomyMappingData.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/data/MixTaxonomyMappingData.java
@@ -18,17 +18,20 @@
  */
 package org.apache.fineract.mix.data;
 
-import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
 
+@Builder
 @Data
 @NoArgsConstructor
+@AllArgsConstructor
 @Accessors(chain = true)
-@JsonInclude(JsonInclude.Include.NON_NULL)
 public class MixTaxonomyMappingData {
 
     private String identifier;
     private String config;
+    private String currency;
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/data/MixTaxonomyRequest.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/data/MixTaxonomyMappingUpdateRequest.java
similarity index 88%
copy from 
fineract-provider/src/main/java/org/apache/fineract/mix/data/MixTaxonomyRequest.java
copy to 
fineract-mix/src/main/java/org/apache/fineract/mix/data/MixTaxonomyMappingUpdateRequest.java
index 4a37e7262d..eeea823cd5 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/data/MixTaxonomyRequest.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/data/MixTaxonomyMappingUpdateRequest.java
@@ -21,17 +21,21 @@ package org.apache.fineract.mix.data;
 import java.io.Serial;
 import java.io.Serializable;
 import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+@Builder
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class MixTaxonomyRequest implements Serializable {
+public class MixTaxonomyMappingUpdateRequest implements Serializable {
 
     @Serial
     private static final long serialVersionUID = 1L;
 
+    private Long id;
     private String identifier;
     private String config;
+    private String currency;
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/data/MixTaxonomyRequest.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/data/MixTaxonomyMappingUpdateResponse.java
similarity index 89%
copy from 
fineract-provider/src/main/java/org/apache/fineract/mix/data/MixTaxonomyRequest.java
copy to 
fineract-mix/src/main/java/org/apache/fineract/mix/data/MixTaxonomyMappingUpdateResponse.java
index 4a37e7262d..059f15bee4 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/data/MixTaxonomyRequest.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/data/MixTaxonomyMappingUpdateResponse.java
@@ -21,17 +21,18 @@ package org.apache.fineract.mix.data;
 import java.io.Serial;
 import java.io.Serializable;
 import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+@Builder
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class MixTaxonomyRequest implements Serializable {
+public class MixTaxonomyMappingUpdateResponse implements Serializable {
 
     @Serial
     private static final long serialVersionUID = 1L;
 
-    private String identifier;
-    private String config;
+    private Long entityId;
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/data/NamespaceData.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/domain/MixReportXBRLNamespace.java
similarity index 64%
copy from 
fineract-provider/src/main/java/org/apache/fineract/mix/data/NamespaceData.java
copy to 
fineract-mix/src/main/java/org/apache/fineract/mix/domain/MixReportXBRLNamespace.java
index 954301a560..d73813aeb3 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/data/NamespaceData.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/domain/MixReportXBRLNamespace.java
@@ -16,20 +16,33 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.mix.data;
+package org.apache.fineract.mix.domain;
 
-import lombok.Data;
+import java.io.Serial;
+import java.io.Serializable;
+import lombok.Getter;
 import lombok.NoArgsConstructor;
+import lombok.Setter;
 import lombok.experimental.Accessors;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.relational.core.mapping.Column;
+import org.springframework.data.relational.core.mapping.Table;
 
-@Data
+@Table("mix_xbrl_namespace")
+@Getter
+@Setter
 @NoArgsConstructor
 @Accessors(chain = true)
-public class NamespaceData {
+public class MixReportXBRLNamespace implements Serializable {
 
-    @SuppressWarnings("unused")
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column("id")
     private Long id;
-    @SuppressWarnings("unused")
+    @Column("prefix")
     private String prefix;
+    @Column("url")
     private String url;
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/domain/MixTaxonomyMappingRepository.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/domain/MixReportXBRLNamespaceRepository.java
similarity index 68%
copy from 
fineract-provider/src/main/java/org/apache/fineract/mix/domain/MixTaxonomyMappingRepository.java
copy to 
fineract-mix/src/main/java/org/apache/fineract/mix/domain/MixReportXBRLNamespaceRepository.java
index 44df787b4a..a8806fa046 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/domain/MixTaxonomyMappingRepository.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/domain/MixReportXBRLNamespaceRepository.java
@@ -18,10 +18,12 @@
  */
 package org.apache.fineract.mix.domain;
 
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import java.util.Optional;
+import org.springframework.data.repository.ListCrudRepository;
+import org.springframework.data.repository.query.QueryByExampleExecutor;
 
-public interface MixTaxonomyMappingRepository
-        extends JpaRepository<MixTaxonomyMapping, Long>, 
JpaSpecificationExecutor<MixTaxonomyMapping> {
+public interface MixReportXBRLNamespaceRepository
+        extends ListCrudRepository<MixReportXBRLNamespace, Long>, 
QueryByExampleExecutor<MixReportXBRLNamespace> {
 
+    Optional<MixReportXBRLNamespace> findOneByPrefix(String prefix);
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/data/MixTaxonomyData.java
 b/fineract-mix/src/main/java/org/apache/fineract/mix/domain/MixTaxonomy.java
similarity index 56%
rename from 
fineract-provider/src/main/java/org/apache/fineract/mix/data/MixTaxonomyData.java
rename to 
fineract-mix/src/main/java/org/apache/fineract/mix/domain/MixTaxonomy.java
index 57fc937da4..79b3462a3f 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/data/MixTaxonomyData.java
+++ b/fineract-mix/src/main/java/org/apache/fineract/mix/domain/MixTaxonomy.java
@@ -16,34 +16,48 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.mix.data;
+package org.apache.fineract.mix.domain;
 
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import lombok.Data;
+import java.io.Serial;
+import java.io.Serializable;
+import lombok.Getter;
 import lombok.NoArgsConstructor;
+import lombok.Setter;
 import lombok.experimental.Accessors;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.relational.core.mapping.Column;
+import org.springframework.data.relational.core.mapping.Table;
 
-@Data
+@Table("mix_taxonomy")
+@Getter
+@Setter
 @NoArgsConstructor
 @Accessors(chain = true)
-public class MixTaxonomyData {
+public final class MixTaxonomy implements Serializable {
 
-    public static final Integer PORTFOLIO = 0;
-    public static final Integer BALANCESHEET = 1;
-    public static final Integer INCOME = 2;
-    public static final Integer EXPENSE = 3;
+    @Serial
+    private static final long serialVersionUID = 1L;
 
-    @SuppressWarnings("unused")
+    @Id
+    @Column("id")
     private Long id;
+
+    @Column("name")
     private String name;
-    private String namespace;
+
+    @Column("namespace_id")
+    private Long namespaceId;
+
+    @Column("dimension")
     private String dimension;
+
+    @Column("type")
     private Integer type;
-    @SuppressWarnings("unused")
+
+    @Column("description")
     private String description;
 
-    @JsonIgnore
-    public boolean isPortfolio() {
-        return this.type == 5;
-    }
+    // TODO: this is never used, but creates an error on MySQL (tinyint vs 
boolean mapping)
+    // @Column("need_mapping")
+    // private Boolean needMapping;
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/data/MixTaxonomyRequest.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/domain/MixTaxonomyMapping.java
similarity index 63%
rename from 
fineract-provider/src/main/java/org/apache/fineract/mix/data/MixTaxonomyRequest.java
rename to 
fineract-mix/src/main/java/org/apache/fineract/mix/domain/MixTaxonomyMapping.java
index 4a37e7262d..30e4abc7cf 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/data/MixTaxonomyRequest.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/domain/MixTaxonomyMapping.java
@@ -16,22 +16,38 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.mix.data;
+package org.apache.fineract.mix.domain;
 
 import java.io.Serial;
 import java.io.Serializable;
-import lombok.AllArgsConstructor;
-import lombok.Data;
+import lombok.Getter;
 import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.relational.core.mapping.Column;
+import org.springframework.data.relational.core.mapping.Table;
 
-@Data
+@Table("mix_taxonomy_mapping")
+@Getter
+@Setter
 @NoArgsConstructor
-@AllArgsConstructor
-public class MixTaxonomyRequest implements Serializable {
+@Accessors(chain = true)
+public final class MixTaxonomyMapping implements Serializable {
 
     @Serial
     private static final long serialVersionUID = 1L;
 
+    @Id
+    @Column("id")
+    private Long id;
+
+    @Column("identifier")
     private String identifier;
+
+    @Column("config")
     private String config;
+
+    @Column("currency")
+    private String currency;
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/domain/MixTaxonomyMappingRepository.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/domain/MixTaxonomyMappingRepository.java
similarity index 79%
copy from 
fineract-provider/src/main/java/org/apache/fineract/mix/domain/MixTaxonomyMappingRepository.java
copy to 
fineract-mix/src/main/java/org/apache/fineract/mix/domain/MixTaxonomyMappingRepository.java
index 44df787b4a..35baecaab2 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/domain/MixTaxonomyMappingRepository.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/domain/MixTaxonomyMappingRepository.java
@@ -18,10 +18,8 @@
  */
 package org.apache.fineract.mix.domain;
 
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.repository.ListCrudRepository;
+import org.springframework.data.repository.query.QueryByExampleExecutor;
 
 public interface MixTaxonomyMappingRepository
-        extends JpaRepository<MixTaxonomyMapping, Long>, 
JpaSpecificationExecutor<MixTaxonomyMapping> {
-
-}
+        extends ListCrudRepository<MixTaxonomyMapping, Long>, 
QueryByExampleExecutor<MixTaxonomyMapping> {}
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/domain/MixTaxonomyMappingRepository.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/domain/MixTaxonomyRepository.java
similarity index 72%
rename from 
fineract-provider/src/main/java/org/apache/fineract/mix/domain/MixTaxonomyMappingRepository.java
rename to 
fineract-mix/src/main/java/org/apache/fineract/mix/domain/MixTaxonomyRepository.java
index 44df787b4a..8b1fa29ad0 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/domain/MixTaxonomyMappingRepository.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/domain/MixTaxonomyRepository.java
@@ -18,10 +18,11 @@
  */
 package org.apache.fineract.mix.domain;
 
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import java.util.List;
+import org.springframework.data.repository.ListCrudRepository;
+import org.springframework.data.repository.query.QueryByExampleExecutor;
 
-public interface MixTaxonomyMappingRepository
-        extends JpaRepository<MixTaxonomyMapping, Long>, 
JpaSpecificationExecutor<MixTaxonomyMapping> {
+public interface MixTaxonomyRepository extends ListCrudRepository<MixTaxonomy, 
Long>, QueryByExampleExecutor<MixTaxonomy> {
 
+    List<MixTaxonomy> findAllByOrderByIdAsc();
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/exception/XBRLMappingInvalidException.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/exception/MixReportXBRLMappingInvalidException.java
similarity index 86%
rename from 
fineract-provider/src/main/java/org/apache/fineract/mix/exception/XBRLMappingInvalidException.java
rename to 
fineract-mix/src/main/java/org/apache/fineract/mix/exception/MixReportXBRLMappingInvalidException.java
index 45390617db..cf78409424 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/exception/XBRLMappingInvalidException.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/exception/MixReportXBRLMappingInvalidException.java
@@ -20,9 +20,9 @@ package org.apache.fineract.mix.exception;
 
 import 
org.apache.fineract.infrastructure.core.exception.AbstractPlatformDomainRuleException;
 
-public class XBRLMappingInvalidException extends 
AbstractPlatformDomainRuleException {
+public class MixReportXBRLMappingInvalidException extends 
AbstractPlatformDomainRuleException {
 
-    public XBRLMappingInvalidException(final String msg) {
+    public MixReportXBRLMappingInvalidException(final String msg) {
         super("error.msg.xbrl.report.mapping.invalid.id", "Mapping does not 
exist", msg);
     }
 
diff --git 
a/fineract-mix/src/main/java/org/apache/fineract/mix/handler/MixTaxonomyMappingUpdateCommandHandler.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/handler/MixTaxonomyMappingUpdateCommandHandler.java
new file mode 100644
index 0000000000..af59efdd71
--- /dev/null
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/handler/MixTaxonomyMappingUpdateCommandHandler.java
@@ -0,0 +1,51 @@
+/**
+ * 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.mix.handler;
+
+import io.github.resilience4j.retry.annotation.Retry;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.fineract.command.core.Command;
+import org.apache.fineract.command.core.CommandHandler;
+import org.apache.fineract.mix.data.MixTaxonomyMappingUpdateRequest;
+import org.apache.fineract.mix.data.MixTaxonomyMappingUpdateResponse;
+import org.apache.fineract.mix.service.MixTaxonomyMappingWriteService;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class MixTaxonomyMappingUpdateCommandHandler
+        implements CommandHandler<MixTaxonomyMappingUpdateRequest, 
MixTaxonomyMappingUpdateResponse> {
+
+    private final MixTaxonomyMappingWriteService writeTaxonomyService;
+
+    @Retry(name = "commandMixTaxonomyMappingUpdate", fallbackMethod = 
"fallback")
+    @Transactional
+    @Override
+    public MixTaxonomyMappingUpdateResponse 
handle(Command<MixTaxonomyMappingUpdateRequest> command) {
+        return writeTaxonomyService.updateMapping(command.getPayload());
+    }
+
+    @Override
+    public MixTaxonomyMappingUpdateResponse 
fallback(Command<MixTaxonomyMappingUpdateRequest> command, Throwable t) {
+        return CommandHandler.super.fallback(command, t);
+    }
+}
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/data/NamespaceData.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/mapping/MixReportXBRLNamespaceMapper.java
similarity index 65%
copy from 
fineract-provider/src/main/java/org/apache/fineract/mix/data/NamespaceData.java
copy to 
fineract-mix/src/main/java/org/apache/fineract/mix/mapping/MixReportXBRLNamespaceMapper.java
index 954301a560..bbd88503e7 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/data/NamespaceData.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/mapping/MixReportXBRLNamespaceMapper.java
@@ -16,20 +16,15 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.mix.data;
+package org.apache.fineract.mix.mapping;
 
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
+import org.apache.fineract.infrastructure.core.config.MapstructMapperConfig;
+import org.apache.fineract.mix.data.MixReportXBRLNamespaceData;
+import org.apache.fineract.mix.domain.MixReportXBRLNamespace;
+import org.mapstruct.Mapper;
 
-@Data
-@NoArgsConstructor
-@Accessors(chain = true)
-public class NamespaceData {
+@Mapper(config = MapstructMapperConfig.class)
+public interface MixReportXBRLNamespaceMapper {
 
-    @SuppressWarnings("unused")
-    private Long id;
-    @SuppressWarnings("unused")
-    private String prefix;
-    private String url;
+    MixReportXBRLNamespaceData map(MixReportXBRLNamespace source);
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyReadPlatformService.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/mapping/MixTaxonomyMapper.java
similarity index 67%
copy from 
fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyReadPlatformService.java
copy to 
fineract-mix/src/main/java/org/apache/fineract/mix/mapping/MixTaxonomyMapper.java
index dd4525e57e..ad23c6dd93 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyReadPlatformService.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/mapping/MixTaxonomyMapper.java
@@ -16,14 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.mix.service;
+package org.apache.fineract.mix.mapping;
 
-import java.util.List;
+import org.apache.fineract.infrastructure.core.config.MapstructMapperConfig;
 import org.apache.fineract.mix.data.MixTaxonomyData;
+import org.apache.fineract.mix.domain.MixTaxonomy;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
 
-public interface MixTaxonomyReadPlatformService {
+@Mapper(config = MapstructMapperConfig.class)
+public interface MixTaxonomyMapper {
 
-    List<MixTaxonomyData> retrieveAll();
-
-    MixTaxonomyData retrieveOne(Long id);
+    @Mapping(ignore = true, target = "namespace")
+    MixTaxonomyData map(MixTaxonomy source);
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingReadPlatformService.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/mapping/MixTaxonomyMappingMapper.java
similarity index 71%
copy from 
fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingReadPlatformService.java
copy to 
fineract-mix/src/main/java/org/apache/fineract/mix/mapping/MixTaxonomyMappingMapper.java
index 38bbf8f5b1..ac61c5eb49 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingReadPlatformService.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/mapping/MixTaxonomyMappingMapper.java
@@ -16,11 +16,15 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.mix.service;
+package org.apache.fineract.mix.mapping;
 
+import org.apache.fineract.infrastructure.core.config.MapstructMapperConfig;
 import org.apache.fineract.mix.data.MixTaxonomyMappingData;
+import org.apache.fineract.mix.domain.MixTaxonomyMapping;
+import org.mapstruct.Mapper;
 
-public interface MixTaxonomyMappingReadPlatformService {
+@Mapper(config = MapstructMapperConfig.class)
+public interface MixTaxonomyMappingMapper {
 
-    MixTaxonomyMappingData retrieveTaxonomyMapping();
+    MixTaxonomyMappingData map(MixTaxonomyMapping source);
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/data/NamespaceData.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/mapping/MixTaxonomyMappingUpdateRequestMapper.java
similarity index 64%
rename from 
fineract-provider/src/main/java/org/apache/fineract/mix/data/NamespaceData.java
rename to 
fineract-mix/src/main/java/org/apache/fineract/mix/mapping/MixTaxonomyMappingUpdateRequestMapper.java
index 954301a560..a985c30a62 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/data/NamespaceData.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/mapping/MixTaxonomyMappingUpdateRequestMapper.java
@@ -16,20 +16,15 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.mix.data;
+package org.apache.fineract.mix.mapping;
 
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
+import org.apache.fineract.infrastructure.core.config.MapstructMapperConfig;
+import org.apache.fineract.mix.data.MixTaxonomyMappingUpdateRequest;
+import org.apache.fineract.mix.domain.MixTaxonomyMapping;
+import org.mapstruct.Mapper;
 
-@Data
-@NoArgsConstructor
-@Accessors(chain = true)
-public class NamespaceData {
+@Mapper(config = MapstructMapperConfig.class)
+public interface MixTaxonomyMappingUpdateRequestMapper {
 
-    @SuppressWarnings("unused")
-    private Long id;
-    @SuppressWarnings("unused")
-    private String prefix;
-    private String url;
+    MixTaxonomyMapping map(MixTaxonomyMappingUpdateRequest source);
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/XBRLBuilder.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/service/MixReportXBRLBuilder.java
similarity index 80%
rename from 
fineract-provider/src/main/java/org/apache/fineract/mix/service/XBRLBuilder.java
rename to 
fineract-mix/src/main/java/org/apache/fineract/mix/service/MixReportXBRLBuilder.java
index 6af912acbc..1d97f3210a 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/XBRLBuilder.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/service/MixReportXBRLBuilder.java
@@ -25,36 +25,40 @@ import java.text.SimpleDateFormat;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.fineract.mix.data.ContextData;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.fineract.mix.data.MixReportXBRLContextData;
+import org.apache.fineract.mix.data.MixReportXBRLData;
+import org.apache.fineract.mix.data.MixReportXBRLNamespaceData;
 import org.apache.fineract.mix.data.MixTaxonomyData;
-import org.apache.fineract.mix.data.NamespaceData;
-import org.apache.fineract.mix.data.XBRLData;
-import org.apache.fineract.mix.exception.XBRLMappingInvalidException;
+import org.apache.fineract.mix.exception.MixReportXBRLMappingInvalidException;
 import org.dom4j.Document;
 import org.dom4j.DocumentHelper;
 import org.dom4j.Element;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+@Slf4j
+@RequiredArgsConstructor
 @Component
-public class XBRLBuilder {
+public class MixReportXBRLBuilder {
 
+    // NOTE: see 
https://www.xbrl.org/taxonomyrecognition/mx_2009-06-19_summary-page.htm
     private static final String SCHEME_URL = "http://www.themix.org";;
     private static final String IDENTIFIER = "000000";
     private static final String UNITID_PURE = "Unit1";
     private static final String UNITID_CUR = "Unit2";
 
-    @Autowired
-    private NamespaceReadPlatformService readNamespaceService;
+    private final MixReportXBRLNamespaceReadService readNamespaceService;
 
-    public String build(final XBRLData xbrlData) {
+    // TODO: we should do this with JAXB
+    public String build(final MixReportXBRLData xbrlData) {
         return this.build(xbrlData.getResultMap(), xbrlData.getStartDate(), 
xbrlData.getEndDate(), xbrlData.getCurrency());
     }
 
     public String build(final Map<MixTaxonomyData, BigDecimal> map, final Date 
startDate, final Date endDate, final String currency) {
         Integer instantScenarioCounter = 0;
         Integer durationScenarioCounter = 0;
-        Map<ContextData, String> contextMap = new HashMap<>();
+        Map<MixReportXBRLContextData, String> contextMap = new HashMap<>();
         final Document doc = DocumentHelper.createDocument();
         Element root = doc.addElement("xbrl");
 
@@ -79,17 +83,17 @@ public class XBRLBuilder {
 
     private Element addTaxonomy(final Element rootElement, final 
MixTaxonomyData taxonomy, final BigDecimal value, final Date startDate,
             final Date endDate, Integer instantScenarioCounter, Integer 
durationScenarioCounter,
-            final Map<ContextData, String> contextMap) {
+            final Map<MixReportXBRLContextData, String> contextMap) {
 
         // throw an error is start / endate is null
         if (startDate == null || endDate == null) {
-            throw new XBRLMappingInvalidException("start date and end date 
should not be null");
+            throw new MixReportXBRLMappingInvalidException("start date and end 
date should not be null");
         }
 
         final String prefix = taxonomy.getNamespace();
         String qname = taxonomy.getName();
         if (prefix != null && !prefix.isEmpty()) {
-            final NamespaceData ns = 
this.readNamespaceService.retrieveNamespaceByPrefix(prefix);
+            final MixReportXBRLNamespaceData ns = 
this.readNamespaceService.retrieveNamespaceByPrefix(prefix);
             if (ns != null) {
 
                 rootElement.addNamespace(prefix, ns.getUrl());
@@ -102,20 +106,20 @@ public class XBRLBuilder {
         final String dimension = taxonomy.getDimension();
         final SimpleDateFormat timeFormat = new SimpleDateFormat("MM_dd_yyyy");
 
-        ContextData context = null;
+        MixReportXBRLContextData context = null;
         if (dimension != null) {
             final List<String> dims = Splitter.on(':').splitToList(dimension);
 
             if (dims.size() == 2) {
-                context = new 
ContextData().setDimensionType(dims.get(0)).setDimension(dims.get(1)).setPeriodType(
-                        
taxonomy.getType().equals(MixTaxonomyData.BALANCESHEET) || 
taxonomy.getType().equals(MixTaxonomyData.PORTFOLIO) ? 0
+                context = new 
MixReportXBRLContextData().setDimensionType(dims.get(0)).setDimension(dims.get(1)).setPeriodType(
+                        
taxonomy.getType().equals(MixTaxonomyData.BALANCE_SHEET) || 
taxonomy.getType().equals(MixTaxonomyData.PORTFOLIO) ? 0
                                 : 1);
             }
         }
 
         if (context == null) {
-            context = new ContextData().setPeriodType(
-                    taxonomy.getType().equals(MixTaxonomyData.BALANCESHEET) || 
taxonomy.getType().equals(MixTaxonomyData.PORTFOLIO) ? 0
+            context = new MixReportXBRLContextData().setPeriodType(
+                    taxonomy.getType().equals(MixTaxonomyData.BALANCE_SHEET) 
|| taxonomy.getType().equals(MixTaxonomyData.PORTFOLIO) ? 0
                             : 1);
         }
 
@@ -169,10 +173,11 @@ public class XBRLBuilder {
 
     }
 
-    private void addContexts(final Element root, final Date startDate, final 
Date endDate, final Map<ContextData, String> contextMap) {
+    private void addContexts(final Element root, final Date startDate, final 
Date endDate,
+            final Map<MixReportXBRLContextData, String> contextMap) {
         final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
-        for (final Map.Entry<ContextData, String> entry : 
contextMap.entrySet()) {
-            final ContextData context = entry.getKey();
+        for (final Map.Entry<MixReportXBRLContextData, String> entry : 
contextMap.entrySet()) {
+            final MixReportXBRLContextData context = entry.getKey();
             final Element contextElement = root.addElement("context");
             contextElement.addAttribute("id", entry.getValue());
             
contextElement.addElement("entity").addElement("identifier").addAttribute("scheme",
 SCHEME_URL).addText(IDENTIFIER);
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/NamespaceReadPlatformService.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/service/MixReportXBRLNamespaceReadService.java
similarity index 80%
rename from 
fineract-provider/src/main/java/org/apache/fineract/mix/service/NamespaceReadPlatformService.java
rename to 
fineract-mix/src/main/java/org/apache/fineract/mix/service/MixReportXBRLNamespaceReadService.java
index aa5175406e..8296fc6c16 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/NamespaceReadPlatformService.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/service/MixReportXBRLNamespaceReadService.java
@@ -18,11 +18,9 @@
  */
 package org.apache.fineract.mix.service;
 
-import org.apache.fineract.mix.data.NamespaceData;
+import org.apache.fineract.mix.data.MixReportXBRLNamespaceData;
 
-public interface NamespaceReadPlatformService {
+public interface MixReportXBRLNamespaceReadService {
 
-    NamespaceData retrieveNamespaceById(Long id);
-
-    NamespaceData retrieveNamespaceByPrefix(String prefix);
+    MixReportXBRLNamespaceData retrieveNamespaceByPrefix(String prefix);
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyReadPlatformService.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/service/MixReportXBRLNamespaceReadServiceImpl.java
similarity index 52%
copy from 
fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyReadPlatformService.java
copy to 
fineract-mix/src/main/java/org/apache/fineract/mix/service/MixReportXBRLNamespaceReadServiceImpl.java
index dd4525e57e..7a4c1f998e 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyReadPlatformService.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/service/MixReportXBRLNamespaceReadServiceImpl.java
@@ -18,12 +18,23 @@
  */
 package org.apache.fineract.mix.service;
 
-import java.util.List;
-import org.apache.fineract.mix.data.MixTaxonomyData;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.fineract.mix.data.MixReportXBRLNamespaceData;
+import org.apache.fineract.mix.domain.MixReportXBRLNamespaceRepository;
+import org.apache.fineract.mix.mapping.MixReportXBRLNamespaceMapper;
+import org.springframework.stereotype.Service;
 
-public interface MixTaxonomyReadPlatformService {
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class MixReportXBRLNamespaceReadServiceImpl implements 
MixReportXBRLNamespaceReadService {
 
-    List<MixTaxonomyData> retrieveAll();
+    private final MixReportXBRLNamespaceRepository repository;
+    private final MixReportXBRLNamespaceMapper mapper;
 
-    MixTaxonomyData retrieveOne(Long id);
+    @Override
+    public MixReportXBRLNamespaceData retrieveNamespaceByPrefix(final String 
prefix) {
+        return 
repository.findOneByPrefix(prefix).map(mapper::map).orElse(null);
+    }
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/XBRLResultService.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/service/MixReportXBRLResultService.java
similarity index 82%
rename from 
fineract-provider/src/main/java/org/apache/fineract/mix/service/XBRLResultService.java
rename to 
fineract-mix/src/main/java/org/apache/fineract/mix/service/MixReportXBRLResultService.java
index 585b3e46c4..9e4fb0f462 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/XBRLResultService.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/service/MixReportXBRLResultService.java
@@ -19,10 +19,10 @@
 package org.apache.fineract.mix.service;
 
 import java.sql.Date;
-import org.apache.fineract.mix.data.XBRLData;
+import org.apache.fineract.mix.data.MixReportXBRLData;
 
-public interface XBRLResultService {
+public interface MixReportXBRLResultService {
 
-    XBRLData getXBRLResult(Date startDate, Date endDate, String currency);
+    MixReportXBRLData getXBRLResult(Date startDate, Date endDate, String 
currency);
 
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/XBRLResultServiceImpl.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/service/MixReportXBRLResultServiceImpl.java
similarity index 56%
rename from 
fineract-provider/src/main/java/org/apache/fineract/mix/service/XBRLResultServiceImpl.java
rename to 
fineract-mix/src/main/java/org/apache/fineract/mix/service/MixReportXBRLResultServiceImpl.java
index 0628a4f6a8..17eb95cc86 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/XBRLResultServiceImpl.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/service/MixReportXBRLResultServiceImpl.java
@@ -31,45 +31,47 @@ import javax.script.ScriptEngine;
 import javax.script.ScriptEngineManager;
 import javax.script.ScriptException;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.fineract.mix.data.MixReportXBRLData;
 import org.apache.fineract.mix.data.MixTaxonomyData;
 import org.apache.fineract.mix.data.MixTaxonomyMappingData;
-import org.apache.fineract.mix.data.XBRLData;
-import org.apache.fineract.mix.exception.XBRLMappingInvalidException;
+import org.apache.fineract.mix.exception.MixReportXBRLMappingInvalidException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.support.rowset.SqlRowSet;
 import org.springframework.stereotype.Component;
 
-@Component
 @Slf4j
-public class XBRLResultServiceImpl implements XBRLResultService {
+@Component
+public class MixReportXBRLResultServiceImpl implements 
MixReportXBRLResultService {
 
     private static final ScriptEngine SCRIPT_ENGINE = new 
ScriptEngineManager().getEngineByName("JavaScript");
 
-    private final MixTaxonomyMappingReadPlatformService 
readTaxonomyMappingService;
-    private final MixTaxonomyReadPlatformService readTaxonomyService;
+    private final MixTaxonomyMappingReadService readTaxonomyMappingService;
+    private final MixTaxonomyReadService readTaxonomyService;
     private final JdbcTemplate jdbcTemplate;
 
     @Autowired
-    public XBRLResultServiceImpl(final JdbcTemplate jdbcTemplate, final 
MixTaxonomyMappingReadPlatformService readTaxonomyMappingService,
-            final MixTaxonomyReadPlatformService readTaxonomyService) {
+    public MixReportXBRLResultServiceImpl(final JdbcTemplate jdbcTemplate, 
final MixTaxonomyMappingReadService readTaxonomyMappingService,
+            final MixTaxonomyReadService readTaxonomyService) {
         this.readTaxonomyMappingService = readTaxonomyMappingService;
         this.readTaxonomyService = readTaxonomyService;
         this.jdbcTemplate = jdbcTemplate;
     }
 
     @Override
-    public XBRLData getXBRLResult(final Date startDate, final Date endDate, 
final String currency) {
+    public MixReportXBRLData getXBRLResult(final Date startDate, final Date 
endDate, final String currency) {
 
-        final HashMap<MixTaxonomyData, BigDecimal> config = 
retrieveTaxonomyConfig(startDate, endDate);
-        if (config == null || config.size() == 0) {
-            throw new XBRLMappingInvalidException("Mapping is empty");
+        final Map<MixTaxonomyData, BigDecimal> config = 
retrieveTaxonomyConfig(startDate, endDate);
+
+        if (config == null || config.isEmpty()) {
+            throw new MixReportXBRLMappingInvalidException("Mapping is empty");
         }
-        return new 
XBRLData().setResultMap(config).setStartDate(startDate).setEndDate(endDate).setCurrency(currency);
+
+        return new 
MixReportXBRLData().setResultMap(config).setStartDate(startDate).setEndDate(endDate).setCurrency(currency);
     }
 
     @SuppressWarnings("unchecked")
-    private HashMap<MixTaxonomyData, BigDecimal> retrieveTaxonomyConfig(final 
Date startDate, final Date endDate) {
+    private Map<MixTaxonomyData, BigDecimal> retrieveTaxonomyConfig(final Date 
startDate, final Date endDate) {
         final MixTaxonomyMappingData taxonomyMapping = 
this.readTaxonomyMappingService.retrieveTaxonomyMapping();
         if (taxonomyMapping == null) {
             return null;
@@ -77,7 +79,7 @@ public class XBRLResultServiceImpl implements 
XBRLResultService {
         final String config = taxonomyMapping.getConfig();
         if (config != null) {
             // <taxonomyId, mapping>
-            HashMap<String, String> configMap = new HashMap<>();
+            Map<String, String> configMap = new HashMap<>();
             configMap = new Gson().fromJson(config, configMap.getClass());
             if (configMap == null) {
                 return null;
@@ -96,41 +98,34 @@ public class XBRLResultServiceImpl implements 
XBRLResultService {
         return null;
     }
 
+    // TODO: this should at least use prepared statements and not just string 
concatenate the date objects!
     private String getAccountSql(final Date startDate, final Date endDate) {
-        return "select debits.glcode as 'glcode', debits.name as 'name', 
coalesce(debits.debitamount,0)-coalesce(credits.creditamount,0)) as 'balance' "
-                + "from (select acc_gl_account.gl_code as 
'glcode',name,sum(amount) as 'debitamount' "
-                + "from acc_gl_journal_entry,acc_gl_account " + "where 
acc_gl_account.id = acc_gl_journal_entry.account_id "
-                + "and acc_gl_journal_entry.type_enum=2 " + "and 
acc_gl_journal_entry.entry_date <= " + endDate
-                + " and acc_gl_journal_entry.entry_date > " + startDate
-                // "and (acc_gl_journal_entry.office_id=${branch} or
-                // ${branch}=1) "
-                // +
-                + " group by glcode " + "order by glcode) debits " + "LEFT 
OUTER JOIN "
-                + "(select acc_gl_account.gl_code as 'glcode',name,sum(amount) 
as 'creditamount' "
-                + "from acc_gl_journal_entry,acc_gl_account " + "where 
acc_gl_account.id = acc_gl_journal_entry.account_id "
-                + "and acc_gl_journal_entry.type_enum=1 " + "and 
acc_gl_journal_entry.entry_date <= " + endDate
-                + " and acc_gl_journal_entry.entry_date > " + startDate
-                // "and (acc_gl_journal_entry.office_id=${branch} or
-                // ${branch}=1) "
-                // +
-                + " group by glcode " + "order by glcode) credits " + "on 
debits.glcode=credits.glcode " + "union "
-                + "select credits.glcode as 'glcode', credits.name as 'name', 
coalesce(debits.debitamount,0)-coalesce(credits.creditamount,0)) as 'balance' "
-                + "from (select acc_gl_account.gl_code as 
'glcode',name,sum(amount) as 'debitamount' "
-                + "from acc_gl_journal_entry,acc_gl_account " + "where 
acc_gl_account.id = acc_gl_journal_entry.account_id "
-                + "and acc_gl_journal_entry.type_enum=2 " + "and 
acc_gl_journal_entry.entry_date <= " + endDate
-                + " and acc_gl_journal_entry.entry_date > " + startDate
-                // "and (acc_gl_journal_entry.office_id=${branch} or
-                // ${branch}=1) "
-                // +
-                + " group by glcode " + "order by glcode) debits " + "RIGHT 
OUTER JOIN "
-                + "(select acc_gl_account.gl_code as 'glcode',name,sum(amount) 
as 'creditamount' "
-                + "from acc_gl_journal_entry,acc_gl_account " + "where 
acc_gl_account.id = acc_gl_journal_entry.account_id "
-                + "and acc_gl_journal_entry.type_enum=1 " + "and 
acc_gl_journal_entry.entry_date <= " + endDate
-                + " and acc_gl_journal_entry.entry_date > " + startDate
-                // "and (acc_gl_journal_entry.office_id=${branch} or
-                // ${branch}=1) "
-                // +
-                + " group by name, glcode " + "order by glcode) credits " + 
"on debits.glcode=credits.glcode;";
+        return "SELECT debits.glcode AS 'glcode', debits.name AS 'name', 
COALESCE(debits.debitamount,0)-COALESCE(credits.creditamount,0)) AS 'balance' "
+                + "FROM (SELECT acc_gl_account.gl_code AS 
'glcode',name,SUM(amount) AS 'debitamount' "
+                + "FROM acc_gl_journal_entry,acc_gl_account WHERE 
acc_gl_account.id = acc_gl_journal_entry.account_id "
+                + "AND acc_gl_journal_entry.type_enum=2 AND 
acc_gl_journal_entry.entry_date <= " + endDate
+                + " AND acc_gl_journal_entry.entry_date > " + startDate
+                //
+                + " GROUP BY glcode ORDER BY glcode) debits LEFT OUTER JOIN "
+                + "(SELECT acc_gl_account.gl_code AS 'glcode',name,SUM(amount) 
AS 'creditamount' "
+                + "FROM acc_gl_journal_entry,acc_gl_account WHERE 
acc_gl_account.id = acc_gl_journal_entry.account_id "
+                + "AND acc_gl_journal_entry.type_enum=1 AND 
acc_gl_journal_entry.entry_date <= " + endDate
+                + " AND acc_gl_journal_entry.entry_date > " + startDate
+                //
+                + " GROUP BY glcode ORDER BY glcode) credits ON 
debits.glcode=credits.glcode UNION "
+                + "SELECT credits.glcode AS 'glcode', credits.name AS 'name', 
COALESCE(debits.debitamount,0)-COALESCE(credits.creditamount,0)) AS 'balance' "
+                + "FROM (SELECT acc_gl_account.gl_code AS 
'glcode',name,SUM(amount) AS 'debitamount' "
+                + "FROM acc_gl_journal_entry,acc_gl_account WHERE 
acc_gl_account.id = acc_gl_journal_entry.account_id "
+                + "AND acc_gl_journal_entry.type_enum=2 AND 
acc_gl_journal_entry.entry_date <= " + endDate
+                + " AND acc_gl_journal_entry.entry_date > " + startDate
+                //
+                + " GROUP BY glcode ORDER BY glcode) debits RIGHT OUTER JOIN "
+                + "(SELECT acc_gl_account.gl_code AS 'glcode',name,SUM(amount) 
AS 'creditamount' "
+                + "FROM acc_gl_journal_entry,acc_gl_account WHERE 
acc_gl_account.id = acc_gl_journal_entry.account_id "
+                + "AND acc_gl_journal_entry.type_enum=1 AND 
acc_gl_journal_entry.entry_date <= " + endDate
+                + " AND acc_gl_journal_entry.entry_date > " + startDate
+                //
+                + " GROUP BY name, glcode ORDER BY glcode) credits ON 
debits.glcode=credits.glcode;";
     }
 
     private Map<String, BigDecimal> setupBalanceMap(final String sql) {
@@ -156,6 +151,7 @@ public class XBRLResultServiceImpl implements 
XBRLResultService {
         // evaluate the expression
         float eval = 0f;
         try {
+            // TODO: this doesn't work anymore in modern JVMs!!!!
             final Number value = (Number) SCRIPT_ENGINE.eval(mappingString);
             if (value != null) {
                 eval = value.floatValue();
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingReadPlatformService.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingReadService.java
similarity index 94%
copy from 
fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingReadPlatformService.java
copy to 
fineract-mix/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingReadService.java
index 38bbf8f5b1..32c0f6c8fb 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingReadPlatformService.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingReadService.java
@@ -20,7 +20,7 @@ package org.apache.fineract.mix.service;
 
 import org.apache.fineract.mix.data.MixTaxonomyMappingData;
 
-public interface MixTaxonomyMappingReadPlatformService {
+public interface MixTaxonomyMappingReadService {
 
     MixTaxonomyMappingData retrieveTaxonomyMapping();
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingReadPlatformService.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingReadServiceImpl.java
similarity index 57%
rename from 
fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingReadPlatformService.java
rename to 
fineract-mix/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingReadServiceImpl.java
index 38bbf8f5b1..4047f1d09e 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingReadPlatformService.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingReadServiceImpl.java
@@ -18,9 +18,23 @@
  */
 package org.apache.fineract.mix.service;
 
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.fineract.mix.data.MixTaxonomyMappingData;
+import org.apache.fineract.mix.domain.MixTaxonomyMappingRepository;
+import org.apache.fineract.mix.mapping.MixTaxonomyMappingMapper;
+import org.springframework.stereotype.Service;
 
-public interface MixTaxonomyMappingReadPlatformService {
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class MixTaxonomyMappingReadServiceImpl implements 
MixTaxonomyMappingReadService {
 
-    MixTaxonomyMappingData retrieveTaxonomyMapping();
+    private final MixTaxonomyMappingRepository repository;
+    private final MixTaxonomyMappingMapper mapper;
+
+    @Override
+    public MixTaxonomyMappingData retrieveTaxonomyMapping() {
+        return 
repository.findAll().stream().findFirst().map(mapper::map).orElse(null);
+    }
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingWritePlatformService.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingWriteService.java
similarity index 75%
rename from 
fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingWritePlatformService.java
rename to 
fineract-mix/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingWriteService.java
index 77fa2929a8..1c91559b6b 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingWritePlatformService.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingWriteService.java
@@ -18,10 +18,10 @@
  */
 package org.apache.fineract.mix.service;
 
-import org.apache.fineract.infrastructure.core.api.JsonCommand;
-import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
+import org.apache.fineract.mix.data.MixTaxonomyMappingUpdateRequest;
+import org.apache.fineract.mix.data.MixTaxonomyMappingUpdateResponse;
 
-public interface MixTaxonomyMappingWritePlatformService {
+public interface MixTaxonomyMappingWriteService {
 
-    CommandProcessingResult updateMapping(Long mappingId, JsonCommand command);
+    MixTaxonomyMappingUpdateResponse 
updateMapping(MixTaxonomyMappingUpdateRequest request);
 }
diff --git 
a/fineract-mix/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingWriteServiceImpl.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingWriteServiceImpl.java
new file mode 100644
index 0000000000..4876476fa6
--- /dev/null
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingWriteServiceImpl.java
@@ -0,0 +1,48 @@
+/**
+ * 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.mix.service;
+
+import jakarta.validation.Valid;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.fineract.mix.data.MixTaxonomyMappingUpdateRequest;
+import org.apache.fineract.mix.data.MixTaxonomyMappingUpdateResponse;
+import org.apache.fineract.mix.domain.MixTaxonomyMappingRepository;
+import org.apache.fineract.mix.mapping.MixTaxonomyMappingUpdateRequestMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class MixTaxonomyMappingWriteServiceImpl implements 
MixTaxonomyMappingWriteService {
+
+    private final MixTaxonomyMappingRepository repository;
+    private final MixTaxonomyMappingUpdateRequestMapper mapper;
+
+    @Transactional
+    @Override
+    public MixTaxonomyMappingUpdateResponse updateMapping(@Valid final 
MixTaxonomyMappingUpdateRequest request) {
+        final var taxonomyMapping = mapper.map(request);
+
+        repository.save(taxonomyMapping);
+
+        return 
MixTaxonomyMappingUpdateResponse.builder().entityId(taxonomyMapping.getId()).build();
+    }
+}
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyReadPlatformService.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/service/MixTaxonomyReadService.java
similarity index 95%
copy from 
fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyReadPlatformService.java
copy to 
fineract-mix/src/main/java/org/apache/fineract/mix/service/MixTaxonomyReadService.java
index dd4525e57e..e541366c3a 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyReadPlatformService.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/service/MixTaxonomyReadService.java
@@ -21,7 +21,7 @@ package org.apache.fineract.mix.service;
 import java.util.List;
 import org.apache.fineract.mix.data.MixTaxonomyData;
 
-public interface MixTaxonomyReadPlatformService {
+public interface MixTaxonomyReadService {
 
     List<MixTaxonomyData> retrieveAll();
 
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyReadPlatformService.java
 
b/fineract-mix/src/main/java/org/apache/fineract/mix/service/MixTaxonomyReadServiceImpl.java
similarity index 55%
rename from 
fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyReadPlatformService.java
rename to 
fineract-mix/src/main/java/org/apache/fineract/mix/service/MixTaxonomyReadServiceImpl.java
index dd4525e57e..152055967f 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyReadPlatformService.java
+++ 
b/fineract-mix/src/main/java/org/apache/fineract/mix/service/MixTaxonomyReadServiceImpl.java
@@ -19,11 +19,28 @@
 package org.apache.fineract.mix.service;
 
 import java.util.List;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.fineract.mix.data.MixTaxonomyData;
+import org.apache.fineract.mix.domain.MixTaxonomyRepository;
+import org.apache.fineract.mix.mapping.MixTaxonomyMapper;
+import org.springframework.stereotype.Service;
 
-public interface MixTaxonomyReadPlatformService {
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class MixTaxonomyReadServiceImpl implements MixTaxonomyReadService {
 
-    List<MixTaxonomyData> retrieveAll();
+    private final MixTaxonomyRepository repository;
+    private final MixTaxonomyMapper mapper;
 
-    MixTaxonomyData retrieveOne(Long id);
+    @Override
+    public List<MixTaxonomyData> retrieveAll() {
+        return 
repository.findAllByOrderByIdAsc().stream().map(mapper::map).toList();
+    }
+
+    @Override
+    public MixTaxonomyData retrieveOne(final Long id) {
+        return repository.findById(id).map(mapper::map).orElse(null);
+    }
 }
diff --git a/fineract-provider/dependencies.gradle 
b/fineract-provider/dependencies.gradle
index 35b5daee84..dff3110e8d 100644
--- a/fineract-provider/dependencies.gradle
+++ b/fineract-provider/dependencies.gradle
@@ -42,6 +42,7 @@ dependencies {
     implementation(project(path: ':fineract-loan-origination'))
     implementation(project(path: ':fineract-security'))
     implementation(project(path: ':fineract-working-capital-loan'))
+    implementation(project(path: ':fineract-mix'))
 
     providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")
 
@@ -58,7 +59,7 @@ dependencies {
             'org.springframework.boot:spring-boot-starter-web',
             'org.springframework.boot:spring-boot-starter-validation',
             'org.springframework.boot:spring-boot-starter-security',
-            
"org.springframework.boot:spring-boot-starter-oauth2-authorization-server",
+            
'org.springframework.boot:spring-boot-starter-oauth2-authorization-server',
             'org.springframework.boot:spring-boot-starter-cache',
             
'org.springframework.boot:spring-boot-starter-oauth2-resource-server',
             'org.springframework.boot:spring-boot-starter-actuator',
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/SecurityConfig.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/SecurityConfig.java
index ca17edbd7a..fffee05b95 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/SecurityConfig.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/SecurityConfig.java
@@ -297,6 +297,34 @@ public class SecurityConfig {
                     .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_WRITE, 
"UPDATE_PAYMENTTYPE")
                     .requestMatchers(API_MATCHER.matcher(HttpMethod.POST, 
"/api/*/paymenttypes"))
                     .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_WRITE, 
"DELETE_PAYMENTTYPE")
+                    // mix: taxonomy
+                    .requestMatchers(API_MATCHER.matcher(HttpMethod.GET, 
"/api/*/mixtaxonomy/*"))
+                    .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_READ, 
"READ_MIX_TAXONOMY")
+                    .requestMatchers(API_MATCHER.matcher(HttpMethod.POST, 
"/api/*/mixtaxonomy/*"))
+                    .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_WRITE, 
"CREATE_MIX_TAXONOMY")
+                    .requestMatchers(API_MATCHER.matcher(HttpMethod.PUT, 
"/api/*/mixtaxonomy/*"))
+                    .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_WRITE, 
"UPDATE_MIX_TAXONOMY")
+                    .requestMatchers(API_MATCHER.matcher(HttpMethod.DELETE, 
"/api/*/mixtaxonomy/*"))
+                    .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_WRITE, 
"DELETE_MIX_TAXONOMY")
+                    // mix: mapping
+                    .requestMatchers(API_MATCHER.matcher(HttpMethod.GET, 
"/api/*/mixmapping/*"))
+                    .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_READ, 
"READ_MIX_MAPPING")
+                    .requestMatchers(API_MATCHER.matcher(HttpMethod.POST, 
"/api/*/mixmapping/*"))
+                    .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_WRITE, 
"CREATE_MIX_MAPPING")
+                    .requestMatchers(API_MATCHER.matcher(HttpMethod.PUT, 
"/api/*/mixmapping/*"))
+                    // TODO: "UPDATE_XBRLMAPPING" is the legacy permission 
name; we should rename for consistency
+                    .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_WRITE, 
"UPDATE_MIX_MAPPING", "UPDATE_XBRLMAPPING")
+                    .requestMatchers(API_MATCHER.matcher(HttpMethod.DELETE, 
"/api/*/mixmapping/*"))
+                    .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_WRITE, 
"DELETE_MIX_MAPPING")
+                    // mix: report
+                    .requestMatchers(API_MATCHER.matcher(HttpMethod.GET, 
"/api/*/mixreport/*"))
+                    .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_READ, 
"READ_MIX_REPORT")
+                    .requestMatchers(API_MATCHER.matcher(HttpMethod.POST, 
"/api/*/mixreport/*"))
+                    .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_WRITE, 
"CREATE_MIX_REPORT")
+                    .requestMatchers(API_MATCHER.matcher(HttpMethod.PUT, 
"/api/*/mixreport/*"))
+                    .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_WRITE, 
"UPDATE_MIX_REPORT")
+                    .requestMatchers(API_MATCHER.matcher(HttpMethod.DELETE, 
"/api/*/mixreport/*"))
+                    .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_WRITE, 
"DELETE_MIX_REPORT")
 
                     .requestMatchers(API_MATCHER.matcher(HttpMethod.POST, 
"/api/*/twofactor/validate")).fullyAuthenticated()
                     
.requestMatchers(API_MATCHER.matcher("/api/*/twofactor")).fullyAuthenticated()
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/data/ContextData.java 
b/fineract-provider/src/main/java/org/apache/fineract/mix/data/ContextData.java
deleted file mode 100644
index 7510f0d42e..0000000000
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/data/ContextData.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/**
- * 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.mix.data;
-
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
-
-@Data
-@NoArgsConstructor
-@Accessors(chain = true)
-public class ContextData {
-
-    private String dimensionType;
-    private String dimension;
-    private Integer periodType;
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + (this.dimension == null ? 0 : 
this.dimension.hashCode());
-        result = prime * result + (this.dimensionType == null ? 0 : 
this.dimensionType.hashCode());
-        result = prime * result + (this.periodType == null ? 0 : 
this.periodType.hashCode());
-        return result;
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null) {
-            return false;
-        }
-        if (!(obj instanceof ContextData)) {
-            return false;
-        }
-        final ContextData other = (ContextData) obj;
-        if (this.dimension == null) {
-            if (other.dimension != null) {
-                return false;
-            }
-        } else if (!this.dimension.equals(other.dimension)) {
-            return false;
-        }
-        if (this.dimensionType == null) {
-            if (other.dimensionType != null) {
-                return false;
-            }
-        } else if (!this.dimensionType.equals(other.dimensionType)) {
-            return false;
-        }
-        if (this.periodType == null) {
-            if (other.periodType != null) {
-                return false;
-            }
-        } else if (!this.periodType.equals(other.periodType)) {
-            return false;
-        }
-        return true;
-    }
-}
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/domain/MixTaxonomyMapping.java
 
b/fineract-provider/src/main/java/org/apache/fineract/mix/domain/MixTaxonomyMapping.java
deleted file mode 100644
index dbeb131835..0000000000
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/domain/MixTaxonomyMapping.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * 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.mix.domain;
-
-import jakarta.persistence.Column;
-import jakarta.persistence.Entity;
-import jakarta.persistence.Table;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-import lombok.experimental.Accessors;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.fineract.infrastructure.core.api.JsonCommand;
-import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
-
-@Entity
-@Table(name = "mix_taxonomy_mapping")
-@Getter
-@Setter
-@NoArgsConstructor
-@Accessors(chain = true)
-public final class MixTaxonomyMapping extends AbstractPersistableCustom<Long> {
-
-    @Column(name = "identifier")
-    private String identifier;
-
-    @Column(name = "config")
-    private String config;
-
-    @Column(name = "currency")
-    private String currency;
-
-    private MixTaxonomyMapping(final String identifier, final String config, 
final String currency) {
-        this.identifier = StringUtils.defaultIfEmpty(identifier, null);
-        this.config = StringUtils.defaultIfEmpty(config, null);
-        this.currency = StringUtils.defaultIfEmpty(currency, null);
-    }
-
-    public static MixTaxonomyMapping fromJson(final JsonCommand command) {
-        final String identifier = 
command.stringValueOfParameterNamed("identifier");
-        final String config = command.stringValueOfParameterNamed("config");
-        final String currency = 
command.stringValueOfParameterNamed("currency");
-        return new MixTaxonomyMapping(identifier, config, currency);
-    }
-
-    public void update(final JsonCommand command) {
-
-        this.identifier = command.stringValueOfParameterNamed("identifier");
-        this.config = command.stringValueOfParameterNamed("config");
-        this.currency = command.stringValueOfParameterNamed("currency");
-
-    }
-
-}
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/handler/UpdateTaxonomyMappingCommandHandler.java
 
b/fineract-provider/src/main/java/org/apache/fineract/mix/handler/UpdateTaxonomyMappingCommandHandler.java
deleted file mode 100644
index aab50d4f9e..0000000000
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/handler/UpdateTaxonomyMappingCommandHandler.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * 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.mix.handler;
-
-import org.apache.fineract.commands.annotation.CommandType;
-import org.apache.fineract.commands.handler.NewCommandSourceHandler;
-import org.apache.fineract.infrastructure.core.api.JsonCommand;
-import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
-import org.apache.fineract.mix.service.MixTaxonomyMappingWritePlatformService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-@Service
-@CommandType(entity = "XBRLMAPPING", action = "UPDATE")
-public class UpdateTaxonomyMappingCommandHandler implements 
NewCommandSourceHandler {
-
-    private final MixTaxonomyMappingWritePlatformService writeTaxonomyService;
-
-    @Autowired
-    public UpdateTaxonomyMappingCommandHandler(final 
MixTaxonomyMappingWritePlatformService writeTaxonomyService) {
-        this.writeTaxonomyService = writeTaxonomyService;
-    }
-
-    @Transactional
-    @Override
-    public CommandProcessingResult processCommand(final JsonCommand command) {
-        return this.writeTaxonomyService.updateMapping(command.entityId(), 
command);
-    }
-
-}
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingReadPlatformServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingReadPlatformServiceImpl.java
deleted file mode 100644
index 367ef80c86..0000000000
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingReadPlatformServiceImpl.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
- * 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.mix.service;
-
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import lombok.RequiredArgsConstructor;
-import org.apache.fineract.mix.data.MixTaxonomyMappingData;
-import org.springframework.dao.EmptyResultDataAccessException;
-import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.jdbc.core.RowMapper;
-
-@RequiredArgsConstructor
-public class MixTaxonomyMappingReadPlatformServiceImpl implements 
MixTaxonomyMappingReadPlatformService {
-
-    private final JdbcTemplate jdbcTemplate;
-
-    private static final class TaxonomyMappingMapper implements 
RowMapper<MixTaxonomyMappingData> {
-
-        public String schema() {
-            return "identifier, config " + "from mix_taxonomy_mapping";
-        }
-
-        @Override
-        public MixTaxonomyMappingData mapRow(final ResultSet rs, 
@SuppressWarnings("unused") final int rowNum) throws SQLException {
-            final String identifier = rs.getString("identifier");
-            final String config = rs.getString("config");
-            return new 
MixTaxonomyMappingData().setIdentifier(identifier).setConfig(config);
-        }
-
-    }
-
-    @Override
-    public MixTaxonomyMappingData retrieveTaxonomyMapping() {
-        try {
-            final TaxonomyMappingMapper rm = new TaxonomyMappingMapper();
-            final String sqlString = "select " + rm.schema();
-            return this.jdbcTemplate.queryForObject(sqlString, rm); // NOSONAR
-        } catch (final EmptyResultDataAccessException e) {
-            return null;
-        }
-
-    }
-}
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingWritePlatformServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingWritePlatformServiceImpl.java
deleted file mode 100644
index bb6a5424ad..0000000000
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyMappingWritePlatformServiceImpl.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * 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.mix.service;
-
-import lombok.RequiredArgsConstructor;
-import org.apache.fineract.infrastructure.core.api.JsonCommand;
-import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
-import 
org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder;
-import org.apache.fineract.mix.domain.MixTaxonomyMapping;
-import org.apache.fineract.mix.domain.MixTaxonomyMappingRepository;
-import org.springframework.dao.DataIntegrityViolationException;
-import org.springframework.orm.jpa.JpaSystemException;
-import org.springframework.transaction.annotation.Transactional;
-
-@RequiredArgsConstructor
-public class MixTaxonomyMappingWritePlatformServiceImpl implements 
MixTaxonomyMappingWritePlatformService {
-
-    private final MixTaxonomyMappingRepository mappingRepository;
-
-    @Transactional
-    @Override
-    public CommandProcessingResult updateMapping(final Long mappingId, final 
JsonCommand command) {
-        try {
-            MixTaxonomyMapping mapping = 
this.mappingRepository.findById(mappingId).orElse(null);
-            if (mapping == null) {
-                mapping = MixTaxonomyMapping.fromJson(command);
-            } else {
-                mapping.update(command);
-            }
-
-            this.mappingRepository.saveAndFlush(mapping);
-
-            return new 
CommandProcessingResultBuilder().withCommandId(command.commandId()).withEntityId(mapping.getId()).build();
-
-        } catch (final JpaSystemException | DataIntegrityViolationException 
dve) {
-            return CommandProcessingResult.empty();
-        }
-    }
-}
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyReadPlatformServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyReadPlatformServiceImpl.java
deleted file mode 100644
index eb4eb0fb71..0000000000
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/MixTaxonomyReadPlatformServiceImpl.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/**
- * 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.mix.service;
-
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.List;
-import org.apache.fineract.mix.data.MixTaxonomyData;
-import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.jdbc.core.RowMapper;
-
-public class MixTaxonomyReadPlatformServiceImpl implements 
MixTaxonomyReadPlatformService {
-
-    private final JdbcTemplate jdbcTemplate;
-    private final MixTaxonomyMapper mixTaxonomyMapper;
-
-    public MixTaxonomyReadPlatformServiceImpl(final JdbcTemplate jdbcTemplate) 
{
-        this.jdbcTemplate = jdbcTemplate;
-        this.mixTaxonomyMapper = new MixTaxonomyMapper();
-    }
-
-    private static final class MixTaxonomyMapper implements 
RowMapper<MixTaxonomyData> {
-
-        public String schema() {
-            return "tx.id as id, name, dimension, type, description, prefix "
-                    + "from mix_taxonomy tx left join mix_xbrl_namespace xn on 
tx.namespace_id=xn.id";
-        }
-
-        @Override
-        public MixTaxonomyData mapRow(final ResultSet rs, 
@SuppressWarnings("unused") final int rowNum) throws SQLException {
-            final long id = rs.getLong("id");
-            final String name = rs.getString("name");
-            final String namespace = rs.getString("prefix");
-
-            final String dimension = rs.getString("dimension");
-            final Integer type = rs.getInt("type");
-            final String desc = rs.getString("description");
-            return new 
MixTaxonomyData().setId(id).setName(name).setNamespace(namespace).setDimension(dimension).setType(type)
-                    .setDescription(desc);
-        }
-
-    }
-
-    @Override
-    public List<MixTaxonomyData> retrieveAll() {
-        final String sql = "select " + this.mixTaxonomyMapper.schema() + " 
order by id";
-        return this.jdbcTemplate.query(sql, this.mixTaxonomyMapper); // NOSONAR
-    }
-
-    @Override
-    public MixTaxonomyData retrieveOne(final Long id) {
-        final String sql = "select " + this.mixTaxonomyMapper.schema() + " 
where tx.id = ? ";
-        return this.jdbcTemplate.queryForObject(sql, this.mixTaxonomyMapper, 
new Object[] { id }); // NOSONAR
-    }
-}
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/NamespaceReadPlatformServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/mix/service/NamespaceReadPlatformServiceImpl.java
deleted file mode 100644
index 0ba7329530..0000000000
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/service/NamespaceReadPlatformServiceImpl.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- * 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.mix.service;
-
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import org.apache.fineract.mix.data.NamespaceData;
-import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.jdbc.core.RowMapper;
-
-public class NamespaceReadPlatformServiceImpl implements 
NamespaceReadPlatformService {
-
-    private final JdbcTemplate jdbcTemplate;
-    private final NamespaceMapper namespaceMapper;
-
-    public NamespaceReadPlatformServiceImpl(final JdbcTemplate jdbcTemplate) {
-        this.jdbcTemplate = jdbcTemplate;
-        this.namespaceMapper = new NamespaceMapper();
-    }
-
-    private static final class NamespaceMapper implements 
RowMapper<NamespaceData> {
-
-        public String schema() {
-            return "select id, prefix, url " + "from mix_xbrl_namespace";
-        }
-
-        @Override
-        public NamespaceData mapRow(final ResultSet rs, 
@SuppressWarnings("unused") final int rowNum) throws SQLException {
-            final long id = rs.getLong("id");
-            final String prefix = rs.getString("prefix");
-            final String url = rs.getString("url");
-            return new NamespaceData().setId(id).setPrefix(prefix).setUrl(url);
-        }
-
-    }
-
-    @Override
-    public NamespaceData retrieveNamespaceById(final Long id) {
-        final String sql = this.namespaceMapper.schema() + " where id= ? ";
-
-        return this.jdbcTemplate.queryForObject(sql, this.namespaceMapper, new 
Object[] { id }); // NOSONAR
-    }
-
-    @Override
-    public NamespaceData retrieveNamespaceByPrefix(final String prefix) {
-        final String sql = this.namespaceMapper.schema() + " where prefix = ? 
";
-
-        return this.jdbcTemplate.queryForObject(sql, this.namespaceMapper, new 
Object[] { prefix }); // NOSONAR
-    }
-}
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/mix/starter/MixConfiguration.java
 
b/fineract-provider/src/main/java/org/apache/fineract/mix/starter/MixConfiguration.java
deleted file mode 100644
index b4d9f25d66..0000000000
--- 
a/fineract-provider/src/main/java/org/apache/fineract/mix/starter/MixConfiguration.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * 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.mix.starter;
-
-import org.apache.fineract.mix.domain.MixTaxonomyMappingRepository;
-import org.apache.fineract.mix.service.MixTaxonomyMappingReadPlatformService;
-import 
org.apache.fineract.mix.service.MixTaxonomyMappingReadPlatformServiceImpl;
-import org.apache.fineract.mix.service.MixTaxonomyMappingWritePlatformService;
-import 
org.apache.fineract.mix.service.MixTaxonomyMappingWritePlatformServiceImpl;
-import org.apache.fineract.mix.service.MixTaxonomyReadPlatformService;
-import org.apache.fineract.mix.service.MixTaxonomyReadPlatformServiceImpl;
-import org.apache.fineract.mix.service.NamespaceReadPlatformService;
-import org.apache.fineract.mix.service.NamespaceReadPlatformServiceImpl;
-import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.jdbc.core.JdbcTemplate;
-
-@Configuration
-public class MixConfiguration {
-
-    @Bean
-    @ConditionalOnMissingBean(MixTaxonomyMappingReadPlatformService.class)
-    public MixTaxonomyMappingReadPlatformService 
mixTaxonomyMappingReadPlatformService(JdbcTemplate jdbcTemplate) {
-        return new MixTaxonomyMappingReadPlatformServiceImpl(jdbcTemplate);
-    }
-
-    @Bean
-    @ConditionalOnMissingBean(MixTaxonomyMappingWritePlatformService.class)
-    public MixTaxonomyMappingWritePlatformService 
mixTaxonomyMappingWritePlatformService(MixTaxonomyMappingRepository 
mappingRepository) {
-        return new 
MixTaxonomyMappingWritePlatformServiceImpl(mappingRepository);
-    }
-
-    @Bean
-    @ConditionalOnMissingBean(MixTaxonomyReadPlatformService.class)
-    public MixTaxonomyReadPlatformService 
mixTaxonomyReadPlatformService(JdbcTemplate jdbcTemplate) {
-        return new MixTaxonomyReadPlatformServiceImpl(jdbcTemplate);
-    }
-
-    @Bean
-    @ConditionalOnMissingBean(NamespaceReadPlatformService.class)
-    public NamespaceReadPlatformService 
namespaceReadPlatformService(JdbcTemplate jdbcTemplate) {
-        return new NamespaceReadPlatformServiceImpl(jdbcTemplate);
-    }
-
-}
diff --git a/fineract-provider/src/main/resources/application.properties 
b/fineract-provider/src/main/resources/application.properties
index 78a86a40be..671f2373df 100644
--- a/fineract-provider/src/main/resources/application.properties
+++ b/fineract-provider/src/main/resources/application.properties
@@ -597,6 +597,14 @@ 
resilience4j.retry.instances.commandPaymentTypeDelete.enable-exponential-backoff
 
resilience4j.retry.instances.commandPaymentTypeDelete.exponential-backoff-multiplier=${FINERACT_COMMAND_PAYMENT_TYPE_DELETE_RETRY_EXPONENTIAL_BACKOFF_MULTIPLIER:2}
 
resilience4j.retry.instances.commandPaymentTypeDelete.retryExceptions=${FINERACT_COMMAND_PAYMENT_TYPE_DELETE_RETRY_EXCEPTIONS:org.springframework.dao.ConcurrencyFailureException,org.eclipse.persistence.exceptions.OptimisticLockException,jakarta.persistence.OptimisticLockException,org.springframework.orm.jpa.JpaOptimisticLockingFailureException}
 
+# mix taxonomy
+
+resilience4j.retry.instances.commandMixTaxonomyMappingUpdate.max-attempts=${FINERACT_COMMAND_MIX_TAXONOMY_MAPPING_UPDATE_RETRY_MAX_ATTEMPTS:3}
+resilience4j.retry.instances.commandMixTaxonomyMappingUpdate.wait-duration=${FINERACT_COMMAND_MIX_TAXONOMY_MAPPING_UPDATE_RETRY_WAIT_DURATION:1s}
+resilience4j.retry.instances.commandMixTaxonomyMappingUpdate.enable-exponential-backoff=${FINERACT_COMMAND_MIX_TAXONOMY_MAPPING_UPDATE_RETRY_ENABLE_EXPONENTIAL_BACKOFF:true}
+resilience4j.retry.instances.commandMixTaxonomyMappingUpdate.exponential-backoff-multiplier=${FINERACT_COMMAND_MIX_TAXONOMY_MAPPING_UPDATE_RETRY_EXPONENTIAL_BACKOFF_MULTIPLIER:2}
+resilience4j.retry.instances.commandMixTaxonomyMappingUpdate.retryExceptions=${FINERACT_COMMAND_MIX_TAXONOMY_MAPPING_UPDATE_RETRY_EXCEPTIONS:org.springframework.dao.ConcurrencyFailureException,org.eclipse.persistence.exceptions.OptimisticLockException,jakarta.persistence.OptimisticLockException,org.springframework.orm.jpa.JpaOptimisticLockingFailureException}
+
 # command
 
 fineract.command.enabled=true
diff --git 
a/fineract-provider/src/main/resources/jpa/static-weaving/module/fineract-provider/persistence.xml
 
b/fineract-provider/src/main/resources/jpa/static-weaving/module/fineract-provider/persistence.xml
index 73c369c061..a753d8ca59 100644
--- 
a/fineract-provider/src/main/resources/jpa/static-weaving/module/fineract-provider/persistence.xml
+++ 
b/fineract-provider/src/main/resources/jpa/static-weaving/module/fineract-provider/persistence.xml
@@ -279,9 +279,6 @@
         <!-- AdHocQuery -->
         <class>org.apache.fineract.adhocquery.domain.AdHoc</class>
 
-        <!-- Mix -->
-        <class>org.apache.fineract.mix.domain.MixTaxonomyMapping</class>
-
         <!-- COB (Chunk of Business) -->
         <class>org.apache.fineract.cob.domain.LoanAccountLock</class>
         <class>org.apache.fineract.cob.domain.BatchBusinessStep</class>
diff --git 
a/fineract-provider/src/test/java/org/apache/fineract/mix/report/MixXbrlBuilderStepDefinitions.java
 
b/fineract-provider/src/test/java/org/apache/fineract/mix/report/MixXbrlBuilderStepDefinitions.java
index d9d9152acd..e3d9561193 100644
--- 
a/fineract-provider/src/test/java/org/apache/fineract/mix/report/MixXbrlBuilderStepDefinitions.java
+++ 
b/fineract-provider/src/test/java/org/apache/fineract/mix/report/MixXbrlBuilderStepDefinitions.java
@@ -29,18 +29,18 @@ import java.nio.charset.StandardCharsets;
 import java.sql.Date;
 import java.util.HashMap;
 import org.apache.commons.io.IOUtils;
+import org.apache.fineract.mix.data.MixReportXBRLNamespaceData;
 import org.apache.fineract.mix.data.MixTaxonomyData;
-import org.apache.fineract.mix.data.NamespaceData;
-import org.apache.fineract.mix.service.NamespaceReadPlatformServiceImpl;
-import org.apache.fineract.mix.service.XBRLBuilder;
+import org.apache.fineract.mix.service.MixReportXBRLBuilder;
+import org.apache.fineract.mix.service.MixReportXBRLNamespaceReadServiceImpl;
 import org.apache.fineract.template.service.TemplateServiceStepDefinitions;
 import org.mockito.ArgumentMatchers;
 
 public class MixXbrlBuilderStepDefinitions implements En {
 
-    private NamespaceReadPlatformServiceImpl readNamespaceService;
+    private MixReportXBRLNamespaceReadServiceImpl readNamespaceService;
 
-    private final XBRLBuilder xbrlBuilder = new XBRLBuilder();
+    private MixReportXBRLBuilder xbrlBuilder;
 
     private Date start;
 
@@ -55,9 +55,11 @@ public class MixXbrlBuilderStepDefinitions implements En {
     public MixXbrlBuilderStepDefinitions() {
         Given("/^The XBRL input parameters start date (.*), end date (.*), 
currency (.*), taxonomy (.*) and sample (.*)$/",
                 (String start, String end, String currency, String taxonomy, 
String sample) -> {
-                    readNamespaceService = 
mock(NamespaceReadPlatformServiceImpl.class);
+                    readNamespaceService = 
mock(MixReportXBRLNamespaceReadServiceImpl.class);
                     
lenient().when(this.readNamespaceService.retrieveNamespaceByPrefix(ArgumentMatchers.anyString()))
-                            .thenReturn(new 
NamespaceData().setId(1L).setPrefix("mockedprefix").setUrl("mockedurl"));
+                            .thenReturn(new 
MixReportXBRLNamespaceData().setId(1L).setPrefix("mockedprefix").setUrl("mockedurl"));
+
+                    xbrlBuilder = new 
MixReportXBRLBuilder(readNamespaceService);
 
                     this.start = Date.valueOf(start);
                     this.end = Date.valueOf(end);
diff --git 
a/fineract-provider/src/test/java/org/apache/fineract/mix/report/MixXbrlTaxonomyStepDefinitions.java
 
b/fineract-provider/src/test/java/org/apache/fineract/mix/report/MixXbrlTaxonomyStepDefinitions.java
index 8b5c4adf98..b477213866 100644
--- 
a/fineract-provider/src/test/java/org/apache/fineract/mix/report/MixXbrlTaxonomyStepDefinitions.java
+++ 
b/fineract-provider/src/test/java/org/apache/fineract/mix/report/MixXbrlTaxonomyStepDefinitions.java
@@ -23,13 +23,13 @@ import static org.mockito.Mockito.mock;
 
 import io.cucumber.java8.En;
 import java.util.List;
-import org.apache.fineract.mix.service.XBRLResultServiceImpl;
+import org.apache.fineract.mix.service.MixReportXBRLResultServiceImpl;
 import org.assertj.core.util.Arrays;
 import org.springframework.jdbc.core.JdbcTemplate;
 
 public class MixXbrlTaxonomyStepDefinitions implements En {
 
-    private XBRLResultServiceImpl readService;
+    private MixReportXBRLResultServiceImpl readService;
 
     private String template;
 
@@ -37,7 +37,7 @@ public class MixXbrlTaxonomyStepDefinitions implements En {
 
     public MixXbrlTaxonomyStepDefinitions() {
         Given("/^A XBRL template (.*)$/", (String template) -> {
-            this.readService = new 
XBRLResultServiceImpl(mock(JdbcTemplate.class), null, null);
+            this.readService = new 
MixReportXBRLResultServiceImpl(mock(JdbcTemplate.class), null, null);
             this.template = template;
         });
 
diff --git a/fineract-war/build.gradle b/fineract-war/build.gradle
index bd98f88280..b7f5d9197f 100644
--- a/fineract-war/build.gradle
+++ b/fineract-war/build.gradle
@@ -83,6 +83,7 @@ dependencies {
     implementation project(':fineract-investor')
     implementation project(':fineract-branch')
     implementation project(':fineract-document')
+    implementation project(':fineract-mix')
     implementation project(':fineract-charge')
     implementation project(':fineract-rates')
     implementation project(':fineract-loan')
diff --git a/settings.gradle b/settings.gradle
index 07151345a0..9768ec5a37 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -64,6 +64,7 @@ include ':fineract-loan-origination'
 include ':fineract-loan'
 include ':fineract-savings'
 include ':fineract-report'
+include ':fineract-mix'
 include ':fineract-war'
 include ':integration-tests'
 include ':twofactor-tests'

Reply via email to