diff --git a/api-docs/apiLive.htm b/api-docs/apiLive.htm
index 05feee8c6..f9e121a9e 100644
--- a/api-docs/apiLive.htm
+++ b/api-docs/apiLive.htm
@@ -5882,6 +5882,7 @@ GET https://DomainName/api/v1/loans/{loanId}/transactions/template"
"total": {
"currencyCode": "XOF",
"digitsAfterDecimal": 0,
+ "inMulitplesOf": 0,
"amount": 471,
"defaultName": "CFA Franc BCEAO",
"nameCode": "currency.XOF",
@@ -7427,6 +7428,13 @@ Request Body:
| Override the currency default value for digitsAfterDecimal. |
+
+ | inMulitplesOf |
+
+
+ | Override the default value for rounding currency to multiples of value provided. |
+
+
| principal |
@@ -8107,7 +8115,7 @@ GET https://DomainName/api/v1/loanproducts/{productId}
Mandatory Fields |
- | name, currencyCode, digitsAfterDecimal, principal,
+ | name, currencyCode, digitsAfterDecimal, inMulitplesOf, principal,
numberOfRepayments, repaymentEvery, repaymentFrequencyType,
interestRatePerPeriod, interestRateFrequencyType, amortizationType, interestType,
interestCalculationPeriodType, transactionProcessingStrategyId,
@@ -8152,6 +8160,7 @@ Request Body:
"currencyCode": "USD",
"locale": "en_GB",
"digitsAfterDecimal": "2",
+ "inMulitplesOf": 0,
"principal": "100,000.00",
"numberOfRepayments": "12",
"repaymentEvery": "1",
@@ -8181,6 +8190,7 @@ Request Body:
"currencyCode": "USD",
"locale": "en_GB",
"digitsAfterDecimal": "2",
+ "inMulitplesOf": 0,
"principal": "100,000.00",
"numberOfRepayments": "12",
"repaymentEvery": "1",
@@ -8237,6 +8247,7 @@ Request Body:
"currencyCode": "USD",
"locale": "en_GB",
"digitsAfterDecimal": "2",
+ "inMulitplesOf": 0,
"principal": "100,000.00",
"numberOfRepayments": "12",
"repaymentEvery": "1",
@@ -11109,6 +11120,9 @@ Content-Type: application/json
|
| digitsAfterDecimal |
| Override the currency default value for digitsAfterDecimal. |
+ | inMulitplesOf |
+ | Override the default value for rounding currency to multiples of provided value. |
+
| nominalAnnualInterestRate |
| The default interest rate set when creating savings accounts of this type of product. e.g. 5% Per year - It number here is always expressed as the Nominal APR. |
@@ -11655,7 +11669,7 @@ Content-Type: application/json
Mandatory Fields |
- | name, description, currencyCode, digitsAfterDecimal, nominalAnnualInterestRate,
+ | name, description, currencyCode, digitsAfterDecimal,inMulitplesOf, nominalAnnualInterestRate,
interestCompoundingPeriodType, interestCalculationType, interestCalculationDaysInYearType,accountingRule |
@@ -11682,6 +11696,7 @@ Request Body:
"description": "Daily compounding using Daily Balance, 5% per year, 365 days in year",
"currencyCode": "USD",
"digitsAfterDecimal": 2,
+ "inMulitplesOf": 0,
"locale": "en",
"nominalAnnualInterestRate": "5.0",
"interestCompoundingPeriodType": 1,
@@ -11705,6 +11720,7 @@ Request Body:
"description": "A savings product",
"currencyCode": "USD",
"digitsAfterDecimal": "2",
+ "inMulitplesOf": 0,
"nominalAnnualInterestRate": "15",
"interestCompoundingPeriodType": "1",
"interestPostingPeriodType": "4",
@@ -12888,6 +12904,71 @@ No Request Body:
+
+
+
+
Retrieve Savings Account Transaction:
+
This is a convenience resource. It can be useful when building maintenance user interface screens for client applications. The template data returned consists of any or all of:
+
+ - Field Defaults
+ - Allowed Value Lists
+
+
+
Example Requests:
+
savingsaccounts/1/transactions/1
+
+
+
+ GET https://Domain Name/api/v1/savingsaccounts/{accountId}/transactions/{transactionId}
+
+
+{
+ "id": 1,
+ "transactionType": {
+ "id": 2,
+ "code": "savingsAccountTransactionType.withdrawal",
+ "value": "Withdrawal",
+ "deposit": false,
+ "withdrawal": true,
+ "interestPosting": false,
+ "feeDeduction": false
+ },
+ "accountId": 1,
+ "accountNo": "000000001",
+ "date": [
+ 2013,
+ 8,
+ 7
+ ],
+ "currency": {
+ "code": "USD",
+ "name": "US Dollar",
+ "decimalPlaces": 2,
+ "inMulitplesOf": 0,
+ "displaySymbol": "$",
+ "nameCode": "currency.USD",
+ "displayLabel": "US Dollar ($)"
+ },
+ "paymentDetailData": {
+ "id": 62,
+ "paymentType": {
+ "id": 11,
+ "name": "cash"
+ },
+ "accountNumber": "",
+ "checkNumber": "",
+ "routingCode": "",
+ "receiptNumber": "",
+ "bankNumber": ""
+ },
+ "amount": 5000,
+ "runningBalance": 0,
+ "reversed": true
+}
+
+
+
+
@@ -12970,6 +13051,49 @@ No Request Body:
+
+
+
+
Adjust Transaction
+
This command modifies the given transaction.
+
+
+ POST https://Domain Name/api/v1/savingsaccounts/{accountsId}/transactions/{transactionId}?command=modify
+ POST savingsaccounts/1/transactions/1?command=modify
+Content-Type: application/json
+No Request Body:
+{
+ "locale": "en",
+ "dateFormat": "dd MMMM yyyy",
+ "transactionDate": "27 May 2013",
+ "transactionAmount": "500",
+ "paymentTypeId": "14",
+ "accountNumber": "acc123",
+ "checkNumber": "che123",
+ "routingCode": "rou123",
+ "receiptNumber": "rec123",
+ "bankNumber": "ban123"
+}
+
+
+{
+ "officeId": 1,
+ "clientId": 2,
+ "savingsId": 1,
+ "resourceId": 48,
+ "changes": {
+ "accountNumber": "acc123",
+ "checkNumber": "che123",
+ "routingCode": "rou123",
+ "receiptNumber": "rec123",
+ "bankNumber": "ban123"
+ }
+}
+
+
+
+
+
@@ -19699,6 +19823,14 @@ GET https://DomainName/api/v1/search?query=000000111
|
|
+
+ |
+ savingsaccounts/{accountId}/transactions/{transactionId}?command=modify |
+ Adjust transaction |
+ |
+ |
+ |
+
|
savingsaccounts/{accountId}/transactions/template |
@@ -19707,6 +19839,14 @@ GET https://DomainName/api/v1/search?query=000000111
|
|
+
+ |
+ savingsaccounts/{accountId}/transactions/{transactionId} |
+ |
+ Retrieve savings account transaction |
+ |
+ |
+
| Account Transfers |
accounttransfers/ |
diff --git a/mifosng-db/migrations/core_db/V99__added_currency_roundof_for_multipleof.sql b/mifosng-db/migrations/core_db/V99__added_currency_roundof_for_multipleof.sql
new file mode 100755
index 000000000..571335a04
--- /dev/null
+++ b/mifosng-db/migrations/core_db/V99__added_currency_roundof_for_multipleof.sql
@@ -0,0 +1,12 @@
+ALTER TABLE `m_savings_account`
+ ADD COLUMN `currency_multiplesof` SMALLINT(5) NULL AFTER `currency_digits`;
+ALTER TABLE `m_savings_product`
+ ADD COLUMN `currency_multiplesof` SMALLINT(5) NULL AFTER `currency_digits`;
+ALTER TABLE `m_loan`
+ ADD COLUMN `currency_multiplesof` SMALLINT(5) NULL AFTER `currency_digits`;
+ALTER TABLE `m_product_loan`
+ ADD COLUMN `currency_multiplesof` SMALLINT(5) NULL AFTER `currency_digits`;
+ALTER TABLE `m_currency`
+ ADD COLUMN `currency_multiplesof` SMALLINT(5) NULL AFTER `decimal_places`;
+ALTER TABLE `m_organisation_currency`
+ ADD COLUMN `currency_multiplesof` SMALLINT(5) NULL AFTER `decimal_places`;
\ No newline at end of file
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/organisation/monetary/data/CurrencyData.java b/mifosng-provider/src/main/java/org/mifosplatform/organisation/monetary/data/CurrencyData.java
index f5621a9f0..9e321e7c2 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/organisation/monetary/data/CurrencyData.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/organisation/monetary/data/CurrencyData.java
@@ -13,6 +13,7 @@ public class CurrencyData {
private final String code;
private final String name;
private final int decimalPlaces;
+ private final Integer inMulitplesOf;
private final String displaySymbol;
@SuppressWarnings("unused")
private final String nameCode;
@@ -20,13 +21,14 @@ public class CurrencyData {
private final String displayLabel;
public static CurrencyData blank() {
- return new CurrencyData("", "", 0, "", "");
+ return new CurrencyData("", "", 0,0, "", "");
}
- public CurrencyData(final String code, final String name, final int decimalPlaces, final String displaySymbol, final String nameCode) {
+ public CurrencyData(final String code, final String name, final int decimalPlaces,final Integer inMulitplesOf, final String displaySymbol, final String nameCode) {
this.code = code;
this.name = name;
this.decimalPlaces = decimalPlaces;
+ this.inMulitplesOf = inMulitplesOf;
this.displaySymbol = displaySymbol;
this.nameCode = nameCode;
this.displayLabel = generateDisplayLabel();
@@ -40,6 +42,10 @@ public class CurrencyData {
return this.decimalPlaces;
}
+ public Integer currencyInMulitplesOf() {
+ return this.inMulitplesOf;
+ }
+
@Override
public boolean equals(Object obj) {
CurrencyData currencyData = (CurrencyData) obj;
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/organisation/monetary/domain/ApplicationCurrency.java b/mifosng-provider/src/main/java/org/mifosplatform/organisation/monetary/domain/ApplicationCurrency.java
index bdf28007d..270c57acf 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/organisation/monetary/domain/ApplicationCurrency.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/organisation/monetary/domain/ApplicationCurrency.java
@@ -23,6 +23,9 @@ public class ApplicationCurrency extends AbstractPersistable {
@Column(name = "decimal_places", nullable = false)
private final Integer decimalPlaces;
+ @Column(name = "currency_multiplesof")
+ private final Integer inMulitplesOf;
+
@Column(name = "name", nullable = false, length = 50)
private final String name;
@@ -36,19 +39,22 @@ public class ApplicationCurrency extends AbstractPersistable {
this.code = null;
this.name = null;
this.decimalPlaces = null;
+ this.inMulitplesOf = null;
this.nameCode = null;
this.displaySymbol = null;
}
- public static ApplicationCurrency from(final ApplicationCurrency currency, final int decimalPlaces) {
- return new ApplicationCurrency(currency.code, currency.name, decimalPlaces, currency.nameCode, currency.displaySymbol);
+ public static ApplicationCurrency from(final ApplicationCurrency currency, final int decimalPlaces, final Integer inMulitplesOf) {
+ return new ApplicationCurrency(currency.code, currency.name, decimalPlaces, inMulitplesOf, currency.nameCode,
+ currency.displaySymbol);
}
- private ApplicationCurrency(final String code, final String name, final int decimalPlaces, final String nameCode,
- final String displaySymbol) {
+ private ApplicationCurrency(final String code, final String name, final int decimalPlaces, final Integer inMulitplesOf,
+ final String nameCode, final String displaySymbol) {
this.code = code;
this.name = name;
this.decimalPlaces = decimalPlaces;
+ this.inMulitplesOf = inMulitplesOf;
this.nameCode = nameCode;
this.displaySymbol = displaySymbol;
}
@@ -65,6 +71,10 @@ public class ApplicationCurrency extends AbstractPersistable {
return this.decimalPlaces;
}
+ public Integer getCurrencyInMulitplesOf() {
+ return this.inMulitplesOf;
+ }
+
public String getNameCode() {
return nameCode;
}
@@ -74,14 +84,14 @@ public class ApplicationCurrency extends AbstractPersistable {
}
public CurrencyData toData() {
- return new CurrencyData(this.code, this.name, this.decimalPlaces, this.displaySymbol, this.nameCode);
+ return new CurrencyData(this.code, this.name, this.decimalPlaces, this.inMulitplesOf, this.displaySymbol, this.nameCode);
}
- public CurrencyData toData(final int digitsAfterDecimalSupported) {
- return new CurrencyData(this.code, this.name, digitsAfterDecimalSupported, this.displaySymbol, this.nameCode);
+ public CurrencyData toData(final int digitsAfterDecimalSupported, final Integer inMulitplesOf) {
+ return new CurrencyData(this.code, this.name, digitsAfterDecimalSupported, inMulitplesOf, this.displaySymbol, this.nameCode);
}
public OrganisationCurrency toOrganisationCurrency() {
- return new OrganisationCurrency(this.code, this.name, this.decimalPlaces, this.nameCode, this.displaySymbol);
+ return new OrganisationCurrency(this.code, this.name, this.decimalPlaces,this.inMulitplesOf, this.nameCode, this.displaySymbol);
}
}
\ No newline at end of file
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/organisation/monetary/domain/ApplicationCurrencyRepositoryWrapper.java b/mifosng-provider/src/main/java/org/mifosplatform/organisation/monetary/domain/ApplicationCurrencyRepositoryWrapper.java
index b5d8a94c0..313ed0683 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/organisation/monetary/domain/ApplicationCurrencyRepositoryWrapper.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/organisation/monetary/domain/ApplicationCurrencyRepositoryWrapper.java
@@ -38,7 +38,7 @@ public class ApplicationCurrencyRepositoryWrapper {
if (defaultApplicationCurrency == null) { throw new CurrencyNotFoundException(currency.getCode()); }
final ApplicationCurrency applicationCurrency = ApplicationCurrency.from(defaultApplicationCurrency,
- currency.getDigitsAfterDecimal());
+ currency.getDigitsAfterDecimal(),currency.getCurrencyInMulitplesOf());
return applicationCurrency;
}
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/organisation/monetary/domain/MonetaryCurrency.java b/mifosng-provider/src/main/java/org/mifosplatform/organisation/monetary/domain/MonetaryCurrency.java
index 46f5eb196..7f5bd0f99 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/organisation/monetary/domain/MonetaryCurrency.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/organisation/monetary/domain/MonetaryCurrency.java
@@ -17,18 +17,23 @@ public class MonetaryCurrency {
@Column(name = "currency_digits", nullable = false)
private final int digitsAfterDecimal;
+ @Column(name = "currency_multiplesof")
+ private final Integer inMulitplesOf;
+
protected MonetaryCurrency() {
this.code = null;
this.digitsAfterDecimal = 0;
+ this.inMulitplesOf = 0;
}
- public MonetaryCurrency(final String code, final int digitsAfterDecimal) {
+ public MonetaryCurrency(final String code, final int digitsAfterDecimal,final Integer inMulitplesOf) {
this.code = code;
this.digitsAfterDecimal = digitsAfterDecimal;
+ this.inMulitplesOf = inMulitplesOf;
}
public MonetaryCurrency copy() {
- return new MonetaryCurrency(this.code, this.digitsAfterDecimal);
+ return new MonetaryCurrency(this.code, this.digitsAfterDecimal,this.inMulitplesOf);
}
public String getCode() {
@@ -38,4 +43,8 @@ public class MonetaryCurrency {
public int getDigitsAfterDecimal() {
return digitsAfterDecimal;
}
+
+ public Integer getCurrencyInMulitplesOf() {
+ return inMulitplesOf;
+ }
}
\ No newline at end of file
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/organisation/monetary/domain/Money.java b/mifosng-provider/src/main/java/org/mifosplatform/organisation/monetary/domain/Money.java
index 9b2f2402c..13c71263c 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/organisation/monetary/domain/Money.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/organisation/monetary/domain/Money.java
@@ -21,6 +21,9 @@ public class Money implements Comparable {
@Column(name = "currency_digits")
private final int currencyDigitsAfterDecimal;
+ @Column(name = "currency_multiplesof")
+ private final Integer inMulitplesOf;
+
@Column(name = "amount", scale = 6, precision = 19)
private final BigDecimal amount;
@@ -44,46 +47,47 @@ public class Money implements Comparable {
}
public static Money of(final MonetaryCurrency currency, final BigDecimal newAmount) {
- return new Money(currency.getCode(), currency.getDigitsAfterDecimal(), defaultToZeroIfNull(newAmount));
+ return new Money(currency.getCode(), currency.getDigitsAfterDecimal(), defaultToZeroIfNull(newAmount),
+ currency.getCurrencyInMulitplesOf());
}
public static Money zero(final MonetaryCurrency currency) {
- return new Money(currency.getCode(), currency.getDigitsAfterDecimal(), BigDecimal.ZERO);
+ return new Money(currency.getCode(), currency.getDigitsAfterDecimal(), BigDecimal.ZERO, currency.getCurrencyInMulitplesOf());
}
protected Money() {
this.currencyCode = null;
this.currencyDigitsAfterDecimal = 0;
+ this.inMulitplesOf = 0;
this.amount = null;
}
- private Money(final String currencyCode, final int digitsAfterDecimal, final BigDecimal amount) {
+ private Money(final String currencyCode, final int digitsAfterDecimal, final BigDecimal amount, final Integer inMulitplesOf) {
this.currencyCode = currencyCode;
this.currencyDigitsAfterDecimal = digitsAfterDecimal;
+ this.inMulitplesOf = inMulitplesOf;
final BigDecimal amountZeroed = defaultToZeroIfNull(amount);
final BigDecimal amountStripped = amountZeroed.stripTrailingZeros();
final BigDecimal amountScaled = amountStripped.setScale(this.currencyDigitsAfterDecimal, RoundingMode.HALF_EVEN);
- this.amount = amountScaled;
- // TODO - KW - below was test of using floor/ceil functions to support
- // round monetary amounts into multiples of say 20/50.
- // if (this.currencyDigitsAfterDecimal == 0) {
- // double existingVal = amountScaled.doubleValue();
- // double ceilingOfValue = ceiling(existingVal, Double.valueOf("20.0"));
- // double floorOfValue = floor(existingVal, Double.valueOf("20.0"));
- //
- // double floorDiff = existingVal - floorOfValue;
- // double ceilDiff = ceilingOfValue - existingVal;
- //
- // if (ceilDiff > floorDiff) {
- // this.amount = BigDecimal.valueOf(floorOfValue);
- // } else {
- // this.amount = BigDecimal.valueOf(ceilingOfValue);
- // }
- // } else {
- // this.amount = amountScaled;
- // }
+ // round monetary amounts into multiplesof say 20/50.
+ if (inMulitplesOf!= null && this.currencyDigitsAfterDecimal == 0 && inMulitplesOf>0 && amountScaled.doubleValue()>0) {
+ double existingVal = amountScaled.doubleValue();
+ double ceilingOfValue = ceiling(existingVal, inMulitplesOf);
+ double floorOfValue = floor(existingVal, inMulitplesOf);
+
+ double floorDiff = existingVal - floorOfValue;
+ double ceilDiff = ceilingOfValue - existingVal;
+
+ if (ceilDiff > floorDiff) {
+ this.amount = BigDecimal.valueOf(floorOfValue);
+ } else {
+ this.amount = BigDecimal.valueOf(ceilingOfValue);
+ }
+ } else {
+ this.amount = amountScaled;
+ }
}
public static double ceiling(final double n, final double s) {
@@ -119,7 +123,7 @@ public class Money implements Comparable {
}
public Money copy() {
- return new Money(this.currencyCode, this.currencyDigitsAfterDecimal, this.amount.stripTrailingZeros());
+ return new Money(this.currencyCode, this.currencyDigitsAfterDecimal, this.amount.stripTrailingZeros(), this.inMulitplesOf);
}
public Money plus(final Iterable extends Money> moniesToAdd) {
@@ -263,6 +267,10 @@ public class Money implements Comparable {
return this.currencyDigitsAfterDecimal;
}
+ public int getCurrencyInMulitplesOf() {
+ return this.inMulitplesOf;
+ }
+
public BigDecimal getAmount() {
return this.amount;
}
@@ -298,7 +306,7 @@ public class Money implements Comparable {
}
private MonetaryCurrency monetaryCurrency() {
- return new MonetaryCurrency(this.currencyCode, this.currencyDigitsAfterDecimal);
+ return new MonetaryCurrency(this.currencyCode, this.currencyDigitsAfterDecimal, this.inMulitplesOf);
}
public Money zero() {
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/organisation/monetary/service/CurrencyReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/organisation/monetary/service/CurrencyReadPlatformServiceImpl.java
index 661a58bc8..475ba34e4 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/organisation/monetary/service/CurrencyReadPlatformServiceImpl.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/organisation/monetary/service/CurrencyReadPlatformServiceImpl.java
@@ -58,14 +58,15 @@ public class CurrencyReadPlatformServiceImpl implements CurrencyReadPlatformServ
final String code = rs.getString("code");
final String name = rs.getString("name");
final int decimalPlaces = JdbcSupport.getInteger(rs, "decimalPlaces");
+ final Integer inMulitplesOf = JdbcSupport.getInteger(rs, "inMulitplesOf");
final String displaySymbol = rs.getString("displaySymbol");
final String nameCode = rs.getString("nameCode");
- return new CurrencyData(code, name, decimalPlaces, displaySymbol, nameCode);
+ return new CurrencyData(code, name, decimalPlaces, inMulitplesOf, displaySymbol, nameCode);
}
public String schema() {
- return " c.code as code, c.name as name, c.decimal_places as decimalPlaces, c.display_symbol as displaySymbol, c.internationalized_name_code as nameCode ";
+ return " c.code as code, c.name as name, c.decimal_places as decimalPlaces,c.currency_multiplesof as inMulitplesOf, c.display_symbol as displaySymbol, c.internationalized_name_code as nameCode ";
}
}
}
\ No newline at end of file
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/organisation/office/api/OfficeTransactionsApiResource.java b/mifosng-provider/src/main/java/org/mifosplatform/organisation/office/api/OfficeTransactionsApiResource.java
index 1fc5490e7..babdcbddf 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/organisation/office/api/OfficeTransactionsApiResource.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/organisation/office/api/OfficeTransactionsApiResource.java
@@ -41,7 +41,7 @@ import org.springframework.stereotype.Component;
public class OfficeTransactionsApiResource {
private static final Set RESPONSE_DATA_PARAMETERS = new HashSet(Arrays.asList("id", "transactionDate", "fromOfficeId",
- "fromOfficeName", "toOfficeId", "toOfficeIdName", "currencyCode", "digitsAfterDecimal", "transactionAmount", "description",
+ "fromOfficeName", "toOfficeId", "toOfficeIdName", "currencyCode", "digitsAfterDecimal","inMulitplesOf", "transactionAmount", "description",
"allowedOffices", "currencyOptions"));
private final String resourceNameForReadPermissions = "OFFICE";
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/organisation/office/domain/OrganisationCurrency.java b/mifosng-provider/src/main/java/org/mifosplatform/organisation/office/domain/OrganisationCurrency.java
index d824ee431..17204a9d3 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/organisation/office/domain/OrganisationCurrency.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/organisation/office/domain/OrganisationCurrency.java
@@ -18,18 +18,27 @@ import org.springframework.data.jpa.domain.AbstractPersistable;
@Table(name = "m_organisation_currency")
public class OrganisationCurrency extends AbstractPersistable {
+ @SuppressWarnings("unused")
@Column(name = "code", nullable = false, length = 3)
private final String code;
+ @SuppressWarnings("unused")
@Column(name = "decimal_places", nullable = false)
private final Integer decimalPlaces;
+ @SuppressWarnings("unused")
+ @Column(name = "currency_multiplesof")
+ private final Integer inMulitplesOf;
+
+ @SuppressWarnings("unused")
@Column(name = "name", nullable = false, length = 50)
private final String name;
+ @SuppressWarnings("unused")
@Column(name = "internationalized_name_code", nullable = false, length = 50)
private final String nameCode;
+ @SuppressWarnings("unused")
@Column(name = "display_symbol", nullable = true, length = 10)
private final String displaySymbol;
@@ -37,15 +46,17 @@ public class OrganisationCurrency extends AbstractPersistable {
this.code = null;
this.name = null;
this.decimalPlaces = null;
+ this.inMulitplesOf = null;
this.nameCode = null;
this.displaySymbol = null;
}
- public OrganisationCurrency(final String code, final String name, final int decimalPlaces, final String nameCode,
- final String displaySymbol) {
+ public OrganisationCurrency(final String code, final String name, final int decimalPlaces, final Integer inMulitplesOf,
+ final String nameCode, final String displaySymbol) {
this.code = code;
this.name = name;
this.decimalPlaces = decimalPlaces;
+ this.inMulitplesOf = inMulitplesOf;
this.nameCode = nameCode;
this.displaySymbol = displaySymbol;
}
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/organisation/office/service/OfficeReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/organisation/office/service/OfficeReadPlatformServiceImpl.java
index 564da7eee..af7d04979 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/organisation/office/service/OfficeReadPlatformServiceImpl.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/organisation/office/service/OfficeReadPlatformServiceImpl.java
@@ -90,7 +90,7 @@ public class OfficeReadPlatformServiceImpl implements OfficeReadPlatformService
public String schema() {
return " ot.id as id, ot.transaction_date as transactionDate, ot.from_office_id as fromOfficeId, fromoff.name as fromOfficeName, "
+ " ot.to_office_id as toOfficeId, tooff.name as toOfficeName, ot.transaction_amount as transactionAmount, ot.description as description, "
- + " ot.currency_code as currencyCode, rc.decimal_places as currencyDigits, "
+ + " ot.currency_code as currencyCode, rc.decimal_places as currencyDigits, rc.currency_multiplesof as inMulitplesOf, "
+ " rc.name as currencyName, rc.internationalized_name_code as currencyNameCode, rc.display_symbol as currencyDisplaySymbol "
+ " from m_office_transaction ot "
+ " left join m_office fromoff on fromoff.id = ot.from_office_id "
@@ -112,9 +112,10 @@ public class OfficeReadPlatformServiceImpl implements OfficeReadPlatformService
String currencyNameCode = rs.getString("currencyNameCode");
String currencyDisplaySymbol = rs.getString("currencyDisplaySymbol");
Integer currencyDigits = JdbcSupport.getInteger(rs, "currencyDigits");
+ Integer inMulitplesOf = JdbcSupport.getInteger(rs, "inMulitplesOf");
- CurrencyData currencyData = new CurrencyData(currencyCode, currencyName, currencyDigits, currencyDisplaySymbol,
- currencyNameCode);
+ CurrencyData currencyData = new CurrencyData(currencyCode, currencyName, currencyDigits, inMulitplesOf,
+ currencyDisplaySymbol, currencyNameCode);
BigDecimal transactionAmount = rs.getBigDecimal("transactionAmount");
String description = rs.getString("description");
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/organisation/office/service/OfficeWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/organisation/office/service/OfficeWritePlatformServiceJpaRepositoryImpl.java
index e926ea009..840b02ffc 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/organisation/office/service/OfficeWritePlatformServiceJpaRepositoryImpl.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/organisation/office/service/OfficeWritePlatformServiceJpaRepositoryImpl.java
@@ -159,7 +159,7 @@ public class OfficeWritePlatformServiceJpaRepositoryImpl implements OfficeWriteP
final String currencyCode = command.stringValueOfParameterNamed("currencyCode");
final ApplicationCurrency appCurrency = this.applicationCurrencyRepository.findOneWithNotFoundDetection(currencyCode);
- final MonetaryCurrency currency = new MonetaryCurrency(appCurrency.getCode(), appCurrency.getDecimalPlaces());
+ final MonetaryCurrency currency = new MonetaryCurrency(appCurrency.getCode(), appCurrency.getDecimalPlaces(),appCurrency.getCurrencyInMulitplesOf());
final Money amount = Money.of(currency, command.bigDecimalValueOfParameterNamed("transactionAmount"));
final OfficeTransaction entity = OfficeTransaction.fromJson(fromOffice, toOffice, amount, command);
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/accountdetails/service/AccountDetailsReadPlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/accountdetails/service/AccountDetailsReadPlatformServiceJpaRepositoryImpl.java
index f707853be..ebecb4411 100755
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/accountdetails/service/AccountDetailsReadPlatformServiceJpaRepositoryImpl.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/accountdetails/service/AccountDetailsReadPlatformServiceJpaRepositoryImpl.java
@@ -107,7 +107,8 @@ public class AccountDetailsReadPlatformServiceJpaRepositoryImpl implements Accou
accountsSummary.append("sa.id as id, sa.account_no as accountNo, sa.external_id as externalId, sa.status_enum as statusEnum, ");
accountsSummary.append("sa.account_type_enum as accountType, ");
accountsSummary.append("sa.account_balance_derived as accountBalance, ");
- accountsSummary.append("sa.currency_code as currencyCode, sa.currency_digits as currencyDigits, ");
+ accountsSummary
+ .append("sa.currency_code as currencyCode, sa.currency_digits as currencyDigits, sa.currency_multiplesof as inMulitplesOf, ");
accountsSummary.append("curr.name as currencyName, curr.internationalized_name_code as currencyNameCode, ");
accountsSummary.append("curr.display_symbol as currencyDisplaySymbol, ");
accountsSummary.append("sa.product_id as productId, p.name as productName ");
@@ -141,8 +142,9 @@ public class AccountDetailsReadPlatformServiceJpaRepositoryImpl implements Accou
final String currencyNameCode = rs.getString("currencyNameCode");
final String currencyDisplaySymbol = rs.getString("currencyDisplaySymbol");
final Integer currencyDigits = JdbcSupport.getInteger(rs, "currencyDigits");
- final CurrencyData currency = new CurrencyData(currencyCode, currencyName, currencyDigits, currencyDisplaySymbol,
- currencyNameCode);
+ final Integer inMulitplesOf = JdbcSupport.getInteger(rs, "inMulitplesOf");
+ final CurrencyData currency = new CurrencyData(currencyCode, currencyName, currencyDigits, inMulitplesOf,
+ currencyDisplaySymbol, currencyNameCode);
return new SavingsAccountSummaryData(id, accountNo, externalId, productId, productName, status, currency, accountBalance,
accountTypeData);
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/accounttransfers/service/AccountTransfersReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/accounttransfers/service/AccountTransfersReadPlatformServiceImpl.java
index 7a19cac0a..91d662764 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/accounttransfers/service/AccountTransfersReadPlatformServiceImpl.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/accounttransfers/service/AccountTransfersReadPlatformServiceImpl.java
@@ -206,12 +206,13 @@ public class AccountTransfersReadPlatformServiceImpl implements AccountTransfers
private final String schemaSql;
- public AccountTransfersMapper() {
+ public AccountTransfersMapper() {
final StringBuilder sqlBuilder = new StringBuilder(400);
sqlBuilder.append("sat.id as id, sat.is_reversed as isReversed,");
sqlBuilder.append("sat.transaction_date as transferDate, sat.amount as transferAmount,");
sqlBuilder.append("sat.description as transferDescription,");
- sqlBuilder.append("sat.currency_code as currencyCode, sat.currency_digits as currencyDigits,");
+ sqlBuilder
+ .append("sat.currency_code as currencyCode, sat.currency_digits as currencyDigits, sat.currency_multiplesof as inMulitplesOf, ");
sqlBuilder.append("curr.name as currencyName, curr.internationalized_name_code as currencyNameCode, ");
sqlBuilder.append("curr.display_symbol as currencyDisplaySymbol, ");
sqlBuilder.append("fromoff.id as fromOfficeId, fromoff.name as fromOfficeName,");
@@ -257,8 +258,9 @@ public class AccountTransfersReadPlatformServiceImpl implements AccountTransfers
final String currencyNameCode = rs.getString("currencyNameCode");
final String currencyDisplaySymbol = rs.getString("currencyDisplaySymbol");
final Integer currencyDigits = JdbcSupport.getInteger(rs, "currencyDigits");
- final CurrencyData currency = new CurrencyData(currencyCode, currencyName, currencyDigits, currencyDisplaySymbol,
- currencyNameCode);
+ final Integer inMulitplesOf = JdbcSupport.getInteger(rs, "inMulitplesOf");
+ final CurrencyData currency = new CurrencyData(currencyCode, currencyName, currencyDigits, inMulitplesOf,
+ currencyDisplaySymbol, currencyNameCode);
final Long fromOfficeId = JdbcSupport.getLong(rs, "fromOfficeId");
final String fromOfficeName = rs.getString("fromOfficeName");
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/charge/domain/Charge.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/charge/domain/Charge.java
index cfd3514ab..12ba2a31c 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/charge/domain/Charge.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/charge/domain/Charge.java
@@ -229,7 +229,7 @@ public class Charge extends AbstractPersistable {
EnumOptionData chargeAppliesTo = ChargeEnumerations.chargeAppliesTo(this.chargeAppliesTo);
EnumOptionData chargeCalculationType = ChargeEnumerations.chargeCalculationType(this.chargeCalculation);
- CurrencyData currency = new CurrencyData(this.currencyCode, null, 0, null, null);
+ CurrencyData currency = new CurrencyData(this.currencyCode, null, 0, 0, null, null);
return ChargeData.instance(this.getId(), this.name, this.amount, currency, chargeTimeType, chargeAppliesTo, chargeCalculationType,
penalty, active);
}
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/charge/service/ChargeReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/charge/service/ChargeReadPlatformServiceImpl.java
index c18d08db2..a18b36541 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/charge/service/ChargeReadPlatformServiceImpl.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/charge/service/ChargeReadPlatformServiceImpl.java
@@ -111,7 +111,7 @@ public class ChargeReadPlatformServiceImpl implements ChargeReadPlatformService
return this.jdbcTemplate.query(sql, rm, new Object[] { ChargeAppliesTo.LOAN.getValue() });
}
-
+
@Override
public Collection retrieveLoanApplicablePenalties() {
this.context.authenticatedUser();
@@ -129,7 +129,7 @@ public class ChargeReadPlatformServiceImpl implements ChargeReadPlatformService
return "c.id as id, c.name as name, c.amount as amount, c.currency_code as currencyCode, "
+ "c.charge_applies_to_enum as chargeAppliesTo, c.charge_time_enum as chargeTime, "
+ "c.charge_calculation_enum as chargeCalculation, c.is_penalty as penalty, c.is_active as active, oc.name as currencyName, "
- + "oc.decimal_places as currencyDecimalPlaces, oc.display_symbol as currencyDisplaySymbol, "
+ + "oc.decimal_places as currencyDecimalPlaces,oc.currency_multiplesof as inMulitplesOf, oc.display_symbol as currencyDisplaySymbol, "
+ "oc.internationalized_name_code as currencyNameCode from m_charge c "
+ "join m_organisation_currency oc on c.currency_code = oc.code";
}
@@ -149,9 +149,10 @@ public class ChargeReadPlatformServiceImpl implements ChargeReadPlatformService
final String currencyNameCode = rs.getString("currencyNameCode");
final String currencyDisplaySymbol = rs.getString("currencyDisplaySymbol");
final Integer currencyDecimalPlaces = JdbcSupport.getInteger(rs, "currencyDecimalPlaces");
+ final Integer inMulitplesOf = JdbcSupport.getInteger(rs, "inMulitplesOf");
- final CurrencyData currency = new CurrencyData(currencyCode, currencyName, currencyDecimalPlaces, currencyDisplaySymbol,
- currencyNameCode);
+ final CurrencyData currency = new CurrencyData(currencyCode, currencyName, currencyDecimalPlaces, inMulitplesOf,
+ currencyDisplaySymbol, currencyNameCode);
final int chargeAppliesTo = rs.getInt("chargeAppliesTo");
final EnumOptionData chargeAppliesToType = ChargeEnumerations.chargeAppliesTo(chargeAppliesTo);
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/collateral/service/CollateralReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/collateral/service/CollateralReadPlatformServiceImpl.java
index 53703d30d..62fc3345a 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/collateral/service/CollateralReadPlatformServiceImpl.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/collateral/service/CollateralReadPlatformServiceImpl.java
@@ -45,7 +45,7 @@ public class CollateralReadPlatformServiceImpl implements CollateralReadPlatform
private StringBuilder sqlBuilder = new StringBuilder(
"lc.id as id, lc.description as description, lc.value as value, cv.id as typeId, cv.code_value as typeName, oc.code as currencyCode, ")
- .append(" oc.name as currencyName,oc.decimal_places as currencyDecimalPlaces, oc.display_symbol as currencyDisplaySymbol, oc.internationalized_name_code as currencyNameCode")
+ .append(" oc.name as currencyName,oc.decimal_places as currencyDecimalPlaces, oc.currency_multiplesof as inMulitplesOf, oc.display_symbol as currencyDisplaySymbol, oc.internationalized_name_code as currencyNameCode")
.append(" FROM m_loan_collateral lc") //
.append(" JOIN m_code_value cv on lc.type_cv_id = cv.id")//
.append(" JOIN m_loan loan on lc.loan_id = loan.id")//
@@ -71,9 +71,10 @@ public class CollateralReadPlatformServiceImpl implements CollateralReadPlatform
final String currencyNameCode = rs.getString("currencyNameCode");
final String currencyDisplaySymbol = rs.getString("currencyDisplaySymbol");
final Integer currencyDecimalPlaces = JdbcSupport.getInteger(rs, "currencyDecimalPlaces");
+ final Integer inMulitplesOf = JdbcSupport.getInteger(rs, "inMulitplesOf");
- final CurrencyData currencyData = new CurrencyData(currencyCode, currencyName, currencyDecimalPlaces, currencyDisplaySymbol,
- currencyNameCode);
+ final CurrencyData currencyData = new CurrencyData(currencyCode, currencyName, currencyDecimalPlaces, inMulitplesOf,
+ currencyDisplaySymbol, currencyNameCode);
return CollateralData.instance(id, type, value, description, currencyData);
}
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/collectionsheet/service/CollectionSheetReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/collectionsheet/service/CollectionSheetReadPlatformServiceImpl.java
index d17ecb7fb..5de580894 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/collectionsheet/service/CollectionSheetReadPlatformServiceImpl.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/collectionsheet/service/CollectionSheetReadPlatformServiceImpl.java
@@ -52,7 +52,8 @@ public class CollectionSheetReadPlatformServiceImpl implements CollectionSheetRe
@Autowired
public CollectionSheetReadPlatformServiceImpl(final PlatformSecurityContext context, final RoutingDataSource dataSource,
- final CenterReadPlatformService centerReadPlatformService, final GroupReadPlatformService groupReadPlatformService, final CollectionSheetGenerateCommandFromApiJsonDeserializer collectionSheetGenerateCommandFromApiJsonDeserializer) {
+ final CenterReadPlatformService centerReadPlatformService, final GroupReadPlatformService groupReadPlatformService,
+ final CollectionSheetGenerateCommandFromApiJsonDeserializer collectionSheetGenerateCommandFromApiJsonDeserializer) {
this.context = context;
this.centerReadPlatformService = centerReadPlatformService;
this.namedParameterjdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
@@ -69,9 +70,10 @@ public class CollectionSheetReadPlatformServiceImpl implements CollectionSheetRe
final CenterData center = this.centerReadPlatformService.retrieveOne(centerId);
final String groupHierarchy = center.getHierarchy() + "%";
-
- Collection collectionSheetFlatDatas = this.retriveJLGCollectionSheet(groupHierarchy, officeHierarchy, dueDate);
-
+
+ Collection collectionSheetFlatDatas = this.retriveJLGCollectionSheet(groupHierarchy, officeHierarchy,
+ dueDate);
+
final JLGCollectionSheetData jlgCollectionSheetData = buildJLGCollectionSheet(dueDate, collectionSheetFlatDatas);
return jlgCollectionSheetData;
@@ -83,7 +85,8 @@ public class CollectionSheetReadPlatformServiceImpl implements CollectionSheetRe
* Groups >> Clients >> Loans.
*/
@SuppressWarnings("null")
- private JLGCollectionSheetData buildJLGCollectionSheet(final LocalDate dueDate, final Collection jlgCollectionSheetFlatData) {
+ private JLGCollectionSheetData buildJLGCollectionSheet(final LocalDate dueDate,
+ final Collection jlgCollectionSheetFlatData) {
boolean firstTime = true;
Long prevGroupId = null;
@@ -101,9 +104,9 @@ public class CollectionSheetReadPlatformServiceImpl implements CollectionSheetRe
for (final JLGCollectionSheetFlatData collectionSheetFlatData : jlgCollectionSheetFlatData) {
- if(collectionSheetFlatData.getProductId() !=null){
+ if (collectionSheetFlatData.getProductId() != null) {
loanProducts.add(LoanProductData.lookupWithCurrency(collectionSheetFlatData.getProductId(),
- collectionSheetFlatData.getProductShortName(), collectionSheetFlatData.getCurrency()));
+ collectionSheetFlatData.getProductShortName(), collectionSheetFlatData.getCurrency()));
}
corrCollectioSheetFlatData = collectionSheetFlatData;
@@ -197,7 +200,7 @@ public class CollectionSheetReadPlatformServiceImpl implements CollectionSheetRe
+ "ln.loan_status_id As accountStatusId, "
+ "pl.name As productShortName, "
+ "ln.product_id As productId, "
- + "ln.currency_code as currencyCode, ln.currency_digits as currencyDigits, rc.`name` as currencyName, rc.display_symbol as currencyDisplaySymbol, rc.internationalized_name_code as currencyNameCode, "
+ + "ln.currency_code as currencyCode, ln.currency_digits as currencyDigits, ln.currency_multiplesof as inMulitplesOf, rc.`name` as currencyName, rc.display_symbol as currencyDisplaySymbol, rc.internationalized_name_code as currencyNameCode, "
+ "if(ln.loan_status_id = 200 , ln.principal_amount , null) As disbursementAmount, "
+ "sum(ifnull(if(ln.loan_status_id = 300, ls.principal_amount, 0.0), 0.0) - ifnull(if(ln.loan_status_id = 300, ls.principal_completed_derived, 0.0), 0.0)) As principalDue, "
+ "ln.principal_repaid_derived As principalPaid, "
@@ -206,7 +209,7 @@ public class CollectionSheetReadPlatformServiceImpl implements CollectionSheetRe
+ "sum(if(ln.loan_status_id = 300, lc.amount_outstanding_derived, 0.0)) as chargesDue "
+ "FROM m_group gp "
+ "LEFT JOIN m_office of ON of.id = gp.office_id AND of.hierarchy like :officeHierarchy "
- //+ "LEFT JOIN m_office of ON of.id = gp.office_id "
+ // + "LEFT JOIN m_office of ON of.id = gp.office_id "
+ "JOIN m_group_level gl ON gl.id = gp.level_Id "
+ "LEFT JOIN m_staff sf ON sf.id = gp.staff_id "
+ "JOIN m_group_client gc ON gc.group_id = gp.id "
@@ -216,7 +219,9 @@ public class CollectionSheetReadPlatformServiceImpl implements CollectionSheetRe
+ "JOIN m_currency rc on rc.`code` = ln.currency_code "
+ "LEFT JOIN m_loan_repayment_schedule ls ON ls.loan_id = ln.id AND ls.completed_derived = 0 AND ls.duedate <= :dueDate "
+ "LEFT JOIN m_loan_charge lc ON lc.loan_id = ln.id AND lc.is_paid_derived = 0 AND ( lc.due_for_collection_as_of_date <= :dueDate OR lc.charge_time_enum = 1) ";
- //+ "WHERE gp.hierarchy like :hierarchy " + "GROUP BY gp.id ,cl.id , ln.id " + "ORDER BY gp.id , cl.id , ln.id ";
+ // + "WHERE gp.hierarchy like :hierarchy " +
+ // "GROUP BY gp.id ,cl.id , ln.id " +
+ // "ORDER BY gp.id , cl.id , ln.id ";
}
@Override
@@ -241,9 +246,10 @@ public class CollectionSheetReadPlatformServiceImpl implements CollectionSheetRe
final String currencyNameCode = rs.getString("currencyNameCode");
final String currencyDisplaySymbol = rs.getString("currencyDisplaySymbol");
final Integer currencyDigits = JdbcSupport.getInteger(rs, "currencyDigits");
+ final Integer inMulitplesOf = JdbcSupport.getInteger(rs, "inMulitplesOf");
CurrencyData currencyData = null;
- if(currencyCode != null){
- currencyData = new CurrencyData(currencyCode, currencyName, currencyDigits, currencyDisplaySymbol,
+ if (currencyCode != null) {
+ currencyData = new CurrencyData(currencyCode, currencyName, currencyDigits, inMulitplesOf, currencyDisplaySymbol,
currencyNameCode);
}
@@ -263,7 +269,7 @@ public class CollectionSheetReadPlatformServiceImpl implements CollectionSheetRe
@Override
public JLGCollectionSheetData generateGroupCollectionSheet(final Long groupId, final JsonQuery query) {
-
+
this.collectionSheetGenerateCommandFromApiJsonDeserializer.validateForGenerateCollectionSheet(query.json());
final AppUser currentUser = this.context.authenticatedUser();
@@ -281,18 +287,18 @@ public class CollectionSheetReadPlatformServiceImpl implements CollectionSheetRe
String sql = mapper.collectionSheetSchema();
sql += "WHERE gp.id = :groupId GROUP BY gp.id ,cl.id , ln.id ORDER BY gp.id , cl.id , ln.id";
- final SqlParameterSource namedParameters = new MapSqlParameterSource().addValue("dueDate", dueDateStr).addValue("groupId", group.getId())
- .addValue("officeHierarchy", officeHierarchy);
+ final SqlParameterSource namedParameters = new MapSqlParameterSource().addValue("dueDate", dueDateStr)
+ .addValue("groupId", group.getId()).addValue("officeHierarchy", officeHierarchy);
final Collection collectionSheetFlatDatas = this.namedParameterjdbcTemplate.query(sql, namedParameters,
mapper);
return buildJLGCollectionSheet(dueDate, collectionSheetFlatDatas);
}
-
+
@Override
public JLGCollectionSheetData generateCenterCollectionSheet(final Long centerId, final JsonQuery query) {
-
+
this.collectionSheetGenerateCommandFromApiJsonDeserializer.validateForGenerateCollectionSheet(query.json());
final AppUser currentUser = this.context.authenticatedUser();
@@ -310,8 +316,8 @@ public class CollectionSheetReadPlatformServiceImpl implements CollectionSheetRe
String sql = mapper.collectionSheetSchema();
sql += "WHERE gp.parent_id = :centerId GROUP BY gp.id ,cl.id , ln.id ORDER BY gp.id , cl.id , ln.id";
- final SqlParameterSource namedParameters = new MapSqlParameterSource().addValue("dueDate", dueDateStr).addValue("centerId", center.getId())
- .addValue("officeHierarchy", officeHierarchy);
+ final SqlParameterSource namedParameters = new MapSqlParameterSource().addValue("dueDate", dueDateStr)
+ .addValue("centerId", center.getId()).addValue("officeHierarchy", officeHierarchy);
final Collection collectionSheetFlatDatas = this.namedParameterjdbcTemplate.query(sql, namedParameters,
mapper);
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/LoanApplicationTerms.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/LoanApplicationTerms.java
index 552f19e3b..f613b0d06 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/LoanApplicationTerms.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/LoanApplicationTerms.java
@@ -157,7 +157,7 @@ public final class LoanApplicationTerms {
this.expectedDisbursementDate = expectedDisbursementDate;
this.repaymentsStartingFromDate = repaymentsStartingFromDate;
this.calculatedRepaymentsStartingFromDate = calculatedRepaymentsStartingFromDate;
-
+
this.principalGrace = principalGrace;
this.interestPaymentGrace = interestPaymentGrace;
this.interestChargingGrace = interestChargingGrace;
@@ -172,7 +172,15 @@ public final class LoanApplicationTerms {
Money adjusted = principalForPeriod;
// adjust cumulative fields for principal & interest if needed
- if (isLastRepaymentPeriod(this.numberOfRepayments, periodNumber)) {
+ if (this.principal.getAmount().subtract(totalCumulativePrincipalToDate.getAmount()).add(principalForPeriod.getAmount()).compareTo(principalForPeriod.getAmount()) == -1) {
+ adjusted = adjusted.minus(adjusted);
+ MonetaryCurrency monetaryCurrency = new MonetaryCurrency(adjusted.getCurrencyCode(), 0, principalForPeriod.getAmount().intValue());
+ BigDecimal diff = this.principal.getAmount().subtract(totalCumulativePrincipalToDate.getAmount()).add(principalForPeriod.getAmount());
+ if(diff.doubleValue()<0){
+ diff = BigDecimal.ZERO;
+ }
+ adjusted = adjusted.plus(Money.of(monetaryCurrency,diff));
+ } else if (isLastRepaymentPeriod(this.numberOfRepayments, periodNumber)) {
final Money difference = totalCumulativePrincipalToDate.minus(this.principal);
if (difference.isLessThanZero()) {
@@ -189,9 +197,16 @@ public final class LoanApplicationTerms {
final Money totalInterestDueForLoan, final int periodNumber) {
Money adjusted = interestForThisPeriod;
-
- if (isLastRepaymentPeriod(this.numberOfRepayments, periodNumber)) {
-
+ if (totalInterestDueForLoan.getAmount().subtract(totalCumulativeInterestToDate.getAmount()).add(interestForThisPeriod.getAmount())
+ .compareTo(interestForThisPeriod.getAmount()) == -1) {
+ adjusted = adjusted.minus(adjusted);
+ MonetaryCurrency monetaryCurrency = new MonetaryCurrency(adjusted.getCurrencyCode(), 0, interestForThisPeriod.getAmount().intValue());
+ BigDecimal diff = totalInterestDueForLoan.getAmount().subtract(totalCumulativeInterestToDate.getAmount()).add(interestForThisPeriod.getAmount());
+ if(diff.doubleValue()<0){
+ diff = BigDecimal.ZERO;
+ }
+ adjusted = adjusted.plus(Money.of(monetaryCurrency,diff));
+ } else if (isLastRepaymentPeriod(this.numberOfRepayments, periodNumber)) {
final Money interestDifference = totalCumulativeInterestToDate.minus(totalInterestDueForLoan);
if (interestDifference.isLessThanZero()) {
adjusted = interestForThisPeriod.plus(interestDifference.abs());
@@ -199,7 +214,9 @@ public final class LoanApplicationTerms {
adjusted = interestForThisPeriod.minus(interestDifference.abs());
}
}
-
+ if (adjusted.isLessThanZero()) {
+ adjusted = adjusted.plus(adjusted);
+ }
return adjusted;
}
@@ -618,7 +635,8 @@ public final class LoanApplicationTerms {
}
public LoanProductRelatedDetail toLoanProductRelatedDetail() {
- final MonetaryCurrency currency = new MonetaryCurrency(this.currency.getCode(), this.currency.getDecimalPlaces());
+ final MonetaryCurrency currency = new MonetaryCurrency(this.currency.getCode(), this.currency.getDecimalPlaces(),
+ this.currency.getCurrencyInMulitplesOf());
return LoanProductRelatedDetail.createFrom(currency, this.principal.getAmount(), this.interestRatePerPeriod,
this.interestRatePeriodFrequencyType, this.annualNominalInterestRate, this.interestMethod,
@@ -690,7 +708,7 @@ public final class LoanApplicationTerms {
public LocalDate getCalculatedRepaymentsStartingFromLocalDate() {
return this.calculatedRepaymentsStartingFromDate;
}
-
+
public Money getPrincipal() {
return this.principal;
}
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/LoanScheduleModel.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/LoanScheduleModel.java
index 495fcdbea..413b0cd59 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/LoanScheduleModel.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/LoanScheduleModel.java
@@ -62,7 +62,8 @@ public final class LoanScheduleModel {
public LoanScheduleData toData() {
final int decimalPlaces = this.totalPrincipalDisbursed.getCurrencyDigitsAfterDecimal();
- final CurrencyData currency = applicationCurrency.toData(decimalPlaces);
+ final Integer inMulitplesOf = this.totalPrincipalDisbursed.getCurrencyInMulitplesOf();
+ final CurrencyData currency = applicationCurrency.toData(decimalPlaces,inMulitplesOf);
final Collection periodsData = new ArrayList();
for (LoanScheduleModelPeriod modelPeriod : this.periods) {
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanChargeReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanChargeReadPlatformServiceImpl.java
index e2ddbd66d..628e5453d 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanChargeReadPlatformServiceImpl.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanChargeReadPlatformServiceImpl.java
@@ -44,14 +44,19 @@ public class LoanChargeReadPlatformServiceImpl implements LoanChargeReadPlatform
private static final class LoanChargeMapper implements RowMapper {
public String schema() {
- return "lc.id as id, c.id as chargeId, c.name as name, " + "lc.amount as amountDue, "
- + "lc.amount_paid_derived as amountPaid, " + "lc.amount_waived_derived as amountWaived, "
- + "lc.amount_writtenoff_derived as amountWrittenOff, " + "lc.amount_outstanding_derived as amountOutstanding, "
+ return "lc.id as id, c.id as chargeId, c.name as name, "
+ + "lc.amount as amountDue, "
+ + "lc.amount_paid_derived as amountPaid, "
+ + "lc.amount_waived_derived as amountWaived, "
+ + "lc.amount_writtenoff_derived as amountWrittenOff, "
+ + "lc.amount_outstanding_derived as amountOutstanding, "
+ "lc.calculation_percentage as percentageOf, lc.calculation_on_amount as amountPercentageAppliedTo, "
- + "lc.charge_time_enum as chargeTime, " + "lc.is_penalty as penalty, "
- + "lc.due_for_collection_as_of_date as dueAsOfDate, " + "lc.charge_calculation_enum as chargeCalculation, "
+ + "lc.charge_time_enum as chargeTime, "
+ + "lc.is_penalty as penalty, "
+ + "lc.due_for_collection_as_of_date as dueAsOfDate, "
+ + "lc.charge_calculation_enum as chargeCalculation, "
+ "c.currency_code as currencyCode, oc.name as currencyName, "
- + "oc.decimal_places as currencyDecimalPlaces, oc.display_symbol as currencyDisplaySymbol, "
+ + "oc.decimal_places as currencyDecimalPlaces, oc.currency_multiplesof as inMulitplesOf, oc.display_symbol as currencyDisplaySymbol, "
+ "oc.internationalized_name_code as currencyNameCode from m_charge c "
+ "join m_organisation_currency oc on c.currency_code = oc.code " + "join m_loan_charge lc on lc.charge_id = c.id ";
}
@@ -76,9 +81,10 @@ public class LoanChargeReadPlatformServiceImpl implements LoanChargeReadPlatform
final String currencyNameCode = rs.getString("currencyNameCode");
final String currencyDisplaySymbol = rs.getString("currencyDisplaySymbol");
final Integer currencyDecimalPlaces = JdbcSupport.getInteger(rs, "currencyDecimalPlaces");
+ final Integer inMulitplesOf = JdbcSupport.getInteger(rs, "inMulitplesOf");
- final CurrencyData currency = new CurrencyData(currencyCode, currencyName, currencyDecimalPlaces, currencyDisplaySymbol,
- currencyNameCode);
+ final CurrencyData currency = new CurrencyData(currencyCode, currencyName, currencyDecimalPlaces, inMulitplesOf,
+ currencyDisplaySymbol, currencyNameCode);
final int chargeTime = rs.getInt("chargeTime");
final EnumOptionData chargeTimeType = ChargeEnumerations.chargeTimeType(chargeTime);
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 d348e94bc..df508f5e9 100644
--- 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
@@ -349,7 +349,8 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService {
context.authenticatedUser();
final LoanTransactionEnumData transactionType = LoanEnumerations.transactionType(LoanTransactionType.WRITEOFF);
- return new LoanTransactionData(null, transactionType, null, null, DateUtils.getLocalDateOfTenant(), null, null, null, null, null, null);
+ return new LoanTransactionData(null, transactionType, null, null, DateUtils.getLocalDateOfTenant(), null, null, null, null, null,
+ null);
}
@Override
@@ -409,7 +410,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService {
+ " l.amortization_method_enum as amortizationType, l.interest_method_enum as interestType, l.interest_calculated_in_period_enum as interestCalculationPeriodType,"
+ " l.loan_status_id as lifeCycleStatusId, l.loan_transaction_strategy_id as transactionStrategyId, "
+ " lps.name as transactionStrategyName, "
- + " l.currency_code as currencyCode, l.currency_digits as currencyDigits, rc.`name` as currencyName, rc.display_symbol as currencyDisplaySymbol, rc.internationalized_name_code as currencyNameCode, "
+ + " l.currency_code as currencyCode, l.currency_digits as currencyDigits, l.currency_multiplesof as inMulitplesOf, rc.`name` as currencyName, rc.display_symbol as currencyDisplaySymbol, rc.internationalized_name_code as currencyNameCode, "
+ " l.loan_officer_id as loanOfficerId, s.display_name as loanOfficerName, "
+ " l.principal_disbursed_derived as principalDisbursed,"
+ " l.principal_repaid_derived as principalPaid,"
@@ -473,8 +474,9 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService {
final String currencyNameCode = rs.getString("currencyNameCode");
final String currencyDisplaySymbol = rs.getString("currencyDisplaySymbol");
final Integer currencyDigits = JdbcSupport.getInteger(rs, "currencyDigits");
- final CurrencyData currencyData = new CurrencyData(currencyCode, currencyName, currencyDigits, currencyDisplaySymbol,
- currencyNameCode);
+ final Integer inMulitplesOf = JdbcSupport.getInteger(rs, "inMulitplesOf");
+ final CurrencyData currencyData = new CurrencyData(currencyCode, currencyName, currencyDigits, inMulitplesOf,
+ currencyDisplaySymbol, currencyNameCode);
final Long id = rs.getLong("id");
final String accountNo = rs.getString("accountNo");
@@ -593,7 +595,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService {
final LocalDate interestChargedFromDate = JdbcSupport.getLocalDate(rs, "interestChargedFromDate");
final Boolean syncDisbursementWithMeeting = rs.getBoolean("syncDisbursementWithMeeting");
-
+
final BigDecimal feeChargesDueAtDisbursementCharged = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs,
"feeChargesDueAtDisbursementCharged");
LoanSummaryData loanSummary = null;
@@ -655,18 +657,18 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService {
groupData = GroupGeneralData.instance(groupId, groupName, groupExternalId, groupStatus, activationDate, groupOfficeId,
null, groupParentId, null, groupStaffId, null, groupHierarchy);
}
-
+
final Integer loanCounter = JdbcSupport.getInteger(rs, "loanCounter");
final Integer loanProductCounter = JdbcSupport.getInteger(rs, "loanProductCounter");
return LoanAccountData.basicLoanDetails(id, accountNo, status, externalId, clientId, clientName, clientOfficeId, groupData,
loanType, loanProductId, loanProductName, loanProductDescription, fundId, fundName, loanPurposeId, loanPurposeName,
loanOfficerId, loanOfficerName, currencyData, principal, totalOverpaid, inArrearsTolerance, termFrequency,
- termPeriodFrequencyType, numberOfRepayments, repaymentEvery, repaymentFrequencyType, transactionStrategyId, transactionStrategyName ,
- amortizationType, interestRatePerPeriod, interestRateFrequencyType, annualInterestRate, interestType,
- interestCalculationPeriodType, expectedFirstRepaymentOnDate, graceOnPrincipalPayment, graceOnInterestPayment,
- graceOnInterestCharged, interestChargedFromDate, timeline, loanSummary, feeChargesDueAtDisbursementCharged,
- syncDisbursementWithMeeting, loanCounter, loanProductCounter);
+ termPeriodFrequencyType, numberOfRepayments, repaymentEvery, repaymentFrequencyType, transactionStrategyId,
+ transactionStrategyName, amortizationType, interestRatePerPeriod, interestRateFrequencyType, annualInterestRate,
+ interestType, interestCalculationPeriodType, expectedFirstRepaymentOnDate, graceOnPrincipalPayment,
+ graceOnInterestPayment, graceOnInterestCharged, interestChargedFromDate, timeline, loanSummary,
+ feeChargesDueAtDisbursementCharged, syncDisbursementWithMeeting, loanCounter, loanProductCounter);
}
}
@@ -707,7 +709,8 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService {
final Collection periods = new ArrayList();
periods.add(disbursementPeriod);
- final MonetaryCurrency monCurrency = new MonetaryCurrency(this.currency.code(), this.currency.decimalPlaces());
+ final MonetaryCurrency monCurrency = new MonetaryCurrency(this.currency.code(), this.currency.decimalPlaces(),
+ this.currency.currencyInMulitplesOf());
final BigDecimal totalPrincipalDisbursed = Money.of(monCurrency, this.disbursement.amount()).getAmount();
Money totalPrincipalExpected = Money.zero(monCurrency);
Money totalPrincipalPaid = Money.zero(monCurrency);
@@ -843,9 +846,10 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService {
+ " tr.fee_charges_portion_derived as fees, tr.penalty_charges_portion_derived as penalties, "
+ " pd.payment_type_cv_id as paymentType,pd.account_number as accountNumber,pd.check_number as checkNumber, "
+ " pd.receipt_number as receiptNumber, pd.bank_number as bankNumber,pd.routing_code as routingCode, "
- + " l.currency_code as currencyCode, l.currency_digits as currencyDigits, rc.`name` as currencyName, "
+ + " l.currency_code as currencyCode, l.currency_digits as currencyDigits, l.currency_multiplesof as inMulitplesOf, rc.`name` as currencyName, "
+ " rc.display_symbol as currencyDisplaySymbol, rc.internationalized_name_code as currencyNameCode, "
- + " cv.code_value as paymentTypeName, tr.external_id as externalId " + " from m_loan l join m_loan_transaction tr on tr.loan_id = l.id"
+ + " cv.code_value as paymentTypeName, tr.external_id as externalId "
+ + " from m_loan l join m_loan_transaction tr on tr.loan_id = l.id"
+ " join m_currency rc on rc.`code` = l.currency_code "
+ " left JOIN m_payment_detail pd ON tr.payment_detail_id = pd.id"
+ " left join m_code_value cv on pd.payment_type_cv_id = cv.id";
@@ -859,8 +863,9 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService {
final String currencyNameCode = rs.getString("currencyNameCode");
final String currencyDisplaySymbol = rs.getString("currencyDisplaySymbol");
final Integer currencyDigits = JdbcSupport.getInteger(rs, "currencyDigits");
- final CurrencyData currencyData = new CurrencyData(currencyCode, currencyName, currencyDigits, currencyDisplaySymbol,
- currencyNameCode);
+ final Integer inMulitplesOf = JdbcSupport.getInteger(rs, "inMulitplesOf");
+ final CurrencyData currencyData = new CurrencyData(currencyCode, currencyName, currencyDigits, inMulitplesOf,
+ currencyDisplaySymbol, currencyNameCode);
final Long id = rs.getLong("id");
final int transactionTypeInt = JdbcSupport.getInteger(rs, "transactionType");
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProduct.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProduct.java
index 95716c966..721159c50 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProduct.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProduct.java
@@ -99,8 +99,9 @@ public class LoanProduct extends AbstractPersistable {
final String description = command.stringValueOfParameterNamed("description");
final String currencyCode = command.stringValueOfParameterNamed("currencyCode");
final Integer digitsAfterDecimal = command.integerValueOfParameterNamed("digitsAfterDecimal");
-
- final MonetaryCurrency currency = new MonetaryCurrency(currencyCode, digitsAfterDecimal);
+ final Integer inMulitplesOf = command.integerValueOfParameterNamed("inMulitplesOf");
+
+ final MonetaryCurrency currency = new MonetaryCurrency(currencyCode, digitsAfterDecimal,inMulitplesOf);
final BigDecimal principal = command.bigDecimalValueOfParameterNamed("principal");
final BigDecimal minPrincipal = command.bigDecimalValueOfParameterNamed("minPrincipal");
final BigDecimal maxPrincipal = command.bigDecimalValueOfParameterNamed("maxPrincipal");
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProductRelatedDetail.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProductRelatedDetail.java
index 2bfce6916..3724556c8 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProductRelatedDetail.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProductRelatedDetail.java
@@ -206,6 +206,7 @@ public class LoanProductRelatedDetail implements LoanProductMinimumRepaymentSche
String currencyCode = this.currency.getCode();
Integer digitsAfterDecimal = this.currency.getDigitsAfterDecimal();
+ Integer inMulitplesOf = this.currency.getCurrencyInMulitplesOf();
final String digitsAfterDecimalParamName = "digitsAfterDecimal";
if (command.isChangeInIntegerParameterNamed(digitsAfterDecimalParamName, digitsAfterDecimal)) {
@@ -213,7 +214,7 @@ public class LoanProductRelatedDetail implements LoanProductMinimumRepaymentSche
actualChanges.put(digitsAfterDecimalParamName, newValue);
actualChanges.put("locale", localeAsInput);
digitsAfterDecimal = newValue;
- this.currency = new MonetaryCurrency(currencyCode, digitsAfterDecimal);
+ this.currency = new MonetaryCurrency(currencyCode, digitsAfterDecimal,inMulitplesOf);
}
final String currencyCodeParamName = "currencyCode";
@@ -221,9 +222,17 @@ public class LoanProductRelatedDetail implements LoanProductMinimumRepaymentSche
final String newValue = command.stringValueOfParameterNamed(currencyCodeParamName);
actualChanges.put(currencyCodeParamName, newValue);
currencyCode = newValue;
- this.currency = new MonetaryCurrency(currencyCode, digitsAfterDecimal);
+ this.currency = new MonetaryCurrency(currencyCode, digitsAfterDecimal,inMulitplesOf);
}
-
+
+ final String inMulitplesOfParamName = "inMulitplesOf";
+ if (command.isChangeInStringParameterNamed(inMulitplesOfParamName, currencyCode)) {
+ final Integer newValue = command.integerValueOfParameterNamed(inMulitplesOfParamName);
+ actualChanges.put(inMulitplesOfParamName, newValue);
+ inMulitplesOf = newValue;
+ this.currency = new MonetaryCurrency(currencyCode, digitsAfterDecimal,inMulitplesOf);
+ }
+
final Map loanApplicationAttributeChanges = updateLoanApplicationAttributes(command, aprCalculator);
actualChanges.putAll(loanApplicationAttributeChanges);
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/serialization/LoanProductDataValidator.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/serialization/LoanProductDataValidator.java
index 3f0177aba..73d76a5d7 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/serialization/LoanProductDataValidator.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/serialization/LoanProductDataValidator.java
@@ -39,7 +39,7 @@ public final class LoanProductDataValidator {
* The parameters supported for this command.
*/
private final Set supportedParameters = new HashSet(Arrays.asList("locale", "dateFormat", "name", "description", "fundId",
- "currencyCode", "digitsAfterDecimal", "principal", "minPrincipal", "maxPrincipal", "repaymentEvery", "numberOfRepayments",
+ "currencyCode", "digitsAfterDecimal","inMulitplesOf", "principal", "minPrincipal", "maxPrincipal", "repaymentEvery", "numberOfRepayments",
"minNumberOfRepayments", "maxNumberOfRepayments", "repaymentFrequencyType", "interestRatePerPeriod",
"minInterestRatePerPeriod", "maxInterestRatePerPeriod", "interestRateFrequencyType", "amortizationType", "interestType",
"interestCalculationPeriodType", "inArrearsTolerance", "transactionProcessingStrategyId", "graceOnPrincipalPayment",
@@ -91,6 +91,9 @@ public final class LoanProductDataValidator {
final Integer digitsAfterDecimal = fromApiJsonHelper.extractIntegerNamed("digitsAfterDecimal", element, Locale.getDefault());
baseDataValidator.reset().parameter("digitsAfterDecimal").value(digitsAfterDecimal).notNull().inMinMaxRange(0, 6);
+
+ final Integer inMulitplesOf = fromApiJsonHelper.extractIntegerNamed("inMulitplesOf", element, Locale.getDefault());
+ baseDataValidator.reset().parameter("inMulitplesOf").value(inMulitplesOf).ignoreIfNull().integerZeroOrGreater();
final BigDecimal principal = fromApiJsonHelper.extractBigDecimalWithLocaleNamed("principal", element);
baseDataValidator.reset().parameter("principal").value(principal).notNull().positiveAmount();
@@ -334,6 +337,11 @@ public final class LoanProductDataValidator {
final Integer digitsAfterDecimal = fromApiJsonHelper.extractIntegerNamed("digitsAfterDecimal", element, Locale.getDefault());
baseDataValidator.reset().parameter("digitsAfterDecimal").value(digitsAfterDecimal).notNull().inMinMaxRange(0, 6);
}
+
+ if (fromApiJsonHelper.parameterExists("inMulitplesOf", element)) {
+ final Integer inMulitplesOf = fromApiJsonHelper.extractIntegerNamed("inMulitplesOf", element, Locale.getDefault());
+ baseDataValidator.reset().parameter("inMulitplesOf").value(inMulitplesOf).ignoreIfNull().integerZeroOrGreater();
+ }
String minPrincipalParameterName = "minPrincipal";
BigDecimal minPrincipalAmount = null;
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java
index 7610b6db1..bbb1edf5a 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java
@@ -99,7 +99,7 @@ public class LoanProductReadPlatformServiceImpl implements LoanProductReadPlatfo
public String loanProductSchema() {
return "lp.id as id, lp.fund_id as fundId, f.name as fundName, lp.loan_transaction_strategy_id as transactionStrategyId, ltps.name as transactionStrategyName, "
+ "lp.name as name, lp.description as description, "
- + "lp.principal_amount as principal, lp.min_principal_amount as minPrincipal, lp.max_principal_amount as maxPrincipal, lp.currency_code as currencyCode, lp.currency_digits as currencyDigits, "
+ + "lp.principal_amount as principal, lp.min_principal_amount as minPrincipal, lp.max_principal_amount as maxPrincipal, lp.currency_code as currencyCode, lp.currency_digits as currencyDigits, lp.currency_multiplesof as inMulitplesOf, "
+ "lp.nominal_interest_rate_per_period as interestRatePerPeriod, lp.min_nominal_interest_rate_per_period as minInterestRatePerPeriod, lp.max_nominal_interest_rate_per_period as maxInterestRatePerPeriod, lp.interest_period_frequency_enum as interestRatePerPeriodFreq, "
+ "lp.annual_nominal_interest_rate as annualInterestRate, lp.interest_method_enum as interestMethod, lp.interest_calculated_in_period_enum as interestCalculationInPeriodMethod,"
+ "lp.repay_every as repaidEvery, lp.repayment_period_frequency_enum as repaymentPeriodFrequency, lp.number_of_repayments as numberOfRepayments, lp.min_number_of_repayments as minNumberOfRepayments, lp.max_number_of_repayments as maxNumberOfRepayments, "
@@ -129,9 +129,10 @@ public class LoanProductReadPlatformServiceImpl implements LoanProductReadPlatfo
final String currencyNameCode = rs.getString("currencyNameCode");
final String currencyDisplaySymbol = rs.getString("currencyDisplaySymbol");
final Integer currencyDigits = JdbcSupport.getInteger(rs, "currencyDigits");
+ final Integer inMulitplesOf = JdbcSupport.getInteger(rs, "inMulitplesOf");
- final CurrencyData currency = new CurrencyData(currencyCode, currencyName, currencyDigits, currencyDisplaySymbol,
- currencyNameCode);
+ final CurrencyData currency = new CurrencyData(currencyCode, currencyName, currencyDigits, inMulitplesOf,
+ currencyDisplaySymbol, currencyNameCode);
final BigDecimal principal = rs.getBigDecimal("principal");
final BigDecimal minPrincipal = rs.getBigDecimal("minPrincipal");
@@ -170,7 +171,7 @@ public class LoanProductReadPlatformServiceImpl implements LoanProductReadPlatfo
final int interestCalculationPeriodTypeId = JdbcSupport.getInteger(rs, "interestCalculationInPeriodMethod");
final EnumOptionData interestCalculationPeriodType = LoanEnumerations
.interestCalculationPeriodType(interestCalculationPeriodTypeId);
-
+
final boolean includeInBorrowerCycle = rs.getBoolean("includeInBorrowerCycle");
final LocalDate startDate = JdbcSupport.getLocalDate(rs, "startDate");
final LocalDate closeDate = JdbcSupport.getLocalDate(rs, "closeDate");
@@ -181,13 +182,14 @@ public class LoanProductReadPlatformServiceImpl implements LoanProductReadPlatfo
status = "loanProduct.active";
}
final String externalId = rs.getString("externalId");
-
+
return new LoanProductData(id, name, description, currency, principal, minPrincipal, maxPrincipal, tolerance,
numberOfRepayments, minNumberOfRepayments, maxNumberOfRepayments, repaymentEvery, interestRatePerPeriod,
minInterestRatePerPeriod, maxInterestRatePerPeriod, annualInterestRate, repaymentFrequencyType,
interestRateFrequencyType, amortizationType, interestType, interestCalculationPeriodType, fundId, fundName,
transactionStrategyId, transactionStrategyName, graceOnPrincipalPayment, graceOnInterestPayment,
- graceOnInterestCharged, this.charges, accountingRuleType, includeInBorrowerCycle, startDate, closeDate, status, externalId);
+ graceOnInterestCharged, this.charges, accountingRuleType, includeInBorrowerCycle, startDate, closeDate, status,
+ externalId);
}
}
@@ -202,11 +204,11 @@ public class LoanProductReadPlatformServiceImpl implements LoanProductReadPlatfo
return "lp.id as id, lp.name as name FROM m_product_loan lp left join m_product_mix pm on pm.product_id=lp.id where lp.id not IN("
+ "select lp.id from m_product_loan lp inner join m_product_mix pm on pm.product_id=lp.id)";
}
-
+
public String restrictedProductsSchema() {
return "pm.restricted_product_id as id, rp.name as name from m_product_mix pm join m_product_loan rp on rp.id = pm.restricted_product_id ";
}
-
+
public String derivedRestrictedProductsSchema() {
return "pm.product_id as id, lp.name as name from m_product_mix pm join m_product_loan lp on lp.id=pm.product_id";
}
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/SavingsApiConstants.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/SavingsApiConstants.java
index cade9ee85..9d0dea3ca 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/SavingsApiConstants.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/SavingsApiConstants.java
@@ -63,6 +63,7 @@ public class SavingsApiConstants {
public static final String descriptionParamName = "description";
public static final String currencyCodeParamName = "currencyCode";
public static final String digitsAfterDecimalParamName = "digitsAfterDecimal";
+ public static final String inMulitplesOfParamName = "inMulitplesOf";
public static final String nominalAnnualInterestRateParamName = "nominalAnnualInterestRate";
public static final String interestCompoundingPeriodTypeParamName = "interestCompoundingPeriodType";
public static final String interestPostingPeriodTypeParamName = "interestPostingPeriodType";
@@ -93,11 +94,11 @@ public class SavingsApiConstants {
public static final Set SAVINGS_PRODUCT_REQUEST_DATA_PARAMETERS = new HashSet(Arrays.asList(localeParamName,
monthDayFormatParamName, nameParamName, descriptionParamName, currencyCodeParamName, digitsAfterDecimalParamName,
- nominalAnnualInterestRateParamName, interestCompoundingPeriodTypeParamName, interestPostingPeriodTypeParamName,
- interestCalculationTypeParamName, interestCalculationDaysInYearTypeParamName, minRequiredOpeningBalanceParamName,
- lockinPeriodFrequencyParamName, lockinPeriodFrequencyTypeParamName, withdrawalFeeAmountParamName, withdrawalFeeTypeParamName,
- annualFeeAmountParamName, annualFeeOnMonthDayParamName, accountingRuleParamName,
- SAVINGS_PRODUCT_ACCOUNTING_PARAMS.INCOME_FROM_FEES.getValue(),
+ inMulitplesOfParamName, nominalAnnualInterestRateParamName, interestCompoundingPeriodTypeParamName,
+ interestPostingPeriodTypeParamName, interestCalculationTypeParamName, interestCalculationDaysInYearTypeParamName,
+ minRequiredOpeningBalanceParamName, lockinPeriodFrequencyParamName, lockinPeriodFrequencyTypeParamName,
+ withdrawalFeeAmountParamName, withdrawalFeeTypeParamName, annualFeeAmountParamName, annualFeeOnMonthDayParamName,
+ accountingRuleParamName, SAVINGS_PRODUCT_ACCOUNTING_PARAMS.INCOME_FROM_FEES.getValue(),
SAVINGS_PRODUCT_ACCOUNTING_PARAMS.INTEREST_ON_SAVINGS.getValue(),
SAVINGS_PRODUCT_ACCOUNTING_PARAMS.PAYMENT_CHANNEL_FUND_SOURCE_MAPPING.getValue(),
SAVINGS_PRODUCT_ACCOUNTING_PARAMS.SAVINGS_CONTROL.getValue(), SAVINGS_PRODUCT_ACCOUNTING_PARAMS.SAVINGS_REFERENCE.getValue()));
@@ -108,13 +109,13 @@ public class SavingsApiConstants {
* parameters to match those of request parameters.
*/
public static final Set SAVINGS_PRODUCT_RESPONSE_DATA_PARAMETERS = new HashSet(Arrays.asList(idParamName,
- nameParamName, descriptionParamName, "currency", digitsAfterDecimalParamName, nominalAnnualInterestRateParamName,
- interestCompoundingPeriodTypeParamName, interestPostingPeriodTypeParamName, interestCalculationTypeParamName,
- interestCalculationDaysInYearTypeParamName, minRequiredOpeningBalanceParamName, lockinPeriodFrequencyParamName,
- lockinPeriodFrequencyTypeParamName, withdrawalFeeAmountParamName, withdrawalFeeTypeParamName, annualFeeAmountParamName,
- annualFeeOnMonthDayParamName, "currencyOptions", "interestCompoundingPeriodTypeOptions", "interestPostingPeriodTypeOptions",
- "interestCalculationTypeOptions", "interestCalculationDaysInYearTypeOptions", "lockinPeriodFrequencyTypeOptions",
- "withdrawalFeeTypeOptions"));
+ nameParamName, descriptionParamName, "currency", digitsAfterDecimalParamName, inMulitplesOfParamName,
+ nominalAnnualInterestRateParamName, interestCompoundingPeriodTypeParamName, interestPostingPeriodTypeParamName,
+ interestCalculationTypeParamName, interestCalculationDaysInYearTypeParamName, minRequiredOpeningBalanceParamName,
+ lockinPeriodFrequencyParamName, lockinPeriodFrequencyTypeParamName, withdrawalFeeAmountParamName, withdrawalFeeTypeParamName,
+ annualFeeAmountParamName, annualFeeOnMonthDayParamName, "currencyOptions", "interestCompoundingPeriodTypeOptions",
+ "interestPostingPeriodTypeOptions", "interestCalculationTypeOptions", "interestCalculationDaysInYearTypeOptions",
+ "lockinPeriodFrequencyTypeOptions", "withdrawalFeeTypeOptions"));
public static final Set SAVINGS_ACCOUNT_REQUEST_DATA_PARAMETERS = new HashSet(Arrays.asList(localeParamName,
dateFormatParamName, monthDayFormatParamName, accountNoParamName, externalIdParamName, clientIdParamName, groupIdParamName,
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/data/SavingsProductDataValidator.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/data/SavingsProductDataValidator.java
index f900d1474..ed8023a4d 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/data/SavingsProductDataValidator.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/data/SavingsProductDataValidator.java
@@ -12,6 +12,7 @@ import static org.mifosplatform.portfolio.savings.SavingsApiConstants.annualFeeO
import static org.mifosplatform.portfolio.savings.SavingsApiConstants.currencyCodeParamName;
import static org.mifosplatform.portfolio.savings.SavingsApiConstants.descriptionParamName;
import static org.mifosplatform.portfolio.savings.SavingsApiConstants.digitsAfterDecimalParamName;
+import static org.mifosplatform.portfolio.savings.SavingsApiConstants.inMulitplesOfParamName;
import static org.mifosplatform.portfolio.savings.SavingsApiConstants.interestCalculationDaysInYearTypeParamName;
import static org.mifosplatform.portfolio.savings.SavingsApiConstants.interestCalculationTypeParamName;
import static org.mifosplatform.portfolio.savings.SavingsApiConstants.interestCompoundingPeriodTypeParamName;
@@ -87,6 +88,9 @@ public class SavingsProductDataValidator {
final Integer digitsAfterDecimal = fromApiJsonHelper.extractIntegerSansLocaleNamed(digitsAfterDecimalParamName, element);
baseDataValidator.reset().parameter(digitsAfterDecimalParamName).value(digitsAfterDecimal).notNull().inMinMaxRange(0, 6);
+ final Integer inMulitplesOf = fromApiJsonHelper.extractIntegerSansLocaleNamed(inMulitplesOfParamName, element);
+ baseDataValidator.reset().parameter(inMulitplesOfParamName).value(inMulitplesOf).ignoreIfNull().integerZeroOrGreater();
+
final BigDecimal nominalAnnualInterestRate = fromApiJsonHelper.extractBigDecimalWithLocaleNamed(nominalAnnualInterestRateParamName,
element);
baseDataValidator.reset().parameter(nominalAnnualInterestRateParamName).value(nominalAnnualInterestRate).notNull()
@@ -252,6 +256,11 @@ public class SavingsProductDataValidator {
baseDataValidator.reset().parameter(digitsAfterDecimalParamName).value(digitsAfterDecimal).notNull().inMinMaxRange(0, 6);
}
+ if (this.fromApiJsonHelper.parameterExists(inMulitplesOfParamName, element)) {
+ final Integer inMulitplesOf = fromApiJsonHelper.extractIntegerSansLocaleNamed(inMulitplesOfParamName, element);
+ baseDataValidator.reset().parameter(inMulitplesOfParamName).value(inMulitplesOf).ignoreIfNull().integerZeroOrGreater();
+ }
+
if (this.fromApiJsonHelper.parameterExists(nominalAnnualInterestRateParamName, element)) {
final BigDecimal interestRate = fromApiJsonHelper.extractBigDecimalWithLocaleNamed(nominalAnnualInterestRateParamName, element);
baseDataValidator.reset().parameter(nominalAnnualInterestRateParamName).value(interestRate).notNull().zeroOrPositiveAmount();
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsProduct.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsProduct.java
index 68eaaae63..3eefc93c1 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsProduct.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsProduct.java
@@ -12,6 +12,7 @@ import static org.mifosplatform.portfolio.savings.SavingsApiConstants.annualFeeO
import static org.mifosplatform.portfolio.savings.SavingsApiConstants.currencyCodeParamName;
import static org.mifosplatform.portfolio.savings.SavingsApiConstants.descriptionParamName;
import static org.mifosplatform.portfolio.savings.SavingsApiConstants.digitsAfterDecimalParamName;
+import static org.mifosplatform.portfolio.savings.SavingsApiConstants.inMulitplesOfParamName;
import static org.mifosplatform.portfolio.savings.SavingsApiConstants.interestCalculationDaysInYearTypeParamName;
import static org.mifosplatform.portfolio.savings.SavingsApiConstants.interestCalculationTypeParamName;
import static org.mifosplatform.portfolio.savings.SavingsApiConstants.interestCompoundingPeriodTypeParamName;
@@ -279,7 +280,7 @@ public class SavingsProduct extends AbstractPersistable {
actualChanges.put(digitsAfterDecimalParamName, newValue);
actualChanges.put(localeParamName, localeAsInput);
digitsAfterDecimal = newValue;
- this.currency = new MonetaryCurrency(this.currency.getCode(), digitsAfterDecimal);
+ this.currency = new MonetaryCurrency(this.currency.getCode(), digitsAfterDecimal,this.currency.getCurrencyInMulitplesOf());
}
String currencyCode = this.currency.getCode();
@@ -287,7 +288,16 @@ public class SavingsProduct extends AbstractPersistable {
final String newValue = command.stringValueOfParameterNamed(currencyCodeParamName);
actualChanges.put(currencyCodeParamName, newValue);
currencyCode = newValue;
- this.currency = new MonetaryCurrency(currencyCode, this.currency.getDigitsAfterDecimal());
+ this.currency = new MonetaryCurrency(currencyCode, this.currency.getDigitsAfterDecimal(),this.currency.getCurrencyInMulitplesOf());
+ }
+
+ Integer inMulitplesOf = this.currency.getCurrencyInMulitplesOf();
+ if (command.isChangeInIntegerParameterNamed(inMulitplesOfParamName, inMulitplesOf)) {
+ final Integer newValue = command.integerValueOfParameterNamed(inMulitplesOfParamName);
+ actualChanges.put(inMulitplesOfParamName, newValue);
+ actualChanges.put(localeParamName, localeAsInput);
+ inMulitplesOf = newValue;
+ this.currency = new MonetaryCurrency(this.currency.getCode(), this.currency.getDigitsAfterDecimal(),inMulitplesOf);
}
if (command.isChangeInBigDecimalParameterNamed(nominalAnnualInterestRateParamName, this.nominalAnnualInterestRate)) {
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsProductAssembler.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsProductAssembler.java
index 0a01047c2..5cd7cfb84 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsProductAssembler.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsProductAssembler.java
@@ -10,6 +10,7 @@ import static org.mifosplatform.portfolio.savings.SavingsApiConstants.annualFeeO
import static org.mifosplatform.portfolio.savings.SavingsApiConstants.currencyCodeParamName;
import static org.mifosplatform.portfolio.savings.SavingsApiConstants.descriptionParamName;
import static org.mifosplatform.portfolio.savings.SavingsApiConstants.digitsAfterDecimalParamName;
+import static org.mifosplatform.portfolio.savings.SavingsApiConstants.inMulitplesOfParamName;
import static org.mifosplatform.portfolio.savings.SavingsApiConstants.interestCalculationDaysInYearTypeParamName;
import static org.mifosplatform.portfolio.savings.SavingsApiConstants.interestCalculationTypeParamName;
import static org.mifosplatform.portfolio.savings.SavingsApiConstants.interestCompoundingPeriodTypeParamName;
@@ -46,7 +47,8 @@ public class SavingsProductAssembler {
final String currencyCode = command.stringValueOfParameterNamed(currencyCodeParamName);
final Integer digitsAfterDecimal = command.integerValueOfParameterNamed(digitsAfterDecimalParamName);
- MonetaryCurrency currency = new MonetaryCurrency(currencyCode, digitsAfterDecimal);
+ final Integer inMulitplesOf = command.integerValueOfParameterNamed(inMulitplesOfParamName);
+ MonetaryCurrency currency = new MonetaryCurrency(currencyCode, digitsAfterDecimal,inMulitplesOf);
final BigDecimal interestRate = command.bigDecimalValueOfParameterNamed(nominalAnnualInterestRateParamName);
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/service/SavingsAccountReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/service/SavingsAccountReadPlatformServiceImpl.java
index 22078918a..7a0695664 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/service/SavingsAccountReadPlatformServiceImpl.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/service/SavingsAccountReadPlatformServiceImpl.java
@@ -203,7 +203,8 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead
sqlBuilder.append("cbu.username as closedByUsername,");
sqlBuilder.append("cbu.firstname as closedByFirstname, cbu.lastname as closedByLastname,");
- sqlBuilder.append("sa.currency_code as currencyCode, sa.currency_digits as currencyDigits, ");
+ sqlBuilder
+ .append("sa.currency_code as currencyCode, sa.currency_digits as currencyDigits, sa.currency_multiplesof as inMulitplesOf, ");
sqlBuilder.append("curr.name as currencyName, curr.internationalized_name_code as currencyNameCode, ");
sqlBuilder.append("curr.display_symbol as currencyDisplaySymbol, ");
@@ -311,8 +312,9 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead
final String currencyNameCode = rs.getString("currencyNameCode");
final String currencyDisplaySymbol = rs.getString("currencyDisplaySymbol");
final Integer currencyDigits = JdbcSupport.getInteger(rs, "currencyDigits");
- final CurrencyData currency = new CurrencyData(currencyCode, currencyName, currencyDigits, currencyDisplaySymbol,
- currencyNameCode);
+ final Integer inMulitplesOf = JdbcSupport.getInteger(rs, "inMulitplesOf");
+ final CurrencyData currency = new CurrencyData(currencyCode, currencyName, currencyDigits, inMulitplesOf,
+ currencyDisplaySymbol, currencyNameCode);
final BigDecimal nominalAnnualInterestRate = rs.getBigDecimal("nominalAnnualInterestRate");
@@ -542,7 +544,8 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead
sqlBuilder.append("sa.id as savingsId, sa.account_no as accountNo,");
sqlBuilder.append("pd.payment_type_cv_id as paymentType,pd.account_number as accountNumber,pd.check_number as checkNumber, ");
sqlBuilder.append("pd.receipt_number as receiptNumber, pd.bank_number as bankNumber,pd.routing_code as routingCode, ");
- sqlBuilder.append("sa.currency_code as currencyCode, sa.currency_digits as currencyDigits, ");
+ sqlBuilder
+ .append("sa.currency_code as currencyCode, sa.currency_digits as currencyDigits, sa.currency_multiplesof as inMulitplesOf, ");
sqlBuilder.append("curr.name as currencyName, curr.internationalized_name_code as currencyNameCode, ");
sqlBuilder.append("curr.display_symbol as currencyDisplaySymbol, ");
sqlBuilder.append("cv.code_value as paymentTypeName ");
@@ -596,8 +599,9 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead
final String currencyNameCode = rs.getString("currencyNameCode");
final String currencyDisplaySymbol = rs.getString("currencyDisplaySymbol");
final Integer currencyDigits = JdbcSupport.getInteger(rs, "currencyDigits");
- final CurrencyData currency = new CurrencyData(currencyCode, currencyName, currencyDigits, currencyDisplaySymbol,
- currencyNameCode);
+ final Integer inMulitplesOf = JdbcSupport.getInteger(rs, "inMulitplesOf");
+ final CurrencyData currency = new CurrencyData(currencyCode, currencyName, currencyDigits, inMulitplesOf,
+ currencyDisplaySymbol, currencyNameCode);
AccountTransferData transfer = null;
final Long fromTransferId = JdbcSupport.getLong(rs, "fromTransferId");
@@ -632,7 +636,8 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead
public SavingsAccountTransactionTemplateMapper() {
final StringBuilder sqlBuilder = new StringBuilder(400);
sqlBuilder.append("sa.id as id, sa.account_no as accountNo, ");
- sqlBuilder.append("sa.currency_code as currencyCode, sa.currency_digits as currencyDigits, ");
+ sqlBuilder
+ .append("sa.currency_code as currencyCode, sa.currency_digits as currencyDigits, sa.currency_multiplesof as inMulitplesOf, ");
sqlBuilder.append("curr.name as currencyName, curr.internationalized_name_code as currencyNameCode, ");
sqlBuilder.append("curr.display_symbol as currencyDisplaySymbol, ");
sqlBuilder.append("sa.min_required_opening_balance as minRequiredOpeningBalance ");
@@ -657,8 +662,9 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead
final String currencyNameCode = rs.getString("currencyNameCode");
final String currencyDisplaySymbol = rs.getString("currencyDisplaySymbol");
final Integer currencyDigits = JdbcSupport.getInteger(rs, "currencyDigits");
- final CurrencyData currency = new CurrencyData(currencyCode, currencyName, currencyDigits, currencyDisplaySymbol,
- currencyNameCode);
+ final Integer inMulitplesOf = JdbcSupport.getInteger(rs, "inMulitplesOf");
+ final CurrencyData currency = new CurrencyData(currencyCode, currencyName, currencyDigits, inMulitplesOf,
+ currencyDisplaySymbol, currencyNameCode);
return SavingsAccountTransactionData.template(savingsId, accountNo, DateUtils.getLocalDateOfTenant(), currency);
}
@@ -677,7 +683,8 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead
final StringBuilder sqlBuilder = new StringBuilder(400);
sqlBuilder.append("sp.id as productId, sp.name as productName, ");
- sqlBuilder.append("sp.currency_code as currencyCode, sp.currency_digits as currencyDigits, ");
+ sqlBuilder
+ .append("sp.currency_code as currencyCode, sp.currency_digits as currencyDigits, sp.currency_multiplesof as inMulitplesOf, ");
sqlBuilder.append("curr.name as currencyName, curr.internationalized_name_code as currencyNameCode, ");
sqlBuilder.append("curr.display_symbol as currencyDisplaySymbol, ");
sqlBuilder.append("sp.nominal_annual_interest_rate as nominalAnnualIterestRate, ");
@@ -714,8 +721,9 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead
final String currencyNameCode = rs.getString("currencyNameCode");
final String currencyDisplaySymbol = rs.getString("currencyDisplaySymbol");
final Integer currencyDigits = JdbcSupport.getInteger(rs, "currencyDigits");
- final CurrencyData currency = new CurrencyData(currencyCode, currencyName, currencyDigits, currencyDisplaySymbol,
- currencyNameCode);
+ final Integer inMulitplesOf = JdbcSupport.getInteger(rs, "inMulitplesOf");
+ final CurrencyData currency = new CurrencyData(currencyCode, currencyName, currencyDigits, inMulitplesOf,
+ currencyDisplaySymbol, currencyNameCode);
final BigDecimal nominalAnnualIterestRate = rs.getBigDecimal("nominalAnnualIterestRate");
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/service/SavingsProductReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/service/SavingsProductReadPlatformServiceImpl.java
index a66c18f53..46f01275d 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/service/SavingsProductReadPlatformServiceImpl.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/service/SavingsProductReadPlatformServiceImpl.java
@@ -75,7 +75,8 @@ public class SavingsProductReadPlatformServiceImpl implements SavingsProductRead
public SavingProductMapper() {
final StringBuilder sqlBuilder = new StringBuilder(400);
sqlBuilder.append("sp.id as id, sp.name as name, sp.description as description, ");
- sqlBuilder.append("sp.currency_code as currencyCode, sp.currency_digits as currencyDigits, ");
+ sqlBuilder
+ .append("sp.currency_code as currencyCode, sp.currency_digits as currencyDigits, sp.currency_multiplesof as inMulitplesOf, ");
sqlBuilder.append("curr.name as currencyName, curr.internationalized_name_code as currencyNameCode, ");
sqlBuilder.append("curr.display_symbol as currencyDisplaySymbol, ");
sqlBuilder.append("sp.nominal_annual_interest_rate as nominalAnnualInterestRate, ");
@@ -114,9 +115,9 @@ public class SavingsProductReadPlatformServiceImpl implements SavingsProductRead
String currencyNameCode = rs.getString("currencyNameCode");
String currencyDisplaySymbol = rs.getString("currencyDisplaySymbol");
Integer currencyDigits = JdbcSupport.getInteger(rs, "currencyDigits");
-
- final CurrencyData currency = new CurrencyData(currencyCode, currencyName, currencyDigits, currencyDisplaySymbol,
- currencyNameCode);
+ final Integer inMulitplesOf = JdbcSupport.getInteger(rs, "inMulitplesOf");
+ final CurrencyData currency = new CurrencyData(currencyCode, currencyName, currencyDigits, inMulitplesOf,
+ currencyDisplaySymbol, currencyNameCode);
final BigDecimal nominalAnnualInterestRate = rs.getBigDecimal("nominalAnnualInterestRate");
final Integer compoundingInterestPeriodTypeValue = JdbcSupport.getInteger(rs, "compoundingInterestPeriodType");
diff --git a/mifosng-provider/src/test/java/org/mifosplatform/portfolio/loanaccount/MonetaryCurrencyBuilder.java b/mifosng-provider/src/test/java/org/mifosplatform/portfolio/loanaccount/MonetaryCurrencyBuilder.java
index 1a4a26e5b..bb7d3199a 100644
--- a/mifosng-provider/src/test/java/org/mifosplatform/portfolio/loanaccount/MonetaryCurrencyBuilder.java
+++ b/mifosng-provider/src/test/java/org/mifosplatform/portfolio/loanaccount/MonetaryCurrencyBuilder.java
@@ -6,9 +6,10 @@ public class MonetaryCurrencyBuilder {
private String code = "XOF";
private int digitsAfterDecimal = 0;
+ private Integer inMulitplesOf = null;
public MonetaryCurrency build() {
- return new MonetaryCurrency(code, digitsAfterDecimal);
+ return new MonetaryCurrency(code, digitsAfterDecimal,inMulitplesOf);
}
public MonetaryCurrencyBuilder withCode(final String withCode) {