Version Notes
* Improved feed generation
Download this release
Release Info
| Developer | Christiaan de Ridder |
| Extension | Tritac_ChannelEngine |
| Version | 5.0.2 |
| Comparing to | |
| See all releases | |
Code changes from version 4.6.0 to 5.0.2
- app/code/community/Tritac/ChannelEngine/Block/Head.php +3 -3
- app/code/community/Tritac/ChannelEngine/Helper/Data.php +59 -119
- app/code/community/Tritac/ChannelEngine/Helper/Feed.php +528 -0
- app/code/community/Tritac/ChannelEngine/Model/Loader.php +41 -3
- app/code/community/Tritac/ChannelEngine/Model/Observer.php +15 -448
- app/code/community/Tritac/ChannelEngine/controllers/Adminhtml/GenerateController.php +2 -2
- app/code/community/Tritac/ChannelEngine/etc/config.xml +2 -2
- lib/ChannelEngine/composer.json +1 -1
- package.xml +6 -6
app/code/community/Tritac/ChannelEngine/Block/Head.php
CHANGED
|
@@ -4,10 +4,10 @@ class Tritac_ChannelEngine_Block_Head extends Mage_Core_Block_Template
|
|
| 4 |
public function getAccountName() {
|
| 5 |
|
| 6 |
$storeId = Mage::app()->getStore()->getId();
|
| 7 |
-
$config = Mage::helper('channelengine')->
|
| 8 |
|
| 9 |
-
if(!isset($config[$storeId]) || empty($config[$storeId]['tenant'])) return false;
|
| 10 |
|
| 11 |
-
return $config[$storeId]['tenant'];
|
| 12 |
}
|
| 13 |
}
|
| 4 |
public function getAccountName() {
|
| 5 |
|
| 6 |
$storeId = Mage::app()->getStore()->getId();
|
| 7 |
+
$config = Mage::helper('channelengine')->getConfig($storeId);
|
| 8 |
|
| 9 |
+
if(!isset($config['general'][$storeId]) || empty($config['general'][$storeId]['tenant'])) return false;
|
| 10 |
|
| 11 |
+
return $config['general'][$storeId]['tenant'];
|
| 12 |
}
|
| 13 |
}
|
app/code/community/Tritac/ChannelEngine/Helper/Data.php
CHANGED
|
@@ -1,130 +1,70 @@
|
|
| 1 |
<?php
|
| 2 |
-
class Tritac_ChannelEngine_Helper_Data extends Mage_Core_Helper_Abstract
|
|
|
|
|
|
|
| 3 |
|
| 4 |
-
|
| 5 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 6 |
|
| 7 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 8 |
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 15 |
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
* It always comes without a trailing slash.
|
| 19 |
-
*
|
| 20 |
-
* @return string
|
| 21 |
-
*/
|
| 22 |
-
public function getVendorDirectoryPath()
|
| 23 |
-
{
|
| 24 |
-
$path = (string) Mage::getConfig()->getNode('global/composer_autoloader/path');
|
| 25 |
-
if (!$path) {
|
| 26 |
-
$path = self::DEFAULT_PATH;
|
| 27 |
-
}
|
| 28 |
-
$path = str_replace('/', DS, $path);
|
| 29 |
-
$path = str_replace('{{basedir}}', Mage::getBaseDir(), $path);
|
| 30 |
-
$path = str_replace('{{libdir}}', Mage::getBaseDir('lib'), $path);
|
| 31 |
-
$path = rtrim($path, DS);
|
| 32 |
-
return realpath($path);
|
| 33 |
-
}
|
| 34 |
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
}
|
| 47 |
-
if (file_exists($path . DS . $filename)) {
|
| 48 |
-
require_once($path . DS . $filename);
|
| 49 |
-
}
|
| 50 |
-
}
|
| 51 |
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
foreach(Mage::app()->getStores() as $_store) {
|
| 62 |
-
$this->_config[$_store->getId()] = Mage::getStoreConfig('channelengine', $_store->getId());
|
| 63 |
-
}
|
| 64 |
-
}
|
| 65 |
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
}else{
|
| 70 |
-
return $this->_config[$storeId];
|
| 71 |
-
}
|
| 72 |
-
}
|
| 73 |
|
| 74 |
-
|
| 75 |
-
|
|
|
|
| 76 |
|
| 77 |
-
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
*/
|
| 82 |
-
public function getGeneralConfig()
|
| 83 |
-
{
|
| 84 |
-
$result = array();
|
| 85 |
-
|
| 86 |
-
foreach($this->getConfig() as $storeId => $storeConfig)
|
| 87 |
-
{
|
| 88 |
-
if(isset($storeConfig['general']))
|
| 89 |
-
{
|
| 90 |
-
$result[$storeId] = $storeConfig['general'];
|
| 91 |
-
}
|
| 92 |
-
}
|
| 93 |
-
return $result;
|
| 94 |
-
}
|
| 95 |
-
|
| 96 |
-
/**
|
| 97 |
-
* Check required general config data
|
| 98 |
-
*
|
| 99 |
-
* @param null $storeId
|
| 100 |
-
* @return bool
|
| 101 |
-
*/
|
| 102 |
-
public function checkGeneralConfig($storeId = null)
|
| 103 |
-
{
|
| 104 |
-
$config = Mage::getStoreConfig('channelengine/general', $storeId);
|
| 105 |
-
return (empty($config['api_key']) || empty($config['tenant'])) ? false : true;
|
| 106 |
-
}
|
| 107 |
-
|
| 108 |
-
/**
|
| 109 |
-
* Get store expected shipment text
|
| 110 |
-
*
|
| 111 |
-
* @param $storeId
|
| 112 |
-
* @return DateTime
|
| 113 |
-
*/
|
| 114 |
-
public function getExpectedShipmentDate($storeId)
|
| 115 |
-
{
|
| 116 |
-
$config = $this->getConfig($storeId);
|
| 117 |
-
|
| 118 |
-
$weekdays = (int) $config['optional']['expected_date'];
|
| 119 |
-
if($weekdays <= 0)
|
| 120 |
-
$weekdays = $this->_defaultTimeToShip;
|
| 121 |
-
|
| 122 |
-
$expectedDate = date("Y-m-d", strtotime("{$weekdays} weekdays"));
|
| 123 |
-
return new DateTime($expectedDate);
|
| 124 |
-
}
|
| 125 |
-
|
| 126 |
-
public function getExtensionVersion()
|
| 127 |
-
{
|
| 128 |
-
return (string) Mage::getConfig()->getNode()->modules->Tritac_ChannelEngine->version;
|
| 129 |
-
}
|
| 130 |
}
|
| 1 |
<?php
|
| 2 |
+
class Tritac_ChannelEngine_Helper_Data extends Mage_Core_Helper_Abstract
|
| 3 |
+
{
|
| 4 |
+
private $config = array();
|
| 5 |
|
| 6 |
+
public function __construct()
|
| 7 |
+
{
|
| 8 |
+
foreach(Mage::app()->getStores() as $store)
|
| 9 |
+
{
|
| 10 |
+
$this->config[$store->getId()] = Mage::getStoreConfig('channelengine', $store->getId());
|
| 11 |
+
}
|
| 12 |
+
}
|
| 13 |
|
| 14 |
+
/**
|
| 15 |
+
* Default expected shipment time (in weekdays)
|
| 16 |
+
*
|
| 17 |
+
* @var int
|
| 18 |
+
*/
|
| 19 |
+
protected $_defaultTimeToShip = 5;
|
| 20 |
|
| 21 |
+
|
| 22 |
+
/**
|
| 23 |
+
* Get extension general config
|
| 24 |
+
*
|
| 25 |
+
* @param null $storeId
|
| 26 |
+
* @return array
|
| 27 |
+
*/
|
| 28 |
+
public function getConfig($storeId = null)
|
| 29 |
+
{
|
| 30 |
+
if(is_null($storeId)) return $this->config;
|
| 31 |
+
if(!isset($this->config[$storeId])) return false;
|
| 32 |
|
| 33 |
+
return $this->config[$storeId];
|
| 34 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 35 |
|
| 36 |
+
/**
|
| 37 |
+
* Check required general config data
|
| 38 |
+
*
|
| 39 |
+
* @param null $storeId
|
| 40 |
+
* @return bool
|
| 41 |
+
*/
|
| 42 |
+
public function isConnected($storeId)
|
| 43 |
+
{
|
| 44 |
+
$config = $this->getConfig($storeId);
|
| 45 |
+
return (empty($config['general']['api_key']) || empty($config['general']['tenant'])) ? false : true;
|
| 46 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 47 |
|
| 48 |
+
/**
|
| 49 |
+
* Get store expected shipment text
|
| 50 |
+
*
|
| 51 |
+
* @param $storeId
|
| 52 |
+
* @return DateTime
|
| 53 |
+
*/
|
| 54 |
+
public function getExpectedShipmentDate($storeId)
|
| 55 |
+
{
|
| 56 |
+
$config = $this->getConfig($storeId);
|
|
|
|
|
|
|
|
|
|
|
|
|
| 57 |
|
| 58 |
+
$weekdays = (int) $config['optional']['expected_date'];
|
| 59 |
+
if($weekdays <= 0)
|
| 60 |
+
$weekdays = $this->_defaultTimeToShip;
|
|
|
|
|
|
|
|
|
|
|
|
|
| 61 |
|
| 62 |
+
$expectedDate = date("Y-m-d", strtotime("{$weekdays} weekdays"));
|
| 63 |
+
return new DateTime($expectedDate);
|
| 64 |
+
}
|
| 65 |
|
| 66 |
+
public function getExtensionVersion()
|
| 67 |
+
{
|
| 68 |
+
return (string) Mage::getConfig()->getNode()->modules->Tritac_ChannelEngine->version;
|
| 69 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 70 |
}
|
app/code/community/Tritac/ChannelEngine/Helper/Feed.php
ADDED
|
@@ -0,0 +1,528 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?php
|
| 2 |
+
|
| 3 |
+
class Tritac_ChannelEngine_Helper_Feed extends Mage_Core_Helper_Abstract {
|
| 4 |
+
|
| 5 |
+
private $helper;
|
| 6 |
+
private $feedDir;
|
| 7 |
+
private $stores;
|
| 8 |
+
|
| 9 |
+
const ATTRIBUTES_LIMIT = 30;
|
| 10 |
+
|
| 11 |
+
public function __construct()
|
| 12 |
+
{
|
| 13 |
+
$this->feedDir = Mage::getBaseDir('media') . DS . 'channelengine' . DS;
|
| 14 |
+
$this->stores = [];
|
| 15 |
+
$this->config = [];
|
| 16 |
+
|
| 17 |
+
$this->helper = Mage::helper('channelengine');
|
| 18 |
+
$this->stores = Mage::app()->getStores();
|
| 19 |
+
$this->config = $this->helper->getConfig();
|
| 20 |
+
|
| 21 |
+
//Mage::app()->loadAreaPart(Mage_Core_Model_App_Area::AREA_FRONTEND, Mage_Core_Model_App_Area::PART_EVENTS);
|
| 22 |
+
}
|
| 23 |
+
|
| 24 |
+
/**
|
| 25 |
+
* Generate products feed for ChannelEngine
|
| 26 |
+
*/
|
| 27 |
+
public function generateFeeds()
|
| 28 |
+
{
|
| 29 |
+
@set_time_limit(15 * 60);
|
| 30 |
+
|
| 31 |
+
foreach($this->stores as $store)
|
| 32 |
+
{
|
| 33 |
+
$this->generateFeed($store, $categories);
|
| 34 |
+
}
|
| 35 |
+
|
| 36 |
+
return true;
|
| 37 |
+
}
|
| 38 |
+
|
| 39 |
+
public function generateFeed($store, $categoriesArray)
|
| 40 |
+
{
|
| 41 |
+
Mage::app()->setCurrentStore($store);
|
| 42 |
+
$storeId = $store->getId();
|
| 43 |
+
$config = $this->config[$storeId];
|
| 44 |
+
|
| 45 |
+
if(!$this->helper->isConnected($storeId)) return;
|
| 46 |
+
|
| 47 |
+
$memoryUsage = memory_get_usage();
|
| 48 |
+
$tenant = $config['general']['tenant'];
|
| 49 |
+
|
| 50 |
+
$name = $tenant.'_products.xml';
|
| 51 |
+
$file = $this->feedDir . DS . $name;
|
| 52 |
+
|
| 53 |
+
$date = date('c');
|
| 54 |
+
|
| 55 |
+
$io = new Varien_Io_File();
|
| 56 |
+
$io->setAllowCreateFolders(true);
|
| 57 |
+
$io->open(array('path' => $path));
|
| 58 |
+
$io->streamOpen($file, 'w+');
|
| 59 |
+
$io->streamLock(true);
|
| 60 |
+
$io->streamWrite('<?xml version="1.0" encoding="UTF-8"?>' . "\n");
|
| 61 |
+
$io->streamWrite('<Products xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
| 62 |
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" GeneratedAt="'.$date.'">' . "\n");
|
| 63 |
+
|
| 64 |
+
$collection = Mage::getResourceModel('catalog/product_collection');
|
| 65 |
+
$flatCatalogEnabled = $collection->isEnabledFlat();
|
| 66 |
+
|
| 67 |
+
$attributesInfo = $this->getAttributes($storeId, $flatCatalogEnabled);
|
| 68 |
+
$attributesToSelect = $attributesInfo['attributesToSelect'];
|
| 69 |
+
$visibleAttributes = $attributesInfo['visibleAttributes'];
|
| 70 |
+
$systemAttributes = $attributesInfo['systemAttributes'];
|
| 71 |
+
|
| 72 |
+
$categories = $this->getCategories($store);
|
| 73 |
+
$options = $this->getOptions();
|
| 74 |
+
|
| 75 |
+
// Make sure to create a new instance of our collection after setting the store ID
|
| 76 |
+
// when using the flat catalog. Otherwise store ID will be ignored. This is a bug in magento.
|
| 77 |
+
// https://magento.stackexchange.com/a/25908
|
| 78 |
+
if($flatCatalogEnabled)
|
| 79 |
+
{
|
| 80 |
+
// The flat product entity has a setStoreId method, the regular entity does not have one
|
| 81 |
+
$collection->getEntity()->setStoreId($storeId);
|
| 82 |
+
$collection = Mage::getResourceModel('catalog/product_collection');
|
| 83 |
+
}
|
| 84 |
+
|
| 85 |
+
// Only get simple products,
|
| 86 |
+
$collection->addAttributeToSelect($attributesToSelect, 'left')
|
| 87 |
+
->addFieldToFilter('type_id', array('in' => array('simple')))
|
| 88 |
+
->addStoreFilter($store)
|
| 89 |
+
->addAttributeToFilter('status', 1)
|
| 90 |
+
->addAttributeToFilter('visibility', array('in' => array(
|
| 91 |
+
Mage_Catalog_Model_Product_Visibility::VISIBILITY_IN_CATALOG,
|
| 92 |
+
Mage_Catalog_Model_Product_Visibility::VISIBILITY_IN_SEARCH,
|
| 93 |
+
Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH)))
|
| 94 |
+
->addAttributeToSort('entity_id', 'DESC');
|
| 95 |
+
|
| 96 |
+
// Add qty and category fields to select
|
| 97 |
+
$collection->getSelect()
|
| 98 |
+
->joinLeft(
|
| 99 |
+
array('csi' => Mage::getSingleton('core/resource')->getTableName('cataloginventory/stock_item')),
|
| 100 |
+
'e.entity_id = csi.product_id',
|
| 101 |
+
array('qty' => 'COALESCE(qty, 0)')
|
| 102 |
+
)
|
| 103 |
+
->joinLeft(
|
| 104 |
+
array('ccp' => Mage::getSingleton('core/resource')->getTableName('catalog/category_product_index')),
|
| 105 |
+
'e.entity_id = ccp.product_id AND ccp.store_id = ' . $storeId . ' AND is_parent = 1',
|
| 106 |
+
array('category_id' => 'MAX(`ccp`.`category_id`)')
|
| 107 |
+
)
|
| 108 |
+
->group('e.entity_id');
|
| 109 |
+
|
| 110 |
+
// Iterate all simple products, except the invisible ones (they are most probably children of configurable products)
|
| 111 |
+
$this->iterateProductCollection($io, $categories, $visibleAttributes, $systemAttributes, $attributesToSelect, $options, $store, $memoryUsage, $collection->getSelect(), false);
|
| 112 |
+
|
| 113 |
+
// Update the query to select configurable products
|
| 114 |
+
$collection->clear()->getSelect()->reset('where');
|
| 115 |
+
$collection->addFieldToFilter('type_id', array('in' => array('configurable')))
|
| 116 |
+
->addStoreFilter($store)
|
| 117 |
+
->addAttributeToFilter('status', 1)
|
| 118 |
+
->addAttributeToFilter('visibility', array('in' => array(
|
| 119 |
+
Mage_Catalog_Model_Product_Visibility::VISIBILITY_IN_CATALOG,
|
| 120 |
+
Mage_Catalog_Model_Product_Visibility::VISIBILITY_IN_SEARCH,
|
| 121 |
+
Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH)))
|
| 122 |
+
->addAttributeToSort('entity_id', 'DESC');
|
| 123 |
+
|
| 124 |
+
$this->iterateProductCollection($io, $categories, $visibleAttributes, $systemAttributes, $attributesToSelect, $options, $store, $memoryUsage, $collection->getSelect(), true);
|
| 125 |
+
|
| 126 |
+
$io->streamWrite('</Products>');
|
| 127 |
+
$io->streamUnlock();
|
| 128 |
+
$io->streamClose();
|
| 129 |
+
|
| 130 |
+
return true;
|
| 131 |
+
}
|
| 132 |
+
|
| 133 |
+
public function iterateProductsCallback($args)
|
| 134 |
+
{
|
| 135 |
+
$io = $args['io'];
|
| 136 |
+
$row = $args['row'];
|
| 137 |
+
$attributes = $args['visibleAttributes'];
|
| 138 |
+
$systemAttributes = $args['systemAttributes'];
|
| 139 |
+
$attributesToSelect = $args['attributesToSelect'];
|
| 140 |
+
$categories = $args['categories'];
|
| 141 |
+
$options = $args['options'];
|
| 142 |
+
$store = $args['store'];
|
| 143 |
+
$isConfigurable = $args['isConfigurable'];
|
| 144 |
+
|
| 145 |
+
$storeId = $store->getId();
|
| 146 |
+
$productResource = Mage::getResourceModel('catalog/product');
|
| 147 |
+
$product = Mage::getModel('catalog/product');
|
| 148 |
+
$product->setData($row);
|
| 149 |
+
|
| 150 |
+
$config = $this->config[$storeId];
|
| 151 |
+
|
| 152 |
+
$mediaGalleryAttr = $productResource->getAttribute('media_gallery');
|
| 153 |
+
$mediaGalleryBackend = $mediaGalleryAttr->getBackend();
|
| 154 |
+
$mediaGalleryBackend->afterLoad($product);
|
| 155 |
+
|
| 156 |
+
$additional = array(
|
| 157 |
+
'systemAttributes' => $systemAttributes,
|
| 158 |
+
'attributes' => $attributes
|
| 159 |
+
);
|
| 160 |
+
|
| 161 |
+
|
| 162 |
+
$productData = $product->getData();
|
| 163 |
+
if(!empty($config['general']['gtin'])) $productData['gtin'] = $productData[$config['general']['gtin']];
|
| 164 |
+
$productData['url'] = $product->getProductUrl();
|
| 165 |
+
$productData['images'] = $product->getMediaGalleryImages();
|
| 166 |
+
$productData['price'] = $product->getFinalPrice();
|
| 167 |
+
|
| 168 |
+
if(isset($options[$productData['entity_id']]))
|
| 169 |
+
{
|
| 170 |
+
$productData['parent_id'] = $productData['entity_id'];
|
| 171 |
+
|
| 172 |
+
foreach($options[$productData['entity_id']] as $option)
|
| 173 |
+
{
|
| 174 |
+
if(isset($option['values']))
|
| 175 |
+
{
|
| 176 |
+
foreach($option['values'] as $value)
|
| 177 |
+
{
|
| 178 |
+
$variantData = $productData;
|
| 179 |
+
$variantData['id'] = $variantData['entity_id'] . '_' . $option['option_id'] . '_' . $value->getId();
|
| 180 |
+
|
| 181 |
+
if(isset($value['price']))
|
| 182 |
+
{
|
| 183 |
+
if($value['price_type'] == 'fixed')
|
| 184 |
+
{
|
| 185 |
+
$variantData['price'] = $variantData['price'] + $value['price'];
|
| 186 |
+
}
|
| 187 |
+
elseif($value['price_type'] == 'percent')
|
| 188 |
+
{
|
| 189 |
+
$variantData['price'] = $variantData['price'] + ($variantData['price'] * $value['price'] / 100);
|
| 190 |
+
}
|
| 191 |
+
}
|
| 192 |
+
|
| 193 |
+
$additional['title'] = str_replace(' ', '_', $option['default_title']);
|
| 194 |
+
$additional['value'] = $value->getDefaultTitle();
|
| 195 |
+
|
| 196 |
+
$this->writeProduct($io, $variantData, $categories, $additional);
|
| 197 |
+
}
|
| 198 |
+
}
|
| 199 |
+
else
|
| 200 |
+
{
|
| 201 |
+
$variantData = $productData;
|
| 202 |
+
$variantData['id'] = $variantData['entity_id'] . '_' . $option['option_id'];
|
| 203 |
+
$additional['title'] = str_replace(' ', '_', $option['default_title']);
|
| 204 |
+
$additional['value'] = '';
|
| 205 |
+
if(isset($option['price']))
|
| 206 |
+
{
|
| 207 |
+
if($option['price_type'] == 'fixed')
|
| 208 |
+
{
|
| 209 |
+
$variantData['price'] = $variantData['price'] + $option['price'];
|
| 210 |
+
}
|
| 211 |
+
elseif($option['price_type'] == 'percent')
|
| 212 |
+
{
|
| 213 |
+
$variantData['price'] = $variantData['price'] + ($variantData['price'] * $option['price'] / 100);
|
| 214 |
+
}
|
| 215 |
+
}
|
| 216 |
+
$this->writeProduct($io, $variantData, $categories, $additional);
|
| 217 |
+
}
|
| 218 |
+
}
|
| 219 |
+
}
|
| 220 |
+
else
|
| 221 |
+
{
|
| 222 |
+
$productData['id'] = $productData['entity_id'];
|
| 223 |
+
|
| 224 |
+
$this->writeProduct($io, $productData, $categories, $additional);
|
| 225 |
+
}
|
| 226 |
+
|
| 227 |
+
if(!$isConfigurable) return;
|
| 228 |
+
|
| 229 |
+
$productAttributeOptions = $product->getTypeInstance(true)->getConfigurableAttributesAsArray($product);
|
| 230 |
+
|
| 231 |
+
$superAttributes = array();
|
| 232 |
+
foreach($productAttributeOptions as $superAttribute)
|
| 233 |
+
{
|
| 234 |
+
foreach($superAttribute['values'] as $value)
|
| 235 |
+
{
|
| 236 |
+
$superAttributes[$superAttribute['attribute_code']][$value['value_index']] = $value;
|
| 237 |
+
}
|
| 238 |
+
}
|
| 239 |
+
|
| 240 |
+
$childProducts = Mage::getModel('catalog/product_type_configurable')
|
| 241 |
+
->getUsedProductCollection($product)
|
| 242 |
+
->addAttributeToSelect($attributesToSelect)
|
| 243 |
+
->getItems();
|
| 244 |
+
|
| 245 |
+
foreach($childProducts as $child)
|
| 246 |
+
{
|
| 247 |
+
$childData = $child->getData();
|
| 248 |
+
|
| 249 |
+
$childData['id'] = $childData['entity_id'];
|
| 250 |
+
$childData['parent_id'] = $productData['id'];
|
| 251 |
+
//$childData['price'] = $productData['price'];
|
| 252 |
+
$childData['url'] = $productData['url'];
|
| 253 |
+
$childData['description'] = $productData['description'];
|
| 254 |
+
|
| 255 |
+
if(!isset($childData['images'])) {
|
| 256 |
+
$childData['images'] = $productData['images'];
|
| 257 |
+
}
|
| 258 |
+
|
| 259 |
+
if(!isset($childData['category_id'])) $childData['category_id'] = $productData['category_id'];
|
| 260 |
+
|
| 261 |
+
if(isset($childData['stock_item']) && $childData['stock_item'] !== null) {
|
| 262 |
+
$stock = $childData['stock_item']->getData();
|
| 263 |
+
$childData['qty'] = $stock['qty'];
|
| 264 |
+
}
|
| 265 |
+
|
| 266 |
+
if(!isset($childData['image']) || $childData['image'] == 'no_slection') $childData['image'] = $productData['image'];
|
| 267 |
+
|
| 268 |
+
foreach($superAttributes as $code => $superAttribute)
|
| 269 |
+
{
|
| 270 |
+
if(isset($childData[$code]))
|
| 271 |
+
{
|
| 272 |
+
$priceValue = $superAttribute[$childData[$code]]['pricing_value'];
|
| 273 |
+
if($superAttribute[$childData[$code]]['is_percent']) {
|
| 274 |
+
$newPrice = $childData['price'] + $childData['price'] * $priceValue / 100;
|
| 275 |
+
} else {
|
| 276 |
+
$newPrice = $childData['price'] + $priceValue;
|
| 277 |
+
}
|
| 278 |
+
$childData['price'] = $newPrice;
|
| 279 |
+
}
|
| 280 |
+
}
|
| 281 |
+
|
| 282 |
+
$this->writeProduct($io, $childData, $categories, $additional);
|
| 283 |
+
}
|
| 284 |
+
}
|
| 285 |
+
|
| 286 |
+
private function writeProduct($io, $product, $categories, $additional = null)
|
| 287 |
+
{
|
| 288 |
+
$io->streamWrite('<Product>');
|
| 289 |
+
$io->streamWrite('<Id>' . $product['id'] . '</Id>');
|
| 290 |
+
|
| 291 |
+
// Add group code with product id if product have custom options
|
| 292 |
+
if(isset($product['group_code'])) {
|
| 293 |
+
$io->streamWrite('<GroupCode><![CDATA[' . $product['group_code'] . ']]></GroupCode>');
|
| 294 |
+
}
|
| 295 |
+
|
| 296 |
+
if(isset($product['parent_id'])) {
|
| 297 |
+
$io->streamWrite('<ParentId><![CDATA[' . $product['parent_id'] . ']]></ParentId>');
|
| 298 |
+
}
|
| 299 |
+
|
| 300 |
+
$io->streamWrite('<Type><![CDATA[' . $product['type_id'] . ']]></Type>');
|
| 301 |
+
$io->streamWrite('<Name><![CDATA[' . $product['name'] . ']]></Name>');
|
| 302 |
+
$io->streamWrite('<Description><![CDATA['. $this->stripHtml($product['description']) . ']]></Description>');
|
| 303 |
+
$io->streamWrite('<Price><![CDATA['. $product['price'] . ']]></Price>');
|
| 304 |
+
$io->streamWrite('<ListPrice><![CDATA[' . $product['msrp'] . ']]></ListPrice>');
|
| 305 |
+
$io->streamWrite('<PurchasePrice><![CDATA[' . $product['cost'] . ']]></PurchasePrice>');
|
| 306 |
+
|
| 307 |
+
// Add product stock qty
|
| 308 |
+
$io->streamWrite('<Stock><![CDATA[' . $product['qty'] . ']]></Stock>');
|
| 309 |
+
|
| 310 |
+
// Add product SKU and GTIN
|
| 311 |
+
$io->streamWrite('<SKU><![CDATA[' . $product['sku'] . ']]></SKU>');
|
| 312 |
+
if(!empty($product['gtin'])) {
|
| 313 |
+
$io->streamWrite('<GTIN><![CDATA[' . $product['gtin'] . ']]></GTIN>');
|
| 314 |
+
}
|
| 315 |
+
|
| 316 |
+
// VAT and Shipping Time are pre configured in extension settings
|
| 317 |
+
if(!empty($this->_config[$product['store_id']]['optional']['vat_rate'])) {
|
| 318 |
+
$vat = $this->_config[$product['store_id']]['optional']['vat_rate'];
|
| 319 |
+
$io->streamWrite('<VAT><![CDATA[".$vat."]]></VAT>');
|
| 320 |
+
}
|
| 321 |
+
|
| 322 |
+
$shippingTime = ($product['qty'] > 0) ? $this->_config[$product['store_id']]['optional']['shipping_time'] : $this->_config[$product['store_id']]['optional']['shipping_time_oos'];
|
| 323 |
+
|
| 324 |
+
if($shippingTime) {
|
| 325 |
+
$io->streamWrite('<ShippingTime><![CDATA[' . $shippingTime . ']]></ShippingTime>');
|
| 326 |
+
}
|
| 327 |
+
|
| 328 |
+
$io->streamWrite('<Url><![CDATA[' . $product['url'] . ']]></Url>');
|
| 329 |
+
$images = $product['images'];
|
| 330 |
+
$i = 0;
|
| 331 |
+
|
| 332 |
+
foreach($product['images'] as $image) {
|
| 333 |
+
if($i == 0){
|
| 334 |
+
$io->streamWrite('<ImageUrl><![CDATA[' . $image->getUrl() . ']]></ImageUrl>');
|
| 335 |
+
} else {
|
| 336 |
+
$io->streamWrite('<ImageUrl' . $i .'><![CDATA[' . $image->getUrl() . ']]></ImageUrl' . $i . '>');
|
| 337 |
+
}
|
| 338 |
+
$i++;
|
| 339 |
+
}
|
| 340 |
+
|
| 341 |
+
// Prepare category path
|
| 342 |
+
$io->streamWrite('<CategoryId><![CDATA[' . $product['category_id'] . ']]></CategoryId>');
|
| 343 |
+
if(!empty($product['category_id']) && !empty($categories)) {
|
| 344 |
+
$categoryId = $product['category_id'];
|
| 345 |
+
$categoryPathIds = explode('/', $categories[$categoryId]['path']);
|
| 346 |
+
$categoryPath = null;
|
| 347 |
+
foreach($categoryPathIds as $id) {
|
| 348 |
+
if($id > 2) {
|
| 349 |
+
$categoryPath .= ($categoryPath) ? ' > ':'';
|
| 350 |
+
$categoryPath .= $categories[$id]['name'];
|
| 351 |
+
}
|
| 352 |
+
}
|
| 353 |
+
if($categoryPath) {
|
| 354 |
+
$io->streamWrite('<Category><![CDATA[' . $categoryPath . ']]></Category>');
|
| 355 |
+
}
|
| 356 |
+
}
|
| 357 |
+
|
| 358 |
+
if(isset($additional['title']) && isset($additional['value']))
|
| 359 |
+
{
|
| 360 |
+
$title = preg_replace("/[^a-zA-Z0-9]/", "", $additional['title']);
|
| 361 |
+
$io->streamWrite(sprintf("<%1\$s><![CDATA[%2\$s]]></%1\$s>",
|
| 362 |
+
$title,
|
| 363 |
+
$additional['value']
|
| 364 |
+
));
|
| 365 |
+
}
|
| 366 |
+
|
| 367 |
+
/*
|
| 368 |
+
* Prepare product visible attributes
|
| 369 |
+
*/
|
| 370 |
+
if(isset($additional['attributes']))
|
| 371 |
+
{
|
| 372 |
+
$io->streamWrite('<Attributes>');
|
| 373 |
+
|
| 374 |
+
foreach($additional['attributes'] as $code => $attribute)
|
| 375 |
+
{
|
| 376 |
+
|
| 377 |
+
if(isset($product[$code]) && !in_array($code, $additional['systemAttributes']))
|
| 378 |
+
{
|
| 379 |
+
$io->streamWrite('<' . $code . '>');
|
| 380 |
+
|
| 381 |
+
if(!empty($attribute['values']))
|
| 382 |
+
{
|
| 383 |
+
$io->streamWrite('<![CDATA[' . $attribute['values'][$product[$code]] . ']]>');
|
| 384 |
+
}
|
| 385 |
+
else
|
| 386 |
+
{
|
| 387 |
+
$io->streamWrite('<![CDATA[' . $product[$code] . ']]>');
|
| 388 |
+
}
|
| 389 |
+
|
| 390 |
+
$io->streamWrite('</' . $code . '>');
|
| 391 |
+
}
|
| 392 |
+
}
|
| 393 |
+
$io->streamWrite('</Attributes>');
|
| 394 |
+
}
|
| 395 |
+
|
| 396 |
+
$io->streamWrite('</Product>');
|
| 397 |
+
}
|
| 398 |
+
|
| 399 |
+
private function iterateProductCollection($io, $categories, $visibleAttributes, $systemAttributes, $attributesToSelect, $options, $store, $memoryUsage, $select, $isConfigurable)
|
| 400 |
+
{
|
| 401 |
+
Mage::getSingleton('core/resource_iterator')->walk(
|
| 402 |
+
$select,
|
| 403 |
+
array(array($this, 'iterateProductsCallback')),
|
| 404 |
+
array(
|
| 405 |
+
'io' => $io,
|
| 406 |
+
'categories' => $categories,
|
| 407 |
+
'visibleAttributes' => $visibleAttributes,
|
| 408 |
+
'systemAttributes' => $systemAttributes,
|
| 409 |
+
'attributesToSelect' => $attributesToSelect,
|
| 410 |
+
'options' => $options,
|
| 411 |
+
'store' => $store,
|
| 412 |
+
'startMemory' => $memoryUsage,
|
| 413 |
+
'isConfigurable' => $isConfigurable
|
| 414 |
+
)
|
| 415 |
+
);
|
| 416 |
+
}
|
| 417 |
+
|
| 418 |
+
private function getCategories($store)
|
| 419 |
+
{
|
| 420 |
+
$categoryArray = array();
|
| 421 |
+
$parent = $store->getRootCategoryId();
|
| 422 |
+
|
| 423 |
+
$rootCategory = Mage::getModel('catalog/category')->load($parent);
|
| 424 |
+
|
| 425 |
+
if ($rootCategory->getId())
|
| 426 |
+
{
|
| 427 |
+
$categoryArray[$rootCategory->getId()] = $rootCategory->getData();
|
| 428 |
+
$storeCategories = $rootCategory->getCategories($parent, 0, true, true, true);
|
| 429 |
+
foreach($storeCategories as $category)
|
| 430 |
+
{
|
| 431 |
+
$categoryArray[$category->getId()] = $category->getData();
|
| 432 |
+
}
|
| 433 |
+
}
|
| 434 |
+
|
| 435 |
+
return $categoryArray;
|
| 436 |
+
}
|
| 437 |
+
|
| 438 |
+
private function getOptions()
|
| 439 |
+
{
|
| 440 |
+
$optionsArray = array();
|
| 441 |
+
$options = Mage::getModel('catalog/product_option')
|
| 442 |
+
->getCollection()
|
| 443 |
+
->addTitleToResult($storeId)
|
| 444 |
+
->addPriceToResult($storeId)
|
| 445 |
+
->addValuesToResult($storeId)
|
| 446 |
+
->setOrder('sort_order', 'asc');
|
| 447 |
+
|
| 448 |
+
foreach($options as $options)
|
| 449 |
+
{
|
| 450 |
+
$productId = $options->getProductId();
|
| 451 |
+
$optionId = $options->getOptionId();
|
| 452 |
+
$optionsArray[$productId][$optionId] = $options->getData();
|
| 453 |
+
if($options->getType() == Mage_Catalog_Model_Product_Option::OPTION_TYPE_DROP_DOWN)
|
| 454 |
+
{
|
| 455 |
+
$optionsArray[$productId][$optionId]['values'] = $options->getValues();
|
| 456 |
+
}
|
| 457 |
+
}
|
| 458 |
+
return $optionsArray;
|
| 459 |
+
}
|
| 460 |
+
|
| 461 |
+
private function getAttributes($storeId, $flatCatalogEnabled)
|
| 462 |
+
{
|
| 463 |
+
$visibleAttributes = array();
|
| 464 |
+
$systemAttributes = array();
|
| 465 |
+
|
| 466 |
+
$attributesToSelect = array(
|
| 467 |
+
'sku',
|
| 468 |
+
'name',
|
| 469 |
+
'manufacturer',
|
| 470 |
+
'description',
|
| 471 |
+
'image',
|
| 472 |
+
'url_key',
|
| 473 |
+
'price',
|
| 474 |
+
'cost',
|
| 475 |
+
'special_price',
|
| 476 |
+
'special_from_date',
|
| 477 |
+
'special_to_date',
|
| 478 |
+
'visibility',
|
| 479 |
+
'msrp'
|
| 480 |
+
);
|
| 481 |
+
|
| 482 |
+
if(!empty($this->config[$storeId]['general']['gtin'])) $attributesToSelect[] = $this->config[$storeId]['general']['gtin'];
|
| 483 |
+
$attributes = Mage::getResourceModel('catalog/product_attribute_collection');
|
| 484 |
+
|
| 485 |
+
$totalAttributes = count($attributesToSelect);
|
| 486 |
+
|
| 487 |
+
foreach($attributes as $attribute)
|
| 488 |
+
{
|
| 489 |
+
$code = $attribute->getAttributeCode();
|
| 490 |
+
$isFlat = $flatCatalogEnabled && $attribute->getUsedInProductListing();
|
| 491 |
+
$isRegular = !$flatCatalogEnabled && $attribute->getIsVisible() && $attribute->getIsVisibleOnFront();
|
| 492 |
+
|
| 493 |
+
// Only allow a subset of system attributes
|
| 494 |
+
$isSystem = !$attribute->getIsUserDefined();
|
| 495 |
+
|
| 496 |
+
if(!$isFlat && !$isRegular || ($isRegular && $totalAttributes >= self::ATTRIBUTES_LIMIT)) continue;
|
| 497 |
+
|
| 498 |
+
$visibleAttributes[$code]['label'] = $attribute->getFrontendLabel();
|
| 499 |
+
foreach($attribute->getSource()->getAllOptions(false) as $option)
|
| 500 |
+
{
|
| 501 |
+
$visibleAttributes[$code]['values'][$option['value']] = $option['label'];
|
| 502 |
+
}
|
| 503 |
+
|
| 504 |
+
if($isSystem)
|
| 505 |
+
{
|
| 506 |
+
$systemAttributes[] = $code;
|
| 507 |
+
continue;
|
| 508 |
+
}
|
| 509 |
+
|
| 510 |
+
if(in_array($code, $attributesToSelect)) continue;
|
| 511 |
+
|
| 512 |
+
$attributesToSelect[] = $code;
|
| 513 |
+
$totalAttributes++;
|
| 514 |
+
}
|
| 515 |
+
|
| 516 |
+
return array(
|
| 517 |
+
'systemAttributes' => $systemAttributes,
|
| 518 |
+
'visibleAttributes' => $visibleAttributes,
|
| 519 |
+
'attributesToSelect' => $attributesToSelect
|
| 520 |
+
);
|
| 521 |
+
}
|
| 522 |
+
|
| 523 |
+
private function stripHtml($string)
|
| 524 |
+
{
|
| 525 |
+
$string = preg_replace('/\<br(\s*)?\/?\>/i', "\n", $string);
|
| 526 |
+
return strip_tags($string);
|
| 527 |
+
}
|
| 528 |
+
}
|
app/code/community/Tritac/ChannelEngine/Model/Loader.php
CHANGED
|
@@ -4,10 +4,14 @@
|
|
| 4 |
*/
|
| 5 |
class Tritac_ChannelEngine_Model_Loader
|
| 6 |
{
|
|
|
|
|
|
|
|
|
|
| 7 |
/**
|
| 8 |
* @var bool
|
| 9 |
*/
|
| 10 |
protected static $added = false;
|
|
|
|
| 11 |
/**
|
| 12 |
* Register the Composer autoloader
|
| 13 |
* @param Varien_Event_Observer $observer
|
|
@@ -15,10 +19,44 @@ class Tritac_ChannelEngine_Model_Loader
|
|
| 15 |
public function addComposerAutoloader(Varien_Event_Observer $observer)
|
| 16 |
{
|
| 17 |
if (self::$added === false) {
|
| 18 |
-
|
| 19 |
-
$helper = Mage::helper('channelengine');
|
| 20 |
-
$helper->registerAutoloader();
|
| 21 |
self::$added = true;
|
| 22 |
}
|
| 23 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
}
|
| 4 |
*/
|
| 5 |
class Tritac_ChannelEngine_Model_Loader
|
| 6 |
{
|
| 7 |
+
const AUTOLOAD_FILENAME = 'autoload.php';
|
| 8 |
+
const DEFAULT_PATH = '{{libdir}}/ChannelEngine/vendor';
|
| 9 |
+
|
| 10 |
/**
|
| 11 |
* @var bool
|
| 12 |
*/
|
| 13 |
protected static $added = false;
|
| 14 |
+
|
| 15 |
/**
|
| 16 |
* Register the Composer autoloader
|
| 17 |
* @param Varien_Event_Observer $observer
|
| 19 |
public function addComposerAutoloader(Varien_Event_Observer $observer)
|
| 20 |
{
|
| 21 |
if (self::$added === false) {
|
| 22 |
+
$this->registerAutoloader();
|
|
|
|
|
|
|
| 23 |
self::$added = true;
|
| 24 |
}
|
| 25 |
}
|
| 26 |
+
|
| 27 |
+
/**
|
| 28 |
+
* The location of the vendor directory on the machine the site is running on.
|
| 29 |
+
* It always comes without a trailing slash.
|
| 30 |
+
*
|
| 31 |
+
* @return string
|
| 32 |
+
*/
|
| 33 |
+
public function getVendorDirectoryPath()
|
| 34 |
+
{
|
| 35 |
+
$path = (string) Mage::getConfig()->getNode('global/composer_autoloader/path');
|
| 36 |
+
if (!$path) {
|
| 37 |
+
$path = self::DEFAULT_PATH;
|
| 38 |
+
}
|
| 39 |
+
$path = str_replace('/', DS, $path);
|
| 40 |
+
$path = str_replace('{{basedir}}', Mage::getBaseDir(), $path);
|
| 41 |
+
$path = str_replace('{{libdir}}', Mage::getBaseDir('lib'), $path);
|
| 42 |
+
$path = rtrim($path, DS);
|
| 43 |
+
return realpath($path);
|
| 44 |
+
}
|
| 45 |
+
|
| 46 |
+
/**
|
| 47 |
+
* @param string|null $path Path to vendor directory. Pass null to use the configured value.
|
| 48 |
+
* @param string|null $filename Filename of autoload file. Pass null to use the default (autoload.php).
|
| 49 |
+
*/
|
| 50 |
+
public function registerAutoloader($path = null, $filename = null)
|
| 51 |
+
{
|
| 52 |
+
if ($path === null) {
|
| 53 |
+
$path = $this->getVendorDirectoryPath();
|
| 54 |
+
}
|
| 55 |
+
if ($filename === null) {
|
| 56 |
+
$filename = self::AUTOLOAD_FILENAME;
|
| 57 |
+
}
|
| 58 |
+
if (file_exists($path . DS . $filename)) {
|
| 59 |
+
require_once($path . DS . $filename);
|
| 60 |
+
}
|
| 61 |
+
}
|
| 62 |
}
|
app/code/community/Tritac/ChannelEngine/Model/Observer.php
CHANGED
|
@@ -20,14 +20,6 @@ use ChannelEngine\ApiClient\Model\MerchantShipmentLineRequest;
|
|
| 20 |
|
| 21 |
class Tritac_ChannelEngine_Model_Observer
|
| 22 |
{
|
| 23 |
-
/**
|
| 24 |
-
* To prevent exceeding the maximum number of allowed mySQL joins
|
| 25 |
-
* when not using the flat catalog.
|
| 26 |
-
*
|
| 27 |
-
* @var int
|
| 28 |
-
*/
|
| 29 |
-
const ATTRIBUTES_LIMIT = 30;
|
| 30 |
-
|
| 31 |
/**
|
| 32 |
* The CE logfile path
|
| 33 |
*
|
|
@@ -56,6 +48,13 @@ class Tritac_ChannelEngine_Model_Observer
|
|
| 56 |
*/
|
| 57 |
protected $_helper = null;
|
| 58 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 59 |
/**
|
| 60 |
* Whether this merchant uses the postNL extension
|
| 61 |
*
|
|
@@ -70,14 +69,16 @@ class Tritac_ChannelEngine_Model_Observer
|
|
| 70 |
public function __construct()
|
| 71 |
{
|
| 72 |
$this->_helper = Mage::helper('channelengine');
|
|
|
|
| 73 |
$this->_hasPostNL = Mage::helper('core')->isModuleEnabled('TIG_PostNL');
|
| 74 |
|
| 75 |
$this->_config = $this->_helper->getConfig();
|
|
|
|
| 76 |
/**
|
| 77 |
* Check required config parameters. Initialize API client.
|
| 78 |
*/
|
| 79 |
foreach($this->_config as $storeId => $storeConfig) {
|
| 80 |
-
if($this->_helper->
|
| 81 |
$apiConfig = new Configuration();
|
| 82 |
|
| 83 |
$apiConfig->setApiKey('apikey', $storeConfig['general']['api_key']);
|
|
@@ -118,6 +119,11 @@ class Tritac_ChannelEngine_Model_Observer
|
|
| 118 |
$this->log($e->__toString(), Zend_Log::ERR);
|
| 119 |
}
|
| 120 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 121 |
/**
|
| 122 |
* Fetch new orders from ChannelEngine.
|
| 123 |
* Ran by cron. The cronjob is set in extension config file.
|
|
@@ -579,445 +585,6 @@ class Tritac_ChannelEngine_Model_Observer
|
|
| 579 |
}
|
| 580 |
}
|
| 581 |
|
| 582 |
-
/**
|
| 583 |
-
* Generate products feed for ChannelEngine
|
| 584 |
-
*/
|
| 585 |
-
public function generateFeed()
|
| 586 |
-
{
|
| 587 |
-
@set_time_limit(15 * 60);
|
| 588 |
-
$start_memory = memory_get_usage();
|
| 589 |
-
|
| 590 |
-
/**
|
| 591 |
-
* Prepare categories array
|
| 592 |
-
*/
|
| 593 |
-
$categoryArray = array();
|
| 594 |
-
$parent = Mage::app()->getWebsite(true)->getDefaultStore()->getRootCategoryId();
|
| 595 |
-
$category = Mage::getModel('catalog/category');
|
| 596 |
-
if ($category->checkId($parent)) {
|
| 597 |
-
$storeCategories = $category->getCategories($parent, 0, true, true, true);
|
| 598 |
-
foreach($storeCategories as $_category) {
|
| 599 |
-
$categoryArray[$_category->getId()] = $_category->getData();
|
| 600 |
-
}
|
| 601 |
-
}
|
| 602 |
-
|
| 603 |
-
/**
|
| 604 |
-
* Prepare products relation
|
| 605 |
-
*/
|
| 606 |
-
// $productsRelation = array();
|
| 607 |
-
// $_resource = Mage::getSingleton('core/resource');
|
| 608 |
-
// $_connection = $_resource->getConnection('core_read');
|
| 609 |
-
// $relations = $_connection->fetchAll("SELECT * FROM " . $_resource->getTableName('catalog/product_relation'));
|
| 610 |
-
// foreach($relations as $relation) {
|
| 611 |
-
// $productsRelation[$relation['child_id']] = $relation['parent_id'];
|
| 612 |
-
// }
|
| 613 |
-
|
| 614 |
-
/**
|
| 615 |
-
* Export products from each store.
|
| 616 |
-
* Note: products with undefined website id will not be export.
|
| 617 |
-
*/
|
| 618 |
-
foreach(Mage::app()->getStores() as $_store)
|
| 619 |
-
{
|
| 620 |
-
Mage::app()->setCurrentStore($_store);
|
| 621 |
-
|
| 622 |
-
$path = Mage::getBaseDir('media') . DS . 'channelengine' . DS;
|
| 623 |
-
$storeConfig = $this->_helper->getConfig($_store->getId());
|
| 624 |
-
|
| 625 |
-
if(!$this->_helper->checkGeneralConfig($_store->getId())) continue;
|
| 626 |
-
|
| 627 |
-
$name = $storeConfig['general']['tenant'].'_products.xml';
|
| 628 |
-
$file = $path . DS . $name;
|
| 629 |
-
$date = date('c');
|
| 630 |
-
|
| 631 |
-
$io = new Varien_Io_File();
|
| 632 |
-
$io->setAllowCreateFolders(true);
|
| 633 |
-
$io->open(array('path' => $path));
|
| 634 |
-
$io->streamOpen($file, 'w+');
|
| 635 |
-
$io->streamLock(true);
|
| 636 |
-
$io->streamWrite('<?xml version="1.0" encoding="UTF-8"?>' . "\n");
|
| 637 |
-
$io->streamWrite('<Products xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
| 638 |
-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" GeneratedAt="'.$date.'">' . "\n");
|
| 639 |
-
|
| 640 |
-
/**
|
| 641 |
-
* Prepare custom options array
|
| 642 |
-
*/
|
| 643 |
-
$storeId = $_store->getId();
|
| 644 |
-
$optionsArray = array();
|
| 645 |
-
$_options = Mage::getModel('catalog/product_option')
|
| 646 |
-
->getCollection()
|
| 647 |
-
->addTitleToResult($storeId)
|
| 648 |
-
->addPriceToResult($storeId)
|
| 649 |
-
->addValuesToResult($storeId)
|
| 650 |
-
->setOrder('sort_order', 'asc');
|
| 651 |
-
foreach($_options as $_option) {
|
| 652 |
-
$productId = $_option->getProductId();
|
| 653 |
-
$optionId = $_option->getOptionId();
|
| 654 |
-
$optionsArray[$productId][$optionId] = $_option->getData();
|
| 655 |
-
if($_option->getType() == Mage_Catalog_Model_Product_Option::OPTION_TYPE_DROP_DOWN) {
|
| 656 |
-
$optionsArray[$productId][$optionId]['values'] = $_option->getValues();
|
| 657 |
-
}
|
| 658 |
-
}
|
| 659 |
-
|
| 660 |
-
/**
|
| 661 |
-
* Retrieve product collection with all visible attributes
|
| 662 |
-
*/
|
| 663 |
-
$collection = Mage::getResourceModel('catalog/product_collection');
|
| 664 |
-
$flatCatalogEnabled = $collection->isEnabledFlat();
|
| 665 |
-
|
| 666 |
-
// Make sure to create a new instance of our collection after setting the store ID
|
| 667 |
-
// when using the flat catalog. Otherwise store ID will be ignored. This is a bug in magento.
|
| 668 |
-
// https://magento.stackexchange.com/a/25908
|
| 669 |
-
if($flatCatalogEnabled)
|
| 670 |
-
{
|
| 671 |
-
// The flat product entity has a setStoreId method, the regular entity does not have one
|
| 672 |
-
$collection->getEntity()->setStoreId($storeId);
|
| 673 |
-
$collection = Mage::getResourceModel('catalog/product_collection');
|
| 674 |
-
}
|
| 675 |
-
|
| 676 |
-
$visibleAttributes = array();
|
| 677 |
-
$systemAttributes = array();
|
| 678 |
-
$attributesToSelect = array(
|
| 679 |
-
'sku',
|
| 680 |
-
'name',
|
| 681 |
-
'manufacturer',
|
| 682 |
-
'description',
|
| 683 |
-
'image',
|
| 684 |
-
'url_key',
|
| 685 |
-
'price',
|
| 686 |
-
'cost',
|
| 687 |
-
'special_price',
|
| 688 |
-
'special_from_date',
|
| 689 |
-
'special_to_date',
|
| 690 |
-
'visibility',
|
| 691 |
-
'msrp'
|
| 692 |
-
);
|
| 693 |
-
|
| 694 |
-
if(!empty($this->_config[$storeId]['general']['gtin'])) $attributesToSelect[] = $this->_config[$storeId]['general']['gtin'];
|
| 695 |
-
$attributes = Mage::getResourceModel('catalog/product_attribute_collection');
|
| 696 |
-
|
| 697 |
-
$totalAttributes = count($attributesToSelect);
|
| 698 |
-
|
| 699 |
-
foreach($attributes as $attribute)
|
| 700 |
-
{
|
| 701 |
-
$code = $attribute->getAttributeCode();
|
| 702 |
-
$isFlat = $flatCatalogEnabled && $attribute->getUsedInProductListing();
|
| 703 |
-
$isRegular = !$flatCatalogEnabled && $attribute->getIsVisible() && $attribute->getIsVisibleOnFront();
|
| 704 |
-
|
| 705 |
-
// Only allow a subset of system attributes
|
| 706 |
-
$isSystem = !$attribute->getIsUserDefined();
|
| 707 |
-
|
| 708 |
-
if(!$isFlat && !$isRegular || ($isRegular && $totalAttributes >= self::ATTRIBUTES_LIMIT)) continue;
|
| 709 |
-
|
| 710 |
-
$visibleAttributes[$code]['label'] = $attribute->getFrontendLabel();
|
| 711 |
-
foreach($attribute->getSource()->getAllOptions(false) as $option)
|
| 712 |
-
{
|
| 713 |
-
$visibleAttributes[$code]['values'][$option['value']] = $option['label'];
|
| 714 |
-
}
|
| 715 |
-
|
| 716 |
-
if($isSystem)
|
| 717 |
-
{
|
| 718 |
-
$systemAttributes[] = $code;
|
| 719 |
-
continue;
|
| 720 |
-
}
|
| 721 |
-
|
| 722 |
-
if(in_array($code, $attributesToSelect)) continue;
|
| 723 |
-
|
| 724 |
-
$attributesToSelect[] = $code;
|
| 725 |
-
$totalAttributes++;
|
| 726 |
-
}
|
| 727 |
-
|
| 728 |
-
$collection->addAttributeToSelect($attributesToSelect, 'left')
|
| 729 |
-
->addFieldToFilter('type_id', array('in' => array('simple')))
|
| 730 |
-
->addStoreFilter($_store)
|
| 731 |
-
->addAttributeToFilter('status', 1)
|
| 732 |
-
->addAttributeToFilter('visibility', array('in' => array(
|
| 733 |
-
Mage_Catalog_Model_Product_Visibility::VISIBILITY_IN_CATALOG,
|
| 734 |
-
Mage_Catalog_Model_Product_Visibility::VISIBILITY_IN_SEARCH,
|
| 735 |
-
Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH)))
|
| 736 |
-
->addAttributeToSort('entity_id', 'DESC');
|
| 737 |
-
|
| 738 |
-
// Add qty and category fields to select
|
| 739 |
-
$collection->getSelect()
|
| 740 |
-
->joinLeft(
|
| 741 |
-
array('csi' => Mage::getSingleton('core/resource')->getTableName('cataloginventory/stock_item')),
|
| 742 |
-
'`e`.`entity_id` = `csi`.`product_id`',
|
| 743 |
-
array('qty' => 'COALESCE(`qty`, 0)')
|
| 744 |
-
)
|
| 745 |
-
->joinLeft(
|
| 746 |
-
array('ccp' => Mage::getSingleton('core/resource')->getTableName('catalog/category_product')),
|
| 747 |
-
'`e`.`entity_id` = `ccp`.`product_id`',
|
| 748 |
-
array('category_id' => 'MAX(`ccp`.`category_id`)')
|
| 749 |
-
)
|
| 750 |
-
->group('e.entity_id');
|
| 751 |
-
|
| 752 |
-
Mage::getSingleton('core/resource_iterator')->walk(
|
| 753 |
-
$collection->getSelect(),
|
| 754 |
-
array(array($this, 'callbackGenerateFeed')),
|
| 755 |
-
array(
|
| 756 |
-
'io' => $io,
|
| 757 |
-
'categories' => $categoryArray,
|
| 758 |
-
'attributes' => $visibleAttributes,
|
| 759 |
-
'systemAttributes' => $systemAttributes,
|
| 760 |
-
'options' => $optionsArray,
|
| 761 |
-
'store' => $_store,
|
| 762 |
-
'startMemory' => $start_memory,
|
| 763 |
-
)
|
| 764 |
-
);
|
| 765 |
-
|
| 766 |
-
$collection->clear()->getSelect()->reset('where');
|
| 767 |
-
$collection->addFieldToFilter('type_id', array('in' => array('configurable')))
|
| 768 |
-
->addStoreFilter($_store)
|
| 769 |
-
->addAttributeToFilter('status', 1)
|
| 770 |
-
->addAttributeToSort('entity_id', 'DESC');
|
| 771 |
-
|
| 772 |
-
foreach($collection as $_product) {
|
| 773 |
-
$productAttributeOptions = $_product->getTypeInstance(true)->getConfigurableAttributesAsArray($_product);
|
| 774 |
-
$superAttributes = array();
|
| 775 |
-
|
| 776 |
-
foreach($productAttributeOptions as $superAttribute) {
|
| 777 |
-
foreach($superAttribute['values'] as $value) {
|
| 778 |
-
$superAttributes[$superAttribute['attribute_code']][$value['value_index']] = $value;
|
| 779 |
-
}
|
| 780 |
-
}
|
| 781 |
-
|
| 782 |
-
$parentData = $_product->getData();
|
| 783 |
-
$parentData['id'] = $parentData['entity_id'];
|
| 784 |
-
|
| 785 |
-
$productModel = Mage::getModel('catalog/product');
|
| 786 |
-
$productModel->setData('entity_id', $parentData['entity_id']);
|
| 787 |
-
$productModel->setData('url_key', $parentData['url_key']);
|
| 788 |
-
$productModel->setData('store_id', $parentData['store_id']);
|
| 789 |
-
|
| 790 |
-
$parentData['url'] = $productModel->getProductUrl();
|
| 791 |
-
|
| 792 |
-
$specialPrice = $parentData['special_price'];
|
| 793 |
-
$specialFrom = $parentData['special_from_date'];
|
| 794 |
-
$specialTo = $parentData['special_to_date'];
|
| 795 |
-
$parentData['price'] = Mage::getModel('catalog/product_type_price')->calculateSpecialPrice($parentData['price'], $specialPrice, $specialFrom, $specialTo, $storeId);
|
| 796 |
-
|
| 797 |
-
$xml = $this->_getProductXml($parentData, $categoryArray, array('systemAttributes' => $systemAttributes, 'attributes' => $visibleAttributes));
|
| 798 |
-
|
| 799 |
-
$childProductCollection = Mage::getModel('catalog/product_type_configurable')
|
| 800 |
-
->getUsedProductCollection($_product)
|
| 801 |
-
->addAttributeToSelect($attributesToSelect);
|
| 802 |
-
|
| 803 |
-
$_childProducts = $childProductCollection->getItems();
|
| 804 |
-
|
| 805 |
-
|
| 806 |
-
foreach($_childProducts as $_child) {
|
| 807 |
-
$childData = $_child->getData();
|
| 808 |
-
|
| 809 |
-
$childData['id'] = $childData['entity_id'];
|
| 810 |
-
$childData['parent_id'] = $parentData['id'];
|
| 811 |
-
$childData['price'] = $parentData['price'];
|
| 812 |
-
$childData['url'] = $parentData['url'];
|
| 813 |
-
$childData['description'] = $parentData['description'];
|
| 814 |
-
|
| 815 |
-
if(isset($childData['stock_item']) && $childData['stock_item'] !== null) {
|
| 816 |
-
$stock = $childData['stock_item']->getData();
|
| 817 |
-
$childData['qty'] = $stock['qty'];
|
| 818 |
-
}
|
| 819 |
-
|
| 820 |
-
if(!isset($childData['image']) || $childData['image'] == 'no_slection') {
|
| 821 |
-
$childData['image'] = $parentData['image'];
|
| 822 |
-
}
|
| 823 |
-
|
| 824 |
-
foreach($superAttributes as $code => $superAttribute) {
|
| 825 |
-
if(isset($childData[$code])) {
|
| 826 |
-
$priceValue = $superAttribute[$childData[$code]]['pricing_value'];
|
| 827 |
-
if($superAttribute[$childData[$code]]['is_percent']) {
|
| 828 |
-
$newPrice = $childData['price'] + $childData['price'] * $priceValue / 100;
|
| 829 |
-
} else {
|
| 830 |
-
$newPrice = $childData['price'] + $priceValue;
|
| 831 |
-
}
|
| 832 |
-
$childData['price'] = $newPrice;
|
| 833 |
-
}
|
| 834 |
-
}
|
| 835 |
-
|
| 836 |
-
$xml .= $this->_getProductXml($childData, $categoryArray, array('systemAttributes' => $systemAttributes, 'attributes' => $visibleAttributes));
|
| 837 |
-
}
|
| 838 |
-
$io->streamWrite($xml);
|
| 839 |
-
}
|
| 840 |
-
|
| 841 |
-
|
| 842 |
-
|
| 843 |
-
$io->streamWrite('</Products>');
|
| 844 |
-
$io->streamUnlock();
|
| 845 |
-
$io->streamClose();
|
| 846 |
-
}
|
| 847 |
-
|
| 848 |
-
return true;
|
| 849 |
-
}
|
| 850 |
-
|
| 851 |
-
public function callbackGenerateFeed($args)
|
| 852 |
-
{
|
| 853 |
-
$io = $args['io'];
|
| 854 |
-
$product = $args['row'];
|
| 855 |
-
$attributes = $args['attributes'];
|
| 856 |
-
$systemAttributes = $args['systemAttributes'];
|
| 857 |
-
$categories = $args['categories'];
|
| 858 |
-
$options = $args['options'];
|
| 859 |
-
$_store = $args['store'];
|
| 860 |
-
$storeId = $_store->getId();
|
| 861 |
-
|
| 862 |
-
$xml = '';
|
| 863 |
-
|
| 864 |
-
$product['store_id'] = $storeId;
|
| 865 |
-
if(!empty($this->_config[$storeId]['general']['gtin'])) {
|
| 866 |
-
$product['gtin'] = $product[$this->_config[$storeId]['general']['gtin']];
|
| 867 |
-
}
|
| 868 |
-
|
| 869 |
-
$specialPrice = $product['special_price'];
|
| 870 |
-
$specialFrom = $product['special_from_date'];
|
| 871 |
-
$specialTo = $product['special_to_date'];
|
| 872 |
-
$product['price'] = Mage::getModel('catalog/product_type_price')
|
| 873 |
-
->calculateSpecialPrice($product['price'], $specialPrice, $specialFrom, $specialTo, $storeId);
|
| 874 |
-
|
| 875 |
-
$productModel = Mage::getModel('catalog/product');
|
| 876 |
-
$productModel->setData('entity_id', $product['entity_id']);
|
| 877 |
-
$productModel->setData('url_key', $product['url_key']);
|
| 878 |
-
$productModel->setData('store_id', $product['store_id']);
|
| 879 |
-
$product['url'] = $productModel->getProductUrl();
|
| 880 |
-
|
| 881 |
-
/**
|
| 882 |
-
* Add product custom options to feed.
|
| 883 |
-
* Each option value will generate new product row
|
| 884 |
-
*/
|
| 885 |
-
$additional['systemAttributes'] = $systemAttributes;
|
| 886 |
-
$additional['attributes'] = $attributes;
|
| 887 |
-
if(isset($options[$product['entity_id']])) {
|
| 888 |
-
$product['group_code'] = $product['entity_id'];
|
| 889 |
-
foreach($options[$product['entity_id']] as $option) {
|
| 890 |
-
if(isset($option['values'])) {
|
| 891 |
-
foreach($option['values'] as $_value) {
|
| 892 |
-
$product['id'] = $product['entity_id'].'_'.$option['option_id'].'_'.$_value->getId();
|
| 893 |
-
$additional['title'] = str_replace(' ', '_', $option['default_title']);
|
| 894 |
-
$additional['value'] = $_value->getDefaultTitle();
|
| 895 |
-
$xml .= $this->_getProductXml($product, $categories, $additional);
|
| 896 |
-
}
|
| 897 |
-
} else {
|
| 898 |
-
$product['id'] = $product['entity_id'].'_'.$option['option_id'];
|
| 899 |
-
$additional['title'] = str_replace(' ', '_', $option['default_title']);
|
| 900 |
-
$additional['value'] = '';
|
| 901 |
-
$xml .= $this->_getProductXml($product, $categories, $additional);
|
| 902 |
-
}
|
| 903 |
-
}
|
| 904 |
-
}else {
|
| 905 |
-
$product['id'] = $product['entity_id'];
|
| 906 |
-
$xml .= $this->_getProductXml($product, $categories, $additional);
|
| 907 |
-
}
|
| 908 |
-
|
| 909 |
-
$io->streamWrite($xml);
|
| 910 |
-
}
|
| 911 |
-
|
| 912 |
-
protected function _getProductXml($product, $categories, $additional = null)
|
| 913 |
-
{
|
| 914 |
-
$xml = "<Product>";
|
| 915 |
-
$xml .= "<Id>".$product['id']."</Id>";
|
| 916 |
-
|
| 917 |
-
// Add group code with product id if product have custom options
|
| 918 |
-
if(isset($product['group_code'])) {
|
| 919 |
-
$xml .= "<GroupCode><![CDATA[".$product['group_code']."]]></GroupCode>";
|
| 920 |
-
}
|
| 921 |
-
|
| 922 |
-
if(isset($product['parent_id'])) {
|
| 923 |
-
$xml .= "<ParentId><![CDATA[".$product['parent_id']."]]></ParentId>";
|
| 924 |
-
}
|
| 925 |
-
|
| 926 |
-
$xml .= "<Type><![CDATA[".$product['type_id']."]]></Type>";
|
| 927 |
-
$xml .= "<Name><![CDATA[".$product['name']."]]></Name>";
|
| 928 |
-
$xml .= "<Description><![CDATA[".strip_tags($product['description'])."]]></Description>";
|
| 929 |
-
$xml .= "<Price><![CDATA[".$product['price']."]]></Price>";
|
| 930 |
-
$xml .= "<ListPrice><![CDATA[".$product['msrp']."]]></ListPrice>";
|
| 931 |
-
$xml .= "<PurchasePrice><![CDATA[".$product['cost']."]]></PurchasePrice>";
|
| 932 |
-
|
| 933 |
-
// Add product stock qty
|
| 934 |
-
$xml .= "<Stock><![CDATA[".$product['qty']."]]></Stock>";
|
| 935 |
-
|
| 936 |
-
// Add product SKU and GTIN
|
| 937 |
-
$xml .= "<SKU><![CDATA[".$product['sku']."]]></SKU>";
|
| 938 |
-
if(!empty($product['gtin'])) {
|
| 939 |
-
$xml .= "<GTIN><![CDATA[".$product['gtin']."]]></GTIN>";
|
| 940 |
-
}
|
| 941 |
-
|
| 942 |
-
// VAT and Shipping Time are pre configured in extension settings
|
| 943 |
-
if(!empty($this->_config[$product['store_id']]['optional']['vat_rate'])) {
|
| 944 |
-
$vat = $this->_config[$product['store_id']]['optional']['vat_rate'];
|
| 945 |
-
$xml .= "<VAT><![CDATA[".$vat."]]></VAT>";
|
| 946 |
-
}
|
| 947 |
-
|
| 948 |
-
$shippingTime = ($product['qty'] > 0) ? $this->_config[$product['store_id']]['optional']['shipping_time'] : $this->_config[$product['store_id']]['optional']['shipping_time_oos'];
|
| 949 |
-
|
| 950 |
-
if($shippingTime) {
|
| 951 |
-
$xml .= "<ShippingTime><![CDATA[".$shippingTime."]]></ShippingTime>";
|
| 952 |
-
}
|
| 953 |
-
|
| 954 |
-
$xml .= "<Url><![CDATA[".$product['url']."]]></Url>";
|
| 955 |
-
|
| 956 |
-
if(isset($product['image']) && $product['image'] != 'no_selection') {
|
| 957 |
-
$imgUrl = Mage::getSingleton('catalog/product_media_config')->getMediaUrl($product['image']);
|
| 958 |
-
$xml .= "<ImageUrl><![CDATA[".$imgUrl."]]></ImageUrl>";
|
| 959 |
-
}
|
| 960 |
-
|
| 961 |
-
// Prepare category path
|
| 962 |
-
if(!empty($product['category_id']) && !empty($categories)) {
|
| 963 |
-
$categoryId = $product['category_id'];
|
| 964 |
-
$categoryPathIds = explode('/', $categories[$categoryId]['path']);
|
| 965 |
-
$categoryPath = null;
|
| 966 |
-
foreach($categoryPathIds as $id) {
|
| 967 |
-
if($id > 2) {
|
| 968 |
-
$categoryPath .= ($categoryPath) ? ' > ':'';
|
| 969 |
-
$categoryPath .= $categories[$id]['name'];
|
| 970 |
-
}
|
| 971 |
-
}
|
| 972 |
-
if($categoryPath) {
|
| 973 |
-
$xml .= "<Category><![CDATA[".$categoryPath."]]></Category>";
|
| 974 |
-
}
|
| 975 |
-
}
|
| 976 |
-
|
| 977 |
-
if(isset($additional['title']) && isset($additional['value'])) {
|
| 978 |
-
$title = preg_replace("/[^a-zA-Z0-9]/", "", $additional['title']);
|
| 979 |
-
$xml .= sprintf("<%1\$s><![CDATA[%2\$s]]></%1\$s>",
|
| 980 |
-
$title,
|
| 981 |
-
$additional['value']
|
| 982 |
-
);
|
| 983 |
-
}
|
| 984 |
-
|
| 985 |
-
/*
|
| 986 |
-
* Prepare product visible attributes
|
| 987 |
-
*/
|
| 988 |
-
if(isset($additional['attributes'])) {
|
| 989 |
-
$xml .= '<Attributes>';
|
| 990 |
-
foreach($additional['attributes'] as $code => $attribute) {
|
| 991 |
-
|
| 992 |
-
if(isset($product[$code]) && !in_array($code, $additional['systemAttributes'])) {
|
| 993 |
-
$xml .= "<".$code.">";
|
| 994 |
-
/*$xml .= "<label><![CDATA[".$attribute['label']."]]></label>";
|
| 995 |
-
if(!empty($attribute['values'])) {
|
| 996 |
-
$xml .= "<value><![CDATA[".$attribute['values'][$product[$code]]."]]></value>";
|
| 997 |
-
} else {
|
| 998 |
-
$xml .= "<value><![CDATA[".$product[$code]."]]></value>";
|
| 999 |
-
}*/
|
| 1000 |
-
if(!empty($attribute['values'])) {
|
| 1001 |
-
$xml .= "<![CDATA[".$attribute['values'][$product[$code]]."]]>";
|
| 1002 |
-
} else {
|
| 1003 |
-
$xml .= "<![CDATA[".$product[$code]."]]>";
|
| 1004 |
-
}
|
| 1005 |
-
$xml .= "</".$code.">";
|
| 1006 |
-
}
|
| 1007 |
-
}
|
| 1008 |
-
$xml .= '</Attributes>';
|
| 1009 |
-
}
|
| 1010 |
-
|
| 1011 |
-
$xml .= "</Product>\n";
|
| 1012 |
-
|
| 1013 |
-
return $xml;
|
| 1014 |
-
}
|
| 1015 |
-
|
| 1016 |
-
public function addConfigurableProducts($collection)
|
| 1017 |
-
{
|
| 1018 |
-
|
| 1019 |
-
}
|
| 1020 |
-
|
| 1021 |
/**
|
| 1022 |
* Join channelengine order fields to adminhtml order grid
|
| 1023 |
*
|
| 20 |
|
| 21 |
class Tritac_ChannelEngine_Model_Observer
|
| 22 |
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
/**
|
| 24 |
* The CE logfile path
|
| 25 |
*
|
| 48 |
*/
|
| 49 |
protected $_helper = null;
|
| 50 |
|
| 51 |
+
/**
|
| 52 |
+
* ChannelEngine helper
|
| 53 |
+
*
|
| 54 |
+
* @var Tritac_ChannelEngine_Helper_Feed
|
| 55 |
+
*/
|
| 56 |
+
protected $_feedHelper = null;
|
| 57 |
+
|
| 58 |
/**
|
| 59 |
* Whether this merchant uses the postNL extension
|
| 60 |
*
|
| 69 |
public function __construct()
|
| 70 |
{
|
| 71 |
$this->_helper = Mage::helper('channelengine');
|
| 72 |
+
$this->_feedHelper = Mage::helper('channelengine/feed');
|
| 73 |
$this->_hasPostNL = Mage::helper('core')->isModuleEnabled('TIG_PostNL');
|
| 74 |
|
| 75 |
$this->_config = $this->_helper->getConfig();
|
| 76 |
+
|
| 77 |
/**
|
| 78 |
* Check required config parameters. Initialize API client.
|
| 79 |
*/
|
| 80 |
foreach($this->_config as $storeId => $storeConfig) {
|
| 81 |
+
if($this->_helper->isConnected($storeId)) {
|
| 82 |
$apiConfig = new Configuration();
|
| 83 |
|
| 84 |
$apiConfig->setApiKey('apikey', $storeConfig['general']['api_key']);
|
| 119 |
$this->log($e->__toString(), Zend_Log::ERR);
|
| 120 |
}
|
| 121 |
|
| 122 |
+
public function generateFeeds()
|
| 123 |
+
{
|
| 124 |
+
$this->_feedHelper->generateFeeds();
|
| 125 |
+
}
|
| 126 |
+
|
| 127 |
/**
|
| 128 |
* Fetch new orders from ChannelEngine.
|
| 129 |
* Ran by cron. The cronjob is set in extension config file.
|
| 585 |
}
|
| 586 |
}
|
| 587 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 588 |
/**
|
| 589 |
* Join channelengine order fields to adminhtml order grid
|
| 590 |
*
|
app/code/community/Tritac/ChannelEngine/controllers/Adminhtml/GenerateController.php
CHANGED
|
@@ -3,8 +3,8 @@ class Tritac_ChannelEngine_Adminhtml_GenerateController extends Mage_Adminhtml_C
|
|
| 3 |
{
|
| 4 |
public function feedAction()
|
| 5 |
{
|
| 6 |
-
$
|
| 7 |
-
$result = $
|
| 8 |
if($result) {
|
| 9 |
$this->returnStatus(false, $result);
|
| 10 |
} else {
|
| 3 |
{
|
| 4 |
public function feedAction()
|
| 5 |
{
|
| 6 |
+
$feed = Mage::helper('channelengine/feed');
|
| 7 |
+
$result = $feed->generateFeeds();
|
| 8 |
if($result) {
|
| 9 |
$this->returnStatus(false, $result);
|
| 10 |
} else {
|
app/code/community/Tritac/ChannelEngine/etc/config.xml
CHANGED
|
@@ -2,7 +2,7 @@
|
|
| 2 |
<config>
|
| 3 |
<modules>
|
| 4 |
<Tritac_ChannelEngine>
|
| 5 |
-
<version>
|
| 6 |
</Tritac_ChannelEngine>
|
| 7 |
</modules>
|
| 8 |
|
|
@@ -195,7 +195,7 @@
|
|
| 195 |
<cron_expr>30 * * * *</cron_expr>
|
| 196 |
</schedule>
|
| 197 |
<run>
|
| 198 |
-
<model>channelengine/observer::
|
| 199 |
</run>
|
| 200 |
</channelengine_generate_feed>
|
| 201 |
</jobs>
|
| 2 |
<config>
|
| 3 |
<modules>
|
| 4 |
<Tritac_ChannelEngine>
|
| 5 |
+
<version>5.0.2</version>
|
| 6 |
</Tritac_ChannelEngine>
|
| 7 |
</modules>
|
| 8 |
|
| 195 |
<cron_expr>30 * * * *</cron_expr>
|
| 196 |
</schedule>
|
| 197 |
<run>
|
| 198 |
+
<model>channelengine/observer::generateFeeds</model>
|
| 199 |
</run>
|
| 200 |
</channelengine_generate_feed>
|
| 201 |
</jobs>
|
lib/ChannelEngine/composer.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
| 1 |
{
|
| 2 |
"require": {
|
| 3 |
-
"channelengine/api-client": "
|
| 4 |
}
|
| 5 |
}
|
| 1 |
{
|
| 2 |
"require": {
|
| 3 |
+
"channelengine/api-client-php": "^2.1"
|
| 4 |
}
|
| 5 |
}
|
package.xml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
| 1 |
<?xml version="1.0"?>
|
| 2 |
<package>
|
| 3 |
<name>Tritac_ChannelEngine</name>
|
| 4 |
-
<version>
|
| 5 |
<stability>stable</stability>
|
| 6 |
<license uri="http://opensource.org/licenses/osl-3.0.php">Open Software License (OSL)</license>
|
| 7 |
<channel>community</channel>
|
|
@@ -20,11 +20,11 @@ Features of ChannelEngine:
|
|
| 20 |
* Receive orders from marketplaces using one single connection.
|
| 21 |
* Using this magento extension you can connect to ChannelEngine instantly without any further configuration.
|
| 22 |
* For more information, visit: ChannelEngine.com</description>
|
| 23 |
-
<notes>*
|
| 24 |
<authors><author><name>Christiaan de Ridder</name><user>christiaander</user><email>support@channelengine.com</email></author></authors>
|
| 25 |
-
<date>2017-
|
| 26 |
-
<time>
|
| 27 |
-
<contents><target name="mageetc"><dir name="modules"><file name="Tritac_ChannelEngine.xml" hash="f6b4a6d9af9aa3bcd3019fd566d6a67c"/></dir></target><target name="magecommunity"><dir name="Tritac"><dir name="ChannelEngine"><dir name="Block"><dir name="Adminhtml"><dir name="System"><dir name="Config"><dir name="Form"><file name="Button.php" hash="1a665843a90bca8058a5aa55105f6caa"/><file name="Feed.php" hash="621f24ef43bc16c33f2c590fc6c3aca6"/><file name="Link.php" hash="f25fef9d460c12ef5e5f580516fcedb1"/><file name="Version.php" hash="d68dce8484984be51fac14e7f8a4d9cb"/></dir></dir></dir></dir><file name="Head.php" hash="98f6d4e3caf6f2d6b2ad001fe274cee7"/></dir><dir name="Helper"><file name="Data.php" hash="7053bcccd8e419e5bf736b061515259c"/></dir><dir name="Model"><dir name="Carrier"><file name="Channelengine.php" hash="b6e04e43096e934d57e8e8745dd67c75"/></dir><file name="Loader.php" hash="b8207f87e0e26c0b62b433ad44e85c58"/><file name="Observer.php" hash="34e27a045d7b9c4f3a4e03e37c15b92c"/><file name="Order.php" hash="7b5d59152a0341cf5bff5b7adf6c76b7"/><dir name="Payment"><dir name="Method"><file name="Channelengine.php" hash="b938300284d504de42dd04777c45c75b"/></dir></dir><dir name="Resource"><dir name="Order"><file name="Collection.php" hash="fedd812bdf0090a36ce7bdd23e7876f5"/></dir><file name="Order.php" hash="cab73cceec877cda4daadc5c66f356fe"/><file name="Setup.php" hash="ed5ca35f61e6158a8b617630ae84c5b8"/><dir name="Shipment"><file name="Collection.php" hash="56e7c3bee221edefdcb587801bd36cc2"/></dir><file name="Shipment.php" hash="e09302f0ff110b94fc34031ee9255caa"/></dir><file name="Shipment.php" hash="5aa413e4e1ca441456d0d28ed541d2fc"/><dir name="System"><dir name="Config"><dir name="Source"><file name="Gtin.php" hash="d2c18169dfaf87a01d9d7357329f1c78"/><file name="Shipping.php" hash="00d71eaebba3014fe9d17ee75f7cf0a9"/></dir></dir></dir></dir><dir name="controllers"><dir name="Adminhtml"><file name="GenerateController.php" hash="546bf4a6eac28e2c23838dbb4a2791cb"/></dir></dir><dir name="etc"><file name="adminhtml.xml" hash="2a9dc6ac1738bebb470c1aa699478467"/><file name="config.xml" hash="e8d1bc06fe36a0f7fe62e7995d9cbaee"/><file name="system.xml" hash="bc0210d6c9531e933995d0b09c01bd0f"/></dir><dir name="sql"><dir name="channelengine_setup"><file name="mysql4-install-1.0.0.php" hash="6d04678d7750ff3de5a9eb697c13d52f"/><file name="mysql4-upgrade-2.6.0-2.7.0.php" hash="1f8c2f9d0239c9fbf31d3bfdd1c6cc46"/></dir></dir></dir></dir></target><target name="magelib"><dir name="ChannelEngine"><file name="composer.json" hash="0409500a61e93de939a4dbe6a287db9b"/><file name="composer.lock" hash="6564646e142a50bab18a5d2c0ec6438a"/><dir name="vendor"><file name="autoload.php" hash="a318487cebe1e11bb07ff9ca3859f466"/><dir name="channelengine"><dir name="api-client"><file name="README.md" hash="bd216e504ca4e5db1e0b44031b52d279"/><file name="api-client.sublime-project" hash="3b415c0c18b0c5aba978e919389acb31"/><file name="autoload.php" hash="705933da41eaf10d3874a1843118558c"/><file name="composer.json" hash="22f8d07476d06c404c059ff9da66f31f"/><dir name="docs"><dir name="Api"><file name="BackOrderApi.md" hash="502a8dd3880ae59abd08d1d0e5a1abeb"/><file name="CancellationApi.md" hash="603fc4f25887e55a97f2aec34109d8a3"/><file name="ClientApi.md" hash="1569a1fd53bde30b8b04bebec5c12756"/><file name="OrderApi.md" hash="2d5adef1989c78c406bd97d5ffec3744"/><file name="ProductApi.md" hash="dee883c5ab049bab98c25b26ad615e88"/><file name="ReturnApi.md" hash="4994513857e57786beb793523769a225"/><file name="ShipmentApi.md" hash="c8cb49e2b8bbc728106acc6f3b00c591"/></dir><dir name="Model"><file name="ApiResponse.md" hash="c2c27b0cde81c5b1fe3e7eb16fc0f491"/><file name="BackOrder.md" hash="84a6006f4447ec2f3bc38e1f4f6aa032"/><file name="BackOrderLine.md" hash="95579a0724930de6e28616a0ef24fb44"/><file name="ChannelCancellationLineResponse.md" hash="60cd567274761c97d498b96a419b3d90"/><file name="ChannelCancellationResponse.md" hash="d26af09dc0e5896af8255e6fa46f6398"/><file name="ChannelOfferResponse.md" hash="665ca9f581db6f876240e3afca489b43"/><file name="ChannelOrderLineRequest.md" hash="63e6f8749551c7e6e35654b7d757d32f"/><file name="ChannelOrderRequest.md" hash="d153101ffafe1f007aaa5ae1bb2b6ef8"/><file name="ChannelProcessedChangesRequest.md" hash="4a340f2bf061c99c2f0dc9ff08cf7eff"/><file name="ChannelProductChangesResponse.md" hash="1d60c94776a102ce70adfe423053662c"/><file name="ChannelProductResponse.md" hash="ab03738a7d36ca757d4d760f494f34eb"/><file name="ChannelReferencesRequest.md" hash="0093f0fb9f984d1b5487a21e7f228881"/><file name="ChannelReturnLineRequest.md" hash="8772b0e3d83aa4d9b9a5096d4e7d3a71"/><file name="ChannelReturnLineResponse.md" hash="3776c0d0d4c55b771f56cf7d54dfcbd6"/><file name="ChannelReturnRequest.md" hash="e3f7f0bac18928f306c7a6250a33559c"/><file name="ChannelReturnResponse.md" hash="fce03223b6d72522aaebbc571710c184"/><file name="ChannelShipmentLineResponse.md" hash="7af4b4969f67785856935ea2157ef777"/><file name="ChannelShipmentResponse.md" hash="d08e3ffaa74bb3cfacc302ab4ecc6647"/><file name="CollectionOfBackOrder.md" hash="a598d6feabc24120bb32d27039257815"/><file name="CollectionOfChannelCancellationResponse.md" hash="17d808e9a597a7b577f06dda3826b209"/><file name="CollectionOfChannelOfferResponse.md" hash="960220f338c97e7f7f8d22d6a1dda078"/><file name="CollectionOfChannelReturnResponse.md" hash="5aa569265ef1bffe72598717b54eb744"/><file name="CollectionOfChannelShipmentResponse.md" hash="921c98e16402963a54914a49b2ae4315"/><file name="CollectionOfMerchantOrderResponse.md" hash="2b485b16c88d9b572a920832cee2d640"/><file name="CollectionOfMerchantReturnResponse.md" hash="28e166e6c4334999d01e72ed45b9f1cd"/><file name="EntitiesAddressModels.md" hash="a39c3572451706980ef8ca89150839d1"/><file name="ExtraDataItem.md" hash="0de36fae230fc29f94271b1d4cfda0be"/><file name="MerchantCancellationLineRequest.md" hash="7d34f8383485ab49aeefda8bfb7a5549"/><file name="MerchantCancellationRequest.md" hash="18b66e8fb6bac478187c47f9d1b9f33a"/><file name="MerchantOrderLineResponse.md" hash="2c9798e602c11355d27673d6dd5c595f"/><file name="MerchantOrderResponse.md" hash="aa294617b05c2ff8e1b8827e12dfbe58"/><file name="MerchantProductRequest.md" hash="b716f6455a82ac7edd34a805944e45be"/><file name="MerchantProductResponse.md" hash="1feac7443fa488fcf3049dd9fae9f9f3"/><file name="MerchantReturnLineRequest.md" hash="00ffe9d7430d1f8906664335f31dab47"/><file name="MerchantReturnLineResponse.md" hash="9d93c86dfc723c70013b38194821a4c0"/><file name="MerchantReturnRequest.md" hash="c6f8feb89091a6934edda9afc303055d"/><file name="MerchantReturnResponse.md" hash="68556dd65cf825c8bbfc9c4258732890"/><file name="MerchantShipmentLineRequest.md" hash="c64bb2841e6220eebec76af08f6521b4"/><file name="MerchantShipmentRequest.md" hash="a6375c9cd3353a9e1f58ecd13bc9db46"/><file name="MerchantShipmentTrackingRequest.md" hash="31de02f6fc295de48495954e0661cedf"/><file name="OrderAcknowledgement.md" hash="4efbc52fac5d1096411b71dbf9eadfc8"/><file name="ProductCreationResult.md" hash="f7405b1242dac1e7691fea916126a762"/><file name="ProductMessage.md" hash="f0183ec14571d04083c97184fd0d0cb0"/><file name="SingleOfBackOrder.md" hash="40d153f95799d834702713f67f51f2dd"/><file name="SingleOfChannelProductChangesResponse.md" hash="66b59de7b2664656f0dbe41aaf236bc2"/><file name="SingleOfMerchantProductResponse.md" hash="0bb93f7335afe61d1f3085147eb2c62f"/><file name="SingleOfProductCreationResult.md" hash="b716e0f72131560a100ea752486b6fb0"/></dir></dir><file name="git_push.sh" hash="cb43424bd3b91aad6248982e6d022abf"/><dir name="lib"><dir name="Api"><file name="BackOrderApi.php" hash="5e81ec4edf4158643bec19b4bc1626f2"/><file name="CancellationApi.php" hash="d8dd5fc664e97e48a2b4d8675398075f"/><file name="ClientApi.php" hash="27b7e36e2e2a58a48e23b9b3d60718a0"/><file name="OrderApi.php" hash="878b6aef80ca14ae6e78e22e3e23d272"/><file name="ProductApi.php" hash="e2fda0f0bd93d83a8fd3341248951370"/><file name="ReturnApi.php" hash="bab74b31173552b26ddded0ab634f791"/><file name="ShipmentApi.php" hash="c959703b9f4b0625857909305f2bce9c"/></dir><file name="ApiClient.php" hash="842d8cc43ed577f9c6309325274cae8b"/><file name="ApiException.php" hash="35e42f31a447db6fa7829f3921bb71f3"/><file name="Configuration.php" hash="31b0a02797b7a7be75aee5882e4a71a4"/><dir name="Model"><file name="ApiResponse.php" hash="0a3b05df633ae7f3ab07a11a125fca9c"/><file name="BackOrder.php" hash="8381e382e6cb0003122fe0cf6724ffc6"/><file name="BackOrderLine.php" hash="d7bce03323b7fc81a247e9d2d1013a3b"/><file name="ChannelCancellationLineResponse.php" hash="bca9fdefe0c204ee9ef232f963b3de47"/><file name="ChannelCancellationResponse.php" hash="e67a3c71c1f2b233cc76d6a105cb3e3e"/><file name="ChannelOfferResponse.php" hash="c0dcfdd5e2176537cf8c65786806ab78"/><file name="ChannelOrderLineRequest.php" hash="e1731a835a52ce636c78782d87dc8ff6"/><file name="ChannelOrderRequest.php" hash="f76b555f79c9ef7bc891fb1e8c272702"/><file name="ChannelProcessedChangesRequest.php" hash="811154776d351b4a4b4cfdd8e52dabea"/><file name="ChannelProductChangesResponse.php" hash="4005bddd62fb2f3fa8c5cbd18915c769"/><file name="ChannelProductResponse.php" hash="5c56cb7c3e7b066a416e492cea0ae5a3"/><file name="ChannelReferencesRequest.php" hash="8475df642ea577070897525ec531df5a"/><file name="ChannelReturnLineRequest.php" hash="efb6cafb95306f9a1daa174cdced04da"/><file name="ChannelReturnLineResponse.php" hash="cb278e5cb10e4f8e96319fdfdcd011e5"/><file name="ChannelReturnRequest.php" hash="ec2e7c79e2f64c88ed3022d5b777132a"/><file name="ChannelReturnResponse.php" hash="d4476c0c9c9254a7e61efaf733a99633"/><file name="ChannelShipmentLineResponse.php" hash="05c3bf0d034f2ec710d5c31d787995ae"/><file name="ChannelShipmentResponse.php" hash="018ba0efa56760cc898db241c4fb1960"/><file name="CollectionOfBackOrder.php" hash="ceb2f8cce017d574f95c31fd710925db"/><file name="CollectionOfChannelCancellationResponse.php" hash="d16d711ec15156e378ef1d47cb7c2035"/><file name="CollectionOfChannelOfferResponse.php" hash="e2aa6951e00d415a0e1d01fb5039c571"/><file name="CollectionOfChannelReturnResponse.php" hash="82fbfd1ab05901cd5f9ed0378315ff21"/><file name="CollectionOfChannelShipmentResponse.php" hash="6887ab42ff36160caeea7fe3e7a81a3f"/><file name="CollectionOfMerchantOrderResponse.php" hash="25c69cc1c18d5d378a66b4b6510c90ad"/><file name="CollectionOfMerchantReturnResponse.php" hash="3cb0aae8dc98658933abe39596112238"/><file name="EntitiesAddressModels.php" hash="0e77da388045bcd741491f0e808c5590"/><file name="ExtraDataItem.php" hash="fd4591749f2db73f7419fa60eb61ece1"/><file name="MerchantCancellationLineRequest.php" hash="fc592a1326f5d757518f136868e79abe"/><file name="MerchantCancellationRequest.php" hash="aa91c8397263205bd2ea352487a4789b"/><file name="MerchantOrderLineResponse.php" hash="3a03961b88af656a8d445fd6ad362c61"/><file name="MerchantOrderResponse.php" hash="204e6f13d44bc7c39359db3dfbc259e8"/><file name="MerchantProductRequest.php" hash="d30cac5bde0749267b31122027b5faf3"/><file name="MerchantProductResponse.php" hash="59637638ced5d01950f74e129f17118f"/><file name="MerchantReturnLineRequest.php" hash="febc3d102920720bab159b3cc7b096f1"/><file name="MerchantReturnLineResponse.php" hash="1c684535ba88a7667920b3d7e75e3864"/><file name="MerchantReturnRequest.php" hash="50ee599cf61519fed768072a87c4dd8c"/><file name="MerchantReturnResponse.php" hash="01b709acf280d9c068e6d201e09a5222"/><file name="MerchantShipmentLineRequest.php" hash="5304190e3a68136f3c0aec3de99e2424"/><file name="MerchantShipmentRequest.php" hash="541886892421fb9b2d358578779ca849"/><file name="MerchantShipmentTrackingRequest.php" hash="037a86688447c3fb348221e2ce587265"/><file name="OrderAcknowledgement.php" hash="dda1ada83257f1ee8aecae11c0fa3e32"/><file name="ProductCreationResult.php" hash="889dc202026af5080801077a48361c64"/><file name="ProductMessage.php" hash="673e069e1fc5e6ad9f05825f57922d25"/><file name="SingleOfBackOrder.php" hash="f2c5ea0cb45bba633e37b3f7fdd6b5ca"/><file name="SingleOfChannelProductChangesResponse.php" hash="9bd19387159ffbc97e846c37f2414f43"/><file name="SingleOfMerchantProductResponse.php" hash="d729298d1ebc24064de1e157db0e5357"/><file name="SingleOfProductCreationResult.php" hash="dbd32037409ae8a9a6bc70e8bb394ef9"/></dir><file name="ObjectSerializer.php" hash="e6842da289d7dfa60c4ad2cd427f0ac5"/></dir><file name="phpunit.xml.dist" hash="82cdb47416d5294f68042ad4ef3bbdfb"/><dir name="test"><dir name="Api"><file name="BackOrderApiTest.php" hash="38eadf8e5bd8d5b64e751cd995a5d14c"/><file name="CancellationApiTest.php" hash="2e708e7da73249459a5f2135bf7a6493"/><file name="ClientApiTest.php" hash="9977a02ce29e75244a6cc0f77d7b2f2f"/><file name="OrderApiTest.php" hash="a5171f8ba78f55d71b500f0dd3ffd339"/><file name="ProductApiTest.php" hash="8e2c07929122cae5f2bca51e9b3f7a53"/><file name="ReturnApiTest.php" hash="6f41f9c096a319c8ffdd1512ea6eeeb3"/><file name="ShipmentApiTest.php" hash="69ce282bb21987efcaf9ef58a4e3c929"/></dir><dir name="Model"><file name="ApiResponseTest.php" hash="47ad10b81c24c046d26a721593743549"/><file name="BackOrderLineTest.php" hash="386d64b5b048dba890fdf527a9384bdc"/><file name="BackOrderTest.php" hash="20db2c9fc8bc7b2ee95b23217ec90324"/><file name="ChannelCancellationLineResponseTest.php" hash="c3911b9a14fa6e6e224e1fef0d14ebe3"/><file name="ChannelCancellationResponseTest.php" hash="5ac4db00dec924f7991e30f7cd851a85"/><file name="ChannelOfferResponseTest.php" hash="864f75a5ec3d1164a494fa7611a99d74"/><file name="ChannelOrderLineRequestTest.php" hash="1bc6bdc75b0ca3f7fc81600b00adce9e"/><file name="ChannelOrderRequestTest.php" hash="28e9fcf7f92df24cd4eade51e924c418"/><file name="ChannelProcessedChangesRequestTest.php" hash="2e31c7235b56f4c78ca961692740b2a4"/><file name="ChannelProductChangesResponseTest.php" hash="23f00d9199f2cc208efc55ecdf9365c6"/><file name="ChannelProductResponseTest.php" hash="a28341ed1fef5facb5ff2f2c30a1fe6f"/><file name="ChannelReferencesRequestTest.php" hash="cde66fa66d8ba5d6d2d9179e37e6d9f2"/><file name="ChannelReturnLineRequestTest.php" hash="ed6494db84eedab689da22870e0ad909"/><file name="ChannelReturnLineResponseTest.php" hash="e914765391866a51659fd4022381f760"/><file name="ChannelReturnRequestTest.php" hash="96080f38514039e9f5bd97c49575bd8c"/><file name="ChannelReturnResponseTest.php" hash="02fbc0c9be981e10fa825d40ce77b1cd"/><file name="ChannelShipmentLineResponseTest.php" hash="4b2876b2f6cc0466a1575348a04aeab6"/><file name="ChannelShipmentResponseTest.php" hash="d8fb3ed6643a2da9139873b9f40e1ded"/><file name="CollectionOfBackOrderTest.php" hash="5b213ba119b95cc1b1cd47f38c7ae4ae"/><file name="CollectionOfChannelCancellationResponseTest.php" hash="d1aafe9dfddb92125a7613194ba04d1d"/><file name="CollectionOfChannelOfferResponseTest.php" hash="178d3c84aacd4f3ad3edc84a17bdbf02"/><file name="CollectionOfChannelReturnResponseTest.php" hash="6d53549630c3337a31bb1ecb87e61555"/><file name="CollectionOfChannelShipmentResponseTest.php" hash="a934c9bf97695687f3a2d5116fedae58"/><file name="CollectionOfMerchantOrderResponseTest.php" hash="7428c9b0708ca263a036ff90a9278e08"/><file name="CollectionOfMerchantReturnResponseTest.php" hash="9215b1ef54894b1d18c74b165521962d"/><file name="EntitiesAddressModelsTest.php" hash="7ce550b6e3c4eba3a17e8a1c026ecb72"/><file name="ExtraDataItemTest.php" hash="caa7c4e33ad26050ede14df690d94ce2"/><file name="MerchantCancellationLineRequestTest.php" hash="f06c4131e5472a835c82c0f46d035c6d"/><file name="MerchantCancellationRequestTest.php" hash="f8d8cc7821aa1ecf842935656019a914"/><file name="MerchantOrderLineResponseTest.php" hash="b22d878593d9286a96733cf7d19a19c5"/><file name="MerchantOrderResponseTest.php" hash="0aab3e4a85d092aa9dd5ae353a61c027"/><file name="MerchantProductRequestTest.php" hash="e9f310562cca319e8e25220dcda2fd5c"/><file name="MerchantProductResponseTest.php" hash="5ca76d16364c27f5a5dd7f0ee41ac9b4"/><file name="MerchantReturnLineRequestTest.php" hash="a5c136a8524288aca4ac9cb356dcdc2a"/><file name="MerchantReturnLineResponseTest.php" hash="3d5dbd7817316a7d05c0472d7abf5017"/><file name="MerchantReturnRequestTest.php" hash="aab02e41fa8a30c80323758cf823e70e"/><file name="MerchantReturnResponseTest.php" hash="216d32bab151c70cc757dd3604548980"/><file name="MerchantShipmentLineRequestTest.php" hash="fb14a111aa135c9c2fbf8426fe4ec209"/><file name="MerchantShipmentRequestTest.php" hash="9b654c3525eb68df96dd267fc90575f2"/><file name="MerchantShipmentTrackingRequestTest.php" hash="a2e71dd4870faba873059a1f00ef6a3a"/><file name="OrderAcknowledgementTest.php" hash="ec258b97dcdea4cf0f32abbe4dca3846"/><file name="ProductCreationResultTest.php" hash="925f49219cb866042d0f5fa3b3bbceb2"/><file name="ProductMessageTest.php" hash="70c0ef075db83195b5767fd21cb0e1a9"/><file name="SingleOfBackOrderTest.php" hash="56ec1bd486a42d7bee62d5aac02dccd2"/><file name="SingleOfChannelProductChangesResponseTest.php" hash="6687c279b79298dc67490387637d19fb"/><file name="SingleOfMerchantProductResponseTest.php" hash="856d0ed5e85f30d263dc3f4b5a59e58a"/><file name="SingleOfProductCreationResultTest.php" hash="02720936c9cd7429c65ae0ebe6a57ecd"/></dir></dir><file name=".gitignore" hash="a72c432223a956b74e9bd5ea5dd8b8c3"/><file name=".php_cs" hash="a921a6cf564b1304d4ff8721ab46d435"/><file name=".travis.yml" hash="8c1fae058e6e8d1f0d2fd39dc488a850"/></dir></dir><dir name="composer"><file name="ClassLoader.php" hash="292c079dbe63ba06bfbf37fd99fe4bf9"/><file name="LICENSE" hash="955d5fe58c231244f6b49000f383b5e2"/><file name="autoload_classmap.php" hash="8645d3a4e3ad87e7cf4d88a46717aab4"/><file name="autoload_namespaces.php" hash="35e12c7d76c4a81633bcf547c0e229a9"/><file name="autoload_psr4.php" hash="34e17c04104094e954858e2e564ff4b0"/><file name="autoload_real.php" hash="692ff591b75b6853c6661061389055a9"/><file name="autoload_static.php" hash="e4628c11a0745f787a3e9de5a5de4ad7"/><file name="installed.json" hash="cd50a8b83c078b04628a5aa85e5551b5"/></dir></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="channelengine.xml" hash="ae6a00b46a84a610964743034eb72081"/></dir><dir name="template"><dir name="channelengine"><dir name="checkout"><file name="success.phtml" hash="dbcb8298cd52a3c44560ae911349a3c7"/></dir><file name="head.phtml" hash="a7a7ab566adc1dc7d2645bf1cdfac0d4"/></dir></dir></dir></dir></dir><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="template"><dir name="channelengine"><dir name="system"><dir name="config"><dir name="form"><file name="ajax_button.phtml" hash="882106ebb297393737bdf97d2ddc8e41"/></dir></dir></dir></dir></dir></dir></dir></dir></target></contents>
|
| 28 |
<compatible/>
|
| 29 |
-
<dependencies><required><php><min>5.4.0</min><max>7.
|
| 30 |
</package>
|
| 1 |
<?xml version="1.0"?>
|
| 2 |
<package>
|
| 3 |
<name>Tritac_ChannelEngine</name>
|
| 4 |
+
<version>5.0.2</version>
|
| 5 |
<stability>stable</stability>
|
| 6 |
<license uri="http://opensource.org/licenses/osl-3.0.php">Open Software License (OSL)</license>
|
| 7 |
<channel>community</channel>
|
| 20 |
* Receive orders from marketplaces using one single connection.
|
| 21 |
* Using this magento extension you can connect to ChannelEngine instantly without any further configuration.
|
| 22 |
* For more information, visit: ChannelEngine.com</description>
|
| 23 |
+
<notes>* Improved feed generation</notes>
|
| 24 |
<authors><author><name>Christiaan de Ridder</name><user>christiaander</user><email>support@channelengine.com</email></author></authors>
|
| 25 |
+
<date>2017-07-31</date>
|
| 26 |
+
<time>12:15:40</time>
|
| 27 |
+
<contents><target name="mageetc"><dir name="modules"><file name="Tritac_ChannelEngine.xml" hash="f6b4a6d9af9aa3bcd3019fd566d6a67c"/></dir></target><target name="magecommunity"><dir name="Tritac"><dir name="ChannelEngine"><dir name="Block"><dir name="Adminhtml"><dir name="System"><dir name="Config"><dir name="Form"><file name="Button.php" hash="1a665843a90bca8058a5aa55105f6caa"/><file name="Feed.php" hash="621f24ef43bc16c33f2c590fc6c3aca6"/><file name="Link.php" hash="f25fef9d460c12ef5e5f580516fcedb1"/><file name="Version.php" hash="d68dce8484984be51fac14e7f8a4d9cb"/></dir></dir></dir></dir><file name="Head.php" hash="4d4dd3ce734e647058800282c6db2f8c"/></dir><dir name="Helper"><file name="Data.php" hash="8a1e1421d74fe1105501dfec2b7f2f86"/><file name="Feed.php" hash="b88acc8682d2f3893c288ea7310fe648"/></dir><dir name="Model"><dir name="Carrier"><file name="Channelengine.php" hash="b6e04e43096e934d57e8e8745dd67c75"/></dir><file name="Loader.php" hash="0b43c830760378009073df3df91b0168"/><file name="Observer.php" hash="6983546240a15e69e5521f4ab94fee6f"/><file name="Order.php" hash="7b5d59152a0341cf5bff5b7adf6c76b7"/><dir name="Payment"><dir name="Method"><file name="Channelengine.php" hash="b938300284d504de42dd04777c45c75b"/></dir></dir><dir name="Resource"><dir name="Order"><file name="Collection.php" hash="fedd812bdf0090a36ce7bdd23e7876f5"/></dir><file name="Order.php" hash="cab73cceec877cda4daadc5c66f356fe"/><file name="Setup.php" hash="ed5ca35f61e6158a8b617630ae84c5b8"/><dir name="Shipment"><file name="Collection.php" hash="56e7c3bee221edefdcb587801bd36cc2"/></dir><file name="Shipment.php" hash="e09302f0ff110b94fc34031ee9255caa"/></dir><file name="Shipment.php" hash="5aa413e4e1ca441456d0d28ed541d2fc"/><dir name="System"><dir name="Config"><dir name="Source"><file name="Gtin.php" hash="d2c18169dfaf87a01d9d7357329f1c78"/><file name="Shipping.php" hash="00d71eaebba3014fe9d17ee75f7cf0a9"/></dir></dir></dir></dir><dir name="controllers"><dir name="Adminhtml"><file name="GenerateController.php" hash="b26f6d8ef198f292a74a4074882f9ac6"/></dir></dir><dir name="etc"><file name="adminhtml.xml" hash="2a9dc6ac1738bebb470c1aa699478467"/><file name="config.xml" hash="c4fd13b3e538de547ace051331364d5c"/><file name="system.xml" hash="bc0210d6c9531e933995d0b09c01bd0f"/></dir><dir name="sql"><dir name="channelengine_setup"><file name="mysql4-install-1.0.0.php" hash="6d04678d7750ff3de5a9eb697c13d52f"/><file name="mysql4-upgrade-2.6.0-2.7.0.php" hash="1f8c2f9d0239c9fbf31d3bfdd1c6cc46"/></dir></dir></dir></dir></target><target name="magelib"><dir name="ChannelEngine"><file name="composer.json" hash="bd56f4f1fde7d3b49882c621626049dd"/><file name="composer.lock" hash="6564646e142a50bab18a5d2c0ec6438a"/><dir name="vendor"><file name="autoload.php" hash="a318487cebe1e11bb07ff9ca3859f466"/><dir name="channelengine"><dir name="api-client"><file name="README.md" hash="bd216e504ca4e5db1e0b44031b52d279"/><file name="api-client.sublime-project" hash="3b415c0c18b0c5aba978e919389acb31"/><file name="autoload.php" hash="705933da41eaf10d3874a1843118558c"/><file name="composer.json" hash="22f8d07476d06c404c059ff9da66f31f"/><dir name="docs"><dir name="Api"><file name="BackOrderApi.md" hash="502a8dd3880ae59abd08d1d0e5a1abeb"/><file name="CancellationApi.md" hash="603fc4f25887e55a97f2aec34109d8a3"/><file name="ClientApi.md" hash="1569a1fd53bde30b8b04bebec5c12756"/><file name="OrderApi.md" hash="2d5adef1989c78c406bd97d5ffec3744"/><file name="ProductApi.md" hash="dee883c5ab049bab98c25b26ad615e88"/><file name="ReturnApi.md" hash="4994513857e57786beb793523769a225"/><file name="ShipmentApi.md" hash="c8cb49e2b8bbc728106acc6f3b00c591"/></dir><dir name="Model"><file name="ApiResponse.md" hash="c2c27b0cde81c5b1fe3e7eb16fc0f491"/><file name="BackOrder.md" hash="84a6006f4447ec2f3bc38e1f4f6aa032"/><file name="BackOrderLine.md" hash="95579a0724930de6e28616a0ef24fb44"/><file name="ChannelCancellationLineResponse.md" hash="60cd567274761c97d498b96a419b3d90"/><file name="ChannelCancellationResponse.md" hash="d26af09dc0e5896af8255e6fa46f6398"/><file name="ChannelOfferResponse.md" hash="665ca9f581db6f876240e3afca489b43"/><file name="ChannelOrderLineRequest.md" hash="63e6f8749551c7e6e35654b7d757d32f"/><file name="ChannelOrderRequest.md" hash="d153101ffafe1f007aaa5ae1bb2b6ef8"/><file name="ChannelProcessedChangesRequest.md" hash="4a340f2bf061c99c2f0dc9ff08cf7eff"/><file name="ChannelProductChangesResponse.md" hash="1d60c94776a102ce70adfe423053662c"/><file name="ChannelProductResponse.md" hash="ab03738a7d36ca757d4d760f494f34eb"/><file name="ChannelReferencesRequest.md" hash="0093f0fb9f984d1b5487a21e7f228881"/><file name="ChannelReturnLineRequest.md" hash="8772b0e3d83aa4d9b9a5096d4e7d3a71"/><file name="ChannelReturnLineResponse.md" hash="3776c0d0d4c55b771f56cf7d54dfcbd6"/><file name="ChannelReturnRequest.md" hash="e3f7f0bac18928f306c7a6250a33559c"/><file name="ChannelReturnResponse.md" hash="fce03223b6d72522aaebbc571710c184"/><file name="ChannelShipmentLineResponse.md" hash="7af4b4969f67785856935ea2157ef777"/><file name="ChannelShipmentResponse.md" hash="d08e3ffaa74bb3cfacc302ab4ecc6647"/><file name="CollectionOfBackOrder.md" hash="a598d6feabc24120bb32d27039257815"/><file name="CollectionOfChannelCancellationResponse.md" hash="17d808e9a597a7b577f06dda3826b209"/><file name="CollectionOfChannelOfferResponse.md" hash="960220f338c97e7f7f8d22d6a1dda078"/><file name="CollectionOfChannelReturnResponse.md" hash="5aa569265ef1bffe72598717b54eb744"/><file name="CollectionOfChannelShipmentResponse.md" hash="921c98e16402963a54914a49b2ae4315"/><file name="CollectionOfMerchantOrderResponse.md" hash="2b485b16c88d9b572a920832cee2d640"/><file name="CollectionOfMerchantReturnResponse.md" hash="28e166e6c4334999d01e72ed45b9f1cd"/><file name="EntitiesAddressModels.md" hash="a39c3572451706980ef8ca89150839d1"/><file name="ExtraDataItem.md" hash="0de36fae230fc29f94271b1d4cfda0be"/><file name="MerchantCancellationLineRequest.md" hash="7d34f8383485ab49aeefda8bfb7a5549"/><file name="MerchantCancellationRequest.md" hash="18b66e8fb6bac478187c47f9d1b9f33a"/><file name="MerchantOrderLineResponse.md" hash="2c9798e602c11355d27673d6dd5c595f"/><file name="MerchantOrderResponse.md" hash="aa294617b05c2ff8e1b8827e12dfbe58"/><file name="MerchantProductRequest.md" hash="b716f6455a82ac7edd34a805944e45be"/><file name="MerchantProductResponse.md" hash="1feac7443fa488fcf3049dd9fae9f9f3"/><file name="MerchantReturnLineRequest.md" hash="00ffe9d7430d1f8906664335f31dab47"/><file name="MerchantReturnLineResponse.md" hash="9d93c86dfc723c70013b38194821a4c0"/><file name="MerchantReturnRequest.md" hash="c6f8feb89091a6934edda9afc303055d"/><file name="MerchantReturnResponse.md" hash="68556dd65cf825c8bbfc9c4258732890"/><file name="MerchantShipmentLineRequest.md" hash="c64bb2841e6220eebec76af08f6521b4"/><file name="MerchantShipmentRequest.md" hash="a6375c9cd3353a9e1f58ecd13bc9db46"/><file name="MerchantShipmentTrackingRequest.md" hash="31de02f6fc295de48495954e0661cedf"/><file name="OrderAcknowledgement.md" hash="4efbc52fac5d1096411b71dbf9eadfc8"/><file name="ProductCreationResult.md" hash="f7405b1242dac1e7691fea916126a762"/><file name="ProductMessage.md" hash="f0183ec14571d04083c97184fd0d0cb0"/><file name="SingleOfBackOrder.md" hash="40d153f95799d834702713f67f51f2dd"/><file name="SingleOfChannelProductChangesResponse.md" hash="66b59de7b2664656f0dbe41aaf236bc2"/><file name="SingleOfMerchantProductResponse.md" hash="0bb93f7335afe61d1f3085147eb2c62f"/><file name="SingleOfProductCreationResult.md" hash="b716e0f72131560a100ea752486b6fb0"/></dir></dir><file name="git_push.sh" hash="cb43424bd3b91aad6248982e6d022abf"/><dir name="lib"><dir name="Api"><file name="BackOrderApi.php" hash="5e81ec4edf4158643bec19b4bc1626f2"/><file name="CancellationApi.php" hash="d8dd5fc664e97e48a2b4d8675398075f"/><file name="ClientApi.php" hash="27b7e36e2e2a58a48e23b9b3d60718a0"/><file name="OrderApi.php" hash="878b6aef80ca14ae6e78e22e3e23d272"/><file name="ProductApi.php" hash="e2fda0f0bd93d83a8fd3341248951370"/><file name="ReturnApi.php" hash="bab74b31173552b26ddded0ab634f791"/><file name="ShipmentApi.php" hash="c959703b9f4b0625857909305f2bce9c"/></dir><file name="ApiClient.php" hash="842d8cc43ed577f9c6309325274cae8b"/><file name="ApiException.php" hash="35e42f31a447db6fa7829f3921bb71f3"/><file name="Configuration.php" hash="31b0a02797b7a7be75aee5882e4a71a4"/><dir name="Model"><file name="ApiResponse.php" hash="0a3b05df633ae7f3ab07a11a125fca9c"/><file name="BackOrder.php" hash="8381e382e6cb0003122fe0cf6724ffc6"/><file name="BackOrderLine.php" hash="d7bce03323b7fc81a247e9d2d1013a3b"/><file name="ChannelCancellationLineResponse.php" hash="bca9fdefe0c204ee9ef232f963b3de47"/><file name="ChannelCancellationResponse.php" hash="e67a3c71c1f2b233cc76d6a105cb3e3e"/><file name="ChannelOfferResponse.php" hash="c0dcfdd5e2176537cf8c65786806ab78"/><file name="ChannelOrderLineRequest.php" hash="e1731a835a52ce636c78782d87dc8ff6"/><file name="ChannelOrderRequest.php" hash="f76b555f79c9ef7bc891fb1e8c272702"/><file name="ChannelProcessedChangesRequest.php" hash="811154776d351b4a4b4cfdd8e52dabea"/><file name="ChannelProductChangesResponse.php" hash="4005bddd62fb2f3fa8c5cbd18915c769"/><file name="ChannelProductResponse.php" hash="5c56cb7c3e7b066a416e492cea0ae5a3"/><file name="ChannelReferencesRequest.php" hash="8475df642ea577070897525ec531df5a"/><file name="ChannelReturnLineRequest.php" hash="efb6cafb95306f9a1daa174cdced04da"/><file name="ChannelReturnLineResponse.php" hash="cb278e5cb10e4f8e96319fdfdcd011e5"/><file name="ChannelReturnRequest.php" hash="ec2e7c79e2f64c88ed3022d5b777132a"/><file name="ChannelReturnResponse.php" hash="d4476c0c9c9254a7e61efaf733a99633"/><file name="ChannelShipmentLineResponse.php" hash="05c3bf0d034f2ec710d5c31d787995ae"/><file name="ChannelShipmentResponse.php" hash="018ba0efa56760cc898db241c4fb1960"/><file name="CollectionOfBackOrder.php" hash="ceb2f8cce017d574f95c31fd710925db"/><file name="CollectionOfChannelCancellationResponse.php" hash="d16d711ec15156e378ef1d47cb7c2035"/><file name="CollectionOfChannelOfferResponse.php" hash="e2aa6951e00d415a0e1d01fb5039c571"/><file name="CollectionOfChannelReturnResponse.php" hash="82fbfd1ab05901cd5f9ed0378315ff21"/><file name="CollectionOfChannelShipmentResponse.php" hash="6887ab42ff36160caeea7fe3e7a81a3f"/><file name="CollectionOfMerchantOrderResponse.php" hash="25c69cc1c18d5d378a66b4b6510c90ad"/><file name="CollectionOfMerchantReturnResponse.php" hash="3cb0aae8dc98658933abe39596112238"/><file name="EntitiesAddressModels.php" hash="0e77da388045bcd741491f0e808c5590"/><file name="ExtraDataItem.php" hash="fd4591749f2db73f7419fa60eb61ece1"/><file name="MerchantCancellationLineRequest.php" hash="fc592a1326f5d757518f136868e79abe"/><file name="MerchantCancellationRequest.php" hash="aa91c8397263205bd2ea352487a4789b"/><file name="MerchantOrderLineResponse.php" hash="3a03961b88af656a8d445fd6ad362c61"/><file name="MerchantOrderResponse.php" hash="204e6f13d44bc7c39359db3dfbc259e8"/><file name="MerchantProductRequest.php" hash="d30cac5bde0749267b31122027b5faf3"/><file name="MerchantProductResponse.php" hash="59637638ced5d01950f74e129f17118f"/><file name="MerchantReturnLineRequest.php" hash="febc3d102920720bab159b3cc7b096f1"/><file name="MerchantReturnLineResponse.php" hash="1c684535ba88a7667920b3d7e75e3864"/><file name="MerchantReturnRequest.php" hash="50ee599cf61519fed768072a87c4dd8c"/><file name="MerchantReturnResponse.php" hash="01b709acf280d9c068e6d201e09a5222"/><file name="MerchantShipmentLineRequest.php" hash="5304190e3a68136f3c0aec3de99e2424"/><file name="MerchantShipmentRequest.php" hash="541886892421fb9b2d358578779ca849"/><file name="MerchantShipmentTrackingRequest.php" hash="037a86688447c3fb348221e2ce587265"/><file name="OrderAcknowledgement.php" hash="dda1ada83257f1ee8aecae11c0fa3e32"/><file name="ProductCreationResult.php" hash="889dc202026af5080801077a48361c64"/><file name="ProductMessage.php" hash="673e069e1fc5e6ad9f05825f57922d25"/><file name="SingleOfBackOrder.php" hash="f2c5ea0cb45bba633e37b3f7fdd6b5ca"/><file name="SingleOfChannelProductChangesResponse.php" hash="9bd19387159ffbc97e846c37f2414f43"/><file name="SingleOfMerchantProductResponse.php" hash="d729298d1ebc24064de1e157db0e5357"/><file name="SingleOfProductCreationResult.php" hash="dbd32037409ae8a9a6bc70e8bb394ef9"/></dir><file name="ObjectSerializer.php" hash="e6842da289d7dfa60c4ad2cd427f0ac5"/></dir><file name="phpunit.xml.dist" hash="82cdb47416d5294f68042ad4ef3bbdfb"/><dir name="test"><dir name="Api"><file name="BackOrderApiTest.php" hash="38eadf8e5bd8d5b64e751cd995a5d14c"/><file name="CancellationApiTest.php" hash="2e708e7da73249459a5f2135bf7a6493"/><file name="ClientApiTest.php" hash="9977a02ce29e75244a6cc0f77d7b2f2f"/><file name="OrderApiTest.php" hash="a5171f8ba78f55d71b500f0dd3ffd339"/><file name="ProductApiTest.php" hash="8e2c07929122cae5f2bca51e9b3f7a53"/><file name="ReturnApiTest.php" hash="6f41f9c096a319c8ffdd1512ea6eeeb3"/><file name="ShipmentApiTest.php" hash="69ce282bb21987efcaf9ef58a4e3c929"/></dir><dir name="Model"><file name="ApiResponseTest.php" hash="47ad10b81c24c046d26a721593743549"/><file name="BackOrderLineTest.php" hash="386d64b5b048dba890fdf527a9384bdc"/><file name="BackOrderTest.php" hash="20db2c9fc8bc7b2ee95b23217ec90324"/><file name="ChannelCancellationLineResponseTest.php" hash="c3911b9a14fa6e6e224e1fef0d14ebe3"/><file name="ChannelCancellationResponseTest.php" hash="5ac4db00dec924f7991e30f7cd851a85"/><file name="ChannelOfferResponseTest.php" hash="864f75a5ec3d1164a494fa7611a99d74"/><file name="ChannelOrderLineRequestTest.php" hash="1bc6bdc75b0ca3f7fc81600b00adce9e"/><file name="ChannelOrderRequestTest.php" hash="28e9fcf7f92df24cd4eade51e924c418"/><file name="ChannelProcessedChangesRequestTest.php" hash="2e31c7235b56f4c78ca961692740b2a4"/><file name="ChannelProductChangesResponseTest.php" hash="23f00d9199f2cc208efc55ecdf9365c6"/><file name="ChannelProductResponseTest.php" hash="a28341ed1fef5facb5ff2f2c30a1fe6f"/><file name="ChannelReferencesRequestTest.php" hash="cde66fa66d8ba5d6d2d9179e37e6d9f2"/><file name="ChannelReturnLineRequestTest.php" hash="ed6494db84eedab689da22870e0ad909"/><file name="ChannelReturnLineResponseTest.php" hash="e914765391866a51659fd4022381f760"/><file name="ChannelReturnRequestTest.php" hash="96080f38514039e9f5bd97c49575bd8c"/><file name="ChannelReturnResponseTest.php" hash="02fbc0c9be981e10fa825d40ce77b1cd"/><file name="ChannelShipmentLineResponseTest.php" hash="4b2876b2f6cc0466a1575348a04aeab6"/><file name="ChannelShipmentResponseTest.php" hash="d8fb3ed6643a2da9139873b9f40e1ded"/><file name="CollectionOfBackOrderTest.php" hash="5b213ba119b95cc1b1cd47f38c7ae4ae"/><file name="CollectionOfChannelCancellationResponseTest.php" hash="d1aafe9dfddb92125a7613194ba04d1d"/><file name="CollectionOfChannelOfferResponseTest.php" hash="178d3c84aacd4f3ad3edc84a17bdbf02"/><file name="CollectionOfChannelReturnResponseTest.php" hash="6d53549630c3337a31bb1ecb87e61555"/><file name="CollectionOfChannelShipmentResponseTest.php" hash="a934c9bf97695687f3a2d5116fedae58"/><file name="CollectionOfMerchantOrderResponseTest.php" hash="7428c9b0708ca263a036ff90a9278e08"/><file name="CollectionOfMerchantReturnResponseTest.php" hash="9215b1ef54894b1d18c74b165521962d"/><file name="EntitiesAddressModelsTest.php" hash="7ce550b6e3c4eba3a17e8a1c026ecb72"/><file name="ExtraDataItemTest.php" hash="caa7c4e33ad26050ede14df690d94ce2"/><file name="MerchantCancellationLineRequestTest.php" hash="f06c4131e5472a835c82c0f46d035c6d"/><file name="MerchantCancellationRequestTest.php" hash="f8d8cc7821aa1ecf842935656019a914"/><file name="MerchantOrderLineResponseTest.php" hash="b22d878593d9286a96733cf7d19a19c5"/><file name="MerchantOrderResponseTest.php" hash="0aab3e4a85d092aa9dd5ae353a61c027"/><file name="MerchantProductRequestTest.php" hash="e9f310562cca319e8e25220dcda2fd5c"/><file name="MerchantProductResponseTest.php" hash="5ca76d16364c27f5a5dd7f0ee41ac9b4"/><file name="MerchantReturnLineRequestTest.php" hash="a5c136a8524288aca4ac9cb356dcdc2a"/><file name="MerchantReturnLineResponseTest.php" hash="3d5dbd7817316a7d05c0472d7abf5017"/><file name="MerchantReturnRequestTest.php" hash="aab02e41fa8a30c80323758cf823e70e"/><file name="MerchantReturnResponseTest.php" hash="216d32bab151c70cc757dd3604548980"/><file name="MerchantShipmentLineRequestTest.php" hash="fb14a111aa135c9c2fbf8426fe4ec209"/><file name="MerchantShipmentRequestTest.php" hash="9b654c3525eb68df96dd267fc90575f2"/><file name="MerchantShipmentTrackingRequestTest.php" hash="a2e71dd4870faba873059a1f00ef6a3a"/><file name="OrderAcknowledgementTest.php" hash="ec258b97dcdea4cf0f32abbe4dca3846"/><file name="ProductCreationResultTest.php" hash="925f49219cb866042d0f5fa3b3bbceb2"/><file name="ProductMessageTest.php" hash="70c0ef075db83195b5767fd21cb0e1a9"/><file name="SingleOfBackOrderTest.php" hash="56ec1bd486a42d7bee62d5aac02dccd2"/><file name="SingleOfChannelProductChangesResponseTest.php" hash="6687c279b79298dc67490387637d19fb"/><file name="SingleOfMerchantProductResponseTest.php" hash="856d0ed5e85f30d263dc3f4b5a59e58a"/><file name="SingleOfProductCreationResultTest.php" hash="02720936c9cd7429c65ae0ebe6a57ecd"/></dir></dir><file name=".gitignore" hash="a72c432223a956b74e9bd5ea5dd8b8c3"/><file name=".php_cs" hash="a921a6cf564b1304d4ff8721ab46d435"/><file name=".travis.yml" hash="8c1fae058e6e8d1f0d2fd39dc488a850"/></dir></dir><dir name="composer"><file name="ClassLoader.php" hash="292c079dbe63ba06bfbf37fd99fe4bf9"/><file name="LICENSE" hash="955d5fe58c231244f6b49000f383b5e2"/><file name="autoload_classmap.php" hash="8645d3a4e3ad87e7cf4d88a46717aab4"/><file name="autoload_namespaces.php" hash="35e12c7d76c4a81633bcf547c0e229a9"/><file name="autoload_psr4.php" hash="34e17c04104094e954858e2e564ff4b0"/><file name="autoload_real.php" hash="692ff591b75b6853c6661061389055a9"/><file name="autoload_static.php" hash="e4628c11a0745f787a3e9de5a5de4ad7"/><file name="installed.json" hash="cd50a8b83c078b04628a5aa85e5551b5"/></dir></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="channelengine.xml" hash="ae6a00b46a84a610964743034eb72081"/></dir><dir name="template"><dir name="channelengine"><dir name="checkout"><file name="success.phtml" hash="dbcb8298cd52a3c44560ae911349a3c7"/></dir><file name="head.phtml" hash="a7a7ab566adc1dc7d2645bf1cdfac0d4"/></dir></dir></dir></dir></dir><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="template"><dir name="channelengine"><dir name="system"><dir name="config"><dir name="form"><file name="ajax_button.phtml" hash="882106ebb297393737bdf97d2ddc8e41"/></dir></dir></dir></dir></dir></dir></dir></dir></target></contents>
|
| 28 |
<compatible/>
|
| 29 |
+
<dependencies><required><php><min>5.4.0</min><max>7.3.0</max></php><extension><name>curl</name><min/><max/></extension><extension><name>mbstring</name><min/><max/></extension><extension><name>json</name><min/><max/></extension></required></dependencies>
|
| 30 |
</package>
|
