Your IP : 3.21.206.153
<?php
namespace Bitrix\Sale\Exchange;
use Bitrix\Main\ArgumentException;
use Bitrix\Main\Error;
use Bitrix\Main\Event;
use Bitrix\Main\Localization\Loc;
use Bitrix\Sale\Exchange\Entity\EntityImport;
use Bitrix\Sale\Exchange\Entity\ShipmentImport;
use Bitrix\Sale\Exchange\Entity\UserProfileImport;
use Bitrix\Sale\Exchange\OneC\DocumentBase;
use Bitrix\Sale\Internals\Fields;
use Bitrix\Sale\Result;
abstract class ImportOneCBase extends ImportPattern
{
use LoggerTrait;
use BaseTrait;
const EVENT_ON_EXCHANGE_CONFIGURE_IMPORTER = 'OnExchangeConfigureImporter';
const DELIVERY_SERVICE_XMLID = 'ORDER_DELIVERY';
/** @var Fields */
protected $fields;
/**
* @param array $values
* @internal param array $fields
*/
public function setFields(array $values)
{
foreach ($values as $key=>$value)
{
$this->setField($key, $value);
}
}
/**
* @param $name
* @param $value
*/
public function setField($name, $value)
{
$this->fields->set($name, $value);
}
/**
* @param $name
* @return null|string
*/
public function getField($name)
{
return $this->fields->get($name);
}
/**
* @param array $items
* @return Result
*/
protected function checkFields(array $items)
{
$result = new Result();
foreach($items as $item)
{
$params = $item->getFieldValues();
$fields = $params['TRAITS'];
if(strlen($fields[$item::getFieldExternalId()])<= 0)
$result->addErrors(array(new Error(" ".EntityType::getDescription($item->getOwnerTypeId()).": ".GetMessage("SALE_EXCHANGE_EXTERNAL_ID_NOT_FOUND"), 'SALE_EXCHANGE_EXTERNAL_ID_NOT_FOUND')));
}
return $result;
}
/**
* @return Result
*/
static public function checkSettings()
{
return new Result();
}
static public function configuration()
{
$event = new Event('sale', static::EVENT_ON_EXCHANGE_CONFIGURE_IMPORTER);
$event->send();
}
/**
* @param ImportBase $item
* @return Result
* @throws ArgumentException
* @internal
*/
protected function modifyEntity($item)
{
$result = new Result();
if(!($item instanceof EntityImport) && !($item instanceof UserProfileImport))
throw new ArgumentException("Item must be instanceof EntityImport or UserProfileImport");
$params = $item->getFieldValues();
$fieldsCriterion = $fields = &$params['TRAITS'];
$converter = OneC\Converter::getInstance($item->getOwnerTypeId());
$converter->loadSettings($item->getSettings());
/** @var OneC\Converter $converter*/
$converter->sanitizeFields($item->getEntity(), $fields);
$item->refreshData($fields);
$criterion = $item->getCurrentCriterion($item->getEntity());
$collision = $item->getCurrentCollision($item->getOwnerTypeId());
if($item instanceof ShipmentImport)
$fieldsCriterion['ITEMS'] = $params['ITEMS'];
if($criterion->equals($fieldsCriterion))
{
$collision->resolve($item);
}
if(!$criterion->equals($fieldsCriterion) ||
($criterion->equals($fieldsCriterion) && !$item->hasCollisionErrors()))
{
$result = $item->import($params);
}
return $result;
}
/**
* @param array $rawFields
* @return Result
* @throws \Bitrix\Main\ArgumentOutOfRangeException
* @throws \Bitrix\Main\NotSupportedException
*/
public function parse(array $rawFields)
{
$result = new Result();
$list = array();
foreach($rawFields as $raw)
{
$documentTypeId = $this->resolveDocumentTypeId($raw);
$document = $this->documentFactoryCreate($documentTypeId);
$fields = $document::prepareFieldsData($raw);
$document->setFields($fields);
$list[] = $document;
}
$result->setData($list);
return $result;
}
/**
* @param DocumentBase $document
* @return ImportBase
*/
protected function convertDocument(DocumentBase $document)
{
$settings = ManagerImport::getSettingsByType($document->getOwnerEntityTypeId());
$convertor = $this->converterFactoryCreate($document->getOwnerEntityTypeId());
$convertor->loadSettings($settings);
$fields = $convertor->resolveParams($document);
$loader = Entity\EntityImportLoaderFactory::create($document->getOwnerEntityTypeId());
$loader->loadSettings($settings);
if(strlen($document->getId())>0)
$fieldsEntity = $loader->getByNumber($document->getId());
else
$fieldsEntity = $loader->getByExternalId($document->getExternalId());
if(!empty($fieldsEntity['ID']))
$fields['TRAITS']['ID'] = $fieldsEntity['ID'];
$entityImport = ManagerImport::create($document->getOwnerEntityTypeId());
$entityImport->setFields($fields);
return $entityImport;
}
/**
* @param array $fields
* @return int
*/
protected function resolveDocumentTypeId(array $fields)
{
return OneC\DocumentBase::resolveRawDocumentTypeId($fields);
}
/**
* @return array
*/
protected static function getMessage()
{
return Loc::loadLanguageFile($_SERVER["DOCUMENT_ROOT"].'/bitrix/components/bitrix/sale.export.1c/component.php');
}
/**
* @return string
*/
public function getDirectionType()
{
return ManagerImport::getDirectionType();
}
/**
* @param ImportBase[] $items
* @return Result
*/
protected function logger(array $items)
{
return $this->loggerEntities($items);
}
}