# ТЗ: Система карты растений парка

## 1. Общее описание

Система состоит из трёх компонентов:
- **Веб-сайт** — публичная карта с растениями
- **Веб-админка** — управление справочниками и точками
- **Android-приложение** — полевой инструмент администратора

---

## 2. Веб-сайт (публичный)

### 2.1 Карта
- Подложка: Яндекс.Карты через JS API, только базовый тайловый слой (без POI, меток, описаний объектов)
- Управление: перемещение, зум колёсиком и жестами, двойной клик — приближение
- Начальная позиция и зум настраиваются в конфиге

### 2.2 Точки растений
- Каждое растение отображается маркером на карте
- При клике на маркер — всплывающая карточка с информацией:
  - Название растения
  - Дата посадки
  - Питомник
  - Фотография (если загружена)
- Маркеры кластеризуются при уменьшении зума (если точек много)

### 2.3 Производительность
- До 1000 точек — загружаются все сразу при открытии карты (один запрос)
- Кластеризация маркеров при зуме < 15

---

## 3. Веб-админка

### 3.1 Доступ
- Карта публичная, без авторизации
- Админка на отдельном маршруте `/admin`, защищена логином/паролем
- Один администратор (без разграничения ролей)

### 3.2 Справочник видов растений
- Список видов: название, описание (опционально)
- Добавление / редактирование / архивирование вида
- Поиск по названию

### 3.3 Управление точками на карте
- Список всех добавленных точек с фильтрацией по виду, дате, питомнику
- Добавление точки вручную:
  - Клик на карту — получение координат
  - Выбор вида из справочника
  - Дата посадки
  - Питомник
  - Загрузка фото (опционально)
- Редактирование и удаление точек

---

## 4. Android-приложение (для администратора)

### 4.1 Авторизация
- Логин/пароль (те же учётные данные, что и в веб-админке)
- Сессия сохраняется между запусками

### 4.2 Добавление растения
Сценарий использования:
1. Администратор подходит к растению
2. Нажимает "Получить координаты" — приложение фиксирует GPS
3. Ждёт точного сигнала (показывает точность в метрах)
4. Выбирает вид растения из справочника (поиск по названию)
5. Если нужного вида нет — добавляет новый прямо в приложении
6. Заполняет дату посадки (датапикер)
7. Указывает питомник (текстовое поле или выбор из ранее использованных)
8. Опционально делает фото камерой телефона
9. Нажимает "Сохранить" — данные отправляются на сервер

### 4.3 Справочник
- Просмотр всех видов растений
- Добавление нового вида (имя) прямо из поля

### 4.4 Офлайн
- Заполненные карточки сохраняются локально, если нет интернета
- Отправляются автоматически при восстановлении соединения

---

## 5. Бэкенд (API)

### 5.1 Основные сущности

**PlantType (вид растения)**
- id, name, description, created_at

**Plant (точка растения)**
- id, plant_type_id, lat, lng, planted_at, nursery, photo_url, created_at, created_by

**PlantHistory (история изменений)**
- id, plant_id, changed_at, changed_by, field, old_value, new_value

### 5.2 API endpoints

| Метод | Путь | Описание |
|-------|------|----------|
| GET | /api/plants | Список точек (с bbox-фильтром) |
| GET | /api/plants/:id | Карточка растения |
| POST | /api/plants | Добавить точку |
| PUT | /api/plants/:id | Редактировать точку |
| DELETE | /api/plants/:id | Удалить точку |
| GET | /api/plant-types | Справочник видов |
| POST | /api/plant-types | Добавить вид |
| PUT | /api/plant-types/:id | Редактировать вид |
| GET | /api/plants/:id/history | История изменений точки |
| POST | /api/auth/login | Авторизация |
| POST | /api/upload/photo | Загрузка фото |

### 5.3 Хранение фото
- Фото хранятся на сервере (или S3-совместимое хранилище)
- В БД хранится только URL
- Максимальный размер: 10 МБ, форматы: JPG, PNG

---

## 6. Технический стек (рекомендуемый)

| Компонент | Технология |
|-----------|------------|
| Веб-фронтенд | Vue 3 или React + Leaflet.js |
| Карта | Яндекс Maps JS API 3.0 (базовый слой) |
| Бэкенд | Node.js (Express) или Python (FastAPI) |
| БД | PostgreSQL + PostGIS (для геозапросов) |
| Android | Kotlin + Jetpack Compose |
| Аутентификация | JWT |
| Хостинг | Linux VPS |
| Фото | Multer (Node) / локальное хранилище или S3 |

---

## 7. Принятые решения

1. До 1000 точек — все грузятся сразу, bbox не нужен
2. Карта публичная, авторизация только для /admin
3. Один администратор
4. Хостинг на Linux VPS
5. История изменений ведётся (таблица PlantHistory)
