77 lines
4.2 KiB
Markdown
77 lines
4.2 KiB
Markdown
---
|
||
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`. Требований
|
||
к резервному копированию, ретенции и приватности не возникает.
|