Channelpilotsolutions_Channelpilot - Version 2.2.5

Version Notes

- general bugfixes
- improved performance for feed export
- added support to use the admin area for order import

Download this release

Release Info

Developer Magento Core Team
Extension Channelpilotsolutions_Channelpilot
Version 2.2.5
Comparing to
See all releases


Code changes from version 2.2.4.1 to 2.2.5

app/code/community/Channelpilotsolutions/Channelpilot/Block/Adminhtml/Field/Exportfields.php CHANGED
@@ -53,6 +53,8 @@ class Channelpilotsolutions_Channelpilot_Block_Adminhtml_Field_Exportfields exte
53
  $attributes[]['attribute_code'] = 'cp_color_attribute_id';
54
  $attributes[]['attribute_code'] = 'type_id';
55
  $attributes[]['attribute_code'] = 'parent_id';
 
 
56
  asort($attributes);
57
  foreach ($attributes as $attribute) {
58
  if($attribute['attribute_code'] == 'group_price') {
53
  $attributes[]['attribute_code'] = 'cp_color_attribute_id';
54
  $attributes[]['attribute_code'] = 'type_id';
55
  $attributes[]['attribute_code'] = 'parent_id';
56
+ $attributes[]['attribute_code'] = 'min_sale_qty';
57
+ $attributes[]['attribute_code'] = 'max_sale_qty';
58
  asort($attributes);
59
  foreach ($attributes as $attribute) {
60
  if($attribute['attribute_code'] == 'group_price') {
app/code/community/Channelpilotsolutions/Channelpilot/Block/Adminhtml/Field/Replacefields.php CHANGED
@@ -49,7 +49,8 @@ class Channelpilotsolutions_Channelpilot_Block_Adminhtml_Field_Replacefields ext
49
  $attributes[]['attribute_code'] = 'qty';
50
  $attributes[]['attribute_code'] = 'stock_status';
51
  $attributes[]['attribute_code'] = 'cp_color_attribute_id';
52
- $attributes[]['attribute_code'] = 'parent_id';
 
53
 
54
  $attributes[]['attribute_code'] = 'categories';
55
  $attributes[]['attribute_code'] = 'cp_image_url';
@@ -59,7 +60,7 @@ class Channelpilotsolutions_Channelpilot_Block_Adminhtml_Field_Replacefields ext
59
  $attributes[]['attribute_code'] = 'cp_additional_image_3';
60
  asort($attributes);
61
  foreach ($attributes as $attribute) {
62
- $rendered .= '<option value="' . $attribute['attribute_code'] . '">' . $attribute['attribute_code'] . '</option>';
63
  }
64
  $rendered .= '</select>';
65
  return $rendered;
49
  $attributes[]['attribute_code'] = 'qty';
50
  $attributes[]['attribute_code'] = 'stock_status';
51
  $attributes[]['attribute_code'] = 'cp_color_attribute_id';
52
+ $attributes[]['attribute_code'] = 'min_sale_qty';
53
+ $attributes[]['attribute_code'] = 'max_sale_qty';
54
 
55
  $attributes[]['attribute_code'] = 'categories';
56
  $attributes[]['attribute_code'] = 'cp_image_url';
60
  $attributes[]['attribute_code'] = 'cp_additional_image_3';
61
  asort($attributes);
62
  foreach ($attributes as $attribute) {
63
+ $rendered .= '<option value="' . $attribute['attribute_code'] . '">' . $attribute['attribute_code'] . '</option>';
64
  }
65
  $rendered .= '</select>';
66
  return $rendered;
app/code/community/Channelpilotsolutions/Channelpilot/Helper/Data.php CHANGED
@@ -159,13 +159,6 @@ class Channelpilotsolutions_Channelpilot_Helper_Data extends Mage_Core_Helper_Ab
159
  $hook = $handler->handle();
160
  break;
161
 
162
- // Send method + limit + shopId ( + last)
163
- case self::GET_EXPORT:
164
- $this->checkActivation(array($exportActive), 'export');
165
- $handler = new CPExportHandler();
166
- $hook = $handler->handle(CPExportHandler::METHOD_JSON);
167
- break;
168
-
169
  // Send method + limit + shopId ( + last)
170
  case self::GET_DEBUG:
171
  $this->checkSignature();
159
  $hook = $handler->handle();
160
  break;
161
 
 
 
 
 
 
 
 
162
  // Send method + limit + shopId ( + last)
163
  case self::GET_DEBUG:
164
  $this->checkSignature();
app/code/community/Channelpilotsolutions/Channelpilot/Helper/handler/CPExportHandler.php CHANGED
@@ -9,32 +9,31 @@ class CPExportHandler extends CPAbstractHandler {
9
 
10
  private $_storeId;
11
  private $_siteId;
 
12
  private $_mediaUrl;
13
  private $_webUrl;
14
  private $_allCat;
15
- private $oldCatPath;
16
  private $_limit;
17
  private $_last;
18
  private $_blankProduct;
19
- private $_exportMethod;
20
  private $_configurableAttributes = array();
21
  private $_imageBaseUrl;
22
  private $_maxAdditionalImages;
23
  private $_exportFields;
24
  private $_currencyChange;
25
  private $_replaceFields;
26
-
27
- const METHOD_XML = 0;
28
- const METHOD_JSON = 1;
29
 
30
  /**
31
  * Handle status event
32
  *
33
  */
34
- public function handle($exportMethod = self::METHOD_XML) {
 
35
  $limit = Mage::app()->getRequest()->getParam('limit', null);
36
  $store = Mage::app()->getRequest()->getParam('store', null);
37
- $this->_exportMethod = $exportMethod;
38
  $this->_limit = $limit;
39
  $this->_last = Mage::app()->getRequest()->getParam('last', null);
40
  try {
@@ -45,19 +44,16 @@ class CPExportHandler extends CPAbstractHandler {
45
  }
46
 
47
  $this->initExport();
48
- $productData = $this->_export();
49
 
50
- switch($this->_exportMethod) {
51
- case self::METHOD_XML:
52
- $this->_toXml($productData);
53
- break;
54
- case self::METHOD_JSON:
55
- $this->_toJson($productData);
56
- break;
57
- default:
58
- echo "Export method not supported.";
59
- return;
60
- }
61
  }
62
 
63
  /**
@@ -66,20 +62,11 @@ class CPExportHandler extends CPAbstractHandler {
66
  */
67
  private function _handleStoreException() {
68
  // The exception thrown by Mage::app()->getStore() has an empty message ...
69
- switch($this->_exportMethod) {
70
- case self::METHOD_XML:
71
- $xml = new SimpleXMLElement('<root></root>');
72
- $xml->addChild('error', 'Error retrieving store.');
73
- header('Content-Type: text/xml; charset=utf-8');
74
- echo $xml->asXML();
75
- break;
76
- case self::METHOD_JSON:
77
- default:
78
- $hook = new CPHookResponse();
79
- $hook->resultCode = CPResultCodes::SYSTEM_ERROR;
80
- $hook->resultMessage = "Error retrieving store.";
81
- $hook->writeResponse(self::defaultHeader, json_encode($hook));
82
- }
83
  }
84
 
85
  /**
@@ -92,20 +79,11 @@ class CPExportHandler extends CPAbstractHandler {
92
  if ($currencyCode && $currencyCode != '') {
93
  $result = Mage::getModel('directory/currency')->getCurrencyRates(Mage::app()->getBaseCurrencyCode(), $currencyCode);
94
  if(count($result) === 0){
95
- switch($this->_exportMethod) {
96
- case self::METHOD_XML:
97
- $xml = new SimpleXMLElement('<root></root>');
98
- $xml->addChild('error', 'wrong currency');
99
- header('Content-Type: text/xml; charset=utf-8');
100
- echo $xml->asXML();
101
- exit();
102
- case self::METHOD_JSON:
103
- default:
104
- $hook = new CPHookResponse();
105
- $hook->resultCode = CPResultCodes::SYSTEM_ERROR;
106
- $hook->resultMessage = "wrong currency";
107
- $hook->writeResponse(self::defaultHeader, json_encode($hook));
108
- }
109
  }
110
  $this->_currencyChange = $result[$currencyCode];
111
  }
@@ -115,8 +93,6 @@ class CPExportHandler extends CPAbstractHandler {
115
  * Initialize the export.
116
  */
117
  private function initExport() {
118
- ini_set('max_execution_time', 7200);
119
-
120
  // Initialize the admin application
121
  Mage::app('admin');
122
 
@@ -151,6 +127,7 @@ class CPExportHandler extends CPAbstractHandler {
151
  try {
152
  $store = Mage::app()->getStore($this->_storeId);
153
  $this->_siteId = $store->getWebsiteId();
 
154
  $this->_webUrl = $store->getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB);
155
  $this->_mediaUrl = $store->getBaseUrl(Mage_Core_Model_Store::URL_TYPE_MEDIA);
156
  } catch (Exception $e) {
@@ -170,6 +147,8 @@ class CPExportHandler extends CPAbstractHandler {
170
  $this->_maxAdditionalImages = Mage::getStoreConfig('channelpilot_export/channelpilot_productfeed/channelpilot_imagenumber');
171
  $this->_exportFields = unserialize(Mage::getStoreConfig('channelpilot_export/channelpilot_productfeed/channelpilot_exportfields'));
172
  $this->_replaceFields = unserialize(Mage::getStoreConfig('channelpilot_export/channelpilot_productfeed/channelpilot_replacefields'));
 
 
173
  }
174
 
175
  /**
@@ -177,7 +156,6 @@ class CPExportHandler extends CPAbstractHandler {
177
  */
178
  public function buildCategoryTree() {
179
  $this->_allCat = array();
180
- $this->oldCatPath = '';
181
 
182
  $categoryCollection = Mage::getModel('catalog/category')->getCollection()
183
  ->addAttributeToSelect('name')
@@ -257,6 +235,74 @@ class CPExportHandler extends CPAbstractHandler {
257
  return $attributeOptions;
258
  }
259
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
260
  /**
261
  * Export the products and return them as array.
262
  * @return array
@@ -279,14 +325,43 @@ class CPExportHandler extends CPAbstractHandler {
279
  }
280
 
281
  /** @var $collection Mage_Catalog_Model_Resource_Product_Collection */
282
- $collection = Mage::getModel('catalog/product')->getCollection()
283
- ->addAttributeToSelect('*')
 
 
 
 
 
 
 
 
 
 
 
284
  ->joinField('qty',
285
  'cataloginventory/stock_item',
286
  'qty',
287
  'product_id=entity_id',
288
  '{{table}}.stock_id=1',
289
  'left')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
290
  ->addAttributeToSort('type_id')
291
  ->setStoreId($this->_storeId);
292
 
@@ -305,40 +380,17 @@ class CPExportHandler extends CPAbstractHandler {
305
  }
306
  }
307
 
308
- if($this->_last) {
309
- $collection->setCurPage($this->_last);
310
- }
311
-
312
- if($this->_limit) {
313
- $collection->setPageSize($this->_limit);
314
- }
315
-
316
- /** @var $backendModel Mage_Catalog_Model_Product_Attribute_Backend_Media */
317
- $backendModel = $collection->getResource()->getAttribute('media_gallery')->getBackend();
318
-
319
- $onlyStockAndPriceData = (Mage::app()->getRequest()->getParam('priceStock', '') === "true");
320
-
321
- $productData = array();
322
 
323
- /** @var $item Mage_Catalog_Model_Product */
324
- foreach ($collection as $item) {
325
-
326
- if($onlyStockAndPriceData) {
327
- $product = $this->_getOnlyStockAndPriceData($item);
328
- } else {
329
- $backendModel->afterLoad($item);
330
- $product = $this->_getFullProductData($item);
331
- }
332
-
333
- $productData[] = $product;
334
- }
335
 
336
  // stop emulating admin store and set initial environment
337
  if ($flatEnabled) {
338
  $emulationModel->stopEnvironmentEmulation($initialEnvironmentInfo);
339
  }
340
-
341
- return $productData;
342
  }
343
 
344
  /**
@@ -360,9 +412,7 @@ class CPExportHandler extends CPAbstractHandler {
360
  $parentId = null;
361
  if ($item->getTypeId() == Mage_Catalog_Model_Product_Type::TYPE_SIMPLE) {
362
  $parentId = Mage::getModel('catalog/product_type_configurable')->getParentIdsByChild($item->getId());
363
- if(is_array($parentId) && !empty($parentId)) {
364
- $parentId = $parentId[0];
365
- }
366
  }
367
 
368
  $configurableAttributes = array();
@@ -377,8 +427,12 @@ class CPExportHandler extends CPAbstractHandler {
377
  // workaround... $item->getProductUrl() sometimes adds store code to url (e.g. <url>?___store=default)
378
  $productUrl = $this->_webUrl . $item->getUrlPath();
379
  $colorText = $item->getAttributeText('color');
380
- $rulePrice = Mage::getModel('catalogrule/rule')->calcProductPriceRule($item->setStoreId($this->_storeId),$item->getPrice());
381
- $price = ($rulePrice) ? $rulePrice : $item->getPrice();
 
 
 
 
382
 
383
  $product = $this->_blankProduct;
384
 
@@ -386,8 +440,8 @@ class CPExportHandler extends CPAbstractHandler {
386
  $product['sku'] = $item->getSku();
387
  $product['parent_id'] = $parentId;
388
  $product['variationTheme'] = $configurableAttributes;
389
- $product['name'] = html_entity_decode($item->getName());
390
- $product['description'] = html_entity_decode($item->getDescription());
391
 
392
  $product['price'] = $price;
393
  if($this->_currencyChange) {
@@ -395,31 +449,58 @@ class CPExportHandler extends CPAbstractHandler {
395
  }
396
 
397
  $product['categories'] = $this->_getCategoryInformation($item);
398
- $product['manufacturer'] = html_entity_decode($item->getManufacturer());
399
- $product['manufacturer_name'] = html_entity_decode($item->getAttributeText('manufacturer'));
400
  $product['cp_product_url'] = $productUrl;
401
  $product['cp_image_url'] = $imageUrl;
402
- $product['color'] = ($colorText) ? html_entity_decode($colorText) : null;
403
  $product['weight'] = $item->getWeight();
404
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
405
  $counter = 1;
406
- foreach ($item->getMediaGalleryImages() as $image) {
 
407
  // break if the maximum amount of additional images has been reached
408
  if ($counter > $this->_maxAdditionalImages) {
409
  break;
410
  }
411
 
412
  // ignore the base image; it has already been added
413
- if ($image->getFile() == $item->getImage()) {
414
  continue;
415
  }
416
 
417
- $product['cp_additional_image_' . $counter] = $this->_imageBaseUrl . $image->getFile();
418
  $counter++;
419
  }
420
 
421
- $product['is_parent'] = $isParent;
 
422
 
 
 
 
 
 
 
423
  foreach($this->_exportFields as $field) {
424
  $code = $field['productattribute'];
425
  if(strpos($code, 'group_price') !== false) {
@@ -429,27 +510,40 @@ class CPExportHandler extends CPAbstractHandler {
429
  $product['group_price_'.$groupCode] = $item->getData('group_price_'.$customerGroup->getId());
430
  } else {
431
  switch($code) {
 
 
 
432
  case 'qty':
433
  $product[$code] = $item->getQty();
434
  break;
435
  case 'stock_status':
436
- $product[$code] = $item->getStockItem()->getIsInStock();
437
  break;
 
 
438
  case 'tax_class_id':
439
  $product[$code] = $item->getData($code);
440
  break;
441
  default:
442
- $attributeText = $item->getAttributeText($code);
443
  if(is_array($attributeText)) {
444
  $attributeText = implode(',',$attributeText);
445
  }
446
- $product[$code] = ($attributeText) ? html_entity_decode($attributeText) : html_entity_decode($item->getData($code));
447
  }
448
  }
449
  }
 
450
 
451
- if(!empty($this->_replaceFields) && !$isParent && $parentId !== null) {
452
- $parent = Mage::getModel('catalog/product')->load($parentId);
 
 
 
 
 
 
 
453
  foreach($this->_replaceFields as $field) {
454
  $code = $field['productattribute'];
455
  if(strpos($code, 'group_price') !== false) {
@@ -462,29 +556,44 @@ class CPExportHandler extends CPAbstractHandler {
462
  $product['group_price_'.$groupCode] = $groupPrice['price'];
463
  }
464
  }
 
 
465
  } else {
466
  switch($code) {
 
 
 
 
 
 
 
 
 
467
  case 'qty':
468
- $product[$code] = $parent->getStockItem->getQty();
469
  break;
470
  case 'stock_status':
471
  $product[$code] = $parent->getStockItem()->getIsInStock();
472
  break;
 
 
 
 
 
 
473
  case 'tax_class_id':
474
  $product[$code] = $parent->getData($code);
475
  break;
476
  default:
477
- $attributeText = $parent->getAttributeText($code);
478
  if(is_array($attributeText)) {
479
  $attributeText = implode(',',$attributeText);
480
  }
481
- $product[$code] = ($attributeText) ? html_entity_decode($attributeText) : html_entity_decode($parent->getData($code));
482
  }
483
  }
484
  }
485
  }
486
-
487
- return $product;
488
  }
489
 
490
  /**
@@ -511,23 +620,6 @@ class CPExportHandler extends CPAbstractHandler {
511
  return $product;
512
  }
513
 
514
- /**
515
- * Creates and shows an XML based on the values of the $productData array created by the export method.
516
- * Sends a Content-Type header.
517
- * @param array $productData
518
- */
519
- private function _toXml(array $productData) {
520
- $xml = new SimpleXMLElement('<root></root>');
521
- $xmlCatalog = $xml->addChild('catalog');
522
- foreach($productData as $product) {
523
- $xmlProduct = $xmlCatalog->addChild('product');
524
- $this->_productToXml($product, $xmlProduct);
525
- }
526
- header('Content-Type: text/xml; charset=utf-8');
527
- echo $xml->asXML();
528
- exit();
529
- }
530
-
531
  /**
532
  * Adds the values of the $product array to the $xml structure.
533
  * @param array $product
@@ -544,59 +636,53 @@ class CPExportHandler extends CPAbstractHandler {
544
  }
545
  }
546
 
547
- /**
548
- * Shows the content of $productData as JSON.
549
- * @param array $productData
550
- */
551
- private function _toJson(array $productData) {
552
- $hook = new CPHookResponse();
553
- $hook->resultCode = CPResultCodes::SUCCESS;
554
- $hook->products = $productData;
555
- $hook->resultMessage = "ProductData of " . sizeof($hook->products) . " articles";
556
- $hook->moreAvailable = true;
557
- if (sizeof($hook->products) < $this->_limit) {
558
- $hook->moreAvailable = false;
559
- }
560
- $hook->writeResponse(self::defaultHeader, json_encode($hook));
561
- }
562
-
563
  /**
564
  * Get the category information for a product.
565
  * @param Mage_Catalog_Model_Product $product
566
  * @return string
567
  */
568
  private function _getCategoryInformation(Mage_Catalog_Model_Product $product) {
569
- $categorieField = '';
570
- $this->oldCatPath = '';
571
 
572
  /** @var $category Mage_Catalog_Model_Category */
573
  foreach($product->getCategoryCollection() as $category) {
574
- if (($this->oldCatPath == '') || (strpos($category->getPath(), $this->oldCatPath) != 0)) {
575
- // Start tree
576
- if ($this->oldCatPath != '') {
577
- if ($categorieField != '') {
578
- $categorieField = $categorieField . ', ' . $this->_allCat[$this->oldCatPath];
579
- } else {
580
- $categorieField = $this->_allCat[$this->oldCatPath];
581
- }
582
- }
583
- $this->oldCatPath = $category->getPath();
584
- } else {
585
- // Add to tree
586
- $this->oldCatPath = $category->getPath();
587
- }
588
-
589
  }
590
 
591
- if ($categorieField != '') {
592
- $categorieField = $categorieField . ', ' . $this->_allCat[$this->oldCatPath];
593
- } else {
594
- if ($this->oldCatPath != '') {
595
- $categorieField = $this->_allCat[$this->oldCatPath];
596
- }
 
 
 
 
 
 
 
 
597
  }
 
 
 
 
 
 
 
 
 
 
 
598
 
599
- return ltrim($categorieField, '>');
 
 
 
 
 
 
600
  }
601
  }
602
 
9
 
10
  private $_storeId;
11
  private $_siteId;
12
+ private $_customerGroupId;
13
  private $_mediaUrl;
14
  private $_webUrl;
15
  private $_allCat;
 
16
  private $_limit;
17
  private $_last;
18
  private $_blankProduct;
 
19
  private $_configurableAttributes = array();
20
  private $_imageBaseUrl;
21
  private $_maxAdditionalImages;
22
  private $_exportFields;
23
  private $_currencyChange;
24
  private $_replaceFields;
25
+ private $_parents;
26
+ private $_onlyStockAndPriceData;
27
+ private $_backendModel;
28
 
29
  /**
30
  * Handle status event
31
  *
32
  */
33
+ public function handle() {
34
+ ini_set('max_execution_time', 7200);
35
  $limit = Mage::app()->getRequest()->getParam('limit', null);
36
  $store = Mage::app()->getRequest()->getParam('store', null);
 
37
  $this->_limit = $limit;
38
  $this->_last = Mage::app()->getRequest()->getParam('last', null);
39
  try {
44
  }
45
 
46
  $this->initExport();
 
47
 
48
+ // start the xml output right now to output the exported products as soon as
49
+ // each product has been processed
50
+ header('Content-Type: text/xml; charset=utf-8');
51
+ echo '<?xml version="1.0"?>';
52
+ echo '<root><catalog>';
53
+
54
+ $this->_export();
55
+
56
+ echo "</catalog></root>";
 
 
57
  }
58
 
59
  /**
62
  */
63
  private function _handleStoreException() {
64
  // The exception thrown by Mage::app()->getStore() has an empty message ...
65
+ $xml = new SimpleXMLElement('<root></root>');
66
+ $xml->addChild('error', 'Error retrieving store.');
67
+ header('Content-Type: text/xml; charset=utf-8');
68
+ echo $xml->asXML();
69
+ exit();
 
 
 
 
 
 
 
 
 
70
  }
71
 
72
  /**
79
  if ($currencyCode && $currencyCode != '') {
80
  $result = Mage::getModel('directory/currency')->getCurrencyRates(Mage::app()->getBaseCurrencyCode(), $currencyCode);
81
  if(count($result) === 0){
82
+ $xml = new SimpleXMLElement('<root></root>');
83
+ $xml->addChild('error', 'wrong currency');
84
+ header('Content-Type: text/xml; charset=utf-8');
85
+ echo $xml->asXML();
86
+ exit();
 
 
 
 
 
 
 
 
 
87
  }
88
  $this->_currencyChange = $result[$currencyCode];
89
  }
93
  * Initialize the export.
94
  */
95
  private function initExport() {
 
 
96
  // Initialize the admin application
97
  Mage::app('admin');
98
 
127
  try {
128
  $store = Mage::app()->getStore($this->_storeId);
129
  $this->_siteId = $store->getWebsiteId();
130
+ $this->_customerGroupId = Mage_Customer_Model_Group::NOT_LOGGED_IN_ID;
131
  $this->_webUrl = $store->getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB);
132
  $this->_mediaUrl = $store->getBaseUrl(Mage_Core_Model_Store::URL_TYPE_MEDIA);
133
  } catch (Exception $e) {
147
  $this->_maxAdditionalImages = Mage::getStoreConfig('channelpilot_export/channelpilot_productfeed/channelpilot_imagenumber');
148
  $this->_exportFields = unserialize(Mage::getStoreConfig('channelpilot_export/channelpilot_productfeed/channelpilot_exportfields'));
149
  $this->_replaceFields = unserialize(Mage::getStoreConfig('channelpilot_export/channelpilot_productfeed/channelpilot_replacefields'));
150
+
151
+ $this->_parents = array();
152
  }
153
 
154
  /**
156
  */
157
  public function buildCategoryTree() {
158
  $this->_allCat = array();
 
159
 
160
  $categoryCollection = Mage::getModel('catalog/category')->getCollection()
161
  ->addAttributeToSelect('name')
235
  return $attributeOptions;
236
  }
237
 
238
+ /**
239
+ * Callback function used for the collection iterator.
240
+ * The function receives an array containing the fetched row from the database.
241
+ * Saves the product to export in the _productData array.
242
+ * @param $args array
243
+ */
244
+ public function productCallback($args)
245
+ {
246
+ $product = Mage::getModel('catalog/product');
247
+ $product->setData($args['row']);
248
+
249
+ if($this->_onlyStockAndPriceData) {
250
+ $result = $this->_getOnlyStockAndPriceData($product);
251
+ } else {
252
+ $this->_backendModel->afterLoad($product);
253
+ $result = $this->_getFullProductData($product);
254
+ }
255
+
256
+ // instead of saving the result and creating the complete xml later,
257
+ // the xml for the product is created and echoed right now to improve time and memory usage
258
+ $productXml = new SimpleXMLElement('<product></product>');
259
+ $this->_productToXml($result, $productXml);
260
+ $dom = dom_import_simplexml($productXml);
261
+ echo $dom->ownerDocument->saveXML($dom->ownerDocument->documentElement);
262
+ }
263
+
264
+ /**
265
+ * Get all attributes that need to be selected from the database.
266
+ * @param $attributes array
267
+ * @return array
268
+ */
269
+ private function _getAttributesForSelect($attributes) {
270
+ $attributesToSelect = array(
271
+ 'entity_id',
272
+ 'sku',
273
+ 'name',
274
+ 'description',
275
+ 'price',
276
+ 'manufacturer',
277
+ 'color',
278
+ 'weight',
279
+ 'media_gallery',
280
+ 'url_key',
281
+ 'url_path',
282
+ 'image',
283
+ 'type_id'
284
+ );
285
+
286
+ $attributeCodes = array();
287
+
288
+ // save all available attribute codes
289
+ foreach($attributes as $code => $attribute) {
290
+ $attributeCodes[] = $code;
291
+ }
292
+
293
+ // add all attributes from the config if the attribute is a Magento attribute and it has
294
+ // not already been added to the $attributesToSelect array
295
+ foreach($this->_exportFields as $field) {
296
+ $attrCode = $field['productattribute'];
297
+ if(in_array($attrCode, $attributeCodes) && !in_array($attrCode, $attributesToSelect)) {
298
+ $attributesToSelect[] = $attrCode;
299
+ }
300
+ }
301
+
302
+ return $attributesToSelect;
303
+
304
+ }
305
+
306
  /**
307
  * Export the products and return them as array.
308
  * @return array
325
  }
326
 
327
  /** @var $collection Mage_Catalog_Model_Resource_Product_Collection */
328
+ $collection = Mage::getModel('catalog/product')->getCollection();
329
+ $attributes = $collection->getEntity()->loadAllAttributes()->getAttributesByCode();
330
+
331
+ // only use the needed attributes instead of every available
332
+ $attributeCodes = $this->_getAttributesForSelect($attributes);
333
+
334
+ // addPriceData uses inner join to get the price data for a website_id and a customer_group id
335
+ // so all products that are not associated to $this->_siteId and the customerGroupId (NOT LOGGED IN (0) by default)
336
+ // are not included in this collection.
337
+ // addPriceData is needed for getting the minimal price for bundels
338
+ $collection
339
+ ->addAttributeToSelect($attributeCodes, 'left')
340
+ ->addPriceData($this->_customerGroupId, $this->_siteId)
341
  ->joinField('qty',
342
  'cataloginventory/stock_item',
343
  'qty',
344
  'product_id=entity_id',
345
  '{{table}}.stock_id=1',
346
  'left')
347
+ ->joinField('min_sale_qty',
348
+ 'cataloginventory/stock_item',
349
+ 'min_sale_qty',
350
+ 'product_id=entity_id',
351
+ '{{table}}.stock_id=1',
352
+ 'left')
353
+ ->joinField('max_sale_qty',
354
+ 'cataloginventory/stock_item',
355
+ 'max_sale_qty',
356
+ 'product_id=entity_id',
357
+ '{{table}}.stock_id=1',
358
+ 'left')
359
+ ->joinField('is_in_stock',
360
+ 'cataloginventory/stock_item',
361
+ 'is_in_stock',
362
+ 'product_id=entity_id',
363
+ '{{table}}.stock_id=1',
364
+ 'left')
365
  ->addAttributeToSort('type_id')
366
  ->setStoreId($this->_storeId);
367
 
380
  }
381
  }
382
 
383
+ $this->_backendModel = $collection->getResource()->getAttribute('media_gallery')->getBackend();
384
+ $this->_onlyStockAndPriceData = (Mage::app()->getRequest()->getParam('priceStock', '') === "true");
 
 
 
 
 
 
 
 
 
 
 
 
385
 
386
+ /** @var $iterator Mage_Core_Model_Resource_Iterator */
387
+ $iterator = Mage::getSingleton('core/resource_iterator');
388
+ $iterator->walk($collection->getSelect(), array(array($this, 'productCallback')));
 
 
 
 
 
 
 
 
 
389
 
390
  // stop emulating admin store and set initial environment
391
  if ($flatEnabled) {
392
  $emulationModel->stopEnvironmentEmulation($initialEnvironmentInfo);
393
  }
 
 
394
  }
395
 
396
  /**
412
  $parentId = null;
413
  if ($item->getTypeId() == Mage_Catalog_Model_Product_Type::TYPE_SIMPLE) {
414
  $parentId = Mage::getModel('catalog/product_type_configurable')->getParentIdsByChild($item->getId());
415
+ $parentId = (is_array($parentId) && !empty($parentId)) ? $parentId[0] : null;
 
 
416
  }
417
 
418
  $configurableAttributes = array();
427
  // workaround... $item->getProductUrl() sometimes adds store code to url (e.g. <url>?___store=default)
428
  $productUrl = $this->_webUrl . $item->getUrlPath();
429
  $colorText = $item->getAttributeText('color');
430
+
431
+ // set the value to the minimal price if the current product is a bundle, otherwise the product's price
432
+ $calcPrice = ($item->getTypeId() == Mage_Catalog_Model_Product_Type::TYPE_BUNDLE) ? Mage::getModel('bundle/product_price')->getTotalPrices($item, 'min', true, false) : $item->getPrice();
433
+
434
+ $rulePrice = Mage::getModel('catalogrule/rule')->calcProductPriceRule($item->setStoreId($this->_storeId),$calcPrice);
435
+ $price = ($rulePrice) ? $rulePrice : $calcPrice;
436
 
437
  $product = $this->_blankProduct;
438
 
440
  $product['sku'] = $item->getSku();
441
  $product['parent_id'] = $parentId;
442
  $product['variationTheme'] = $configurableAttributes;
443
+ $product['name'] = $this->_getCleanedStringForXml($item->getName());
444
+ $product['description'] = $this->_getCleanedStringForXml($item->getDescription());
445
 
446
  $product['price'] = $price;
447
  if($this->_currencyChange) {
449
  }
450
 
451
  $product['categories'] = $this->_getCategoryInformation($item);
452
+ $product['manufacturer'] = $this->_getCleanedStringForXml($item->getManufacturer());
453
+ $product['manufacturer_name'] = $this->_getCleanedStringForXml($item->getAttributeText('manufacturer'));
454
  $product['cp_product_url'] = $productUrl;
455
  $product['cp_image_url'] = $imageUrl;
456
+ $product['color'] = ($colorText) ? $this->_getCleanedStringForXml($colorText) : null;
457
  $product['weight'] = $item->getWeight();
458
 
459
+ $product = array_merge($product, $this->_getAdditionalImages($item));
460
+
461
+ $product['is_parent'] = $isParent;
462
+
463
+ $this->_addExportFields($product, $item);
464
+
465
+ if(!empty($this->_replaceFields) && !$isParent && $parentId !== null) {
466
+ $this->_replaceFields($product, $parentId);
467
+ }
468
+
469
+ return $product;
470
+ }
471
+
472
+ /**
473
+ * Get the additional images for a product
474
+ * @param Mage_Catalog_Model_Product $product
475
+ * @return array
476
+ */
477
+ private function _getAdditionalImages(Mage_Catalog_Model_Product $product) {
478
  $counter = 1;
479
+ $productData = array();
480
+ foreach ($product->getMediaGalleryImages() as $image) {
481
  // break if the maximum amount of additional images has been reached
482
  if ($counter > $this->_maxAdditionalImages) {
483
  break;
484
  }
485
 
486
  // ignore the base image; it has already been added
487
+ if ($image->getFile() == $product->getImage()) {
488
  continue;
489
  }
490
 
491
+ $productData['cp_additional_image_' . $counter] = $this->_imageBaseUrl . $image->getFile();
492
  $counter++;
493
  }
494
 
495
+ return $productData;
496
+ }
497
 
498
+ /**
499
+ * Add all fields to a product that need to be exported
500
+ * @param $product
501
+ * @param Mage_Catalog_Model_Product $item
502
+ */
503
+ private function _addExportFields(&$product, Mage_Catalog_Model_Product $item) {
504
  foreach($this->_exportFields as $field) {
505
  $code = $field['productattribute'];
506
  if(strpos($code, 'group_price') !== false) {
510
  $product['group_price_'.$groupCode] = $item->getData('group_price_'.$customerGroup->getId());
511
  } else {
512
  switch($code) {
513
+ // ignore
514
+ case 'parent_id':
515
+ break;
516
  case 'qty':
517
  $product[$code] = $item->getQty();
518
  break;
519
  case 'stock_status':
520
+ $product[$code] = $item->getIsInStock();
521
  break;
522
+ case 'min_sale_qty':
523
+ case 'max_sale_qty':
524
  case 'tax_class_id':
525
  $product[$code] = $item->getData($code);
526
  break;
527
  default:
528
+ $attributeText = ($item->getResource()->getAttribute($code)) ? $item->getAttributeText($code) : false;
529
  if(is_array($attributeText)) {
530
  $attributeText = implode(',',$attributeText);
531
  }
532
+ $product[$code] = ($attributeText) ? $this->_getCleanedStringForXml($attributeText) : $this->_getCleanedStringForXml($item->getData($code));
533
  }
534
  }
535
  }
536
+ }
537
 
538
+ /**
539
+ * Replace all selected fields with the parent's values.
540
+ * @param $product
541
+ * @param $parentId
542
+ */
543
+ private function _replaceFields(&$product, $parentId) {
544
+ $parent = $this->_getParentById($parentId);
545
+ if($parent !== null && $parent->getId()) {
546
+ $parentImages = $this->_getAdditionalImages($parent);
547
  foreach($this->_replaceFields as $field) {
548
  $code = $field['productattribute'];
549
  if(strpos($code, 'group_price') !== false) {
556
  $product['group_price_'.$groupCode] = $groupPrice['price'];
557
  }
558
  }
559
+ } else if(strpos($code, 'cp_additional_image') !== false && isset($parentImages[$code])) {
560
+ $product[$code] = $parentImages[$code];
561
  } else {
562
  switch($code) {
563
+ case 'categories':
564
+ $product['categories'] = $this->_getCategoryInformation($parent);
565
+ break;
566
+ case 'cp_product_url':
567
+ $product[$code] = $this->_webUrl . $parent->getUrlPath();
568
+ break;
569
+ case 'cp_image_url':
570
+ $product[$code] = $this->_imageBaseUrl . $parent->getImage();
571
+ break;
572
  case 'qty':
573
+ $product[$code] = $parent->getStockItem()->getQty();
574
  break;
575
  case 'stock_status':
576
  $product[$code] = $parent->getStockItem()->getIsInStock();
577
  break;
578
+ case 'min_sale_qty':
579
+ $product[$code] = $parent->getStockItem()->getMinSaleQty();
580
+ break;
581
+ case 'max_sale_qty':
582
+ $product[$code] = $parent->getStockItem()->getMaxSaleQty();
583
+ break;
584
  case 'tax_class_id':
585
  $product[$code] = $parent->getData($code);
586
  break;
587
  default:
588
+ $attributeText = ($parent->getResource()->getAttribute($code)) ? $parent->getAttributeText($code) : false;
589
  if(is_array($attributeText)) {
590
  $attributeText = implode(',',$attributeText);
591
  }
592
+ $product[$code] = ($attributeText) ? $this->_getCleanedStringForXml($attributeText) : $this->_getCleanedStringForXml($parent->getData($code));
593
  }
594
  }
595
  }
596
  }
 
 
597
  }
598
 
599
  /**
620
  return $product;
621
  }
622
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
623
  /**
624
  * Adds the values of the $product array to the $xml structure.
625
  * @param array $product
636
  }
637
  }
638
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
639
  /**
640
  * Get the category information for a product.
641
  * @param Mage_Catalog_Model_Product $product
642
  * @return string
643
  */
644
  private function _getCategoryInformation(Mage_Catalog_Model_Product $product) {
645
+ $arrPath = array();
 
646
 
647
  /** @var $category Mage_Catalog_Model_Category */
648
  foreach($product->getCategoryCollection() as $category) {
649
+ $arrPath[] = $this->_allCat[$category->getPath()];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
650
  }
651
 
652
+ return ltrim(implode(',', $arrPath), '>');
653
+ }
654
+
655
+ /**
656
+ * Get a product by its id. Save the loaded product to an array to cache it.
657
+ * It is used for parent products only so these products do not need to be loaded by each
658
+ * of its child products.
659
+ * @param $parentId
660
+ * @return mixed
661
+ */
662
+ private function _getParentById($parentId) {
663
+ if(!isset($this->_parents[$parentId])) {
664
+ $parent = Mage::getModel('catalog/product')->load($parentId);
665
+ $this->_parents[$parentId] = ($parent->getId()) ? $parent : null;
666
  }
667
+ return $this->_parents[$parentId];
668
+ }
669
+
670
+ /**
671
+ * Clean a string for usage in XML.
672
+ * @param $string
673
+ * @return mixed
674
+ */
675
+ private function _getCleanedStringForXml($string) {
676
+ return $this->_utf8ForXml(html_entity_decode($string));
677
+ }
678
 
679
+ /**
680
+ * Replace all UTF-8 characters that are not allowed in XML with a space.
681
+ * @param $string
682
+ * @return mixed
683
+ */
684
+ private function _utf8ForXml($string) {
685
+ return preg_replace ('/[^\x{0009}\x{000a}\x{000d}\x{0020}-\x{D7FF}\x{E000}-\x{FFFD}]+/u', ' ', $string);
686
  }
687
  }
688
 
app/code/community/Channelpilotsolutions/Channelpilot/Helper/handler/CPOrderHandler.php CHANGED
@@ -86,10 +86,21 @@ class CPOrderHandler extends CPAbstractHandler {
86
 
87
  private function _getQuote($apiOrder) {
88
  try {
89
- $quote = Mage::getModel('sales/quote')->setStoreId($this->shopId);
 
 
90
  $customer = self::getCustomer($apiOrder);
91
  $quote->assignCustomer($customer);
92
 
 
 
 
 
 
 
 
 
 
93
  foreach ($apiOrder->itemsOrdered as $orderItem) {
94
  $product = $this->getProduct($orderItem->article->id);
95
  if ($product == null) {
@@ -129,6 +140,10 @@ class CPOrderHandler extends CPAbstractHandler {
129
 
130
  $quote->collectTotals()->save();
131
 
 
 
 
 
132
  return $quote;
133
  } catch(Exception $e) {
134
  CPErrorHandler::logError("Exception during _getQuote: " . $e->getMessage() . "\n" . $e->getTraceAsString());
@@ -247,19 +262,22 @@ class CPOrderHandler extends CPAbstractHandler {
247
  foreach ($apiOrder->itemsOrdered as $orderItem) {
248
  if ($orderItem->article->id == $item->getSku() || $orderItem->article->id == $item->getProductId()) {
249
  $item->setPrice($orderItem->costsSingle->net);
250
- $item->setCustomPrice($orderItem->costsSingle->net);
251
  $item->setBasePrice($orderItem->costsSingle->net);
252
- $item->setOriginalCustomPrice($orderItem->costsSingle->net);
253
- $item->setOriginalPrice($orderItem->costsSingle->net);
254
- $item->setTaxAmount($orderItem->costsTotal->tax);
 
 
 
255
  $item->setTaxPercent($orderItem->costsTotal->taxRate);
 
 
 
256
  $item->setRowTotal($orderItem->costsTotal->net);
257
- $item->setRowTotalInclTax($orderItem->costsTotal->gross);
258
- $item->setPriceInclTax($orderItem->costsSingle->gross);
259
- $item->setBaseOriginalPrice($orderItem->costsSingle->net);
260
  $item->setBaseRowTotal($orderItem->costsTotal->net);
261
- $item->setBasePriceInclTax($orderItem->costsSingle->gross);
262
  $item->setBaseRowTotalInclTax($orderItem->costsTotal->gross);
 
263
  $item->save();
264
  $orderItem->id = $item->getId();
265
  $orderItemsResponse[] = $orderItem;
@@ -292,7 +310,7 @@ class CPOrderHandler extends CPAbstractHandler {
292
  ->addFieldToFilter('order_id', array('eq' => $order->getId()));
293
  $collection->walk('delete');
294
  $marketplaceOrder = Mage::getModel('channelpilot/order')->load($order->getId());
295
- $$marketplaceOrder->delete();
296
  Mage::register('isSecureArea', true);
297
  Mage::app('admin');
298
  $order->delete();
@@ -303,17 +321,28 @@ class CPOrderHandler extends CPAbstractHandler {
303
  return $apiOrder;
304
  }
305
  $apiOrder->itemsOrdered = $orderItemsResponse;
 
 
306
  $order->setBaseSubtotal($apiOrder->summary->totalSumItems->net);
307
- $order->setBaseTaxAmount($apiOrder->summary->totalSumItems->tax);
308
- // $order->setBaseDiscountAmount(...);
309
- $order->setBaseShippingAmount($apiOrder->shipping->costs->gross);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
310
  $order->setBaseGrandTotal($apiOrder->summary->totalSumOrder->gross);
311
-
312
- $order->setSubtotal($apiOrder->summary->totalSumItems->net);
313
- $order->setTaxAmount($apiOrder->summary->totalSumItems->tax);
314
- // $order->setDiscountAmount(...);
315
- $order->setShippingAmount($apiOrder->shipping->costs->gross);
316
- $order->setGrandTotal($apiOrder->summary->totalSumOrder->gross);
317
 
318
  $order->setCreatedAt($apiOrder->orderHeader->orderTime);
319
 
@@ -335,7 +364,7 @@ class CPOrderHandler extends CPAbstractHandler {
335
  $apiOrder->orderHeader->status->errorMessage = "Exception during importOrder: " . $e->getMessage();
336
  $apiOrder->orderHeader->status->errorCode = CPResultCodes::SYSTEM_ERROR;
337
  }
338
- //$this->ordersImported[] = $order->getIncrementId();
339
  return $apiOrder;
340
  }
341
 
@@ -456,9 +485,11 @@ class CPOrderHandler extends CPAbstractHandler {
456
  } else {
457
  $customer->firstname = $apiOrder->customer->nameFirst;
458
  $customer->lastname = $apiOrder->customer->nameLast;
459
- foreach ($apiOrder->customer->customerGroups as $userGroup) {
460
- $customer->setData('group_id', $userGroup->id);
461
- }
 
 
462
  if ($apiOrder->addressInvoice->genderId == 1) {
463
  $customer->setGender(
464
  Mage::getResourceModel('customer/customer')
86
 
87
  private function _getQuote($apiOrder) {
88
  try {
89
+ $useAdminMode = Mage::getStoreConfigFlag('channelpilot_marketplace/channelpilot_marketplace/use_admin_mode');
90
+ /** @var $quote Mage_Sales_Model_Quote */
91
+ $quote = ($useAdminMode) ? Mage::getSingleton('adminhtml/session_quote')->getQuote()->setStoreId($this->shopId) : Mage::getModel('sales/quote')->setStoreId($this->shopId);
92
  $customer = self::getCustomer($apiOrder);
93
  $quote->assignCustomer($customer);
94
 
95
+ $useEmulation = false;
96
+ if($useAdminMode && class_exists('Mage_Core_Model_App_Emulation')) {
97
+ /* @var $emulationModel Mage_Core_Model_App_Emulation */
98
+ $emulationModel = Mage::getModel('core/app_emulation');
99
+ // emulate admin store to ignore restrictions like min_sale_qty
100
+ $initialEnvironmentInfo = $emulationModel->startEnvironmentEmulation(0, Mage_Core_Model_App_Area::AREA_ADMINHTML);
101
+ $useEmulation = true;
102
+ }
103
+
104
  foreach ($apiOrder->itemsOrdered as $orderItem) {
105
  $product = $this->getProduct($orderItem->article->id);
106
  if ($product == null) {
140
 
141
  $quote->collectTotals()->save();
142
 
143
+ if($useAdminMode && $useEmulation) {
144
+ $emulationModel->stopEnvironmentEmulation($initialEnvironmentInfo);
145
+ }
146
+
147
  return $quote;
148
  } catch(Exception $e) {
149
  CPErrorHandler::logError("Exception during _getQuote: " . $e->getMessage() . "\n" . $e->getTraceAsString());
262
  foreach ($apiOrder->itemsOrdered as $orderItem) {
263
  if ($orderItem->article->id == $item->getSku() || $orderItem->article->id == $item->getProductId()) {
264
  $item->setPrice($orderItem->costsSingle->net);
 
265
  $item->setBasePrice($orderItem->costsSingle->net);
266
+ $item->setPriceInclTax($orderItem->costsSingle->gross);
267
+ $item->setBasePriceInclTax($orderItem->costsSingle->gross);
268
+
269
+ $item->setOriginalPrice($orderItem->costsSingle->gross);
270
+ $item->setBaseOriginalPrice($orderItem->costsSingle->gross);
271
+
272
  $item->setTaxPercent($orderItem->costsTotal->taxRate);
273
+ $item->setTaxAmount($orderItem->costsTotal->tax);
274
+ $item->setBaseTaxAmount($orderItem->costsTotal->tax);
275
+
276
  $item->setRowTotal($orderItem->costsTotal->net);
 
 
 
277
  $item->setBaseRowTotal($orderItem->costsTotal->net);
278
+ $item->setRowTotalInclTax($orderItem->costsTotal->gross);
279
  $item->setBaseRowTotalInclTax($orderItem->costsTotal->gross);
280
+
281
  $item->save();
282
  $orderItem->id = $item->getId();
283
  $orderItemsResponse[] = $orderItem;
310
  ->addFieldToFilter('order_id', array('eq' => $order->getId()));
311
  $collection->walk('delete');
312
  $marketplaceOrder = Mage::getModel('channelpilot/order')->load($order->getId());
313
+ $marketplaceOrder->delete();
314
  Mage::register('isSecureArea', true);
315
  Mage::app('admin');
316
  $order->delete();
321
  return $apiOrder;
322
  }
323
  $apiOrder->itemsOrdered = $orderItemsResponse;
324
+
325
+ // Subtotal
326
  $order->setBaseSubtotal($apiOrder->summary->totalSumItems->net);
327
+ $order->setSubtotal($apiOrder->summary->totalSumItems->net);
328
+ $order->setBaseSubtotalInclTax($apiOrder->summary->totalSumItems->gross);
329
+ $order->setSubtotalInclTax($apiOrder->summary->totalSumItems->gross);
330
+
331
+ // Tax
332
+ $order->setBaseTaxAmount($apiOrder->summary->totalSumOrder->tax);
333
+ $order->setTaxAmount($apiOrder->summary->totalSumOrder->tax);
334
+ $order->setBaseShippingTaxAmount($apiOrder->shipping->costs->tax);
335
+ $order->setShippingTaxAmount($apiOrder->shipping->costs->tax);
336
+
337
+ // Shipping
338
+ $order->setBaseShippingAmount($apiOrder->shipping->costs->net);
339
+ $order->setShippingAmount($apiOrder->shipping->costs->net);
340
+ $order->setShippingInclTax($apiOrder->shipping->costs->gross);
341
+ $order->setBaseShippingInclTax($apiOrder->shipping->costs->gross);
342
+
343
+ // Grand total
344
  $order->setBaseGrandTotal($apiOrder->summary->totalSumOrder->gross);
345
+ $order->setGrandTotal($apiOrder->summary->totalSumOrder->gross);
 
 
 
 
 
346
 
347
  $order->setCreatedAt($apiOrder->orderHeader->orderTime);
348
 
364
  $apiOrder->orderHeader->status->errorMessage = "Exception during importOrder: " . $e->getMessage();
365
  $apiOrder->orderHeader->status->errorCode = CPResultCodes::SYSTEM_ERROR;
366
  }
367
+
368
  return $apiOrder;
369
  }
370
 
485
  } else {
486
  $customer->firstname = $apiOrder->customer->nameFirst;
487
  $customer->lastname = $apiOrder->customer->nameLast;
488
+ if(isset($apiOrder->customer->customerGroups)) {
489
+ foreach ($apiOrder->customer->customerGroups as $userGroup) {
490
+ $customer->setData('group_id', $userGroup->id);
491
+ }
492
+ }
493
  if ($apiOrder->addressInvoice->genderId == 1) {
494
  $customer->setGender(
495
  Mage::getResourceModel('customer/customer')
app/code/community/Channelpilotsolutions/Channelpilot/etc/config.xml CHANGED
@@ -24,7 +24,7 @@
24
  <config>
25
  <modules>
26
  <Channelpilotsolutions_Channelpilot>
27
- <version>2.2.4</version>
28
  </Channelpilotsolutions_Channelpilot>
29
  </modules>
30
  <global>
@@ -170,6 +170,7 @@
170
  <channelpilot_marketplace>
171
  <channelpilot_marketplace>
172
  <channelpilot_useMarketplaces>0</channelpilot_useMarketplaces>
 
173
  </channelpilot_marketplace>
174
  </channelpilot_marketplace>
175
  <channelpilot_pricecontrol>
24
  <config>
25
  <modules>
26
  <Channelpilotsolutions_Channelpilot>
27
+ <version>2.2.5</version>
28
  </Channelpilotsolutions_Channelpilot>
29
  </modules>
30
  <global>
170
  <channelpilot_marketplace>
171
  <channelpilot_marketplace>
172
  <channelpilot_useMarketplaces>0</channelpilot_useMarketplaces>
173
+ <use_admin_mode>0</use_admin_mode>
174
  </channelpilot_marketplace>
175
  </channelpilot_marketplace>
176
  <channelpilot_pricecontrol>
app/code/community/Channelpilotsolutions/Channelpilot/etc/system.xml CHANGED
@@ -24,7 +24,6 @@
24
  <config>
25
  <tabs>
26
  <channelpilot_config translate="label" module="channelpilot">
27
- <!--<label>Channelpilot</label>-->
28
  <label><![CDATA[<div style="overflow:hidden; background-image: url('https://go.channelpilot.com/css/gfx/logo.channelPilot.png');background-size: 150px; background-repeat: no-repeat; background-position: -4px -9px;"><div style="display:block; height: 20px;"></div></div>]]></label>
29
  <class>tab-channelpilot</class>
30
  <sort_order>401</sort_order>
@@ -292,33 +291,16 @@
292
  <show_in_website>1</show_in_website>
293
  <show_in_store>1</show_in_store>
294
  </channelpilot_orderStatusImportedUnpayed>
295
- <!-- <channelpilot_orderStatusPayed>
296
- <label>CP OrderStatus Payed?</label>
297
- <frontend_type>select</frontend_type>
298
- <source_model>channelpilot_adminhtml/orderstatus_values</source_model>
299
- <sort_order>3</sort_order>
300
- <show_in_default>1</show_in_default>
301
- <show_in_website>1</show_in_website>
302
- <show_in_store>1</show_in_store>
303
- </channelpilot_orderStatusPayed>
304
- <channelpilot_orderStatusCancelled>
305
- <label>CP OrderStatus Cancelled?</label>
306
- <frontend_type>select</frontend_type>
307
- <source_model>channelpilot_adminhtml/orderstatus_values</source_model>
308
- <sort_order>4</sort_order>
309
- <show_in_default>1</show_in_default>
310
- <show_in_website>1</show_in_website>
311
- <show_in_store>1</show_in_store>
312
- </channelpilot_orderStatusCancelled>
313
- <channelpilot_orderStatusDeliveried>
314
- <label>CP OrderStatus Deliveried?</label>
315
- <frontend_type>select</frontend_type>
316
- <source_model>channelpilot_adminhtml/orderstatus_values</source_model>
317
- <sort_order>5</sort_order>
318
- <show_in_default>1</show_in_default>
319
- <show_in_website>1</show_in_website>
320
- <show_in_store>1</show_in_store>
321
- </channelpilot_orderStatusDeliveried>-->
322
  </fields>
323
  </channelpilot_marketplace>
324
  </groups>
@@ -377,15 +359,6 @@
377
  <show_in_website>1</show_in_website>
378
  <show_in_store>1</show_in_store>
379
  <fields>
380
- <!-- <channelpilot_usePricecontrol>
381
- <label>Active</label>
382
- <frontend_type>select</frontend_type>
383
- <source_model>channelpilot_adminhtml/truefalse_values</source_model>
384
- <sort_order>0</sort_order>
385
- <show_in_default>1</show_in_default>
386
- <show_in_website>1</show_in_website>
387
- <show_in_store>1</show_in_store>
388
- </channelpilot_usePricecontrol>-->
389
  <channelpilot_generalPriceField>
390
  <label>CP Field for price</label>
391
  <comment>CP This field would be overwritten by the new product price.</comment>
@@ -398,25 +371,6 @@
398
  </channelpilot_generalPriceField>
399
  </fields>
400
  </general_prices>
401
- <!-- <campaign_prices translate="label">
402
- <label>Campaign Price Control</label>
403
- <frontend_type>text</frontend_type>
404
- <sort_order>3</sort_order>
405
- <show_in_default>1</show_in_default>
406
- <show_in_website>1</show_in_website>
407
- <show_in_store>1</show_in_store>
408
- <fields>
409
- <channelpilot_usePricecontrol>
410
- <label>Active</label>
411
- <frontend_type>select</frontend_type>
412
- <source_model>channelpilot_adminhtml/truefalse_values</source_model>
413
- <sort_order>0</sort_order>
414
- <show_in_default>1</show_in_default>
415
- <show_in_website>1</show_in_website>
416
- <show_in_store>1</show_in_store>
417
- </channelpilot_usePricecontrol>
418
- </fields>
419
- </campaign_prices>-->
420
  </groups>
421
  </channelpilot_pricecontrol>
422
  <payment>
24
  <config>
25
  <tabs>
26
  <channelpilot_config translate="label" module="channelpilot">
 
27
  <label><![CDATA[<div style="overflow:hidden; background-image: url('https://go.channelpilot.com/css/gfx/logo.channelPilot.png');background-size: 150px; background-repeat: no-repeat; background-position: -4px -9px;"><div style="display:block; height: 20px;"></div></div>]]></label>
28
  <class>tab-channelpilot</class>
29
  <sort_order>401</sort_order>
291
  <show_in_website>1</show_in_website>
292
  <show_in_store>1</show_in_store>
293
  </channelpilot_orderStatusImportedUnpayed>
294
+ <use_admin_mode translate="label comment">
295
+ <label>CP Use Admin Mode for order import</label>
296
+ <comment>CP When importing marketplace orders you can use the admin mode. When choosing the admin mode please note that all checks are disabled thar are normally applied, like: ordering a product which amount is less than the configured minimum allowed quantity in shopping cart, import orders which have products that are sold out or the available amount is less than the ordered amount.</comment>
297
+ <frontend_type>select</frontend_type>
298
+ <source_model>adminhtml/system_config_source_yesno</source_model>
299
+ <sort_order>40</sort_order>
300
+ <show_in_default>1</show_in_default>
301
+ <show_in_website>0</show_in_website>
302
+ <show_in_store>0</show_in_store>
303
+ </use_admin_mode>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
304
  </fields>
305
  </channelpilot_marketplace>
306
  </groups>
359
  <show_in_website>1</show_in_website>
360
  <show_in_store>1</show_in_store>
361
  <fields>
 
 
 
 
 
 
 
 
 
362
  <channelpilot_generalPriceField>
363
  <label>CP Field for price</label>
364
  <comment>CP This field would be overwritten by the new product price.</comment>
371
  </channelpilot_generalPriceField>
372
  </fields>
373
  </general_prices>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
374
  </groups>
375
  </channelpilot_pricecontrol>
376
  <payment>
app/code/community/Channelpilotsolutions/Channelpilot/sql/channelpilot_setup/mysql4-upgrade-2.2.5-2.2.6.php ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ *
4
+ * NOTICE OF LICENSE
5
+ *
6
+ * This source file is subject to the GNU General Public License (GPL 3)
7
+ * that is bundled with this package in the file LICENSE.txt
8
+ *
9
+ * DISCLAIMER
10
+ *
11
+ * Do not edit or add to this file if you wish to upgrade Channelpilotsolutions_Channelpilot to newer
12
+ * versions in the future. If you wish to customize Channelpilotsolutions_Channelpilot for your
13
+ * needs please refer to http://www.channelpilot.com for more information.
14
+ *
15
+ * @category Channelpilotsolutions
16
+ * @package Channelpilotsolutions_Channelpilot
17
+ * @copyright Copyright (c) 2012 <info@channelpilot.com> - www.channelpilot.com
18
+ * @author Bj�rn Wehner <info@channelpilot.com>
19
+ * @license <http://www.gnu.org/licenses/> GNU General Public License (GPL 3)
20
+ * @link http://www.channelpilot.com
21
+ */
22
+
23
+ $installer = $this;
24
+
25
+ $installer->startSetup();
26
+ $adapter = $installer->getConnection();
27
+
28
+ /**
29
+ * Create table 'channelpilot/productexport'
30
+ */
31
+ $table = $adapter->newTable($installer->getTable('channelpilot/productexport'))
32
+ ->addColumn('id', Varien_Db_Ddl_Table::TYPE_INTEGER, 11, array(
33
+ 'auto_increment' => true,
34
+ 'unsigned' => true,
35
+ 'nullable' => false,
36
+ 'primary' => true,
37
+ ), 'id')
38
+ ->addColumn('product_id', Varien_Db_Ddl_Table::TYPE_INTEGER, 11, array(
39
+ 'nullable' => false,
40
+ 'unsigned' => true,
41
+ ), 'product_id')
42
+ ->addColumn('store_id', Varien_Db_Ddl_Table::TYPE_INTEGER, 11, array(
43
+ 'nullable' => false,
44
+ 'unsigned' => true,
45
+ ), 'store_id')
46
+ ->addColumn('is_update_needed', Varien_Db_Ddl_Table::TYPE_TINYINT, 1, array(
47
+ 'nullable' => false,
48
+ 'unsigned' => true,
49
+ 'default' => 1,
50
+ ), 'is_update_needed')
51
+ ->addColumn('product_data', Varien_Db_Ddl_Table::TYPE_TEXT, null, array(
52
+ 'nullable' => false,
53
+ 'unsigned' => true,
54
+ 'default' => '',
55
+ ), 'product_data');
56
+ $adapter->createTable($table);
57
+
58
+ $installer->endSetup();
59
+
60
+ Mage::getModel('channelpilot/productexport')->initializeProductExport();
app/locale/de_AT/Channelpilotsolutions_Channelpilot.csv CHANGED
@@ -65,4 +65,7 @@
65
 
66
  "CP Tracking Method","Tracking Methode"
67
  "CP Image","Bild"
68
- "CP JavaScript","JavaScript"
 
 
 
65
 
66
  "CP Tracking Method","Tracking Methode"
67
  "CP Image","Bild"
68
+ "CP JavaScript","JavaScript"
69
+
70
+ "CP Use Admin Mode for order import","Admin-Modus für den Import der Marktplatzbestellungen benutzen"
71
+ "CP When importing marketplace orders you can use the admin mode. When choosing the admin mode please note that all checks are disabled thar are normally applied, like: ordering a product which amount is less than the configured minimum allowed quantity in shopping cart, import orders which have products that are sold out or the available amount is less than the ordered amount.","Wenn Marktplatzbestellungen importiert werden kann der Admin-Modus genutz werden. Sollte dieser genutzt werden dann bedenken Sie bitte, dass sämtliche Prüfungen nicht durchlaufen werden die es normalerweise tun, wie: die bestellte Menge ist geringer als die eingestellte Mindestbestellmenge; Bestellungen werden importiert die Produkte haben die ausverkauft oder nur noch in einer geringeren Stückzahl vorhanden sind."
app/locale/de_CH/Channelpilotsolutions_Channelpilot.csv CHANGED
@@ -65,4 +65,7 @@
65
 
66
  "CP Tracking Method","Tracking Methode"
67
  "CP Image","Bild"
68
- "CP JavaScript","JavaScript"
 
 
 
65
 
66
  "CP Tracking Method","Tracking Methode"
67
  "CP Image","Bild"
68
+ "CP JavaScript","JavaScript"
69
+
70
+ "CP Use Admin Mode for order import","Admin-Modus für den Import der Marktplatzbestellungen benutzen"
71
+ "CP When importing marketplace orders you can use the admin mode. When choosing the admin mode please note that all checks are disabled thar are normally applied, like: ordering a product which amount is less than the configured minimum allowed quantity in shopping cart, import orders which have products that are sold out or the available amount is less than the ordered amount.","Wenn Marktplatzbestellungen importiert werden kann der Admin-Modus genutz werden. Sollte dieser genutzt werden dann bedenken Sie bitte, dass sämtliche Prüfungen nicht durchlaufen werden die es normalerweise tun, wie: die bestellte Menge ist geringer als die eingestellte Mindestbestellmenge; Bestellungen werden importiert die Produkte haben die ausverkauft oder nur noch in einer geringeren Stückzahl vorhanden sind."
app/locale/de_DE/Channelpilotsolutions_Channelpilot.csv CHANGED
@@ -65,4 +65,7 @@
65
 
66
  "CP Tracking Method","Tracking Methode"
67
  "CP Image","Bild"
68
- "CP JavaScript","JavaScript"
 
 
 
65
 
66
  "CP Tracking Method","Tracking Methode"
67
  "CP Image","Bild"
68
+ "CP JavaScript","JavaScript"
69
+
70
+ "CP Use Admin Mode for order import","Admin-Modus für den Import der Marktplatzbestellungen benutzen"
71
+ "CP When importing marketplace orders you can use the admin mode. When choosing the admin mode please note that all checks are disabled thar are normally applied, like: ordering a product which amount is less than the configured minimum allowed quantity in shopping cart, import orders which have products that are sold out or the available amount is less than the ordered amount.","Wenn Marktplatzbestellungen importiert werden kann der Admin-Modus genutz werden. Sollte dieser genutzt werden dann bedenken Sie bitte, dass sämtliche Prüfungen nicht durchlaufen werden die es normalerweise tun, wie: die bestellte Menge ist geringer als die eingestellte Mindestbestellmenge; Bestellungen werden importiert die Produkte haben die ausverkauft oder nur noch in einer geringeren Stückzahl vorhanden sind."
app/locale/en_AU/Channelpilotsolutions_Channelpilot.csv CHANGED
@@ -65,4 +65,7 @@
65
 
66
  "CP Tracking Method","Tracking Method"
67
  "CP Image","Image"
68
- "CP JavaScript","JavaScript"
 
 
 
65
 
66
  "CP Tracking Method","Tracking Method"
67
  "CP Image","Image"
68
+ "CP JavaScript","JavaScript"
69
+
70
+ "CP Use Admin Mode for order import","Use Admin Mode for order import"
71
+ "CP When importing marketplace orders you can use the admin mode. When choosing the admin mode please note that all checks are disabled thar are normally applied, like: ordering a product which amount is less than the configured minimum allowed quantity in shopping cart, import orders which have products that are sold out or the available amount is less than the ordered amount.","CP When importing marketplace orders you can use the admin mode. When choosing the admin mode please note that all checks are disabled thar are normally applied, like: ordering a product which amount is less than the configured minimum allowed quantity in shopping cart, import orders which have products that are sold out or the available amount is less than the ordered amount."
app/locale/en_CA/Channelpilotsolutions_Channelpilot.csv CHANGED
@@ -65,4 +65,7 @@
65
 
66
  "CP Tracking Method","Tracking Method"
67
  "CP Image","Image"
68
- "CP JavaScript","JavaScript"
 
 
 
65
 
66
  "CP Tracking Method","Tracking Method"
67
  "CP Image","Image"
68
+ "CP JavaScript","JavaScript"
69
+
70
+ "CP Use Admin Mode for order import","Use Admin Mode for order import"
71
+ "CP When importing marketplace orders you can use the admin mode. When choosing the admin mode please note that all checks are disabled thar are normally applied, like: ordering a product which amount is less than the configured minimum allowed quantity in shopping cart, import orders which have products that are sold out or the available amount is less than the ordered amount.","CP When importing marketplace orders you can use the admin mode. When choosing the admin mode please note that all checks are disabled thar are normally applied, like: ordering a product which amount is less than the configured minimum allowed quantity in shopping cart, import orders which have products that are sold out or the available amount is less than the ordered amount."
app/locale/en_GB/Channelpilotsolutions_Channelpilot.csv CHANGED
@@ -65,4 +65,7 @@
65
 
66
  "CP Tracking Method","Tracking Method"
67
  "CP Image","Image"
68
- "CP JavaScript","JavaScript"
 
 
 
65
 
66
  "CP Tracking Method","Tracking Method"
67
  "CP Image","Image"
68
+ "CP JavaScript","JavaScript"
69
+
70
+ "CP Use Admin Mode for order import","Use Admin Mode for order import"
71
+ "CP When importing marketplace orders you can use the admin mode. When choosing the admin mode please note that all checks are disabled thar are normally applied, like: ordering a product which amount is less than the configured minimum allowed quantity in shopping cart, import orders which have products that are sold out or the available amount is less than the ordered amount.","CP When importing marketplace orders you can use the admin mode. When choosing the admin mode please note that all checks are disabled thar are normally applied, like: ordering a product which amount is less than the configured minimum allowed quantity in shopping cart, import orders which have products that are sold out or the available amount is less than the ordered amount."
app/locale/en_IE/Channelpilotsolutions_Channelpilot.csv CHANGED
@@ -65,4 +65,7 @@
65
 
66
  "CP Tracking Method","Tracking Method"
67
  "CP Image","Image"
68
- "CP JavaScript","JavaScript"
 
 
 
65
 
66
  "CP Tracking Method","Tracking Method"
67
  "CP Image","Image"
68
+ "CP JavaScript","JavaScript"
69
+
70
+ "CP Use Admin Mode for order import","Use Admin Mode for order import"
71
+ "CP When importing marketplace orders you can use the admin mode. When choosing the admin mode please note that all checks are disabled thar are normally applied, like: ordering a product which amount is less than the configured minimum allowed quantity in shopping cart, import orders which have products that are sold out or the available amount is less than the ordered amount.","CP When importing marketplace orders you can use the admin mode. When choosing the admin mode please note that all checks are disabled thar are normally applied, like: ordering a product which amount is less than the configured minimum allowed quantity in shopping cart, import orders which have products that are sold out or the available amount is less than the ordered amount."
app/locale/en_NZ/Channelpilotsolutions_Channelpilot.csv CHANGED
@@ -65,4 +65,7 @@
65
 
66
  "CP Tracking Method","Tracking Method"
67
  "CP Image","Image"
68
- "CP JavaScript","JavaScript"
 
 
 
65
 
66
  "CP Tracking Method","Tracking Method"
67
  "CP Image","Image"
68
+ "CP JavaScript","JavaScript"
69
+
70
+ "CP Use Admin Mode for order import","Use Admin Mode for order import"
71
+ "CP When importing marketplace orders you can use the admin mode. When choosing the admin mode please note that all checks are disabled thar are normally applied, like: ordering a product which amount is less than the configured minimum allowed quantity in shopping cart, import orders which have products that are sold out or the available amount is less than the ordered amount.","CP When importing marketplace orders you can use the admin mode. When choosing the admin mode please note that all checks are disabled thar are normally applied, like: ordering a product which amount is less than the configured minimum allowed quantity in shopping cart, import orders which have products that are sold out or the available amount is less than the ordered amount."
app/locale/en_US/Channelpilotsolutions_Channelpilot.csv CHANGED
@@ -65,4 +65,7 @@
65
 
66
  "CP Tracking Method","Tracking Method"
67
  "CP Image","Image"
68
- "CP JavaScript","JavaScript"
 
 
 
65
 
66
  "CP Tracking Method","Tracking Method"
67
  "CP Image","Image"
68
+ "CP JavaScript","JavaScript"
69
+
70
+ "CP Use Admin Mode for order import","Use Admin Mode for order import"
71
+ "CP When importing marketplace orders you can use the admin mode. When choosing the admin mode please note that all checks are disabled thar are normally applied, like: ordering a product which amount is less than the configured minimum allowed quantity in shopping cart, import orders which have products that are sold out or the available amount is less than the ordered amount.","CP When importing marketplace orders you can use the admin mode. When choosing the admin mode please note that all checks are disabled thar are normally applied, like: ordering a product which amount is less than the configured minimum allowed quantity in shopping cart, import orders which have products that are sold out or the available amount is less than the ordered amount."
package.xml CHANGED
@@ -1,7 +1,7 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Channelpilotsolutions_Channelpilot</name>
4
- <version>2.2.4.1</version>
5
  <stability>stable</stability>
6
  <license uri="http://www.opensource.org/licenses/gpl-license.php">GPL</license>
7
  <channel>community</channel>
@@ -26,11 +26,13 @@
26
  &lt;li&gt;&lt;b&gt;ChannelPilot Multi-Platform:&lt;/b&gt; Access ChannelPilot on any device (e.g. computer, tablet or smartphone) and keep a firm hold on your online marketing- wherever you are!&lt;/li&gt;&#xD;
27
  &lt;/ul&gt;&#xD;
28
  Just get more information about ChannelPilot: &lt;a href="http://www.channelpilot.com"&gt;www.channelpilot.com&lt;/a&gt;</description>
29
- <notes>- general bugfixes</notes>
 
 
30
  <authors><author><name>ChannelPilot Solutions GmbH</name><user>auto-converted</user><email>info@channelpilot.com</email></author></authors>
31
- <date>2015-09-28</date>
32
- <time>09:11:33</time>
33
- <contents><target name="magecommunity"><dir name="Channelpilotsolutions"><dir name="Channelpilot"><dir name="Adminhtml"><dir name="Model"><dir name="Articlenumber"><file name="Values.php" hash="f2744ef8301e25e096318f34eb97c2bf"/></dir><dir name="Cookiemode"><file name="Values.php" hash="1ec39f85bb7562c1b6a4614f759d9124"/></dir><dir name="Grossnet"><file name="Values.php" hash="11eaf553b0ec34299524ec6d5a9f1e13"/></dir><dir name="Imagenumber"><file name="Values.php" hash="010dbb2ec946627f338bc500d3d8d747"/></dir><dir name="Orderstatus"><file name="Values.php" hash="39823f1757a41c848ad4505d09aca9d2"/></dir><dir name="Pricefield"><file name="Values.php" hash="6b02dfa3fa93daafa8325d66a986b4ac"/></dir><dir name="Truefalse"><file name="Values.php" hash="e07f105d7d8dc9881690f162cd23472d"/></dir><dir name="Truefalsesecurity"><file name="Values.php" hash="509b5e1cc7cabbe179373bc0ed490499"/></dir></dir></dir><dir name="Block"><dir name="Adminhtml"><dir name="Field"><file name="Abstract.php" hash="fc0aae8ea2b0bc8aab16ecba459b8988"/><file name="Exportfields.php" hash="1db2b1b5e56f9e2ea8a0d688b9faa801"/><file name="Replacefields.php" hash="db29c6ffaf9f4abe394b8981d031969f"/><file name="Specialfields.php" hash="4723404c20af3390d6d820318b21c1f6"/><file name="Trackingkeys.php" hash="6164e184bf6ac2b1e81169251752a551"/></dir><file name="Hintlogo.php" hash="1daa84afa8820f71a0d1630ee2311da6"/></dir><dir name="Tracking"><file name="Tracking.php" hash="3be4cdf75739c3dc1078f90be82380c6"/></dir></dir><dir name="Helper"><dir name="api"><dir name="1_0"><dir name="responses"><file name="GetManagedArticlePricesResponse.php" hash="9ad5adee1952b9408b442449791a1f34"/><file name="GetNewMarketplaceOrdersResponse.php" hash="cd5db953a84759b93a35a360956c4624"/><file name="GetServerTimeResponse.php" hash="07d157639b5bf715aa3f93b0d9e4b736"/><file name="Response.php" hash="c76ce62707a862e1c59346c668055b5d"/><file name="UpdateArticleResult.php" hash="a014c60be447fbb9cf48c947c8e9822f"/><file name="UpdateArticlesResponse.php" hash="338619d50391d91defb5c9d41370022f"/><file name="UpdateOrderResult.php" hash="0fbd88371624270a8cb2c4209a89cfac"/><file name="UpdateOrdersResponse.php" hash="b0ad5828da633b05e654da393b15526a"/></dir><dir name="thin"><file name="CPAddress.php" hash="885fb4517335421fbd8cbc882ae336b1"/><file name="CPArticle.php" hash="1adce1ce33acdd0185dee06010040b18"/><file name="CPArticleUpdate.php" hash="45f514823895c754010f8f11a1ff683a"/><file name="CPAuth.php" hash="cf5fe570dbd98e3e6339b20cec826b7b"/><file name="CPCancellation.php" hash="9bf808e265e09d166466313405a167fc"/><file name="CPCustomer.php" hash="62babdf11e9b4d80ae0afbbf96ba329d"/><file name="CPDelivery.php" hash="a270104ae1c253adee0ad1ffb5e01c65"/><file name="CPDiscount.php" hash="5d6f2766869134a86761c12230dc32d1"/><file name="CPManagedArticlePrice.php" hash="65c4c0df04b7c8d20294874de11640d6"/><file name="CPMoney.php" hash="952131eccc8470e107c78e15c94b6495"/><file name="CPOrder.php" hash="32623885f664e9b5871fc48b6ba0c801"/><file name="CPOrderHeader.php" hash="828377182e8197c304f230a783606993"/><file name="CPOrderItem.php" hash="dfe2440a08e3d0f13e638fc4090e6c52"/><file name="CPOrderStatus.php" hash="e0e767388dd9a1ab8be5a990f1ab1259"/><file name="CPOrderSummary.php" hash="fceaa6a79b5fc892062681f518fd0243"/><file name="CPPayment.php" hash="698b42f377910ef04d50a545e599fbca"/><file name="CPResponseHeader.php" hash="53930210d68046183e3be306996ea9b9"/><file name="CPShipping.php" hash="eaddceace28cdc6ba72434a6321d8c47"/></dir><file name="CPResultCodes.php" hash="955180ee33f14b4afa93f6eb1b5df53f"/><file name="ChannelPilotSellerAPI_v1_0.php" hash="76f458bece7e3344d0ffa788370e2026"/></dir></dir><dir name="handler"><file name="CPAbstractHandler.php" hash="78518d108e7ed273ec33056504869763"/><file name="CPCancellationHandler.php" hash="e7470edc465be2a3608102549efc436f"/><file name="CPDebugHandler.php" hash="51845f353b8e3d94ec324c3a750d9cc7"/><file name="CPDeliveryHandler.php" hash="11eee388729b17b21938a067edd66e54"/><file name="CPErrorHandler.php" hash="5d728c064c068fdf8354fa87882e4dba"/><file name="CPExportHandler.php" hash="4c550f49e4f9e94cb0528e3d27431d6f"/><file name="CPNewPriceHandler.php" hash="e0c1be684439c2336dd240aff9d8647e"/><file name="CPNewsHandler.php" hash="10757d4bbb3d10a3090dab9587c86132"/><file name="CPOrderHandler.php" hash="30f24f19045b0a96f73eb60de413493e"/><file name="CPPaymentHandler.php" hash="8ebbfdd04b92a0f7d72a8cbe8ba183d4"/><file name="CPRegisterHandler.php" hash="8ea51b6fc2e7820a4bac3f5e52377112"/><file name="CPStatusHandler.php" hash="573384fb4856d085f036edbc9388c2cd"/></dir><dir name="responses"><file name="CPGetStatusHookResponse.php" hash="672609ebcaa23aa0de85aed04c7662d8"/><file name="CPHookResponse.php" hash="3cda426724f3b3b97df344b4e76fc805"/><file name="CPRegisterHookResponse.php" hash="206de6433d0795ebdabff98129cc2fb7"/></dir><dir name="special"><file name="CustomerFunctions.php" hash="0d343d3c9c3cb87232c833e0772f730e"/></dir><file name="CPErrors.php" hash="3659c38a1ed3be4aa4ec03d93e68a84e"/><file name="Data.php" hash="ab518fc37c2d152fc03b23ffbb317022"/></dir><dir name="Model"><dir name="Adminhtml"><dir name="Source"><file name="Trackingmethod.php" hash="e32ab184b05377af38e4d912022cb889"/></dir></dir><dir name="Carrier"><file name="Cpshipping.php" hash="689b093872e690a9b1b1b5173365e7f8"/></dir><dir name="Order"><file name="Item.php" hash="7e64ca596a4a66e7c5052d0981745cf8"/><file name="Shipment.php" hash="71651ad5489eca654f47e41fd12e79a6"/></dir><dir name="Resource"><dir name="Logs"><file name="Collection.php" hash="d02494433e6369ddd552e04db867e9d5"/></dir><dir name="Order"><dir name="Item"><file name="Collection.php" hash="954e3889a8b8f93510a36be1a13c2fb8"/></dir><dir name="Shipment"><file name="Collection.php" hash="6aa1fd002807916effa760169a2e769d"/></dir><file name="Collection.php" hash="00423726d837a71042527c588cfc4b11"/><file name="Item.php" hash="485669b3f6dd7646ae9299547dc3a88f"/><file name="Shipment.php" hash="5d1514d5721b501fda7e71e6a15f931d"/></dir><dir name="Prices"><file name="Collection.php" hash="6d49bf71e50a0d2b0e087d52036a08ef"/></dir><dir name="Registration"><file name="Collection.php" hash="81423be65cf2ee706203ac03b5e83236"/></dir><file name="Logs.php" hash="b406da96412148256028b8c73444b0d9"/><file name="Order.php" hash="be971d53867fafbbf7c582dbe860e107"/><file name="Prices.php" hash="30275edca721b6986ff6bd39648bf4eb"/><file name="Registration.php" hash="a9f4190c21762c3f39c9647291e8e194"/></dir><file name="Abstract.php" hash="26580a64f5ae3d005b68e4563dbb1aea"/><file name="Logs.php" hash="85c27d3b47cbd97fc197a1ba8ae60dc6"/><file name="Order.php" hash="431bda96fe598fbb5a64928b940d8c13"/><file name="Payment.php" hash="223ab9dec3315f3dada4298f0418151a"/><file name="Paymenttypes.php" hash="ca90419f6e4603be3f70a214d95177c3"/><file name="Prices.php" hash="c1c966c0a3001fee90d14c050f00b66a"/><file name="Registration.php" hash="0719bdd075942a8706ccae12a35e91af"/></dir><dir name="controllers"><file name="IndexController.php" hash="ca07da3c0b2c689e9c0a8e552b6c7004"/></dir><dir name="etc"><file name="adminhtml.xml" hash="8ad60dd724140db26bdf69b4baeabbc5"/><file name="config.xml" hash="ef8a6e40b2556f2deb4cb2d36490a6a8"/><file name="system.xml" hash="98c3360f19c9eaf1bf3ff0c61e63fbb8"/></dir><dir name="sql"><dir name="channelpilot_setup"><file name="mysql4-install-2.0.0.php" hash="f89d8be8b1ed7a6793ba6a2516de3528"/><file name="mysql4-upgrade-1.0.0-2.0.0.php" hash="12264e29678f7a56b002cd693dafd56f"/><file name="mysql4-upgrade-2.1.6-2.2.0.php" hash="4327290be3ce3226544515a72e6a74cf"/></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Channelpilotsolutions_Channelpilot.xml" hash="d14c5346561667941ef4f6e9e55666cd"/></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><dir name="Channelpilotsolutions"><file name="channelpilot.xml" hash="2952fa387aadf60f36b6fea9b5c69fb8"/></dir></dir><dir name="template"><dir name="Channelpilotsolutions"><file name="clicktracking_js.phtml" hash="20d1883b633d814587e5dd1661364fc1"/><file name="salestracking_js.phtml" hash="61c77c6fdab88cfac5989e7d47a8c5a4"/><file name="tracking_image.phtml" hash="f2477e9bf58ed34950b049db5af8a712"/></dir></dir></dir></dir></dir><dir name="adminhtml"><dir name="base"><dir name="default"><dir name="template"><dir name="channelpilotsolutions"><file name="array_dropdown.phtml" hash="5717b5f3ca67bb4da734572fdca1a907"/><file name="config_hint.phtml" hash="c92f883df809f89278492d1e22a352d7"/></dir></dir></dir></dir></dir></target><target name="magelocale"><dir name="de_DE"><file name="Channelpilotsolutions_Channelpilot.csv" hash="14e19cf146fdc5fd2d0f0e9b8d66ae0c"/></dir><dir name="de_CH"><file name="Channelpilotsolutions_Channelpilot.csv" hash="14e19cf146fdc5fd2d0f0e9b8d66ae0c"/></dir><dir name="de_AT"><file name="Channelpilotsolutions_Channelpilot.csv" hash="14e19cf146fdc5fd2d0f0e9b8d66ae0c"/></dir><dir name="fr_FR"><file name="Channelpilotsolutions_Channelpilot.csv" hash="23217faa0b1c623750bb91d1e324e082"/></dir><dir name="fr_CA"><file name="Channelpilotsolutions_Channelpilot.csv" hash="23217faa0b1c623750bb91d1e324e082"/></dir><dir name="en_AU"><file name="Channelpilotsolutions_Channelpilot.csv" hash="d0c9795eb2cc5c9c8fd9387bee78126c"/></dir><dir name="en_CA"><file name="Channelpilotsolutions_Channelpilot.csv" hash="d0c9795eb2cc5c9c8fd9387bee78126c"/></dir><dir name="en_GB"><file name="Channelpilotsolutions_Channelpilot.csv" hash="d0c9795eb2cc5c9c8fd9387bee78126c"/></dir><dir name="en_IE"><file name="Channelpilotsolutions_Channelpilot.csv" hash="d0c9795eb2cc5c9c8fd9387bee78126c"/></dir><dir name="en_NZ"><file name="Channelpilotsolutions_Channelpilot.csv" hash="d0c9795eb2cc5c9c8fd9387bee78126c"/></dir><dir name="en_US"><file name="Channelpilotsolutions_Channelpilot.csv" hash="d0c9795eb2cc5c9c8fd9387bee78126c"/></dir><dir name="es_AR"><file name="Channelpilotsolutions_Channelpilot.csv" hash="e457ab4f2c03c46e8ce69bc6eb1dcc25"/></dir><dir name="es_CL"><file name="Channelpilotsolutions_Channelpilot.csv" hash="e457ab4f2c03c46e8ce69bc6eb1dcc25"/></dir><dir name="es_CO"><file name="Channelpilotsolutions_Channelpilot.csv" hash="e457ab4f2c03c46e8ce69bc6eb1dcc25"/></dir><dir name="es_CR"><file name="Channelpilotsolutions_Channelpilot.csv" hash="e457ab4f2c03c46e8ce69bc6eb1dcc25"/></dir><dir name="es_ES"><file name="Channelpilotsolutions_Channelpilot.csv" hash="e457ab4f2c03c46e8ce69bc6eb1dcc25"/></dir><dir name="es_MX"><file name="Channelpilotsolutions_Channelpilot.csv" hash="e457ab4f2c03c46e8ce69bc6eb1dcc25"/></dir><dir name="es_PA"><file name="Channelpilotsolutions_Channelpilot.csv" hash="e457ab4f2c03c46e8ce69bc6eb1dcc25"/></dir><dir name="es_PE"><file name="Channelpilotsolutions_Channelpilot.csv" hash="e457ab4f2c03c46e8ce69bc6eb1dcc25"/></dir><dir name="es_VE"><file name="Channelpilotsolutions_Channelpilot.csv" hash="e457ab4f2c03c46e8ce69bc6eb1dcc25"/></dir></target></contents>
34
  <compatible/>
35
  <dependencies/>
36
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Channelpilotsolutions_Channelpilot</name>
4
+ <version>2.2.5</version>
5
  <stability>stable</stability>
6
  <license uri="http://www.opensource.org/licenses/gpl-license.php">GPL</license>
7
  <channel>community</channel>
26
  &lt;li&gt;&lt;b&gt;ChannelPilot Multi-Platform:&lt;/b&gt; Access ChannelPilot on any device (e.g. computer, tablet or smartphone) and keep a firm hold on your online marketing- wherever you are!&lt;/li&gt;&#xD;
27
  &lt;/ul&gt;&#xD;
28
  Just get more information about ChannelPilot: &lt;a href="http://www.channelpilot.com"&gt;www.channelpilot.com&lt;/a&gt;</description>
29
+ <notes>- general bugfixes&#xD;
30
+ - improved performance for feed export&#xD;
31
+ - added support to use the admin area for order import</notes>
32
  <authors><author><name>ChannelPilot Solutions GmbH</name><user>auto-converted</user><email>info@channelpilot.com</email></author></authors>
33
+ <date>2015-10-29</date>
34
+ <time>12:17:22</time>
35
+ <contents><target name="magecommunity"><dir name="Channelpilotsolutions"><dir name="Channelpilot"><dir name="Adminhtml"><dir name="Model"><dir name="Articlenumber"><file name="Values.php" hash="f2744ef8301e25e096318f34eb97c2bf"/></dir><dir name="Cookiemode"><file name="Values.php" hash="1ec39f85bb7562c1b6a4614f759d9124"/></dir><dir name="Grossnet"><file name="Values.php" hash="11eaf553b0ec34299524ec6d5a9f1e13"/></dir><dir name="Imagenumber"><file name="Values.php" hash="010dbb2ec946627f338bc500d3d8d747"/></dir><dir name="Orderstatus"><file name="Values.php" hash="39823f1757a41c848ad4505d09aca9d2"/></dir><dir name="Pricefield"><file name="Values.php" hash="6b02dfa3fa93daafa8325d66a986b4ac"/></dir><dir name="Truefalse"><file name="Values.php" hash="e07f105d7d8dc9881690f162cd23472d"/></dir><dir name="Truefalsesecurity"><file name="Values.php" hash="509b5e1cc7cabbe179373bc0ed490499"/></dir></dir></dir><dir name="Block"><dir name="Adminhtml"><dir name="Field"><file name="Abstract.php" hash="fc0aae8ea2b0bc8aab16ecba459b8988"/><file name="Exportfields.php" hash="8017ae4a421013309b731aff45bf997a"/><file name="Replacefields.php" hash="55266f9270660519a6ce1843048467e3"/><file name="Specialfields.php" hash="4723404c20af3390d6d820318b21c1f6"/><file name="Trackingkeys.php" hash="6164e184bf6ac2b1e81169251752a551"/></dir><file name="Hintlogo.php" hash="1daa84afa8820f71a0d1630ee2311da6"/></dir><dir name="Tracking"><file name="Tracking.php" hash="3be4cdf75739c3dc1078f90be82380c6"/></dir></dir><dir name="Helper"><dir name="api"><dir name="1_0"><dir name="responses"><file name="GetManagedArticlePricesResponse.php" hash="9ad5adee1952b9408b442449791a1f34"/><file name="GetNewMarketplaceOrdersResponse.php" hash="cd5db953a84759b93a35a360956c4624"/><file name="GetServerTimeResponse.php" hash="07d157639b5bf715aa3f93b0d9e4b736"/><file name="Response.php" hash="c76ce62707a862e1c59346c668055b5d"/><file name="UpdateArticleResult.php" hash="a014c60be447fbb9cf48c947c8e9822f"/><file name="UpdateArticlesResponse.php" hash="338619d50391d91defb5c9d41370022f"/><file name="UpdateOrderResult.php" hash="0fbd88371624270a8cb2c4209a89cfac"/><file name="UpdateOrdersResponse.php" hash="b0ad5828da633b05e654da393b15526a"/></dir><dir name="thin"><file name="CPAddress.php" hash="885fb4517335421fbd8cbc882ae336b1"/><file name="CPArticle.php" hash="1adce1ce33acdd0185dee06010040b18"/><file name="CPArticleUpdate.php" hash="45f514823895c754010f8f11a1ff683a"/><file name="CPAuth.php" hash="cf5fe570dbd98e3e6339b20cec826b7b"/><file name="CPCancellation.php" hash="9bf808e265e09d166466313405a167fc"/><file name="CPCustomer.php" hash="62babdf11e9b4d80ae0afbbf96ba329d"/><file name="CPDelivery.php" hash="a270104ae1c253adee0ad1ffb5e01c65"/><file name="CPDiscount.php" hash="5d6f2766869134a86761c12230dc32d1"/><file name="CPManagedArticlePrice.php" hash="65c4c0df04b7c8d20294874de11640d6"/><file name="CPMoney.php" hash="952131eccc8470e107c78e15c94b6495"/><file name="CPOrder.php" hash="32623885f664e9b5871fc48b6ba0c801"/><file name="CPOrderHeader.php" hash="828377182e8197c304f230a783606993"/><file name="CPOrderItem.php" hash="dfe2440a08e3d0f13e638fc4090e6c52"/><file name="CPOrderStatus.php" hash="e0e767388dd9a1ab8be5a990f1ab1259"/><file name="CPOrderSummary.php" hash="fceaa6a79b5fc892062681f518fd0243"/><file name="CPPayment.php" hash="698b42f377910ef04d50a545e599fbca"/><file name="CPResponseHeader.php" hash="53930210d68046183e3be306996ea9b9"/><file name="CPShipping.php" hash="eaddceace28cdc6ba72434a6321d8c47"/></dir><file name="CPResultCodes.php" hash="955180ee33f14b4afa93f6eb1b5df53f"/><file name="ChannelPilotSellerAPI_v1_0.php" hash="76f458bece7e3344d0ffa788370e2026"/></dir></dir><dir name="handler"><file name="CPAbstractHandler.php" hash="78518d108e7ed273ec33056504869763"/><file name="CPCancellationHandler.php" hash="e7470edc465be2a3608102549efc436f"/><file name="CPDebugHandler.php" hash="51845f353b8e3d94ec324c3a750d9cc7"/><file name="CPDeliveryHandler.php" hash="11eee388729b17b21938a067edd66e54"/><file name="CPErrorHandler.php" hash="5d728c064c068fdf8354fa87882e4dba"/><file name="CPExportHandler.php" hash="34952b631cb90ad0b556642537b07794"/><file name="CPNewPriceHandler.php" hash="e0c1be684439c2336dd240aff9d8647e"/><file name="CPNewsHandler.php" hash="10757d4bbb3d10a3090dab9587c86132"/><file name="CPOrderHandler.php" hash="cdf76d6674c506508610347d247c0b2f"/><file name="CPPaymentHandler.php" hash="8ebbfdd04b92a0f7d72a8cbe8ba183d4"/><file name="CPRegisterHandler.php" hash="8ea51b6fc2e7820a4bac3f5e52377112"/><file name="CPStatusHandler.php" hash="573384fb4856d085f036edbc9388c2cd"/></dir><dir name="responses"><file name="CPGetStatusHookResponse.php" hash="672609ebcaa23aa0de85aed04c7662d8"/><file name="CPHookResponse.php" hash="3cda426724f3b3b97df344b4e76fc805"/><file name="CPRegisterHookResponse.php" hash="206de6433d0795ebdabff98129cc2fb7"/></dir><dir name="special"><file name="CustomerFunctions.php" hash="0d343d3c9c3cb87232c833e0772f730e"/></dir><file name="CPErrors.php" hash="3659c38a1ed3be4aa4ec03d93e68a84e"/><file name="Data.php" hash="9222c52259fda441689e134102ca4c55"/></dir><dir name="Model"><dir name="Adminhtml"><dir name="Source"><file name="Trackingmethod.php" hash="e32ab184b05377af38e4d912022cb889"/></dir></dir><dir name="Carrier"><file name="Cpshipping.php" hash="689b093872e690a9b1b1b5173365e7f8"/></dir><dir name="Order"><file name="Item.php" hash="7e64ca596a4a66e7c5052d0981745cf8"/><file name="Shipment.php" hash="71651ad5489eca654f47e41fd12e79a6"/></dir><dir name="Resource"><dir name="Logs"><file name="Collection.php" hash="d02494433e6369ddd552e04db867e9d5"/></dir><dir name="Order"><dir name="Item"><file name="Collection.php" hash="954e3889a8b8f93510a36be1a13c2fb8"/></dir><dir name="Shipment"><file name="Collection.php" hash="6aa1fd002807916effa760169a2e769d"/></dir><file name="Collection.php" hash="00423726d837a71042527c588cfc4b11"/><file name="Item.php" hash="485669b3f6dd7646ae9299547dc3a88f"/><file name="Shipment.php" hash="5d1514d5721b501fda7e71e6a15f931d"/></dir><dir name="Prices"><file name="Collection.php" hash="6d49bf71e50a0d2b0e087d52036a08ef"/></dir><dir name="Registration"><file name="Collection.php" hash="81423be65cf2ee706203ac03b5e83236"/></dir><file name="Logs.php" hash="b406da96412148256028b8c73444b0d9"/><file name="Order.php" hash="be971d53867fafbbf7c582dbe860e107"/><file name="Prices.php" hash="30275edca721b6986ff6bd39648bf4eb"/><file name="Registration.php" hash="a9f4190c21762c3f39c9647291e8e194"/></dir><file name="Abstract.php" hash="26580a64f5ae3d005b68e4563dbb1aea"/><file name="Logs.php" hash="85c27d3b47cbd97fc197a1ba8ae60dc6"/><file name="Order.php" hash="431bda96fe598fbb5a64928b940d8c13"/><file name="Payment.php" hash="223ab9dec3315f3dada4298f0418151a"/><file name="Paymenttypes.php" hash="ca90419f6e4603be3f70a214d95177c3"/><file name="Prices.php" hash="c1c966c0a3001fee90d14c050f00b66a"/><file name="Registration.php" hash="0719bdd075942a8706ccae12a35e91af"/></dir><dir name="controllers"><file name="IndexController.php" hash="ca07da3c0b2c689e9c0a8e552b6c7004"/></dir><dir name="etc"><file name="adminhtml.xml" hash="8ad60dd724140db26bdf69b4baeabbc5"/><file name="config.xml" hash="f4f44ba0f796f938e79cd7eff1f4bc7b"/><file name="system.xml" hash="1555b7a34ad9fb281f5014acdd35cda6"/></dir><dir name="sql"><dir name="channelpilot_setup"><file name="mysql4-install-2.0.0.php" hash="f89d8be8b1ed7a6793ba6a2516de3528"/><file name="mysql4-upgrade-1.0.0-2.0.0.php" hash="12264e29678f7a56b002cd693dafd56f"/><file name="mysql4-upgrade-2.1.6-2.2.0.php" hash="4327290be3ce3226544515a72e6a74cf"/><file name="mysql4-upgrade-2.2.5-2.2.6.php" hash="b780b4273e42c73e1459935a003974b4"/></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Channelpilotsolutions_Channelpilot.xml" hash="d14c5346561667941ef4f6e9e55666cd"/></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><dir name="Channelpilotsolutions"><file name="channelpilot.xml" hash="2952fa387aadf60f36b6fea9b5c69fb8"/></dir></dir><dir name="template"><dir name="Channelpilotsolutions"><file name="clicktracking_js.phtml" hash="20d1883b633d814587e5dd1661364fc1"/><file name="salestracking_js.phtml" hash="61c77c6fdab88cfac5989e7d47a8c5a4"/><file name="tracking_image.phtml" hash="f2477e9bf58ed34950b049db5af8a712"/></dir></dir></dir></dir></dir><dir name="adminhtml"><dir name="base"><dir name="default"><dir name="template"><dir name="channelpilotsolutions"><file name="array_dropdown.phtml" hash="5717b5f3ca67bb4da734572fdca1a907"/><file name="config_hint.phtml" hash="c92f883df809f89278492d1e22a352d7"/></dir></dir></dir></dir></dir></target><target name="magelocale"><dir name="de_DE"><file name="Channelpilotsolutions_Channelpilot.csv" hash="1cba569e9ec981939eb4a9c3da7ea979"/></dir><dir name="de_CH"><file name="Channelpilotsolutions_Channelpilot.csv" hash="1cba569e9ec981939eb4a9c3da7ea979"/></dir><dir name="de_AT"><file name="Channelpilotsolutions_Channelpilot.csv" hash="1cba569e9ec981939eb4a9c3da7ea979"/></dir><dir name="fr_FR"><file name="Channelpilotsolutions_Channelpilot.csv" hash="23217faa0b1c623750bb91d1e324e082"/></dir><dir name="fr_CA"><file name="Channelpilotsolutions_Channelpilot.csv" hash="23217faa0b1c623750bb91d1e324e082"/></dir><dir name="en_AU"><file name="Channelpilotsolutions_Channelpilot.csv" hash="6ca86d9f43bbc1917c572d5d1d935677"/></dir><dir name="en_CA"><file name="Channelpilotsolutions_Channelpilot.csv" hash="6ca86d9f43bbc1917c572d5d1d935677"/></dir><dir name="en_GB"><file name="Channelpilotsolutions_Channelpilot.csv" hash="6ca86d9f43bbc1917c572d5d1d935677"/></dir><dir name="en_IE"><file name="Channelpilotsolutions_Channelpilot.csv" hash="6ca86d9f43bbc1917c572d5d1d935677"/></dir><dir name="en_NZ"><file name="Channelpilotsolutions_Channelpilot.csv" hash="6ca86d9f43bbc1917c572d5d1d935677"/></dir><dir name="en_US"><file name="Channelpilotsolutions_Channelpilot.csv" hash="6ca86d9f43bbc1917c572d5d1d935677"/></dir><dir name="es_AR"><file name="Channelpilotsolutions_Channelpilot.csv" hash="e457ab4f2c03c46e8ce69bc6eb1dcc25"/></dir><dir name="es_CL"><file name="Channelpilotsolutions_Channelpilot.csv" hash="e457ab4f2c03c46e8ce69bc6eb1dcc25"/></dir><dir name="es_CO"><file name="Channelpilotsolutions_Channelpilot.csv" hash="e457ab4f2c03c46e8ce69bc6eb1dcc25"/></dir><dir name="es_CR"><file name="Channelpilotsolutions_Channelpilot.csv" hash="e457ab4f2c03c46e8ce69bc6eb1dcc25"/></dir><dir name="es_ES"><file name="Channelpilotsolutions_Channelpilot.csv" hash="e457ab4f2c03c46e8ce69bc6eb1dcc25"/></dir><dir name="es_MX"><file name="Channelpilotsolutions_Channelpilot.csv" hash="e457ab4f2c03c46e8ce69bc6eb1dcc25"/></dir><dir name="es_PA"><file name="Channelpilotsolutions_Channelpilot.csv" hash="e457ab4f2c03c46e8ce69bc6eb1dcc25"/></dir><dir name="es_PE"><file name="Channelpilotsolutions_Channelpilot.csv" hash="e457ab4f2c03c46e8ce69bc6eb1dcc25"/></dir><dir name="es_VE"><file name="Channelpilotsolutions_Channelpilot.csv" hash="e457ab4f2c03c46e8ce69bc6eb1dcc25"/></dir></target></contents>
36
  <compatible/>
37
  <dependencies/>
38
  </package>