FINERACT-2282: Support Client filtering by legal form

This commit is contained in:
Adam Saghy
2025-05-16 19:36:48 +02:00
parent ed42fb2410
commit c79de9bb7a
8 changed files with 71 additions and 15 deletions
@@ -56,6 +56,7 @@ public class SearchParameters {
private Long categoryId;
@Getter(AccessLevel.NONE)
private Boolean isSelfUser;
private Integer legalForm;
public Integer getLimit() {
if (limit == null) {
@@ -128,4 +129,16 @@ public class SearchParameters {
public boolean hasCategoryId() {
return this.categoryId != null && this.categoryId != 0;
}
public boolean isPerson() {
return this.legalForm != null && this.legalForm == 1;
}
public boolean isEntity() {
return this.legalForm != null && this.legalForm == 2;
}
public boolean hasLegalForm() {
return this.legalForm != null;
}
}
@@ -197,7 +197,7 @@ public class ClientApiConstants {
officeNameParamName, transferToOfficeIdParamName, transferToOfficeNameParamName, hierarchyParamName, imageIdParamName,
imagePresentParamName, staffIdParamName, staffNameParamName, timelineParamName, groupsParamName, officeOptionsParamName,
staffOptionsParamName, dateOfBirthParamName, genderParamName, clientTypeParamName, clientClassificationParamName,
legalFormParamName, clientNonPersonDetailsParamName, isStaffParamName));
legalFormParamName, clientNonPersonDetailsParamName, isStaffParamName, legalFormParamName));
protected static final Set<String> CLIENT_CHARGES_RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList(chargeIdParamName,
clientIdParamName, chargeNameParamName, penaltyParamName, chargeTimeTypeParamName, dueAsOfDateParamName,
@@ -151,10 +151,11 @@ public class ClientsApiResource {
@QueryParam("limit") @Parameter(description = "limit") final Integer limit,
@QueryParam("orderBy") @Parameter(description = "orderBy") final String orderBy,
@QueryParam("sortOrder") @Parameter(description = "sortOrder") final String sortOrder,
@QueryParam("orphansOnly") @Parameter(description = "orphansOnly") final Boolean orphansOnly) {
@QueryParam("orphansOnly") @Parameter(description = "orphansOnly") final Boolean orphansOnly,
@QueryParam("legalForm") final Integer legalForm) {
return retrieveAll(uriInfo, officeId, externalId, displayName, firstname, lastname, status, hierarchy, offset, limit, orderBy,
sortOrder, orphansOnly, false);
return retrieveAll(uriInfo, officeId, externalId, displayName, firstname, lastname, status, legalForm, hierarchy, offset, limit,
orderBy, sortOrder, orphansOnly, false);
}
@GET
@@ -442,8 +443,9 @@ public class ClientsApiResource {
}
public String retrieveAll(final UriInfo uriInfo, final Long officeId, final String externalId, final String displayName,
final String firstname, final String lastname, final String status, final String hierarchy, final Integer offset,
final Integer limit, final String orderBy, final String sortOrder, final Boolean orphansOnly, final boolean isSelfUser) {
final String firstname, final String lastname, final String status, final Integer legalForm, final String hierarchy,
final Integer offset, final Integer limit, final String orderBy, final String sortOrder, final Boolean orphansOnly,
final boolean isSelfUser) {
context.authenticatedUser().validateHasReadPermission(ClientApiConstants.CLIENT_RESOURCE_NAME);
sqlValidator.validate(orderBy);
sqlValidator.validate(sortOrder);
@@ -451,7 +453,7 @@ public class ClientsApiResource {
sqlValidator.validate(hierarchy);
final SearchParameters searchParameters = SearchParameters.builder().limit(limit).officeId(officeId).externalId(externalId)
.name(displayName).hierarchy(hierarchy).firstname(firstname).lastname(lastname).status(status).orphansOnly(orphansOnly)
.isSelfUser(isSelfUser).offset(offset).orderBy(orderBy).sortOrder(sortOrder).build();
.isSelfUser(isSelfUser).offset(offset).orderBy(orderBy).sortOrder(sortOrder).legalForm(legalForm).build();
final Page<ClientData> clientData = clientReadPlatformService.retrieveAll(searchParameters);
final ApiRequestJsonSerializationSettings settings = apiRequestParameterHelper.process(uriInfo.getQueryParameters());
return toApiJsonSerializer.serialize(settings, clientData, ClientApiConstants.CLIENT_RESPONSE_DATA_PARAMETERS);
@@ -168,7 +168,7 @@ final class ClientsApiResourceSwagger {
@Schema(example = "2")
public Integer totalFilteredRecords;
public Set<GetClientsPageItemsResponse> pageItems;
public List<GetClientsPageItemsResponse> pageItems;
}
@Schema(description = "GetClientsClientIdResponse")
@@ -195,6 +195,11 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService
extraCriteria += " and c.id NOT IN (select client_id from m_group_client) ";
}
if (searchParameters.hasLegalForm()) {
paramList.add(searchParameters.getLegalForm());
extraCriteria += " and c.legal_form_enum = ? ";
}
if (StringUtils.isNotBlank(extraCriteria)) {
extraCriteria = extraCriteria.substring(4);
}
@@ -89,14 +89,15 @@ public class SelfClientsApiResource {
@QueryParam("status") @Parameter(description = "status") final String status,
@QueryParam("limit") @Parameter(description = "limit") final Integer limit,
@QueryParam("orderBy") @Parameter(description = "orderBy") final String orderBy,
@QueryParam("sortOrder") @Parameter(description = "sortOrder") final String sortOrder) {
@QueryParam("sortOrder") @Parameter(description = "sortOrder") final String sortOrder,
@QueryParam("legalForm") final Integer legalForm) {
final Long officeId = null;
final String externalId = null;
final String hierarchy = null;
final Boolean orphansOnly = null;
return this.clientApiResource.retrieveAll(uriInfo, officeId, externalId, displayName, firstname, lastname, status, hierarchy,
offset, limit, orderBy, sortOrder, orphansOnly, true);
return this.clientApiResource.retrieveAll(uriInfo, officeId, externalId, displayName, firstname, lastname, status, legalForm,
hierarchy, offset, limit, orderBy, sortOrder, orphansOnly, true);
}
@GET
@@ -18,26 +18,28 @@
*/
package org.apache.fineract.integrationtests.client;
import static org.assertj.core.api.Assertions.assertThat;
import io.restassured.builder.RequestSpecBuilder;
import io.restassured.builder.ResponseSpecBuilder;
import io.restassured.http.ContentType;
import io.restassured.specification.RequestSpecification;
import io.restassured.specification.ResponseSpecification;
import java.time.LocalDate;
import org.apache.fineract.client.models.GetClientsClientIdResponse;
import org.apache.fineract.client.models.GetClientsResponse;
import org.apache.fineract.client.models.PageClientSearchData;
import org.apache.fineract.client.models.PostClientsClientIdIdentifiersRequest;
import org.apache.fineract.client.models.PostClientsClientIdIdentifiersResponse;
import org.apache.fineract.client.models.PostClientsRequest;
import org.apache.fineract.client.models.PostClientsResponse;
import org.apache.fineract.client.models.PostOfficesRequest;
import org.apache.fineract.client.models.PostOfficesResponse;
import org.apache.fineract.client.models.SortOrder;
import org.apache.fineract.integrationtests.common.ClientHelper;
import org.apache.fineract.integrationtests.common.Utils;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class ClientSearchTest {
public class ClientSearchTest extends IntegrationTest {
private ResponseSpecification responseSpec;
private RequestSpecification requestSpec;
@@ -269,4 +271,37 @@ public class ClientSearchTest {
assertThat(result.getContent().get(0).getMobileNo()).isEqualTo(request1.getMobileNo());
}
@Test
public void testClientSearchByLegalForm() {
// given
PostOfficesResponse newOffice = ok(
fineractClient().offices.createOffice(new PostOfficesRequest().name(Utils.randomStringGenerator("TestOffice_", 6))
.parentId(1L).openingDate(LocalDate.of(1970, 1, 1)).dateFormat("yyyy-MM-dd").locale("en_US")));
PostClientsRequest individualClientRequest = ClientHelper.defaultClientCreationRequest();
individualClientRequest.setLegalFormId(1L);
individualClientRequest.setOfficeId(newOffice.getOfficeId());
PostClientsResponse individualClientResponse = clientHelper.createClient(individualClientRequest);
PostClientsRequest entityClientRequest = ClientHelper.defaultClientCreationRequest();
entityClientRequest.setOfficeId(newOffice.getOfficeId());
entityClientRequest.setLegalFormId(2L);
PostClientsResponse entityClientResponse = clientHelper.createClient(entityClientRequest);
PostClientsRequest secondEntityClientRequest = ClientHelper.defaultClientCreationRequest();
secondEntityClientRequest.setOfficeId(newOffice.getOfficeId());
secondEntityClientRequest.setLegalFormId(2L);
PostClientsResponse secondEntityClientResponse = clientHelper.createClient(secondEntityClientRequest);
// when
GetClientsResponse individualClients = ok(fineractClient().clients.retrieveAll21(newOffice.getOfficeId(), null, null, null, null,
null, null, null, null, null, null, null, 1));
GetClientsResponse entityClients = ok(fineractClient().clients.retrieveAll21(newOffice.getOfficeId(), null, null, null, null, null,
null, null, null, "id", null, null, 2));
// then
assertThat(individualClients.getTotalFilteredRecords()).isEqualTo(1);
assertThat(individualClients.getPageItems().get(0).getId()).isEqualTo(individualClientResponse.getClientId());
assertThat(entityClients.getTotalFilteredRecords()).isEqualTo(2);
assertThat(entityClients.getPageItems().get(0).getId()).isEqualTo(entityClientResponse.getClientId());
assertThat(entityClients.getPageItems().get(1).getId()).isEqualTo(secondEntityClientResponse.getClientId());
}
}
@@ -63,7 +63,7 @@ public class ClientTest extends IntegrationTest {
Optional<Long> retrieveFirst() {
GetClientsResponse clients = ok(
fineractClient().clients.retrieveAll21(null, null, null, null, null, null, null, 0, 1, null, null, false));
fineractClient().clients.retrieveAll21(null, null, null, null, null, null, null, 0, 1, null, null, false, null));
if (clients.getTotalFilteredRecords() != null && clients.getTotalFilteredRecords() > 0) {
return clients.getPageItems().stream().findFirst().map(item -> item.getId());
}