Skip to content

Commit e13a9cb

Browse files
Jose Alberto Hernandezadamsaghy
Jose Alberto Hernandez
authored andcommitted
FINERACT-2073: Client search v2 using Client Identifiers
1 parent 63ee58a commit e13a9cb

File tree

15 files changed

+62
-1
lines changed

15 files changed

+62
-1
lines changed

fineract-branch/src/main/resources/jpa/branch/persistence.xml

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
<class>org.apache.fineract.portfolio.group.domain.StaffAssignmentHistory</class>
4949
<class>org.apache.fineract.portfolio.group.domain.GroupRole</class>
5050
<class>org.apache.fineract.portfolio.client.domain.Client</class>
51+
<class>org.apache.fineract.portfolio.client.domain.ClientIdentifier</class>
5152
<class>org.apache.fineract.portfolio.rate.domain.Rate</class>
5253
<class>org.apache.fineract.portfolio.fund.domain.Fund</class>
5354
<class>org.apache.fineract.portfolio.delinquency.domain.DelinquencyBucket</class>

fineract-core/src/main/java/org/apache/fineract/portfolio/client/domain/Client.java

+5
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,15 @@
1818
*/
1919
package org.apache.fineract.portfolio.client.domain;
2020

21+
import jakarta.persistence.CascadeType;
2122
import jakarta.persistence.Column;
2223
import jakarta.persistence.Entity;
2324
import jakarta.persistence.FetchType;
2425
import jakarta.persistence.JoinColumn;
2526
import jakarta.persistence.JoinTable;
2627
import jakarta.persistence.ManyToMany;
2728
import jakarta.persistence.ManyToOne;
29+
import jakarta.persistence.OneToMany;
2830
import jakarta.persistence.OneToOne;
2931
import jakarta.persistence.Table;
3032
import jakarta.persistence.Transient;
@@ -220,6 +222,9 @@ public class Client extends AbstractAuditableWithUTCDateTimeCustom {
220222
@Column(name = "proposed_transfer_date")
221223
private LocalDate proposedTransferDate;
222224

225+
@OneToMany(cascade = CascadeType.ALL, mappedBy = "client", orphanRemoval = true, fetch = FetchType.LAZY)
226+
protected Set<ClientIdentifier> identifiers = new HashSet<>();
227+
223228
public static Client instance(final AppUser currentUser, final ClientStatus status, final Office office, final Group clientParentGroup,
224229
final String accountNo, final String firstname, final String middlename, final String lastname, final String fullname,
225230
final LocalDate activationDate, final LocalDate officeJoiningDate, final ExternalId externalId, final String mobileNo,

fineract-document/src/main/resources/jpa/document/persistence.xml

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
<class>org.apache.fineract.portfolio.group.domain.StaffAssignmentHistory</class>
4949
<class>org.apache.fineract.portfolio.group.domain.GroupRole</class>
5050
<class>org.apache.fineract.portfolio.client.domain.Client</class>
51+
<class>org.apache.fineract.portfolio.client.domain.ClientIdentifier</class>
5152
<class>org.apache.fineract.portfolio.fund.domain.Fund</class>
5253
<class>org.apache.fineract.portfolio.charge.domain.Charge</class>
5354
<class>org.apache.fineract.portfolio.paymenttype.domain.PaymentType</class>

fineract-investor/src/main/resources/jpa/investor/persistence.xml

+1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
<class>org.apache.fineract.portfolio.group.domain.StaffAssignmentHistory</class>
4848
<class>org.apache.fineract.portfolio.group.domain.GroupRole</class>
4949
<class>org.apache.fineract.portfolio.client.domain.Client</class>
50+
<class>org.apache.fineract.portfolio.client.domain.ClientIdentifier</class>
5051
<class>org.apache.fineract.portfolio.rate.domain.Rate</class>
5152
<class>org.apache.fineract.portfolio.fund.domain.Fund</class>
5253
<class>org.apache.fineract.portfolio.delinquency.domain.DelinquencyBucket</class>

fineract-loan/src/main/resources/jpa/loan/persistence.xml

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
<class>org.apache.fineract.portfolio.group.domain.StaffAssignmentHistory</class>
4949
<class>org.apache.fineract.portfolio.group.domain.GroupRole</class>
5050
<class>org.apache.fineract.portfolio.client.domain.Client</class>
51+
<class>org.apache.fineract.portfolio.client.domain.ClientIdentifier</class>
5152
<class>org.apache.fineract.portfolio.rate.domain.Rate</class>
5253
<class>org.apache.fineract.portfolio.fund.domain.Fund</class>
5354
<class>org.apache.fineract.portfolio.delinquency.domain.DelinquencyBucket</class>

fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientIdentifiersApiResourceSwagger.java

+4
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ private PostClientsClientIdIdentifiersRequest() {}
8585
public String documentKey;
8686
@Schema(example = "Document has been verified")
8787
public String description;
88+
@Schema(example = "Active")
89+
public String status;
8890
}
8991

9092
@Schema(description = "PutClientsClientIdIdentifiersIdentifierIdRequest")
@@ -98,6 +100,8 @@ private PutClientsClientIdIdentifiersIdentifierIdRequest() {}
98100
public String documentKey;
99101
@Schema(example = "Document has been updated")
100102
public String description;
103+
@Schema(example = "Active")
104+
public String status;
101105
}
102106

103107
@Schema(description = "PutClientsClientIdIdentifiersIdentifierIdResponse")

fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/search/SearchingClientRepositoryImpl.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import jakarta.persistence.TypedQuery;
2323
import jakarta.persistence.criteria.CriteriaBuilder;
2424
import jakarta.persistence.criteria.CriteriaQuery;
25+
import jakarta.persistence.criteria.Join;
26+
import jakarta.persistence.criteria.JoinType;
2527
import jakarta.persistence.criteria.Order;
2628
import jakarta.persistence.criteria.Path;
2729
import jakarta.persistence.criteria.Predicate;
@@ -32,6 +34,7 @@
3234
import org.apache.fineract.infrastructure.core.jpa.CriteriaQueryFactory;
3335
import org.apache.fineract.organisation.office.domain.Office;
3436
import org.apache.fineract.portfolio.client.domain.Client;
37+
import org.apache.fineract.portfolio.client.domain.ClientIdentifier;
3538
import org.springframework.data.domain.Page;
3639
import org.springframework.data.domain.Pageable;
3740
import org.springframework.data.jpa.domain.Specification;
@@ -62,13 +65,15 @@ public Page<SearchedClient> searchByText(String searchText, Pageable pageable, S
6265

6366
Specification<Client> spec = (r, q, builder) -> {
6467
Path<Office> o = r.get("office");
68+
Join<Client, ClientIdentifier> identity = r.join("identifiers", JoinType.LEFT);
6569

6670
List<Predicate> predicates = new ArrayList<>();
6771
predicates.add(cb.like(o.get("hierarchy"), hierarchyLikeValue));
6872

6973
String searchLikeValue = "%" + searchText + "%";
7074
predicates.add(cb.or(cb.like(r.get("accountNumber"), searchLikeValue), cb.like(r.get("displayName"), searchLikeValue),
71-
cb.like(r.get("externalId"), searchLikeValue), cb.like(r.get("mobileNo"), searchLikeValue)));
75+
cb.like(r.get("externalId"), searchLikeValue), cb.like(r.get("mobileNo"), searchLikeValue),
76+
cb.like(identity.get("documentKey"), searchLikeValue)));
7277

7378
return cb.and(predicates.toArray(new Predicate[0]));
7479
};

fineract-provider/src/main/resources/jpa/persistence.xml

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
<class>org.apache.fineract.portfolio.group.domain.StaffAssignmentHistory</class>
4949
<class>org.apache.fineract.portfolio.group.domain.GroupRole</class>
5050
<class>org.apache.fineract.portfolio.client.domain.Client</class>
51+
<class>org.apache.fineract.portfolio.client.domain.ClientIdentifier</class>
5152
<class>org.apache.fineract.portfolio.rate.domain.Rate</class>
5253
<class>org.apache.fineract.portfolio.fund.domain.Fund</class>
5354
<class>org.apache.fineract.portfolio.delinquency.domain.DelinquencyBucket</class>

fineract-rates/src/main/resources/jpa/rates/persistence.xml

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
<class>org.apache.fineract.portfolio.group.domain.StaffAssignmentHistory</class>
4949
<class>org.apache.fineract.portfolio.group.domain.GroupRole</class>
5050
<class>org.apache.fineract.portfolio.client.domain.Client</class>
51+
<class>org.apache.fineract.portfolio.client.domain.ClientIdentifier</class>
5152
<class>org.apache.fineract.portfolio.rate.domain.Rate</class>
5253
<class>org.apache.fineract.portfolio.fund.domain.Fund</class>
5354
<class>org.apache.fineract.portfolio.delinquency.domain.DelinquencyBucket</class>

fineract-savings/src/main/resources/jpa/savings/persistence.xml

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
<class>org.apache.fineract.portfolio.group.domain.StaffAssignmentHistory</class>
4949
<class>org.apache.fineract.portfolio.group.domain.GroupRole</class>
5050
<class>org.apache.fineract.portfolio.client.domain.Client</class>
51+
<class>org.apache.fineract.portfolio.client.domain.ClientIdentifier</class>
5152
<class>org.apache.fineract.portfolio.fund.domain.Fund</class>
5253
<class>org.apache.fineract.portfolio.charge.domain.Charge</class>
5354
<class>org.apache.fineract.portfolio.paymenttype.domain.PaymentType</class>

integration-tests/src/test/java/org/apache/fineract/integrationtests/client/ClientSearchTest.java

+27
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import io.restassured.specification.ResponseSpecification;
2828
import org.apache.fineract.client.models.GetClientsClientIdResponse;
2929
import org.apache.fineract.client.models.PageClientSearchData;
30+
import org.apache.fineract.client.models.PostClientsClientIdIdentifiersRequest;
31+
import org.apache.fineract.client.models.PostClientsClientIdIdentifiersResponse;
3032
import org.apache.fineract.client.models.PostClientsRequest;
3133
import org.apache.fineract.client.models.PostClientsResponse;
3234
import org.apache.fineract.client.models.SortOrder;
@@ -242,4 +244,29 @@ public void testClientSearchDoesntReturnAnything_ByMobileNo() {
242244
assertThat(result.getTotalElements()).isEqualTo(0);
243245
assertThat(result.getContent()).isEmpty();
244246
}
247+
248+
@Test
249+
public void testClientSearchWorks_ByClientIdentifier() {
250+
// given
251+
PostClientsRequest request1 = ClientHelper.defaultClientCreationRequest();
252+
request1.setMobileNo(Utils.randomNumberGenerator(8).toString());
253+
PostClientsResponse clientResponse = clientHelper.createClient(request1);
254+
final Long documentType = 1L;
255+
PostClientsClientIdIdentifiersRequest identifierRequest = ClientHelper.createClientIdentifer(documentType);
256+
final String documentKey = identifierRequest.getDocumentKey();
257+
PostClientsClientIdIdentifiersResponse clientIdentifierResponse = clientHelper.createClientIdentifer(clientResponse.getClientId(),
258+
identifierRequest);
259+
260+
PostClientsRequest request2 = ClientHelper.defaultClientCreationRequest();
261+
clientHelper.createClient(request2);
262+
263+
PostClientsRequest request3 = ClientHelper.defaultClientCreationRequest();
264+
clientHelper.createClient(request3);
265+
// when
266+
PageClientSearchData result = clientHelper.searchClients(documentKey);
267+
// then
268+
assertThat(result.getTotalElements()).isEqualTo(1);
269+
assertThat(result.getContent().get(0).getMobileNo()).isEqualTo(request1.getMobileNo());
270+
}
271+
245272
}

integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ClientHelper.java

+13
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@
5252
import org.apache.fineract.client.models.PagedRequestClientTextSearch;
5353
import org.apache.fineract.client.models.PostClientClientIdAddressesRequest;
5454
import org.apache.fineract.client.models.PostClientClientIdAddressesResponse;
55+
import org.apache.fineract.client.models.PostClientsClientIdIdentifiersRequest;
56+
import org.apache.fineract.client.models.PostClientsClientIdIdentifiersResponse;
5557
import org.apache.fineract.client.models.PostClientsClientIdResponse;
5658
import org.apache.fineract.client.models.PostClientsClientIdTransactionsTransactionIdResponse;
5759
import org.apache.fineract.client.models.PostClientsRequest;
@@ -105,6 +107,11 @@ public PostClientsResponse createClient(final PostClientsRequest request) {
105107
return ok(fineract().clients.create6(request));
106108
}
107109

110+
public PostClientsClientIdIdentifiersResponse createClientIdentifer(final Long clientId,
111+
final PostClientsClientIdIdentifiersRequest request) {
112+
return ok(fineract().clientIdentifiers.createClientIdentifier(clientId, request));
113+
}
114+
108115
public PageClientSearchData searchClients(String text) {
109116
ClientTextSearch clientTextSearch = new ClientTextSearch();
110117
clientTextSearch.setText(text);
@@ -875,4 +882,10 @@ public static PostClientsRequest defaultClientCreationRequest() {
875882
public GetLoanAccountLockResponse retrieveLockedAccounts(int page, int limit) {
876883
return ok(fineract().loanAccountLockApi.retrieveLockedAccounts(page, limit));
877884
}
885+
886+
public static PostClientsClientIdIdentifiersRequest createClientIdentifer(final Long documentType) {
887+
return new PostClientsClientIdIdentifiersRequest().documentTypeId(documentType).documentKey(Utils.randomStringGenerator("ID_", 10))
888+
.description(Utils.randomStringGenerator("Desc_", 50)).status("Active");
889+
}
890+
878891
}

0 commit comments

Comments
 (0)