/**
  * Handles the whole import
  */
 public function import()
 {
     $this->setData();
     $this->setDetails();
     $this->setVariants();
     $this->setProperties();
     $data = $this->data;
     $data['mainDetail'] = $this->details;
     $mainDetailId = -1;
     $ArticleResource = self::getArticleApi();
     $VariantResource = self::getVariantApi();
     try {
         // If a mappings exists, it's a regular item
         $SHOPWARE_itemID = PlentymarketsMappingController::getItemByPlentyID($this->ItemBase->ItemID);
         // Should the categories be synchronized?
         if (PlentymarketsConfig::getInstance()->getItemCategorySyncActionID(IMPORT_ITEM_CATEGORY_SYNC) == IMPORT_ITEM_CATEGORY_SYNC) {
             $this->setCategories();
             $data['categories'] = $this->categories;
         }
         // Should the number be synchronized?
         // This does only matter if there are no variants
         if (PlentymarketsConfig::getInstance()->getItemNumberImportActionID(IMPORT_ITEM_NUMBER) == IMPORT_ITEM_NUMBER && !count($this->variants)) {
             // strip whitespaces
             $numberField = PyConf()->getItemNumberSourceKey('ItemNo');
             $number = trim($this->ItemBase->{$numberField});
             // If this number does not belong to this item
             if (!PlentymarketsImportItemHelper::isNumberExistantItem($number, $SHOPWARE_itemID)) {
                 // and check if the number is valid
                 if (!PlentymarketsImportItemHelper::isNumberValid($number)) {
                     throw new PlentymarketsImportItemNumberException('The item number »' . $number . '« of item »' . $this->data['name'] . '« with the id »' . $this->ItemBase->ItemID . '« is invalid', 3120);
                 }
                 // check if the number is available anyway
                 if (PlentymarketsImportItemHelper::isNumberExistant($number)) {
                     throw new PlentymarketsImportItemNumberException('The item number »' . $number . '« of item »' . $this->data['name'] . '« with the id »' . $this->ItemBase->ItemID . '« is already in use', 3121);
                 }
                 // then update it
                 $data['mainDetail']['number'] = $number;
             }
         }
         // Update the item
         $Article = $ArticleResource->update($SHOPWARE_itemID, $data);
         // Log
         PlentymarketsLogger::getInstance()->message('Sync:Item', sprintf('The item »%s« with the number »%s« has been updated', $data['name'], $Article->getMainDetail()->getNumber()));
         // Remember the main detail's id (to set the prices)
         $mainDetailId = $Article->getMainDetail()->getId();
         // Variants that will be commited to the API
         $variants = array();
         $update = array();
         $number2sku = array();
         $keep = array('numbers' => array(), 'ids' => array());
         // Es gibt varianten
         if (count($this->variants)) {
             //
             $VariantController = new PlentymarketsImportItemVariantController($this->ItemBase);
             // Counter
             $numberOfVariantsUpdated = 0;
             $numberOfVariantsCreated = 0;
             $numberOfVariantsDeleted = 0;
             foreach ($this->variants as $variantId => $variant) {
                 // Directly add the prices
                 $PlentymarketsImportEntityItemPrice = new PlentymarketsImportEntityItemPrice($this->ItemBase->PriceSet, $VariantController->getMarkupByVariantId($variantId));
                 $variant['prices'] = $PlentymarketsImportEntityItemPrice->getPrices();
                 $variant['purchasePrice'] = $PlentymarketsImportEntityItemPrice->getPurchasePrice();
                 // If the variant has an id, it is already created and mapped soo we just keep it
                 if (array_key_exists('id', $variant)) {
                     ++$numberOfVariantsUpdated;
                     $keep['ids'][] = $variant['id'];
                 } else {
                     ++$numberOfVariantsCreated;
                     $variant['configuratorOptions'] = $VariantController->getOptionsByVariantId($variantId);
                     $keep['numbers'][] = $variant['number'];
                     // Internal mapping of the variant number to some plenty information
                     $number2sku[$variant['number']] = $variant['X_plentySku'];
                 }
                 $variants[] = $variant;
             }
             // The configurator set has to be adapted
             $update['configuratorSet'] = array('groups' => $VariantController->getGroups(), 'type' => PlentymarketsConfig::getInstance()->getItemConfiguratorSetType(0));
             // Delete all variants
             if ($numberOfVariantsUpdated == 0) {
                 $Article = $ArticleResource->update($SHOPWARE_itemID, array('configuratorSet' => array('groups' => array()), 'variations' => array()));
             }
             $update['variants'] = $variants;
             // Check if the main detail will be deleted
             if (!in_array($mainDetailId, $keep['ids'])) {
                 // Promote the first variante to be the main detail
                 $update['variants'][0]['isMain'] = true;
                 $deleteMainVariant = true;
             } else {
                 $deleteMainVariant = false;
             }
             $ArticleResource->update($SHOPWARE_itemID, $update);
             // Check if the main detail will be deleted
             if ($deleteMainVariant) {
                 // If the main detail is not needed anymore, delete it right away
                 // Otherwise it will be a dead data record. The main details are not
                 // returned from the API->getOne call. Only the "real" main detail.
                 Shopware()->Models()->remove(Shopware()->Models()->find('Shopware\\Models\\Article\\Detail', $mainDetailId));
                 Shopware()->Models()->flush();
                 PlentymarketsMappingController::deleteItemVariantByShopwareID($mainDetailId);
                 ++$numberOfVariantsDeleted;
             }
             $article = $ArticleResource->getOne($SHOPWARE_itemID);
             // Add the main detail
             $article['details'][] = $article['mainDetail'];
             // Mapping for the variants
             foreach ($article['details'] as $detail) {
                 // If the variant is not needed anymore - delete it
                 if (!in_array($detail['number'], $keep['numbers']) && !in_array($detail['id'], $keep['ids'])) {
                     ++$numberOfVariantsDeleted;
                     $VariantResource->delete($detail['id']);
                     PlentymarketsMappingController::deleteItemVariantByShopwareID($detail['id']);
                 } else {
                     if (isset($number2sku[$detail['number']])) {
                         // Add the mapping
                         PlentymarketsMappingController::addItemVariant($detail['id'], $number2sku[$detail['number']]);
                     }
                 }
             }
             $VariantController->map($article);
             $messages = array();
             // Log
             if ($numberOfVariantsUpdated == 1) {
                 $messages[] = '1 variant has been updated';
             } else {
                 if ($numberOfVariantsUpdated > 1) {
                     $messages[] = $numberOfVariantsUpdated . ' variants have been updated';
                 }
             }
             if ($numberOfVariantsCreated == 1) {
                 $messages[] = '1 variant has been created';
             } else {
                 if ($numberOfVariantsCreated > 1) {
                     $messages[] = $numberOfVariantsCreated . ' variants have been created';
                 }
             }
             if ($numberOfVariantsDeleted == 1) {
                 $messages[] = '1 variant has been deleted';
             } else {
                 if ($numberOfVariantsDeleted > 1) {
                     $messages[] = $numberOfVariantsDeleted . ' variants have been deleted';
                 }
             }
             if ($messages) {
                 PlentymarketsLogger::getInstance()->message('Sync:Item', implode(', ', $messages));
             }
         } else {
             // Preise eines Normalen Artikels aktualisieren
             $PlentymarketsImportEntityItemPrice = new PlentymarketsImportEntityItemPrice($this->ItemBase->PriceSet);
             $PlentymarketsImportEntityItemPrice->update($SHOPWARE_itemID);
         }
         // Bilder
         if (PlentymarketsConfig::getInstance()->getItemImageSyncActionID(IMPORT_ITEM_IMAGE_SYNC) == IMPORT_ITEM_IMAGE_SYNC) {
             $PlentymarketsImportEntityItemImage = new PlentymarketsImportEntityItemImage($this->ItemBase->ItemID, $SHOPWARE_itemID);
             $PlentymarketsImportEntityItemImage->image();
         }
     } catch (PlentymarketsMappingExceptionNotExistant $E) {
         // Set the categories no matter what
         $this->setCategories();
         $data['categories'] = $this->categories;
         // Regular item
         if (!count($this->variants)) {
             // Numbers should be synced
             if (PlentymarketsConfig::getInstance()->getItemNumberImportActionID(IMPORT_ITEM_NUMBER) == IMPORT_ITEM_NUMBER) {
                 // strip whitespaces
                 $numberField = PyConf()->getItemNumberSourceKey('ItemNo');
                 $number = trim($this->ItemBase->{$numberField});
                 // Nummer ist ungültig oder in Benutzung
                 if (!PlentymarketsImportItemHelper::isNumberValid($number)) {
                     throw new PlentymarketsImportItemNumberException('The item number »' . $number . '« of item »' . $this->data['name'] . '« with the id »' . $this->ItemBase->ItemID . '« is invalid', 3120);
                 }
                 if (PlentymarketsImportItemHelper::isNumberExistant($number)) {
                     throw new PlentymarketsImportItemNumberException('The item number »' . $number . '« of item »' . $this->data['name'] . '« with the id »' . $this->ItemBase->ItemID . '« is already in use', 3121);
                 }
                 // Use this number
                 $data['mainDetail']['number'] = $number;
             } else {
                 // A new number is generated
                 $data['mainDetail']['number'] = PlentymarketsImportItemHelper::getItemNumber();
             }
             // Create
             $Article = $ArticleResource->create($data);
             //
             $SHOPWARE_itemID = $Article->getId();
             // Log
             PlentymarketsLogger::getInstance()->message('Sync:Item', 'The item »' . $this->data['name'] . '« has been created with the number »' . $data['mainDetail']['number'] . '«');
             // Mapping speichern
             PlentymarketsMappingController::addItem($Article->getId(), $this->ItemBase->ItemID);
             // Stock stack
             PlentymarketsImportItemStockStack::getInstance()->add($this->ItemBase->ItemID);
             // Media
             // Preise
             $PlentymarketsImportEntityItemPrice = new PlentymarketsImportEntityItemPrice($this->ItemBase->PriceSet);
             $PlentymarketsImportEntityItemPrice->update($Article->getId());
         } else {
             // Set the id of the first variant
             $mainVariant = array_shift(array_values($this->variants));
             $data['mainDetail']['number'] = $mainVariant['number'];
             // Anlegen
             $Article = $ArticleResource->create($data);
             PlentymarketsLogger::getInstance()->message('Sync:Item', 'The variant base item »' . $this->data['name'] . '« has been created created with the number »' . $data['mainDetail']['number'] . '«');
             //
             $SHOPWARE_itemID = $Article->getId();
             // Mapping speichern
             PlentymarketsMappingController::addItem($Article->getId(), $this->ItemBase->ItemID);
             $VariantController = new PlentymarketsImportItemVariantController($this->ItemBase);
             //
             $number2sku = array();
             //
             foreach ($this->variants as $variantId => &$variant) {
                 $variant['inStock'] = 0;
                 $variant['configuratorOptions'] = $VariantController->getOptionsByVariantId($variantId);
                 // Prices
                 $PlentymarketsImportEntityItemPrice = new PlentymarketsImportEntityItemPrice($this->ItemBase->PriceSet, $VariantController->getMarkupByVariantId($variantId));
                 $variant['prices'] = $PlentymarketsImportEntityItemPrice->getPrices();
                 $variant['purchasePrice'] = $PlentymarketsImportEntityItemPrice->getPurchasePrice();
                 $number2sku[$variant['number']] = $variant['X_plentySku'];
             }
             // Varianten
             $id = $Article->getId();
             $updateArticle = array('configuratorSet' => array('groups' => $VariantController->getGroups(), 'type' => PlentymarketsConfig::getInstance()->getItemConfiguratorSetType(0)), 'variants' => array_values($this->variants));
             PlentymarketsLogger::getInstance()->message('Sync:Item:Variant', 'Starting to create variants for the item »' . $this->data['name'] . '« with the number »' . $data['mainDetail']['number'] . '«');
             $Article = $ArticleResource->update($id, $updateArticle);
             /**@var Shopware\Models\Article\Detail $detail */
             foreach ($Article->getDetails() as $detail) {
                 // Save mapping and add the variant to the stock stack
                 $sku = $number2sku[$detail->getNumber()];
                 PlentymarketsMappingController::addItemVariant($detail->getId(), $sku);
                 PlentymarketsImportItemStockStack::getInstance()->add($sku);
             }
             $VariantController->map($ArticleResource->getOne($id));
             PlentymarketsLogger::getInstance()->message('Sync:Item:Variant', 'Variants created successfully');
         }
         // Bilder
         $PlentymarketsImportEntityItemImage = new PlentymarketsImportEntityItemImage($this->ItemBase->ItemID, $SHOPWARE_itemID);
         $PlentymarketsImportEntityItemImage->image();
     }
     // Rebuild category tree
     if (count($this->categories)) {
         /** @var \Shopware\Components\Model\CategoryDenormalization $component */
         $component = Shopware()->CategoryDenormalization();
         $component->removeArticleAssignmentments($SHOPWARE_itemID);
         foreach ($this->categories as $category) {
             $component->addAssignment($SHOPWARE_itemID, $category['id']);
         }
     }
     // Der Hersteller ist neu angelegt worden
     if ($Article instanceof Shopware\Models\Article\Article && array_key_exists('supplier', $this->data)) {
         PlentymarketsLogger::getInstance()->message('Sync:Item', 'The producer »' . $Article->getSupplier()->getName() . '« has been created');
         PlentymarketsMappingController::addProducer($Article->getSupplier()->getId(), $this->ItemBase->ProducerID);
     }
 }
 /**
  * Update plugin method
  *
  * @see Shopware_Components_Plugin_Bootstrap::update()
  */
 public function update($version)
 {
     $Logger = PlentymarketsLogger::getInstance();
     $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, $version . ' →  ' . $this->getVersion());
     if (version_compare($version, '1.6') !== 1) {
         try {
             PlentymarketsExportController::getInstance()->erase('ItemCategory');
             $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'PlentymarketsExportController::getInstance()->erase(\'ItemCategory\') done');
         } catch (Exception $E) {
             $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'PlentymarketsExportController::getInstance()->erase(\'ItemCategory\') failed');
         }
         try {
             Shopware()->Db()->exec("\n\t\t\t\t\tALTER TABLE `plenty_mapping_category` CHANGE `shopwareID` `shopwareID` VARCHAR(255) NOT NULL DEFAULT '';\n\t\t\t\t");
             $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'ALTER TABLE `plenty_mapping_category` done');
         } catch (Exception $E) {
             $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'ALTER TABLE `plenty_mapping_category` failed');
         }
         PyConf()->erase('PlentymarketsVersionTimestamp');
     }
     if (version_compare($version, '1.7') !== 1) {
         $this->subscribeEvent('Shopware_Models_Order_Order::postPersist', 'onOrderModelPostPersist');
         $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'Shopware_Models_Order_Order::postPersist');
         try {
             Shopware()->Db()->exec("\n\t\t\t\t\tALTER TABLE `plenty_mapping_referrer` CHANGE `plentyID` `plentyID` FLOAT(11)  UNSIGNED  NOT NULL;\n\t\t\t\t");
             $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'ALTER TABLE `plenty_mapping_referrer` done');
         } catch (Exception $E) {
             $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'ALTER TABLE `plenty_mapping_referrer` failed');
         }
     }
     if (version_compare($version, '1.7.4') !== 1) {
         PyConf()->setCheckIncomingPayment(1);
         PyConf()->setCheckOutgoingItems(1);
         PyConf()->setItemNumberSourceKey('ItemNo');
         PyConf()->setItemVariationNumberSourceKey('ColliNo');
         PlentymarketsConfig::getInstance()->setImportOrderStatusChangeLastUpdateTimestamp(time());
         $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'setCheckIncomingPayment(1)');
         $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'setCheckOutgoingItems(1)');
         $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'setImportOrderStatusChangeLastUpdateTimestamp(time())');
         $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, "setItemNumberSourceKey('ItemNo')");
         $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, "setItemVariationNumberSourceKey('ColliNo')");
         try {
             Shopware()->Db()->exec("\n\t\t\t\t\tCREATE TABLE `plenty_mapping_order_status` (\n\t\t\t\t\t  `shopwareID` int(11) NOT NULL,\n\t\t\t\t\t  `plentyID` decimal(3,1) unsigned NOT NULL,\n\t\t\t\t\t  PRIMARY KEY (`shopwareID`,`plentyID`),\n\t\t\t\t\t  UNIQUE KEY `plentyID` (`plentyID`)\n\t\t\t\t\t) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\t\t\t\t");
             $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'CREATE TABLE `plenty_mapping_order_status` done');
         } catch (Exception $E) {
             $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'CREATE TABLE `plenty_mapping_order_status` failed');
         }
         try {
             Shopware()->Db()->exec("\n\t\t\t\t\tCREATE TABLE `plenty_mapping_payment_status` (\n\t\t\t\t\t  `shopwareID` int(11) NOT NULL,\n\t\t\t\t\t  `plentyID` decimal(3,1) unsigned NOT NULL,\n\t\t\t\t\t  PRIMARY KEY (`shopwareID`,`plentyID`),\n\t\t\t\t\t  UNIQUE KEY `plentyID` (`plentyID`)\n\t\t\t\t\t) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\t\t\t\t");
             $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'CREATE TABLE `plenty_mapping_payment_status` done');
         } catch (Exception $E) {
             $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'CREATE TABLE `plenty_mapping_payment_status` failed');
         }
     }
     if (version_compare($version, '1.8.1', '<')) {
         try {
             $this->subscribeEvent('Shopware_Models_Order_Order::postPersist', 'onOrderModelPostPersist');
         } catch (Exception $e) {
             return array('success' => false, 'message' => $e->getMessage());
         }
     }
     PlentymarketsConfig::getInstance()->setConnectorVersion($this->getVersion());
     return true;
 }
 /**
  * Update plugin method
  *
  * @see Shopware_Components_Plugin_Bootstrap::update()
  */
 public function update($version)
 {
     $Logger = PlentymarketsLogger::getInstance();
     $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, $version . ' →  ' . $this->getVersion());
     if ($version == '1.4.3') {
         try {
             // Drop unused columns from the log
             Shopware()->Db()->exec("\n\t\t\t\t\tALTER TABLE `plenty_log`\n\t\t\t\t\t\tDROP `request`,\n\t\t\t\t\t\tDROP `response`;\n\t\t\t\t");
         } catch (Exception $E) {
             $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'ALTER TABLE `plenty_log` (drop unused columns from the log) already carried out');
         }
     }
     if (version_compare($version, '1.4.4') !== 1) {
         try {
             Shopware()->Db()->exec("\n\t\t\t\t\tCREATE TABLE `plenty_mapping_customer_billing_address` (\n\t\t\t\t\t  `shopwareID` int(11) unsigned NOT NULL,\n\t\t\t\t\t  `plentyID` int(11) unsigned NOT NULL,\n\t\t\t\t\t  PRIMARY KEY (`shopwareID`,`plentyID`)\n\t\t\t\t\t) ENGINE=InnoDB DEFAULT CHARSET=utf8\n\t\t\t\t");
             $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'CREATE TABLE `plenty_mapping_customer_billing_address` done');
         } catch (Exception $E) {
             $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'CREATE TABLE `plenty_mapping_customer_billing_address` already carried out');
         }
         Shopware()->Db()->exec("\n\t\t\t\tTRUNCATE TABLE `plenty_mapping_customer`\n\t\t\t");
         $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'TRUNCATE TABLE `plenty_mapping_customer` done');
         Shopware()->Db()->exec("\n\t\t\t\tDELETE FROM `plenty_config` WHERE `key` LIKE 'CustomerExport%'\n\t\t\t");
         $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'DELETE FROM `plenty_config` done');
     }
     if (version_compare($version, '1.4.5') !== 1) {
         try {
             $this->addMappingCleanupCronEvent();
             $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'addMappingCleanupCronEvent done');
         } catch (Exception $E) {
             $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'addMappingCleanupCronEvent already carried out');
         }
     }
     if (version_compare($version, '1.4.7') !== 1) {
         if (PlentymarketsConfig::getInstance()->getItemExportStatus() == 'success') {
             PlentymarketsConfig::getInstance()->setItemCrossSellingExportStatus('success');
             PlentymarketsConfig::getInstance()->setItemCrossSellingExportTimestampStart(time());
             PlentymarketsConfig::getInstance()->setItemCrossSellingExportTimestampFinished(time());
             $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'Item cross selling export marked as done');
         }
     }
     if (version_compare($version, '1.4.8') !== 1) {
         $this->addItemImportStackCronEvent();
         $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'addItemImportStackCronEvent done');
         try {
             Shopware()->Db()->exec("\n\t\t\t\t\tCREATE TABLE `plenty_stack_item` (\n\t\t\t\t\t  `itemId` int(11) unsigned NOT NULL,\n\t\t\t\t\t  `timestamp` int(10) unsigned NOT NULL,\n\t\t\t\t\t  `storeIds` text NOT NULL,\n\t\t\t\t\t  PRIMARY KEY (`itemId`),\n\t\t\t\t\t  KEY `timestamp` (`timestamp`)\n\t\t\t\t\t) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\t\t\t\t");
             $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'CREATE TABLE `plenty_stack_item` done');
         } catch (Exception $E) {
             $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'CREATE TABLE `plenty_stack_item` already carried out');
         }
         try {
             Shopware()->Db()->exec("\n\t\t\t\t\tUPDATE plenty_config\n\t\t\t\t\t\tSET `key` = 'ImportItemStackLastUpdateTimestamp'\n\t\t\t\t\t\tWHERE `key` = 'ImportItemLastUpdateTimestamp'\n\t\t\t\t");
             $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'UPDATE plenty_config (ImportItemStackLastUpdateTimestamp) done');
         } catch (Exception $E) {
             $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'UPDATE plenty_config (ImportItemStackLastUpdateTimestamp) failed');
         }
     }
     if (version_compare($version, '1.4.12') !== 1) {
         try {
             Shopware()->Db()->exec("\n\t\t\t\t\tALTER TABLE `plenty_log` ADD `code` INT  UNSIGNED  NULL  DEFAULT NULL  AFTER `message`;\n\t\t\t\t");
             $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'ALTER TABLE `plenty_log` ADD `code` done');
         } catch (Exception $E) {
             $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'ALTER TABLE `plenty_log` ADD `code` already carried out');
         }
     }
     if (version_compare($version, '1.4.14') !== 1) {
         $this->addLogCleanupCronEvent();
     }
     if (version_compare($version, '1.4.18') !== 1) {
         $this->addItemAssociateUpdateCronEvent();
     }
     if (version_compare($version, '1.4.22') !== 1) {
         try {
             Shopware()->Db()->exec("\n\t\t\t\t\tCREATE TABLE `plenty_mapping_item_bundle` (\n\t\t\t\t\t  `shopwareID` int(11) unsigned NOT NULL,\n\t\t\t\t\t  `plentyID` int(11) unsigned NOT NULL,\n\t\t\t\t\t  PRIMARY KEY (`shopwareID`,`plentyID`),\n\t\t\t\t\t  UNIQUE KEY `plentyID` (`plentyID`)\n\t\t\t\t\t) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\t\t\t\t");
             $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'CREATE TABLE `plenty_mapping_item_bundle` done');
         } catch (Exception $E) {
             $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'CREATE TABLE `plenty_mapping_item_bundle` failed');
         }
         $this->addItemBundleCronEvents();
     }
     if (version_compare($version, '1.6') !== 1) {
         try {
             PlentymarketsExportController::getInstance()->erase('ItemCategory');
             $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'PlentymarketsExportController::getInstance()->erase(\'ItemCategory\') done');
         } catch (Exception $E) {
             $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'PlentymarketsExportController::getInstance()->erase(\'ItemCategory\') failed');
         }
         try {
             Shopware()->Db()->exec("\n\t\t\t\t\tALTER TABLE `plenty_mapping_category` CHANGE `shopwareID` `shopwareID` VARCHAR(255) NOT NULL DEFAULT '';\n\t\t\t\t");
             $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'ALTER TABLE `plenty_mapping_category` done');
         } catch (Exception $E) {
             $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'ALTER TABLE `plenty_mapping_category` failed');
         }
         PyConf()->erase('PlentymarketsVersionTimestamp');
     }
     if (version_compare($version, '1.7') !== 1) {
         $this->subscribeEvent('Shopware_Models_Order_Order::postPersist', 'onOrderModelPostPersist');
         $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'Shopware_Models_Order_Order::postPersist');
         try {
             Shopware()->Db()->exec("\n\t\t\t\t\tALTER TABLE `plenty_mapping_referrer` CHANGE `plentyID` `plentyID` FLOAT(11)  UNSIGNED  NOT NULL;\n\t\t\t\t");
             $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'ALTER TABLE `plenty_mapping_referrer` done');
         } catch (Exception $E) {
             $Logger->message(PlentymarketsLogger::PREFIX_UPDATE, 'ALTER TABLE `plenty_mapping_referrer` failed');
         }
     }
     //
     PlentymarketsConfig::getInstance()->setConnectorVersion($this->getVersion());
     return true;
 }
 /**
  * Returns the method of payment id
  *
  * @throws PlentymarketsExportEntityException if there is no mapping
  */
 protected function getMethodOfPaymentId()
 {
     // Sub-objects
     $Payment = $this->Order->getPayment();
     // Payment
     if ($Payment) {
         try {
             return PlentymarketsMappingController::getMethodOfPaymentByShopwareID($Payment->getId());
         } catch (PlentymarketsMappingExceptionNotExistant $E) {
             $shopgateIds = explode('|', PyConf()->get('OrderShopgateMOPIDs', ''));
             if (in_array($Payment->getId(), $shopgateIds)) {
                 return MOP_SHOPGATE;
             }
         }
     }
     // Save the error
     $this->setError(self::CODE_ERROR_MOP);
     // Exit
     throw new PlentymarketsExportEntityException('The order with the number »' . $this->Order->getNumber() . '« could not be exported (no mapping for method of payment)', 4030);
 }
 /**
  * Runs the import of an expicit entity
  */
 protected function runEntity($entity)
 {
     $timestamp = time();
     PyConf()->set(sprintf('ImportItem%sLastRunTimestamp', $entity), time());
     PyConf()->set(sprintf('ImportItem%sNextRunTimestamp', $entity), time() + $this->cronJobInterval);
     if (PyStatus()->maySynchronize()) {
         PyLog()->message('Sync:Item:' . $entity, 'Starting');
         try {
             $controller = sprintf('PlentymarketsImportControllerItem%s', $entity);
             $Controller = new $controller();
             $Controller->run((int) PyConf()->get(sprintf('ImportItem%sLastUpdateTimestamp', $entity)));
             PyConf()->set(sprintf('ImportItem%sStatus', $entity), 1);
             PyConf()->set(sprintf('ImportItem%sLastUpdateTimestamp', $entity), $timestamp);
             PyConf()->erase(sprintf('ImportItem%sError', $entity));
         } catch (PlentymarketsImportException $E) {
             PyConf()->set(sprintf('ImportItem%sStatus', $entity), 2);
             PyConf()->set(sprintf('ImportItem%sError', $entity), $E->getMessage());
         }
         PyLog()->message('Sync:Item:' . $entity, 'Finished');
     } else {
         PyConf()->set(sprintf('ImportItem%sStatus', $entity), 0);
     }
     PyConf()->setImportItemAssociateLastEnity($entity);
 }
    /**
     * Returns a page of the log
     *
     * @param integer $start
     * @param integer $limit
     * @param int|number $type
     * @param string $filter
     * @return array
     */
    public function get($start, $limit, $type = 0, $filter = '')
    {
        $where = 'WHERE 1';
        if ($type > 0) {
            $where .= ' AND type = ' . (int) $type;
        }
        if (strlen($filter) > 4) {
            $where .= ' AND identifier LIKE "' . $filter . '"';
        }
        if (PyConf()->getApiHideCallsInLog(false)) {
            $where .= ' AND identifier != "Soap:Call"';
        }
        $limit = ' LIMIT ' . $start . ', ' . $limit;
        $Result = Shopware()->Db()->query('
			SELECT
					SQL_CALC_FOUND_ROWS *
				FROM plenty_log
					' . $where . '
				ORDER BY id DESC
					' . $limit . '
		');
        return array('data' => $Result->fetchAll(), 'total' => Shopware()->Db()->query('
				SELECT FOUND_ROWS()
			')->fetchColumn(0));
    }