diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanSchedularService.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanSchedularService.java new file mode 100644 index 000000000..5866e9799 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanSchedularService.java @@ -0,0 +1,10 @@ +package org.mifosplatform.portfolio.loanaccount.service; + +import org.mifosplatform.infrastructure.jobs.exception.JobExecutionException; + + +public interface LoanSchedularService { + + void applyChargeForOverdueLoans() throws JobExecutionException; + +} diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanSchedularServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanSchedularServiceImpl.java new file mode 100644 index 000000000..411765d5e --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanSchedularServiceImpl.java @@ -0,0 +1,91 @@ +package org.mifosplatform.portfolio.loanaccount.service; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.mifosplatform.infrastructure.configuration.domain.ConfigurationDomainService; +import org.mifosplatform.infrastructure.core.data.ApiParameterError; +import org.mifosplatform.infrastructure.core.exception.AbstractPlatformDomainRuleException; +import org.mifosplatform.infrastructure.core.exception.PlatformApiDataValidationException; +import org.mifosplatform.infrastructure.jobs.annotation.CronTarget; +import org.mifosplatform.infrastructure.jobs.exception.JobExecutionException; +import org.mifosplatform.infrastructure.jobs.service.JobName; +import org.mifosplatform.portfolio.loanaccount.loanschedule.data.OverdueLoanScheduleData; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class LoanSchedularServiceImpl implements LoanSchedularService { + + private final static Logger logger = LoggerFactory.getLogger(LoanSchedularServiceImpl.class); + private final ConfigurationDomainService configurationDomainService; + private final LoanReadPlatformService loanReadPlatformService; + private final LoanWritePlatformService loanWritePlatformService; + + @Autowired + public LoanSchedularServiceImpl(final ConfigurationDomainService configurationDomainService, + final LoanReadPlatformService loanReadPlatformService, final LoanWritePlatformService loanWritePlatformService) { + this.configurationDomainService = configurationDomainService; + this.loanReadPlatformService = loanReadPlatformService; + this.loanWritePlatformService = loanWritePlatformService; + } + + @Override + @CronTarget(jobName = JobName.APPLY_CHARGE_TO_OVERDUE_LOAN_INSTALLMENT) + public void applyChargeForOverdueLoans() throws JobExecutionException { + + final Long penaltyWaitPeriodValue = this.configurationDomainService.retrievePenaltyWaitPeriod(); + final Collection overdueLoanScheduledInstallments = this.loanReadPlatformService + .retrieveAllLoansWithOverdueInstallments(penaltyWaitPeriodValue); + + if (!overdueLoanScheduledInstallments.isEmpty()) { + final StringBuilder sb = new StringBuilder(); + final Map> overdueScheduleData = new HashMap<>(); + for (final OverdueLoanScheduleData overdueInstallment : overdueLoanScheduledInstallments) { + if (overdueScheduleData.containsKey(overdueInstallment.getLoanId())) { + overdueScheduleData.get(overdueInstallment.getLoanId()).add(overdueInstallment); + } else { + Collection loanData = new ArrayList<>(); + loanData.add(overdueInstallment); + overdueScheduleData.put(overdueInstallment.getLoanId(), loanData); + } + } + + for (final Long loanId : overdueScheduleData.keySet()) { + try { + this.loanWritePlatformService.applyOverdueChargesForLoan(loanId, overdueScheduleData.get(loanId)); + + } catch (final PlatformApiDataValidationException e) { + final List errors = e.getErrors(); + for (final ApiParameterError error : errors) { + logger.error("Apply Charges due for overdue loans failed for account:" + loanId + " with message " + + error.getDeveloperMessage()); + sb.append("Apply Charges due for overdue loans failed for account:").append(loanId).append(" with message ") + .append(error.getDeveloperMessage()); + } + } catch (final AbstractPlatformDomainRuleException ex) { + logger.error("Apply Charges due for overdue loans failed for account:" + loanId + " with message " + + ex.getDefaultUserMessage()); + sb.append("Apply Charges due for overdue loans failed for account:").append(loanId).append(" with message ") + .append(ex.getDefaultUserMessage()); + } catch (Exception e) { + Throwable realCause = e; + if (e.getCause() != null) { + realCause = e.getCause(); + } + logger.error("Apply Charges due for overdue loans failed for account:" + loanId + " with message " + + realCause.getMessage()); + sb.append("Apply Charges due for overdue loans failed for account:").append(loanId).append(" with message ") + .append(realCause.getMessage()); + } + } + if (sb.length() > 0) { throw new JobExecutionException(sb.toString()); } + } + } + +} diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanWritePlatformService.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanWritePlatformService.java index bd95e534b..3c97fb9f7 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanWritePlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanWritePlatformService.java @@ -19,6 +19,7 @@ import org.mifosplatform.portfolio.calendar.domain.CalendarInstance; import org.mifosplatform.portfolio.collectionsheet.command.CollectionSheetBulkDisbursalCommand; import org.mifosplatform.portfolio.collectionsheet.command.CollectionSheetBulkRepaymentCommand; import org.mifosplatform.portfolio.loanaccount.domain.LoanTransaction; +import org.mifosplatform.portfolio.loanaccount.loanschedule.data.OverdueLoanScheduleData; public interface LoanWritePlatformService { @@ -74,8 +75,6 @@ public interface LoanWritePlatformService { void transferFeeCharges() throws JobExecutionException; - void applyChargeForOverdueLoans() throws JobExecutionException; - CommandProcessingResult undoWriteOff(Long loanId); CommandProcessingResult updateDisbursementDateAndAmountForTranche(Long loanId, Long disbursementId, JsonCommand command); @@ -90,4 +89,6 @@ public interface LoanWritePlatformService { CommandProcessingResult addAndDeleteLoanDisburseDetails(Long loanId, JsonCommand command); + void applyOverdueChargesForLoan(Long loanId, Collection overdueLoanScheduleDatas); + } \ No newline at end of file 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 f96f469fb..37b10d146 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 @@ -28,7 +28,6 @@ import org.mifosplatform.infrastructure.core.data.ApiParameterError; import org.mifosplatform.infrastructure.core.data.CommandProcessingResult; import org.mifosplatform.infrastructure.core.data.CommandProcessingResultBuilder; import org.mifosplatform.infrastructure.core.data.DataValidatorBuilder; -import org.mifosplatform.infrastructure.core.exception.AbstractPlatformDomainRuleException; import org.mifosplatform.infrastructure.core.exception.PlatformApiDataValidationException; import org.mifosplatform.infrastructure.core.exception.PlatformServiceUnavailableException; import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper; @@ -127,11 +126,11 @@ import org.mifosplatform.portfolio.loanaccount.domain.LoanTransactionType; import org.mifosplatform.portfolio.loanaccount.exception.ExceedingTrancheCountException; import org.mifosplatform.portfolio.loanaccount.exception.InvalidPaidInAdvanceAmountException; import org.mifosplatform.portfolio.loanaccount.exception.LoanDisbursalException; +import org.mifosplatform.portfolio.loanaccount.exception.LoanMultiDisbursementException; import org.mifosplatform.portfolio.loanaccount.exception.LoanOfficerAssignmentException; import org.mifosplatform.portfolio.loanaccount.exception.LoanOfficerUnassignmentException; import org.mifosplatform.portfolio.loanaccount.exception.LoanTransactionNotFoundException; import org.mifosplatform.portfolio.loanaccount.exception.MultiDisbursementDataRequiredException; -import org.mifosplatform.portfolio.loanaccount.exception.LoanMultiDisbursementException; import org.mifosplatform.portfolio.loanaccount.guarantor.service.GuarantorDomainService; import org.mifosplatform.portfolio.loanaccount.loanschedule.data.OverdueLoanScheduleData; import org.mifosplatform.portfolio.loanaccount.loanschedule.domain.DefaultScheduledDateGenerator; @@ -2350,59 +2349,8 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf } } + @Override - @CronTarget(jobName = JobName.APPLY_CHARGE_TO_OVERDUE_LOAN_INSTALLMENT) - public void applyChargeForOverdueLoans() throws JobExecutionException { - - final Long penaltyWaitPeriodValue = this.configurationDomainService.retrievePenaltyWaitPeriod(); - final Collection overdueLoanScheduledInstallments = this.loanReadPlatformService - .retrieveAllLoansWithOverdueInstallments(penaltyWaitPeriodValue); - - if (!overdueLoanScheduledInstallments.isEmpty()) { - final StringBuilder sb = new StringBuilder(); - final Map> overdueScheduleData = new HashMap<>(); - for (final OverdueLoanScheduleData overdueInstallment : overdueLoanScheduledInstallments) { - if (overdueScheduleData.containsKey(overdueInstallment.getLoanId())) { - overdueScheduleData.get(overdueInstallment.getLoanId()).add(overdueInstallment); - } else { - Collection loanData = new ArrayList<>(); - loanData.add(overdueInstallment); - overdueScheduleData.put(overdueInstallment.getLoanId(), loanData); - } - } - - for (final Long loanId : overdueScheduleData.keySet()) { - try { - applyOverdueChargesForLoan(loanId, overdueScheduleData.get(loanId)); - - } catch (final PlatformApiDataValidationException e) { - final List errors = e.getErrors(); - for (final ApiParameterError error : errors) { - logger.error("Apply Charges due for overdue loans failed for account:" + loanId + " with message " - + error.getDeveloperMessage()); - sb.append("Apply Charges due for overdue loans failed for account:").append(loanId).append(" with message ") - .append(error.getDeveloperMessage()); - } - } catch (final AbstractPlatformDomainRuleException ex) { - logger.error("Apply Charges due for overdue loans failed for account:" + loanId + " with message " - + ex.getDefaultUserMessage()); - sb.append("Apply Charges due for overdue loans failed for account:").append(loanId).append(" with message ") - .append(ex.getDefaultUserMessage()); - } catch (Exception e) { - Throwable realCause = e; - if (e.getCause() != null) { - realCause = e.getCause(); - } - logger.error("Apply Charges due for overdue loans failed for account:" + loanId + " with message " - + realCause.getMessage()); - sb.append("Apply Charges due for overdue loans failed for account:").append(loanId).append(" with message ") - .append(realCause.getMessage()); - } - } - if (sb.length() > 0) { throw new JobExecutionException(sb.toString()); } - } - } - @Transactional public void applyOverdueChargesForLoan(final Long loanId, Collection overdueLoanScheduleDatas) {