xandeadx.ru Блог музицирующего веб-девелопера

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

Опубликовано в

Задача — по определённому условию изменять итоговую сумму заказа в 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
Похожие записи

Комментарии RSS

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

здесь и используется Rules

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

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

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

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

Да, точно. Так и есть :)

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

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

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

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

Ни ужели с 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

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

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

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

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

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

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

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

в Amount доступны токены

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

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

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

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

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

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

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

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

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

commerce-order:commerce-order-total:amount

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании