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