diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/api/LoansApiResource.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/api/LoansApiResource.java index 8ef0e7c5a..87f5d9ecd 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/api/LoansApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/api/LoansApiResource.java @@ -74,6 +74,9 @@ import org.mifosplatform.portfolio.loanproduct.data.LoanProductData; import org.mifosplatform.portfolio.loanproduct.data.TransactionProcessingStrategyData; import org.mifosplatform.portfolio.loanproduct.service.LoanDropdownReadPlatformService; import org.mifosplatform.portfolio.loanproduct.service.LoanProductReadPlatformService; +import org.mifosplatform.portfolio.note.data.NoteData; +import org.mifosplatform.portfolio.note.domain.NoteType; +import org.mifosplatform.portfolio.note.service.NoteReadPlatformServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -97,7 +100,7 @@ public class LoansApiResource { "amortizationTypeOptions", "interestTypeOptions", "interestCalculationPeriodTypeOptions", "repaymentFrequencyTypeOptions", "termFrequencyTypeOptions", "interestRateFrequencyTypeOptions", "fundOptions", "repaymentStrategyOptions", "chargeOptions", "loanOfficerOptions", "loanPurposeOptions", "loanCollateralOptions", "chargeTemplate", "calendarOptions", "syncDisbursementWithMeeting", - "loanCounter", "loanProductCounter")); + "loanCounter", "loanProductCounter", "notes")); private final String resourceNameForPermissions = "LOAN"; @@ -121,6 +124,7 @@ public class LoansApiResource { private final FromJsonHelper fromJsonHelper; private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; private final CalendarReadPlatformService calendarReadPlatformService; + private final NoteReadPlatformServiceImpl noteReadPlatformService; @Autowired public LoansApiResource(final PlatformSecurityContext context, final LoanReadPlatformService loanReadPlatformService, @@ -136,7 +140,7 @@ public class LoansApiResource { final DefaultToApiJsonSerializer loanOfficeTransferToApiJsonSerializer, final ApiRequestParameterHelper apiRequestParameterHelper, final FromJsonHelper fromJsonHelper, final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService, - final CalendarReadPlatformService calendarReadPlatformService) { + final CalendarReadPlatformService calendarReadPlatformService, final NoteReadPlatformServiceImpl noteReadPlatformService) { this.context = context; this.loanReadPlatformService = loanReadPlatformService; this.loanProductReadPlatformService = loanProductReadPlatformService; @@ -157,6 +161,7 @@ public class LoansApiResource { this.fromJsonHelper = fromJsonHelper; this.commandsSourceWritePlatformService = commandsSourceWritePlatformService; this.calendarReadPlatformService = calendarReadPlatformService; + this.noteReadPlatformService = noteReadPlatformService; } @GET @@ -275,13 +280,14 @@ public class LoansApiResource { Collection guarantors = null; Collection collateral = null; CalendarData meeting = null; + Collection notes = null; final Set mandatoryResponseParameters = new HashSet(); final Set associationParameters = ApiParameterHelper.extractAssociationsForResponseIfProvided(uriInfo.getQueryParameters()); if (!associationParameters.isEmpty()) { if (associationParameters.contains("all")) { - associationParameters.addAll(Arrays.asList("repaymentSchedule", "transactions", "charges", "guarantors", "collateral")); + associationParameters.addAll(Arrays.asList("repaymentSchedule", "transactions", "charges", "guarantors", "collateral","notes")); } if (associationParameters.contains("guarantors")) { @@ -327,6 +333,14 @@ public class LoansApiResource { mandatoryResponseParameters.add("meeting"); meeting = this.calendarReadPlatformService.retrieveLoanCalendar(loanId); } + + if (associationParameters.contains("notes")) { + mandatoryResponseParameters.add("notes"); + notes = this.noteReadPlatformService.retrieveNotesByResource(loanId, NoteType.LOAN.getValue()); + if (CollectionUtils.isEmpty(notes)) { + notes = null; + } + } } Collection productOptions = null; @@ -381,7 +395,7 @@ public class LoansApiResource { charges, collateral, guarantors, meeting, productOptions, loanTermFrequencyTypeOptions, repaymentFrequencyTypeOptions, repaymentStrategyOptions, interestRateFrequencyTypeOptions, amortizationTypeOptions, interestTypeOptions, interestCalculationPeriodTypeOptions, fundOptions, chargeOptions, chargeTemplate, allowedLoanOfficers, loanPurposeOptions, - loanCollateralOptions, calendarOptions); + loanCollateralOptions, calendarOptions, notes); final ApiRequestJsonSerializationSettings settings = apiRequestParameterHelper.process(uriInfo.getQueryParameters(), mandatoryResponseParameters); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanAccountData.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanAccountData.java index d8f4294fa..d4b5c2943 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanAccountData.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanAccountData.java @@ -30,14 +30,15 @@ import org.mifosplatform.portfolio.loanaccount.guarantor.data.GuarantorData; import org.mifosplatform.portfolio.loanaccount.loanschedule.data.LoanScheduleData; import org.mifosplatform.portfolio.loanproduct.data.LoanProductData; import org.mifosplatform.portfolio.loanproduct.data.TransactionProcessingStrategyData; +import org.mifosplatform.portfolio.note.data.NoteData; import org.springframework.util.CollectionUtils; /** * Immutable data object representing loan account data. */ @SuppressWarnings("unused") -public class LoanAccountData { +public class LoanAccountData { // basic loan details // identity @@ -102,6 +103,7 @@ public class LoanAccountData { private final Collection collateral; private final Collection guarantors; private final CalendarData meeting; + private Collection notes; // template private final Collection productOptions; @@ -180,6 +182,7 @@ public class LoanAccountData { final Collection charges = null; final Collection collateral = null; final Collection guarantors = null; + final Collection notes = null; final CalendarData calendarData = null; final Collection productOptions = null; final Collection termFrequencyTypeOptions = null; @@ -209,7 +212,7 @@ public class LoanAccountData { productOptions, termFrequencyTypeOptions, repaymentFrequencyTypeOptions, transactionProcessingStrategyOptions, interestRateFrequencyTypeOptions, amortizationTypeOptions, interestTypeOptions, interestCalculationPeriodTypeOptions, fundOptions, chargeOptions, chargeTemplate, loanOfficerOptions, loanPurposeOptions, loanCollateralOptions, calendarOptions, - syncDisbursementWithMeeting, loancounter, loanProductCounter); + syncDisbursementWithMeeting, loancounter, loanProductCounter, notes); } /** @@ -264,6 +267,7 @@ public class LoanAccountData { final Collection charges = null; final Collection collateral = null; final Collection guarantors = null; + final Collection notes = null; final CalendarData calendarData = null; final Collection productOptions = null; final Collection termFrequencyTypeOptions = null; @@ -294,7 +298,7 @@ public class LoanAccountData { productOptions, termFrequencyTypeOptions, repaymentFrequencyTypeOptions, repaymentStrategyOptions, interestRateFrequencyTypeOptions, amortizationTypeOptions, interestTypeOptions, interestCalculationPeriodTypeOptions, fundOptions, chargeOptions, chargeTemplate, loanOfficerOptions, loanPurposeOptions, loanCollateralOptions, calendarOptions, - syncDisbursementWithMeeting, loancounter, loanProductCounter); + syncDisbursementWithMeeting, loancounter, loanProductCounter, notes); } public static LoanAccountData populateClientDefaults(final LoanAccountData acc, final LoanAccountData clientAcc) { @@ -312,7 +316,7 @@ public class LoanAccountData { acc.transactionProcessingStrategyOptions, acc.interestRateFrequencyTypeOptions, acc.amortizationTypeOptions, acc.interestTypeOptions, acc.interestCalculationPeriodTypeOptions, acc.fundOptions, acc.chargeOptions, null, acc.loanOfficerOptions, acc.loanPurposeOptions, acc.loanCollateralOptions, acc.calendarOptions, acc.syncDisbursementWithMeeting, - acc.loanCounter, acc.loanProductCounter); + acc.loanCounter, acc.loanProductCounter, acc.notes); } /** @@ -368,6 +372,7 @@ public class LoanAccountData { final Collection charges = null; final Collection collateral = null; final Collection guarantors = null; + final Collection notes = null; final CalendarData calendarData = null; final Collection productOptions = null; final Collection termFrequencyTypeOptions = null; @@ -398,7 +403,7 @@ public class LoanAccountData { productOptions, termFrequencyTypeOptions, repaymentFrequencyTypeOptions, repaymentStrategyOptions, interestRateFrequencyTypeOptions, amortizationTypeOptions, interestTypeOptions, interestCalculationPeriodTypeOptions, fundOptions, chargeOptions, chargeTemplate, loanOfficerOptions, loanPurposeOptions, loanCollateralOptions, calendarOptions, - syncDisbursementWithMeeting, loancounter, loanProductCounter); + syncDisbursementWithMeeting, loancounter, loanProductCounter, notes); } public static LoanAccountData populateGroupDefaults(final LoanAccountData acc, final LoanAccountData groupAcc) { @@ -416,7 +421,7 @@ public class LoanAccountData { acc.transactionProcessingStrategyOptions, acc.interestRateFrequencyTypeOptions, acc.amortizationTypeOptions, acc.interestTypeOptions, acc.interestCalculationPeriodTypeOptions, acc.fundOptions, acc.chargeOptions, null, acc.loanOfficerOptions, acc.loanPurposeOptions, acc.loanCollateralOptions, acc.calendarOptions, - acc.syncDisbursementWithMeeting, acc.loanCounter, acc.loanProductCounter); + acc.syncDisbursementWithMeeting, acc.loanCounter, acc.loanProductCounter, acc.notes); } public static LoanAccountData loanProductWithTemplateDefaults(final LoanProductData product, @@ -469,6 +474,7 @@ public class LoanAccountData { final Collection transactions = null; final Collection collateral = null; final Collection guarantors = null; + final Collection notes = null; final CalendarData calendarData = null; final Collection productOptions = null; final Collection calendarOptions = null; @@ -497,7 +503,7 @@ public class LoanAccountData { repaymentSchedule, transactions, charges, collateral, guarantors, calendarData, productOptions, termFrequencyTypeOptions, repaymentFrequencyTypeOptions, repaymentStrategyOptions, interestRateFrequencyTypeOptions, amortizationTypeOptions, interestTypeOptions, interestCalculationPeriodTypeOptions, fundOptions, chargeOptions, chargeTemplate, loanOfficerOptions, - loanPurposeOptions, loanCollateralOptions, calendarOptions, syncDisbursementWithMeeting, loancounter, loanProductCounter); + loanPurposeOptions, loanCollateralOptions, calendarOptions, syncDisbursementWithMeeting, loancounter, loanProductCounter, notes); } public static LoanAccountData populateLoanProductDefaults(final LoanAccountData acc, final LoanProductData product) { @@ -506,6 +512,7 @@ public class LoanAccountData { final Collection transactions = null; final Collection collateral = null; final Collection guarantors = null; + final Collection notes = null; final CalendarData calendarData = null; final Collection productOptions = null; final Collection termFrequencyTypeOptions = null; @@ -544,7 +551,7 @@ public class LoanAccountData { calendarData, productOptions, termFrequencyTypeOptions, repaymentFrequencyTypeOptions, repaymentStrategyOptions, interestRateFrequencyTypeOptions, amortizationTypeOptions, interestTypeOptions, interestCalculationPeriodTypeOptions, fundOptions, chargeOptions, chargeTemplate, loanOfficerOptions, loanPurposeOptions, loanCollateralOptions, calendarOptions, - acc.syncDisbursementWithMeeting, acc.loanCounter, acc.loanProductCounter); + acc.syncDisbursementWithMeeting, acc.loanCounter, acc.loanProductCounter, notes); } /* @@ -571,6 +578,7 @@ public class LoanAccountData { final Collection charges = null; final Collection collateral = null; final Collection guarantors = null; + final Collection notes = null; final CalendarData calendarData = null; final Collection productOptions = null; final Collection termFrequencyTypeOptions = null; @@ -598,7 +606,7 @@ public class LoanAccountData { productOptions, termFrequencyTypeOptions, repaymentFrequencyTypeOptions, repaymentStrategyOptions, interestRateFrequencyTypeOptions, amortizationTypeOptions, interestTypeOptions, interestCalculationPeriodTypeOptions, fundOptions, chargeOptions, chargeTemplate, loanOfficerOptions, loanPurposeOptions, loanCollateralOptions, calendarOptions, - syncDisbursementWithMeeting, loancounter, loanProductCounter); + syncDisbursementWithMeeting, loancounter, loanProductCounter, notes); } /* @@ -615,7 +623,7 @@ public class LoanAccountData { final Collection interestTypeOptions, final Collection interestCalculationPeriodTypeOptions, final Collection fundOptions, final Collection chargeOptions, final ChargeData chargeTemplate, final Collection loanOfficerOptions, final Collection loanPurposeOptions, - final Collection loanCollateralOptions, final Collection calendarOptions) { + final Collection loanCollateralOptions, final Collection calendarOptions, final Collection notes) { return new LoanAccountData(acc.id, acc.accountNo, acc.status, acc.externalId, acc.clientId, acc.clientName, acc.clientOfficeId, acc.group, acc.loanType, acc.loanProductId, acc.loanProductName, acc.loanProductDescription, acc.fundId, acc.fundName, acc.loanPurposeId, acc.loanPurposeName, acc.loanOfficerId, acc.loanOfficerName, acc.currency, acc.principal, @@ -628,7 +636,7 @@ public class LoanAccountData { productOptions, termFrequencyTypeOptions, repaymentFrequencyTypeOptions, transactionProcessingStrategyOptions, interestRateFrequencyTypeOptions, amortizationTypeOptions, interestTypeOptions, interestCalculationPeriodTypeOptions, fundOptions, chargeOptions, chargeTemplate, loanOfficerOptions, loanPurposeOptions, loanCollateralOptions, calendarOptions, - acc.syncDisbursementWithMeeting, acc.loanCounter, acc.loanProductCounter); + acc.syncDisbursementWithMeeting, acc.loanCounter, acc.loanProductCounter, notes); } public static LoanAccountData associationsAndTemplate(final LoanAccountData acc, final Collection productOptions, @@ -637,7 +645,7 @@ public class LoanAccountData { acc.meeting, productOptions, acc.termFrequencyTypeOptions, acc.repaymentFrequencyTypeOptions, acc.transactionProcessingStrategyOptions, acc.interestRateFrequencyTypeOptions, acc.amortizationTypeOptions, acc.interestTypeOptions, acc.interestCalculationPeriodTypeOptions, acc.fundOptions, acc.chargeOptions, null, - allowedLoanOfficers, acc.loanPurposeOptions, acc.loanCollateralOptions, calendarOptions); + allowedLoanOfficers, acc.loanPurposeOptions, acc.loanCollateralOptions, calendarOptions, acc.notes); } public static LoanAccountData associateGroup(final LoanAccountData acc, final GroupGeneralData group) { @@ -654,7 +662,7 @@ public class LoanAccountData { acc.transactionProcessingStrategyOptions, acc.interestRateFrequencyTypeOptions, acc.amortizationTypeOptions, acc.interestTypeOptions, acc.interestCalculationPeriodTypeOptions, acc.fundOptions, acc.chargeOptions, null, acc.loanOfficerOptions, acc.loanPurposeOptions, acc.loanCollateralOptions, acc.calendarOptions, - acc.syncDisbursementWithMeeting, acc.loanCounter, acc.loanProductCounter); + acc.syncDisbursementWithMeeting, acc.loanCounter, acc.loanProductCounter, acc.notes); } private LoanAccountData( @@ -701,7 +709,7 @@ public class LoanAccountData { final Collection fundOptions, final Collection chargeOptions, final ChargeData chargeTemplate, final Collection loanOfficerOptions, final Collection loanPurposeOptions, final Collection loanCollateralOptions, final Collection calendarOptions, - final Boolean syncDisbursementWithMeeting, final Integer loanCounter, final Integer loanProductCounter) { + final Boolean syncDisbursementWithMeeting, final Integer loanCounter, final Integer loanProductCounter, final Collection notes) { this.id = id; this.accountNo = accountNo; this.status = status; @@ -755,6 +763,7 @@ public class LoanAccountData { this.collateral = collateral; this.guarantors = guarantors; this.meeting = meeting; + this.notes = notes; // template this.productOptions = productOptions; diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/note/service/NoteReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/note/service/NoteReadPlatformServiceImpl.java index a5a384f9e..33998c9cf 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/note/service/NoteReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/note/service/NoteReadPlatformServiceImpl.java @@ -94,17 +94,17 @@ public class NoteReadPlatformServiceImpl implements NoteReadPlatformService { final String sql = rm.schema() + " where " + conditionSql + " order by n.created_date DESC"; - return this.jdbcTemplate.query(sql, rm, new Object[] { resourceId }); + return this.jdbcTemplate.query(sql, rm, new Object[] { resourceId}); } public static String getResourceCondition(final NoteType noteType) { String conditionSql = ""; switch (noteType) { case CLIENT: - conditionSql = " n.client_id = ? "; + conditionSql = " n.client_id = ? and note_type_enum = " + NoteType.CLIENT.getValue(); break; case LOAN: - conditionSql = " n.loan_id = ? "; + conditionSql = " n.loan_id = ? and ( n.note_type_enum = " + NoteType.LOAN.getValue()+ " or n.note_type_enum = " + NoteType.LOAN_TRANSACTION.getValue() + " )"; break; case LOAN_TRANSACTION: conditionSql = " n.loan_transaction_id = ? ";