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

<figure><img src="https://115752690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUrrjxJkhEuwfb0dGwW06%2Fuploads%2FFI7JECG4Dg9vaq1HSXdS%2Fimage.png?alt=media&#x26;token=a900bd3e-3426-4677-a544-7ef609b5f5a9" alt=""><figcaption><p>Створення замовлення</p></figcaption></figure>

<figure><img src="https://115752690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUrrjxJkhEuwfb0dGwW06%2Fuploads%2FMgHx6tNwrYJFlJytNGdj%2Fimage.png?alt=media&#x26;token=4099c957-df31-4878-9fa8-529d664c0e92" alt=""><figcaption></figcaption></figure>

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

`{`

`"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]: *Бігунок* – замовлення, яке кухня отримує від офіціанта у вигляді роздрукованого на термопринтері чека.
