В модуле «Интернет-магазин» системы NetCat имеются два уровня скидок: скидки на товары, скидки на корзину и скидки на доставку.
Чтобы создать скидку, откройте раздел «Скидки» в настройке модуля Интернет-магазин.
Каждая скидка должна иметь понятное название с указанием размера скидки, например: «Скидка 5% при покупке на сумму более 1000 руб.».
Вы можете указать период действия скидки, типы цен, к которым данная скидка применяется, а также группы пользователей, которые могут ею воспользоваться. Если какое-либо из данных полей не заполнено, то скидка не имеет ограничения по этому параметру (т.е. ее срок действия не ограничен, она применяется ко всем типам цен и распространяется на все группы пользователей).
Заполните необходимые поля и сохраните скидку. Добавленная скидка появится в списке.
Как было упомянуто выше вы можете добавить скидку на товар, корзину или доставку. Рассмотрим пример добавления скидки для товара.
Откройте страницу «Скидки на товары» и нажмите кнопку «Добавить».
Введите название для скидки и её описание.
Здесь же укажите размер скидки: в процентах либо фиксированную сумму, а также при необходимости включите опцию суммирования добавляемой скидки с другими. Внимание! Эта опция влияет на суммирование только в рамках одного и того же типа скидок.
Если на товар действует несколько скидок без флага «суммируется с другими скидками», будет применена максимальная скидка; скидки с флагом «суммируется с другими скидками» будут добавлены к максимальной скидке, выбранной среди скидок, которые не суммируются. При применении нескольких относительных (в процентах) скидок их размер всегда рассчитывается от полной цены товара.
Далее добавляем условие действия этой скидки. Например, сделаем единственное условие: скидку на конкретный товар. Для этого выберем «Добавить условие» => «Товар»
Нажмите на ссылку выбора товара
Во всплывающем окне выберите товар
В итоге покупатель получит 5% скидку на выбранный товар.
Если выбран товар с вариантами, скидка будет действовать на все варианты данного товара. При выборе варианта товара скидка будет действовать только на данный вариант.
Теперь можно добавить дополнительное условие. Например, ограничить срок действия скидки. В добавлении услуг выберите поле «Дата»
и укажите время действия скидки
В итоге получаем скидку на книгу, действующую в конкретный временной промежуток.
Если же мы изменим логику взаимодействия условий с «И» на «ИЛИ», то получим скидку, которая применяется на все товары в промежуток времени, и на конкретный товар – всегда:
Скидка на доставку добавляется аналогично скидке на товар. Нужно указать название, описание, размер скидки и выставить опцию сумировать ли данную скидку с остальными.
Далее указывается условие применения скидки. Выберите желаемое условие:
и укажите условие
При необходимости можно добавить несколько условий. Сохраните скидку.
В некоторых случаях фактически применная скидка может быть менее указанной в параметрах скидки:
Помимо простых условий можно задать вызов пользовательской функции. Пример функции приведён ниже:
<?php /** * Пример функции для использования в условиях скидок * * @param nc_netshop_condition_context $context * Объект окружения (состав корзины, свойства пользователя). * @param nc_netshop_item $current_item * Товар, по отношению к которому проверяется условие. * @return boolean */ function my_custom_discount_condition(nc_netshop_condition_context $context, nc_netshop_item $current_item = null) { // Примеры получения свойств окружения: // Содержимое корзины (объект nc_netshop_item_collection): $context->get_cart_contents() // ID пользователя: $context->get_user_id() // Активированные купоны (объект nc_netshop_promotion_coupon_collection): $context->get_coupons() // Получение суммы заказов за определённый промежуток времени $context->get_user_previous_orders_sum($from_date_timestamp, $to_date_timestamp) // Количество заказов за определённый промежуток времени: $context->get_user_previous_orders_count($from_date_timestamp, $to_date_timestamp) // где $from_date_timestamp — время начала периода в виде UNIX timestamp (или NULL — за всё время) // $from_date_timestamp — время окончания периода в виде UNIX timestamp (или NULL — до текущего времени) // Проверка прошлых заказов на наличие товара из компонента $component_id: $context->previous_orders_had_item($component_id, $item_id = null) // Если $item_id === null, то любой товар из компонента // Внимание! При использовании свойств объекта $current_item нельзя запрашивать // свойства, зависящие от скидок, например ItemPrice, ItemDiscount и т.п., так как // это приведёт к бесконечному циклу. // То же самое относится к свойствам корзины, зависящим от размера скидок! // В качестве простого примера — скидка на товары, // целая часть цены (без скидки) которых — чётное число: $price_is_even = ($current_item['OriginalPrice'] % 2) == 0; return $price_is_even; }
Задача: на товары имеются скидки с флагом «суммируется с другими скидками» и скидки по купону. Скидка по купону является максимально возможной и не должна суммироваться с прочими скидками (то есть, если активирован купон со скидкой на товар, другие скидки к нему не должны применяться).
Решение: добавить к скидкам на товары не по купону условие «И» «Функция „my_discount_condition_no_active_coupons
“ возвращает значение „истина“». Код функции:
// Файл: /netcat/modules/default/function.inc.php /** * Функция проверяет, применён ли купон на скидку на указанный товар * @param nc_netshop_condition_context $context * @param nc_netshop_item|null $current_item * @return bool */ function my_discount_condition_no_active_coupons(nc_netshop_condition_context $context, nc_netshop_item $current_item = null) { if ($current_item) { $active_coupons = $context->get_coupons(); if ($active_coupons) { /* Нас интересуют только купоны со скидкой на товар (deal_type == 'discount_item') */ /** @var nc_netshop_promotion_discount_item $discount */ foreach ($active_coupons->where('deal_type', 'discount_item')->each('get_deal') as $discount) { if ($discount->applies_to($current_item, $context)) { return false; } } } } return true; }