Пример #1
1
 private function initializeQuoteItems()
 {
     foreach ($this->proxyOrder->getItems() as $item) {
         $this->clearQuoteItemsCache();
         /** @var $quoteItemBuilder Ess_M2ePro_Model_Magento_Quote_Item */
         $quoteItemBuilder = Mage::getModel('M2ePro/Magento_Quote_Item');
         $quoteItemBuilder->init($this->quote, $item);
         $product = $quoteItemBuilder->getProduct();
         $request = $quoteItemBuilder->getRequest();
         // ----------------------------
         $productOriginalPrice = (double) $product->getPrice();
         $price = $item->getBasePrice();
         $product->setPrice($price);
         $product->setSpecialPrice($price);
         // ----------------------------
         // see Mage_Sales_Model_Observer::substractQtyFromQuotes
         $this->quote->setItemsCount($this->quote->getItemsCount() + 1);
         $this->quote->setItemsQty((double) $this->quote->getItemsQty() + $request->getQty());
         $result = $this->quote->addProduct($product, $request);
         if (is_string($result)) {
             throw new Exception($result);
         }
         $quoteItem = $this->quote->getItemByProduct($product);
         if ($quoteItem !== false) {
             $weight = $product->getTypeInstance()->getWeight();
             if ($product->isConfigurable()) {
                 // hack: for child product weight was not load
                 $simpleProductId = $product->getCustomOption('simple_product')->getProductId();
                 $weight = Mage::getResourceModel('catalog/product')->getAttributeRawValue($simpleProductId, 'weight', 0);
             }
             $quoteItem->setStoreId($this->quote->getStoreId());
             $quoteItem->setOriginalCustomPrice($item->getPrice());
             $quoteItem->setOriginalPrice($productOriginalPrice);
             $quoteItem->setBaseOriginalPrice($productOriginalPrice);
             $quoteItem->setWeight($weight);
             $quoteItem->setNoDiscount(1);
             $giftMessageId = $quoteItemBuilder->getGiftMessageId();
             if (!empty($giftMessageId)) {
                 $quoteItem->setGiftMessageId($giftMessageId);
             }
             $quoteItem->setAdditionalData($quoteItemBuilder->getAdditionalData($quoteItem));
         }
     }
 }
Пример #2
0
 /**
  * Initialize quote items objects
  *
  * @throws Exception
  */
 private function initializeQuoteItems()
 {
     foreach ($this->proxyOrder->getItems() as $item) {
         $this->clearQuoteItemsCache();
         /** @var $quoteItemBuilder Ess_M2ePro_Model_Magento_Quote_Item */
         $quoteItemBuilder = Mage::getModel('M2ePro/Magento_Quote_Item');
         $quoteItemBuilder->init($this->quote, $item);
         $product = $quoteItemBuilder->getProduct();
         $request = $quoteItemBuilder->getRequest();
         // see Mage_Sales_Model_Observer::substractQtyFromQuotes
         $this->quote->setItemsCount($this->quote->getItemsCount() + 1);
         $this->quote->setItemsQty((double) $this->quote->getItemsQty() + $request->getQty());
         $result = $this->quote->addProduct($product, $request);
         if (is_string($result)) {
             throw new Exception($result);
         }
         $quoteItem = $this->quote->getItemByProduct($product);
         if ($quoteItem !== false) {
             $quoteItem->setOriginalCustomPrice($item->getPrice());
             $quoteItem->setNoDiscount(1);
             $quoteItem->setGiftMessageId($quoteItemBuilder->getGiftMessageId());
             $quoteItem->setAdditionalData($quoteItemBuilder->getAdditionalData($quoteItem));
         }
     }
 }
Пример #3
0
 /**
  * @magentoDataFixture Mage/Catalog/_files/product_virtual.php
  * @magentoDataFixture Mage/Sales/_files/quote.php
  */
 public function testCollectTotalsWithVirtual()
 {
     $quote = new Mage_Sales_Model_Quote();
     $quote->load('test01', 'reserved_order_id');
     $product = new Mage_Catalog_Model_Product();
     $product->load(21);
     $quote->addProduct($product);
     $quote->collectTotals();
     $this->assertEquals(2, $quote->getItemsQty());
     $this->assertEquals(1, $quote->getVirtualItemsQty());
     $this->assertEquals(20, $quote->getGrandTotal());
     $this->assertEquals(20, $quote->getBaseGrandTotal());
 }
Пример #4
0
 /**
  * Initialize quote items objects
  *
  * @throws Exception
  */
 private function initializeQuoteItems()
 {
     foreach ($this->proxyOrder->getItems() as $item) {
         /** @var $quoteItemBuilder Ess_M2ePro_Model_Magento_Quote_Item */
         $quoteItemBuilder = Mage::getModel('M2ePro/Magento_Quote_Item');
         $quoteItemBuilder->setQuoteBuilder($this)->setProxyItem($item);
         $product = $quoteItemBuilder->getProduct();
         $request = $quoteItemBuilder->getRequest();
         $this->quote->setItemsCount($this->quote->getItemsCount() + 1);
         $this->quote->setItemsQty((double) $this->quote->getItemsQty() + $request->getQty());
         $result = $this->quote->addProduct($product, $request);
         if (is_string($result)) {
             throw new Exception($result);
         }
         $quoteItem = $this->quote->getItemByProduct($product);
         if ($quoteItem !== false) {
             $quoteItem->setOriginalCustomPrice($quoteItemBuilder->getChannelCurrencyPrice());
             $quoteItem->setNoDiscount(1);
             $quoteItem->setGiftMessageId($quoteItemBuilder->getGiftMessageId());
             $quoteItem->setAdditionalData($quoteItemBuilder->getAdditionalData($quoteItem));
         }
     }
 }
Пример #5
0
 protected function _addProductsToQuote($productInCardList, $paramsArray)
 {
     $productInCardList = $this->_concatenateProductsInQuote($productInCardList);
     foreach ($productInCardList as $productItem) {
         $product = Mage::getModel('catalog/product')->load($productItem['id']);
         if (!$product->getId()) {
             throw new LogicException('Product does not exist. Probably it was deleted.');
         }
         if ($product->getStatus() === Mage_Catalog_Model_Product_Status::STATUS_DISABLED) {
             throw new LogicException('Product is disabled.');
         }
         $productTypeId = $product->getTypeId();
         if ($productTypeId == Ess_M2ePro_Model_MagentoProduct::TYPE_GROUPED) {
             // Grouped product converted to assigned simple
             if (!isset($productItem['options'])) {
                 throw new LogicException('The item does not have options. At the current version, Order Import for grouped product supports only multi variation listing.');
             }
             $product = $this->_getRelatedProductFromGroupedForEbayData($product, $productItem);
             if (is_null($product)) {
                 throw new LogicException('There is no associated products found for grouped product.');
             } else {
                 $productTypeId = $product->getTypeId();
             }
         }
         $productItem['price'] = $this->_getConvertedPrice($productItem['price']);
         $request = new Varien_Object();
         $request->setQty($productItem['qty']);
         switch ($productTypeId) {
             case Ess_M2ePro_Model_MagentoProduct::TYPE_SIMPLE:
                 $haveRequiredOptionsInstant = $product->getTypeInstance(true)->hasRequiredOptions($product);
                 $haveRequiredOptions = $product->hasRequiredOptions();
                 if ($haveRequiredOptions && !$product->getRequiredOptions()) {
                     $haveRequiredOptions = false;
                     // important: possible incorect behavior
                 }
                 if ($haveRequiredOptionsInstant || $haveRequiredOptions || $this->_checkSimpleProductHasRequiredCustomOptions($product)) {
                     $customOptionsData = array();
                     if (isset($productItem['options']) && count($productItem['options'])) {
                         // Have multivariation data for simple product
                         // Use to set Custom Options data
                         $customOptionsData = $this->_getCustomOptionsForEbayData($productItem);
                         $this->_addNotifyMessage('Product has <b>Required Options</b>. Selected Options Values are taken from eBay Multi Variation Data');
                     } else {
                         // No multivariation data, set first required option
                         $customOptionsData = $this->_getRandomCustomOptions($productItem);
                         $this->_addNotifyMessage('Product has <b>Required Options</b>. First option value is selected.');
                     }
                     $request->setOptions($customOptionsData['options']);
                     // Dec price for percent change (after apply percent price inc = need price)
                     $productItem['price'] = $productItem['price'] / (1 + $customOptionsData['price_change_percent'] / 100);
                     // Change for custom options price. price_change_fixed low that 0 when option inc price, more 0 - when inc
                     $productItem['price'] += $customOptionsData['price_change_fixed'] / (1 + $customOptionsData['price_change_percent'] / 100);
                 }
                 // end of $haveRequriedOptions
                 break;
             case Ess_M2ePro_Model_MagentoProduct::TYPE_CONFIGURABLE:
                 if (!isset($productItem['options'])) {
                     throw new LogicException('The item does not have options. At the current version, Order Import for configurable product supports only multi variation listing.');
                 }
                 $configurableOptions = $this->_getConfigurableAttributeForEbayData($productItem);
                 // Set selected attributes
                 $request->setSuperAttribute($configurableOptions['options']);
                 // Each option value can change total price value, remove
                 // this changes for equal: order price = eBay sold price
                 $productItem['price'] += $configurableOptions['price_change'];
                 break;
             case Ess_M2ePro_Model_MagentoProduct::TYPE_BUNDLE:
                 if (!isset($productItem['options'])) {
                     throw new LogicException('The item does not have options. At the current version, Order Import for bundle product supports only multi variation listing.');
                 }
                 $bundleOptions = $this->_getBundleOptionsForEbayData($productItem);
                 $request->setBundleOption($bundleOptions['options']);
                 //                    $bundleQty = array();
                 //                    foreach ($bundleOptions['options'] as $optionId => $optionValue) {
                 //                        $bundleQty[$optionId] = $productItem['qty'];
                 //                    }
                 //                    $request->setBundleOptionQty($bundleQty);
                 //                    $request->setQty(1);
                 $this->_addNotifyMessage('Price for Bundle item is taken from Magento store.');
                 break;
             default:
                 throw new LogicException('At the current version, Order Import does not support product type: ' . $productTypeId . '');
         }
         $product->setPrice($productItem['price']);
         $product->setSpecialPrice($productItem['price']);
         $this->_initProductTaxClassId($product, $paramsArray['taxPercent']);
         $result = $this->_quote->addProduct($product, $request);
         if (is_string($result)) {
             throw new Exception($result);
         }
         // TODO: ugly hack
         //if ($productTypeId == Ess_M2ePro_Model_MagentoProduct::TYPE_BUNDLE ||
         //    Ess_M2ePro_Model_MagentoProduct::TYPE_CONFIGURABLE ||
         //    Ess_M2ePro_Model_MagentoProduct::TYPE_GROUPED) {
         foreach ($paramsArray['products'] as $tempProduct) {
             if ($tempProduct['id'] == $product->getId()) {
                 $tempQuoteItem = $this->_quote->getItemByProduct($product);
                 if ($tempQuoteItem !== false) {
                     $tempQuoteItem->setNoDiscount(1);
                     $tempQuoteItem->setOriginalCustomPrice($this->_getConvertedPrice($tempProduct['price']));
                 }
                 break;
             }
         }
         //}
     }
     // foreach $productInCardList
 }
Пример #6
0
 /**
  * Create a resource model
  *
  * @param Mage_Sales_Model_Quote $quote
  * @param array                  $data
  *
  * @return Mage_Sales_Model_Quote_Item
  */
 public function createResource(Mage_Sales_Model_Quote $quote, array $data)
 {
     // Store current state
     $actionType = $this->getActionType();
     $operation = $this->getOperation();
     // Change state
     $this->setActionType(self::ACTION_TYPE_ENTITY);
     $this->setOperation(self::OPERATION_CREATE);
     // Filter raw incoming data
     $data = $this->getFilter()->in($data);
     // Map data keys
     $data = $this->mapAttributes($data);
     // Validate we have a SKU
     if (!isset($data['sku'])) {
         $this->_critical('Missing SKU', Mage_Api2_Model_Server::HTTP_BAD_REQUEST);
     }
     // Load product based on SKU
     /** @var Mage_Catalog_Model_Product $product */
     $product = Mage::getModel('catalog/product')->setStoreId(Mage::app()->getStore()->getId())->load(Mage::getResourceModel('catalog/product')->getIdBySku($data['sku']));
     // If there is no product with that SKU, throw an error
     if (!$product->getId()) {
         $this->_critical('Invalid SKU ' . $data['sku'], Mage_Api2_Model_Server::HTTP_BAD_REQUEST);
     }
     // If the SKU is not enabled, throw an error ("isInStock" is a badly named method)
     if (!$product->isInStock()) {
         $this->_critical('Invalid SKU ' . $data['sku'], Mage_Api2_Model_Server::HTTP_BAD_REQUEST);
     }
     // If the SKU is not visible for the current website, throw an error
     if (!$product->isVisibleInSiteVisibility()) {
         $this->_critical('Invalid SKU ' . $data['sku'], Mage_Api2_Model_Server::HTTP_BAD_REQUEST);
     }
     if (!Mage::app()->isSingleStoreMode()) {
         // If the SKU is not available for the current website, throw an error
         if (!is_array($product->getWebsiteIds()) || !in_array(Mage::app()->getStore()->getWebsiteId(), $product->getWebsiteIds())) {
             $this->_critical('Invalid SKU ' . $data['sku'], Mage_Api2_Model_Server::HTTP_BAD_REQUEST);
         }
     }
     // Ensure we have a quantity
     if (!isset($data['qty'])) {
         $data['qty'] = 1;
     }
     $data['qty'] = floatval($data['qty']);
     // Ensure we have a min quantity if required
     if (!$quote->hasProductId($product->getId()) && $product->getStockItem()) {
         $minimumQty = floatval($product->getStockItem()->getMinSaleQty());
         if ($minimumQty > 0.0 && $data['qty'] < $minimumQty) {
             $data['qty'] = $minimumQty;
         }
     }
     // Add product to quote
     try {
         $product->setSkipCheckRequiredOption(true);
         $resource = $quote->addProduct($product, new Varien_Object($data));
         // This is to work around a bug in Mage_Sales_Model_Quote::addProductAdvanced
         // The method incorrectly returns $item when it SHOULD return $parentItem
         if ($resource instanceof Mage_Sales_Model_Quote_Item && $resource->getParentItem()) {
             $resource = $resource->getParentItem();
         }
     } catch (Exception $e) {
         $resource = $e->getMessage();
     }
     // Check for errors
     if (is_string($resource)) {
         $this->_critical($resource, Mage_Api2_Model_Server::HTTP_BAD_REQUEST);
     }
     // Restore old state
     $this->setActionType($actionType);
     $this->setOperation($operation);
     // Return updated resource
     return $resource;
 }
Пример #7
0
 /**
  * Apply newly added products to quote
  *
  * @param Mage_Sales_Model_Quote $quote
  * @param $data
  * @return $this
  */
 public function addNewItems(Mage_Sales_Model_Quote $quote, $data)
 {
     foreach ($data as $productId => $params) {
         $product = Mage::getModel('catalog/product')->setStoreId($quote->getStoreId())->load($productId);
         if (!$product || !$product->getId()) {
             continue;
         }
         //            if (!$quote->getItemByProduct($product))
         //            {
         if (!isset($params['product'])) {
             $params['product'] = $product->getId();
         }
         $newQuoteItem = $quote->addProduct($product, new Varien_Object($params));
         /** @var Mage_Sales_Model_Quote_Item $item */
         //$item = $quote->getItemByProduct($product);
         //            } else {
         //                $item = $quote->getItemByProduct($product);
         //                if (isset($params['qty'])) {
         //                    $qty = $item->getQty();
         //                    $item->setQty($params['qty']);
         //                }
         //                $item->save();
         //            }
     }
     if (Mage::registry('orderspro_order')) {
         Mage::helper('mageworx_orderspro/edit')->addPendingChanges(Mage::registry('orderspro_order')->getId(), array('product_to_add' => array()));
     }
     return $this;
 }
Пример #8
0
 /**
  * @param Mage_Sales_Model_Quote $quote
  *
  * @return Mage_Sales_Model_Quote
  */
 protected function _setQuoteVirtualItem(Mage_Sales_Model_Quote $quote)
 {
     if (!count($this->_virtualObjectStack)) {
         return $quote;
     }
     $quote->setIsSuperMode(true);
     foreach ($this->_virtualObjectStack as $obj) {
         /* @var $obj Varien_Object */
         $amountWithTax = $obj->getUnitAmountWithTax();
         /* @var $merged Mage_Catalog_Model_Product */
         $merged = $this->_getCouponHelper()->createProductFromShopgateCoupon($obj);
         /* @var $quoteItem Mage_Sales_Model_Quote_Item */
         $quoteItem = $quote->addProduct($merged, $obj->getQty());
         $quoteItem->setCustomPrice($amountWithTax);
         $quoteItem->setOriginalPrice($amountWithTax);
         $quoteItem->setOriginalCustomPrice($amountWithTax);
         $quoteItem->setNoDiscount(true);
         $quoteItem->setRowWeight(0);
         $quoteItem->setWeeeTaxApplied(serialize(array()));
     }
     return $quote;
 }
Пример #9
0
 /**
  * Initialize creation data from existing order Item
  *
  * @param Mage_Sales_Model_Order_Item $orderItem
  * @param int $qty
  * @return Mage_Sales_Model_Quote_Item | string
  */
 protected function initFromOrderItem(Mage_Sales_Model_Quote $quote, Mage_Sales_Model_Order_Item $orderItem, $qty, $storeId)
 {
     if (!$orderItem->getId()) {
         return $this;
     }
     $product = Mage::getModel('catalog/product')->setStoreId($storeId)->load($orderItem->getProductId());
     if ($product->getId()) {
         $product->setSkipCheckRequiredOption(true);
         $buyRequest = $orderItem->getBuyRequest();
         if (is_numeric($qty)) {
             $buyRequest->setQty($qty);
         }
         $item = $quote->addProduct($product, $buyRequest);
         if (is_string($item)) {
             return $item;
         }
         if ($additionalOptions = $orderItem->getProductOptionByCode('additional_options')) {
             $item->addOption(new Varien_Object(array('product' => $item->getProduct(), 'code' => 'additional_options', 'value' => serialize($additionalOptions))));
         }
         Mage::dispatchEvent('sales_convert_order_item_to_quote_item', array('order_item' => $orderItem, 'quote_item' => $item));
         return $item;
     }
     return $this;
 }