У Cloud API ver.2 реалізовані методи, які дозволяють гнучко працювати із зовнішнім меню. Перевага нових методів у тому, що зовнішня система під час запиту меню отримає актуальні ціни та доступність страв у ресторані на момент виконання запиту.
Робота із зовнішнім меню Syrve.app через API Cloud доступна тільки для користувачів хмарної версії Syrve.
У рамках цієї статті наведені кроки з налаштування API-ключа для роботи із зовнішнім меню та безпосереднє виконання запитів.
Методи для роботи із зовнішнім меню:
/api/2/menu— метод, який дозволяє отримати список доступних для API-логіна зовнішніх меню та цінових категорій,/api/2/menu/by_id— метод, який дозволяє отримати зовнішнє меню (у тілі запиту передається id доступного зовнішнього меню).
Увага! Зовнішні меню не працюють із наказами за часом.
Увага! Для роботи з лояльністю iikoCard потрібно, як і раніше, використовувати зовнішнє меню, створене в SyrveOffice. Достатньо просто продублювати позиції із зовнішнього меню Syrve.app, додавши ті самі страви в SyrveOffice, без додаткових налаштувань структури меню.
Сценарії використання
- Ресторан хоче налаштувати різний склад страв у зовнішньому меню для різних типів замовлення. Наприклад, частину страв не можна доставляти кур’єрськими сервісами, але ці страви мають бути доступні у зовнішньому меню для самовивозу. Також можуть бути різні ціни на самовивіз і доставку.
- Ресторан має окремий застосунок для замовлень доставки та окремий – для замовлень до столу. Меню одне, але можуть відрізнятися ціни або набір ресторанів, з якими працюють застосунки.
- Різні ціни на страви та різна доступність страв у різних ресторанах мережі. Наприклад, у “Ресторані 1” Салат коштує 100 грн, у “Ресторані 2” — 150 грн, а в “Ресторані 3” страва знята з продажу.
- Ресторан хоче на своєму сайті розміщувати інформацію про алергени, які присутні у страві.
- Ресторан використовує розміри страв і хоче відображати інформацію про калорійність і вагу з урахуванням розміру страви.
- Ресторан використовує розміри страв і хоче, щоб на сайті фотографії страви відрізнялися залежно від розміру.
- Меню ресторану (набір страв, ціни) відрізняється для різних зовнішніх сервісів.
- Ресторан хоче обмежити зовнішньому сервісу роботу з ресторанною мережею та надати доступ тільки до певних ресторанів у мережі.
Алгоритм роботи
Налаштування зовнішнього меню
Детальні кроки з налаштування зовнішнього меню описані в користувацькій документації Syrve.app тут.
Налаштування облікових записів для роботи з API
Для роботи із зовнішніми меню через API необхідно прив’язати їх до облікового запису Transport.
Авторизуйтеся в особистому кабінеті Syrve.app, перейдіть у розділ “Налаштування Cloud API”. Натисніть на кнопку “Додати інтеграцію”.

Задайте ім’я облікового запису та за необхідності вкажіть джерело замовлення:

Джерело замовлення призначене одночасно як для маркування замовлень, що надходять через API, так і для обмеження видимості замовлень.
Якщо “Джерело замовлення” не вказане, то через API можна отримати інформацію по всіх замовленнях ресторану.
Якщо “Джерело замовлення” вказане, то створюваним через API замовленням буде проставлятися “Джерело”, а доступ до замовлень буде обмежений фільтром.
Виберіть зовнішнє меню з випадаючого списку (можна вибрати кілька варіантів):
Виберіть значення поля “Джерело цін”. Ціни у зовнішньому меню можуть бути:
- із зовнішнього меню — ціни на страви підставляються із зовнішнього меню, створеного в Syrve.app,
- із вибраної цінової категорії — ціни беруться з конкретного ресторану для заданої цінової категорії, зовнішнє меню Syrve.app визначає тільки структуру меню.
Якщо в “Джерелі цін” вибрана “Цінова категорія”, то з випадаючого списку виберіть одну або кілька цінових категорій, з якими буде працювати зовнішня система:
Вкладка “Підключені точки” — мають бути додані всі точки, з якими потрібна робота, інакше буде виводитися повідомлення (приклад): “Passed organization(s) 33ac011b-e98b-4d97-b613-323be1a3b87e doesn’t belong to your api login included organization list.”
Збережіть зміни.
Робота з API
Для отримання списку зовнішніх меню, з якими може працювати зовнішня система, необхідно запросити всі наявні в облікового запису зовнішні меню. Надалі для отримання інформації по конкретному меню буде використовуватися поле id з відповіді на запит. Для цього використовуйте /api/2/menu.
Body порожнє, на виході структура:
JSON
{
“externalMenus”: [
{“id”: 42, “name”: “Menu 1”},
{“id”: 43, “name”: “Menu 2”}
],
“priceCategories”: [
{“id”: guid1, “name”: “PC 1”},
{“id”: guid2, “name”: “PC 2”}
],
}
Потім, використовуючи отриманий ідентифікатор зовнішнього меню, запросіть позиції по ньому через /api/2/menu/by_id з body:
JSON
{
“externalMenuId”: 73,
“organizationIds”: [“c0a959b8-7ba0-4763-a297-eda830672cca”],
“priceCategoryId”: guid або null
}
Information: null у цьому методі можна відправити тільки якщо отримання цін налаштоване із зовнішнього меню. У випадку отримання цін із цінових категорій обов’язково потрібно вказати цінову категорію, навіть якщо вона всього одна (базова).
У відповідь приходить структура зовнішнього меню:
{
“id”: 73,
“name”: “Menu rest”,
“description”: “”,
“itemCategories”: [
{
“id”: “39bdc944-82d0-462a-982d-591326cef59c”,
“name”: “Coffee”,
“description”: “”,
“buttonImageUrl”: “”,
“headerImageUrl”: null,
“items”: [
{
“itemId”: “2f9f071d-f8d0-4d91-9674-21044abaea42”,
“sku”: “00064”,
“name”: “Сappuccino”,
“description”: “Tasty classic cappuccino
",
"allergenGroups": [
{
"id": "d15c3f77-8dcd-3cb9-27b8-99363c7fba6a",
"code": "7",
"name": "Milk"
}
],
"tags": [
],
"labels": [
],
"taxCategory": null,
"itemSizes": [
{
"sizeId": "865522ee-3104-4579-8c12-47de103193fa",
"sku": "00064-S",
"sizeCode": "S",
"sizeName": "Small",
"isDefault": true,
"nutritionPerHundredGrams": {
"fats": 2,
"carbs": 5,
"proteins": 4,
"energy": 54
},
"prices": [
{
"price": 170,
"organizationId": "7eb96c48-c234-46d2-86bb-42034aa113c7"
},
{
"price": 150,
"organizationId": "9fab92f9-774c-4b10-a6b5-876346815092"
}
],
"portionWeightGrams": 400,
"itemModifierGroups": [
{
"name": "Milk",
"description": "",
"restrictions": {
"minQuantity": 1,
"maxQuantity": 1,
"freeQuantity": 0,
"byDefault": 0
},
"items": [
{
"id": "44d44fa6-5676-443c-9b01-84c239b3c7f9",
"sku": "00059",
"name": "Almond milk",
"description": "",
"buttonImageUrl": null,
"prices": [
{
"price": 0,
"organizationId": "7eb96c48-c234-46d2-86bb-42034aa113c7"
},
{
"price": 0,
"organizationId": "9fab92f9-774c-4b10-a6b5-876346815092"
}
],
"restrictions": {
"minQuantity": 0,
"maxQuantity": 0,
"freeQuantity": 0,
"byDefault": 0
},
"allergenGroups": [
],
"nutritionPerHundredGrams": {
"fats": 0,
"carbs": 0,
"proteins": 0,
"energy": 0
},
"portionWeightGrams": 0,
"tags": [
],
"labels": [
],
"itemId": "820b9018-6797-48df-892b-875306e792b5"
},
{
"id": "80e4c7a6-da3f-4548-8233-d4615a304436",
"sku": "00060",
"name": "Coconut milk",
"description": "",
"buttonImageUrl": null,
"prices": [
{
"price": 0,
"organizationId": "7eb96c48-c234-46d2-86bb-42034aa113c7"
},
{
"price": 0,
"organizationId": "9fab92f9-774c-4b10-a6b5-876346815092"
}
],
"restrictions": {
"minQuantity": 0,
"maxQuantity": 0,
"freeQuantity": 0,
"byDefault": 0
},
"allergenGroups": [
],
"nutritionPerHundredGrams": {
"fats": 0,
"carbs": 0,
"proteins": 0,
"energy": 0
},
"portionWeightGrams": 0,
"tags": [
],
"labels": [
],
"itemId": "495ef4d6-8c52-40fb-8f50-96bd8e486af9"
},
{
"id": "4f80ab6b-4031-4a74-a4c6-07df66a45491",
"sku": "00058",
"name": "Standard milk",
"description": "",
"buttonImageUrl": null,
"prices": [
{
"price": 0,
"organizationId": "7eb96c48-c234-46d2-86bb-42034aa113c7"
},
{
"price": 0,
"organizationId": "9fab92f9-774c-4b10-a6b5-876346815092"
}
],
"restrictions": {
"minQuantity": 0,
"maxQuantity": 0,
"freeQuantity": 0,
"byDefault": 1
},
"allergenGroups": [
],
"nutritionPerHundredGrams": {
"fats": 1,
"carbs": 6,
"proteins": 4,
"energy": 49
},
"portionWeightGrams": 0,
"tags": [
],
"labels": [
],
"itemId": "6fffa208-704f-43b9-b028-37da372f81ec"
}
],
"canBeDivided": true,
"itemGroupId": "7bb36295-54f1-4940-8b05-0e4dd618733a",
"sku": "0025",
"childModifiersHaveMinMaxRestrictions": false
},
{
"name": "Syrup",
"description": "",
"restrictions": {
"minQuantity": 0,
"maxQuantity": 9,
"freeQuantity": 0,
"byDefault": 0
},
"items": [
{
"id": "dfb877ef-15f6-4dd9-aa30-24177530b04e",
"sku": "00094",
"name": "Chocolate syrup",
"description": "",
"buttonImageUrl": null,
"prices": [
{
"price": 20,
"organizationId": "7eb96c48-c234-46d2-86bb-42034aa113c7"
},
{
"price": 20,
"organizationId": "9fab92f9-774c-4b10-a6b5-876346815092"
}
],
"restrictions": {
"minQuantity": 0,
"maxQuantity": 0,
"freeQuantity": 0,
"byDefault": 0
},
"allergenGroups": [
],
"nutritionPerHundredGrams": {
"fats": 0,
"carbs": 0,
"proteins": 0,
"energy": 0
},
"portionWeightGrams": 0,
"tags": [
],
"labels": [
],
"itemId": "2818f2de-5717-4f88-b65a-d1d8309357f6"
},
{
"id": "809be120-a0f5-4f56-8182-451aa9201ef6",
"sku": "00095",
"name": "Strawberry syrup",
"description": "",
"buttonImageUrl": null,
"prices": [
{
"price": 20,
"organizationId": "7eb96c48-c234-46d2-86bb-42034aa113c7"
},
{
"price": 20,
"organizationId": "9fab92f9-774c-4b10-a6b5-876346815092"
}
],
"restrictions": {
"minQuantity": 0,
"maxQuantity": 0,
"freeQuantity": 0,
"byDefault": 0
},
"allergenGroups": [
],
"nutritionPerHundredGrams": {
"fats": 0,
"carbs": 0,
"proteins": 0,
"energy": 0
},
"portionWeightGrams": 0,
"tags": [
],
"labels": [
],
"itemId": "39b64a14-723d-46ed-8efc-b0b4a4f6a44b"
},
{
"id": "5353d3c0-0531-465c-8104-40b419a3a403",
"sku": "00096",
"name": "Banana syrup",
"description": "",
"buttonImageUrl": null,
"prices": [
{
"price": 20,
"organizationId": "7eb96c48-c234-46d2-86bb-42034aa113c7"
},
{
"price": 20,
"organizationId": "9fab92f9-774c-4b10-a6b5-876346815092"
}
],
"restrictions": {
"minQuantity": 0,
"maxQuantity": 0,
"freeQuantity": 0,
"byDefault": 0
},
"allergenGroups": [
],
"nutritionPerHundredGrams": {
"fats": 0,
"carbs": 0,
"proteins": 0,
"energy": 0
},
"portionWeightGrams": 0,
"tags": [
],
"labels": [
],
"itemId": "52fef420-04a9-49de-bfd0-0c7c5e5b299c"
},
{
"id": "de9f5029-e52c-411a-a700-e9619d43b349",
"sku": "00093",
"name": "Vanila syrup",
"description": "",
"buttonImageUrl": null,
"prices": [
{
"price": 20,
"organizationId": "7eb96c48-c234-46d2-86bb-42034aa113c7"
},
{
"price": 20,
"organizationId": "9fab92f9-774c-4b10-a6b5-876346815092"
}
],
"restrictions": {
"minQuantity": 0,
"maxQuantity": 0,
"freeQuantity": 0,
"byDefault": 0
},
"allergenGroups": [
],
"nutritionPerHundredGrams": {
"fats": 0,
"carbs": 0,
"proteins": 0,
"energy": 0
},
"portionWeightGrams": 0,
"tags": [
],
"labels": [
],
"itemId": "c170c89a-a868-49c6-9787-91b7197ab869"
},
{
"id": "e3726c2c-6c3b-4fba-b704-a703a5b56e56",
"sku": "00092",
"name": "Coconut syrup",
"description": "",
"buttonImageUrl": null,
"prices": [
{
"price": 20,
"organizationId": "7eb96c48-c234-46d2-86bb-42034aa113c7"
},
{
"price": 20,
"organizationId": "9fab92f9-774c-4b10-a6b5-876346815092"
}
],
"restrictions": {
"minQuantity": 0,
"maxQuantity": 0,
"freeQuantity": 0,
"byDefault": 0
},
"allergenGroups": [
],
"nutritionPerHundredGrams": {
"fats": 0,
"carbs": 0,
"proteins": 0,
"energy": 0
},
"portionWeightGrams": 0,
"tags": [
],
"labels": [
],
"itemId": "869c8404-7a97-48c6-a7f4-13d965f2dac5"
}
],
"canBeDivided": false,
"itemGroupId": "b4d096b3-4c52-49f6-8f66-f75260c1f55c",
"sku": "0020",
"childModifiersHaveMinMaxRestrictions": false
}
],
"buttonImageUrl": null,
"buttonImageCroppedUrl": [
]
},
{
"sizeId": "1a636556-e844-4abf-a95a-ff8e57226ade",
"sku": "00064-L",
"sizeCode": "L",
"sizeName": "Large",
"isDefault": false,
"nutritionPerHundredGrams": {
"fats": 2,
"carbs": 5,
"proteins": 4,
"energy": 54
},
"prices": [
{
"price": 240,
"organizationId": "7eb96c48-c234-46d2-86bb-42034aa113c7"
},
{
"price": 240,
"organizationId": "9fab92f9-774c-4b10-a6b5-876346815092"
}
],
"portionWeightGrams": 400,
"itemModifierGroups": [
{
"name": "Milk",
"description": "",
"restrictions": {
"minQuantity": 1,
"maxQuantity": 1,
"freeQuantity": 0,
"byDefault": 0
},
"items": [
{
"id": "99ff4826-cb6a-4bcb-9f9b-b7a8fef5ed68",
"sku": "00059",
"name": "Almond milk",
"description": "",
"buttonImageUrl": null,
"prices": [
{
"price": 0,
"organizationId": "7eb96c48-c234-46d2-86bb-42034aa113c7"
},
{
"price": 0,
"organizationId": "9fab92f9-774c-4b10-a6b5-876346815092"
}
],
"restrictions": {
"minQuantity": 0,
"maxQuantity": 0,
"freeQuantity": 0,
"byDefault": 0
},
"allergenGroups": [
],
"nutritionPerHundredGrams": {
"fats": 0,
"carbs": 0,
"proteins": 0,
"energy": 0
},
"portionWeightGrams": 0,
"tags": [
],
"labels": [
],
"itemId": "820b9018-6797-48df-892b-875306e792b5"
},
{
"id": "513c8e13-9f80-4b38-af0f-5b1b3fb53dc4",
"sku": "00060",
"name": "Coconut milk",
"description": "",
"buttonImageUrl": null,
"prices": [
{
"price": 0,
"organizationId": "7eb96c48-c234-46d2-86bb-42034aa113c7"
},
{
"price": 0,
"organizationId": "9fab92f9-774c-4b10-a6b5-876346815092"
}
],
"restrictions": {
"minQuantity": 0,
"maxQuantity": 0,
"freeQuantity": 0,
"byDefault": 0
},
"allergenGroups": [
],
"nutritionPerHundredGrams": {
"fats": 0,
"carbs": 0,
"proteins": 0,
"energy": 0
},
"portionWeightGrams": 0,
"tags": [
],
"labels": [
],
"itemId": "495ef4d6-8c52-40fb-8f50-96bd8e486af9"
},
{
"id": "21aa708c-5808-479e-89b8-35fb46864983",
"sku": "00058",
"name": "Standard milk",
"description": "",
"buttonImageUrl": null,
"prices": [
{
"price": 0,
"organizationId": "7eb96c48-c234-46d2-86bb-42034aa113c7"
},
{
"price": 0,
"organizationId": "9fab92f9-774c-4b10-a6b5-876346815092"
}
],
"restrictions": {
"minQuantity": 0,
"maxQuantity": 0,
"freeQuantity": 0,
"byDefault": 0
},
"allergenGroups": [
],
"nutritionPerHundredGrams": {
"fats": 1,
"carbs": 6,
"proteins": 4,
"energy": 49
},
"portionWeightGrams": 0,
"tags": [
],
"labels": [
],
"itemId": "6fffa208-704f-43b9-b028-37da372f81ec"
}
],
"canBeDivided": true,
"itemGroupId": "7bb36295-54f1-4940-8b05-0e4dd618733a",
"sku": "0025",
"childModifiersHaveMinMaxRestrictions": false
},
{
"name": "Syrup",
"description": "",
"restrictions": {
"minQuantity": 0,
"maxQuantity": 9,
"freeQuantity": 0,
"byDefault": 0
},
"items": [
{
"id": "a03682d2-fb15-423f-88de-0260feba6e3d",
"sku": "00094",
"name": "Chocolate syrup",
"description": "",
"buttonImageUrl": null,
"prices": [
{
"price": 20,
"organizationId": "7eb96c48-c234-46d2-86bb-42034aa113c7"
},
{
"price": 20,
"organizationId": "9fab92f9-774c-4b10-a6b5-876346815092"
}
],
"restrictions": {
"minQuantity": 0,
"maxQuantity": 0,
"freeQuantity": 0,
"byDefault": 0
},
"allergenGroups": [
],
"nutritionPerHundredGrams": {
"fats": 0,
"carbs": 0,
"proteins": 0,
"energy": 0
},
"portionWeightGrams": 0,
"tags": [
],
"labels": [
],
"itemId": "2818f2de-5717-4f88-b65a-d1d8309357f6"
},
{
"id": "629d50fe-172b-4bbd-b0b9-af51cf105139",
"sku": "00095",
"name": "Strawberry syrup",
"description": "",
"buttonImageUrl": null,
"prices": [
{
"price": 20,
"organizationId": "7eb96c48-c234-46d2-86bb-42034aa113c7"
},
{
"price": 20,
"organizationId": "9fab92f9-774c-4b10-a6b5-876346815092"
}
],
"restrictions": {
"minQuantity": 0,
"maxQuantity": 0,
"freeQuantity": 0,
"byDefault": 0
},
"allergenGroups": [
],
"nutritionPerHundredGrams": {
"fats": 0,
"carbs": 0,
"proteins": 0,
"energy": 0
},
"portionWeightGrams": 0,
"tags": [
],
"labels": [
],
"itemId": "39b64a14-723d-46ed-8efc-b0b4a4f6a44b"
},
{
"id": "e1b3bfea-2888-40ba-a89c-b3d18a8a394e",
"sku": "00096",
"name": "Banana syrup",
"description": "",
"buttonImageUrl": null,
"prices": [
{
"price": 20,
"organizationId": "7eb96c48-c234-46d2-86bb-42034aa113c7"
},
{
"price": 20,
"organizationId": "9fab92f9-774c-4b10-a6b5-876346815092"
}
],
"restrictions": {
"minQuantity": 0,
"maxQuantity": 0,
"freeQuantity": 0,
"byDefault": 0
},
"allergenGroups": [
],
"nutritionPerHundredGrams": {
"fats": 0,
"carbs": 0,
"proteins": 0,
"energy": 0
},
"portionWeightGrams": 0,
"tags": [
],
"labels": [
],
"itemId": "52fef420-04a9-49de-bfd0-0c7c5e5b299c"
},
{
"id": "93ec800f-f3ec-4636-a318-3f3cca90e5bd",
"sku": "00093",
"name": "Vanila syrup",
"description": "",
"buttonImageUrl": null,
"prices": [
{
"price": 20,
"organizationId": "7eb96c48-c234-46d2-86bb-42034aa113c7"
},
{
"price": 20,
"organizationId": "9fab92f9-774c-4b10-a6b5-876346815092"
}
],
"restrictions": {
"minQuantity": 0,
"maxQuantity": 0,
"freeQuantity": 0,
"byDefault": 0
},
"allergenGroups": [
],
"nutritionPerHundredGrams": {
"fats": 0,
"carbs": 0,
"proteins": 0,
"energy": 0
},
"portionWeightGrams": 0,
"tags": [
],
"labels": [
],
"itemId": "c170c89a-a868-49c6-9787-91b7197ab869"
},
{
"id": "9e1bcf1a-8c8b-4a9d-9b94-c2772fc05e90",
"sku": "00092",
"name": "Coconut syrup",
"description": "",
"buttonImageUrl": null,
"prices": [
{
"price": 20,
"organizationId": "7eb96c48-c234-46d2-86bb-42034aa113c7"
},
{
"price": 20,
"organizationId": "9fab92f9-774c-4b10-a6b5-876346815092"
}
],
"restrictions": {
"minQuantity": 0,
"maxQuantity": 0,
"freeQuantity": 0,
"byDefault": 0
},
"allergenGroups": [
],
"nutritionPerHundredGrams": {
"fats": 0,
"carbs": 0,
"proteins": 0,
"energy": 0
},
"portionWeightGrams": 0,
"tags": [
],
"labels": [
],
"itemId": "869c8404-7a97-48c6-a7f4-13d965f2dac5"
}
],
"canBeDivided": false,
"itemGroupId": "b4d096b3-4c52-49f6-8f66-f75260c1f55c",
"sku": "0020",
"childModifiersHaveMinMaxRestrictions": false
}
],
"buttonImageUrl": null,
"buttonImageCroppedUrl": [
]
}
],
"orderItemType": "Compound",
"modifierSchemaId": "71fbd193-d99b-4168-ac17-da664493400e",
"modifierSchemaName": {
"id": "71fbd193-d99b-4168-ac17-da664493400e",
"deleted": false,
"name": "Coffee",
"productScale": "54840d34-2855-4080-9eb9-96dfcd1b040d",
"modifiers": [
{
"modifier": "7bb36295-54f1-4940-8b05-0e4dd618733a",
"defaultAmount": 0,
"freeOfChargeAmount": 0,
"minimumAmount": 1,
"maximumAmount": 1,
"hideIfDefaultAmount": false,
"childModifiersHaveMinMaxRestrictions": false,
"splittable": true,
"required": true,
"childModifiers": [
{
"modifier": "820b9018-6797-48df-892b-875306e792b5",
"defaultAmount": 0,
"freeOfChargeAmount": 0,
"minimumAmount": 0,
"maximumAmount": 0,
"hideIfDefaultAmount": true,
"childModifiersHaveMinMaxRestrictions": false,
"splittable": false,
"required": false,
"childModifiers": [
],
"cls": ""
},
{
"modifier": "495ef4d6-8c52-40fb-8f50-96bd8e486af9",
"defaultAmount": 0,
"freeOfChargeAmount": 0,
"minimumAmount": 0,
"maximumAmount": 0,
"hideIfDefaultAmount": true,
"childModifiersHaveMinMaxRestrictions": false,
"splittable": false,
"required": false,
"childModifiers": [
],
"cls": ""
},
{
"modifier": "6fffa208-704f-43b9-b028-37da372f81ec",
"defaultAmount": 0,
"freeOfChargeAmount": 0,
"minimumAmount": 0,
"maximumAmount": 0,
"hideIfDefaultAmount": true,
"childModifiersHaveMinMaxRestrictions": false,
"splittable": false,
"required": false,
"childModifiers": [
],
"cls": ""
}
],
"cls": ""
},
{
"modifier": "b4d096b3-4c52-49f6-8f66-f75260c1f55c",
"defaultAmount": 0,
"freeOfChargeAmount": 0,
"minimumAmount": 0,
"maximumAmount": 9,
"hideIfDefaultAmount": false,
"childModifiersHaveMinMaxRestrictions": false,
"splittable": false,
"required": false,
"childModifiers": [
{
"modifier": "52fef420-04a9-49de-bfd0-0c7c5e5b299c",
"defaultAmount": 0,
"freeOfChargeAmount": 0,
"minimumAmount": 0,
"maximumAmount": 0,
"hideIfDefaultAmount": false,
"childModifiersHaveMinMaxRestrictions": false,
"splittable": false,
"required": false,
"childModifiers": [
],
"cls": ""
},
{
"modifier": "2818f2de-5717-4f88-b65a-d1d8309357f6",
"defaultAmount": 0,
"freeOfChargeAmount": 0,
"minimumAmount": 0,
"maximumAmount": 0,
"hideIfDefaultAmount": false,
"childModifiersHaveMinMaxRestrictions": false,
"splittable": false,
"required": false,
"childModifiers": [
],
"cls": ""
},
{
"modifier": "869c8404-7a97-48c6-a7f4-13d965f2dac5",
"defaultAmount": 0,
"freeOfChargeAmount": 0,
"minimumAmount": 0,
"maximumAmount": 0,
"hideIfDefaultAmount": false,
"childModifiersHaveMinMaxRestrictions": false,
"splittable": false,
"required": false,
"childModifiers": [
],
"cls": ""
},
{
"modifier": "39b64a14-723d-46ed-8efc-b0b4a4f6a44b",
"defaultAmount": 0,
"freeOfChargeAmount": 0,
"minimumAmount": 0,
"maximumAmount": 0,
"hideIfDefaultAmount": false,
"childModifiersHaveMinMaxRestrictions": false,
"splittable": false,
"required": false,
"childModifiers": [
],
"cls": ""
},
{
"modifier": "c170c89a-a868-49c6-9787-91b7197ab869",
"defaultAmount": 0,
"freeOfChargeAmount": 0,
"minimumAmount": 0,
"maximumAmount": 0,
"hideIfDefaultAmount": false,
"childModifiersHaveMinMaxRestrictions": false,
"splittable": false,
"required": false,
"childModifiers": [
],
"cls": ""
}
],
"cls": ""
}
],
"splittableProduct": true
}
}
]
},
{
“id”: “3f5388f0-54aa-466e-993c-dbb824a9f730”,
“name”: “Pizza”,
“description”: “”,
“buttonImageUrl”: “”,
“headerImageUrl”: null,
“items”: [
{
“itemId”: “9d28f14c-2ef4-48eb-b0c3-3e2ab9ffa7e7”,
“sku”: “00017”,
“name”: “Pepperoni”,
“description”: “mozarella cheese, tomato sauce, pepperoni ham”,
“allergenGroups”: [
],
“tags”: [
],
“labels”: [
],
“taxCategory”: null,
“itemSizes”: [
{
“sizeId”: null,
“sku”: “00017”,
“sizeCode”: null,
“sizeName”: null,
“isDefault”: true,
“nutritionPerHundredGrams”: {
“fats”: 0,
“carbs”: 0,
“proteins”: 0,
“energy”: 0
},
"prices": [
{
"price": 480,
"organizationId": "7eb96c48-c234-46d2-86bb-42034aa113c7"
},
{
"price": 480,
"organizationId": "9fab92f9-774c-4b10-a6b5-876346815092"
}
],
"portionWeightGrams": 0,
"itemModifierGroups": [
],
"buttonImageUrl": null,
"buttonImageCroppedUrl": [
]
}
],
"orderItemType": "Product",
"modifierSchemaId": null,
"modifierSchemaName": null
}
]
}
]
}
Примітки
- Під час запиту зовнішнього меню по кількох організаціях у блоці prices повертається інформація по цінах запитаних організацій. Якщо price = 0, то ця страва доступна для продажу за нульовою ціною, якщо price = null, то ця страва заборонена до продажу в цій організації.
- У модифікаторів є значення мінімальної та максимальної кількості для групи і для кожного модифікатора зокрема. Якщо minQuality > 0, то ця група модифікаторів є обов’язковою. maxQuality відповідає за максимально можливу кількість модифікаторів, які додаються до страви. Якщо параметр childModifiersHaveMinMaxRestrictions = false, то беруться обмеження за кількістю модифікаторів із значень групи модифікаторів. Якщо childModifiersHaveMinMaxRestrictions = true, то беруться обмеження за кількістю модифікаторів із кожного модифікатора (items).
JSON
“itemModifierGroups”: [
{
“name”: “Add check”,
“description”: “”,
“restrictions”: {
“minQuantity”: 0,
“maxQuantity”: 4,
“freeQuantity”: 0,
“byDefault”: 0
},
“items”: [
{
“sku”: “00116”,
“name”: “Option 5”,
“description”: “”,
“buttonImageUrl”: null,
“prices”: [ … ],
“restrictions”: {
“minQuantity”: 0,
“maxQuantity”: 1,
“freeQuantity”: 0,
“byDefault”: 0
},
“allergenGroups”: [ … ],
“nutritionPerHundredGrams”: { … },
“portionWeightGrams”: 0,
“tags”: [],
“labels”: [],
“itemId”: “c2b7fd30-4db5-4f64-adc5-b4fc8501e795”
},
{
“sku”: “00098”,
“name”: “Option 2”,
“description”: “”,
“buttonImageUrl”: null,
“prices”: [ … ],
“restrictions”: {
“minQuantity”: 0,
“maxQuantity”: 1,
“freeQuantity”: 0,
“byDefault”: 0
},
“allergenGroups”: [],
“nutritionPerHundredGrams”: { … },
“portionWeightGrams”: 0,
“tags”: [],
“labels”: [],
“itemId”: “1b1590e3-5df0-4325-b746-8f24c97e0652”
}
],
“canBeDivided”: false,
“itemGroupId”: “58212c59-7ef3-4b40-a0a8-e904924c3f04”,
“sku”: “0037”,
“childModifiersHaveMinMaxRestrictions”: true
}
]
- Якщо itemGroupId = null, то модифікатори в цій групі вважаються простими, одиничними.
- Якщо параметр itemSize містить один елемент, і всередині цього елемента sizeId і sizeName = null, то ця страва не має розмірів. Якщо ж елементів більше 1, то у цієї страви є розміри, за ім’я та ідентифікатор розміру відповідають поля sizeName, sizeId.
- Параметр sizeCode відповідає за назву розміру для кухні.
JSON
“itemSizes”: [
{
“sizeId”: null,
“sku”: “00115”,
“sizeCode”: null,
“sizeName”: null,
“isDefault”: true,
“nutritionPerHundredGrams”: { … },
“prices”: [ … ],
“portionWeightGrams”: 0,
“itemModifierGroups”: [ … ],
“buttonImageUrl”: null,
“buttonImageCroppedUrl”: []
}
]
Робота з КБЖУ
Є два варіанти роботи з КБЖУ:
- Основний метод: вказати в SyrveOffice або в SyrveHQ (якщо це мережа, то в HQ!). Потім ця інформація піде в Syrve.app, де слід примусово оновити зовнішнє меню (якщо джерело цін — зовнішнє меню), після чого КБЖУ буде відображатися.
- Напряму ввести в Syrve.app, але це працюватиме тільки в рамках вивантаження зовнішнього меню, синхронізація з РМС/HQ не відбудеться. Важливо! Якщо надалі в РМС/HQ буде внесена інформація по КБЖУ або буде виконане ручне оновлення меню у вебі, то дані, внесені в Syrve.app, оновляться даними з РМС/HQ.
У відповіді методу /api/2/menu/by_id присутні дві змінні, які відповідають за виведення даних харчової цінності: nutritionPerHundredGrams — харчова цінність 100 грамів продукту і nutritions — харчова цінність 100 грамів продукту в організації (скільки організацій, стільки разів буде виводитися інформація).
Також слід звернути увагу на значення поля “Джерело цін” у налаштуваннях API-ключа. Якщо встановлено значення “Цінова категорія”, то для nutritions будуть використовуватися дані з РМС/HQ, nutritionPerHundredGrams — дані із зовнішнього меню. Якщо “Зовнішнє меню”, то nutritionPerHundredGrams і nutritions будуть заповнюватися даними із зовнішнього меню.