3  /  5

Применение скидки / наценки при выборе точек самовывоза в форме заказа

Механизм правил работы с корзиной в 1С-Битрикс дает возможность представлять скидки в зависимости от многих условий, таких как: тип плательщика, служба доставки, платежные системы и т.п. Но нет зависимости от выбранной точки самовывоза (склада). Но, как показывает практика, подобное очень часто требуется.

Внимание: Решение задачи рассмотрено на примере дефолтного шаблона компонента sale.order.ajax. В кастомизированных шаблонах решение некоторых моментов может отличаться.

В статье приведены фрагменты кода, описывающие принцип реализации, а не полностью рабочий продукт. Для внедрения рекомендуется обратиться к разработчикам.

Например, имеется 2 склада:

  • Основной склад. (идентификатор склада равно 2)
  • Дополнительный склад. (идентификатор склада равно 3)
Склады

Требуется применить скидку на товары 10%, если покупатель выбрал точку самовывоза Основной склад.

Для этого необходимо:

1) Создать соответствующее правило работы с корзиной.

Скидка 10%

Скидка 10% - условия применения

Как видно из скриншота, в качестве PHP-выражения указана обычная функция __scoder_check_stores(). Данная функция будет описана в файле init.php, к ней мы еще вернемся

2) Необходимо определить, какая на данный момент выбрана точка самовывоза. Для этого понадобится обработчик события OnSaleComponentOrderUserResult, подробнее в документации.

AddEventHandler("sale", "OnSaleComponentOrderUserResult", Array("CScoderClass", "OnSaleComponentOrderUserResultHandler"));
class CScoderClass
{
   const STORE_ID = 2;		//Ид точки самовывоза - Основной склад
   function OnSaleComponentOrderUserResultHandler(
	&$arUserResult,
	$request,
	&$arParams
   )
   {
         //если выбрана точка самовывоза - Основной склад
         if ($arUserResult['BUYER_STORE']==self::STORE_ID)
         {
               $_SESSION['IS_DISCOUNT'] = true;
         }
         else
         {
               $_SESSION['IS_DISCOUNT'] = false;
         }
   }
}

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

3. Описываем PHP-выражение - функцию __scoder_check_stores().

function __scoder_check_stores()
{
   $btrue = false;
   if ($_SESSION['IS_DISCOUNT']===true)
      $btrue = true;
   
   return $btrue;
}

Данная функция проверяет признак сессии и возвращает истину (true) или ложь (false), т.е. применять или нет скидку.

4) Остается доработать шаблон компонента формы заказа sale.order.ajax, чтобы покупатель видел скидку сразу после выбора точки самовывоза, предварительно скопировав шаблон.

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

Чтобы это изменить, необходимо внести изменения в js-код формы заказа - в order_ajax.js. Пересчет осуществляется командой BX.Sale.OrderAjaxComponent.sendRequest(). Вызов данной команды необходимо разместить в 2-х местах.

В методе editFadePickUpContent.и в методе initMaps

phpcondition_js1.jpg

phpcondition_js2.jpg

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