diff --git a/api-docs/apiLive.htm b/api-docs/apiLive.htm index e02adcfcc..33e9c34f8 100644 --- a/api-docs/apiLive.htm +++ b/api-docs/apiLive.htm @@ -5737,7 +5737,8 @@ GET https://DomainName/mifosng-provider/api/v1/loans 1 ] }, - "feeChargesAtDisbursementCharged": 0 + "feeChargesAtDisbursementCharged": 0, + "inArrears":false } ] } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/accountdetails/data/LoanAccountSummaryData.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/accountdetails/data/LoanAccountSummaryData.java index ad5f08dbd..06e864746 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/accountdetails/data/LoanAccountSummaryData.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/accountdetails/data/LoanAccountSummaryData.java @@ -24,10 +24,11 @@ public class LoanAccountSummaryData { private final EnumOptionData loanType; private final Integer loanCycle; private final LoanApplicationTimelineData timeline; + private final Boolean inArrears; public LoanAccountSummaryData(final Long id, final String accountNo, final String externalId, final Long productId, final String loanProductName, final LoanStatusEnumData loanStatus, final EnumOptionData loanType, final Integer loanCycle, - final LoanApplicationTimelineData timeline) { + final LoanApplicationTimelineData timeline, final Boolean inArrears) { this.id = id; this.accountNo = accountNo; this.externalId = externalId; @@ -37,5 +38,6 @@ public class LoanAccountSummaryData { this.loanType = loanType; this.loanCycle = loanCycle; this.timeline = timeline; + this.inArrears = inArrears; } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/accountdetails/service/AccountDetailsReadPlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/accountdetails/service/AccountDetailsReadPlatformServiceJpaRepositoryImpl.java index 38118e3ba..7ce3d5d0a 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/accountdetails/service/AccountDetailsReadPlatformServiceJpaRepositoryImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/accountdetails/service/AccountDetailsReadPlatformServiceJpaRepositoryImpl.java @@ -251,6 +251,7 @@ public class AccountDetailsReadPlatformServiceJpaRepositoryImpl implements Accou .append(" l.closedon_date as closedOnDate,") .append(" cbu.username as closedByUsername, cbu.firstname as closedByFirstname, cbu.lastname as closedByLastname,") + .append(" la.overdue_since_date_derived as overdueSinceDate,") .append(" l.writtenoffon_date as writtenOffOnDate, l.expected_maturedon_date as expectedMaturityDate") .append(" from m_loan l ").append("LEFT JOIN m_product_loan AS lp ON lp.id = l.product_id") @@ -259,7 +260,8 @@ public class AccountDetailsReadPlatformServiceJpaRepositoryImpl implements Accou .append(" left join m_appuser wbu on wbu.id = l.withdrawnon_userid") .append(" left join m_appuser abu on abu.id = l.approvedon_userid") .append(" left join m_appuser dbu on dbu.id = l.disbursedon_userid") - .append(" left join m_appuser cbu on cbu.id = l.closedon_userid"); + .append(" left join m_appuser cbu on cbu.id = l.closedon_userid") + .append(" left join m_loan_arrears_aging la on la.loan_id = l.id"); return accountsSummary.toString(); } @@ -313,6 +315,12 @@ public class AccountDetailsReadPlatformServiceJpaRepositoryImpl implements Accou final LocalDate expectedMaturityDate = JdbcSupport.getLocalDate(rs, "expectedMaturityDate"); + final LocalDate overdueSinceDate = JdbcSupport.getLocalDate(rs, "overdueSinceDate"); + Boolean inArrears = true; + if (overdueSinceDate == null) { + inArrears = false; + } + final LoanApplicationTimelineData timeline = new LoanApplicationTimelineData(submittedOnDate, submittedByUsername, submittedByFirstname, submittedByLastname, rejectedOnDate, rejectedByUsername, rejectedByFirstname, rejectedByLastname, withdrawnOnDate, withdrawnByUsername, withdrawnByFirstname, withdrawnByLastname, approvedOnDate, approvedByUsername, @@ -321,7 +329,7 @@ public class AccountDetailsReadPlatformServiceJpaRepositoryImpl implements Accou expectedMaturityDate, writtenOffOnDate, closedByUsername, closedByFirstname, closedByLastname); return new LoanAccountSummaryData(id, accountNo, externalId, productId, loanProductName, loanStatus, loanType, loanCycle, - timeline); + timeline, inArrears); } } 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 197324aa0..202f6a33f 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 @@ -155,6 +155,8 @@ public class LoanAccountData { private final Map memberVariations; + private final Boolean inArrears; + /** * Used to produce a {@link LoanAccountData} with only collateral options * for now. @@ -237,6 +239,7 @@ public class LoanAccountData { final Collection emiAmountVariations = null; final Map memberVariations = null; final LoanProductData product = null; + final Boolean inArrears = null; return new LoanAccountData(id, accountNo, status, externalId, clientId, clientName, clientOfficeId, group, loanType, loanProductId, loanProductName, loanProductDescription, fundId, fundName, loanPurposeId, loanPurposeName, loanOfficerId, loanOfficerName, currencyData, principal, principal, totalOverpaid, inArrearsTolerance, termFrequency, termPeriodFrequencyType, @@ -250,7 +253,7 @@ public class LoanAccountData { chargeTemplate, loanOfficerOptions, loanPurposeOptions, loanCollateralOptions, calendarOptions, syncDisbursementWithMeeting, loancounter, loanProductCounter, notes, accountLinkingOptions, linkedAccount, disbursementData, multiDisburseLoan, fixedEmiAmount, maxOutstandingLoanBalance, emiAmountVariations, memberVariations, - product); + product, inArrears); } /** @@ -335,6 +338,7 @@ public class LoanAccountData { final Collection emiAmountVariations = null; final Map memberVariations = null; final LoanProductData product = null; + final Boolean inArrears = null; return new LoanAccountData(id, accountNo, status, externalId, clientId, clientName, clientOfficeId, group, loanType, loanProductId, loanProductName, loanProductDescription, fundId, fundName, loanPurposeId, loanPurposeName, loanOfficerId, loanOfficerName, @@ -348,7 +352,7 @@ public class LoanAccountData { interestTypeOptions, interestCalculationPeriodTypeOptions, fundOptions, chargeOptions, chargeTemplate, loanOfficerOptions, loanPurposeOptions, loanCollateralOptions, calendarOptions, syncDisbursementWithMeeting, loancounter, loanProductCounter, notes, accountLinkingOptions, linkedAccount, disbursementData, multiDisburseLoan, fixedEmiAmount, - maxOutstandingLoanBalance, emiAmountVariations, memberVariations, product); + maxOutstandingLoanBalance, emiAmountVariations, memberVariations, product, inArrears); } public static LoanAccountData populateClientDefaults(final LoanAccountData acc, final LoanAccountData clientAcc) { @@ -369,7 +373,7 @@ public class LoanAccountData { acc.loanOfficerOptions, acc.loanPurposeOptions, acc.loanCollateralOptions, acc.calendarOptions, acc.syncDisbursementWithMeeting, acc.loanCounter, acc.loanProductCounter, acc.notes, acc.accountLinkingOptions, acc.linkedAccount, acc.disbursementDetails, acc.multiDisburseLoan, acc.fixedEmiAmount, acc.maxOutstandingLoanBalance, - acc.emiAmountVariations, acc.memberVariations, acc.product); + acc.emiAmountVariations, acc.memberVariations, acc.product, acc.inArrears); } /** @@ -455,6 +459,7 @@ public class LoanAccountData { final Collection emiAmountVariations = null; final Map memberVariations = null; final LoanProductData product = null; + final Boolean inArrears = null; return new LoanAccountData(id, accountNo, status, externalId, clientId, clientName, clientOfficeId, group, loanType, loanProductId, loanProductName, loanProductDescription, fundId, fundName, loanPurposeId, loanPurposeName, loanOfficerId, loanOfficerName, @@ -468,7 +473,7 @@ public class LoanAccountData { interestTypeOptions, interestCalculationPeriodTypeOptions, fundOptions, chargeOptions, chargeTemplate, loanOfficerOptions, loanPurposeOptions, loanCollateralOptions, calendarOptions, syncDisbursementWithMeeting, loancounter, loanProductCounter, notes, accountLinkingOptions, linkedAccount, disbursementData, multiDisburseLoan, fixedEmiAmount, maxOutstandingBalance, - emiAmountVariations, memberVariations, product); + emiAmountVariations, memberVariations, product, inArrears); } public static LoanAccountData populateGroupDefaults(final LoanAccountData acc, final LoanAccountData groupAcc) { @@ -488,7 +493,7 @@ public class LoanAccountData { acc.chargeOptions, null, acc.loanOfficerOptions, acc.loanPurposeOptions, acc.loanCollateralOptions, acc.calendarOptions, acc.syncDisbursementWithMeeting, acc.loanCounter, acc.loanProductCounter, acc.notes, acc.accountLinkingOptions, acc.linkedAccount, acc.disbursementDetails, acc.multiDisburseLoan, acc.fixedEmiAmount, acc.maxOutstandingLoanBalance, - acc.emiAmountVariations, acc.memberVariations, acc.product); + acc.emiAmountVariations, acc.memberVariations, acc.product, acc.inArrears); } public static LoanAccountData loanProductWithTemplateDefaults(final LoanProductData product, @@ -592,6 +597,7 @@ public class LoanAccountData { final Integer termFrequency = numberOfRepayments * product.getRepaymentEvery(); final BigDecimal fixedEmi = null; Map memberVariations = null; + final Boolean inArrears = null; return new LoanAccountData(id, accountNo, status, externalId, clientId, clientName, clientOfficeId, group, loanType, product.getId(), product.getName(), product.getDescription(), product.getFundId(), product.getFundName(), loanPurposeId, @@ -607,7 +613,7 @@ public class LoanAccountData { interestTypeOptions, interestCalculationPeriodTypeOptions, fundOptions, chargeOptions, chargeTemplate, loanOfficerOptions, loanPurposeOptions, loanCollateralOptions, calendarOptions, syncDisbursementWithMeeting, loancounter, loanProductCounter, notes, accountLinkingOptions, linkedAccount, disbursementData, product.getMultiDisburseLoan(), fixedEmi, - product.getOutstandingLoanBalance(), emiAmountVariations, memberVariations, product); + product.getOutstandingLoanBalance(), emiAmountVariations, memberVariations, product, inArrears); } public static LoanAccountData populateLoanProductDefaults(final LoanAccountData acc, final LoanProductData product) { @@ -658,7 +664,7 @@ public class LoanAccountData { fundOptions, chargeOptions, chargeTemplate, loanOfficerOptions, loanPurposeOptions, loanCollateralOptions, calendarOptions, acc.syncDisbursementWithMeeting, acc.loanCounter, acc.loanProductCounter, notes, acc.accountLinkingOptions, acc.linkedAccount, acc.disbursementDetails, product.getMultiDisburseLoan(), acc.fixedEmiAmount, - product.getOutstandingLoanBalance(), acc.emiAmountVariations, acc.memberVariations, product); + product.getOutstandingLoanBalance(), acc.emiAmountVariations, acc.memberVariations, product, acc.inArrears); } /* @@ -679,7 +685,8 @@ public class LoanAccountData { final Integer graceOnInterestCharged, final LocalDate interestChargedFromDate, final LoanApplicationTimelineData timeline, final LoanSummaryData loanSummary, final BigDecimal feeChargesDueAtDisbursementCharged, final Boolean syncDisbursementWithMeeting, final Integer loancounter, final Integer loanProductCounter, - final Boolean multiDisburseLoan, final BigDecimal fixedEmiAmont, final BigDecimal outstandingLoanBalance) { + final Boolean multiDisburseLoan, final BigDecimal fixedEmiAmont, final BigDecimal outstandingLoanBalance, + final Boolean inArrears) { final LoanScheduleData repaymentSchedule = null; final Collection transactions = null; @@ -722,7 +729,7 @@ public class LoanAccountData { interestTypeOptions, interestCalculationPeriodTypeOptions, fundOptions, chargeOptions, chargeTemplate, loanOfficerOptions, loanPurposeOptions, loanCollateralOptions, calendarOptions, syncDisbursementWithMeeting, loancounter, loanProductCounter, notes, accountLinkingOptions, linkedAccount, disbursementData, multiDisburseLoan, fixedEmiAmont, outstandingLoanBalance, - emiAmountVariations, memberVariations, product); + emiAmountVariations, memberVariations, product, inArrears); } /* @@ -757,7 +764,7 @@ public class LoanAccountData { interestCalculationPeriodTypeOptions, fundOptions, chargeOptions, chargeTemplate, loanOfficerOptions, loanPurposeOptions, loanCollateralOptions, calendarOptions, acc.syncDisbursementWithMeeting, acc.loanCounter, acc.loanProductCounter, notes, accountLinkingOptions, linkedAccount, disbursementDetails, acc.multiDisburseLoan, acc.fixedEmiAmount, - acc.maxOutstandingLoanBalance, emiAmountVariations, acc.memberVariations, acc.product); + acc.maxOutstandingLoanBalance, emiAmountVariations, acc.memberVariations, acc.product, acc.inArrears); } public static LoanAccountData associationsAndTemplate(final LoanAccountData acc, final Collection productOptions, @@ -787,7 +794,7 @@ public class LoanAccountData { acc.chargeOptions, null, acc.loanOfficerOptions, acc.loanPurposeOptions, acc.loanCollateralOptions, acc.calendarOptions, acc.syncDisbursementWithMeeting, acc.loanCounter, acc.loanProductCounter, acc.notes, acc.accountLinkingOptions, acc.linkedAccount, acc.disbursementDetails, acc.multiDisburseLoan, acc.fixedEmiAmount, acc.maxOutstandingLoanBalance, - acc.emiAmountVariations, acc.memberVariations, acc.product); + acc.emiAmountVariations, acc.memberVariations, acc.product, acc.inArrears); } public static LoanAccountData associateMemberVariations(final LoanAccountData acc, final Map memberLoanCycle) { @@ -843,7 +850,7 @@ public class LoanAccountData { acc.chargeOptions, null, acc.loanOfficerOptions, acc.loanPurposeOptions, acc.loanCollateralOptions, acc.calendarOptions, acc.syncDisbursementWithMeeting, acc.loanCounter, acc.loanProductCounter, acc.notes, acc.accountLinkingOptions, acc.linkedAccount, acc.disbursementDetails, acc.multiDisburseLoan, acc.fixedEmiAmount, acc.maxOutstandingLoanBalance, - acc.emiAmountVariations, memberVariations, acc.product); + acc.emiAmountVariations, memberVariations, acc.product, acc.inArrears); } private LoanAccountData( @@ -896,7 +903,7 @@ public class LoanAccountData { final PortfolioAccountData linkedAccount, final Collection disbursementDetails, final Boolean multiDisburseLoan, BigDecimal fixedEmiAmount, final BigDecimal maxOutstandingLoanBalance, final Collection emiAmountVariations, final Map memberVariations, - final LoanProductData product) { + final LoanProductData product, final Boolean inArrears) { this.id = id; this.accountNo = accountNo; this.status = status; @@ -1031,6 +1038,7 @@ public class LoanAccountData { this.emiAmountVariations = emiAmountVariations; this.memberVariations = memberVariations; this.product = product; + this.inArrears = inArrears; } public RepaymentScheduleRelatedLoanData repaymentScheduleRelatedData() { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java index 39c6669df..5a421e347 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java @@ -634,6 +634,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { final BigDecimal feeChargesDueAtDisbursementCharged = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "feeChargesDueAtDisbursementCharged"); LoanSummaryData loanSummary = null; + Boolean inArrears = false; if (status.id().intValue() >= 300) { // loan summary @@ -674,6 +675,9 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { final BigDecimal totalOverdue = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "totalOverdue"); final LocalDate overdueSinceDate = JdbcSupport.getLocalDate(rs, "overdueSinceDate"); + if (overdueSinceDate != null) { + inArrears = true; + } loanSummary = new LoanSummaryData(currencyData, principalDisbursed, principalPaid, principalWrittenOff, principalOutstanding, principalOverdue, interestCharged, interestPaid, interestWaived, interestWrittenOff, @@ -705,7 +709,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { annualInterestRate, interestType, interestCalculationPeriodType, expectedFirstRepaymentOnDate, graceOnPrincipalPayment, graceOnInterestPayment, graceOnInterestCharged, interestChargedFromDate, timeline, loanSummary, feeChargesDueAtDisbursementCharged, syncDisbursementWithMeeting, loanCounter, loanProductCounter, multiDisburseLoan, - fixedEmiAmount, outstandingLoanBalance); + fixedEmiAmount, outstandingLoanBalance, inArrears); } }