blob: 59eae6b86741917cd1a80b458aa4807bc30c4c98 [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.order.shoppinglist;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javolution.util.FastList;
import javolution.util.FastMap;
import org.ofbiz.base.util.Debug;
import org.ofbiz.base.util.GeneralException;
import org.ofbiz.base.util.UtilDateTime;
import org.ofbiz.base.util.UtilHttp;
import org.ofbiz.base.util.UtilMisc;
import org.ofbiz.base.util.UtilProperties;
import org.ofbiz.base.util.UtilValidate;
import org.ofbiz.entity.Delegator;
import org.ofbiz.entity.GenericEntityException;
import org.ofbiz.entity.GenericValue;
import org.ofbiz.entity.util.EntityUtil;
import org.ofbiz.order.shoppingcart.CartItemModifyException;
import org.ofbiz.order.shoppingcart.ItemNotFoundException;
import org.ofbiz.order.shoppingcart.ShoppingCart;
import org.ofbiz.order.shoppingcart.ShoppingCartEvents;
import org.ofbiz.order.shoppingcart.ShoppingCartItem;
import org.ofbiz.product.catalog.CatalogWorker;
import org.ofbiz.product.config.ProductConfigWorker;
import org.ofbiz.product.config.ProductConfigWrapper;
import org.ofbiz.product.store.ProductStoreWorker;
import org.ofbiz.service.GenericServiceException;
import org.ofbiz.service.LocalDispatcher;
import org.ofbiz.service.ModelService;
import org.ofbiz.service.ServiceUtil;
import org.ofbiz.webapp.website.WebSiteWorker;
/**
* Shopping cart events.
*/
public class ShoppingListEvents {
public static final String module = ShoppingListEvents.class.getName();
public static final String resource = "OrderUiLabels";
public static final String resource_error = "OrderErrorUiLabels";
public static final String PERSISTANT_LIST_NAME = "auto-save";
public static String addBulkFromCart(HttpServletRequest request, HttpServletResponse response) {
Delegator delegator = (Delegator) request.getAttribute("delegator");
LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");
ShoppingCart cart = ShoppingCartEvents.getCartObject(request);
GenericValue userLogin = (GenericValue) request.getSession().getAttribute("userLogin");
String shoppingListId = request.getParameter("shoppingListId");
String shoppingListTypeId = request.getParameter("shoppingListTypeId");
String selectedCartItems[] = request.getParameterValues("selectedItem");
if (UtilValidate.isEmpty(selectedCartItems)) {
selectedCartItems = makeCartItemsArray(cart);
}
try {
shoppingListId = addBulkFromCart(delegator, dispatcher, cart, userLogin, shoppingListId, shoppingListTypeId, selectedCartItems, true, true);
} catch (IllegalArgumentException e) {
request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
return "error";
}
request.setAttribute("shoppingListId", shoppingListId);
return "success";
}
public static String addBulkFromCart(Delegator delegator, LocalDispatcher dispatcher, ShoppingCart cart, GenericValue userLogin, String shoppingListId, String shoppingListTypeId, String[] items, boolean allowPromo, boolean append) throws IllegalArgumentException {
String errMsg = null;
if (items == null || items.length == 0) {
errMsg = UtilProperties.getMessage(resource_error, "shoppinglistevents.select_items_to_add_to_list", cart.getLocale());
throw new IllegalArgumentException(errMsg);
}
if (UtilValidate.isEmpty(shoppingListId)) {
// create a new shopping list
Map<String, Object> newListResult = null;
try {
newListResult = dispatcher.runSync("createShoppingList", UtilMisc.<String, Object>toMap("userLogin", userLogin, "productStoreId", cart.getProductStoreId(), "partyId", cart.getOrderPartyId(), "shoppingListTypeId", shoppingListTypeId, "currencyUom", cart.getCurrency()));
} catch (GenericServiceException e) {
Debug.logError(e, "Problems creating new ShoppingList", module);
errMsg = UtilProperties.getMessage(resource_error,"shoppinglistevents.cannot_create_new_shopping_list", cart.getLocale());
throw new IllegalArgumentException(errMsg);
}
// check for errors
if (ServiceUtil.isError(newListResult)) {
throw new IllegalArgumentException(ServiceUtil.getErrorMessage(newListResult));
}
// get the new list id
if (newListResult != null) {
shoppingListId = (String) newListResult.get("shoppingListId");
}
// if no list was created throw an error
if (shoppingListId == null || shoppingListId.equals("")) {
errMsg = UtilProperties.getMessage(resource_error,"shoppinglistevents.shoppingListId_is_required_parameter", cart.getLocale());
throw new IllegalArgumentException(errMsg);
}
} else if (!append) {
try {
clearListInfo(delegator, shoppingListId);
} catch (GenericEntityException e) {
Debug.logError(e, module);
throw new IllegalArgumentException("Could not clear current shopping list: " + e.toString());
}
}
for (int i = 0; i < items.length; i++) {
Integer cartIdInt = null;
try {
cartIdInt = Integer.valueOf(items[i]);
} catch (Exception e) {
Debug.logWarning(e, UtilProperties.getMessage(resource_error,"OrderIllegalCharacterInSelectedItemField", cart.getLocale()), module);
}
if (cartIdInt != null) {
ShoppingCartItem item = cart.findCartItem(cartIdInt.intValue());
if (allowPromo || !item.getIsPromo()) {
Debug.logInfo("Adding cart item to shopping list [" + shoppingListId + "], allowPromo=" + allowPromo + ", item.getIsPromo()=" + item.getIsPromo() + ", item.getProductId()=" + item.getProductId() + ", item.getQuantity()=" + item.getQuantity(), module);
Map<String, Object> serviceResult = null;
try {
Map<String, Object> ctx = UtilMisc.<String, Object>toMap("userLogin", userLogin, "shoppingListId", shoppingListId, "productId", item.getProductId(), "quantity", item.getQuantity());
ctx.put("reservStart", item.getReservStart());
ctx.put("reservLength", item.getReservLength());
ctx.put("reservPersons", item.getReservPersons());
// ctx.put("accommodationMapId", item.getAccommodationMapId());
// ctx.put("accommodationSpotId", item.getAccommodationSpotId());
if (item.getConfigWrapper() != null) {
ctx.put("configId", item.getConfigWrapper().getConfigId());
}
serviceResult = dispatcher.runSync("createShoppingListItem", ctx);
} catch (GenericServiceException e) {
Debug.logError(e, "Problems creating ShoppingList item entity", module);
errMsg = UtilProperties.getMessage(resource_error,"shoppinglistevents.error_adding_item_to_shopping_list", cart.getLocale());
throw new IllegalArgumentException(errMsg);
}
// check for errors
if (ServiceUtil.isError(serviceResult)) {
throw new IllegalArgumentException(ServiceUtil.getErrorMessage(serviceResult));
}
}
}
}
// return the shoppinglist id
return shoppingListId;
}
public static String addListToCart(HttpServletRequest request, HttpServletResponse response) {
Delegator delegator = (Delegator) request.getAttribute("delegator");
LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");
ShoppingCart cart = ShoppingCartEvents.getCartObject(request);
String shoppingListId = request.getParameter("shoppingListId");
String includeChild = request.getParameter("includeChild");
String prodCatalogId = CatalogWorker.getCurrentCatalogId(request);
String eventMessage = null;
try {
addListToCart(delegator, dispatcher, cart, prodCatalogId, shoppingListId, (includeChild != null), true, true);
} catch (IllegalArgumentException e) {
request.setAttribute("_ERROR_MESSAGE_", e.getMessage());
return "error";
}
if (UtilValidate.isNotEmpty(eventMessage)) {
request.setAttribute("_EVENT_MESSAGE_", eventMessage);
}
return "success";
}
public static String addListToCart(Delegator delegator, LocalDispatcher dispatcher, ShoppingCart cart, String prodCatalogId, String shoppingListId, boolean includeChild, boolean setAsListItem, boolean append) throws java.lang.IllegalArgumentException {
String errMsg = null;
// no list; no add
if (shoppingListId == null) {
errMsg = UtilProperties.getMessage(resource_error,"shoppinglistevents.choose_shopping_list", cart.getLocale());
throw new IllegalArgumentException(errMsg);
}
// get the shopping list
GenericValue shoppingList = null;
List<GenericValue> shoppingListItems = null;
try {
shoppingList = delegator.findOne("ShoppingList", UtilMisc.toMap("shoppingListId", shoppingListId), false);
if (shoppingList == null) {
errMsg = UtilProperties.getMessage(resource_error,"shoppinglistevents.error_getting_shopping_list_and_items", cart.getLocale());
throw new IllegalArgumentException(errMsg);
}
shoppingListItems = shoppingList.getRelated("ShoppingListItem", null, null, false);
if (shoppingListItems == null) {
shoppingListItems = FastList.newInstance();
}
// include all items of child lists if flagged to do so
if (includeChild) {
List<GenericValue> childShoppingLists = shoppingList.getRelated("ChildShoppingList", null, null, false);
for(GenericValue v : childShoppingLists) {
List<GenericValue> items = v.getRelated("ShoppingListItem", null, null, false);
shoppingListItems.addAll(items);
}
}
} catch (GenericEntityException e) {
Debug.logError(e, "Problems getting ShoppingList and ShoppingListItem records", module);
errMsg = UtilProperties.getMessage(resource_error,"shoppinglistevents.error_getting_shopping_list_and_items", cart.getLocale());
throw new IllegalArgumentException(errMsg);
}
// no items; not an error; just mention that nothing was added
if (UtilValidate.isEmpty(shoppingListItems)) {
errMsg = UtilProperties.getMessage(resource_error,"shoppinglistevents.no_items_added", cart.getLocale());
return errMsg;
}
// check if we are to clear the cart first
if (!append) {
cart.clear();
// Prevent the system from creating a new shopping list every time the cart is restored for anonymous user.
cart.setAutoSaveListId(shoppingListId);
}
// get the survey info for all the items
Map<String, List<String>> shoppingListSurveyInfo = getItemSurveyInfos(shoppingListItems);
// add the items
StringBuilder eventMessage = new StringBuilder();
for(GenericValue shoppingListItem : shoppingListItems) {
String productId = shoppingListItem.getString("productId");
BigDecimal quantity = shoppingListItem.getBigDecimal("quantity");
Timestamp reservStart = shoppingListItem.getTimestamp("reservStart");
BigDecimal reservLength = shoppingListItem.getBigDecimal("reservLength");
BigDecimal reservPersons = shoppingListItem.getBigDecimal("reservPersons");
// String accommodationMapId = shoppingListItem.getString("accommodationMapId");
// String accommodationSpotId = shoppingListItem.getString("accommodationSpotId");
String configId = shoppingListItem.getString("configId");
try {
String listId = shoppingListItem.getString("shoppingListId");
String itemId = shoppingListItem.getString("shoppingListItemSeqId");
Map<String, Object> attributes = FastMap.newInstance();
// list items are noted in the shopping cart
if (setAsListItem) {
attributes.put("shoppingListId", listId);
attributes.put("shoppingListItemSeqId", itemId);
}
// check if we have existing survey responses to append
if (shoppingListSurveyInfo.containsKey(listId + "." + itemId) && UtilValidate.isNotEmpty(shoppingListSurveyInfo.get(listId + "." + itemId))) {
attributes.put("surveyResponses", shoppingListSurveyInfo.get(listId + "." + itemId));
}
ProductConfigWrapper configWrapper = null;
if (UtilValidate.isNotEmpty(configId)) {
configWrapper = ProductConfigWorker.loadProductConfigWrapper(delegator, dispatcher, configId, productId, cart.getProductStoreId(), prodCatalogId, cart.getWebSiteId(), cart.getCurrency(), cart.getLocale(), cart.getAutoUserLogin());
}
// TODO: add code to check for survey response requirement
// i cannot get the addOrDecrease function to accept a null reservStart field: i get a null pointer exception a null constant works....
if (reservStart == null) {
cart.addOrIncreaseItem(productId, null, quantity, null, null, null, null, null, null, attributes, prodCatalogId, configWrapper, null, null, null, dispatcher);
} else {
cart.addOrIncreaseItem(productId, null, quantity, reservStart, reservLength, reservPersons, null, null, null, null, null, attributes, prodCatalogId, configWrapper, null, null, null, dispatcher);
}
Map<String, Object> messageMap = UtilMisc.<String, Object>toMap("productId", productId);
errMsg = UtilProperties.getMessage(resource_error,"shoppinglistevents.added_product_to_cart", messageMap, cart.getLocale());
eventMessage.append(errMsg).append("\n");
} catch (CartItemModifyException e) {
Debug.logWarning(e, UtilProperties.getMessage(resource_error,"OrderProblemsAddingItemFromListToCart", cart.getLocale()));
Map<String, Object> messageMap = UtilMisc.<String, Object>toMap("productId", productId);
errMsg = UtilProperties.getMessage(resource_error,"shoppinglistevents.problem_adding_product_to_cart", messageMap, cart.getLocale());
eventMessage.append(errMsg).append("\n");
} catch (ItemNotFoundException e) {
Debug.logWarning(e, UtilProperties.getMessage(resource_error,"OrderProductNotFound", cart.getLocale()));
Map<String, Object> messageMap = UtilMisc.<String, Object>toMap("productId", productId);
errMsg = UtilProperties.getMessage(resource_error,"shoppinglistevents.problem_adding_product_to_cart", messageMap, cart.getLocale());
eventMessage.append(errMsg).append("\n");
}
}
if (eventMessage.length() > 0) {
return eventMessage.toString();
}
// all done
return ""; // no message to return; will simply reply as success
}
public static String replaceShoppingListItem(HttpServletRequest request, HttpServletResponse response) {
String quantityStr = request.getParameter("quantity");
// just call the updateShoppingListItem service
LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");
GenericValue userLogin = (GenericValue) request.getSession().getAttribute("userLogin");
Locale locale = UtilHttp.getLocale(request);
BigDecimal quantity = null;
try {
quantity = new BigDecimal(quantityStr);
} catch (Exception e) {
// do nothing, just won't pass to service if it is null
}
Map<String, Object> serviceInMap = FastMap.newInstance();
serviceInMap.put("shoppingListId", request.getParameter("shoppingListId"));
serviceInMap.put("shoppingListItemSeqId", request.getParameter("shoppingListItemSeqId"));
serviceInMap.put("productId", request.getParameter("add_product_id"));
serviceInMap.put("userLogin", userLogin);
if (quantity != null) serviceInMap.put("quantity", quantity);
Map<String, Object> result = null;
try {
result = dispatcher.runSync("updateShoppingListItem", serviceInMap);
} catch (GenericServiceException e) {
String errMsg = UtilProperties.getMessage(resource_error,"shoppingListEvents.error_calling_update", locale) + ": " + e.toString();
request.setAttribute("_ERROR_MESSAGE_", errMsg);
String errorMsg = "Error calling the updateShoppingListItem in handleShoppingListItemVariant: " + e.toString();
Debug.logError(e, errorMsg, module);
return "error";
}
ServiceUtil.getMessages(request, result, "", "", "", "", "", "", "");
if ("error".equals(result.get(ModelService.RESPONSE_MESSAGE))) {
return "error";
} else {
return "success";
}
}
/**
* Finds or creates a specialized (auto-save) shopping list used to record shopping bag contents between user visits.
*/
public static String getAutoSaveListId(Delegator delegator, LocalDispatcher dispatcher, String partyId, GenericValue userLogin, String productStoreId) throws GenericEntityException, GenericServiceException {
if (partyId == null && userLogin != null) {
partyId = userLogin.getString("partyId");
}
String autoSaveListId = null;
GenericValue list = null;
// TODO: add sorting, just in case there are multiple...
if (partyId != null) {
Map<String, Object> findMap = UtilMisc.<String, Object>toMap("partyId", partyId, "productStoreId", productStoreId, "shoppingListTypeId", "SLT_SPEC_PURP", "listName", PERSISTANT_LIST_NAME);
List<GenericValue> existingLists = delegator.findByAnd("ShoppingList", findMap, null, false);
Debug.logInfo("Finding existing auto-save shopping list with: \nfindMap: " + findMap + "\nlists: " + existingLists, module);
if (UtilValidate.isNotEmpty(existingLists)) {
list = EntityUtil.getFirst(existingLists);
autoSaveListId = list.getString("shoppingListId");
}
}
if (list == null && dispatcher != null) {
Map<String, Object> listFields = UtilMisc.<String, Object>toMap("userLogin", userLogin, "productStoreId", productStoreId, "shoppingListTypeId", "SLT_SPEC_PURP", "listName", PERSISTANT_LIST_NAME);
Map<String, Object> newListResult = dispatcher.runSync("createShoppingList", listFields);
if (newListResult != null) {
autoSaveListId = (String) newListResult.get("shoppingListId");
}
}
return autoSaveListId;
}
/**
* Fills the specialized shopping list with the current shopping cart if one exists (if not leaves it alone)
*/
public static void fillAutoSaveList(ShoppingCart cart, LocalDispatcher dispatcher) throws GeneralException {
if (cart != null && dispatcher != null) {
GenericValue userLogin = ShoppingListEvents.getCartUserLogin(cart);
Delegator delegator = cart.getDelegator();
String autoSaveListId = cart.getAutoSaveListId();
if (autoSaveListId == null) {
autoSaveListId = getAutoSaveListId(delegator, dispatcher, null, userLogin, cart.getProductStoreId());
cart.setAutoSaveListId(autoSaveListId);
}
GenericValue shoppingList = delegator.findOne("ShoppingList", UtilMisc.toMap("shoppingListId", autoSaveListId), false);
Integer currentListSize = 0;
if (UtilValidate.isNotEmpty(shoppingList)) {
List<GenericValue> shoppingListItems = shoppingList.getRelated("ShoppingListItem", null, null, false);
if (UtilValidate.isNotEmpty(shoppingListItems)) {
currentListSize = shoppingListItems.size();
}
}
try {
String[] itemsArray = makeCartItemsArray(cart);
if (itemsArray != null && itemsArray.length != 0) {
addBulkFromCart(delegator, dispatcher, cart, userLogin, autoSaveListId, null, itemsArray, false, false);
}else if(itemsArray.length == 0 && currentListSize != 0){
clearListInfo(delegator, autoSaveListId);
}
} catch (IllegalArgumentException e) {
throw new GeneralException(e.getMessage(), e);
}
}
}
/**
* Saves the shopping cart to the specialized (auto-save) shopping list
*/
public static String saveCartToAutoSaveList(HttpServletRequest request, HttpServletResponse response) {
LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");
ShoppingCart cart = ShoppingCartEvents.getCartObject(request);
try {
fillAutoSaveList(cart, dispatcher);
} catch (GeneralException e) {
Debug.logError(e, "Error saving the cart to the auto-save list: " + e.toString(), module);
}
return "success";
}
/**
* Restores the specialized (auto-save) shopping list back into the shopping cart
*/
public static String restoreAutoSaveList(HttpServletRequest request, HttpServletResponse response) {
Delegator delegator = (Delegator) request.getAttribute("delegator");
LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");
GenericValue productStore = ProductStoreWorker.getProductStore(request);
if (!ProductStoreWorker.autoSaveCart(productStore)) {
// if auto-save is disabled just return here
return "success";
}
HttpSession session = request.getSession();
ShoppingCart cart = ShoppingCartEvents.getCartObject(request);
// safety check for missing required parameter.
if (cart.getWebSiteId() == null) {
cart.setWebSiteId(WebSiteWorker.getWebSiteId(request));
}
// locate the user's identity
GenericValue userLogin = (GenericValue) session.getAttribute("userLogin");
if (userLogin == null) {
userLogin = (GenericValue) session.getAttribute("autoUserLogin");
}
// find the list ID
String autoSaveListId = cart.getAutoSaveListId();
if (autoSaveListId == null) {
try {
autoSaveListId = getAutoSaveListId(delegator, dispatcher, null, userLogin, cart.getProductStoreId());
} catch (GeneralException e) {
Debug.logError(e, module);
}
cart.setAutoSaveListId(autoSaveListId);
} else if (userLogin != null) {
String existingAutoSaveListId = null;
try {
existingAutoSaveListId = getAutoSaveListId(delegator, dispatcher, null, userLogin, cart.getProductStoreId());
} catch (GeneralException e) {
Debug.logError(e, module);
}
if (existingAutoSaveListId != null) {
if (!existingAutoSaveListId.equals(autoSaveListId)) {
// Replace with existing shopping list
cart.setAutoSaveListId(existingAutoSaveListId);
autoSaveListId = existingAutoSaveListId;
cart.setLastListRestore(null);
} else {
// CASE: User first login and logout and then re-login again. This condition does not require a restore at all
// because at this point items in the cart and the items in the shopping list are same so just return.
return "success";
}
}
}
// check to see if we are okay to load this list
java.sql.Timestamp lastLoad = cart.getLastListRestore();
boolean okayToLoad = autoSaveListId == null ? false : (lastLoad == null ? true : false);
if (!okayToLoad && lastLoad != null) {
GenericValue shoppingList = null;
try {
shoppingList = delegator.findOne("ShoppingList", UtilMisc.toMap("shoppingListId", autoSaveListId), false);
} catch (GenericEntityException e) {
Debug.logError(e, module);
}
if (shoppingList != null) {
java.sql.Timestamp lastModified = shoppingList.getTimestamp("lastAdminModified");
if (lastModified != null) {
if (lastModified.after(lastLoad)) {
okayToLoad = true;
}
if (cart.size() == 0 && lastModified.after(cart.getCartCreatedTime())) {
okayToLoad = true;
}
}
}
}
// load (restore) the list of we have determined it is okay to load
if (okayToLoad) {
String prodCatalogId = CatalogWorker.getCurrentCatalogId(request);
try {
addListToCart(delegator, dispatcher, cart, prodCatalogId, autoSaveListId, false, false, userLogin != null ? true : false);
cart.setLastListRestore(UtilDateTime.nowTimestamp());
} catch (IllegalArgumentException e) {
Debug.logError(e, module);
}
}
return "success";
}
/**
* Remove all items from the given list.
*/
public static int clearListInfo(Delegator delegator, String shoppingListId) throws GenericEntityException {
// remove the survey responses first
delegator.removeByAnd("ShoppingListItemSurvey", UtilMisc.toMap("shoppingListId", shoppingListId));
// next remove the items
return delegator.removeByAnd("ShoppingListItem", UtilMisc.toMap("shoppingListId", shoppingListId));
}
/**
* Creates records for survey responses on survey items
*/
public static int makeListItemSurveyResp(Delegator delegator, GenericValue item, List<String> surveyResps) throws GenericEntityException {
if (UtilValidate.isNotEmpty(surveyResps)) {
int count = 0;
for(String responseId : surveyResps) {
GenericValue listResp = delegator.makeValue("ShoppingListItemSurvey");
listResp.set("shoppingListId", item.getString("shoppingListId"));
listResp.set("shoppingListItemSeqId", item.getString("shoppingListItemSeqId"));
listResp.set("surveyResponseId", responseId);
delegator.create(listResp);
count++;
}
return count;
}
return -1;
}
/**
* Returns Map keyed on item sequence ID containing a list of survey response IDs
*/
public static Map<String, List<String>> getItemSurveyInfos(List<GenericValue> items) {
Map<String, List<String>> surveyInfos = FastMap.newInstance();
if (UtilValidate.isNotEmpty(items)) {
for(GenericValue item : items) {
String listId = item.getString("shoppingListId");
String itemId = item.getString("shoppingListItemSeqId");
surveyInfos.put(listId + "." + itemId, getItemSurveyInfo(item));
}
}
return surveyInfos;
}
/**
* Returns a list of survey response IDs for a shopping list item
*/
public static List<String> getItemSurveyInfo(GenericValue item) {
List<String> responseIds = FastList.newInstance();
List<GenericValue> surveyResp = null;
try {
surveyResp = item.getRelated("ShoppingListItemSurvey", null, null, false);
} catch (GenericEntityException e) {
Debug.logError(e, module);
}
if (UtilValidate.isNotEmpty(surveyResp)) {
for(GenericValue resp : surveyResp) {
responseIds.add(resp.getString("surveyResponseId"));
}
}
return responseIds;
}
private static GenericValue getCartUserLogin(ShoppingCart cart) {
GenericValue ul = cart.getUserLogin();
if (ul == null) {
ul = cart.getAutoUserLogin();
}
return ul;
}
private static String[] makeCartItemsArray(ShoppingCart cart) {
int len = cart.size();
String[] arr = new String[len];
for (int i = 0; i < len; i++) {
arr[i] = Integer.toString(i);
}
return arr;
}
/**
* Create the guest cookies for a shopping list
*/
public static String createGuestShoppingListCookies (HttpServletRequest request, HttpServletResponse response){
Delegator delegator = (Delegator) request.getAttribute("delegator");
LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");
HttpSession session = request.getSession(true);
ShoppingCart cart = (ShoppingCart) session.getAttribute("shoppingCart");
GenericValue userLogin = (GenericValue) session.getAttribute("userLogin");
Properties systemProps = System.getProperties();
String guestShoppingUserName = "GuestShoppingListId_" + systemProps.getProperty("user.name").replace(" ", "_");
String productStoreId = ProductStoreWorker.getProductStoreId(request);
int cookieAge = (60 * 60 * 24 * 30);
String autoSaveListId = null;
Cookie[] cookies = request.getCookies();
// check userLogin
if (UtilValidate.isNotEmpty(userLogin)) {
String partyId = userLogin.getString("partyId");
if (UtilValidate.isEmpty(partyId)) {
return "success";
}
}
// find shopping list ID
if (cookies != null) {
for (Cookie cookie: cookies) {
if (cookie.getName().equals(guestShoppingUserName)) {
autoSaveListId = cookie.getValue();
break;
}
}
}
// clear the auto-save info
if (ProductStoreWorker.autoSaveCart(delegator, productStoreId)) {
if (UtilValidate.isEmpty(autoSaveListId)) {
try {
Map<String, Object> listFields = UtilMisc.<String, Object>toMap("userLogin", userLogin, "productStoreId", productStoreId, "shoppingListTypeId", "SLT_SPEC_PURP", "listName", PERSISTANT_LIST_NAME);
Map<String, Object> newListResult = dispatcher.runSync("createShoppingList", listFields);
if (newListResult != null) {
autoSaveListId = (String) newListResult.get("shoppingListId");
}
} catch (GeneralException e) {
Debug.logError(e, module);
}
Cookie guestShoppingListCookie = new Cookie(guestShoppingUserName, autoSaveListId);
guestShoppingListCookie.setMaxAge(cookieAge);
guestShoppingListCookie.setPath("/");
response.addCookie(guestShoppingListCookie);
}
}
if (UtilValidate.isNotEmpty(autoSaveListId)) {
if (UtilValidate.isNotEmpty(cart)) {
cart.setAutoSaveListId(autoSaveListId);
} else {
cart = ShoppingCartEvents.getCartObject(request);
cart.setAutoSaveListId(autoSaveListId);
}
}
return "success";
}
/**
* Clear the guest cookies for a shopping list
*/
public static String clearGuestShoppingListCookies (HttpServletRequest request, HttpServletResponse response){
Properties systemProps = System.getProperties();
String guestShoppingUserName = "GuestShoppingListId_" + systemProps.getProperty("user.name").replace(" ", "_");
Cookie guestShoppingListCookie = new Cookie(guestShoppingUserName, null);
guestShoppingListCookie.setMaxAge(0);
guestShoppingListCookie.setPath("/");
response.addCookie(guestShoppingListCookie);
return "success";
}
}