Введение

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

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

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

  1. Получение предрасчета заказа, чтобы отобразить стоимость доставки до создания заказа
  2. Создание заказа.

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

Перед созданием заказа:

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

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

Метод должен использоваться после заполнения или изменения деталей заказа, которые влияют на стоимость доставки, например:

  • Сумма заказа
  • Адрес доставки
  • Ресторан.

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

Запрос:

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":0,
         "schemeId":"",
         "description":"",
         "imageUrls":[
            
         ],
         "measure":{
            "value":0,
            "unit":""
         },
         "isContainInStopList":[
            
         ],
         "quantity":1,
         "ingredients":[
            
         ],
         "isListStoped":false
      }
   ],
   "address": {
       "postcode": "109443",
       "cityId": "73439fb3-c0c4-42ca-a269-64f031a6a33b",
       "street": "Юных Ленинцев",
       "comment": " дом находится справа от школы",
       "lat": "55.700897",
       "lon": "37.773808",
       "cityName": "Москва",
       "entrance": "1",
       "houseNumber": "85",
       "apartmentNumber": "6",
       "subway": "Кузьминки",
       "fullAddress": "109443, г Москва, ул Юных Ленинцев, д 85 к 2, кв 6"
    },
   "expectedAt":"2022-06-16T09:41:08.278+03:00",
   "soonest":true,
   "useLoyalty":false,
   "restaurantId":"18f550d8-7fbe-45fa-8c83-35f531380f65",
   "phone":"71111111111",
   "expeditionType":"delivery",
   "useLoyaltyBonusPayments":false
}
JSON
ПараметрТип параметраОписание
dishListarrayсостав заказа
-idstringid блюда(формат GUID) из представления меню Delivery, которое используется для синхронизации с кассой
-namestringнаименование блюда
-price

double

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

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

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

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

-quantity

double

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

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

double

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

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

double

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

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

double

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

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

double

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

количество модификатора
-isListStopedstringнаходится ли в стоп-листе
address

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


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


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

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

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


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


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

useLoyaltybool

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


Принимает значение true – если лояльность используется.


Принимает значение false – если не используется.

restaurantIdstringid ресторана
phonestringномер телефона гостя
expeditionTypestring

тип доставки

pickup - самовывоз

delivery - доставка

useLoyaltyBonusPaymentsstringсписание бонусов лояльности. Если не используется - false
orderIdstringid заказа, если расчёт производится по существующему заказу в целях его редактирования

Отображение стоимости доставки гостю на сайте 

Если доставка платная, то исходя из условий зоны, рассчитывается ее стоимость. Условия платной доставки настраиваются в административной панели r_k Delivery. Подробнее — в статье Зоны доставок.

Пример ответа метода предрасчета:

{
   "result":{
      "amount":{
         "totalAmount":200.0,
         "orderAmount":100.00,
         "deliveryAmount":100.0,
         "discountDeliveryAmount":0.0,
         "minOrderAmountFreeDelivery":600.0,
         "needForFree":600.0,
         "dishList":[
            {
               "id":"c4f7e375-0791-88c3-75cf-a8727744bf79",
               "name":"Крабовый салат",
               "price":100.0,
               "measure":{
                  "value":0.0,
                  "unit":"",
                  "calcByWeight":false,
                  "weight":0.0,
                  "priceMode":"",
                  "qntDecDigits":0,
                  "changeQntOnce":null,
                  "joinMode":""
               },
               "quantity":1.0,
               "ingredients":[
                  
               ],
               "discount":0.0,
               "comment":""
            }
         ]
      },
      "times":{
         "deliveryTime":360
      }
   }
}
JSON
ПараметрТип параметраОписание
resultсоставной объектРезультирующий объект с параметрами ответа 
-amountсоставной объектОбъект с суммами по заказу
--deliveryAmount

double

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

Рассчитанная стоимость доставки
--orderAmount

double

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

Сумма заказа без учёта стоимости доставки
--totalAmount

double

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

Сумма заказа с учётом стоимости доставки

Отображение бесплатной стоимости доставки гостю на сайте

Условия бесплатной доставки настраиваются в административной панели r_k Delivery. Подробнее — в статье Зоны доставок.

Пример ответа метода предрасчета, если доставка бесплатная:

{
   "result":{
      "amount":{
         "totalAmount":100.0,
         "orderAmount":100.00,
         "deliveryAmount":0.0,
         "discountDeliveryAmount":0.0,
         "minOrderAmountFreeDelivery":50.0,
         "needForFree":0.0,
         "dishList":[
            {
               "id":"c4f7e375-0791-88c3-75cf-a8727744bf79",
               "name":"Крабовый салат",
               "price":100.0,
               "measure":{
                  "value":0.0,
                  "unit":"",
                  "calcByWeight":false,
                  "weight":0.0,
                  "priceMode":"",
                  "qntDecDigits":0,
                  "changeQntOnce":null,
                  "joinMode":""
               },
               "quantity":1.0,
               "ingredients":[
                  
               ],
               "discount":0.0,
               "comment":""
            }
         ]
      },
      "times":{
         "deliveryTime":360
      }
   }
}
JSON

Создание заказа

После отображения стоимости доставки гость подтвердил заказ. Теперь необходимо создать заказ с помощью запроса Создание заказа.

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

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

Content-Type: application/json
JSON

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

{
   "comment":"",
   "persons":1,
   "expeditionType":"delivery",
   "paymentTypeId":"card",
   "soonest":true,
   "dishList":[
      {
         "id":"c4f7e375-0791-88c3-75cf-a8727744bf79",
         "categoryId":"",
         "name":"Крабовый салат",
         "price":100,
         "discount":0,
         "measure":{
            "value":0,
            "unit":"",
            "weight":0,
            "calcByWeight":false,
            "qntDecDigits":0,
            "joinMode":"",
            "priceMode":""
         },
         "isContainInStopList":[
            
         ],
         "quantity":1,
         "ingredients":[
            
         ],
         "comment":""
      }
   ],
   "changeFrom":null,
   "guest":{
      "firstName":"1",
      "lastName":"",
      "phone":"71111111111",
      "email":null
   },
   "address":{
      "id":"437bc228-5d0b-47df-91af-d21c899a0474",
      "postcode":"",
      "street":"ал Кремлёвских Курсантов",
      "comment":"Домофон не работает",
      "lat":55.678555,
      "lon":37.783842,
      "cityName":"г Москва",
      "apartmentNumber":"1",
      "houseNumber":"11",
      "entrance":"1",
      "intercom":"1",
      "fullAddress":"ал Кремлёвских Курсантов, 11",
      "subway":"",
      "floor":1,
      "building":""
   },
   "restaurantId":"18f550d8-7fbe-45fa-8c83-35f531380f65"
}
JSON

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

Обратите внимание: при создании заказа в самом запросе не нужно дополнительно указывать стоимость доставки, она добавится автоматически.

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

{
   "result":{
      "orderId":"67598"
   }
}
JSON

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

Если при формировании заказа на сайте изменились такие параметры, как:

  • Сумма заказа, например, изменился состав блюд
  • Адрес доставки
  • Ресторан, в который планируется отправить заказ

То для отображения актуальной суммы доставки, необходимо повторно использовать метод предрасчета /delivery.