diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/data/LoanProductProvisioningEntryData.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/data/LoanProductProvisioningEntryData.java index 3960e5233..6fabb7e7b 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/data/LoanProductProvisioningEntryData.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/data/LoanProductProvisioningEntryData.java @@ -38,10 +38,14 @@ public class LoanProductProvisioningEntryData { private final String liabilityAccountCode ; + private final String liabilityAccountName ; + private final Long expenseAccount; private final String expenseAccountCode ; + private final String expenseAccountName ; + private final Long criteriaId ; public LoanProductProvisioningEntryData(final Long historyId, final Long officeId, final String currencyCode, final Long productId, @@ -62,13 +66,15 @@ public class LoanProductProvisioningEntryData { this.productName = null ; this.categoryName = null ; this.liabilityAccountCode = null ; + this.liabilityAccountName = null ; this.expenseAccountCode = null ; + this.expenseAccountName = null ; this.criteriaId = criteriaId ; } public LoanProductProvisioningEntryData(final Long historyId, final Long officeId, final String officeName, final String currencyCode, final Long productId, final String productName, final Long categoryId, final String categoryName, final Long overdueInDays, final BigDecimal amountReserved, - Long liablityAccount, String liabilityAccountName, Long expenseAccount, String expenseAccountName, final Long criteriaId) { + Long liablityAccount, String liabilityAccountglCode, String liabilityAccountName, Long expenseAccount, String expenseAccountglCode, String expenseAccountName, final Long criteriaId) { this.historyId = historyId; this.officeId = officeId; this.currencyCode = currencyCode; @@ -83,8 +89,10 @@ public class LoanProductProvisioningEntryData { this.officeName = officeName ; this.productName = productName ; this.amountreserved = amountReserved ; - this.liabilityAccountCode = liabilityAccountName ; - this.expenseAccountCode = expenseAccountName ; + this.liabilityAccountCode = liabilityAccountglCode ; + this.liabilityAccountName = liabilityAccountName ; + this.expenseAccountCode = expenseAccountglCode ; + this.expenseAccountName = expenseAccountName ; this.criteriaId = criteriaId ; } public Long getHistoryId() { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/exception/NoProvisioningCriteriaDefinitionFound.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/exception/NoProvisioningCriteriaDefinitionFound.java new file mode 100644 index 000000000..9c82cbb9b --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/exception/NoProvisioningCriteriaDefinitionFound.java @@ -0,0 +1,16 @@ +/** + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.mifosplatform.accounting.provisioning.exception; + +import org.mifosplatform.infrastructure.core.exception.AbstractPlatformResourceNotFoundException; + + +public class NoProvisioningCriteriaDefinitionFound extends AbstractPlatformResourceNotFoundException { + + public NoProvisioningCriteriaDefinitionFound() { + super("error.msg.no.provisioning.criteria.definitions.found", "No Provisioning Criteria Definitions are found"); + } +} diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/service/ProvisioningEntriesReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/service/ProvisioningEntriesReadPlatformServiceImpl.java index 7ee36ee2d..0cb6bc7fe 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/service/ProvisioningEntriesReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/service/ProvisioningEntriesReadPlatformServiceImpl.java @@ -54,13 +54,14 @@ public class ProvisioningEntriesReadPlatformServiceImpl implements ProvisioningE .append(",sch.duedate),0) as numberofdaysoverdue,sch.duedate, pcd.category_id, pcd.provision_percentage,") .append("loan.total_outstanding_derived as outstandingbalance, pcd.liability_account, pcd.expense_account from m_loan_repayment_schedule sch") .append(" LEFT JOIN m_loan loan on sch.loan_id = loan.id") - .append(" LEFT JOIN m_loanproduct_provisioning_mapping lpm on lpm.product_id = loan.product_id") - .append(" LEFT JOIN m_provisioning_criteria_definition pcd on pcd.criteria_id = lpm.criteria_id and ") + .append(" JOIN m_loanproduct_provisioning_mapping lpm on lpm.product_id = loan.product_id") + .append(" JOIN m_provisioning_criteria_definition pcd on pcd.criteria_id = lpm.criteria_id and ") .append("(pcd.min_age <= GREATEST(datediff(").append(formattedDate).append(",sch.duedate),0) and ") - .append("GREATEST(datediff(").append(formattedDate).append(",sch.duedate),0) <= pcd.max_age) ") + .append("GREATEST(datediff(").append(formattedDate).append(",sch.duedate),0) <= pcd.max_age) and ") + .append("pcd.criteria_id is not null ") .append("LEFT JOIN m_client mclient ON mclient.id = loan.client_id ") .append("LEFT JOIN m_group mgroup ON mgroup.id = loan.group_id ") - .append("where loan.loan_status_id=300 and sch.completed_derived=false and provision_percentage is not null ") + .append("where loan.loan_status_id=300 and sch.completed_derived=false ") .append("GROUP BY loan.id order by loan.product_id"); } @@ -130,8 +131,8 @@ public class ProvisioningEntriesReadPlatformServiceImpl implements ProvisioningE private final StringBuilder sqlQuery = new StringBuilder() .append("select entry.id, entry.history_id as historyId, office_id, entry.criteria_id as criteriaid, office.name as officename, product.name as productname, entry.product_id, ") - .append("category_id, category.category_name, liability.id as liabilityid, liability.gl_code as liabilitycode, ") - .append("expense.id as expenseid, expense.gl_code as expensecode, entry.currency_code, entry.overdue_in_days, entry.reseve_amount from m_loanproduct_provisioning_entry entry ") + .append("category_id, category.category_name, liability.id as liabilityid, liability.gl_code as liabilitycode, liability.name as liabilityname, ") + .append("expense.id as expenseid, expense.gl_code as expensecode, expense.name as expensename, entry.currency_code, entry.overdue_in_days, entry.reseve_amount from m_loanproduct_provisioning_entry entry ") .append("left join m_office office ON office.id = entry.office_id ") .append("left join m_product_loan product ON product.id = entry.product_id ") .append("left join m_provision_category category ON category.id = entry.category_id ") @@ -152,12 +153,14 @@ public class ProvisioningEntriesReadPlatformServiceImpl implements ProvisioningE String categoryName = rs.getString("category_name") ; BigDecimal amountreserved = rs.getBigDecimal("reseve_amount"); Long liabilityAccountCode = rs.getLong("liabilityid"); - String liabilityAccountName = rs.getString("liabilitycode") ; - String expenseAccountName = rs.getString("expensecode") ; + String liabilityAccountglCode = rs.getString("liabilitycode") ; + String expenseAccountglCode = rs.getString("expensecode") ; Long expenseAccountCode = rs.getLong("expenseid"); Long criteriaId = rs.getLong("criteriaid") ; + String liabilityAccountName = rs.getString("liabilityname") ; + String expenseAccountName = rs.getString("expensename") ; return new LoanProductProvisioningEntryData(historyId, officeId, officeName, currentcyCode, productId, productName, categoryId, categoryName, overdueDays, amountreserved, - liabilityAccountCode, liabilityAccountName, expenseAccountCode, expenseAccountName, criteriaId); + liabilityAccountCode, liabilityAccountglCode, liabilityAccountName, expenseAccountCode, expenseAccountglCode, expenseAccountName, criteriaId); } public String getSchema() { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/service/ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/service/ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl.java index 8c185751e..0796f52e6 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/service/ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/provisioning/service/ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl.java @@ -20,6 +20,7 @@ import org.mifosplatform.accounting.provisioning.data.ProvisioningEntryData; import org.mifosplatform.accounting.provisioning.domain.LoanProductProvisioningEntry; import org.mifosplatform.accounting.provisioning.domain.ProvisioningEntry; import org.mifosplatform.accounting.provisioning.domain.ProvisioningEntryRepository; +import org.mifosplatform.accounting.provisioning.exception.NoProvisioningCriteriaDefinitionFound; import org.mifosplatform.accounting.provisioning.exception.ProvisioningEntryAlreadyCreatedException; import org.mifosplatform.accounting.provisioning.exception.ProvisioningEntryNotfoundException; import org.mifosplatform.accounting.provisioning.exception.ProvisioningJournalEntriesCannotbeCreatedException; @@ -36,8 +37,10 @@ import org.mifosplatform.organisation.monetary.domain.Money; import org.mifosplatform.organisation.monetary.domain.MoneyHelper; import org.mifosplatform.organisation.office.domain.Office; import org.mifosplatform.organisation.office.domain.OfficeRepository; +import org.mifosplatform.organisation.provisioning.data.ProvisioningCriteriaData; import org.mifosplatform.organisation.provisioning.domain.ProvisioningCategory; import org.mifosplatform.organisation.provisioning.domain.ProvisioningCategoryRepository; +import org.mifosplatform.organisation.provisioning.service.ProvisioningCriteriaReadPlatformService; import org.mifosplatform.portfolio.loanproduct.domain.LoanProduct; import org.mifosplatform.portfolio.loanproduct.domain.LoanProductRepository; import org.mifosplatform.useradministration.domain.AppUser; @@ -55,6 +58,7 @@ public class ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl implements private final static Logger logger = LoggerFactory.getLogger(ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl.class); private final ProvisioningEntriesReadPlatformService provisioningEntriesReadPlatformService; + private final ProvisioningCriteriaReadPlatformService provisioningCriteriaReadPlatformService ; private final LoanProductRepository loanProductRepository; private final GLAccountRepository glAccountRepository; private final OfficeRepository officeRepository; @@ -64,16 +68,18 @@ public class ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl implements private final JournalEntryWritePlatformService journalEntryWritePlatformService; private final ProvisioningEntriesDefinitionJsonDeserializer fromApiJsonDeserializer; private final FromJsonHelper fromApiJsonHelper; - + @Autowired public ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl( final ProvisioningEntriesReadPlatformService provisioningEntriesReadPlatformService, + final ProvisioningCriteriaReadPlatformService provisioningCriteriaReadPlatformService, final LoanProductRepository loanProductRepository, final GLAccountRepository glAccountRepository, final OfficeRepository officeRepository, final ProvisioningCategoryRepository provisioningCategoryRepository, final PlatformSecurityContext platformSecurityContext, final ProvisioningEntryRepository provisioningEntryRepository, final JournalEntryWritePlatformService journalEntryWritePlatformService, final ProvisioningEntriesDefinitionJsonDeserializer fromApiJsonDeserializer, final FromJsonHelper fromApiJsonHelper) { this.provisioningEntriesReadPlatformService = provisioningEntriesReadPlatformService; + this.provisioningCriteriaReadPlatformService = provisioningCriteriaReadPlatformService ; this.loanProductRepository = loanProductRepository; this.glAccountRepository = glAccountRepository; this.officeRepository = officeRepository; @@ -102,7 +108,12 @@ public class ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl implements this.journalEntryWritePlatformService.revertProvisioningJournalEntries(requestedEntry.getCreatedDate(), existingEntryData.getId(), PortfolioProductType.PROVISIONING.getValue()); } - requestedEntry.setJournalEntryCreated(Boolean.TRUE); + if(requestedEntry.getLoanProductProvisioningEntries() == null || requestedEntry.getLoanProductProvisioningEntries().size() == 0) { + requestedEntry.setJournalEntryCreated(Boolean.FALSE); + }else { + requestedEntry.setJournalEntryCreated(Boolean.TRUE); + } + this.provisioningEntryRepository.save(requestedEntry); this.journalEntryWritePlatformService.createProvisioningJournalEntries(requestedEntry); } @@ -144,6 +155,10 @@ public class ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl implements Date createdDate = parseDate(command); boolean addJournalEntries = isJournalEntriesRequired(command); try { + Collection criteriaCollection = this.provisioningCriteriaReadPlatformService.retrieveAllProvisioningCriterias() ; + if(criteriaCollection == null || criteriaCollection.size() == 0){ + throw new NoProvisioningCriteriaDefinitionFound() ; + } ProvisioningEntry requestedEntry = createProvsioningEntry(createdDate, addJournalEntries); return new CommandProcessingResultBuilder().withCommandId(command.commandId()).withEntityId(requestedEntry.getId()).build(); } catch (DataIntegrityViolationException dve) { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/data/DataValidatorBuilder.java b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/data/DataValidatorBuilder.java index 2acd8b7a9..c65222f35 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/data/DataValidatorBuilder.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/data/DataValidatorBuilder.java @@ -501,6 +501,24 @@ public class DataValidatorBuilder { return this; } + public DataValidatorBuilder longGreaterThanNumber(String paramName, Long number, int index) { + if (this.value == null && this.ignoreNullValue) { return this; } + + if (this.value != null) { + final Long longValue = Long.valueOf(this.value.toString()); + if (longValue < number + 1) { + final StringBuilder validationErrorCode = new StringBuilder("validation.msg.").append(this.resource).append(".") + .append(this.parameter).append(".not.greater.than.specified.").append(paramName).append(".at Index.").append(index); + final StringBuilder defaultEnglishMessage = new StringBuilder("The parameter ").append(this.parameter) + .append(" must be greater than ").append(number); + final ApiParameterError error = ApiParameterError.parameterError(validationErrorCode.toString(), + defaultEnglishMessage.toString(), this.parameter, longValue, number); + this.dataValidationErrors.add(error); + } + } + return this; + } + public DataValidatorBuilder arrayNotEmpty() { if (this.value == null && this.ignoreNullValue) { return this; } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/organisation/provisioning/data/ProvisioningCriteriaDefinitionData.java b/mifosng-provider/src/main/java/org/mifosplatform/organisation/provisioning/data/ProvisioningCriteriaDefinitionData.java index fe2f39dbe..1a6717bcf 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/organisation/provisioning/data/ProvisioningCriteriaDefinitionData.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/organisation/provisioning/data/ProvisioningCriteriaDefinitionData.java @@ -17,13 +17,15 @@ public final class ProvisioningCriteriaDefinitionData implements Comparable { this.liabilityAccount = lia ; this.expenseAccount = exp ; } + + + public boolean isOverlapping(ProvisioningCriteriaDefinition def) { + return this.minimumAge <= def.maximumAge && def.minimumAge <= this.maximumAge; + } } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/organisation/provisioning/exception/ProvisioningCriteriaOverlappingDefinitionException.java b/mifosng-provider/src/main/java/org/mifosplatform/organisation/provisioning/exception/ProvisioningCriteriaOverlappingDefinitionException.java new file mode 100644 index 000000000..c638a0fcc --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/organisation/provisioning/exception/ProvisioningCriteriaOverlappingDefinitionException.java @@ -0,0 +1,15 @@ +/** + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.mifosplatform.organisation.provisioning.exception; + +import org.mifosplatform.infrastructure.core.exception.AbstractPlatformResourceNotFoundException; + +public class ProvisioningCriteriaOverlappingDefinitionException extends AbstractPlatformResourceNotFoundException { + + public ProvisioningCriteriaOverlappingDefinitionException() { + super("error.msg.provisioning.criteria.definitions.are.overlapping", "Provisioning Criteria definitions are overlapping "); + } +} diff --git a/mifosng-provider/src/main/java/org/mifosplatform/organisation/provisioning/serialization/ProvisioningCriteriaDefinitionJsonDeserializer.java b/mifosng-provider/src/main/java/org/mifosplatform/organisation/provisioning/serialization/ProvisioningCriteriaDefinitionJsonDeserializer.java index 7f4fb2f19..4fad35b53 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/organisation/provisioning/serialization/ProvisioningCriteriaDefinitionJsonDeserializer.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/organisation/provisioning/serialization/ProvisioningCriteriaDefinitionJsonDeserializer.java @@ -87,30 +87,31 @@ public class ProvisioningCriteriaDefinitionJsonDeserializer implements Provision .longGreaterThanZero(); Long minimumAge = this.fromApiJsonHelper.extractLongNamed(ProvisioningCriteriaConstants.JSON_MINIMUM_AGE_PARAM, jsonObject); - baseDataValidator.reset().parameter(ProvisioningCriteriaConstants.JSON_PROVISIONING_DEFINITIONS_PARAM) + baseDataValidator.reset().parameter(ProvisioningCriteriaConstants.JSON_MINIMUM_AGE_PARAM) .parameterAtIndexArray(ProvisioningCriteriaConstants.JSON_MINIMUM_AGE_PARAM, i + 1).value(minimumAge).notNull() .longZeroOrGreater() ; Long maximumAge = this.fromApiJsonHelper.extractLongNamed(ProvisioningCriteriaConstants.JSON_MAXIMUM_AGE_PARAM, jsonObject); - baseDataValidator.reset().parameter(ProvisioningCriteriaConstants.JSON_PROVISIONING_DEFINITIONS_PARAM) + baseDataValidator.reset().parameter(ProvisioningCriteriaConstants.JSON_MAXIMUM_AGE_PARAM) .parameterAtIndexArray(ProvisioningCriteriaConstants.JSON_MAXIMUM_AGE_PARAM, i + 1).value(maximumAge).notNull() - .longZeroOrGreater(); + .longGreaterThanNumber(ProvisioningCriteriaConstants.JSON_MINIMUM_AGE_PARAM, minimumAge, (i+1)); + BigDecimal provisioningpercentage = this.fromApiJsonHelper.extractBigDecimalNamed( ProvisioningCriteriaConstants.JSON_PROVISIONING_PERCENTAGE_PARAM, jsonObject, locale); - baseDataValidator.reset().parameter(ProvisioningCriteriaConstants.JSON_PROVISIONING_DEFINITIONS_PARAM) + baseDataValidator.reset().parameter(ProvisioningCriteriaConstants.JSON_PROVISIONING_PERCENTAGE_PARAM) .parameterAtIndexArray(ProvisioningCriteriaConstants.JSON_PROVISIONING_PERCENTAGE_PARAM, i + 1).value(provisioningpercentage) .notNull().zeroOrPositiveAmount(); Long liabilityAccountId = this.fromApiJsonHelper.extractLongNamed(ProvisioningCriteriaConstants.JSON_LIABILITY_ACCOUNT_PARAM, jsonObject); - baseDataValidator.reset().parameter(ProvisioningCriteriaConstants.JSON_PROVISIONING_DEFINITIONS_PARAM) + baseDataValidator.reset().parameter(ProvisioningCriteriaConstants.JSON_LIABILITY_ACCOUNT_PARAM) .parameterAtIndexArray(ProvisioningCriteriaConstants.JSON_LIABILITY_ACCOUNT_PARAM, i + 1).value(liabilityAccountId) .notNull().longGreaterThanZero() ; Long expenseAccountId = this.fromApiJsonHelper.extractLongNamed(ProvisioningCriteriaConstants.JSON_EXPENSE_ACCOUNT_PARAM, jsonObject); - baseDataValidator.reset().parameter(ProvisioningCriteriaConstants.JSON_PROVISIONING_DEFINITIONS_PARAM) + baseDataValidator.reset().parameter(ProvisioningCriteriaConstants.JSON_EXPENSE_ACCOUNT_PARAM) .parameterAtIndexArray(ProvisioningCriteriaConstants.JSON_EXPENSE_ACCOUNT_PARAM, i + 1).value(expenseAccountId).notNull() .longGreaterThanZero() ; } @@ -179,10 +180,10 @@ public class ProvisioningCriteriaDefinitionJsonDeserializer implements Provision .longZeroOrGreater() ; Long maximumAge = this.fromApiJsonHelper.extractLongNamed(ProvisioningCriteriaConstants.JSON_MAXIMUM_AGE_PARAM, jsonObject); - baseDataValidator.reset().parameter(ProvisioningCriteriaConstants.JSON_PROVISIONING_DEFINITIONS_PARAM) - .parameterAtIndexArray(ProvisioningCriteriaConstants.JSON_MAXIMUM_AGE_PARAM, i + 1).value(maximumAge).notNull() - .longZeroOrGreater(); - + baseDataValidator.reset().parameter(ProvisioningCriteriaConstants.JSON_MAXIMUM_AGE_PARAM) + .parameterAtIndexArray(ProvisioningCriteriaConstants.JSON_MAXIMUM_AGE_PARAM, i + 1).value(maximumAge).notNull() + .longGreaterThanNumber(ProvisioningCriteriaConstants.JSON_MINIMUM_AGE_PARAM, minimumAge, (i+1)); + BigDecimal provisioningpercentage = this.fromApiJsonHelper.extractBigDecimalNamed( ProvisioningCriteriaConstants.JSON_PROVISIONING_PERCENTAGE_PARAM, jsonObject, locale); baseDataValidator.reset().parameter(ProvisioningCriteriaConstants.JSON_PROVISIONING_DEFINITIONS_PARAM) diff --git a/mifosng-provider/src/main/java/org/mifosplatform/organisation/provisioning/service/ProvisioningCriteriaAssembler.java b/mifosng-provider/src/main/java/org/mifosplatform/organisation/provisioning/service/ProvisioningCriteriaAssembler.java index 3e798e98e..bcaa284e0 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/organisation/provisioning/service/ProvisioningCriteriaAssembler.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/organisation/provisioning/service/ProvisioningCriteriaAssembler.java @@ -23,6 +23,7 @@ import org.mifosplatform.organisation.provisioning.domain.ProvisioningCategory; import org.mifosplatform.organisation.provisioning.domain.ProvisioningCategoryRepository; import org.mifosplatform.organisation.provisioning.domain.ProvisioningCriteria; import org.mifosplatform.organisation.provisioning.domain.ProvisioningCriteriaDefinition; +import org.mifosplatform.organisation.provisioning.exception.ProvisioningCriteriaOverlappingDefinitionException; import org.mifosplatform.portfolio.loanproduct.domain.LoanProduct; import org.mifosplatform.portfolio.loanproduct.domain.LoanProductRepository; import org.mifosplatform.useradministration.domain.AppUser; @@ -68,6 +69,19 @@ public class ProvisioningCriteriaAssembler { return loanProducts ; } + private void validateRange(Set criteriaDefinitions) { + List def = new ArrayList<>() ; + def.addAll(criteriaDefinitions) ; + + for (int i = 0; i < def.size(); i++) { + for (int j = i + 1; j < def.size(); j++) { + if (def.get(i).isOverlapping(def.get(j))) { + throw new ProvisioningCriteriaOverlappingDefinitionException() ; + } + } + } + } + public ProvisioningCriteria fromParsedJson(final JsonElement jsonElement) { ProvisioningCriteria provisioningCriteria = createCriteria(jsonElement); final Locale locale = this.fromApiJsonHelper.extractLocaleParameter(jsonElement.getAsJsonObject()); @@ -82,7 +96,7 @@ public class ProvisioningCriteriaAssembler { provisioningCriteria); criteriaDefinitions.add(provisioningCriteriaData); } - + validateRange(criteriaDefinitions) ; Set mapping = new HashSet<>(); for (LoanProduct loanProduct : loanProducts) { mapping.add(new LoanProductProvisionCriteria(provisioningCriteria, loanProduct)); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/organisation/provisioning/service/ProvisioningCriteriaReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/organisation/provisioning/service/ProvisioningCriteriaReadPlatformServiceImpl.java index 724f95828..703b7c8f6 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/organisation/provisioning/service/ProvisioningCriteriaReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/organisation/provisioning/service/ProvisioningCriteriaReadPlatformServiceImpl.java @@ -117,7 +117,8 @@ public class ProvisioningCriteriaReadPlatformServiceImpl implements Provisioning private final StringBuilder sqlQuery = new StringBuilder() .append("pc.id, pc.criteria_id, pc.category_id, mpc.category_name, pc.min_age, pc.max_age, ") - .append("pc.provision_percentage, pc.liability_account, pc.expense_account, lia.gl_code as liabilitycode, expe.gl_code as expensecode ") + .append("pc.provision_percentage, pc.liability_account, pc.expense_account, lia.gl_code as liabilitycode, expe.gl_code as expensecode, ") + .append("lia.name as liabilityname, expe.name as expensename ") .append("from m_provisioning_criteria_definition as pc ") .append("LEFT JOIN acc_gl_account lia ON lia.id = pc.liability_account ") .append("LEFT JOIN acc_gl_account expe ON expe.id = pc.expense_account ") @@ -134,12 +135,14 @@ public class ProvisioningCriteriaReadPlatformServiceImpl implements Provisioning Long maxAge = rs.getLong("max_age"); BigDecimal provisioningPercentage = rs.getBigDecimal("provision_percentage"); Long liabilityAccount = rs.getLong("liability_account"); - Long expenseAccount = rs.getLong("expense_account"); String liabilityAccountCode = rs.getString("liabilitycode"); + String liabilityAccountName = rs.getString("liabilityname") ; + Long expenseAccount = rs.getLong("expense_account"); String expenseAccountCode = rs.getString("expensecode"); - + String expenseAccountName = rs.getString("expensename") ; + return new ProvisioningCriteriaDefinitionData(id, categoryId, categoryName, minAge, maxAge, provisioningPercentage, - liabilityAccount, expenseAccount, liabilityAccountCode, expenseAccountCode); + liabilityAccount, liabilityAccountCode, liabilityAccountName, expenseAccount, expenseAccountCode, expenseAccountName); } public String schema() { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/organisation/provisioning/service/ProvisioningCriteriaWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/organisation/provisioning/service/ProvisioningCriteriaWritePlatformServiceJpaRepositoryImpl.java index de0e7ca3f..e8551d046 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/organisation/provisioning/service/ProvisioningCriteriaWritePlatformServiceJpaRepositoryImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/organisation/provisioning/service/ProvisioningCriteriaWritePlatformServiceJpaRepositoryImpl.java @@ -123,9 +123,11 @@ public class ProvisioningCriteriaWritePlatformServiceJpaRepositoryImpl implement GLAccount liabilityAccount = glAccountRepository.findOne(liabilityAccountId); GLAccount expenseAccount = glAccountRepository.findOne(expenseAccountId); String categoryName = null ; + String liabilityAccountName = null ; + String expenseAccountName = null ; ProvisioningCriteriaDefinitionData data = new ProvisioningCriteriaDefinitionData(id, categoryId, categoryName, minimumAge, maximumAge, provisioningpercentage, - liabilityAccount.getId(), expenseAccount.getId(), liabilityAccount.getGlCode(), expenseAccount.getGlCode()) ; + liabilityAccount.getId(), liabilityAccount.getGlCode(), liabilityAccountName, expenseAccount.getId(), expenseAccount.getGlCode(), expenseAccountName) ; provisioningCriteria.update(data, liabilityAccount, expenseAccount) ; } } @@ -143,7 +145,7 @@ public class ProvisioningCriteriaWritePlatformServiceJpaRepositoryImpl implement + name + "` already exists", "category name", name); } logger.error(dve.getMessage(), dve); - throw new PlatformDataIntegrityException("error.msg.charge.unknown.data.integrity.issue", + throw new PlatformDataIntegrityException("error.msg.provisioning.unknown.data.integrity.issue", "Unknown data integrity issue with resource: " + realCause.getMessage()); } }