Skip to content

Commit ef12056

Browse files
budaidevadamsaghy
authored andcommitted
FINERACT-2418: add originatior association
1 parent 3b5ea96 commit ef12056

File tree

7 files changed

+99
-4
lines changed

7 files changed

+99
-4
lines changed

fineract-core/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/DataTableApiConstant.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ private DataTableApiConstant() {
5454
public static final String meetingAssociateParamName = "meeting";
5555
public static final String emiAmountVariationsAssociateParamName = "emiAmountVariations";
5656
public static final String collectionAssociateParamName = "collection";
57+
public static final String originatorsAssociateParamName = "originators";
5758

5859
public static final String TABLE_COLUMN_CODE_MAPPINGS = "x_table_column_code_mappings";
5960
public static final String TABLE_REGISTERED_TABLE = "x_registered_table";

fineract-loan-origination/src/main/java/org/apache/fineract/portfolio/loanorigination/data/LoanOriginatorData.java renamed to fineract-core/src/main/java/org/apache/fineract/portfolio/loanorigination/data/LoanOriginatorData.java

File renamed without changes.

fineract-loan-origination/src/main/resources/db/changelog/tenant/module/loanorigination/parts/0003_mapping_permissions.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<!--
3+
34
Licensed to the Apache Software Foundation (ASF) under one
45
or more contributor license agreements. See the NOTICE file
56
distributed with this work for additional information
@@ -16,6 +17,7 @@
1617
KIND, either express or implied. See the License for the
1718
specific language governing permissions and limitations
1819
under the License.
20+
1921
-->
2022
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
2123
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanAccountData.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus;
5151
import org.apache.fineract.portfolio.loanaccount.guarantor.data.IGuarantor;
5252
import org.apache.fineract.portfolio.loanaccount.loanschedule.data.LoanScheduleData;
53+
import org.apache.fineract.portfolio.loanorigination.data.LoanOriginatorData;
5354
import org.apache.fineract.portfolio.loanproduct.data.LoanProductBorrowerCycleVariationData;
5455
import org.apache.fineract.portfolio.loanproduct.data.LoanProductData;
5556
import org.apache.fineract.portfolio.loanproduct.data.TransactionProcessingStrategyData;
@@ -151,6 +152,7 @@ public class LoanAccountData {
151152
private Collection<NoteData> notes;
152153
private Collection<DisbursementData> disbursementDetails;
153154
private LoanScheduleData originalSchedule;
155+
private Collection<LoanOriginatorData> originators;
154156
// template
155157
private Collection<LoanProductData> productOptions;
156158
private Collection<StaffData> loanOfficerOptions;

fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResource.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import java.util.HashSet;
5858
import java.util.List;
5959
import java.util.Map;
60+
import java.util.Optional;
6061
import java.util.Set;
6162
import lombok.RequiredArgsConstructor;
6263
import org.apache.fineract.commands.domain.CommandWrapper;
@@ -165,6 +166,8 @@
165166
import org.apache.fineract.portfolio.loanaccount.service.LoanReadPlatformService;
166167
import org.apache.fineract.portfolio.loanaccount.service.LoanSummaryDataProvider;
167168
import org.apache.fineract.portfolio.loanaccount.service.LoanSummaryProviderDelegate;
169+
import org.apache.fineract.portfolio.loanorigination.data.LoanOriginatorData;
170+
import org.apache.fineract.portfolio.loanorigination.service.LoanOriginatorReadPlatformService;
168171
import org.apache.fineract.portfolio.loanproduct.LoanProductConstants;
169172
import org.apache.fineract.portfolio.loanproduct.data.LoanProductData;
170173
import org.apache.fineract.portfolio.loanproduct.data.TransactionProcessingStrategyData;
@@ -255,9 +258,9 @@ public class LoansApiResource {
255258
"repaymentFrequencyNthDayTypeOptions", "repaymentFrequencyDaysOfWeekTypeOptions", "termFrequencyTypeOptions",
256259
"interestRateFrequencyTypeOptions", "fundOptions", "repaymentStrategyOptions", "chargeOptions", "loanOfficerOptions",
257260
"loanPurposeOptions", "loanCollateralOptions", "chargeTemplate", "calendarOptions", "syncDisbursementWithMeeting",
258-
"loanCounter", "loanProductCounter", "notes", "accountLinkingOptions", "linkedAccount", "interestRateDifferential",
259-
"isFloatingInterestRate", "interestRatesPeriods", "lastClosedBusinessDate", LoanApiConstants.canUseForTopup,
260-
LoanApiConstants.isTopup, LoanApiConstants.loanIdToClose, LoanApiConstants.topupAmount,
261+
"loanCounter", "loanProductCounter", "notes", "originators", "accountLinkingOptions", "linkedAccount",
262+
"interestRateDifferential", "isFloatingInterestRate", "interestRatesPeriods", "lastClosedBusinessDate",
263+
LoanApiConstants.canUseForTopup, LoanApiConstants.isTopup, LoanApiConstants.loanIdToClose, LoanApiConstants.topupAmount,
261264
LoanApiConstants.clientActiveLoanOptions, LoanApiConstants.datatables, LoanProductConstants.RATES_PARAM_NAME,
262265
LoanApiConstants.MULTIDISBURSE_DETAILS_PARAMNAME, LoanApiConstants.EMI_AMOUNT_VARIATIONS_PARAMNAME,
263266
LoanApiConstants.COLLECTION_PARAMNAME, LoanApiConstants.INTEREST_RECOGNITION_ON_DISBURSEMENT_DATE,
@@ -310,6 +313,7 @@ public class LoansApiResource {
310313
private final LoanSummaryProviderDelegate loanSummaryProviderDelegate;
311314
private final LoanCapitalizedIncomeBalanceRepository loanCapitalizedIncomeBalanceRepository;
312315
private final LoanApprovedAmountHistoryRepository loanApprovedAmountHistoryRepository;
316+
private final Optional<LoanOriginatorReadPlatformService> loanOriginatorReadPlatformService;
313317

314318
/*
315319
* This template API is used for loan approval, ideally this should be invoked on loan that are pending for
@@ -1052,7 +1056,7 @@ private String retrieveLoan(final Long loanId, final String loanExternalIdStr, b
10521056
DataTableApiConstant.guarantorsAssociateParamName, DataTableApiConstant.collateralAssociateParamName,
10531057
DataTableApiConstant.notesAssociateParamName, DataTableApiConstant.linkedAccountAssociateParamName,
10541058
DataTableApiConstant.multiDisburseDetailsAssociateParamName, DataTableApiConstant.collectionAssociateParamName,
1055-
DataTableApiConstant.loanTermVariationsAssociateParamName));
1059+
DataTableApiConstant.loanTermVariationsAssociateParamName, DataTableApiConstant.originatorsAssociateParamName));
10561060
}
10571061

10581062
ApiParameterHelper.excludeAssociationsForResponseIfProvided(exclude, associationParameters);
@@ -1158,6 +1162,14 @@ private String retrieveLoan(final Long loanId, final String loanExternalIdStr, b
11581162
mandatoryResponseParameters.add(DataTableApiConstant.linkedAccountAssociateParamName);
11591163
linkedAccount = this.accountAssociationsReadPlatformService.retriveLoanLinkedAssociation(resolvedLoanId);
11601164
}
1165+
1166+
if (associationParameters.contains(DataTableApiConstant.originatorsAssociateParamName)) {
1167+
mandatoryResponseParameters.add(DataTableApiConstant.originatorsAssociateParamName);
1168+
if (loanOriginatorReadPlatformService.isPresent()) {
1169+
List<LoanOriginatorData> originatorList = loanOriginatorReadPlatformService.get().retrieveByLoanId(resolvedLoanId);
1170+
loanBasicDetails.setOriginators(originatorList.isEmpty() ? Collections.emptyList() : originatorList);
1171+
}
1172+
}
11611173
}
11621174

11631175
Collection<LoanProductData> productOptions = null;

integration-tests/src/test/java/org/apache/fineract/integrationtests/client/feign/helpers/FeignLoanHelper.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,14 @@ public GetLoansLoanIdResponse getLoanDetails(Long loanId) {
9090
return ok(() -> fineractClient.loans().retrieveLoan(loanId, Map.of("associations", "all", "exclude", "guarantors,futureSchedule")));
9191
}
9292

93+
public GetLoansLoanIdResponse getLoanDetailsWithAssociations(Long loanId, String associations) {
94+
return ok(() -> fineractClient.loans().retrieveLoan(loanId, Map.of("associations", associations)));
95+
}
96+
97+
public GetLoansLoanIdResponse getLoanDetailsWithAssociationsAndExclude(Long loanId, String associations, String exclude) {
98+
return ok(() -> fineractClient.loans().retrieveLoan(loanId, Map.of("associations", associations, "exclude", exclude)));
99+
}
100+
93101
public void undoApproval(Long loanId) {
94102
PostLoansLoanIdRequest request = new PostLoansLoanIdRequest();
95103
ok(() -> fineractClient.loans().stateTransitions(loanId, request, Map.of("command", "undoApproval")));

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

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,4 +343,74 @@ public void testAttachOriginatorToApprovedLoanReturns403() {
343343

344344
originatorHelper.deleteOriginator(originatorId);
345345
}
346+
347+
@Test
348+
public void testRetrieveLoanWithOriginatorsAssociation() {
349+
final String originatorExternalId = FeignLoanOriginatorHelper.generateUniqueExternalId();
350+
final Long originatorId = originatorHelper.createOriginator(originatorExternalId);
351+
352+
final Long clientId = clientHelper.createClient("Test", "Client");
353+
final Long loanId = loanHelper.createSubmittedLoan(clientId);
354+
355+
originatorHelper.attachOriginatorToLoan(loanId, originatorId);
356+
357+
final var loanDetails = loanHelper.getLoanDetailsWithAssociations(loanId, "originators");
358+
359+
assertThat(loanDetails.getOriginators()).isNotNull();
360+
assertThat(loanDetails.getOriginators()).hasSize(1);
361+
assertThat(loanDetails.getOriginators().get(0).getId()).isEqualTo(originatorId);
362+
assertThat(loanDetails.getOriginators().get(0).getExternalId()).isEqualTo(originatorExternalId);
363+
364+
originatorHelper.detachOriginatorFromLoan(loanId, originatorId);
365+
originatorHelper.deleteOriginator(originatorId);
366+
}
367+
368+
@Test
369+
public void testRetrieveLoanWithAllAssociationsIncludesOriginators() {
370+
final String originatorExternalId = FeignLoanOriginatorHelper.generateUniqueExternalId();
371+
final Long originatorId = originatorHelper.createOriginator(originatorExternalId);
372+
373+
final Long clientId = clientHelper.createClient("Test", "Client");
374+
final Long loanId = loanHelper.createSubmittedLoan(clientId);
375+
376+
originatorHelper.attachOriginatorToLoan(loanId, originatorId);
377+
378+
final var loanDetails = loanHelper.getLoanDetailsWithAssociationsAndExclude(loanId, "all", "guarantors,futureSchedule");
379+
380+
assertThat(loanDetails.getOriginators()).isNotNull();
381+
assertThat(loanDetails.getOriginators()).isNotEmpty();
382+
assertThat(loanDetails.getOriginators().get(0).getId()).isEqualTo(originatorId);
383+
384+
originatorHelper.detachOriginatorFromLoan(loanId, originatorId);
385+
originatorHelper.deleteOriginator(originatorId);
386+
}
387+
388+
@Test
389+
public void testRetrieveLoanWithNoOriginatorsReturnsEmptyList() {
390+
final Long clientId = clientHelper.createClient("Test", "Client");
391+
final Long loanId = loanHelper.createSubmittedLoan(clientId);
392+
393+
final var loanDetails = loanHelper.getLoanDetailsWithAssociations(loanId, "originators");
394+
395+
assertThat(loanDetails.getOriginators()).isNotNull();
396+
assertThat(loanDetails.getOriginators()).isEmpty();
397+
}
398+
399+
@Test
400+
public void testRetrieveLoanExcludeOriginatorsFromAll() {
401+
final String originatorExternalId = FeignLoanOriginatorHelper.generateUniqueExternalId();
402+
final Long originatorId = originatorHelper.createOriginator(originatorExternalId);
403+
404+
final Long clientId = clientHelper.createClient("Test", "Client");
405+
final Long loanId = loanHelper.createSubmittedLoan(clientId);
406+
407+
originatorHelper.attachOriginatorToLoan(loanId, originatorId);
408+
409+
final var loanDetails = loanHelper.getLoanDetailsWithAssociationsAndExclude(loanId, "all", "originators,guarantors,futureSchedule");
410+
411+
assertThat(loanDetails.getOriginators()).isNull();
412+
413+
originatorHelper.detachOriginatorFromLoan(loanId, originatorId);
414+
originatorHelper.deleteOriginator(originatorId);
415+
}
346416
}

0 commit comments

Comments
 (0)