Files
TenerifeProp/docs/TZ.md
TenerifeProp Dev c1867fe074 feat: implement complete backend with Bun + Hono + SQLite
- Create SQLite database schema with all tables
- Implement REST API endpoints for properties, leads, testimonials, FAQ, services
- Add seed data with sample properties, testimonials, FAQ
- Create Docker configuration for deployment
- Add i18n system for translations
- Add API client for frontend integration
- Create Technical Documentation (TZ.md)
- Add detailed README with deployment instructions

🚀 Project is now fully functional:
- API: http://localhost:8080/api/*
- Properties CRUD with filtering
- Lead management
- Settings, Testimonials, FAQ, Services APIs
- SQLite database with seed data
2026-04-04 22:16:06 +01:00

390 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Техническое Задание (ТЗ)
# TenerifeProp - Агентство недвижимости на Тенерифе
## 1. Введение
### 1.1 Назначение документа
Данный документ содержит полное техническое задание на разработку веб-приложения для агентства недвижимости TenerifeProp, расположенного на острове Тенерифе (Канарские острова, Испания).
### 1.2 Область применения
Веб-приложение предназначено для:
- Публичного показа объектов недвижимости (участки, дома, квартиры)
- Сбора заявок от потенциальных клиентов
- Управления контентом и объектами через административную панель
- Работы на испанском и русском языках
### 1.3 Термины и определения
| Термин | Определение |
|--------|-------------|
| Property | Объект недвижимости (участок, дом, квартира) |
| Lead | Потенциальный клиент, оставивший заявку |
| Agricultural land | Сельскохозяйственный участок (terreno agrícola) |
| Urban land | Городской участок (terreno urbano) |
| Ruins | Руины, здания под восстановление |
---
## 2. Сущности данных
### 2.1 Property (Недвижимость)
#### Атрибуты
| Поле | Тип | Обязательно | Описание |
|------|-----|--------------|----------|
| id | TEXT (UUID) | Да | Уникальный идентификатор |
| slug | TEXT | Да | URL-friendly идентификатор |
| reference | TEXT | Да | Человекочитаемый ID (TP-001) |
| type | ENUM | Да | agricultural, urban, house, apartment, ruins |
| status | ENUM | Да | active, reserved, sold, inactive |
| land_type | ENUM | Да | agricultural, urban, rustic, buildable |
| title_es | TEXT | Да | Название на испанском |
| title_ru | TEXT | Да | Название на русском |
| description_es | TEXT | Да | Описание на испанском |
| description_ru | TEXT | Да | Описание на русском |
| short_description_es | TEXT | Нет | Краткое описание ES |
| short_description_ru | TEXT | Нет | Краткое описание RU |
| address | TEXT | Да | Адрес |
| city | TEXT | Да | Город |
| province | TEXT | Да | Провинция |
| postal_code | TEXT | Да | Почтовый индекс |
| zone | TEXT | Нет | Район/зона |
| lat | REAL | Да | Широта |
| lng | REAL | Да | Долгота |
| area | INTEGER | Да | Площадь (m²) |
| price | INTEGER | Да | Цена (EUR) |
| price_per_m2 | INTEGER | Нет | Цена за m² |
| bedrooms | INTEGER | Нет | Спальни (для домов) |
| bathrooms | INTEGER | Нет | Ванные (для домов) |
| water | TEXT | Да | water status: available, unavailable, planned |
| electricity | TEXT | Да | electricity status |
| phone | TEXT | Да | phone status |
| drainage | TEXT | Да | drainage status |
| road | TEXT | Да | road type: asphalt, dirt, planned |
| gas | TEXT | Да | gas status |
| orientation | TEXT | Да | north, south, east, west |
| views_sea | BOOLEAN | Да | Вид на море |
| views_mountain | BOOLEAN | Да | Вид на горы |
| views_valley | BOOLEAN | Да | Вид на долину |
| topography | TEXT | Да | flat, slope, terraced |
| has_ruins | BOOLEAN | Да | Есть руины |
| has_license | BOOLEAN | Да | Есть лицензия |
| is_buildable | BOOLEAN | Да | Можно строить |
| max_floors | INTEGER | Нет | Макс. этажей |
| buildability_ratio | REAL | Нет | Коэф. застройки |
| images | TEXT (JSON) | Да | Массив URL изображений |
| videos | TEXT (JSON) | Нет | Массив URL видео |
| badges | TEXT (JSON) | Нет | Метки: new, exclusive, featured |
| meta_title_es | TEXT | Нет | SEO title ES |
| meta_title_ru | TEXT | Нет | SEO title RU |
| meta_description_es | TEXT | Нет | SEO description ES |
| meta_description_ru | TEXT | Нет | SEO description RU |
| views_count | INTEGER | Да | Счётчик просмотров |
| favorite_count | INTEGER | Да | Счётчик избранного |
| inquiry_count | INTEGER | Да | Счётчик заявок |
| is_featured | BOOLEAN | Да | Рекомендуемый |
| is_exclusive | BOOLEAN | Да | Эксклюзивный |
| agent_id | TEXT | Да | ID агента |
| created_at | TEXT (ISO) | Да | Дата создания |
| updated_at | TEXT (ISO) | Да | Дата обновления |
| published_at | TEXT (ISO) | Нет | Дата публикации |
#### Индексы
- `idx_property_slug` ON slug
- `idx_property_type` ON type
- `idx_property_status` ON status
- `idx_property_city` ON city
- `idx_property_price` ON price
### 2.2 Lead (Заявка)
| Поле | Тип | Обязательно | Описание |
|------|-----|--------------|----------|
| id | TEXT (UUID) | Да | Уникальный идентификатор |
| name | TEXT | Да | Имя клиента |
| email | TEXT | Да | Email |
| phone | TEXT | Да | Телефон |
| message | TEXT | Нет | Сообщение |
| property_id | TEXT | Нет | ID интересующего объекта |
| property_ids | TEXT (JSON) | Нет | Массив ID объектов |
| budget_min | INTEGER | Нет | Мин. бюджет |
| budget_max | INTEGER | Нет | Макс. бюджет |
| currency | TEXT | Да | EUR, USD, RUB |
| language | TEXT | Да | Предпочитаемый язык |
| source | TEXT | Да | whatsapp, webform, phone, email |
| utm_source | TEXT | Нет | UTM Source |
| utm_medium | TEXT | Нет | UTM Medium |
| utm_campaign | TEXT | Нет | UTM Campaign |
| status | TEXT | Да | new, contacted, qualified, negotiating, closed, lost |
| priority | TEXT | Да | low, medium, high, urgent |
| notes | TEXT | Нет | Заметки |
| assigned_to | TEXT | Нет | ID агента |
| created_at | TEXT (ISO) | Да | Дата создания |
| updated_at | TEXT (ISO) | Да | Дата обновления |
### 2.3 User (Пользователь)
| Поле | Тип | Обязательно | Описание |
|------|-----|--------------|----------|
| id | TEXT (UUID) | Да | Уникальный идентификатор |
| email | TEXT | Да | Email (уникальный) |
| password_hash | TEXT | Да | Хеш пароля |
| name | TEXT | Да | Имя |
| role | TEXT | Да | admin, agent, editor |
| avatar | TEXT | Нет | URL аватара |
| phone | TEXT | Нет | Телефон |
| language | TEXT | Да | es, ru |
| is_active | BOOLEAN | Да | Активен |
| last_login_at | TEXT (ISO) | Нет | Последний вход |
| created_at | TEXT (ISO) | Да | Дата создания |
| updated_at | TEXT (ISO) | Да | Дата обновления |
### 2.4 Testimonial (Отзыв)
| Поле | Тип | Обязательно | Описание |
|------|-----|--------------|----------|
| id | TEXT (UUID) | Да | Уникальный идентификатор |
| name | TEXT | Да | Имя клиента |
| avatar | TEXT | Нет | URL аватара |
| location | TEXT | Да | Местоположение |
| rating | INTEGER | Да | Оценка 1-5 |
| text_es | TEXT | Да | Текст ES |
| text_ru | TEXT | Да | Текст RU |
| property_id | TEXT | Нет | ID объекта |
| is_approved | BOOLEAN | Да | Одобрен |
| is_featured | BOOLEAN | Да | Рекомендуемый |
| created_at | TEXT (ISO) | Да | Дата создания |
### 2.5 FAQ (Вопрос-ответ)
| Поле | Тип | Обязательно | Описание |
|------|-----|--------------|----------|
| id | TEXT (UUID) | Да | Уникальный идентификатор |
| question_es | TEXT | Да | Вопрос ES |
| question_ru | TEXT | Да | Вопрос RU |
| answer_es | TEXT | Да | Ответ ES |
| answer_ru | TEXT | Да | Ответ RU |
| category | TEXT | Да | Категория |
| order_num | INTEGER | Да | Порядок |
| is_active | BOOLEAN | Да | Активен |
### 2.6 Service (Услуга)
| Поле | Тип | Обязательно | Описание |
|------|-----|--------------|----------|
| id | TEXT (UUID) | Да | Уникальный идентификатор |
| icon | TEXT | Да | Имя иконки |
| title_es | TEXT | Да | Название ES |
| title_ru | TEXT | Да | Название RU |
| description_es | TEXT | Да | Описание ES |
| description_ru | TEXT | Да | Описание RU |
| order_num | INTEGER | Да | Порядок |
| is_active | BOOLEAN | Да | Активна |
### 2.7 Settings (Настройки)
| Поле | Тип | Описание |
|------|-----|----------|
| key | TEXT | Ключ настройки |
| value | TEXT | Значение (JSON) |
**Системные настройки:**
- `site_name` - Название сайта
- `phone` - Телефон
- `whatsapp` - WhatsApp номер
- `email` - Email
- `address` - Адрес (JSON)
- `social` - Социальные сети (JSON)
- `default_map_center` - Центр карты по умолчанию (JSON)
- `default_map_zoom` - Масштаб карты
### 2.8 Analytics Event (Событие аналитики)
| Поле | Тип | Описание |
|------|-----|----------|
| id | TEXT (UUID) | Уникальный идентификатор |
| type | TEXT | Тип события |
| property_id | TEXT | ID объекта (если применимо) |
| session_id | TEXT | ID сессии |
| ip_address | TEXT | IP адрес |
| user_agent | TEXT | User Agent |
| metadata | TEXT (JSON) | Метаданные |
| created_at | TEXT (ISO) | Дата создания |
---
## 3. API Endpoints
### 3.1 Недвижимость
```
GET /api/properties # Список объектов (?type=&status=&city=&minPrice=&maxPrice=&minArea=&maxArea=&page=&limit=)
GET /api/properties/:slug # Детали по slug
GET /api/properties/featured # Рекомендуемые
POST /api/properties # Создать (admin)
PUT /api/properties/:id # Обновить (admin)
DELETE /api/properties/:id # Удалить (admin)
GET /api/properties/search # Поиск (?q=)
```
### 3.2 Заявки
```
GET /api/leads # Список заявок (admin)
GET /api/leads/:id # Детали заявки (admin)
POST /api/leads # Создать заявку (public)
PUT /api/leads/:id # Обновить (admin)
PUT /api/leads/:id/status # Изменить статус (admin)
DELETE /api/leads/:id # Удалить (admin)
```
### 3.3 Контент
```
GET /api/testimonials # Список отзывов
POST /api/testimonials # Создать (admin)
GET /api/faq # Список FAQ
GET /api/services # Список услуг
GET /api/settings # Настройки сайта
```
### 3.4 Аналитика
```
POST /api/analytics/event # Записать событие
GET /api/analytics/stats # Статистика (admin)
```
### 3.5 Авторизация
```
POST /api/auth/login # Вход
POST /api/auth/logout # Выход
GET /api/auth/me # Текущий пользователь
```
---
## 4. Страницы Frontend
### 4.1 Публичные страницы
1. **Landing Page** (`/`)
- Hero секция с CTA
- Преимущества
- Каталог с фильтрами
- Интерактивная карта
- Статистика
- Услуги
- Отзывы
- FAQ
- Контактная форма
- Footer
2. **Страница объекта** (`/property/:slug`)
- Галерея изображений
- Характеристики
- Коммуникации
- Документы
- Карта
- Калькулятор
- Форма запроса
- Похожие объекты
3. **Страница 404** (`/404`)
### 4.2 Админ-панель (`/admin`)
1. **Dashboard**
- Статистика
- Графики
- Последние заявки
2. **Управление объектами**
- Таблица с фильтрами
- CRUD операции
3. **Управление заявками**
- Таблица
- Детали
- Изменение статуса
4. **Управление контентом**
- Отзывы
- FAQ
- Услуги
5. **Настройки**
- Контакты
- Социальные сети
- SEO
---
## 5. Технологии
### Frontend
- HTML5 + CSS3
- Bootstrap 5.3
- Bootstrap Icons
- Leaflet (карты)
- Chart.js (графики)
- DataTables (таблицы)
- AOS (анимации)
- Lightbox2 (галерея)
### Backend
- Bun runtime
- Hono framework
- SQLite база данных
- Zod валидация
### Deployment
- Docker контейнер
- Порт 8080
---
## 6. Требования к проекту
### 6.1 Функциональные требования
1. **Мультиязычность**
- Испанский (ES) - основной
- Русский (RU)
- Переключение без перезагрузки
2. **Каталог недвижимости**
- Фильтрация по типу, цене, площади
- Фильтрация по коммуникациям
- Поиск по названию/городу
- Карта с маркерами объектов
3. **Заявки**
- Форма на странице объекта
- Форма в контактах
- WhatsApp интеграция
- Email уведомления
4. **Админ-панель**
- Авторизация
- CRUD для объектов
- Управление заявками
- Статистика и аналитика
### 6.2 Нефункциональные требования
1. **Производительность**
- Время загрузки страницы < 3 сек
- Время ответа API < 500 мс
2. **Безопасность**
- Хеширование паролей (bcrypt)
- Защита от CSRF
- Валидация входных данных
3. **Доступность**
- Responsive дизайн
- Поддержка мобильных устройств
- SEO оптимизация