blob: e6e893ebfd70d3ba882c01f9ed022404e6019204 [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.
*******************************************************************************/
package org.ofbiz.product.store;
import java.math.BigDecimal;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Random;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javolution.util.FastList;
import javolution.util.FastMap;
import org.ofbiz.base.util.Debug;
import org.ofbiz.base.util.UtilHttp;
import org.ofbiz.base.util.UtilMisc;
import org.ofbiz.base.util.UtilValidate;
import org.ofbiz.common.geo.GeoWorker;
import org.ofbiz.entity.Delegator;
import org.ofbiz.entity.GenericEntityException;
import org.ofbiz.entity.GenericValue;
import org.ofbiz.entity.util.EntityQuery;
import org.ofbiz.entity.util.EntityUtil;
import org.ofbiz.party.contact.ContactMechWorker;
import org.ofbiz.product.config.ProductConfigWrapper;
import org.ofbiz.product.product.ProductWorker;
import org.ofbiz.service.GenericServiceException;
import org.ofbiz.service.LocalDispatcher;
import org.ofbiz.service.ServiceUtil;
import org.ofbiz.webapp.website.WebSiteWorker;
/**
* ProductStoreWorker - Worker class for store related functionality
*/
public class ProductStoreWorker {
public static final String module = ProductStoreWorker.class.getName();
public static GenericValue getProductStore(String productStoreId, Delegator delegator) {
if (productStoreId == null || delegator == null) {
return null;
}
GenericValue productStore = null;
try {
productStore = EntityQuery.use(delegator).from("ProductStore").where("productStoreId", productStoreId).cache().queryOne();
} catch (GenericEntityException e) {
Debug.logError(e, "Problem getting ProductStore entity", module);
}
return productStore;
}
public static GenericValue getProductStore(ServletRequest request) {
Delegator delegator = (Delegator) request.getAttribute("delegator");
String productStoreId = ProductStoreWorker.getProductStoreId(request);
return ProductStoreWorker.getProductStore(productStoreId, delegator);
}
public static String getProductStoreId(ServletRequest request) {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpSession session = httpRequest.getSession(false);
if (session != null && session.getAttribute("productStoreId") != null) {
return (String) session.getAttribute("productStoreId");
} else {
GenericValue webSite = WebSiteWorker.getWebSite(httpRequest);
if (webSite != null) {
String productStoreId = webSite.getString("productStoreId");
// might be nice to do this, but not needed and has a problem with dependencies: setSessionProductStore(productStoreId, httpRequest);
return productStoreId;
}
}
return null;
}
public static String getStoreCurrencyUomId(HttpServletRequest request) {
GenericValue productStore = getProductStore(request);
if (UtilValidate.isEmpty(productStore)) {
Debug.logError(
"No product store found in request, cannot set CurrencyUomId!", module);
return null;
} else {
return UtilHttp.getCurrencyUom(request.getSession(), productStore.getString("defaultCurrencyUomId"));
}
}
public static Locale getStoreLocale(HttpServletRequest request) {
GenericValue productStore = getProductStore(request);
if (UtilValidate.isEmpty(productStore)) {
Debug.logError(
"No product store found in request, cannot set locale!", module);
return null;
} else {
return UtilHttp.getLocale(request, request.getSession(), productStore.getString("defaultLocaleString"));
}
}
public static String determineSingleFacilityForStore(Delegator delegator, String productStoreId) {
GenericValue productStore = null;
try {
productStore = EntityQuery.use(delegator).from("ProductStore").where("productStoreId", productStoreId).queryOne();
} catch (GenericEntityException e) {
Debug.logError(e, module);
}
if (productStore != null) {
if ("Y".equalsIgnoreCase(productStore.getString("oneInventoryFacility"))) {
return productStore.getString("inventoryFacilityId");
}
}
return null;
}
public static boolean autoSaveCart(Delegator delegator, String productStoreId) {
return autoSaveCart(getProductStore(productStoreId, delegator));
}
public static boolean autoSaveCart(GenericValue productStore) {
return productStore == null ? false : "Y".equalsIgnoreCase(productStore.getString("autoSaveCart"));
}
public static String getProductStorePayToPartyId(String productStoreId, Delegator delegator) {
return getProductStorePayToPartyId(getProductStore(productStoreId, delegator));
}
public static String getProductStorePayToPartyId(GenericValue productStore) {
String payToPartyId = "Company"; // default value
if (productStore != null && productStore.get("payToPartyId") != null) {
payToPartyId = productStore.getString("payToPartyId");
}
return payToPartyId;
}
public static String getProductStorePaymentProperties(ServletRequest request, String paymentMethodTypeId, String paymentServiceTypeEnumId, boolean anyServiceType) {
Delegator delegator = (Delegator) request.getAttribute("delegator");
String productStoreId = ProductStoreWorker.getProductStoreId(request);
return ProductStoreWorker.getProductStorePaymentProperties(delegator, productStoreId, paymentMethodTypeId, paymentServiceTypeEnumId, anyServiceType);
}
public static String getProductStorePaymentProperties(Delegator delegator, String productStoreId, String paymentMethodTypeId, String paymentServiceTypeEnumId, boolean anyServiceType) {
GenericValue setting = ProductStoreWorker.getProductStorePaymentSetting(delegator, productStoreId, paymentMethodTypeId, paymentServiceTypeEnumId, anyServiceType);
String payProps = "payment.properties";
if (setting != null && setting.get("paymentPropertiesPath") != null) {
payProps = setting.getString("paymentPropertiesPath");
}
return payProps;
}
public static GenericValue getProductStorePaymentSetting(Delegator delegator, String productStoreId, String paymentMethodTypeId, String paymentServiceTypeEnumId, boolean anyServiceType) {
GenericValue storePayment = null;
try {
storePayment = EntityQuery.use(delegator).from("ProductStorePaymentSetting").where("productStoreId", productStoreId, "paymentMethodTypeId", paymentMethodTypeId, "paymentServiceTypeEnumId", paymentServiceTypeEnumId).cache().queryOne();
} catch (GenericEntityException e) {
Debug.logError(e, "Problems looking up store payment settings", module);
}
if (anyServiceType) {
if (storePayment == null) {
try {
storePayment = EntityQuery.use(delegator).from("ProductStorePaymentSetting").where("productStoreId", productStoreId, "paymentMethodTypeId", paymentMethodTypeId).queryFirst();
} catch (GenericEntityException e) {
Debug.logError(e, "Problems looking up store payment settings", module);
}
}
if (storePayment == null) {
try {
storePayment = EntityQuery.use(delegator).from("ProductStorePaymentSetting").where("productStoreId", productStoreId).queryFirst();
} catch (GenericEntityException e) {
Debug.logError(e, "Problems looking up store payment settings", module);
}
}
}
return storePayment;
}
public static List<GenericValue> getProductStoreShipmentMethods(Delegator delegator, String productStoreId,
String shipmentMethodTypeId, String carrierPartyId, String carrierRoleTypeId) {
// check for an external service call
List<GenericValue> storeShipMethods = null;
try {
storeShipMethods = EntityQuery.use(delegator).from("ProductStoreShipmentMeth")
.where("productStoreId", productStoreId, "shipmentMethodTypeId", shipmentMethodTypeId,
"partyId", carrierPartyId, "roleTypeId", carrierRoleTypeId)
.cache(true)
.queryList();
} catch (GenericEntityException e) {
Debug.logError(e, module);
}
return storeShipMethods;
}
public static GenericValue getProductStoreShipmentMethod(Delegator delegator, String productStoreId,
String shipmentMethodTypeId, String carrierPartyId, String carrierRoleTypeId) {
// TODO: selecting the first record is a far from optimal solution but, since the productStoreShipmentMethod
// is currently used to get the service name to get the online estimate, this should not be a huge deal for now.
return EntityUtil.getFirst(getProductStoreShipmentMethods(delegator, productStoreId, shipmentMethodTypeId, carrierPartyId, carrierRoleTypeId));
}
public static List<GenericValue> getAvailableStoreShippingMethods(Delegator delegator, String productStoreId, GenericValue shippingAddress, List<BigDecimal> itemSizes, Map<String, BigDecimal> featureIdMap, BigDecimal weight, BigDecimal orderTotal) {
if (featureIdMap == null) {
featureIdMap = FastMap.newInstance();
}
List<GenericValue> shippingMethods = null;
try {
shippingMethods = EntityQuery.use(delegator).from("ProductStoreShipmentMethView").where("productStoreId", productStoreId).orderBy("sequenceNumber").cache(true).queryList();
} catch (GenericEntityException e) {
Debug.logError(e, "Unable to get ProductStore shipping methods", module);
return null;
}
// clone the list for concurrent modification
List<GenericValue> returnShippingMethods = UtilMisc.makeListWritable(shippingMethods);
if (shippingMethods != null) {
for (GenericValue method: shippingMethods) {
// test min/max weight first
BigDecimal minWeight = method.getBigDecimal("minWeight");
BigDecimal maxWeight = method.getBigDecimal("maxWeight");
if (minWeight != null && minWeight.compareTo(BigDecimal.ZERO) > 0 && minWeight.compareTo(weight) > 0) {
returnShippingMethods.remove(method);
//Debug.logInfo("Removed shipping method due to not enough weight", module);
continue;
}
if (maxWeight != null && maxWeight.compareTo(BigDecimal.ZERO) > 0 && maxWeight.compareTo(weight) < 0) {
returnShippingMethods.remove(method);
//Debug.logInfo("Removed shipping method due to too much weight", module);
continue;
}
// test order total
BigDecimal minTotal = method.getBigDecimal("minTotal");
BigDecimal maxTotal = method.getBigDecimal("maxTotal");
if (minTotal != null && minTotal.compareTo(BigDecimal.ZERO) > 0 && minTotal.compareTo(orderTotal) > 0) {
returnShippingMethods.remove(method);
//Debug.logInfo("Removed shipping method due to not enough order total", module);
continue;
}
if (maxTotal != null && maxTotal.compareTo(BigDecimal.ZERO) > 0 && maxTotal.compareTo(orderTotal) < 0) {
returnShippingMethods.remove(method);
//Debug.logInfo("Removed shipping method due to too much shipping total", module);
continue;
}
// test product sizes
BigDecimal minSize = method.getBigDecimal("minSize");
BigDecimal maxSize = method.getBigDecimal("maxSize");
if (minSize != null && minSize.compareTo(BigDecimal.ZERO) > 0) {
boolean allMatch = false;
if (itemSizes != null) {
allMatch = true;
for (BigDecimal size: itemSizes) {
if (size.compareTo(minSize) < 0) {
allMatch = false;
}
}
}
if (!allMatch) {
returnShippingMethods.remove(method);
//Debug.logInfo("Removed shipping method because not all products are less then min size", module);
continue;
}
}
if (maxSize != null && maxSize.compareTo(BigDecimal.ZERO) > 0) {
boolean allMatch = false;
if (itemSizes != null) {
allMatch = true;
for (BigDecimal size: itemSizes) {
if (size.compareTo(maxSize) > 0) {
allMatch = false;
}
}
}
if (!allMatch) {
returnShippingMethods.remove(method);
//Debug.logInfo("Removed shipping method because one or more products were more then max size", module);
continue;
}
}
// check USPS address
String allowUspsAddr = method.getString("allowUspsAddr");
String requireUspsAddr = method.getString("requireUspsAddr");
boolean isUspsAddress = ContactMechWorker.isUspsAddress(shippingAddress);
if ("N".equals(allowUspsAddr) && isUspsAddress) {
returnShippingMethods.remove(method);
//Debug.logInfo("Remove shipping method due to USPS address", module);
continue;
}
if ("Y".equals(requireUspsAddr) && !isUspsAddress) {
returnShippingMethods.remove(method);
//Debug.logInfo("Removed shipping method due to NON-USPS address", module);
continue;
}
// check company address
String companyPartyId = method.getString("companyPartyId");
String allowCompanyAddr = method.getString("allowCompanyAddr");
String requireCompanyAddr = method.getString("requireCompanyAddr");
boolean isCompanyAddress = ContactMechWorker.isCompanyAddress(shippingAddress, companyPartyId);
if ("N".equals(allowCompanyAddr) && isCompanyAddress) {
returnShippingMethods.remove(method);
//Debug.logInfo("Removed shipping method due to Company address", module);
continue;
}
if ("Y".equals(requireCompanyAddr) && !isCompanyAddress) {
returnShippingMethods.remove(method);
//Debug.logInfo("Removed shipping method due to NON-Company address", module);
continue;
}
// check the items excluded from shipping
String includeFreeShipping = method.getString("includeNoChargeItems");
if (includeFreeShipping != null && "N".equalsIgnoreCase(includeFreeShipping)) {
if (UtilValidate.isEmpty(itemSizes) && orderTotal.compareTo(BigDecimal.ZERO) == 0) {
returnShippingMethods.remove(method);
//Debug.logInfo("Removed shipping method due to all items being exempt from shipping", module);
continue;
}
}
// check the geos
String includeGeoId = method.getString("includeGeoId");
String excludeGeoId = method.getString("excludeGeoId");
if (UtilValidate.isNotEmpty(includeGeoId) || UtilValidate.isNotEmpty(excludeGeoId)) {
if (shippingAddress == null) {
returnShippingMethods.remove(method);
//Debug.logInfo("Removed shipping method due to empty shipping adresss (may not have been selected yet)", module);
continue;
}
}
if (UtilValidate.isNotEmpty(includeGeoId)) {
List<GenericValue> includeGeoGroup = GeoWorker.expandGeoGroup(includeGeoId, delegator);
if (!GeoWorker.containsGeo(includeGeoGroup, shippingAddress.getString("countryGeoId"), delegator) &&
!GeoWorker.containsGeo(includeGeoGroup, shippingAddress.getString("stateProvinceGeoId"), delegator) &&
!GeoWorker.containsGeo(includeGeoGroup, shippingAddress.getString("postalCodeGeoId"), delegator)) {
// not in required included geos
returnShippingMethods.remove(method);
//Debug.logInfo("Removed shipping method due to being outside the included GEO", module);
continue;
}
}
if (UtilValidate.isNotEmpty(excludeGeoId)) {
List<GenericValue> excludeGeoGroup = GeoWorker.expandGeoGroup(excludeGeoId, delegator);
if (GeoWorker.containsGeo(excludeGeoGroup, shippingAddress.getString("countryGeoId"), delegator) ||
GeoWorker.containsGeo(excludeGeoGroup, shippingAddress.getString("stateProvinceGeoId"), delegator) ||
GeoWorker.containsGeo(excludeGeoGroup, shippingAddress.getString("postalCodeGeoId"), delegator)) {
// in excluded geos
returnShippingMethods.remove(method);
//Debug.logInfo("Removed shipping method due to being inside the excluded GEO", module);
continue;
}
}
// check the features
String includeFeatures = method.getString("includeFeatureGroup");
String excludeFeatures = method.getString("excludeFeatureGroup");
if (UtilValidate.isNotEmpty(includeFeatures)) {
List<GenericValue> includedFeatures = null;
try {
includedFeatures = EntityQuery.use(delegator).from("ProductFeatureGroupAppl").where("productFeatureGroupId", includeFeatures).cache(true).queryList();
} catch (GenericEntityException e) {
Debug.logError(e, "Unable to lookup ProductFeatureGroupAppl records for group : " + includeFeatures, module);
}
if (includedFeatures != null) {
boolean foundOne = false;
for (GenericValue appl: includedFeatures) {
if (featureIdMap.containsKey(appl.getString("productFeatureId"))) {
foundOne = true;
break;
}
}
if (!foundOne) {
returnShippingMethods.remove(method);
//Debug.logInfo("Removed shipping method due to no required features found", module);
continue;
}
}
}
if (UtilValidate.isNotEmpty(excludeFeatures)) {
List<GenericValue> excludedFeatures = null;
try {
excludedFeatures = EntityQuery.use(delegator).from("ProductFeatureGroupAppl").where("productFeatureGroupId", excludeFeatures).cache(true).queryList();
} catch (GenericEntityException e) {
Debug.logError(e, "Unable to lookup ProductFeatureGroupAppl records for group : " + excludeFeatures, module);
}
if (excludedFeatures != null) {
for (GenericValue appl: excludedFeatures) {
if (featureIdMap.containsKey(appl.getString("productFeatureId"))) {
returnShippingMethods.remove(method);
//Debug.logInfo("Removed shipping method due to an exluded feature being found : " + appl.getString("productFeatureId"), module);
continue;
}
}
}
}
}
}
return returnShippingMethods;
}
public static ProductStoreSurveyWrapper getRandomSurveyWrapper(HttpServletRequest request, String groupName) {
GenericValue productStore = getProductStore(request);
HttpSession session = request.getSession();
if (productStore == null) {
return null;
}
GenericValue userLogin = (GenericValue) session.getAttribute("userLogin");
if (userLogin == null) {
userLogin = (GenericValue) session.getAttribute("autoUserLogin");
}
String partyId = userLogin != null ? userLogin.getString("partyId") : null;
String origParamMapId = UtilHttp.stashParameterMap(request);
Map<String, Object> passThruFields = UtilMisc.<String, Object>toMap("_ORIG_PARAM_MAP_ID_", origParamMapId);
return getRandomSurveyWrapper(productStore.getDelegator(), productStore.getString("productStoreId"), groupName, partyId, passThruFields);
}
public static ProductStoreSurveyWrapper getRandomSurveyWrapper(Delegator delegator, String productStoreId, String groupName, String partyId, Map<String, Object> passThruFields) {
List<GenericValue> randomSurveys = getSurveys(delegator, productStoreId, groupName, null, "RANDOM_POLL", null);
if (!UtilValidate.isEmpty(randomSurveys)) {
Random rand = new Random();
int index = rand.nextInt(randomSurveys.size());
GenericValue appl = randomSurveys.get(index);
return new ProductStoreSurveyWrapper(appl, partyId, passThruFields);
} else {
return null;
}
}
public static List<GenericValue> getProductSurveys(Delegator delegator, String productStoreId, String productId, String surveyApplTypeId) {
return getSurveys(delegator, productStoreId, null, productId, surveyApplTypeId, null);
}
public static List<GenericValue> getProductSurveys(Delegator delegator, String productStoreId, String productId, String surveyApplTypeId, String parentProductId) {
return getSurveys(delegator, productStoreId, null, productId, surveyApplTypeId,parentProductId);
}
public static List<GenericValue> getSurveys(Delegator delegator, String productStoreId, String groupName, String productId, String surveyApplTypeId, String parentProductId) {
List<GenericValue> surveys = FastList.newInstance();
List<GenericValue> storeSurveys = null;
try {
storeSurveys = EntityQuery.use(delegator).from("ProductStoreSurveyAppl").where("productStoreId", productStoreId, "surveyApplTypeId", surveyApplTypeId).orderBy("sequenceNum").cache(true).queryList();
} catch (GenericEntityException e) {
Debug.logError(e, "Unable to get ProductStoreSurveyAppl for store : " + productStoreId, module);
return surveys;
}
// limit by date
storeSurveys = EntityUtil.filterByDate(storeSurveys);
// limit based on group name
if (!UtilValidate.isEmpty(groupName)) {
storeSurveys = EntityUtil.filterByAnd(storeSurveys, UtilMisc.toMap("groupName", groupName));
}
Debug.logInfo("getSurvey for product " + productId,module);
// limit by product
if (!UtilValidate.isEmpty(productId) && !UtilValidate.isEmpty(storeSurveys)) {
for (GenericValue surveyAppl: storeSurveys) {
GenericValue product = null;
String virtualProductId = null;
// if the item is a variant, get its virtual productId
try {
product = EntityQuery.use(delegator).from("Product").where("productId", productId).cache().queryOne();
if ((product != null) && ("Y".equals(product.get("isVariant")))) {
if (parentProductId != null) {
virtualProductId = parentProductId;
}
else {
virtualProductId = ProductWorker.getVariantVirtualId(product);
}
Debug.logInfo("getSurvey for virtual product " + virtualProductId,module);
}
} catch (GenericEntityException e) {
Debug.logError(e, "Problem finding product from productId " + productId, module);
}
// use survey if productId or virtualProductId of the variant product is in the ProductStoreSurveyAppl
if (surveyAppl.get("productId") != null) {
if (surveyAppl.get("productId").equals(productId)) {
surveys.add(surveyAppl);
} else if ((virtualProductId != null) && (surveyAppl.getString("productId").equals(virtualProductId))) {
surveys.add(surveyAppl);
}
} else if (surveyAppl.get("productCategoryId") != null) {
List<GenericValue> categoryMembers = null;
try {
categoryMembers = EntityQuery.use(delegator).from("ProductCategoryMember").where("productCategoryId", surveyAppl.get("productCategoryId")).cache(true).queryList();
} catch (GenericEntityException e) {
Debug.logError(e, "Unable to get ProductCategoryMember records for survey application : " + surveyAppl, module);
}
if (categoryMembers != null) {
for (GenericValue member: categoryMembers) {
if (productId != null && productId.equals(member.getString("productId"))) {
surveys.add(surveyAppl);
break;
} else if ((virtualProductId != null) && (virtualProductId.equals(member.getString("productId")))) { // similarly, check if virtual productId is in category
surveys.add(surveyAppl);
break;
}
}
}
}
}
} else if (storeSurveys != null) {
surveys.addAll(storeSurveys);
}
return surveys;
}
/** Returns the number of responses for this survey by party */
public static int checkSurveyResponse(HttpServletRequest request, String surveyId) {
Delegator delegator = (Delegator) request.getAttribute("delegator");
GenericValue userLogin = (GenericValue) request.getSession().getAttribute("userLogin");
String productStoreId = getProductStoreId(request);
if (userLogin == null) {
return -1;
}
return checkSurveyResponse(delegator, userLogin.getString("partyId"), productStoreId, surveyId);
}
/** Returns the number of responses for this survey by party */
public static int checkSurveyResponse(Delegator delegator, String partyId, String productStoreId, String surveyId) {
if (delegator == null || partyId == null || productStoreId == null) {
return -1;
}
List<GenericValue> surveyResponse = null;
try {
surveyResponse = EntityQuery.use(delegator).from("SurveyResponse").where("surveyId", surveyId, "partyId", partyId).queryList();
} catch (GenericEntityException e) {
Debug.logError(e, module);
return -1;
}
if (UtilValidate.isEmpty(surveyResponse)) {
return 0;
} else {
return surveyResponse.size();
}
}
public static boolean isStoreInventoryRequired(ServletRequest request, GenericValue product) {
return isStoreInventoryRequiredAndAvailable(request, product, null, Boolean.TRUE, null);
}
public static boolean isStoreInventoryAvailable(ServletRequest request, GenericValue product, BigDecimal quantity) {
return isStoreInventoryRequiredAndAvailable(request, product, quantity, null, Boolean.TRUE);
}
/**
* This method is used in the showcart pages to determine whether or not to show the inventory message and
* in the productdetail pages to determine whether or not to show the item as out of stock.
*
* @param request ServletRequest (or HttpServletRequest of course)
* @param product GenericValue representing the product in question
* @param quantity Quantity desired.
* @param wantRequired If true then inventory required must be true for the result to be true, if false must be false; if null don't care
* @param wantAvailable If true then inventory avilable must be true for the result to be true, if false must be false; if null don't care
*/
public static boolean isStoreInventoryRequiredAndAvailable(ServletRequest request, GenericValue product, BigDecimal quantity, Boolean wantRequired, Boolean wantAvailable) {
GenericValue productStore = getProductStore(request);
if (productStore == null) {
Debug.logWarning("No ProductStore found, return false for inventory check", module);
return false;
}
if (product == null) {
Debug.logWarning("No Product passed, return false for inventory check", module);
return false;
}
if (quantity == null) quantity = BigDecimal.ONE;
String productStoreId = productStore.getString("productStoreId");
LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");
try {
Boolean requiredOkay = null;
if (wantRequired != null) {
Map<String, Object> invReqResult = dispatcher.runSync("isStoreInventoryRequired", UtilMisc.toMap("productStoreId", productStoreId, "productId", product.get("productId"), "product", product, "productStore", productStore));
if (ServiceUtil.isError(invReqResult)) {
Debug.logError("Error calling isStoreInventoryRequired service, result is: " + invReqResult, module);
return false;
}
requiredOkay = Boolean.valueOf(wantRequired.booleanValue() == "Y".equals(invReqResult.get("requireInventory")));
}
Boolean availableOkay = null;
if (wantAvailable != null) {
Map<String, Object> invAvailResult = dispatcher.runSync("isStoreInventoryAvailable", UtilMisc.toMap("productStoreId", productStoreId, "productId", product.get("productId"), "product", product, "productStore", productStore, "quantity", quantity));
if (ServiceUtil.isError(invAvailResult)) {
Debug.logError("Error calling isStoreInventoryAvailable service, result is: " + invAvailResult, module);
return false;
}
availableOkay = Boolean.valueOf(wantAvailable.booleanValue() == "Y".equals(invAvailResult.get("available")));
}
if ((requiredOkay == null || requiredOkay.booleanValue()) && (availableOkay == null || availableOkay.booleanValue())) {
return true;
} else {
return false;
}
} catch (GenericServiceException e) {
String errMsg = "Fatal error calling inventory checking services: " + e.toString();
Debug.logError(e, errMsg, module);
return false;
}
}
public static boolean isStoreInventoryAvailable(ServletRequest request, ProductConfigWrapper productConfig, BigDecimal quantity) {
GenericValue productStore = getProductStore(request);
if (productStore == null) {
Debug.logWarning("No ProductStore found, return false for inventory check", module);
return false;
}
String productStoreId = productStore.getString("productStoreId");
Delegator delegator = (Delegator) request.getAttribute("delegator");
LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");
return isStoreInventoryAvailable(productStoreId, productConfig, quantity, delegator, dispatcher);
}
/** check inventory availability for the given catalog, product, quantity, etc */
public static boolean isStoreInventoryAvailable(String productStoreId, ProductConfigWrapper productConfig, BigDecimal quantity, Delegator delegator, LocalDispatcher dispatcher) {
GenericValue productStore = getProductStore(productStoreId, delegator);
if (productStore == null) {
Debug.logWarning("No ProductStore found with id " + productStoreId + ", returning false for inventory available check", module);
return false;
}
// if prodCatalog is set to not check inventory break here
if ("N".equals(productStore.getString("checkInventory"))) {
// note: if not set, defaults to yes, check inventory
if (Debug.verboseOn()) Debug.logVerbose("ProductStore with id " + productStoreId + ", is set to NOT check inventory, returning true for inventory available check", module);
return true;
}
boolean isInventoryAvailable = false;
if ("Y".equals(productStore.getString("oneInventoryFacility"))) {
String inventoryFacilityId = productStore.getString("inventoryFacilityId");
if (UtilValidate.isEmpty(inventoryFacilityId)) {
Debug.logWarning("ProductStore with id " + productStoreId + " has Y for oneInventoryFacility but inventoryFacilityId is empty, returning false for inventory check", module);
return false;
}
return ProductWorker.isProductInventoryAvailableByFacility(productConfig, inventoryFacilityId, quantity, dispatcher);
} else {
GenericValue product = productConfig.getProduct();
List<GenericValue> productFacilities = null;
try {
productFacilities = product.getRelated("ProductFacility", null, null, true);
} catch (GenericEntityException e) {
Debug.logWarning(e, "Error invoking getRelatedCache in isCatalogInventoryAvailable", module);
return false;
}
if (UtilValidate.isNotEmpty(productFacilities)) {
for (GenericValue pfValue: productFacilities) {
isInventoryAvailable = ProductWorker.isProductInventoryAvailableByFacility(productConfig, pfValue.getString("facilityId"), quantity, dispatcher);
if (isInventoryAvailable == true) {
return isInventoryAvailable;
}
}
}
return false;
}
}
protected static Map<String, String> defaultProductStoreEmailScreenLocation = FastMap.newInstance();
static {
defaultProductStoreEmailScreenLocation.put("PRDS_ODR_CONFIRM", "component://ecommerce/widget/EmailOrderScreens.xml#OrderConfirmNotice");
defaultProductStoreEmailScreenLocation.put("PRDS_ODR_COMPLETE", "component://ecommerce/widget/EmailOrderScreens.xml#OrderCompleteNotice");
defaultProductStoreEmailScreenLocation.put("PRDS_ODR_BACKORDER", "component://ecommerce/widget/EmailOrderScreens.xml#BackorderNotice");
defaultProductStoreEmailScreenLocation.put("PRDS_ODR_CHANGE", "component://ecommerce/widget/EmailOrderScreens.xml#OrderChangeNotice");
defaultProductStoreEmailScreenLocation.put("PRDS_ODR_PAYRETRY", "component://ecommerce/widget/EmailOrderScreens.xml#PaymentRetryNotice");
defaultProductStoreEmailScreenLocation.put("PRDS_RTN_ACCEPT", "component://ecommerce/widget/EmailReturnScreens.xml#ReturnAccept");
defaultProductStoreEmailScreenLocation.put("PRDS_RTN_COMPLETE", "component://ecommerce/widget/EmailReturnScreens.xml#ReturnComplete");
defaultProductStoreEmailScreenLocation.put("PRDS_RTN_CANCEL", "component://ecommerce/widget/EmailReturnScreens.xml#ReturnCancel");
defaultProductStoreEmailScreenLocation.put("PRDS_GC_PURCHASE", "component://ecommerce/widget/EmailGiftCardScreens.xml#GiftCardPurchase");
defaultProductStoreEmailScreenLocation.put("PRDS_GC_RELOAD", "component://ecommerce/widget/EmailGiftCardScreens.xml#GiftCardReload");
defaultProductStoreEmailScreenLocation.put("PRDS_QUO_CONFIRM", "component://order/widget/ordermgr/QuoteScreens.xml#ViewQuoteSimple");
defaultProductStoreEmailScreenLocation.put("PRDS_PWD_RETRIEVE", "component://securityext/widget/EmailSecurityScreens.xml#PasswordEmail");
defaultProductStoreEmailScreenLocation.put("PRDS_TELL_FRIEND", "component://ecommerce/widget/EmailProductScreens.xml#TellFriend");
defaultProductStoreEmailScreenLocation.put("PRDS_CUST_REGISTER", "component://securityext/widget/EmailSecurityScreens.xml#PasswordEmail");
}
public static String getDefaultProductStoreEmailScreenLocation(String emailType) {
return defaultProductStoreEmailScreenLocation.get(emailType);
}
}