--- type: data-requirements work_item_id: ET-005 title: "Требования к данным — ET-005: Переключение единиц измерения (км/мили)" version: 1 status: approved created_at: 2026-05-21 authors: - "agent:architect" --- # Требования к данным — ET-005 ## 1. Резюме ET-005 не вводит и не изменяет ни одной серверной структуры данных. Единственное «данное» фичи — пользовательская UI-настройка выбранной единицы измерения, хранимая на клиенте. ## 2. Серверные данные | Аспект | Требование | |--------|------------| | Изменения схемы SQLite/Spatialite | Нет | | Новые таблицы / колонки / индексы | Нет | | Миграции (`migrations/`) | Нет | | Изменения контракта API | Нет — расстояния и далее отдаются в **метрах** | ## 3. Каноническая единица расстояния - Внутренняя каноническая единица системы — **метр**. Backend отдаёт `route.distance_m` (метры); линейка во фронтенде оперирует километрами (`rulerTotal`). - ET-005 **не меняет** ни хранимые, ни передаваемые значения. Перевод в мили выполняется **только в момент форматирования строки для UI** (`Units.formatDistance()`). - Запрещено хранить в рантайм-состоянии значения, конвертированные в мили — это исключает накопление ошибок округления при многократном переключении (ФТ-3 ТЗ, AC-2, тест TP-04). ## 4. Клиентское хранилище | Параметр | Значение | |----------|----------| | Механизм | `localStorage` | | Ключ | `distance_unit` | | Допустимые значения | `'km'`, `'mi'` | | Значение по умолчанию | `'km'` (при отсутствии ключа или некорректном значении) | | Объём | ≈ 2 байта полезной нагрузки на браузер | | Запись | при переключении (`Units.setUnit()`) | | Чтение | при инициализации модуля `units.js` | Ключ согласуется с уже сложившейся в проекте конвенцией UI-настроек в `localStorage` (`enduro-theme-mode`, `terrain-*`, `trails-*`, `poi-visible`). ## 5. Константы и точность | Параметр | Значение | |----------|----------| | Коэффициент перевода | `1 km = 0.621371 mi` (`Units.KM_TO_MI`), единственное место объявления | | Точность по умолчанию | 1 знак после запятой (AC-2) | | Параметризация точности | `formatDistance()` принимает `precision`, чтобы сохранить существующую точность карточек маршрутов (`toFixed(0)`) — см. `10-tech-risks.md`, R5 | | Разделитель дробной части | Привести к единому виду; сейчас в `app.js` есть расхождение (`.` и `,`) — см. `10-tech-risks.md`, R4 | ## 6. Персональные данные Персональные данные (PII) отсутствуют. `distance_unit` — обезличенная UI-настройка, не покидает браузер пользователя, не логируется на backend. ## 7. Вывод Серверных данных, схем и миграций ET-005 **не затрагивает**. Единственная единица данных — клиентский флаг `localStorage:distance_unit`. Требований к резервному копированию, ретенции и приватности не возникает.