Создание заказа с кассовой скидкой
Введение
В этой статье рассмотрен сценарий создания заказа с применением кассовых скидок, то есть скидок, настроенных в r_keeper.
Основы взаимодействия сайта ресторана с r_k Delivery описаны в статьях Возможности API.
Базовый сценарий создания заказа с применением кассовых скидок:
- Получение предрасчета заказа
- Создание заказа
- Заказ передается на кассу вручную или автоматически
- К заказу применяется скидка на кассе.
Предварительные настройки
- Настройте заведение в r_k Delivery
- Настройте кассовые скидки
- Настройте подключение по API для бэкенда сайта или бэкенда приложения ресторана
Подключите на сайте авторизацию гостей по номеру телефона.
Авторизация гостей по номеру телефона необходима для связи с базой гостей в r_k Delivery, а также для идентификации пользователя на сайте: так вы получаете подтверждение, что именно этот гость выполнил все условия для получения кассовой скидки, а также технически подтверждаете, что ресторан предоставляет скидку этому гостю.
Метод предрасчета
Для получения данных о скидке для гостя, необходимо использовать метод предварительного расчета заказа. Этот метод должен использоваться после заполнения деталей заказа: состава, способа доставки и пр. и авторизации гостя.
Запрос:
HTTP POST /orders/api/v1/orders/delivery
Пример запроса:
HTTP POST https://delivery.ucs.ru/orders/api/v1/orders/delivery
Пример тела запроса:
{
"dishList":[
{
"id":"b5a5e2e8-958e-765c-2822-d5cf7c60df7d",
"name":"Салат Мимоза",
"price":200,
"discount":-200,
"measure":{
"value":0,
"unit":""
},
"isContainInStopList":[
],
"quantity":1,
"ingredients":[
]
}
],
"address":null,
"expectedAt":"2022-07-01T18:08:57.989+03:00",
"soonest":true,
"useLoyalty":false,
"restaurantId":"18f550d8-7fbe-45fa-8c83-35f531380f65",
"phone":"71111111111",
"expeditionType":"pickup",
"useLoyaltyBonusPayments":false,
"orderId":"",
"manualDiscounts":[
1113,
1115
],
"hideLoader":true
}
Параметр | Тип параметра | Описание |
---|---|---|
dishList | array | состав заказа |
-id | string | id блюда(формат GUID) из представления меню Delivery, которое используется для синхронизации с кассой |
-name | string | наименование блюда |
-price | double разделителем всегда будет точка - "." | цена блюда |
-discount | double | скидка |
-measure | мера | |
--value | double | размер порции |
--unit | string | единица измерения: кг, литр, шт. Значение не словарное |
-isContainInStopList | string | находится ли в стоп-листе |
-quantity | double разделителем всегда будет точка - "." | количество блюд |
-ingredients | array | ингредиенты |
--id | string | id ингредиента (формат GUID) из представления меню Delivery, которое используется для синхронизации с кассой |
--name | string | наименование ингредиента |
--price | double разделителем всегда будет точка - "." | цена ингредиента |
--quantity | double разделителем всегда будет точка - "." | количество ингредиента |
--ingredients | array | модификаторы |
---id | string | id модификатора (формат GUID) из представления меню Delivery, которое используется для синхронизации с кассой |
---name | string | наименование модификатора |
---price | double разделителем всегда будет точка - "." | цена модификатора |
---quantity | double разделителем всегда будет точка - "." | количество модификатора |
address | адрес доставки В случае самовывоза принимает значение null. Пример параметров при указании адреса читайте в статье Создание заказа | |
expectedAt | DateTime | время, к которому ожидается заказ |
soonest | bool | привезти заказа как можно скорее Если принимает значение true, то значение параметра expectedAt можно не отправлять: система рассчитает его автоматически. Если принимает значение false, то параметр expectedAt — обязателен |
useLoyalty | bool | использование лояльности в заказу При использовании кассовых скидок принимает значение false. |
restaurantId | string | id ресторана |
phone | string | номер телефона гостя |
expeditionType | string | тип доставки |
useLoyaltyBonusPayments | string | списание бонусов лояльности |
orderId | string | id заказа |
manualDiscounts | кассовые ручные скидки Используется массив идентификаторов скидок из r_kepeer. При применении автоматических скидок лояльности, массив необходимо оставить пустым, используя значение [] |
Параметры, отвечающие за скидки:
- useLoyalty — указывает, собирается ли гость использовать программу лояльности. Одновременное применение скидок r_k Loyalty и кассовых скидок не поддерживается
- useLoyaltyBonusPayments — указывает, собирается ли гость использовать бонусы лояльности. Одновременное применение скидок r_k Loyalty и кассовых скидок не поддерживается
- phone — номер телефона гостя
- manualDiscounts — массив параметров, отвечающих за использование кассовых скидок.
Пример ответа, если кассовые скидки были применены:
{
"result":{
"amount":{
"totalAmount":0.0,
"orderAmount":200.00,
"deliveryAmount":0.0,
"discountDeliveryAmount":null,
"minOrderAmountFreeDelivery":0.0,
"needForFree":0.0,
"dishList":[
{
"id":"b5a5e2e8-958e-765c-2822-d5cf7c60df7d",
"name":"Салат Мимоза",
"price":200.0,
"measure":{
"value":0.0,
"unit":""
},
"quantity":1.0,
"ingredients":[
],
"discount":-200.0
}
],
"loyaltyAmount":{
"totalAmount":200.00,
"loyaltyDiscountAmount":0.0,
"bonuses":null,
"loyaltyPrograms":[
],
"fingerPrint":"",
"useRkLoyalty":false,
"useLoyaltyBonusPayments":false
},
"discounts":{
"useRk7Discounts":true,
"total":0.0,
"discount":-200.0,
"discountList":[
{
"name":"Скидка Ручная кассовая 1",
"amount":-200.0,
"isManual":true,
"rk7Id":1113
},
{
"name":"Скидка Ручная кассовая 2",
"amount":0.0,
"isManual":true,
"rk7Id":1115
}
]
}
},
"times":{
"deliveryTime":360
}
}
}
где:
- amount — блок, содержащий данные об итоговых суммах заказа и детали о применяемых к заказу кассовых скидках
- totalAmount — сумма заказа с учетом всех скидок и суммы за доставку
- orderAmount — сумма заказа без учета скидок и суммы за доставку
- deliveryAmount — сумма за доставку без учета скидок. Соответствует стоимости блюда, которое фискализируется как сумма за доставку
- discountDeliveryAmount — сумма скидки за доставку. Часть скидок детализируется, то есть скидка применится на блюдо, которое фискализируется как сумма за доставку
- minOrderAmountFreeDelivery — минимальная сумма заказа для бесплатной доставки
- dishList[] — блок, содержащий информацию о заказе. Подробнее о параметрах блока читайте в статье Создание заказа
- discount — значение суммы скидки в детализации по каждому блюду. Все остальные блюда в заказе, без блюда, которое фискализируется как сумма за доставку
loyaltyAmount — блок, содержащий информацию о скидках программы лояльности. При использовании кассовых скидок значения в блоке нулевые и отрицательные.
- discounts — блок, содержащий детальные данные о применяемых к заказу кассовых скидках
- useRk7Discounts — параметр, указывающий на применение кассовых скидок к заказу в целом. Если принимает значение true — значит, будут применяться
- total — общая сумма заказа с учетом применения всех скидок и суммы за доставку
- discount — общая сумма скидки на заказ, которая указывается со знаком минус, с учетом скидки на блюдо, которое фискализируется как сумма за доставку
- discountList[] — полный список всех примененных скидок с указанием наименования, id и значения суммы скидки
Если у скидки сумма равна нулю, значит, данная скидка не применилась по правилам кассы. Это может быть из-за совместимости скидок между собой, условий скидки и др. При этом скидка все равно будет отображена в списке- name — название скидки в r_keeper
- amount — размер скидки в r_keeper
- isManual — параметр, показывающий, автоматическая скидка или ручная
- Если скидка ручная — принимает значение true
- Если скидка автоматическая — будет добавляться в данный ответ метода предрасчета и применяться к заказу автоматически, в соответствии с условиям скидки на кассе. Ее id не нужно указывать в данных запроса метода предрасчета, но она будет указана в ответе.
- rk7Id — идентификатор скидки в r_keeper.
После каждого изменения данных по заказу
- адрес
- ID ресторана
- номер телефона гостя
- состав блюд
- набор ручных скидок для применения
необходимо повторно вызывать метод предрасчета с обновленными данными в запросе.
Создание заказа
После уточнения деталей заказа и срабатывания метода предрасчета, необходимо создать заказ.
Обратите внимание: без вызова метода предварительного расчета, создавать заказ нельзя. В противном случае скидки могут быть применены некорректно или вообще не применены.
Пример запроса:
HTTP POST https://delivery.ucs.ru/orders/api/v1/orders
Пример тела запроса:
{
"eCheck":null,
"comment":"",
"persons":1,
"expeditionType":"delivery",
"paymentTypeId":"cash",
"courierId":"",
"soonest":true,
"expectedAt":"2022-07-01T07:30:36.992+03:00",
"dishList":[
{
"id":"b5a5e2e8-958e-765c-2822-d5cf7c60df7d",
"categoryId":"",
"name":"Салат Мимоза",
"price":200,
"discount":-66.66999999999999,
"measure":{
"value":0,
"unit":""
},
"isContainInStopList":[
],
"quantity":1,
"ingredients":[
]
}
],
"changeFrom":null,
"guest":{
"firstName":"Денис",
"lastName":"",
"phone":"71111111111",
"email":"",
"eCheck":null
},
"address":{
"id":"",
"postcode":"140408",
"street":"ул Ленина",
"comment":"",
"lat":55.0791,
"lon":38.79487,
"cityName":"г Коломна",
"apartmentNumber":"",
"houseNumber":"1",
"entrance":"",
"intercom":"",
"fullAddress":"140408, Московская обл, г Коломна, ул Ленина, д 1",
"subway":"",
"floor":"",
"building":""
},
"restaurantId":"18f550d8-7fbe-45fa-8c83-35f531380f65",
"loyaltyCalculation":{
"loyaltyDiscountAmount":0,
"totalAmount":300,
"loyaltyPrograms":[
],
"bonuses":{
"guestBalance":0,
"rankName":"",
"maxBonusesForPayment":0,
"accrualWithPayment":0,
"accrualWithoutPayment":0
},
"fingerPrint":"",
"useRkLoyalty":false,
"useLoyaltyBonusPayments":false
},
"discounts":{
"discount":-100,
"total":200,
"discountList":[
{
"name":"Ручная Скидка 1",
"amount":0,
"isManual":true,
"rk7Id":1115
},
{
"name":"Ручная Скидка 2",
"amount":0,
"isManual":true,
"rk7Id":1117
},
{
"name":"Ручная скидка 3",
"amount":-100,
"isManual":true,
"rk7Id":1120
}
],
"useRk7Discounts":true
},
"discountDeliveryAmount":-33.33
}
где discounts — блок, в котором необходимо отправить все данные, полученные в методе предрасчета заказа в блоке amount.discounts.
Подробнее о других параметрах читайте в статье Создание заказа.
Пример ответа:
{
"result":{
"orderId":"146312"
},
"warnings":{
"apartmentNumber":[
"Укажите номер квартиры apartmentNumber"
]
}
}
где orderId — это номер созданного заказа.
Редактирование заказа
Если заказ необходимо отредактировать после создания:
- Сделайте запрос предварительного расчета с номером заказа
- Сделайте запрос на редактирование заказа.
Пример вызова повторного метода предварительного расчета:
HTTP POST https://delivery.ucs.ru/orders/api/v1/orders/delivery
Пример тела запроса, где будет указан номер заказа:
{
"dishList":[
{
"id":"b5a5e2e8-958e-765c-2822-d5cf7c60df7d",
"categoryId":"",
"name":"Салат Мимоза",
"price":200,
"discount":-66.67,
"schemeId":"",
"description":"",
"imageUrls":[
],
"measure":{
"value":0,
"unit":""
},
"isContainInStopList":[
],
"quantity":2,
"ingredients":[
]
}
],
"address":{
"id":"",
"postcode":"140408",
"street":"ул Ленина",
"comment":"",
"lat":55.0791,
"lon":38.79487,
"cityName":"г Коломна",
"cityId":"",
"apartmentNumber":"",
"houseNumber":"1",
"entrance":"",
"intercom":"",
"fullAddress":"140408, Московская обл, г Коломна, ул Ленина, д 1",
"subway":"",
"floor":"",
"building":""
},
"expectedAt":"2022-07-01T07:29:56.586+03:00",
"useLoyalty":false,
"restaurantId":"18f550d8-7fbe-45fa-8c83-35f531380f65",
"phone":"71111111111",
"expeditionType":"delivery",
"useLoyaltyBonusPayments":false,
"orderId":"146312",
"manualDiscounts":[
1115,
1117,
1120
],
"hideLoader":true
}
где orderId — номер заказа, который был получен ранее.
Пример ответа:
{
"result":{
"amount":{
"totalAmount":400.0,
"orderAmount":400.00,
"deliveryAmount":100.0,
"discountDeliveryAmount":-20.0,
"minOrderAmountFreeDelivery":1000.0,
"needForFree":1000.0,
"dishList":[
{
"id":"b5a5e2e8-958e-765c-2822-d5cf7c60df7d",
"name":"Салат Мимоза",
"price":200.0,
"measure":{
"value":0.0,
"unit":""
},
"quantity":2.0,
"ingredients":[
],
"discount":-80.0
}
],
"loyaltyAmount":{
"totalAmount":500.00,
"loyaltyDiscountAmount":0.0,
"bonuses":null,
"loyaltyPrograms":[
],
"fingerPrint":"",
"useRkLoyalty":false,
"useLoyaltyBonusPayments":false
},
"discounts":{
"useRk7Discounts":true,
"total":400.0,
"discount":-100.0,
"discountList":[
{
"name":"Ручная Скидка 1",
"amount":0.0,
"isManual":true,
"rk7Id":1115
},
{
"name":"Ручная Скидка 2",
"amount":0.0,
"isManual":true,
"rk7Id":1117
},
{
"name":"Ручная Скидка 3",
"amount":-100.0,
"isManual":true,
"rk7Id":1120
}
]
}
},
"times":{
"deliveryTime":360
}
}
}
Только после повторного запроса предрасчета можно приступать к редактированию заказа. Пример метода запроса редактирования заказа:
HTTP PATCH https://delivery.ucs.ru/orders/api/v1/orders/{orderId}
Пример тела запроса:
{
"persons":1,
"dishList":[
{
"id":"b5a5e2e8-958e-765c-2822-d5cf7c60df7d",
"categoryId":"",
"name":"Салат Мимоза",
"price":200,
"discount":-80,
"measure":{
"value":0,
"unit":""
},
"isContainInStopList":[
],
"quantity":2,
"ingredients":[
]
}
],
"loyaltyCalculation":{
"loyaltyDiscountAmount":0,
"totalAmount":500,
"loyaltyPrograms":[
],
"bonuses":{
"guestBalance":0,
"rankName":"",
"maxBonusesForPayment":0,
"accrualWithPayment":0,
"accrualWithoutPayment":0
},
"fingerPrint":"",
"useRkLoyalty":false,
"useLoyaltyBonusPayments":false
},
"discounts":{
"discount":-100,
"total":400,
"discountList":[
{
"name":"Ручная Скидка 1",
"amount":0,
"isManual":true,
"rk7Id":1115
},
{
"name":"Ручная Скидка 2",
"amount":0,
"isManual":true,
"rk7Id":1117
},
{
"name":"Ручная Скидка 3",
"amount":-100,
"isManual":true,
"rk7Id":1120
}
],
"useRk7Discounts":true
},
"discountDeliveryAmount":-20
}
В блоке discounts в запросе на редактирование укажите данные, полученные в последнем предрасчете в блоке amount.discounts. Подробнее о запросе и других параметрах читайте в статье Изменение заказа.
Пример ответа:
200 ОК
{
"warnings":{
"apartmentNumber":[
"Укажите номер квартиры apartmentNumber"
]
},
"result":null
}