blob: 9ec6d4b211449d7e8fc57465f2543945c375ab55 [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.
*/
/*
* 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("<script language=\"JavaScript\" type=\"text/javascript\">")
// make a list of variant sku with requireAmount
virtualVariantsRes = runService('getAssociatedProducts', [productIdTo : productId, type : "ALTERNATIVE_PACKAGE", checkViewAllow : true, prodCatalogId : categoryId])
virtualVariants = virtualVariantsRes.assocProducts
// Format to apply the currency code to the variant price in the javascript
if (productStore) {
localeString = productStore.defaultLocaleString
if (localeString) {
locale = UtilMisc.parseLocale(localeString)
}
}
variantPriceList = []
numberFormat = NumberFormat.getCurrencyInstance(locale)
if(virtualVariants){
amt = new StringBuffer()
// Create the javascript to return the price for each variant
variantPriceJS = new StringBuffer()
variantPriceJS.append("function getVariantPrice(sku) { ")
virtualVariants.each { virtualAssoc ->
virtual = virtualAssoc.getRelatedOne("MainProduct", false)
// Get price from a virtual product
priceContext.product = virtual
if (cart.isSalesOrder()) {
// sales order: run the "calculateProductPrice" service
virtualPriceMap = runService('calculateProductPrice', priceContext)
BigDecimal calculatedPrice = (BigDecimal)virtualPriceMap.get("price")
// Get the minimum quantity for variants if MINIMUM_ORDER_PRICE is set for variants.
variantPriceList.add(virtualPriceMap)
} else {
virtualPriceMap = runService('calculatePurchasePrice', priceContext)
}
if (virtualPriceMap.basePrice) {
basePrice = numberFormat.format(virtualPriceMap.basePrice)
} else {
basePrice = UtilProperties.getResourceBundleMap("CommonUiLabels", locale).get("CommonNA")
}
variantPriceJS.append(" if (sku == \"" + virtual.productId + "\") return \"" + basePrice + "\"; ")
}
variantPriceJS.append(" } ")
context.variantPriceList = variantPriceList
jsBuf.append(amt.toString())
jsBuf.append(variantPriceJS.toString())
jsBuf.append("</script>")
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