• Модуль: catalogmobile
  • Путь к файлу: ~/bitrix/modules/catalogmobile/lib/InventoryControl/Command/ConductDocumentCommand.php
  • Класс: BitrixCatalogMobileInventoryControlCommandConductDocumentCommand
  • Вызов: ConductDocumentCommand::updateCatalogBarcodes
private function updateCatalogBarcodes(): Result
{
	$result = new Result();

	$document = StoreDocumentTable::getById($this->documentId)->fetch();
	if (!$document)
	{
		return $result;
	}

	$allowedTypes = [
		StoreDocumentTable::TYPE_ARRIVAL,
		StoreDocumentTable::TYPE_STORE_ADJUSTMENT,
	];

	if (!in_array($document['DOC_TYPE'], $allowedTypes, true))
	{
		return $result;
	}

	$documentBarcodes = [];
	$rows = StoreDocumentBarcodeTable::getList([
		'filter' => [
			'=DOCUMENT_ELEMENT.DOC_ID' => $this->documentId,
		],
		'select' => ['BARCODE', 'SKU_ID' => 'DOCUMENT_ELEMENT.ELEMENT_ID']
	]);
	while ($row = $rows->fetch())
	{
		$skuId = (int)($row['SKU_ID']);
		$barcode = $row['BARCODE'];
		if ($skuId > 0 && $barcode)
		{
			$documentBarcodes[$barcode] = $skuId;
		}
	}

	if (empty($documentBarcodes))
	{
		return $result;
	}

	$productBarcodes = [];
	$rows = StoreBarcodeTable::getList([
		'filter' => ['=BARCODE' => array_keys($documentBarcodes)],
		'select' => ['BARCODE', 'PRODUCT_ID']
	]);

	while ($row = $rows->fetch())
	{
		$productBarcodes[$row['BARCODE']] = (int)$row['PRODUCT_ID'];
	}

	foreach ($documentBarcodes as $barcode => $skuId)
	{
		if (isset($productBarcodes[$barcode]))
		{
			$existingSkuId = $productBarcodes[$barcode];
			if ($skuId !== $existingSkuId)
			{
				$message = Loc::getMessage('MOBILE_IC_COMMAND_CONDUCT_DOCUMENT_ERROR_BARCODE_ALREADY_EXISTS', [
					'#BARCODE#' => htmlspecialcharsbx($barcode)
				]);
				$result->addError(new Error($message));
			}
			continue;
		}

		$r = StoreBarcodeTable::add([
			'PRODUCT_ID' => $skuId,
			'BARCODE' => $barcode,
			'CREATED_BY' => $this->userId,
			'MODIFIED_BY' => $this->userId,
		]);

		if (!$r->isSuccess())
		{
			$result->addErrors($r->getErrors());
		}
	}

	return $result;
}