> ## Documentation Index
> Fetch the complete documentation index at: https://docs.yume.cloud/llms.txt
> Use this file to discover all available pages before exploring further.

# Доступность и расписание

> Расписание инвентаря и менеджеры доступности: как система определяет, свободна ли единица на период с учётом статусов заказа, склада и активных задач обслуживания, и как расписание пересобирается фоново.

Полный перечень полей — в [глоссарии](/ru/logic/inventory/availability-glossary).

## Что это и зачем

Чтобы понять, свободна ли единица оборудования на нужный период, недостаточно каждый раз перебирать все аренды. Поэтому система держит отдельный быстрый индекс занятости — **расписание инвентаря**. Каждая его строка означает одно: «вот эта единица занята вот в этой аренде с такого-то по такое-то время». По такому индексу проверка доступности сводится к поиску пересечений интервалов, а не к обходу всех заявок.

Расписание — это **денормализованная копия**, а не первоисточник. Первоисточник занятости — позиции инвентаря внутри аренд. Расписание автоматически пересобирается из них фоновой логикой и вручную не редактируется.

<Info>
  Одна строка расписания = одна единица инвентаря в одной аренде. Если единица участвует в нескольких активных арендах (в разные периоды), у неё будет несколько строк.
</Info>

## Модель данных

| Поле                       | Тип          | Назначение                                                                                                              |
| -------------------------- | ------------ | ----------------------------------------------------------------------------------------------------------------------- |
| Идентификатор (UUID)       | UUID         | Первичный ключ строки расписания.                                                                                       |
| Единица инвентаря          | связь        | Единица оборудования, чью занятость описывает строка.                                                                   |
| Продукт                    | связь        | Продукт (количественный учёт), к которому относится единица; заполняется по данным единицы.                             |
| Точка проката              | связь        | Точка проката единицы; используется для фильтрации расписания по правам сотрудника.                                     |
| Аренда (заявка)            | связь        | Заявка, из-за которой единица занята в этот период.                                                                     |
| Позиция инвентаря в аренде | связь        | Конкретная строка единицы внутри заявки — источник данных о периоде.                                                    |
| Статус выдачи              | перечисление | «Ожидает выдачи» или «Выдана» — выдана ли уже единица клиенту в рамках этой строки.                                     |
| Статус аренды (снимок)     | перечисление | Копия статуса заявки (бронь / в аренде / просрочка / должник) на момент пересборки; именно по нему считается занятость. |
| Начало периода             | дата/время   | Начало занятости.                                                                                                       |
| Конец периода              | дата/время   | Конец занятости.                                                                                                        |

**Начало периода** берётся по правилу «факт важнее плана»: если по позиции уже зафиксирована фактическая выдача — началом считается она, иначе плановое начало аренды.

**Конец периода** на практике всегда равен плановому концу аренды. Формально он тоже вычисляется как «фактический возврат, иначе плановый конец», но как только по позиции фиксируется фактический возврат, эта позиция целиком выпадает из расписания (см. ниже) — поэтому фактический возврат в строку так и не попадает, и в расписании остаётся плановый конец.

**Статус выдачи** выводится автоматически: пока фактической выдачи нет — «ожидает выдачи», как только выдача зафиксирована — «выдана».

## Как пересобирается расписание

Расписание для одной аренды перестраивается целиком отдельной операцией пересборки, которая работает **атомарно** (всё или ничего). Она сравнивает то, что уже лежит в расписании по этой аренде, с тем, каким расписание должно быть по актуальным позициям заявки, и приводит одно к другому — вставками, обновлениями и удалениями.

### Какие позиции попадают в расписание

В «эталон» (то, каким расписание должно быть) берутся позиции инвентаря этой аренды, у которых одновременно:

* указана конкретная единица инвентаря;
* **нет отметки о фактическом возврате** (единица ещё «на руках»);
* позиция **не является обменной**;
* аренда **не удалена**;
* статус аренды — один из: «забронирована», «в аренде», «просрочена», «должник».

Все остальные позиции (возвращённые, обменные, из отменённых/завершённых/удалённых заявок) в эталон не входят — а значит, их строки будут удалены.

### Как сопоставляются строки

Ключ сопоставления — тройка «аренда + позиция + единица». По каждому ключу решается:

* **Вставка** — ключ есть в эталоне, но строки ещё нет.
* **Обновление** — ключ есть и там, и там, но изменилось хотя бы одно из полей: продукт, точка проката, статус выдачи, снимок статуса аренды, начало или конец периода.
* **Удаление** — строка есть, а в эталоне такого ключа больше нет.

Сначала выполняются удаления, затем обновления, затем вставки. Строки без начала или конца периода при вставке и обновлении пропускаются.

<Warning>
  Расписание нельзя править вручную: любые ручные правки строк будут затёрты при следующей пересборке, потому что она приводит расписание строго к состоянию позиций аренды.
</Warning>

### Когда запускается пересборка

Пересборка расписания для аренды запускается **при каждом сохранении этой аренды**, а также при массовых изменениях состава инвентаря в заявке. На практике это происходит синхронно в момент сохранения — расписание обновляется сразу, а не «когда-нибудь потом». Технически это оформлено как фоновая задача в очереди по умолчанию, поэтому при необходимости её можно поставить и в отложенное выполнение.

<Note>
  Возврат единицы (проставлен факт возврата), а также отмена, завершение или удаление аренды приводят к тому, что при ближайшей пересборке соответствующая строка расписания исчезает — и единица освобождается для новых периодов.
</Note>

## Как определяется доступность единицы

Расчёт занятости опирается на пересечение интервалов и на **снимок статуса аренды** в строке расписания. Единица считается занятой на запрошенный период, если по ней есть строка расписания, чей период пересекается с запрошенным и чей снимок статуса аренды — «в аренде», «просрочена» или «забронирована».

### Пересечение периодов и буфер между бронями

Период строки расписания пересекается с запрошенным периодом, если начало строки раньше конца запроса, а конец строки позже начала запроса. При этом к началу запроса применяется **буфер** (настраиваемое число минут, по умолчанию 0): окно занятости как бы расширяется назад на величину буфера. Это создаёт обязательный технический промежуток между двумя арендами одной единицы — например, время на осмотр и подготовку между возвратом и следующей выдачей.

### Отбор только свободных единиц (режим «по расписанию»)

Один режим расчёта возвращает список единиц, которые точно можно выдать на период. Из выборки **исключаются** единицы, если по ним есть пересекающаяся бронь/аренда/просрочка, а также единицы, которые проданы, лежат на складе, помечены как сломанные (состояние) или выведены из оборота. Остаются только полностью доступные единицы.

### Аннотация статуса (режим «с доступностью»)

Другой режим не отсекает, а **проставляет каждой единице оперативный статус** по каскаду условий (проверяются сверху вниз, срабатывает первое подходящее):

1. пересекающаяся аренда со статусом «в аренде» → **в аренде**;
2. пересекающаяся бронь → **забронирована**;
3. просроченная аренда → **просрочена**;
4. единица списана → **списана**;
5. единица выведена из оборота → **отключена/удалена**;
6. единица на складе → **на складе**;
7. активная задача мастерской на этапе, помеченном как занимающий инвентарь (или задача без этапа) → **на ремонте**;
8. состояние единицы «сломана» → **сломана**;
9. проставлена дата продажи → **продана**;
10. иначе → **свободна**.

<Warning>
  Порядок в каскаде важен: занятость (в аренде / бронь / просрочка) проверяется **раньше** склада, ремонта, продажи и списания. Поэтому единица с активной бронью или арендой будет показана как «забронирована»/«в аренде», даже если параллельно она числится проданной, на складе или в ремонте.
</Warning>

<Info>
  Просрочка учитывается особым образом: единица со снимком статуса «просрочена» помечается как просроченная **независимо от запрошенного периода** — фильтр по датам к этой проверке не применяется. Логично: просроченная вещь занята «до сих пор», пока её не вернут.
</Info>

<Note>
  Влияние мастерской на этот каскад настраивается компанией: у каждого этапа ремонтной воронки есть признак «Занимать инвентарь» (по умолчанию включён). Задачи на этапах со снятым признаком статус единицы не меняют, задачи без этапа занимают её всегда. Подробнее: [«Воронка и задачи»](/ru/logic/workshop/pipeline).
</Note>

## Вычисляемый статус в самом расписании

У расписания есть собственный способ проставить строкам вычисляемый статус единицы (без учёта арендных пересечений) — он нужен, когда важно физическое состояние вещи, а не занятость по срокам. Каскад:

1. списана → **списана**;
2. выведена из оборота → **отключена/удалена**;
3. на складе → **на складе**;
4. ремонт по складским записям → **на ремонте**;
5. состояние «сломана» → **сломана**;
6. проставлена дата продажи → **продана**;
7. иначе → **свободна**.

<Note>
  Признак «на ремонте» здесь определяется по складским записям единицы, тогда как при аннотации статуса самих единиц ремонт берётся из активных задач мастерской. Это два разных источника, и в пограничных случаях они могут расходиться.
</Note>

## Как это используется

Основной потребитель расписания — экран «расписание/занятость инвентаря» за выбранный период времени. Он показывает единицы и то, какими арендами они заняты в заданном интервале.

* Период задаётся фильтром диапазона времени (начало и конец).
* Показываются только единицы, не выведенные из оборота.
* Права по точкам проката учитываются автоматически: суперпользователь компании видит все точки (или одну выбранную), обычный сотрудник — только свои точки проката. Тот же фильтр применяется и к арендам.
* К каждой единице подтягиваются пересекающиеся с периодом позиции аренд (кроме отменённых заявок и обменных позиций) вместе с данными клиента и, если включены залоги, суммами по залогам.

<Info>
  Этот экран читает занятость напрямую из живых позиций аренд, а не из таблицы расписания. Расписание как индекс используют методы расчёта доступности (подбор свободных единиц и аннотация статуса), а не сам список занятости на экране.
</Info>

Отдельно доступна вспомогательная сводка «минимальная и максимальная дата» по позициям инвентаря — она даёт границы всего диапазона занятости (самое раннее начало и самый поздний конец), например чтобы сразу выставить разумные пределы у календаря.

## Особенности поведения

* «Факт важнее плана» реально действует только для начала периода: позиции с зафиксированным фактическим возвратом в расписание не попадают, поэтому конец периода в строке на практике всегда равен плановому концу аренды.
* Признак «на ремонте» в расписании определяется по складским записям единицы, а при аннотации статуса самих единиц — по активным задачам мастерской на занимающих инвентарь этапах; источники разные и в пограничных случаях могут расходиться.
* Буфер между бронями расширяет окно занятости назад на заданное число минут (по умолчанию 0), создавая обязательный технический промежуток между двумя арендами одной единицы.
* Расписание нельзя редактировать вручную: пересборка приводит его строго к состоянию позиций аренды, поэтому любые ручные правки строк затираются.
* При вставке и обновлении пропускаются строки, у которых не заполнены начало или конец периода.
* Ключ сопоставления строк — тройка «аренда + позиция + единица»; при смене единицы в позиции старая строка удаляется, а новая вставляется, а не обновляется.
* Возврат единицы (проставлен факт возврата) либо отмена/завершение/удаление аренды приводят к удалению строки расписания при ближайшей пересборке — единица освобождается.

<Info>
  Расписание пересобирается синхронно при каждом сохранении аренды (вызов задачи не отложенный), а также при массовых изменениях состава инвентаря заявки. Экран списка занятости при этом читает данные напрямую из живых позиций аренд (исключая отменённые заявки и обменные позиции), а не из таблицы расписания — её как индекс используют только методы расчёта доступности.
</Info>

## Связанные страницы

<CardGroup cols={2}>
  <Card title="Глоссарий: Доступность и расписание" icon="book" href="/ru/logic/inventory/availability-glossary">
    Полный перечень полей расписания и терминов доступности с плановыми определениями.
  </Card>

  <Card title="Инвентарь и услуги (CRM)" icon="boxes-stacked" href="/ru/logic/inventory">
    Обзорный раздел модуля инвентаря и услуг со ссылками на все его страницы.
  </Card>

  <Card title="Инвентарь (единицы)" icon="box" href="/ru/logic/inventory/inventory-items">
    Отдельные единицы оборудования: статусы и состояние, пробег, страховка, авто-поля, импорт, массовое обновление, перемещение, продажа.
  </Card>

  <Card title="Продукт" icon="layer-group" href="/ru/logic/inventory/inventory-groups">
    Учёт однотипного инвентаря по количеству: продукты, их состояние и тарифы вместо отдельных единиц.
  </Card>

  <Card title="Комплекты (наборы)" icon="boxes-stacked" href="/ru/logic/inventory/inventory-sets">
    Наборы инвентаря, сдаваемые как единое целое: состав, позиции и цены комплекта.
  </Card>

  <Card title="Тарифы и цены" icon="tags" href="/ru/logic/inventory/tariffs">
    Тарифы аренды по временным периодам для единиц, продуктов и комплектов инвентаря.
  </Card>

  <Card title="Субаренда" icon="handshake" href="/ru/logic/inventory/sublease">
    Периоды субаренды единиц инвентаря с процентом владельца — источник истории для распределения выручки.
  </Card>

  <Card title="Услуги (сервисы)" icon="concierge-bell" href="/ru/logic/inventory/services">
    Дополнительные платные услуги и их тарифы, публикуемые в каталоге и добавляемые к заказам.
  </Card>

  <Card title="Обслуживание и ремонт" icon="screwdriver-wrench" href="/ru/logic/inventory/maintenance">
    Плановое и разовое техобслуживание инвентаря по интервалу или пробегу, с ресурсами и уведомлениями.
  </Card>

  <Card title="Инвентаризация" icon="clipboard-check" href="/ru/logic/inventory/inventorization">
    Проверки состояния инвентаря при выдаче/приёмке заказов, автоматически обновляющие статус единицы.
  </Card>
</CardGroup>
