/*
 * 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.base.util.UtilDateTime
import org.apache.ofbiz.base.util.UtilMisc
import org.apache.ofbiz.entity.condition.EntityCondition
import org.apache.ofbiz.entity.condition.EntityOperator

if (!fromDate) {
    return
}
if (!thruDate) {
    thruDate = UtilDateTime.nowTimestamp()
}
if (!parameters.glFiscalTypeId) {
    parameters.glFiscalTypeId = "ACTUAL"
}

// POSTED
// Posted transactions totals and grand totals
postedTotalDebit = BigDecimal.ZERO
postedTotalCredit = BigDecimal.ZERO
andExprs = []
andExprs.add(EntityCondition.makeCondition("organizationPartyId", EntityOperator.IN, partyIds))
andExprs.add(EntityCondition.makeCondition("isPosted", EntityOperator.EQUALS, "Y"))
andExprs.add(EntityCondition.makeCondition("glFiscalTypeId", EntityOperator.EQUALS, parameters.glFiscalTypeId))
andExprs.add(EntityCondition.makeCondition("transactionDate", EntityOperator.GREATER_THAN_EQUAL_TO, fromDate))
andExprs.add(EntityCondition.makeCondition("transactionDate", EntityOperator.LESS_THAN_EQUAL_TO, thruDate))
andCond = EntityCondition.makeCondition(andExprs, EntityOperator.AND)
List postedTransactionTotals = select("glAccountId", "accountName", "accountCode", "debitCreditFlag", "amount").from("AcctgTransEntrySums").where(andCond).orderBy("glAccountId").queryList()
if (postedTransactionTotals) {
    glAccountCategories = from("GlAccountCategory").where("glAccountCategoryTypeId", "COST_CENTER").orderBy("glAccountCategoryId").queryList()
    context.glAccountCategories = glAccountCategories
    Map postedTransactionTotalsMap = [:]
    postedTransactionTotals.each { postedTransactionTotal ->
        Map accountMap = (Map)postedTransactionTotalsMap.get(postedTransactionTotal.glAccountId)
        if (!accountMap) {
            accountMap = UtilMisc.makeMapWritable(postedTransactionTotal)
            accountMap.put("D", BigDecimal.ZERO)
            accountMap.put("C", BigDecimal.ZERO)
        }
        UtilMisc.addToBigDecimalInMap(accountMap, postedTransactionTotal.debitCreditFlag, postedTransactionTotal.amount)
        postedTransactionTotalsMap.put(postedTransactionTotal.glAccountId, accountMap)
        BigDecimal debitAmount = (BigDecimal)accountMap.get("D")
        BigDecimal creditAmount = (BigDecimal)accountMap.get("C")
        BigDecimal balance = debitAmount.subtract(creditAmount)
        accountMap.put("balance", balance)
        glAccountCategories.each { glAccountCategory ->
            glAccountCategoryMember = from("GlAccountCategoryMember").where("glAccountCategoryId", glAccountCategory.glAccountCategoryId, "glAccountId", postedTransactionTotal.glAccountId).orderBy("glAccountCategoryId").filterByDate().queryFirst()
            if (glAccountCategoryMember) {
                BigDecimal glAccountCategorySharePercentage = glAccountCategoryMember.amountPercentage
                if (glAccountCategorySharePercentage && glAccountCategorySharePercentage != BigDecimal.ZERO ) {
                    glAccountCategoryShareFraction = glAccountCategorySharePercentage.divide(new BigDecimal("100.00"))
                    BigDecimal glAccountCategoryShare = balance.multiply(glAccountCategoryShareFraction)
                    accountMap.put(glAccountCategory.glAccountCategoryId,glAccountCategoryShare)
                }
            }
        }
    }
    context.glAcctBalancesByCostCenter = postedTransactionTotalsMap.values().asList()
}

