Skip to content

Предварительная оценка заказа

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

Никаких изменений в базу данных не выполняется, бонусы не резервируются, сертификаты не используются. Это основной метод предварительной оценки заказа, результат которого нужно показать на странице корзины (сайт) или кассиру (на кассовом аппарате).

Пайплайн расчета заказа следующий:

  1. Подбор акций, подходящих клиенту и текущей корзине.
  2. Расчет лимитов скидок для каждого товара.
  3. Применение скидочных акций.
  4. Расчет вознаграждения покупателя по реферальной программе, если тип вознаграждения "скидка". Работает, в том числе для покупателей, не являющихся участниками ПЛ. Но не работает для анонимных заказов.
  5. Применение скидок по скидочной программе лояльности с учетом уровня клиента.
  6. Применение бонусов.
  7. Применение сертификатов и депозитов.
  8. Расчет вознаграждения по бонусной программе лояльности.
  9. Расчет вознаграждения покупателя бонусами по реферальной программе, если тип вознаграждения "бонусы".
  10. Расчет бонусного вознаграждения реферера (партнера).
POST https://api.rees46.ru/loyalty/checkout/estimate

Параметры

ПараметрОбязателен?Описание
shop_idДаAPI-ключ
shop_secretДаСекретный ключ API
identifierНетНомер телефона клиента, идентификатор участника ПЛ. Обязательно для списания бонусов, реферальной программы и некоторых акций, иначе можно не указывать
order_idНетНомер заказа. Обычно на данном этапе равен null и является обязательным только в checkout/apply
cart_items[]ДаМассив товаров или услуг в корзине покупателя. Не может быть пустым
cart_items[].product_idДаАртикул товара или услуги
cart_items[].priceДаИсходная цена товара до применения скидок и акций
cart_items[].quantityДаКоличество единиц данного товара в корзине
cart_items[].discountableНетМожно указать false, если требуется принудительно запретить скидки и скидочные акции
cart_items[].bonusableНетМожно указать false, если требуется принудительно запретить списание бонусов
cart_items[].rewardableНетМожно указать false, если требуется принудительно запретить вознаграждение бонусами
payment_typeНетСпособ оплаты. Может влиять на применяемые инструменты. Например, акция работает только при оплате наличными. Значением может быть любая строка. Например: cash, card, sbp
promo_codesНетСписок промокодов (массив строк)
certificatesНетСписок кодов предоплаченных сертификатов (массив строк)
charge_bonusesНетБулевый флаг, списывать бонусы или нет. По-умолчанию false. Если указан в true, то в поле identifier обязательно должен быть идентификатор участника ПЛ. Если identifier отсутствует или участника ПЛ с таким идентификатором нет, метод вернет ошибку с кодом 400
bonuses_amountНетЛимит списания бонусами, если покупатель по какой-то причине хочет списать меньше бонусов, чем возможно. В большинстве случаев не требуется, т.к. алгоритм считает максимальную скидку из всех возможных инструментов и покупателю не нужно думать, сколько бонусов стоит списать для получения максимальной скидки
use_personal_certificatesНетБулевый флаг, использовать ли именные сертификаты без их передачи в запросе. Если true, то процессинг найдет все активные именные сертификаты клиента и попытается применить их автоматически
streamНетИдентификатор стрима, позволяющий отделять заказы из розницы, сайта и мобильных приложений, если у вас есть акции, которые могут работать только в одном канале
current_timeНетЛокальное время в точке продаж в формате HH:MM, если есть акции, которые работают в определенное время (например, "счастливые часы"). Если время не указано, берется текущее время на сервере в таймзоне магазина
subscriptionНетКод подписки клиента, если есть

Важно про cart_items

  1. Массив не может быть пустым.
  2. В корзине не может быть двух строк с одинаковым артикулом.
  3. Поле price не может отсутствовать или быть ≤ 0.
  4. Поле quantity не может отсутствовать или быть ≤ 0.
  5. Поле product_id не может отсутствовать.
  6. Если в поле product_id содержится артикул, которого нет в товарной базе, товар не будет участвовать в скидках и вознаграждениях.

Запрос

Пример запроса:

shell
curl --header "Content-Type: application/json" \
  --request POST \
  --data-binary "@payload.json" \
  https://api.rees46.ru/loyalty/checkout/estimate

Пример JSON-тела:

json
{
  "shop_id":        "...",
  "shop_secret":    "...",
  "identifier":     "...",
  "payment_type":   "...",
  "promo_codes":    ["...", "..."],
  "certificates":   ["...", "..."],
  "charge_bonuses": true,
  "bonuses_amount": 500, 
  "stream":         "pos",
  "current_time":   "17:31",
  "cart_items": [
    {"product_id": "...", "price": 1000, "quantity": 4},
    {"product_id": "...", "price": 2000, "quantity": 1, "discountable": false, "bonusable": false, "rewardable": false }
  ]
}

Ответ

Пример ответа сервера:

json
{
  "status": "success",
  "payload": {
    "order_id": null,
    "identifier": "...",
    "payment_type": "...",
    "products_total": 5,
    "order_total": 6000,
    "saved_total": 1100,
    "saved_by_discounts": 400,
    "saved_by_bonuses": 600,
    "saved_by_offers": 0,
    "saved_by_certificates": 100,
    "order_to_pay": 4900,
    "order_bonuses_to_charge": 500,
    "bonuses_balance": 1000,
    "bonuses_reward": 500,
    "bonuses_referrer_reward": 0,
    "referrer_identifier": "...",
    "referral_program": 21,
    "applied_promotions": [],
    "rewarded_stickers": {},
    "used_stickers": {},
    "stickers_balance": {},
    "promo_codes": [],
    "promo_codes_failed": [],
    "certificates": [],
    "certificates_failed": [],
    "items": [
      {
        "uniqid": "...",
        "quantity": 4,
        "price": 1000,
        "total": 4000,
        "discountable": true,
        "bonusable": true,
        "rewardable": true,
        "paid_with_offers": 0,
        "paid_with_offers_per_product": 0,
        "paid_with_referral_discounts": 0,
        "paid_with_referral_discounts_per_product": 0,
        "paid_with_discounts": 500,
        "paid_with_discounts_per_product": 100,
        "paid_with_bonuses": 500,
        "paid_with_bonuses_per_product": 100,
        "paid_with_certificates": 100,
        "paid_with_certificates_per_product": 25,
        "bonuses_reward": 400,
        "bonuses_reward_per_product": 100,
        "bonuses_reward_loyalty_program": {
          "total": 40,
          "per_product": 10
        },
        "bonuses_reward_referral_program": {
          "total": 80,
          "per_product": 20
        },
        "bonuses_reward_promotions": {
          "33": { "total": 100, "per_product": 25 },
          "17": { "total": 180, "per_product": 45 }
        },
        "certificates": {
          "14": { "id": 14, "code": "...", "pool_id": 11, "amount": 100, "amount_per_product": 25 },
          "32": { "id": 31, "code": "...", "pool_id": 19, "amount": 160, "amount_per_product": 40 }
        },
        "bonuses_used": 500,
        "bonuses_used_per_product": 125,
        "total_after_discounts": 3500,
        "total_after_discounts_per_product": 875
      }
    ]
  }
}

Расшифровка ответа:

ПараметрОписание
successЗапрос выполнен успешно или нет
payload.messageСообщение с результатом обработки запроса
payload.order_idИдентификатор заказа, в estimate равен null, если явно не передан в запросе
payload.identifierИдентификатор участника программы лояльности в формате 7XXXXXXXXXX
payload.payment_typeСпособ оплаты, переданный в запросе
payload.products_totalКоличество штук товаров в корзине (сумма quantity всех SKU)
payload.order_totalПолная стоимость заказа (сумма price * quantity всех SKU)
payload.saved_totalСуммарная скидка текущей корзины по всем инструментам
payload.saved_by_discountsСуммарная скидка заказа по скидочной программе лояльности
payload.saved_by_bonusesСуммарная скидка заказа по бонусной программе лояльности
payload.saved_by_offersСуммарная скидка заказа по акциям
payload.saved_by_certificatesСколько будет сэкономлено при оплате сертификатами
payload.order_to_payКонечная сумма денег к оплате заказа
payload.order_bonuses_to_chargeМаксимально доступная сумма оплаты бонусами по заказу
payload.bonuses_balanceТекущий бонусный баланс покупателя до списания бонусов
payload.bonuses_rewardРасчетное вознаграждение покупателя бонусами
payload.bonuses_referrer_rewardРасчетное вознаграждение реферера (партнера) бонусами
payload.referrer_identifierИдентификатор реферера (партнера)
payload.referral_programИдентификатор реферальной программы, если передан реферальный промокод
payload.applied_promotionsМассив идентификаторов примененных акций
payload.rewarded_stickersОбъект со служебной информацией о вознаграждении стикерами
payload.used_stickersОбъект со служебной информацией по списанным стикерам
payload.stickers_balanceОбъект со служебной информацией по текущему балансу стикеров
payload.promo_codes[]Список примененных промокодов (массив строк)
payload.promo_codes_failed[]Список не примененных промокодов (массив объектов)
payload.promo_codes_failed[].codeПромокод
payload.promo_codes_failed[].messageПричина, почему промокод не применен
payload.certificates[]Список примененных сертификатов (массив строк)
payload.certificates_failed[]Список не примененных сертификатов (массив объектов)
payload.certificates_failed[].codeКод сертификата
payload.certificates_failed[].messageПричина, почему сертификат не применен
payload.items[]Список товаров в корзине

Свойства каждого элемента в payload.items[]:

ПараметрОписание
product_idИдентификатор (артикул) товара
quantityКоличество единиц конкретного товара в корзине
priceИсходная цена товара из запроса
totalОбщая стоимость артикула в корзине (price * quantity) до применения скидок
discountableМожно ли применять скидки к данному товару
discountable_reasonПричина, по которой нельзя применить скидку к данному товару
bonusableМожно ли списать бонусы за данный товар
bonusable_reasonПричина, по которой нельзя списать бонусы за данный товар
rewardableБудет ли вознаграждение бонусами за данный товар
rewardable_reasonПричина, по которой не будет вознаграждение бонусами за данный товар
paid_with_offersСколько сэкономлено на акциях за этот товар
paid_with_offers_per_productСколько сэкономлено на акциях за одну единицу этого товара
paid_with_referral_discountsСколько сэкономлено по реферальной программе за этот товар
paid_with_referral_discounts_per_productСколько сэкономлено по реферальной программе за одну единицу этого товара
paid_with_discountsСколько сэкономлено по скидочной программе лояльности за этот товар
paid_with_discounts_per_productСколько сэкономлено по скидочной программе лояльности за одну единицу этого товара
paid_with_bonusesСколько сэкономлено бонусами за этот товар
paid_with_bonuses_per_productСколько сэкономлено бонусами за одну единицу этого товара
paid_with_certificatesСколько оплачено сертификатами за этот товар
paid_with_certificates_per_productСколько оплачено сертификатами за одну единицу этого товара
bonuses_usedСколько будет списано бонусов за данную позицию
bonuses_used_per_productСколько будет списано бонусов за данную позицию на одну единицу товара
bonuses_rewardКакое будет вознаграждение бонусами за данных позицию
bonuses_reward_per_productКакое будет вознаграждение бонусами за данных позицию за одну единицу товара
bonuses_reward_loyalty_programОбъект с информацией о бонусном вознаграждении
bonuses_reward_loyalty_program.totalТо же самое, что и payload.items[].bonuses_reward
bonuses_reward_loyalty_program.per_productТо же самое, что и payload.items[].bonuses_reward_per_product
bonuses_reward_referral_programОбъект с информацией о вознаграждении реферера бонусами
bonuses_reward_referral_program.referral_program_idИдентификатор реферальной программы
bonuses_reward_referral_program.totalСумма вознаграждения реферера за данный товар
bonuses_reward_referral_program.per_productСумма вознаграждения реферера за одну единицу данного товара
bonuses_reward_promotionsСлужебный объект с информацией о бонусном вознаграждении акциями, где ключом является идентификатор акции
bonuses_reward_promotions[].totalСумма вознаграждения по акции за данный товар
bonuses_reward_promotions[].per_productСумма вознаграждения по акции за одну единицу товара
certificatesОбъект с распределением использованных сертификатов, где ключ объекта – идентификатор сертификата
certificates[].idИдентификатор сертификата
certificates[].codeКод сертификата
certificates[].pool_idИдентификатор пула сертификатов, которому принадлежит сертификат
certificates[].amountСколько было оплачено сертификатом за данный товар
certificates[].amount_per_productСколько было оплачено сертификатом за одну единицу товар
max_discountable_amountСлужебное свойство: максимально допустимая скидка по товару с учетом ограничений ПЛ, акций и пр
max_discountable_amount_leftСлужебное свойство: остаток от max_discountable_amount после применения скидок, бонусов и пр
max_payable_by_bonusesСлужебное свойство: максимальная сумма, которую можно списать бонусами
total_after_discountsФинальная стоимость к оплате за данный товар
total_after_discounts_per_productФинальная стоимость к оплате за одну единицу товара

Несмотря на сложную структуру, для кассира или клиента полезной будет только следующая информация:

  1. payload.order_total
  2. payload.saved_total
  3. payload.order_to_pay
  4. payload.bonuses_reward
  5. payload.items[].product_id
  6. payload.items[].total
  7. payload.items[].total_after_discounts

В случае ошибки данных вернет подобную структуру:

json
{
  "status": "error",
  "payload": {
    "message": "Cart contains line items with the same product ID",
    "identifier": "..."
  }
}