/* * 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. */ /* * This script is also referenced by the ecommerce's screens and * should not contain order component's specific code. */ import org.apache.ofbiz.base.util.* import org.apache.ofbiz.entity.* import org.apache.ofbiz.entity.util.EntityQuery import org.apache.ofbiz.service.* import org.apache.ofbiz.product.product.ProductContentWrapper import org.apache.ofbiz.product.config.ProductConfigWorker import org.apache.ofbiz.product.catalog.* import org.apache.ofbiz.product.store.* import org.apache.ofbiz.order.shoppingcart.* import org.apache.ofbiz.product.product.ProductWorker import org.apache.ofbiz.webapp.website.WebSiteWorker import java.text.NumberFormat //either optProduct, optProductId or productId must be specified product = request.getAttribute("optProduct") optProductId = request.getAttribute("optProductId") productId = product?.productId ?: optProductId ?: request.getAttribute("productId") webSiteId = WebSiteWorker.getWebSiteId(request) catalogId = CatalogWorker.getCurrentCatalogId(request) cart = ShoppingCartEvents.getCartObject(request) productStore = null productStoreId = null facilityId = null if (cart.isSalesOrder()) { productStore = ProductStoreWorker.getProductStore(request) productStoreId = productStore.productStoreId context.productStoreId = productStoreId facilityId = productStore.inventoryFacilityId } if (!facilityId) { productStoreFacility = EntityQuery.use(delegator).select("facilityId").from("ProductStoreFacility").where("productStoreId", productStoreId).queryFirst() if (productStoreFacility) { facilityId = productStoreFacility.facilityId } } autoUserLogin = session.getAttribute("autoUserLogin") userLogin = session.getAttribute("userLogin") context.remove("daysToShip") context.remove("averageRating") context.remove("numRatings") context.remove("totalPrice") // get the product entity if (!product && productId) { product = from("Product").where("productId", productId).cache(true).queryOne() } if (product) { //if order is purchase then don't calculate available inventory for product. if (cart.isSalesOrder()) { resultOutput = runService('getInventoryAvailableByFacility', [productId : product.productId, facilityId : facilityId, useCache : true]) totalAvailableToPromise = resultOutput.availableToPromiseTotal if (totalAvailableToPromise && totalAvailableToPromise.doubleValue() > 0) { productFacility = from("ProductFacility").where("productId", product.productId, "facilityId", facilityId).cache(true).queryOne() if (productFacility?.daysToShip != null) { context.daysToShip = productFacility.daysToShip } } } else { supplierProduct = from("SupplierProduct").where("productId", product.productId).orderBy("-availableFromDate").cache(true).queryFirst() if (supplierProduct?.standardLeadTimeDays != null) { standardLeadTimeDays = supplierProduct.standardLeadTimeDays daysToShip = standardLeadTimeDays + 1 context.daysToShip = daysToShip } } // make the productContentWrapper productContentWrapper = new ProductContentWrapper(product, request) context.productContentWrapper = productContentWrapper } categoryId = null reviews = null if (product) { categoryId = parameters.category_id ?: request.getAttribute("productCategoryId") // get the product price if (cart.isSalesOrder()) { // sales order: run the "calculateProductPrice" service priceContext = [product : product, currencyUomId : cart.getCurrency(), autoUserLogin : autoUserLogin, userLogin : userLogin] priceContext.webSiteId = webSiteId priceContext.prodCatalogId = catalogId priceContext.productStoreId = productStoreId priceContext.agreementId = cart.getAgreementId() priceContext.partyId = cart.getPartyId() // IMPORTANT: otherwise it'll be calculating prices using the logged in user which could be a CSR instead of the customer priceContext.checkIncludeVat = "Y" priceMap = runService('calculateProductPrice', priceContext) context.price = priceMap } else { // purchase order: run the "calculatePurchasePrice" service priceContext = [product : product, currencyUomId : cart.getCurrency(), partyId : cart.getPartyId(), userLogin : userLogin] priceMap = runService('calculatePurchasePrice', priceContext) context.price = priceMap } // get aggregated product totalPrice if ("AGGREGATED".equals(product.productTypeId)||"AGGREGATED_SERVICE".equals(product.productTypeId)) { configWrapper = ProductConfigWorker.getProductConfigWrapper(productId, cart.getCurrency(), request) if (configWrapper) { configWrapper.setDefaultConfig() context.totalPrice = configWrapper.getTotalPrice() } } // get the product review(s) reviews = product.getRelated("ProductReview", null, ["-postedDateTime"], true) // get product variant for Box/Case/Each productVariants = [] boolean isAlternativePacking = ProductWorker.isAlternativePacking(delegator, product.productId, null) mainProducts = [] if(isAlternativePacking){ productVirtualVariants = from("ProductAssoc").where("productIdTo", product.productId , "productAssocTypeId", "ALTERNATIVE_PACKAGE").cache(true).queryList() if(productVirtualVariants){ productVirtualVariants.each { virtualVariantKey -> mainProductMap = [:] mainProduct = virtualVariantKey.getRelatedOne("MainProduct", true) quantityUom = mainProduct.getRelatedOne("QuantityUom", true) mainProductMap.productId = mainProduct.productId mainProductMap.piecesIncluded = mainProduct.piecesIncluded mainProductMap.uomDesc = quantityUom.description mainProducts.add(mainProductMap) } } // get alternative product price when product doesn't have any feature jsBuf = new StringBuffer() jsBuf.append("") context.virtualJavaScript = jsBuf } } context.mainProducts = mainProducts } // get the average rating if (reviews) { totalProductRating = 0 numRatings = 0 reviews.each { productReview -> productRating = productReview.productRating if (productRating) { totalProductRating += productRating numRatings++ } } if (numRatings) { context.averageRating = totalProductRating/numRatings context.numRatings = numRatings } } // an example of getting features of a certain type to show sizeProductFeatureAndAppls = from("ProductFeatureAndAppl").where("productId", productId, "productFeatureTypeId", "SIZE").orderBy("sequenceNum", "defaultSequenceNum").cache(true).queryList() context.product = product context.categoryId = categoryId context.productReviews = reviews context.sizeProductFeatureAndAppls = sizeProductFeatureAndAppls