# ADR-0004. Идентификаторы, суммы и время

- Статус: принято
- Дата: 2026-09-30

## Решение

**Идентификаторы.** Бизнес-сущности получают UUIDv7 (упорядочены по времени, генерируются
приложением, тип `uuid` в PostgreSQL). Внутренние высокообъёмные журналы (`ledger_entries`,
движения партий) используют `bigint generated always as identity`. Во внешнем API — только UUID.

**Деньги.** Целые копейки (`bigint`, суффикс `_minor`) плюс код валюты ISO 4217. Дробные числа
с плавающей точкой запрещены в расчётах. Значение `Money` в ядре не допускает смешивания валют.

**Баллы.** Целые минимальные единицы (`bigint`). Точность задаётся типом баллов (0–2 знака) и не меняется
после создания. Стоимость балла хранится как «копеек за один целый балл»; при конвертации в деньги
для списания округление всегда вниз, в пользу мерчанта.

**Время.** Все отметки — `timestamptz` в UTC. У программы неизменяемый часовой пояс, в нём считаются
календарные правила: конец дня для сгорания, день рождения, «тихие часы», бизнес-дата чека.
У операций различаются `effective_at` (когда произошло, например время покупки на кассе) и
`created_at` (когда записано). Текущее время берётся только через `Clock` из ядра, чтобы тесты
управляли временем.

## Последствия

- Нет ошибок округления с float; все суммы сравниваются точно.
- Смена часового пояса программы невозможна — только новая программа с миграцией участников.
