Drupal → По условию изменить итоговую сумму заказа в Commerce

23.10.2013

Задача — по определённому условию изменять итоговую сумму заказа в Drupal Commerce. Например нужно добавить к заказу стоимость доставки, если цена меньше определённой суммы; или сделать скидку постоянным покупателям; или сделать скидку по купонам. Кейсов множество.

Решений есть несколько и большинство довольно нетривиальные. Остановлюсь на двух самых простых.

Если к итоговой цене нужно добавлять/отнимать процент от стоимости, то выручит дефолтный модуль Tax (пример 1, пример 2).

Если к цене нужно добавлять/отнимать какую-то сумму, то поможет модуль Commerce Fees:

  1. Включаем модуль Commerce Fees

  2. На странице admin/commerce/config/fees добавляем новый Fee type:

  3. В админке Rules admin/config/workflow/rules добавляем правило с реакцией на событие Apply a fee to a given order:

  4. Добавляем необходимые условия

  5. Добавляем действие Apply a fee to an order. В Entity выбираем commerce-order, в Fee созданный ранее Fee type, в Amount сумму (в копейках), на которую нужно изменить итоговую стоимость, а так же валюту:

Profit:

Если такую же табличку, с расчётом итоговой стоимости нужно показать и в корзине, то в представлении commerce_cart_form, вместо подвала Commerce Line Item: Line item summary (Cart summary), добавляем Commerce Order: Order total:

Profit:

Добавлено 18.04.2014:

В модуле есть баг — если добавить условие Price comparsion, в котором проверять сумму заказа, то при определённых условиях Fee не будет применяться корректно. Как обойти баг читайте комментарии.

Способ программного добавления скидки к заказу.

Написанное актуально для
Commerce 1.x
Похожие записи

Комментарии

Роман
23.10.2013, 21:49

Скажите, а разве использование Rules - не будет d таких случаях более универсальным способом ?

Роман
23.10.2013, 21:53

Я имел в виду не подключать дополнительные модули в зависимости от того, что нужно сделать, а просто создать своё правило, в котором и прописать, что делать с ценой.

комерц не предоставляет таких возможностей

Роман
23.10.2013, 21:57

Гм... Я как-то с ней экспериментировал, вроде бы получалось что-то такое сделать.
Или дело в том, что я работал с версией 2.x ...

скорей всего вы экспериментировали с ценой товара.
версии 2.х ещё не существует.

Дархан
18.02.2014, 13:26

Спасибо за пост. Второй способ вполне подошел, но возникла следующая проблема. При изменении количества товара и нажатия "обновить корзину" не добавляется сумма к итоговому заказу. Только при обновлении страницы

Дархан
24.02.2014, 10:31

Все работает когда создаешь правило через admin/config/workflow/rules, но что если мне нужно чтобы правило работало через admin/commerce/config/product-pricing ? Там больше доступных селекторов, а мне как раз нужно считать итоговую сумму исходя из заказа
https://drupal.org/node/2201885

Андрей
17.04.2014, 15:43

Добрый день!
Плиз, расскажите подробнее о 4м пункте.

Столкнулся с такой ошибкой:
В условиях цену можно получить только через "Price comparison" - это итоговая цена, с ценой доставки!
Если ставлю условие "Price comparison < 1500,00 руб", а товар стоит 1320, то условие выполняется через раз! Т.к. в первом случае мы получаем сумму 1320+250=1570 > 1500!! И при повторном обновлении он уже не считает доставку..

Андрей
18.04.2014, 15:28

Ни ужели с 4 пунктом в статье, ни у кого не возникало проблем??

Проверил, действительно есть такая бага. Значит нужно отдельным правилом считать цену заказа без добавляемого fee и сравнивать с получившейся цифрой, а не с commerce-order:commerce-order-total

Можно поставить модуль https://drupal.org/project/commerce_price_components и вместо условия Price comparsion добавить Data comparsion с селектором commerce-order:commerce-order-total:base-price:amount. Цену для сравнения указать в копейках.

Ещё можно добавить условие Execute custom PHP code с кодом:

$order_wrapper = entity_metadata_wrapper('commerce_order', $commerce_order);
$order_total = $order_wrapper->commerce_order_total->value();
$base_price = commerce_price_component_total($order_total, 'base_price');
$amount_decimal = commerce_currency_amount_to_decimal($base_price['amount'], $base_price['currency_code']);
return $amount_decimal < 1500;

предварительно включив модуль PHP filter

Андрей
18.04.2014, 21:57

Спасибо!! Успешно воспользовался третьим вариантом :)

Андрей
19.04.2014, 01:56

Ещё можно добавить условие Execute custom PHP code с кодом

Небольшой баг, последнюю строчку php кода нужно заменить на:
if ($amount_decimal > 0){ return $amount_decimal < 1500; }

Иначе после удаления товаров из корзины получим такую штуку:

В вашей корзине 0 товаров на сумму 250 руб.

На идеальность предложенного варианта не претендую :)

А можно ли как-то добавить к заказу не фиксированную стоимость доставки, а значение поля из дисплея товара, например $content['field_dostavka'][0] ?

Я так понимаю токен надо свой создавать, т.к. по-умолчанию полей дисплея в там нет

Фёдор
08.01.2015, 02:42

Доброго времени суток.

подгрузите отдельным экшеном

Можете подсказать, как правильно это сделать?
У меня есть доп.поле "списать с баланса" в профиле покупателя.

Пытаюсь по событию "Окончание процесса оформления" выполнить экшн "Fetch entity by property".
Параметры на скрине:
http://joxi.ru/DrlOykMsKVV0AP.png
Не понимаю, что делать с полем "значение", там не выбирается ничего похожего на нужные мне данные...
Правильно ли я вообще выбрал экшн?

речь шла о product display. с профилем не знаю как

Гость
28.05.2015, 10:00

Здравствуйте! меня интересует можно как то реализовать изменение минимальной суммы заказа при выборе товара которого нет в наличии? Использую модули Commerce Minimum & Maximum Order Amount (для установки минимальной суммы заказа) и Commerce Stock. Пытался создать правило, но не знаю какое выбирать событие, что бы запрещалось переходить к оформлению заказа и какое выбрать действие после проверки условия.

Ольга
28.02.2016, 07:38

Помогите, пожалуйста. Требуется сделать наценку на товары при условии: стоимость заказа меньше 3000.
Создаю правило. При задании условия требуется заполнить Селектор данных.
Выбираю commerce-order:commerce-order-total:
Но дальше стоит двоеточие, а что туда писать после двоеточия, непонятно. Условие не сохраняется - появляется красная рамка.
Без двоеточия тоже не сохраняется.
Подскажите, как правильно заполнить Селектор данных?

Kiskenbassker
17.04.2017, 12:56

Добрый день! У меня ситуация: есть несколько способов доставки, у каждого своя стоимость. Какой rule нужно написать, чтобы при выборе определенного способа доставки добавлялась его стоимость?

Добавить комментарий