/*
* Licensed to csti consulting
* You may obtain a copy of the License at
*
* http://www.csticonsulting.com
* Copyright (c) 2006-Aug 25, 2010 Consultation CS-TI inc.
*
* 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 com.salesmanager.catalog.common;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import uk.ltd.getahead.dwr.WebContextFactory;
import com.salesmanager.catalog.product.ProductAttribute;
import com.salesmanager.checkout.util.MiniShoppingCartUtil;
import com.salesmanager.core.constants.CatalogConstants;
import com.salesmanager.core.entity.catalog.Product;
import com.salesmanager.core.entity.common.I18NEntity;
import com.salesmanager.core.entity.merchant.MerchantStore;
import com.salesmanager.core.entity.orders.ShoppingCart;
import com.salesmanager.core.entity.orders.ShoppingCartProduct;
import com.salesmanager.core.entity.orders.ShoppingCartProductAttribute;
import com.salesmanager.core.service.ServiceFactory;
import com.salesmanager.core.service.catalog.CatalogService;
import com.salesmanager.core.util.CurrencyUtil;
import com.salesmanager.core.util.LabelUtil;
import com.salesmanager.core.util.MiniShoppingCartSerializationUtil;
import com.salesmanager.core.util.ProductUtil;
import com.salesmanager.core.util.www.SessionUtil;
/**
* Mini cart actions
*
* @author Carl Samson
*
*/
public class AjaxCatalogUtil {
private static Logger logger = Logger.getLogger(AjaxCatalogUtil.class);
public static final int SECONDS_PER_YEAR = 60*60*24*365;
public ShoppingCart removeProduct(long productId) {
HttpServletRequest req = WebContextFactory.get()
.getHttpServletRequest();
HttpServletResponse resp = WebContextFactory.get()
.getHttpServletResponse();
HttpSession session = req.getSession();
ShoppingCart cart = SessionUtil.getMiniShoppingCart(req);
MerchantStore store = (MerchantStore) session.getAttribute("STORE");
Locale locale = (Locale) session.getAttribute("WW_TRANS_I18N_LOCALE");
if (cart != null) {
cart.setErrorMessage(null);
Collection productsCollection = cart.getProducts();
Collection newProductsCollection = new ArrayList();
if (productsCollection != null) {
Iterator i = productsCollection.iterator();
while (i.hasNext()) {
ShoppingCartProduct scp = (ShoppingCartProduct) i.next();
if (scp.getProductId() == productId) {
continue;
}
newProductsCollection.add(scp);
}
}
cart.setProducts(newProductsCollection);
}
MiniShoppingCartUtil.calculateTotal(cart, store);
//save the cart in the cookie
setMiniCartCookie(req,resp,cart);
return cart;
}
public String setPrice(ProductAttribute[] attributes, String productId) {
if (StringUtils.isBlank(productId)) {
return "";
}
HttpServletRequest req = WebContextFactory.get()
.getHttpServletRequest();
HttpSession session = req.getSession();
MerchantStore store = (MerchantStore) session.getAttribute("STORE");
Locale locale = (Locale) session.getAttribute("WW_TRANS_I18N_LOCALE");
String price = "";
// get original product price
try {
CatalogService cservice = (CatalogService) ServiceFactory
.getService(ServiceFactory.CatalogService);
Product p = cservice.getProduct(Long.valueOf(productId));
if (p == null) {
return "";
}
if (attributes != null && attributes.length > 0) {
List ids = new ArrayList();
for (int i = 0; i < attributes.length; i++) {
if (!attributes[i].isStringValue()) {
ids.add(new Long(attributes[i].getValue()));
}
}
Collection attrs = cservice.getProductAttributes(ids, locale
.getLanguage());
if (attrs != null && attrs.size() > 0) {
price = ProductUtil.formatHTMLProductPriceWithAttributes(
locale, store.getCurrency(), p, attrs, false);
}
}
} catch (Exception e) {
logger.error(e);
}
return price;
}
public ShoppingCart addProductWithAttributes(long productId, int quantity,
ProductAttribute[] attributes) {
HttpServletRequest req = WebContextFactory.get()
.getHttpServletRequest();
HttpServletResponse res = WebContextFactory.get()
.getHttpServletResponse();
return addProductToCart(req, res, productId, quantity, attributes);
}
public ShoppingCart addProductNoAttributes(long productId, int quantity) {
HttpServletRequest req = WebContextFactory.get()
.getHttpServletRequest();
HttpServletResponse res = WebContextFactory.get()
.getHttpServletResponse();
return addProductToCart(req, res, productId, quantity, null);
}
/**
* Add product to shopping cart
*
* @param productId
* @param quantity
* @param attributes
* @return
*/
public ShoppingCart addProductToCart(HttpServletRequest req,HttpServletResponse resp,
long productId, int quantity, ProductAttribute[] attributes) {
HttpSession session = req.getSession();
ShoppingCart cart = SessionUtil.getMiniShoppingCart(req);
MerchantStore store = (MerchantStore) session.getAttribute("STORE");
if (store == null) {
cart = new ShoppingCart();
LabelUtil label = LabelUtil.getInstance();
label.setLocale(req.getLocale());
String msg = label.getText("error.sessionexpired");
cart.setErrorMessage(msg);
return cart;
}
Locale locale = (Locale) session.getAttribute("WW_TRANS_I18N_LOCALE");
if (cart == null) {
cart = new ShoppingCart();
}
cart.setErrorMessage(null);
try {
// get products
Collection productsCollection = cart.getProducts();
CatalogService cservice = (CatalogService) ServiceFactory
.getService(ServiceFactory.CatalogService);
Product p = cservice.getProduct(productId);
if (p == null || store == null) {
String message = LabelUtil.getInstance().getText(locale,
"errors.addtocart");
cart.setErrorMessage(message);
return cart;
}
if(quantity>p.getProductQuantityOrderMax()) {
String message = LabelUtil.getInstance().getText(locale,
"messages.invalid.quantity");
cart.setErrorMessage(message);
return cart;
}
((I18NEntity) p).setLocale(locale, store.getCurrency());
if (p.getMerchantId() != store.getMerchantId())
return cart;
boolean productFound = false;
if (productsCollection != null && (attributes == null || attributes.length==0)) {
Iterator i = productsCollection.iterator();
while (i.hasNext()) {
ShoppingCartProduct scp = (ShoppingCartProduct) i.next();
if(scp.getAttributes()!=null && scp.getAttributes().size()>0) {
continue;
}
if (scp.getProductId() == productId) {
int qty = scp.getQuantity();
if(qty + quantity>p.getProductQuantityOrderMax()) {
String message = LabelUtil.getInstance().getText(locale,
"messages.invalid.quantity");
cart.setErrorMessage(message);
return cart;
}
scp.setQuantity(qty + quantity);
productFound = true;
break;
}
}
}
if (!productFound) {
ShoppingCartProduct scp = new ShoppingCartProduct();
scp.setProductId(p.getProductId());
scp.setQuantity(quantity);
if (!StringUtils.isBlank(p.getSmallImagePath())) {
scp.setImage(p.getSmallImagePath());
} else if (!StringUtils.isBlank(p.getLargeImagePath())) {
scp.setImage(p.getLargeImagePath());
} else {
// nothing for now
}
if (attributes != null && attributes.length > 0) {
Map ids = new HashMap();
for (int i = 0; i < attributes.length; i++) {
ids.put(new Long(attributes[i].getName()),
attributes[i]);
}
Collection attrs = cservice.getProductAttributes(
new ArrayList(ids.keySet()), locale.getLanguage());
if (attrs != null && attrs.size() > 0) {
BigDecimal priceWithAttributes = ProductUtil
.determinePriceWithAttributes(p, attrs, locale,
store.getCurrency());
scp.setPrice(priceWithAttributes);
scp.setPriceText(CurrencyUtil
.displayFormatedAmountWithCurrency(
priceWithAttributes, store
.getCurrency()));
Iterator attrIt = attrs.iterator();
List attrList = new ArrayList();
while (attrIt.hasNext()) {
//com.salesmanager.core.entity.catalog.ProductAttribute prodAttr = (com.salesmanager.core.entity.catalog.ProductAttribute) attrIt
// .next();
com.salesmanager.core.entity.catalog.ProductAttribute productAttribute = (com.salesmanager.core.entity.catalog.ProductAttribute)attrIt.next();
ShoppingCartProductAttribute scpa = new ShoppingCartProductAttribute();
scpa.setAttributeId(productAttribute.getProductAttributeId());
ProductAttribute pa = (ProductAttribute) ids
.get(new Long(productAttribute
.getProductAttributeId()));
if (pa != null) {
scpa.setAttributeValue(pa.getValue());
if (pa.isStringValue()) {
scpa.setTextValue(pa.getTextValue());
}
attrList.add(scpa);
}
}
scp.setAttributes(attrList);
} else {
scp.setPrice(ProductUtil.determinePrice(p, locale,
store.getCurrency()));
BigDecimal price = ProductUtil.determinePrice(p,
locale, store.getCurrency());
scp.setPriceText(CurrencyUtil
.displayFormatedAmountWithCurrency(price, store
.getCurrency()));
}
} else {
scp.setPrice(ProductUtil.determinePrice(p, locale, store
.getCurrency()));
BigDecimal price = ProductUtil.determinePrice(p, locale,
store.getCurrency());
scp.setPriceText(CurrencyUtil
.displayFormatedAmountWithCurrency(price, store
.getCurrency()));
}
scp.setProductName(p.getName());
Collection products = cart.getProducts();
if (products == null) {
products = new ArrayList();
cart.setProducts(products);
}
products.add(scp);
}
MiniShoppingCartUtil.calculateTotal(cart, store);
SessionUtil.setMiniShoppingCart(cart, req);
//save the cart in the cookie
setMiniCartCookie(req,resp,cart);
return cart;
} catch (Exception e) {
logger.error(e);
cart.setErrorMessage(LabelUtil.getInstance().getText(locale,
"errors.technical"));
return cart;
}
}
private void setMiniCartCookie(HttpServletRequest req, HttpServletResponse resp, ShoppingCart cart) {
try {
String serializedCart = MiniShoppingCartSerializationUtil.serializeToJSON(cart);
if(cart!=null) {
cart.setJsonShoppingCart(serializedCart);
}
/*String cookieValue = serializedCart;
int maxAge = SECONDS_PER_YEAR;
String cookieName = CatalogConstants.CART_COOKIE_NAME;
if(cookieValue==null) {
cookieValue = "";
maxAge = 0;
}
Cookie c = null;
Cookie[] cookies = req.getCookies();
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
if(cookie.getName().equals(CatalogConstants.SKU_COOKIE)) {
c = cookie;
c.setValue(cookieValue);
}
}
}
if(c==null) {
c = new Cookie(cookieName,cookieValue);
}
c.setMaxAge(maxAge);
resp.addCookie(c);*/
} catch (Exception e) {
logger.error("Cannot serialize cart in the cookie",e);
}
}
}