Внедрение ценообразования настраиваемых позиций в Optimizely Commerce 14

Во многих реализациях корпоративной коммерции бизнес-пользователям часто требуется гибкость для изменения цен на продукты на уровне корзины, особенно во время операций обслуживания клиентов, переговоров B2B или создания заказов вручную.

Недавно у меня появилось требование клиента, согласно которому Суперадминистратор (специальная роль CMS/Commerce) требовалась возможность изменять цена каждой позиции прямо со страницы корзины.

Например:
Если цена продукта по умолчанию 1000 долларов СШАсуперадминистратор должен иметь возможность изменить его на 900 долларов США, 850 долларов СШАили любое пользовательское значение – даже если эта цена не указана в прайс-листах.

Эти специальные цены также должны корректно работать с:

  • Двигатель рекламных акций

  • Налоговые расчеты

  • Рабочие процессы перерасчета

  • Сумма заказа

Чтобы выполнить это требование чисто и безопасно, нам нужен был способ переопределить Размещенная цена на уровне позиции таким образом, чтобы это соответствовало ценообразованию Commerce.

Этот блог объясняет правильный, коммерческий способ для внедрения индивидуального ценообразования по позициям.

Используйте специальный процессор цен

Чтобы правильно реализовать индивидуальное ценообразование, мы должны подключиться к конвейеру ценообразования Commerce через IPlacedPriceProcessor

1. Сохраните специальную цену в позиции.

Когда суперадминистратор обновляет цену на странице корзины:

lineItem.Properties["SuperAdminCustomPrice"] = customPrice.ToString(); // SuperAdminCustomPrice is meta field
_cartRepository.SaveCart(cart);

Это свойство сохраняется в корзине/товаре.

2. Внедрение пользовательского процессора цен

[ServiceConfiguration(typeof(IPlacedPriceProcessor))]
public class SuperAdminPriceProcessor : DefaultPlacedPriceProcessor
{
    public override void ApplyPlacedPrice(
        IOrderGroup orderGroup,
        IOrderForm orderForm,
        ILineItem lineItem,
        IMarket market)
    {
        // Allow Commerce to set its default price
        base.ApplyPlacedPrice(orderGroup, orderForm, lineItem, market);

        // Check for Super Admin’s custom price
        if (!lineItem.Properties.ContainsKey("SuperAdminCustomPrice"))
        {
            return;
        }

        if (decimal.TryParse(
            lineItem.Properties["SuperAdminCustomPrice"].ToString(),
            out var customPrice))
        {
            // Save original Commerce price for audit/rollback
            lineItem.Properties["OriginalPlacedPrice"] = lineItem.PlacedPrice;

            // Apply custom override
            lineItem.PlacedPrice = customPrice;
        }
    }
}

Read more:  HHS хочет, чтобы ваши идеи помогли ускорить внедрение искусственного интеллекта в клинической помощи

3. Как это выглядит в пользовательском интерфейсе

Опция «Изменить цену» на странице корзины просто обновляет пользовательское свойство:

if (User.IsInRole("SuperAdmin"))
{
    lineItem.Properties["SuperAdminCustomPrice"] = newPrice;
}

Это было именно то, что нужно клиенту:
Чистый, безопасный для производства способ Суперадминистраторы будут переопределять цены позиций без нарушения каких-либо функций Commerce.

Спасибо,

Сунил Кумар

28 ноября 2025 г.

Читайте также

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.