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: +

+

+

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 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) {