From 6a665dbd7f5cf1da087169a9057b0e009b6f7903 Mon Sep 17 00:00:00 2001 From: Muhimbura Brian Mart Date: Wed, 24 Jul 2024 20:51:19 +0300 Subject: [PATCH 01/24] fix FSF-9 --- .../PortfolioOfficeNotFoundException.java | 30 +++++++++++++++++++ ...WritePlatformServiceJpaRepositoryImpl.java | 11 ++++++- 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 fineract-provider/src/main/java/org/apache/fineract/portfolio/group/exception/PortfolioOfficeNotFoundException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/exception/PortfolioOfficeNotFoundException.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/exception/PortfolioOfficeNotFoundException.java new file mode 100644 index 00000000000..80eb03bda3c --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/exception/PortfolioOfficeNotFoundException.java @@ -0,0 +1,30 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.group.exception; + +import org.apache.fineract.infrastructure.core.exception.AbstractPlatformDomainRuleException; + +public class PortfolioOfficeNotFoundException extends AbstractPlatformDomainRuleException { + + public PortfolioOfficeNotFoundException(final String potfolioOffice) { + super("error.msg.portfolio.office.not.found", + "The Portfolio with name `" + potfolioOffice + "` Does not have a matching office created. First created the office", potfolioOffice); + } + +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java index d3cfa8d812f..3c5eaef73af 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java @@ -101,6 +101,7 @@ import org.apache.fineract.portfolio.group.exception.GroupMustBePendingToBeDeletedException; import org.apache.fineract.portfolio.group.exception.InvalidGroupLevelException; import org.apache.fineract.portfolio.group.exception.InvalidGroupStateTransitionException; +import org.apache.fineract.portfolio.group.exception.PortfolioOfficeNotFoundException; import org.apache.fineract.portfolio.group.exception.PrequalificationMappedException; import org.apache.fineract.portfolio.group.serialization.GroupingTypesDataValidator; import org.apache.fineract.portfolio.loanaccount.domain.Loan; @@ -1142,6 +1143,14 @@ public CommandProcessingResult generateCentersByPortfolio(Portfolio portfolio) { // set values to generate the centers final Office office = portfolio.getParentOffice(); + + String portfolioOfficeQuery = "SELECT id from m_office where name=?"; + List portfolioIds = jdbcTemplate.queryForList(portfolioOfficeQuery, Long.class, portfolio.getName()); + if (portfolioIds.size()<=0) { + throw new PortfolioOfficeNotFoundException(portfolio.getName()); + } + Office portfolioOffice = this.officeRepositoryWrapper.findOneWithNotFoundDetection(portfolioIds.get(0)); +// Office portfolioOffice = office.getParent(); final boolean active = true; final LocalDate activationDate = DateUtils.getLocalDateOfTenant(); final LocalDate submittedOnDate = DateUtils.getLocalDateOfTenant(); @@ -1157,7 +1166,7 @@ public CommandProcessingResult generateCentersByPortfolio(Portfolio portfolio) { final Integer meetingStart = rangeTemplateData.getStartDay(); final Integer meetingEnd = rangeTemplateData.getEndDay(); - Group newCenter = Group.assembleNewCenterFrom(office, groupLevel, centerName, active, activationDate, submittedOnDate, + Group newCenter = Group.assembleNewCenterFrom(portfolioOffice, groupLevel, centerName, active, activationDate, submittedOnDate, currentUser, meetingStartTime, meetingEndTime, portfolio, meetingStart, meetingEnd, meetingDayValue); this.groupRepository.saveAndFlush(newCenter); From 52aa50f42eeb1a87b0e84918c8b9bd19600fb536 Mon Sep 17 00:00:00 2001 From: Brian Muhimbura Date: Thu, 25 Jul 2024 15:45:47 +0300 Subject: [PATCH 02/24] fix FSF-4 (#945) --- .../PrequalificationChecklistWritePlatformServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/service/PrequalificationChecklistWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/service/PrequalificationChecklistWritePlatformServiceImpl.java index d13edc6c076..2ccdd942e4e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/service/PrequalificationChecklistWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/service/PrequalificationChecklistWritePlatformServiceImpl.java @@ -394,7 +394,7 @@ private CheckValidationColor runCheck3(final ClientData clientData) { final String percentageIncreaseSQL = """ SELECT CASE WHEN (mlag.current_credit_value <= 0) THEN 0 - ELSE ((mlag.requested_value/mlag.current_credit_value) - 1) * 100 + ELSE ((mlag.agency_authorized_amount/mlag.current_credit_value) - 1) * 100 END AS percentageIncrease FROM m_loan_additionals_group mlag INNER JOIN m_loan ml ON ml.id = mlag.loan_id From 1178361f968f413dda025ec93d4a39ba97871d7b Mon Sep 17 00:00:00 2001 From: Brian Muhimbura Date: Thu, 25 Jul 2024 19:58:05 +0300 Subject: [PATCH 03/24] Fix/fsf 11 (#947) * fix FSF-4 * fix FSF-11 --- .../pentahoReports/Print Bank Cheque.prpt | Bin 8004 -> 8017 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 588f1c29c2fed8834eebb6fbb819efb1acf6d1d6..409f36ec8474522ee5539d7ccd531d0412b6b4da 100644 GIT binary patch delta 932 zcmX?NchQbFz?+$ci-CcIfgyA5&xyP~%s^^mOfDmco_vN;y}nVQ%e84$S6O(d=wF8G zk_SSQqPI2w`q?|#!STz%wx!35pU-=JBT~oyHP_pNm8m83mb9pHY%y7S>9$Q}wEd&q zDUm&5X`2IuDl$`ooB4LMDFkR=o%cPu@{+~b-VdjWb+bO$c;xB4Xl|Kb_W9h3^+y7) zuS$Nua@&;3P22~IymBAcYbD*8Hf@pS7g`an^v-)bsp#3 zioYUX<=>X$*etw|_x~m3#n+uVw!F%?=SmPI5I`SjF8*uk{`rKhjkN!fU-CP>J^tRQ>8cX!{eMt;+drTM>>P1C z^Z%4^GBDhbhFJ);Z*zjsOIEOXJ`!qR3pSTZeudbSE4>h$JOpKo!L+-K11Hc)5n$I( zo*<(O7Cj&%&6qX$4wT0uD{Ykv^i^_xUP)?RiC#r+PJlNflL&(d1JuTdSMR(yZGoOQ zWoBRyVn7CIlM`hXByjsCx;}kvu4-_((7?6sMMy zWagz8WAWPL19H-grIYW-Nh*Lm(Y^F|b}UeTH4uxVn3F3#xkg%YvYxyE8@~)l1^^t; BU~vEd delta 907 zcmca;cf^i2z?+$ci-CcIfgvDZ+C*L-W+1gOCYKRJPd>w_UeD>ME5^A>>sD-N=ojXg zbcXQG+?#x_o}2qIv3@<;w)A-M^LejtMC#bjl6rfvGPPvlk``5tEhbYh-BzlMwSRCs zCDKnUZF8VdMQY0J2EHAQ3IXa@=kZ6oUa~sd`{7ivuG9w`k35|h%`NlGKHtk&aU^j1 zs^s@8w@q^0#C@>HEBAGMR??kmVUwJA1D|Ai1__Of~&TkkIQG4IaQ74^@Sd+d*h zZ(8x?s=()ZfyG~0JHl9Y?iNz|ExmEOoZ#=-da@lC-ah!aXqoYupgH%}T<&>pnZEhq zqJI~vjZ(O!=5WORc+M!fSH@{UsDJl6_9zo|%fyz4nRc?v>pCARFG^qkVu#Id?J1M} z1H9Qe%H{o4OBfj#LRf&&0gM(Rl6hqOme6q2eDp*IfoU~;y z(8`>|%KTESZaZT2bkBRB?j=C?@t~MuKY6{JG{nO|Q!*qO7>Y|Ob5e`3`LKKG@$6Wj V?rIQ~vZA~e8 Date: Fri, 26 Jul 2024 13:39:02 +0300 Subject: [PATCH 04/24] Fix/fsf 11 (#950) * fix FSF-4 * fix FSF-11 * fix FSF-11 --- .../pentahoReports/Print Bank Cheque.prpt | Bin 8017 -> 8016 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 409f36ec8474522ee5539d7ccd531d0412b6b4da..5150f3a318c583f384b360827d98e2bb302dc194 100644 GIT binary patch delta 814 zcmca;cfpP~z?+$ci-CcIfgv^L*F;_)W+1gOCYKRJPd>vaQ}1`!K*06;UoP$H{kNtB zY4bX9+)!*e#V(Pa(JOR&lkAb_!s?ltTK##uzEr%sQ!HzJ^s0OC;_?rU(VI_MBuX+Z z&RKdkZL011_a9QrLjAaY|5_#5acb2zM&Ux{z(sypO%mI}B477zFnXcTlcUhFqNOyU zOsMdNZq?$2licR6^4nYAe#>j^rraLCfLBrR!mrJ@1c_vMEOM}XXriso@s?=`W9HpZ zEmbYag>yD#_T6Oi*T2@&eKV$@EpPpG*1M)WZ#VURlRM)q@ZRdhbSbx%+FJid2P5To zGpoclXl&nh{8h5$N`(Le>D-1@QEdxEeSPLmT%s8vSE(5umz5XY zkGoj+^X>WoKRd<%Z+4C^vA=GYGBOA;gs?C$fMQ96frEns6ibWCnIX|r#qtdlO`D5Z ztH1(_Kd?b0KC|x!OKjyR<#ghDH{-0nT5<6j`)3()b9c6bA@ z?JEvnlLy&oqV&V7n3I9whBTUmn{$O;vVskalu!fPu(?U{E7T3r3&BZ6PR1BahsZc^ z0NoS;a{lBwGJ0UavofAwT2j^wOb5x@g6T=JmSFmvtQ#jt6W9flW#z2FqS12FmhnOi z3^|FF`K2X#6}dS9-i%Bl4Df)6IAZm5&wB<2h9!&)3_L&@0lX)#my-sYau#Sxi6jF< laYc_1_?dRz0apS_bE9KRfFTY9|s`MlRRB6aLvbGTO~7xW(Z3#;5)2(M?WG%NK0-VxBtnL!777%qV5Y6c7>B4 zzIy1|_3ReB`bXrY`0H$esrw|8zVRn**~fITOQGD{DWzVy>>6`Y`Q@d|g12OCVy={Q zMRr}jX(jtv=W))h_$%^N{%tvq&B6ucRFr!RY)+~jzLH;9 zwVXP`nX`-kn!0~JVQVApf8>|^PH&IDcWSz- z1bhDA;Q+?*ryk`-)XgoGN{ip`CZUm!JBI1bE(>?DQ7#Nl?GBEG}X$0_@yiQIUY|0s+ qDW#GO48FJUbSswHk=U5k>%6xsw&-wb=M&K!O1DGElJq From 60e22c2640cdf419a7a3afb7346832e8c71ef3b1 Mon Sep 17 00:00:00 2001 From: Brian Muhimbura Date: Tue, 30 Jul 2024 19:26:40 +0300 Subject: [PATCH 05/24] fix FSF-17 (#957) --- ...ApplicationWritePlatformServiceJpaRepositoryImpl.java | 9 ++++++++- .../LoanWritePlatformServiceJpaRepositoryImpl.java | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java index 9ea6d5e4eb8..bce78bd949c 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java @@ -32,6 +32,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Objects; import java.util.Set; import javax.persistence.PersistenceException; import org.apache.commons.lang3.ObjectUtils; @@ -157,6 +158,7 @@ import org.apache.fineract.portfolio.loanproduct.LoanProductConstants; import org.apache.fineract.portfolio.loanproduct.data.LoanProductData; import org.apache.fineract.portfolio.loanproduct.domain.LoanProduct; +import org.apache.fineract.portfolio.loanproduct.domain.LoanProductOwnerType; import org.apache.fineract.portfolio.loanproduct.domain.LoanProductRelatedDetail; import org.apache.fineract.portfolio.loanproduct.domain.LoanProductRepository; import org.apache.fineract.portfolio.loanproduct.domain.LoanTransactionProcessingStrategy; @@ -2649,7 +2651,12 @@ public CommandProcessingResult approveApplication(final Long loanId, final JsonC calendar = calendarInstance.getCalendar(); } - LocalDate deriveFirstRepaymentDate = loanScheduleAssembler.deriveFirstRepaymentDate(loan, expectedDisbursementDate, calendar); + LocalDate deriveFirstRepaymentDate; + if (loan.getExpectedFirstRepaymentOnDate() != null && Objects.equals(loan.getLoanProduct().getOwnerType(), LoanProductOwnerType.INDIVIDUAL.getValue())) { + deriveFirstRepaymentDate = loan.getExpectedFirstRepaymentOnDate(); + } else { + deriveFirstRepaymentDate = loanScheduleAssembler.deriveFirstRepaymentDate(loan, expectedDisbursementDate, calendar); + } loan.setExpectedFirstRepaymentOnDate(deriveFirstRepaymentDate); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java index fec57f97651..672ae3e9424 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java @@ -42,6 +42,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Objects; import java.util.Set; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -226,6 +227,7 @@ import org.apache.fineract.portfolio.loanaccount.serialization.LoanUpdateCommandFromApiJsonDeserializer; import org.apache.fineract.portfolio.loanproduct.data.LoanOverdueDTO; import org.apache.fineract.portfolio.loanproduct.domain.LoanProduct; +import org.apache.fineract.portfolio.loanproduct.domain.LoanProductOwnerType; import org.apache.fineract.portfolio.loanproduct.exception.InvalidCurrencyException; import org.apache.fineract.portfolio.loanproduct.exception.LinkedAccountRequiredException; import org.apache.fineract.portfolio.note.domain.Note; @@ -406,7 +408,12 @@ public CommandProcessingResult disburseLoan(final Long loanId, final JsonCommand CalendarEntityType.LOANS.getValue()); Calendar calendar = calendarInstance!=null? calendarInstance.getCalendar():null; - LocalDate deriveFirstRepaymentDate = loanScheduleAssembler.deriveFirstRepaymentDate(loan, actualDisbursementDate, calendar); + LocalDate deriveFirstRepaymentDate; + if (loan.getExpectedFirstRepaymentOnDate() != null && Objects.equals(loan.getLoanProduct().getOwnerType(), LoanProductOwnerType.INDIVIDUAL.getValue())) { + deriveFirstRepaymentDate = loan.getExpectedFirstRepaymentOnDate(); + } else { + deriveFirstRepaymentDate = loanScheduleAssembler.deriveFirstRepaymentDate(loan, actualDisbursementDate, calendar); + } loan.setExpectedFirstRepaymentOnDate(deriveFirstRepaymentDate); ScheduleGeneratorDTO scheduleGeneratorDTO = this.loanUtilService.buildScheduleGeneratorDTO(loan, recalculateFrom); From 2ad90d56adc366d4df0021afd4a04415c4a8d2cf Mon Sep 17 00:00:00 2001 From: Muhimbura Brian Mart Date: Wed, 31 Jul 2024 12:45:10 +0300 Subject: [PATCH 06/24] fix FSF-15 --- .../tenant/parts/0134_HardPolicyFixes.xml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0134_HardPolicyFixes.xml b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0134_HardPolicyFixes.xml index a9fecb308d1..bfad409c458 100644 --- a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0134_HardPolicyFixes.xml +++ b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0134_HardPolicyFixes.xml @@ -131,6 +131,20 @@ + + + + + + + From 8dcdc0980f1dee800d4f9ff5c16989cfb879e3cf Mon Sep 17 00:00:00 2001 From: Muhimbura Brian Mart Date: Wed, 31 Jul 2024 14:34:39 +0300 Subject: [PATCH 07/24] fix FSF-12 --- .../PrequalificationChecklistWritePlatformServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/service/PrequalificationChecklistWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/service/PrequalificationChecklistWritePlatformServiceImpl.java index 2ccdd942e4e..7ca4083e892 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/service/PrequalificationChecklistWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/service/PrequalificationChecklistWritePlatformServiceImpl.java @@ -647,7 +647,7 @@ private CheckValidationColor runCheck8(final GroupData groupData) { reportParams.put("${prequalificationId}", prequalificationId); reportParams.put("${loanProductId}", productId); reportParams.put("${clientArea}", clientArea); - String categorization = groupData.getTopupMembers().size()>0?"RECREDITO":"NUEVO"; + String categorization = groupData.getPreviousPrequalification()!=null?"RECREDITO":"NUEVO"; reportParams.put("${categorization}", categorization); reportParams.put("${disparityRatio}", disparityRatio); final GenericResultsetData result = this.readReportingService.retrieveGenericResultset(reportName, "report", reportParams, false); From ea8aea004f0d1b6c17e04e8b2aa0c08cc9f210dc Mon Sep 17 00:00:00 2001 From: Muhimbura Brian Mart Date: Thu, 1 Aug 2024 14:23:48 +0300 Subject: [PATCH 08/24] fix FSF-19 --- .../pentahoReports/Print Bank Cheque.prpt | Bin 8016 -> 8017 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 5150f3a318c583f384b360827d98e2bb302dc194..086cd79221ad3b40a449ff9e864e4d768d39cfcf 100644 GIT binary patch delta 4677 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 delta 4676 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 c>t^w{Z}8un?td} Date: Thu, 1 Aug 2024 14:27:18 +0300 Subject: [PATCH 09/24] fix FSF-19 (#969) --- .../pentahoReports/Print Bank Cheque.prpt | Bin 8016 -> 8017 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 5150f3a318c583f384b360827d98e2bb302dc194..086cd79221ad3b40a449ff9e864e4d768d39cfcf 100644 GIT binary patch delta 4677 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 delta 4676 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 c>t^w{Z}8un?td} Date: Fri, 2 Aug 2024 14:44:29 +0300 Subject: [PATCH 10/24] Fix/fs 18 (#977) * fix FSF-19 * FIX FSF-18 --- .../LoanWritePlatformServiceJpaRepositoryImpl.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java index 672ae3e9424..5b06618e877 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java @@ -1477,11 +1477,10 @@ public CommandProcessingResult writeOff(final Long loanId, final JsonCommand com SavingsAccountTransaction holdTransaction = savingsAccountTransactions.stream().filter(sa -> sa.isAmountOnHoldNotReleased()) .findFirst().orElse(null); - SavingsAccount fromSavingsAccount = holdTransaction.getSavingsAccount(); - - this.savingsAccountWritePlatformService.releaseLoanGuarantee(loanId, command, - command.localDateValueOfParameterNamed("transactionDate"), holdTransaction); - + if (holdTransaction!=null) { + this.savingsAccountWritePlatformService.releaseLoanGuarantee(loanId, command, + command.localDateValueOfParameterNamed("transactionDate"), holdTransaction); + } businessEventNotifierService.notifyPostBusinessEvent(new LoanWrittenOffPostBusinessEvent(writeOff)); return new CommandProcessingResultBuilder().withCommandId(command.commandId()).withEntityId(writeOff.getId()) .withOfficeId(loan.getOfficeId()).withClientId(loan.getClientId()).withGroupId(loan.getGroupId()).withLoanId(loanId) From 22f56278a861c6e9cdc538cd803d8dbccfc789d7 Mon Sep 17 00:00:00 2001 From: Brian Muhimbura Date: Fri, 2 Aug 2024 19:08:25 +0300 Subject: [PATCH 11/24] Fix/fsf 20 (#980) * fix FSF-19 * FIX FSF-18 * FIX FSF-20 --- .../tenant/parts/0134_HardPolicyFixes.xml | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0134_HardPolicyFixes.xml b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0134_HardPolicyFixes.xml index bfad409c458..967380dd9d3 100644 --- a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0134_HardPolicyFixes.xml +++ b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0134_HardPolicyFixes.xml @@ -143,6 +143,85 @@ ]]> + + + 3) THEN 'YELLOW' + WHEN (${loanProductId} = 2) AND ('${categorization}' = 'RECREDITO') AND ('${clientArea}' = 'URBANA') AND (${disparityRatio} BETWEEN 1 AND 4) THEN 'GREEN' + WHEN (${loanProductId} = 2) AND ('${categorization}' = 'RECREDITO') AND ('${clientArea}' = 'URBANA') AND (${disparityRatio} > 4) THEN 'YELLOW' + WHEN (${loanProductId} = 2) AND ('${categorization}' = 'NUEVO') AND ('${clientArea}' = 'RURAL') AND (${disparityRatio} BETWEEN 1 AND 3) THEN 'GREEN' + WHEN (${loanProductId} = 2) AND ('${categorization}' = 'NUEVO') AND ('${clientArea}' = 'RURAL') AND (${disparityRatio} > 3) THEN 'YELLOW' + WHEN (${loanProductId} = 2) AND ('${categorization}' = 'RECREDITO') AND ('${clientArea}' = 'RURAL') AND (${disparityRatio} BETWEEN 1 AND 4) THEN 'GREEN' + WHEN (${loanProductId} = 2) AND ('${categorization}' = 'RECREDITO') AND ('${clientArea}' = 'RURAL') AND (${disparityRatio} > 4) THEN 'YELLOW' + + WHEN (${loanProductId} = 9) AND ('${categorization}' = 'RECREDITO') AND ('${clientArea}' = 'URBANA') AND (${disparityRatio} BETWEEN 1 AND 4) THEN 'GREEN' + WHEN (${loanProductId} = 9) AND ('${categorization}' = 'RECREDITO') AND ('${clientArea}' = 'URBANA') AND (${disparityRatio} > 4) THEN 'YELLOW' + WHEN (${loanProductId} = 9) AND ('${categorization}' = 'RECREDITO') AND ('${clientArea}' = 'RURAL') AND (${disparityRatio} BETWEEN 1 AND 4) THEN 'GREEN' + WHEN (${loanProductId} = 9) AND ('${categorization}' = 'RECREDITO') AND ('${clientArea}' = 'RURAL') AND (${disparityRatio} > 4) THEN 'YELLOW' + + WHEN (${loanProductId} = 9) AND ('${categorization}' = 'NUEVO') AND ('${clientArea}' = 'URBANA') AND (${disparityRatio} BETWEEN 1 AND 3) THEN 'GREEN' + WHEN (${loanProductId} = 9) AND ('${categorization}' = 'NUEVO') AND ('${clientArea}' = 'URBANA') AND (${disparityRatio} > 3) THEN 'YELLOW' + WHEN (${loanProductId} = 9) AND ('${categorization}' = 'NUEVO') AND ('${clientArea}' = 'RURAL') AND (${disparityRatio} BETWEEN 1 AND 3) THEN 'GREEN' + WHEN (${loanProductId} = 9) AND ('${categorization}' = 'NUEVO') AND ('${clientArea}' = 'RURAL') AND (${disparityRatio} > 3) THEN 'YELLOW' + + WHEN (${loanProductId} = 8) AND ('${categorization}' = 'NUEVO') AND ('${clientArea}' = 'URBANA') AND (${disparityRatio} BETWEEN 1 AND 3) THEN 'GREEN' + WHEN (${loanProductId} = 8) AND ('${categorization}' = 'NUEVO') AND ('${clientArea}' = 'URBANA') AND (${disparityRatio} > 3) THEN 'YELLOW' + WHEN (${loanProductId} = 8) AND ('${categorization}' = 'RECREDITO') AND ('${clientArea}' = 'URBANA') AND (${disparityRatio} BETWEEN 1 AND 4) THEN 'GREEN' + WHEN (${loanProductId} = 8) AND ('${categorization}' = 'RECREDITO') AND ('${clientArea}' = 'URBANA') AND (${disparityRatio} > 4) THEN 'YELLOW' + WHEN (${loanProductId} = 8) AND ('${categorization}' = 'NUEVO') AND ('${clientArea}' = 'RURAL') AND (${disparityRatio} BETWEEN 1 AND 3) THEN 'GREEN' + WHEN (${loanProductId} = 8) AND ('${categorization}' = 'NUEVO') AND ('${clientArea}' = 'RURAL') AND (${disparityRatio} > 3) THEN 'YELLOW' + WHEN (${loanProductId} = 8) AND ('${categorization}' = 'RECREDITO') AND ('${clientArea}' = 'RURAL') AND (${disparityRatio} BETWEEN 1 AND 4) THEN 'GREEN' + WHEN (${loanProductId} = 8) AND ('${categorization}' = 'RECREDITO') AND ('${clientArea}' = 'RURAL') AND (${disparityRatio} > 4) THEN 'YELLOW' + + WHEN (${loanProductId} = 2) AND ('${categorization}' = 'RECREDITO') AND ('${clientArea}' = 'URBANA') + AND recredit_loan.recredit_count > 0 AND (${disparityRatio} BETWEEN 1 AND 4) THEN 'GREEN' + WHEN (${loanProductId} = 2) AND ('${categorization}' = 'RECREDITO') AND ('${clientArea}' = 'URBANA') + AND recredit_loan.recredit_count > 0 AND (${disparityRatio} > 4) THEN 'YELLOW' + WHEN (${loanProductId} = 2) AND ('${categorization}' = 'RECREDITO') AND ('${clientArea}' = 'RURAL') + AND recredit_loan.recredit_count > 0 AND (${disparityRatio} BETWEEN 1 AND 4) THEN 'GREEN' + WHEN (${loanProductId} = 2) AND ('${categorization}' = 'RECREDITO') AND ('${clientArea}' = 'RURAL') + AND recredit_loan.recredit_count > 0 AND (${disparityRatio} > 4) THEN 'YELLOW' + + WHEN (${loanProductId} = 8) AND ('${categorization}' = 'RECREDITO') AND ('${clientArea}' = 'URBANA') + AND recredit_loan.recredit_count > 0 AND (${disparityRatio} BETWEEN 1 AND 4) THEN 'GREEN' + WHEN (${loanProductId} = 8) AND ('${categorization}' = 'RECREDITO') AND ('${clientArea}' = 'URBANA') + AND recredit_loan.recredit_count > 0 AND (${disparityRatio} > 4) THEN 'YELLOW' + WHEN (${loanProductId} = 8) AND ('${categorization}' = 'RECREDITO') AND ('${clientArea}' = 'RURAL') + AND recredit_loan.recredit_count > 0 AND (${disparityRatio} BETWEEN 1 AND 4) THEN 'GREEN' + WHEN (${loanProductId} = 8) AND ('${categorization}' = 'RECREDITO') AND ('${clientArea}' = 'RURAL') + AND recredit_loan.recredit_count > 0 AND (${disparityRatio} > 4) THEN 'YELLOW' + + WHEN (${loanProductId} = 9) AND ('${categorization}' = 'RECREDITO') AND ('${clientArea}' = 'URBANA') + AND recredit_loan.recredit_count > 0 AND (${disparityRatio} BETWEEN 1 AND 4) THEN 'GREEN' + WHEN (${loanProductId} = 9) AND ('${categorization}' = 'RECREDITO') AND ('${clientArea}' = 'URBANA') + AND recredit_loan.recredit_count > 0 AND (${disparityRatio} > 4) THEN 'YELLOW' + WHEN (${loanProductId} = 9) AND ('${categorization}' = 'RECREDITO') AND ('${clientArea}' = 'RURAL') + AND recredit_loan.recredit_count > 0 AND (${disparityRatio} BETWEEN 1 AND 4) THEN 'GREEN' + WHEN (${loanProductId} = 9) AND ('${categorization}' = 'RECREDITO') AND ('${clientArea}' = 'RURAL') + AND recredit_loan.recredit_count > 0 AND (${disparityRatio} > 4) THEN 'YELLOW' + + END AS color + FROM m_prequalification_group mpg + LEFT JOIN ( + SELECT p.id AS prequalification_id, + (select count(ml.id) FROM m_prequalification_group mp + LEFT JOIN m_prequalification_group_members mpgm ON mpgm.group_id = mp.id + LEFT JOIN m_client mc ON mc.dpi = mpgm.dpi + LEFT JOIN m_loan ml ON ml.client_id = mc.id + WHERE + ml.loan_status_id < 300 AND ml.product_id = ${loanProductId} AND ml.is_topup = 1 + AND mp.id = ${prequalificationId} + ) recredit_count + FROM m_prequalification_group p + ) recredit_loan ON recredit_loan.prequalification_id = mpg.id + WHERE mpg.id = ${prequalificationId}" + WHERE report_name = "Value disparity Policy Check"; + ]]> + + From c199fef823bf064ac2029e094308370b2d144a9a Mon Sep 17 00:00:00 2001 From: Muhimbura Brian Mart Date: Mon, 5 Aug 2024 14:37:36 +0300 Subject: [PATCH 12/24] QA-FSF-18-20 --- .../tenant/parts/0134_HardPolicyFixes.xml | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0134_HardPolicyFixes.xml b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0134_HardPolicyFixes.xml index bfad409c458..bd80c0be221 100644 --- a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0134_HardPolicyFixes.xml +++ b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0134_HardPolicyFixes.xml @@ -144,7 +144,35 @@ - + + + = 0) THEN 'GREEN' + WHEN (${loanProductId} = 9) AND (prequalification_details.recreditCategorization = 'RECREDITO') AND ('${clientArea}' = 'RURAL') AND (COALESCE(prequalification_details.number_of_completed_loans, 0) >= 0) THEN 'GREEN' + WHEN (${loanProductId} = 9) AND (prequalification_details.recreditCategorization = 'NUEVO') AND ('${clientArea}' = 'URBANA') AND (COALESCE(prequalification_details.number_of_completed_loans, 0) >= 0) THEN 'GREEN' + WHEN (${loanProductId} = 9) AND (prequalification_details.recreditCategorization = 'NUEVO') AND ('${clientArea}' = 'RURAL') AND (COALESCE(prequalification_details.number_of_completed_loans, 0) >= 0) THEN 'GREEN' + END AS color + FROM m_prequalification_group mpg + LEFT JOIN ( + SELECT p.id AS prequalification_id, + (CASE WHEN p.previous_prequalification IS NOT NULL THEN 'RECREDITO' ELSE 'NUEVO' END) AS recreditCategorization, + (SELECT COUNT(*) + FROM m_prequalification_group mp + LEFT JOIN m_group_prequalification_relationship mgpr ON mgpr.prequalification_id = mp.id + LEFT JOIN m_group mg ON (mg.prequalification_id = mp.id OR mg.id = mgpr.group_id) + LEFT JOIN m_loan ml ON ml.group_id = mg.id + WHERE ml.loan_status_id >= 600 AND mg.status_enum = 300 AND mp.id = ${prequalificationId} + GROUP BY mp.id) AS number_of_completed_loans + FROM m_prequalification_group p + )prequalification_details ON prequalification_details.prequalification_id = mpg.id + WHERE mpg.id = ${prequalificationId}" WHERE report_name = "Cancelled Cycles Count Policy Check"; + ]]> + + From 2d6c4a6e1dfd9cb6965391cece0f80433b765622 Mon Sep 17 00:00:00 2001 From: Brian Muhimbura Date: Mon, 5 Aug 2024 18:11:24 +0300 Subject: [PATCH 13/24] Fix/fsf 21 (#989) * FSF 22 * FSF 22 --- ...ificationChecklistWritePlatformServiceImpl.java | 3 +-- .../tenant/parts/0134_HardPolicyFixes.xml | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/service/PrequalificationChecklistWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/service/PrequalificationChecklistWritePlatformServiceImpl.java index 7ca4083e892..dd3bd786b20 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/service/PrequalificationChecklistWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/service/PrequalificationChecklistWritePlatformServiceImpl.java @@ -416,7 +416,6 @@ CASE WHEN (mlag.current_credit_value <= 0) THEN 0 * Mandatory to attach photographs and investment plan */ private CheckValidationColor runCheck4(final ClientData clientData) { - final ClientData clientParams = retrieveClientParams(clientData.getClientId(), clientData.getProductId()); final String reportName = Policies.FOUR.getName() + " Policy Check"; final String productId = Long.toString(clientData.getProductId()); final Long loanId = clientData.getLoanId(); @@ -441,7 +440,7 @@ SELECT COUNT(*) final Map reportParams = new HashMap<>(); reportParams.put("${loanProductId}", productId); - reportParams.put("${categorization}", clientParams.getCategorization()); + reportParams.put("${categorization}", clientData.getCategorization()); reportParams.put("${investmentPlan}", Long.toString(investmentPlanCount)); reportParams.put("${photographs}", Long.toString(photographsCount)); reportParams.put("${requestedAmount}", clientData.getRequestedAmount().toPlainString()); diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0134_HardPolicyFixes.xml b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0134_HardPolicyFixes.xml index 6d8af02b55c..a8e3a4a05ab 100644 --- a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0134_HardPolicyFixes.xml +++ b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0134_HardPolicyFixes.xml @@ -253,5 +253,19 @@ + + + + + + From e928290f25b736c696b7afbf6deedaff3f90e6e2 Mon Sep 17 00:00:00 2001 From: Brian Muhimbura Date: Mon, 5 Aug 2024 21:04:35 +0300 Subject: [PATCH 14/24] Fix/fsf 21 (#990) * FSF 22 * FSF 22 * FSF 22 --- .../PrequalificationChecklistWritePlatformServiceImpl.java | 5 ++--- .../db/changelog/tenant/parts/0134_HardPolicyFixes.xml | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/service/PrequalificationChecklistWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/service/PrequalificationChecklistWritePlatformServiceImpl.java index dd3bd786b20..0c561a09078 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/service/PrequalificationChecklistWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/service/PrequalificationChecklistWritePlatformServiceImpl.java @@ -261,7 +261,6 @@ SELECT mc.id AS clientId,mc.loan_cycle as loanCycle, mpgm.id AS prequalification mpgm.requested_amount AS requestedAmount, IFNULL(mc.date_of_birth, mpgm.dob) AS dateOfBirth, IFNULL(mc.dpi, mpgm.dpi) AS dpi, mpgm.work_with_puente AS workWithPuente, mcv.code_value As gender, mpgm.is_president AS president, mpgm.buro_check_status as buroCheckStatus, mpgm.agency_bureau_status as agencyBuroStatus, ml.is_topup AS isTopup, ml.id AS loanId, mcvl.code_value as loanCycleCompleted, - ml.is_topup AS isTopup, ml.id AS loanId, mcvl.code_value as loanCycleCompleted, CASE WHEN (? NOT IN (3,7,4,5)) AND (COALESCE(mc.loan_cycle, 0) >= 3) THEN 'RECURRING' WHEN (? IN (4,5)) AND (COALESCE(mc.loan_cycle, 0) >= 1) THEN 'RECURRING' ELSE 'NEW' END as clientCategorization, @@ -278,7 +277,7 @@ CASE WHEN (? NOT IN (3,7,4,5)) AND (COALESCE(mc.loan_cycle, 0) >= 3) THEN 'RECUR LEFT JOIN m_prequalification_group mpg ON mpg.id = mpgm.group_id LEFT JOIN m_loan ml ON ml.client_id = mc.id AND ml.loan_status_id = 100 AND ml.prequalification_id = mpg.id LEFT JOIN m_loan_additionals_group mlad ON mlad.loan_id = ml.id - LEFT JOIN m_code_value mcvl ON mcv.id = mlad.loan_cycle_completed + LEFT JOIN m_code_value mcvl ON mcvl.id = mlad.loan_cycle_completed WHERE mpg.id = ? GROUP BY mc.id """; } @@ -440,7 +439,7 @@ SELECT COUNT(*) final Map reportParams = new HashMap<>(); reportParams.put("${loanProductId}", productId); - reportParams.put("${categorization}", clientData.getCategorization()); + reportParams.put("${categorization}", clientData.getRecreditCategorization()); reportParams.put("${investmentPlan}", Long.toString(investmentPlanCount)); reportParams.put("${photographs}", Long.toString(photographsCount)); reportParams.put("${requestedAmount}", clientData.getRequestedAmount().toPlainString()); diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0134_HardPolicyFixes.xml b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0134_HardPolicyFixes.xml index a8e3a4a05ab..54e3b3408e1 100644 --- a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0134_HardPolicyFixes.xml +++ b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0134_HardPolicyFixes.xml @@ -257,7 +257,7 @@ Date: Tue, 6 Aug 2024 14:14:20 +0300 Subject: [PATCH 15/24] FSF 23 (#992) --- .../LoanApplicationWritePlatformServiceJpaRepositoryImpl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java index bce78bd949c..751e691dd8d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java @@ -1570,8 +1570,10 @@ public CommandProcessingResult modifyApplication(final Long loanId, final JsonCo } else { additionals.update(command); } + String deleteExtraLoans = "delete from m_loan_external_existing_loans where loan_id=?"; + this.jdbcTemplate.update(deleteExtraLoans, existingLoanApplication.getId()); updateExternalLoans(command, additionals); - this.groupLoanAdditionalsRepository.save(additionals); + this.groupLoanAdditionalsRepository.saveAndFlush(additionals); } if (productRelatedDetail.isInterestRecalculationEnabled()) { From a01acdab15b5b22640cc9d3168883c73c9fe9a24 Mon Sep 17 00:00:00 2001 From: Brian Muhimbura Date: Thu, 8 Aug 2024 21:54:01 +0300 Subject: [PATCH 16/24] FBR-710 (#1000) --- .../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 6adf8458b310c2a75bbc4033b5470540d06d2764 Mon Sep 17 00:00:00 2001 From: Brian Muhimbura Date: Tue, 13 Aug 2024 14:49:46 +0300 Subject: [PATCH 17/24] Fix/fsf 24 (#1014) * FBR-710 * 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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 From f3728f6c23bf86ca858eff3de355ab42a9dec600 Mon Sep 17 00:00:00 2001 From: Brian Muhimbura Date: Wed, 14 Aug 2024 19:59:40 +0300 Subject: [PATCH 18/24] Feature/fbr 714 (#1018) * FBR-710 * FBR-714 --- ...tionChecklistWritePlatformServiceImpl.java | 2 +- .../db/changelog/tenant/changelog-tenant.xml | 1 + .../tenant/commands/BACCOMMEDA/client_age.sql | 76 +++++++++++++ .../commands/BACCOMMEDA/investment_plan.sql | 27 +++++ .../BACCOMMEDA/maxium_and_minimum_amount.sql | 58 ++++++++++ .../commands/BACCOMMEDA/number_of_members.sql | 35 ++++++ .../commands/BACCOMMEDA/own_home_policy.sql | 40 +++++++ .../BACCOMMEDA/percentage_increase.sql | 73 +++++++++++++ .../presidet_board_of_directors.sql | 61 +++++++++++ .../commands/BACCOMMEDA/value_disparity.sql | 76 +++++++++++++ .../0135_FBR-714-BANCO_COMMUNAL_MEDA.xml | 102 ++++++++++++++++++ 11 files changed, 550 insertions(+), 1 deletion(-) create mode 100644 fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/client_age.sql create mode 100644 fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/investment_plan.sql create mode 100644 fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/maxium_and_minimum_amount.sql create mode 100644 fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/number_of_members.sql create mode 100644 fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/own_home_policy.sql create mode 100644 fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/percentage_increase.sql create mode 100644 fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/presidet_board_of_directors.sql create mode 100644 fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/value_disparity.sql create mode 100644 fineract-provider/src/main/resources/db/changelog/tenant/parts/0135_FBR-714-BANCO_COMMUNAL_MEDA.xml diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/service/PrequalificationChecklistWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/service/PrequalificationChecklistWritePlatformServiceImpl.java index 0c561a09078..69f2942a7a3 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/service/PrequalificationChecklistWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/prequalification/service/PrequalificationChecklistWritePlatformServiceImpl.java @@ -605,7 +605,7 @@ private CheckValidationColor runCheck7(final ClientData clientData) { reportParams.put("${prequalificationId}", prequalificationId); reportParams.put("${loanProductId}", productId); reportParams.put("${clientArea}", clientArea); - reportParams.put("${categorization}", clientData.getCategorization()); + reportParams.put("${categorization}", clientData.getRecreditCategorization()); reportParams.put("${isTopup}", String.valueOf(clientData.getIsLoanTopup())); reportParams.put("${requestedAmount}", String.valueOf(clientData.getRequestedAmount())); final GenericResultsetData result = this.readReportingService.retrieveGenericResultset(reportName, "report", reportParams, false); diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml index ee0b7047449..5ede958db2f 100644 --- a/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml +++ b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml @@ -154,4 +154,5 @@ + diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/client_age.sql b/fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/client_age.sql new file mode 100644 index 00000000000..1183afe4d0c --- /dev/null +++ b/fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/client_age.sql @@ -0,0 +1,76 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +SELECT @productId := (select id from m_product_loan where short_name='BCOMMEDA' limit 1); +UPDATE stretchy_report SET report_sql = concat('SELECT mc.id, + client_age.client_age AS client_age, + mc.date_of_birth AS date_of_birth, + CASE + -- Banco Comunal normal + WHEN (${loanProductId} = 2) AND (''${clientCategorization}'' = ''NEW'') AND (IFNULL(client_age.client_age, 0) BETWEEN 18 AND 70) THEN ''GREEN'' + WHEN (${loanProductId} = 2) AND (''${clientCategorization}'' = ''NEW'') AND (IFNULL(client_age.client_age, 0) BETWEEN 71 AND 75) THEN ''YELLOW'' + WHEN (${loanProductId} = 2) AND (''${clientCategorization}'' = ''NEW'') AND (IFNULL(client_age.client_age, 0) NOT BETWEEN 18 AND 75) THEN ''RED'' + WHEN (${loanProductId} = 2) AND (''${clientCategorization}'' = ''RECURRING'') AND (IFNULL(client_age.client_age, 0) BETWEEN 18 AND 75) THEN ''GREEN'' + WHEN (${loanProductId} = 2) AND (''${clientCategorization}'' = ''RECURRING'') AND (IFNULL(client_age.client_age, 0) NOT BETWEEN 18 AND 75) THEN ''RED'' + + -- Banco Comunal normal meda + WHEN (${loanProductId} = ',@productId,') AND (''${clientCategorization}'' = ''NEW'') AND (IFNULL(client_age.client_age, 0) BETWEEN 18 AND 70) THEN ''GREEN'' + WHEN (${loanProductId} = ',@productId,') AND (''${clientCategorization}'' = ''NEW'') AND (IFNULL(client_age.client_age, 0) BETWEEN 71 AND 75) THEN ''YELLOW'' + WHEN (${loanProductId} = ',@productId,') AND (''${clientCategorization}'' = ''NEW'') AND (IFNULL(client_age.client_age, 0) NOT BETWEEN 18 AND 75) THEN ''RED'' + WHEN (${loanProductId} = ',@productId,') AND (''${clientCategorization}'' = ''RECURRING'') AND (IFNULL(client_age.client_age, 0) BETWEEN 18 AND 75) THEN ''GREEN'' + WHEN (${loanProductId} = ',@productId,') AND (''${clientCategorization}'' = ''RECURRING'') AND (IFNULL(client_age.client_age, 0) NOT BETWEEN 18 AND 75) THEN ''RED'' + + -- Banco Comunal temporal + WHEN (${loanProductId} = 9) AND (''${clientCategorization}'' = ''NEW'') AND (IFNULL(client_age.client_age, 0) BETWEEN 18 AND 70) THEN ''GREEN'' + WHEN (${loanProductId} = 9) AND (''${clientCategorization}'' = ''NEW'') AND (IFNULL(client_age.client_age, 0) BETWEEN 71 AND 75) THEN ''YELLOW'' + WHEN (${loanProductId} = 9) AND (''${clientCategorization}'' = ''NEW'') AND (IFNULL(client_age.client_age, 0) NOT BETWEEN 18 AND 75) THEN ''RED'' + WHEN (${loanProductId} = 9) AND (''${clientCategorization}'' = ''RECURRING'') AND (IFNULL(client_age.client_age, 0) BETWEEN 18 AND 75) THEN ''GREEN'' + WHEN (${loanProductId} = 9) AND (''${clientCategorization}'' = ''RECURRING'') AND (IFNULL(client_age.client_age, 0) NOT BETWEEN 18 AND 75) THEN ''RED'' + + + -- Banco Comunal Agricola + WHEN (${loanProductId} = 8) AND (''${clientCategorization}'' = ''NEW'') AND (IFNULL(client_age.client_age, 0) BETWEEN 18 AND 70) THEN ''GREEN'' + WHEN (${loanProductId} = 8) AND (''${clientCategorization}'' = ''NEW'') AND (IFNULL(client_age.client_age, 0) BETWEEN 71 AND 75) THEN ''YELLOW'' + WHEN (${loanProductId} = 8) AND (''${clientCategorization}'' = ''NEW'') AND (IFNULL(client_age.client_age, 0) NOT BETWEEN 18 AND 75) THEN ''RED'' + WHEN (${loanProductId} = 8) AND (''${clientCategorization}'' = ''RECURRING'') AND (IFNULL(client_age.client_age, 0) BETWEEN 18 AND 75) THEN ''GREEN'' + WHEN (${loanProductId} = 8) AND (''${clientCategorization}'' = ''RECURRING'') AND (IFNULL(client_age.client_age, 0) NOT BETWEEN 18 AND 75) THEN ''RED'' + + + -- Grupo Solidario + WHEN (${loanProductId} = 4) AND (''${clientCategorization}'' = ''NEW'') AND (IFNULL(client_age.client_age, 0) BETWEEN 18 AND 70) THEN ''GREEN'' + WHEN (${loanProductId} = 4) AND (''${clientCategorization}'' = ''NEW'') AND (IFNULL(client_age.client_age, 0) BETWEEN 71 AND 75) THEN ''YELLOW'' + WHEN (${loanProductId} = 4) AND (''${clientCategorization}'' = ''NEW'') AND (IFNULL(client_age.client_age, 0) NOT BETWEEN 18 AND 75) THEN ''RED'' + WHEN (${loanProductId} = 4) AND (''${clientCategorization}'' = ''RECURRING'') AND (IFNULL(client_age.client_age, 0) BETWEEN 18 AND 75) THEN ''GREEN'' + WHEN (${loanProductId} = 4) AND (''${clientCategorization}'' = ''RECURRING'') AND (IFNULL(client_age.client_age, 0) NOT BETWEEN 18 AND 75) THEN ''RED'' + + + -- Grupo Solidario Agricola + WHEN (${loanProductId} = 5) AND (''${clientCategorization}'' = ''NEW'') AND (IFNULL(client_age.client_age, 0) BETWEEN 18 AND 70) THEN ''GREEN'' + WHEN (${loanProductId} = 5) AND (''${clientCategorization}'' = ''NEW'') AND (IFNULL(client_age.client_age, 0) BETWEEN 71 AND 75) THEN ''YELLOW'' + WHEN (${loanProductId} = 5) AND (''${clientCategorization}'' = ''NEW'') AND (IFNULL(client_age.client_age, 0) NOT BETWEEN 18 AND 75) THEN ''RED'' + WHEN (${loanProductId} = 5) AND (''${clientCategorization}'' = ''RECURRING'') AND (IFNULL(client_age.client_age, 0) BETWEEN 18 AND 75) THEN ''GREEN'' + WHEN (${loanProductId} = 5) AND (''${clientCategorization}'' = ''RECURRING'') AND (IFNULL(client_age.client_age, 0) NOT BETWEEN 18 AND 75) THEN ''RED'' + END AS color + FROM m_client mc + INNER JOIN ( + SELECT mct.id AS client_id, mct.date_of_birth AS date_of_birth, IFNULL(TIMESTAMPDIFF(YEAR, mct.date_of_birth, CURDATE()), 0) AS client_age + FROM m_client mct + ) client_age ON client_age.client_id = mc.id + WHERE mc.id = ${clientId}') +WHERE report_name = 'Client age Policy Check'; diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/investment_plan.sql b/fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/investment_plan.sql new file mode 100644 index 00000000000..390c28036d6 --- /dev/null +++ b/fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/investment_plan.sql @@ -0,0 +1,27 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +SELECT @productId := (select id from m_product_loan where short_name='BCOMMEDA' limit 1); +UPDATE stretchy_report SET report_sql = concat(' SELECT CASE + WHEN (${loanProductId} IN (9)) AND ''${categorization}'' = ''RECREDITO'' AND ${requestedAmount} <= 6000 THEN ''GREEN'' + WHEN (${loanProductId} IN (2,',@productId,',8)) AND ${requestedAmount} <= 6000 THEN ''GREEN'' + WHEN (${loanProductId} IN (2,',@productId,',9,8,4,5,7)) AND (${photographs} <= 0 OR ${investmentPlan} <= 0) THEN ''RED'' + ELSE ''GREEN'' + END AS color') +WHERE report_name = 'Mandatory to attach photographs and investment plan Policy Check'; diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/maxium_and_minimum_amount.sql b/fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/maxium_and_minimum_amount.sql new file mode 100644 index 00000000000..e858bf55af5 --- /dev/null +++ b/fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/maxium_and_minimum_amount.sql @@ -0,0 +1,58 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +SELECT @productId := (select id from m_product_loan where short_name='BCOMMEDA' limit 1); +UPDATE stretchy_report SET report_sql = concat('SELECT + CASE + WHEN (${isTopup} = true) AND (${loanProductId} IN (2,8,9,',@productId,')) AND (${requestedAmount} BETWEEN 1500 AND 20000) THEN ''GREEN'' + WHEN (${isTopup} = true) AND (${loanProductId} IN (4,5)) AND (${requestedAmount} BETWEEN 5000 AND 25000) THEN ''GREEN'' + + WHEN (${isTopup} = false) AND (${loanProductId} = 2) AND (''${categorization}'' = ''NUEVO'') AND (''${clientArea}'' = ''URBAN'') AND (${requestedAmount} BETWEEN 1500 AND 5000) THEN ''GREEN'' + WHEN (${isTopup} = false) AND (${loanProductId} = 2) AND (''${categorization}'' = ''RECREDITO'') AND (''${clientArea}'' = ''URBAN'') AND (${requestedAmount} BETWEEN 1500 AND 20000) THEN ''GREEN'' + WHEN (${isTopup} = false) AND (${loanProductId} = 2) AND (''${categorization}'' = ''NUEVO'') AND (''${clientArea}'' = ''RURAL'') AND (${requestedAmount} BETWEEN 1500 AND 5000) THEN ''GREEN'' + WHEN (${isTopup} = false) AND (${loanProductId} = 2) AND (''${categorization}'' = ''RECREDITO'') AND (''${clientArea}'' = ''RURAL'') AND (${requestedAmount} BETWEEN 1500 AND 20000) THEN ''GREEN'' + + WHEN (${isTopup} = false) AND (${loanProductId} = ',@productId,') AND (''${categorization}'' = ''NUEVO'') AND (''${clientArea}'' = ''URBAN'') AND (${requestedAmount} BETWEEN 1500 AND 5000) THEN ''GREEN'' + WHEN (${isTopup} = false) AND (${loanProductId} = ',@productId,') AND (''${categorization}'' = ''RECREDITO'') AND (''${clientArea}'' = ''URBAN'') AND (${requestedAmount} BETWEEN 1500 AND 20000) THEN ''GREEN'' + WHEN (${isTopup} = false) AND (${loanProductId} = ',@productId,') AND (''${categorization}'' = ''NUEVO'') AND (''${clientArea}'' = ''RURAL'') AND (${requestedAmount} BETWEEN 1500 AND 5000) THEN ''GREEN'' + WHEN (${isTopup} = false) AND (${loanProductId} = ',@productId,') AND (''${categorization}'' = ''RECREDITO'') AND (''${clientArea}'' = ''RURAL'') AND (${requestedAmount} BETWEEN 1500 AND 20000) THEN ''GREEN'' + + WHEN (${isTopup} = false) AND (${loanProductId} = 8) AND (''${categorization}'' = ''NUEVO'') AND (''${clientArea}'' = ''URBAN'') AND (${requestedAmount} BETWEEN 1500 AND 5000) THEN ''GREEN'' + WHEN (${isTopup} = false) AND (${loanProductId} = 8) AND (''${categorization}'' = ''RECREDITO'') AND (''${clientArea}'' = ''URBAN'') AND (${requestedAmount} BETWEEN 1500 AND 20000) THEN ''GREEN'' + WHEN (${isTopup} = false) AND (${loanProductId} = 8) AND (''${categorization}'' = ''NUEVO'') AND (''${clientArea}'' = ''RURAL'') AND (${requestedAmount} BETWEEN 1500 AND 5000) THEN ''GREEN'' + WHEN (${isTopup} = false) AND (${loanProductId} = 8) AND (''${categorization}'' = ''RECREDITO'') AND (''${clientArea}'' = ''RURAL'') AND (${requestedAmount} BETWEEN 1500 AND 20000) THEN ''GREEN'' + + WHEN (${isTopup} = false) AND (${loanProductId} = 9) AND (''${categorization}'' = ''NUEVO'') AND (''${clientArea}'' = ''URBAN'') AND (${requestedAmount} BETWEEN 1500 AND 5000) THEN ''GREEN'' + WHEN (${isTopup} = false) AND (${loanProductId} = 9) AND (''${categorization}'' = ''RECREDITO'') AND (''${clientArea}'' = ''URBAN'') AND (${requestedAmount} BETWEEN 1500 AND 20000) THEN ''GREEN'' + WHEN (${isTopup} = false) AND (${loanProductId} = 9) AND (''${categorization}'' = ''NUEVO'') AND (''${clientArea}'' = ''RURAL'') AND (${requestedAmount} BETWEEN 1500 AND 5000) THEN ''GREEN'' + WHEN (${isTopup} = false) AND (${loanProductId} = 9) AND (''${categorization}'' = ''RECREDITO'') AND (''${clientArea}'' = ''RURAL'') AND (${requestedAmount} BETWEEN 1500 AND 20000) THEN ''GREEN'' + + WHEN (${isTopup} = false) AND (${loanProductId} = 4) AND (''${categorization}'' = ''NUEVO'') AND (''${clientArea}'' = ''URBAN'') AND (${requestedAmount} BETWEEN 5000 AND 10000) THEN ''GREEN'' + WHEN (${isTopup} = false) AND (${loanProductId} = 4) AND (''${categorization}'' = ''RECREDITO'') AND (''${clientArea}'' = ''URBAN'') AND (${requestedAmount} BETWEEN 5000 AND 25000) THEN ''GREEN'' + WHEN (${isTopup} = false) AND (${loanProductId} = 4) AND (''${categorization}'' = ''NUEVO'') AND (''${clientArea}'' = ''RURAL'') AND (${requestedAmount} BETWEEN 5000 AND 10000) THEN ''GREEN'' + WHEN (${isTopup} = false) AND (${loanProductId} = 4) AND (''${categorization}'' = ''RECREDITO'') AND (''${clientArea}'' = ''RURAL'') AND (${requestedAmount} BETWEEN 5000 AND 25000) THEN ''GREEN'' + + WHEN (${isTopup} = false) AND (${loanProductId} = 5) AND (''${categorization}'' = ''NUEVO'') AND (''${clientArea}'' = ''URBAN'') AND (${requestedAmount} BETWEEN 5000 AND 10000) THEN ''GREEN'' + WHEN (${isTopup} = false) AND (${loanProductId} = 5) AND (''${categorization}'' = ''RECREDITO'') AND (''${clientArea}'' = ''URBAN'') AND (${requestedAmount} BETWEEN 5000 AND 20000) THEN ''GREEN'' + WHEN (${isTopup} = false) AND (${loanProductId} = 5) AND (''${categorization}'' = ''NUEVO'') AND (''${clientArea}'' = ''RURAL'') AND (${requestedAmount} BETWEEN 5000 AND 10000) THEN ''GREEN'' + WHEN (${isTopup} = false) AND (${loanProductId} = 5) AND (''${categorization}'' = ''RECREDITO'') AND (''${clientArea}'' = ''RURAL'') AND (${requestedAmount} BETWEEN 5000 AND 20000) THEN ''GREEN'' + + ELSE ''RED'' + END AS color') +WHERE report_name = 'Minimum and maximum amount Policy Check'; diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/number_of_members.sql b/fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/number_of_members.sql new file mode 100644 index 00000000000..5b9a2b220e2 --- /dev/null +++ b/fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/number_of_members.sql @@ -0,0 +1,35 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +SELECT @productId := (select id from m_product_loan where short_name='BCOMMEDA' limit 1); +UPDATE stretchy_report SET report_sql = concat('SELECT + CASE + WHEN (${loanProductId} = 2) AND (${numberOfMembers} >= 7) THEN ''GREEN'' + + WHEN (${loanProductId} = ',@productId,') AND (${numberOfMembers} >= 7) THEN ''GREEN'' + + WHEN (${loanProductId} = 9) AND (''${categorization}'' = ''NUEVO'') AND (${recreditPercent} < 50) THEN ''GREEN'' + WHEN (${loanProductId} = 9) AND (''${categorization}'' = ''RECREDITO'') AND (${recreditPercent} >= 50) THEN ''GREEN'' + + WHEN (${loanProductId} = 8) AND (${numberOfMembers} >= 7) THEN ''GREEN'' + WHEN (${loanProductId} = 8) AND (${numberOfMembers} < 7) THEN ''ORANGE'' + + ELSE ''RED'' + END AS color') +WHERE report_name = 'Number of members according to policy Policy Check'; diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/own_home_policy.sql b/fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/own_home_policy.sql new file mode 100644 index 00000000000..b23627bdc8c --- /dev/null +++ b/fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/own_home_policy.sql @@ -0,0 +1,40 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +SELECT @productId := (select id from m_product_loan where short_name='BCOMMEDA' limit 1); +UPDATE stretchy_report SET report_sql = concat('SELECT + housing_type.owner_percent, + CASE + WHEN (${loanProductId} = 2) AND (housing_type.owner_percent >=50) THEN ''GREEN'' + WHEN (${loanProductId} = 2) AND (housing_type.owner_percent <50) THEN ''YELLOW'' + + WHEN (${loanProductId} = ',@productId,') AND (housing_type.owner_percent >=50) THEN ''GREEN'' + WHEN (${loanProductId} = ',@productId,') AND (housing_type.owner_percent <50) THEN ''YELLOW'' + + WHEN (${loanProductId} = 8) AND (housing_type.owner_percent >=50) THEN ''GREEN'' + WHEN (${loanProductId} = 8) AND (housing_type.owner_percent <50) THEN ''YELLOW'' + + END AS color + FROM m_prequalification_group mpg + INNER JOIN ( select (((select count(*) from m_prequalification_group_members mpm INNER JOIN m_client mc on mc.dpi = mpm.dpi + INNER JOIN m_client_contact_info mcinf on mcinf.client_id = mc.id INNER JOIN m_code_value mcv on mcv.id = mcinf.housing_type where mcv.code_value = ''Propia'' and mpm.group_id = ${prequalificationId})/ + (select count(*) from m_prequalification_group_members mpg where mpg.group_id = ${prequalificationId}))*100) as owner_percent, ${prequalificationId} as grp_id ) + housing_type ON housing_type.grp_id = mpg.id + WHERE mpg.id = ${prequalificationId}') +WHERE report_name = 'Percentage of members with their own home Policy Check'; diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/percentage_increase.sql b/fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/percentage_increase.sql new file mode 100644 index 00000000000..2da8e5db11e --- /dev/null +++ b/fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/percentage_increase.sql @@ -0,0 +1,73 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +SELECT @productId := (select id from m_product_loan where short_name='BCOMMEDA' limit 1); +UPDATE stretchy_report SET report_sql = concat('SELECT + CASE + WHEN (${loanProductId} = 2) AND (IFNULL(${currentCreditValue}, 0) <= 1500) AND (IFNULL(${percentageIncrease}, 0) <= 200) THEN ''GREEN'' + WHEN (${loanProductId} = 2) AND (IFNULL(${currentCreditValue}, 0) > 1500) AND (IFNULL(${currentCreditValue}, 0) <= 3000) AND (IFNULL(${percentageIncrease}, 0) <= 150) THEN ''GREEN'' + WHEN (${loanProductId} = 2) AND (IFNULL(${currentCreditValue}, 0) > 3000) AND (IFNULL(${currentCreditValue}, 0) <= 3500) AND (IFNULL(${percentageIncrease}, 0) <= 100) THEN ''GREEN'' + WHEN (${loanProductId} = 2) AND (IFNULL(${currentCreditValue}, 0) > 3500) AND (IFNULL(${currentCreditValue}, 0) <= 4000) AND (IFNULL(${percentageIncrease}, 0) <= 80) THEN ''GREEN'' + WHEN (${loanProductId} = 2) AND (IFNULL(${currentCreditValue}, 0) > 4000) AND (IFNULL(${percentageIncrease}, 0) <= 60) THEN ''GREEN'' + WHEN (${loanProductId} = 2) AND (IFNULL(${currentCreditValue}, 0) <= 1500) AND (IFNULL(${percentageIncrease}, 0) > 200) THEN ''RED'' + WHEN (${loanProductId} = 2) AND (IFNULL(${currentCreditValue}, 0) > 1500) AND (IFNULL(${currentCreditValue}, 0) <= 3000) AND (IFNULL(${percentageIncrease}, 0) > 150) THEN ''RED'' + WHEN (${loanProductId} = 2) AND (IFNULL(${currentCreditValue}, 0) > 3000) AND (IFNULL(${currentCreditValue}, 0) <= 3500) AND (IFNULL(${percentageIncrease}, 0) > 100) THEN ''RED'' + WHEN (${loanProductId} = 2) AND (IFNULL(${currentCreditValue}, 0) > 3500) AND (IFNULL(${currentCreditValue}, 0) <= 4000) AND (IFNULL(${percentageIncrease}, 0) > 80) THEN ''RED'' + WHEN (${loanProductId} = 2) AND (IFNULL(${currentCreditValue}, 0) > 4000) AND (IFNULL(${percentageIncrease}, 0) > 60) THEN ''RED'' + + WHEN (${loanProductId} = ',@productId,') AND (IFNULL(${currentCreditValue}, 0) <= 1500) AND (IFNULL(${percentageIncrease}, 0) <= 200) THEN ''GREEN'' + WHEN (${loanProductId} = ',@productId,') AND (IFNULL(${currentCreditValue}, 0) > 1500) AND (IFNULL(${currentCreditValue}, 0) <= 3000) AND (IFNULL(${percentageIncrease}, 0) <= 150) THEN ''GREEN'' + WHEN (${loanProductId} = ',@productId,') AND (IFNULL(${currentCreditValue}, 0) > 3000) AND (IFNULL(${currentCreditValue}, 0) <= 3500) AND (IFNULL(${percentageIncrease}, 0) <= 100) THEN ''GREEN'' + WHEN (${loanProductId} = ',@productId,') AND (IFNULL(${currentCreditValue}, 0) > 3500) AND (IFNULL(${currentCreditValue}, 0) <= 4000) AND (IFNULL(${percentageIncrease}, 0) <= 80) THEN ''GREEN'' + WHEN (${loanProductId} = ',@productId,') AND (IFNULL(${currentCreditValue}, 0) > 4000) AND (IFNULL(${percentageIncrease}, 0) <= 60) THEN ''GREEN'' + WHEN (${loanProductId} = ',@productId,') AND (IFNULL(${currentCreditValue}, 0) <= 1500) AND (IFNULL(${percentageIncrease}, 0) > 200) THEN ''RED'' + WHEN (${loanProductId} = ',@productId,') AND (IFNULL(${currentCreditValue}, 0) > 1500) AND (IFNULL(${currentCreditValue}, 0) <= 3000) AND (IFNULL(${percentageIncrease}, 0) > 150) THEN ''RED'' + WHEN (${loanProductId} = ',@productId,') AND (IFNULL(${currentCreditValue}, 0) > 3000) AND (IFNULL(${currentCreditValue}, 0) <= 3500) AND (IFNULL(${percentageIncrease}, 0) > 100) THEN ''RED'' + WHEN (${loanProductId} = ',@productId,') AND (IFNULL(${currentCreditValue}, 0) > 3500) AND (IFNULL(${currentCreditValue}, 0) <= 4000) AND (IFNULL(${percentageIncrease}, 0) > 80) THEN ''RED'' + WHEN (${loanProductId} = ',@productId,') AND (IFNULL(${currentCreditValue}, 0) > 4000) AND (IFNULL(${percentageIncrease}, 0) > 60) THEN ''RED'' + + WHEN (${loanProductId} = 9) AND (IFNULL(${currentCreditValue}, 0) <= 1500) AND (IFNULL(${percentageIncrease}, 0) <= 200) THEN ''GREEN'' + WHEN (${loanProductId} = 9) AND (IFNULL(${currentCreditValue}, 0) > 1500) AND (IFNULL(${currentCreditValue}, 0) <= 3000) AND (IFNULL(${percentageIncrease}, 0) <= 150) THEN ''GREEN'' + WHEN (${loanProductId} = 9) AND (IFNULL(${currentCreditValue}, 0) > 3000) AND (IFNULL(${currentCreditValue}, 0) <= 3500) AND (IFNULL(${percentageIncrease}, 0) <= 100) THEN ''GREEN'' + WHEN (${loanProductId} = 9) AND (IFNULL(${currentCreditValue}, 0) > 3500) AND (IFNULL(${currentCreditValue}, 0) <= 4000) AND (IFNULL(${percentageIncrease}, 0) <= 80) THEN ''GREEN'' + WHEN (${loanProductId} = 9) AND (IFNULL(${currentCreditValue}, 0) > 4000) AND (IFNULL(${percentageIncrease}, 0) <= 60) THEN ''GREEN'' + WHEN (${loanProductId} = 9) AND (IFNULL(${currentCreditValue}, 0) <= 1500) AND (IFNULL(${percentageIncrease}, 0) > 200) THEN ''RED'' + WHEN (${loanProductId} = 9) AND (IFNULL(${currentCreditValue}, 0) > 1500) AND (IFNULL(${currentCreditValue}, 0) <= 3000) AND (IFNULL(${percentageIncrease}, 0) > 150) THEN ''RED'' + WHEN (${loanProductId} = 9) AND (IFNULL(${currentCreditValue}, 0) > 3000) AND (IFNULL(${currentCreditValue}, 0) <= 3500) AND (IFNULL(${percentageIncrease}, 0) > 100) THEN ''RED'' + WHEN (${loanProductId} = 9) AND (IFNULL(${currentCreditValue}, 0) > 3500) AND (IFNULL(${currentCreditValue}, 0) <= 4000) AND (IFNULL(${percentageIncrease}, 0) > 80) THEN ''RED'' + WHEN (${loanProductId} = 9) AND (IFNULL(${currentCreditValue}, 0) > 4000) AND (IFNULL(${percentageIncrease}, 0) > 60) THEN ''RED'' + WHEN (${loanProductId} = 8) AND (IFNULL(${currentCreditValue}, 0) <= 1500) AND (IFNULL(${percentageIncrease}, 0) <= 200) THEN ''GREEN'' + WHEN (${loanProductId} = 8) AND (IFNULL(${currentCreditValue}, 0) > 1500) AND (IFNULL(${currentCreditValue}, 0) <= 3000) AND (IFNULL(${percentageIncrease}, 0) <= 150) THEN ''GREEN'' + WHEN (${loanProductId} = 8) AND (IFNULL(${currentCreditValue}, 0) > 3000) AND (IFNULL(${currentCreditValue}, 0) <= 3500) AND (IFNULL(${percentageIncrease}, 0) <= 100) THEN ''GREEN'' + WHEN (${loanProductId} = 8) AND (IFNULL(${currentCreditValue}, 0) > 3500) AND (IFNULL(${currentCreditValue}, 0) <= 4000) AND (IFNULL(${percentageIncrease}, 0) <= 80) THEN ''GREEN'' + WHEN (${loanProductId} = 8) AND (IFNULL(${currentCreditValue}, 0) > 4000) AND (IFNULL(${percentageIncrease}, 0) <= 60) THEN ''GREEN'' + WHEN (${loanProductId} = 8) AND (IFNULL(${currentCreditValue}, 0) <= 1500) AND (IFNULL(${percentageIncrease}, 0) > 200) THEN ''RED'' + WHEN (${loanProductId} = 8) AND (IFNULL(${currentCreditValue}, 0) > 1500) AND (IFNULL(${currentCreditValue}, 0) <= 3000) AND (IFNULL(${percentageIncrease}, 0) > 150) THEN ''RED'' + WHEN (${loanProductId} = 8) AND (IFNULL(${currentCreditValue}, 0) > 3000) AND (IFNULL(${currentCreditValue}, 0) <= 3500) AND (IFNULL(${percentageIncrease}, 0) > 100) THEN ''RED'' + WHEN (${loanProductId} = 8) AND (IFNULL(${currentCreditValue}, 0) > 3500) AND (IFNULL(${currentCreditValue}, 0) <= 4000) AND (IFNULL(${percentageIncrease}, 0) > 80) THEN ''RED'' + WHEN (${loanProductId} = 8) AND (IFNULL(${currentCreditValue}, 0) > 4000) AND (IFNULL(${percentageIncrease}, 0) > 60) THEN ''RED'' + WHEN (${loanProductId} = 4) AND (IFNULL(${percentageIncrease}, 0) <= 60) THEN ''GREEN'' + WHEN (${loanProductId} = 4) AND (IFNULL(${percentageIncrease}, 0) > 60) THEN ''ORANGE'' + WHEN (${loanProductId} = 5) AND (IFNULL(${percentageIncrease}, 0) <= 60) THEN ''GREEN'' + WHEN (${loanProductId} = 5) AND (IFNULL(${percentageIncrease}, 0) > 60) THEN ''ORANGE'' + END AS color + FROM m_client mc + WHERE mc.id = ${clientId} + GROUP BY mc.id') +WHERE report_name = 'Increase percentage Policy Check'; diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/presidet_board_of_directors.sql b/fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/presidet_board_of_directors.sql new file mode 100644 index 00000000000..f7ebdb2ea62 --- /dev/null +++ b/fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/presidet_board_of_directors.sql @@ -0,0 +1,61 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +SELECT @productId := (select id from m_product_loan where short_name='BCOMMEDA' limit 1); +UPDATE stretchy_report SET report_sql = concat(' SELECT + prequalification_details.recreditCategorization, + CASE + WHEN (${loanProductId} = 2) AND (''${buroCheckClassification}'' = ''A'') THEN ''GREEN'' + WHEN (${loanProductId} = 2) AND (''${buroCheckClassification}'' = ''B'') THEN ''GREEN'' + WHEN (${loanProductId} = 2) AND (''${buroCheckClassification}'' = ''C'') THEN ''YELLOW'' + WHEN (${loanProductId} = 2) AND (''${buroCheckClassification}'' = ''D'') THEN ''ORANGE'' + + WHEN (${loanProductId} = ',@productId,') AND (''${buroCheckClassification}'' = ''A'') THEN ''GREEN'' + WHEN (${loanProductId} = ',@productId,') AND (''${buroCheckClassification}'' = ''B'') THEN ''GREEN'' + WHEN (${loanProductId} = ',@productId,') AND (''${buroCheckClassification}'' = ''C'') THEN ''YELLOW'' + WHEN (${loanProductId} = ',@productId,') AND (''${buroCheckClassification}'' = ''D'') THEN ''ORANGE'' + + WHEN (${loanProductId} = 9) AND (''${buroCheckClassification}'' = ''A'') THEN ''GREEN'' + WHEN (${loanProductId} = 9) AND (''${buroCheckClassification}'' = ''B'') THEN ''GREEN'' + WHEN (${loanProductId} = 9) AND (''${buroCheckClassification}'' = ''C'') THEN ''YELLOW'' + WHEN (${loanProductId} = 9) AND (''${buroCheckClassification}'' = ''D'') THEN ''ORANGE'' + + WHEN (${loanProductId} = 8) AND (''${buroCheckClassification}'' = ''A'') THEN ''GREEN'' + WHEN (${loanProductId} = 8) AND (''${buroCheckClassification}'' = ''B'') THEN ''GREEN'' + WHEN (${loanProductId} = 8) AND (''${buroCheckClassification}'' = ''C'') THEN ''YELLOW'' + WHEN (${loanProductId} = 8) AND (''${buroCheckClassification}'' = ''D'') THEN ''ORANGE'' + + WHEN (${loanProductId} = 4) AND (''${buroCheckClassification}'' = ''A'') THEN ''GREEN'' + WHEN (${loanProductId} = 4) AND (''${buroCheckClassification}'' = ''B'') THEN ''GREEN'' + WHEN (${loanProductId} = 4) AND (''${buroCheckClassification}'' = ''C'') THEN ''YELLOW'' + WHEN (${loanProductId} = 4) AND (''${buroCheckClassification}'' = ''D'') THEN ''ORANGE'' + + WHEN (${loanProductId} = 5) AND (''${buroCheckClassification}'' = ''A'') THEN ''GREEN'' + WHEN (${loanProductId} = 5) AND (''${buroCheckClassification}'' = ''B'') THEN ''GREEN'' + WHEN (${loanProductId} = 5) AND (''${buroCheckClassification}'' = ''C'') THEN ''YELLOW'' + WHEN (${loanProductId} = 5) AND (''${buroCheckClassification}'' = ''D'') THEN ''ORANGE'' + END AS color + FROM m_prequalification_group mpg + INNER JOIN ( + SELECT p.id AS prequalification_id, + (CASE WHEN p.previous_prequalification IS NOT NULL THEN ''RECREDITO'' ELSE ''NUEVO'' END) AS recreditCategorization + FROM m_prequalification_group p + ) prequalification_details ON prequalification_details.prequalification_id = mpg.id + WHERE mpg.id = ${prequalificationId}') +WHERE report_name = 'President of the Board of Directors of the BC Policy Check'; diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/value_disparity.sql b/fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/value_disparity.sql new file mode 100644 index 00000000000..550dbb5cd3f --- /dev/null +++ b/fineract-provider/src/main/resources/db/changelog/tenant/commands/BACCOMMEDA/value_disparity.sql @@ -0,0 +1,76 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +SELECT @productId := (select id from m_product_loan where short_name='BCOMMEDA' limit 1); +UPDATE stretchy_report SET report_sql = concat(' SELECT + CASE + WHEN (${loanProductId} = 2) AND (''${categorization}'' = ''NUEVO'') AND (''${clientArea}'' = ''URBANA'') AND (${disparityRatio} BETWEEN 1 AND 3) THEN ''GREEN'' + WHEN (${loanProductId} = 2) AND (''${categorization}'' = ''NUEVO'') AND (''${clientArea}'' = ''URBANA'') AND (${disparityRatio} > 3) THEN ''YELLOW'' + WHEN (${loanProductId} = 2) AND (''${categorization}'' = ''RECREDITO'') AND (''${clientArea}'' = ''URBANA'') AND (${disparityRatio} BETWEEN 1 AND 4) THEN ''GREEN'' + WHEN (${loanProductId} = 2) AND (''${categorization}'' = ''RECREDITO'') AND (''${clientArea}'' = ''URBANA'') AND (${disparityRatio} > 4) THEN ''YELLOW'' + WHEN (${loanProductId} = 2) AND (''${categorization}'' = ''NUEVO'') AND (''${clientArea}'' = ''RURAL'') AND (${disparityRatio} BETWEEN 1 AND 3) THEN ''GREEN'' + WHEN (${loanProductId} = 2) AND (''${categorization}'' = ''NUEVO'') AND (''${clientArea}'' = ''RURAL'') AND (${disparityRatio} > 3) THEN ''YELLOW'' + WHEN (${loanProductId} = 2) AND (''${categorization}'' = ''RECREDITO'') AND (''${clientArea}'' = ''RURAL'') AND (${disparityRatio} BETWEEN 1 AND 4) THEN ''GREEN'' + WHEN (${loanProductId} = 2) AND (''${categorization}'' = ''RECREDITO'') AND (''${clientArea}'' = ''RURAL'') AND (${disparityRatio} > 4) THEN ''YELLOW'' + + WHEN (${loanProductId} = ',@productId,') AND (''${categorization}'' = ''NUEVO'') AND (''${clientArea}'' = ''URBANA'') AND (${disparityRatio} BETWEEN 1 AND 3) THEN ''GREEN'' + WHEN (${loanProductId} = ',@productId,') AND (''${categorization}'' = ''NUEVO'') AND (''${clientArea}'' = ''URBANA'') AND (${disparityRatio} > 3) THEN ''YELLOW'' + WHEN (${loanProductId} = ',@productId,') AND (''${categorization}'' = ''RECREDITO'') AND (''${clientArea}'' = ''URBANA'') AND (${disparityRatio} BETWEEN 1 AND 4) THEN ''GREEN'' + WHEN (${loanProductId} = ',@productId,') AND (''${categorization}'' = ''RECREDITO'') AND (''${clientArea}'' = ''URBANA'') AND (${disparityRatio} > 4) THEN ''YELLOW'' + WHEN (${loanProductId} = ',@productId,') AND (''${categorization}'' = ''NUEVO'') AND (''${clientArea}'' = ''RURAL'') AND (${disparityRatio} BETWEEN 1 AND 3) THEN ''GREEN'' + WHEN (${loanProductId} = ',@productId,') AND (''${categorization}'' = ''NUEVO'') AND (''${clientArea}'' = ''RURAL'') AND (${disparityRatio} > 3) THEN ''YELLOW'' + WHEN (${loanProductId} = ',@productId,') AND (''${categorization}'' = ''RECREDITO'') AND (''${clientArea}'' = ''RURAL'') AND (${disparityRatio} BETWEEN 1 AND 4) THEN ''GREEN'' + WHEN (${loanProductId} = ',@productId,') AND (''${categorization}'' = ''RECREDITO'') AND (''${clientArea}'' = ''RURAL'') AND (${disparityRatio} > 4) THEN ''YELLOW'' + + WHEN (${loanProductId} = 9) AND (''${categorization}'' = ''RECREDITO'') AND (''${clientArea}'' = ''URBANA'') AND (${disparityRatio} BETWEEN 1 AND 4) THEN ''GREEN'' + WHEN (${loanProductId} = 9) AND (''${categorization}'' = ''RECREDITO'') AND (''${clientArea}'' = ''URBANA'') AND (${disparityRatio} > 4) THEN ''YELLOW'' + WHEN (${loanProductId} = 9) AND (''${categorization}'' = ''RECREDITO'') AND (''${clientArea}'' = ''RURAL'') AND (${disparityRatio} BETWEEN 1 AND 4) THEN ''GREEN'' + WHEN (${loanProductId} = 9) AND (''${categorization}'' = ''RECREDITO'') AND (''${clientArea}'' = ''RURAL'') AND (${disparityRatio} > 4) THEN ''YELLOW'' + + WHEN (${loanProductId} = 9) AND (''${categorization}'' = ''NUEVO'') AND (''${clientArea}'' = ''URBANA'') AND (${disparityRatio} BETWEEN 1 AND 3) THEN ''GREEN'' + WHEN (${loanProductId} = 9) AND (''${categorization}'' = ''NUEVO'') AND (''${clientArea}'' = ''URBANA'') AND (${disparityRatio} > 3) THEN ''YELLOW'' + WHEN (${loanProductId} = 9) AND (''${categorization}'' = ''NUEVO'') AND (''${clientArea}'' = ''RURAL'') AND (${disparityRatio} BETWEEN 1 AND 3) THEN ''GREEN'' + WHEN (${loanProductId} = 9) AND (''${categorization}'' = ''NUEVO'') AND (''${clientArea}'' = ''RURAL'') AND (${disparityRatio} > 3) THEN ''YELLOW'' + + WHEN (${loanProductId} = 8) AND (''${categorization}'' = ''NUEVO'') AND (''${clientArea}'' = ''URBANA'') AND (${disparityRatio} BETWEEN 1 AND 3) THEN ''GREEN'' + WHEN (${loanProductId} = 8) AND (''${categorization}'' = ''NUEVO'') AND (''${clientArea}'' = ''URBANA'') AND (${disparityRatio} > 3) THEN ''YELLOW'' + WHEN (${loanProductId} = 8) AND (''${categorization}'' = ''RECREDITO'') AND (''${clientArea}'' = ''URBANA'') AND (${disparityRatio} BETWEEN 1 AND 4) THEN ''GREEN'' + WHEN (${loanProductId} = 8) AND (''${categorization}'' = ''RECREDITO'') AND (''${clientArea}'' = ''URBANA'') AND (${disparityRatio} > 4) THEN ''YELLOW'' + WHEN (${loanProductId} = 8) AND (''${categorization}'' = ''NUEVO'') AND (''${clientArea}'' = ''RURAL'') AND (${disparityRatio} BETWEEN 1 AND 3) THEN ''GREEN'' + WHEN (${loanProductId} = 8) AND (''${categorization}'' = ''NUEVO'') AND (''${clientArea}'' = ''RURAL'') AND (${disparityRatio} > 3) THEN ''YELLOW'' + WHEN (${loanProductId} = 8) AND (''${categorization}'' = ''RECREDITO'') AND (''${clientArea}'' = ''RURAL'') AND (${disparityRatio} BETWEEN 1 AND 4) THEN ''GREEN'' + WHEN (${loanProductId} = 8) AND (''${categorization}'' = ''RECREDITO'') AND (''${clientArea}'' = ''RURAL'') AND (${disparityRatio} > 4) THEN ''YELLOW'' + ELSE ''RED'' + + END AS color + FROM m_prequalification_group mpg + LEFT JOIN ( + SELECT p.id AS prequalification_id, + (select count(ml.id) FROM m_prequalification_group mp + LEFT JOIN m_prequalification_group_members mpgm ON mpgm.group_id = mp.id + LEFT JOIN m_client mc ON mc.dpi = mpgm.dpi + LEFT JOIN m_loan ml ON ml.client_id = mc.id + WHERE + ml.loan_status_id < 300 AND ml.product_id = ${loanProductId} AND ml.is_topup = 1 + AND mp.id = ${prequalificationId} + ) recredit_count + FROM m_prequalification_group p + ) recredit_loan ON recredit_loan.prequalification_id = mpg.id + WHERE mpg.id = ${prequalificationId}') +WHERE report_name = 'Value disparity Policy Check'; diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0135_FBR-714-BANCO_COMMUNAL_MEDA.xml b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0135_FBR-714-BANCO_COMMUNAL_MEDA.xml new file mode 100644 index 00000000000..f751e3a99b2 --- /dev/null +++ b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0135_FBR-714-BANCO_COMMUNAL_MEDA.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From c364c3281655ad10d721ebf7dc9988d98b2adfa0 Mon Sep 17 00:00:00 2001 From: Faheem Ahmad Date: Fri, 16 Aug 2024 02:19:30 +0500 Subject: [PATCH 19/24] FSF-1 throw exception if debit and credit gl accounts are same (#1023) Co-authored-by: Faheem Ahmad --- .../service/AccountingProcessorHelper.java | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/AccountingProcessorHelper.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/AccountingProcessorHelper.java index 2777f2afe35..989b1732f6f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/AccountingProcessorHelper.java +++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/AccountingProcessorHelper.java @@ -25,6 +25,7 @@ import java.util.List; import java.util.Map; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.fineract.accounting.closure.domain.GLClosure; import org.apache.fineract.accounting.closure.domain.GLClosureRepository; @@ -52,6 +53,7 @@ import org.apache.fineract.accounting.journalentry.domain.JournalEntryType; import org.apache.fineract.accounting.journalentry.exception.JournalEntryInvalidException; import org.apache.fineract.accounting.journalentry.exception.JournalEntryInvalidException.GlJournalEntryInvalidReason; +import org.apache.fineract.accounting.journalentry.exception.JournalEntryRuntimeException; import org.apache.fineract.accounting.producttoaccountmapping.domain.PortfolioProductType; import org.apache.fineract.accounting.producttoaccountmapping.domain.ProductToGLAccountMapping; import org.apache.fineract.accounting.producttoaccountmapping.domain.ProductToGLAccountMappingRepository; @@ -79,6 +81,7 @@ @Service @RequiredArgsConstructor +@Slf4j public class AccountingProcessorHelper { public static final String LOAN_TRANSACTION_IDENTIFIER = "L"; @@ -583,6 +586,39 @@ private void createJournalEntriesForSavings(final Office office, final String cu if (savingsReferenceGlAccountId != null && CashAccountsForSavings.SAVINGS_REFERENCE.getValue().equals(accountTypeToCreditId)) { creditAccount = this.getGLAccountById(savingsReferenceGlAccountId); } + + // Check for duplicate debit and credit account + if (debitAccount.getId().equals(creditAccount.getId())) { + + StringBuffer sb = new StringBuffer(); + sb.append("Incorrect Gl Account detected \n"); + sb.append("Savings Product Id: " + savingsProductId).append("\n"); + sb.append("Debit Account Id: " + debitAccount.getId()).append("\n"); + sb.append("Debit Account Name: " + debitAccount.getName()).append("\n"); + sb.append("Credit Account Id: " + creditAccount.getId()).append("\n"); + sb.append("Credit Account Name: " + creditAccount.getName()).append("\n"); + sb.append("accountTypeToDebitId: " + accountTypeToDebitId).append("\n"); + sb.append("accountTypeToCreditId: " + accountTypeToCreditId).append("\n"); + sb.append("paymentTypeId: " + paymentTypeId).append("\n"); + sb.append("savingsReferenceGlAccountId: " + savingsReferenceGlAccountId).append("\n"); + sb.append("transactionId: " + transactionId).append("\n"); + sb.append("transactionDate: " + transactionDate).append("\n"); + sb.append("amount: " + amount).append("\n"); + sb.append("transactionDate: " + transactionDate).append("\n"); + sb.append("isDebitAccountOrganziationAccount?: " + isOrganizationAccount(accountTypeToDebitId)).append("\n"); + sb.append("isCreditAccountOrganziationAccount?: " + isOrganizationAccount(accountTypeToCreditId)).append("\n"); + sb.append("transactionDate: " + transactionDate).append("\n"); + sb.append("Execute below query to validate the Debit gl account \n"); + sb.append("select * from acc_product_mapping mapping where mapping.product_id ="+savingsProductId +" and mapping.product_type =2 " + + "and mapping.financial_account_type="+accountTypeToDebitId+" and mapping.payment_Type is NULL and mapping.charge_id is NULL \n"); + sb.append("Execute below query to validate the Credit gl account \n"); + sb.append("select * from acc_product_mapping mapping where mapping.product_id ="+savingsProductId +" and mapping.product_type =2 " + + "and mapping.financial_account_type="+accountTypeToCreditId+" and mapping.payment_Type is NULL and mapping.charge_id is NULL \n"); + + log.error(sb.toString()); + throw new JournalEntryRuntimeException("error.msg.journal.entry.save.operation.failed", "Invalid GL Account detected for debit entry"); + } + // createDebitJournalEntryForSavings(office, currencyCode, debitAccount, savingsId, transactionId, transactionDate, amount); createCreditJournalEntryForSavings(office, currencyCode, creditAccount, savingsId, transactionId, transactionDate, amount); } @@ -595,6 +631,39 @@ private void createJournalEntriesForSavings(final Office office, final String cu debitAccount = this.getGLAccountById(glAccountId); } final GLAccount creditAccount = getLinkedGLAccountForSavingsProduct(savingsProductId, accountTypeToCreditId, paymentTypeId); + + // Check for duplicate debit and credit account + if (debitAccount.getId().equals(creditAccount.getId())) { + + StringBuffer sb = new StringBuffer(); + sb.append("Incorrect Gl Account detected \n"); + sb.append("Savings Product Id: " + savingsProductId).append("\n"); + sb.append("Debit Account Id: " + debitAccount.getId()).append("\n"); + sb.append("Debit Account Name: " + debitAccount.getName()).append("\n"); + sb.append("Credit Account Id: " + creditAccount.getId()).append("\n"); + sb.append("Credit Account Name: " + creditAccount.getName()).append("\n"); + sb.append("glAccountId of Bank Account: " + glAccountId).append("\n"); + sb.append("accountTypeToDebitId: " + accountTypeToDebitId).append("\n"); + sb.append("accountTypeToCreditId: " + accountTypeToCreditId).append("\n"); + sb.append("paymentTypeId: " + paymentTypeId).append("\n"); + sb.append("transactionId: " + transactionId).append("\n"); + sb.append("transactionDate: " + transactionDate).append("\n"); + sb.append("amount: " + amount).append("\n"); + sb.append("transactionDate: " + transactionDate).append("\n"); + sb.append("isDebitAccountOrganziationAccount?: " + isOrganizationAccount(accountTypeToDebitId)).append("\n"); + sb.append("isCreditAccountOrganziationAccount?: " + isOrganizationAccount(accountTypeToCreditId)).append("\n"); + sb.append("transactionDate: " + transactionDate).append("\n"); + sb.append("Execute below query to validate the Debit gl account only if glAccountId param is null \n"); + sb.append("select * from acc_product_mapping mapping where mapping.product_id ="+savingsProductId +" and mapping.product_type =2 " + + "and mapping.financial_account_type="+accountTypeToDebitId+" and mapping.payment_Type is NULL and mapping.charge_id is NULL \n"); + sb.append("Execute below query to validate the Credit gl account \n"); + sb.append("select * from acc_product_mapping mapping where mapping.product_id ="+savingsProductId +" and mapping.product_type =2 " + + "and mapping.financial_account_type="+accountTypeToCreditId+" and mapping.payment_Type is NULL and mapping.charge_id is NULL \n"); + + log.error(sb.toString()); + throw new JournalEntryRuntimeException("error.msg.journal.entry.save.operation.failed", "Invalid GL Account detected for debit entry"); + } + createDebitJournalEntryForSavings(office, currencyCode, debitAccount, savingsId, transactionId, transactionDate, amount); createCreditJournalEntryForSavings(office, currencyCode, creditAccount, savingsId, transactionId, transactionDate, amount); } From 3869739cebce2c77a9b968ffb78c3e5e005a4f85 Mon Sep 17 00:00:00 2001 From: Brian Muhimbura Date: Fri, 16 Aug 2024 14:25:13 +0300 Subject: [PATCH 20/24] fix/FSF-25 (#1025) * FBR-710 * 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 From 290d8719d45895dec30618a01c4e03623d0e69dc Mon Sep 17 00:00:00 2001 From: Brian Muhimbura Date: Fri, 16 Aug 2024 19:09:50 +0300 Subject: [PATCH 21/24] fix/FSF-28 (#1026) * FBR-710 * FSF-25 * FSF-28 * CHARGE FIX --- .../org/apache/fineract/portfolio/group/domain/Group.java | 4 ++++ .../GroupingTypesWritePlatformServiceJpaRepositoryImpl.java | 1 + .../portfolio/loanaccount/service/LoanChargeAssembler.java | 6 +++++- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/domain/Group.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/domain/Group.java index f69e7bdc03c..a4c9c5be9ad 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/domain/Group.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/domain/Group.java @@ -1024,4 +1024,8 @@ public Integer getMeetingStart() { public Integer getMeetingEnd() { return meetingEnd; } + + public void updateOffice(Office office) { + this.office = office; + } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java index 3c5eaef73af..502623101db 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java @@ -1117,6 +1117,7 @@ public CommandProcessingResult transferGroup(JsonCommand command) { group.updateMeetingDay(newCenter.getMeetingDay()); group.updateMeetingStart(newCenter.getMeetingStart()); group.updateMeetingEnd(newCenter.getMeetingEnd()); + group.updateOffice(newCenter.getOffice()); this.groupRepository.saveAndFlush(group); return new CommandProcessingResultBuilder() // .withCommandId(command.commandId()) // diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeAssembler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeAssembler.java index 0fb306145ce..fdf4f9905e2 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeAssembler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeAssembler.java @@ -247,8 +247,12 @@ private BigDecimal generateInstallmentFeeRate(Charge charge, JsonObject loanChar if (charge.isInstallmentFeeCharge() && charge.isAddOnInstallmentFeeType() && loanApplicationTermsCharges != null) { if (ChargeCalculationType.fromInt(charge.getChargeCalculation()).isPercentageBased()) { // update rate + LocalDate repaymentStartFromDate = loanApplicationTermsCharges.getRepaymentStartFromDate()!=null? + loanApplicationTermsCharges.getRepaymentStartFromDate(): + loanApplicationTermsCharges.getCalculatedRepaymentsStartingFromLocalDate(); + Pair addOnDaysAndRate = charge.getAddOnDisbursementChargeRate( - loanApplicationTermsCharges.getExpectedDisbursementDate(), loanApplicationTermsCharges.getRepaymentStartFromDate()); + loanApplicationTermsCharges.getExpectedDisbursementDate(), repaymentStartFromDate); rate = addOnDaysAndRate.getRight(); loanChargeElement.add("amount", new JsonPrimitive(rate)); } From daf1c32c14b5f65e007150b3cf402c4357be32e2 Mon Sep 17 00:00:00 2001 From: Brian Muhimbura Date: Mon, 19 Aug 2024 13:58:36 +0300 Subject: [PATCH 22/24] fix/FBR-710 (#1031) * FBR-710 * FSF 710 --- ...equalificationReadPlatformServiceImpl.java | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) 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 231d380ec30..e8fda61f998 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 @@ -291,14 +291,6 @@ private String buildSqlStringFromBlacklistCriteria(final SearchParameters search if (groupingType.equals("group")) { extraCriteria += " and g.prequalification_type_enum = ? "; paramList.add(PrequalificationType.GROUP.getValue()); - - Set roles = appUser.getRoles(); - for (Role userRole : roles) { - if (StringUtils.containsIgnoreCase(userRole.getName(), "Líder de agencia")) { - extraCriteria += " and ma.responsible_user_id = ? "; - paramList.add(appUser.getId()); - } - } } if (StringUtils.equals(groupingType, "individual")) { @@ -309,16 +301,25 @@ 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); + Set roles = appUser.getRoles(); + for (Role userRole : roles) { + if (StringUtils.containsIgnoreCase(userRole.getName(), "Líder de agencia")) { + extraCriteria += " and ma.responsible_user_id = ? "; + paramList.add(appUser.getId()); } } + 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) { extraCriteria += " and (m.name like '%" + sqlSearch + "%' OR m.dpi='" + sqlSearch + "') "; } From f39040383c9ade86a870adfda51af7df05ba2a1a Mon Sep 17 00:00:00 2001 From: Muhimbura Brian Mart Date: Mon, 19 Aug 2024 19:50:09 +0300 Subject: [PATCH 23/24] FBR 710 --- .../pentahoReports/Print Bank Cheque.prpt | Bin 8017 -> 8039 bytes .../service/AccountingProcessorHelper.java | 69 ++++++++++++++++++ .../portfolio/group/domain/Group.java | 4 + ...WritePlatformServiceJpaRepositoryImpl.java | 1 + .../service/LoanChargeAssembler.java | 6 +- .../db/changelog/tenant/changelog-tenant.xml | 1 + .../0135_1_FBR-714-BANCO_COMMUNAL_MEDA.xml | 42 +++++++++++ 7 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 fineract-provider/src/main/resources/db/changelog/tenant/parts/0135_1_FBR-714-BANCO_COMMUNAL_MEDA.xml 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 diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/AccountingProcessorHelper.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/AccountingProcessorHelper.java index 2777f2afe35..989b1732f6f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/AccountingProcessorHelper.java +++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/AccountingProcessorHelper.java @@ -25,6 +25,7 @@ import java.util.List; import java.util.Map; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.fineract.accounting.closure.domain.GLClosure; import org.apache.fineract.accounting.closure.domain.GLClosureRepository; @@ -52,6 +53,7 @@ import org.apache.fineract.accounting.journalentry.domain.JournalEntryType; import org.apache.fineract.accounting.journalentry.exception.JournalEntryInvalidException; import org.apache.fineract.accounting.journalentry.exception.JournalEntryInvalidException.GlJournalEntryInvalidReason; +import org.apache.fineract.accounting.journalentry.exception.JournalEntryRuntimeException; import org.apache.fineract.accounting.producttoaccountmapping.domain.PortfolioProductType; import org.apache.fineract.accounting.producttoaccountmapping.domain.ProductToGLAccountMapping; import org.apache.fineract.accounting.producttoaccountmapping.domain.ProductToGLAccountMappingRepository; @@ -79,6 +81,7 @@ @Service @RequiredArgsConstructor +@Slf4j public class AccountingProcessorHelper { public static final String LOAN_TRANSACTION_IDENTIFIER = "L"; @@ -583,6 +586,39 @@ private void createJournalEntriesForSavings(final Office office, final String cu if (savingsReferenceGlAccountId != null && CashAccountsForSavings.SAVINGS_REFERENCE.getValue().equals(accountTypeToCreditId)) { creditAccount = this.getGLAccountById(savingsReferenceGlAccountId); } + + // Check for duplicate debit and credit account + if (debitAccount.getId().equals(creditAccount.getId())) { + + StringBuffer sb = new StringBuffer(); + sb.append("Incorrect Gl Account detected \n"); + sb.append("Savings Product Id: " + savingsProductId).append("\n"); + sb.append("Debit Account Id: " + debitAccount.getId()).append("\n"); + sb.append("Debit Account Name: " + debitAccount.getName()).append("\n"); + sb.append("Credit Account Id: " + creditAccount.getId()).append("\n"); + sb.append("Credit Account Name: " + creditAccount.getName()).append("\n"); + sb.append("accountTypeToDebitId: " + accountTypeToDebitId).append("\n"); + sb.append("accountTypeToCreditId: " + accountTypeToCreditId).append("\n"); + sb.append("paymentTypeId: " + paymentTypeId).append("\n"); + sb.append("savingsReferenceGlAccountId: " + savingsReferenceGlAccountId).append("\n"); + sb.append("transactionId: " + transactionId).append("\n"); + sb.append("transactionDate: " + transactionDate).append("\n"); + sb.append("amount: " + amount).append("\n"); + sb.append("transactionDate: " + transactionDate).append("\n"); + sb.append("isDebitAccountOrganziationAccount?: " + isOrganizationAccount(accountTypeToDebitId)).append("\n"); + sb.append("isCreditAccountOrganziationAccount?: " + isOrganizationAccount(accountTypeToCreditId)).append("\n"); + sb.append("transactionDate: " + transactionDate).append("\n"); + sb.append("Execute below query to validate the Debit gl account \n"); + sb.append("select * from acc_product_mapping mapping where mapping.product_id ="+savingsProductId +" and mapping.product_type =2 " + + "and mapping.financial_account_type="+accountTypeToDebitId+" and mapping.payment_Type is NULL and mapping.charge_id is NULL \n"); + sb.append("Execute below query to validate the Credit gl account \n"); + sb.append("select * from acc_product_mapping mapping where mapping.product_id ="+savingsProductId +" and mapping.product_type =2 " + + "and mapping.financial_account_type="+accountTypeToCreditId+" and mapping.payment_Type is NULL and mapping.charge_id is NULL \n"); + + log.error(sb.toString()); + throw new JournalEntryRuntimeException("error.msg.journal.entry.save.operation.failed", "Invalid GL Account detected for debit entry"); + } + // createDebitJournalEntryForSavings(office, currencyCode, debitAccount, savingsId, transactionId, transactionDate, amount); createCreditJournalEntryForSavings(office, currencyCode, creditAccount, savingsId, transactionId, transactionDate, amount); } @@ -595,6 +631,39 @@ private void createJournalEntriesForSavings(final Office office, final String cu debitAccount = this.getGLAccountById(glAccountId); } final GLAccount creditAccount = getLinkedGLAccountForSavingsProduct(savingsProductId, accountTypeToCreditId, paymentTypeId); + + // Check for duplicate debit and credit account + if (debitAccount.getId().equals(creditAccount.getId())) { + + StringBuffer sb = new StringBuffer(); + sb.append("Incorrect Gl Account detected \n"); + sb.append("Savings Product Id: " + savingsProductId).append("\n"); + sb.append("Debit Account Id: " + debitAccount.getId()).append("\n"); + sb.append("Debit Account Name: " + debitAccount.getName()).append("\n"); + sb.append("Credit Account Id: " + creditAccount.getId()).append("\n"); + sb.append("Credit Account Name: " + creditAccount.getName()).append("\n"); + sb.append("glAccountId of Bank Account: " + glAccountId).append("\n"); + sb.append("accountTypeToDebitId: " + accountTypeToDebitId).append("\n"); + sb.append("accountTypeToCreditId: " + accountTypeToCreditId).append("\n"); + sb.append("paymentTypeId: " + paymentTypeId).append("\n"); + sb.append("transactionId: " + transactionId).append("\n"); + sb.append("transactionDate: " + transactionDate).append("\n"); + sb.append("amount: " + amount).append("\n"); + sb.append("transactionDate: " + transactionDate).append("\n"); + sb.append("isDebitAccountOrganziationAccount?: " + isOrganizationAccount(accountTypeToDebitId)).append("\n"); + sb.append("isCreditAccountOrganziationAccount?: " + isOrganizationAccount(accountTypeToCreditId)).append("\n"); + sb.append("transactionDate: " + transactionDate).append("\n"); + sb.append("Execute below query to validate the Debit gl account only if glAccountId param is null \n"); + sb.append("select * from acc_product_mapping mapping where mapping.product_id ="+savingsProductId +" and mapping.product_type =2 " + + "and mapping.financial_account_type="+accountTypeToDebitId+" and mapping.payment_Type is NULL and mapping.charge_id is NULL \n"); + sb.append("Execute below query to validate the Credit gl account \n"); + sb.append("select * from acc_product_mapping mapping where mapping.product_id ="+savingsProductId +" and mapping.product_type =2 " + + "and mapping.financial_account_type="+accountTypeToCreditId+" and mapping.payment_Type is NULL and mapping.charge_id is NULL \n"); + + log.error(sb.toString()); + throw new JournalEntryRuntimeException("error.msg.journal.entry.save.operation.failed", "Invalid GL Account detected for debit entry"); + } + createDebitJournalEntryForSavings(office, currencyCode, debitAccount, savingsId, transactionId, transactionDate, amount); createCreditJournalEntryForSavings(office, currencyCode, creditAccount, savingsId, transactionId, transactionDate, amount); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/domain/Group.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/domain/Group.java index f69e7bdc03c..a4c9c5be9ad 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/domain/Group.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/domain/Group.java @@ -1024,4 +1024,8 @@ public Integer getMeetingStart() { public Integer getMeetingEnd() { return meetingEnd; } + + public void updateOffice(Office office) { + this.office = office; + } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java index 3c5eaef73af..502623101db 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java @@ -1117,6 +1117,7 @@ public CommandProcessingResult transferGroup(JsonCommand command) { group.updateMeetingDay(newCenter.getMeetingDay()); group.updateMeetingStart(newCenter.getMeetingStart()); group.updateMeetingEnd(newCenter.getMeetingEnd()); + group.updateOffice(newCenter.getOffice()); this.groupRepository.saveAndFlush(group); return new CommandProcessingResultBuilder() // .withCommandId(command.commandId()) // diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeAssembler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeAssembler.java index 0fb306145ce..fdf4f9905e2 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeAssembler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeAssembler.java @@ -247,8 +247,12 @@ private BigDecimal generateInstallmentFeeRate(Charge charge, JsonObject loanChar if (charge.isInstallmentFeeCharge() && charge.isAddOnInstallmentFeeType() && loanApplicationTermsCharges != null) { if (ChargeCalculationType.fromInt(charge.getChargeCalculation()).isPercentageBased()) { // update rate + LocalDate repaymentStartFromDate = loanApplicationTermsCharges.getRepaymentStartFromDate()!=null? + loanApplicationTermsCharges.getRepaymentStartFromDate(): + loanApplicationTermsCharges.getCalculatedRepaymentsStartingFromLocalDate(); + Pair addOnDaysAndRate = charge.getAddOnDisbursementChargeRate( - loanApplicationTermsCharges.getExpectedDisbursementDate(), loanApplicationTermsCharges.getRepaymentStartFromDate()); + loanApplicationTermsCharges.getExpectedDisbursementDate(), repaymentStartFromDate); rate = addOnDaysAndRate.getRight(); loanChargeElement.add("amount", new JsonPrimitive(rate)); } diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml index 5ede958db2f..791ea33f9d1 100644 --- a/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml +++ b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml @@ -154,5 +154,6 @@ + diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0135_1_FBR-714-BANCO_COMMUNAL_MEDA.xml b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0135_1_FBR-714-BANCO_COMMUNAL_MEDA.xml new file mode 100644 index 00000000000..8d82dc708db --- /dev/null +++ b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0135_1_FBR-714-BANCO_COMMUNAL_MEDA.xml @@ -0,0 +1,42 @@ + + + + + + + + + + select count(*) from m_product_loan where short_name = 'BCOMMEDA'; + + + + + + + + From 6910e92ee2740aa68320fbc8e3160e91cea8188d Mon Sep 17 00:00:00 2001 From: Muhimbura Brian Mart Date: Mon, 19 Aug 2024 20:50:33 +0300 Subject: [PATCH 24/24] FBR CHEQUE --- .../pentahoReports/Print Bank Cheque.prpt | Bin 8039 -> 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 b8cb7c2476513af5219bd22c83b516be7072b5c3..fb2467c79a800be44db412419ba663db59ec5265 100644 GIT binary patch delta 668 zcmaEE_uP&*z?+$ci-CcIfx&Z`@I+o8W+1gOCYKRJPd>vaTYp$V!1eo2t|zwZuLKH< z>|V8M3lLx8Ur;eA;AR7Z``^WuPW7F}Q~Z2h_rcS%zb|vE{@@rLoHAzvPh;S= zOKH(5`md{P&gY#vc`45i(>O`5LmE+3nTHiJIFL?#7Q0!!S+H!f#9EB2&32aMB!&gpO zklIfW)x4yC?YTl$vEh+F@<&o?*%nO>e5==T;-A}_weCm$Ez{;VDzmQGv!bR=^7x;s zv&)svv(Dxf|Jr_UvSPHsgVZ;N?0HYT_$k1&wkoQ`{K6vElbp&t@lV4aU-2)ja`|#v z+e&Z$AJJ1M*#o@UISv|}jVWPdU z1s1<&gGhX0-w&49!m*Eyz3=z>$^TyWZ?5G3!z5Yp!&7A%Cj*1A44R>v`-JYXf;Ht! zsDVw{JVWv;#JCC43&DxOM8+6QXURBl0PT$gIdSqP89lJzV;N5{tuJc^rZZ%1!So7Q jOECRJ)(xx)vaTYtzv!1a4g>(ssR0=JSJ z141vpTeWJD`~$1tf~hyAyXceeuq|y_u|wwyaut&?Uxs%8IG86n-ssy;h;ThR2FSIh#XCD^YgF zUKg40?sF^dd#*hfy8KpheeO!Jn`Un68l}DKJHARsX>p0F1TL6UFiTXqs)LthyOJmY2IwN zP2A%aLttKR`_-dGL5>R&%x*D+PUUgbo;4#%*)w>9(l54WUuNGn=XxG{3P=K-pNt=sU ztH1(_-?Kp^KC$lyOKjoT$HxBeM)lk;amP1T^8aCy+&-UY#xza_24fjCLpS#c-D3r7 z%9l_Bo3eR^So?u#E)(lK%$l8MG m6|$CK`iZO?SQE$vla1tTz=DNxreJ!doH>|&4CPD9`v3q@wHjyu