/**
  * I am the singleton method
  *
  * @return PlentymarketsStatus
  */
 public static function getInstance()
 {
     if (!self::$Instance instanceof self) {
         self::$Instance = new self();
     }
     return self::$Instance;
 }
    /**
     * Saves the settings
     */
    public function saveSettingsAction()
    {
        $Config = PlentymarketsConfig::getInstance();
        // Previous Hash
        $apiUserHash = $Config->getApiUserHash('');
        // API
        // Sanitize the Wsdl
        $wsdlParts = parse_url($this->Request()->ApiWsdl);
        $wsdl = sprintf('%s://%s', $wsdlParts['scheme'], $wsdlParts['host']);
        $Config->setApiWsdl($wsdl);
        $Config->setApiUsername($this->Request()->ApiUsername);
        $Config->setApiPassword($this->Request()->ApiPassword);
        $Config->setApiIgnoreGetServerTime((int) $this->Request()->ApiIgnoreGetServerTime);
        $Config->setApiUseGzipCompression((int) $this->Request()->ApiUseGzipCompression);
        $Config->setApiLogHttpHeaders((int) $this->Request()->ApiLogHttpHeaders);
        $Config->setApiHideCallsInLog((int) $this->Request()->ApiHideCallsInLog);
        $hash = md5($wsdl . $this->Request()->ApiUsername . $this->Request()->ApiPassword);
        if ($apiUserHash != $hash) {
            $Config->setApiUserHash($hash);
            $Config->setApiUserID(-1);
            $Config->setApiLastAuthTimestamp('');
            $Config->setApiToken('');
            // Check the connection
            PlentymarketsStatus::getInstance()->isConnected();
        }
        // Item
        $Config->setItemWarehouseID($this->Request()->ItemWarehouseID);
        $Config->setItemConfiguratorSetType($this->Request()->ItemConfiguratorSetType);
        $Config->setItemCleanupActionID($this->Request()->ItemCleanupActionID);
        $Config->setItemCategoryRootID($this->Request()->ItemCategoryRootID);
        $Config->setItemImageSyncActionID($this->Request()->ItemImageSyncActionID == true ? IMPORT_ITEM_IMAGE_SYNC : IMPORT_ITEM_IMAGE_NO_SYNC);
        $Config->setItemImageAltAttributeID($this->Request()->ItemImageAltAttributeID);
        $Config->setItemCategorySyncActionID($this->Request()->ItemCategorySyncActionID == true ? IMPORT_ITEM_CATEGORY_SYNC : IMPORT_ITEM_CATEGORY_NO_SYNC);
        $Config->setItemNumberImportActionID($this->Request()->ItemNumberImportActionID == true ? IMPORT_ITEM_NUMBER : IMPORT_ITEM_NUMBER_NO);
        $Config->setItemNumberSourceKey($this->Request()->ItemNumberSourceKey);
        $Config->setItemVariationNumberSourceKey($this->Request()->ItemVariationNumberSourceKey);
        $Config->setItemBundleHeadActionID($this->Request()->ItemBundleHeadActionID == true ? IMPORT_ITEM_BUNDLE_HEAD : IMPORT_ITEM_BUNDLE_HEAD_NO);
        $Config->setItemShortDescriptionImportActionID($this->Request()->ItemShortDescriptionImportActionID == true ? IMPORT_ITEM_SHORTDESC : IMPORT_ITEM_SHORTDESC_NO);
        $Config->setItemLongDescriptionImportActionID($this->Request()->ItemLongDescriptionImportActionID == true ? IMPORT_ITEM_LONGDESC : IMPORT_ITEM_LONGDESC_NO);
        $Config->setItemKeywordsImportActionID($this->Request()->ItemKeywordsImportActionID == true ? IMPORT_ITEM_KEYWORDS : IMPORT_ITEM_KEYWORDS_NO);
        $Config->setItemNameImportActionID($this->Request()->ItemNameImportActionID);
        $Config->setItemPriceImportActionID($this->Request()->ItemPriceImportActionID);
        $Config->setItemFreetextsImportActionID($this->Request()->ItemFreetextsImportActionID == true ? IMPORT_ITEM_FREETEXTS : IMPORT_ITEM_FREETEXTS_NO);
        $Config->setItemAssociateImportActionID($this->Request()->ItemAssociateImportActionID == PlentymarketsImportItemAssociateController::ACTION_DETACHED ? PlentymarketsImportItemAssociateController::ACTION_DETACHED : PlentymarketsImportItemAssociateController::ACTION_CHAINED);
        $Config->setDefaultCustomerGroupKey($this->Request()->DefaultCustomerGroupKey);
        $Config->setItemWarehousePercentage($this->Request()->ItemWarehousePercentage);
        $Config->setItemProducerID($this->Request()->ItemProducerID);
        $Config->setOrderMarking1($this->Request()->OrderMarking1);
        $Config->setOrderAdditionalCouponIdentifiers($this->Request()->OrderAdditionalCouponIdentifiers);
        $Config->setOrderReferrerID($this->Request()->OrderReferrerID);
        $Config->setOrderPaidStatusID(implode('|', $this->Request()->OrderPaidStatusID));
        $Config->setOrderShopgateMOPIDs(implode('|', $this->Request()->OrderShopgateMOPIDs));
        $Config->setOrderItemTextSyncActionID($this->Request()->OrderItemTextSyncActionID == true ? EXPORT_ORDER_ITEM_TEXT_SYNC : EXPORT_ORDER_ITEM_TEXT_SYNC_NO);
        $Config->setOutgoingItemsOrderStatus($this->Request()->OutgoingItemsOrderStatus);
        $Config->setCheckOutgoingItems($this->Request()->CheckOutgoingItems == true ? 1 : 0);
        $Config->setOutgoingItemsID($this->Request()->OutgoingItemsID);
        $Config->setOutgoingItemsShopwareOrderStatusID($this->Request()->OutgoingItemsShopwareOrderStatusID);
        $Config->setCheckIncomingPayment($this->Request()->CheckIncomingPayment == true ? 1 : 0);
        $Config->setIncomingPaymentShopwarePaymentFullStatusID($this->Request()->IncomingPaymentShopwarePaymentFullStatusID);
        $Config->setIncomingPaymentShopwarePaymentPartialStatusID($this->Request()->IncomingPaymentShopwarePaymentPartialStatusID);
        $Config->setInitialExportChunkSize(max($this->Request()->InitialExportChunkSize, 1));
        $Config->setImportItemChunkSize(max($this->Request()->ImportItemChunkSize, 1));
        $Config->setInitialExportChunksPerRun(max($this->Request()->InitialExportChunksPerRun, -1));
        $Config->setMayLogUsageData($this->Request()->MayLogUsageData == true ? 1 : 0);
        // Customer default values
        $Config->setCustomerDefaultFormOfAddressID($this->Request()->CustomerDefaultFormOfAddressID);
        $Config->setCustomerDefaultCity($this->Request()->CustomerDefaultCity);
        $Config->setCustomerDefaultHouseNumber($this->Request()->CustomerDefaultHouseNumber);
        $Config->setCustomerDefaultStreet($this->Request()->CustomerDefaultStreet);
        $Config->setCustomerDefaultZipcode($this->Request()->CustomerDefaultZipcode);
        //
        if ($Config->getOutgoingItemsIntervalID() != $this->Request()->OutgoingItemsIntervalID) {
            switch ($this->Request()->OutgoingItemsIntervalID) {
                case 1:
                    $nextrun = date('H') > 12 ? strtotime('tomorrow noon') : strtotime('noon');
                    $interval = 68400;
                    break;
                case 2:
                    $nextrun = date('H') > 18 ? strtotime('tomorrow 6pm') : strtotime('6pm');
                    $interval = 68400;
                    break;
                case 3:
                default:
                    $nextrun = strtotime(date('Y-m-d H:0', strtotime('+ 1 hour')));
                    $interval = 60 * 60;
            }
            $Config->setOutgoingItemsIntervalID($this->Request()->OutgoingItemsIntervalID);
            Shopware()->Db()->query('
				UPDATE s_crontab
					SET
						next = FROM_UNIXTIME(' . $nextrun . '),
						`interval` = ' . $interval . '
					WHERE action = "Shopware_CronJob_PlentymarketsOrderImportCron"
			');
        }
        // Check dx status
        PlentymarketsStatus::getInstance()->maySynchronize(false);
        // User settings of the data exchange
        $Config->setMayDatexUser((int) ($this->Request()->MayDatexUser == true));
        // Activate the actual settings if the user
        // wants to exchange data and if he is allowed to
        if ($this->Request()->MayDatexUser == true && $Config->getMayDatex(0)) {
            $Config->setMayDatexActual(1);
        } else {
            $Config->setMayDatexActual(0);
        }
        $config = $Config->getConfig();
        if (isset($config['OrderPaidStatusID'])) {
            $orderPaidIDs = explode('|', $config['OrderPaidStatusID']);
            $config['OrderPaidStatusID'] = array_map('intval', $orderPaidIDs);
        } else {
            $config['OrderPaidStatusID'] = array(12);
        }
        if (isset($config['OrderShopgateMOPIDs'])) {
            $orderShopgateMOPIDs = explode('|', $config['OrderShopgateMOPIDs']);
            $config['OrderShopgateMOPIDs'] = array_map('intval', $orderShopgateMOPIDs);
        } else {
            $config['OrderShopgateMOPIDs'] = array();
        }
        $this->View()->assign(array('success' => true, 'data' => $config));
    }
/**
 * Shortcut for PlentymarketsStatus::getInstance()
 *
 * @return PlentymarketsStatus
 */
function PyStatus()
{
    return PlentymarketsStatus::getInstance();
}
 /**
  * Prepares config data and checks different conditions like finished mapping.
  */
 protected function __construct()
 {
     //
     $this->Config = PlentymarketsConfig::getInstance();
     $this->StatusController = PlentymarketsExportStatusController::getInstance();
     // Check whether a process is running
     $this->isRunning = (bool) $this->Config->getIsExportRunning(false);
     // If the export is not complete
     if (!$this->isComplete()) {
         // the garbage collector will run
         PlentymarketsGarbageCollector::getInstance()->run(PlentymarketsGarbageCollector::ACTION_MAPPING);
     }
     // Check whether settings and mapping are done
     $this->mayRun = PlentymarketsStatus::getInstance()->mayExport();
 }
 /**
  * Runs the item bundle cleanup cronjob.
  *
  * @param Shopware_Components_Cron_CronJob $Job
  */
 public function runItemBundleCleanup(Shopware_Components_Cron_CronJob $Job)
 {
     if (!$this->Status->maySynchronize()) {
         return;
     }
     PlentymarketsLogger::getInstance()->message('Cleanup:Item:Bundle', 'Starting');
     $PlentymarketsGarbageCollector = PlentymarketsGarbageCollector::getInstance();
     $PlentymarketsGarbageCollector->run(PlentymarketsGarbageCollector::ACTION_PRUNE_ITEM_BUNDLES);
     PlentymarketsLogger::getInstance()->message('Cleanup:Item:Bundle', 'Finished');
 }