blob: b38bfece0589eafdc5379d208d83e9ee75df051a [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.entity.condition.*
import org.apache.ofbiz.entity.util.EntityTypeUtil
import org.apache.ofbiz.product.inventory.InventoryWorker
if (product) {
boolean isMarketingPackage = EntityTypeUtil.hasParentType(delegator, "ProductType", "productTypeId", product.productTypeId, "parentTypeId", "MARKETING_PKG")
context.isMarketingPackage = (isMarketingPackage? "true": "false")
//If product is virtual gather summary data from variants
if (product.isVirtual && "Y".equals(product.isVirtual)) {
//Get the virtual product feature types
result = runService('getProductFeaturesByType', [productId : productId, productFeatureApplTypeId : 'SELECTABLE_FEATURE'])
featureTypeIds = result.productFeatureTypes
//Get the variants
result = runService('getAllProductVariants', [productId : productId])
variants = result.assocProducts
variantIterator = variants.iterator()
variantInventorySummaries = []
while (variantIterator) {
variant = variantIterator.next()
//create a map of each variant id and inventory summary (all facilities)
inventoryAvailable = runService('getProductInventoryAvailable', [productId : variant.productIdTo])
variantInventorySummary = [productId : variant.productIdTo,
availableToPromiseTotal : inventoryAvailable.availableToPromiseTotal,
quantityOnHandTotal : inventoryAvailable.quantityOnHandTotal]
//add the applicable features to the map
featureTypeIdsIterator = featureTypeIds.iterator()
while (featureTypeIdsIterator) {
featureTypeId = featureTypeIdsIterator.next()
result = runService('getProductFeatures', [productId : variant.productIdTo, type : 'STANDARD_FEATURE', distinct : featureTypeId])
variantFeatures = result.productFeatures
if (variantFeatures) {
//there should only be one result in this collection
variantInventorySummary.put(featureTypeId, variantFeatures.get(0))
}
}
variantInventorySummaries.add(variantInventorySummary)
}
context.featureTypeIds = featureTypeIds
context.variantInventorySummaries = variantInventorySummaries
} else { //Gather information for a non virtual product
quantitySummaryByFacility = [:]
manufacturingInQuantitySummaryByFacility = [:]
manufacturingOutQuantitySummaryByFacility = [:]
// The warehouse list is selected
showAllFacilities = parameters.showAllFacilities
if (showAllFacilities && "Y".equals(showAllFacilities)) {
facilityList = from("Facility").queryList()
} else {
facilityList = from("ProductFacility").where("productId", productId).queryList()
}
facilityIterator = facilityList.iterator()
dispatcher = request.getAttribute("dispatcher")
Map contextInput = null
Map resultOutput = null
// inventory quantity summary by facility: For every warehouse the product's atp and qoh
// are obtained (calling the "getInventoryAvailableByFacility" service)
while (facilityIterator) {
facility = facilityIterator.next()
resultOutput = runService('getInventoryAvailableByFacility', [productId : productId, facilityId : facility.facilityId])
quantitySummary = [:]
quantitySummary.facilityId = facility.facilityId
quantitySummary.totalQuantityOnHand = resultOutput.quantityOnHandTotal
quantitySummary.totalAvailableToPromise = resultOutput.availableToPromiseTotal
// if the product is a MARKETING_PKG_AUTO/PICK, then also get the quantity which can be produced from components
if (isMarketingPackage) {
resultOutput = runService('getMktgPackagesAvailable', [productId : productId, facilityId : facility.facilityId])
quantitySummary.mktgPkgQOH = resultOutput.quantityOnHandTotal
quantitySummary.mktgPkgATP = resultOutput.availableToPromiseTotal
}
quantitySummaryByFacility.put(facility.facilityId, quantitySummary)
}
productInventoryItems = from("InventoryItem").where("productId", productId).orderBy("facilityId", "-datetimeReceived", "-inventoryItemId").queryList()
// TODO: get all incoming shipments not yet arrived coming into each facility that this product is in, use a view entity with ShipmentAndItem
findIncomingShipmentsConds = []
findIncomingShipmentsConds.add(EntityCondition.makeCondition('productId', EntityOperator.EQUALS, productId))
findIncomingShipmentsTypeConds = []
findIncomingShipmentsTypeConds.add(EntityCondition.makeCondition("shipmentTypeId", EntityOperator.EQUALS, "INCOMING_SHIPMENT"))
findIncomingShipmentsTypeConds.add(EntityCondition.makeCondition("shipmentTypeId", EntityOperator.EQUALS, "PURCHASE_SHIPMENT"))
findIncomingShipmentsTypeConds.add(EntityCondition.makeCondition("shipmentTypeId", EntityOperator.EQUALS, "SALES_RETURN"))
findIncomingShipmentsConds.add(EntityCondition.makeCondition(findIncomingShipmentsTypeConds, EntityOperator.OR))
findIncomingShipmentsStatusConds = []
findIncomingShipmentsStatusConds.add(EntityCondition.makeCondition("statusId", EntityOperator.NOT_EQUAL, "SHIPMENT_DELIVERED"))
findIncomingShipmentsStatusConds.add(EntityCondition.makeCondition("statusId", EntityOperator.NOT_EQUAL, "SHIPMENT_CANCELLED"))
findIncomingShipmentsStatusConds.add(EntityCondition.makeCondition("statusId", EntityOperator.NOT_EQUAL, "PURCH_SHIP_RECEIVED"))
findIncomingShipmentsConds.add(EntityCondition.makeCondition(findIncomingShipmentsStatusConds, EntityOperator.AND))
findIncomingShipmentsStatusCondition = EntityCondition.makeCondition(findIncomingShipmentsConds, EntityOperator.AND)
incomingShipmentAndItems = from("ShipmentAndItem").where(findIncomingShipmentsStatusCondition).orderBy("-estimatedArrivalDate").queryList()
incomingShipmentAndItemIter = incomingShipmentAndItems.iterator()
while (incomingShipmentAndItemIter) {
incomingShipmentAndItem = incomingShipmentAndItemIter.next()
facilityId = incomingShipmentAndItem.destinationFacilityId
quantitySummary = quantitySummaryByFacility.get(facilityId)
if (!quantitySummary) {
quantitySummary = [:]
quantitySummary.facilityId = facilityId
quantitySummaryByFacility.facilityId = quantitySummary
}
incomingShipmentAndItemList = quantitySummary.incomingShipmentAndItemList
if (!incomingShipmentAndItemList) {
incomingShipmentAndItemList = []
quantitySummary.incomingShipmentAndItemList = incomingShipmentAndItemList
}
incomingShipmentAndItemList.add(incomingShipmentAndItem)
}
// --------------------
// Production Runs
resultOutput = runService('getProductManufacturingSummaryByFacility',
[productId : productId, userLogin : userLogin])
// incoming products
manufacturingInQuantitySummaryByFacility = resultOutput.summaryInByFacility
// outgoing products (materials)
manufacturingOutQuantitySummaryByFacility = resultOutput.summaryOutByFacility
showEmpty = "true".equals(request.getParameter("showEmpty"))
// Find oustanding purchase orders for this item.
purchaseOrders = InventoryWorker.getOutstandingPurchaseOrders(productId, delegator)
context.productInventoryItems = productInventoryItems
context.quantitySummaryByFacility = quantitySummaryByFacility
context.manufacturingInQuantitySummaryByFacility = manufacturingInQuantitySummaryByFacility
context.manufacturingOutQuantitySummaryByFacility = manufacturingOutQuantitySummaryByFacility
context.showEmpty = showEmpty
context.purchaseOrders = purchaseOrders
}
}