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

Для отримання рахунку, 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 )


---

# 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/getbill.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.
