# Закрытие записи

В Ordinis нет «удалить» в привычном смысле — данные не пропадают. Вместо
этого запись **закрывается**: ей выставляется `valid_to = текущий момент`,
после чего она перестаёт считаться актуальной, но история остаётся.

## Зачем так

Bitemporal модель — два временных измерения:
- **valid_from / valid_to** — когда запись актуальна в реальном мире
- **created_at / updated_at** — когда запись была введена в систему

Это позволяет:
- Восстанавливать что было «на дату» (например, состав группировки
  спутников на 2024-12-31)
- Видеть, кто и когда вносил изменения
- Не ломать downstream-системы, которые могут читать архивные данные

## Когда закрывать запись

- Спутник **выведен из эксплуатации**
- Наземная станция **демонтирована**
- Контракт **истёк**
- Тип записи **переименован** (закрыть старую, открыть новую с новым кодом)
- Дубликат **обнаружен** (оставить одну, закрыть остальные)

## Как закрыть

1. Открой запись в drawer'е
2. Кнопка **«Удалить»** в footer'е (она же — «закрыть»)
3. Опционально укажи `valid_to` — момент закрытия. По умолчанию: сейчас.
4. Подтверди

После этого:
- В UI запись по умолчанию **не отображается** (фильтр «только активные»)
- В API при `GET /records?at=YYYY-MM-DD` — отображается только если
  на эту дату была активна
- История доступна через `GET /records/{id}/history`

## Как восстановить

Если запись закрыта ошибочно — открой панель **«История версий»** в
drawer'е, найди последнюю активную версию **до закрытия**, нажми
**«Восстановить как новую запись»**. Это создаст новую активную версию
с тем же бизнес-ключом, что и закрытая.

Альтернатива: создать запись с тем же бизнес-ключом заново — система
проверит, что нет пересекающихся периодов действия.

## Bulk-закрытие при cascade

Если запись X **используется** в других справочниках (через `x-references`),
система проверит ссылки:
- Если есть активные записи, ссылающиеся на X — будет предупреждение
- Можно: (а) сначала закрыть/обновить зависимые записи, (б) принять
  риск orphan'ов (downstream consumers получат FK-misses)

См. [Cross-references (FK)](../integration/api/x-references.md) о том,
как зависимости валидируются на уровне API.

## Закрытие vs полное удаление

**Полное удаление записи (DELETE из БД) не поддерживается** через UI и
обычный API. Это намеренно — целостность истории важнее «чистоты».

Если ОЧЕНЬ нужно (например, по GDPR / по приказу) — администратор
выполняет это через специальную процедуру с подтверждением. Свяжись с
ответственным за систему.

## Что произойдёт при закрытии

- В БД у записи обновляется `valid_to`
- В Kafka-топик публикуется событие `RecordClosed` с указанием
  `valid_to` и причины (если задана)
- В audit log пишется операция `CLOSE` с привязкой к оператору
- Downstream consumers (Альтум, BI) видят новую версию состояния
  справочника на следующем чтении (или сразу через событие)

## Чек-лист перед закрытием

- [ ] Я уверен, что закрываю правильную запись (бизнес-ключ совпадает)
- [ ] Если у записи есть зависимости через FK — я их проверил
- [ ] `valid_to` соответствует реальному моменту вывода из эксплуатации
      (не «сейчас» по умолчанию, если эксплуатация закончилась в прошлом)
- [ ] Я понимаю: история останется, downstream-консьюмеры узнают
