Работа со скидками и округлением
Скопировать ссылку на статью
Скопировано

Основные положения

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

Покажем на примере. Допустим есть следующий заказ:

| Название |    Цена | Скидка            | Кол-во |    Итого |
|          |         |                   |        |          |
| Шорты    | 600 руб | 50 руб (на товар) |      2 | 1100 руб |
|          |         |                   |        |          |
| Сланцы   | 300 руб |  0 руб (на товар) |      3 |  900 руб |
|                                                 |          |
| Итого                                           | 2000 руб |

Мы дали скидку на заказ 300 рублей.

В версии 6.0 и выше скидка заказа распределится между товарами и будет учтена в их стоимости:

| Название |    Цена | Скидка            | Кол-во |    Итого |
|          |         |                   |        |          |
| Шорты    | 600 руб | 50 руб (на товар) |      2 |  980 руб |
|          |         | 60 руб (на заказ) |        |          |
|          |         |                   |        |          |
| Сланцы   | 300 руб |  0 руб (на товар) |      3 |  720 руб |
|          |         | 60 руб (на заказ) |        |          |
|                                                 |          |
| Итого                                           | 1700 руб |

Стоимость заказа в таком случае рассчитывается так: (600 – 50 – 60) x 2 + (300 – 60) x 3 = 1700

API

API v4

В API v4 и ниже поля скидок order[discount], order[discountPercent], order[items][][discount], order[items][][discountPercent] в заказе остаются без изменений и доступны как на запись, так и на чтение.

На примере заказа выше при создании заказа значения нужно передавать в следующем виде:

order = {
    // ...
    "discount": 300,
    "items": [
        {
            "offer": { "externalId": "1" },
            "initialPrice": 600,
            "discount": 50,
            "quantity": 2
        },
        {
            "offer": { "externalId": "2" },
            "initialPrice": 300,
            "quantity": 3
        }
    ],
    // ...
}

В API-методах получения заказов состав и значения полей будут аналогичными:

{
    // ...
    "discount": 300,
    "items": [
        {
            "offer": { "externalId": "1" },
            "initialPrice": 600,
            "discount": 50,
            "quantity": 2
        },
        {
            "offer": { "externalId": "2" },
            "initialPrice": 300,
            "quantity": 3
        }
    ],
    // ...
}

API v5

В методах создания и редактирования заказа /api/v5/orders/create, /api/v5/orders/{externalId}/edit, /api/v5/orders/upload можно передавать скидки на заказ и товары в полях order[discountManualAmount], order[discountManualPercent], order[items][][discountManualAmount], order[items][][discountManualPercent], при этом скидки на заказ будут распределяться между товарами.

На примере заказа выше при создании заказа значения нужно передавать в следующем виде:

order = {
    // ...
    "discountManualAmount": 300,
    "items": [
        {
            "offer": { "externalId": "1" },
            "initialPrice": 600,
            "discountManualAmount": 50,
            "quantity": 2
        },
        {
            "offer": { "externalId": "2" },
            "initialPrice": 300,
            "quantity": 3
        }
    ],
    // ...
}

В методах получения заказов /api/v5/orders, /api/v5/orders/{externalId} возвращается итоговая расчетная денежная скидка на единицу товара для каждой позиции товара в поле order[items][][discountTotal], которая учитывает и скидки на текущий товар, и скидки на заказ, распределенные между товарами.

{
    // ...
    "items": [
        {
            "offer": { "externalId": "1" },
            "initialPrice": 600,
            "discountTotal": 110,
            "quantity": 2
        },
        {
            "offer": { "externalId": "2" },
            "initialPrice": 300,
            "discountTotal": 60,
            "quantity": 3
        }
    ],
    // ...
}

Крайние случаи при распределении скидки на заказ между товарами

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

Допустим, есть заказ со следующим составом:

| Название |    Цена | Скидка            | Кол-во |    Итого |
|          |         |                   |        |          |
| Шорты    | 600 руб | –                 |      3 | 1800 руб |
|                                                 |          |
| Итого                                           | 1800 руб |

Мы добавляем скидку на заказ 10 рублей. Системе нужно распределить скидку заказа между всеми единицами товаров, которых в заказе 3 штуки.

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

Если же в системе включена настройка «Корректировать скидку на заказ» в разделе Настройки > Заказы, то система скорректирует скидку на заказ до ближайшего делимого значения (в данном случае изменит скидку на заказ с 10 рублей на 9,99 рублей). В случае, если вы передаете скидку по API - корректировка применяться не будет.

Округление

В версии 6.0 добавлена функция округления, которую можно включить в разделе Настройки > Заказы. Округление, если его включить, применяется к позициям товаров в заказе. Та стоимость, что откидывается от суммы товара в результате округления, идет в скидку товара.

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

Благодарим за отзыв.
Была ли статья полезна?
Нет
  • Рекомендации не помогли
  • Нет ответа на мой вопрос
  • Текст трудно понять
  • Не нравится описанный функционал
Да
Предыдущая статья
Работа с API-методами истории
В данной статье разобраны общие принципы работы с API-методами истории и представлены описания полей, которые могут быть получены в результате.
Следующая статья
Использование API для интеграции с Программой лояльности
Рассмотрим основные сценарии использования API для взаимодействия с Программой лояльности.