Документация для разработчиков
Темная тема

События работы с кассами и чеками

Метод Описание С версии
OnSaleCheckPrepareData Событие позволяет поменять какие-либо данные в чеке: поменять название товара, убрать товары с 0 стоимостью и т.д. На вход передается 2 параметра:
  • массив с данными по чеку;

    Нажмите на [+], чтобы раскрыть детальное описание массива

  • тип чека (например, credit, advancepayment и т.д.).
// удаление доставки с 0 стоимостью
AddEventHandler("sale", "OnSaleCheckPrepareData", "CheckProductPrint");
function CheckProductPrint($a, $type)
{
	if ($a['DELIVERY']['SUM'] == 0)
		unset($a['DELIVERY']);
	return $a;
}
OnGetCustomCashboxHandlers Событие срабатывает на момент формирования списка обработчиков касс. Позволяет добавить свой обработчик кассы.
// добавление своего обработчика кассы
AddEventHandler("sale", "OnGetCustomCashboxHandlers", "GetCustomCashboxHandlers");
function GetCustomCashboxHandlers()
{
	$data = array('\Bitrix\Sale\Cashbox\cashboxnew' => '/bitrix/php_interface/include/cashboxnew.php');
	$event = new Bitrix\Main\EventResult(Bitrix\Main\EventResult::SUCCESS, $data);
	
	return $event;
}
OnGetCustomCheckList Событие срабатывает на момент формирования списка поддерживаемых чеков. Позволяет добавить свой тип чека.
// добавление своего типа чека
AddEventHandler("sale", "OnGetCustomCheckList", "GetCustomCheckList");
function GetCustomCheckList()
{
	$data = array('\Bitrix\Sale\Cashbox\SellExCheck' => '/bitrix/php_interface/include/sellexcheck.php');
	$event = new Bitrix\Main\EventResult(Bitrix\Main\EventResult::SUCCESS, $data);
	
	return $event;
}
OnPrintableCheckSend Событие позволяет переопределить стандартный механизм отправки уведомления о печати чека. На вход передается 2 параметра: объект оплаты, по которой печатается чек и объект чека, который будет напечатан.
// переопределение стандартного механизма печати чека
AddEventHandler("sale", "OnPrintableCheckSend", "PrintableCheckSend");
function PrintableCheckSend()
{
	/*
		Отправка чека по СМС
	*/
	
	$event = new Bitrix\Main\EventResult(Bitrix\Main\EventResult::SUCCESS);
	
	return $event;
}
onSaleCashboxRestrictionsClassNamesBuildList Событие позволяет добавлять свои ограничения в кассы.
onSaleCashboxRestrictionsClassNamesBuildList
// добавление своего типа чека
AddEventHandler("sale", "onSaleCashboxRestrictionsClassNamesBuildList", 
"GetSaleCashboxRestrictionsClassNamesBuildList");
function GetSaleCashboxRestrictionsClassNamesBuildList()
{
	$data = array(
		'\Bitrix\Sale\Cashbox\Restrictions\Site' => '/bitrix/php_interface/include/site.php'
	);
	$event = new Bitrix\Main\EventResult(Bitrix\Main\EventResult::SUCCESS, $data);
	
	return $event;
}
OnCheckCollateDocuments Событие предназначено для реализации собственной логики генерации чеков в автоматическом режиме.

Рассмотрим на примере: при сумме заказа больше 10000 вносится предоплата. Оплата оставшейся суммы происходит после проверки заказа менеджером. У этого заказа будет несколько оплат. Итак, для первой оплаты необходимо печатать чек аванса, а для второй – полная оплата с учетом аванса. В упрощенном виде это будет выглядеть так:
AddEventHandler("sale", "OnCheckCollateDocuments", "OnCheckCollateDocuments");
function OnCheckCollateDocuments($entities)
{
	foreach ($entities as $entity)
	{
		if ($entity instanceof \Bitrix\Sale\Payment)
		{
			$order = $entity->getCollection()->getOrder();
			if ($order->isPaid())
			{
				$related = [];
				foreach ($entity->getCollection() as $payment)
				{
					if ($payment->getId() != $entity->getId())
					{
						$related[\Bitrix\Sale\Cashbox\Check::PAYMENT_TYPE_ADVANCE][] = $payment;
					}
				}
			
				foreach ($order->getShipmentCollection() as $shipment)
				{
					if (!$shipment->isSystem())
					{
						$related[\Bitrix\Sale\Cashbox\Check::SHIPMENT_TYPE_NONE][] = $shipment;
					}
				}
				return new \Bitrix\Main\EventResult(
					\Bitrix\Main\EventResult::SUCCESS, 
					[
						[
							'TYPE' => 'sell',
							'ENTITIES' => [$entity],
							'RELATED_ENTITIES' => $related
						]
					]
				);
			}
			else
			{
				if ($entity->isPaid() && !$order->isPaid())
				{
					return new \Bitrix\Main\EventResult(
						\Bitrix\Main\EventResult::SUCCESS, 
						[
							[
								'TYPE' => 'advancepayment',
								'ENTITIES' => [$entity],
								'RELATED_ENTITIES' => []
							]
						]
					);
				}
			}
		}
	}
}
© «Битрикс», 2001-2024, «1С-Битрикс», 2024