Обмен скидками

В этом разделе будет описан общий механизм работы со скидками на конкретные позиции в заказе БУС и МС.

Основная причина этого вопроса заключена в существовании этой опции:

Сразу возникает несколько вопросов:

  • Почему стоимость корзины может не совпадать?

  • Как конкретно пересчитывает корзину эта опция?

Почему стоимость корзины может не совпадать?

Механизм работы скидок для корзины в обоих системах

Стоит начать с того, что механизм работы скидок в корзинах Битрикса и МоегоСклада разные.

На стороне МС скидка каждой позиции корзины рассчитывается исключительно в процентах:

При этом на сайте мы увидим уже конечную стоимость товара в корзине без учета процентов:

Исключением может быть, если скидка была рассчитана на стороне сайта с использованием правил работы с корзиной и вы можете увидеть скидку в процентах на стороне сайта, но суть этой скидки будет все равно такая же -- в Битрикс попадет прост конечная цена товара (не процент скидки).

Моделирование проблемы

Для удобства мы изменим стоимость товара на более низкую, но при этом увеличим кратно количество товара и применим обычную скидку:

Запоминаем эту сумму: 186 885,72

Теперь смотрим что пришло в корзину на сайте:

Видим уже совсем другую сумму: 186 886.00

Как итог видно разницу в копейках и таким образом сумма корзин не совпадает. При этом на стороне сайта еще стоит учет копеек, иногда его отключают и различаться сумма может уже на рубль.

Причины проблемы

В этом разделе будет затронут немного сам код модуля и тех данных с которыми он работает из МоегоСклада, но все будет подробно описано, поэтому суть будет видна.

Когда модуль считывает данные корзины из МойСклад, то получает такие данные о каждой позиции корзины:

Мы видим, что все цифры, которые мы видим в корзине МойСклад мы их же и получаем по API. При этом конечная стоимость корзины и каждой позиции просто рассчитывается уже на стороне МойСклад.

Теперь вспоминаем начало этой статьи, где говорится о различиях применения скидки в корзине Битрикса и МоегоСклада. Основное отличие в том, что корзина Битрикса НЕ ПРИМЕНЯЕТ процент скидки, а записывает уже КОНЕЧНУЮ рассчитанную цену каждой позиции.

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

Почему модуль не верно рассчитывает скидку исходя из процента?

Все карты раскрыты, теперь остается понять почему модуль вдруг не умеет считать эту скидку самостоятельно и просто верно ее записать в корзину МС?

Давайте выведем то, что рассчитывает модуль для все тех же позиций и подведем итог (здесь цена приведена умноженная на 100, так она приходит из самого МоегоСклада):

Теперь давайте считать вручную и проверять верно ли все модуль рассчитал или нет.

Возьмем позицию с ценой 354,50 руб.

  • Цена: 354,50

  • Количество: 200

  • Скидка: 7%

  • Конечная цена (расчет модуля): 329,685

Чтобы не приводить формулу, давайте просто разделим расчет модуля на цену и получим:

329.685/354.50=0.93329.685 / 354.50 = 0.93

Мы получили 0.93, вычитаем из единицы и получим те самые 7%.​ Стоит заметить, что нет никаких дополнительных запятых, все расчеты точны.

И теперь смотрим что в итоге вывел нам Битрикс: 329,69. При расчете общей стоимости товара конечно будут отклонения на копейки, т.к. отклонения на 0,005 копеек при количестве в 200 штук дают уже видимые отклонения цены.

Видно, что Битрикс просто округлил до копеек и сделал это верно. Если немного покрутить точность округления внутри Битрикса можно конечно достичь точных результатов, но сути это не меняет, все равно все будет зависит от того, как будет в итоге записано число в БД Битрикса.

В итоге по этой позиции отклонения 1 рубль.

Как доп. опция помогает с этим бороться?

Если произошел такой случай, то опция описываемая в начале статьи помогает при таком несовпадении принудительно пересчитать процент скидок уже на стороне МоегоСклада.

В результате при сохранении заказа в МС, нужно обязательно обновить страницу заказа и убедиться, что стоимость пришла верная:

Теперь мы видим, что стоимость совпадают, но ценой того, что был подкорректирован сам процент скидки в МС.

Важно понимать то, что даже эта опция не дает 100% гарантии совпадения стоимости корзин с учетом скидок. Опция просто пытается подобрать более точный процент скидки, но это тоже может быть ограничено на стороне МС, т.к. точность процента может отличаться при перерасчете.

Last updated