> ## 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/rent/actions-glossary).

## Обзор

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

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

<Info>
  Действие всегда привязано к конкретной аренде и к исполнителю (пользователю, который его выполнил). Оно может ссылаться на набор затронутых позиций инвентаря, а для событий по доставке — ещё и на конкретную доставку. При удалении аренды все её действия удаляются каскадно.
</Info>

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

| Поле              | Тип           | Назначение                                                                                                    |
| ----------------- | ------------- | ------------------------------------------------------------------------------------------------------------- |
| Исполнитель       | связь         | Пользователь, выполнивший действие                                                                            |
| Аренда            | связь         | Аренда, к которой относится действие (каскадное удаление)                                                     |
| Позиции инвентаря | список связей | Позиции заявки, затронутые этим действием                                                                     |
| Доставка          | связь         | Связанная доставка для событий забора/выдачи по доставке; иначе пусто                                         |
| Тип действия      | перечисление  | Этап жизненного цикла (создание, бронь, инкассация, выдача, приёмка, отмена, архив, забор/выдача по доставке) |
| Создано           | дата/время    | Момент действия; используется при восстановлении фактических дат начала/окончания                             |
| Обновлено         | дата/время    | Момент последнего изменения записи                                                                            |

### Порядок этапов

Пять «продвигающих» этапов выстроены в строгую последовательность:

1. Создание
2. Бронирование
3. Инкассация
4. Выдача
5. Приёмка

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

### Неудаляемые действия

Часть событий защищена от удаления:

* создание,
* отмена,
* архивирование,
* забор при доставке,
* выдача при доставке.

Их нельзя удалить через журнал ни при каких условиях.

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

## Логика и побочные эффекты

### Создание действия

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

Момент действия по умолчанию — текущее время; при этом он **не может быть в будущем** — иначе запрос отклоняется с ошибкой валидации.

Внутри одного запроса, в рамках единой транзакции, последовательно проверяется несколько условий, и в зависимости от них создаются соответствующие записи и меняется статус аренды.

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

От целевого статуса и настроек компании зависит, берутся ли все позиции аренды или только явно перечисленные:

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

<Warning>
  При старте аренды есть жёсткая защита: если аренда всё ещё в статусе «Заявка» и её плановое окончание уже в прошлом, перевести её сразу «в аренду» нельзя — запрос завершится ошибкой «поздний старт аренды». Сначала нужно скорректировать сроки.
</Warning>

#### Бронирование

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

#### Инкассация

Если явно указан тип «инкассация» и аренда находится в одном из рабочих статусов (заявка, бронь, в аренде, просрочка, должник), создаётся событие инкассации с переданными позициями. Статус при этом само́й инкассацией не меняется.

#### Выдача (переход «в аренде»)

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

Что происходит:

1. **Продажные позиции.** Для позиций типа «Продажа», у которых ещё не проставлена дата продажи, у соответствующих единиц инвентаря фиксируются цена продажи (равная цене позиции со скидкой) и дата продажи (момент действия).
2. **Фактическое начало.** Если у аренды ещё не заполнено фактическое начало, оно ставится равным моменту действия.
3. **Событие выдачи.** Создаётся событие выдачи, куда попадают только позиции без проставленного факт-начала.
4. Статус аренды становится «В аренде».
5. Тем же позициям (без факт-начала) проставляется фактическое начало — момент действия.

#### Приёмка (переход «завершена»)

Срабатывает при запросе статуса «Завершена», когда аренда сейчас в аренде, просрочке или в статусе должника.

Что происходит:

1. **Событие приёмки** создаётся с арендными позициями, у которых ещё не проставлено факт-окончание.
2. Этим арендным позициям проставляется фактическое окончание — момент действия.
3. Итог приёмки определяется **тем же единым правилом**, что применяется при обычном сохранении аренды и при откате действия:
   * если осталась хотя бы одна **нетронутая** позиция (не выдавалась и не принималась — любого типа, включая продажную) или хотя бы одна выданная, но несданная арендная позиция — этот шаг статус не меняет и фактическое окончание аренды не проставляет;
   * иначе аренде проставляется фактическое окончание и выбирается статус: **Завершена**, если оплаченная сумма покрывает итоговую сумму со скидкой, иначе — **Должник**.

Позиции, заменённые при обмене, в этой проверке не участвуют.

<Info>
  Единое правило строже, чем прежняя логика этого шага, в двух местах: заказ, у которого есть только продажные позиции и хотя бы одна из них не выдавалась, приёмкой больше не завершается; и фактическое окончание аренды больше не проставляется, если какая-то позиция вообще не выдавалась. В таких случаях итоговый статус досчитывает общий пересчёт — ровно тот же, что и раньше приводил вердикт этого шага к своему.
</Info>

#### Возврат инвентаря на рент-поинт при приёмке

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

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

Позиции, помеченные как обмен, из этого перемещения исключаются.

#### Отмена

При запросе статуса «Отменена» создаётся событие отмены, аренда переводится в «Отменена», а у всех продажных позиций аренды **сбрасываются** дата и цена продажи у единиц инвентаря (продажа откатывается).

### Завершение запроса создания

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

## Удаление действия и откат

Удаление действия из журнала — это откат этапа. Он проходит через несколько защит и завершается пересчётом.

### Защиты при удалении

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

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

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

Откат работает так, чтобы после него аренда выглядела ровно так, будто удаляемого действия никогда не было:

1. **Сброс фактических дат у позиций.** Если удаляется выдача — у её позиций сбрасывается фактическое начало. Если удаляется приёмка — сбрасывается фактическое окончание.
2. **Удаление самой записи** действия.
3. **Пересбор дат по оставшимся действиям.** По журналу вычисляются: последняя бронь, **самая ранняя** выдача, **последняя** приёмка и последняя отмена.
4. **Подсчёт по позициям** (без позиций-обменов): сколько позиций вообще не тронуты (без факт-начала и без факт-окончания) и сколько арендных позиций выдано, но не принято.
5. **Определение статуса** по приоритету:
   * есть отмена → **Отменена**;
   * есть приёмка, нет нетронутых позиций и нет невозвращённых → **Завершена** (если оплата покрывает сумму со скидкой) либо **Должник**;
   * есть выдача или есть невозвращённые арендные позиции → **В аренде**;
   * есть бронь → **Бронь**;
   * иначе → **Заявка**.
6. **Фактическое начало** аренды выставляется по самой ранней выдаче (или очищается, если выдач не осталось), **фактическое окончание** — по последней приёмке, но только если итоговый статус «Завершена» или «Должник»; иначе очищается.
7. Аренда прогоняется через общий пересчёт позиций и сумм.

Весь откат выполняется в единой транзакции — при любой ошибке ни удаление, ни изменения дат не сохранятся.

## Чтение журнала

Для интерфейсов предусмотрены два представления записи действия:

* **краткое** — идентификатор, исполнитель, момент создания, тип действия и идентификаторы затронутых позиций; используется в списках;
* **детальное** — дополнительно подтягивает из связанной аренды клиента, её статус и статус оплаты, а также разворачивает список конкретных единиц инвентаря по затронутым позициям.

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

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

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

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

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

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

  <Card title="Аренда: заявки и жизненный цикл" icon="file-signature" href="/ru/logic/rent">
    Обзорный раздел модуля аренды со всеми его страницами.
  </Card>

  <Card title="Аренда и статусы" icon="diagram-project" href="/ru/logic/rent/lifecycle">
    Ядро сущности аренды и автомат статусов от заявки до завершения или отмены.
  </Card>

  <Card title="Позиции инвентаря и обмен" icon="boxes-stacked" href="/ru/logic/rent/inventory-lines">
    Строки инвентаря аренды, их тарифы и периоды, массовые операции и обмен позиций.
  </Card>

  <Card title="Услуги и доставка" icon="truck" href="/ru/logic/rent/services-delivery">
    Услуги в составе аренды и доставки с выдачей, приёмкой, подтверждением и отменой.
  </Card>

  <Card title="Пересчёт сумм и цен" icon="calculator" href="/ru/logic/rent/pricing">
    Движок пересчёта итогов аренды: цены, скидки, налоги, продление и суммарные поля.
  </Card>

  <Card title="Депозиты и штрафы" icon="shield-halved" href="/ru/logic/rent/deposits-penalties">
    Привязка депозитов и штрафов к аренде и позициям и генерация штрафных задач.
  </Card>

  <Card title="График оплат, паузы и рабочие дни" icon="calendar-days" href="/ru/logic/rent/schedule">
    График платежей, автосписание, паузы аренды и рабочие условия для длительности и сумм.
  </Card>

  <Card title="Уведомления, бонусы и воронка" icon="bell" href="/ru/logic/rent/triggers">
    Реакции на смену статуса аренды: уведомления, бонусы, рефералы и продвижение по воронке.
  </Card>
</CardGroup>
