diff --git a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/configuration/domain/ConfigurationDomainService.java b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/configuration/domain/ConfigurationDomainService.java index 8149a6b4f..35ea2f751 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/configuration/domain/ConfigurationDomainService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/configuration/domain/ConfigurationDomainService.java @@ -49,4 +49,5 @@ public interface ConfigurationDomainService { int getRoundingMode(); + boolean isBackdatePenaltiesEnabled(); } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/configuration/domain/ConfigurationDomainServiceJpa.java b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/configuration/domain/ConfigurationDomainServiceJpa.java index aece63d72..1d2ebc154 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/configuration/domain/ConfigurationDomainServiceJpa.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/configuration/domain/ConfigurationDomainServiceJpa.java @@ -187,10 +187,18 @@ public class ConfigurationDomainServiceJpa implements ConfigurationDomainService final GlobalConfigurationProperty property = this.globalConfigurationRepository.findOneByNameWithNotFoundDetection(propertyName); if (property.isEnabled()) { int value = property.getValue().intValue(); - if (value < 0 || value > 6) { return defaultValue; } + if (value < 0 || value > 6) { + return defaultValue; + } return value; } return defaultValue; } + public boolean isBackdatePenaltiesEnabled() { + final String propertyName = "backdate-penalties-enabled"; + final GlobalConfigurationProperty property = this.globalConfigurationRepository.findOneByNameWithNotFoundDetection(propertyName); + return property.isEnabled(); + } + } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformService.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformService.java index e1f49a61a..99fca09d2 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformService.java @@ -76,7 +76,7 @@ public interface LoanReadPlatformService { * result overdue installments with this charge already applied are not * returned. */ - Collection retrieveAllLoansWithOverdueInstallments(final Long penaltyWaitPeriod); + Collection retrieveAllLoansWithOverdueInstallments(final Long penaltyWaitPeriod, final Boolean backdatePenalties); Integer retriveLoanCounter(Long groupId, Integer loanType, Long productId); 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 e1d22134e..70a4396f7 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 @@ -17,8 +17,11 @@ import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.logging.Logger; import org.apache.commons.lang.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.joda.time.Days; import org.joda.time.LocalDate; import org.joda.time.format.DateTimeFormat; @@ -1465,12 +1468,31 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { } @Override - public Collection retrieveAllLoansWithOverdueInstallments(final Long penaltyWaitPeriod) { + public Collection retrieveAllLoansWithOverdueInstallments(final Long penaltyWaitPeriod, final Boolean backdatePenalties) { final MusoniOverdueLoanScheduleMapper rm = new MusoniOverdueLoanScheduleMapper(); - final String sql = "select " + rm.schema() + " where DATE_SUB(CURDATE(),INTERVAL ? DAY) > ls.duedate " - + " and ls.completed_derived <> 1 and mc.charge_applies_to_enum =1 " - + " and mc.charge_time_enum = 9 and ml.loan_status_id = 300 "; - return this.jdbcTemplate.query(sql, rm, new Object[] { penaltyWaitPeriod }); + + final StringBuilder sqlBuilder = new StringBuilder(400); + sqlBuilder + .append("select ") + .append(rm.schema()) + .append(" where DATE_SUB(CURDATE(),INTERVAL ? DAY) > ls.duedate ") + .append( " and ls.completed_derived <> 1 and mc.charge_applies_to_enum =1 ") + .append(" and mc.charge_time_enum = 9 and ml.loan_status_id = 300 "); + + + if(backdatePenalties) + { + return this.jdbcTemplate.query(sqlBuilder.toString(), rm, new Object[] { penaltyWaitPeriod }); + } + else + { + // Only apply for duedate = yesterday (so that we don't apply penalties on the duedate itself) + sqlBuilder.append(" and ls.duedate >= DATE_SUB(CURDATE(),INTERVAL (? + 1) DAY)"); + + return this.jdbcTemplate.query(sqlBuilder.toString(), rm, new Object[] { penaltyWaitPeriod, penaltyWaitPeriod }); + } + + } @SuppressWarnings("deprecation") 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 index 914fe998a..249970f1c 100644 --- 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 @@ -49,8 +49,9 @@ public class LoanSchedularServiceImpl implements LoanSchedularService { public void applyChargeForOverdueLoans() throws JobExecutionException { final Long penaltyWaitPeriodValue = this.configurationDomainService.retrievePenaltyWaitPeriod(); + final Boolean backdatePenalties = this.configurationDomainService.isBackdatePenaltiesEnabled(); final Collection overdueLoanScheduledInstallments = this.loanReadPlatformService - .retrieveAllLoansWithOverdueInstallments(penaltyWaitPeriodValue); + .retrieveAllLoansWithOverdueInstallments(penaltyWaitPeriodValue,backdatePenalties); if (!overdueLoanScheduledInstallments.isEmpty()) { final StringBuilder sb = new StringBuilder(); 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 3f8d0d140..c95b223c9 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 @@ -2441,7 +2441,6 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf } } - @Override @Transactional public void applyOverdueChargesForLoan(final Long loanId, Collection overdueLoanScheduleDatas) { diff --git a/mifosng-provider/src/main/resources/sql/migrations/core_db/V280__add_configuration_param_backdate-penalties.sql b/mifosng-provider/src/main/resources/sql/migrations/core_db/V280__add_configuration_param_backdate-penalties.sql new file mode 100644 index 000000000..a4fcb5403 --- /dev/null +++ b/mifosng-provider/src/main/resources/sql/migrations/core_db/V280__add_configuration_param_backdate-penalties.sql @@ -0,0 +1,4 @@ +INSERT INTO `c_configuration` ( `name`, `value`, `enabled`, `description`) +VALUES + ( 'backdate-penalties-enabled', 0, 1, 'If this parameter is disabled penalties will only be added to instalments due moving forward, any old overdue instalments will not be affected.'); +