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

	if ($checkId <= 0)
	{
		$result->addError(new Error(Loc::getMessage('SALE_CASHBOX_ERROR_CHECK_ID')));
		return $result;
	}

	$order = null;
	$payment = null;
	$shipment = null;

	$dbRes = self::getList(array('select' => array('*'), 'filter' => array('ID' => $checkId)));
	$check = $dbRes->fetch();
	if (!$check)
	{
		$result->addError(new Error(Loc::getMessage('SALE_CASHBOX_ERROR_CHECK_NOT_FOUND', array('#CHECK_ID#' => $checkId))));
		return $result;
	}

	if ($check['STATUS'] === 'Y')
		return $result;

	$registry = SaleRegistry::getInstance($check['ENTITY_REGISTRY_TYPE']);

	if ($check['ORDER_ID'] > 0)
	{
		/** @var SaleOrder $orderClassName */
		$orderClassName = $registry->getOrderClassName();
		$order = $orderClassName::load($check['ORDER_ID']);
		if ($order === null)
		{
			$result->addError(new Error(Loc::getMessage('SALE_CASHBOX_ERROR_CHECK_ORDER_LOAD')));
			return $result;
		}

		$paymentCollection = $order->getPaymentCollection();
		if ($check['PAYMENT_ID'] > 0)
		{
			$payment = $paymentCollection->getItemById($check['PAYMENT_ID']);
			if ($payment === null)
			{
				$result->addError(new Error(Loc::getMessage('SALE_CASHBOX_ERROR_CHECK_PAYMENT_LOAD')));
				return $result;
			}
		}

		$shipmentCollection = $order->getShipmentCollection();
		if ($check['SHIPMENT_ID'] > 0)
		{
			$shipment = $shipmentCollection->getItemById($check['SHIPMENT_ID']);
			if ($shipment === null)
			{
				$result->addError(new Error(Loc::getMessage('SALE_CASHBOX_ERROR_CHECK_SHIPMENT_LOAD')));
				return $result;
			}
		}
	}

	if (isset($data['ERROR']))
	{
		$errorMessage = Loc::getMessage('SALE_CASHBOX_ERROR_CHECK_PRINT', array('#CHECK_ID#' => $checkId));
		if ($data['ERROR']['MESSAGE'])
			$errorMessage .= ': '.$data['ERROR']['MESSAGE'];

		if ($data['ERROR']['TYPE'] === ErrorsWarning::TYPE)
		{
			if ($check['CNT_FAIL_PRINT'] >= 3)
			{
				$data['ERROR']['TYPE'] = ErrorsError::TYPE;
			}
			else
			{
				CashboxCheckTable::update($checkId, array('CNT_FAIL_PRINT' => $check['CNT_FAIL_PRINT'] + 1));
				$result->addError(new ErrorsWarning($errorMessage));
				return $result;
			}
		}

		if ($data['ERROR']['TYPE'] === ErrorsError::TYPE)
		{
			$updatedFields = [
				'STATUS' => 'E',
				'DATE_PRINT_END' => new MainTypeDateTime(),
				'ERROR_MESSAGE' => $data['ERROR']['MESSAGE']
			];
			if ((int)$check['CNT_FAIL_PRINT'] === 0)
				$updatedFields['CNT_FAIL_PRINT'] = 1;

			CashboxCheckTable::update($checkId, $updatedFields);

			/** @ToDO Will be removed after OrderCheckCollection is realized */
			self::addTimelineCheckEntryOnCreateToOrder($order, $checkId, ['PRINTED' => 'N']);

			if ($order !== null
				&& (
					$payment !== null
					|| $shipment !== null
				)
			)
			{
				$r = new Result();
				$errorCode = isset($data['ERROR']['CODE']) ? $data['ERROR']['CODE'] : 0;
				$r->addWarning(new MainError($errorMessage, $errorCode));

				/** @var EntityMarker $markerClassName */
				$markerClassName = $registry->getEntityMarkerClassName();

				if ($payment !== null)
				{
					$markerClassName::addMarker($order, $payment, $r);
					$payment->setField('MARKED', 'Y');

					/** @var SaleNotify $notifyClassName */
					$notifyClassName = $registry->getNotifyClassName();
					$notifyClassName::callNotify($payment, SaleEventActions::EVENT_ON_CHECK_PRINT_ERROR);
				}
				elseif ($shipment !== null)
				{
					$markerClassName::addMarker($order, $shipment, $r);
					$shipment->setField('MARKED', 'Y');

					/** @var SaleNotify $notifyClassName */
					$notifyClassName = $registry->getNotifyClassName();
					$notifyClassName::callNotify($shipment, SaleEventActions::EVENT_ON_CHECK_PRINT_ERROR);
				}

				$order->save();
			}

			$error = new ErrorsError($errorMessage);
			Logger::addError($error->getMessage(), $check['CASHBOX_ID']);
		}
		else
		{
			$error = new ErrorsWarning($errorMessage);
			Logger::addWarning($error->getMessage(), $check['CASHBOX_ID']);
		}

		$event = new MainEvent('sale', self::EVENT_ON_CHECK_PRINT_ERROR, array($data));
		$event->send();

		$result->addError($error);
	}
	else
	{
		$updateParams = [
			'STATUS' => 'Y',
			'LINK_PARAMS' => $data['LINK_PARAMS'],
			'DATE_PRINT_END' => new MainTypeDateTime(),
		];

		if (isset($data['EXTERNAL_UUID']))
		{
			$updateParams['EXTERNAL_UUID'] = $data['EXTERNAL_UUID'];
		}

		$updateResult = CashboxCheckTable::update($checkId, $updateParams);

		if ($updateResult->isSuccess())
		{
			self::addStatisticOnSuccessCheckPrint($checkId);

			self::addTimelineCheckEntryOnCreateToOrder($order, $checkId, ['PRINTED' => 'Y']);

			$isSend = false;
			$event = new MainEvent(
				'sale',
				self::EVENT_ON_CHECK_PRINT_SEND,
				array('PAYMENT' => $payment, 'SHIPMENT' => $shipment, 'CHECK' => $check)
			);
			$event->send();

			$eventResults = $event->getResults();
			/** @var MainEventResult $eventResult */
			foreach($eventResults as $eventResult)
			{
				if($eventResult->getType() == MainEventResult::SUCCESS)
					$isSend = true;
			}

			if (!$isSend)
			{
				if ($payment !== null)
				{
					/** @var SaleNotify $notifyClassName */
					$notifyClassName = $registry->getNotifyClassName();
					$notifyClassName::callNotify($payment, SaleEventActions::EVENT_ON_CHECK_PRINT);
				}
				elseif ($shipment !== null)
				{
					/** @var SaleNotify $notifyClassName */
					$notifyClassName = $registry->getNotifyClassName();
					$notifyClassName::callNotify($shipment, SaleEventActions::EVENT_ON_CHECK_PRINT);
				}
			}
		}
		else
		{
			$result->addErrors($updateResult->getErrors());
		}
	}

	return $result;
}