Shares Integration Tests and Fixes
Project: http://git-wip-us.apache.org/repos/asf/incubator-fineract/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-fineract/commit/7ae9b67d Tree: http://git-wip-us.apache.org/repos/asf/incubator-fineract/tree/7ae9b67d Diff: http://git-wip-us.apache.org/repos/asf/incubator-fineract/diff/7ae9b67d Branch: refs/heads/develop Commit: 7ae9b67d930c50b736d995910c4b8f3184569db7 Parents: 0b81e80 Author: Nazeer Hussain Shaik <nazeer.sh...@confluxtechnologies.com> Authored: Tue May 17 12:34:22 2016 +0530 Committer: Nazeer Hussain Shaik <nazeer.sh...@confluxtechnologies.com> Committed: Tue May 17 12:34:54 2016 +0530 ---------------------------------------------------------------------- .../common/charges/ChargesHelper.java | 67 +- .../shares/DividendsIntegrationTests.java | 203 ++++ .../common/shares/ShareAccountHelper.java | 144 +++ .../shares/ShareAccountIntegrationTests.java | 1032 ++++++++++++++++++ .../shares/ShareAccountTransactionHelper.java | 55 + .../shares/ShareDividendsTransactionHelper.java | 58 + .../common/shares/ShareProductHelper.java | 199 ++++ .../shares/ShareProductTransactionHelper.java | 51 + .../accounts/api/AccountsApiResource.java | 56 +- .../service/AccountReadPlatformService.java | 4 +- .../fineract/portfolio/note/domain/Note.java | 17 + .../portfolio/note/domain/NoteType.java | 5 +- .../products/api/ProductsApiResource.java | 61 +- .../exception/ResourceNotFoundException.java | 33 + .../shareaccounts/domain/ShareAccount.java | 29 +- .../domain/ShareAccountTransaction.java | 4 + .../ShareAccountDataSerializer.java | 108 +- .../ShareAccountReadPlatformServiceImpl.java | 49 +- ...ntWritePlatformServiceJpaRepositoryImpl.java | 34 +- .../service/SharesEnumerations.java | 33 +- .../ShareProductDataSerializer.java | 3 +- .../ShareProductReadPlatformServiceImpl.java | 19 +- .../core_db/V307__add_share_notes.sql | 2 + 23 files changed, 2136 insertions(+), 130 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/7ae9b67d/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/charges/ChargesHelper.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/charges/ChargesHelper.java b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/charges/ChargesHelper.java index c8134a6..b4b7dc5 100755 --- a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/charges/ChargesHelper.java +++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/charges/ChargesHelper.java @@ -37,7 +37,8 @@ public class ChargesHelper { private static final Integer CHARGE_APPLIES_TO_LOAN = 1; private static final Integer CHARGE_APPLIES_TO_SAVINGS = 2; private static final Integer CHARGE_APPLIES_TO_CLIENT = 3; - + private static final Integer CHARGE_APPLIES_TO_SHARES = 4; + private static final Integer CHARGE_DISBURSEMENT_FEE = 1; private static final Integer CHARGE_SPECIFIED_DUE_DATE = 2; private static final Integer CHARGE_SAVINGS_ACTIVATION_FEE = 3; @@ -48,6 +49,10 @@ public class ChargesHelper { private static final Integer CHARGE_OVERDUE_INSTALLMENT_FEE = 9; private static final Integer CHARGE_OVERDRAFT_FEE = 10; private static final Integer WEEKLY_FEE = 11; + private static final Integer SHAREACCOUNT_ACTIVATION = 13 ; + private static final Integer SHARE_PURCHASE = 14 ; + private static final Integer SHARE_REDEEM = 15 ; + private static final Integer CHARGE_SAVINGS_NO_ACTIVITY_FEE = 16; private static final Integer CHARGE_CLIENT_SPECIFIED_DUE_DATE = 1; @@ -235,6 +240,27 @@ public class ChargesHelper { return getLoanInstallmentJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, ChargesHelper.amount, ChargesHelper.penalty); } + public static String getShareAccountActivationChargeJson() { + HashMap<String, Object> map = populateDefaultsShareActivationCharge() ; + String chargesCreateJson = new Gson().toJson(map); + System.out.println(chargesCreateJson); + return chargesCreateJson; + } + + public static String getShareAccountPurchaseChargeJson() { + HashMap<String, Object> map = populateDefaultsSharePurchaseFlatCharge() ; + String chargesCreateJson = new Gson().toJson(map); + System.out.println(chargesCreateJson); + return chargesCreateJson; + } + + public static String getShareAccountRedeemChargeJson() { + HashMap<String, Object> map = populateDefaultsShareRedeemFlatCharge() ; + String chargesCreateJson = new Gson().toJson(map); + System.out.println(chargesCreateJson); + return chargesCreateJson; + } + public static String getLoanOverdueFeeJSON() { final HashMap<String, Object> map = populateDefaultsForLoan(); map.put("penalty", ChargesHelper.penalty); @@ -287,6 +313,45 @@ public class ChargesHelper { return map; } + public static HashMap<String, Object> populateDefaultsShareActivationCharge() { + final HashMap<String, Object> map = new HashMap<>(); + map.put("active", ChargesHelper.active); + map.put("amount", ChargesHelper.amount); + map.put("chargeAppliesTo", ChargesHelper.CHARGE_APPLIES_TO_SHARES); + map.put("chargeCalculationType", ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT); + map.put("chargeTimeType",ChargesHelper.SHAREACCOUNT_ACTIVATION); + map.put("currencyCode", ChargesHelper.currencyCode); + map.put("locale", CommonConstants.locale); + map.put("name", Utils.randomNameGenerator("Charge_Share_Activation_", 8)); + return map; + } + + public static HashMap<String, Object> populateDefaultsSharePurchaseFlatCharge() { + final HashMap<String, Object> map = new HashMap<>(); + map.put("active", ChargesHelper.active); + map.put("amount", ChargesHelper.amount); + map.put("chargeAppliesTo", ChargesHelper.CHARGE_APPLIES_TO_SHARES); + map.put("chargeCalculationType", ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT); + map.put("chargeTimeType",ChargesHelper.SHARE_PURCHASE); + map.put("currencyCode", ChargesHelper.currencyCode); + map.put("locale", CommonConstants.locale); + map.put("name", Utils.randomNameGenerator("Charge_Share_Purchase_", 8)); + return map; + } + + public static HashMap<String, Object> populateDefaultsShareRedeemFlatCharge() { + final HashMap<String, Object> map = new HashMap<>(); + map.put("active", ChargesHelper.active); + map.put("amount", ChargesHelper.amount); + map.put("chargeAppliesTo", ChargesHelper.CHARGE_APPLIES_TO_SHARES); + map.put("chargeCalculationType", ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT); + map.put("chargeTimeType",ChargesHelper.SHARE_REDEEM); + map.put("currencyCode", ChargesHelper.currencyCode); + map.put("locale", CommonConstants.locale); + map.put("name", Utils.randomNameGenerator("Charge_Share_Redeem_", 8)); + return map; + } + public static Integer createCharges(final RequestSpecification requestSpec, final ResponseSpecification responseSpec, final String request) { return Utils.performServerPost(requestSpec, responseSpec, CREATE_CHARGES_URL, request, "resourceId"); http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/7ae9b67d/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/shares/DividendsIntegrationTests.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/shares/DividendsIntegrationTests.java b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/shares/DividendsIntegrationTests.java new file mode 100644 index 0000000..5634dce --- /dev/null +++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/shares/DividendsIntegrationTests.java @@ -0,0 +1,203 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.integrationtests.common.shares; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.fineract.integrationtests.common.ClientHelper; +import org.apache.fineract.integrationtests.common.Utils; +import org.apache.fineract.integrationtests.common.savings.SavingsAccountHelper; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.google.gson.Gson; +import com.jayway.restassured.builder.RequestSpecBuilder; +import com.jayway.restassured.builder.ResponseSpecBuilder; +import com.jayway.restassured.http.ContentType; +import com.jayway.restassured.specification.RequestSpecification; +import com.jayway.restassured.specification.ResponseSpecification; + + +public class DividendsIntegrationTests { + + private final String[] dates = {"01 Jan 2015", "01 Apr 2015", "01 Oct 2015", "01 Dec 2015", "01 Mar 2016"} ; + private final String[] shares = {"100", "200", "300", "100", "500"} ; + + private RequestSpecification requestSpec; + private ResponseSpecification responseSpec; + + @Before + public void setup() { + Utils.initializeRESTAssured(); + this.requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build(); + this.requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey()); + this.responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build(); + } + + @SuppressWarnings("unchecked") + @Test + public void testCreateDividends() { + DateFormat simple = new SimpleDateFormat("dd MMM yyyy"); + final Integer productId = createShareProduct() ; + ArrayList<Integer> clients = new ArrayList<>() ; + ArrayList<Integer> savingAccounts = new ArrayList<>() ; + ArrayList<Integer> shareAccounts = new ArrayList<>() ; + for(int i = 0 ; i < 5; i++) { + final Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec); + clients.add(clientId) ; + Assert.assertNotNull(clientId); + Integer savingsAccountId = SavingsAccountHelper.openSavingsAccount(requestSpec, responseSpec, clientId, "1000"); + savingAccounts.add(savingsAccountId) ; + Assert.assertNotNull(savingsAccountId); + final Integer shareAccountId = createShareAccount(clientId, productId, savingsAccountId, dates[i], shares[i]); + shareAccounts.add(shareAccountId) ; + Assert.assertNotNull(shareAccountId); + Map<String, Object> shareAccountData = ShareAccountTransactionHelper + .retrieveShareAccount(shareAccountId, requestSpec, responseSpec); + Assert.assertNotNull(shareAccountData); + // Approve share Account + Map<String, Object> approveMap = new HashMap<>(); + approveMap.put("note", "Share Account Approval Note"); + approveMap.put("dateFormat", "dd MMMM yyyy"); + approveMap.put("approvedDate", "01 Jan 2016"); + approveMap.put("locale", "en"); + String approve = new Gson().toJson(approveMap); + ShareAccountTransactionHelper.postCommand("approve", shareAccountId, approve, requestSpec, responseSpec); + //Activate Share Account + Map<String, Object> activateMap = new HashMap<>(); + activateMap.put("dateFormat", "dd MMMM yyyy"); + activateMap.put("activatedDate", "01 Jan 2016"); + activateMap.put("locale", "en"); + String activateJson = new Gson().toJson(activateMap); + ShareAccountTransactionHelper.postCommand("activate", shareAccountId, activateJson, requestSpec, responseSpec); + } + + Map<String, Object> dividendsMap = new HashMap<>() ; + dividendsMap.put("dividendPeriodStartDate", "01 Jan 2015") ; + dividendsMap.put("dividendPeriodEndDate", "01 Apr 2016") ; + dividendsMap.put("dividendAmount", "50000") ; + dividendsMap.put("dateFormat", "dd MMMM yyyy"); + dividendsMap.put("locale", "en"); + String createDividendsJson = new Gson().toJson(dividendsMap); + final Integer dividendId = ShareDividendsTransactionHelper.createShareProductDividends(productId, createDividendsJson, requestSpec, responseSpec) ; + + Map<String, Object> productdividends = ShareDividendsTransactionHelper.retrieveAllDividends(productId, requestSpec, responseSpec); + Assert.assertEquals("1", String.valueOf(productdividends.get("totalFilteredRecords"))); + Map<String,Object> dividend = ((List<Map<String,Object>>)productdividends.get("pageItems")).get(0) ; + Assert.assertEquals("50000.0", String.valueOf(dividend.get("amount"))) ; + Map<String, Object> status = (Map<String, Object>)dividend.get("status") ; + Assert.assertEquals("shareAccountDividendStatusType.initiated", String.valueOf(status.get("code"))); + List<Integer> startdateList = (List<Integer>) dividend.get("dividendPeriodStartDate"); + Calendar cal = Calendar.getInstance(); + cal.set(startdateList.get(0), startdateList.get(1) - 1, startdateList.get(2)); + Date startDate = cal.getTime(); + Assert.assertEquals("01 Jan 2015", simple.format(startDate)); + List<Integer> enddateList = (List<Integer>) dividend.get("dividendPeriodEndDate"); + cal = Calendar.getInstance(); + cal.set(enddateList.get(0), enddateList.get(1) - 1, enddateList.get(2)); + Date endDate = cal.getTime(); + Assert.assertEquals("01 Apr 2016", simple.format(endDate)); + + + + Map<String, Object> dividenddetails = ShareDividendsTransactionHelper.retrieveDividendDetails(productId, dividendId, requestSpec, responseSpec) ; + Assert.assertEquals("5", String.valueOf(dividenddetails.get("totalFilteredRecords"))); + List<Map<String, Object>> pageItems = (List<Map<String, Object>>)dividenddetails.get("pageItems") ; + for(Map<String, Object> dividendData: pageItems) { + Map<String, Object> accountData = (Map<String, Object>) dividendData.get("accountData") ; + String accountId = String.valueOf(accountData.get("id")) ; + if(String.valueOf(shareAccounts.get(0)).equals(accountId)) { + Assert.assertEquals("11320.755", String.valueOf(dividendData.get("amount"))); + }else if(String.valueOf(shareAccounts.get(1)).equals(accountId)) { + Assert.assertEquals("18172.791", String.valueOf(dividendData.get("amount"))); + }else if(String.valueOf(shareAccounts.get(2)).equals(accountId)) { + Assert.assertEquals("13629.593", String.valueOf(dividendData.get("amount"))); + }else if(String.valueOf(shareAccounts.get(3)).equals(accountId)) { + Assert.assertEquals("3028.7983", String.valueOf(dividendData.get("amount"))); + }else if(String.valueOf(shareAccounts.get(4)).equals(accountId)) { + Assert.assertEquals("3848.0637", String.valueOf(dividendData.get("amount"))); + } + Map<String, Object> statusMap = (Map<String, Object>) dividendData.get("status") ; + Assert.assertEquals("shareAccountDividendStatusType.initiated", String.valueOf(statusMap.get("code"))) ; + } + + String jsonString = "" ; + ShareDividendsTransactionHelper.postCommand("approve", productId, dividendId, jsonString, requestSpec, responseSpec) ; + + productdividends = ShareDividendsTransactionHelper.retrieveAllDividends(productId, requestSpec, responseSpec); + Assert.assertEquals("1", String.valueOf(productdividends.get("totalFilteredRecords"))); + dividend = ((List<Map<String,Object>>)productdividends.get("pageItems")).get(0) ; + Assert.assertEquals("50000.0", String.valueOf(dividend.get("amount"))) ; + status = (Map<String, Object>)dividend.get("status") ; + Assert.assertEquals("shareAccountDividendStatusType.approved", String.valueOf(status.get("code"))); + startdateList = (List<Integer>) dividend.get("dividendPeriodStartDate"); + cal = Calendar.getInstance(); + cal.set(startdateList.get(0), startdateList.get(1) - 1, startdateList.get(2)); + startDate = cal.getTime(); + Assert.assertEquals("01 Jan 2015", simple.format(startDate)); + enddateList = (List<Integer>) dividend.get("dividendPeriodEndDate"); + cal = Calendar.getInstance(); + cal.set(enddateList.get(0), enddateList.get(1) - 1, enddateList.get(2)); + endDate = cal.getTime(); + Assert.assertEquals("01 Apr 2016", simple.format(endDate)); + + dividenddetails = ShareDividendsTransactionHelper.retrieveDividendDetails(productId, dividendId, requestSpec, responseSpec) ; + Assert.assertEquals("5", String.valueOf(dividenddetails.get("totalFilteredRecords"))); + pageItems = (List<Map<String, Object>>)dividenddetails.get("pageItems") ; + for(Map<String, Object> dividendData: pageItems) { + Map<String, Object> accountData = (Map<String, Object>) dividendData.get("accountData") ; + String accountId = String.valueOf(accountData.get("id")) ; + if(String.valueOf(shareAccounts.get(0)).equals(accountId)) { + Assert.assertEquals("11320.755", String.valueOf(dividendData.get("amount"))); + }else if(String.valueOf(shareAccounts.get(1)).equals(accountId)) { + Assert.assertEquals("18172.791", String.valueOf(dividendData.get("amount"))); + }else if(String.valueOf(shareAccounts.get(2)).equals(accountId)) { + Assert.assertEquals("13629.593", String.valueOf(dividendData.get("amount"))); + }else if(String.valueOf(shareAccounts.get(3)).equals(accountId)) { + Assert.assertEquals("3028.7983", String.valueOf(dividendData.get("amount"))); + }else if(String.valueOf(shareAccounts.get(4)).equals(accountId)) { + Assert.assertEquals("3848.0637", String.valueOf(dividendData.get("amount"))); + } + Map<String, Object> statusMap = (Map<String, Object>) dividendData.get("status") ; + Assert.assertEquals("shareAccountDividendStatusType.initiated", String.valueOf(statusMap.get("code"))) ; + } + + } + + private Integer createShareProduct() { + String shareProductJson = new ShareProductHelper().build(); + return ShareProductTransactionHelper.createShareProduct(shareProductJson, requestSpec, responseSpec); + } + + private Integer createShareAccount(final Integer clientId, final Integer productId, final Integer savingsAccountId, + String applicationDate, String requestedShares) { + String josn = new ShareAccountHelper().withClientId(String.valueOf(clientId)).withProductId(String.valueOf(productId)) + .withExternalId("External1").withSavingsAccountId(String.valueOf(savingsAccountId)).withSubmittedDate("01 Jan 2016") + .withApplicationDate(applicationDate).withRequestedShares(requestedShares).build(); + return ShareAccountTransactionHelper.createShareAccount(josn, requestSpec, responseSpec); + } +} http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/7ae9b67d/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/shares/ShareAccountHelper.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/shares/ShareAccountHelper.java b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/shares/ShareAccountHelper.java new file mode 100644 index 0000000..9984656 --- /dev/null +++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/shares/ShareAccountHelper.java @@ -0,0 +1,144 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.integrationtests.common.shares; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.google.gson.Gson; + + +public class ShareAccountHelper { + + private static final String LOCALE = "en_GB"; + + private String clientId ; + + private String productId ; + + private String submittedDate ; + + private String externalId ; + + private String savingsAccountId ; + + private String requestedShares ; + + private String applicationDate ; + + private String allowDividendCalculationForInactiveClients ; + + private String minimumActivePeriod ; + + private String minimumActivePeriodFrequencyType ; + + private String lockinPeriodFrequency ; + + private String lockinPeriodFrequencyType ; + + private List<Map<String, Object>> charges = null ; + //chargeId , amount + + public String build() { + final HashMap<String, Object> map = new HashMap<>(); + map.put("locale", LOCALE); + if(this.clientId != null) { + map.put("clientId", this.clientId) ; + } + if(this.productId != null) { + map.put("productId", this.productId) ; + } + map.put("dateFormat", "dd MMMM yyyy"); + + if(this.savingsAccountId != null) { + map.put("savingsAccountId", savingsAccountId) ; + } + + if(externalId != null) { + map.put("externalId", this.externalId) ; + } + + if(submittedDate != null) { + map.put("submittedDate", this.submittedDate) ; + } + + if(applicationDate != null) { + map.put("applicationDate", this.applicationDate) ; + } + + if(this.requestedShares != null) { + map.put("requestedShares", this.requestedShares) ; + } + + if(this.allowDividendCalculationForInactiveClients != null) { + map.put("allowDividendCalculationForInactiveClients", this.allowDividendCalculationForInactiveClients) ; + } + + if(this.charges != null) { + map.put("charges", this.charges) ; + } + + String shareAccountCreateJson = new Gson().toJson(map); + System.out.println(shareAccountCreateJson); + return shareAccountCreateJson; + } + + public ShareAccountHelper withClientId(final String clientId) { + this.clientId = clientId ; + return this ; + } + + public ShareAccountHelper withProductId(final String productId) { + this.productId = productId ; + return this ; + } + + public ShareAccountHelper withSavingsAccountId(final String savingsAccountId) { + this.savingsAccountId = savingsAccountId ; + return this ; + } + + public ShareAccountHelper withSubmittedDate(final String submittedDate) { + this.submittedDate = submittedDate ; + return this ; + } + + public ShareAccountHelper withRequestedShares(final String requestedShares) { + this.requestedShares = requestedShares ; + return this ; + } + + public ShareAccountHelper withApplicationDate(final String applicationDate) { + this.applicationDate = applicationDate ; + return this ; + } + + public ShareAccountHelper withExternalId(final String externalId) { + this.externalId = externalId ; + return this ; + } + + public ShareAccountHelper withCharges(final List<Map<String,Object>> charges) { + this.charges = new ArrayList<>() ; + this.charges.addAll(charges) ; + return this ; + } +}