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 cd9546ef2240fe5958d255de81f48c067674100d Mon Sep 17 00:00:00 2001 From: Muhimbura Brian Mart Date: Fri, 16 Aug 2024 12:59:22 +0300 Subject: [PATCH 2/2] FSF-25 --- .../pentahoReports/Print Bank Cheque.prpt | Bin 8017 -> 8039 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fineract-provider/pentahoReports/Print Bank Cheque.prpt b/fineract-provider/pentahoReports/Print Bank Cheque.prpt index 086cd79221ad3b40a449ff9e864e4d768d39cfcf..b8cb7c2476513af5219bd22c83b516be7072b5c3 100644 GIT binary patch delta 4858 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 delta 4864 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 E0kYn(9RL6T