This is an automated email from the ASF dual-hosted git repository.

adamsaghy pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git


The following commit(s) were added to refs/heads/develop by this push:
     new cd2f2f810 FINERACT-1805: Fix getting details of a share transactions
cd2f2f810 is described below

commit cd2f2f81026cbeee7adf8ec7edf3d7977c5ec49c
Author: mariiaKraievska <mariia.kraiev...@onix-systems.com>
AuthorDate: Thu Nov 30 21:54:04 2023 +0200

    FINERACT-1805: Fix getting details of a share transactions
---
 .../JournalEntryReadPlatformServiceImpl.java       |  7 +-
 .../AccountingScenarioIntegrationTest.java         | 76 +++++++++++++++++++++-
 .../common/accounting/AccountHelper.java           |  7 ++
 .../common/accounting/JournalEntryHelper.java      | 24 +++++++
 .../common/shares/ShareProductHelper.java          | 37 +++++++++++
 5 files changed, 148 insertions(+), 3 deletions(-)

diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryReadPlatformServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryReadPlatformServiceImpl.java
index 88a826c17..603f652af 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryReadPlatformServiceImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryReadPlatformServiceImpl.java
@@ -201,8 +201,11 @@ public class JournalEntryReadPlatformServiceImpl 
implements JournalEntryReadPlat
                     noteData = new NoteData(noteId, null, null, null, null, 
null, null, null, note, null, null, null, null, null, null);
                 }
                 Long transaction = null;
-                if (entityType != null) {
-                    transaction = 
Long.parseLong(transactionId.substring(1).trim());
+                if (entityType != null && transactionId != null) {
+                    String numericPart = transactionId.replaceAll("[^\\d]", 
"");
+                    if (!numericPart.isEmpty()) {
+                        transaction = Long.parseLong(numericPart);
+                    }
                 }
 
                 TransactionTypeEnumData transactionTypeEnumData = null;
diff --git 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/AccountingScenarioIntegrationTest.java
 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/AccountingScenarioIntegrationTest.java
index c8c09f947..aca2e099e 100644
--- 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/AccountingScenarioIntegrationTest.java
+++ 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/AccountingScenarioIntegrationTest.java
@@ -20,6 +20,7 @@ package org.apache.fineract.integrationtests;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
+import com.google.gson.Gson;
 import io.restassured.builder.RequestSpecBuilder;
 import io.restassured.builder.ResponseSpecBuilder;
 import io.restassured.http.ContentType;
@@ -42,7 +43,9 @@ import java.util.Calendar;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map;
 import java.util.TimeZone;
+import 
org.apache.fineract.client.models.GetJournalEntriesTransactionIdResponse;
 import org.apache.fineract.integrationtests.common.ClientHelper;
 import org.apache.fineract.integrationtests.common.CollateralManagementHelper;
 import org.apache.fineract.integrationtests.common.CommonConstants;
@@ -68,6 +71,10 @@ import 
org.apache.fineract.integrationtests.common.recurringdeposit.RecurringDep
 import 
org.apache.fineract.integrationtests.common.savings.SavingsAccountHelper;
 import 
org.apache.fineract.integrationtests.common.savings.SavingsProductHelper;
 import 
org.apache.fineract.integrationtests.common.savings.SavingsStatusChecker;
+import org.apache.fineract.integrationtests.common.shares.ShareAccountHelper;
+import 
org.apache.fineract.integrationtests.common.shares.ShareAccountTransactionHelper;
+import org.apache.fineract.integrationtests.common.shares.ShareProductHelper;
+import 
org.apache.fineract.integrationtests.common.shares.ShareProductTransactionHelper;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -341,7 +348,7 @@ public class AccountingScenarioIntegrationTest {
 
         this.savingsAccountHelper.addChargesForSavings(savingsID, 
withdrawalChargeId, false);
         ArrayList<HashMap> chargesPendingState = 
this.savingsAccountHelper.getSavingsCharges(savingsID);
-        Assertions.assertEquals(1, chargesPendingState.size());
+        assertEquals(1, chargesPendingState.size());
         HashMap savingsChargeForPay = chargesPendingState.get(0);
         HashMap paidCharge = 
this.savingsAccountHelper.getSavingsCharge(savingsID, (Integer) 
savingsChargeForPay.get("id"));
         Float chargeAmount = (Float) paidCharge.get("amount");
@@ -1115,4 +1122,71 @@ public class AccountingScenarioIntegrationTest {
         return LocalDate.parse(dateAsString, Utils.dateFormatter);
     }
 
+    @Test
+    public void checkAccountingWithSharingFlow() {
+        this.savingsAccountHelper = new SavingsAccountHelper(requestSpec, 
responseSpec);
+
+        final Account assetAccount = this.accountHelper.createAssetAccount();
+        final Account incomeAccount = this.accountHelper.createIncomeAccount();
+        final Account equityAccount = this.accountHelper.createEquityAccount();
+        final Account liabilityAccount = 
this.accountHelper.createLiabilityAccount();
+
+        final Integer shareProductID = createSharesProduct(assetAccount, 
incomeAccount, equityAccount, liabilityAccount);
+
+        final Integer clientID = ClientHelper.createClient(requestSpec, 
responseSpec, DATE_OF_JOINING);
+        Assertions.assertNotNull(clientID);
+        final Integer savingsAccountId = 
SavingsAccountHelper.openSavingsAccount(requestSpec, responseSpec, clientID, 
"1000");
+        Assertions.assertNotNull(savingsAccountId);
+        final Integer shareAccountId = createShareAccount(clientID, 
shareProductID, savingsAccountId);
+        Assertions.assertNotNull(shareAccountId);
+        final Map<String, Object> shareAccountData = 
ShareAccountTransactionHelper.retrieveShareAccount(shareAccountId, requestSpec,
+                responseSpec);
+        Assertions.assertNotNull(shareAccountData);
+        // Approve share Account
+        final 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");
+        final String approve = new Gson().toJson(approveMap);
+        ShareAccountTransactionHelper.postCommand("approve", shareAccountId, 
approve, requestSpec, responseSpec);
+        // Activate Share Account
+        final Map<String, Object> activateMap = new HashMap<>();
+        activateMap.put("dateFormat", "dd MMMM yyyy");
+        activateMap.put("activatedDate", "01 Jan 2016");
+        activateMap.put("locale", "en");
+        final String activateJson = new Gson().toJson(activateMap);
+        ShareAccountTransactionHelper.postCommand("activate", shareAccountId, 
activateJson, requestSpec, responseSpec);
+
+        // Checking sharing entries.
+        final JournalEntry[] assetAccountEntry = { new 
JournalEntry(Float.parseFloat("200"), JournalEntry.TransactionType.DEBIT) };
+        final JournalEntry[] liabilityAccountEntry = { new 
JournalEntry(Float.parseFloat("200"), JournalEntry.TransactionType.CREDIT) };
+        final JournalEntry[] checkJournalEntryForEquityAccount = {
+                new JournalEntry(Float.parseFloat("200"), 
JournalEntry.TransactionType.CREDIT) };
+        this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, 
"01 Jan 2016", assetAccountEntry);
+        
this.journalEntryHelper.checkJournalEntryForLiabilityAccount(liabilityAccount, 
"01 Jan 2016", liabilityAccountEntry);
+        
this.journalEntryHelper.checkJournalEntryForEquityAccount(equityAccount, "01 
Jan 2016", checkJournalEntryForEquityAccount);
+
+        final String transactionId = 
this.journalEntryHelper.getJournalEntryTransactionIdByAccount(assetAccount, "01 
Jan 2016",
+                assetAccountEntry);
+        Assertions.assertNotEquals("", transactionId);
+
+        final GetJournalEntriesTransactionIdResponse 
journalEntriesTransactionIdResponse = this.journalEntryHelper
+                .getJournalEntries(transactionId);
+        Assertions.assertNotNull(journalEntriesTransactionIdResponse);
+    }
+
+    public static Integer createSharesProduct(final Account... accounts) {
+        LOG.info("------------------------------CREATING NEW SHARE PRODUCT 
---------------------------------------");
+        final String shareProductJSON = new 
ShareProductHelper().withCashBasedAccounting(accounts).build();
+        return 
ShareProductTransactionHelper.createShareProduct(shareProductJSON, requestSpec, 
responseSpec);
+    }
+
+    private Integer createShareAccount(final Integer clientId, final Integer 
productId, final Integer savingsAccountId) {
+        final String shareAccountJSON = new 
ShareAccountHelper().withClientId(String.valueOf(clientId))
+                
.withProductId(String.valueOf(productId)).withExternalId("External1").withSavingsAccountId(String.valueOf(savingsAccountId))
+                .withSubmittedDate("01 Jan 2016").withApplicationDate("01 Jan 
2016").withRequestedShares("100").build();
+        return 
ShareAccountTransactionHelper.createShareAccount(shareAccountJSON, requestSpec, 
responseSpec);
+    }
+
 }
diff --git 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/accounting/AccountHelper.java
 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/accounting/AccountHelper.java
index cc98632cc..0d2a50392 100644
--- 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/accounting/AccountHelper.java
+++ 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/accounting/AccountHelper.java
@@ -69,6 +69,13 @@ public class AccountHelper extends IntegrationTest {
         return new Account(accountID, Account.AccountType.LIABILITY);
     }
 
+    public Account createEquityAccount() {
+        final String equityAccountJSON = new 
GLAccountBuilder().withAccountTypeAsAsEquity().build();
+        final Integer accountID = Utils.performServerPost(this.requestSpec, 
this.responseSpec, CREATE_GL_ACCOUNT_URL, equityAccountJSON,
+                GL_ACCOUNT_ID_RESPONSE);
+        return new Account(accountID, Account.AccountType.EQUITY);
+    }
+
     public ArrayList getAccountingWithRunningBalances() {
         final String GET_RUNNING_BALANCE_URL = 
"/fineract-provider/api/v1/glaccounts?fetchRunningBalance=true";
         final ArrayList<HashMap> accountRunningBalance = 
Utils.performServerGet(this.requestSpec, this.responseSpec,
diff --git 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/accounting/JournalEntryHelper.java
 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/accounting/JournalEntryHelper.java
index d1b771abd..a46407468 100644
--- 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/accounting/JournalEntryHelper.java
+++ 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/accounting/JournalEntryHelper.java
@@ -61,6 +61,10 @@ public class JournalEntryHelper {
         checkJournalEntry(null, liabilityAccount, date, accountEntries);
     }
 
+    public void checkJournalEntryForEquityAccount(final Account equityAccount, 
final String date, final JournalEntry... accountEntries) {
+        checkJournalEntry(null, equityAccount, date, accountEntries);
+    }
+
     public void checkJournalEntryForLiabilityAccount(final Integer officeId, 
final Account liabilityAccount, final String date,
             final JournalEntry... accountEntries) {
         checkJournalEntry(officeId, liabilityAccount, date, accountEntries);
@@ -72,6 +76,10 @@ public class JournalEntryHelper {
 
     }
 
+    public String getJournalEntryTransactionIdByAccount(final Account account, 
final String date, final JournalEntry... accountEntries) {
+        return getJournalEntryTransactionId(account, date, accountEntries);
+    }
+
     private void checkJournalEntry(final Integer officeId, final Account 
account, final String date, final JournalEntry... accountEntries) {
         final String url = createURLForGettingAccountEntries(account, date, 
officeId);
         final ArrayList<HashMap> response = 
Utils.performServerGet(this.requestSpec, this.responseSpec, url, "pageItems");
@@ -89,6 +97,22 @@ public class JournalEntryHelper {
         }
     }
 
+    private String getJournalEntryTransactionId(final Account account, final 
String date, final JournalEntry... accountEntries) {
+        final String url = createURLForGettingAccountEntries(account, date, 
null);
+        final ArrayList<HashMap> response = 
Utils.performServerGet(this.requestSpec, this.responseSpec, url, "pageItems");
+
+        for (JournalEntry entry : accountEntries) {
+            for (HashMap map : response) {
+                final HashMap entryType = (HashMap) map.get("entryType");
+                if (entry.getTransactionType().equals(entryType.get("value")) 
&& entry.getTransactionAmount().equals(map.get("amount"))) {
+                    return map.get("transactionId").toString();
+                }
+            }
+        }
+
+        return "";
+    }
+
     private String createURLForGettingAccountEntries(final Account account, 
final String date, final Integer officeId) {
         String url = new 
String("/fineract-provider/api/v1/journalentries?glAccountId=" + 
account.getAccountID() + "&type="
                 + account.getAccountType() + "&fromDate=" + date + "&toDate=" 
+ date + "&tenantIdentifier=default"
diff --git 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/shares/ShareProductHelper.java
 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/shares/ShareProductHelper.java
index d8068358d..65d126fac 100644
--- 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/shares/ShareProductHelper.java
+++ 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/shares/ShareProductHelper.java
@@ -28,6 +28,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import org.apache.fineract.integrationtests.common.Utils;
+import org.apache.fineract.integrationtests.common.accounting.Account;
 import org.junit.jupiter.api.Assertions;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -62,6 +63,7 @@ public class ShareProductHelper {
 
     private List<Map<String, String>> charges = null;
     private List<Map<String, String>> marketPrices = null;
+    private Account[] accountList = null;
 
     public String build() {
         final HashMap<String, Object> map = new HashMap<>();
@@ -93,6 +95,10 @@ public class ShareProductHelper {
             map.put("marketPricePeriods", marketPrices);
         }
 
+        if (this.accountingRule.equals(CASH_BASED)) {
+            map.putAll(getAccountMappingForCashBased());
+        }
+
         String shareProductCreateJson = new Gson().toJson(map);
         LOG.info("{}", shareProductCreateJson);
         return shareProductCreateJson;
@@ -103,6 +109,12 @@ public class ShareProductHelper {
         return this;
     }
 
+    public ShareProductHelper withCashBasedAccounting(final Account[] 
account_list) {
+        this.accountingRule = CASH_BASED;
+        this.accountList = account_list;
+        return this;
+    }
+
     public ShareProductHelper withMarketPrice() {
         this.marketPrices = new ArrayList<>();
         LocalDate currentDate = Utils.getLocalDateOfTenant();
@@ -197,4 +209,29 @@ public class ShareProductHelper {
         // String>>)shareProductData.get("marketPricePeriods") ;
 
     }
+
+    private Map<String, String> getAccountMappingForCashBased() {
+        final Map<String, String> map = new HashMap<>();
+        if (accountList != null) {
+            for (int i = 0; i < this.accountList.length; i++) {
+                if 
(this.accountList[i].getAccountType().equals(Account.AccountType.ASSET)) {
+                    final String ID = 
this.accountList[i].getAccountID().toString();
+                    map.put("shareReferenceId", ID);
+                }
+                if 
(this.accountList[i].getAccountType().equals(Account.AccountType.LIABILITY)) {
+                    final String ID = 
this.accountList[i].getAccountID().toString();
+                    map.put("shareSuspenseId", ID);
+                }
+                if 
(this.accountList[i].getAccountType().equals(Account.AccountType.EQUITY)) {
+                    final String ID = 
this.accountList[i].getAccountID().toString();
+                    map.put("shareEquityId", ID);
+                }
+                if 
(this.accountList[i].getAccountType().equals(Account.AccountType.INCOME)) {
+                    final String ID = 
this.accountList[i].getAccountID().toString();
+                    map.put("incomeFromFeeAccountId", ID);
+                }
+            }
+        }
+        return map;
+    }
 }

Reply via email to