Обмен скидками
Last updated
Last updated
В этом разделе будет описан общий механизм работы со скидками на конкретные позиции в заказе БУС и МС.
Основная причина этого вопроса заключена в существовании этой опции:
Сразу возникает несколько вопросов:
Почему стоимость корзины может не совпадать?
Как конкретно пересчитывает корзину эта опция?
Стоит начать с того, что механизм работы скидок в корзинах Битрикса и МоегоСклада разные.
На стороне МС скидка каждой позиции корзины рассчитывается исключительно в процентах:
При этом на сайте мы увидим уже конечную стоимость товара в корзине без учета процентов:
Исключением может быть, если скидка была рассчитана на стороне сайта с использованием правил работы с корзиной и вы можете увидеть скидку в процентах на стороне сайта, но суть этой скидки будет все равно такая же -- в Битрикс попадет прост конечная цена товара (не процент скидки).
Для удобства мы изменим стоимость товара на более низкую, но при этом увеличим кратно количество товара и применим обычную скидку:
Запоминаем эту сумму: 186 885,72
Теперь смотрим что пришло в корзину на сайте:
Видим уже совсем другую сумму: 186 886.00
Как итог видно разницу в копейках и таким образом сумма корзин не совпадает. При этом на стороне сайта еще стоит учет копеек, иногда его отключают и различаться сумма может уже на рубль.
В этом разделе будет затронут немного сам код модуля и тех данных с которыми он работает из МоегоСклада, но все будет подробно описано, поэтому суть будет видна.
Когда модуль считывает данные корзины из МойСклад, то получает такие данные о каждой позиции корзины:
Мы видим, что все цифры, которые мы видим в корзине МойСклад мы их же и получаем по API. При этом конечная стоимость корзины и каждой позиции просто рассчитывается уже на стороне МойСклад.
Теперь вспоминаем начало этой статьи, где говорится о различиях применения скидки в корзине Битрикса и МоегоСклада. Основное отличие в том, что корзина Битрикса НЕ ПРИМЕНЯЕТ процент скидки, а записывает уже КОНЕЧНУЮ рассчитанную цену каждой позиции.
Из этого делаем вывод, что модулю необходимо рассчитать скидку самостоятельно и записать в корзину Битрикса конечную стоимость каждой позиции корзины. Это как раз модуль и выполняет.
Все карты раскрыты, теперь остается понять почему модуль вдруг не умеет считать эту скидку самостоятельно и просто верно ее записать в корзину МС?
Давайте выведем то, что рассчитывает модуль для все тех же позиций и подведем итог (здесь цена приведена умноженная на 100, так она приходит из самого МоегоСклада):
Теперь давайте считать вручную и проверять верно ли все модуль рассчитал или нет.
Возьмем позицию с ценой 354,50 руб.
Цена: 354,50
Количество: 200
Скидка: 7%
Конечная цена (расчет модуля): 329,685
Чтобы не приводить формулу, давайте просто разделим расчет модуля на цену и получим:
Мы получили 0.93, вычитаем из единицы и получим те самые 7%. Стоит заметить, что нет никаких дополнительных запятых, все расчеты точны.
И теперь смотрим что в итоге вывел нам Битрикс: 329,69. При расчете общей стоимости товара конечно будут отклонения на копейки, т.к. отклонения на 0,005 копеек при количестве в 200 штук дают уже видимые отклонения цены.
Видно, что Битрикс просто округлил до копеек и сделал это верно. Если немного покрутить точность округления внутри Битрикса можно конечно достичь точных результатов, но сути это не меняет, все равно все будет зависит от того, как будет в итоге записано число в БД Битрикса.
В итоге по этой позиции отклонения 1 рубль.
Если произошел такой случай, то опция описываемая в начале статьи помогает при таком несовпадении принудительно пересчитать процент скидок уже на стороне МоегоСклада.
В результате при сохранении заказа в МС, нужно обязательно обновить страницу заказа и убедиться, что стоимость пришла верная:
Теперь мы видим, что стоимость совпадают, но ценой того, что был подкорректирован сам процент скидки в МС.
Важно понимать то, что даже эта опция не дает 100% гарантии совпадения стоимости корзин с учетом скидок. Опция просто пытается подобрать более точный процент скидки, но это тоже может быть ограничено на стороне МС, т.к. точность процента может отличаться при перерасчете.