diff --git a/mifosng-db/migrations/core_db/V201__add_NthDay_and_DayOfWeek_columns_loan.sql b/mifosng-db/migrations/core_db/V201__add_NthDay_and_DayOfWeek_columns_loan.sql new file mode 100644 index 000000000..2fa44f74e --- /dev/null +++ b/mifosng-db/migrations/core_db/V201__add_NthDay_and_DayOfWeek_columns_loan.sql @@ -0,0 +1,3 @@ +ALTER TABLE `m_loan` + ADD COLUMN `repayment_frequency_nth_day_enum` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `repayment_period_frequency_enum`, + ADD COLUMN `repayment_frequency_day_of_week_enum` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `repayment_frequency_nth_day_enum`; diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/common/domain/DayOfWeekType.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/common/domain/DayOfWeekType.java new file mode 100644 index 000000000..30dc9d807 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/common/domain/DayOfWeekType.java @@ -0,0 +1,64 @@ +package org.mifosplatform.portfolio.common.domain; + +import org.joda.time.DateTimeConstants; + +public enum DayOfWeekType { + + MONDAY(DateTimeConstants.MONDAY, "weekDayType.monday"), + TUESDAY(DateTimeConstants.TUESDAY, "weekDayType.tuesday"), + WEDNESDAY(DateTimeConstants.WEDNESDAY, "weekDayType.wednesday"), + THURSDAY(DateTimeConstants.THURSDAY, "weekDayType.thursday"), + FRIDAY(DateTimeConstants.FRIDAY, "weekDayType.friday"), + SATURDAY(DateTimeConstants.SATURDAY, "weekDayType.saturday"), + SUNDAY(DateTimeConstants.SUNDAY, "weekDayType.sunday"), + INVALID(0, "weekDayType.invalid"); + + private final Integer value; + private final String code; + + private DayOfWeekType(Integer value, String code) { + this.value = value; + this.code = code; + } + + public Integer getValue() { + return this.value; + } + + public String getCode() { + return this.code; + } + + public static DayOfWeekType fromInt(final Integer dayOfWeek) { + DayOfWeekType weekDayType = INVALID; + if (dayOfWeek != null) { + switch (dayOfWeek) { + case 1: + weekDayType = MONDAY; + break; + case 2: + weekDayType = TUESDAY; + break; + case 3: + weekDayType = WEDNESDAY; + break; + case 4: + weekDayType = THURSDAY; + break; + case 5: + weekDayType = FRIDAY; + break; + case 6: + weekDayType = SATURDAY; + break; + case 7: + weekDayType = SUNDAY; + break; + default: + break; + } + } + return weekDayType; + } + +} diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/common/domain/NthDayType.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/common/domain/NthDayType.java new file mode 100644 index 000000000..657130278 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/common/domain/NthDayType.java @@ -0,0 +1,54 @@ +package org.mifosplatform.portfolio.common.domain; + +public enum NthDayType { + + ONE(1,"nthDayType.one"), + TWO(2,"nthDayType.two"), + THREE(3,"nthDayType.three"), + FOUR(4,"nthDayType.four"), + FIVE(5,"nthDayType.five"), + INVALID(0,"nthDayType.invalid"); + + private final Integer value; + private final String code; + + private NthDayType(Integer value, String code) { + this.value = value; + this.code = code; + } + + public Integer getValue() { + return this.value; + } + + public String getCode() { + return this.code; + } + + public static NthDayType fromInt(final Integer frequency) { + NthDayType repaymentFrequencyNthDayType = NthDayType.INVALID; + if (frequency != null) { + switch (frequency) { + case 1: + repaymentFrequencyNthDayType = NthDayType.ONE; + break; + case 2: + repaymentFrequencyNthDayType = NthDayType.TWO; + break; + case 3: + repaymentFrequencyNthDayType = NthDayType.THREE; + break; + case 4: + repaymentFrequencyNthDayType = NthDayType.FOUR; + break; + case 5: + repaymentFrequencyNthDayType = NthDayType.FIVE; + break; + default: + break; + } + } + return repaymentFrequencyNthDayType; + } + +} 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 fefed4eb7..ab5216c82 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 @@ -110,11 +110,11 @@ public class LoansApiResource { "expectedFirstRepaymentOnDate", "graceOnPrincipalPayment", "graceOnInterestPayment", "graceOnInterestCharged", "interestChargedFromDate", "timeline", "totalFeeChargesAtDisbursement", "summary", "repaymentSchedule", "transactions", "charges", "collateral", "guarantors", "meeting", "productOptions", "amortizationTypeOptions", "interestTypeOptions", - "interestCalculationPeriodTypeOptions", "repaymentFrequencyTypeOptions", "termFrequencyTypeOptions", + "interestCalculationPeriodTypeOptions", "repaymentFrequencyTypeOptions", "repaymentFrequencyNthDayTypeOptions", "repaymentFrequencyDaysOfWeekTypeOptions", "termFrequencyTypeOptions", "interestRateFrequencyTypeOptions", "fundOptions", "repaymentStrategyOptions", "chargeOptions", "loanOfficerOptions", "loanPurposeOptions", "loanCollateralOptions", "chargeTemplate", "calendarOptions", "syncDisbursementWithMeeting", "loanCounter", "loanProductCounter", "notes", "accountLinkingOptions", "linkedAccount")); - + private final String resourceNameForPermissions = "LOAN"; private final PlatformSecurityContext context; @@ -413,6 +413,8 @@ public class LoansApiResource { Collection productOptions = null; Collection loanTermFrequencyTypeOptions = null; Collection repaymentFrequencyTypeOptions = null; + Collection repaymentFrequencyNthDayTypeOptions = null; + Collection repaymentFrequencyDaysOfWeekTypeOptions = null; Collection repaymentStrategyOptions = null; Collection interestRateFrequencyTypeOptions = null; Collection amortizationTypeOptions = null; @@ -432,6 +434,8 @@ public class LoansApiResource { productOptions = this.loanProductReadPlatformService.retrieveAllLoanProductsForLookup(); loanTermFrequencyTypeOptions = this.dropdownReadPlatformService.retrieveLoanTermFrequencyTypeOptions(); repaymentFrequencyTypeOptions = this.dropdownReadPlatformService.retrieveRepaymentFrequencyTypeOptions(); + repaymentFrequencyNthDayTypeOptions = this.dropdownReadPlatformService.retrieveRepaymentFrequencyOptionsForNthDayOfMonth(); + repaymentFrequencyDaysOfWeekTypeOptions = this.dropdownReadPlatformService.retrieveRepaymentFrequencyOptionsForDaysOfWeek(); interestRateFrequencyTypeOptions = this.dropdownReadPlatformService.retrieveInterestRateFrequencyTypeOptions(); amortizationTypeOptions = this.dropdownReadPlatformService.retrieveLoanAmortizationTypeOptions(); @@ -474,7 +478,7 @@ public class LoansApiResource { final LoanAccountData loanAccount = LoanAccountData.associationsAndTemplate(loanBasicDetails, repaymentSchedule, loanRepayments, charges, collateral, guarantors, meeting, productOptions, loanTermFrequencyTypeOptions, repaymentFrequencyTypeOptions, - repaymentStrategyOptions, interestRateFrequencyTypeOptions, amortizationTypeOptions, interestTypeOptions, + null, null, repaymentStrategyOptions, interestRateFrequencyTypeOptions, amortizationTypeOptions, interestTypeOptions, interestCalculationPeriodTypeOptions, fundOptions, chargeOptions, chargeTemplate, allowedLoanOfficers, loanPurposeOptions, loanCollateralOptions, calendarOptions, notes, accountLinkingOptions, linkedAccount, disbursementData, emiAmountVariations, overdueCharges); 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 316cc8976..a5352a455 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 @@ -28,6 +28,8 @@ import org.mifosplatform.portfolio.account.data.PortfolioAccountData; import org.mifosplatform.portfolio.calendar.data.CalendarData; import org.mifosplatform.portfolio.charge.data.ChargeData; import org.mifosplatform.portfolio.collateral.data.CollateralData; +import org.mifosplatform.portfolio.common.domain.NthDayType; +import org.mifosplatform.portfolio.common.domain.DayOfWeekType; import org.mifosplatform.portfolio.fund.data.FundData; import org.mifosplatform.portfolio.group.data.GroupGeneralData; import org.mifosplatform.portfolio.loanaccount.domain.LoanStatus; @@ -37,6 +39,7 @@ import org.mifosplatform.portfolio.loanproduct.data.LoanProductBorrowerCycleVari import org.mifosplatform.portfolio.loanproduct.data.LoanProductData; import org.mifosplatform.portfolio.loanproduct.data.TransactionProcessingStrategyData; import org.mifosplatform.portfolio.loanproduct.domain.LoanProductValueConditionType; +import org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations; import org.mifosplatform.portfolio.note.data.NoteData; import org.springframework.util.CollectionUtils; @@ -81,6 +84,8 @@ public class LoanAccountData { private final Integer numberOfRepayments; private final Integer repaymentEvery; private final EnumOptionData repaymentFrequencyType; + private final EnumOptionData repaymentFrequencyNthDayType; + private final EnumOptionData repaymentFrequencyDayOfWeekType; private final BigDecimal interestRatePerPeriod; private final EnumOptionData interestRateFrequencyType; private final BigDecimal annualInterestRate; @@ -123,6 +128,9 @@ public class LoanAccountData { private final Collection fundOptions; private final Collection termFrequencyTypeOptions; private final Collection repaymentFrequencyTypeOptions; + private final Collection repaymentFrequencyNthDayTypeOptions; + private final Collection repaymentFrequencyDaysOfWeekTypeOptions; + private final Collection interestRateFrequencyTypeOptions; private final Collection amortizationTypeOptions; private final Collection interestTypeOptions; @@ -202,6 +210,8 @@ public class LoanAccountData { final Integer numberOfRepayments = null; final Integer repaymentEvery = null; final EnumOptionData repaymentFrequencyType = null; + final EnumOptionData repaymentFrequencyNthDayType = null; + final EnumOptionData repaymentFrequencyDayOfWeekType = null; final Long transactionProcessingStrategyId = null; final String transactionProcessingStrategyName = null; final EnumOptionData amortizationType = null; @@ -230,6 +240,8 @@ public class LoanAccountData { final Collection productOptions = null; final Collection termFrequencyTypeOptions = null; final Collection repaymentFrequencyTypeOptions = null; + final Collection repaymentFrequencyNthDayTypeOptions = null; + final Collection repaymentFrequencyDayOfWeekTypeOptions = null; final Collection transactionProcessingStrategyOptions = null; final Collection interestRateFrequencyTypeOptions = null; final Collection amortizationTypeOptions = null; @@ -266,12 +278,14 @@ public class LoanAccountData { 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, - numberOfRepayments, repaymentEvery, repaymentFrequencyType, transactionProcessingStrategyId, + numberOfRepayments, repaymentEvery, repaymentFrequencyType,repaymentFrequencyNthDayType, + repaymentFrequencyDayOfWeekType, transactionProcessingStrategyId, transactionProcessingStrategyName, amortizationType, interestRatePerPeriod, interestRateFrequencyType, annualInterestRate, interestType, interestCalculationPeriodType, expectedFirstRepaymentOnDate, graceOnPrincipalPayment, graceOnInterestPayment, graceOnInterestCharged, interestChargedFromDate, timeline, summary, feeChargesDueAtDisbursementCharged, repaymentSchedule, transactions, charges, collateral, guarantors, calendarData, productOptions, termFrequencyTypeOptions, - repaymentFrequencyTypeOptions, transactionProcessingStrategyOptions, interestRateFrequencyTypeOptions, + repaymentFrequencyTypeOptions, repaymentFrequencyNthDayTypeOptions, repaymentFrequencyDayOfWeekTypeOptions, + transactionProcessingStrategyOptions, interestRateFrequencyTypeOptions, amortizationTypeOptions, interestTypeOptions, interestCalculationPeriodTypeOptions, fundOptions, chargeOptions, chargeTemplate, loanOfficerOptions, loanPurposeOptions, loanCollateralOptions, calendarOptions, syncDisbursementWithMeeting, loancounter, loanProductCounter, notes, accountLinkingOptions, linkedAccount, @@ -311,6 +325,8 @@ public class LoanAccountData { final Integer numberOfRepayments = null; final Integer repaymentEvery = null; final EnumOptionData repaymentFrequencyType = null; + final EnumOptionData repaymentFrequencyNthDayType = null; + final EnumOptionData repaymentFrequencyDayOfWeekType = null; final Long transactionProcessingStrategyId = null; final String transactionProcessingStrategyName = null; final EnumOptionData amortizationType = null; @@ -339,6 +355,8 @@ public class LoanAccountData { final Collection productOptions = null; final Collection termFrequencyTypeOptions = null; final Collection repaymentFrequencyTypeOptions = null; + final Collection repaymentFrequencyNthDayTypeOptions = null; + final Collection repaymentFrequencyDayOfWeekTypeOptions = null; final Collection repaymentStrategyOptions = null; final Collection interestRateFrequencyTypeOptions = null; final Collection amortizationTypeOptions = null; @@ -376,12 +394,14 @@ public class LoanAccountData { 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, - numberOfRepayments, repaymentEvery, repaymentFrequencyType, transactionProcessingStrategyId, + numberOfRepayments, repaymentEvery, repaymentFrequencyType, repaymentFrequencyNthDayType, + repaymentFrequencyDayOfWeekType, transactionProcessingStrategyId, transactionProcessingStrategyName, amortizationType, interestRatePerPeriod, interestRateFrequencyType, annualInterestRate, interestType, interestCalculationPeriodType, expectedFirstRepaymentOnDate, graceOnPrincipalPayment, graceOnInterestPayment, graceOnInterestCharged, interestChargedFromDate, timeline, summary, feeChargesDueAtDisbursementCharged, repaymentSchedule, transactions, charges, collateral, guarantors, calendarData, productOptions, termFrequencyTypeOptions, - repaymentFrequencyTypeOptions, repaymentStrategyOptions, interestRateFrequencyTypeOptions, amortizationTypeOptions, + repaymentFrequencyTypeOptions, repaymentFrequencyNthDayTypeOptions, repaymentFrequencyDayOfWeekTypeOptions, + repaymentStrategyOptions, interestRateFrequencyTypeOptions, amortizationTypeOptions, interestTypeOptions, interestCalculationPeriodTypeOptions, fundOptions, chargeOptions, chargeTemplate, loanOfficerOptions, loanPurposeOptions, loanCollateralOptions, calendarOptions, syncDisbursementWithMeeting, loancounter, loanProductCounter, notes, accountLinkingOptions, linkedAccount, disbursementData, multiDisburseLoan, fixedEmiAmount, @@ -395,13 +415,14 @@ public class LoanAccountData { clientAcc.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, acc.approvedPrincipal, acc.totalOverpaid, acc.inArrearsTolerance, acc.termFrequency, - acc.termPeriodFrequencyType, acc.numberOfRepayments, acc.repaymentEvery, acc.repaymentFrequencyType, + acc.termPeriodFrequencyType, acc.numberOfRepayments, acc.repaymentEvery, acc.repaymentFrequencyType,acc.repaymentFrequencyNthDayType, acc.repaymentFrequencyDayOfWeekType, acc.transactionProcessingStrategyId, acc.transactionProcessingStrategyName, acc.amortizationType, acc.interestRatePerPeriod, acc.interestRateFrequencyType, acc.annualInterestRate, acc.interestType, acc.interestCalculationPeriodType, acc.expectedFirstRepaymentOnDate, acc.graceOnPrincipalPayment, acc.graceOnInterestPayment, acc.graceOnInterestCharged, acc.interestChargedFromDate, clientAcc.timeline, acc.summary, acc.feeChargesAtDisbursementCharged, acc.repaymentSchedule, acc.transactions, acc.charges, acc.collateral, acc.guarantors, acc.meeting, acc.productOptions, acc.termFrequencyTypeOptions, acc.repaymentFrequencyTypeOptions, + acc.repaymentFrequencyNthDayTypeOptions,acc.repaymentFrequencyDaysOfWeekTypeOptions, acc.transactionProcessingStrategyOptions, acc.interestRateFrequencyTypeOptions, acc.amortizationTypeOptions, acc.interestTypeOptions, acc.interestCalculationPeriodTypeOptions, acc.fundOptions, acc.chargeOptions, null, acc.loanOfficerOptions, acc.loanPurposeOptions, acc.loanCollateralOptions, acc.calendarOptions, @@ -444,6 +465,8 @@ public class LoanAccountData { final Integer numberOfRepayments = null; final Integer repaymentEvery = null; final EnumOptionData repaymentFrequencyType = null; + final EnumOptionData repaymentFrequencyNthDayType = null; + final EnumOptionData repaymentFrequencyDayOfWeekType = null; final Long transactionProcessingStrategyId = null; final String transactionProcessingStrategyName = null; final EnumOptionData amortizationType = null; @@ -472,6 +495,8 @@ public class LoanAccountData { final Collection productOptions = null; final Collection termFrequencyTypeOptions = null; final Collection repaymentFrequencyTypeOptions = null; + final Collection repaymentFrequencyNthDayTypeOptions = null; + final Collection repaymentFrequencyDayOfWeekTypeOptions = null; final Collection repaymentStrategyOptions = null; final Collection interestRateFrequencyTypeOptions = null; final Collection amortizationTypeOptions = null; @@ -509,12 +534,14 @@ public class LoanAccountData { 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, - numberOfRepayments, repaymentEvery, repaymentFrequencyType, transactionProcessingStrategyId, + numberOfRepayments, repaymentEvery, repaymentFrequencyType, repaymentFrequencyNthDayType, + repaymentFrequencyDayOfWeekType, transactionProcessingStrategyId, transactionProcessingStrategyName, amortizationType, interestRatePerPeriod, interestRateFrequencyType, annualInterestRate, interestType, interestCalculationPeriodType, expectedFirstRepaymentOnDate, graceOnPrincipalPayment, graceOnInterestPayment, graceOnInterestCharged, interestChargedFromDate, timeline, summary, feeChargesDueAtDisbursementCharged, repaymentSchedule, transactions, charges, collateral, guarantors, calendarData, productOptions, termFrequencyTypeOptions, - repaymentFrequencyTypeOptions, repaymentStrategyOptions, interestRateFrequencyTypeOptions, amortizationTypeOptions, + repaymentFrequencyTypeOptions, repaymentFrequencyNthDayTypeOptions, + repaymentFrequencyDayOfWeekTypeOptions, repaymentStrategyOptions, interestRateFrequencyTypeOptions, amortizationTypeOptions, interestTypeOptions, interestCalculationPeriodTypeOptions, fundOptions, chargeOptions, chargeTemplate, loanOfficerOptions, loanPurposeOptions, loanCollateralOptions, calendarOptions, syncDisbursementWithMeeting, loancounter, loanProductCounter, notes, accountLinkingOptions, linkedAccount, disbursementData, multiDisburseLoan, fixedEmiAmount, maxOutstandingBalance, @@ -528,13 +555,14 @@ public class LoanAccountData { groupAcc.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, acc.approvedPrincipal, acc.totalOverpaid, acc.inArrearsTolerance, acc.termFrequency, acc.termPeriodFrequencyType, - acc.numberOfRepayments, acc.repaymentEvery, acc.repaymentFrequencyType, acc.transactionProcessingStrategyId, + acc.numberOfRepayments, acc.repaymentEvery, acc.repaymentFrequencyType, acc.repaymentFrequencyNthDayType, + acc.repaymentFrequencyDayOfWeekType, acc.transactionProcessingStrategyId, acc.transactionProcessingStrategyName, acc.amortizationType, acc.interestRatePerPeriod, acc.interestRateFrequencyType, acc.annualInterestRate, acc.interestType, acc.interestCalculationPeriodType, acc.expectedFirstRepaymentOnDate, acc.graceOnPrincipalPayment, acc.graceOnInterestPayment, acc.graceOnInterestCharged, acc.interestChargedFromDate, groupAcc.timeline, acc.summary, acc.feeChargesAtDisbursementCharged, acc.repaymentSchedule, acc.transactions, acc.charges, acc.collateral, acc.guarantors, acc.meeting, acc.productOptions, acc.termFrequencyTypeOptions, - acc.repaymentFrequencyTypeOptions, acc.transactionProcessingStrategyOptions, acc.interestRateFrequencyTypeOptions, + acc.repaymentFrequencyTypeOptions, acc.repaymentFrequencyNthDayTypeOptions, acc.repaymentFrequencyDaysOfWeekTypeOptions, 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.notes, acc.accountLinkingOptions, @@ -546,6 +574,7 @@ public class LoanAccountData { public static LoanAccountData loanProductWithTemplateDefaults(final LoanProductData product, final Collection termFrequencyTypeOptions, final Collection repaymentFrequencyTypeOptions, + final Collection repaymentFrequencyNthDayTypeOptions,final Collection repaymentFrequencyDayOfWeekTypeOptions, final Collection repaymentStrategyOptions, final Collection interestRateFrequencyTypeOptions, final Collection amortizationTypeOptions, final Collection interestTypeOptions, final Collection interestCalculationPeriodTypeOptions, @@ -655,13 +684,14 @@ public class LoanAccountData { product.getId(), product.getName(), product.getDescription(), product.getFundId(), product.getFundName(), loanPurposeId, loanPurposeName, loanOfficerId, loanOfficerName, product.getCurrency(), principal, principal, totalOverpaid, product.getInArrearsTolerance(), termFrequency, termPeriodFrequencyType, numberOfRepayments, product.getRepaymentEvery(), - product.getRepaymentFrequencyType(), product.getTransactionProcessingStrategyId(), transactionProcessingStrategyName, + product.getRepaymentFrequencyType(), null, null, product.getTransactionProcessingStrategyId(), transactionProcessingStrategyName, product.getAmortizationType(), interestRatePerPeriod, product.getInterestRateFrequencyType(), product.getAnnualInterestRate(), product.getInterestType(), product.getInterestCalculationPeriodType(), expectedFirstRepaymentOnDate, product.getGraceOnPrincipalPayment(), product.getGraceOnInterestPayment(), product.getGraceOnInterestCharged(), interestChargedFromDate, timeline, summary, feeChargesDueAtDisbursementCharged, repaymentSchedule, transactions, charges, collateral, guarantors, calendarData, productOptions, termFrequencyTypeOptions, - repaymentFrequencyTypeOptions, repaymentStrategyOptions, interestRateFrequencyTypeOptions, amortizationTypeOptions, + repaymentFrequencyTypeOptions,repaymentFrequencyNthDayTypeOptions, + repaymentFrequencyDayOfWeekTypeOptions, repaymentStrategyOptions, interestRateFrequencyTypeOptions, amortizationTypeOptions, interestTypeOptions, interestCalculationPeriodTypeOptions, fundOptions, chargeOptions, chargeTemplate, loanOfficerOptions, loanPurposeOptions, loanCollateralOptions, calendarOptions, syncDisbursementWithMeeting, loancounter, loanProductCounter, notes, accountLinkingOptions, linkedAccount, disbursementData, product.getMultiDisburseLoan(), fixedEmi, @@ -708,13 +738,13 @@ public class LoanAccountData { product.getFundName(), acc.loanPurposeId, acc.loanPurposeName, acc.loanOfficerId, acc.loanOfficerName, product.getCurrency(), product.getPrincipal(), product.getPrincipal(), acc.totalOverpaid, product.getInArrearsTolerance(), termFrequency, termPeriodFrequencyType, product.getNumberOfRepayments(), product.getRepaymentEvery(), - product.getRepaymentFrequencyType(), product.getTransactionProcessingStrategyId(), + product.getRepaymentFrequencyType(), null, null, product.getTransactionProcessingStrategyId(), product.getTransactionProcessingStrategyName(), product.getAmortizationType(), product.getInterestRatePerPeriod(), product.getInterestRateFrequencyType(), product.getAnnualInterestRate(), product.getInterestType(), product.getInterestCalculationPeriodType(), acc.expectedFirstRepaymentOnDate, product.getGraceOnPrincipalPayment(), product.getGraceOnInterestPayment(), product.getGraceOnInterestCharged(), acc.interestChargedFromDate, acc.timeline, acc.summary, acc.feeChargesAtDisbursementCharged, repaymentSchedule, transactions, charges, collateral, guarantors, - calendarData, productOptions, termFrequencyTypeOptions, repaymentFrequencyTypeOptions, repaymentStrategyOptions, + calendarData, productOptions, termFrequencyTypeOptions, repaymentFrequencyTypeOptions, null, null, repaymentStrategyOptions, interestRateFrequencyTypeOptions, amortizationTypeOptions, interestTypeOptions, interestCalculationPeriodTypeOptions, fundOptions, chargeOptions, chargeTemplate, loanOfficerOptions, loanPurposeOptions, loanCollateralOptions, calendarOptions, acc.syncDisbursementWithMeeting, acc.loanCounter, acc.loanProductCounter, notes, acc.accountLinkingOptions, @@ -736,17 +766,17 @@ public class LoanAccountData { final String loanOfficerName, final CurrencyData currencyData, final BigDecimal principal, final BigDecimal approvedPrincipal, final BigDecimal totalOverpaid, final BigDecimal inArrearsTolerance, final Integer termFrequency, final EnumOptionData termPeriodFrequencyType, final Integer numberOfRepayments, final Integer repaymentEvery, - final EnumOptionData repaymentFrequencyType, final Long transactionStrategyId, final String transactionStrategyName, - final EnumOptionData amortizationType, final BigDecimal interestRatePerPeriod, final EnumOptionData interestRateFrequencyType, - final BigDecimal annualInterestRate, final EnumOptionData interestType, final EnumOptionData interestCalculationPeriodType, - final LocalDate expectedFirstRepaymentOnDate, final Integer graceOnPrincipalPayment, final Integer graceOnInterestPayment, - 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 inArrears, final Integer graceOnArrearsAgeing, final Boolean isNPA, final EnumOptionData daysInMonthType, - final EnumOptionData daysInYearType, final boolean isInterestRecalculationEnabled, - final LoanInterestRecalculationData interestRecalculationData) { + final EnumOptionData repaymentFrequencyType, EnumOptionData repaymentFrequencyNthDayType, EnumOptionData repaymentFrequencyDayOfWeekType, + final Long transactionStrategyId, final String transactionStrategyName, final EnumOptionData amortizationType, + final BigDecimal interestRatePerPeriod, final EnumOptionData interestRateFrequencyType, final BigDecimal annualInterestRate, + final EnumOptionData interestType, final EnumOptionData interestCalculationPeriodType, final LocalDate expectedFirstRepaymentOnDate, + final Integer graceOnPrincipalPayment, final Integer graceOnInterestPayment, 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 inArrears, final Integer graceOnArrearsAgeing, + final Boolean isNPA, final EnumOptionData daysInMonthType, + final EnumOptionData daysInYearType, final boolean isInterestRecalculationEnabled, final LoanInterestRecalculationData interestRecalculationData) { final LoanScheduleData repaymentSchedule = null; final Collection transactions = null; @@ -758,6 +788,8 @@ public class LoanAccountData { final Collection productOptions = null; final Collection termFrequencyTypeOptions = null; final Collection repaymentFrequencyTypeOptions = null; + final Collection repaymentFrequencyNthDayTypeOptions = null; + final Collection repaymentFrequencyDayOfWeekTypeOptions = null; final Collection repaymentStrategyOptions = null; final Collection interestRateFrequencyTypeOptions = null; final Collection amortizationTypeOptions = null; @@ -782,12 +814,14 @@ public class LoanAccountData { return new LoanAccountData(id, accountNo, status, externalId, clientId, clientName, clientOfficeId, group, loanType, loanProductId, loanProductName, loanProductDescription, fundId, fundName, loanPurposeId, loanPurposeName, loanOfficerId, loanOfficerName, currencyData, principal, approvedPrincipal, totalOverpaid, inArrearsTolerance, termFrequency, termPeriodFrequencyType, - numberOfRepayments, repaymentEvery, repaymentFrequencyType, transactionStrategyId, transactionStrategyName, + numberOfRepayments, repaymentEvery, repaymentFrequencyType, repaymentFrequencyNthDayType, repaymentFrequencyDayOfWeekType, + transactionStrategyId, transactionStrategyName, amortizationType, interestRatePerPeriod, interestRateFrequencyType, annualInterestRate, interestType, interestCalculationPeriodType, expectedFirstRepaymentOnDate, graceOnPrincipalPayment, graceOnInterestPayment, graceOnInterestCharged, interestChargedFromDate, timeline, loanSummary, feeChargesDueAtDisbursementCharged, repaymentSchedule, transactions, charges, collateral, guarantors, calendarData, productOptions, termFrequencyTypeOptions, - repaymentFrequencyTypeOptions, repaymentStrategyOptions, interestRateFrequencyTypeOptions, amortizationTypeOptions, + repaymentFrequencyTypeOptions, repaymentFrequencyNthDayTypeOptions, + repaymentFrequencyDayOfWeekTypeOptions, repaymentStrategyOptions, interestRateFrequencyTypeOptions, amortizationTypeOptions, interestTypeOptions, interestCalculationPeriodTypeOptions, fundOptions, chargeOptions, chargeTemplate, loanOfficerOptions, loanPurposeOptions, loanCollateralOptions, calendarOptions, syncDisbursementWithMeeting, loancounter, loanProductCounter, notes, accountLinkingOptions, linkedAccount, disbursementData, multiDisburseLoan, fixedEmiAmont, outstandingLoanBalance, @@ -803,11 +837,11 @@ public class LoanAccountData { final Collection transactions, final Collection charges, final Collection collateral, final Collection guarantors, final CalendarData calendarData, final Collection productOptions, final Collection termFrequencyTypeOptions, - final Collection repaymentFrequencyTypeOptions, - final Collection transactionProcessingStrategyOptions, + final Collection repaymentFrequencyTypeOptions, final Collection repaymentFrequencyNthDayTypeOptions, + final Collection repaymentFrequencyDayOfWeekTypeOptions, final Collection transactionProcessingStrategyOptions, final Collection interestRateFrequencyTypeOptions, final Collection amortizationTypeOptions, - final Collection interestTypeOptions, final Collection interestCalculationPeriodTypeOptions, - final Collection fundOptions, final Collection chargeOptions, final ChargeData chargeTemplate, + 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 notes, final Collection accountLinkingOptions, @@ -818,12 +852,13 @@ public class LoanAccountData { 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, acc.approvedPrincipal, acc.totalOverpaid, acc.inArrearsTolerance, acc.termFrequency, acc.termPeriodFrequencyType, - acc.numberOfRepayments, acc.repaymentEvery, acc.repaymentFrequencyType, acc.transactionProcessingStrategyId, + acc.numberOfRepayments, acc.repaymentEvery, acc.repaymentFrequencyType,acc.repaymentFrequencyNthDayType, + acc.repaymentFrequencyDayOfWeekType, acc.transactionProcessingStrategyId, acc.transactionProcessingStrategyName, acc.amortizationType, acc.interestRatePerPeriod, acc.interestRateFrequencyType, acc.annualInterestRate, acc.interestType, acc.interestCalculationPeriodType, acc.expectedFirstRepaymentOnDate, acc.graceOnPrincipalPayment, acc.graceOnInterestPayment, acc.graceOnInterestCharged, acc.interestChargedFromDate, acc.timeline, acc.summary, acc.feeChargesAtDisbursementCharged, repaymentSchedule, transactions, charges, collateral, - guarantors, calendarData, productOptions, termFrequencyTypeOptions, repaymentFrequencyTypeOptions, + guarantors, calendarData, productOptions, termFrequencyTypeOptions, repaymentFrequencyTypeOptions,repaymentFrequencyNthDayTypeOptions, repaymentFrequencyDayOfWeekTypeOptions, transactionProcessingStrategyOptions, interestRateFrequencyTypeOptions, amortizationTypeOptions, interestTypeOptions, interestCalculationPeriodTypeOptions, fundOptions, chargeOptions, chargeTemplate, loanOfficerOptions, loanPurposeOptions, loanCollateralOptions, calendarOptions, acc.syncDisbursementWithMeeting, acc.loanCounter, acc.loanProductCounter, notes, @@ -837,7 +872,7 @@ public class LoanAccountData { final Collection allowedLoanOfficers, final Collection calendarOptions, final Collection accountLinkingOptions) { return associationsAndTemplate(acc, acc.repaymentSchedule, acc.transactions, acc.charges, acc.collateral, acc.guarantors, - acc.meeting, productOptions, acc.termFrequencyTypeOptions, acc.repaymentFrequencyTypeOptions, + acc.meeting, productOptions, acc.termFrequencyTypeOptions, acc.repaymentFrequencyTypeOptions,acc.repaymentFrequencyNthDayTypeOptions, acc.repaymentFrequencyDaysOfWeekTypeOptions, acc.transactionProcessingStrategyOptions, acc.interestRateFrequencyTypeOptions, acc.amortizationTypeOptions, acc.interestTypeOptions, acc.interestCalculationPeriodTypeOptions, acc.fundOptions, acc.chargeOptions, null, allowedLoanOfficers, acc.loanPurposeOptions, acc.loanCollateralOptions, calendarOptions, acc.notes, accountLinkingOptions, @@ -849,13 +884,14 @@ public class LoanAccountData { 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, acc.approvedPrincipal, acc.totalOverpaid, acc.inArrearsTolerance, acc.termFrequency, acc.termPeriodFrequencyType, - acc.numberOfRepayments, acc.repaymentEvery, acc.repaymentFrequencyType, acc.transactionProcessingStrategyId, + acc.numberOfRepayments, acc.repaymentEvery, acc.repaymentFrequencyType, acc.repaymentFrequencyNthDayType, + acc.repaymentFrequencyDayOfWeekType, acc.transactionProcessingStrategyId, acc.transactionProcessingStrategyName, acc.amortizationType, acc.interestRatePerPeriod, acc.interestRateFrequencyType, acc.annualInterestRate, acc.interestType, acc.interestCalculationPeriodType, acc.expectedFirstRepaymentOnDate, acc.graceOnPrincipalPayment, acc.graceOnInterestPayment, acc.graceOnInterestCharged, acc.interestChargedFromDate, acc.timeline, acc.summary, acc.feeChargesAtDisbursementCharged, acc.repaymentSchedule, acc.transactions, acc.charges, acc.collateral, acc.guarantors, acc.meeting, acc.productOptions, acc.termFrequencyTypeOptions, - acc.repaymentFrequencyTypeOptions, acc.transactionProcessingStrategyOptions, acc.interestRateFrequencyTypeOptions, + acc.repaymentFrequencyTypeOptions, acc.repaymentFrequencyNthDayTypeOptions, acc.repaymentFrequencyDaysOfWeekTypeOptions, 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.notes, acc.accountLinkingOptions, @@ -907,13 +943,14 @@ public class LoanAccountData { 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, acc.approvedPrincipal, acc.totalOverpaid, acc.inArrearsTolerance, acc.termFrequency, acc.termPeriodFrequencyType, - acc.numberOfRepayments, acc.repaymentEvery, acc.repaymentFrequencyType, acc.transactionProcessingStrategyId, + acc.numberOfRepayments, acc.repaymentEvery, acc.repaymentFrequencyType, acc.repaymentFrequencyNthDayType, + acc.repaymentFrequencyDayOfWeekType, acc.transactionProcessingStrategyId, acc.transactionProcessingStrategyName, acc.amortizationType, acc.interestRatePerPeriod, acc.interestRateFrequencyType, acc.annualInterestRate, acc.interestType, acc.interestCalculationPeriodType, acc.expectedFirstRepaymentOnDate, acc.graceOnPrincipalPayment, acc.graceOnInterestPayment, acc.graceOnInterestCharged, acc.interestChargedFromDate, acc.timeline, acc.summary, acc.feeChargesAtDisbursementCharged, acc.repaymentSchedule, acc.transactions, acc.charges, acc.collateral, acc.guarantors, acc.meeting, acc.productOptions, acc.termFrequencyTypeOptions, - acc.repaymentFrequencyTypeOptions, acc.transactionProcessingStrategyOptions, acc.interestRateFrequencyTypeOptions, + acc.repaymentFrequencyTypeOptions, acc.repaymentFrequencyNthDayTypeOptions, acc.repaymentFrequencyDaysOfWeekTypeOptions, 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.notes, acc.accountLinkingOptions, @@ -931,13 +968,15 @@ public class LoanAccountData { 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, acc.approvedPrincipal, acc.totalOverpaid, acc.inArrearsTolerance, acc.termFrequency, acc.termPeriodFrequencyType, - acc.numberOfRepayments, acc.repaymentEvery, acc.repaymentFrequencyType, acc.transactionProcessingStrategyId, + acc.numberOfRepayments, acc.repaymentEvery, acc.repaymentFrequencyType,acc.repaymentFrequencyNthDayType, + acc.repaymentFrequencyDayOfWeekType, acc.transactionProcessingStrategyId, acc.transactionProcessingStrategyName, acc.amortizationType, acc.interestRatePerPeriod, acc.interestRateFrequencyType, acc.annualInterestRate, acc.interestType, acc.interestCalculationPeriodType, acc.expectedFirstRepaymentOnDate, acc.graceOnPrincipalPayment, acc.graceOnInterestPayment, acc.graceOnInterestCharged, acc.interestChargedFromDate, acc.timeline, acc.summary, acc.feeChargesAtDisbursementCharged, acc.repaymentSchedule, acc.transactions, acc.charges, acc.collateral, acc.guarantors, acc.meeting, acc.productOptions, acc.termFrequencyTypeOptions, - acc.repaymentFrequencyTypeOptions, acc.transactionProcessingStrategyOptions, acc.interestRateFrequencyTypeOptions, + acc.repaymentFrequencyTypeOptions,acc.repaymentFrequencyNthDayTypeOptions, acc.repaymentFrequencyDaysOfWeekTypeOptions, + 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.notes, acc.accountLinkingOptions, @@ -953,13 +992,15 @@ public class LoanAccountData { 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, acc.approvedPrincipal, acc.totalOverpaid, acc.inArrearsTolerance, acc.termFrequency, acc.termPeriodFrequencyType, - acc.numberOfRepayments, acc.repaymentEvery, acc.repaymentFrequencyType, acc.transactionProcessingStrategyId, + acc.numberOfRepayments, acc.repaymentEvery, acc.repaymentFrequencyType,acc.repaymentFrequencyNthDayType, + acc.repaymentFrequencyDayOfWeekType, acc.transactionProcessingStrategyId, acc.transactionProcessingStrategyName, acc.amortizationType, acc.interestRatePerPeriod, acc.interestRateFrequencyType, acc.annualInterestRate, acc.interestType, acc.interestCalculationPeriodType, acc.expectedFirstRepaymentOnDate, acc.graceOnPrincipalPayment, acc.graceOnInterestPayment, acc.graceOnInterestCharged, acc.interestChargedFromDate, acc.timeline, acc.summary, acc.feeChargesAtDisbursementCharged, acc.repaymentSchedule, acc.transactions, acc.charges, acc.collateral, acc.guarantors, acc.meeting, acc.productOptions, acc.termFrequencyTypeOptions, - acc.repaymentFrequencyTypeOptions, acc.transactionProcessingStrategyOptions, acc.interestRateFrequencyTypeOptions, + acc.repaymentFrequencyTypeOptions, acc.repaymentFrequencyNthDayTypeOptions, acc.repaymentFrequencyDaysOfWeekTypeOptions, + 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.notes, acc.accountLinkingOptions, @@ -998,6 +1039,7 @@ public class LoanAccountData { final Integer numberOfRepayments, final Integer repaymentEvery, final EnumOptionData repaymentFrequencyType, // + final EnumOptionData repaymentFrequencyNthDayType, final EnumOptionData repaymentFrequencyDayOfWeekType, final Long transactionProcessingStrategyId, final String transactionProcessingStrategyName, final EnumOptionData amortizationType, final BigDecimal interestRatePerPeriod, final EnumOptionData interestRateFrequencyType, final BigDecimal annualInterestRate, final EnumOptionData interestType, final EnumOptionData interestCalculationPeriodType, @@ -1007,7 +1049,8 @@ public class LoanAccountData { final Collection transactions, final Collection charges, final Collection collateral, final Collection guarantors, final CalendarData meeting, final Collection productOptions, final Collection termFrequencyTypeOptions, - final Collection repaymentFrequencyTypeOptions, + final Collection repaymentFrequencyTypeOptions, final Collection repaymentFrequencyNthDayTypeOptions, + final Collection repaymentFrequencyDaysOfWeekTypeOptions, final Collection transactionProcessingStrategyOptions, final Collection interestRateFrequencyTypeOptions, final Collection amortizationTypeOptions, final Collection interestTypeOptions, final Collection interestCalculationPeriodTypeOptions, @@ -1051,6 +1094,8 @@ public class LoanAccountData { this.numberOfRepayments = numberOfRepayments; this.repaymentEvery = repaymentEvery; this.repaymentFrequencyType = repaymentFrequencyType; + this.repaymentFrequencyNthDayType = repaymentFrequencyNthDayType == null ? LoanEnumerations.repaymentFrequencyNthDayType(NthDayType.INVALID) : repaymentFrequencyNthDayType; + this.repaymentFrequencyDayOfWeekType = repaymentFrequencyDayOfWeekType == null ? LoanEnumerations.repaymentFrequencyDayOfWeekType(DayOfWeekType.INVALID) : repaymentFrequencyDayOfWeekType; this.transactionProcessingStrategyId = transactionProcessingStrategyId; this.transactionProcessingStrategyName = transactionProcessingStrategyName; this.amortizationType = amortizationType; @@ -1084,6 +1129,8 @@ public class LoanAccountData { this.productOptions = productOptions; this.termFrequencyTypeOptions = termFrequencyTypeOptions; this.repaymentFrequencyTypeOptions = repaymentFrequencyTypeOptions; + this.repaymentFrequencyNthDayTypeOptions = repaymentFrequencyNthDayTypeOptions; + this.repaymentFrequencyDaysOfWeekTypeOptions = repaymentFrequencyDaysOfWeekTypeOptions; this.interestRateFrequencyTypeOptions = interestRateFrequencyTypeOptions; this.amortizationTypeOptions = amortizationTypeOptions; this.interestTypeOptions = interestTypeOptions; diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/Loan.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/Loan.java index b3a967a4b..5ed87012b 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/Loan.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/Loan.java @@ -24,6 +24,8 @@ import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Embedded; import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; @@ -69,6 +71,8 @@ import org.mifosplatform.portfolio.charge.exception.LoanChargeCannotBeAddedExcep import org.mifosplatform.portfolio.client.domain.Client; import org.mifosplatform.portfolio.collateral.data.CollateralData; import org.mifosplatform.portfolio.collateral.domain.LoanCollateral; +import org.mifosplatform.portfolio.common.domain.DayOfWeekType; +import org.mifosplatform.portfolio.common.domain.NthDayType; import org.mifosplatform.portfolio.common.domain.PeriodFrequencyType; import org.mifosplatform.portfolio.fund.domain.Fund; import org.mifosplatform.portfolio.group.domain.Group; @@ -152,6 +156,12 @@ public class Loan extends AbstractPersistable { @Embedded private LoanProductRelatedDetail loanRepaymentScheduleDetail; + + @Column(name = "repayment_frequency_nth_day_enum", nullable = false) + private Integer repaymentFrequencyNthDayType; + + @Column(name = "repayment_frequency_day_of_week_enum", nullable = false) + private Integer repaymentFrequencyDayOfWeekType; @Column(name = "term_frequency", nullable = false) private Integer termFrequency; @@ -1540,6 +1550,15 @@ public class Loan extends AbstractPersistable { this.expectedDisbursementDate = loanApplicationTerms.getExpectedDisbursementDate().toDate(); this.expectedFirstRepaymentOnDate = loanApplicationTerms.getRepaymentStartFromDate(); this.interestChargedFromDate = loanApplicationTerms.getInterestChargedFromDate(); + + if(loanApplicationTerms.getRepaymentPeriodFrequencyType() == PeriodFrequencyType.MONTHS) { + this.repaymentFrequencyNthDayType = loanApplicationTerms.getNthDay(); + this.repaymentFrequencyDayOfWeekType = loanApplicationTerms.getWeekDayType().getValue(); + } else { + this.repaymentFrequencyNthDayType = NthDayType.INVALID.getValue(); + this.repaymentFrequencyDayOfWeekType = DayOfWeekType.INVALID.getValue(); + } + updateLoanScheduleDependentDerivedFields(); @@ -2068,6 +2087,8 @@ public class Loan extends AbstractPersistable { final Integer loanTermFrequency = this.termFrequency; final PeriodFrequencyType loanTermPeriodFrequencyType = PeriodFrequencyType.fromInt(this.termPeriodFrequencyType); + final NthDayType nthDayType = NthDayType.fromInt(this.repaymentFrequencyNthDayType); + final DayOfWeekType dayOfWeekType = DayOfWeekType.fromInt(this.repaymentFrequencyDayOfWeekType); final List disbursementData = new ArrayList<>(); for (LoanDisbursementDetails disbursementDetails : this.disbursementDetails) { disbursementData.add(disbursementDetails.toData()); @@ -2089,10 +2110,10 @@ public class Loan extends AbstractPersistable { } final LoanApplicationTerms loanApplicationTerms = LoanApplicationTerms.assembleFrom(applicationCurrency, loanTermFrequency, - loanTermPeriodFrequencyType, getDisbursementDate(), getExpectedFirstRepaymentOnDate(), - calculatedRepaymentsStartingFromDate, getInArrearsTolerance(), this.loanRepaymentScheduleDetail, - this.loanProduct.isMultiDisburseLoan(), this.fixedEmiAmount, disbursementData, this.maxOutstandingLoanBalance, - loanVariationTermsData, getInterestChargedFromDate()); + loanTermPeriodFrequencyType, nthDayType, dayOfWeekType, + getDisbursementDate(), getExpectedFirstRepaymentOnDate(), calculatedRepaymentsStartingFromDate, + getInArrearsTolerance(), this.loanRepaymentScheduleDetail, this.loanProduct.isMultiDisburseLoan(), this.fixedEmiAmount, + disbursementData, this.maxOutstandingLoanBalance, loanVariationTermsData, getInterestChargedFromDate()); final LoanScheduleModel loanSchedule = loanScheduleGenerator.generate(mc, applicationCurrency, loanApplicationTerms, charges(), isHolidayEnabled, holidays, workingDays); @@ -4255,6 +4276,9 @@ public class Loan extends AbstractPersistable { final Integer loanTermFrequency = this.termFrequency; final PeriodFrequencyType loanTermPeriodFrequencyType = PeriodFrequencyType.fromInt(this.termPeriodFrequencyType); + final NthDayType nthDayType = NthDayType.fromInt(this.repaymentFrequencyNthDayType); + final DayOfWeekType dayOfWeekType = DayOfWeekType.fromInt(this.repaymentFrequencyDayOfWeekType); + final List disbursementData = new ArrayList<>(); for (LoanDisbursementDetails disbursementDetails : this.disbursementDetails) { disbursementData.add(disbursementDetails.toData()); @@ -4277,9 +4301,9 @@ public class Loan extends AbstractPersistable { } final LoanApplicationTerms loanApplicationTerms = LoanApplicationTerms.assembleFrom(null, loanTermFrequency, - loanTermPeriodFrequencyType, getDisbursementDate(), getExpectedFirstRepaymentOnDate(), null, getInArrearsTolerance(), - this.loanRepaymentScheduleDetail, this.loanProduct.isMultiDisburseLoan(), this.fixedEmiAmount, disbursementData, - this.maxOutstandingLoanBalance, loanVariationTermsData, getInterestChargedFromDate()); + loanTermPeriodFrequencyType, nthDayType, dayOfWeekType, getDisbursementDate(), getExpectedFirstRepaymentOnDate(), + null, getInArrearsTolerance(), this.loanRepaymentScheduleDetail, this.loanProduct.isMultiDisburseLoan(), + this.fixedEmiAmount, disbursementData, this.maxOutstandingLoanBalance, loanVariationTermsData, getInterestChargedFromDate()); installment = loanScheduleGenerator.calculatePrepaymentAmount(this.repaymentScheduleInstallments, getCurrency(), LocalDate.now(), getInterestChargedFromDate(), loanApplicationTerms, mc); @@ -4432,10 +4456,14 @@ public class Loan extends AbstractPersistable { final Integer loanTermFrequency = getTermFrequency(); final PeriodFrequencyType loanTermPeriodFrequencyType = this.loanRepaymentScheduleDetail.getInterestPeriodFrequencyType(); + final NthDayType nthDayType = NthDayType.fromInt(this.repaymentFrequencyNthDayType); + final DayOfWeekType dayOfWeekType = DayOfWeekType.fromInt(this.repaymentFrequencyDayOfWeekType); + final Integer numberOfRepayments = this.loanRepaymentScheduleDetail.getNumberOfRepayments(); final Integer repaymentEvery = this.loanRepaymentScheduleDetail.getRepayEvery(); final PeriodFrequencyType repaymentPeriodFrequencyType = this.loanRepaymentScheduleDetail.getRepaymentPeriodFrequencyType(); + final AmortizationMethod amortizationMethod = this.loanRepaymentScheduleDetail.getAmortizationMethod(); @@ -4476,9 +4504,9 @@ public class Loan extends AbstractPersistable { loanVariationTermsData.add(data); return LoanApplicationTerms.assembleFrom(applicationCurrency, loanTermFrequency, loanTermPeriodFrequencyType, - expectedDisbursementDate, repaymentsStartingFromDate, calculatedRepaymentsStartingFromDate, inArrearsToleranceMoney, - this.loanRepaymentScheduleDetail, loanProduct.isMultiDisburseLoan(), emiAmount, disbursementData, maxOutstandingBalance, - loanVariationTermsData, interestChargedFromDate); + nthDayType, dayOfWeekType, expectedDisbursementDate, repaymentsStartingFromDate, + calculatedRepaymentsStartingFromDate, inArrearsToleranceMoney, this.loanRepaymentScheduleDetail, loanProduct.isMultiDisburseLoan(), emiAmount, + disbursementData, maxOutstandingBalance, loanVariationTermsData, interestChargedFromDate); } /** @@ -4513,4 +4541,23 @@ public class Loan extends AbstractPersistable { this.termFrequency = termFrequency; } } + + public Integer getRepaymentFrequencyNthDayType() { + return this.repaymentFrequencyNthDayType; + } + + public void setRepaymentFrequencyNthDayType( + Integer repaymentFrequencyNthDayType) { + this.repaymentFrequencyNthDayType = repaymentFrequencyNthDayType; + } + + public Integer getRepaymentFrequencyDayOfWeekType() { + return this.repaymentFrequencyDayOfWeekType; + } + + public void setRepaymentFrequencyDayOfWeekType( + Integer repaymentFrequencyDayOfWeekType) { + this.repaymentFrequencyDayOfWeekType = repaymentFrequencyDayOfWeekType; + } + } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/DefaultScheduledDateGenerator.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/DefaultScheduledDateGenerator.java index 8f047f829..581ef18b1 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/DefaultScheduledDateGenerator.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/DefaultScheduledDateGenerator.java @@ -7,6 +7,7 @@ package org.mifosplatform.portfolio.loanaccount.loanschedule.domain; import java.util.List; +import org.joda.time.DateTimeConstants; import org.joda.time.Days; import org.joda.time.LocalDate; import org.joda.time.Months; @@ -16,7 +17,9 @@ import org.mifosplatform.organisation.holiday.domain.Holiday; import org.mifosplatform.organisation.holiday.service.HolidayUtil; import org.mifosplatform.organisation.workingdays.domain.WorkingDays; import org.mifosplatform.organisation.workingdays.service.WorkingDaysUtil; +import org.mifosplatform.portfolio.common.domain.NthDayType; import org.mifosplatform.portfolio.common.domain.PeriodFrequencyType; +import org.mifosplatform.portfolio.common.domain.DayOfWeekType; public class DefaultScheduledDateGenerator implements ScheduledDateGenerator { @@ -45,7 +48,7 @@ public class DefaultScheduledDateGenerator implements ScheduledDateGenerator { dueRepaymentPeriodDate = firstRepaymentPeriodDate; } else { dueRepaymentPeriodDate = getRepaymentPeriodDate(loanApplicationTerms.getRepaymentPeriodFrequencyType(), - loanApplicationTerms.getRepaymentEvery(), lastRepaymentDate); + loanApplicationTerms.getRepaymentEvery(), lastRepaymentDate, loanApplicationTerms.getNthDay(), loanApplicationTerms.getWeekDayType()); } return dueRepaymentPeriodDate; } @@ -62,7 +65,7 @@ public class DefaultScheduledDateGenerator implements ScheduledDateGenerator { while (WorkingDaysUtil.isNonWorkingDay(workingDays, adjustedDate)) { final LocalDate nextDueRepaymentPeriodDate = getRepaymentPeriodDate(loanApplicationTerms.getRepaymentPeriodFrequencyType(), - loanApplicationTerms.getRepaymentEvery(), adjustedDate); + loanApplicationTerms.getRepaymentEvery(), adjustedDate, loanApplicationTerms.getNthDay(), loanApplicationTerms.getWeekDayType()); adjustedDate = WorkingDaysUtil.getOffSetDateIfNonWorkingDay(adjustedDate, nextDueRepaymentPeriodDate, workingDays); } @@ -73,7 +76,7 @@ public class DefaultScheduledDateGenerator implements ScheduledDateGenerator { } @Override - public LocalDate getRepaymentPeriodDate(final PeriodFrequencyType frequency, final int repaidEvery, final LocalDate startDate) { + public LocalDate getRepaymentPeriodDate(final PeriodFrequencyType frequency, final int repaidEvery, final LocalDate startDate, Integer nthDay, DayOfWeekType dayOfWeek) { LocalDate dueRepaymentPeriodDate = startDate; switch (frequency) { case DAYS: @@ -83,7 +86,11 @@ public class DefaultScheduledDateGenerator implements ScheduledDateGenerator { dueRepaymentPeriodDate = startDate.plusWeeks(repaidEvery); break; case MONTHS: - dueRepaymentPeriodDate = startDate.plusMonths(repaidEvery); + dueRepaymentPeriodDate = startDate.plusMonths(repaidEvery); + if(!(nthDay == null || nthDay == 0 || dayOfWeek == null || dayOfWeek == DayOfWeekType.INVALID)) { + dueRepaymentPeriodDate = adjustToNthWeekDay(dueRepaymentPeriodDate, + nthDay, dayOfWeek.getValue()); + } break; case YEARS: dueRepaymentPeriodDate = startDate.plusYears(repaidEvery); @@ -94,6 +101,21 @@ public class DefaultScheduledDateGenerator implements ScheduledDateGenerator { return dueRepaymentPeriodDate; } + private LocalDate adjustToNthWeekDay(LocalDate dueRepaymentPeriodDate, + int nthDay, int dayOfWeek) { + // adjust date to start of month + dueRepaymentPeriodDate = dueRepaymentPeriodDate.withDayOfMonth(1); + // adjust date to next week if current day is past specified day of week. + if(dueRepaymentPeriodDate.getDayOfWeek() > dayOfWeek) { + dueRepaymentPeriodDate = dueRepaymentPeriodDate.plusWeeks(1); + } + // adjust date to specified date of week + dueRepaymentPeriodDate = dueRepaymentPeriodDate.withDayOfWeek(dayOfWeek); + // adjust to specified nth week day + dueRepaymentPeriodDate = dueRepaymentPeriodDate.plusWeeks(nthDay -1); + return dueRepaymentPeriodDate; + } + @Override public Boolean isDateFallsInSchedule(final PeriodFrequencyType frequency, final int repaidEvery, final LocalDate startDate, final LocalDate date) { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/LoanApplicationTerms.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/LoanApplicationTerms.java index 17587859b..65ff21e3c 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/LoanApplicationTerms.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/LoanApplicationTerms.java @@ -21,7 +21,9 @@ import org.mifosplatform.organisation.monetary.domain.Money; import org.mifosplatform.portfolio.calendar.domain.CalendarInstance; import org.mifosplatform.portfolio.common.domain.DaysInMonthType; import org.mifosplatform.portfolio.common.domain.DaysInYearType; +import org.mifosplatform.portfolio.common.domain.NthDayType; import org.mifosplatform.portfolio.common.domain.PeriodFrequencyType; +import org.mifosplatform.portfolio.common.domain.DayOfWeekType; import org.mifosplatform.portfolio.loanaccount.data.DisbursementData; import org.mifosplatform.portfolio.loanaccount.data.LoanTermVariationsData; import org.mifosplatform.portfolio.loanaccount.domain.LoanInterestRecalculationDetails; @@ -41,6 +43,9 @@ public final class LoanApplicationTerms { private Integer numberOfRepayments; private final Integer repaymentEvery; private final PeriodFrequencyType repaymentPeriodFrequencyType; + private final Integer nthDay; + + private final DayOfWeekType weekDayType; private final AmortizationMethod amortizationMethod; private final InterestMethod interestMethod; @@ -129,24 +134,24 @@ public final class LoanApplicationTerms { public static LoanApplicationTerms assembleFrom(final ApplicationCurrency currency, final Integer loanTermFrequency, final PeriodFrequencyType loanTermPeriodFrequencyType, final Integer numberOfRepayments, final Integer repaymentEvery, - final PeriodFrequencyType repaymentPeriodFrequencyType, final AmortizationMethod amortizationMethod, + final PeriodFrequencyType repaymentPeriodFrequencyType, Integer nthDay, + DayOfWeekType weekDayType, final AmortizationMethod amortizationMethod, final InterestMethod interestMethod, final BigDecimal interestRatePerPeriod, final PeriodFrequencyType interestRatePeriodFrequencyType, final BigDecimal annualNominalInterestRate, final InterestCalculationPeriodMethod interestCalculationPeriodMethod, final Money principalMoney, final LocalDate expectedDisbursementDate, final LocalDate repaymentsStartingFromDate, - final LocalDate calculatedRepaymentsStartingFromDate, final Integer graceOnPrincipalPayment, - final Integer graceOnInterestPayment, final Integer graceOnInterestCharged, final LocalDate interestChargedFromDate, - final Money inArrearsTolerance, final boolean multiDisburseLoan, final BigDecimal emiAmount, + final LocalDate calculatedRepaymentsStartingFromDate, final Integer graceOnPrincipalPayment, final Integer graceOnInterestPayment, + final Integer graceOnInterestCharged, final LocalDate interestChargedFromDate, final Money inArrearsTolerance, + final boolean multiDisburseLoan, final BigDecimal emiAmount, final List disbursementDatas, final BigDecimal maxOutstandingBalance, - final List emiAmountVariations, final Integer graceOnArrearsAgeing, - final DaysInMonthType daysInMonthType, final DaysInYearType daysInYearType, final boolean isInterestRecalculationEnabled) { + final List emiAmountVariations, final Integer graceOnArrearsAgeing, final DaysInMonthType daysInMonthType, final DaysInYearType daysInYearType, final boolean isInterestRecalculationEnabled) { final LoanRescheduleStrategyMethod rescheduleStrategyMethod = null; final InterestRecalculationCompoundingMethod interestRecalculationCompoundingMethod = null; final CalendarInstance restCalendarInstance = null; final RecalculationFrequencyType recalculationFrequencyType = null; return new LoanApplicationTerms(currency, loanTermFrequency, loanTermPeriodFrequencyType, numberOfRepayments, repaymentEvery, - repaymentPeriodFrequencyType, amortizationMethod, interestMethod, interestRatePerPeriod, interestRatePeriodFrequencyType, + repaymentPeriodFrequencyType,nthDay, weekDayType, amortizationMethod, interestMethod, interestRatePerPeriod, interestRatePeriodFrequencyType, annualNominalInterestRate, interestCalculationPeriodMethod, principalMoney, expectedDisbursementDate, repaymentsStartingFromDate, calculatedRepaymentsStartingFromDate, graceOnPrincipalPayment, graceOnInterestPayment, graceOnInterestCharged, interestChargedFromDate, inArrearsTolerance, multiDisburseLoan, emiAmount, disbursementDatas, @@ -156,11 +161,11 @@ public final class LoanApplicationTerms { } public static LoanApplicationTerms assembleFrom(final ApplicationCurrency applicationCurrency, final Integer loanTermFrequency, - final PeriodFrequencyType loanTermPeriodFrequencyType, final LocalDate expectedDisbursementDate, - final LocalDate repaymentsStartingFromDate, final LocalDate calculatedRepaymentsStartingFromDate, - final Money inArrearsTolerance, final LoanProductRelatedDetail loanProductRelatedDetail, final boolean multiDisburseLoan, - final BigDecimal emiAmount, final List disbursementDatas, final BigDecimal maxOutstandingBalance, - final List emiAmountVariations, final LocalDate interestChargedFromDate) { + final PeriodFrequencyType loanTermPeriodFrequencyType, NthDayType nthDay, + DayOfWeekType dayOfWeek, final LocalDate expectedDisbursementDate, + final LocalDate repaymentsStartingFromDate, final LocalDate calculatedRepaymentsStartingFromDate, final Money inArrearsTolerance, + final LoanProductRelatedDetail loanProductRelatedDetail, final boolean multiDisburseLoan, final BigDecimal emiAmount, + final List disbursementDatas, final BigDecimal maxOutstandingBalance, final List emiAmountVariations, final LocalDate interestChargedFromDate) { final Integer numberOfRepayments = loanProductRelatedDetail.getNumberOfRepayments(); final Integer repaymentEvery = loanProductRelatedDetail.getRepayEvery(); @@ -189,7 +194,7 @@ public final class LoanApplicationTerms { final RecalculationFrequencyType recalculationFrequencyType = null; return new LoanApplicationTerms(applicationCurrency, loanTermFrequency, loanTermPeriodFrequencyType, numberOfRepayments, - repaymentEvery, repaymentPeriodFrequencyType, amortizationMethod, interestMethod, interestRatePerPeriod, + repaymentEvery, repaymentPeriodFrequencyType, nthDay.getValue(), dayOfWeek, amortizationMethod, interestMethod, interestRatePerPeriod, interestRatePeriodFrequencyType, annualNominalInterestRate, interestCalculationPeriodMethod, principalMoney, expectedDisbursementDate, repaymentsStartingFromDate, calculatedRepaymentsStartingFromDate, graceOnPrincipalPayment, graceOnInterestPayment, graceOnInterestCharged, interestChargedFromDate, inArrearsTolerance, multiDisburseLoan, emiAmount, @@ -236,7 +241,7 @@ public final class LoanApplicationTerms { } return new LoanApplicationTerms(applicationCurrency, loanTermFrequency, loanTermPeriodFrequencyType, numberOfRepayments, - repaymentEvery, repaymentPeriodFrequencyType, amortizationMethod, interestMethod, interestRatePerPeriod, + repaymentEvery, repaymentPeriodFrequencyType, null, null, amortizationMethod, interestMethod, interestRatePerPeriod, interestRatePeriodFrequencyType, annualNominalInterestRate, interestCalculationPeriodMethod, principalMoney, expectedDisbursementDate, repaymentsStartingFromDate, calculatedRepaymentsStartingFromDate, graceOnPrincipalPayment, graceOnInterestPayment, graceOnInterestCharged, interestChargedFromDate, inArrearsTolerance, multiDisburseLoan, emiAmount, @@ -249,7 +254,7 @@ public final class LoanApplicationTerms { final LoanApplicationTerms applicationTerms) { return new LoanApplicationTerms(applicationTerms.currency, applicationTerms.loanTermFrequency, applicationTerms.loanTermPeriodFrequencyType, applicationTerms.numberOfRepayments, repaymentEvery, - repaymentPeriodFrequencyType, applicationTerms.amortizationMethod, applicationTerms.interestMethod, + repaymentPeriodFrequencyType, null, null, applicationTerms.amortizationMethod, applicationTerms.interestMethod, applicationTerms.interestRatePerPeriod, applicationTerms.interestRatePeriodFrequencyType, applicationTerms.annualNominalInterestRate, applicationTerms.interestCalculationPeriodMethod, applicationTerms.principal, applicationTerms.expectedDisbursementDate, applicationTerms.repaymentsStartingFromDate, @@ -265,7 +270,8 @@ public final class LoanApplicationTerms { private LoanApplicationTerms(final ApplicationCurrency currency, final Integer loanTermFrequency, final PeriodFrequencyType loanTermPeriodFrequencyType, final Integer numberOfRepayments, final Integer repaymentEvery, - final PeriodFrequencyType repaymentPeriodFrequencyType, final AmortizationMethod amortizationMethod, + final PeriodFrequencyType repaymentPeriodFrequencyType, final Integer nthDay, + final DayOfWeekType weekDayType, final AmortizationMethod amortizationMethod, final InterestMethod interestMethod, final BigDecimal interestRatePerPeriod, final PeriodFrequencyType interestRatePeriodFrequencyType, final BigDecimal annualNominalInterestRate, final InterestCalculationPeriodMethod interestCalculationPeriodMethod, final Money principal, @@ -284,6 +290,8 @@ public final class LoanApplicationTerms { this.numberOfRepayments = numberOfRepayments; this.repaymentEvery = repaymentEvery; this.repaymentPeriodFrequencyType = repaymentPeriodFrequencyType; + this.nthDay = nthDay; + this.weekDayType = weekDayType; this.amortizationMethod = amortizationMethod; this.interestMethod = interestMethod; @@ -982,6 +990,15 @@ public final class LoanApplicationTerms { public BigDecimal getFixedEmiAmount() { return this.fixedEmiAmount; } + + public Integer getNthDay() { + return this.nthDay; + } + + public DayOfWeekType getWeekDayType() { + return this.weekDayType; + } + public void setFixedEmiAmountForPeriod(LocalDate periodDate) { LocalDate startDate = expectedDisbursementDate; diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/ScheduledDateGenerator.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/ScheduledDateGenerator.java index 16bb22093..281496d79 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/ScheduledDateGenerator.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/ScheduledDateGenerator.java @@ -11,6 +11,7 @@ import org.joda.time.LocalDate; import org.mifosplatform.organisation.holiday.domain.Holiday; import org.mifosplatform.organisation.workingdays.domain.WorkingDays; import org.mifosplatform.portfolio.common.domain.PeriodFrequencyType; +import org.mifosplatform.portfolio.common.domain.DayOfWeekType; public interface ScheduledDateGenerator { @@ -25,7 +26,7 @@ public interface ScheduledDateGenerator { LocalDate adjustRepaymentDate(LocalDate dueRepaymentPeriodDate, LoanApplicationTerms loanApplicationTerms, boolean isHolidayEnabled, List holidays, WorkingDays workingDays); - LocalDate getRepaymentPeriodDate(PeriodFrequencyType frequency, int repaidEvery, LocalDate startDate); + LocalDate getRepaymentPeriodDate(PeriodFrequencyType frequency, int repaidEvery, LocalDate startDate, Integer nthDay, DayOfWeekType dayOfWeek); Boolean isDateFallsInSchedule(PeriodFrequencyType frequency, int repaidEvery, LocalDate startDate, LocalDate date); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/service/LoanScheduleAssembler.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/service/LoanScheduleAssembler.java index c58068442..8535de942 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/service/LoanScheduleAssembler.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/service/LoanScheduleAssembler.java @@ -39,6 +39,7 @@ import org.mifosplatform.portfolio.client.domain.ClientRepositoryWrapper; import org.mifosplatform.portfolio.common.domain.DaysInMonthType; import org.mifosplatform.portfolio.common.domain.DaysInYearType; import org.mifosplatform.portfolio.common.domain.PeriodFrequencyType; +import org.mifosplatform.portfolio.common.domain.DayOfWeekType; import org.mifosplatform.portfolio.group.domain.Group; import org.mifosplatform.portfolio.group.domain.GroupRepositoryWrapper; import org.mifosplatform.portfolio.loanaccount.api.LoanApiConstants; @@ -135,6 +136,9 @@ public class LoanScheduleAssembler { final Integer repaymentEvery = this.fromApiJsonHelper.extractIntegerWithLocaleNamed("repaymentEvery", element); final Integer repaymentFrequencyType = this.fromApiJsonHelper.extractIntegerWithLocaleNamed("repaymentFrequencyType", element); final PeriodFrequencyType repaymentPeriodFrequencyType = PeriodFrequencyType.fromInt(repaymentFrequencyType); + final Integer nthDay = this.fromApiJsonHelper.extractIntegerWithLocaleNamed("repaymentFrequencyNthDayType", element); + final Integer dayOfWeek = this.fromApiJsonHelper.extractIntegerWithLocaleNamed("repaymentFrequencyDayOfWeekType", element); + final DayOfWeekType weekDayType = DayOfWeekType.fromInt(dayOfWeek); final Integer amortizationType = this.fromApiJsonHelper.extractIntegerWithLocaleNamed("amortizationType", element); final AmortizationMethod amortizationMethod = AmortizationMethod.fromInt(amortizationType); @@ -233,12 +237,12 @@ public class LoanScheduleAssembler { final boolean isInterestRecalculationEnabled = loanProduct.isInterestRecalculationEnabled(); return LoanApplicationTerms.assembleFrom(applicationCurrency, loanTermFrequency, loanTermPeriodFrequencyType, numberOfRepayments, - repaymentEvery, repaymentPeriodFrequencyType, amortizationMethod, interestMethod, interestRatePerPeriod, - interestRatePeriodFrequencyType, annualNominalInterestRate, interestCalculationPeriodMethod, principalMoney, - expectedDisbursementDate, repaymentsStartingFromDate, calculatedRepaymentsStartingFromDate, graceOnPrincipalPayment, - graceOnInterestPayment, graceOnInterestCharged, interestChargedFromDate, inArrearsToleranceMoney, - loanProduct.isMultiDisburseLoan(), emiAmount, disbursementDatas, maxOutstandingBalance, loanVariationTermsData, - graceOnArrearsAgeing, daysInMonthType, daysInYearType, isInterestRecalculationEnabled); + repaymentEvery, repaymentPeriodFrequencyType, nthDay, weekDayType, amortizationMethod, + interestMethod, interestRatePerPeriod, interestRatePeriodFrequencyType, annualNominalInterestRate, + interestCalculationPeriodMethod, principalMoney, expectedDisbursementDate, repaymentsStartingFromDate, + calculatedRepaymentsStartingFromDate, graceOnPrincipalPayment, graceOnInterestPayment, graceOnInterestCharged, + interestChargedFromDate, inArrearsToleranceMoney, loanProduct.isMultiDisburseLoan(), emiAmount, disbursementDatas, + maxOutstandingBalance, loanVariationTermsData, graceOnArrearsAgeing, daysInMonthType, daysInYearType, isInterestRecalculationEnabled); } private List fetchDisbursementData(final JsonObject command) { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/serialization/LoanApplicationCommandFromApiJsonHelper.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/serialization/LoanApplicationCommandFromApiJsonHelper.java index ee2d9c7af..285ddb83a 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/serialization/LoanApplicationCommandFromApiJsonHelper.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/serialization/LoanApplicationCommandFromApiJsonHelper.java @@ -45,7 +45,7 @@ public final class LoanApplicationCommandFromApiJsonHelper { */ final Set supportedParameters = new HashSet<>(Arrays.asList("dateFormat", "locale", "id", "clientId", "groupId", "loanType", "productId", "principal", "loanTermFrequency", "loanTermFrequencyType", "numberOfRepayments", "repaymentEvery", - "repaymentFrequencyType", "interestRatePerPeriod", "amortizationType", "interestType", "interestCalculationPeriodType", + "repaymentFrequencyType","repaymentFrequencyNthDayType", "repaymentFrequencyDayOfWeekType", "interestRatePerPeriod", "amortizationType", "interestType", "interestCalculationPeriodType", "expectedDisbursementDate", "repaymentsStartingFromDate", "graceOnPrincipalPayment", "graceOnInterestPayment", "graceOnInterestCharged", 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 ce3223ad3..4f9f18bfc 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 @@ -494,7 +494,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { + " l.principal_amount as principal,l.approved_principal as approvedPrincipal, l.arrearstolerance_amount as inArrearsTolerance, l.number_of_repayments as numberOfRepayments, l.repay_every as repaymentEvery," + " l.grace_on_principal_periods as graceOnPrincipalPayment, l.grace_on_interest_periods as graceOnInterestPayment, l.grace_interest_free_periods as graceOnInterestCharged,l.grace_on_arrears_ageing as graceOnArrearsAgeing," + " l.nominal_interest_rate_per_period as interestRatePerPeriod, l.annual_nominal_interest_rate as annualInterestRate, " - + " l.repayment_period_frequency_enum as repaymentFrequencyType, l.interest_period_frequency_enum as interestRateFrequencyType, " + + " l.repayment_period_frequency_enum as repaymentFrequencyType, l.repayment_frequency_nth_day_enum as repaymentFrequencyNthDayType, l.repayment_frequency_day_of_week_enum as repaymentFrequencyDayOfWeekType, l.interest_period_frequency_enum as interestRateFrequencyType, " + " l.term_frequency as termFrequency, l.term_period_frequency_enum as termPeriodFrequencyType, " + " l.amortization_method_enum as amortizationType, l.interest_method_enum as interestType, l.interest_calculated_in_period_enum as interestCalculationPeriodType," + " l.loan_status_id as lifeCycleStatusId, l.loan_transaction_strategy_id as transactionStrategyId, " @@ -672,6 +672,12 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { final int repaymentFrequencyTypeInt = JdbcSupport.getInteger(rs, "repaymentFrequencyType"); final EnumOptionData repaymentFrequencyType = LoanEnumerations.repaymentFrequencyType(repaymentFrequencyTypeInt); + + final int repaymentFrequencyNthDayTypeInt = JdbcSupport.getInteger(rs, "repaymentFrequencyNthDayType"); + final EnumOptionData repaymentFrequencyNthDayType = LoanEnumerations.repaymentFrequencyNthDayType(repaymentFrequencyNthDayTypeInt); + + final int repaymentFrequencyDayOfWeekTypeInt = JdbcSupport.getInteger(rs, "repaymentFrequencyDayOfWeekType"); + final EnumOptionData repaymentFrequencyDayOfWeekType = LoanEnumerations.repaymentFrequencyDayOfWeekType(repaymentFrequencyDayOfWeekTypeInt); final int interestRateFrequencyTypeInt = JdbcSupport.getInteger(rs, "interestRateFrequencyType"); final EnumOptionData interestRateFrequencyType = LoanEnumerations.interestRateFrequencyType(interestRateFrequencyTypeInt); @@ -798,12 +804,12 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { loanType, loanProductId, loanProductName, loanProductDescription, fundId, fundName, loanPurposeId, loanPurposeName, loanOfficerId, loanOfficerName, currencyData, principal, approvedPrincipal, totalOverpaid, inArrearsTolerance, termFrequency, termPeriodFrequencyType, numberOfRepayments, repaymentEvery, repaymentFrequencyType, - transactionStrategyId, transactionStrategyName, amortizationType, interestRatePerPeriod, interestRateFrequencyType, - annualInterestRate, interestType, interestCalculationPeriodType, expectedFirstRepaymentOnDate, graceOnPrincipalPayment, - graceOnInterestPayment, graceOnInterestCharged, interestChargedFromDate, timeline, loanSummary, - feeChargesDueAtDisbursementCharged, syncDisbursementWithMeeting, loanCounter, loanProductCounter, multiDisburseLoan, - fixedEmiAmount, outstandingLoanBalance, inArrears, graceOnArrearsAgeing, isNPA, daysInMonthType, daysInYearType, - isInterestRecalculationEnabled, interestRecalculationData); + repaymentFrequencyNthDayType, repaymentFrequencyDayOfWeekType, transactionStrategyId, transactionStrategyName, amortizationType, + interestRatePerPeriod, interestRateFrequencyType, annualInterestRate, interestType, interestCalculationPeriodType, + expectedFirstRepaymentOnDate, graceOnPrincipalPayment, graceOnInterestPayment, graceOnInterestCharged, interestChargedFromDate, + timeline, loanSummary, feeChargesDueAtDisbursementCharged, syncDisbursementWithMeeting, loanCounter, + loanProductCounter, multiDisburseLoan, fixedEmiAmount, outstandingLoanBalance, inArrears, graceOnArrearsAgeing, isNPA, + daysInMonthType, daysInYearType, isInterestRecalculationEnabled, interestRecalculationData); } } @@ -1219,6 +1225,10 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { .retrieveLoanTermFrequencyTypeOptions(); final Collection repaymentFrequencyTypeOptions = this.loanDropdownReadPlatformService .retrieveRepaymentFrequencyTypeOptions(); + final Collection repaymentFrequencyNthDayTypeOptions = this.loanDropdownReadPlatformService + .retrieveRepaymentFrequencyOptionsForNthDayOfMonth(); + final Collection repaymentFrequencyDaysOfWeekTypeOptions = this.loanDropdownReadPlatformService + .retrieveRepaymentFrequencyOptionsForDaysOfWeek(); final Collection interestRateFrequencyTypeOptions = this.loanDropdownReadPlatformService .retrieveInterestRateFrequencyTypeOptions(); final Collection amortizationTypeOptions = this.loanDropdownReadPlatformService @@ -1245,6 +1255,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { } return LoanAccountData.loanProductWithTemplateDefaults(loanProduct, loanTermFrequencyTypeOptions, repaymentFrequencyTypeOptions, + repaymentFrequencyNthDayTypeOptions, repaymentFrequencyDaysOfWeekTypeOptions, repaymentStrategyOptions, interestRateFrequencyTypeOptions, amortizationTypeOptions, interestTypeOptions, interestCalculationPeriodTypeOptions, fundOptions, chargeOptions, loanPurposeOptions, loanCollateralOptions, loanCycleCounter); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java index e28e38414..69789f9de 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java @@ -2042,7 +2042,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf while (new LocalDate().isAfter(startDate)) { scheduleDates.put(frequencyNunber++, startDate.minusDays(diff.intValue())); LocalDate scheduleDate = scheduledDateGenerator.getRepaymentPeriodDate(PeriodFrequencyType.fromInt(feeFrequency), - chargeDefinition.feeInterval(), startDate); + chargeDefinition.feeInterval(), startDate, null, null); startDate = scheduleDate; } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProductRelatedDetail.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProductRelatedDetail.java index 10736bf98..96991ad35 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProductRelatedDetail.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProductRelatedDetail.java @@ -23,8 +23,10 @@ import org.mifosplatform.infrastructure.core.data.DataValidatorBuilder; import org.mifosplatform.infrastructure.core.exception.PlatformApiDataValidationException; import org.mifosplatform.organisation.monetary.domain.MonetaryCurrency; import org.mifosplatform.organisation.monetary.domain.Money; +import org.mifosplatform.portfolio.common.domain.DayOfWeekType; import org.mifosplatform.portfolio.common.domain.DaysInMonthType; import org.mifosplatform.portfolio.common.domain.DaysInYearType; +import org.mifosplatform.portfolio.common.domain.NthDayType; import org.mifosplatform.portfolio.common.domain.PeriodFrequencyType; import org.mifosplatform.portfolio.loanaccount.domain.Loan; import org.mifosplatform.portfolio.loanaccount.loanschedule.domain.AprCalculator; @@ -75,7 +77,7 @@ public class LoanProductRelatedDetail implements LoanProductMinimumRepaymentSche @Enumerated(EnumType.ORDINAL) @Column(name = "repayment_period_frequency_enum", nullable = false) private PeriodFrequencyType repaymentPeriodFrequencyType; - + @Column(name = "number_of_repayments", nullable = false) private Integer numberOfRepayments; @@ -237,8 +239,8 @@ public class LoanProductRelatedDetail implements LoanProductMinimumRepaymentSche public PeriodFrequencyType getRepaymentPeriodFrequencyType() { return this.repaymentPeriodFrequencyType; } - - @Override + + @Override public Integer getNumberOfRepayments() { return this.numberOfRepayments; } @@ -313,10 +315,22 @@ public class LoanProductRelatedDetail implements LoanProductMinimumRepaymentSche final String repaymentFrequencyTypeParamName = "repaymentFrequencyType"; if (command.isChangeInIntegerParameterNamed(repaymentFrequencyTypeParamName, this.repaymentPeriodFrequencyType.getValue())) { - final Integer newValue = command.integerValueOfParameterNamed(repaymentFrequencyTypeParamName); + Integer newValue = command.integerValueOfParameterNamed(repaymentFrequencyTypeParamName); actualChanges.put(repaymentFrequencyTypeParamName, newValue); actualChanges.put("locale", localeAsInput); this.repaymentPeriodFrequencyType = PeriodFrequencyType.fromInt(newValue); + + if(this.repaymentPeriodFrequencyType == PeriodFrequencyType.MONTHS) { + final String repaymentFrequencyNthDayTypeParamName = "repaymentFrequencyNthDayType"; + newValue = command.integerValueOfParameterNamed(repaymentFrequencyNthDayTypeParamName); + actualChanges.put(repaymentFrequencyNthDayTypeParamName, newValue); + + final String repaymentFrequencyDayOfWeekTypeParamName = "repaymentFrequencyDayOfWeekType"; + newValue = command.integerValueOfParameterNamed(repaymentFrequencyDayOfWeekTypeParamName); + actualChanges.put(repaymentFrequencyDayOfWeekTypeParamName, newValue); + + actualChanges.put("locale", localeAsInput); + } } final String numberOfRepaymentsParamName = "numberOfRepayments"; diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanDropdownReadPlatformService.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanDropdownReadPlatformService.java index 2de842271..632a62554 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanDropdownReadPlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanDropdownReadPlatformService.java @@ -22,6 +22,10 @@ public interface LoanDropdownReadPlatformService { List retrieveLoanTermFrequencyTypeOptions(); List retrieveRepaymentFrequencyTypeOptions(); + + List retrieveRepaymentFrequencyOptionsForNthDayOfMonth(); + + List retrieveRepaymentFrequencyOptionsForDaysOfWeek(); List retrieveInterestRateFrequencyTypeOptions(); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanDropdownReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanDropdownReadPlatformServiceImpl.java index 037c4432f..65f7c3278 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanDropdownReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanDropdownReadPlatformServiceImpl.java @@ -9,12 +9,14 @@ import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.a import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.interestCalculationPeriodType; import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.interestRateFrequencyType; import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.interestRecalculationCompoundingType; +import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.interestRecalculationFrequencyType; import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.interestType; import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.loanCycleValueConditionType; import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.loanTermFrequencyType; +import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.repaymentFrequencyDayOfWeekType; +import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.repaymentFrequencyNthDayType; import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.repaymentFrequencyType; import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.rescheduleStrategyType; -import static org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations.interestRecalculationFrequencyType; import java.util.ArrayList; import java.util.Arrays; @@ -22,7 +24,9 @@ import java.util.Collection; import java.util.List; import org.mifosplatform.infrastructure.core.data.EnumOptionData; +import org.mifosplatform.portfolio.common.domain.NthDayType; import org.mifosplatform.portfolio.common.domain.PeriodFrequencyType; +import org.mifosplatform.portfolio.common.domain.DayOfWeekType; import org.mifosplatform.portfolio.loanaccount.domain.LoanTransactionProcessingStrategyRepository; import org.mifosplatform.portfolio.loanproduct.data.TransactionProcessingStrategyData; import org.mifosplatform.portfolio.loanproduct.domain.AmortizationMethod; @@ -88,6 +92,23 @@ public class LoanDropdownReadPlatformServiceImpl implements LoanDropdownReadPlat return repaymentFrequencyOptions; } + @Override + public List retrieveRepaymentFrequencyOptionsForNthDayOfMonth() { + final List repaymentFrequencyOptions = Arrays.asList(repaymentFrequencyNthDayType(NthDayType.ONE), + repaymentFrequencyNthDayType(NthDayType.TWO), repaymentFrequencyNthDayType(NthDayType.THREE), + repaymentFrequencyNthDayType(NthDayType.FOUR)); + return repaymentFrequencyOptions; + } + + @Override + public List retrieveRepaymentFrequencyOptionsForDaysOfWeek() { + + final List repaymentFrequencyOptions = Arrays.asList(repaymentFrequencyDayOfWeekType(DayOfWeekType.SUNDAY), + repaymentFrequencyDayOfWeekType(DayOfWeekType.MONDAY),repaymentFrequencyDayOfWeekType(DayOfWeekType.TUESDAY),repaymentFrequencyDayOfWeekType(DayOfWeekType.WEDNESDAY), + repaymentFrequencyDayOfWeekType(DayOfWeekType.THURSDAY),repaymentFrequencyDayOfWeekType(DayOfWeekType.FRIDAY), repaymentFrequencyDayOfWeekType(DayOfWeekType.SATURDAY)); + return repaymentFrequencyOptions; + } + @Override public List retrieveInterestRateFrequencyTypeOptions() { // support for monthly and annual percentage rate (MPR) and (APR) @@ -149,5 +170,4 @@ public class LoanDropdownReadPlatformServiceImpl implements LoanDropdownReadPlat interestRecalculationFrequencyType(RecalculationFrequencyType.MONTHLY)); return interestRecalculationFrequencyTypeOptions; } - } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanEnumerations.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanEnumerations.java index 6e3d2fd05..4fc398310 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanEnumerations.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanEnumerations.java @@ -8,7 +8,9 @@ package org.mifosplatform.portfolio.loanproduct.service; import org.mifosplatform.accounting.common.AccountingEnumerations; import org.mifosplatform.infrastructure.core.data.EnumOptionData; import org.mifosplatform.portfolio.accountdetails.service.AccountEnumerations; +import org.mifosplatform.portfolio.common.domain.NthDayType; import org.mifosplatform.portfolio.common.domain.PeriodFrequencyType; +import org.mifosplatform.portfolio.common.domain.DayOfWeekType; import org.mifosplatform.portfolio.loanaccount.data.LoanStatusEnumData; import org.mifosplatform.portfolio.loanaccount.data.LoanTransactionEnumData; import org.mifosplatform.portfolio.loanaccount.domain.LoanStatus; @@ -128,6 +130,56 @@ public class LoanEnumerations { public static EnumOptionData repaymentFrequencyType(final int id) { return repaymentFrequencyType(PeriodFrequencyType.fromInt(id)); } + + public static EnumOptionData repaymentFrequencyNthDayType(final int id) { + return repaymentFrequencyNthDayType(NthDayType.fromInt(id)); + } + + public static EnumOptionData repaymentFrequencyNthDayType(final NthDayType type) { + final String codePrefix = "repaymentFrequency."; + long nthDayValue = type.getValue().longValue(); + EnumOptionData optionData = null; + switch (type) { + case ONE: + optionData = new EnumOptionData(nthDayValue, codePrefix + + type.getCode(), "first"); + break; + case TWO: + optionData = new EnumOptionData(nthDayValue, codePrefix + + type.getCode(), "second"); + break; + case THREE: + optionData = new EnumOptionData(nthDayValue, codePrefix + + type.getCode(), "third"); + break; + case FOUR: + optionData = new EnumOptionData(nthDayValue, codePrefix + + type.getCode(), "fourth"); + break; + case FIVE: + optionData = new EnumOptionData(nthDayValue, codePrefix + + type.getCode(), "fifth"); + break; + default: + optionData = new EnumOptionData(new Integer(0).longValue(), codePrefix + + type.getCode(), "invalid"); + break; + } + + return optionData; + } + + public static EnumOptionData repaymentFrequencyDayOfWeekType(final int id) { + return repaymentFrequencyDayOfWeekType(DayOfWeekType.fromInt(id)); + } + + public static EnumOptionData repaymentFrequencyDayOfWeekType(final DayOfWeekType type) { + final String codePrefix = "repaymentFrequency."; + EnumOptionData optionData = new EnumOptionData(type.getValue().longValue(), codePrefix + + type.getCode(), type.toString()); + + return optionData; + } public static EnumOptionData repaymentFrequencyType(final PeriodFrequencyType type) { final String codePrefix = "repaymentFrequency.";