%PDF- %PDF-
Direktori : /proc/self/root/home/bitrix/www/bitrix/modules/sale/lib/tradingplatform/ebay/ |
Current File : //proc/self/root/home/bitrix/www/bitrix/modules/sale/lib/tradingplatform/ebay/helper.php |
<?php namespace Bitrix\Sale\TradingPlatform\Ebay; use Bitrix\Main\Error; use Bitrix\Main\IO\Directory; use Bitrix\Main\Result; use Bitrix\Main\SystemException; use Bitrix\Main\Localization\Loc; use Bitrix\Sale\TradingPlatform\Logger; use Bitrix\Sale\TradingPlatform\Sftp; use Bitrix\Main\ArgumentNullException; use Bitrix\Sale\TradingPlatform\Ebay\Feed\Manager; Loc::loadMessages(__FILE__); /** * Class Helper * Useful methods to work with ebay. * @package Bitrix\Sale\TradingPlatform\Ebay */ class Helper { /** * Checks all necessary extensions etc. * @return Result * @throws SystemException */ public static function checkEnveronment() { $result = new Result(); if(!extension_loaded('ssh2')) $result->addError( new Error(Loc::getMessage("SALE_EBAY_HLP_CHECK_ERROR_SSH2"))); if(!extension_loaded('SimpleXML')) $result->addError( new Error(Loc::getMessage("SALE_EBAY_HLP_CHECK_ERROR_SIMPLEXML"))); return $result; } /** * @return string Path to SFTP exchange folders. */ public static function getSftpPath() { return $_SERVER["DOCUMENT_ROOT"]."/bitrix/tradingplatforms/ebay/sftp"; } /** * Creates filestructure for information exchange via sftp. * @return bool */ public static function createFeedFileStructure() { $sftpDir = self::getSftpPath(); $directory = new Directory($sftpDir); if(!$directory->isExists()) $directory->create(); foreach(array("product", "inventory", "image", "order-ack", "shipment") as $feedType) { $feedDir = new Directory($sftpDir."/".$feedType); if(!$feedDir->isExists()) $feedDir->create(); foreach(array("xml", "tmp", "zip") as $stage) { $stageDir = new Directory($sftpDir."/".$feedType."/".$stage); if(!$stageDir->isExists()) $stageDir->create(); } } return true; } /** * Creates events for sending e-mail. * @return bool */ public static function installEvents() { $dbEvent = \CEventMessage::GetList($b="ID", $order="ASC", Array("EVENT_NAME" => "SALE_EBAY_ERROR")); if(!($dbEvent->Fetch())) { $langs = \CLanguage::GetList(($b=""), ($o="")); while($lang = $langs->Fetch()) { $lid = $lang["LID"]; $obEventType = new \CEventType; $obEventType->Add(array( "EVENT_NAME" => "SALE_EBAY_ERROR", "NAME" => Loc::getMessage("SALE_EBAY_HLP_EVNT_TYPE_ERROR"), "LID" => $lid, "DESCRIPTION" =>" #ERROR_TYPE# - ".Loc::getMessage("SALE_EBAY_HLP_EVNT_TYPE_ERROR_TYPE")." #ERROR_DETAILS# - ".Loc::getMessage("SALE_EBAY_HLP_EVNT_TYPE_ERROR_DETAIL")." #EMAIL_FROM# - ".Loc::getMessage("SALE_EBAY_HLP_EVNT_TYPE_FROM")." #EMAIL_TO# - ".Loc::getMessage("SALE_EBAY_HLP_EVNT_TYPE_TO")." #BCC# - ".Loc::getMessage("SALE_EBAY_HLP_EVNT_TYPE_BCC") )); $arSites = array(); $sites = \CSite::GetList(($b=""), ($o=""), Array("LANGUAGE_ID"=>$lid)); while ($site = $sites->Fetch()) $arSites[] = $site["LID"]; if(count($arSites) > 0) { $arr = array(); $arr["ACTIVE"] = "Y"; $arr["EVENT_NAME"] = "SALE_EBAY_ERROR"; $arr["LID"] = $arSites; $arr["EMAIL_FROM"] = "#DEFAULT_EMAIL_FROM#"; $arr["EMAIL_TO"] = "#EMAIL_TO#"; $arr["BCC"] = "#BCC#"; $arr["SUBJECT"] = "#SITE_NAME# ".Loc::getMessage("SALE_EBAY_EVNT_MSG_SBUJ']")."."; $arr["BODY_TYPE"] = "text"; $arr["MESSAGE"] = Loc::getMessage("SALE_EBAY_EVNT_MSG_INFO_SITE")." #SITE_NAME#.\n\n". Loc::getMessage("SALE_EBAY_EVNT_MSG").":\n\n". "#ERROR_TYPE#\n\n". "#ERROR_DETAILS#"; $obTemplate = new \CEventMessage; $obTemplate->Add($arr); } } } return true; } /** * @return array Ebay order statuses. */ public static function getEbayOrderStatuses() { return array( "Active", "Completed", "Canceled", "Inactive" ); } /** * Sends tracknumber to ebay. * @param string $orderId Order id. * @param string $val "Y"|"N" * @return bool */ public static function onSaleDeductOrder($orderId, $val) { if($val != "Y") return false; $order = \CSaleOrder::GetByID($orderId); if(strlen($order["XML_ID"]) <= 0 || substr($order["XML_ID"], 0, 4) != Ebay::TRADING_PLATFORM_CODE) return false; $ebayOrderId = substr($order["XML_ID"], strlen(Ebay::TRADING_PLATFORM_CODE)+1); $shipmentInfo = array(); $trackingInfo = array(); if(strlen($order["TRACKING_NUMBER"]) > 0) { $ebayDelivery = "Other"; $ebay = \Bitrix\Sale\TradingPlatform\Ebay\Ebay::getInstance(); $settings = $ebay->getSettings(); if(isset($settings[$order["LID"]]["DELIVERY"]) && is_array($settings[$order["LID"]]["DELIVERY"])) { foreach($settings[$order["LID"]]["DELIVERY"] as $eDelivery => $bDelivery) { if($bDelivery == $order["DELIVERY_ID"]) { $ebayDelivery = $eDelivery; break; } } } $trackingInfo = array( "SERVICE" => $ebayDelivery, "NUMBER" => $order["TRACKING_NUMBER"] ); } $orderLineItemIds = array(); $dbBasket = \CSaleBasket::GetList( array(), array("ORDER_ID" => $orderId), false, false, array("XML_ID") ); while ($arBasket = $dbBasket->GetNext()) $orderLineItemIds[] = $arBasket["XML_ID"]; foreach($orderLineItemIds as $orderLineItemId) { $tmpShipmentInfo = array( "ORDER_ID" => $ebayOrderId, "ORDER_LINE_ITEM_ID" => $orderLineItemId, ); if(!empty($trackingInfo)) $tmpShipmentInfo["TRACKING"] = $trackingInfo; $shipmentInfo[] = $tmpShipmentInfo; } $ebayFeed = Manager::createFeed("SHIPMENT", $order["LID"]); $ebayFeed->setSourceData($shipmentInfo); $ebayFeed->exchangeData(""); return true; } /** * @return array Audit types. * Before using it needs to execute: * RegisterModuleDependences('main', 'OnEventLogGetAuditTypes', 'sale', 'Bitrix\Sale\TradingPlatform\Ebay\Ebay', 'OnEventLogGetAuditTypes'); */ public static function OnEventLogGetAuditTypes() { $prefix = 'eBay: '; $result = array( "EBAY_FEED_ERROR" => Loc::getMessage("SALE_EBAY_AT_FEED_ERROR"), "EBAY_AGENT_FEED_STARTED" => Loc::getMessage("SALE_EBAY_AT_AGENT_FEED_STARTED"), "EBAY_FEED_CREATED" => Loc::getMessage("SALE_EBAY_AT_FEED_CREATED"), "EBAY_DATA_PROCESSOR_ORDER_ERROR" => Loc::getMessage("SALE_EBAY_AT_DATA_PROCESSOR_ORDER_ERROR"), "EBAY_DATA_PROCESSOR_ORDER_PROCESSED" => Loc::getMessage("SALE_EBAY_AT_DATA_PROCESSOR_ORDER_PROCESSED"), "EBAY_DATA_PROCESSOR_SFTPQUEUE_SEND" => Loc::getMessage("SALE_EBAY_AT_DATA_PROCESSOR_SFTPQUEUE_SEND"), "EBAY_DATA_SOURCE_ORDERFILE_RECEIVED" => Loc::getMessage("SALE_EBAY_AT_DATA_SOURCE_ORDERFILE_RECEIVED"), "EBAY_DATA_PROCESSOR_ORDER_CREATED" => Loc::getMessage("SALE_EBAY_AT_DATA_PROCESSOR_ORDER_CREATED"), "EBAY_DATA_PROCESSOR_ORDER_PROCESSING" => Loc::getMessage("SALE_EBAY_AT_DATA_PROCESSOR_ORDER_PROCESSING"), "EBAY_DATA_SOURCE_RESULTS_RECEIVED" => Loc::getMessage("SALE_EBAY_AT_DATA_SOURCE_RESULTS_RECEIVED"), "EBAY_DATA_SOURCE_RESULTS_ERROR" => Loc::getMessage("SALE_EBAY_AT_DATA_SOURCE_RESULTS_ERROR"), "EBAY_AGENT_ADDING_RESULT" => Loc::getMessage("SALE_EBAY_AT_AGENT_ADDING_RESULT"), "EBAY_FEED_RESULTS_ERROR" => Loc::getMessage("SALE_EBAY_AT_FEED_RESULTS_ERROR"), "EBAY_POLICY_REQUEST_ERROR" => Loc::getMessage("SALE_EBAY_AT_POLICY_REQUEST_ERROR"), "EBAY_POLICY_REQUEST_HTTP_ERROR" => Loc::getMessage("SALE_EBAY_AT_POLICY_REQUEST_HTTP_ERROR"), "EBAY_DATA_PROCESSOR_ORDER_SKIPPED" => Loc::getMessage("SALE_EBAY_AT_DATA_PROCESSOR_ORDER_SKIPPED"), "EBAY_DATA_PROCESSOR_ORDER_ALREADY_EXIST" => Loc::getMessage("SALE_EBAY_AT_DATA_PROCESSOR_ORDER_ALREADY_EXIST"), "EBAY_DATA_PROCESSOR_ORDER_PROCESSING_TRANSACTION_ITEM_NOT_FOUND" => Loc::getMessage("SALE_EBAY_AT_DATA_PROCESSOR_ORDER_PROCESSING_TR_NOT_FOUND"), "EBAY_DATA_PROCESSOR_ORDER_PROCESSING_TRANSACTION_ITEM_SKU_NOT_FOUND" => Loc::getMessage("SALE_EBAY_AT_DATA_PROCESSOR_ORDER_PROCESSING_TRANSACTION_ITEM_SKU_NOT_FOUND"), "EBAY_DATA_PROCESSOR_ORDER_TRANSACTION_ITEM_CREATE_ERROR" => Loc::getMessage("SALE_EBAY_AT_DATA_PROCESSOR_ORDER_TRANSACTION_ITEM_CREATE_ERROR"), "EBAY_DATA_PROCESSOR_ORDER_CREATE_ERROR_SET_BASKET" => Loc::getMessage("SALE_EBAY_AT_DATA_PROCESSOR_ORDER_CREATE_ERROR_SET_BASKET"), "EBAY_DATA_PROCESSOR_ORDER_CANCELING_ERROR" => Loc::getMessage("SALE_EBAY_AT_DATA_PROCESSOR_ORDER_CANCELING_ERROR"), "EBAY_DATA_PROCESSOR_ORDER_DEDUCTIOING_ERROR" => Loc::getMessage("SALE_EBAY_AT_DATA_PROCESSOR_ORDER_DEDUCTIOING_ERROR"), "EBAY_DATA_PROCESSOR_ORDER_CHANGE_STATUS_ERROR" => Loc::getMessage("SALE_EBAY_AT_DATA_PROCESSOR_ORDER_CHANGE_STATUS_ERROR"), "EBAY_DATA_PROCESSOR_ORDER_SAVE_ERROR" => Loc::getMessage("SALE_EBAY_AT_DATA_PROCESSOR_ORDER_SAVE_ERROR"), "EBAY_DATA_PROCESSOR_ORDER_CORR_SAVE_ERROR" => Loc::getMessage("SALE_EBAY_AT_DATA_PROCESSOR_ORDER_CORR_SAVE_ERROR"), "EBAY_DATA_PROCESSOR_SFTPQUEUE_FLUSHING" => Loc::getMessage("SALE_EBAY_AT_DATA_PROCESSOR_SFTPQUEUE_FLUSHING"), "EBAY_SFTP_TOKEN_EXP" => Loc::getMessage("SALE_EBAY_AT_SFTP_TOKEN_EXP"), ); array_walk($result, function(&$value, $key, $prefix) { $value = $prefix.$value; }, $prefix ); return $result; } /** * @param string $siteId * @return \Bitrix\Sale\TradingPlatform\Sftp * @throws \Bitrix\Main\ArgumentNullException */ public static function getSftp($siteId) { if(strlen($siteId) <= 0) throw new ArgumentNullException("siteId"); static $sftp = array(); if(!isset($sftp[$siteId])) { $ebay = \Bitrix\Sale\TradingPlatform\Ebay\Ebay::getInstance(); $settings = $ebay->getSettings(); $host = isset($settings[$siteId]["SFTP_HOST"]) ? $settings[$siteId]["SFTP_HOST"] : "mip.ebay.com"; $port = isset($settings[$siteId]["SFTP_PORT"]) ? $settings[$siteId]["SFTP_PORT"] : 22; $fingerprint = strlen($settings[$siteId]["SFTP_HOST_FINGERPRINT"]) > 0 ? $settings[$siteId]["SFTP_HOST_FINGERPRINT"] : "DD1FEE728C2E1FF2AACC2724929C3CF1"; if(!empty($settings[$siteId]["SFTP_TOKEN_EXP"]) && date('c') > date($settings[$siteId]["SFTP_TOKEN_EXP"])) { Ebay::log(Logger::LOG_LEVEL_ERROR, "EBAY_SFTP_TOKEN_EXP", 'SFTP token', Loc::getMessage('SALE_EBAY_AT_SFTP_TOKEN_EXP_MESSAGE'), $siteId); throw new SystemException(Loc::getMessage('SALE_EBAY_AT_SFTP_TOKEN_EXP_MESSAGE')); } else { $sftp[$siteId] = new Sftp( $settings[$siteId]["SFTP_LOGIN"], $settings[$siteId]["SFTP_PASS"], $host, $port, $fingerprint ); } } return $sftp[$siteId]; } /** * Returns category variations. * If variations no found in table get them through API and saves to table. * @param string $ebayCategoryId Ebay category id. * @param string $siteId Sitte id. * @param bool $localInfoOnly Get it from Ebay site if not found in table. * @return array */ public static function getEbayCategoryVariations($ebayCategoryId, $siteId, $localInfoOnly = false) { $result = array(); $categoriesVarResult = CategoryVariationTable::getList( array( 'select' => array('ID', 'NAME', 'REQUIRED'), 'order' => array('NAME' =>'ASC'), 'filter' => array("=CATEGORY_ID" => $ebayCategoryId), 'group' => array('NAME') )); while($var = $categoriesVarResult->fetch()) $result[$var['ID']] = $var; if(empty($result) && !$localInfoOnly) { $categories = new \Bitrix\Sale\TradingPlatform\Ebay\Api\Categories($siteId); $rfrCount = $categories->refreshVariationsTableData(array($ebayCategoryId)); if(intval($rfrCount) > 0) $result = self::getEbayCategoryVariations($ebayCategoryId, $siteId, true); } return $result; } }