From 6a78b6eae1b1afc5ede0419ca9da2ff0a5e7f101 Mon Sep 17 00:00:00 2001 From: sachinkulkarni12 Date: Mon, 21 Dec 2015 16:41:55 +0530 Subject: [PATCH] CC-61:validate holiday only once while doing repayment through collection sheet --- ...ountTransfersWritePlatformServiceImpl.java | 9 +++-- .../portfolio/loanaccount/domain/Loan.java | 24 +++++++------- .../domain/LoanAccountDomainService.java | 3 +- .../domain/LoanAccountDomainServiceJpa.java | 33 +++++++++++++------ ...WritePlatformServiceJpaRepositoryImpl.java | 30 +++++++++++++++-- 5 files changed, 72 insertions(+), 27 deletions(-) diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/account/service/AccountTransfersWritePlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/account/service/AccountTransfersWritePlatformServiceImpl.java index 2e6dec65e..eccd2ec7d 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/account/service/AccountTransfersWritePlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/account/service/AccountTransfersWritePlatformServiceImpl.java @@ -32,6 +32,7 @@ import org.mifosplatform.portfolio.account.domain.AccountTransferDetails; import org.mifosplatform.portfolio.account.domain.AccountTransferRepository; import org.mifosplatform.portfolio.account.domain.AccountTransferTransaction; import org.mifosplatform.portfolio.account.domain.AccountTransferType; +import org.mifosplatform.portfolio.loanaccount.data.HolidayDetailDTO; import org.mifosplatform.portfolio.loanaccount.domain.Loan; import org.mifosplatform.portfolio.loanaccount.domain.LoanAccountDomainService; import org.mifosplatform.portfolio.loanaccount.domain.LoanTransaction; @@ -145,10 +146,12 @@ public class AccountTransfersWritePlatformServiceImpl implements AccountTransfer final Long toLoanAccountId = command.longValueOfParameterNamed(toAccountIdParamName); final Loan toLoanAccount = this.loanAccountAssembler.assembleFrom(toLoanAccountId); + final Boolean isHolidayValidationDone = false; + final HolidayDetailDTO holidayDetailDto = null; final boolean isRecoveryRepayment = false; final LoanTransaction loanRepaymentTransaction = this.loanAccountDomainService.makeRepayment(toLoanAccount, new CommandProcessingResultBuilder(), transactionDate, transactionAmount, paymentDetail, null, null, - isRecoveryRepayment, isAccountTransfer); + isRecoveryRepayment, isAccountTransfer, holidayDetailDto, isHolidayValidationDone); final AccountTransferDetails accountTransferDetails = this.accountTransferAssembler.assembleSavingsToLoanTransfer(command, fromSavingsAccount, toLoanAccount, withdrawal, loanRepaymentTransaction); @@ -304,9 +307,11 @@ public class AccountTransfersWritePlatformServiceImpl implements AccountTransfer } else { final boolean isRecoveryRepayment = false; + final Boolean isHolidayValidationDone=false; + final HolidayDetailDTO holidayDetailDto=null; loanTransaction = this.loanAccountDomainService.makeRepayment(toLoanAccount, new CommandProcessingResultBuilder(), accountTransferDTO.getTransactionDate(), accountTransferDTO.getTransactionAmount(), - accountTransferDTO.getPaymentDetail(), null, null, isRecoveryRepayment, isAccountTransfer); + accountTransferDTO.getPaymentDetail(), null, null, isRecoveryRepayment, isAccountTransfer,holidayDetailDto,isHolidayValidationDone); } accountTransferDetails = this.accountTransferAssembler.assembleSavingsToLoanTransfer(accountTransferDTO, fromSavingsAccount, 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 e0e60332d..f7b905444 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 @@ -2845,24 +2845,26 @@ public class Loan extends AbstractPersistable { public ChangedTransactionDetail makeRepayment(final LoanTransaction repaymentTransaction, final LoanLifecycleStateMachine loanLifecycleStateMachine, final List existingTransactionIds, final List existingReversedTransactionIds, boolean isRecoveryRepayment, final ScheduleGeneratorDTO scheduleGeneratorDTO, - final AppUser currentUser) { - + final AppUser currentUser, Boolean isHolidayValidationDone) { + HolidayDetailDTO holidayDetailDTO = null; LoanEvent event = null; if (isRecoveryRepayment) { event = LoanEvent.LOAN_RECOVERY_PAYMENT; } else { event = LoanEvent.LOAN_REPAYMENT_OR_WAIVER; } - - HolidayDetailDTO holidayDetailDTO = scheduleGeneratorDTO.getHolidayDetailDTO(); + if (!isHolidayValidationDone) { + holidayDetailDTO = scheduleGeneratorDTO.getHolidayDetailDTO(); + } validateAccountStatus(event); validateActivityNotBeforeClientOrGroupTransferDate(event, repaymentTransaction.getTransactionDate()); validateActivityNotBeforeLastTransactionDate(event, repaymentTransaction.getTransactionDate()); - validateRepaymentDateIsOnHoliday(repaymentTransaction.getTransactionDate(), holidayDetailDTO.isAllowTransactionsOnHoliday(), - holidayDetailDTO.getHolidays()); - validateRepaymentDateIsOnNonWorkingDay(repaymentTransaction.getTransactionDate(), holidayDetailDTO.getWorkingDays(), - holidayDetailDTO.isAllowTransactionsOnNonWorkingDay()); - + if (!isHolidayValidationDone) { + validateRepaymentDateIsOnHoliday(repaymentTransaction.getTransactionDate(), holidayDetailDTO.isAllowTransactionsOnHoliday(), + holidayDetailDTO.getHolidays()); + validateRepaymentDateIsOnNonWorkingDay(repaymentTransaction.getTransactionDate(), holidayDetailDTO.getWorkingDays(), + holidayDetailDTO.isAllowTransactionsOnNonWorkingDay()); + } existingTransactionIds.addAll(findExistingTransactionIds()); existingReversedTransactionIds.addAll(findExistingReversedTransactionIds()); @@ -4366,7 +4368,7 @@ public class Loan extends AbstractPersistable { } } - private void validateRepaymentDateIsOnNonWorkingDay(final LocalDate repaymentDate, final WorkingDays workingDays, + public void validateRepaymentDateIsOnNonWorkingDay(final LocalDate repaymentDate, final WorkingDays workingDays, final boolean allowTransactionsOnNonWorkingDay) { if (!allowTransactionsOnNonWorkingDay) { if (!WorkingDaysUtil.isWorkingDay(workingDays, repaymentDate)) { @@ -4376,7 +4378,7 @@ public class Loan extends AbstractPersistable { } } - private void validateRepaymentDateIsOnHoliday(final LocalDate repaymentDate, final boolean allowTransactionsOnHoliday, + public void validateRepaymentDateIsOnHoliday(final LocalDate repaymentDate, final boolean allowTransactionsOnHoliday, final List holidays) { if (!allowTransactionsOnHoliday) { if (HolidayUtil.isHoliday(repaymentDate, holidays)) { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/LoanAccountDomainService.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/LoanAccountDomainService.java index 165d0bde9..979552b6a 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/LoanAccountDomainService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/LoanAccountDomainService.java @@ -10,6 +10,7 @@ import java.math.BigDecimal; import org.joda.time.LocalDate; import org.mifosplatform.infrastructure.core.data.CommandProcessingResultBuilder; import org.mifosplatform.portfolio.calendar.domain.CalendarInstance; +import org.mifosplatform.portfolio.loanaccount.data.HolidayDetailDTO; import org.mifosplatform.portfolio.loanaccount.data.ScheduleGeneratorDTO; import org.mifosplatform.portfolio.paymentdetail.domain.PaymentDetail; @@ -17,7 +18,7 @@ public interface LoanAccountDomainService { LoanTransaction makeRepayment(Loan loan, CommandProcessingResultBuilder builderResult, LocalDate transactionDate, BigDecimal transactionAmount, PaymentDetail paymentDetail, String noteText, String txnExternalId, - final boolean isRecoveryRepayment, boolean isAccountTransfer); + final boolean isRecoveryRepayment, boolean isAccountTransfer, HolidayDetailDTO holidatDetailDto, Boolean isHolidayValidationDone); LoanTransaction makeRefund(Long accountId, CommandProcessingResultBuilder builderResult, LocalDate transactionDate, BigDecimal transactionAmount, PaymentDetail paymentDetail, String noteText, String txnExternalId); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java index 5e84d4869..7c440ecf7 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java @@ -132,9 +132,17 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { @Override public LoanTransaction makeRepayment(final Loan loan, final CommandProcessingResultBuilder builderResult, final LocalDate transactionDate, final BigDecimal transactionAmount, final PaymentDetail paymentDetail, final String noteText, - final String txnExternalId, final boolean isRecoveryRepayment, boolean isAccountTransfer) { + final String txnExternalId, final boolean isRecoveryRepayment, boolean isAccountTransfer, HolidayDetailDTO holidayDetailDto, Boolean isHolidayValidationDone) { AppUser currentUser = getAppUserIfPresent(); checkClientOrGroupActive(loan); + List holidays = null; + WorkingDays workingDays = null; + boolean allowTransactionsOnHoliday = false; + boolean allowTransactionsOnNonWorkingDay = false; + HolidayDetailDTO holidayDetailDTO = null; + if(holidayDetailDto != null){ + holidayDetailDTO = holidayDetailDto; + } this.businessEventNotifierService.notifyBusinessEventToBeExecuted(BUSINESS_EVENTS.LOAN_MAKE_REPAYMENT, constructEntityMap(BUSINESS_ENTITY.LOAN, loan)); @@ -165,12 +173,13 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { txnExternalId, currentDateTime, currentUser); } - final boolean allowTransactionsOnHoliday = this.configurationDomainService.allowTransactionsOnHolidayEnabled(); - final List holidays = this.holidayRepository.findByOfficeIdAndGreaterThanDate(loan.getOfficeId(), - transactionDate.toDate(), HolidayStatusType.ACTIVE.getValue()); - final WorkingDays workingDays = this.workingDaysRepository.findOne(); - final boolean allowTransactionsOnNonWorkingDay = this.configurationDomainService.allowTransactionsOnNonWorkingDayEnabled(); - + if(!isHolidayValidationDone){ + allowTransactionsOnHoliday = this.configurationDomainService.allowTransactionsOnHolidayEnabled(); + holidays = this.holidayRepository.findByOfficeIdAndGreaterThanDate(loan.getOfficeId(), + transactionDate.toDate(), HolidayStatusType.ACTIVE.getValue()); + workingDays = this.workingDaysRepository.findOne(); + allowTransactionsOnNonWorkingDay = this.configurationDomainService.allowTransactionsOnNonWorkingDayEnabled(); + } CalendarInstance restCalendarInstance = null; CalendarInstance compoundingCalendarInstance = null; ApplicationCurrency applicationCurrency = null; @@ -191,12 +200,16 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { calculatedRepaymentsStartingFromDate = getCalculatedRepaymentsStartingFromDate(loan.getDisbursementDate(), loan, calendarInstance); - isHolidayEnabled = this.configurationDomainService.isRescheduleRepaymentsOnHolidaysEnabled(); + if(!isHolidayValidationDone){ + isHolidayEnabled = this.configurationDomainService.isRescheduleRepaymentsOnHolidaysEnabled(); + } overdurPenaltyWaitPeriod = this.configurationDomainService.retrievePenaltyWaitPeriod(); recalculateFrom = transactionDate; } - HolidayDetailDTO holidayDetailDTO = new HolidayDetailDTO(isHolidayEnabled, holidays, workingDays, allowTransactionsOnHoliday, + if(!isHolidayValidationDone){ + holidayDetailDTO = new HolidayDetailDTO(isHolidayEnabled, holidays, workingDays, allowTransactionsOnHoliday, allowTransactionsOnNonWorkingDay); + } FloatingRateDTO floatingRateDTO = constructFloatingRateDTO(loan); final ScheduleGeneratorDTO scheduleGeneratorDTO = new ScheduleGeneratorDTO(loanScheduleFactory, applicationCurrency, @@ -205,7 +218,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { final ChangedTransactionDetail changedTransactionDetail = loan.makeRepayment(newRepaymentTransaction, defaultLoanLifecycleStateMachine(), existingTransactionIds, existingReversedTransactionIds, isRecoveryRepayment, - scheduleGeneratorDTO, currentUser); + scheduleGeneratorDTO, currentUser, isHolidayValidationDone); saveLoanTransactionWithDataIntegrityViolationChecks(newRepaymentTransaction); 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 c95b223c9..c1e94e576 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 @@ -779,11 +779,12 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf } final Loan loan = this.loanAssembler.assembleFrom(loanId); final PaymentDetail paymentDetail = this.paymentDetailWritePlatformService.createAndPersistPaymentDetail(command, changes); - + final Boolean isHolidayValidationDone = false; + final HolidayDetailDTO holidayDetailDto = null; boolean isAccountTransfer = false; final CommandProcessingResultBuilder commandProcessingResultBuilder = new CommandProcessingResultBuilder(); this.loanAccountDomainService.makeRepayment(loan, commandProcessingResultBuilder, transactionDate, transactionAmount, - paymentDetail, noteText, txnExternalId, isRecoveryRepayment, isAccountTransfer); + paymentDetail, noteText, txnExternalId, isRecoveryRepayment, isAccountTransfer, holidayDetailDto, isHolidayValidationDone); return commandProcessingResultBuilder.withCommandId(command.commandId()) // .withLoanId(loanId) // @@ -802,6 +803,29 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf if (repaymentCommand == null) { return changes; } List transactionIds = new ArrayList<>(); boolean isAccountTransfer = false; + HolidayDetailDTO holidayDetailDTO = null; + Boolean isHolidayValidationDone = false; + final boolean allowTransactionsOnHoliday = this.configurationDomainService.allowTransactionsOnHolidayEnabled(); + for(final SingleRepaymentCommand singleLoanRepaymentCommand : repaymentCommand){ + if(singleLoanRepaymentCommand != null){ + Loan loans = this.loanRepository.findOne(singleLoanRepaymentCommand.getLoanId()); + final List holidays = this.holidayRepository.findByOfficeIdAndGreaterThanDate(loans.getOfficeId(), + singleLoanRepaymentCommand.getTransactionDate().toDate()); + final WorkingDays workingDays = this.workingDaysRepository.findOne(); + final boolean allowTransactionsOnNonWorkingDay = this.configurationDomainService.allowTransactionsOnNonWorkingDayEnabled(); + boolean isHolidayEnabled = false; + isHolidayEnabled = this.configurationDomainService.isRescheduleRepaymentsOnHolidaysEnabled(); + holidayDetailDTO = new HolidayDetailDTO(isHolidayEnabled, holidays, workingDays, allowTransactionsOnHoliday, + allowTransactionsOnNonWorkingDay); + loans.validateRepaymentDateIsOnHoliday(singleLoanRepaymentCommand.getTransactionDate(), holidayDetailDTO.isAllowTransactionsOnHoliday(), + holidayDetailDTO.getHolidays()); + loans.validateRepaymentDateIsOnNonWorkingDay(singleLoanRepaymentCommand.getTransactionDate(), holidayDetailDTO.getWorkingDays(), + holidayDetailDTO.isAllowTransactionsOnNonWorkingDay()); + isHolidayValidationDone = true; + break; + } + + } for (final SingleRepaymentCommand singleLoanRepaymentCommand : repaymentCommand) { if (singleLoanRepaymentCommand != null) { final Loan loan = this.loanAssembler.assembleFrom(singleLoanRepaymentCommand.getLoanId()); @@ -812,7 +836,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf final CommandProcessingResultBuilder commandProcessingResultBuilder = new CommandProcessingResultBuilder(); LoanTransaction loanTransaction = this.loanAccountDomainService.makeRepayment(loan, commandProcessingResultBuilder, bulkRepaymentCommand.getTransactionDate(), singleLoanRepaymentCommand.getTransactionAmount(), paymentDetail, - bulkRepaymentCommand.getNote(), null, isRecoveryRepayment, isAccountTransfer); + bulkRepaymentCommand.getNote(), null, isRecoveryRepayment, isAccountTransfer, holidayDetailDTO, isHolidayValidationDone); transactionIds.add(loanTransaction.getId()); } }