From 8d30bc6b72038db4badb73a2ec2a98879aed6353 Mon Sep 17 00:00:00 2001 From: Muhimbura Brian Mart Date: Thu, 8 Aug 2024 21:43:10 +0300 Subject: [PATCH 1/2] FBR-710 --- .../core/service/SearchParameters.java | 8 +++--- .../api/GroupPrequalificationApiResource.java | 7 +++-- ...IndividualPrequalificationApiResource.java | 2 +- ...equalificationReadPlatformServiceImpl.java | 28 +++++++++++++++---- 4 files changed, 31 insertions(+), 14 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/SearchParameters.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/SearchParameters.java index 469cd9f1175..05ebcee45bb 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/SearchParameters.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/SearchParameters.java @@ -129,7 +129,7 @@ public static SearchParameters forBlacklist(final String displayName, final Stri public static SearchParameters forPrequalification(final String displayName, final String status, final Integer offset, final Integer limit, final String orderBy, final String sortOrder, final String type, String searchText, - final String groupingType, Long portfolioCenterId) { + final String groupingType, Long portfolioCenterId, Long agencyId) { final Integer maxLimitAllowed = getCheckedLimit(limit); final Long staffId = null; @@ -139,7 +139,7 @@ public static SearchParameters forPrequalification(final String displayName, fin return new SearchParameters(searchText, null, null, displayName, null, null, null, status, offset, maxLimitAllowed, orderBy, sortOrder, staffId, accountNo, loanId, savingsId, null, false, null, type, null, null, null, groupingType, - portfolioCenterId); + portfolioCenterId,agencyId); } public static SearchParameters forBankCheques(final Long agencyId, final String chequeNo, final String bankAccNo, final Long batchId, @@ -622,7 +622,7 @@ private SearchParameters(final String sqlSearch, final Long officeId, final Stri final Integer limit, final String orderBy, final String sortOrder, final Long staffId, final String accountNo, final Long loanId, final Long savingsId, final Boolean orphansOnly, boolean isSelfUser, final String dpiNumber, final String type, final String groupName, final String groupNumber, final String centerName, final String groupingType, - Long portfolioCenterId) { + Long portfolioCenterId, Long agencyId) { this.sqlSearch = sqlSearch; this.officeId = officeId; this.externalId = externalId; @@ -659,7 +659,7 @@ private SearchParameters(final String sqlSearch, final Long officeId, final Stri this.disbursementStartDate = null; this.approvalEndDate = null; this.approvalStartDate = null; - this.agencyId = null; + this.agencyId = agencyId; this.clientNo = null; this.groupId = null; this.centerId = portfolioCenterId; diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/api/GroupPrequalificationApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/api/GroupPrequalificationApiResource.java index f0437332910..2019366dd4f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/api/GroupPrequalificationApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/api/GroupPrequalificationApiResource.java @@ -145,6 +145,7 @@ public String retrieveAllBlacklistItems(@Context final UriInfo uriInfo, @QueryParam("limit") @Parameter(description = "limit") final Integer limit, @QueryParam("orderBy") @Parameter(description = "orderBy") final String orderBy, @QueryParam("status") @Parameter(description = "status") final String status, + @QueryParam("agencyId") @Parameter(description = "agencyId") final Long agencyId, @QueryParam("type") @Parameter(description = "type") final String type, @QueryParam("portfolioCenterId") @Parameter(description = "type") final Long portfolioCenterId, @QueryParam("searchText") @Parameter(description = "searchText") final String searchText, @@ -157,7 +158,7 @@ public String retrieveAllBlacklistItems(@Context final UriInfo uriInfo, String clientName = queryParameters.getFirst("clientName"); SearchParameters searchParameters = SearchParameters.forPrequalification(clientName, status, offset, limit, orderBy, sortOrder, - type, searchText, groupingType, portfolioCenterId); + type, searchText, groupingType, portfolioCenterId, agencyId); final Page clientData = this.prequalificationReadPlatformService.retrieveAll(searchParameters); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(queryParameters); @@ -174,6 +175,7 @@ public String retrieveAllBlacklistItems(@Context final UriInfo uriInfo, public String newClientIdentifierDetails(@Context final UriInfo uriInfo) { this.context.authenticatedUser().validateHasViewPermission(this.resourceNameForPermissions); + final String hierarchy = this.context.authenticatedUser().getOffice().getHierarchy(); MultivaluedMap queryParameters = uriInfo.getQueryParameters(); @@ -183,7 +185,7 @@ public String newClientIdentifierDetails(@Context final UriInfo uriInfo) { Long agencyId = null; Long centerId = null; Collection centerData = null; - Collection agencies = null; + Collection agencies = this.agencyReadPlatformService.retrieveByOfficeHierarchy(hierarchy); Collection appUsers = null; Collection loanProducts = null; GlobalConfigurationPropertyData timespan = null; @@ -226,7 +228,6 @@ public String newClientIdentifierDetails(@Context final UriInfo uriInfo) { } } - final String hierarchy = this.context.authenticatedUser().getOffice().getHierarchy(); centerData = this.centerReadPlatformService.retrieveByOfficeHierarchy(hierarchy, agencyId); agencies = this.agencyReadPlatformService.retrieveAllByAgencyLeader(); if (agencies.isEmpty()) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/api/IndividualPrequalificationApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/api/IndividualPrequalificationApiResource.java index 8a47ee41742..25a45a39e75 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/api/IndividualPrequalificationApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/api/IndividualPrequalificationApiResource.java @@ -124,7 +124,7 @@ public String retrieveAllBlacklistItems(@Context final UriInfo uriInfo, String clientName = queryParameters.getFirst("clientName"); SearchParameters searchParameters = SearchParameters.forPrequalification(clientName, status, offset, limit, orderBy, sortOrder, - type, searchText, groupingType, portfolioCenterId); + type, searchText, groupingType, portfolioCenterId,null); final Page memberData = this.prequalificationReadPlatformService.retrieveAllMembers(searchParameters); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(queryParameters); diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/service/PrequalificationReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/service/PrequalificationReadPlatformServiceImpl.java index ee2cb0f05db..231d380ec30 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/service/PrequalificationReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/service/PrequalificationReadPlatformServiceImpl.java @@ -277,6 +277,7 @@ private String buildSqlStringFromBlacklistCriteria(final SearchParameters search String sqlSearch = searchParameters.getSqlSearch(); final Long officeId = searchParameters.getOfficeId(); final Long centerId = searchParameters.getCenterId(); + final Long agencyId = searchParameters.getAgencyId(); final String dpiNumber = searchParameters.getName(); final String status = searchParameters.getStatus(); final String type = searchParameters.getType(); @@ -298,12 +299,6 @@ private String buildSqlStringFromBlacklistCriteria(final SearchParameters search paramList.add(appUser.getId()); } } - - // add hierrachy filter here. - extraCriteria += " and (mo.hierarchy LIKE CONCAT(?, '%') OR ? like CONCAT(mo.hierarchy, '%'))"; - paramList.add(appUser.getOffice().getHierarchy()); - paramList.add(appUser.getOffice().getHierarchy()); - } if (StringUtils.equals(groupingType, "individual")) { @@ -314,6 +309,14 @@ private String buildSqlStringFromBlacklistCriteria(final SearchParameters search paramList.add(dpiNumber); } } + extraCriteria += " and (moind.hierarchy LIKE CONCAT(?, '%') OR ? like CONCAT(moind.hierarchy, '%'))"; + paramList.add(appUser.getOffice().getHierarchy()); + paramList.add(appUser.getOffice().getHierarchy()); + + if (agencyId != null) { + extraCriteria += " and individualOffice.agency_id = ? "; + paramList.add(agencyId); + } } if (sqlSearch != null && !isGroup) { @@ -457,12 +460,25 @@ LEFT JOIN ( FROM m_prequalification_group_members mpgm GROUP BY mpgm.group_id ) prequalification_numbers ON prequalification_numbers.prequalification_id = g.id + + LEFT JOIN( + select DISTINCT mc.office_id, ms.agency_id, mpgm.group_id, ms.linked_office_id as supervision_office + from m_prequalification_group_members mpgm + INNER JOIN m_client mc on mc.dpi = mpgm.dpi + INNER JOIN m_group_client mgc on mgc.client_id = mc.id + INNER JOIN m_group mg on mg.id = mgc.group_id + INNER JOIN m_group center on center.id = mg.parent_id + INNER JOIN m_portfolio mp on mp.id = center.portfolio_id + INNER JOIN m_supervision ms on ms.id = mp.supervision_id + ) individualOffice ON individualOffice.group_id = g.id + LEFT JOIN m_agency ma ON g.agency_id = ma.id LEFT JOIN( select agency_id, linked_office_id from m_supervision GROUP BY agency_id ) supv ON supv.agency_id = ma.id LEFT JOIN m_office mo on mo.id = supv.linked_office_id + LEFT JOIN m_office moind on moind.id = individualOffice.supervision_office LEFT JOIN ( SELECT p.id AS groupid, From d0dc1f02ce987b9ab0417083160144957275d413 Mon Sep 17 00:00:00 2001 From: Muhimbura Brian Mart Date: Tue, 13 Aug 2024 14:41:06 +0300 Subject: [PATCH 2/2] FSF-24 --- .../Pagare Libre Protesto Grupal.prpt | Bin 16316 -> 10526 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fineract-provider/pentahoReports/Pagare Libre Protesto Grupal.prpt b/fineract-provider/pentahoReports/Pagare Libre Protesto Grupal.prpt index 9b57824509b122aee8c18f676de9fbc806ace6af..ec065a4e7f57c36ad5b9b339f9ce7aa99e995914 100644 GIT binary patch delta 7373 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