| /* |
| * 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 |