• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/cashbox/checkmanager.php
  • Класс: BitrixSaleCashboxCheckManager
  • Вызов: CheckManager::addByType
static function addByType(array $entities, $type, array $relatedEntities = array())
{
	$result = new Result();

	if ($type === '')
	{
		$result->addError(new Error(Loc::getMessage('SALE_CASHBOX_ERROR_EMPTY_CHECK_TYPE')));
		return $result;
	}

	$check = self::createByType($type);
	if (!$check instanceof Check)
	{
		$result->addError(new Error(Loc::getMessage('SALE_CASHBOX_ERROR_CHECK')));
		return $result;
	}

	$check->setEntities($entities);
	$check->setRelatedEntities($relatedEntities);

	$cashboxList = Manager::getAvailableCashboxList($check);

	$entity = reset($entities);
	$order = self::getOrder($entity);

	if (!$cashboxList)
	{
		$dbRes = CashboxTable::getList(array('filter' => array('ACTIVE' => 'Y')));
		if ($dbRes->fetch())
			$result->addError(new Error(Loc::getMessage('SALE_CASHBOX_NOT_FOUND')));

		return $result;
	}

	$check->setAvailableCashbox($cashboxList);

	$registry = SaleRegistry::getInstance($check->getField("ENTITY_REGISTRY_TYPE"));

	$validateResult = $check->validate();
	if (!$validateResult->isSuccess())
	{
		if (MainLoader::includeModule('crm'))
		{
			BitrixCrmTimelineOrderCheckController::getInstance()->onCheckFailure(
				[
					'ORDER_FIELDS' => $order->getFieldValues(),
					'SETTINGS' => [
						'FAILURE' => 'Y',
						'PRINTED' => 'N',
					],
					'BINDINGS' => BitrixCrmOrderBindingsMakerTimelineBindingsMaker::makeByOrder($order),
				]
			);
		}

		$notifyClassName = $registry->getNotifyClassName();
		$notifyClassName::callNotify($order, SaleEventActions::EVENT_ON_CHECK_VALIDATION_ERROR);
		$result->addErrors($validateResult->getErrors());

		$event = new MainEvent('sale', self::EVENT_ON_CHECK_VALIDATION_ERROR, $check->getDataForCheck());
		$event->send();

		return $result;
	}

	$saveResult = $check->save();
	if ($saveResult->isSuccess())
	{
		$checkId = $saveResult->getId();
		$order->addPrintedCheck($check);

		$enabledImmediateCashboxList = array();
		foreach ($cashboxList as $item)
		{
			if ($item['ENABLED'] === 'Y')
			{
				$cashbox = Cashbox::create($item);
				if ($cashbox instanceof IPrintImmediately)
				{
					$enabledImmediateCashboxList[$item['ID']] = $cashbox;
				}
			}
		}

		if ($enabledImmediateCashboxList)
		{
			$cashboxId = Manager::chooseCashbox(array_keys($enabledImmediateCashboxList));
			/** @var Cashbox|IPrintImmediately $cashbox */
			$cashbox = $enabledImmediateCashboxList[$cashboxId];

			CashboxCheckTable::update(
				$checkId,
				array(
					'STATUS' => 'P',
					'DATE_PRINT_START' => new TypeDateTime(),
					'CASHBOX_ID' => $cashbox->getField('ID')
				)
			);

			$printResult = $cashbox->printImmediately($check);
			if ($printResult->isSuccess())
			{
				$data = $printResult->getData();
				if ($data)
				{
					CashboxCheckTable::update($checkId, ['EXTERNAL_UUID' => $data['UUID']]);
				}
			}
			else
			{
				self::savePrintResult(
					$checkId,
					[
						'ID' => $checkId,
						'ERROR' => [
							'TYPE' =>  ErrorsError::TYPE,
							'MESSAGE' => implode("n", $printResult->getErrorMessages())
						]
					]
				);
			}

			$result->setId($checkId);

			return $result;
		}

		global $CACHE_MANAGER;
		foreach ($cashboxList as $cashbox)
		{
			$CACHE_MANAGER->Read(CACHED_b_sale_order, 'sale_checks_'.$cashbox['ID']);
			$CACHE_MANAGER->SetImmediate('sale_checks_'.$cashbox['ID'], true);
		}
	}
	else
	{
		$result->addErrors($saveResult->getErrors());
	}

	return $result;
}