Drupal 7 Commerce, замена цен на оптовые при достижении определённой суммы в корзине

Главные вкладки

Аватар пользователя tober tober 22 декабря 2016 в 16:28

Всем привет
2 дня поисков и мытарств увенчались успехом.
Поскольку нормального описания как это сделать в интернете так и не нашёл выкладываю своё. Уверен кому-то пригодится.
Создаём правило.

Event
Расчёт стоимости товара

Условия
Сущность имеет поле:
Сущность: [commerce-line-item], Поле: commerce_product

Сущность имеет поле:
Сущность: [commerce-line-item: commerce_product], Поле: field_optprice:

Значение отсутствует с галочкой обратить
Параметр: Данные для проверки: [commerce-line-item:order:commerce-order-total

Price comparison Параметр: First Price: [commerce-line-item:order:commerce-order-total, Оператор: >=, Second Price: 7 500,00 руб.

Действия

Цикл проходит по всем элементам корзины и меняет стоимость за единицу
Цикл
Параметр: Список: [commerce-line-item:order:commerce-line-items
Элемент списка: Текущий элемент списка (list_item)

Заменить стоимость за единицу указанным значением
Параметр: Строка: [commerce-line-item], Сумма: [commerce-line-item:commerce-product:field-optprice:amount

Следующие 2 действия нужны для обновления общей стоимости в корзине
Вычислить значение
Параметр: Входящее значение 1: [commerce-line-item:quantity], Оператор: ( * ), Входящее значение 2: [commerce-line-item:commerce-unit-price:amount
Предоставляет переменные: Результат вычисления (result)

Установить значение
Параметр: Данные: [commerce-line-item:commerce-total:amount, Значение: [result]

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

Если что-то не понятно
вот экспорт

{ "rules_rule_for_change_stock_and_reserve" : {
    "LABEL" : "rule to change price",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [
      "rules",
      "commerce_price",
      "commerce_line_item",
      "commerce_product_reference"
    ],
    "ON" : { "commerce_product_calculate_sell_price" : [] },
    "IF" : [
      { "entity_has_field" : { "entity" : [ "commerce-line-item" ], "field" : "commerce_product" } },
      { "entity_has_field" : {
          "entity" : [ "commerce-line-item:commerce-product" ],
          "field" : "field_optprice"
        }
      },
      { "NOT data_is_empty" : { "data" : [ "commerce-line-item:order:commerce-order-total" ] } },
      { "commerce_price_compare_price" : {
          "first_price" : [ "commerce-line-item:order:commerce-order-total" ],
          "operator" : "\u003E=",
          "second_price" : { "value" : { "amount" : 750000, "currency_code" : "RUB" } }
        }
      }
    ],
    "DO" : [
      { "LOOP" : {
          "USING" : { "list" : [ "commerce-line-item:order:commerce-line-items" ] },
          "ITEM" : { "list_item" : "\u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043f\u0438\u0441\u043a\u0430" },
          "DO" : [
            { "commerce_line_item_unit_price_amount" : {
                "commerce_line_item" : [ "commerce-line-item" ],
                "amount" : [ "commerce-line-item:commerce-product:field-optprice:amount" ],
                "component_name" : "base_price",
                "round_mode" : "1"
              }
            }
          ]
        }
      },
      { "data_calc" : {
          "USING" : {
            "input_1" : [ "commerce-line-item:quantity" ],
            "op" : "*",
            "input_2" : [ "commerce-line-item:commerce-unit-price:amount" ]
          },
          "PROVIDE" : { "result" : { "result" : "\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f" } }
        }
      },
      { "data_set" : {
          "data" : [ "commerce-line-item:commerce-total:amount" ],
          "value" : [ "result" ]
        }
      }
    ]
  }
}