/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.shopping.util; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.language.LanguageUtil; import com.liferay.portal.kernel.model.Company; import com.liferay.portal.kernel.module.configuration.ConfigurationException; import com.liferay.portal.kernel.module.configuration.ConfigurationProviderUtil; import com.liferay.portal.kernel.portlet.LiferayWindowState; import com.liferay.portal.kernel.settings.GroupServiceSettingsLocator; import com.liferay.portal.kernel.theme.PortletDisplay; import com.liferay.portal.kernel.theme.ThemeDisplay; import com.liferay.portal.kernel.util.CharPool; import com.liferay.portal.kernel.util.Constants; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.HtmlUtil; import com.liferay.portal.kernel.util.LocaleUtil; import com.liferay.portal.kernel.util.MathUtil; import com.liferay.portal.kernel.util.OrderByComparator; import com.liferay.portal.kernel.util.PortalUtil; import com.liferay.portal.kernel.util.StringBundler; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.StringUtil; import com.liferay.portal.kernel.util.URLCodec; import com.liferay.portal.kernel.util.WebKeys; import com.liferay.shopping.configuration.ShoppingGroupServiceOverriddenConfiguration; import com.liferay.shopping.constants.ShoppingConstants; import com.liferay.shopping.exception.NoSuchCartException; import com.liferay.shopping.model.ShoppingCart; import com.liferay.shopping.model.ShoppingCartItem; import com.liferay.shopping.model.ShoppingCategory; import com.liferay.shopping.model.ShoppingCoupon; import com.liferay.shopping.model.ShoppingCouponConstants; import com.liferay.shopping.model.ShoppingItem; import com.liferay.shopping.model.ShoppingItemField; import com.liferay.shopping.model.ShoppingItemPrice; import com.liferay.shopping.model.ShoppingItemPriceConstants; import com.liferay.shopping.model.ShoppingOrder; import com.liferay.shopping.model.ShoppingOrderConstants; import com.liferay.shopping.model.ShoppingOrderItem; import com.liferay.shopping.model.impl.ShoppingCartImpl; import com.liferay.shopping.service.ShoppingCartLocalServiceUtil; import com.liferay.shopping.service.ShoppingCategoryLocalServiceUtil; import com.liferay.shopping.service.ShoppingOrderItemLocalServiceUtil; import com.liferay.shopping.service.persistence.ShoppingItemPriceUtil; import com.liferay.shopping.util.comparator.ItemMinQuantityComparator; import com.liferay.shopping.util.comparator.ItemNameComparator; import com.liferay.shopping.util.comparator.ItemPriceComparator; import com.liferay.shopping.util.comparator.ItemSKUComparator; import java.text.NumberFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import javax.portlet.PortletRequest; import javax.portlet.PortletSession; import javax.portlet.PortletURL; import javax.portlet.RenderRequest; import javax.portlet.RenderResponse; import javax.portlet.WindowState; import javax.servlet.http.HttpServletRequest; /** * @author Brian Wing Shun Chan * @author Eduardo Garcia */ public class ShoppingUtil { public static double calculateActualPrice(ShoppingItem item) { return item.getPrice() - calculateDiscountPrice(item); } public static double calculateActualPrice(ShoppingItem item, int count) throws PortalException { return calculatePrice(item, count) - calculateDiscountPrice(item, count); } public static double calculateActualPrice(ShoppingItemPrice itemPrice) { return itemPrice.getPrice() - calculateDiscountPrice(itemPrice); } public static double calculateActualSubtotal( List<ShoppingOrderItem> orderItems) { double subtotal = 0.0; for (ShoppingOrderItem orderItem : orderItems) { subtotal += orderItem.getPrice() * orderItem.getQuantity(); } return subtotal; } public static double calculateActualSubtotal( Map<ShoppingCartItem, Integer> items) throws PortalException { return calculateSubtotal(items) - calculateDiscountSubtotal(items); } public static double calculateAlternativeShipping( Map<ShoppingCartItem, Integer> items, int altShipping) throws PortalException { double shipping = calculateShipping(items); double alternativeShipping = shipping; ShoppingGroupServiceOverriddenConfiguration shoppingGroupServiceOverriddenConfiguration = null; for (Map.Entry<ShoppingCartItem, Integer> entry : items.entrySet()) { ShoppingCartItem cartItem = entry.getKey(); ShoppingItem item = cartItem.getItem(); if (shoppingGroupServiceOverriddenConfiguration == null) { ShoppingCategory category = item.getCategory(); shoppingGroupServiceOverriddenConfiguration = _getShoppingGroupServiceOverriddenConfiguration( category.getGroupId()); break; } } // Calculate alternative shipping if shopping is configured to use // alternative shipping and shipping price is greater than 0 if ((shoppingGroupServiceOverriddenConfiguration != null) && shoppingGroupServiceOverriddenConfiguration. useAlternativeShipping() && (shipping > 0)) { double altShippingDelta = 0.0; try { altShippingDelta = GetterUtil.getDouble( shoppingGroupServiceOverriddenConfiguration. getAlternativeShipping()[1][altShipping]); } catch (Exception e) { return alternativeShipping; } if (altShippingDelta > 0) { alternativeShipping = shipping * altShippingDelta; } } return alternativeShipping; } public static double calculateCouponDiscount( Map<ShoppingCartItem, Integer> items, ShoppingCoupon coupon) throws PortalException { return calculateCouponDiscount(items, null, coupon); } public static double calculateCouponDiscount( Map<ShoppingCartItem, Integer> items, String stateId, ShoppingCoupon coupon) throws PortalException { double discount = 0.0; if ((coupon == null) || !coupon.isActive() || !coupon.hasValidDateRange()) { return discount; } String[] categoryNames = StringUtil.split(coupon.getLimitCategories()); Set<Long> categoryIds = new HashSet<>(); for (String categoryName : categoryNames) { ShoppingCategory category = ShoppingCategoryLocalServiceUtil.getCategory( coupon.getGroupId(), categoryName); List<Long> subcategoryIds = new ArrayList<>(); ShoppingCategoryLocalServiceUtil.getSubcategoryIds( subcategoryIds, category.getGroupId(), category.getCategoryId()); categoryIds.add(category.getCategoryId()); categoryIds.addAll(subcategoryIds); } String[] skus = StringUtil.split(coupon.getLimitSkus()); if (!categoryIds.isEmpty() || (skus.length > 0)) { Set<String> skusSet = new HashSet<>(); for (String sku : skus) { skusSet.add(sku); } Map<ShoppingCartItem, Integer> newItems = new HashMap<>(); for (Map.Entry<ShoppingCartItem, Integer> entry : items.entrySet()) { ShoppingCartItem cartItem = entry.getKey(); Integer count = entry.getValue(); ShoppingItem item = cartItem.getItem(); if ((!categoryIds.isEmpty() && categoryIds.contains(item.getCategoryId())) || (!skusSet.isEmpty() && skusSet.contains(item.getSku()))) { newItems.put(cartItem, count); } } items = newItems; } double actualSubtotal = calculateActualSubtotal(items); if ((coupon.getMinOrder() > 0) && (coupon.getMinOrder() > actualSubtotal)) { return discount; } String type = coupon.getDiscountType(); if (type.equals(ShoppingCouponConstants.DISCOUNT_TYPE_PERCENTAGE)) { discount = actualSubtotal * coupon.getDiscount(); } else if (type.equals(ShoppingCouponConstants.DISCOUNT_TYPE_ACTUAL)) { discount = coupon.getDiscount(); } else if (type.equals( ShoppingCouponConstants.DISCOUNT_TYPE_FREE_SHIPPING)) { discount = calculateShipping(items); } else if (type.equals(ShoppingCouponConstants.DISCOUNT_TYPE_TAX_FREE)) { if (stateId != null) { discount = calculateTax(items, stateId); } } return discount; } public static double calculateDiscountPercent( Map<ShoppingCartItem, Integer> items) throws PortalException { double discount = calculateDiscountSubtotal( items) / calculateSubtotal(items); if (Double.isNaN(discount) || Double.isInfinite(discount)) { discount = 0.0; } return discount; } public static double calculateDiscountPrice(ShoppingItem item) { return item.getPrice() * item.getDiscount(); } public static double calculateDiscountPrice(ShoppingItem item, int count) throws PortalException { ShoppingItemPrice itemPrice = _getItemPrice(item, count); return itemPrice.getPrice() * itemPrice.getDiscount() * count; } public static double calculateDiscountPrice(ShoppingItemPrice itemPrice) { return itemPrice.getPrice() * itemPrice.getDiscount(); } public static double calculateDiscountSubtotal( Map<ShoppingCartItem, Integer> items) throws PortalException { double subtotal = 0.0; for (Map.Entry<ShoppingCartItem, Integer> entry : items.entrySet()) { ShoppingCartItem cartItem = entry.getKey(); Integer count = entry.getValue(); ShoppingItem item = cartItem.getItem(); subtotal += calculateDiscountPrice(item, count.intValue()); } return subtotal; } public static double calculateInsurance( Map<ShoppingCartItem, Integer> items) throws PortalException { double insurance = 0.0; double subtotal = 0.0; ShoppingGroupServiceOverriddenConfiguration shoppingGroupServiceOverriddenConfiguration = null; for (Map.Entry<ShoppingCartItem, Integer> entry : items.entrySet()) { ShoppingCartItem cartItem = entry.getKey(); Integer count = entry.getValue(); ShoppingItem item = cartItem.getItem(); if (shoppingGroupServiceOverriddenConfiguration == null) { ShoppingCategory category = item.getCategory(); shoppingGroupServiceOverriddenConfiguration = _getShoppingGroupServiceOverriddenConfiguration( category.getGroupId()); } ShoppingItemPrice itemPrice = _getItemPrice(item, count.intValue()); subtotal += calculateActualPrice(itemPrice) * count.intValue(); } if ((shoppingGroupServiceOverriddenConfiguration == null) || (subtotal == 0)) { return insurance; } double insuranceRate = 0.0; double[] range = ShoppingGroupServiceOverriddenConfiguration.INSURANCE_RANGE; for (int i = 0; i < range.length - 1; i++) { if ((subtotal > range[i]) && (subtotal <= range[i + 1])) { int rangeId = i / 2; if (MathUtil.isOdd(i)) { rangeId = (i + 1) / 2; } String[] insurances = shoppingGroupServiceOverriddenConfiguration.getInsurance(); if (insurances.length < rangeId) { continue; } insuranceRate = GetterUtil.getDouble(insurances[rangeId]); } } String formula = shoppingGroupServiceOverriddenConfiguration.getInsuranceFormula(); if (formula.equals("flat")) { insurance += insuranceRate; } else if (formula.equals("percentage")) { insurance += subtotal * insuranceRate; } return insurance; } public static double calculatePrice(ShoppingItem item, int count) throws PortalException { ShoppingItemPrice itemPrice = _getItemPrice(item, count); return itemPrice.getPrice() * count; } public static double calculateShipping(Map<ShoppingCartItem, Integer> items) throws PortalException { double shipping = 0.0; double subtotal = 0.0; ShoppingGroupServiceOverriddenConfiguration shoppingGroupServiceOverriddenConfiguration = null; for (Map.Entry<ShoppingCartItem, Integer> entry : items.entrySet()) { ShoppingCartItem cartItem = entry.getKey(); Integer count = entry.getValue(); ShoppingItem item = cartItem.getItem(); if (shoppingGroupServiceOverriddenConfiguration == null) { ShoppingCategory category = item.getCategory(); shoppingGroupServiceOverriddenConfiguration = _getShoppingGroupServiceOverriddenConfiguration( category.getGroupId()); } if (item.isRequiresShipping()) { ShoppingItemPrice itemPrice = _getItemPrice( item, count.intValue()); if (itemPrice.isUseShippingFormula()) { subtotal += calculateActualPrice(itemPrice) * count.intValue(); } else { shipping += itemPrice.getShipping() * count.intValue(); } } } if ((shoppingGroupServiceOverriddenConfiguration == null) || (subtotal == 0)) { return shipping; } double shippingRate = 0.0; double[] range = ShoppingGroupServiceOverriddenConfiguration.SHIPPING_RANGE; for (int i = 0; i < range.length - 1; i++) { if ((subtotal > range[i]) && (subtotal <= range[i + 1])) { int rangeId = i / 2; if (MathUtil.isOdd(i)) { rangeId = (i + 1) / 2; } shippingRate = GetterUtil.getDouble( shoppingGroupServiceOverriddenConfiguration. getShipping()[rangeId]); } } String formula = shoppingGroupServiceOverriddenConfiguration.getShippingFormula(); if (formula.equals("flat")) { shipping += shippingRate; } else if (formula.equals("percentage")) { shipping += subtotal * shippingRate; } return shipping; } public static double calculateSubtotal(Map<ShoppingCartItem, Integer> items) throws PortalException { double subtotal = 0.0; for (Map.Entry<ShoppingCartItem, Integer> entry : items.entrySet()) { ShoppingCartItem cartItem = entry.getKey(); Integer count = entry.getValue(); ShoppingItem item = cartItem.getItem(); subtotal += calculatePrice(item, count.intValue()); } return subtotal; } public static double calculateTax( Map<ShoppingCartItem, Integer> items, String stateId) throws PortalException { double tax = 0.0; ShoppingGroupServiceOverriddenConfiguration shoppingGroupServiceOverriddenConfiguration = null; for (Map.Entry<ShoppingCartItem, Integer> entry : items.entrySet()) { ShoppingCartItem cartItem = entry.getKey(); ShoppingItem item = cartItem.getItem(); if (shoppingGroupServiceOverriddenConfiguration == null) { ShoppingCategory category = item.getCategory(); shoppingGroupServiceOverriddenConfiguration = _getShoppingGroupServiceOverriddenConfiguration( category.getGroupId()); break; } } if (shoppingGroupServiceOverriddenConfiguration == null) { return tax; } String taxState = shoppingGroupServiceOverriddenConfiguration.getTaxState(); if (!taxState.equals(stateId)) { return tax; } double subtotal = 0.0; for (Map.Entry<ShoppingCartItem, Integer> entry : items.entrySet()) { ShoppingCartItem cartItem = entry.getKey(); Integer count = entry.getValue(); ShoppingItem item = cartItem.getItem(); if (item.isTaxable()) { subtotal += calculatePrice(item, count.intValue()); } } return shoppingGroupServiceOverriddenConfiguration.getTaxRate() * subtotal; } public static double calculateTotal( Map<ShoppingCartItem, Integer> items, String stateId, ShoppingCoupon coupon, int altShipping, boolean insure) throws PortalException { double actualSubtotal = calculateActualSubtotal(items); double tax = calculateTax(items, stateId); double shipping = calculateAlternativeShipping(items, altShipping); double insurance = 0.0; if (insure) { insurance = calculateInsurance(items); } double couponDiscount = calculateCouponDiscount(items, stateId, coupon); double total = actualSubtotal + tax + shipping + insurance - couponDiscount; if (total < 0) { total = 0.0; } return total; } public static double calculateTotal(ShoppingOrder order) { List<ShoppingOrderItem> orderItems = ShoppingOrderItemLocalServiceUtil.getOrderItems(order.getOrderId()); double total = calculateActualSubtotal(orderItems) + order.getTax() + order.getShipping() + order.getInsurance() - order.getCouponDiscount(); if (total < 0) { total = 0.0; } return total; } public static String getBreadcrumbs( long categoryId, RenderRequest renderRequest, RenderResponse renderResponse) throws Exception { ShoppingCategory category = null; try { category = ShoppingCategoryLocalServiceUtil.getCategory(categoryId); } catch (Exception e) { } return getBreadcrumbs(category, renderRequest, renderResponse); } public static String getBreadcrumbs( ShoppingCategory category, RenderRequest renderRequest, RenderResponse renderResponse) throws Exception { PortletURL categoriesURL = renderResponse.createRenderURL(); WindowState windowState = renderRequest.getWindowState(); if (windowState.equals(LiferayWindowState.POP_UP)) { categoriesURL.setParameter( "struts_action", "/shopping/select_category"); categoriesURL.setWindowState(LiferayWindowState.POP_UP); } else { categoriesURL.setParameter("struts_action", "/shopping/view"); categoriesURL.setParameter("tabs1", "categories"); //categoriesURL.setWindowState(WindowState.MAXIMIZED); } HttpServletRequest request = PortalUtil.getHttpServletRequest( renderRequest); String categoriesLink = "<a href=\"" + categoriesURL.toString() + "\">" + LanguageUtil.get(request, "categories") + "</a>"; if (category == null) { return "<span class=\"first last\">" + categoriesLink + "</span>"; } String breadcrumbs = StringPool.BLANK; if (category != null) { for (int i = 0;; i++) { category = category.toEscapedModel(); PortletURL portletURL = renderResponse.createRenderURL(); if (windowState.equals(LiferayWindowState.POP_UP)) { portletURL.setParameter( "struts_action", "/shopping/select_category"); portletURL.setParameter( "categoryId", String.valueOf(category.getCategoryId())); portletURL.setWindowState(LiferayWindowState.POP_UP); } else { portletURL.setParameter("struts_action", "/shopping/view"); portletURL.setParameter("tabs1", "categories"); portletURL.setParameter( "categoryId", String.valueOf(category.getCategoryId())); //portletURL.setWindowState(WindowState.MAXIMIZED); } String categoryLink = "<a href=\"" + portletURL.toString() + "\">" + category.getName() + "</a>"; if (i == 0) { breadcrumbs = "<span class=\"last\">" + categoryLink + "</span>"; } else { breadcrumbs = categoryLink + " » " + breadcrumbs; } if (category.isRoot()) { break; } category = ShoppingCategoryLocalServiceUtil.getCategory( category.getParentCategoryId()); } } breadcrumbs = "<span class=\"first\">" + categoriesLink + " » </span>" + breadcrumbs; return breadcrumbs; } public static ShoppingCart getCart(PortletRequest portletRequest) throws PortalException { PortletSession portletSession = portletRequest.getPortletSession(); ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute( WebKeys.THEME_DISPLAY); String sessionCartId = ShoppingCart.class.getName() + themeDisplay.getScopeGroupId(); if (themeDisplay.isSignedIn()) { ShoppingCart cart = (ShoppingCart)portletSession.getAttribute( sessionCartId); if (cart != null) { portletSession.removeAttribute(sessionCartId); } if ((cart != null) && (cart.getItemsSize() > 0)) { cart = ShoppingCartLocalServiceUtil.updateCart( themeDisplay.getUserId(), themeDisplay.getScopeGroupId(), cart.getItemIds(), cart.getCouponCodes(), cart.getAltShipping(), cart.isInsure()); } else { try { cart = ShoppingCartLocalServiceUtil.getCart( themeDisplay.getUserId(), themeDisplay.getScopeGroupId()); } catch (NoSuchCartException nsce) { cart = getCart(themeDisplay); cart = ShoppingCartLocalServiceUtil.updateCart( themeDisplay.getUserId(), themeDisplay.getScopeGroupId(), cart.getItemIds(), cart.getCouponCodes(), cart.getAltShipping(), cart.isInsure()); } } return cart; } ShoppingCart cart = (ShoppingCart)portletSession.getAttribute( sessionCartId); if (cart == null) { cart = getCart(themeDisplay); portletSession.setAttribute(sessionCartId, cart); } return cart; } public static ShoppingCart getCart(ThemeDisplay themeDisplay) { ShoppingCart cart = new ShoppingCartImpl(); cart.setGroupId(themeDisplay.getScopeGroupId()); cart.setCompanyId(themeDisplay.getCompanyId()); cart.setUserId(themeDisplay.getUserId()); cart.setItemIds(StringPool.BLANK); cart.setCouponCodes(StringPool.BLANK); cart.setAltShipping(0); cart.setInsure(false); return cart; } public static Map<String, String> getEmailDefinitionTerms( PortletRequest portletRequest, String emailFromAddress, String emailFromName) { ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute( WebKeys.THEME_DISPLAY); Map<String, String> definitionTerms = new LinkedHashMap<>(); definitionTerms.put( "[$FROM_ADDRESS$]", HtmlUtil.escape(emailFromAddress)); definitionTerms.put("[$FROM_NAME$]", HtmlUtil.escape(emailFromName)); definitionTerms.put( "[$ORDER_BILLING_ADDRESS$]", LanguageUtil.get( themeDisplay.getLocale(), "the-order-billing-address")); definitionTerms.put( "[$ORDER_CURRENCY$]", LanguageUtil.get(themeDisplay.getLocale(), "the-order-currency")); definitionTerms.put( "[$ORDER_NUMBER$]", LanguageUtil.get(themeDisplay.getLocale(), "the-order-id")); definitionTerms.put( "[$ORDER_SHIPPING_ADDRESS$]", LanguageUtil.get( themeDisplay.getLocale(), "the-order-shipping-address")); definitionTerms.put( "[$ORDER_TOTAL$]", LanguageUtil.get(themeDisplay.getLocale(), "the-order-total")); Company company = themeDisplay.getCompany(); definitionTerms.put("[$PORTAL_URL$]", company.getVirtualHostname()); PortletDisplay portletDisplay = themeDisplay.getPortletDisplay(); definitionTerms.put( "[$PORTLET_NAME$]", HtmlUtil.escape(portletDisplay.getTitle())); definitionTerms.put( "[$TO_ADDRESS$]", LanguageUtil.get( themeDisplay.getLocale(), "the-address-of-the-email-recipient")); definitionTerms.put( "[$TO_NAME$]", LanguageUtil.get( themeDisplay.getLocale(), "the-name-of-the-email-recipient")); return definitionTerms; } public static int getFieldsQuantitiesPos( ShoppingItem item, ShoppingItemField[] itemFields, String[] fieldsArray) { Set<String> fieldsValues = new HashSet<>(); for (String fields : fieldsArray) { int pos = fields.indexOf("="); String fieldValue = fields.substring(pos + 1, fields.length()); fieldsValues.add(fieldValue.trim()); } List<String> names = new ArrayList<>(); List<String[]> values = new ArrayList<>(); for (int i = 0; i < itemFields.length; i++) { names.add(itemFields[i].getName()); values.add(StringUtil.split(itemFields[i].getValues())); } int numOfRows = 1; for (String[] vArray : values) { numOfRows = numOfRows * vArray.length; } int rowPos = 0; for (int i = 0; i < numOfRows; i++) { boolean match = true; for (int j = 0; j < names.size(); j++) { int numOfRepeats = 1; for (int k = j + 1; k < values.size(); k++) { String[] vArray = values.get(k); numOfRepeats = numOfRepeats * vArray.length; } String[] vArray = values.get(j); int arrayPos = 0; for (arrayPos = i / numOfRepeats; arrayPos >= vArray.length; arrayPos = arrayPos - vArray.length) { } if (!fieldsValues.contains(vArray[arrayPos].trim())) { match = false; break; } } if (match) { rowPos = i; break; } } return rowPos; } public static String getItemFields(String itemId) { int pos = itemId.indexOf(CharPool.PIPE); if (pos == -1) { return StringPool.BLANK; } else { return itemId.substring(pos + 1); } } public static long getItemId(String itemId) { int pos = itemId.indexOf(CharPool.PIPE); if (pos != -1) { itemId = itemId.substring(0, pos); } return GetterUtil.getLong(itemId); } public static OrderByComparator<ShoppingItem> getItemOrderByComparator( String orderByCol, String orderByType) { boolean orderByAsc = false; if (orderByType.equals("asc")) { orderByAsc = true; } OrderByComparator<ShoppingItem> orderByComparator = null; if (orderByCol.equals("min-qty")) { orderByComparator = new ItemMinQuantityComparator(orderByAsc); } else if (orderByCol.equals("name")) { orderByComparator = new ItemNameComparator(orderByAsc); } else if (orderByCol.equals("price")) { orderByComparator = new ItemPriceComparator(orderByAsc); } else if (orderByCol.equals("sku")) { orderByComparator = new ItemSKUComparator(orderByAsc); } return orderByComparator; } public static int getMinQuantity(ShoppingItem item) throws PortalException { int minQuantity = item.getMinQuantity(); List<ShoppingItemPrice> itemPrices = item.getItemPrices(); for (ShoppingItemPrice itemPrice : itemPrices) { if (minQuantity > itemPrice.getMinQuantity()) { minQuantity = itemPrice.getMinQuantity(); } } return minQuantity; } public static String getPayPalNotifyURL(ThemeDisplay themeDisplay) { return themeDisplay.getPortalURL() + themeDisplay.getPathMain() + "/shopping/notify"; } public static String getPayPalRedirectURL( ShoppingGroupServiceOverriddenConfiguration shoppingGroupServiceOverriddenConfiguration, ShoppingOrder order, double total, String returnURL, String notifyURL) { String payPalEmailAddress = URLCodec.encodeURL( shoppingGroupServiceOverriddenConfiguration. getPayPalEmailAddress()); NumberFormat doubleFormat = NumberFormat.getNumberInstance( LocaleUtil.ENGLISH); doubleFormat.setMaximumFractionDigits(2); doubleFormat.setMinimumFractionDigits(2); String amount = doubleFormat.format(total); returnURL = URLCodec.encodeURL(returnURL); notifyURL = URLCodec.encodeURL(notifyURL); String firstName = URLCodec.encodeURL(order.getBillingFirstName()); String lastName = URLCodec.encodeURL(order.getBillingLastName()); String address1 = URLCodec.encodeURL(order.getBillingStreet()); String city = URLCodec.encodeURL(order.getBillingCity()); String state = URLCodec.encodeURL(order.getBillingState()); String zip = URLCodec.encodeURL(order.getBillingZip()); String currencyCode = shoppingGroupServiceOverriddenConfiguration.getCurrencyId(); StringBundler sb = new StringBundler(29); sb.append("https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&"); sb.append("business="); sb.append(payPalEmailAddress); sb.append("&item_name="); sb.append(order.getNumber()); sb.append("&item_number="); sb.append(order.getNumber()); sb.append("&invoice="); sb.append(order.getNumber()); sb.append("&amount="); sb.append(amount); sb.append("&return="); sb.append(returnURL); sb.append("¬ify_url="); sb.append(notifyURL); sb.append("&first_name="); sb.append(firstName); sb.append("&last_name="); sb.append(lastName); sb.append("&address1="); sb.append(address1); sb.append("&city="); sb.append(city); sb.append("&state="); sb.append(state); sb.append("&zip="); sb.append(zip); sb.append("&no_note=1¤cy_code="); sb.append(currencyCode); return sb.toString(); } public static String getPayPalReturnURL( PortletURL portletURL, ShoppingOrder order) { portletURL.setParameter("struts_action", "/shopping/checkout"); portletURL.setParameter(Constants.CMD, Constants.VIEW); portletURL.setParameter("orderId", String.valueOf(order.getOrderId())); return portletURL.toString(); } public static String getPpPaymentStatus( ShoppingOrder order, HttpServletRequest request) { String ppPaymentStatus = order.getPpPaymentStatus(); if (ppPaymentStatus.equals(ShoppingOrderConstants.STATUS_CHECKOUT)) { ppPaymentStatus = "checkout"; } else { ppPaymentStatus = StringUtil.toLowerCase(ppPaymentStatus); } return LanguageUtil.get(request, HtmlUtil.escape(ppPaymentStatus)); } public static String getPpPaymentStatus(String ppPaymentStatus) { if ((ppPaymentStatus == null) || (ppPaymentStatus.length() < 2) || ppPaymentStatus.equals("checkout")) { return ShoppingOrderConstants.STATUS_CHECKOUT; } else { return Character.toUpperCase(ppPaymentStatus.charAt(0)) + ppPaymentStatus.substring(1); } } public static boolean isInStock(ShoppingItem item) { if (item.isInfiniteStock()) { return true; } if (!item.isFields()) { if (item.getStockQuantity() > 0) { return true; } else { return false; } } else { String[] fieldsQuantities = item.getFieldsQuantitiesArray(); for (int i = 0; i < fieldsQuantities.length; i++) { if (GetterUtil.getInteger(fieldsQuantities[i]) > 0) { return true; } } return false; } } public static boolean isInStock( ShoppingItem item, ShoppingItemField[] itemFields, String[] fieldsArray, Integer orderedQuantity) { if (item.isInfiniteStock()) { return true; } if (!item.isFields()) { int stockQuantity = item.getStockQuantity(); if ((stockQuantity > 0) && (stockQuantity >= orderedQuantity.intValue())) { return true; } else { return false; } } else { String[] fieldsQuantities = item.getFieldsQuantitiesArray(); int stockQuantity = 0; if (fieldsQuantities.length > 0) { int rowPos = getFieldsQuantitiesPos( item, itemFields, fieldsArray); stockQuantity = GetterUtil.getInteger(fieldsQuantities[rowPos]); } try { if ((stockQuantity > 0) && (stockQuantity >= orderedQuantity.intValue())) { return true; } } catch (Exception e) { } return false; } } public static boolean meetsMinOrder( ShoppingGroupServiceOverriddenConfiguration shoppingGroupServiceOverriddenConfiguration, Map<ShoppingCartItem, Integer> items) throws PortalException { if ((shoppingGroupServiceOverriddenConfiguration.getMinOrder() > 0) && (calculateSubtotal(items) < shoppingGroupServiceOverriddenConfiguration.getMinOrder())) { return false; } else { return true; } } private static ShoppingItemPrice _getItemPrice(ShoppingItem item, int count) throws PortalException { ShoppingItemPrice itemPrice = null; List<ShoppingItemPrice> itemPrices = item.getItemPrices(); for (ShoppingItemPrice temp : itemPrices) { int minQty = temp.getMinQuantity(); int maxQty = temp.getMaxQuantity(); if (temp.getStatus() != ShoppingItemPriceConstants.STATUS_INACTIVE) { if ((count >= minQty) && ((count <= maxQty) || (maxQty == 0))) { return temp; } if ((count > maxQty) && ((itemPrice == null) || (itemPrice.getMaxQuantity() < maxQty))) { itemPrice = temp; } } } if (itemPrice == null) { return ShoppingItemPriceUtil.create(0); } return itemPrice; } private static ShoppingGroupServiceOverriddenConfiguration _getShoppingGroupServiceOverriddenConfiguration(long groupId) throws ConfigurationException { return ConfigurationProviderUtil.getConfiguration( ShoppingGroupServiceOverriddenConfiguration.class, new GroupServiceSettingsLocator( groupId, ShoppingConstants.SERVICE_NAME)); } }