%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/sale/lib/tradingplatform/ebay/feed/data/processors/ |
| Current File : //home/bitrix/www/bitrix/modules/sale/lib/tradingplatform/ebay/feed/data/processors/sftpqueue.php |
<?php
namespace Bitrix\Sale\TradingPlatform\Ebay\Feed\Data\Processors;
use \Bitrix\Main\Type\DateTime;
use \Bitrix\Main\SystemException;
use \Bitrix\Sale\TradingPlatform\Sftp;
use \Bitrix\Main\ArgumentNullException;
use \Bitrix\Sale\TradingPlatform\Logger;
use \Bitrix\Sale\TradingPlatform\Ebay\Ebay;
use \Bitrix\Sale\TradingPlatform\Ebay\Feed\QueueTable;
use \Bitrix\Sale\TradingPlatform\Ebay\Feed\ResultsTable;
class SftpQueue extends DataProcessor
{
// todo: check if the record alredy exist
protected $feedType;
protected $coverTag = null;
protected $schemeFileName = null;
protected $fileNameSalt;
protected $remotePath;
protected $siteId;
protected $timer = null;
protected $path;
public function __construct(array $params)
{
if(!isset($params["FEED_TYPE"]) || strlen($params["FEED_TYPE"]) <= 0)
throw new ArgumentNullException("FEED_TYPE");
if($this->feedType == "ORDER_ACK")
$this->feedType = "order-ack";
else
$this->feedType = strtolower($params["FEED_TYPE"]);
if(!isset($params["SITE_ID"]) || strlen($params["SITE_ID"]) <= 0)
throw new ArgumentNullException("SITE_ID");
$this->siteId = $params["SITE_ID"];
if(isset($params["COVER_TAG"]) && strlen($params["COVER_TAG"]) > 0)
$this->coverTag = $params["COVER_TAG"];
if(isset($params["SCHEMA_FILE_NAME"]))
$this->schemeFileName = $params["SCHEMA_FILE_NAME"];
if(isset($params["TIMER"]))
$this->timer = $params["TIMER"];
$this->fileNameSalt = mktime();
$this->remotePath = "/store/".$this->feedType;
$this->path = \Bitrix\Sale\TradingPlatform\Ebay\Helper::getSftpPath()."/".$this->feedType;
}
protected function prepareFile($file)
{
$res = file_put_contents($file, '<?xml version="1.0" encoding="UTF-8"?>'."\n");
if(!$res)
throw new SystemException("Can't flush data feed \"".$this->feedType."\" to file ".$file);
if($this->coverTag !== null)
file_put_contents($file, "<".$this->coverTag.">\n", FILE_APPEND);
}
protected function flushData()
{
$fileXml = "";
$feedDataRes = QueueTable::getList(array(
"filter" => array(
"FEED_TYPE" => $this->feedType
)
));
$filePrepared = false;
while($feedData = $feedDataRes->fetch())
{
if(!$filePrepared)
{
$fileXml = $this->path."/xml/".$this->feedType."_".$this->fileNameSalt.".xml";
$this->prepareFile($fileXml);
$filePrepared = true;
}
Ebay::log(Logger::LOG_LEVEL_DEBUG, "EBAY_DATA_PROCESSOR_SFTPQUEUE_FLUSHING", $this->feedType, print_r($feedData["DATA"],true), $this->siteId);
if(strtolower(SITE_CHARSET) != 'utf-8')
$feedData["DATA"] = \Bitrix\Main\Text\Encoding::convertEncoding($feedData["DATA"], SITE_CHARSET, 'UTF-8');
$res = file_put_contents($fileXml, $feedData["DATA"], FILE_APPEND);
if($res !== false)
QueueTable::delete($feedData["ID"]);
else
throw new SystemException("Can't flush data feed \"".$this->feedType."\" to file ".$fileXml);
}
if($this->coverTag !== null && $filePrepared)
file_put_contents($fileXml, "</".$this->coverTag.">\n", FILE_APPEND);
return $fileXml;
}
public function process($data)
{
return $this->addData($data);
}
public function addData($data)
{
$result = QueueTable::add(array(
"FEED_TYPE" => $this->feedType,
"DATA" => $data
));
return $result->isSuccess();
}
public function sendData()
{
$xmlFile = $this->flushData();
if(!$xmlFile)
return false;
$tmpFile = $this->packData($xmlFile);
$zipFile = new \Bitrix\Main\IO\File($tmpFile);
$zipFile->rename($this->path."/zip/".$this->feedType."_".$this->fileNameSalt.".zip");
$this->sendDataSftp();
$checkResultsInterval = 5; //min.
\Bitrix\Sale\TradingPlatform\Ebay\Agent::add('RESULTS', $this->siteId, $checkResultsInterval, true);
return true;
}
protected function packData($xmlFile)
{
$tmpDir = $this->path."/tmp";
$archiveName = $tmpDir."/".$this->feedType."_".$this->fileNameSalt.".zip";
$oArchiver = \CBXArchive::GetArchive($archiveName, "ZIP");
$oArchiver->SetOptions(array(
"REMOVE_PATH" => $this->path."/xml",
"ADD_PATH" => $this->feedType
));
if($oArchiver->Pack($xmlFile))
\Bitrix\Main\IO\File::deleteFile($xmlFile);
return $archiveName;
}
protected function sendDataSftp()
{
$directory = new \Bitrix\Main\IO\Directory($this->path."/zip");
if(!$directory->isExists())
throw new SystemException("Directory".$this->path."/zip does not exist! ".__METHOD__);
$filesToSend = $directory->getChildren();
if(empty($filesToSend))
return false;
$sftp = \Bitrix\Sale\TradingPlatform\Ebay\Helper::getSftp($this->siteId);
if(!$sftp)
return false;
$sftp->connect();
for($i = 0; $i < count($filesToSend); $i++)
{
$directoryEntry = $filesToSend[$i];
$localPath = $directoryEntry->getPath();
if((!($directoryEntry instanceof \Bitrix\Main\IO\File)) || GetFileExtension($localPath) != "zip")
continue;
$remote = $this->remotePath."/".$directoryEntry->getName();
while(!$this->checkOuterConditions($sftp))
{
if($this->timer !== null && !$this->timer->check(15))
return false;
sleep(10);
}
if($sftp->uploadFile($localPath, $remote))
{
$directoryEntry->delete();
ResultsTable::add(array(
"FILENAME" => $directoryEntry->getName(),
"FEED_TYPE" => $this->feedType,
"UPLOAD_TIME" => DateTime::createFromTimestamp(time())
));
Ebay::log(Logger::LOG_LEVEL_INFO, "EBAY_DATA_PROCESSOR_SFTPQUEUE_SEND", $remote, "File sent successfully.", $this->siteId);
}
}
return true;
}
protected function checkOuterConditions($sftp)
{
$files = $sftp->getFilesList($this->remotePath);
if(!empty($files))
return false;
if($this->feedType == "inventory" || $this->feedType == "image")
{
$filesProd = $sftp->getFilesList("/store/product");
$filesProdInProc = $sftp->getFilesList("/store/product/inprocess");
if(!empty($filesProd) || !empty($filesProdInProc))
return false;
}
return true;
}
}