diff --git a/fineract-core/src/main/java/org/apache/fineract/batch/command/CommandHandlerRegistry.java b/fineract-core/src/main/java/org/apache/fineract/batch/command/CommandHandlerRegistry.java new file mode 100644 index 000000000..632efd84c --- /dev/null +++ b/fineract-core/src/main/java/org/apache/fineract/batch/command/CommandHandlerRegistry.java @@ -0,0 +1,40 @@ +/** + * 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.batch.command; + +import java.util.Map; +import java.util.function.BiFunction; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public final class CommandHandlerRegistry { + + private final Map> handlers; + + public void register(K key, BiFunction handler) { + handlers.put(key, handler); + } + + public R execute(K key, P1 param1, P2 param2, RuntimeException ex) { + return handlers.getOrDefault(key, (p1, p2) -> { + throw ex; + }).apply(param1, param2); + + } +} diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/CommandParameterUtil.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/CommandParameterUtil.java index 69da158c9..51e97d735 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/CommandParameterUtil.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/CommandParameterUtil.java @@ -22,6 +22,11 @@ import org.apache.commons.lang3.StringUtils; public final class CommandParameterUtil { + public static final String INTERMEDIARY_SALE_COMMAND_VALUE = "intermediarySale"; + public static final String SALE_COMMAND_VALUE = "sale"; + public static final String BUY_BACK_COMMAND_VALUE = "buyback"; + public static final String CANCEL_COMMAND_VALUE = "cancel"; + private CommandParameterUtil() {} public static boolean is(final String commandParam, final String commandValue) { diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/assetexternalization/AssetExternalizationStepDef.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/assetexternalization/AssetExternalizationStepDef.java index c51da467a..82d597abc 100644 --- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/assetexternalization/AssetExternalizationStepDef.java +++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/assetexternalization/AssetExternalizationStepDef.java @@ -49,12 +49,12 @@ import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; +import org.apache.fineract.client.models.ExternalAssetOwnerRequest; import org.apache.fineract.client.models.ExternalOwnerJournalEntryData; import org.apache.fineract.client.models.ExternalOwnerTransferJournalEntryData; import org.apache.fineract.client.models.ExternalTransferData; import org.apache.fineract.client.models.JournalEntryData; import org.apache.fineract.client.models.PageExternalTransferData; -import org.apache.fineract.client.models.PostInitiateTransferRequest; import org.apache.fineract.client.models.PostInitiateTransferResponse; import org.apache.fineract.client.models.PostLoansResponse; import org.apache.fineract.client.services.ExternalAssetOwnersApi; @@ -116,7 +116,7 @@ public class AssetExternalizationStepDef extends AbstractStepDef { Response loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE); long loanId = loanResponse.body().getLoanId(); - PostInitiateTransferRequest request = new PostInitiateTransferRequest(); + ExternalAssetOwnerRequest request = new ExternalAssetOwnerRequest(); if (transferData.get(0).equals(TRANSACTION_TYPE_BUYBACK)) { request.settlementDate(transferData.get(1))// .transferExternalId(transferExternalId)// @@ -163,7 +163,7 @@ public class AssetExternalizationStepDef extends AbstractStepDef { Response loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE); long loanId = loanResponse.body().getLoanId(); - PostInitiateTransferRequest request = new PostInitiateTransferRequest()// + ExternalAssetOwnerRequest request = new ExternalAssetOwnerRequest()// .settlementDate(settlementDate)// .ownerExternalId(null)// .transferExternalId(testContext().get(TestContextKey.ASSET_EXTERNALIZATION_TRANSFER_EXTERNAL_ID_FROM_RESPONSE))// @@ -202,7 +202,7 @@ public class AssetExternalizationStepDef extends AbstractStepDef { Response loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE); String loanExternalId = loanResponse.body().getResourceExternalId(); - PostInitiateTransferRequest request = new PostInitiateTransferRequest(); + ExternalAssetOwnerRequest request = new ExternalAssetOwnerRequest(); if (transferData.get(0).equals(TRANSACTION_TYPE_BUYBACK)) { request.settlementDate(transferData.get(1))// .transferExternalId(transferExternalId)// @@ -381,7 +381,7 @@ public class AssetExternalizationStepDef extends AbstractStepDef { String transferExternalId = testContext().get(TestContextKey.ASSET_EXTERNALIZATION_TRANSFER_EXTERNAL_ID_FROM_RESPONSE); - PostInitiateTransferRequest request = new PostInitiateTransferRequest()// + ExternalAssetOwnerRequest request = new ExternalAssetOwnerRequest()// .settlementDate(transferData.get(1))// .transferExternalId(transferExternalId)// .dateFormat(DATE_FORMAT_ASSET_EXT)// @@ -417,7 +417,7 @@ public class AssetExternalizationStepDef extends AbstractStepDef { Response loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE); long loanId = loanResponse.body().getLoanId(); - PostInitiateTransferRequest request = new PostInitiateTransferRequest(); + ExternalAssetOwnerRequest request = new ExternalAssetOwnerRequest(); if (transferData.get(0).equals(TRANSACTION_TYPE_BUYBACK)) { request.settlementDate(transferData.get(1))// .transferExternalId(null)// @@ -465,7 +465,7 @@ public class AssetExternalizationStepDef extends AbstractStepDef { Response loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE); long loanId = loanResponse.body().getLoanId(); - PostInitiateTransferRequest request = new PostInitiateTransferRequest()// + ExternalAssetOwnerRequest request = new ExternalAssetOwnerRequest()// .settlementDate(transferData.get(0))// .ownerExternalId(null)// .transferExternalId(null)// diff --git a/fineract-investor/src/main/java/org/apache/fineract/investor/api/ExternalAssetOwnersApiResource.java b/fineract-investor/src/main/java/org/apache/fineract/investor/api/ExternalAssetOwnersApiResource.java index e1bfb9747..fef390d75 100644 --- a/fineract-investor/src/main/java/org/apache/fineract/investor/api/ExternalAssetOwnersApiResource.java +++ b/fineract-investor/src/main/java/org/apache/fineract/investor/api/ExternalAssetOwnersApiResource.java @@ -18,6 +18,11 @@ */ package org.apache.fineract.investor.api; +import static org.apache.fineract.infrastructure.core.service.CommandParameterUtil.BUY_BACK_COMMAND_VALUE; +import static org.apache.fineract.infrastructure.core.service.CommandParameterUtil.CANCEL_COMMAND_VALUE; +import static org.apache.fineract.infrastructure.core.service.CommandParameterUtil.INTERMEDIARY_SALE_COMMAND_VALUE; +import static org.apache.fineract.infrastructure.core.service.CommandParameterUtil.SALE_COMMAND_VALUE; + import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Content; @@ -33,10 +38,11 @@ import jakarta.ws.rs.Path; import jakarta.ws.rs.PathParam; import jakarta.ws.rs.Produces; import jakarta.ws.rs.QueryParam; -import jakarta.ws.rs.core.Context; import jakarta.ws.rs.core.MediaType; -import jakarta.ws.rs.core.UriInfo; +import java.util.Map; import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.apache.fineract.batch.command.CommandHandlerRegistry; import org.apache.fineract.commands.domain.CommandWrapper; import org.apache.fineract.commands.service.CommandWrapperBuilder; import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService; @@ -44,7 +50,6 @@ import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.domain.ExternalId; import org.apache.fineract.infrastructure.core.exception.UnrecognizedQueryParamException; import org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSerializer; -import org.apache.fineract.infrastructure.core.service.CommandParameterUtil; import org.apache.fineract.infrastructure.core.service.PagedRequest; import org.apache.fineract.infrastructure.security.service.PlatformUserRightsContext; import org.apache.fineract.investor.api.search.ExternalAssetOwnersSearchApiDelegate; @@ -52,7 +57,7 @@ import org.apache.fineract.investor.config.InvestorModuleIsEnabledCondition; import org.apache.fineract.investor.data.ExternalOwnerJournalEntryData; import org.apache.fineract.investor.data.ExternalOwnerTransferJournalEntryData; import org.apache.fineract.investor.data.ExternalTransferData; -import org.apache.fineract.investor.data.ExternalTransferResponseData; +import org.apache.fineract.investor.data.request.ExternalAssetOwnerRequest; import org.apache.fineract.investor.service.ExternalAssetOwnersReadService; import org.apache.fineract.investor.service.search.domain.ExternalAssetOwnerSearchRequest; import org.apache.fineract.portfolio.loanaccount.service.LoanReadPlatformServiceCommon; @@ -69,41 +74,55 @@ public class ExternalAssetOwnersApiResource { private final PlatformUserRightsContext platformUserRightsContext; private final ExternalAssetOwnersReadService externalAssetOwnersReadService; - private final DefaultToApiJsonSerializer postApiJsonSerializerService; + private final DefaultToApiJsonSerializer postApiJsonSerializerService; private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; private final LoanReadPlatformServiceCommon loanReadPlatformService; private final ExternalAssetOwnersSearchApiDelegate delegate; + private static final CommandHandlerRegistry COMMAND_HANDLER_REGISTRY = new CommandHandlerRegistry<>( + Map.of(CANCEL_COMMAND_VALUE, (id, json) -> new CommandWrapperBuilder().cancelTransactionByIdToExternalAssetOwner(id).build(), + INTERMEDIARY_SALE_COMMAND_VALUE, + (id, json) -> new CommandWrapperBuilder().withJson(json).intermediarySaleLoanToExternalAssetOwner(id).build(), + SALE_COMMAND_VALUE, (id, json) -> new CommandWrapperBuilder().withJson(json).saleLoanToExternalAssetOwner(id).build(), + BUY_BACK_COMMAND_VALUE, + (id, json) -> new CommandWrapperBuilder().withJson(json).buybackLoanToExternalAssetOwner(id).build())); + @POST @Path("/transfers/loans/{loanId}") @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) - @RequestBody(required = true, content = @Content(schema = @Schema(implementation = ExternalAssetOwnersApiResourceSwagger.PostInitiateTransferRequest.class))) + @RequestBody(required = true, content = @Content(schema = @Schema(implementation = ExternalAssetOwnerRequest.class))) @ApiResponses({ @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = ExternalAssetOwnersApiResourceSwagger.PostInitiateTransferResponse.class))), @ApiResponse(responseCode = "403", description = "Transfer cannot be initiated") }) - public String transferRequestWithLoanId(@PathParam("loanId") final Long loanId, + public CommandProcessingResult transferRequestWithLoanId(@PathParam("loanId") final Long loanId, @QueryParam("command") @Parameter(description = "command") final String commandParam, - @Parameter(hidden = true) final String apiRequestBodyAsJson) { + @Parameter(hidden = true) ExternalAssetOwnerRequest assetOwnerReq) { platformUserRightsContext.isAuthenticated(); - return getResult(loanId, apiRequestBodyAsJson, commandParam); + final String serializedAssetRequest = postApiJsonSerializerService.serialize(assetOwnerReq); + final CommandWrapper commandRequest = COMMAND_HANDLER_REGISTRY.execute(StringUtils.toRootLowerCase(commandParam), loanId, + serializedAssetRequest, new UnrecognizedQueryParamException("command", commandParam)); + return this.commandsSourceWritePlatformService.logCommandSource(commandRequest); } @POST @Path("/transfers/loans/external-id/{loanExternalId}") @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) - @RequestBody(required = true, content = @Content(schema = @Schema(implementation = ExternalAssetOwnersApiResourceSwagger.PostInitiateTransferRequest.class))) + @RequestBody(required = true, content = @Content(schema = @Schema(implementation = ExternalAssetOwnerRequest.class))) @ApiResponses({ @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = ExternalAssetOwnersApiResourceSwagger.PostInitiateTransferResponse.class))), @ApiResponse(responseCode = "403", description = "Transfer cannot be initiated") }) - public String transferRequestWithLoanExternalId(@PathParam("loanExternalId") final String externalLoanId, + public CommandProcessingResult transferRequestWithLoanExternalId(@PathParam("loanExternalId") final String externalLoanId, @QueryParam("command") @Parameter(description = "command") final String commandParam, - @Parameter(hidden = true) final String apiRequestBodyAsJson) { + @Parameter(hidden = true) ExternalAssetOwnerRequest assetOwnerReq) { platformUserRightsContext.isAuthenticated(); - Long loanId = loanReadPlatformService.getLoanIdByLoanExternalId(externalLoanId); + final Long loanId = loanReadPlatformService.getLoanIdByLoanExternalId(externalLoanId); + final String serializedAssetRequest = postApiJsonSerializerService.serialize(assetOwnerReq); + final CommandWrapper commandRequest = COMMAND_HANDLER_REGISTRY.execute(StringUtils.toRootLowerCase(commandParam), loanId, + serializedAssetRequest, new UnrecognizedQueryParamException("command", commandParam)); + return this.commandsSourceWritePlatformService.logCommandSource(commandRequest); - return getResult(loanId, apiRequestBodyAsJson, commandParam); } @POST @@ -113,11 +132,14 @@ public class ExternalAssetOwnersApiResource { @ApiResponses({ @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = ExternalAssetOwnersApiResourceSwagger.PostInitiateTransferResponse.class))), @ApiResponse(responseCode = "403", description = "Transfer cannot be initiated") }) - public String transferRequestWithId(@PathParam("id") final Long id, + public CommandProcessingResult transferRequestWithId(@PathParam("id") final Long id, @QueryParam("command") @Parameter(description = "command") final String commandParam, - @Parameter(hidden = true) final String apiRequestBodyAsJson) { + @Parameter(hidden = true) ExternalAssetOwnerRequest assetOwnerReq) { platformUserRightsContext.isAuthenticated(); - return getResultByTransferId(id, commandParam); + final String serializedAssetRequest = postApiJsonSerializerService.serialize(assetOwnerReq); + final CommandWrapper commandRequest = COMMAND_HANDLER_REGISTRY.execute(StringUtils.toRootLowerCase(commandParam), id, + serializedAssetRequest, new UnrecognizedQueryParamException("command", commandParam)); + return this.commandsSourceWritePlatformService.logCommandSource(commandRequest); } @POST @@ -127,12 +149,15 @@ public class ExternalAssetOwnersApiResource { @ApiResponses({ @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = ExternalAssetOwnersApiResourceSwagger.PostInitiateTransferResponse.class))), @ApiResponse(responseCode = "403", description = "Transfer cannot be initiated") }) - public String transferRequestWithId(@PathParam("externalId") final String externalId, + public CommandProcessingResult transferRequestWithId(@PathParam("externalId") final String externalId, @QueryParam("command") @Parameter(description = "command") final String commandParam, - @Parameter(hidden = true) final String apiRequestBodyAsJson) { + @Parameter(hidden = true) ExternalAssetOwnerRequest assetOwnerReq) { platformUserRightsContext.isAuthenticated(); - Long id = externalAssetOwnersReadService.retrieveLastTransferIdByExternalId(new ExternalId(externalId)); - return getResultByTransferId(id, commandParam); + final Long id = externalAssetOwnersReadService.retrieveLastTransferIdByExternalId(new ExternalId(externalId)); + final String serializedAssetRequest = postApiJsonSerializerService.serialize(assetOwnerReq); + final CommandWrapper commandRequest = COMMAND_HANDLER_REGISTRY.execute(StringUtils.toRootLowerCase(commandParam), id, + serializedAssetRequest, new UnrecognizedQueryParamException("command", commandParam)); + return this.commandsSourceWritePlatformService.logCommandSource(commandRequest); } @GET @@ -145,10 +170,9 @@ public class ExternalAssetOwnersApiResource { @QueryParam("loanId") @Parameter(description = "loanId") final Long loanId, @QueryParam("loanExternalId") @Parameter(description = "loanExternalId") final String loanExternalId, @QueryParam("offset") @Parameter(description = "offset") final Integer offset, - @QueryParam("limit") @Parameter(description = "limit") final Integer limit, @Context final UriInfo uriInfo) { + @QueryParam("limit") @Parameter(description = "limit") final Integer limit) { platformUserRightsContext.isAuthenticated(); return externalAssetOwnersReadService.retrieveTransferData(loanId, loanExternalId, transferExternalId, offset, limit); - } @GET @@ -159,11 +183,9 @@ public class ExternalAssetOwnersApiResource { public ExternalTransferData getActiveTransfer( @QueryParam("transferExternalId") @Parameter(description = "transferExternalId") final String transferExternalId, @QueryParam("loanId") @Parameter(description = "loanId") final Long loanId, - @QueryParam("loanExternalId") @Parameter(description = "loanExternalId") final String loanExternalId, - @Context final UriInfo uriInfo) { + @QueryParam("loanExternalId") @Parameter(description = "loanExternalId") final String loanExternalId) { platformUserRightsContext.isAuthenticated(); return externalAssetOwnersReadService.retrieveActiveTransferData(loanId, loanExternalId, transferExternalId); - } @GET @@ -174,10 +196,9 @@ public class ExternalAssetOwnersApiResource { public ExternalOwnerTransferJournalEntryData getJournalEntriesOfTransfer( @PathParam("transferId") @Parameter(description = "transferId") final Long transferId, @QueryParam("offset") @Parameter(description = "offset") final Integer offset, - @QueryParam("limit") @Parameter(description = "limit") final Integer limit, @Context final UriInfo uriInfo) { + @QueryParam("limit") @Parameter(description = "limit") final Integer limit) { platformUserRightsContext.isAuthenticated(); return externalAssetOwnersReadService.retrieveJournalEntriesOfTransfer(transferId, offset, limit); - } @GET @@ -188,10 +209,9 @@ public class ExternalAssetOwnersApiResource { public ExternalOwnerJournalEntryData getJournalEntriesOfOwner( @PathParam("ownerExternalId") @Parameter(description = "ownerExternalId") final String ownerExternalId, @QueryParam("offset") @Parameter(description = "offset") final Integer offset, - @QueryParam("limit") @Parameter(description = "limit") final Integer limit, @Context final UriInfo uriInfo) { + @QueryParam("limit") @Parameter(description = "limit") final Integer limit) { platformUserRightsContext.isAuthenticated(); return externalAssetOwnersReadService.retrieveJournalEntriesOfOwner(ownerExternalId, offset, limit); - } @POST @@ -202,37 +222,5 @@ public class ExternalAssetOwnersApiResource { public Page searchInvestorData(@Parameter PagedRequest request) { platformUserRightsContext.isAuthenticated(); return delegate.searchInvestorData(request); - - } - - private String getResultByTransferId(Long id, String command) { - final CommandWrapperBuilder builder = new CommandWrapperBuilder(); - CommandWrapper commandRequest; - if (CommandParameterUtil.is(command, "cancel")) { - commandRequest = builder.cancelTransactionByIdToExternalAssetOwner(id).build(); - } else { - throw new UnrecognizedQueryParamException("command", command); - } - CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest); - return postApiJsonSerializerService.serialize(result); - } - - private String getResult(Long loanId, String apiRequestBodyAsJson, String commandParam) { - final CommandWrapperBuilder builder = new CommandWrapperBuilder().withJson(apiRequestBodyAsJson); - CommandWrapper commandRequest = null; - if (CommandParameterUtil.is(commandParam, "intermediarySale")) { - commandRequest = builder.intermediarySaleLoanToExternalAssetOwner(loanId).build(); - } else if (CommandParameterUtil.is(commandParam, "sale")) { - commandRequest = builder.saleLoanToExternalAssetOwner(loanId).build(); - } else if (CommandParameterUtil.is(commandParam, "buyback")) { - commandRequest = builder.buybackLoanToExternalAssetOwner(loanId).build(); - } - - if (commandRequest == null) { - throw new UnrecognizedQueryParamException("command", commandParam); - } - CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest); - - return postApiJsonSerializerService.serialize(result); } } diff --git a/fineract-investor/src/main/java/org/apache/fineract/investor/api/ExternalAssetOwnersApiResourceSwagger.java b/fineract-investor/src/main/java/org/apache/fineract/investor/api/ExternalAssetOwnersApiResourceSwagger.java index 787769f4e..92e0b9a09 100644 --- a/fineract-investor/src/main/java/org/apache/fineract/investor/api/ExternalAssetOwnersApiResourceSwagger.java +++ b/fineract-investor/src/main/java/org/apache/fineract/investor/api/ExternalAssetOwnersApiResourceSwagger.java @@ -20,103 +20,12 @@ package org.apache.fineract.investor.api; import io.swagger.v3.oas.annotations.media.Schema; import java.time.LocalDate; -import java.util.Set; -import org.apache.fineract.investor.data.ExternalTransferStatus; @SuppressWarnings({ "MemberName" }) final class ExternalAssetOwnersApiResourceSwagger { private ExternalAssetOwnersApiResourceSwagger() {} - static final class GetExternalTransferPageItems { - - private GetExternalTransferPageItems() {} - - static final class GetExternalTransferOwner { - - private GetExternalTransferOwner() {} - - @Schema(example = "e1156fbe-38bb-42f8-b491-fca02075f40e") - public String externalId; - } - - static final class GetExternalTransferLoan { - - private GetExternalTransferLoan() {} - - @Schema(example = "1") - public Long loanId; - - @Schema(example = "e1156fbe-38bb-42f8-b491-fca02075f40e") - public String externalId; - } - - @Schema(example = "1") - public Long transferId; - - public GetExternalTransferOwner owner; - - public GetExternalTransferLoan loan; - - @Schema(example = "e1156fbe-38bb-42f8-b491-fca02075f40e") - public String transferExternalId; - - @Schema(example = "e1156fbe-38bb-42f8-b491-fca02075f40e") - public String transferExternalGroupId; - - @Schema(example = "1") - public String purchasePriceRatio; - - @Schema(example = "[2023, 5, 23]") - public LocalDate settlementDate; - - @Schema(example = "PENDING") - public ExternalTransferStatus status; - - @Schema(example = "[2023, 5, 1]") - public LocalDate effectiveFrom; - - @Schema(example = "[2023, 5, 23]") - public LocalDate effectiveTo; - } - - @Schema(description = "ExternalTransferResponse") - public static final class GetExternalTransferResponse { - - private GetExternalTransferResponse() {} - - @Schema(example = "20") - public Integer totalFilteredRecords; - public Set pageItems; - } - - @Schema(description = "PostInitiateTransferRequest") - public static final class PostInitiateTransferRequest { - - private PostInitiateTransferRequest() {} - - @Schema(example = "2023-5-23") - public String settlementDate; - - @Schema(example = "1234567890987654321abc") - public String ownerExternalId; - - @Schema(example = "36efeb06-d835-48a1-99eb-09bd1d348c1e") - public String transferExternalId; - - @Schema(example = "e1156fbe-38bb-42f8-b491-fca02075f40e") - public String transferExternalGroupId; - - @Schema(example = "1.2345678") - public String purchasePriceRatio; - - @Schema(example = "yyyy-MM-dd") - public String dateFormat; - - @Schema(example = "en") - public String locale; - } - @Schema(description = "PostInitiateTransferResponse") public static final class PostInitiateTransferResponse { diff --git a/fineract-investor/src/main/java/org/apache/fineract/investor/data/request/ExternalAssetOwnerRequest.java b/fineract-investor/src/main/java/org/apache/fineract/investor/data/request/ExternalAssetOwnerRequest.java new file mode 100644 index 000000000..7fda8deab --- /dev/null +++ b/fineract-investor/src/main/java/org/apache/fineract/investor/data/request/ExternalAssetOwnerRequest.java @@ -0,0 +1,40 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.investor.data.request; + +import java.io.Serial; +import java.io.Serializable; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class ExternalAssetOwnerRequest implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private String settlementDate; + private String ownerExternalId; + private String transferExternalId; + private String transferExternalGroupId; + private String purchasePriceRatio; + private String dateFormat; + private String locale; +} diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ExternalAssetOwnerHelper.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ExternalAssetOwnerHelper.java index 5ae2f072d..96edda0fa 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ExternalAssetOwnerHelper.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ExternalAssetOwnerHelper.java @@ -25,6 +25,7 @@ import java.time.LocalDate; import java.util.ArrayList; import java.util.List; import org.apache.fineract.accounting.common.AccountingConstants; +import org.apache.fineract.client.models.ExternalAssetOwnerRequest; import org.apache.fineract.client.models.ExternalAssetOwnerSearchRequest; import org.apache.fineract.client.models.ExternalOwnerJournalEntryData; import org.apache.fineract.client.models.ExternalOwnerTransferJournalEntryData; @@ -33,7 +34,6 @@ import org.apache.fineract.client.models.GetFinancialActivityAccountsResponse; import org.apache.fineract.client.models.PageExternalTransferData; import org.apache.fineract.client.models.PagedRequestExternalAssetOwnerSearchRequest; import org.apache.fineract.client.models.PostFinancialActivityAccountsRequest; -import org.apache.fineract.client.models.PostInitiateTransferRequest; import org.apache.fineract.client.models.PostInitiateTransferResponse; import org.apache.fineract.client.util.CallFailedRuntimeException; import org.apache.fineract.client.util.Calls; @@ -44,7 +44,7 @@ public class ExternalAssetOwnerHelper { public ExternalAssetOwnerHelper() {} - public PostInitiateTransferResponse initiateTransferByLoanId(Long loanId, String command, PostInitiateTransferRequest request) { + public PostInitiateTransferResponse initiateTransferByLoanId(Long loanId, String command, ExternalAssetOwnerRequest request) { return Calls.ok(FineractClientHelper.getFineractClient().externalAssetOwners.transferRequestWithLoanId(loanId, request, command)); } diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/investor/externalassetowner/ExternalAssetOwnerTransferCancelTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/investor/externalassetowner/ExternalAssetOwnerTransferCancelTest.java index 16eb0ccf6..3bfddb93c 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/investor/externalassetowner/ExternalAssetOwnerTransferCancelTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/investor/externalassetowner/ExternalAssetOwnerTransferCancelTest.java @@ -45,12 +45,12 @@ import java.util.Optional; import java.util.UUID; import lombok.RequiredArgsConstructor; import org.apache.fineract.accounting.common.AccountingConstants; +import org.apache.fineract.client.models.ExternalAssetOwnerRequest; import org.apache.fineract.client.models.ExternalOwnerTransferJournalEntryData; import org.apache.fineract.client.models.ExternalTransferData; import org.apache.fineract.client.models.GetFinancialActivityAccountsResponse; import org.apache.fineract.client.models.PageExternalTransferData; import org.apache.fineract.client.models.PostFinancialActivityAccountsRequest; -import org.apache.fineract.client.models.PostInitiateTransferRequest; import org.apache.fineract.client.models.PostInitiateTransferResponse; import org.apache.fineract.client.models.PutGlobalConfigurationsRequest; import org.apache.fineract.infrastructure.configuration.api.GlobalConfigurationConstants; @@ -248,7 +248,7 @@ public class ExternalAssetOwnerTransferCancelTest extends BaseLoanIntegrationTes private PostInitiateTransferResponse createSaleTransfer(Integer loanID, String settlementDate, String transferExternalId, String ownerExternalId, String purchasePriceRatio) { PostInitiateTransferResponse saleResponse = EXTERNAL_ASSET_OWNER_HELPER.initiateTransferByLoanId(loanID.longValue(), "sale", - new PostInitiateTransferRequest().settlementDate(settlementDate).dateFormat("yyyy-MM-dd").locale("en") + new ExternalAssetOwnerRequest().settlementDate(settlementDate).dateFormat("yyyy-MM-dd").locale("en") .transferExternalId(transferExternalId).ownerExternalId(ownerExternalId).purchasePriceRatio(purchasePriceRatio)); assertEquals(transferExternalId, saleResponse.getResourceExternalId()); return saleResponse; @@ -257,7 +257,7 @@ public class ExternalAssetOwnerTransferCancelTest extends BaseLoanIntegrationTes private PostInitiateTransferResponse createBuybackTransfer(Integer loanID, String settlementDate) { String transferExternalId = UUID.randomUUID().toString(); PostInitiateTransferResponse saleResponse = EXTERNAL_ASSET_OWNER_HELPER.initiateTransferByLoanId(loanID.longValue(), "buyback", - new PostInitiateTransferRequest().settlementDate(settlementDate).dateFormat("yyyy-MM-dd").locale("en") + new ExternalAssetOwnerRequest().settlementDate(settlementDate).dateFormat("yyyy-MM-dd").locale("en") .transferExternalId(transferExternalId)); assertEquals(transferExternalId, saleResponse.getResourceExternalId()); return saleResponse; diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/investor/externalassetowner/ExternalAssetOwnerTransferTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/investor/externalassetowner/ExternalAssetOwnerTransferTest.java index bdacddfdc..b89e4db5e 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/investor/externalassetowner/ExternalAssetOwnerTransferTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/investor/externalassetowner/ExternalAssetOwnerTransferTest.java @@ -42,11 +42,11 @@ import java.util.Optional; import java.util.UUID; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.fineract.client.models.ExternalAssetOwnerRequest; import org.apache.fineract.client.models.ExternalOwnerJournalEntryData; import org.apache.fineract.client.models.ExternalOwnerTransferJournalEntryData; import org.apache.fineract.client.models.ExternalTransferData; import org.apache.fineract.client.models.PageExternalTransferData; -import org.apache.fineract.client.models.PostInitiateTransferRequest; import org.apache.fineract.client.models.PostInitiateTransferResponse; import org.apache.fineract.client.models.PutGlobalConfigurationsRequest; import org.apache.fineract.infrastructure.configuration.api.GlobalConfigurationConstants; @@ -131,7 +131,7 @@ public class ExternalAssetOwnerTransferTest extends BaseLoanIntegrationTest { protected PostInitiateTransferResponse createSaleTransfer(Integer loanID, String settlementDate, String transferExternalId, String transferExternalGroupId, String ownerExternalId, String purchasePriceRatio) { PostInitiateTransferResponse saleResponse = EXTERNAL_ASSET_OWNER_HELPER.initiateTransferByLoanId(loanID.longValue(), "sale", - new PostInitiateTransferRequest().settlementDate(settlementDate).dateFormat("yyyy-MM-dd").locale("en") + new ExternalAssetOwnerRequest().settlementDate(settlementDate).dateFormat("yyyy-MM-dd").locale("en") .transferExternalId(transferExternalId).transferExternalGroupId(transferExternalGroupId) .ownerExternalId(ownerExternalId).purchasePriceRatio(purchasePriceRatio)); assertEquals(transferExternalId, saleResponse.getResourceExternalId()); @@ -145,7 +145,7 @@ public class ExternalAssetOwnerTransferTest extends BaseLoanIntegrationTest { protected PostInitiateTransferResponse createBuybackTransfer(Integer loanID, String settlementDate, String transferExternalId) { PostInitiateTransferResponse saleResponse = EXTERNAL_ASSET_OWNER_HELPER.initiateTransferByLoanId(loanID.longValue(), "buyback", - new PostInitiateTransferRequest().settlementDate(settlementDate).dateFormat("yyyy-MM-dd").locale("en") + new ExternalAssetOwnerRequest().settlementDate(settlementDate).dateFormat("yyyy-MM-dd").locale("en") .transferExternalId(transferExternalId)); assertEquals(transferExternalId, saleResponse.getResourceExternalId()); return saleResponse; diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/investor/externalassetowner/InitiateExternalAssetOwnerTransferTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/investor/externalassetowner/InitiateExternalAssetOwnerTransferTest.java index f1e5a2c1c..c733d696e 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/investor/externalassetowner/InitiateExternalAssetOwnerTransferTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/investor/externalassetowner/InitiateExternalAssetOwnerTransferTest.java @@ -55,13 +55,13 @@ import java.util.UUID; import lombok.RequiredArgsConstructor; import org.apache.fineract.accounting.common.AccountingConstants; import org.apache.fineract.accounting.journalentry.domain.JournalEntryType; +import org.apache.fineract.client.models.ExternalAssetOwnerRequest; import org.apache.fineract.client.models.ExternalOwnerJournalEntryData; import org.apache.fineract.client.models.ExternalOwnerTransferJournalEntryData; import org.apache.fineract.client.models.ExternalTransferData; import org.apache.fineract.client.models.GetFinancialActivityAccountsResponse; import org.apache.fineract.client.models.PageExternalTransferData; import org.apache.fineract.client.models.PostFinancialActivityAccountsRequest; -import org.apache.fineract.client.models.PostInitiateTransferRequest; import org.apache.fineract.client.models.PostInitiateTransferResponse; import org.apache.fineract.client.models.PostLoansLoanIdTransactionsRequest; import org.apache.fineract.client.models.PutGlobalConfigurationsRequest; @@ -1193,7 +1193,7 @@ public class InitiateExternalAssetOwnerTransferTest extends BaseLoanIntegrationT private PostInitiateTransferResponse createSaleTransfer(Integer loanID, String settlementDate, String transferExternalId, String transferExternalGroupId, String ownerExternalId, String purchasePriceRatio) { PostInitiateTransferResponse saleResponse = EXTERNAL_ASSET_OWNER_HELPER.initiateTransferByLoanId(loanID.longValue(), "sale", - new PostInitiateTransferRequest().settlementDate(settlementDate).dateFormat("yyyy-MM-dd").locale("en") + new ExternalAssetOwnerRequest().settlementDate(settlementDate).dateFormat("yyyy-MM-dd").locale("en") .transferExternalId(transferExternalId).transferExternalGroupId(transferExternalGroupId) .ownerExternalId(ownerExternalId).purchasePriceRatio(purchasePriceRatio)); assertEquals(transferExternalId, saleResponse.getResourceExternalId()); @@ -1207,7 +1207,7 @@ public class InitiateExternalAssetOwnerTransferTest extends BaseLoanIntegrationT private PostInitiateTransferResponse createBuybackTransfer(Integer loanID, String settlementDate, String transferExternalId) { PostInitiateTransferResponse saleResponse = EXTERNAL_ASSET_OWNER_HELPER.initiateTransferByLoanId(loanID.longValue(), "buyback", - new PostInitiateTransferRequest().settlementDate(settlementDate).dateFormat("yyyy-MM-dd").locale("en") + new ExternalAssetOwnerRequest().settlementDate(settlementDate).dateFormat("yyyy-MM-dd").locale("en") .transferExternalId(transferExternalId)); assertEquals(transferExternalId, saleResponse.getResourceExternalId()); return saleResponse;