> ## 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/inventory-items-glossary).

## Что такое единица инвентаря

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

Единица почти всегда принадлежит какому-то продукту и наследует от него изображение и часть тарифов, но живёт своей жизнью: её можно переместить между точками, отправить на ремонт, застраховать, продать или списать — независимо от остальных предметов продукта.

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

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

### Основные поля единицы

| Поле                     | Тип              | Назначение                                               |
| ------------------------ | ---------------- | -------------------------------------------------------- |
| Название                 | текст            | Наименование предмета                                    |
| Уникальный идентификатор | текст            | Внутренний артикул / инвентарный номер                   |
| Идентификатор устройства | текст            | Технический ID метки/устройства, только для чтения       |
| Тип учёта                | Аренда / Продажа | Для чего предназначена единица                           |
| Категория                | связь            | Категория товара                                         |
| Продукт                  | связь            | Продукт, к которому относится предмет                    |
| Точка проката            | связь            | Где предмет хранится и выдаётся                          |
| Состояние                | связь            | Пользовательское состояние (см. ниже)                    |
| Комментарий              | текст            | Произвольное описание                                    |
| Изображение              | файл             | Фото; при сохранении из него делается уменьшенное превью |
| Доп. данные              | JSON             | Произвольные атрибуты; сюда же пишется последний пробег  |

### Денежные поля

| Поле               | Тип        | Назначение                                              |
| ------------------ | ---------- | ------------------------------------------------------- |
| Цена покупки       | число      | Закупочная стоимость                                    |
| Дата покупки       | дата       | Когда приобрели                                         |
| Цена продажи       | число      | Заполняется при продаже                                 |
| Дата продажи       | дата/время | **Непустая дата продажи = единица считается проданной** |
| Складская цена     | число      | Учётная стоимость на складе                             |
| Срок службы        | число      | Ожидаемый срок эксплуатации                             |
| Предыдущая выручка | число      | Накопленный доход по единице (кэш для метрик)           |

### Поля субаренды

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

<Info>
  Изменения полей единицы пишутся в **журнал изменений** (аудит-лог): по каждому предмету видно, что и когда поменялось.
</Info>

### Состояние единицы

**Состояние** — это справочник, который компания настраивает под себя: «Исправна», «На ремонте», «Требует диагностики» и т. д. У каждого состояния есть цвет метки и два важных флага:

* **Блокирует прокат** — если включён, предмет в этом состоянии считается сломанным и не участвует в выдаче.
* **Отправляет в мастерскую** — связывает состояние с воронкой задач мастерской (документируется в разделе «Мастерская»).

### Авто-карточка (транспорт)

Для транспортного проката к единице можно привязать **авто-карточку** (связь один-к-одному) с полями: тип транспорта (машина / электросамокат / мотоцикл), гос. номер, техпаспорт, серийный номер, VIN, марка и модель. Авто-карточка активна только при включённой опции работы с транспортом.

<Warning>
  Для типа **машина** гос. номер и техпаспорт проверяются по формату (номер: 3 цифры + 2–3 буквы + 2 цифры, либо 1 буква + 6 цифр; техпаспорт: 2 буквы + 8 цифр). Для самокатов и мотоциклов формат не проверяется. Кроме того, пара «гос. номер + техпаспорт» должна быть уникальной — нельзя завести две единицы с одинаковыми номером и техпаспортом (это правило действует для всех типов транспорта).
</Warning>

### Страховка

К единице можно привязать один страховой полис (связь один-к-одному): тип (КАСКО или ОГПО), страховая компания, номер, сумма и срок действия (начало и окончание). Если у предмета полиса нет, запрос страховки возвращает «пусто» (без ошибки).

### Пробег

**Пробег** — это отдельные записи показаний счётчика на определённый момент. Каждая новая запись:

1. Обновляет в доп. данных единицы значение последнего пробега (перезаписывает, а не суммирует).
2. Автоматически проверяет запланированное техобслуживание по пробегу и, если порог достигнут, инициирует уведомление о ТО (только когда соответствующая интеграция включена).

Для планового ТО порог срабатывания считается по-разному в зависимости от вида обслуживания: для периодического обслуживания в расчёт дополнительно закладывается ранее накопленный пробег, для разового — расчёт идёт напрямую от целевого показания. Точная формула — деталь реализации.

## Вычисляемый статус единицы

Это сердце раздела. Когда открывается список инвентаря на некоторый интервал времени (по умолчанию — «прямо сейчас», окно в пару минут вокруг текущего момента), каждой единице присваивается один статус по строгому приоритету. Первое совпавшее условие выигрывает.

### Приоритет статусов (для списка с учётом расписания)

<Info>
  Порядок проверки именно такой — верхние условия перекрывают нижние:
</Info>

1. **В аренде** — есть аренда, пересекающаяся с запрошенным интервалом.
2. **Забронирована** — есть бронь, пересекающаяся с интервалом.
3. **Просрочена** — есть просроченная аренда (внимание: это условие проверяется **без учёта интервала времени** — если у предмета есть хоть одна просроченная аренда, он считается просроченным всегда).
4. **Списана** — по единице оформлено списание.
5. **Отключена/удалена** — по единице оформлено любое другое выведение из оборота (удаление или архив).
6. **На складе** — есть складская запись «в наличии».
7. **На ремонте** — есть активная задача мастерской (новая или в работе), которая стоит на этапе с включённым признаком «Занимать инвентарь» либо вообще не привязана к этапу.
8. **Сломана** — текущее состояние помечено флагом «блокирует прокат».
9. **Продана** — заполнена дата продажи.
10. **Свободна** — ни одно из условий выше не сработало.

<Warning>
  Из-за этого приоритета «в аренде», «забронирована» и «просрочена» **перекрывают** и «сломана», и «продана», и «на складе». То есть если предмет физически выдан клиенту, он покажется как «в аренде», даже если у него включено блокирующее состояние или проставлена дата продажи. Это осознанное поведение: активная аренда важнее всего остального.
</Warning>

### Статус без учёта аренды

Есть облегчённый расчёт статуса, который **не смотрит на расписание аренд** (предусмотрен для случаев, где арендная занятость не важна). Он даёт только: списана → отключена/удалена → на складе → сломана (по задаче мастерской или по блокирующему состоянию) → продана → свободна. Здесь и активная задача мастерской, и блокирующее состояние сводятся к одному статусу «сломана». Задачи отбираются по тому же правилу, что и в полном расчёте: учитываются только те, что стоят на этапе с признаком «Занимать инвентарь» или без этапа.

### Какие задачи мастерской занимают единицу

Влияние мастерской на статус настраивает сама компания — признаком **«Занимать инвентарь»** у этапа ремонтной воронки (по умолчанию включён):

* открытая задача на этапе с включённым признаком делает единицу «на ремонте»;
* открытая задача на этапе с выключенным признаком статус единицы не меняет — предмет остаётся доступным;
* задача **без этапа** занимает единицу всегда.

Чтобы задачи мастерской вовсе не влияли на статусы инвентаря, признак снимается со всех этапов воронок компании.

<Warning>
  Снятие признака убирает вклад только самой задачи. Если этап переводит единицу в состояние с флагом «блокирует прокат», она останется «сломана» и недоступна по второму, независимому основанию — из-за своего состояния. Полная развязка мастерской и статусов требует проверить и целевые состояния этапов. Подробнее: [«Автосмена состояния инвентаря»](/ru/logic/workshop/inventory-state).
</Warning>

### Буфер между бронями

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

### Список «доступных» единиц

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

## Жизненный цикл и операции

### Создание единицы и лимиты

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

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

### Импорт единиц из таблицы

Пакетный импорт принимает список строк (по строке на предмет) и за один заход:

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

Обработка ошибок построчная: если хотя бы одна строка не проходит (например, не хватает обязательного поля), весь импорт откатывается, а пользователю показывается сообщение только о **первой** ошибке с номером строки.

<Info>
  Точка проката при импорте ищется и создаётся по названию, приведённому к нижнему регистру, и её адрес заполняется этим же названием в нижнем регистре. Если в таблице точка написана в разном регистре, задвоения не будет, но и «красивого» адреса тоже.
</Info>

### Массовые операции

Три операции работают по списку выбранных единиц:

| Операция       | Что делает                                         | Кто может                |
| -------------- | -------------------------------------------------- | ------------------------ |
| Смена продукта | Переносит выбранные единицы в указанный продукт    | Обычный доступ по правам |
| Перемещение    | Ставит выбранным единицам новую точку проката      | Только суперпользователь |
| Продажа        | Проставляет цену и дату продажи выбранным единицам | Только суперпользователь |

<Warning>
  Массовая **продажа** затрагивает только те единицы из списка, у которых дата продажи ещё не заполнена. Уже проданные предметы не перепродаются и их цена не перезаписывается — повторный вызов по ним ничего не изменит. Дата продажи ставится равной текущему моменту.
</Warning>

### Пометка недоступной и удаление

Отдельный запрос «недоступности» показывает по выбранным единицам все брони и аренды (забронирована / в аренде / просрочена), пересекающиеся с заданным интервалом. Список единиц можно передать напрямую перечнем идентификаторов или сослаться на заранее сохранённый в кэше набор фильтров. Можно исключить конкретную заявку — это удобно при редактировании существующей аренды, чтобы она не «конфликтовала сама с собой».

<Note>
  Удаление единицы — **мягкое**. Предмет не стирается из базы: вместо этого создаётся запись о выведении из оборота (способ «удаление»), и единица начинает считаться удалённой при расчёте статуса. История, аренды и метрики остаются нетронутыми. После удаления пересчитываются лимиты по транспорту.
</Note>

### Витрина продаж

Отдельный список показывает единицы, связанные со складом, в двух режимах:

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

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

### Сводка по инвентарю

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

### Карточка одной единицы

По конкретной единице собирается краткая аналитика: сколько раз её брали в аренду, суммарная длительность аренд, суммарный доход по ней и клиент, который брал её чаще всех. Это помогает оценить окупаемость конкретного предмета.

### Связь с другими разделами

* **Расписание и доступность** строятся на арендах и бронях — они определяют статусы «в аренде», «забронирована», «просрочена».
* **Состояние** и **задачи мастерской** дают статусы «сломана» и «на ремонте»; задача учитывается, если стоит на этапе с признаком «Занимать инвентарь» или без этапа (мастерская документируется отдельно).
* **Склад** и **продажи** дают статусы «на складе» и «продана».
* **Пробег** питает плановое техобслуживание по километражу.
* **Субаренда** использует поля владельца и процента как живой кэш поверх истории периодов.

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

<Info>
  Прочие особенности, о которых стоит помнить:

  * **Удаление мягкое**: сама запись не стирается, создаётся отметка о выведении из оборота, предмет лишь помечается удалённым при расчёте статуса; история и метрики сохраняются, а лимиты по транспорту пересчитываются.
  * **Массовая продажа** затрагивает только единицы с ещё не заполненной датой продажи — уже проданные повторно не продаются и их цена не перезаписывается; дата продажи ставится равной текущему моменту.
  * **Запись пробега перезаписывает** последнее показание в доп. данных единицы, а не накапливает сумму пробега.
  * **Проверка уникальности инвентарного номера** работает только при включённой отдельной опции и учитывает лишь неудалённые единицы; при выключенной опции дубликаты номеров не блокируются.
  * **При импорте** ошибка хотя бы в одной строке откатывает весь импорт, а пользователю показывается сообщение только о первой ошибке; точка проката при этом ищется/создаётся по названию в нижнем регистре, и адрес заполняется этим же названием.
  * **Перемещение между точками и продажа** доступны только суперпользователю (остальным — только чтение), тогда как смена продукта и импорт доступны по обычным правам.
  * **Формат гос. номера и техпаспорта** проверяется только для типа «машина»; для самокатов и мотоциклов проверка формата пропускается, но требование уникальности пары номер + техпаспорт действует для всех типов.
  * **Лимит тарифного плана** при создании транспортной единицы обходится, если активен демо-доступ с ещё не истёкшим сроком.
  * **Буфер между бронями** расширяет занятое окно назад во времени (предмет считается занятым ещё некоторое время после возврата); если буфер не задан, он равен нулю.
  * **Запрос страховки** по единице без полиса возвращает пустой ответ, а не ошибку.
  * **Сводка по инвентарю** считается одним группирующим запросом по всему отфильтрованному набору и рассчитана на обычный запрос из интерфейса (без выведенных из оборота единиц); прямые обращения совсем без фильтров или только по архивным единицам считаются медленнее.
  * **При сохранении единицы с новым изображением** автоматически создаётся уменьшенное превью; если у единицы нет своего изображения, в выдаче подставляется изображение её продукта.
  * **Уведомление о ТО по пробегу** срабатывает только при включённой интеграции обслуживания и лишь для запланированного, ещё не выполненного ТО с заданным порогом по дистанции; для периодического и разового обслуживания порог считается по-разному.
</Info>

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

<CardGroup cols={2}>
  <Card title="Глоссарий: Инвентарь (единицы)" icon="book" href="/ru/logic/inventory/inventory-items-glossary">
    Полный перечень полей единицы инвентаря, её состояний и связанных сущностей.
  </Card>

  <Card title="Инвентарь и услуги (CRM)" icon="boxes-stacked" href="/ru/logic/inventory">
    Обзор всего модуля инвентаря и услуг и переход к остальным разделам.
  </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="calendar-check" href="/ru/logic/inventory/availability">
    Расписание занятости инвентаря и расчёт доступности с учётом заказов, склада и задач мастерской.
  </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>
