> For the complete documentation index, see [llms.txt](https://docs.expirenza.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.expirenza.com/api/messages/getbill.md).

# Отримання рахунку за номером стола

Для отримання рахунку, Expirenza надсилатиме наступне повідомлення:

<details>

<summary>getBill</summary>

```
❗️ Обов'язкові елементи запиту: rID,operation та tableNumber або billId.
```

```
❗️ Наразі інтеграція підтримує передачу параметру guests.dishes.dishId,
   у якому dishId порожній. 
 
❗️ Ми суворо рекомендуємо передавати dishId і не залишати його порожнім,так як
   варіант с порожнім dishId невдовзі стане застарілим, і якщо ви його
    не передавали у вас можуть виникнути проблеми з інтеграцією, та не буде 
     працювати оцінка блюд.
```

Переконайтесь, що ваша інтеграція підтримує всі можливі комбінації цих параметрів:&#x20;

Сценарії :&#x20;

1. Тільки  з `billId`:

Сценарій з `billId`  позначає що оплата буде здійснена по QR з пречеку.

```json
{
    "rID" : "2021-03-13 00:32:04.942046#UP57RxE",
    "operation" : "getBill",
    "billId": "079148b1-2824-11ed-8dbd-3c7c3fbcab3c"
}
```

2. Тільки з `tableNumber`:

Сценарій з `tableNumber` позначає що оплата буде здійснена по QR на столі.

```json
{
    "rID" : "2021-03-13 00:32:04.942046#UP57RxE",
    "operation" : "getBill",
    "tableNumber" : "12",
}
```

***

Q. Як ресторану повідомити Expirenza про нове замовлення, як передати згенерований `billId`  до Expirenza?

\
A. Наразі немає готового `callback` (він скоро буде) через який ресторан може повідомити Expirenza про нове замовлення.

Зараз Expirenza сама опитує ресторан і отримує від ресторану `billId.`

Приклад:&#x20;

Гість ресторану робить замовлення -> замовлення вносять у POS-систему&#x20;

-> гість ресторану поїв і сканує QR для оплати замовлення -> *Expirenza дізнається про `billId`  у момент сканування QR.*

*У випадку billId це QR на пречеку. У випадку* `tableNumber` QR на столі.

</details>

{% openapi src="/files/gJ9dvFaUybCfX8X5sznL" path="/callback/getBill" method="post" %}
[getBill03.05.2024\_updated.json](https://115752690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUrrjxJkhEuwfb0dGwW06%2Fuploads%2FGARgS1CIGuX2TdGUtmF4%2FgetBill03.05.2024_updated.json?alt=media\&token=6098cbb3-4015-43a9-a7bd-0379d4c7aca6)
{% endopenapi %}

<details>

<summary><strong>Payload example: <code>/callback/getBill</code></strong></summary>

<pre class="language-json" data-title="JSON" data-line-numbers><code class="lang-json">{
  "errorCode": "BILL_NOT_FOUND",
  "errorMessage": "Not found bills by table number 7",
  "orders": [
    {
      "billId": "7A051331-1C99-4DD2-9543-1585A4E21DCA",
      "created": "yyyy.MM.dd HH:mm:ss",
      "discounts": {},
      "guests": [
        {
          "dishes": [
            {
              "category": "Кухня",
              "categoryId": "18afdzgu53a",
              "checkNumber": "string",
              "count": 1.3,
              "dishId": "string",
              "linkedTo": "string",
              "hidden": false,
              "name": "Шаурма царська",
              "orderNumber": 12365,
              "positionId": "string",
              "sum": 34.56,
             <a data-footnote-ref href="#user-content-fn-1"> "taxCategory": "налоги",</a>
              <a data-footnote-ref href="#user-content-fn-1">"taxCategoryId": "18afdzgu534"</a>,
              "type": "dish"
            }
          ],
          "name": "Гость 1"
        }
      ],
      "isBanquetOrder": false,
      "isDelivery": false,
      "orderNumber": 256,
      "pricingTime": "string",
      "rawSum": 0,
      "rootBillId": "string",
      "splitAvailable": true,
      "state": "string",
      "tableId": "qc7-sdv9",
      "totalSum": 123.35,
      "waiter": "string",
      "waiterId": "string",
      "billAmountForTips":123.12
    }
  ],
  "rID": "2021-04-01 09:39:06.021078#BpOI0gO",
  "state": "FAIL",
  "substate": "string",
  "tableNumber": 9
}
</code></pre>

</details>

<details>

<summary>Роз'яснення по <code>linkedTo</code></summary>

`positionId` - id позиції в чеку. Позиція = строчка в чеку.\
`linkedTo` - id Батьківської позиції в чеку.\
\**Якщо страва сама по собі є батьківською треба передавати `linkedTo: null`*

Наприклад, клієнт замовив:\
Біг Мак Меню

Що складається з:

1. Біг мак
2. Діпи:\
   \- Сирний соус
3. Апельсиновий Сік

В POS системі Біг Мак Меню - це комбо страва.\
Яка має 3 можливих складових:

1. Бургер - Біг Бак
2. Картопля на вибір Діпи/Картопля фрі (+ соус як модифікатор до картоплі).
3. Напій на вибір Кола/Спрайт/Апельсиновий сік.

Біг Мак - це батьківська страва - `linkedTo` = null\
`positionId` = AAA

\
Діпи це дочірня страва до Біг Маку, тому `linkedTo` = AAA - де ААА - id позиції батьківської страви\
`positionId` = BBB

\
Сирний соус - дочірня страва до діпів - `linkedTo` = BBB, `positionId` = CCC\
\
Апельсиновий сік - дочірня страва до Біг Маку - `linkedTo` = AAA,\
`positionId` = DDD

</details>

> Таблиця можливих статусів.&#x20;
>
> ❗❗ **Для стану FAIL наявність суб-статусу є обов'язковим, суб-статус також не має бути = null.**&#x20;
>
> Це потрібно для правильної комунікації із клієнтами ресторану.
>
> Приклад: Замовлення не було знайдено, але не передано суб-статус - ORDER\_NOT\_FOUND.\
> Клієнт бачить на боці Expirenza невідому помилку, замість помилки "Рахунок на столику не знайдено".

| state   | substate          | Description                                 |
| ------- | ----------------- | ------------------------------------------- |
| SUCCESS | -                 | Рахунок знайдено                            |
| FAIL    | TABLE\_NOT\_FOUND | Стіл переданий у пошук не існує в ресторані |
| FAIL    | ORDER\_NOT\_FOUND | Рахунок на столику не знайдено              |

<figure><img src="/files/5ntH0DQo8tvrc5mAjEVY" alt=""><figcaption><p>Приклад: НЕ правильна помилка, коли при status - Fail не був переданий substate.</p></figcaption></figure>

<figure><img src="/files/o9NSs4vYb3rHnAk4rNmD" alt=""><figcaption><p>Приклад: Правильна помилка, коли при status - Fail був переданий substate.</p></figcaption></figure>

***

## Застосування знижки

Застосувати знижку для замовлення можна використовуючи об'єкт `discounts` що знаходиться в структурі getBill.

`"discounts":{"list":[{"id": "","name":"","sum":0}}`\
\
Знижки через `discounts` працюють **тільки на відображення** у чеку, це означає що знижку інтеграція має вираховувати самостійно на своєму боці та передавати у поля `sum` та `totalSum`  суми страв вже з урахуванням знижки.

\
❗Сума кожної страви має враховувати знижки застосовані до чеку.

❗Сума знижки не має бути у від'ємних значеннях ( Приклад як **не** треба: `sum:"-350"`)

### Приклад використання знижки

До страви яка коштує 249 грн застосовується скидка 40 грн.\
Страва:

```
{
   "sum":249,
   "name":"Індичка у вершковому соусі з грибами, томатами кімчі",
   "count":1.0,
   "guest":"guest",
   "category":"Кухня",
   "category_id":"b4e30148-b13e-11ea-80e8-d8d9ff6efa94",
   "order_number":"000080526"
}
```

Знижка 40 грн:

```
"discounts":{
   "list":[
      {
         "id":"id",
         "name":"Індичка у вершковому соусі з грибами, томатами кімчі",
         "sum":40
      }
   ]
}
```

При застосуванні знижки до страви(страв), потрібно змінювати sum цієї страви(страв) і вираховувати totalSum відповідно до застосованих знижок.\
Тобто сума після застосування знижки має виглядати так:

<pre><code>}   
   <a data-footnote-ref href="#user-content-fn-2">"sum":209,</a>
   "name":"Індичка у вершковому соусі з грибами, томатами кімчі",
   "count":1.0,
   "guest":"guest",
   "category":"Кухня",
   "category_id":"b4e30148-b13e-11ea-80e8-d8d9ff6efa94",
   "order_number":"000080526"
}
</code></pre>

***

[^1]: Використовується якщо у ресторана тип розподілення коштів на податкові категорії

[^2]: Змінюється ціна. ( sum - discounts )
