/* * 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. */ import org.apache.ofbiz.accounting.util.UtilAccounting import org.apache.ofbiz.base.util.UtilDateTime import org.apache.ofbiz.base.util.UtilMisc import org.apache.ofbiz.base.util.UtilProperties import org.apache.ofbiz.entity.GenericValue import org.apache.ofbiz.entity.condition.EntityCondition import org.apache.ofbiz.entity.condition.EntityOperator import org.apache.ofbiz.party.party.PartyWorker import java.sql.Timestamp uiLabelMap = UtilProperties.getResourceBundleMap("AccountingUiLabels", locale) if (!thruDate) { thruDate = UtilDateTime.nowTimestamp() } if (!glFiscalTypeId) { return } organizationPartyId =null if(context.organizationPartyId) { organizationPartyId = context.organizationPartyId } else { organizationPartyId = parameters.get('ApplicationDecorator|organizationPartyId') } // Setup the divisions for which the report is executed List partyIds = PartyWorker.getAssociatedPartyIdsByRelationshipType(delegator, organizationPartyId, 'GROUP_ROLLUP') partyIds.add(organizationPartyId) // Get the group of account classes that will be used to position accounts in the proper section of the financial statement GenericValue assetGlAccountClass = from("GlAccountClass").where("glAccountClassId", "ASSET").cache(true).queryOne() List assetAccountClassIds = UtilAccounting.getDescendantGlAccountClassIds(assetGlAccountClass) GenericValue contraAssetGlAccountClass = from("GlAccountClass").where("glAccountClassId", "CONTRA_ASSET").cache(true).queryOne() List contraAssetAccountClassIds = UtilAccounting.getDescendantGlAccountClassIds(contraAssetGlAccountClass) GenericValue liabilityGlAccountClass = from("GlAccountClass").where("glAccountClassId", "LIABILITY").cache(true).queryOne() List liabilityAccountClassIds = UtilAccounting.getDescendantGlAccountClassIds(liabilityGlAccountClass) GenericValue equityGlAccountClass = from("GlAccountClass").where("glAccountClassId", "EQUITY").cache(true).queryOne() List equityAccountClassIds = UtilAccounting.getDescendantGlAccountClassIds(equityGlAccountClass) GenericValue currentAssetGlAccountClass = from("GlAccountClass").where("glAccountClassId", "CURRENT_ASSET").cache(true).queryOne() List currentAssetAccountClassIds = UtilAccounting.getDescendantGlAccountClassIds(currentAssetGlAccountClass) GenericValue longtermAssetGlAccountClass = from("GlAccountClass").where("glAccountClassId", "LONGTERM_ASSET").cache(true).queryOne() List longtermAssetAccountClassIds = UtilAccounting.getDescendantGlAccountClassIds(longtermAssetGlAccountClass) GenericValue currentLiabilityGlAccountClass = from("GlAccountClass").where("glAccountClassId", "CURRENT_LIABILITY").cache(true).queryOne() List currentLiabilityAccountClassIds = UtilAccounting.getDescendantGlAccountClassIds(currentLiabilityGlAccountClass) GenericValue accumDepreciationGlAccountClass = from("GlAccountClass").where("glAccountClassId", "ACCUM_DEPRECIATION").cache(true).queryOne() List accumDepreciationAccountClassIds = UtilAccounting.getDescendantGlAccountClassIds(accumDepreciationGlAccountClass) GenericValue accumAmortizationGlAccountClass = from("GlAccountClass").where("glAccountClassId", "ACCUM_AMORTIZATION").cache(true).queryOne() List accumAmortizationAccountClassIds = UtilAccounting.getDescendantGlAccountClassIds(accumAmortizationGlAccountClass) // Find the last closed time period to get the fromDate for the transactions in the current period and the ending balances of the last closed period Map lastClosedTimePeriodResult = runService('findLastClosedDate', ["organizationPartyId": organizationPartyId, "findDate": thruDate,"userLogin": userLogin]) Timestamp fromDate = (Timestamp)lastClosedTimePeriodResult.lastClosedDate if (!fromDate) { return } GenericValue lastClosedTimePeriod = (GenericValue)lastClosedTimePeriodResult.lastClosedTimePeriod // Get the opening balances of all the accounts Map assetOpeningBalances = [:] Map contraAssetOpeningBalances = [:] Map currentAssetOpeningBalances = [:] Map longtermAssetOpeningBalances = [:] Map liabilityOpeningBalances = [:] Map currentLiabilityOpeningBalances = [:] Map equityOpeningBalances = [:] if (lastClosedTimePeriod) { List timePeriodAndExprs = [] timePeriodAndExprs.add(EntityCondition.makeCondition("organizationPartyId", EntityOperator.IN, partyIds)) timePeriodAndExprs.add(EntityCondition.makeCondition("glAccountClassId", EntityOperator.IN, assetAccountClassIds)) timePeriodAndExprs.add(EntityCondition.makeCondition("endingBalance", EntityOperator.NOT_EQUAL, BigDecimal.ZERO)) timePeriodAndExprs.add(EntityCondition.makeCondition("customTimePeriodId", EntityOperator.EQUALS, lastClosedTimePeriod.customTimePeriodId)) List lastTimePeriodHistories = from("GlAccountAndHistory").where(timePeriodAndExprs).queryList() lastTimePeriodHistories.each { lastTimePeriodHistory -> Map accountMap = UtilMisc.toMap("glAccountId", lastTimePeriodHistory.glAccountId, "accountCode", lastTimePeriodHistory.accountCode, "accountName", lastTimePeriodHistory.accountName, "balance", lastTimePeriodHistory.getBigDecimal("endingBalance"), "D", lastTimePeriodHistory.getBigDecimal("postedDebits"), "C", lastTimePeriodHistory.getBigDecimal("postedCredits")) assetOpeningBalances.put(lastTimePeriodHistory.glAccountId, accountMap) } timePeriodAndExprs = [] timePeriodAndExprs.add(EntityCondition.makeCondition("organizationPartyId", EntityOperator.IN, partyIds)) timePeriodAndExprs.add(EntityCondition.makeCondition("glAccountClassId", EntityOperator.IN, contraAssetAccountClassIds)) timePeriodAndExprs.add(EntityCondition.makeCondition("endingBalance", EntityOperator.NOT_EQUAL, BigDecimal.ZERO)) timePeriodAndExprs.add(EntityCondition.makeCondition("customTimePeriodId", EntityOperator.EQUALS, lastClosedTimePeriod.customTimePeriodId)) lastTimePeriodHistories = from("GlAccountAndHistory").where(timePeriodAndExprs).queryList() lastTimePeriodHistories.each { lastTimePeriodHistory -> Map accountMap = UtilMisc.toMap("glAccountId", lastTimePeriodHistory.glAccountId, "accountCode", lastTimePeriodHistory.accountCode, "accountName", lastTimePeriodHistory.accountName, "balance", lastTimePeriodHistory.getBigDecimal("endingBalance"), "D", lastTimePeriodHistory.getBigDecimal("postedDebits"), "C", lastTimePeriodHistory.getBigDecimal("postedCredits")) contraAssetOpeningBalances.put(lastTimePeriodHistory.glAccountId, accountMap) } timePeriodAndExprs = [] timePeriodAndExprs.add(EntityCondition.makeCondition("organizationPartyId", EntityOperator.IN, partyIds)) timePeriodAndExprs.add(EntityCondition.makeCondition("glAccountClassId", EntityOperator.IN, liabilityAccountClassIds)) timePeriodAndExprs.add(EntityCondition.makeCondition("endingBalance", EntityOperator.NOT_EQUAL, BigDecimal.ZERO)) timePeriodAndExprs.add(EntityCondition.makeCondition("customTimePeriodId", EntityOperator.EQUALS, lastClosedTimePeriod.customTimePeriodId)) lastTimePeriodHistories = from("GlAccountAndHistory").where(timePeriodAndExprs).queryList() lastTimePeriodHistories.each { lastTimePeriodHistory -> Map accountMap = UtilMisc.toMap("glAccountId", lastTimePeriodHistory.glAccountId, "accountCode", lastTimePeriodHistory.accountCode, "accountName", lastTimePeriodHistory.accountName, "balance", lastTimePeriodHistory.getBigDecimal("endingBalance"), "D", lastTimePeriodHistory.getBigDecimal("postedDebits"), "C", lastTimePeriodHistory.getBigDecimal("postedCredits")) liabilityOpeningBalances.put(lastTimePeriodHistory.glAccountId, accountMap) } timePeriodAndExprs = [] timePeriodAndExprs.add(EntityCondition.makeCondition("organizationPartyId", EntityOperator.IN, partyIds)) timePeriodAndExprs.add(EntityCondition.makeCondition("glAccountClassId", EntityOperator.IN, equityAccountClassIds)) timePeriodAndExprs.add(EntityCondition.makeCondition("endingBalance", EntityOperator.NOT_EQUAL, BigDecimal.ZERO)) timePeriodAndExprs.add(EntityCondition.makeCondition("customTimePeriodId", EntityOperator.EQUALS, lastClosedTimePeriod.customTimePeriodId)) lastTimePeriodHistories = from("GlAccountAndHistory").where(timePeriodAndExprs).queryList() lastTimePeriodHistories.each { lastTimePeriodHistory -> Map accountMap = UtilMisc.toMap("glAccountId", lastTimePeriodHistory.glAccountId, "accountCode", lastTimePeriodHistory.accountCode, "accountName", lastTimePeriodHistory.accountName, "balance", lastTimePeriodHistory.getBigDecimal("endingBalance"), "D", lastTimePeriodHistory.getBigDecimal("postedDebits"), "C", lastTimePeriodHistory.getBigDecimal("postedCredits")) equityOpeningBalances.put(lastTimePeriodHistory.glAccountId, accountMap) } timePeriodAndExprs = [] timePeriodAndExprs.add(EntityCondition.makeCondition("organizationPartyId", EntityOperator.IN, partyIds)) timePeriodAndExprs.add(EntityCondition.makeCondition("glAccountClassId", EntityOperator.IN, currentAssetAccountClassIds)) timePeriodAndExprs.add(EntityCondition.makeCondition("endingBalance", EntityOperator.NOT_EQUAL, BigDecimal.ZERO)) timePeriodAndExprs.add(EntityCondition.makeCondition("customTimePeriodId", EntityOperator.EQUALS, lastClosedTimePeriod.customTimePeriodId)) lastTimePeriodHistories = from("GlAccountAndHistory").where(timePeriodAndExprs).queryList() lastTimePeriodHistories.each { lastTimePeriodHistory -> Map accountMap = UtilMisc.toMap("glAccountId", lastTimePeriodHistory.glAccountId, "accountCode", lastTimePeriodHistory.accountCode, "accountName", lastTimePeriodHistory.accountName, "balance", lastTimePeriodHistory.getBigDecimal("endingBalance"), "D", lastTimePeriodHistory.getBigDecimal("postedDebits"), "C", lastTimePeriodHistory.getBigDecimal("postedCredits")) currentAssetOpeningBalances.put(lastTimePeriodHistory.glAccountId, accountMap) } timePeriodAndExprs = [] timePeriodAndExprs.add(EntityCondition.makeCondition("organizationPartyId", EntityOperator.IN, partyIds)) timePeriodAndExprs.add(EntityCondition.makeCondition("glAccountClassId", EntityOperator.IN, longtermAssetAccountClassIds)) timePeriodAndExprs.add(EntityCondition.makeCondition("endingBalance", EntityOperator.NOT_EQUAL, BigDecimal.ZERO)) timePeriodAndExprs.add(EntityCondition.makeCondition("customTimePeriodId", EntityOperator.EQUALS, lastClosedTimePeriod.customTimePeriodId)) lastTimePeriodHistories = from("GlAccountAndHistory").where(timePeriodAndExprs).queryList() lastTimePeriodHistories.each { lastTimePeriodHistory -> Map accountMap = UtilMisc.toMap("glAccountId", lastTimePeriodHistory.glAccountId, "accountCode", lastTimePeriodHistory.accountCode, "accountName", lastTimePeriodHistory.accountName, "balance", lastTimePeriodHistory.getBigDecimal("endingBalance"), "D", lastTimePeriodHistory.getBigDecimal("postedDebits"), "C", lastTimePeriodHistory.getBigDecimal("postedCredits")) longtermAssetOpeningBalances.put(lastTimePeriodHistory.glAccountId, accountMap) } timePeriodAndExprs = [] timePeriodAndExprs.add(EntityCondition.makeCondition("organizationPartyId", EntityOperator.IN, partyIds)) timePeriodAndExprs.add(EntityCondition.makeCondition("glAccountClassId", EntityOperator.IN, currentLiabilityAccountClassIds)) timePeriodAndExprs.add(EntityCondition.makeCondition("endingBalance", EntityOperator.NOT_EQUAL, BigDecimal.ZERO)) timePeriodAndExprs.add(EntityCondition.makeCondition("customTimePeriodId", EntityOperator.EQUALS, lastClosedTimePeriod.customTimePeriodId)) lastTimePeriodHistories = from("GlAccountAndHistory").where(timePeriodAndExprs).queryList() lastTimePeriodHistories.each { lastTimePeriodHistory -> Map accountMap = UtilMisc.toMap("glAccountId", lastTimePeriodHistory.glAccountId, "accountCode", lastTimePeriodHistory.accountCode, "accountName", lastTimePeriodHistory.accountName, "balance", lastTimePeriodHistory.getBigDecimal("endingBalance"), "D", lastTimePeriodHistory.getBigDecimal("postedDebits"), "C", lastTimePeriodHistory.getBigDecimal("postedCredits")) currentLiabilityOpeningBalances.put(lastTimePeriodHistory.glAccountId, accountMap) } } List balanceTotalList = [] List mainAndExprs = [] mainAndExprs.add(EntityCondition.makeCondition("organizationPartyId", EntityOperator.IN, partyIds)) mainAndExprs.add(EntityCondition.makeCondition("isPosted", EntityOperator.EQUALS, "Y")) mainAndExprs.add(EntityCondition.makeCondition("glFiscalTypeId", EntityOperator.EQUALS, glFiscalTypeId)) mainAndExprs.add(EntityCondition.makeCondition("acctgTransTypeId", EntityOperator.NOT_EQUAL, "PERIOD_CLOSING")) mainAndExprs.add(EntityCondition.makeCondition("transactionDate", EntityOperator.GREATER_THAN_EQUAL_TO, fromDate)) mainAndExprs.add(EntityCondition.makeCondition("transactionDate", EntityOperator.LESS_THAN, thruDate)) // ASSETS // account balances accountBalanceList = [] transactionTotals = [] balanceTotal = BigDecimal.ZERO List assetAndExprs = mainAndExprs as LinkedList assetAndExprs.add(EntityCondition.makeCondition("glAccountClassId", EntityOperator.IN, assetAccountClassIds)) transactionTotals = select("glAccountId", "accountName", "accountCode", "debitCreditFlag", "amount").from("AcctgTransEntrySums").where(assetAndExprs).orderBy("glAccountId").queryList() transactionTotalsMap = [:] transactionTotalsMap.putAll(assetOpeningBalances) transactionTotals.each { transactionTotal -> Map accountMap = (Map)transactionTotalsMap.get(transactionTotal.glAccountId) if (!accountMap) { accountMap = UtilMisc.makeMapWritable(transactionTotal) accountMap.remove("debitCreditFlag") accountMap.remove("amount") accountMap.put("D", BigDecimal.ZERO) accountMap.put("C", BigDecimal.ZERO) accountMap.put("balance", BigDecimal.ZERO) } UtilMisc.addToBigDecimalInMap(accountMap, transactionTotal.debitCreditFlag, transactionTotal.amount) BigDecimal debitAmount = (BigDecimal)accountMap.get("D") BigDecimal creditAmount = (BigDecimal)accountMap.get("C") // assets are accounts of class DEBIT: the balance is given by debits minus credits BigDecimal balance = debitAmount.subtract(creditAmount) accountMap.put("balance", balance) transactionTotalsMap.put(transactionTotal.glAccountId, accountMap) } accountBalanceList = UtilMisc.sortMaps(transactionTotalsMap.values().asList(), UtilMisc.toList("accountCode")) accountBalanceList.each { accountBalance -> balanceTotal = balanceTotal + accountBalance.balance } context.assetAccountBalanceList = accountBalanceList context.assetAccountBalanceList.add(UtilMisc.toMap("accountName", uiLabelMap.AccountingTotalAssets, "balance", balanceTotal)) context.assetBalanceTotal = balanceTotal // CURRENT ASSETS // account balances accountBalanceList = [] transactionTotals = [] balanceTotal = BigDecimal.ZERO List currentAssetAndExprs = mainAndExprs as LinkedList currentAssetAndExprs.add(EntityCondition.makeCondition("glAccountClassId", EntityOperator.IN, currentAssetAccountClassIds)) transactionTotals = select("glAccountId", "accountName", "accountCode", "debitCreditFlag", "amount").from("AcctgTransEntrySums").where(currentAssetAndExprs).orderBy("glAccountId").queryList() transactionTotalsMap = [:] transactionTotalsMap.putAll(currentAssetOpeningBalances) transactionTotals.each { transactionTotal -> Map accountMap = (Map)transactionTotalsMap.get(transactionTotal.glAccountId) if (!accountMap) { accountMap = UtilMisc.makeMapWritable(transactionTotal) accountMap.remove("debitCreditFlag") accountMap.remove("amount") accountMap.put("D", BigDecimal.ZERO) accountMap.put("C", BigDecimal.ZERO) accountMap.put("balance", BigDecimal.ZERO) } UtilMisc.addToBigDecimalInMap(accountMap, transactionTotal.debitCreditFlag, transactionTotal.amount) BigDecimal debitAmount = (BigDecimal)accountMap.get("D") BigDecimal creditAmount = (BigDecimal)accountMap.get("C") // assets are accounts of class DEBIT: the balance is given by debits minus credits BigDecimal balance = debitAmount.subtract(creditAmount) accountMap.put("balance", balance) transactionTotalsMap.put(transactionTotal.glAccountId, accountMap) } accountBalanceList = UtilMisc.sortMaps(transactionTotalsMap.values().asList(), UtilMisc.toList("accountCode")) accountBalanceList.each { accountBalance -> balanceTotal = balanceTotal + accountBalance.balance } context.currentAssetBalanceTotal = balanceTotal balanceTotalList.add(UtilMisc.toMap("totalName", "AccountingCurrentAssets", "balance", balanceTotal)) // LONGTERM ASSETS // account balances accountBalanceList = [] transactionTotals = [] balanceTotal = BigDecimal.ZERO List longtermAssetAndExprs = mainAndExprs as LinkedList longtermAssetAndExprs.add(EntityCondition.makeCondition("glAccountClassId", EntityOperator.IN, longtermAssetAccountClassIds)) transactionTotals = select("glAccountId", "accountName", "accountCode", "debitCreditFlag", "amount").from("AcctgTransEntrySums").where(longtermAssetAndExprs).orderBy("glAccountId").queryList() transactionTotalsMap = [:] transactionTotalsMap.putAll(longtermAssetOpeningBalances) transactionTotals.each { transactionTotal -> Map accountMap = (Map)transactionTotalsMap.get(transactionTotal.glAccountId) if (!accountMap) { accountMap = UtilMisc.makeMapWritable(transactionTotal) accountMap.remove("debitCreditFlag") accountMap.remove("amount") accountMap.put("D", BigDecimal.ZERO) accountMap.put("C", BigDecimal.ZERO) accountMap.put("balance", BigDecimal.ZERO) } UtilMisc.addToBigDecimalInMap(accountMap, transactionTotal.debitCreditFlag, transactionTotal.amount) BigDecimal debitAmount = (BigDecimal)accountMap.get("D") BigDecimal creditAmount = (BigDecimal)accountMap.get("C") // assets are accounts of class DEBIT: the balance is given by debits minus credits BigDecimal balance = debitAmount.subtract(creditAmount) accountMap.put("balance", balance) transactionTotalsMap.put(transactionTotal.glAccountId, accountMap) } accountBalanceList = UtilMisc.sortMaps(transactionTotalsMap.values().asList(), UtilMisc.toList("accountCode")) accountBalanceList.each { accountBalance -> balanceTotal = balanceTotal + accountBalance.balance } context.longtermAssetBalanceTotal = balanceTotal balanceTotalList.add(UtilMisc.toMap("totalName", "AccountingLongTermAssets", "balance", balanceTotal)) // CONTRA ASSETS // account balances accountBalanceList = [] transactionTotals = [] balanceTotal = BigDecimal.ZERO List contraAssetAndExprs = mainAndExprs as LinkedList contraAssetAndExprs.add(EntityCondition.makeCondition("glAccountClassId", EntityOperator.IN, contraAssetAccountClassIds)) transactionTotals = select("glAccountId", "accountName", "accountCode", "debitCreditFlag", "amount").from("AcctgTransEntrySums").where(contraAssetAndExprs).orderBy("glAccountId").queryList() transactionTotalsMap = [:] transactionTotalsMap.putAll(contraAssetOpeningBalances) transactionTotals.each { transactionTotal -> Map accountMap = (Map)transactionTotalsMap.get(transactionTotal.glAccountId) if (!accountMap) { accountMap = UtilMisc.makeMapWritable(transactionTotal) accountMap.remove("debitCreditFlag") accountMap.remove("amount") accountMap.put("D", BigDecimal.ZERO) accountMap.put("C", BigDecimal.ZERO) accountMap.put("balance", BigDecimal.ZERO) } UtilMisc.addToBigDecimalInMap(accountMap, transactionTotal.debitCreditFlag, transactionTotal.amount) BigDecimal debitAmount = (BigDecimal)accountMap.get("D") BigDecimal creditAmount = (BigDecimal)accountMap.get("C") // contra assets are accounts of class CREDIT: the balance is given by credits minus debits BigDecimal balance = debitAmount.subtract(creditAmount) accountMap.put("balance", balance) transactionTotalsMap.put(transactionTotal.glAccountId, accountMap) } accountBalanceList = UtilMisc.sortMaps(transactionTotalsMap.values().asList(), UtilMisc.toList("accountCode")) accountBalanceList.each { accountBalance -> balanceTotal = balanceTotal + accountBalance.balance } context.assetAccountBalanceList.addAll(accountBalanceList) context.assetAccountBalanceList.add(UtilMisc.toMap("accountName", uiLabelMap.AccountingTotalAccumulatedDepreciation, "balance", balanceTotal)) context.contraAssetBalanceTotal = balanceTotal balanceTotalList.add(UtilMisc.toMap("totalName", "AccountingTotalAccumulatedDepreciation", "balance", balanceTotal)) balanceTotalList.add(UtilMisc.toMap("totalName", "AccountingTotalAssets", "balance", (context.currentAssetBalanceTotal + context.longtermAssetBalanceTotal + balanceTotal))) // LIABILITY // account balances accountBalanceList = [] transactionTotals = [] balanceTotal = BigDecimal.ZERO List liabilityAndExprs = mainAndExprs as LinkedList liabilityAndExprs.add(EntityCondition.makeCondition("glAccountClassId", EntityOperator.IN, liabilityAccountClassIds)) transactionTotals = select("glAccountId", "accountName", "accountCode", "debitCreditFlag", "amount").from("AcctgTransEntrySums").where(liabilityAndExprs).orderBy("glAccountId").queryList() transactionTotalsMap = [:] transactionTotalsMap.putAll(liabilityOpeningBalances) transactionTotals.each { transactionTotal -> Map accountMap = (Map)transactionTotalsMap.get(transactionTotal.glAccountId) if (!accountMap) { accountMap = UtilMisc.makeMapWritable(transactionTotal) accountMap.remove("debitCreditFlag") accountMap.remove("amount") accountMap.put("D", BigDecimal.ZERO) accountMap.put("C", BigDecimal.ZERO) accountMap.put("balance", BigDecimal.ZERO) } UtilMisc.addToBigDecimalInMap(accountMap, transactionTotal.debitCreditFlag, transactionTotal.amount) BigDecimal debitAmount = (BigDecimal)accountMap.get("D") BigDecimal creditAmount = (BigDecimal)accountMap.get("C") // liabilities are accounts of class CREDIT: the balance is given by credits minus debits BigDecimal balance = creditAmount.subtract(debitAmount) accountMap.put("balance", balance) transactionTotalsMap.put(transactionTotal.glAccountId, accountMap) } accountBalanceList = UtilMisc.sortMaps(transactionTotalsMap.values().asList(), UtilMisc.toList("accountCode")) accountBalanceList.each { accountBalance -> balanceTotal = balanceTotal + accountBalance.balance } context.liabilityAccountBalanceList = accountBalanceList context.liabilityAccountBalanceList.add(UtilMisc.toMap("accountName", uiLabelMap.AccountingTotalLiabilities, "balance", balanceTotal)) context.liabilityBalanceTotal = balanceTotal // CURRENT LIABILITY // account balances accountBalanceList = [] transactionTotals = [] balanceTotal = BigDecimal.ZERO List currentLiabilityAndExprs = mainAndExprs as LinkedList currentLiabilityAndExprs.add(EntityCondition.makeCondition("glAccountClassId", EntityOperator.IN, currentLiabilityAccountClassIds)) transactionTotals = select("glAccountId", "accountName", "accountCode", "debitCreditFlag", "amount").from("AcctgTransEntrySums").where(currentLiabilityAndExprs).orderBy("glAccountId").queryList() transactionTotalsMap = [:] transactionTotalsMap.putAll(currentLiabilityOpeningBalances) transactionTotals.each { transactionTotal -> Map accountMap = (Map)transactionTotalsMap.get(transactionTotal.glAccountId) if (!accountMap) { accountMap = UtilMisc.makeMapWritable(transactionTotal) accountMap.remove("debitCreditFlag") accountMap.remove("amount") accountMap.put("D", BigDecimal.ZERO) accountMap.put("C", BigDecimal.ZERO) accountMap.put("balance", BigDecimal.ZERO) } UtilMisc.addToBigDecimalInMap(accountMap, transactionTotal.debitCreditFlag, transactionTotal.amount) BigDecimal debitAmount = (BigDecimal)accountMap.get("D") BigDecimal creditAmount = (BigDecimal)accountMap.get("C") // liabilities are accounts of class CREDIT: the balance is given by credits minus debits BigDecimal balance = creditAmount.subtract(debitAmount) accountMap.put("balance", balance) transactionTotalsMap.put(transactionTotal.glAccountId, accountMap) } accountBalanceList = UtilMisc.sortMaps(transactionTotalsMap.values().asList(), UtilMisc.toList("accountCode")) accountBalanceList.each { accountBalance -> balanceTotal = balanceTotal + accountBalance.balance } context.currentLiabilityBalanceTotal = balanceTotal balanceTotalList.add(UtilMisc.toMap("totalName", "AccountingCurrentLiabilities", "balance", balanceTotal)) // EQUITY // account balances accountBalanceList = [] transactionTotals = [] balanceTotal = BigDecimal.ZERO List equityAndExprs = mainAndExprs as LinkedList equityAndExprs.add(EntityCondition.makeCondition("glAccountClassId", EntityOperator.IN, equityAccountClassIds)) transactionTotals = select("glAccountId", "accountName", "accountCode", "debitCreditFlag", "amount").from("AcctgTransEntrySums").where(equityAndExprs).orderBy("glAccountId").queryList() transactionTotalsMap = [:] transactionTotalsMap.putAll(equityOpeningBalances) transactionTotals.each { transactionTotal -> Map accountMap = (Map)transactionTotalsMap.get(transactionTotal.glAccountId) if (!accountMap) { accountMap = UtilMisc.makeMapWritable(transactionTotal) accountMap.remove("debitCreditFlag") accountMap.remove("amount") accountMap.put("D", BigDecimal.ZERO) accountMap.put("C", BigDecimal.ZERO) accountMap.put("balance", BigDecimal.ZERO) } UtilMisc.addToBigDecimalInMap(accountMap, transactionTotal.debitCreditFlag, transactionTotal.amount) BigDecimal debitAmount = (BigDecimal)accountMap.get("D") BigDecimal creditAmount = (BigDecimal)accountMap.get("C") // equities are accounts of class CREDIT: the balance is given by credits minus debits BigDecimal balance = creditAmount.subtract(debitAmount) accountMap.put("balance", balance) transactionTotalsMap.put(transactionTotal.glAccountId, accountMap) } // Add the "retained earnings" account Map netIncomeResult = runService('prepareIncomeStatement', ["organizationPartyId": organizationPartyId, "glFiscalTypeId": glFiscalTypeId, "fromDate": fromDate, "thruDate": thruDate, "userLogin": userLogin]) BigDecimal netIncome = (BigDecimal)netIncomeResult.totalNetIncome GenericValue retainedEarningsAccount = from("GlAccountTypeDefault").where("glAccountTypeId", "RETAINED_EARNINGS", "organizationPartyId", organizationPartyId).cache(true).queryOne() if (retainedEarningsAccount) { GenericValue retainedEarningsGlAccount = retainedEarningsAccount.getRelatedOne("GlAccount", false) transactionTotalsMap.put(retainedEarningsGlAccount.glAccountId, UtilMisc.toMap("glAccountId", retainedEarningsGlAccount.glAccountId,"accountName", retainedEarningsGlAccount.accountName, "accountCode", retainedEarningsGlAccount.accountCode, "balance", netIncome)) } accountBalanceList = UtilMisc.sortMaps(transactionTotalsMap.values().asList(), UtilMisc.toList("accountCode")) accountBalanceList.each { accountBalance -> balanceTotal = balanceTotal + accountBalance.balance } context.equityAccountBalanceList = accountBalanceList context.equityAccountBalanceList.add(UtilMisc.toMap("accountName", uiLabelMap.AccountingTotalEquities, "balance", balanceTotal)) context.equityBalanceTotal = balanceTotal context.liabilityEquityBalanceTotal = context.liabilityBalanceTotal + context.equityBalanceTotal balanceTotalList.add(UtilMisc.toMap("totalName", "AccountingEquities", "balance", context.equityBalanceTotal)) balanceTotalList.add(UtilMisc.toMap("totalName", "AccountingTotalLiabilitiesAndEquities", "balance", context.liabilityEquityBalanceTotal)) context.balanceTotalList = balanceTotalList