Search in sources :

Example 91 with GeneralException

use of org.apache.ofbiz.base.util.GeneralException in project ofbiz-framework by apache.

the class ShoppingCartHelper method modifyCart.

/**
 * Update the items in the shopping cart.
 */
public Map<String, Object> modifyCart(Security security, GenericValue userLogin, Map<String, ? extends Object> context, boolean removeSelected, String[] selectedItems, Locale locale) {
    Map<String, Object> result = null;
    if (locale == null) {
        locale = this.cart.getLocale();
    }
    List<ShoppingCartItem> deleteList = new ArrayList<>();
    List<String> errorMsgs = new ArrayList<>();
    BigDecimal oldQuantity;
    String oldDescription = "";
    String oldItemComment = "";
    BigDecimal oldPrice = BigDecimal.ONE.negate();
    if (this.cart.isReadOnlyCart()) {
        String errMsg = UtilProperties.getMessage(resource_error, "cart.cart_is_in_read_only_mode", this.cart.getLocale());
        errorMsgs.add(errMsg);
        result = ServiceUtil.returnError(errorMsgs);
        return result;
    }
    // TODO: This should be refactored to use UtilHttp.parseMultiFormData(parameters)
    for (Entry<String, ? extends Object> entry : context.entrySet()) {
        String parameterName = entry.getKey();
        int underscorePos = parameterName.lastIndexOf('_');
        // ignore localized date input elements, just use their counterpart without the _i18n suffix
        if (underscorePos >= 0 && (!parameterName.endsWith("_i18n"))) {
            try {
                String indexStr = parameterName.substring(underscorePos + 1);
                int index = Integer.parseInt(indexStr);
                String quantString = (String) entry.getValue();
                BigDecimal quantity = BigDecimal.ONE.negate();
                String itemDescription = "";
                String itemComment = "";
                if (quantString != null) {
                    quantString = quantString.trim();
                }
                // get the cart item
                ShoppingCartItem item = this.cart.findCartItem(index);
                if (parameterName.toUpperCase(Locale.getDefault()).startsWith("OPTION")) {
                    if (quantString.toUpperCase(Locale.getDefault()).startsWith("NO^")) {
                        if (quantString.length() > 2) {
                            // the length of the prefix
                            String featureTypeId = this.getRemoveFeatureTypeId(parameterName);
                            if (featureTypeId != null) {
                                item.removeAdditionalProductFeatureAndAppl(featureTypeId);
                            }
                        }
                    } else {
                        GenericValue featureAppl = this.getFeatureAppl(item.getProductId(), parameterName, quantString);
                        if (featureAppl != null) {
                            item.putAdditionalProductFeatureAndAppl(featureAppl);
                        }
                    }
                } else if (parameterName.toUpperCase(Locale.getDefault()).startsWith("DESCRIPTION")) {
                    // the quantString is actually the description if the field name starts with DESCRIPTION
                    itemDescription = quantString;
                } else if (parameterName.toUpperCase(Locale.getDefault()).startsWith("COMMENT")) {
                    // the quantString is actually the comment if the field name starts with COMMENT
                    itemComment = quantString;
                } else if (parameterName.startsWith("reservStart")) {
                    if (quantString.length() == 0) {
                        // should have format: yyyy-mm-dd hh:mm:ss.fffffffff
                        quantString += " 00:00:00.000000000";
                    }
                    if (item != null) {
                        Timestamp reservStart = Timestamp.valueOf(quantString);
                        item.setReservStart(reservStart);
                    }
                } else if (parameterName.startsWith("reservLength")) {
                    if (item != null) {
                        BigDecimal reservLength = (BigDecimal) ObjectType.simpleTypeConvert(quantString, "BigDecimal", null, locale);
                        item.setReservLength(reservLength);
                    }
                } else if (parameterName.startsWith("reservPersons")) {
                    if (item != null) {
                        BigDecimal reservPersons = (BigDecimal) ObjectType.simpleTypeConvert(quantString, "BigDecimal", null, locale);
                        item.setReservPersons(reservPersons);
                    }
                } else if (parameterName.startsWith("shipBeforeDate")) {
                    if (UtilValidate.isNotEmpty(quantString)) {
                        // input is either yyyy-mm-dd or a full timestamp
                        if (quantString.length() == 10) {
                            quantString += " 00:00:00.000";
                        }
                        item.setShipBeforeDate(Timestamp.valueOf(quantString));
                    }
                } else if (parameterName.startsWith("shipAfterDate")) {
                    if (UtilValidate.isNotEmpty(quantString)) {
                        // input is either yyyy-mm-dd or a full timestamp
                        if (quantString.length() == 10) {
                            quantString += " 00:00:00.000";
                        }
                        item.setShipAfterDate(Timestamp.valueOf(quantString));
                    }
                } else if (parameterName.startsWith("amount")) {
                    if (UtilValidate.isNotEmpty(quantString)) {
                        BigDecimal amount = new BigDecimal(quantString);
                        if (amount.compareTo(BigDecimal.ZERO) <= 0) {
                            String errMsg = UtilProperties.getMessage(resource_error, "cart.amount_not_positive_number", this.cart.getLocale());
                            errorMsgs.add(errMsg);
                            result = ServiceUtil.returnError(errorMsgs);
                            return result;
                        }
                        item.setSelectedAmount(amount);
                    }
                } else if (parameterName.startsWith("itemType")) {
                    if (UtilValidate.isNotEmpty(quantString)) {
                        item.setItemType(quantString);
                    }
                } else {
                    quantity = (BigDecimal) ObjectType.simpleTypeConvert(quantString, "BigDecimal", null, locale);
                    // if not and if quantity is in decimal format then return error.
                    if (!ProductWorker.isDecimalQuantityOrderAllowed(delegator, item.getProductId(), cart.getProductStoreId()) && parameterName.startsWith("update")) {
                        BigDecimal remainder = quantity.remainder(BigDecimal.ONE);
                        if (remainder.compareTo(BigDecimal.ZERO) != 0) {
                            String errMsg = UtilProperties.getMessage(resource_error, "cart.addToCart.quantityInDecimalNotAllowed", this.cart.getLocale());
                            errorMsgs.add(errMsg);
                            result = ServiceUtil.returnError(errorMsgs);
                            return result;
                        }
                        quantity = quantity.setScale(0, UtilNumber.getRoundingMode("order.rounding"));
                    } else {
                        quantity = quantity.setScale(UtilNumber.getBigDecimalScale("order.decimals"), UtilNumber.getRoundingMode("order.rounding"));
                    }
                    if (quantity.compareTo(BigDecimal.ZERO) < 0) {
                        String errMsg = UtilProperties.getMessage(resource_error, "cart.quantity_not_positive_number", this.cart.getLocale());
                        errorMsgs.add(errMsg);
                        result = ServiceUtil.returnError(errorMsgs);
                        return result;
                    }
                }
                // perhaps we need to reset the ship groups' before and after dates based on new dates for the items
                if (parameterName.startsWith("shipAfterDate") || parameterName.startsWith("shipBeforeDate")) {
                    this.cart.setShipGroupShipDatesFromItem(item);
                }
                if (parameterName.toUpperCase(Locale.getDefault()).startsWith("UPDATE")) {
                    if (quantity.compareTo(BigDecimal.ZERO) == 0) {
                        deleteList.add(item);
                    } else {
                        if (item != null) {
                            try {
                                oldItemComment = item.getItemComment();
                                // if, on a purchase order, the quantity has changed, get the new SupplierProduct entity for this quantity level.
                                if ("PURCHASE_ORDER".equals(cart.getOrderType())) {
                                    oldQuantity = item.getQuantity();
                                    if (oldQuantity.compareTo(quantity) != 0) {
                                        // save the old description and price, in case the user wants to change those as well
                                        oldDescription = item.getName(this.dispatcher);
                                        oldPrice = item.getBasePrice();
                                        if (UtilValidate.isNotEmpty(item.getProductId())) {
                                            GenericValue supplierProduct = this.cart.getSupplierProduct(item.getProductId(), quantity, this.dispatcher);
                                            if (supplierProduct == null) {
                                                if ("_NA_".equals(cart.getPartyId())) {
                                                    // no supplier does not require the supplier product
                                                    item.setQuantity(quantity, dispatcher, this.cart);
                                                    item.setName(item.getProduct().getString("internalName"));
                                                } else {
                                                    // in this case, the user wanted to purchase a quantity which is not available (probably below minimum)
                                                    String errMsg = UtilProperties.getMessage(resource_error, "cart.product_not_valid_for_supplier", this.cart.getLocale());
                                                    errMsg = errMsg + " (" + item.getProductId() + ", " + quantity + ", " + cart.getCurrency() + ")";
                                                    errorMsgs.add(errMsg);
                                                }
                                            } else {
                                                item.setSupplierProductId(supplierProduct.getString("supplierProductId"));
                                                item.setQuantity(quantity, dispatcher, this.cart);
                                                item.setBasePrice(supplierProduct.getBigDecimal("lastPrice"));
                                                item.setName(ShoppingCartItem.getPurchaseOrderItemDescription(item.getProduct(), supplierProduct, cart.getLocale(), dispatcher));
                                            }
                                        } else {
                                            item.setQuantity(quantity, dispatcher, this.cart);
                                        }
                                    }
                                } else {
                                    BigDecimal minQuantity = ShoppingCart.getMinimumOrderQuantity(delegator, item.getBasePrice(), item.getProductId());
                                    oldQuantity = item.getQuantity();
                                    if (oldQuantity.compareTo(quantity) != 0) {
                                        cart.setShipmentMethodTypeId(index, null);
                                    }
                                    if (quantity.compareTo(minQuantity) < 0) {
                                        quantity = minQuantity;
                                    }
                                    item.setQuantity(quantity, dispatcher, this.cart, true, false);
                                    cart.setItemShipGroupQty(item, quantity, 0);
                                }
                            } catch (CartItemModifyException e) {
                                errorMsgs.add(e.getMessage());
                            }
                        }
                    }
                }
                if (parameterName.toUpperCase(Locale.getDefault()).startsWith("DESCRIPTION")) {
                    if (!oldDescription.equals(itemDescription)) {
                        if (security.hasEntityPermission("ORDERMGR", "_CREATE", userLogin)) {
                            if (item != null) {
                                item.setName(itemDescription);
                            }
                        }
                    }
                }
                if (parameterName.toUpperCase(Locale.getDefault()).startsWith("COMMENT")) {
                    if (!oldItemComment.equals(itemComment)) {
                        if (security.hasEntityPermission("ORDERMGR", "_CREATE", userLogin)) {
                            if (item != null) {
                                item.setItemComment(itemComment);
                            }
                        }
                    }
                }
                if (parameterName.toUpperCase(Locale.getDefault()).startsWith("PRICE")) {
                    NumberFormat pf = NumberFormat.getCurrencyInstance(locale);
                    String tmpQuantity = pf.format(quantity);
                    String tmpOldPrice = pf.format(oldPrice);
                    if (!tmpOldPrice.equals(tmpQuantity)) {
                        if (security.hasEntityPermission("ORDERMGR", "_CREATE", userLogin)) {
                            if (item != null) {
                                // this is quantity because the parsed number variable is the same as quantity
                                item.setBasePrice(quantity);
                                // or the amount shown the cart items page won't be right
                                item.setDisplayPrice(quantity);
                            }
                        }
                    }
                }
                if (parameterName.toUpperCase(Locale.getDefault()).startsWith("DELETE")) {
                    deleteList.add(this.cart.findCartItem(index));
                }
            } catch (NumberFormatException nfe) {
                Debug.logWarning(nfe, UtilProperties.getMessage(resource_error, "OrderCaughtNumberFormatExceptionOnCartUpdate", cart.getLocale()));
            } catch (GeneralException e) {
                Debug.logWarning(e, UtilProperties.getMessage(resource_error, "OrderCaughtExceptionOnCartUpdate", cart.getLocale()));
            }
        }
    // else not a parameter we need
    }
    // get a list of the items to delete
    if (removeSelected) {
        for (String indexStr : selectedItems) {
            ShoppingCartItem item = null;
            try {
                int index = Integer.parseInt(indexStr);
                item = this.cart.findCartItem(index);
            } catch (Exception e) {
                Debug.logWarning(e, UtilProperties.getMessage(resource_error, "OrderProblemsGettingTheCartItemByIndex", cart.getLocale()));
            }
            if (item != null) {
                deleteList.add(item);
            }
        }
    }
    for (ShoppingCartItem item : deleteList) {
        int itemIndex = this.cart.getItemIndex(item);
        if (Debug.infoOn()) {
            Debug.logInfo("Removing item index: " + itemIndex, module);
        }
        try {
            this.cart.removeCartItem(itemIndex, dispatcher);
            cart.setShipmentMethodTypeId(itemIndex, null);
        } catch (CartItemModifyException e) {
            result = ServiceUtil.returnError(new ArrayList<String>());
            errorMsgs.add(e.getMessage());
        }
    }
    if (context.containsKey("alwaysShowcart")) {
        this.cart.setViewCartOnAdd(true);
    } else {
        this.cart.setViewCartOnAdd(false);
    }
    // Promotions are run again.
    ProductPromoWorker.doPromotions(this.cart, dispatcher);
    if (errorMsgs.size() > 0) {
        result = ServiceUtil.returnError(errorMsgs);
        return result;
    }
    result = ServiceUtil.returnSuccess();
    return result;
}
Also used : GenericValue(org.apache.ofbiz.entity.GenericValue) GeneralException(org.apache.ofbiz.base.util.GeneralException) ArrayList(java.util.ArrayList) Timestamp(java.sql.Timestamp) BigDecimal(java.math.BigDecimal) GenericEntityException(org.apache.ofbiz.entity.GenericEntityException) GeneralException(org.apache.ofbiz.base.util.GeneralException) NumberFormat(java.text.NumberFormat)

Example 92 with GeneralException

use of org.apache.ofbiz.base.util.GeneralException in project ofbiz-framework by apache.

the class ShoppingCartServices method loadCartFromQuote.

public static Map<String, Object> loadCartFromQuote(DispatchContext dctx, Map<String, Object> context) {
    LocalDispatcher dispatcher = dctx.getDispatcher();
    Delegator delegator = dctx.getDelegator();
    GenericValue userLogin = (GenericValue) context.get("userLogin");
    String quoteId = (String) context.get("quoteId");
    String applyQuoteAdjustmentsString = (String) context.get("applyQuoteAdjustments");
    Locale locale = (Locale) context.get("locale");
    boolean applyQuoteAdjustments = applyQuoteAdjustmentsString == null || "true".equals(applyQuoteAdjustmentsString);
    // get the quote header
    GenericValue quote = null;
    try {
        quote = EntityQuery.use(delegator).from("Quote").where("quoteId", quoteId).queryOne();
    } catch (GenericEntityException e) {
        Debug.logError(e, module);
        return ServiceUtil.returnError(e.getMessage());
    }
    // initial require cart info
    String productStoreId = quote.getString("productStoreId");
    String currency = quote.getString("currencyUomId");
    // create the cart
    ShoppingCart cart = new ShoppingCart(delegator, productStoreId, locale, currency);
    // set shopping cart type
    if ("PURCHASE_QUOTE".equals(quote.getString("quoteTypeId"))) {
        cart.setOrderType("PURCHASE_ORDER");
        cart.setBillFromVendorPartyId(quote.getString("partyId"));
    }
    try {
        cart.setUserLogin(userLogin, dispatcher);
    } catch (CartItemModifyException e) {
        Debug.logError(e, module);
        return ServiceUtil.returnError(e.getMessage());
    }
    cart.setQuoteId(quoteId);
    cart.setOrderName(quote.getString("quoteName"));
    cart.setChannelType(quote.getString("salesChannelEnumId"));
    List<GenericValue> quoteItems = null;
    List<GenericValue> quoteAdjs = null;
    List<GenericValue> quoteRoles = null;
    List<GenericValue> quoteAttributes = null;
    List<GenericValue> quoteTerms = null;
    try {
        quoteItems = quote.getRelated("QuoteItem", null, UtilMisc.toList("quoteItemSeqId"), false);
        quoteAdjs = quote.getRelated("QuoteAdjustment", null, null, false);
        quoteRoles = quote.getRelated("QuoteRole", null, null, false);
        quoteAttributes = quote.getRelated("QuoteAttribute", null, null, false);
        quoteTerms = quote.getRelated("QuoteTerm", null, null, false);
    } catch (GenericEntityException e) {
        Debug.logError(e, module);
        return ServiceUtil.returnError(e.getMessage());
    }
    // set the role information
    cart.setOrderPartyId(quote.getString("partyId"));
    if (UtilValidate.isNotEmpty(quoteRoles)) {
        for (GenericValue quoteRole : quoteRoles) {
            String quoteRoleTypeId = quoteRole.getString("roleTypeId");
            String quoteRolePartyId = quoteRole.getString("partyId");
            if ("PLACING_CUSTOMER".equals(quoteRoleTypeId)) {
                cart.setPlacingCustomerPartyId(quoteRolePartyId);
            } else if ("BILL_TO_CUSTOMER".equals(quoteRoleTypeId)) {
                cart.setBillToCustomerPartyId(quoteRolePartyId);
            } else if ("SHIP_TO_CUSTOMER".equals(quoteRoleTypeId)) {
                cart.setShipToCustomerPartyId(quoteRolePartyId);
            } else if ("END_USER_CUSTOMER".equals(quoteRoleTypeId)) {
                cart.setEndUserCustomerPartyId(quoteRolePartyId);
            } else if ("BILL_FROM_VENDOR".equals(quoteRoleTypeId)) {
                cart.setBillFromVendorPartyId(quoteRolePartyId);
            } else {
                cart.addAdditionalPartyRole(quoteRolePartyId, quoteRoleTypeId);
            }
        }
    }
    // set the order term
    if (UtilValidate.isNotEmpty(quoteTerms)) {
        // create order term from quote term
        for (GenericValue quoteTerm : quoteTerms) {
            BigDecimal termValue = BigDecimal.ZERO;
            if (UtilValidate.isNotEmpty(quoteTerm.getString("termValue"))) {
                termValue = new BigDecimal(quoteTerm.getString("termValue"));
            }
            long termDays = 0;
            if (UtilValidate.isNotEmpty(quoteTerm.getString("termDays"))) {
                termDays = Long.parseLong(quoteTerm.getString("termDays").trim());
            }
            String orderItemSeqId = quoteTerm.getString("quoteItemSeqId");
            cart.addOrderTerm(quoteTerm.getString("termTypeId"), orderItemSeqId, termValue, termDays, quoteTerm.getString("textValue"), quoteTerm.getString("description"));
        }
    }
    // set the attribute information
    if (UtilValidate.isNotEmpty(quoteAttributes)) {
        for (GenericValue quoteAttribute : quoteAttributes) {
            cart.setOrderAttribute(quoteAttribute.getString("attrName"), quoteAttribute.getString("attrValue"));
        }
    }
    // Convert the quote adjustment to order header adjustments and
    // put them in a map: the key/values pairs are quoteItemSeqId/List of adjs
    Map<String, List<GenericValue>> orderAdjsMap = new HashMap<>();
    for (GenericValue quoteAdj : quoteAdjs) {
        List<GenericValue> orderAdjs = orderAdjsMap.get(UtilValidate.isNotEmpty(quoteAdj.getString("quoteItemSeqId")) ? quoteAdj.getString("quoteItemSeqId") : quoteId);
        if (orderAdjs == null) {
            orderAdjs = new LinkedList<>();
            orderAdjsMap.put(UtilValidate.isNotEmpty(quoteAdj.getString("quoteItemSeqId")) ? quoteAdj.getString("quoteItemSeqId") : quoteId, orderAdjs);
        }
        // convert quote adjustments to order adjustments
        GenericValue orderAdj = delegator.makeValue("OrderAdjustment");
        orderAdj.put("orderAdjustmentId", quoteAdj.get("quoteAdjustmentId"));
        orderAdj.put("orderAdjustmentTypeId", quoteAdj.get("quoteAdjustmentTypeId"));
        orderAdj.put("orderItemSeqId", quoteAdj.get("quoteItemSeqId"));
        orderAdj.put("comments", quoteAdj.get("comments"));
        orderAdj.put("description", quoteAdj.get("description"));
        orderAdj.put("amount", quoteAdj.get("amount"));
        orderAdj.put("productPromoId", quoteAdj.get("productPromoId"));
        orderAdj.put("productPromoRuleId", quoteAdj.get("productPromoRuleId"));
        orderAdj.put("productPromoActionSeqId", quoteAdj.get("productPromoActionSeqId"));
        orderAdj.put("productFeatureId", quoteAdj.get("productFeatureId"));
        orderAdj.put("correspondingProductId", quoteAdj.get("correspondingProductId"));
        orderAdj.put("sourceReferenceId", quoteAdj.get("sourceReferenceId"));
        orderAdj.put("sourcePercentage", quoteAdj.get("sourcePercentage"));
        orderAdj.put("customerReferenceId", quoteAdj.get("customerReferenceId"));
        orderAdj.put("primaryGeoId", quoteAdj.get("primaryGeoId"));
        orderAdj.put("secondaryGeoId", quoteAdj.get("secondaryGeoId"));
        orderAdj.put("exemptAmount", quoteAdj.get("exemptAmount"));
        orderAdj.put("taxAuthGeoId", quoteAdj.get("taxAuthGeoId"));
        orderAdj.put("taxAuthPartyId", quoteAdj.get("taxAuthPartyId"));
        orderAdj.put("overrideGlAccountId", quoteAdj.get("overrideGlAccountId"));
        orderAdj.put("includeInTax", quoteAdj.get("includeInTax"));
        orderAdj.put("includeInShipping", quoteAdj.get("includeInShipping"));
        orderAdj.put("createdDate", quoteAdj.get("createdDate"));
        orderAdj.put("createdByUserLogin", quoteAdj.get("createdByUserLogin"));
        orderAdjs.add(orderAdj);
    }
    long nextItemSeq = 0;
    if (UtilValidate.isNotEmpty(quoteItems)) {
        Pattern pattern = Pattern.compile("\\P{Digit}");
        for (GenericValue quoteItem : quoteItems) {
            // get the next item sequence id
            String orderItemSeqId = quoteItem.getString("quoteItemSeqId");
            Matcher pmatcher = pattern.matcher(orderItemSeqId);
            orderItemSeqId = pmatcher.replaceAll("");
            try {
                long seq = Long.parseLong(orderItemSeqId);
                if (seq > nextItemSeq) {
                    nextItemSeq = seq;
                }
            } catch (NumberFormatException e) {
                Debug.logError(e, module);
                return ServiceUtil.returnError(e.getMessage());
            }
            boolean isPromo = quoteItem.get("isPromo") != null && "Y".equals(quoteItem.getString("isPromo"));
            if (isPromo && !applyQuoteAdjustments) {
                // do not include PROMO items
                continue;
            }
            // not a promo item; go ahead and add it in
            BigDecimal amount = quoteItem.getBigDecimal("selectedAmount");
            if (amount == null) {
                amount = BigDecimal.ZERO;
            }
            BigDecimal quantity = quoteItem.getBigDecimal("quantity");
            if (quantity == null) {
                quantity = BigDecimal.ZERO;
            }
            BigDecimal quoteUnitPrice = quoteItem.getBigDecimal("quoteUnitPrice");
            if (quoteUnitPrice == null) {
                quoteUnitPrice = BigDecimal.ZERO;
            }
            if (amount.compareTo(BigDecimal.ZERO) > 0) {
                // If, in the quote, an amount is set, we need to
                // pass to the cart the quoteUnitPrice/amount value.
                quoteUnitPrice = quoteUnitPrice.divide(amount, generalRounding);
            }
            // rental product data
            Timestamp reservStart = quoteItem.getTimestamp("reservStart");
            BigDecimal reservLength = quoteItem.getBigDecimal("reservLength");
            BigDecimal reservPersons = quoteItem.getBigDecimal("reservPersons");
            int itemIndex = -1;
            if (quoteItem.get("productId") == null) {
                // non-product item
                String desc = quoteItem.getString("comments");
                try {
                    // note that passing in null for itemGroupNumber as there is no real grouping concept in the quotes right now
                    itemIndex = cart.addNonProductItem(null, desc, null, null, quantity, null, null, null, dispatcher);
                } catch (CartItemModifyException e) {
                    Debug.logError(e, module);
                    return ServiceUtil.returnError(e.getMessage());
                }
            } else {
                // product item
                String productId = quoteItem.getString("productId");
                ProductConfigWrapper configWrapper = null;
                if (UtilValidate.isNotEmpty(quoteItem.getString("configId"))) {
                    configWrapper = ProductConfigWorker.loadProductConfigWrapper(delegator, dispatcher, quoteItem.getString("configId"), productId, productStoreId, null, null, currency, locale, userLogin);
                }
                try {
                    itemIndex = cart.addItemToEnd(productId, amount, quantity, quoteUnitPrice, reservStart, reservLength, reservPersons, null, null, null, null, null, configWrapper, null, dispatcher, Boolean.valueOf(!applyQuoteAdjustments), Boolean.valueOf(quoteUnitPrice.compareTo(BigDecimal.ZERO) == 0), Boolean.FALSE, Boolean.FALSE);
                } catch (ItemNotFoundException | CartItemModifyException e) {
                    Debug.logError(e, module);
                    return ServiceUtil.returnError(e.getMessage());
                }
            }
            // flag the item w/ the orderItemSeqId so we can reference it
            ShoppingCartItem cartItem = cart.findCartItem(itemIndex);
            cartItem.setOrderItemSeqId(orderItemSeqId);
            // attach additional item information
            cartItem.setItemComment(quoteItem.getString("comments"));
            cartItem.setQuoteId(quoteItem.getString("quoteId"));
            cartItem.setQuoteItemSeqId(quoteItem.getString("quoteItemSeqId"));
            cartItem.setIsPromo(isPromo);
        }
    }
    // If applyQuoteAdjustments is set to false then standard cart adjustments are used.
    if (applyQuoteAdjustments) {
        // The cart adjustments, derived from quote adjustments, are added to the cart
        // Tax adjustments should be added to the shipping group and shipping group item info
        // Other adjustments like promotional price should be added to the cart independent of
        // the ship group.
        // We're creating the cart right now using data from the quote, so there cannot yet be more than one ship group.
        List<GenericValue> cartAdjs = cart.getAdjustments();
        CartShipInfo shipInfo = cart.getShipInfo(0);
        List<GenericValue> adjs = orderAdjsMap.get(quoteId);
        if (adjs != null) {
            for (GenericValue adj : adjs) {
                if (isTaxAdjustment(adj)) {
                    shipInfo.shipTaxAdj.add(adj);
                } else {
                    cartAdjs.add(adj);
                }
            }
        }
        // The cart item adjustments, derived from quote item adjustments, are added to the cart
        if (quoteItems != null) {
            for (ShoppingCartItem item : cart) {
                String orderItemSeqId = item.getOrderItemSeqId();
                if (orderItemSeqId != null) {
                    adjs = orderAdjsMap.get(orderItemSeqId);
                } else {
                    adjs = null;
                }
                if (adjs != null) {
                    for (GenericValue adj : adjs) {
                        if (isTaxAdjustment(adj)) {
                            CartShipItemInfo csii = shipInfo.getShipItemInfo(item);
                            if (csii.itemTaxAdj == null) {
                                shipInfo.setItemInfo(item, UtilMisc.toList(adj));
                            } else {
                                csii.itemTaxAdj.add(adj);
                            }
                        } else {
                            item.addAdjustment(adj);
                        }
                    }
                }
            }
        }
    }
    // set the item seq in the cart
    if (nextItemSeq > 0) {
        try {
            cart.setNextItemSeq(nextItemSeq + 1);
        } catch (GeneralException e) {
            Debug.logError(e, module);
            return ServiceUtil.returnError(e.getMessage());
        }
    }
    Map<String, Object> result = ServiceUtil.returnSuccess();
    result.put("shoppingCart", cart);
    return result;
}
Also used : Locale(java.util.Locale) LocalDispatcher(org.apache.ofbiz.service.LocalDispatcher) HashMap(java.util.HashMap) Matcher(java.util.regex.Matcher) ProductConfigWrapper(org.apache.ofbiz.product.config.ProductConfigWrapper) CartShipInfo(org.apache.ofbiz.order.shoppingcart.ShoppingCart.CartShipInfo) Timestamp(java.sql.Timestamp) CartShipItemInfo(org.apache.ofbiz.order.shoppingcart.ShoppingCart.CartShipInfo.CartShipItemInfo) LinkedList(java.util.LinkedList) List(java.util.List) GenericValue(org.apache.ofbiz.entity.GenericValue) Pattern(java.util.regex.Pattern) GeneralException(org.apache.ofbiz.base.util.GeneralException) BigDecimal(java.math.BigDecimal) Delegator(org.apache.ofbiz.entity.Delegator) GenericEntityException(org.apache.ofbiz.entity.GenericEntityException)

Example 93 with GeneralException

use of org.apache.ofbiz.base.util.GeneralException in project ofbiz-framework by apache.

the class ShoppingCartServices method loadCartFromOrder.

public static Map<String, Object> loadCartFromOrder(DispatchContext dctx, Map<String, Object> context) {
    LocalDispatcher dispatcher = dctx.getDispatcher();
    Delegator delegator = dctx.getDelegator();
    GenericValue userLogin = (GenericValue) context.get("userLogin");
    String orderId = (String) context.get("orderId");
    Boolean skipInventoryChecks = (Boolean) context.get("skipInventoryChecks");
    Boolean skipProductChecks = (Boolean) context.get("skipProductChecks");
    boolean includePromoItems = Boolean.TRUE.equals(context.get("includePromoItems"));
    Locale locale = (Locale) context.get("locale");
    // FIXME: deepak:Personally I don't like the idea of passing flag but for orderItem quantity calculation we need this flag.
    String createAsNewOrder = (String) context.get("createAsNewOrder");
    List<GenericValue> orderTerms = null;
    List<GenericValue> orderContactMechs = null;
    if (UtilValidate.isEmpty(skipInventoryChecks)) {
        skipInventoryChecks = Boolean.FALSE;
    }
    if (UtilValidate.isEmpty(skipProductChecks)) {
        skipProductChecks = Boolean.FALSE;
    }
    // get the order header
    GenericValue orderHeader = null;
    try {
        orderHeader = EntityQuery.use(delegator).from("OrderHeader").where("orderId", orderId).queryOne();
        orderTerms = orderHeader.getRelated("OrderTerm", null, null, false);
        orderContactMechs = orderHeader.getRelated("OrderContactMech", null, null, false);
    } catch (GenericEntityException e) {
        Debug.logError(e, module);
        return ServiceUtil.returnError(e.getMessage());
    }
    // initial require cart info
    OrderReadHelper orh = new OrderReadHelper(orderHeader);
    String productStoreId = orh.getProductStoreId();
    String orderTypeId = orh.getOrderTypeId();
    String currency = orh.getCurrency();
    String website = orh.getWebSiteId();
    String currentStatusString = orh.getCurrentStatusString();
    // create the cart
    ShoppingCart cart = new ShoppingCart(delegator, productStoreId, website, locale, currency);
    cart.setDoPromotions(!includePromoItems);
    cart.setOrderType(orderTypeId);
    cart.setChannelType(orderHeader.getString("salesChannelEnumId"));
    cart.setInternalCode(orderHeader.getString("internalCode"));
    if ("Y".equals(createAsNewOrder)) {
        cart.setOrderDate(UtilDateTime.nowTimestamp());
    } else {
        cart.setOrderDate(orderHeader.getTimestamp("orderDate"));
    }
    cart.setOrderId(orderHeader.getString("orderId"));
    cart.setOrderName(orderHeader.getString("orderName"));
    cart.setOrderStatusId(orderHeader.getString("statusId"));
    cart.setOrderStatusString(currentStatusString);
    cart.setFacilityId(orderHeader.getString("originFacilityId"));
    cart.setAgreementId(orderHeader.getString("agreementId"));
    try {
        cart.setUserLogin(userLogin, dispatcher);
    } catch (CartItemModifyException e) {
        Debug.logError(e, module);
        return ServiceUtil.returnError(e.getMessage());
    }
    // set the role information
    GenericValue placingParty = orh.getPlacingParty();
    if (placingParty != null) {
        cart.setPlacingCustomerPartyId(placingParty.getString("partyId"));
    }
    GenericValue billFromParty = orh.getBillFromParty();
    if (billFromParty != null) {
        cart.setBillFromVendorPartyId(billFromParty.getString("partyId"));
    }
    GenericValue billToParty = orh.getBillToParty();
    if (billToParty != null) {
        cart.setBillToCustomerPartyId(billToParty.getString("partyId"));
    }
    GenericValue shipToParty = orh.getShipToParty();
    if (shipToParty != null) {
        cart.setShipToCustomerPartyId(shipToParty.getString("partyId"));
    }
    GenericValue endUserParty = orh.getEndUserParty();
    if (endUserParty != null) {
        cart.setEndUserCustomerPartyId(endUserParty.getString("partyId"));
        cart.setOrderPartyId(endUserParty.getString("partyId"));
    }
    // load order attributes
    List<GenericValue> orderAttributesList = null;
    try {
        orderAttributesList = EntityQuery.use(delegator).from("OrderAttribute").where("orderId", orderId).queryList();
        if (UtilValidate.isNotEmpty(orderAttributesList)) {
            for (GenericValue orderAttr : orderAttributesList) {
                String name = orderAttr.getString("attrName");
                String value = orderAttr.getString("attrValue");
                cart.setOrderAttribute(name, value);
            }
        }
    } catch (GenericEntityException e) {
        Debug.logError(e, module);
        return ServiceUtil.returnError(e.getMessage());
    }
    // load the payment infos
    List<GenericValue> orderPaymentPrefs = null;
    try {
        List<EntityExpr> exprs = UtilMisc.toList(EntityCondition.makeCondition("orderId", EntityOperator.EQUALS, orderId));
        exprs.add(EntityCondition.makeCondition("statusId", EntityOperator.NOT_EQUAL, "PAYMENT_RECEIVED"));
        exprs.add(EntityCondition.makeCondition("statusId", EntityOperator.NOT_EQUAL, "PAYMENT_CANCELLED"));
        exprs.add(EntityCondition.makeCondition("statusId", EntityOperator.NOT_EQUAL, "PAYMENT_DECLINED"));
        exprs.add(EntityCondition.makeCondition("statusId", EntityOperator.NOT_EQUAL, "PAYMENT_SETTLED"));
        orderPaymentPrefs = EntityQuery.use(delegator).from("OrderPaymentPreference").where(exprs).queryList();
    } catch (GenericEntityException e) {
        Debug.logError(e, module);
        return ServiceUtil.returnError(e.getMessage());
    }
    if (UtilValidate.isNotEmpty(orderPaymentPrefs)) {
        Iterator<GenericValue> oppi = orderPaymentPrefs.iterator();
        while (oppi.hasNext()) {
            GenericValue opp = oppi.next();
            String paymentId = opp.getString("paymentMethodId");
            if (paymentId == null) {
                paymentId = opp.getString("paymentMethodTypeId");
            }
            BigDecimal maxAmount = opp.getBigDecimal("maxAmount");
            String overflow = opp.getString("overflowFlag");
            ShoppingCart.CartPaymentInfo cpi = null;
            if ((overflow == null || !"Y".equals(overflow)) && oppi.hasNext()) {
                cpi = cart.addPaymentAmount(paymentId, maxAmount);
                Debug.logInfo("Added Payment: " + paymentId + " / " + maxAmount, module);
            } else {
                cpi = cart.addPayment(paymentId);
                Debug.logInfo("Added Payment: " + paymentId + " / [no max]", module);
            }
            // for finance account the finAccountId needs to be set
            if ("FIN_ACCOUNT".equals(paymentId)) {
                cpi.finAccountId = opp.getString("finAccountId");
            }
            // set the billing account and amount
            cart.setBillingAccount(orderHeader.getString("billingAccountId"), orh.getBillingAccountMaxAmount());
        }
    } else {
        Debug.logInfo("No payment preferences found for order #" + orderId, module);
    }
    // set the order term
    if (UtilValidate.isNotEmpty(orderTerms)) {
        for (GenericValue orderTerm : orderTerms) {
            BigDecimal termValue = BigDecimal.ZERO;
            if (UtilValidate.isNotEmpty(orderTerm.getString("termValue"))) {
                termValue = new BigDecimal(orderTerm.getString("termValue"));
            }
            long termDays = 0;
            if (UtilValidate.isNotEmpty(orderTerm.getString("termDays"))) {
                termDays = Long.parseLong(orderTerm.getString("termDays").trim());
            }
            String orderItemSeqId = orderTerm.getString("orderItemSeqId");
            cart.addOrderTerm(orderTerm.getString("termTypeId"), orderItemSeqId, termValue, termDays, orderTerm.getString("textValue"), orderTerm.getString("description"));
        }
    }
    if (UtilValidate.isNotEmpty(orderContactMechs)) {
        for (GenericValue orderContactMech : orderContactMechs) {
            cart.addContactMech(orderContactMech.getString("contactMechPurposeTypeId"), orderContactMech.getString("contactMechId"));
        }
    }
    List<GenericValue> orderItemShipGroupList = orh.getOrderItemShipGroups();
    for (GenericValue orderItemShipGroup : orderItemShipGroupList) {
        // should be sorted by shipGroupSeqId
        int newShipInfoIndex = cart.addShipInfo();
        CartShipInfo cartShipInfo = cart.getShipInfo(newShipInfoIndex);
        cartShipInfo.shipAfterDate = orderItemShipGroup.getTimestamp("shipAfterDate");
        cartShipInfo.shipBeforeDate = orderItemShipGroup.getTimestamp("shipByDate");
        cartShipInfo.shipmentMethodTypeId = orderItemShipGroup.getString("shipmentMethodTypeId");
        cartShipInfo.carrierPartyId = orderItemShipGroup.getString("carrierPartyId");
        cartShipInfo.supplierPartyId = orderItemShipGroup.getString("supplierPartyId");
        cartShipInfo.setMaySplit(orderItemShipGroup.getBoolean("maySplit"));
        cartShipInfo.giftMessage = orderItemShipGroup.getString("giftMessage");
        cartShipInfo.setContactMechId(orderItemShipGroup.getString("contactMechId"));
        cartShipInfo.shippingInstructions = orderItemShipGroup.getString("shippingInstructions");
        cartShipInfo.setFacilityId(orderItemShipGroup.getString("facilityId"));
        cartShipInfo.setVendorPartyId(orderItemShipGroup.getString("vendorPartyId"));
        cartShipInfo.setShipGroupSeqId(orderItemShipGroup.getString("shipGroupSeqId"));
        cartShipInfo.shipTaxAdj.addAll(orh.getOrderHeaderAdjustmentsTax(orderItemShipGroup.getString("shipGroupSeqId")));
    }
    List<GenericValue> orderItems = orh.getOrderItems();
    long nextItemSeq = 0;
    if (UtilValidate.isNotEmpty(orderItems)) {
        Pattern pattern = Pattern.compile("\\P{Digit}");
        for (GenericValue item : orderItems) {
            // get the next item sequence id
            String orderItemSeqId = item.getString("orderItemSeqId");
            Matcher pmatcher = pattern.matcher(orderItemSeqId);
            orderItemSeqId = pmatcher.replaceAll("");
            // get product Id
            String productId = item.getString("productId");
            GenericValue product = null;
            // creates survey responses for Gift cards same as last Order created
            Map<String, Object> surveyResponseResult = null;
            try {
                long seq = Long.parseLong(orderItemSeqId);
                if (seq > nextItemSeq) {
                    nextItemSeq = seq;
                }
            } catch (NumberFormatException e) {
                Debug.logError(e, module);
                return ServiceUtil.returnError(e.getMessage());
            }
            if ("ITEM_REJECTED".equals(item.getString("statusId")) || "ITEM_CANCELLED".equals(item.getString("statusId"))) {
                continue;
            }
            try {
                product = EntityQuery.use(delegator).from("Product").where("productId", productId).queryOne();
                if ("DIGITAL_GOOD".equals(product.getString("productTypeId"))) {
                    Map<String, Object> surveyResponseMap = new HashMap<>();
                    Map<String, Object> answers = new HashMap<>();
                    List<GenericValue> surveyResponseAndAnswers = EntityQuery.use(delegator).from("SurveyResponseAndAnswer").where("orderId", orderId, "orderItemSeqId", orderItemSeqId).queryList();
                    if (UtilValidate.isNotEmpty(surveyResponseAndAnswers)) {
                        String surveyId = EntityUtil.getFirst(surveyResponseAndAnswers).getString("surveyId");
                        for (GenericValue surveyResponseAndAnswer : surveyResponseAndAnswers) {
                            answers.put((surveyResponseAndAnswer.get("surveyQuestionId").toString()), surveyResponseAndAnswer.get("textResponse"));
                        }
                        surveyResponseMap.put("answers", answers);
                        surveyResponseMap.put("surveyId", surveyId);
                        surveyResponseResult = dispatcher.runSync("createSurveyResponse", surveyResponseMap);
                        if (ServiceUtil.isError(surveyResponseResult)) {
                            return ServiceUtil.returnError(ServiceUtil.getErrorMessage(surveyResponseResult));
                        }
                    }
                }
            } catch (GenericEntityException | GenericServiceException e) {
                Debug.logError(e, module);
                return ServiceUtil.returnError(e.getMessage());
            }
            // do not include PROMO items
            if (!includePromoItems && item.get("isPromo") != null && "Y".equals(item.getString("isPromo"))) {
                continue;
            }
            // not a promo item; go ahead and add it in
            BigDecimal amount = item.getBigDecimal("selectedAmount");
            if (amount == null) {
                amount = BigDecimal.ZERO;
            }
            // BigDecimal quantity = item.getBigDecimal("quantity");
            BigDecimal quantity = BigDecimal.ZERO;
            if ("ITEM_COMPLETED".equals(item.getString("statusId")) && "N".equals(createAsNewOrder)) {
                quantity = item.getBigDecimal("quantity");
            } else {
                quantity = OrderReadHelper.getOrderItemQuantity(item);
            }
            if (quantity == null) {
                quantity = BigDecimal.ZERO;
            }
            BigDecimal unitPrice = null;
            if ("Y".equals(item.getString("isModifiedPrice"))) {
                unitPrice = item.getBigDecimal("unitPrice");
            }
            int itemIndex = -1;
            if (item.get("productId") == null) {
                // non-product item
                String itemType = item.getString("orderItemTypeId");
                String desc = item.getString("itemDescription");
                try {
                    // TODO: passing in null now for itemGroupNumber, but should reproduce from OrderItemGroup records
                    itemIndex = cart.addNonProductItem(itemType, desc, null, unitPrice, quantity, null, null, null, dispatcher);
                } catch (CartItemModifyException e) {
                    Debug.logError(e, module);
                    return ServiceUtil.returnError(e.getMessage());
                }
            } else {
                // product item
                String prodCatalogId = item.getString("prodCatalogId");
                // prepare the rental data
                Timestamp reservStart = null;
                BigDecimal reservLength = null;
                BigDecimal reservPersons = null;
                String accommodationMapId = null;
                String accommodationSpotId = null;
                GenericValue workEffort = null;
                String workEffortId = orh.getCurrentOrderItemWorkEffort(item);
                if (workEffortId != null) {
                    try {
                        workEffort = EntityQuery.use(delegator).from("WorkEffort").where("workEffortId", workEffortId).queryOne();
                    } catch (GenericEntityException e) {
                        Debug.logError(e, module);
                    }
                }
                if (workEffort != null && "ASSET_USAGE".equals(workEffort.getString("workEffortTypeId"))) {
                    reservStart = workEffort.getTimestamp("estimatedStartDate");
                    reservLength = OrderReadHelper.getWorkEffortRentalLength(workEffort);
                    reservPersons = workEffort.getBigDecimal("reservPersons");
                    accommodationMapId = workEffort.getString("accommodationMapId");
                    accommodationSpotId = workEffort.getString("accommodationSpotId");
                }
                // end of rental data
                // check for AGGREGATED products
                ProductConfigWrapper configWrapper = null;
                String configId = null;
                try {
                    product = EntityQuery.use(delegator).from("Product").where("productId", productId).queryOne();
                    if (EntityTypeUtil.hasParentType(delegator, "ProductType", "productTypeId", product.getString("productTypeId"), "parentTypeId", "AGGREGATED")) {
                        GenericValue productAssoc = EntityQuery.use(delegator).from("ProductAssoc").where("productAssocTypeId", "PRODUCT_CONF", "productIdTo", product.getString("productId")).filterByDate().queryFirst();
                        if (productAssoc != null) {
                            productId = productAssoc.getString("productId");
                            configId = product.getString("configId");
                        }
                    }
                } catch (GenericEntityException e) {
                    Debug.logError(e, module);
                }
                if (UtilValidate.isNotEmpty(configId)) {
                    configWrapper = ProductConfigWorker.loadProductConfigWrapper(delegator, dispatcher, configId, productId, productStoreId, prodCatalogId, website, currency, locale, userLogin);
                }
                try {
                    itemIndex = cart.addItemToEnd(productId, amount, quantity, unitPrice, reservStart, reservLength, reservPersons, accommodationMapId, accommodationSpotId, null, null, prodCatalogId, configWrapper, item.getString("orderItemTypeId"), dispatcher, null, unitPrice == null ? null : false, skipInventoryChecks, skipProductChecks);
                } catch (ItemNotFoundException | CartItemModifyException e) {
                    Debug.logError(e, module);
                    return ServiceUtil.returnError(e.getMessage());
                }
            }
            // flag the item w/ the orderItemSeqId so we can reference it
            ShoppingCartItem cartItem = cart.findCartItem(itemIndex);
            cartItem.setIsPromo(item.get("isPromo") != null && "Y".equals(item.getString("isPromo")));
            cartItem.setOrderItemSeqId(item.getString("orderItemSeqId"));
            try {
                cartItem.setItemGroup(cart.addItemGroup(item.getRelatedOne("OrderItemGroup", true)));
            } catch (GenericEntityException e) {
                Debug.logError(e, module);
                return ServiceUtil.returnError(e.getMessage());
            }
            // attach surveyResponseId for each item
            if (UtilValidate.isNotEmpty(surveyResponseResult)) {
                cartItem.setAttribute("surveyResponses", UtilMisc.toList(surveyResponseResult.get("surveyResponseId")));
            }
            // attach addition item information
            cartItem.setStatusId(item.getString("statusId"));
            cartItem.setItemType(item.getString("orderItemTypeId"));
            cartItem.setItemComment(item.getString("comments"));
            cartItem.setQuoteId(item.getString("quoteId"));
            cartItem.setQuoteItemSeqId(item.getString("quoteItemSeqId"));
            cartItem.setProductCategoryId(item.getString("productCategoryId"));
            cartItem.setDesiredDeliveryDate(item.getTimestamp("estimatedDeliveryDate"));
            cartItem.setShipBeforeDate(item.getTimestamp("shipBeforeDate"));
            cartItem.setShipAfterDate(item.getTimestamp("shipAfterDate"));
            cartItem.setShoppingList(item.getString("shoppingListId"), item.getString("shoppingListItemSeqId"));
            cartItem.setIsModifiedPrice("Y".equals(item.getString("isModifiedPrice")));
            cartItem.setName(item.getString("itemDescription"));
            cartItem.setExternalId(item.getString("externalId"));
            cartItem.setListPrice(item.getBigDecimal("unitListPrice"));
            // load order item attributes
            List<GenericValue> orderItemAttributesList = null;
            try {
                orderItemAttributesList = EntityQuery.use(delegator).from("OrderItemAttribute").where("orderId", orderId, "orderItemSeqId", orderItemSeqId).queryList();
                if (UtilValidate.isNotEmpty(orderItemAttributesList)) {
                    for (GenericValue orderItemAttr : orderItemAttributesList) {
                        String name = orderItemAttr.getString("attrName");
                        String value = orderItemAttr.getString("attrValue");
                        cartItem.setOrderItemAttribute(name, value);
                    }
                }
            } catch (GenericEntityException e) {
                Debug.logError(e, module);
                return ServiceUtil.returnError(e.getMessage());
            }
            // load order item contact mechs
            List<GenericValue> orderItemContactMechList = null;
            try {
                orderItemContactMechList = EntityQuery.use(delegator).from("OrderItemContactMech").where("orderId", orderId, "orderItemSeqId", orderItemSeqId).queryList();
                if (UtilValidate.isNotEmpty(orderItemContactMechList)) {
                    for (GenericValue orderItemContactMech : orderItemContactMechList) {
                        String contactMechPurposeTypeId = orderItemContactMech.getString("contactMechPurposeTypeId");
                        String contactMechId = orderItemContactMech.getString("contactMechId");
                        cartItem.addContactMech(contactMechPurposeTypeId, contactMechId);
                    }
                }
            } catch (GenericEntityException e) {
                Debug.logError(e, module);
                return ServiceUtil.returnError(e.getMessage());
            }
            // set the PO number on the cart
            cart.setPoNumber(item.getString("correspondingPoId"));
            // get all item adjustments EXCEPT tax adjustments
            List<GenericValue> itemAdjustments = orh.getOrderItemAdjustments(item);
            if (itemAdjustments != null) {
                for (GenericValue itemAdjustment : itemAdjustments) {
                    if (!isTaxAdjustment(itemAdjustment)) {
                        cartItem.addAdjustment(itemAdjustment);
                    }
                }
            }
        }
        // setup the OrderItemShipGroupAssoc records
        if (UtilValidate.isNotEmpty(orderItems)) {
            int itemIndex = 0;
            for (GenericValue item : orderItems) {
                // if rejected or cancelled ignore, just like above otherwise all indexes will be off by one!
                if ("ITEM_REJECTED".equals(item.getString("statusId")) || "ITEM_CANCELLED".equals(item.getString("statusId"))) {
                    continue;
                }
                List<GenericValue> orderItemAdjustments = orh.getOrderItemAdjustments(item);
                // set the item's ship group info
                List<GenericValue> shipGroupAssocs = orh.getOrderItemShipGroupAssocs(item);
                if (UtilValidate.isNotEmpty(shipGroupAssocs)) {
                    shipGroupAssocs = EntityUtil.orderBy(shipGroupAssocs, UtilMisc.toList("-shipGroupSeqId"));
                }
                for (int g = 0; g < shipGroupAssocs.size(); g++) {
                    GenericValue sgAssoc = shipGroupAssocs.get(g);
                    BigDecimal shipGroupQty = OrderReadHelper.getOrderItemShipGroupQuantity(sgAssoc);
                    if (shipGroupQty == null) {
                        shipGroupQty = BigDecimal.ZERO;
                    }
                    String cartShipGroupIndexStr = sgAssoc.getString("shipGroupSeqId");
                    int cartShipGroupIndex = cart.getShipInfoIndex(cartShipGroupIndexStr);
                    if (cartShipGroupIndex > 0) {
                        cart.positionItemToGroup(itemIndex, shipGroupQty, 0, cartShipGroupIndex, false);
                    }
                    // because the ship groups are setup before loading items, and the ShoppingCart.addItemToEnd
                    // method is called when loading items above and it calls ShoppingCart.setItemShipGroupQty,
                    // this may not be necessary here, so check it first as calling it here with 0 quantity and
                    // such ends up removing cart items from the group, which causes problems later with inventory
                    // reservation, tax calculation, etc.
                    ShoppingCart.CartShipInfo csi = cart.getShipInfo(cartShipGroupIndex);
                    ShoppingCartItem cartItem = cart.findCartItem(itemIndex);
                    if (cartItem == null || cartItem.getQuantity() == null || BigDecimal.ZERO.equals(cartItem.getQuantity()) || shipGroupQty.equals(cartItem.getQuantity())) {
                        Debug.logInfo("In loadCartFromOrder not adding item [" + item.getString("orderItemSeqId") + "] to ship group with index [" + itemIndex + "]; group quantity is [" + shipGroupQty + "] item quantity is [" + (cartItem != null ? cartItem.getQuantity() : "no cart item") + "] cartShipGroupIndex is [" + cartShipGroupIndex + "], csi.shipItemInfo.size(): " + (cartShipGroupIndex < 0 ? 0 : csi.shipItemInfo.size()), module);
                    } else {
                        cart.setItemShipGroupQty(itemIndex, shipGroupQty, cartShipGroupIndex);
                    }
                    List<GenericValue> shipGroupItemAdjustments = EntityUtil.filterByAnd(orderItemAdjustments, UtilMisc.toMap("shipGroupSeqId", cartShipGroupIndexStr));
                    if (cartItem == null || cartShipGroupIndex < 0) {
                        Debug.logWarning("In loadCartFromOrder could not find cart item for itemIndex=" + itemIndex + ", for orderId=" + orderId, module);
                    } else {
                        CartShipItemInfo cartShipItemInfo = csi.getShipItemInfo(cartItem);
                        if (cartShipItemInfo == null) {
                            Debug.logWarning("In loadCartFromOrder could not find CartShipItemInfo for itemIndex=" + itemIndex + ", for orderId=" + orderId, module);
                        } else {
                            List<GenericValue> itemTaxAdj = cartShipItemInfo.itemTaxAdj;
                            for (GenericValue shipGroupItemAdjustment : shipGroupItemAdjustments) {
                                if (isTaxAdjustment(shipGroupItemAdjustment)) {
                                    itemTaxAdj.add(shipGroupItemAdjustment);
                                }
                            }
                        }
                    }
                }
                itemIndex++;
            }
        }
        // set the item seq in the cart
        if (nextItemSeq > 0) {
            try {
                cart.setNextItemSeq(nextItemSeq + 1);
            } catch (GeneralException e) {
                Debug.logError(e, module);
                return ServiceUtil.returnError(e.getMessage());
            }
        }
    }
    if (includePromoItems) {
        for (String productPromoCode : orh.getProductPromoCodesEntered()) {
            cart.addProductPromoCode(productPromoCode, dispatcher);
        }
        for (GenericValue productPromoUse : orh.getProductPromoUse()) {
            cart.addProductPromoUse(productPromoUse.getString("productPromoId"), productPromoUse.getString("productPromoCodeId"), productPromoUse.getBigDecimal("totalDiscountAmount"), productPromoUse.getBigDecimal("quantityLeftInActions"), new HashMap<ShoppingCartItem, BigDecimal>());
        }
    }
    List<GenericValue> adjustments = orh.getOrderHeaderAdjustments();
    // If applyQuoteAdjustments is set to false then standard cart adjustments are used.
    if (!adjustments.isEmpty()) {
        // The cart adjustments are added to the cart
        cart.getAdjustments().addAll(adjustments);
    }
    Map<String, Object> result = ServiceUtil.returnSuccess();
    result.put("shoppingCart", cart);
    return result;
}
Also used : Locale(java.util.Locale) LocalDispatcher(org.apache.ofbiz.service.LocalDispatcher) Matcher(java.util.regex.Matcher) HashMap(java.util.HashMap) CartShipInfo(org.apache.ofbiz.order.shoppingcart.ShoppingCart.CartShipInfo) ProductConfigWrapper(org.apache.ofbiz.product.config.ProductConfigWrapper) CartShipInfo(org.apache.ofbiz.order.shoppingcart.ShoppingCart.CartShipInfo) Timestamp(java.sql.Timestamp) OrderReadHelper(org.apache.ofbiz.order.order.OrderReadHelper) CartShipItemInfo(org.apache.ofbiz.order.shoppingcart.ShoppingCart.CartShipInfo.CartShipItemInfo) GenericValue(org.apache.ofbiz.entity.GenericValue) Pattern(java.util.regex.Pattern) GeneralException(org.apache.ofbiz.base.util.GeneralException) BigDecimal(java.math.BigDecimal) Delegator(org.apache.ofbiz.entity.Delegator) GenericEntityException(org.apache.ofbiz.entity.GenericEntityException) GenericServiceException(org.apache.ofbiz.service.GenericServiceException) EntityExpr(org.apache.ofbiz.entity.condition.EntityExpr)

Example 94 with GeneralException

use of org.apache.ofbiz.base.util.GeneralException in project ofbiz-framework by apache.

the class ProductPromoWorker method doPromotions.

public static void doPromotions(ShoppingCart cart, List<GenericValue> productPromoList, LocalDispatcher dispatcher) {
    if (!cart.getDoPromotions()) {
        return;
    }
    Delegator delegator = cart.getDelegator();
    Timestamp nowTimestamp = UtilDateTime.nowTimestamp();
    // start out by clearing all existing promotions, then we can just add all that apply
    cart.clearAllPromotionInformation();
    // there will be a ton of db access, so just do a big catch entity exception block
    try {
        if (productPromoList == null) {
            if ("SALES_ORDER".equals(cart.getOrderType())) {
                productPromoList = ProductPromoWorker.getProductStorePromotions(cart, nowTimestamp, dispatcher);
            } else {
                productPromoList = ProductPromoWorker.getAgreementPromotions(cart, nowTimestamp, dispatcher);
            }
        }
        // do a calculate only run through the promotions, then order by descending totalDiscountAmount for each promotion
        // NOTE: on this run, with isolatedTestRun passed as false it should not apply any adjustments
        // or track which cart items are used for which promotions, but it will track ProductPromoUseInfo and
        // useLimits; we are basically just trying to run each promo "independently" to see how much each is worth
        runProductPromos(productPromoList, cart, delegator, dispatcher, nowTimestamp, true);
        // NOTE: we can easily recognize the promos for the order total: they are the ones with usage set to 0
        Iterator<ProductPromoUseInfo> promoUses = cart.getProductPromoUseInfoIter();
        List<ProductPromoUseInfo> sortedPromoUses = new ArrayList<>();
        while (promoUses.hasNext()) {
            ProductPromoUseInfo promoUse = promoUses.next();
            sortedPromoUses.add(promoUse);
        }
        Collections.sort(sortedPromoUses);
        List<GenericValue> sortedExplodedProductPromoList = new ArrayList<>(sortedPromoUses.size());
        Map<String, Long> usesPerPromo = new HashMap<>();
        int indexOfFirstOrderTotalPromo = -1;
        for (ProductPromoUseInfo promoUse : sortedPromoUses) {
            GenericValue productPromo = EntityQuery.use(delegator).from("ProductPromo").where("productPromoId", promoUse.getProductPromoId()).cache().queryOne();
            GenericValue newProductPromo = (GenericValue) productPromo.clone();
            if (!usesPerPromo.containsKey(promoUse.getProductPromoId())) {
                usesPerPromo.put(promoUse.getProductPromoId(), 0l);
            }
            long uses = usesPerPromo.get(promoUse.getProductPromoId());
            uses = uses + 1;
            long useLimitPerOrder = (newProductPromo.get("useLimitPerOrder") != null ? newProductPromo.getLong("useLimitPerOrder") : -1);
            if (useLimitPerOrder == -1 || uses < useLimitPerOrder) {
                newProductPromo.set("useLimitPerOrder", uses);
            }
            usesPerPromo.put(promoUse.getProductPromoId(), uses);
            sortedExplodedProductPromoList.add(newProductPromo);
            if (indexOfFirstOrderTotalPromo == -1 && BigDecimal.ZERO.equals(promoUse.getUsageWeight())) {
                indexOfFirstOrderTotalPromo = sortedExplodedProductPromoList.size() - 1;
            }
        }
        if (indexOfFirstOrderTotalPromo == -1) {
            indexOfFirstOrderTotalPromo = sortedExplodedProductPromoList.size() - 1;
        }
        for (GenericValue productPromo : productPromoList) {
            if (hasOrderTotalCondition(productPromo, delegator)) {
                if (!usesPerPromo.containsKey(productPromo.getString("productPromoId"))) {
                    sortedExplodedProductPromoList.add(productPromo);
                }
            } else {
                if (!usesPerPromo.containsKey(productPromo.getString("productPromoId"))) {
                    if (indexOfFirstOrderTotalPromo != -1) {
                        sortedExplodedProductPromoList.add(indexOfFirstOrderTotalPromo, productPromo);
                    } else {
                        sortedExplodedProductPromoList.add(0, productPromo);
                    }
                }
            }
        }
        // okay, all ready, do the real run, clearing the temporary result first...
        cart.clearAllPromotionInformation();
        runProductPromos(sortedExplodedProductPromoList, cart, delegator, dispatcher, nowTimestamp, false);
    } catch (NumberFormatException e) {
        Debug.logError(e, "Number not formatted correctly in promotion rules, not completed...", module);
    } catch (GenericEntityException e) {
        Debug.logError(e, "Error looking up promotion data while doing promotions", module);
    } catch (GeneralException e) {
        Debug.logError(e, "Error running promotions, will ignore: " + e.toString(), module);
    }
}
Also used : GenericValue(org.apache.ofbiz.entity.GenericValue) GeneralException(org.apache.ofbiz.base.util.GeneralException) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) ProductPromoUseInfo(org.apache.ofbiz.order.shoppingcart.ShoppingCart.ProductPromoUseInfo) Timestamp(java.sql.Timestamp) Delegator(org.apache.ofbiz.entity.Delegator) GenericEntityException(org.apache.ofbiz.entity.GenericEntityException)

Example 95 with GeneralException

use of org.apache.ofbiz.base.util.GeneralException in project ofbiz-framework by apache.

the class ShippingEvents method getExternalShipEstimate.

public static BigDecimal getExternalShipEstimate(LocalDispatcher dispatcher, GenericValue storeShipMeth, Map<String, Object> context) throws GeneralException {
    String shipmentCustomMethodId = storeShipMeth.getString("shipmentCustomMethodId");
    Delegator delegator = dispatcher.getDelegator();
    String serviceName = "";
    if (UtilValidate.isNotEmpty(shipmentCustomMethodId)) {
        serviceName = getShipmentCustomMethod(dispatcher.getDelegator(), shipmentCustomMethodId);
    }
    if (UtilValidate.isEmpty(serviceName)) {
        serviceName = storeShipMeth.getString("serviceName");
    }
    // invoke the external shipping estimate service
    BigDecimal externalShipAmt = null;
    if (serviceName != null) {
        String doEstimates = EntityUtilProperties.getPropertyValue("shipment", "shipment.doratecheck", "true", delegator);
        // If all estimates are not turned off, check for the individual one
        if ("true".equals(doEstimates)) {
            String dothisEstimate = EntityUtilProperties.getPropertyValue("shipment", "shipment.doratecheck." + serviceName, "true", delegator);
            if ("false".equals(dothisEstimate))
                serviceName = null;
        } else {
            // Rate checks inhibited
            serviceName = null;
        }
    }
    if (serviceName != null) {
        String shipmentGatewayConfigId = storeShipMeth.getString("shipmentGatewayConfigId");
        String configProps = storeShipMeth.getString("configProps");
        if (UtilValidate.isNotEmpty(serviceName)) {
            // prepare the external service context
            context.put("serviceConfigProps", configProps);
            context.put("shipmentCustomMethodId", shipmentCustomMethodId);
            context.put("shipmentGatewayConfigId", shipmentGatewayConfigId);
            // invoke the service
            Map<String, Object> serviceResp = null;
            try {
                Debug.logInfo("Service : " + serviceName + " / shipmentGatewayConfigId : " + shipmentGatewayConfigId + " / configProps : " + configProps + " -- " + context, module);
                // because we don't want to blow up too big or rollback the transaction when this happens, always have it run in its own transaction...
                serviceResp = dispatcher.runSync(serviceName, context, 0, true);
            } catch (GenericServiceException e) {
                Debug.logError(e, "Shipment Service Error", module);
                throw new GeneralException(e);
            }
            if (ServiceUtil.isError(serviceResp)) {
                String errMsg = "Error getting external shipment cost estimate: " + ServiceUtil.getErrorMessage(serviceResp);
                Debug.logError(errMsg, module);
                throw new GeneralException(errMsg);
            } else if (ServiceUtil.isFailure(serviceResp)) {
                String errMsg = "Failure getting external shipment cost estimate: " + ServiceUtil.getErrorMessage(serviceResp);
                Debug.logError(errMsg, module);
            // should not throw an Exception here, otherwise getShipGroupEstimate would return an error, causing all sorts of services like add or update order item to abort
            } else {
                externalShipAmt = (BigDecimal) serviceResp.get("shippingEstimateAmount");
            }
        }
    }
    return externalShipAmt;
}
Also used : GeneralException(org.apache.ofbiz.base.util.GeneralException) Delegator(org.apache.ofbiz.entity.Delegator) GenericServiceException(org.apache.ofbiz.service.GenericServiceException) BigDecimal(java.math.BigDecimal)

Aggregations

GeneralException (org.apache.ofbiz.base.util.GeneralException)216 GenericValue (org.apache.ofbiz.entity.GenericValue)133 Delegator (org.apache.ofbiz.entity.Delegator)101 Locale (java.util.Locale)81 HashMap (java.util.HashMap)71 GenericEntityException (org.apache.ofbiz.entity.GenericEntityException)68 LocalDispatcher (org.apache.ofbiz.service.LocalDispatcher)68 IOException (java.io.IOException)65 BigDecimal (java.math.BigDecimal)55 GenericServiceException (org.apache.ofbiz.service.GenericServiceException)54 Writer (java.io.Writer)29 LinkedList (java.util.LinkedList)29 Map (java.util.Map)29 Timestamp (java.sql.Timestamp)26 StringWriter (java.io.StringWriter)19 Environment (freemarker.core.Environment)15 HttpServletRequest (javax.servlet.http.HttpServletRequest)14 ShoppingCart (org.apache.ofbiz.order.shoppingcart.ShoppingCart)14 HttpSession (javax.servlet.http.HttpSession)13 ParserConfigurationException (javax.xml.parsers.ParserConfigurationException)13