/** * @param int $storeId * @return Shopgate_Framework_Model_Config */ public function getConfig($storeId = null) { if (!$this->_config) { $this->_config = Mage::getModel('shopgate/config'); $this->_config->loadConfig($storeId); } return $this->_config; }
/** * full cancel of the order at shopgate * $data["order"] should set with an object of Mage_Sales_Model_Order * called on event "order_cancel_after" * called from Mage_Sales_Model_Order::cancel() * Uses the cancle_order action in ShopgateMerchantApi * * @see http://wiki.shopgate.com/Merchant_API_cancel_order * @param Varien_Event_Observer $observer * @return bool */ public function cancelOrder(Varien_Event_Observer $observer) { /* @var $order Mage_Sales_Model_Order */ $order = $observer->getEvent()->getOrder(); /* @var $shopgateOrder Shopgate_Framework_Model_Shopgate_Order */ $shopgateOrder = Mage::getModel("shopgate/shopgate_order")->load($order->getId(), "order_id"); if (!$shopgateOrder->getId()) { return true; } if ($order instanceof Mage_Sales_Model_Order) { try { $orderNumber = $shopgateOrder->getShopgateOrderNumber(); $this->_initMerchantApi($order->getStoreId()); // Do nothing if plugin is not active for this store if (!Mage::getStoreConfig(Shopgate_Framework_Model_Config::XML_PATH_SHOPGATE_ACTIVE, $this->_config->getStoreViewId())) { return true; } if (!$this->_config->isValidConfig()) { return true; } $cancellationItems = array(); $qtyCancelled = 0; $rd = $shopgateOrder->getShopgateOrderObject(); $orderItems = $order->getItemsCollection(); $rdItem = false; foreach ($orderItems as $orderItem) { /** @var $orderItem Mage_Sales_Model_Order_Item */ if ($rd instanceof ShopgateOrder) { $rdItem = $this->_findItemByProductId($rd->getItems(), $orderItem->getData('product_id')); } if ($orderItem->getProductType() != Mage_Catalog_Model_Product_Type::TYPE_CONFIGURABLE && $orderItem->getQtyCanceled() + $orderItem->getQtyRefunded() > 0 && !$orderItem->getIsVirtual() && $rdItem) { $cancellationItems[] = array("item_number" => $rdItem->getItemNumber(), "quantity" => intval($orderItem->getQtyCanceled()) + intval($orderItem->getQtyRefunded())); $qtyCancelled += intval($orderItem->getQtyCanceled()) + intval($orderItem->getQtyRefunded()); } } if (count($orderItems) > 0 && empty($cancellationItems)) { $order->addStatusHistoryComment('[SHOPGATE] Notice: Credit memo was not sent to Shopgate because no product quantity was affected.'); $order->save(); return true; } $fullCancellation = empty($cancellationItems); $fullCancellation = $fullCancellation || $qtyCancelled == $order->getTotalQtyOrdered(); $cancelShippingCosts = !$shopgateOrder->hasShippedItems($order); /** @var Mage_Sales_Model_Order_Creditmemo $creditMemo */ $creditMemo = $observer->getEvent()->getCreditMemo(); if ($creditMemo) { if ($creditMemo->getShippingAmount() == $order->getShippingAmount()) { $cancelShippingCosts = true; } else { $cancelShippingCosts = false; } } $this->_merchantApi->cancelOrder($shopgateOrder->getShopgateOrderNumber(), $fullCancellation, $cancellationItems, $cancelShippingCosts, "Order was cancelled in Shopsystem!"); Mage::getSingleton('core/session')->addSuccess(Mage::helper("shopgate")->__("[SHOPGATE] Order successfully cancelled at Shopgate.")); $shopgateOrder->setIsCancellationSentToShopgate(true); $shopgateOrder->save(); if (!$shopgateOrder->getIsSentToShopgate() && !$this->_completeShipping($shopgateOrder, $order)) { $this->_logShopgateError("! (#{$orderNumber}) not sent to shopgate and shipping not complete", ShopgateLogger::LOGTYPE_ERROR); } } catch (ShopgateMerchantApiException $e) { if ($e->getCode() == "222") { // order already canceled in shopgate $shopgateOrder->setIsCancellationSentToShopgate(true); $shopgateOrder->save(); } else { // Received error from shopgate server Mage::getSingleton('core/session')->addError(Mage::helper("shopgate")->__("[SHOPGATE] An error occured while trying to cancel the order at Shopgate.<br />Please contact Shopgate support.")); Mage::getSingleton('core/session')->addError("Error: {$e->getCode()} - {$e->getMessage()}"); $this->_logShopgateError("! (#{$orderNumber}) SMA-Error on cancel order! Message: {$e->getCode()} -\n {$e->getMessage()}", ShopgateLogger::LOGTYPE_ERROR); $this->_logShopgateError("! (#{$orderNumber}) SMA-Error on cancel order! Message: {$e->getCode()} -\n {$e->getMessage()}", ShopgateLogger::LOGTYPE_DEBUG); } } catch (Exception $e) { Mage::getSingleton('core/session')->addError(Mage::helper("shopgate")->__("[SHOPGATE] An unknown error occured!<br />Please contact Shopgate support.")); $this->_logShopgateError("! (#{$orderNumber}) SMA-Error on cancel order! Message: {$e->getCode()} -\n {$e->getMessage()}", ShopgateLogger::LOGTYPE_ERROR); $this->_logShopgateError("! (#{$orderNumber}) SMA-Error on cancel order! Message: {$e->getCode()} -\n {$e->getMessage()}", ShopgateLogger::LOGTYPE_DEBUG); } } }
/** * Get cached header js for redirect or load and save to cache * * @param $type string * @param $objId string|int * @param $automaticRedirect * @return mixed|string|void */ protected function _getCachedJsHeaderByType($type, $objId, $automaticRedirect) { $storeViewId = $this->_config->getStoreViewId(); switch ($type) { case self::CATEGORY: $cacheKey = $storeViewId . '_sg_mobile_category_' . $objId . '_redirect_type_' . intval($automaticRedirect); break; case self::PRODUCT: $cacheKey = $storeViewId . '_sg_mobile_item_' . $objId . '_redirect_type_' . intval($automaticRedirect); break; case self::PAGE: $cacheKey = $storeViewId . '_sg_mobile_page_' . $objId . '_redirect_type_' . intval($automaticRedirect); break; case self::SEARCH: $cacheKey = $storeViewId . '_sg_mobile_catalogsearch_' . md5($objId) . '_redirect_type_' . intval($automaticRedirect); break; case self::INDEX: $cacheKey = $storeViewId . '_sg_mobile_index_redirect_type_' . intval($automaticRedirect); break; default: $cacheKey = $storeViewId . '_sg_mobile_default_type_' . intval($automaticRedirect); break; } $cache = Mage::app()->getCacheInstance(); $value = $cache->load($cacheKey); if ($value !== false) { $jsHeader = unserialize($value); } else { $builder = new ShopgateBuilder($this->_config); $shopgateRedirect = $builder->buildRedirect(); if (!in_array(Mage::app()->getRequest()->getControllerName(), array(self::CATEGORY, self::PRODUCT, self::SEARCH, self::INDEX)) && !Mage::getStoreConfig(Shopgate_Framework_Model_Config::XML_PATH_SHOPGATE_ENABLE_DEFAULT_REDIRECT)) { $shopgateRedirect->suppressRedirect(); } $disabledRoutes = explode(',', Mage::getStoreConfig(Shopgate_Framework_Model_Config::XML_PATH_SHOPGATE_DISABLE_REDIRECT_ROUTES)); $route = Mage::app()->getRequest()->getRouteName(); if (in_array($route, $disabledRoutes)) { $shopgateRedirect->suppressRedirect(); } $disabledControllers = explode(',', Mage::getStoreConfig(Shopgate_Framework_Model_Config::XML_PATH_SHOPGATE_DISABLE_REDIRECT_CONTROLLERS)); $controllerName = Mage::app()->getRequest()->getControllerName(); if (in_array($controllerName, $disabledControllers)) { $shopgateRedirect->suppressRedirect(); } if ($controllerName == 'product') { $productId = Mage::app()->getRequest()->getParam('id'); $disabledProducts = explode(',', Mage::getStoreConfig(Shopgate_Framework_Model_Config::XML_PATH_SHOPGATE_DISABLE_REDIRECT_PRODUCTS)); if (in_array($productId, $disabledProducts)) { $shopgateRedirect->suppressRedirect(); } } if ($controllerName == 'category') { $categoryId = Mage::app()->getRequest()->getParam('id'); $disabledCategories = explode(',', Mage::getStoreConfig(Shopgate_Framework_Model_Config::XML_PATH_SHOPGATE_DISABLE_REDIRECT_CATEGORIES)); if (in_array($categoryId, $disabledCategories)) { $shopgateRedirect->suppressRedirect(); } } switch ($type) { case self::CATEGORY: $jsHeader = $shopgateRedirect->buildScriptCategory($objId, $automaticRedirect); break; case self::PRODUCT: $jsHeader = $shopgateRedirect->buildScriptItem($objId, $automaticRedirect); break; case self::PAGE: $jsHeader = $shopgateRedirect->buildScriptCms($objId, $automaticRedirect); break; case self::SEARCH: $jsHeader = $shopgateRedirect->buildScriptSearch($objId, $automaticRedirect); break; case self::INDEX: $jsHeader = $shopgateRedirect->buildScriptShop($automaticRedirect); break; default: $jsHeader = $shopgateRedirect->buildScriptDefault($automaticRedirect); break; } $cache->save(serialize($jsHeader), $cacheKey, array('shopgate_mobile_redirect', Mage_Core_Model_Layout_Update::LAYOUT_GENERAL_CACHE_TAG), 7200); } return $jsHeader; }