diff --git a/fineract-core/src/main/java/org/apache/fineract/commands/domain/CommandWrapperConstants.java b/fineract-core/src/main/java/org/apache/fineract/commands/domain/CommandWrapperConstants.java index 46445159eb1..b99d79a58ad 100644 --- a/fineract-core/src/main/java/org/apache/fineract/commands/domain/CommandWrapperConstants.java +++ b/fineract-core/src/main/java/org/apache/fineract/commands/domain/CommandWrapperConstants.java @@ -179,7 +179,6 @@ private CommandWrapperConstants() {} public static final String ENTITY_CODE = "CODE"; public static final String ENTITY_HOOK = "HOOK"; public static final String ENTITY_CHARGE = "CHARGE"; - public static final String ENTITY_COLLATERAL_PRODUCT = "COLLATERAL_PRODUCT"; public static final String ENTITY_LOANPRODUCT = "LOANPRODUCT"; public static final String ENTITY_WORKINGCAPITALLOANPRODUCT = "WORKINGCAPITALLOANPRODUCT"; public static final String ENTITY_WORKINGCAPITALLOAN = "WORKINGCAPITALLOAN"; 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 62d4a43b2fc..8b07bfa0e88 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 @@ -166,7 +166,6 @@ import static org.apache.fineract.commands.domain.CommandWrapperConstants.ENTITY_CODE; import static org.apache.fineract.commands.domain.CommandWrapperConstants.ENTITY_CODEVALUE; import static org.apache.fineract.commands.domain.CommandWrapperConstants.ENTITY_COLLATERAL; -import static org.apache.fineract.commands.domain.CommandWrapperConstants.ENTITY_COLLATERAL_PRODUCT; import static org.apache.fineract.commands.domain.CommandWrapperConstants.ENTITY_COLLECTIONSHEET; import static org.apache.fineract.commands.domain.CommandWrapperConstants.ENTITY_CONFIGURATION; import static org.apache.fineract.commands.domain.CommandWrapperConstants.ENTITY_CREDITBUREAU_CONFIGURATION; @@ -677,14 +676,6 @@ public CommandWrapperBuilder createCharge() { return this; } - public CommandWrapperBuilder createCollateral() { - this.actionName = ACTION_CREATE; - this.entityId = null; - this.entityName = ENTITY_COLLATERAL_PRODUCT; - this.href = "/collateral-product"; - return this; - } - public CommandWrapperBuilder updateCharge(final Long chargeId) { this.actionName = ACTION_UPDATE; this.entityName = ENTITY_CHARGE; @@ -2285,14 +2276,6 @@ public CommandWrapperBuilder updateCollateral(final Long loanId, final Long coll return this; } - public CommandWrapperBuilder updateCollateralProduct(final Long collateralId) { - this.actionName = ACTION_UPDATE; - this.entityName = ENTITY_COLLATERAL_PRODUCT; - this.entityId = collateralId; - this.href = "/collateral-management/" + collateralId; - return this; - } - public CommandWrapperBuilder updateClientCollateralProduct(final Long clientId, final Long collateralId) { this.actionName = ACTION_UPDATE; this.entityName = ENTITY_CLIENT_COLLATERAL_PRODUCT; @@ -2320,14 +2303,6 @@ public CommandWrapperBuilder deleteCollateral(final Long loanId, final Long coll return this; } - public CommandWrapperBuilder deleteCollateralProduct(final Long collateralId) { - this.actionName = ACTION_DELETE; - this.entityName = ENTITY_COLLATERAL_PRODUCT; - this.entityId = collateralId; - this.href = "/collateral-management/" + collateralId; - return this; - } - public CommandWrapperBuilder deleteClientCollateralProduct(final Long collateralId, final Long clientId) { this.actionName = ACTION_DELETE; this.entityName = ENTITY_CLIENT_COLLATERAL_PRODUCT; diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/collateralmanagement/domain/CollateralManagementDomain.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/collateralmanagement/domain/CollateralManagementDomain.java index 30a958a1bfd..804d7ba529b 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/collateralmanagement/domain/CollateralManagementDomain.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/collateralmanagement/domain/CollateralManagementDomain.java @@ -28,17 +28,18 @@ import jakarta.persistence.Table; import java.math.BigDecimal; import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Set; -import org.apache.commons.lang3.StringUtils; -import org.apache.fineract.infrastructure.core.api.JsonCommand; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; import org.apache.fineract.organisation.monetary.domain.ApplicationCurrency; -import org.apache.fineract.portfolio.collateralmanagement.api.CollateralManagementJsonInputParams; @Entity @Table(name = "m_collateral_management") +@Getter +@Setter public class CollateralManagementDomain extends AbstractPersistableCustom { @Column(name = "name", length = 20, columnDefinition = " ") @@ -61,100 +62,21 @@ public class CollateralManagementDomain extends AbstractPersistableCustom private ApplicationCurrency currency; @OneToMany(mappedBy = "collateral", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) + @Setter(AccessLevel.NONE) private Set clientCollateralManagements = new HashSet<>(); - public CollateralManagementDomain() { - + protected CollateralManagementDomain() { + // for JPA } - private CollateralManagementDomain(final String quality, final BigDecimal basePrice, final String unitType, final BigDecimal pctToBase, - final ApplicationCurrency currency, final String name) { + @Builder + private CollateralManagementDomain(final String name, final String quality, final BigDecimal basePrice, final String unitType, + final BigDecimal pctToBase, final ApplicationCurrency currency) { + this.name = name; + this.quality = quality; this.basePrice = basePrice; - this.currency = currency; - this.pctToBase = pctToBase; this.unitType = unitType; - this.quality = quality; - this.name = name; - } - - public static CollateralManagementDomain createNew(JsonCommand jsonCommand, final ApplicationCurrency applicationCurrency) { - String quality = jsonCommand.stringValueOfParameterNamed("quality"); - BigDecimal basePrice = jsonCommand.bigDecimalValueOfParameterNamed("basePrice"); - BigDecimal pctToBase = jsonCommand.bigDecimalValueOfParameterNamedDefaultToNullIfZero("pctToBase"); - String unitType = jsonCommand.stringValueOfParameterNamed("unitType"); - String name = jsonCommand.stringValueOfParameterNamed("name"); - return new CollateralManagementDomain(quality, basePrice, unitType, pctToBase, applicationCurrency, name); - } - - public Map update(final JsonCommand command, final ApplicationCurrency applicationCurrency) { - final Map changes = new LinkedHashMap<>(5); - final String nameParamName = CollateralManagementJsonInputParams.NAME.getValue(); - - if (command.isChangeInStringParameterNamed(nameParamName, this.name)) { - final String newValue = command.stringValueOfParameterNamed(nameParamName); - this.name = StringUtils.defaultIfEmpty(newValue, null); - changes.put(nameParamName, this.name); - } - - final String qualityParamName = CollateralManagementJsonInputParams.QUALITY.getValue(); - if (command.isChangeInStringParameterNamed(qualityParamName, this.quality)) { - final String newValue = command.stringValueOfParameterNamed(qualityParamName); - this.quality = newValue; - changes.put(qualityParamName, this.quality); - } - - final String unitTypeParamName = CollateralManagementJsonInputParams.UNIT_TYPE.getValue(); - if (command.isChangeInStringParameterNamed(unitTypeParamName, this.unitType)) { - final String newValue = command.stringValueOfParameterNamed(unitTypeParamName); - this.unitType = newValue; - changes.put(unitTypeParamName, this.unitType); - } - - this.currency = applicationCurrency; - - final String basePriceParamName = CollateralManagementJsonInputParams.BASE_PRICE.getValue(); - if (command.isChangeInBigDecimalParameterNamed(basePriceParamName, this.basePrice)) { - final BigDecimal newValue = command.bigDecimalValueOfParameterNamed(basePriceParamName); - this.basePrice = newValue; - changes.put(basePriceParamName, this.basePrice); - } - - final String pctToBaseParamName = CollateralManagementJsonInputParams.PCT_TO_BASE.getValue(); - if (command.isChangeInBigDecimalParameterNamed(pctToBaseParamName, this.pctToBase)) { - final BigDecimal newValue = command.bigDecimalValueOfParameterNamed(pctToBaseParamName); - this.pctToBase = newValue; - changes.put(pctToBaseParamName, this.pctToBase); - } - - return changes; - } - - public String getQuality() { - return this.quality; - } - - public String getUnitType() { - return this.unitType; - } - - public ApplicationCurrency getCurrency() { - return this.currency; - } - - public BigDecimal getBasePrice() { - return this.basePrice; - } - - public BigDecimal getPctToBase() { - return this.pctToBase; - } - - public String getName() { - return this.name; - } - - public Set getClientCollateralManagements() { - return this.clientCollateralManagements; + this.pctToBase = pctToBase; + this.currency = currency; } - } 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 1e4cf99a8fa..3b578df6398 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 @@ -295,6 +295,19 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_WRITE, "UPDATE_STAFFIMAGE") .requestMatchers(API_MATCHER.matcher(HttpMethod.DELETE, "/api/*/staff/*/images")) .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_WRITE, "DELETE_STAFFIMAGE") + // collateral: products + .requestMatchers(API_MATCHER.matcher(HttpMethod.GET, "/api/*/collateral-management")) + .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_READ, "READ_COLLATERAL_PRODUCT") + .requestMatchers(API_MATCHER.matcher(HttpMethod.GET, "/api/*/collateral-management/template")) + .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_READ, "READ_COLLATERAL_PRODUCT") + .requestMatchers(API_MATCHER.matcher(HttpMethod.GET, "/api/*/collateral-management/*")) + .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_READ, "READ_COLLATERAL_PRODUCT") + .requestMatchers(API_MATCHER.matcher(HttpMethod.POST, "/api/*/collateral-management")) + .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_WRITE, "CREATE_COLLATERAL_PRODUCT") + .requestMatchers(API_MATCHER.matcher(HttpMethod.PUT, "/api/*/collateral-management/*")) + .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_WRITE, "UPDATE_COLLATERAL_PRODUCT") + .requestMatchers(API_MATCHER.matcher(HttpMethod.DELETE, "/api/*/collateral-management/*")) + .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_WRITE, "DELETE_COLLATERAL_PRODUCT") // bulk import .requestMatchers(API_MATCHER.matcher(HttpMethod.GET, "/api/*/import")) .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_READ, "READ_IMPORT") diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/api/CollateralManagementApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/api/CollateralManagementApiResource.java index cb54ba1ecd7..fc33c590b05 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/api/CollateralManagementApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/api/CollateralManagementApiResource.java @@ -20,11 +20,8 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.parameters.RequestBody; -import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; import jakarta.ws.rs.Consumes; import jakarta.ws.rs.DELETE; import jakarta.ws.rs.GET; @@ -36,71 +33,58 @@ import jakarta.ws.rs.core.MediaType; import java.util.List; 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.DefaultToApiJsonSerializer; -import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; +import org.apache.fineract.command.core.CommandDispatcher; import org.apache.fineract.organisation.monetary.data.CurrencyData; import org.apache.fineract.organisation.monetary.service.CurrencyReadPlatformService; +import org.apache.fineract.portfolio.collateralmanagement.command.CollateralProductCreateCommand; +import org.apache.fineract.portfolio.collateralmanagement.command.CollateralProductDeleteCommand; +import org.apache.fineract.portfolio.collateralmanagement.command.CollateralProductUpdateCommand; import org.apache.fineract.portfolio.collateralmanagement.data.CollateralManagementData; -import org.apache.fineract.portfolio.collateralmanagement.data.CollateralManagementProductRequest; -import org.apache.fineract.portfolio.collateralmanagement.data.CollateralProductRequest; -import org.apache.fineract.portfolio.collateralmanagement.service.CollateralManagementReadPlatformService; +import org.apache.fineract.portfolio.collateralmanagement.data.CollateralProductCreateRequest; +import org.apache.fineract.portfolio.collateralmanagement.data.CollateralProductCreateResponse; +import org.apache.fineract.portfolio.collateralmanagement.data.CollateralProductDeleteRequest; +import org.apache.fineract.portfolio.collateralmanagement.data.CollateralProductDeleteResponse; +import org.apache.fineract.portfolio.collateralmanagement.data.CollateralProductUpdateRequest; +import org.apache.fineract.portfolio.collateralmanagement.data.CollateralProductUpdateResponse; +import org.apache.fineract.portfolio.collateralmanagement.service.CollateralManagementReadService; import org.springframework.stereotype.Component; @Path("/v1/collateral-management") @Component @Tag(name = "Collateral Management", description = "Collateral Management is for managing collateral operations") @RequiredArgsConstructor +@Consumes({ MediaType.APPLICATION_JSON }) +@Produces({ MediaType.APPLICATION_JSON }) public class CollateralManagementApiResource { - private final DefaultToApiJsonSerializer apiJsonSerializerService; - private final DefaultToApiJsonSerializer apiJsonSerializerServiceForCurrency; - private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; - private final PlatformSecurityContext context; - private final CollateralManagementReadPlatformService collateralManagementReadPlatformService; + private final CommandDispatcher dispatcher; + private final CollateralManagementReadService collateralManagementReadService; private final CurrencyReadPlatformService currencyReadPlatformService; @POST - @Consumes({ MediaType.APPLICATION_JSON }) - @Produces({ MediaType.APPLICATION_JSON }) @Operation(summary = "Create a new collateral", description = "Collateral Creation") - @RequestBody(required = true, content = @Content(schema = @Schema(implementation = CollateralManagementProductRequest.class))) - @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = CollateralManagementApiResourceSwagger.PostCollateralManagementProductResponse.class))) - public CommandProcessingResult createCollateral( - @Parameter(hidden = true) final CollateralManagementProductRequest collateralManagementProductRequest) { - final CommandWrapper commandWrapper = new CommandWrapperBuilder().createCollateral() - .withJson(apiJsonSerializerService.serialize(collateralManagementProductRequest)).build(); - return this.commandsSourceWritePlatformService.logCommandSource(commandWrapper); + public CollateralProductCreateResponse createCollateral(@Valid CollateralProductCreateRequest request) { + final var command = new CollateralProductCreateCommand(); + command.setPayload(request); + return dispatcher.dispatch(command).get(); } @GET @Path("{collateralId}") - @Produces({ MediaType.APPLICATION_JSON }) @Operation(summary = "Get Collateral", description = "Fetch Collateral") public CollateralManagementData getCollateral( @PathParam("collateralId") @Parameter(description = "collateralId") final Long collateralId) { - - this.context.authenticatedUser() - .validateHasReadPermission(CollateralManagementJsonInputParams.COLLATERAL_PRODUCT_READ_PERMISSION.getValue()); - - return this.collateralManagementReadPlatformService.getCollateralProduct(collateralId); + return collateralManagementReadService.getCollateralProduct(collateralId); } @GET - @Produces({ MediaType.APPLICATION_JSON }) @Operation(summary = "Get All Collaterals", description = "Fetch all Collateral Products") public List getAllCollaterals() { - this.context.authenticatedUser() - .validateHasReadPermission(CollateralManagementJsonInputParams.COLLATERAL_PRODUCT_READ_PERMISSION.getValue()); - return this.collateralManagementReadPlatformService.getAllCollateralProducts(); + return collateralManagementReadService.getAllCollateralProducts(); } @GET @Path("template") - @Produces({ MediaType.APPLICATION_JSON }) @Operation(summary = "Get Collateral Template", description = "Get Collateral Template") public List getCollateralTemplate() { return currencyReadPlatformService.retrieveAllPlatformCurrencies(); @@ -108,31 +92,24 @@ public List getCollateralTemplate() { @PUT @Path("{collateralId}") - @Consumes({ MediaType.APPLICATION_JSON }) - @Produces({ MediaType.APPLICATION_JSON }) @Operation(summary = "Update Collateral", description = "Update Collateral") - @RequestBody(required = true, content = @Content(schema = @Schema(implementation = CollateralProductRequest.class))) - @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = CollateralManagementApiResourceSwagger.PutCollateralProductResponse.class))) - public CommandProcessingResult updateCollateral( + public CollateralProductUpdateResponse updateCollateral( @PathParam("collateralId") @Parameter(description = "collateralId") final Long collateralId, - @Parameter(hidden = true) final CollateralProductRequest collateralProductRequest) { - final CommandWrapper commandWrapper = new CommandWrapperBuilder().updateCollateralProduct(collateralId) - .withJson(apiJsonSerializerService.serialize(collateralProductRequest)).build(); - - return this.commandsSourceWritePlatformService.logCommandSource(commandWrapper); + @Valid CollateralProductUpdateRequest request) { + request.setCollateralId(collateralId); + final var command = new CollateralProductUpdateCommand(); + command.setPayload(request); + return dispatcher.dispatch(command).get(); } @DELETE @Path("{collateralId}") - @Produces({ MediaType.APPLICATION_JSON }) @Operation(summary = "Delete a Collateral", description = "Delete Collateral") - @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = CollateralManagementApiResourceSwagger.DeleteCollateralProductResponse.class))) - public CommandProcessingResult deleteCollateral( + public CollateralProductDeleteResponse deleteCollateral( @PathParam("collateralId") @Parameter(description = "collateralId") final Long collateralId) { - - final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteCollateralProduct(collateralId).build(); - - return this.commandsSourceWritePlatformService.logCommandSource(commandRequest); + final var request = CollateralProductDeleteRequest.builder().collateralId(collateralId).build(); + final var command = new CollateralProductDeleteCommand(); + command.setPayload(request); + return dispatcher.dispatch(command).get(); } - } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/api/CollateralManagementApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/api/CollateralManagementApiResourceSwagger.java deleted file mode 100644 index 3da0c89f236..00000000000 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/api/CollateralManagementApiResourceSwagger.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.portfolio.collateralmanagement.api; - -import io.swagger.v3.oas.annotations.media.Schema; -import org.apache.fineract.portfolio.collateralmanagement.data.CollateralProductRequest; - -final class CollateralManagementApiResourceSwagger { - - private CollateralManagementApiResourceSwagger() {} - - @Schema(description = "PostCollateralManagementProductResponse") - public static final class PostCollateralManagementProductResponse { - - private PostCollateralManagementProductResponse() {} - - @Schema(example = "14") - public Long resourceId; - } - - @Schema(description = "PutCollateralProductResponse") - public static final class PutCollateralProductResponse { - - private PutCollateralProductResponse() {} - - @Schema(example = "12") - public Long resourceId; - public CollateralProductRequest changes; - } - - @Schema(description = "DeleteCollateralProductResponse") - public static final class DeleteCollateralProductResponse { - - private DeleteCollateralProductResponse() {} - - @Schema(example = "12") - public Long resourceId; - } -} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/CollateralManagementWritePlatformService.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/command/CollateralProductCreateCommand.java similarity index 62% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/CollateralManagementWritePlatformService.java rename to fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/command/CollateralProductCreateCommand.java index ca55c622da9..1adf4b6179e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/CollateralManagementWritePlatformService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/command/CollateralProductCreateCommand.java @@ -16,16 +16,13 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.fineract.portfolio.collateralmanagement.service; +package org.apache.fineract.portfolio.collateralmanagement.command; -import org.apache.fineract.infrastructure.core.api.JsonCommand; -import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.fineract.command.core.Command; +import org.apache.fineract.portfolio.collateralmanagement.data.CollateralProductCreateRequest; -public interface CollateralManagementWritePlatformService { - - CommandProcessingResult createCollateral(JsonCommand command); - - CommandProcessingResult updateCollateral(Long collateralId, JsonCommand command); - - CommandProcessingResult deleteCollateral(Long collateralId); -} +@Data +@EqualsAndHashCode(callSuper = true) +public class CollateralProductCreateCommand extends Command {} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/command/CollateralProductDeleteCommand.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/command/CollateralProductDeleteCommand.java new file mode 100644 index 00000000000..1d6fa91e5c9 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/command/CollateralProductDeleteCommand.java @@ -0,0 +1,28 @@ +/** + * 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.portfolio.collateralmanagement.command; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.fineract.command.core.Command; +import org.apache.fineract.portfolio.collateralmanagement.data.CollateralProductDeleteRequest; + +@Data +@EqualsAndHashCode(callSuper = true) +public class CollateralProductDeleteCommand extends Command {} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/command/CollateralProductUpdateCommand.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/command/CollateralProductUpdateCommand.java new file mode 100644 index 00000000000..facbeba45ea --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/command/CollateralProductUpdateCommand.java @@ -0,0 +1,28 @@ +/** + * 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.portfolio.collateralmanagement.command; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.fineract.command.core.Command; +import org.apache.fineract.portfolio.collateralmanagement.data.CollateralProductUpdateRequest; + +@Data +@EqualsAndHashCode(callSuper = true) +public class CollateralProductUpdateCommand extends Command {} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/CollateralProductCreateRequest.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/CollateralProductCreateRequest.java new file mode 100644 index 00000000000..b5853f30eed --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/CollateralProductCreateRequest.java @@ -0,0 +1,63 @@ +/** + * 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.portfolio.collateralmanagement.data; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CollateralProductCreateRequest implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @NotBlank + private String name; + + @NotBlank + private String quality; + + @NotNull + @Positive + private BigDecimal basePrice; + + @NotNull + @Positive + private BigDecimal pctToBase; + + @NotBlank + private String unitType; + + @NotBlank + private String currency; + + @NotBlank + private String locale; +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/CollateralProductRequest.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/CollateralProductCreateResponse.java similarity index 82% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/CollateralProductRequest.java rename to fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/CollateralProductCreateResponse.java index 066ad0a5e49..f6f087c2698 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/CollateralProductRequest.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/CollateralProductCreateResponse.java @@ -20,11 +20,15 @@ import java.io.Serial; import java.io.Serializable; -import java.math.BigDecimal; +import lombok.Builder; +import lombok.Data; -public record CollateralProductRequest(String quality, BigDecimal basePrice, BigDecimal pctToBase, String unitType, String name, - String currency) implements Serializable { +@Data +@Builder +public class CollateralProductCreateResponse implements Serializable { @Serial private static final long serialVersionUID = 1L; + + private Long resourceId; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/CollateralProductDeleteRequest.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/CollateralProductDeleteRequest.java new file mode 100644 index 00000000000..82eb2698a3a --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/CollateralProductDeleteRequest.java @@ -0,0 +1,42 @@ +/** + * 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.portfolio.collateralmanagement.data; + +import io.swagger.v3.oas.annotations.Hidden; +import jakarta.validation.constraints.NotNull; +import java.io.Serial; +import java.io.Serializable; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CollateralProductDeleteRequest implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Hidden + @NotNull + private Long collateralId; +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/CollateralManagementProductRequest.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/CollateralProductDeleteResponse.java similarity index 80% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/CollateralManagementProductRequest.java rename to fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/CollateralProductDeleteResponse.java index 29663057ffc..e7df5b7580c 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/CollateralManagementProductRequest.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/CollateralProductDeleteResponse.java @@ -20,11 +20,15 @@ import java.io.Serial; import java.io.Serializable; -import java.math.BigDecimal; +import lombok.Builder; +import lombok.Data; -public record CollateralManagementProductRequest(String quality, BigDecimal basePrice, BigDecimal pctToBase, String unitType, String name, - String currency, String locale) implements Serializable { +@Data +@Builder +public class CollateralProductDeleteResponse implements Serializable { @Serial private static final long serialVersionUID = 1L; + + private Long resourceId; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/CollateralProductUpdateRequest.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/CollateralProductUpdateRequest.java new file mode 100644 index 00000000000..cb11883517c --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/CollateralProductUpdateRequest.java @@ -0,0 +1,58 @@ +/** + * 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.portfolio.collateralmanagement.data; + +import io.swagger.v3.oas.annotations.Hidden; +import jakarta.validation.constraints.Positive; +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CollateralProductUpdateRequest implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Hidden + private Long collateralId; + + private String name; + + private String quality; + + @Positive + private BigDecimal basePrice; + + @Positive + private BigDecimal pctToBase; + + private String unitType; + + private String currency; + + private String locale; +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/CollateralProductUpdateResponse.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/CollateralProductUpdateResponse.java new file mode 100644 index 00000000000..2ab854b1dc9 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/CollateralProductUpdateResponse.java @@ -0,0 +1,59 @@ +/** + * 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.portfolio.collateralmanagement.data; + +import io.swagger.v3.oas.annotations.media.Schema; +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class CollateralProductUpdateResponse implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private Long resourceId; + + private Changes changes; + + @Data + @Builder + @Schema(name = "CollateralProductUpdateChanges") + public static class Changes implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private String name; + + private String quality; + + private BigDecimal basePrice; + + private String unitType; + + private BigDecimal pctToBase; + + private String currency; + } +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/CollateralProductCreateCommandHandler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/CollateralProductCreateCommandHandler.java new file mode 100644 index 00000000000..c8d6d398d9a --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/CollateralProductCreateCommandHandler.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.portfolio.collateralmanagement.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.portfolio.collateralmanagement.data.CollateralProductCreateRequest; +import org.apache.fineract.portfolio.collateralmanagement.data.CollateralProductCreateResponse; +import org.apache.fineract.portfolio.collateralmanagement.service.CollateralManagementWriteService; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +@Slf4j +@Component +@RequiredArgsConstructor +public class CollateralProductCreateCommandHandler + implements CommandHandler { + + private final CollateralManagementWriteService writeService; + + @Retry(name = "commandCollateralProductCreate", fallbackMethod = "fallback") + @Override + @Transactional + public CollateralProductCreateResponse handle(Command command) { + return writeService.createCollateralProduct(command.getPayload()); + } + + @Override + public CollateralProductCreateResponse fallback(Command command, Throwable t) { + return CommandHandler.super.fallback(command, t); + } +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/CollateralProductDeleteCommandHandler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/CollateralProductDeleteCommandHandler.java new file mode 100644 index 00000000000..24d4fbc7788 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/CollateralProductDeleteCommandHandler.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.portfolio.collateralmanagement.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.portfolio.collateralmanagement.data.CollateralProductDeleteRequest; +import org.apache.fineract.portfolio.collateralmanagement.data.CollateralProductDeleteResponse; +import org.apache.fineract.portfolio.collateralmanagement.service.CollateralManagementWriteService; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +@Slf4j +@Component +@RequiredArgsConstructor +public class CollateralProductDeleteCommandHandler + implements CommandHandler { + + private final CollateralManagementWriteService writeService; + + @Retry(name = "commandCollateralProductDelete", fallbackMethod = "fallback") + @Override + @Transactional + public CollateralProductDeleteResponse handle(Command command) { + return writeService.deleteCollateralProduct(command.getPayload()); + } + + @Override + public CollateralProductDeleteResponse fallback(Command command, Throwable t) { + return CommandHandler.super.fallback(command, t); + } +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/CollateralProductUpdateCommandHandler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/CollateralProductUpdateCommandHandler.java new file mode 100644 index 00000000000..1a6c487e3ac --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/CollateralProductUpdateCommandHandler.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.portfolio.collateralmanagement.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.portfolio.collateralmanagement.data.CollateralProductUpdateRequest; +import org.apache.fineract.portfolio.collateralmanagement.data.CollateralProductUpdateResponse; +import org.apache.fineract.portfolio.collateralmanagement.service.CollateralManagementWriteService; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +@Slf4j +@Component +@RequiredArgsConstructor +public class CollateralProductUpdateCommandHandler + implements CommandHandler { + + private final CollateralManagementWriteService writeService; + + @Retry(name = "commandCollateralProductUpdate", fallbackMethod = "fallback") + @Override + @Transactional + public CollateralProductUpdateResponse handle(Command command) { + return writeService.updateCollateralProduct(command.getPayload()); + } + + @Override + public CollateralProductUpdateResponse fallback(Command command, Throwable t) { + return CommandHandler.super.fallback(command, t); + } +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/CreateCollateralProductCommandHandler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/CreateCollateralProductCommandHandler.java deleted file mode 100644 index 1d151d8ba08..00000000000 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/CreateCollateralProductCommandHandler.java +++ /dev/null @@ -1,46 +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.portfolio.collateralmanagement.handler; - -import jakarta.transaction.Transactional; -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.portfolio.collateralmanagement.service.CollateralManagementWritePlatformService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -@CommandType(entity = "COLLATERAL_PRODUCT", action = "CREATE") -public class CreateCollateralProductCommandHandler implements NewCommandSourceHandler { - - private final CollateralManagementWritePlatformService collateralManagementWritePlatformService; - - @Autowired - public CreateCollateralProductCommandHandler(final CollateralManagementWritePlatformService collateralManagementWritePlatformService) { - this.collateralManagementWritePlatformService = collateralManagementWritePlatformService; - } - - @Transactional - @Override - public CommandProcessingResult processCommand(final JsonCommand jsonCommand) { - return this.collateralManagementWritePlatformService.createCollateral(jsonCommand); - } -} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/DeleteCollateralProductHandler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/DeleteCollateralProductHandler.java deleted file mode 100644 index f08befee0f5..00000000000 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/DeleteCollateralProductHandler.java +++ /dev/null @@ -1,46 +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.portfolio.collateralmanagement.handler; - -import jakarta.transaction.Transactional; -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.portfolio.collateralmanagement.service.CollateralManagementWritePlatformService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -@CommandType(entity = "COLLATERAL_PRODUCT", action = "DELETE") -public class DeleteCollateralProductHandler implements NewCommandSourceHandler { - - private final CollateralManagementWritePlatformService collateralManagementWritePlatformService; - - @Autowired - public DeleteCollateralProductHandler(final CollateralManagementWritePlatformService collateralManagementWritePlatformService) { - this.collateralManagementWritePlatformService = collateralManagementWritePlatformService; - } - - @Transactional - @Override - public CommandProcessingResult processCommand(JsonCommand command) { - return this.collateralManagementWritePlatformService.deleteCollateral(command.entityId()); - } -} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/UpdateCollateralProductCommandHandler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/UpdateCollateralProductCommandHandler.java deleted file mode 100644 index 90715d6b664..00000000000 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/UpdateCollateralProductCommandHandler.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.portfolio.collateralmanagement.handler; - -import jakarta.transaction.Transactional; -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.portfolio.collateralmanagement.service.CollateralManagementWritePlatformService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -@CommandType(entity = "COLLATERAL_PRODUCT", action = "UPDATE") -public class UpdateCollateralProductCommandHandler implements NewCommandSourceHandler { - - private final CollateralManagementWritePlatformService collateralManagementWritePlatformService; - - @Autowired - public UpdateCollateralProductCommandHandler(final CollateralManagementWritePlatformService collateralManagementWritePlatformService) { - this.collateralManagementWritePlatformService = collateralManagementWritePlatformService; - } - - @Transactional - @Override - public CommandProcessingResult processCommand(final JsonCommand command) { - return this.collateralManagementWritePlatformService.updateCollateral(command.entityId(), command); - } - -} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/CollateralManagementReadPlatformService.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/CollateralManagementReadService.java similarity index 95% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/CollateralManagementReadPlatformService.java rename to fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/CollateralManagementReadService.java index 36532c9d2a5..cca640e9a28 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/CollateralManagementReadPlatformService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/CollateralManagementReadService.java @@ -21,7 +21,7 @@ import java.util.List; import org.apache.fineract.portfolio.collateralmanagement.data.CollateralManagementData; -public interface CollateralManagementReadPlatformService { +public interface CollateralManagementReadService { CollateralManagementData getCollateralProduct(Long collateralId); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/CollateralManagementReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/CollateralManagementReadServiceImpl.java similarity index 90% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/CollateralManagementReadPlatformServiceImpl.java rename to fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/CollateralManagementReadServiceImpl.java index 47432cee6bb..b630432a95d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/CollateralManagementReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/CollateralManagementReadServiceImpl.java @@ -21,15 +21,13 @@ import java.util.ArrayList; import java.util.List; import lombok.RequiredArgsConstructor; -import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.portfolio.collateralmanagement.data.CollateralManagementData; import org.apache.fineract.portfolio.collateralmanagement.domain.CollateralManagementDomain; import org.apache.fineract.portfolio.collateralmanagement.domain.CollateralManagementRepositoryWrapper; @RequiredArgsConstructor -public class CollateralManagementReadPlatformServiceImpl implements CollateralManagementReadPlatformService { +public class CollateralManagementReadServiceImpl implements CollateralManagementReadService { - private final PlatformSecurityContext context; private final CollateralManagementRepositoryWrapper collateralManagementRepositoryWrapper; @Override diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/CollateralManagementWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/CollateralManagementWritePlatformServiceImpl.java deleted file mode 100644 index cc8467be6eb..00000000000 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/CollateralManagementWritePlatformServiceImpl.java +++ /dev/null @@ -1,175 +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.portfolio.collateralmanagement.service; - -import com.google.gson.JsonElement; -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import lombok.RequiredArgsConstructor; -import org.apache.fineract.infrastructure.core.api.JsonCommand; -import org.apache.fineract.infrastructure.core.data.ApiParameterError; -import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; -import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; -import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder; -import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; -import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; -import org.apache.fineract.organisation.monetary.domain.ApplicationCurrency; -import org.apache.fineract.organisation.monetary.domain.ApplicationCurrencyRepository; -import org.apache.fineract.portfolio.collateralmanagement.api.CollateralManagementJsonInputParams; -import org.apache.fineract.portfolio.collateralmanagement.domain.ClientCollateralManagement; -import org.apache.fineract.portfolio.collateralmanagement.domain.CollateralManagementDomain; -import org.apache.fineract.portfolio.collateralmanagement.domain.CollateralManagementRepositoryWrapper; -import org.apache.fineract.portfolio.collateralmanagement.exception.CollateralCannotBeDeletedException; -import org.apache.fineract.portfolio.collateralmanagement.exception.CollateralNotFoundException; -import org.springframework.transaction.annotation.Transactional; - -@RequiredArgsConstructor -public class CollateralManagementWritePlatformServiceImpl implements CollateralManagementWritePlatformService { - - private final CollateralManagementRepositoryWrapper collateralManagementRepositoryWrapper; - private final ApplicationCurrencyRepository applicationCurrencyRepository; - private final FromJsonHelper fromApiJsonHelper; - - @Transactional - @Override - public CommandProcessingResult createCollateral(final JsonCommand jsonCommand) { - validateForCreation(jsonCommand); - final String currencyParamName = jsonCommand.stringValueOfParameterNamed(CollateralManagementJsonInputParams.CURRENCY.getValue()); - final ApplicationCurrency applicationCurrency = this.applicationCurrencyRepository.findOneByCode(currencyParamName); - - final CollateralManagementDomain collateral = CollateralManagementDomain.createNew(jsonCommand, applicationCurrency); - this.collateralManagementRepositoryWrapper.create(collateral); - return new CommandProcessingResultBuilder() // - .withCommandId(jsonCommand.commandId()) // - .withEntityId(collateral.getId()) // - .build(); - } - - private void validateForCreation(JsonCommand jsonCommand) { - final JsonElement jsonElement = this.fromApiJsonHelper.parse(jsonCommand.json()); - final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("collateral-management"); - - if (!jsonCommand.parameterExists("locale")) { - baseDataValidator.reset().parameter("locale").notNull().failWithCode("locale.not.exists"); - } else { - final String locale = this.fromApiJsonHelper.extractStringNamed("locale", jsonElement); - baseDataValidator.reset().parameter("locale").value(locale).notNull(); - } - - if (!jsonCommand.parameterExists(CollateralManagementJsonInputParams.CURRENCY.getValue())) { - baseDataValidator.reset().parameter(CollateralManagementJsonInputParams.CURRENCY.getValue()).notNull() - .failWithCode("currency.not.exists"); - } else { - final String currency = this.fromApiJsonHelper.extractStringNamed("currency", jsonElement); - baseDataValidator.reset().parameter("currency").value(currency).notNull(); - } - - if (!jsonCommand.parameterExists("quality")) { - baseDataValidator.reset().parameter(CollateralManagementJsonInputParams.QUALITY.getValue()).notNull() - .failWithCode("quality.not.exists"); - } else { - final String quality = this.fromApiJsonHelper.extractStringNamed("quality", jsonElement); - baseDataValidator.reset().parameter("quality").value(quality).notNull(); - } - - if (!jsonCommand.parameterExists("basePrice")) { - baseDataValidator.reset().parameter("basePrice").notNull().notBlank().failWithCode("basePrice.not.exists"); - } else { - final BigDecimal basePrice = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("basePrice", jsonElement); - baseDataValidator.reset().parameter("basePrice").value(basePrice).notNull().positiveAmount(); - } - - if (!jsonCommand.parameterExists("unitType")) { - baseDataValidator.reset().parameter("unitType").notNull().notBlank().failWithCode("unitType.not.exists"); - } else { - final String unitType = this.fromApiJsonHelper.extractStringNamed("unitType", jsonElement); - baseDataValidator.reset().parameter("unitType").value(unitType).notNull(); - } - - if (!jsonCommand.parameterExists("pctToBase")) { - baseDataValidator.reset().parameter("pctToBase").notNull().notBlank().failWithCode("pctToBase.not.exists"); - } else { - final BigDecimal basePrice = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("pctToBase", jsonElement); - baseDataValidator.reset().parameter("pctToBase").value(basePrice).notNull().positiveAmount(); - } - - if (!jsonCommand.parameterExists("name")) { - baseDataValidator.reset().parameter("name").notNull().notBlank().failWithCode("name.not.exists"); - } else { - final String unitType = this.fromApiJsonHelper.extractStringNamed("name", jsonElement); - baseDataValidator.reset().parameter("name").value(unitType).notNull(); - } - - if (!dataValidationErrors.isEmpty()) { - throw new PlatformApiDataValidationException(dataValidationErrors); - } - } - - @Transactional - @Override - public CommandProcessingResult updateCollateral(final Long collateralId, JsonCommand jsonCommand) { - final CollateralManagementDomain collateral = this.collateralManagementRepositoryWrapper.getCollateral(collateralId); - final String currencyParamName = CollateralManagementJsonInputParams.CURRENCY.getValue(); - final ApplicationCurrency applicationCurrency = this.applicationCurrencyRepository - .findOneByCode(jsonCommand.stringValueOfParameterNamed(currencyParamName)); - if (jsonCommand.isChangeInStringParameterNamed(currencyParamName, applicationCurrency.getCode())) { - final String newValue = jsonCommand.stringValueOfParameterNamed(currencyParamName); - applicationCurrency.setCode(newValue); - } - final Map changes = collateral.update(jsonCommand, applicationCurrency); - this.collateralManagementRepositoryWrapper.update(collateral); - return new CommandProcessingResultBuilder() // - .withCommandId(jsonCommand.commandId()) // - .withEntityId(jsonCommand.entityId()) // - .with(changes) // - .build(); - } - - @Transactional - @Override - public CommandProcessingResult deleteCollateral(final Long collateralId) { - final CollateralManagementDomain collateralManagementDomain = this.collateralManagementRepositoryWrapper - .getCollateral(collateralId); - validateForDeletion(collateralManagementDomain, collateralId); - this.collateralManagementRepositoryWrapper.delete(collateralId); - return new CommandProcessingResultBuilder() // - .withEntityId(collateralId) // - .build(); - } - - private void validateForDeletion(final CollateralManagementDomain collateralManagementDomain, final Long collateralId) { - if (collateralManagementDomain == null) { - throw new CollateralNotFoundException(collateralId); - } - - if (collateralManagementDomain.getClientCollateralManagements().size() > 0) { - for (ClientCollateralManagement clientCollateralManagement : collateralManagementDomain.getClientCollateralManagements()) { - if (clientCollateralManagement.getQuantity().compareTo(BigDecimal.ZERO) > 0) { - throw new CollateralCannotBeDeletedException( - CollateralCannotBeDeletedException.CollateralCannotBeDeletedReason.COLLATERAL_IS_ALREADY_ATTACHED, - collateralId); - } - } - } - } - -} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/CollateralManagementWriteService.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/CollateralManagementWriteService.java new file mode 100644 index 00000000000..15a01a6766d --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/CollateralManagementWriteService.java @@ -0,0 +1,35 @@ +/** + * 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.portfolio.collateralmanagement.service; + +import org.apache.fineract.portfolio.collateralmanagement.data.CollateralProductCreateRequest; +import org.apache.fineract.portfolio.collateralmanagement.data.CollateralProductCreateResponse; +import org.apache.fineract.portfolio.collateralmanagement.data.CollateralProductDeleteRequest; +import org.apache.fineract.portfolio.collateralmanagement.data.CollateralProductDeleteResponse; +import org.apache.fineract.portfolio.collateralmanagement.data.CollateralProductUpdateRequest; +import org.apache.fineract.portfolio.collateralmanagement.data.CollateralProductUpdateResponse; + +public interface CollateralManagementWriteService { + + CollateralProductCreateResponse createCollateralProduct(CollateralProductCreateRequest request); + + CollateralProductUpdateResponse updateCollateralProduct(CollateralProductUpdateRequest request); + + CollateralProductDeleteResponse deleteCollateralProduct(CollateralProductDeleteRequest request); +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/CollateralManagementWriteServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/CollateralManagementWriteServiceImpl.java new file mode 100644 index 00000000000..7a5f79ccfbc --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/CollateralManagementWriteServiceImpl.java @@ -0,0 +1,130 @@ +/** + * 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.portfolio.collateralmanagement.service; + +import java.math.BigDecimal; +import java.util.Objects; +import lombok.RequiredArgsConstructor; +import org.apache.fineract.organisation.monetary.domain.ApplicationCurrency; +import org.apache.fineract.organisation.monetary.domain.ApplicationCurrencyRepository; +import org.apache.fineract.portfolio.collateralmanagement.data.CollateralProductCreateRequest; +import org.apache.fineract.portfolio.collateralmanagement.data.CollateralProductCreateResponse; +import org.apache.fineract.portfolio.collateralmanagement.data.CollateralProductDeleteRequest; +import org.apache.fineract.portfolio.collateralmanagement.data.CollateralProductDeleteResponse; +import org.apache.fineract.portfolio.collateralmanagement.data.CollateralProductUpdateRequest; +import org.apache.fineract.portfolio.collateralmanagement.data.CollateralProductUpdateResponse; +import org.apache.fineract.portfolio.collateralmanagement.data.CollateralProductUpdateResponse.Changes; +import org.apache.fineract.portfolio.collateralmanagement.domain.ClientCollateralManagement; +import org.apache.fineract.portfolio.collateralmanagement.domain.CollateralManagementDomain; +import org.apache.fineract.portfolio.collateralmanagement.domain.CollateralManagementRepositoryWrapper; +import org.apache.fineract.portfolio.collateralmanagement.exception.CollateralCannotBeDeletedException; +import org.apache.fineract.portfolio.collateralmanagement.exception.CollateralNotFoundException; + +@RequiredArgsConstructor +public class CollateralManagementWriteServiceImpl implements CollateralManagementWriteService { + + private final CollateralManagementRepositoryWrapper collateralManagementRepositoryWrapper; + private final ApplicationCurrencyRepository applicationCurrencyRepository; + + @Override + public CollateralProductCreateResponse createCollateralProduct(final CollateralProductCreateRequest request) { + final ApplicationCurrency applicationCurrency = this.applicationCurrencyRepository.findOneByCode(request.getCurrency()); + final CollateralManagementDomain collateral = CollateralManagementDomain.builder() // + .name(request.getName()) // + .quality(request.getQuality()) // + .basePrice(request.getBasePrice()) // + .unitType(request.getUnitType()) // + .pctToBase(request.getPctToBase()) // + .currency(applicationCurrency) // + .build(); + this.collateralManagementRepositoryWrapper.create(collateral); + + return CollateralProductCreateResponse.builder().resourceId(collateral.getId()).build(); + } + + @Override + public CollateralProductUpdateResponse updateCollateralProduct(final CollateralProductUpdateRequest request) { + final CollateralManagementDomain collateral = this.collateralManagementRepositoryWrapper.getCollateral(request.getCollateralId()); + final ApplicationCurrency applicationCurrency = request.getCurrency() != null + ? this.applicationCurrencyRepository.findOneByCode(request.getCurrency()) + : collateral.getCurrency(); + final Changes changes = applyChanges(collateral, request, applicationCurrency); + this.collateralManagementRepositoryWrapper.update(collateral); + + return CollateralProductUpdateResponse.builder().resourceId(request.getCollateralId()).changes(changes).build(); + } + + private static Changes applyChanges(final CollateralManagementDomain collateral, final CollateralProductUpdateRequest request, + final ApplicationCurrency applicationCurrency) { + final Changes.ChangesBuilder changes = Changes.builder(); + + if (request.getName() != null && !Objects.equals(collateral.getName(), request.getName())) { + collateral.setName(request.getName().isEmpty() ? null : request.getName()); + changes.name(collateral.getName()); + } + if (request.getQuality() != null && !Objects.equals(collateral.getQuality(), request.getQuality())) { + collateral.setQuality(request.getQuality()); + changes.quality(collateral.getQuality()); + } + if (request.getUnitType() != null && !Objects.equals(collateral.getUnitType(), request.getUnitType())) { + collateral.setUnitType(request.getUnitType()); + changes.unitType(collateral.getUnitType()); + } + + collateral.setCurrency(applicationCurrency); + + if (request.getBasePrice() != null + && (collateral.getBasePrice() == null || collateral.getBasePrice().compareTo(request.getBasePrice()) != 0)) { + collateral.setBasePrice(request.getBasePrice()); + changes.basePrice(collateral.getBasePrice()); + } + if (request.getPctToBase() != null + && (collateral.getPctToBase() == null || collateral.getPctToBase().compareTo(request.getPctToBase()) != 0)) { + collateral.setPctToBase(request.getPctToBase()); + changes.pctToBase(collateral.getPctToBase()); + } + + return changes.build(); + } + + @Override + public CollateralProductDeleteResponse deleteCollateralProduct(final CollateralProductDeleteRequest request) { + final CollateralManagementDomain collateral = this.collateralManagementRepositoryWrapper.getCollateral(request.getCollateralId()); + validateForDeletion(collateral, request.getCollateralId()); + this.collateralManagementRepositoryWrapper.delete(request.getCollateralId()); + + return CollateralProductDeleteResponse.builder().resourceId(request.getCollateralId()).build(); + } + + private void validateForDeletion(final CollateralManagementDomain collateralManagementDomain, final Long collateralId) { + if (collateralManagementDomain == null) { + throw new CollateralNotFoundException(collateralId); + } + + if (!collateralManagementDomain.getClientCollateralManagements().isEmpty()) { + for (ClientCollateralManagement clientCollateralManagement : collateralManagementDomain.getClientCollateralManagements()) { + if (clientCollateralManagement.getQuantity().compareTo(BigDecimal.ZERO) > 0) { + throw new CollateralCannotBeDeletedException( + CollateralCannotBeDeletedException.CollateralCannotBeDeletedReason.COLLATERAL_IS_ALREADY_ATTACHED, + collateralId); + } + } + } + } +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/starter/CollateralManagementConfiguration.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/starter/CollateralManagementConfiguration.java index 9e2c6951b19..ebb1e003959 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/starter/CollateralManagementConfiguration.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/starter/CollateralManagementConfiguration.java @@ -20,7 +20,6 @@ import org.apache.fineract.infrastructure.codes.domain.CodeValueRepositoryWrapper; import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; -import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.organisation.monetary.domain.ApplicationCurrencyRepository; import org.apache.fineract.portfolio.client.domain.ClientRepositoryWrapper; import org.apache.fineract.portfolio.collateralmanagement.domain.ClientCollateralManagementRepositoryWrapper; @@ -29,10 +28,10 @@ import org.apache.fineract.portfolio.collateralmanagement.service.ClientCollateralManagementReadServiceImpl; import org.apache.fineract.portfolio.collateralmanagement.service.ClientCollateralManagementWriteService; import org.apache.fineract.portfolio.collateralmanagement.service.ClientCollateralManagementWriteServiceImpl; -import org.apache.fineract.portfolio.collateralmanagement.service.CollateralManagementReadPlatformService; -import org.apache.fineract.portfolio.collateralmanagement.service.CollateralManagementReadPlatformServiceImpl; -import org.apache.fineract.portfolio.collateralmanagement.service.CollateralManagementWritePlatformService; -import org.apache.fineract.portfolio.collateralmanagement.service.CollateralManagementWritePlatformServiceImpl; +import org.apache.fineract.portfolio.collateralmanagement.service.CollateralManagementReadService; +import org.apache.fineract.portfolio.collateralmanagement.service.CollateralManagementReadServiceImpl; +import org.apache.fineract.portfolio.collateralmanagement.service.CollateralManagementWriteService; +import org.apache.fineract.portfolio.collateralmanagement.service.CollateralManagementWriteServiceImpl; import org.apache.fineract.portfolio.collateralmanagement.service.LoanCollateralAssembler; import org.apache.fineract.portfolio.collateralmanagement.service.LoanCollateralManagementReadService; import org.apache.fineract.portfolio.collateralmanagement.service.LoanCollateralManagementReadServiceImpl; @@ -66,19 +65,18 @@ public ClientCollateralManagementWriteService clientCollateralManagementWriteSer } @Bean - @ConditionalOnMissingBean(CollateralManagementReadPlatformService.class) - public CollateralManagementReadPlatformService collateralManagementReadPlatformService(PlatformSecurityContext context, + @ConditionalOnMissingBean(CollateralManagementReadService.class) + public CollateralManagementReadService collateralManagementReadService( CollateralManagementRepositoryWrapper collateralManagementRepositoryWrapper) { - return new CollateralManagementReadPlatformServiceImpl(context, collateralManagementRepositoryWrapper); + return new CollateralManagementReadServiceImpl(collateralManagementRepositoryWrapper); } @Bean - @ConditionalOnMissingBean(CollateralManagementWritePlatformService.class) - public CollateralManagementWritePlatformService collateralManagementWritePlatformService( + @ConditionalOnMissingBean(CollateralManagementWriteService.class) + public CollateralManagementWriteService collateralManagementWriteService( CollateralManagementRepositoryWrapper collateralManagementRepositoryWrapper, - ApplicationCurrencyRepository applicationCurrencyRepository, FromJsonHelper fromApiJsonHelper) { - return new CollateralManagementWritePlatformServiceImpl(collateralManagementRepositoryWrapper, applicationCurrencyRepository, - fromApiJsonHelper); + ApplicationCurrencyRepository applicationCurrencyRepository) { + return new CollateralManagementWriteServiceImpl(collateralManagementRepositoryWrapper, applicationCurrencyRepository); } @Bean diff --git a/fineract-provider/src/main/resources/application.properties b/fineract-provider/src/main/resources/application.properties index 0bc7d7f3f7c..cedcc6b3cd9 100644 --- a/fineract-provider/src/main/resources/application.properties +++ b/fineract-provider/src/main/resources/application.properties @@ -707,6 +707,25 @@ resilience4j.retry.instances.commandClientCollateralDelete.wait-duration=${FINER resilience4j.retry.instances.commandClientCollateralDelete.enable-exponential-backoff=${FINERACT_COMMAND_CLIENT_COLLATERAL_DELETE_RETRY_ENABLE_EXPONENTIAL_BACKOFF:true} resilience4j.retry.instances.commandClientCollateralDelete.exponential-backoff-multiplier=${FINERACT_COMMAND_CLIENT_COLLATERAL_DELETE_RETRY_EXPONENTIAL_BACKOFF_MULTIPLIER:2} resilience4j.retry.instances.commandClientCollateralDelete.retryExceptions=${FINERACT_COMMAND_CLIENT_COLLATERAL_DELETE_RETRY_EXCEPTIONS:org.springframework.dao.ConcurrencyFailureException,org.eclipse.persistence.exceptions.OptimisticLockException,jakarta.persistence.OptimisticLockException,org.springframework.orm.jpa.JpaOptimisticLockingFailureException} +# collateral product + +resilience4j.retry.instances.commandCollateralProductCreate.max-attempts=${FINERACT_COMMAND_COLLATERAL_PRODUCT_CREATE_RETRY_MAX_ATTEMPTS:3} +resilience4j.retry.instances.commandCollateralProductCreate.wait-duration=${FINERACT_COMMAND_COLLATERAL_PRODUCT_CREATE_RETRY_WAIT_DURATION:1s} +resilience4j.retry.instances.commandCollateralProductCreate.enable-exponential-backoff=${FINERACT_COMMAND_COLLATERAL_PRODUCT_CREATE_RETRY_ENABLE_EXPONENTIAL_BACKOFF:true} +resilience4j.retry.instances.commandCollateralProductCreate.exponential-backoff-multiplier=${FINERACT_COMMAND_COLLATERAL_PRODUCT_CREATE_RETRY_EXPONENTIAL_BACKOFF_MULTIPLIER:2} +resilience4j.retry.instances.commandCollateralProductCreate.retryExceptions=${FINERACT_COMMAND_COLLATERAL_PRODUCT_CREATE_RETRY_EXCEPTIONS:org.springframework.dao.ConcurrencyFailureException,org.eclipse.persistence.exceptions.OptimisticLockException,jakarta.persistence.OptimisticLockException,org.springframework.orm.jpa.JpaOptimisticLockingFailureException} + +resilience4j.retry.instances.commandCollateralProductUpdate.max-attempts=${FINERACT_COMMAND_COLLATERAL_PRODUCT_UPDATE_RETRY_MAX_ATTEMPTS:3} +resilience4j.retry.instances.commandCollateralProductUpdate.wait-duration=${FINERACT_COMMAND_COLLATERAL_PRODUCT_UPDATE_RETRY_WAIT_DURATION:1s} +resilience4j.retry.instances.commandCollateralProductUpdate.enable-exponential-backoff=${FINERACT_COMMAND_COLLATERAL_PRODUCT_UPDATE_RETRY_ENABLE_EXPONENTIAL_BACKOFF:true} +resilience4j.retry.instances.commandCollateralProductUpdate.exponential-backoff-multiplier=${FINERACT_COMMAND_COLLATERAL_PRODUCT_UPDATE_RETRY_EXPONENTIAL_BACKOFF_MULTIPLIER:2} +resilience4j.retry.instances.commandCollateralProductUpdate.retryExceptions=${FINERACT_COMMAND_COLLATERAL_PRODUCT_UPDATE_RETRY_EXCEPTIONS:org.springframework.dao.ConcurrencyFailureException,org.eclipse.persistence.exceptions.OptimisticLockException,jakarta.persistence.OptimisticLockException,org.springframework.orm.jpa.JpaOptimisticLockingFailureException} + +resilience4j.retry.instances.commandCollateralProductDelete.max-attempts=${FINERACT_COMMAND_COLLATERAL_PRODUCT_DELETE_RETRY_MAX_ATTEMPTS:3} +resilience4j.retry.instances.commandCollateralProductDelete.wait-duration=${FINERACT_COMMAND_COLLATERAL_PRODUCT_DELETE_RETRY_WAIT_DURATION:1s} +resilience4j.retry.instances.commandCollateralProductDelete.enable-exponential-backoff=${FINERACT_COMMAND_COLLATERAL_PRODUCT_DELETE_RETRY_ENABLE_EXPONENTIAL_BACKOFF:true} +resilience4j.retry.instances.commandCollateralProductDelete.exponential-backoff-multiplier=${FINERACT_COMMAND_COLLATERAL_PRODUCT_DELETE_RETRY_EXPONENTIAL_BACKOFF_MULTIPLIER:2} +resilience4j.retry.instances.commandCollateralProductDelete.retryExceptions=${FINERACT_COMMAND_COLLATERAL_PRODUCT_DELETE_RETRY_EXCEPTIONS:org.springframework.dao.ConcurrencyFailureException,org.eclipse.persistence.exceptions.OptimisticLockException,jakarta.persistence.OptimisticLockException,org.springframework.orm.jpa.JpaOptimisticLockingFailureException} # hook