/**
  * 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;
 }
 /**
  * Announces an export
  */
 public function handleExportAction()
 {
     $params = $this->Request()->getParams();
     if (PlentymarketsExportWizard::getInstance()->isActive()) {
         return $this->View()->assign(array('success' => true, 'message' => 'Aktion kann nicht ausgeführt werden, da der automatische Export aktiv ist'));
     }
     try {
         if ($params['doAction'] == 'reset') {
             PlentymarketsExportController::getInstance()->reset($params['name']);
             PlentymarketsLogger::getInstance()->message('Export:Initial:' . ucfirst($params['name']), 'Resetted');
             $message = 'Export-Status zurückgesetzt';
         } else {
             if ($params['doAction'] == 'erase') {
                 PlentymarketsExportController::getInstance()->erase($params['name']);
                 PlentymarketsLogger::getInstance()->message('Export:Initial:' . ucfirst($params['name']), 'Completely erased');
                 $message = 'Export komplett zurückgesetzt';
             } else {
                 if ($params['doAction'] == 'start') {
                     PlentymarketsExportController::getInstance()->announce($params['name']);
                     PlentymarketsLogger::getInstance()->message('Export:Initial:' . ucfirst($params['name']), 'Announced');
                     $message = 'Export vorgemerkt';
                 }
             }
         }
         $success = true;
     } catch (PlentymarketsExportException $E) {
         $success = false;
         $message = $E->getMessage();
         $method = sprintf('set%sExportStatus', $params['name']);
         PlentymarketsConfig::getInstance()->{$method}('error');
         $method = sprintf('set%sExportLastErrorMessage', $params['name']);
         PlentymarketsConfig::getInstance()->{$method}($message);
         PlentymarketsLogger::getInstance()->error('Export:Initial:' . ucfirst($params['name']), $message, $E->getCode());
     }
     $settings = $this->getExportStatusList();
     $this->View()->assign(array('success' => $success, 'message' => $message, 'data' => $settings[$params['name']]));
 }
 /**
  * Checks whether the initial exports are completely done
  *
  * @return boolean
  */
 protected function isExportFinished()
 {
     $isExportFinished = PlentymarketsExportController::getInstance()->isComplete();
     PlentymarketsConfig::getInstance()->set('IsExportFinished', (int) $isExportFinished);
     return $isExportFinished;
 }
 /**
  * Does the actual magic :)
  */
 public function conjure()
 {
     //
     if (!$this->isActive()) {
         return;
     }
     // If there is nothing to do for the wizzard
     if ($this->StatusController->isBroke()) {
         // Deactivate
         $this->deactivate();
         // Log
         PlentymarketsLogger::getInstance()->message('Export:Initial:Wizard', 'Automatically disabled because an entity is broke');
         return;
     }
     // If there is nothing to do for the wizzard
     if ($this->StatusController->isFinished()) {
         // Deactivate
         $this->deactivate();
         // Log
         PlentymarketsLogger::getInstance()->message('Export:Initial:Wizard', 'Automatically disabled because there is nothing more to do');
         return;
     }
     // Entity is already waiting (item chunks)
     if ($this->StatusController->isWaiting()) {
         // Log
         PlentymarketsLogger::getInstance()->message('Export:Initial:Wizard', 'An entity is already waiting');
         return;
     }
     try {
         // Get the next entity
         $EntityStatus = $this->StatusController->getNext();
         // and announce it
         PlentymarketsExportController::getInstance()->announce($EntityStatus->getName());
         // Log
         PlentymarketsLogger::getInstance()->message('Export:Initial:Wizard', 'Automatically announced ' . $EntityStatus->getName());
     } catch (PlentymarketsExportException $E) {
         PlentymarketsLogger::getInstance()->error('Export:Initial:Wizard', $E->getMessage(), $E->getCode());
         $this->deactivate();
     } catch (PlentymarketsExportStatusException $E) {
         PlentymarketsLogger::getInstance()->error('Export:Initial:Wizard', $E->getMessage(), $E->getCode());
         $this->deactivate();
     }
 }
 /**
  * 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;
 }
 /**
  * If an instance of PlentymarketsExportController exists, it returns this instance.
  * Else it creates a new instance of PlentymarketsExportController.
  *
  * @return PlentymarketsExportController
  */
 public static function getInstance()
 {
     if (!self::$Instance instanceof self) {
         self::$Instance = new self();
     }
     return self::$Instance;
 }
 /**
  * Runs the export cronjob.
  *
  * @param Shopware_Components_Cron_CronJob $Job
  */
 public function runExport(Shopware_Components_Cron_CronJob $Job)
 {
     try {
         PlentymarketsExportController::getInstance()->export();
     } catch (PlentymarketsExportException $E) {
         PlentymarketsLogger::getInstance()->error('Cron:Export', $E->getMessage(), $E->getCode());
     } catch (Exception $E) {
         PlentymarketsLogger::getInstance()->error('Cron:Export', $E->getMessage(), 1000);
         PlentymarketsLogger::getInstance()->error('Cron:Export', get_class($E), 1000);
         PlentymarketsLogger::getInstance()->error('Cron:Export', $E->getTraceAsString(), 1000);
     }
     $PlentymarketsExportWizard = PlentymarketsExportWizard::getInstance();
     $PlentymarketsExportWizard->conjure();
 }