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

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

Метод Описание С версии
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' => []
							]
						]
					);
				}
			}
		}
	}
}

Пользовательские комментарии

Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
5
Александр Карпов
В PAYMENTS может не быть объекта оплаты, например вместо
Код
'PAYMENTS' => [   // массив оплат
        [
            'ENTITY' => {Bitrix\Sale\Payment}, // объект оплаты
            'IS_CASH' => "N", // тип документа оплаты: наличные/безналичные (оставлен для совместимости).
                              // Правильнее опираться на поле с ключом TYPE
            'TYPE' => "cashless", // тип документа оплаты: принимает одно из значений: cash (наличные),
                                     //cashless (безналичные), advance (аванс), credit (кредит)
            'SUM' => 1400, // сумма документа оплаты
        ]
    ],
Вы можете получить
Код
'PAYMENTS'=>[
  [
    'TYPE' => 'credit',
    'SUM' => 1042
  ]
]

"Удачной отладки"!
© «Битрикс», 2001-2024, «1С-Битрикс», 2024
Наверх