From 097189621f709ad15f23f14e01aa78022f5e306e Mon Sep 17 00:00:00 2001 From: Pramod Nuthakki Date: Fri, 24 Jan 2014 23:47:12 +0530 Subject: [PATCH 01/10] MIFOSX-827 corrected update loan charge functionality from modify application --- .../loanaccount/data/LoanChargeData.java | 34 +++++++++++++++++++ .../portfolio/loanaccount/domain/Loan.java | 6 ++-- .../loanaccount/domain/LoanCharge.java | 7 +++- ...WritePlatformServiceJpaRepositoryImpl.java | 26 ++++++++++++-- 4 files changed, 66 insertions(+), 7 deletions(-) diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanChargeData.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanChargeData.java index bbecea402..83d363b35 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanChargeData.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanChargeData.java @@ -221,6 +221,35 @@ public class LoanChargeData { this.loanId = chargeData.loanId; this.installmentChargeData = installmentChargeData; } + + public LoanChargeData(final Long id, final LocalDate dueAsOfDate, final BigDecimal amountOrPercentage) { + this.id = id; + this.chargeId = null; + this.name = null; + this.currency = null; + this.amount = null; + this.amountPaid = null; + this.amountWaived = null; + this.amountWrittenOff = null; + this.amountOutstanding = null; + this.chargeTimeType = null; + this.dueDate = dueAsOfDate; + this.chargeCalculationType = null; + this.percentage = null; + this.amountPercentageAppliedTo = null; + this.penalty = false; + this.chargePaymentMode = null; + this.paid = false; + this.waived = false; + this.amountOrPercentage = amountOrPercentage; + this.chargeOptions = null; + this.chargePayable = false; + this.loanId = null; + this.minCap = null; + this.maxCap = null; + this.installmentChargeData = null; + } + public boolean isChargePayable() { @@ -254,4 +283,9 @@ public class LoanChargeData { } return isInstalmentFee; } + + + public BigDecimal amountOrPercentage() { + return this.amountOrPercentage; + } } \ No newline at end of file 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 c70b4a681..546039e97 100644 --- 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 @@ -963,7 +963,7 @@ public class Loan extends AbstractPersistable { } public Map loanApplicationModification(final JsonCommand command, final Set possiblyModifedLoanCharges, - final Set possiblyModifedLoanCollateralItems, final AprCalculator aprCalculator) { + final Set possiblyModifedLoanCollateralItems, final AprCalculator aprCalculator, boolean isChargesModified) { final Map actualChanges = this.loanRepaymentScheduleDetail.updateLoanApplicationAttributes(command, aprCalculator); if (!actualChanges.isEmpty()) { @@ -1141,9 +1141,7 @@ public class Loan extends AbstractPersistable { final String chargesParamName = "charges"; if (command.parameterExists(chargesParamName)) { - final Set existingLoanCharges = charges(); - - if (!possiblyModifedLoanCharges.equals(existingLoanCharges)) { + if (isChargesModified) { actualChanges.put(chargesParamName, getLoanCharges(possiblyModifedLoanCharges)); actualChanges.put(chargesParamName, getLoanCharges(possiblyModifedLoanCharges)); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/LoanCharge.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/LoanCharge.java index 330d4fb80..4b847b9e3 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/LoanCharge.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/LoanCharge.java @@ -352,10 +352,10 @@ public class LoanCharge extends AbstractPersistable { loanCharge = percentageOf(this.amountPercentageAppliedTo); } this.amount = minimumAndMaximumCap(loanCharge); - this.amountOutstanding = calculateOutstanding(); break; } this.amountOrPercentage = amount; + this.amountOutstanding = calculateOutstanding(); if(this.loan !=null && isInstalmentFee()){ final Set chargePerInstallments = this.loan.generateInstallmentLoanCharges(this); if(this.loanInstallmentCharge.isEmpty()){ @@ -786,4 +786,9 @@ public class LoanCharge extends AbstractPersistable { public void setActive(boolean active) { this.active = active; } + + + public BigDecimal amountOrPercentage() { + return this.amountOrPercentage; + } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java index d78039c7d..db618cf78 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java @@ -7,6 +7,7 @@ package org.mifosplatform.portfolio.loanaccount.service; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -45,6 +46,7 @@ import org.mifosplatform.portfolio.fund.domain.Fund; import org.mifosplatform.portfolio.group.domain.Group; import org.mifosplatform.portfolio.group.domain.GroupRepositoryWrapper; import org.mifosplatform.portfolio.group.exception.GroupNotActiveException; +import org.mifosplatform.portfolio.loanaccount.data.LoanChargeData; import org.mifosplatform.portfolio.loanaccount.domain.DefaultLoanLifecycleStateMachine; import org.mifosplatform.portfolio.loanaccount.domain.Loan; import org.mifosplatform.portfolio.loanaccount.domain.LoanCharge; @@ -267,13 +269,33 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa if (!existingLoanApplication.isSubmittedAndPendingApproval()) { throw new LoanApplicationNotInSubmittedAndPendingApprovalStateCannotBeModified( loanId); } - + + final Set existingCharges = existingLoanApplication.charges(); + Map chargesMap = new HashMap(); + for(LoanCharge charge:existingCharges){ + LoanChargeData chargeData = new LoanChargeData(charge.getId(),charge.getDueLocalDate() ,charge.amountOrPercentage()); + chargesMap.put(charge.getId(), chargeData); + } + final Set possiblyModifedLoanCharges = this.loanChargeAssembler.fromParsedJson(command.parsedJson()); + boolean isChargeModified = false; + for(LoanCharge loanCharge : possiblyModifedLoanCharges){ + if(loanCharge.getId() == null){ + isChargeModified = true; + }else{ + LoanChargeData chargeData = chargesMap.get(loanCharge.getId()); + if(loanCharge.amountOrPercentage().compareTo(chargeData.amountOrPercentage()) != 0 || + (loanCharge.isSpecifiedDueDate() && !loanCharge.getDueLocalDate().equals(chargeData.getDueDate()))){ + isChargeModified = true; + } + } + } + final Set possiblyModifedLoanCollateralItems = this.loanCollateralAssembler .fromParsedJson(command.parsedJson()); final Map changes = existingLoanApplication.loanApplicationModification(command, possiblyModifedLoanCharges, - possiblyModifedLoanCollateralItems, this.aprCalculator); + possiblyModifedLoanCollateralItems, this.aprCalculator, isChargeModified); if (changes.containsKey("expectedDisbursementDate")) { this.loanAssembler.validateExpectedDisbursementForHolidayAndNonWorkingDay(existingLoanApplication); From f523339ca0c08e07b5ada8dde6b3757737959548 Mon Sep 17 00:00:00 2001 From: Vishwanath R Date: Mon, 27 Jan 2014 13:36:14 +0530 Subject: [PATCH 02/10] [MIFOSX-875] Unknown Data Integrity Issue has been fixed --- .../service/ClientWritePlatformServiceJpaRepositoryImpl.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/service/ClientWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/service/ClientWritePlatformServiceJpaRepositoryImpl.java index a6d89a2a8..ac800508c 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/service/ClientWritePlatformServiceJpaRepositoryImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/service/ClientWritePlatformServiceJpaRepositoryImpl.java @@ -125,6 +125,10 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP final String accountNo = command.stringValueOfParameterNamed("accountNo"); throw new PlatformDataIntegrityException("error.msg.client.duplicate.accountNo", "Client with accountNo `" + accountNo + "` already exists", "accountNo", accountNo); + } else if (realCause.getMessage().contains("mobile_no")) { + final String mobileNo = command.stringValueOfParameterNamed("mobileNo"); + throw new PlatformDataIntegrityException("error.msg.client.duplicate.mobileNo", "Client with mobileNo `" + mobileNo + + "` already exists", "mobileNo", mobileNo); } logAsErrorUnexpectedDataIntegrityException(dve); From 9f08539e595ec13fa1868bbc1b87d5f0f6ad7c2d Mon Sep 17 00:00:00 2001 From: Vishwanath R Date: Mon, 27 Jan 2014 18:01:04 +0530 Subject: [PATCH 03/10] [MIFOSX-876] AND [MIFOSX-877] has been fixed and resolved --- .../api/AccountTransfersApiResource.java | 2 +- .../group/service/SearchParameters.java | 45 +++++++++++++++---- .../loanaccount/api/LoansApiResource.java | 6 +-- .../service/LoanReadPlatformServiceImpl.java | 26 +++++++---- .../api/SavingsAccountsApiResource.java | 2 +- 5 files changed, 59 insertions(+), 22 deletions(-) diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/account/api/AccountTransfersApiResource.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/account/api/AccountTransfersApiResource.java index ed09fc841..44ec1ce32 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/account/api/AccountTransfersApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/account/api/AccountTransfersApiResource.java @@ -98,7 +98,7 @@ public class AccountTransfersApiResource { this.context.authenticatedUser().validateHasReadPermission(AccountTransfersApiConstants.ACCOUNT_TRANSFER_RESOURCE_NAME); - final SearchParameters searchParameters = SearchParameters.forLoans(sqlSearch, externalId, offset, limit, orderBy, sortOrder); + final SearchParameters searchParameters = SearchParameters.forAccountTransfer(sqlSearch, externalId, offset, limit, orderBy, sortOrder); final Page transfers = this.accountTransfersReadPlatformService.retrieveAll(searchParameters); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/SearchParameters.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/SearchParameters.java index bce69087c..305d73695 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/SearchParameters.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/SearchParameters.java @@ -20,6 +20,7 @@ public final class SearchParameters { private final Integer limit; private final String orderBy; private final String sortOrder; + private final String accountNo; @SuppressWarnings("unused") private final Long staffId; @@ -27,7 +28,8 @@ public final class SearchParameters { public static SearchParameters from(final String sqlSearch, final Long officeId, final String externalId, final String name, final String hierarchy) { final Long staffId = null; - return new SearchParameters(sqlSearch, officeId, externalId, name, hierarchy, null, null, null, null, null, null, staffId); + final String accountNo = null; + return new SearchParameters(sqlSearch, officeId, externalId, name, hierarchy, null, null, null, null, null, null, staffId, accountNo); } public static SearchParameters forClients(final String sqlSearch, final Long officeId, final String externalId, @@ -36,27 +38,29 @@ public final class SearchParameters { final Integer maxLimitAllowed = getCheckedLimit(limit); final Long staffId = null; + final String accountNo = null; return new SearchParameters(sqlSearch, officeId, externalId, displayName, hierarchy, firstname, lastname, offset, maxLimitAllowed, - orderBy, sortOrder, staffId); + orderBy, sortOrder, staffId, accountNo); } public static SearchParameters forGroups(final String sqlSearch, final Long officeId, final Long staffId, final String externalId, final String name, final String hierarchy, final Integer offset, final Integer limit, final String orderBy, final String sortOrder) { final Integer maxLimitAllowed = getCheckedLimit(limit); + final String accountNo = null; return new SearchParameters(sqlSearch, officeId, externalId, name, hierarchy, null, null, offset, maxLimitAllowed, orderBy, - sortOrder, staffId); + sortOrder, staffId, accountNo); } public static SearchParameters forLoans(final String sqlSearch, final String externalId, final Integer offset, final Integer limit, - final String orderBy, final String sortOrder) { + final String orderBy, final String sortOrder, final String accountNo) { final Integer maxLimitAllowed = getCheckedLimit(limit); final Long staffId = null; - return new SearchParameters(sqlSearch, null, externalId, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, staffId); + return new SearchParameters(sqlSearch, null, externalId, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, staffId, accountNo); } public static SearchParameters forJournalEntries(final Long officeId, final Integer offset, final Integer limit, final String orderBy, @@ -65,7 +69,7 @@ public final class SearchParameters { final Integer maxLimitAllowed = getCheckedLimit(limit); final Long staffId = null; - return new SearchParameters(null, officeId, null, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, staffId); + return new SearchParameters(null, officeId, null, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, staffId, null); } public static SearchParameters forPagination(final Integer offset, final Integer limit, final String orderBy, final String sortOrder) { @@ -73,12 +77,32 @@ public final class SearchParameters { final Integer maxLimitAllowed = getCheckedLimit(limit); final Long staffId = null; - return new SearchParameters(null, null, null, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, staffId); + return new SearchParameters(null, null, null, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, staffId, null); + } + + public static SearchParameters forSavings(final String sqlSearch, final String externalId, final Integer offset, final Integer limit, + final String orderBy, final String sortOrder) { + + final Integer maxLimitAllowed = getCheckedLimit(limit); + final Long staffId = null; + final String accountNo = null; + + return new SearchParameters(sqlSearch, null, externalId, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, staffId, accountNo); + } + + public static SearchParameters forAccountTransfer(final String sqlSearch, final String externalId, final Integer offset, final Integer limit, + final String orderBy, final String sortOrder) { + + final Integer maxLimitAllowed = getCheckedLimit(limit); + final Long staffId = null; + final String accountNo = null; + + return new SearchParameters(sqlSearch, null, externalId, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, staffId, accountNo); } private SearchParameters(final String sqlSearch, final Long officeId, final String externalId, final String name, final String hierarchy, final String firstname, final String lastname, final Integer offset, final Integer limit, - final String orderBy, final String sortOrder, final Long staffId) { + final String orderBy, final String sortOrder, final Long staffId, final String accountNo) { this.sqlSearch = sqlSearch; this.officeId = officeId; this.externalId = externalId; @@ -91,6 +115,7 @@ public final class SearchParameters { this.orderBy = orderBy; this.sortOrder = sortOrder; this.staffId = staffId; + this.accountNo = accountNo; } public boolean isOrderByRequested() { @@ -185,4 +210,8 @@ public final class SearchParameters { return this.staffId; } + public String getAccountNo() { + return this.accountNo; + } + } \ No newline at end of file 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 ad9f4025a..e98acf008 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 @@ -422,14 +422,14 @@ public class LoansApiResource { @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("sqlSearch") final String sqlSearch, - @QueryParam("externalId") final String externalId, + @QueryParam("externalId") final String externalId, // @QueryParam("underHierarchy") final String hierarchy, @QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit, - @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder) { + @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder, @QueryParam("accountNo") final String accountNo) { this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); - final SearchParameters searchParameters = SearchParameters.forLoans(sqlSearch, externalId, offset, limit, orderBy, sortOrder); + final SearchParameters searchParameters = SearchParameters.forLoans(sqlSearch, externalId, offset, limit, orderBy, sortOrder, accountNo); final Page loanBasicDetails = this.loanReadPlatformService.retrieveAll(searchParameters); 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 35e19aec5..7a1fc1362 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 @@ -11,6 +11,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.List; import org.apache.commons.lang.StringUtils; import org.joda.time.Days; @@ -209,12 +210,12 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { sqlBuilder.append(" join m_office o on o.id = c.office_id"); sqlBuilder.append(" left join m_office transferToOffice on transferToOffice.id = c.transfer_to_office_id "); sqlBuilder.append(" where ( o.hierarchy like ? or transferToOffice.hierarchy like ?)"); - - final Object[] objectArray = new Object[2]; - objectArray[0] = hierarchySearchString; - objectArray[1] = hierarchySearchString; + int arrayPos = 2; - + List extraCriterias = new ArrayList(); + extraCriterias.add(hierarchySearchString); + extraCriterias.add(hierarchySearchString); + String sqlQueryCriteria = searchParameters.getSqlSearch(); if (StringUtils.isNotBlank(sqlQueryCriteria)) { sqlQueryCriteria = sqlQueryCriteria.replaceAll("accountNo", "l.account_no"); @@ -222,8 +223,14 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { } if (StringUtils.isNotBlank(searchParameters.getExternalId())) { - sqlBuilder.append(" and l.external_id = ?"); - objectArray[arrayPos] = searchParameters.getExternalId(); + sqlBuilder.append(" and l.external_id = ?"); + extraCriterias.add(searchParameters.getExternalId()); + arrayPos = arrayPos + 1; + } + + if (StringUtils.isNotBlank(searchParameters.getAccountNo())) { + sqlBuilder.append(" and l.account_no = ?"); + extraCriterias.add(searchParameters.getAccountNo()); arrayPos = arrayPos + 1; } @@ -234,14 +241,15 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { sqlBuilder.append(' ').append(searchParameters.getSortOrder()); } } - + if (searchParameters.isLimited()) { sqlBuilder.append(" limit ").append(searchParameters.getLimit()); if (searchParameters.isOffset()) { sqlBuilder.append(" offset ").append(searchParameters.getOffset()); } } - + + final Object[] objectArray = extraCriterias.toArray(); final Object[] finalObjectArray = Arrays.copyOf(objectArray, arrayPos); final String sqlCountRows = "SELECT FOUND_ROWS()"; return this.paginationHelper.fetchPage(this.jdbcTemplate, sqlCountRows, sqlBuilder.toString(), finalObjectArray, diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/api/SavingsAccountsApiResource.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/api/SavingsAccountsApiResource.java index 2cbdb21c9..cbe41e378 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/api/SavingsAccountsApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/api/SavingsAccountsApiResource.java @@ -103,7 +103,7 @@ public class SavingsAccountsApiResource { this.context.authenticatedUser().validateHasReadPermission(SavingsApiConstants.SAVINGS_ACCOUNT_RESOURCE_NAME); - final SearchParameters searchParameters = SearchParameters.forLoans(sqlSearch, externalId, offset, limit, orderBy, sortOrder); + final SearchParameters searchParameters = SearchParameters.forSavings(sqlSearch, externalId, offset, limit, orderBy, sortOrder); final Page products = this.savingsAccountReadPlatformService.retrieveAll(searchParameters); From d46663c630828f4e65a6d8215d2d2261225d4579 Mon Sep 17 00:00:00 2001 From: Pramod Nuthakki Date: Tue, 28 Jan 2014 23:17:43 +0530 Subject: [PATCH 04/10] added disbursement charges to update summary job --- .../scheduledjobs/service/ScheduledJobRunnerServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mifosng-provider/src/main/java/org/mifosplatform/scheduledjobs/service/ScheduledJobRunnerServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/scheduledjobs/service/ScheduledJobRunnerServiceImpl.java index 9711b66b5..4ff510fb7 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/scheduledjobs/service/ScheduledJobRunnerServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/scheduledjobs/service/ScheduledJobRunnerServiceImpl.java @@ -60,8 +60,8 @@ public class ScheduledJobRunnerServiceImpl implements ScheduledJobRunnerService updateSqlBuilder.append("SUM(IFNULL(mr.interest_completed_derived,0)) as interest_repaid_derived,"); updateSqlBuilder.append("SUM(IFNULL(mr.interest_waived_derived,0)) as interest_waived_derived,"); updateSqlBuilder.append("SUM(IFNULL(mr.interest_writtenoff_derived,0)) as interest_writtenoff_derived,"); - updateSqlBuilder.append("SUM(IFNULL(mr.fee_charges_amount,0)) as fee_charges_charged_derived,"); - updateSqlBuilder.append("SUM(IFNULL(mr.fee_charges_completed_derived,0)) as fee_charges_repaid_derived,"); + updateSqlBuilder.append("SUM(IFNULL(mr.fee_charges_amount,0)) + IFNULL((select SUM(lc.amount) from m_loan_charge lc where lc.loan_id=ml.id and lc.is_active=1 and lc.charge_id=1),0) as fee_charges_charged_derived,"); + updateSqlBuilder.append("SUM(IFNULL(mr.fee_charges_completed_derived,0)) + IFNULL((select SUM(lc.amount_paid_derived) from m_loan_charge lc where lc.loan_id=ml.id and lc.is_active=1 and lc.charge_id=1),0) as fee_charges_repaid_derived,"); updateSqlBuilder.append("SUM(IFNULL(mr.fee_charges_waived_derived,0)) as fee_charges_waived_derived,"); updateSqlBuilder.append("SUM(IFNULL(mr.fee_charges_writtenoff_derived,0)) as fee_charges_writtenoff_derived,"); updateSqlBuilder.append("SUM(IFNULL(mr.penalty_charges_amount,0)) as penalty_charges_charged_derived,"); From d58d2482ce6dd5019f930b488314316b6c77219f Mon Sep 17 00:00:00 2001 From: Vishwas Babu A J Date: Wed, 29 Jan 2014 03:53:58 +0530 Subject: [PATCH 05/10] MIFOSX-879 correcting documentation issues --- api-docs/apiLive.htm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/api-docs/apiLive.htm b/api-docs/apiLive.htm index 087d6eece..5861617b8 100644 --- a/api-docs/apiLive.htm +++ b/api-docs/apiLive.htm @@ -2503,7 +2503,7 @@ GET https://DomainName/api/v1/clients/{clientId}
clients?offset=10&limit=50

-
clients?orderBy=displayName,sortOrder=DESC
+
clients?orderBy=displayName&sortOrder=DESC
@@ -3663,7 +3663,7 @@ GET https://DomainName/mifosng-provider/api/v1/centers/9?associations=groupMembe
centers?offset=10&limit=50

-
centers?orderBy=name,sortOrder=DESC
+
centers?orderBy=name&sortOrder=DESC
@@ -4579,7 +4579,7 @@ DELETE groups/2
groups?offset=10&limit=50

-
groups?orderBy=name,sortOrder=DESC
+
groups?orderBy=name&sortOrder=DESC
@@ -5473,7 +5473,7 @@ GET https://DomainName/api/v1/loans/{loanId}
loans?offset=10&limit=50

-
loans?orderBy=accountNo,sortOrder=DESC
+
loans?orderBy=accountNo&sortOrder=DESC
@@ -20454,7 +20454,7 @@ No Request Body:
journalentries?offset=10&limit=50

-
journalentries?orderBy=transactionId,sortOrder=DESC
+
journalentries?orderBy=transactionId&sortOrder=DESC

journalentries?runningBalance=true

From 133e4e4d9084e41ff9d0eb72d35000768ea6f075 Mon Sep 17 00:00:00 2001 From: Vishwas Babu A J Date: Sat, 8 Feb 2014 16:54:52 +0530 Subject: [PATCH 06/10] MifosX-872 optionally capture payment type for a manual journal entry --- api-docs/apiLive.htm | 38 ++++++++++++- ...yment_detail_id_in_ac_gl_journal_entry.sql | 3 + .../api/JournalEntryJsonInputParams.java | 3 +- .../command/JournalEntryCommand.java | 25 ++++++-- .../journalentry/domain/JournalEntry.java | 22 +++++-- ...alEntryCommandFromApiJsonDeserializer.java | 10 +++- .../service/AccountingProcessorHelper.java | 39 +++++++------ ...WritePlatformServiceJpaRepositoryImpl.java | 57 +++++++++++-------- 8 files changed, 144 insertions(+), 53 deletions(-) create mode 100644 mifosng-db/migrations/core_db/V140_1__added_payment_detail_id_in_ac_gl_journal_entry.sql diff --git a/api-docs/apiLive.htm b/api-docs/apiLive.htm index 5861617b8..eae601083 100644 --- a/api-docs/apiLive.htm +++ b/api-docs/apiLive.htm @@ -12699,6 +12699,12 @@ Content-Type: application/json Allows passing multiple credit entries for the accounting rule + + paymentTypeId + + + Allows passing multiple credit entries for the accounting rule +
@@ -20354,6 +20360,21 @@ No Request Body: Additional details of transaction like payment details and notes . + + paymentTypeId + + + Maps to a Code value of a system defined Code with the name "PaymentType". This is used to optionally identify the mode of payment (Ex: checks, Cash etc) associated with a Journal Entry + + + + accountNumber, checkNumber, routingCode, receiptNumber, bankNumber + + + Various properties associated with a payment type + + @@ -20614,6 +20635,15 @@ GET https://DomainName/api/v1/journalentries?transactionId=PB37X8Y21EQUY4S +
+ + + + + + + +
Optional Fields
paymentTypeId, accountNumber, checkNumber, routingCode, receiptNumber, bankNumber
@@ -20639,7 +20669,13 @@ Request Body: "amount":5000}, {"glAccountId":4, "amount":5000} - ] + ], +"paymentTypeId": "12", +"accountNumber": "accno123", +"checkNumber": "chec123", +"routingCode": "rou123", +"receiptNumber": "rec123", +"bankNumber": "ban123" } diff --git a/mifosng-db/migrations/core_db/V140_1__added_payment_detail_id_in_ac_gl_journal_entry.sql b/mifosng-db/migrations/core_db/V140_1__added_payment_detail_id_in_ac_gl_journal_entry.sql new file mode 100644 index 000000000..8bdc81b23 --- /dev/null +++ b/mifosng-db/migrations/core_db/V140_1__added_payment_detail_id_in_ac_gl_journal_entry.sql @@ -0,0 +1,3 @@ +ALTER TABLE `acc_gl_journal_entry` + ADD COLUMN `payment_details_id` BIGINT(20) NULL AFTER `organization_running_balance`, + ADD CONSTRAINT `FK_acc_gl_journal_entry_m_payment_detail` FOREIGN KEY (`payment_details_id`) REFERENCES `m_payment_detail` (`id`); \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/api/JournalEntryJsonInputParams.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/api/JournalEntryJsonInputParams.java index bb09ed89c..b45ebb489 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/api/JournalEntryJsonInputParams.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/api/JournalEntryJsonInputParams.java @@ -14,7 +14,8 @@ import java.util.Set; public enum JournalEntryJsonInputParams { OFFICE_ID("officeId"), TRANSACTION_DATE("transactionDate"), COMMENTS("comments"), CREDITS("credits"), DEBITS("debits"), LOCALE("locale"), DATE_FORMAT( "dateFormat"), REFERENCE_NUMBER("referenceNumber"), USE_ACCOUNTING_RULE("useAccountingRule"), ACCOUNTING_RULE("accountingRule"), AMOUNT( - "amount"), CURRENCY_CODE("currencyCode"); + "amount"), CURRENCY_CODE("currencyCode"), PAYMENT_TYPE_ID("paymentTypeId"), ACCOUNT_NUMBER("accountNumber"), CHECK_NUMBER( + "checkNumber"), ROUTING_CODE("routingCode"), RECEIPT_NUMBER("receiptNumber"), BANK_NUMBER("bankNumber"); private final String value; diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/command/JournalEntryCommand.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/command/JournalEntryCommand.java index e5e63be61..c35b4aaff 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/command/JournalEntryCommand.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/command/JournalEntryCommand.java @@ -27,13 +27,25 @@ public class JournalEntryCommand { private final String referenceNumber; private final Long accountingRuleId; private final BigDecimal amount; + private final Long paymentTypeId; + @SuppressWarnings("unused") + private final String accountNumber; + @SuppressWarnings("unused") + private final String checkNumber; + @SuppressWarnings("unused") + private final String receiptNumber; + @SuppressWarnings("unused") + private final String bankNumber; + @SuppressWarnings("unused") + private final String routingCode; private final SingleDebitOrCreditEntryCommand[] credits; private final SingleDebitOrCreditEntryCommand[] debits; public JournalEntryCommand(final Long officeId, final String currencyCode, final LocalDate transactionDate, final String comments, final SingleDebitOrCreditEntryCommand[] credits, final SingleDebitOrCreditEntryCommand[] debits, final String referenceNumber, - final Long accountingRuleId, final BigDecimal amount) { + final Long accountingRuleId, final BigDecimal amount, final Long paymentTypeId, final String accountNumber, + final String checkNumber, final String receiptNumber, final String bankNumber, final String routingCode) { this.officeId = officeId; this.currencyCode = currencyCode; this.transactionDate = transactionDate; @@ -43,6 +55,13 @@ public class JournalEntryCommand { this.referenceNumber = referenceNumber; this.accountingRuleId = accountingRuleId; this.amount = amount; + this.paymentTypeId = paymentTypeId; + this.accountNumber = accountNumber; + this.checkNumber = checkNumber; + this.receiptNumber = receiptNumber; + this.bankNumber = bankNumber; + this.routingCode = routingCode; + } public void validateForCreate() { @@ -63,9 +82,7 @@ public class JournalEntryCommand { baseDataValidator.reset().parameter("accountingRule").value(this.accountingRuleId).ignoreIfNull().longGreaterThanZero(); - baseDataValidator.reset().parameter("credits").value(this.credits).ignoreIfNull(); - - baseDataValidator.reset().parameter("debits").value(this.debits).ignoreIfNull(); + baseDataValidator.reset().parameter("paymentTypeId").value(this.paymentTypeId).ignoreIfNull().longGreaterThanZero(); // validation for credit array elements if (this.credits != null) { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/domain/JournalEntry.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/domain/JournalEntry.java index 75c8a63ab..31c69f75b 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/domain/JournalEntry.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/domain/JournalEntry.java @@ -22,6 +22,7 @@ import org.mifosplatform.accounting.glaccount.domain.GLAccount; import org.mifosplatform.infrastructure.core.domain.AbstractAuditableCustom; import org.mifosplatform.organisation.office.domain.Office; import org.mifosplatform.portfolio.loanaccount.domain.LoanTransaction; +import org.mifosplatform.portfolio.paymentdetail.domain.PaymentDetail; import org.mifosplatform.portfolio.savings.domain.SavingsAccountTransaction; import org.mifosplatform.useradministration.domain.AppUser; @@ -32,11 +33,15 @@ public class JournalEntry extends AbstractAuditableCustom { @ManyToOne @JoinColumn(name = "office_id", nullable = false) private Office office; - + + @ManyToOne(optional = true) + @JoinColumn(name = "payment_details_id", nullable = true) + private PaymentDetail paymentDetail; + @ManyToOne @JoinColumn(name = "account_id", nullable = false) private GLAccount glAccount; - + @Column(name = "currency_code", length = 3, nullable = false) private String currencyCode; @@ -82,12 +87,12 @@ public class JournalEntry extends AbstractAuditableCustom { @Column(name = "ref_num") private String referenceNumber; - - public static JournalEntry createNew(final Office office, final GLAccount glAccount, final String currencyCode, + + public static JournalEntry createNew(final Office office, final PaymentDetail paymentDetail, final GLAccount glAccount, final String currencyCode, final String transactionId, final boolean manualEntry, final Date transactionDate, final JournalEntryType journalEntryType, final BigDecimal amount, final String description, final Integer entityType, final Long entityId, final String referenceNumber, final LoanTransaction loanTransaction, final SavingsAccountTransaction savingsTransaction) { - return new JournalEntry(office, glAccount, currencyCode, transactionId, manualEntry, transactionDate, journalEntryType.getValue(), + return new JournalEntry(office, paymentDetail, glAccount, currencyCode, transactionId, manualEntry, transactionDate, journalEntryType.getValue(), amount, description, entityType, entityId, referenceNumber, loanTransaction, savingsTransaction); } @@ -95,7 +100,7 @@ public class JournalEntry extends AbstractAuditableCustom { // } - public JournalEntry(final Office office, final GLAccount glAccount, final String currencyCode, final String transactionId, + public JournalEntry(final Office office, final PaymentDetail paymentDetail, final GLAccount glAccount, final String currencyCode, final String transactionId, final boolean manualEntry, final Date transactionDate, final Integer type, final BigDecimal amount, final String description, final Integer entityType, final Long entityId, final String referenceNumber, final LoanTransaction loanTransaction, final SavingsAccountTransaction savingsTransaction) { @@ -115,6 +120,7 @@ public class JournalEntry extends AbstractAuditableCustom { this.currencyCode = currencyCode; this.loanTransaction = loanTransaction; this.savingsTransaction = savingsTransaction; + this.paymentDetail=paymentDetail; } public boolean isDebitEntry() { @@ -166,5 +172,9 @@ public class JournalEntry extends AbstractAuditableCustom { public SavingsAccountTransaction getSavingsTransaction() { return this.savingsTransaction; } + + public PaymentDetail getPaymentDetails(){ + return this.paymentDetail; + } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/serialization/JournalEntryCommandFromApiJsonDeserializer.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/serialization/JournalEntryCommandFromApiJsonDeserializer.java index c4b02edd4..b0c496497 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/serialization/JournalEntryCommandFromApiJsonDeserializer.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/serialization/JournalEntryCommandFromApiJsonDeserializer.java @@ -68,6 +68,14 @@ public final class JournalEntryCommandFromApiJsonDeserializer extends AbstractFr final BigDecimal amount = this.fromApiJsonHelper.extractBigDecimalNamed(JournalEntryJsonInputParams.AMOUNT.getValue(), element, locale); + final Long paymentTypeId = this.fromApiJsonHelper.extractLongNamed(JournalEntryJsonInputParams.PAYMENT_TYPE_ID.getValue(), element); + final String accountNumber = this.fromApiJsonHelper.extractStringNamed(JournalEntryJsonInputParams.ACCOUNT_NUMBER.getValue(), + element); + final String checkNumber = this.fromApiJsonHelper.extractStringNamed(JournalEntryJsonInputParams.CHECK_NUMBER.getValue(), element); + final String receiptNumber = this.fromApiJsonHelper.extractStringNamed(JournalEntryJsonInputParams.RECEIPT_NUMBER.getValue(), + element); + final String bankNumber = this.fromApiJsonHelper.extractStringNamed(JournalEntryJsonInputParams.BANK_NUMBER.getValue(), element); + final String routingCode = this.fromApiJsonHelper.extractStringNamed(JournalEntryJsonInputParams.ROUTING_CODE.getValue(), element); SingleDebitOrCreditEntryCommand[] credits = null; SingleDebitOrCreditEntryCommand[] debits = null; @@ -82,7 +90,7 @@ public final class JournalEntryCommandFromApiJsonDeserializer extends AbstractFr } } return new JournalEntryCommand(officeId, currencyCode, transactionDate, comments, credits, debits, referenceNumber, - accountingRuleId, amount); + accountingRuleId, amount, paymentTypeId, accountNumber, checkNumber, receiptNumber, bankNumber, routingCode); } /** diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/AccountingProcessorHelper.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/AccountingProcessorHelper.java index 585cdcd9e..4bf1e82ed 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/AccountingProcessorHelper.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/AccountingProcessorHelper.java @@ -41,6 +41,7 @@ import org.mifosplatform.organisation.office.domain.OfficeRepository; import org.mifosplatform.portfolio.loanaccount.data.LoanTransactionEnumData; import org.mifosplatform.portfolio.loanaccount.domain.LoanTransaction; import org.mifosplatform.portfolio.loanaccount.domain.LoanTransactionRepository; +import org.mifosplatform.portfolio.paymentdetail.domain.PaymentDetail; import org.mifosplatform.portfolio.savings.data.SavingsAccountTransactionEnumData; import org.mifosplatform.portfolio.savings.domain.SavingsAccountTransaction; import org.mifosplatform.portfolio.savings.domain.SavingsAccountTransactionRepository; @@ -467,7 +468,7 @@ public class AccountingProcessorHelper { totalAmount); } } - + public LoanTransaction getLoanTransactionById(final long loanTransactionId) { return this.loanTransactionRepository.findOne(loanTransactionId); } @@ -492,14 +493,15 @@ public class AccountingProcessorHelper { final boolean manualEntry = false; LoanTransaction loanTransaction = null; SavingsAccountTransaction savingsAccountTransaction = null; + final PaymentDetail paymentDetail = null; String modifiedTransactionId = transactionId; - if(StringUtils.isNumeric(transactionId)){ + if (StringUtils.isNumeric(transactionId)) { long id = Long.parseLong(transactionId); loanTransaction = this.loanTransactionRepository.findOne(id); - modifiedTransactionId = LOAN_TRANSACTION_IDENTIFIER + transactionId ; + modifiedTransactionId = LOAN_TRANSACTION_IDENTIFIER + transactionId; } - final JournalEntry journalEntry = JournalEntry.createNew(office, account, currencyCode, modifiedTransactionId, manualEntry, - transactionDate, JournalEntryType.CREDIT, amount, null, PortfolioProductType.LOAN.getValue(), loanId, null, + final JournalEntry journalEntry = JournalEntry.createNew(office, paymentDetail, account, currencyCode, modifiedTransactionId, + manualEntry, transactionDate, JournalEntryType.CREDIT, amount, null, PortfolioProductType.LOAN.getValue(), loanId, null, loanTransaction, savingsAccountTransaction); this.glJournalEntryRepository.saveAndFlush(journalEntry); } @@ -509,15 +511,16 @@ public class AccountingProcessorHelper { final boolean manualEntry = false; LoanTransaction loanTransaction = null; SavingsAccountTransaction savingsAccountTransaction = null; + final PaymentDetail paymentDetail = null; String modifiedTransactionId = transactionId; - if(StringUtils.isNumeric(transactionId)){ + if (StringUtils.isNumeric(transactionId)) { long id = Long.parseLong(transactionId); savingsAccountTransaction = this.savingsAccountTransactionRepository.findOne(id); modifiedTransactionId = SAVINGS_TRANSACTION_IDENTIFIER + transactionId; } - final JournalEntry journalEntry = JournalEntry.createNew(office, account, currencyCode, modifiedTransactionId, manualEntry, - transactionDate, JournalEntryType.CREDIT, amount, null, PortfolioProductType.SAVING.getValue(), savingsId, null, - loanTransaction, savingsAccountTransaction); + final JournalEntry journalEntry = JournalEntry.createNew(office, paymentDetail, account, currencyCode, modifiedTransactionId, + manualEntry, transactionDate, JournalEntryType.CREDIT, amount, null, PortfolioProductType.SAVING.getValue(), savingsId, + null, loanTransaction, savingsAccountTransaction); this.glJournalEntryRepository.saveAndFlush(journalEntry); } @@ -526,14 +529,15 @@ public class AccountingProcessorHelper { final boolean manualEntry = false; LoanTransaction loanTransaction = null; SavingsAccountTransaction savingsAccountTransaction = null; + final PaymentDetail paymentDetail = null; String modifiedTransactionId = transactionId; - if(StringUtils.isNumeric(transactionId)){ + if (StringUtils.isNumeric(transactionId)) { long id = Long.parseLong(transactionId); loanTransaction = this.loanTransactionRepository.findOne(id); modifiedTransactionId = LOAN_TRANSACTION_IDENTIFIER + transactionId; } - final JournalEntry journalEntry = JournalEntry.createNew(office, account, currencyCode, modifiedTransactionId, manualEntry, - transactionDate, JournalEntryType.DEBIT, amount, null, PortfolioProductType.LOAN.getValue(), loanId, null, + final JournalEntry journalEntry = JournalEntry.createNew(office, paymentDetail, account, currencyCode, modifiedTransactionId, + manualEntry, transactionDate, JournalEntryType.DEBIT, amount, null, PortfolioProductType.LOAN.getValue(), loanId, null, loanTransaction, savingsAccountTransaction); this.glJournalEntryRepository.saveAndFlush(journalEntry); } @@ -543,15 +547,16 @@ public class AccountingProcessorHelper { final boolean manualEntry = false; LoanTransaction loanTransaction = null; SavingsAccountTransaction savingsAccountTransaction = null; + final PaymentDetail paymentDetail = null; String modifiedTransactionId = transactionId; - if(StringUtils.isNumeric(transactionId)){ + if (StringUtils.isNumeric(transactionId)) { long id = Long.parseLong(transactionId); savingsAccountTransaction = this.savingsAccountTransactionRepository.findOne(id); - modifiedTransactionId = SAVINGS_TRANSACTION_IDENTIFIER + transactionId ; + modifiedTransactionId = SAVINGS_TRANSACTION_IDENTIFIER + transactionId; } - final JournalEntry journalEntry = JournalEntry.createNew(office, account, currencyCode, modifiedTransactionId, manualEntry, - transactionDate, JournalEntryType.DEBIT, amount, null, PortfolioProductType.SAVING.getValue(), savingsId, null, - loanTransaction, savingsAccountTransaction); + final JournalEntry journalEntry = JournalEntry.createNew(office, paymentDetail, account, currencyCode, modifiedTransactionId, + manualEntry, transactionDate, JournalEntryType.DEBIT, amount, null, PortfolioProductType.SAVING.getValue(), savingsId, + null, loanTransaction, savingsAccountTransaction); this.glJournalEntryRepository.saveAndFlush(journalEntry); } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/JournalEntryWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/JournalEntryWritePlatformServiceJpaRepositoryImpl.java index 41cc38794..432e891a5 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/JournalEntryWritePlatformServiceJpaRepositoryImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/JournalEntryWritePlatformServiceJpaRepositoryImpl.java @@ -8,6 +8,7 @@ package org.mifosplatform.accounting.journalentry.service; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -44,6 +45,8 @@ import org.mifosplatform.organisation.office.domain.Office; import org.mifosplatform.organisation.office.domain.OfficeRepository; import org.mifosplatform.organisation.office.domain.OrganisationCurrencyRepositoryWrapper; import org.mifosplatform.organisation.office.exception.OfficeNotFoundException; +import org.mifosplatform.portfolio.paymentdetail.domain.PaymentDetail; +import org.mifosplatform.portfolio.paymentdetail.service.PaymentDetailWritePlatformService; import org.mifosplatform.useradministration.domain.AppUser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -69,6 +72,7 @@ public class JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa private final GLAccountReadPlatformService glAccountReadPlatformService; private final OrganisationCurrencyRepositoryWrapper organisationCurrencyRepository; private final PlatformSecurityContext context; + private final PaymentDetailWritePlatformService paymentDetailWritePlatformService; @Autowired public JournalEntryWritePlatformServiceJpaRepositoryImpl(final GLClosureRepository glClosureRepository, @@ -78,8 +82,8 @@ public class JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa final AccountingProcessorForLoanFactory accountingProcessorForLoanFactory, final AccountingProcessorForSavingsFactory accountingProcessorForSavingsFactory, final GLAccountReadPlatformService glAccountReadPlatformService, - final OrganisationCurrencyRepositoryWrapper organisationCurrencyRepository, - final PlatformSecurityContext context) { + final OrganisationCurrencyRepositoryWrapper organisationCurrencyRepository, final PlatformSecurityContext context, + final PaymentDetailWritePlatformService paymentDetailWritePlatformService) { this.glClosureRepository = glClosureRepository; this.officeRepository = officeRepository; this.glJournalEntryRepository = glJournalEntryRepository; @@ -92,6 +96,7 @@ public class JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa this.glAccountReadPlatformService = glAccountReadPlatformService; this.organisationCurrencyRepository = organisationCurrencyRepository; this.context = context; + this.paymentDetailWritePlatformService = paymentDetailWritePlatformService; } @Transactional @@ -111,6 +116,10 @@ public class JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa validateBusinessRulesForJournalEntries(journalEntryCommand); + /** Capture payment details **/ + final Map changes = new LinkedHashMap(); + final PaymentDetail paymentDetail = this.paymentDetailWritePlatformService.createAndPersistPaymentDetail(command, changes); + /** Set a transaction Id and save these Journal entries **/ final Date transactionDate = command.DateValueOfParameterNamed(JournalEntryJsonInputParams.TRANSACTION_DATE.getValue()); final String transactionId = generateTransactionId(officeId); @@ -130,13 +139,13 @@ public class JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa checkDebitAndCreditAmounts(journalEntryCommand.getCredits(), journalEntryCommand.getDebits()); } - saveAllDebitOrCreditEntries(journalEntryCommand, office, currencyCode, transactionDate, + saveAllDebitOrCreditEntries(journalEntryCommand, office, paymentDetail, currencyCode, transactionDate, journalEntryCommand.getCredits(), transactionId, JournalEntryType.CREDIT, referenceNumber); } else { final GLAccount creditAccountHead = accountingRule.getAccountToCredit(); validateGLAccountForTransaction(creditAccountHead); validateDebitOrCreditArrayForExistingGLAccount(creditAccountHead, journalEntryCommand.getCredits()); - saveAllDebitOrCreditEntries(journalEntryCommand, office, currencyCode, transactionDate, + saveAllDebitOrCreditEntries(journalEntryCommand, office, paymentDetail, currencyCode, transactionDate, journalEntryCommand.getCredits(), transactionId, JournalEntryType.CREDIT, referenceNumber); } @@ -149,22 +158,22 @@ public class JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa checkDebitAndCreditAmounts(journalEntryCommand.getCredits(), journalEntryCommand.getDebits()); } - saveAllDebitOrCreditEntries(journalEntryCommand, office, currencyCode, transactionDate, + saveAllDebitOrCreditEntries(journalEntryCommand, office, paymentDetail, currencyCode, transactionDate, journalEntryCommand.getDebits(), transactionId, JournalEntryType.DEBIT, referenceNumber); } else { final GLAccount debitAccountHead = accountingRule.getAccountToDebit(); validateGLAccountForTransaction(debitAccountHead); validateDebitOrCreditArrayForExistingGLAccount(debitAccountHead, journalEntryCommand.getDebits()); - saveAllDebitOrCreditEntries(journalEntryCommand, office, currencyCode, transactionDate, + saveAllDebitOrCreditEntries(journalEntryCommand, office, paymentDetail, currencyCode, transactionDate, journalEntryCommand.getDebits(), transactionId, JournalEntryType.DEBIT, referenceNumber); } } else { - saveAllDebitOrCreditEntries(journalEntryCommand, office, currencyCode, transactionDate, journalEntryCommand.getDebits(), - transactionId, JournalEntryType.DEBIT, referenceNumber); + saveAllDebitOrCreditEntries(journalEntryCommand, office, paymentDetail, currencyCode, transactionDate, + journalEntryCommand.getDebits(), transactionId, JournalEntryType.DEBIT, referenceNumber); - saveAllDebitOrCreditEntries(journalEntryCommand, office, currencyCode, transactionDate, journalEntryCommand.getCredits(), - transactionId, JournalEntryType.CREDIT, referenceNumber); + saveAllDebitOrCreditEntries(journalEntryCommand, office, paymentDetail, currencyCode, transactionDate, + journalEntryCommand.getCredits(), transactionId, JournalEntryType.CREDIT, referenceNumber); } @@ -276,15 +285,15 @@ public class JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa final String reversalComment = "Reversal entry for Journal Entry with Entry Id :" + journalEntry.getId() + " and transaction Id " + command.getTransactionId(); if (journalEntry.isDebitEntry()) { - reversalJournalEntry = JournalEntry.createNew(journalEntry.getOffice(), journalEntry.getGlAccount(), - journalEntry.getCurrencyCode(), reversalTransactionId, manualEntry, journalEntry.getTransactionDate(), - JournalEntryType.CREDIT, journalEntry.getAmount(), reversalComment, null, null, journalEntry.getReferenceNumber(), - journalEntry.getLoanTransaction(), journalEntry.getSavingsTransaction()); + reversalJournalEntry = JournalEntry.createNew(journalEntry.getOffice(), journalEntry.getPaymentDetails(), + journalEntry.getGlAccount(), journalEntry.getCurrencyCode(), reversalTransactionId, manualEntry, + journalEntry.getTransactionDate(), JournalEntryType.CREDIT, journalEntry.getAmount(), reversalComment, null, null, + journalEntry.getReferenceNumber(), journalEntry.getLoanTransaction(), journalEntry.getSavingsTransaction()); } else { - reversalJournalEntry = JournalEntry.createNew(journalEntry.getOffice(), journalEntry.getGlAccount(), - journalEntry.getCurrencyCode(), reversalTransactionId, manualEntry, journalEntry.getTransactionDate(), - JournalEntryType.DEBIT, journalEntry.getAmount(), reversalComment, null, null, journalEntry.getReferenceNumber(), - journalEntry.getLoanTransaction(), journalEntry.getSavingsTransaction()); + reversalJournalEntry = JournalEntry.createNew(journalEntry.getOffice(), journalEntry.getPaymentDetails(), + journalEntry.getGlAccount(), journalEntry.getCurrencyCode(), reversalTransactionId, manualEntry, + journalEntry.getTransactionDate(), JournalEntryType.DEBIT, journalEntry.getAmount(), reversalComment, null, null, + journalEntry.getReferenceNumber(), journalEntry.getLoanTransaction(), journalEntry.getSavingsTransaction()); } // save the reversal entry this.glJournalEntryRepository.saveAndFlush(reversalJournalEntry); @@ -355,9 +364,10 @@ public class JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa checkDebitAndCreditAmounts(credits, debits); } - private void saveAllDebitOrCreditEntries(final JournalEntryCommand command, final Office office, final String currencyCode, - final Date transactionDate, final SingleDebitOrCreditEntryCommand[] singleDebitOrCreditEntryCommands, - final String transactionId, final JournalEntryType type, final String referenceNumber) { + private void saveAllDebitOrCreditEntries(final JournalEntryCommand command, final Office office, final PaymentDetail paymentDetail, + final String currencyCode, final Date transactionDate, + final SingleDebitOrCreditEntryCommand[] singleDebitOrCreditEntryCommands, final String transactionId, + final JournalEntryType type, final String referenceNumber) { final boolean manualEntry = true; for (final SingleDebitOrCreditEntryCommand singleDebitOrCreditEntryCommand : singleDebitOrCreditEntryCommands) { final GLAccount glAccount = this.glAccountRepository.findOne(singleDebitOrCreditEntryCommand.getGlAccountId()); @@ -373,8 +383,9 @@ public class JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa /** Validate current code is appropriate **/ this.organisationCurrencyRepository.findOneWithNotFoundDetection(currencyCode); - final JournalEntry glJournalEntry = JournalEntry.createNew(office, glAccount, currencyCode, transactionId, manualEntry, - transactionDate, type, singleDebitOrCreditEntryCommand.getAmount(), comments, null, null, referenceNumber, null, null); + final JournalEntry glJournalEntry = JournalEntry.createNew(office, paymentDetail, glAccount, currencyCode, transactionId, + manualEntry, transactionDate, type, singleDebitOrCreditEntryCommand.getAmount(), comments, null, null, referenceNumber, + null, null); this.glJournalEntryRepository.saveAndFlush(glJournalEntry); } } From 6fccaa82dadd58db9620c3f8364eb297dc0a1e5a Mon Sep 17 00:00:00 2001 From: sumit-gupta-sgt Date: Wed, 29 Jan 2014 16:20:46 +0530 Subject: [PATCH 07/10] Fix for Mifosx-814 Mifos-814 Add User for sendPasswordToEmail false --- api-docs/apiLive.htm | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/api-docs/apiLive.htm b/api-docs/apiLive.htm index eae601083..875546d1a 100644 --- a/api-docs/apiLive.htm +++ b/api-docs/apiLive.htm @@ -18987,7 +18987,7 @@ GET https://DomainName/api/v1/users/{userId}
Mandatory Fields
- username, firstname, lastname, email, officeId, roles + username, firstname, lastname, email, officeId, roles, sendPasswordToEmail
@@ -19005,13 +19005,36 @@ Request body: "lastname": "User", "email": "whatever@mifos.org", "officeId": 1, - "roles": [2,3] + "roles": [2,3], + "sendPasswordToEmail": true } { "officeId": 1, "resourceId": 11 +} + + +POST users +Content-Type: application/json +Request body: +{ + "username": "newuser", + "firstname": "Test", + "lastname": "User", + "email": "whatever@mifos.org", + "officeId": 1, + "roles": [2,3], + "sendPasswordToEmail": false, + "password": "123", + "repeatPassword": "123" +} + + +{ + "officeId": 1, + "resourceId": 12 } From a7b4f774985bb703714ad15681195f0ec1a6391b Mon Sep 17 00:00:00 2001 From: Madhukar Date: Wed, 12 Feb 2014 13:25:14 +0530 Subject: [PATCH 08/10] MIFOSX-911 Update Api doc issues --- api-docs/apiLive.htm | 6 +++--- .../portfolio/client/api/ClientApiConstants.java | 13 +++++++++---- .../portfolio/client/data/ClientDataValidator.java | 2 -- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/api-docs/apiLive.htm b/api-docs/apiLive.htm index 875546d1a..154891c96 100644 --- a/api-docs/apiLive.htm +++ b/api-docs/apiLive.htm @@ -2499,7 +2499,7 @@ GET https://DomainName/api/v1/clients/{clientId}

Example Requests:

clients

-
clients?fields=displayName,officeName,joinedDate
+
clients?fields=displayName,officeName,timeline

clients?offset=10&limit=50

@@ -3486,7 +3486,7 @@ PUT centers/8 Content-Type: application/json Request Body: { - "name": "First Center (No groups)", + "name": "First Center (No groups)" }
@@ -5853,7 +5853,7 @@ Request Body: "interestCalculationPeriodType": 1, "transactionProcessingStrategyId": 1, "expectedDisbursementDate": "10 Jun 2013", - "submittedOnDate": "10 Jun 2013" + "submittedOnDate": "10 Jun 2013", "linkAccountId" : "1" } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/api/ClientApiConstants.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/api/ClientApiConstants.java index aa53e669f..c038651b9 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/api/ClientApiConstants.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/api/ClientApiConstants.java @@ -43,9 +43,14 @@ public class ClientApiConstants { public static final String hierarchyParamName = "hierarchy"; public static final String displayNameParamName = "displayName"; public static final String officeNameParamName = "officeName"; + public static final String staffNameParamName = "staffName"; public static final String trasnferOfficeNameParamName = "transferOfficeName"; + public static final String transferToOfficeNameParamName = "transferToOfficeName"; + public static final String transferToOfficeIdParamName = "transferToOfficeId"; public static final String imageKeyParamName = "imageKey"; + public static final String imageIdParamName = "imageId"; public static final String imagePresentParamName = "imagePresent"; + public static final String timelineParamName = "timeline"; // associations related part of response public static final String groupsParamName = "groups"; @@ -69,10 +74,10 @@ public class ClientApiConstants { * match those of request parameters. */ public static final Set CLIENT_RESPONSE_DATA_PARAMETERS = new HashSet(Arrays.asList(idParamName, accountNoParamName, - externalIdParamName, mobileNoParamName, statusParamName, activeParamName, activationDateParamName, firstnameParamName, middlenameParamName, - lastnameParamName, fullnameParamName, displayNameParamName, officeIdParamName, officeNameParamName, transferOfficeIdParamName, - trasnferOfficeNameParamName, hierarchyParamName, imageKeyParamName, imagePresentParamName, groupsParamName, - officeOptionsParamName, staffOptionsParamName)); + externalIdParamName, statusParamName, activeParamName, activationDateParamName, firstnameParamName, middlenameParamName, + lastnameParamName, fullnameParamName, displayNameParamName, mobileNoParamName, officeIdParamName, officeNameParamName, + transferToOfficeIdParamName, transferToOfficeNameParamName, hierarchyParamName, imageIdParamName, imagePresentParamName, + staffIdParamName, staffNameParamName, timelineParamName, groupsParamName, officeOptionsParamName, staffOptionsParamName)); public static final Set ACTIVATION_REQUEST_DATA_PARAMETERS = new HashSet(Arrays.asList(localeParamName, dateFormatParamName, activationDateParamName)); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/data/ClientDataValidator.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/data/ClientDataValidator.java index caff2cb07..02fc6b67b 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/data/ClientDataValidator.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/data/ClientDataValidator.java @@ -261,8 +261,6 @@ public final class ClientDataValidator { baseDataValidator.reset().parameter(ClientApiConstants.idParamName).failWithCode(".no.name.details.passed"); } - } else { - baseDataValidator.reset().parameter(ClientApiConstants.idParamName).failWithCode(".no.name.details.passed"); } } From 61236ae24923a0b4731e3711419078fff5c39c9a Mon Sep 17 00:00:00 2001 From: Vishwas Babu A J Date: Sun, 23 Feb 2014 16:29:59 -0800 Subject: [PATCH 09/10] Update CHANGELOG.md for 1.17.1 release --- CHANGELOG.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7fa5ed0f8..d88c39706 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,8 @@ See VERSIONING (https://github.com/openMF/mifosx/blob/master/VERSIONING.md) for Releases =============== -1. 17 Dec 2013 - 1.17.0.RELEASE +1. 21 Feb 2014 - 1.17.1.RELEASE +1. 17 Jan 2014 - 1.17.0.RELEASE 1. 29 Dec 2013 - 1.16.1.RELEASE 1. 15 Dec 2013 - 1.16.0.RELEASE 1. 12 Dec 2013 - 1.15.2.RELEASE @@ -56,6 +57,21 @@ Releases 1. 05 April 2013 - 0.11.1.beta 1. 05 April 2013 - 0.11.0.beta +1.17.1.RELEASE +============= +Bug Release + +Bugs + - [MIFOSX-827] - Not able to disburse loan with the percentage charges applied while submitting the loan application. + - [MIFOSX-860] - NOt able to reject the loan application with status "Submitted and pending for approval" + - [MIFOSX-873] - Get clients by office id API is returing HTTP Status 500 + - [MIFOSX-875] - Attach duplicate mobile number while creating Client results in Unknown Data Integrity Issue + - [MIFOSX-876] - Retrieve Loan by Loan account number returns all loan account in API + - [MIFOSX-878] - Not able to use created datatable for a client results in Forbidden error + - [MIFOSX-882] - API doccument related Issues + - [MIFOSX-883] - Additional fields added in Edit datatables (for client) page is not woking as expected + - [MIFOSX-912] - Client Loan amount is not getting rounded off even if "Currency in Multiples Of" is set as 100 in loan product. + 1.17.0.RELEASE ============= Feature Release From 219bd33adf99a12319f0e01a4044df742c79d5c9 Mon Sep 17 00:00:00 2001 From: Vishwas Babu A J Date: Sun, 23 Feb 2014 16:35:24 -0800 Subject: [PATCH 10/10] updating gradle properties for 1.17.1 release --- mifosng-provider/gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mifosng-provider/gradle.properties b/mifosng-provider/gradle.properties index 3bf87e2e2..65d5716d8 100644 --- a/mifosng-provider/gradle.properties +++ b/mifosng-provider/gradle.properties @@ -1,4 +1,4 @@ -releaseVersion=1.17.0.RELEASE +releaseVersion=1.17.1.RELEASE