# Методы для работы с бронированиями

## Добавление или изменение бронирования

Чтобы изменить существующее бронирования, надо передать поле id с идентификатором бронирования.
Если id не передать, то будет создано новое бронирование.
В ответ на запрос возвращается созданное или изменённое бронирование.

<a id="post-gw-timeslots-api-v1-timeslots"></a>

**Пример запроса (curl):**

```bash
curl 'https://api.ati.su/gw/timeslots/api/v1/timeslots' \
  -X 'POST' \
  -H 'Authorization: Bearer {authorizationToken}' \
  -H 'Content-Type: application/json' \
  --data-raw '{
  "timeslot": {
    "attachments": [],
    "terminal": 35264,
    "gate_number": 1,
    "action_type": "loading_unloading",
    "comment": "Тестовый комментарий",
    "date_from": "2023-07-04",
    "date_to": "2023-07-04",
    "time_from": "00:00",
    "time_to": "00:00",
    "warehouse": 34824,
    "approve_status": "approved"
  }
}'
```

**OpenAPI схема:** [JSON](https://ati.su/developers/raw/api/time-slots/time-slots.openapi.json)

**Описание полей запроса**
- `timeslot.terminal` — Идентификатор площадки погрузки-выгрузки
- `timeslot.gate_number` — Идентификатор склада
- `timeslot.action_type` — Тип действия на складе
- `timeslot.comment` — Комментарий
- `timeslot.date_from` — Дата начала бронирования
- `timeslot.time_from` — Время начала брони
- `timeslot.time_to` — Время окончания брони
- `timeslot.warehouse` — Идентификатор склада
- `timeslot.approve_status` — Статус бронирования

**Пример ответа (200)**

```json
{
  "ok": true,
  "result": {
    "timeslot": {
      "id": 12429,
      "time_from": "00:00",
      "time_to": "00:00",
      "warehouse_info": {
        "id": 34824,
        "name": "Тестовый склад",
        "address": "Гельсингфорсская улица, 2А",
        "city_verbose": "Санкт-Петербург, РФ",
        "utc_offset": 180,
        "owner": 4022713
      },
      "attached_files": [],
      "can_be_edited": true,
      "is_expired": true,
      "timeslot_readable_id": "34824-12429",
      "approve_status": "approved",
      "action_type": "loading_unloading",
      "slot_owner": 4022713,
      "contact_id": 0,
      "email": "",
      "contact_name": null,
      "contact_phone": "",
      "country_phone_id": "",
      "gate_number": 1,
      "car_number": null,
      "car_capacity": null,
      "body_type": null,
      "cargo": "",
      "cargo_count": null,
      "cargo_unit": "",
      "cargo_owner": "",
      "cargo_owner_contact_name": "",
      "cargo_owner_contact_number": "",
      "comment": "Тестовый комментарий",
      "firm_name": "",
      "date_from": "2023-07-04",
      "date_to": "2023-07-04",
      "date_creation": "2023-07-04T08:29:44.939037+03:00",
      "date_modified": "2023-07-04T08:29:44.939059+03:00",
      "deleted": false,
      "is_test": true,
      "warehouse": 34824,
      "terminal": 35264,
      "order_point": null,
      "warehouse_name": "Тестовый склад",
      "terminal_name": "Тестовая площадка"
    }
  }
}
```

**Пример ответа (400)**

```json
{
  "error": "multiple_errors",
  "error_list": [
    {
      "error": "time_to",
      "reason": "Неправильный формат времени. Используйте один из этих форматов: hh:mm."
    },
    {
      "error": "approve_status",
      "reason": "Значения test нет среди допустимых вариантов."
    }
  ],
  "reason": "invalid"
}
```

**Описание полей ответа**
- `error` — Текстовый код ошибки
- `error_list` — Список возникших ошибок
- `error_list[].error` — Текстовый код ошибки
- `error_list[].reason` — Человекочитаемый текст ошибки
- `reason` — Человекочитаемый текст ошибки


## Получение существующих бронирований и точек заказа без брони

Возвращается список существующих бронирований и точек заказа, для которых бронирования ещё не созданы.
Запрашивающий пользователь должен быть создателем бронирования, или владельцем груза (из заказа), или перевозчиком (из заказа).

<a id="get-gw-timeslots-api-v1-timeslots-my"></a>

**Пример запроса (curl):**

```bash
curl 'https://api.ati.su/gw/timeslots/api/v1/timeslots/my' \
  -X 'GET' \
  -H 'Authorization: Bearer {authorizationToken}' \
  -H 'Content-Type: application/json'
```

**OpenAPI схема:** [JSON](https://ati.su/developers/raw/api/time-slots/time-slots.openapi.json)

**Пример ответа (200)**

```json
{
  "lol": {
    "kek": 1
  }
}
```


## Получение существующих бронирований фирмы

Возвращается список существующих бронирований. Идентификатор фирмы передается в path.
Также с помощью query параметров можно передать фильтры.

<a id="get-gw-timeslots-api-v1-timeslots-{ati_id}"></a>

**Пример запроса (curl):**

```bash
curl 'https://api.ati.su/gw/timeslots/api/v1/timeslots/0?gates=string&warehouse_id=0&terminal_id=0&date_from=string&date_to=string&time_from=string&time_to=string&deal_id=string&ordinal_id=string&order_point_type=0&approve_status=approved&timeslot_id=0&order_point_id=0&only_timeslots=false&only_order_points_without_slots=false' \
  -X 'GET' \
  -H 'Authorization: Bearer {authorizationToken}' \
  -H 'Content-Type: application/json'
```

**OpenAPI схема:** [JSON](https://ati.su/developers/raw/api/time-slots/time-slots.openapi.json)

**Пример ответа (200)**

```json
{}
```

**Пример ответа (400)**

```json
{
  "error": "bad_request",
  "reason": "Фирма не найдена"
}
```

**Описание полей ответа**
- `error` — Текстовый код ошибки
- `reason` — Человекочитаемый текст ошибки


## Поучение количества бронирований в статусе await_reaction

Возвращается количество бронирований в статусе await_reaction для каждого склада пользователя.

<a id="post-gw-timeslots-api-v1-timeslots-counters"></a>

**Пример запроса (curl):**

```bash
curl 'https://api.ati.su/gw/timeslots/api/v1/timeslots/counters' \
  -X 'POST' \
  -H 'Authorization: Bearer {authorizationToken}' \
  -H 'Content-Type: application/json' \
  --data-raw '{
  "warehouse_ids": [
    34824
  ]
}'
```

**OpenAPI схема:** [JSON](https://ati.su/developers/raw/api/time-slots/time-slots.openapi.json)

**Пример ответа (200)**

```json
{
  "ok": true,
  "result": {
    "34824": 0
  }
}
```

**Пример ответа (400)**

```json
{
  "error": "bad_request",
  "reason": "warehouse_ids должен содержать айдишники складов",
  "details": null
}
```

**Описание полей ответа**
- `error` — Текстовый код ошибки
- `reason` — Человекочитаемый текст ошибки


## Получение истории изменений бронирования

Возвращается история изменения бронирования

<a id="get-gw-timeslots-api-v1-timeslots-history-{timeslot_id}"></a>

**Пример запроса (curl):**

```bash
curl 'https://api.ati.su/gw/timeslots/api/v1/timeslots/history/0' \
  -X 'GET' \
  -H 'Authorization: Bearer {authorizationToken}' \
  -H 'Content-Type: application/json'
```

**OpenAPI схема:** [JSON](https://ati.su/developers/raw/api/time-slots/time-slots.openapi.json)

**Пример ответа (200)**

```json
{
  "ok": true,
  "result": {
    "history_changes": [
      {
        "iso_warehouse_local_datetime": "2023-07-05T08:19:13.132092+03:00",
        "editor_info": {
          "name": "director"
        },
        "changes": {
          "created": [],
          "updated": [
            {
              "field": {
                "name": "comment",
                "old_value": "Тестовый комментарий",
                "new_value": "Измененный комментарий"
              }
            }
          ],
          "deleted": []
        }
      },
      {
        "iso_warehouse_local_datetime": "2023-07-04T08:29:44.939059+03:00",
        "editor_info": {
          "name": "director"
        },
        "changes": {
          "created": [
            {
              "field": {
                "name": "timeslot_created",
                "old_value": null,
                "new_value": null
              }
            },
            {
              "field": {
                "name": "staying_statuses",
                "old_value": null,
                "new_value": [
                  "Ожидается"
                ]
              }
            }
          ],
          "updated": [],
          "deleted": []
        }
      }
    ]
  }
}
```

**Описание полей ответа**
- `result.history_changes[].iso_warehouse_local_datetime` — Время изменения в локальном времени склада

**Пример ответа (404)**

```json
{
  "error": "not_found",
  "reason": "Timeslot not found"
}
```

**Описание полей ответа**
- `error` — Текстовый код ошибки
- `reason` — Человекочитаемый текст ошибки
---

## llms.txt

Индекс ключевых страниц документации для LLM и AI-агентов доступен в [основном llms.txt](https://ati.su/developers/llms.txt).
