blob: 250090a88dec37c87d385871c96473e9f414aaf4 [file] [log] [blame]
/*
* 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.UtilMisc
import org.apache.ofbiz.entity.condition.EntityCondition
import org.apache.ofbiz.entity.condition.EntityOperator
//NOTE: this code ignores from/thru dates on the products and categories under the rootProductCategoryId!
//TODO_MAYBE: variant product support for products in category, and product shown directly (should we really do this?)
//TODO:
// get products and categories under the root category
productMemberList = from("ProductCategoryMember").where("productCategoryId", rootProductCategoryId).orderBy("sequenceNum").queryList()
categoryRollupList = from("ProductCategoryRollup").where("parentProductCategoryId", rootProductCategoryId).orderBy("sequenceNum").queryList()
// for use in the queries
productIdSet = []
productCategoryIdSet = []
// for use in the templates
productList = []
productCategoryList = []
productMemberList.each { productMember ->
if (!productIdSet.contains(productMember.productId)) {
productList.add(productMember.getRelatedOne("Product", true))
}
productIdSet.add(productMember.productId)
}
categoryRollupList.each { categoryRollup ->
if (!productCategoryIdSet.contains(categoryRollup.productCategoryId)) {
productCategoryList.add(categoryRollup.getRelatedOne("CurrentProductCategory", true))
}
productCategoryIdSet.add(categoryRollup.productCategoryId)
}
//NOTE: tax, etc also have productId on them, so restrict by type INV_PROD_ITEM, INV_FPROD_ITEM, INV_DPROD_ITEM, others?
baseProductAndExprs = []
baseProductAndExprs.add(EntityCondition.makeCondition("invoiceTypeId", EntityOperator.EQUALS, "SALES_INVOICE"))
baseProductAndExprs.add(EntityCondition.makeCondition("invoiceItemTypeId", EntityOperator.IN, ["INV_PROD_ITEM", "INV_FPROD_ITEM", "INV_DPROD_ITEM"]))
baseProductAndExprs.add(EntityCondition.makeCondition("statusId", EntityOperator.IN, ["INVOICE_READY", "INVOICE_PAID"]))
if (organizationPartyId) baseProductAndExprs.add(EntityCondition.makeCondition("partyIdFrom", EntityOperator.EQUALS, organizationPartyId))
if (currencyUomId) baseProductAndExprs.add(EntityCondition.makeCondition("currencyUomId", EntityOperator.EQUALS, currencyUomId))
baseCategoryAndExprs = []
baseCategoryAndExprs.add(EntityCondition.makeCondition("invoiceTypeId", EntityOperator.EQUALS, "SALES_INVOICE"))
baseCategoryAndExprs.add(EntityCondition.makeCondition("invoiceItemTypeId", EntityOperator.IN, ["INV_PROD_ITEM", "INV_FPROD_ITEM", "INV_DPROD_ITEM"]))
baseCategoryAndExprs.add(EntityCondition.makeCondition("statusId", EntityOperator.IN, ["INVOICE_READY", "INVOICE_PAID"]))
if (productCategoryIdSet) baseCategoryAndExprs.add(EntityCondition.makeCondition("productCategoryId", EntityOperator.IN, productCategoryIdSet))
if (productIdSet) baseCategoryAndExprs.add(EntityCondition.makeCondition("productId", EntityOperator.NOT_IN, productIdSet))
if (organizationPartyId) baseCategoryAndExprs.add(EntityCondition.makeCondition("partyIdFrom", EntityOperator.EQUALS, organizationPartyId))
if (currencyUomId) baseCategoryAndExprs.add(EntityCondition.makeCondition("currencyUomId", EntityOperator.EQUALS, currencyUomId))
// get the Calendar object for the current month (specifed by month, year Integer values in the context)
monthCal = Calendar.getInstance()
monthCal.set(Calendar.YEAR, year)
monthCal.set(Calendar.MONTH, (month - 1))
nextMonthCal = Calendar.getInstance()
nextMonthCal.setTimeInMillis(monthCal.getTimeInMillis())
nextMonthCal.add(Calendar.MONTH, 1)
// iterate through the days and do the queries
productResultMapByDayList = []
productNullResultByDayList = []
categoryResultMapByDayList = []
monthProductResultMap = [:]
monthCategoryResultMap = [:]
monthProductNullResult = [:]
daysInMonth = monthCal.getActualMaximum(Calendar.DAY_OF_MONTH)
for (int currentDay = 0; currentDay <= daysInMonth; currentDay++) {
currentDayCal = Calendar.getInstance()
currentDayCal.setTimeInMillis(monthCal.getTimeInMillis())
currentDayCal.set(Calendar.DAY_OF_MONTH, currentDay)
currentDayBegin = new java.sql.Timestamp(currentDayCal.getTimeInMillis())
currentDayCal.add(Calendar.DAY_OF_MONTH, 1)
nextDayBegin = new java.sql.Timestamp(currentDayCal.getTimeInMillis())
// do the product find
productAndExprs = []
productAndExprs.addAll(baseProductAndExprs)
if (productIdSet) productAndExprs.add(EntityCondition.makeCondition("productId", EntityOperator.IN, productIdSet))
productAndExprs.add(EntityCondition.makeCondition("invoiceDate", EntityOperator.GREATER_THAN_EQUAL_TO, currentDayBegin))
productAndExprs.add(EntityCondition.makeCondition("invoiceDate", EntityOperator.LESS_THAN, nextDayBegin))
productResultListIterator = select("productId", "quantityTotal", "amountTotal").from("InvoiceItemProductSummary").where(productAndExprs).cursorScrollInsensitive().cache(true).queryIterator()
productResultMap = [:]
while ((productResult = productResultListIterator.next())) {
productResultMap[productResult.productId] = productResult
monthProductResult = UtilMisc.getMapFromMap(monthProductResultMap, productResult.productId)
UtilMisc.addToBigDecimalInMap(monthProductResult, "quantityTotal", productResult.getBigDecimal("quantityTotal"))
UtilMisc.addToBigDecimalInMap(monthProductResult, "amountTotal", productResult.getBigDecimal("amountTotal"))
}
productResultListIterator.close()
productResultMapByDayList.add(productResultMap)
// do the category find
categoryAndExprs = []
categoryAndExprs.addAll(baseCategoryAndExprs)
categoryAndExprs.add(EntityCondition.makeCondition("invoiceDate", EntityOperator.GREATER_THAN_EQUAL_TO, currentDayBegin))
categoryAndExprs.add(EntityCondition.makeCondition("invoiceDate", EntityOperator.LESS_THAN, nextDayBegin))
categoryResultListIterator = select("productCategoryId", "quantityTotal", "amountTotal").from("InvoiceItemCategorySummary").where(categoryAndExprs).cursorScrollInsensitive().cache(true).queryIterator()
categoryResultMap = [:]
while ((categoryResult = categoryResultListIterator.next())) {
categoryResultMap[categoryResult.productCategoryId] = categoryResult
monthCategoryResult = UtilMisc.getMapFromMap(monthCategoryResultMap, categoryResult.productCategoryId)
UtilMisc.addToBigDecimalInMap(monthCategoryResult, "quantityTotal", categoryResult.getBigDecimal("quantityTotal"))
UtilMisc.addToBigDecimalInMap(monthCategoryResult, "amountTotal", categoryResult.getBigDecimal("amountTotal"))
}
categoryResultListIterator.close()
categoryResultMapByDayList.add(categoryResultMap)
// do a find for InvoiceItem with a null productId
productNullAndExprs = []
productNullAndExprs.addAll(baseProductAndExprs)
productNullAndExprs.add(EntityCondition.makeCondition("productId", EntityOperator.EQUALS, null))
productNullAndExprs.add(EntityCondition.makeCondition("invoiceDate", EntityOperator.GREATER_THAN_EQUAL_TO, currentDayBegin))
productNullAndExprs.add(EntityCondition.makeCondition("invoiceDate", EntityOperator.LESS_THAN, nextDayBegin))
productNullResultListIterator = select("productId", "quantityTotal", "amountTotal").from("InvoiceItemProductSummary").where(productNullAndExprs).cursorScrollInsensitive().cache(true).queryIterator()
// should just be 1 result
productNullResult = productNullResultListIterator.next()
productNullResultListIterator.close()
if (productNullResult) {
productNullResultByDayList.add(productNullResult)
UtilMisc.addToBigDecimalInMap(monthProductNullResult, "quantityTotal", productNullResult.getBigDecimal("quantityTotal"))
UtilMisc.addToBigDecimalInMap(monthProductNullResult, "amountTotal", productNullResult.getBigDecimal("amountTotal"))
} else {
// no result, add an empty Map place holder
productNullResultByDayList.add([:])
}
}
context.productResultMapByDayList = productResultMapByDayList
context.productNullResultByDayList = productNullResultByDayList
context.categoryResultMapByDayList = categoryResultMapByDayList
context.monthProductResultMap = monthProductResultMap
context.monthCategoryResultMap = monthCategoryResultMap
context.monthProductNullResult = monthProductNullResult
context.productCategoryList = productCategoryList
context.productList = productList