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

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


The following commit(s) were added to refs/heads/develop by this push:
     new 4bb5c02b19 FINERACT-2488: Fix duplicate results in 
/api/v2/clients/search (#5485)
4bb5c02b19 is described below

commit 4bb5c02b19d71c1f5fc699c51d1e6ac5db2458e1
Author: Ralph Hopman <[email protected]>
AuthorDate: Sat Feb 14 20:05:13 2026 +0100

    FINERACT-2488: Fix duplicate results in /api/v2/clients/search (#5485)
---
 .../search/SearchingClientRepositoryImpl.java      |  1 +
 .../integrationtests/client/ClientSearchTest.java  | 31 ++++++++++++++++++++++
 2 files changed, 32 insertions(+)

diff --git 
a/fineract-core/src/main/java/org/apache/fineract/portfolio/client/domain/search/SearchingClientRepositoryImpl.java
 
b/fineract-core/src/main/java/org/apache/fineract/portfolio/client/domain/search/SearchingClientRepositoryImpl.java
index 94cf4e2dc0..fcfefb751d 100644
--- 
a/fineract-core/src/main/java/org/apache/fineract/portfolio/client/domain/search/SearchingClientRepositoryImpl.java
+++ 
b/fineract-core/src/main/java/org/apache/fineract/portfolio/client/domain/search/SearchingClientRepositoryImpl.java
@@ -67,6 +67,7 @@ public class SearchingClientRepositoryImpl implements 
SearchingClientRepository
         Path<Office> office = root.get("office");
 
         Specification<Client> spec = (r, q, builder) -> {
+            q.distinct(true);
             Path<Office> o = r.get("office");
             Join<Client, ClientIdentifier> identity = r.join("identifiers", 
JoinType.LEFT);
 
diff --git 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/ClientSearchTest.java
 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/ClientSearchTest.java
index eed2076d67..456d8d8721 100644
--- 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/ClientSearchTest.java
+++ 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/ClientSearchTest.java
@@ -36,6 +36,7 @@ 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.apache.fineract.integrationtests.common.system.CodeHelper;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
@@ -271,6 +272,36 @@ public class ClientSearchTest extends IntegrationTest {
         
assertThat(result.getContent().get(0).getMobileNo()).isEqualTo(request1.getMobileNo());
     }
 
+    @Test
+    public void 
testClientSearchDoesNotDuplicateResults_WhenIdentifierHasMultipleMatches() {
+        // given
+        PostClientsRequest request = 
ClientHelper.defaultClientCreationRequest();
+        PostClientsResponse clientResponse = 
clientHelper.createClient(request);
+
+        Integer codeId = (Integer) CodeHelper.createCode(requestSpec, 
responseSpec, Utils.randomStringGenerator("ClientIdentifierTest_", 6),
+                CodeHelper.RESPONSE_ID_ATTRIBUTE_NAME);
+        Integer documentTypeIdOne = CodeHelper.createCodeValue(requestSpec, 
responseSpec, codeId,
+                Utils.randomStringGenerator("DocType_", 6), 1);
+        Integer documentTypeIdTwo = CodeHelper.createCodeValue(requestSpec, 
responseSpec, codeId,
+                Utils.randomStringGenerator("DocType_", 6), 2);
+
+        String documentKeyToken = Utils.randomStringGenerator("DUP_ID_", 6);
+        PostClientsClientIdIdentifiersRequest identifierOne = new 
PostClientsClientIdIdentifiersRequest()
+                
.documentTypeId(documentTypeIdOne.longValue()).documentKey(documentKeyToken + 
"_A").description("Test").status("Active");
+        PostClientsClientIdIdentifiersRequest identifierTwo = new 
PostClientsClientIdIdentifiersRequest()
+                
.documentTypeId(documentTypeIdTwo.longValue()).documentKey(documentKeyToken + 
"_B").description("Test").status("Active");
+        clientHelper.createClientIdentifer(clientResponse.getClientId(), 
identifierOne);
+        clientHelper.createClientIdentifer(clientResponse.getClientId(), 
identifierTwo);
+
+        // when
+        PageClientSearchData result = 
clientHelper.searchClients(documentKeyToken);
+
+        // then
+        assertThat(result.getTotalElements()).isEqualTo(1);
+        assertThat(result.getContent().size()).isEqualTo(1);
+        
assertThat(result.getContent().get(0).getExternalId().getValue()).isEqualTo(request.getExternalId());
+    }
+
     @Test
     public void testClientSearchByLegalForm() {
         // given

Reply via email to