FINERACT-2169: Refactor macker checkers api controller;
This commit is contained in:
committed by
Adam Saghy
parent
2d2cbb46b5
commit
20195464c9
+33
-70
@@ -20,12 +20,12 @@ package org.apache.fineract.commands.api;
|
|||||||
|
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
import io.swagger.v3.oas.annotations.Parameter;
|
import io.swagger.v3.oas.annotations.Parameter;
|
||||||
import io.swagger.v3.oas.annotations.media.ArraySchema;
|
|
||||||
import io.swagger.v3.oas.annotations.media.Content;
|
import io.swagger.v3.oas.annotations.media.Content;
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import io.swagger.v3.oas.annotations.responses.ApiResponse;
|
import io.swagger.v3.oas.annotations.responses.ApiResponse;
|
||||||
import io.swagger.v3.oas.annotations.responses.ApiResponses;
|
import io.swagger.v3.oas.annotations.responses.ApiResponses;
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import jakarta.ws.rs.BeanParam;
|
||||||
import jakarta.ws.rs.Consumes;
|
import jakarta.ws.rs.Consumes;
|
||||||
import jakarta.ws.rs.DELETE;
|
import jakarta.ws.rs.DELETE;
|
||||||
import jakarta.ws.rs.GET;
|
import jakarta.ws.rs.GET;
|
||||||
@@ -37,21 +37,18 @@ import jakarta.ws.rs.QueryParam;
|
|||||||
import jakarta.ws.rs.core.Context;
|
import jakarta.ws.rs.core.Context;
|
||||||
import jakarta.ws.rs.core.MediaType;
|
import jakarta.ws.rs.core.MediaType;
|
||||||
import jakarta.ws.rs.core.UriInfo;
|
import jakarta.ws.rs.core.UriInfo;
|
||||||
import java.util.Arrays;
|
import java.util.List;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Set;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.fineract.commands.data.AuditData;
|
import org.apache.fineract.commands.data.AuditData;
|
||||||
import org.apache.fineract.commands.data.AuditSearchData;
|
import org.apache.fineract.commands.data.AuditSearchData;
|
||||||
|
import org.apache.fineract.commands.data.request.MakerCheckerRequest;
|
||||||
import org.apache.fineract.commands.service.AuditReadPlatformService;
|
import org.apache.fineract.commands.service.AuditReadPlatformService;
|
||||||
import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
|
import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
|
||||||
import org.apache.fineract.infrastructure.core.api.ApiRequestParameterHelper;
|
import org.apache.fineract.infrastructure.core.api.ApiRequestParameterHelper;
|
||||||
import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
|
import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
|
||||||
import org.apache.fineract.infrastructure.core.exception.UnrecognizedQueryParamException;
|
import org.apache.fineract.infrastructure.core.exception.UnrecognizedQueryParamException;
|
||||||
import org.apache.fineract.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
|
import org.apache.fineract.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
|
||||||
import org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSerializer;
|
|
||||||
import org.apache.fineract.infrastructure.security.utils.SQLBuilder;
|
import org.apache.fineract.infrastructure.security.utils.SQLBuilder;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@@ -61,13 +58,10 @@ import org.springframework.stereotype.Component;
|
|||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class MakercheckersApiResource {
|
public class MakercheckersApiResource {
|
||||||
|
|
||||||
private static final Set<String> RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("id", "actionName", "entityName", "resourceId",
|
private static final String COMMAND_APPROVE = "approve";
|
||||||
"subresourceId", "maker", "madeOnDate", "checker", "checkedOnDate", "processingResult", "commandAsJson", "officeName",
|
private static final String COMMAND_REJECT = "reject";
|
||||||
"groupLevelName", "groupName", "clientName", "loanAccountNo", "savingsAccountNo", "clientId", "loanId"));
|
|
||||||
|
|
||||||
private final AuditReadPlatformService readPlatformService;
|
private final AuditReadPlatformService readPlatformService;
|
||||||
private final DefaultToApiJsonSerializer<AuditData> toApiJsonSerializerAudit;
|
|
||||||
private final DefaultToApiJsonSerializer<AuditSearchData> toApiJsonSerializerSearchTemplate;
|
|
||||||
private final ApiRequestParameterHelper apiRequestParameterHelper;
|
private final ApiRequestParameterHelper apiRequestParameterHelper;
|
||||||
private final PortfolioCommandSourceWritePlatformService writePlatformService;
|
private final PortfolioCommandSourceWritePlatformService writePlatformService;
|
||||||
|
|
||||||
@@ -78,30 +72,12 @@ public class MakercheckersApiResource {
|
|||||||
+ "\n" + "Example Requests:\n" + "\n" + "makercheckers\n" + "\n" + "makercheckers?fields=madeOnDate,maker,processingResult\n"
|
+ "\n" + "Example Requests:\n" + "\n" + "makercheckers\n" + "\n" + "makercheckers?fields=madeOnDate,maker,processingResult\n"
|
||||||
+ "\n" + "makercheckers?makerDateTimeFrom=2013-03-25 08:00:00&makerDateTimeTo=2013-04-04 18:00:00\n" + "\n"
|
+ "\n" + "makercheckers?makerDateTimeFrom=2013-03-25 08:00:00&makerDateTimeTo=2013-04-04 18:00:00\n" + "\n"
|
||||||
+ "makercheckers?officeId=1\n" + "\n" + "makercheckers?officeId=1&includeJson=true")
|
+ "makercheckers?officeId=1\n" + "\n" + "makercheckers?officeId=1&includeJson=true")
|
||||||
@ApiResponses({
|
public List<AuditData> retrieveCommands(@Context final UriInfo uriInfo, @BeanParam MakerCheckerRequest makerCheckerRequest) {
|
||||||
@ApiResponse(responseCode = "200", description = "OK", content = @Content(array = @ArraySchema(schema = @Schema(implementation = MakercheckersApiResourceSwagger.GetMakerCheckerResponse.class)))) })
|
final SQLBuilder extraCriteria = getExtraCriteria(makerCheckerRequest);
|
||||||
public String retrieveCommands(@Context final UriInfo uriInfo,
|
|
||||||
@QueryParam("actionName") @Parameter(description = "actionName") final String actionName,
|
|
||||||
@QueryParam("entityName") @Parameter(description = "entityName") final String entityName,
|
|
||||||
@QueryParam("resourceId") @Parameter(description = "resourceId") final Long resourceId,
|
|
||||||
@QueryParam("makerId") @Parameter(description = "makerId") final Long makerId,
|
|
||||||
@QueryParam("makerDateTimeFrom") @Parameter(description = "makerDateTimeFrom") final String makerDateTimeFrom,
|
|
||||||
@QueryParam("makerDateTimeTo") @Parameter(description = "makerDateTimeTo") final String makerDateTimeTo,
|
|
||||||
@QueryParam("officeId") @Parameter(description = "officeId") final Integer officeId,
|
|
||||||
@QueryParam("groupId") @Parameter(description = "groupId") final Integer groupId,
|
|
||||||
@QueryParam("clientId") @Parameter(description = "clientId") final Integer clientId,
|
|
||||||
@QueryParam("loanid") @Parameter(description = "loanid") final Integer loanId,
|
|
||||||
@QueryParam("savingsAccountId") @Parameter(description = "savingsAccountId") final Integer savingsAccountId) {
|
|
||||||
|
|
||||||
final SQLBuilder extraCriteria = getExtraCriteria(actionName, entityName, resourceId, makerId, makerDateTimeFrom, makerDateTimeTo,
|
final ApiRequestJsonSerializationSettings settings = apiRequestParameterHelper.process(uriInfo.getQueryParameters());
|
||||||
officeId, groupId, clientId, loanId, savingsAccountId);
|
return readPlatformService.retrieveAllEntriesToBeChecked(extraCriteria, settings.isIncludeJson());
|
||||||
|
|
||||||
final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
|
|
||||||
|
|
||||||
final Collection<AuditData> entries = this.readPlatformService.retrieveAllEntriesToBeChecked(extraCriteria,
|
|
||||||
settings.isIncludeJson());
|
|
||||||
|
|
||||||
return this.toApiJsonSerializerAudit.serialize(settings, entries, RESPONSE_DATA_PARAMETERS);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
@@ -110,17 +86,8 @@ public class MakercheckersApiResource {
|
|||||||
@Produces({ MediaType.APPLICATION_JSON })
|
@Produces({ MediaType.APPLICATION_JSON })
|
||||||
@Operation(summary = "Maker Checker Search Template", description = "This is a convenience resource. It can be useful when building a Checker Inbox UI. \"appUsers\" are data scoped to the office/branch the requestor is associated with. \"actionNames\" and \"entityNames\" returned are those that the requestor has Checker approval permissions for.\n"
|
@Operation(summary = "Maker Checker Search Template", description = "This is a convenience resource. It can be useful when building a Checker Inbox UI. \"appUsers\" are data scoped to the office/branch the requestor is associated with. \"actionNames\" and \"entityNames\" returned are those that the requestor has Checker approval permissions for.\n"
|
||||||
+ "\n" + "Example Requests:\n" + "\n" + "makercheckers/searchtemplate\n" + "makercheckers/searchtemplate?fields=entityNames")
|
+ "\n" + "Example Requests:\n" + "\n" + "makercheckers/searchtemplate\n" + "makercheckers/searchtemplate?fields=entityNames")
|
||||||
@ApiResponses({
|
public AuditSearchData retrieveAuditSearchTemplate() {
|
||||||
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = MakercheckersApiResourceSwagger.GetMakerCheckersSearchTemplateResponse.class))) })
|
return readPlatformService.retrieveSearchTemplate("makerchecker");
|
||||||
public String retrieveAuditSearchTemplate(@Context final UriInfo uriInfo) {
|
|
||||||
|
|
||||||
final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
|
|
||||||
|
|
||||||
final AuditSearchData auditSearchData = this.readPlatformService.retrieveSearchTemplate("makerchecker");
|
|
||||||
|
|
||||||
final Set<String> RESPONSE_DATA_PARAMETERS_SEARCH_TEMPLATE = new HashSet<>(Arrays.asList("appUsers", "actionNames", "entityNames"));
|
|
||||||
|
|
||||||
return this.toApiJsonSerializerSearchTemplate.serialize(settings, auditSearchData, RESPONSE_DATA_PARAMETERS_SEARCH_TEMPLATE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@POST
|
@POST
|
||||||
@@ -130,19 +97,19 @@ public class MakercheckersApiResource {
|
|||||||
@Operation(summary = "Approve Maker Checker Entry | Reject Maker Checker Entry")
|
@Operation(summary = "Approve Maker Checker Entry | Reject Maker Checker Entry")
|
||||||
@ApiResponses({
|
@ApiResponses({
|
||||||
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = MakercheckersApiResourceSwagger.PostMakerCheckersResponse.class))) })
|
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = MakercheckersApiResourceSwagger.PostMakerCheckersResponse.class))) })
|
||||||
public String approveMakerCheckerEntry(@PathParam("auditId") @Parameter(description = "auditId") final Long auditId,
|
public CommandProcessingResult approveMakerCheckerEntry(@PathParam("auditId") @Parameter(description = "auditId") final Long auditId,
|
||||||
@QueryParam("command") @Parameter(description = "command") final String commandParam) {
|
@QueryParam("command") @Parameter(description = "command") final String commandParam) {
|
||||||
|
|
||||||
CommandProcessingResult result = null;
|
CommandProcessingResult result = null;
|
||||||
if (is(commandParam, "approve")) {
|
if (is(commandParam, COMMAND_APPROVE)) {
|
||||||
result = this.writePlatformService.approveEntry(auditId);
|
result = writePlatformService.approveEntry(auditId);
|
||||||
} else if (is(commandParam, "reject")) {
|
} else if (is(commandParam, COMMAND_REJECT)) {
|
||||||
final Long id = this.writePlatformService.rejectEntry(auditId);
|
final Long id = writePlatformService.rejectEntry(auditId);
|
||||||
result = CommandProcessingResult.commandOnlyResult(id);
|
result = CommandProcessingResult.commandOnlyResult(id);
|
||||||
} else {
|
} else {
|
||||||
throw new UnrecognizedQueryParamException("command", commandParam);
|
throw new UnrecognizedQueryParamException("command", commandParam);
|
||||||
}
|
}
|
||||||
return this.toApiJsonSerializerAudit.serialize(result);
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean is(final String commandParam, final String commandValue) {
|
private boolean is(final String commandParam, final String commandValue) {
|
||||||
@@ -156,31 +123,27 @@ public class MakercheckersApiResource {
|
|||||||
@Operation(summary = "Delete Maker Checker Entry")
|
@Operation(summary = "Delete Maker Checker Entry")
|
||||||
@ApiResponses({
|
@ApiResponses({
|
||||||
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = MakercheckersApiResourceSwagger.PostMakerCheckersResponse.class))) })
|
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = MakercheckersApiResourceSwagger.PostMakerCheckersResponse.class))) })
|
||||||
public String deleteMakerCheckerEntry(@PathParam("auditId") @Parameter(description = "auditId") final Long auditId) {
|
public CommandProcessingResult deleteMakerCheckerEntry(@PathParam("auditId") @Parameter(description = "auditId") final Long auditId) {
|
||||||
|
final Long id = writePlatformService.deleteEntry(auditId);
|
||||||
final Long id = this.writePlatformService.deleteEntry(auditId);
|
return CommandProcessingResult.commandOnlyResult(id);
|
||||||
|
|
||||||
return this.toApiJsonSerializerAudit.serialize(CommandProcessingResult.commandOnlyResult(id));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private SQLBuilder getExtraCriteria(final String actionName, final String entityName, final Long resourceId, final Long makerId,
|
private SQLBuilder getExtraCriteria(MakerCheckerRequest makerCheckerRequest) {
|
||||||
final String makerDateTimeFrom, final String makerDateTimeTo, final Integer officeId, final Integer groupId,
|
|
||||||
final Integer clientId, final Integer loanId, final Integer savingsAccountId) {
|
|
||||||
|
|
||||||
SQLBuilder extraCriteria = new SQLBuilder();
|
SQLBuilder extraCriteria = new SQLBuilder();
|
||||||
extraCriteria.addNonNullCriteria("aud.action_name = ", actionName);
|
extraCriteria.addNonNullCriteria("aud.action_name = ", makerCheckerRequest.getActionName());
|
||||||
if (entityName != null) {
|
if (makerCheckerRequest.getEntityName() != null) {
|
||||||
extraCriteria.addCriteria("aud.entity_name like ", entityName + "%");
|
extraCriteria.addCriteria("aud.entity_name like ", makerCheckerRequest.getEntityName() + "%");
|
||||||
}
|
}
|
||||||
extraCriteria.addNonNullCriteria("aud.resource_id = ", resourceId);
|
extraCriteria.addNonNullCriteria("aud.resource_id = ", makerCheckerRequest.getResourceId());
|
||||||
extraCriteria.addNonNullCriteria("aud.maker_id = ", makerId);
|
extraCriteria.addNonNullCriteria("aud.maker_id = ", makerCheckerRequest.getMakerId());
|
||||||
extraCriteria.addNonNullCriteria("aud.made_on_date >= ", makerDateTimeFrom);
|
extraCriteria.addNonNullCriteria("aud.made_on_date >= ", makerCheckerRequest.getMakerDateTimeFrom());
|
||||||
extraCriteria.addNonNullCriteria("aud.made_on_date <= ", makerDateTimeTo);
|
extraCriteria.addNonNullCriteria("aud.made_on_date <= ", makerCheckerRequest.getMakerDateTimeTo());
|
||||||
extraCriteria.addNonNullCriteria("aud.office_id = ", officeId);
|
extraCriteria.addNonNullCriteria("aud.office_id = ", makerCheckerRequest.getOfficeId());
|
||||||
extraCriteria.addNonNullCriteria("aud.group_id = ", groupId);
|
extraCriteria.addNonNullCriteria("aud.group_id = ", makerCheckerRequest.getGroupId());
|
||||||
extraCriteria.addNonNullCriteria("aud.client_id = ", clientId);
|
extraCriteria.addNonNullCriteria("aud.client_id = ", makerCheckerRequest.getClientId());
|
||||||
extraCriteria.addNonNullCriteria("aud.loan_id = ", loanId);
|
extraCriteria.addNonNullCriteria("aud.loan_id = ", makerCheckerRequest.getLoanId());
|
||||||
extraCriteria.addNonNullCriteria("aud.savings_account_id = ", savingsAccountId);
|
extraCriteria.addNonNullCriteria("aud.savings_account_id = ", makerCheckerRequest.getSavingsAccountId());
|
||||||
|
|
||||||
return extraCriteria;
|
return extraCriteria;
|
||||||
}
|
}
|
||||||
|
|||||||
-48
@@ -19,11 +19,6 @@
|
|||||||
package org.apache.fineract.commands.api;
|
package org.apache.fineract.commands.api;
|
||||||
|
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import java.time.ZonedDateTime;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
|
||||||
import org.apache.fineract.commands.data.ProcessingResultLookup;
|
|
||||||
import org.apache.fineract.useradministration.data.AppUserData;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by sanyam on 27/7/17.
|
* Created by sanyam on 27/7/17.
|
||||||
@@ -34,49 +29,6 @@ final class MakercheckersApiResourceSwagger {
|
|||||||
// only to initialize swagger documentation
|
// only to initialize swagger documentation
|
||||||
}
|
}
|
||||||
|
|
||||||
@Schema(description = "GetMakerCheckerResponse")
|
|
||||||
public static final class GetMakerCheckerResponse {
|
|
||||||
|
|
||||||
private GetMakerCheckerResponse() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public Long id;
|
|
||||||
public String actionName;
|
|
||||||
public String entityName;
|
|
||||||
public Long resourceId;
|
|
||||||
public Long subresourceId;
|
|
||||||
public String maker;
|
|
||||||
public ZonedDateTime madeOnDate;
|
|
||||||
public String checker;
|
|
||||||
public ZonedDateTime checkedOnDate;
|
|
||||||
public String processingResult;
|
|
||||||
public String commandAsJson;
|
|
||||||
public String officeName;
|
|
||||||
public String groupLevelName;
|
|
||||||
public String groupName;
|
|
||||||
public String clientName;
|
|
||||||
public String loanAccountNo;
|
|
||||||
public String savingsAccountNo;
|
|
||||||
public Long clientId;
|
|
||||||
public Long loanId;
|
|
||||||
public String url;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Schema(description = "GetMakerCheckersSearchTemplateResponse")
|
|
||||||
public static final class GetMakerCheckersSearchTemplateResponse {
|
|
||||||
|
|
||||||
private GetMakerCheckersSearchTemplateResponse() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public Collection<AppUserData> appUsers;
|
|
||||||
public List<String> actionNames;
|
|
||||||
public List<String> entityNames;
|
|
||||||
public Collection<ProcessingResultLookup> processingResults;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Schema(description = "PostMakerCheckersResponse")
|
@Schema(description = "PostMakerCheckersResponse")
|
||||||
public static final class PostMakerCheckersResponse {
|
public static final class PostMakerCheckersResponse {
|
||||||
|
|
||||||
|
|||||||
+59
@@ -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.commands.data.request;
|
||||||
|
|
||||||
|
import jakarta.ws.rs.QueryParam;
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.time.ZonedDateTime;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
@Setter
|
||||||
|
@Getter
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class MakerCheckerRequest implements Serializable {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@QueryParam("actionName")
|
||||||
|
private String actionName;
|
||||||
|
@QueryParam("entityName")
|
||||||
|
private String entityName;
|
||||||
|
@QueryParam("resourceId")
|
||||||
|
private Long resourceId;
|
||||||
|
@QueryParam("makerId")
|
||||||
|
private Long makerId;
|
||||||
|
@QueryParam("makerDateTimeFrom")
|
||||||
|
private ZonedDateTime makerDateTimeFrom;
|
||||||
|
@QueryParam("makerDateTimeTo")
|
||||||
|
private ZonedDateTime makerDateTimeTo;
|
||||||
|
@QueryParam("clientId")
|
||||||
|
private Long clientId;
|
||||||
|
@QueryParam("loanid")
|
||||||
|
private Long loanId;
|
||||||
|
@QueryParam("officeId")
|
||||||
|
private Long officeId;
|
||||||
|
@QueryParam("groupId")
|
||||||
|
private Long groupId;
|
||||||
|
@QueryParam("savingsAccountId")
|
||||||
|
private Long savingsAccountId;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user