# Замовлення в меню

<figure><img src="/files/2czDQgIwaPTmjmlz6oYq" alt=""><figcaption><p>Створення замовлення</p></figcaption></figure>

<figure><img src="/files/YLumxEoWJFc5v5KeDzxf" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
Для відкриття доступності функціоналу обов'язковою є умова відправки відповідних даних у [versionInfo](/api/messages/othercallback.md):

`{`

`"feature": "ORDER_ON_TABLE",`

`"available": true,`

`"implemented": true`

`}`
{% endhint %}

## Створення та оплата замовлення в меню

> Схема роботи команди `createOrderOnTable`

1. Перевірка чи вже існує подібне замовлення, у разі якщо це замовлення на якомусь з етапів було відхилене, або чи вже існує декілька подібних замовлень (що є результатом розділення замовлення за місцями оплати).
2. Якщо замовлення ще **не існує ->** перевіряємо наявність блюд-> якщо блюд немає -> отримуємо <mark style="color:red;">помилку.</mark>
3. Якщо замовлення ще **не існує ->** перевіряємо наявність блюд-> якщо наявність блюд підтверджується -> <mark style="color:green;">створюємо</mark> замовлення.
4. Якщо замовлення створено або існувало(и) -> намагаємось роздрукувати нероздруковані бігунки[^1].
5. Якщо замовлення має статус "`New`" або "`Bill`" - намагаємось сплатити його.

{% hint style="warning" %}
Якщо замовлення мають id від rootOrder, що виник у результаті розділення після попередньої спроби оплати, то спроба оплатити замовлення буде проходити через нього.
{% endhint %}

Expirenza приймає наступні стани(state) рахунку:

* `NEW` - Замовлення створено, ПреЧек не роздруковано
* `BILL`- Замовлення створено, ПреЧек роздруковано
* `PAYED-Замовлення сплачене`

Операції `getBill` та `payBill` не використовуються

> Опис параметрів запиту `createOrderOnTable`

<details>

<summary>Приклад запиту команди <code>createOrderOnTable</code></summary>

```json
{
    "operation": "createOrderOnTable",
    "rID": "manual16",
      
    "externalId": "003",
    "originName": "expz",
    "tableId":"aaabfb9b-ba7f-076e-0183-59bcbe5a0068",
    "items":[
  
        {
            "id":"428dc245-9112-4709-b007-c6dc8c2744f3",
            "quantity": 1.0,
            "modifiers": [
                {
                    "id": "f9a40cf6-7f4e-4086-8872-d0c165e59040",
                    "groupId":"3a72b59e-d5e3-4a2e-b634-1bc1cbf7432e",
                    "quantity": 1
                }
            ]
        }
    ]
  },
  "fiscalData": [
    {
      "key": "ЕКВАЙЕР",
      "value": "Universal Bank"
    },
    {
      "key": "ТЕРМІНАЛ"
    },
    {
      "key": "КОМІСІЯ",
      "value": "0 грн."
    },
    {
      "key": "ВИД ОПЕРАЦІЇ",
      "value": "Оплата"
    },
    {
      "key": "ЕПЗ",
      "value": "53754141******56"
    },
    {
      "key": "ПС",
      "value": "MC"
    },
    {
      "key": "RRN",
      "value": "010025711364"
    },
    {
      "key": "КОД. АВТ",
      "value": "319431"
    }
  ]
}
```

</details>

<table data-full-width="false"><thead><tr><th width="148">Name</th><th width="93" align="center">Type</th><th width="99" align="center">Required</th><th>Description</th></tr></thead><tbody><tr><td>operation</td><td align="center">String</td><td align="center">✔️</td><td>Назва команди</td></tr><tr><td>rID</td><td align="center">String</td><td align="center">✔️</td><td>Ідентифікатор запиту</td></tr><tr><td>externalId</td><td align="center">String</td><td align="center">✔️</td><td>Ідентифікатор запиту із зовнішньої системи</td></tr><tr><td>originName</td><td align="center">String</td><td align="center">✔️</td><td>Ідентифікатор зовнішньої системи</td></tr><tr><td>tableId</td><td align="center">String</td><td align="center">✔️</td><td>Ідентифікатор столу</td></tr><tr><td>items</td><td align="center">[object]</td><td align="center">✔️</td><td>Блюда</td></tr><tr><td>id</td><td align="center">String</td><td align="center">❌</td><td>Ідентифікатор</td></tr><tr><td>quantity</td><td align="center">Integer</td><td align="center">❌</td><td>Кількість</td></tr><tr><td>modifiers</td><td align="center">[object]</td><td align="center">❌</td><td>Модифікатори</td></tr><tr><td>id</td><td align="center">String</td><td align="center">✔️</td><td>Ідентифікатор модифікатору</td></tr><tr><td>groupId</td><td align="center">String</td><td align="center">❌</td><td>Ідентифікатор групи модифікатору, якщо модифікатору має групу</td></tr><tr><td>quantity</td><td align="center">Integer</td><td align="center">✔️</td><td>Кількість модифікаторів</td></tr><tr><td>fiscalData</td><td align="center">[object]</td><td align="center">❌</td><td>Дані для фіксального чеку</td></tr><tr><td>key</td><td align="center">String</td><td align="center">✔️</td><td></td></tr><tr><td>value</td><td align="center">String</td><td align="center">✔️</td><td></td></tr></tbody></table>

> Опис параметрів відповіді `createOrderOnTable`

{% hint style="info" %}
Відповідь направляти на <https://api.shaketopay.com.ua/callback/createOrderOnTable>
{% endhint %}

<details>

<summary>Приклад відповіді команди  <code>createOrderOnTable</code></summary>

```json

    "rID": "manual119",
    "result": {
        "success": true,
        "stage": "PAYED",
        "rootOrder": {
            "orderId": "a162cb7f-4edd-46a7-9824-4c5dfde4326f",
            "orderNumber": 372,
            "resultSum": 1450.5,
            "orderStatus": "Deleted",
            "tableNumber": 372,
            "waiterId": "123",
            "waiter": "John Doe"
        },
        "ordersSummary": [
            {
                "orderId": "b79b3997-7491-4518-91e0-a04a89a28437",
                "orderNumber": 373,
                "resultSum": 1100.0,
                "orderStatus": "Closed",
                "closed": "2023.04.12 16:17:14",
                "tableNumber": 1,
                "waiterId": "123",
                "waiter": "John Doe"
            },
            {
                "orderId": "6cc87f61-c6d4-4b7f-8a52-229102b09748",
                "orderNumber": 374,
                "resultSum": 350.5,
                "orderStatus": "Closed",
                "closed": "2023.04.12 16:17:15",
                "tableNumber": 1,
                "waiterId": "123",
                "waiter": "John Doe"
            }
        ],
        "guests": [
            {
                "name": "Гiсть",
                "dishes": [
                    {
                        "categoryId": "04e705cf-0f9f-36cd-0183-a2be58c00094",
                        "category": "Не фискальный",
                        "name": "Пицца - Маргарита",
                        "count": 2.0,
                        "sum": 1100.0,
                        "orderNumber": 373,
                        "type": "dish",
                        "dishId": "428dc245-9112-4709-b007-c6dc8c2744f3"
                    },
                    {
                        "categoryId": "-1",
                        "category": "Блюдо без категории",
                        "name": "Петрушка",
                        "count": 2.0,
                        "sum": 0.0,
                        "orderNumber": 373,
                        "type": "modifier",
                        "dishId": "f9a40cf6-7f4e-4086-8872-d0c165e59040"
                    }
                ]
            },
            {
                "name": "Гiсть",
                "dishes": [
                    {
                        "categoryId": "04e705cf-0f9f-36cd-0183-a2be58c00093",
                        "category": "Фискальный",
                        "name": "Kopke",
                        "count": 1.0,
                        "sum": 350.5,
                        "orderNumber": 374,
                        "type": "dish",
                        "dishId": "50391936-2733-48a1-980c-5b7a3c9635f6"
                    }
                ]
            }
        ]
    }
}
```

</details>

<table><thead><tr><th width="154">Name</th><th width="94" align="center">Type</th><th width="102" align="center">Required</th><th>Description</th></tr></thead><tbody><tr><td>rID</td><td align="center">string</td><td align="center">✔️</td><td><p>Ідентифікатор </p><p>запиту</p></td></tr><tr><td>result</td><td align="center">object</td><td align="center">✔️</td><td>none</td></tr><tr><td>success</td><td align="center">boolean</td><td align="center">✔️</td><td>Ознака успіху</td></tr><tr><td>stage</td><td align="center">string</td><td align="center">✔️</td><td><p>Можуть бути стани:<br>STARTED,CHECKED,CREATED,</p><p>PRINTED,PAYED,UNKNOWN_ERROR</p></td></tr><tr><td>paySubstate</td><td align="center">string</td><td align="center">❌</td><td>Під-статус з процесу оплати</td></tr><tr><td>errorMessage</td><td align="center">string</td><td align="center">❌</td><td>Сповіщення про помилку</td></tr><tr><td>rootOrder</td><td align="center">object</td><td align="center">✔️</td><td>Інформація про початкове замовлення</td></tr><tr><td>orderId</td><td align="center">string</td><td align="center">✔️</td><td>Ід замовлення</td></tr><tr><td>orderNumber</td><td align="center">integer</td><td align="center">✔️</td><td>Номер</td></tr><tr><td>resultSum</td><td align="center">number</td><td align="center">✔️</td><td>Сума замовлення</td></tr><tr><td>orderStatus</td><td align="center">string</td><td align="center">✔️</td><td>Статус</td></tr><tr><td>tableNumber</td><td align="center">integer</td><td align="center">✔️</td><td>Номер столу</td></tr><tr><td>waiterId</td><td align="center">string</td><td align="center">✔️</td><td>Ід офіціанта</td></tr><tr><td>waiter</td><td align="center">string</td><td align="center">✔️</td><td>Ім'я офіціанта</td></tr><tr><td>ordersSummary</td><td align="center">[object]</td><td align="center">✔️</td><td>Інфо о замовленнях, отриманих у результаті оплати</td></tr><tr><td>orderId</td><td align="center">string</td><td align="center">✔️</td><td>ід</td></tr><tr><td>orderNumber</td><td align="center">integer</td><td align="center">✔️</td><td>Номер</td></tr><tr><td>resultSum</td><td align="center">integer</td><td align="center">✔️</td><td>Сума</td></tr><tr><td>orderStatus</td><td align="center">string</td><td align="center">✔️</td><td>Статус</td></tr><tr><td>closed</td><td align="center">string</td><td align="center">❌</td><td>Дата закриття</td></tr><tr><td>tableNumber</td><td align="center">integer</td><td align="center">✔️</td><td>Номер столу</td></tr><tr><td>waiterId</td><td align="center">string</td><td align="center">✔️</td><td>Ід офіціанта</td></tr><tr><td>waiter</td><td align="center">string</td><td align="center">✔️</td><td>Ім'я офіціанта</td></tr><tr><td>guests</td><td align="center">[object]</td><td align="center">✔️</td><td>Деталіровка</td></tr><tr><td>name</td><td align="center">string</td><td align="center">✔️</td><td>Ім'я гостя</td></tr><tr><td>dishes</td><td align="center">[object]</td><td align="center">✔️</td><td>Позиції замовлення</td></tr><tr><td>categoryId</td><td align="center">string</td><td align="center">✔️</td><td>Ід категорії</td></tr><tr><td>category</td><td align="center">string</td><td align="center">✔️</td><td>Категорія</td></tr><tr><td>name</td><td align="center">string</td><td align="center">✔️</td><td>Найменування  блюда</td></tr><tr><td>count</td><td align="center">integer</td><td align="center">✔️</td><td>Кількість</td></tr><tr><td>sum</td><td align="center">integer</td><td align="center">✔️</td><td>Сума</td></tr><tr><td>orderNumber</td><td align="center">integer</td><td align="center">✔️</td><td>Номер замовлення</td></tr><tr><td>type</td><td align="center">string</td><td align="center">✔️</td><td>Тип блюда</td></tr><tr><td>dishId</td><td align="center">string</td><td align="center">✔️</td><td>Код блюда</td></tr></tbody></table>

***

## Перевірка наявності блюд

Дана команда потрібна для попередньої перевірки наявності блюд у POS-системі, перед створенням інвойсу.&#x20;

{% hint style="info" %}
Приклад: Блюдо за якихось причин (як приклад:  у POS-ситемі блюдо знаходиться у stop-list) не доступне до замовлення, виключити ситуацію коли гість закладу оплачує замовлення, а ресторан не може приготувати дану страву.
{% endhint %}

> Логіка роботи команди checkProductsRestrictions

1. Якщо в позиції є modifiers, то визначаємо їх загальну кількість.
   1. Кількість = кількість модифікаторів у позиції \* кількість страв, до якого прив'язан `modifiers`
2. Перевіряємо доступність блюд для замовлення і записуємо недостатню кількість у `exceedQuantity`
3. Якщо exceedQuantity  = 0, то available = <mark style="color:green;">true.</mark>
4. Якщо exceedQuantity  > 0, то available = <mark style="color:red;">false.</mark>

> Опис команди - checkProductsRestrictions

<details>

<summary>Приклад запиту команди <code>checkProductsRestrictions</code></summary>

```json
{
    "operation": "checkProductsRestrictions",
    "rID": "manual16",
     
    "items":[
        {
            "id":"428dc245-9112-4709-b007-c6dc8c2744f3",
            "quantity": 1.0,
            "modifiers": [
                {
                    "id": "f9a40cf6-7f4e-4086-8872-d0c165e59040",
                    "quantity": 1
                }
            ]
        }
    ]
}
```

</details>

<table><thead><tr><th>Name</th><th>Type</th><th width="135" align="center">Required</th><th>Description</th></tr></thead><tbody><tr><td>rID</td><td>string</td><td align="center">✔️</td><td>Код запиту</td></tr><tr><td>items</td><td>[object]</td><td align="center">✔️</td><td>none</td></tr><tr><td>id</td><td>string</td><td align="center">✔️</td><td>Код блюда</td></tr><tr><td>quantity</td><td>integer</td><td align="center">✔️</td><td>Кількість</td></tr><tr><td>modifiers</td><td>[object]</td><td align="center">❌</td><td>Модифікатори </td></tr><tr><td>id</td><td>string</td><td align="center">✔️</td><td>Код блюда</td></tr><tr><td>quantity</td><td>integer</td><td align="center">✔️</td><td>Кількість</td></tr></tbody></table>

> Опис параметрів відповіді checkProductsRestrictions

{% hint style="info" %}
Відповідь направляти на <https://api.shaketopay.com.ua/callback/checkProductsRestrictions>
{% endhint %}

<details>

<summary>Приклад відповіді команди <code>checkProductsRestrictions</code></summary>

```json
{
    "rID": "manual16",
    "result": {
        "checkResult": "Allowed",
        "itemResults": [
            {
                "id": "428dc245-9112-4709-b007-c6dc8c2744f3",
                "name": "Пицца - Маргарита",
                "available": true,
                "exceedQuantity": 0.0
            },
            {
                "id": "f9a40cf6-7f4e-4086-8872-d0c165e59040",
                "name": "Петрушка",
                "available": true,
                "exceedQuantity": 0.0
            }
        ]
    }
}
```

</details>

<table><thead><tr><th>Name</th><th>Type</th><th width="137" align="center">Required</th><th>Description</th></tr></thead><tbody><tr><td>result</td><td>object</td><td align="center">✔️</td><td>none</td></tr><tr><td>rID</td><td>string</td><td align="center">✔️</td><td>Ідентификатор запиту</td></tr><tr><td>checkResult</td><td>string</td><td align="center">✔️</td><td>Результат перевірки . Можливі значення описано <a href="https://iiko.github.io/front.api.sdk/v7/html/T_Resto_Front_Api_Data_Orders_ProductsSellingPossibility.htm">тут.</a></td></tr><tr><td>itemResults</td><td>[object]</td><td align="center">✔️</td><td>none</td></tr><tr><td>available</td><td>boolean</td><td align="center">✔️</td><td>Ознака доступності</td></tr><tr><td>exceedQuantity</td><td>integer</td><td align="center">✔️</td><td>Недостатня кількість</td></tr><tr><td>id</td><td>string</td><td align="center">✔️</td><td>Код продукту (блюда або модифікатора)</td></tr><tr><td>name</td><td>string</td><td align="center">✔️</td><td>Найменування продукту</td></tr></tbody></table>

***

[^1]: *Бігунок* – замовлення, яке кухня отримує від офіціанта у вигляді роздрукованого на термопринтері чека.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.expirenza.com/api/messages/order-from-menu.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
