Введение

В этой статье рассмотрен сценарий создания заказа с применением кассовых скидок, то есть скидок, настроенных в r_keeper.

Основы взаимодействия сайта ресторана с r_k Delivery описаны в статьях Возможности API.

Базовый сценарий создания заказа с применением кассовых скидок:

  1. Получение предрасчета заказа
  2. Создание заказа
  3. Заказ передается на кассу вручную или автоматически
  4. К заказу применяется скидка на кассе.

Предварительные настройки

  • Настройте заведение в r_k Delivery
  • Настройте кассовые скидки
  • Настройте подключение по API для бэкенда сайта или бэкенда приложения ресторана
  • Подключите на сайте авторизацию гостей по номеру телефона.

    Авторизация гостей по номеру телефона необходима для связи с базой гостей в r_k Delivery, а также для идентификации пользователя на сайте: так вы получаете подтверждение, что именно этот гость выполнил все условия для получения кассовой скидки, а также технически подтверждаете, что ресторан предоставляет скидку этому гостю. 

Метод предрасчета

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

Запрос:

HTTP POST /orders/api/v1/orders/delivery
JSON

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

HTTP POST https://delivery.ucs.ru/orders/api/v1/orders/delivery
JSON

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

{
   "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
}
JSON
ПараметрТип параметраОписание
dishListarrayсостав заказа

-id

stringid блюда(формат GUID) из представления меню Delivery, которое используется для синхронизации с кассой
-namestringнаименование блюда
-price

double

разделителем всегда будет точка - "." 

цена блюда
-discountdoubleскидка
-measure
мера
--valuedoubleразмер порции
--unitstring

единица измерения: кг, литр, шт.

Значение не словарное 

-isContainInStopListstringнаходится ли в стоп-листе
-quantity

double

разделителем всегда будет  точка - "." 

количество блюд
-ingredientsarrayингредиенты
--idstringid ингредиента (формат GUID) из представления меню Delivery, которое используется для синхронизации с кассой
--namestringнаименование ингредиента
--price

double

разделителем всегда будет  точка - "." 

цена ингредиента
--quantity

double

разделителем всегда будет  точка - "." 

количество ингредиента
--ingredientsarrayмодификаторы 
---idstringid модификатора (формат GUID) из представления меню Delivery, которое используется для синхронизации с кассой
---namestringнаименование модификатора
---price

double

разделителем всегда будет  точка - "." 

цена модификатора
---quantity

double

разделителем всегда будет  точка - "." 

количество модификатора
address

адрес доставки


В случае самовывоза принимает значение null.


Пример параметров при указании адреса читайте в статье Создание заказа

expectedAtDateTimeвремя, к которому ожидается заказ
soonestbool

привезти заказа как можно скорее


Если принимает значение true, то значение параметра expectedAt можно не отправлять: система рассчитает его автоматически.


Если принимает значение false, то параметр expectedAt — обязателен

useLoyaltybool

использование лояльности в заказу


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

restaurantIdstringid ресторана
phonestringномер телефона гостя
expeditionTypestringтип доставки
useLoyaltyBonusPaymentsstringсписание бонусов лояльности
orderIdstringid заказа
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
      }
   }
}
JSON

где:

  • 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
JSON

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

{
   "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
}
JSON

где discounts — блок, в котором необходимо отправить все данные, полученные в методе предрасчета заказа в блоке amount.discounts.

Подробнее о других параметрах читайте в статье Создание заказа

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

{
   "result":{
      "orderId":"146312"
   },
   "warnings":{
      "apartmentNumber":[
         "Укажите номер квартиры apartmentNumber"
      ]
   }
}
JSON

где orderId — это номер созданного заказа. 

Редактирование заказа

Если заказ необходимо отредактировать после создания:

  1. Сделайте запрос предварительного расчета с номером заказа
  2. Сделайте запрос на редактирование заказа. 

Пример вызова повторного метода предварительного расчета:

HTTP POST https://delivery.ucs.ru/orders/api/v1/orders/delivery
JSON

Пример тела запроса, где будет указан номер заказа:

{
   "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
}
JSON

где 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
      }
   }
}
JSON

Только после повторного запроса предрасчета можно приступать к редактированию заказа. Пример метода запроса редактирования заказа:

HTTP PATCH https://delivery.ucs.ru/orders/api/v1/orders/{orderId}
JSON

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

{
   "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
}
JSON

В блоке discounts в запросе на редактирование укажите данные, полученные в последнем предрасчете в блоке amount.discounts. Подробнее о запросе и других параметрах читайте в статье Изменение заказа.

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

200 ОК
{
   "warnings":{
      "apartmentNumber":[
         "Укажите номер квартиры apartmentNumber"
      ]
   },
   "result":null
}

JSON