
Чорна п'ятниця/тиждень вже почався, промо буди підготовлені заздалегіть і вже достпуні на продакшені. Але функціонал коли декілька промо мають бути об'єднані не був протестований.
Ми встановили 15% знижки на всі товари в магазині. Але деякі з товарів мають мати знижку у 30%. На в'ю модах товарів все працює корректно - ціни відображаються відносно налаштувань у commerce_promo модулі. Але коли користувач додає у корзину 1 товар з 15% знижкою а другий з 30%, то у результаті другий товар не має знижки взагалі! Налаштування сумісновті для основної знижки у 15% було встановлено опцією "Not with any other promotions". І саме в ній була проблема.
Модуль Commerce promotion має безліч умов для налаштувань знижок. Окрім відстньої умови "Negotiation" (виключення). Мені невідомо чому такий простий функціонал не був включений у контрібний модуль. Але він дуже швидко виправляється за допомогою копіювання кондішна OrderItemProduct з модуля commerce_product в кастомний і зміни вертання результату методу evaluate() на протилежний.
/**
* {@inheritdoc}
*/
public function evaluate(EntityInterface $entity) {
// ...
return !in_array($purchased_entity->getProductId(), $product_ids);
}
Таким чином, товари які мають знижку у 30% потрбіно додати до умови "Negotiation products" у основній знижці.
І в результаті всі товари магазину будуть мати 15% знижки, в товари зі списку 30%.
https://gist.github.com/onesixromcom/72519841752b62ca176a3da405fa8aac