ЯлАрба (yalarba.ru) · EasySite102 (easysite102.ru)
Арба — AI-помощник ЯлАрба. Плавающая кнопка в правом нижнем углу (панель 380×560px). Умеет: находить объекты, отвечать на вопросы о туризме, давать рекомендации. Поддерживает контекст диалога (сессию).
Связанные возможности:
/search сортировка «по релевантности» использует AI-эмбеддинги./rag/docs в llm-svc).Требуется авторизация (POST /chat — auth). Если AI-сервис недоступен — ответ 503, повторите позже.
На странице поиска:
mode=semantic (используется из чата/API).История последних 5 запросов участвует в контексте семантического поиска.
reply).| Метод | Путь | Кто |
|---|---|---|
| POST | /chat | auth. Тело {session_id, message} → {session_id, reply} |
message — обязателен.session_id — идентификатор диалога (передаётся обратно для продолжения).503.yalarba-nuxt/app/components/chat/ChatBot.vueapi_yalarba/internal/domain/chat/llm/app/routers/chat.py, llm/app/services/rag.py| Действие | URL | Требования |
|---|---|---|
| Избранное | /favorites | авторизация |
| Мои отзывы | /reviews | авторизация |
| Отзывы объекта | на деталке объекта /objects/[id] | — |
| Оценка рейтингом | кнопка на деталке | авторизация + подтверждённый email |
Рейтинг объекта — агрегат из одобренных отзывов (платформа «турист»). Модерация отзывов автоматическая (ML-проверка токсичности) + вручную админами.
/objects/[id] нажмите «В избранное» (сердечко).Ограничения:
favorites_max (баннер при заполнении 80%).API: GET /favorites?offset=&limit=, POST /favorites/{objectId}, DELETE /favorites/{objectId}.
- Оценка 1–5 (обязательно),
- Текст — обязательно, до 2000 символов; при оценке ≤ 2 текст обязателен и минимум 10 символов,
- Фото — до N файлов (до 10 МБ каждый).
- сразу — если ML не нашёл токсичности (score < 0.7),
- уходит на пре-модерацию — при score 0.7–0.95,
- отклоняется — при score ≥ 0.95 или стоп-словах.
Владелец объекта получает уведомление (в т.ч. в MAX-бот).
/reviews: редактирование (PUT /reviews/{id}) и удаление (DELETE /reviews/{id}) — только собственные.| Ошибка | Причина | Решение |
|---|---|---|
| «Оценка ≤ 2 требует текст» | валидация | добавьте текст от 10 символов |
| «Требуется подтверждение email» | голосование рейтингом | подтвердите email |
| Отзыв не появился сразу | пре-модерация | дождитесь проверки (статус pending) |
| Отзыв отклонён | токсичность/стоп-слова | переформулируйте |
| Метод | Путь | Кто |
|---|---|---|
| GET | /reviews/object/{objectId} | публично |
| GET | /reviews/my | auth |
| POST | /reviews | auth (rate limit) |
| PUT/DELETE | /reviews/{id} | владелец |
| POST | /ratings/{objectId}/vote | auth + verified email |
| GET | /ratings/object/{objectId} | публично |
| GET | /ratings/{objectId}/my-vote | auth |
yalarba-nuxt/app/components/FeedbackForm.vue, FeedbackList.vue, pages/favorites.vue, pages/reviews/api_yalarba/internal/domain/review/, api_yalarba/internal/domain/rating/, api_yalarba/internal/domain/favorite/Профиль (/profile) — вкладки: Обзор, Избранное, 💎 Подписка, ⚙️ Настройки, Мои отзывы, Мои маршруты, Уведомления, Выход. Настройки — карточки: Обращения, Реферальная программа, Маркетинг, Соцсети, Согласия, Администрирование.
full_name, phone, city.old_password + new_password (мин. 8 символов).API: GET/PUT /me, GET /me/stats, GET /me/export, DELETE /me, POST /change-password, GET/POST /me/2fa/*.
/notifications (вкладки Все/Непрочитанные, «прочитать»).ProfileNotifications) — 8 тумблеров: moderation_status, new_review, new_feedback, new_inquiry, subscription_expiring, marketing, blog_subscription, notification_bot.https://max.ru/id0234009584_bot — /start → «Привязать аккаунт» → email → код из письма; отвязка /unlink. Уведомления дублируются в бот при включённом notification_bot.API: GET /notifications, PUT /notifications/{id}/read, GET/PUT /notification-preferences, POST/DELETE /push-subscriptions.
4 типа согласий: personal_data, terms, offer, cookies.
/profile/consents — дать/отозвать каждое./profile).API: GET /consents, PUT /consents/{type} {action: give|revoke}.
/appeals — форма: Тип (question/complaint/suggestion/wish/other), Тема, Сообщение, Приоритет (low/medium/high/critical). Статусы: new → in_progress → resolved/rejected/closed.
API: POST /appeals (публично), GET /appeals/me (auth).
/profile/referral: ваш реферальный код, статистика переходов/регистраций, конверсии (clicked → registered → subscribed → paid → credited). Бонус: 200 ₽ за регистрацию + VIP-статус на месяц.
API: POST /referrals/generate, GET /referrals/my/stats, GET /referrals/my/conversions, POST /referral/track.
/profile/marketing: частота дайджеста (daily/weekly/never), тумблеры marketing_email, marketing_bot. Отписка — по ссылке из письма.
API: GET/PUT /marketing/subscription, GET /marketing/unsubscribe.
| Ошибка | Причина | Решение |
|---|---|---|
| «Согласие можно дать позже» | cooldown 5 мин после отзыва | подождите 5 минут |
| «Доступ ограничен» | отозваны все согласия | верните согласия в /profile/consents |
| Не приходят уведомления в бот | выключен тумблер / не привязан бот | включите notification_bot, привяжите MAX-бот |
yalarba-nuxt/app/pages/profile/, notifications.vue, appeals.vueapi_yalarba/internal/domain/account/, notification/, notificationpref/, consent/, appeal/, referral/, marketing/, twofa/, push/Раздел для туристов: создание аккаунта, вход, подтверждение email, восстановление пароля.
| Действие | URL | API |
|---|---|---|
| Регистрация | /auth/register | POST /auth/register |
| Вход | /auth/login | POST /auth/login |
| Подтверждение email | /auth/verify-email (по ссылке из письма) | GET /auth/verify-email?token= |
| Восстановление пароля | /auth/reset-password → /auth/reset-password/confirm | POST /auth/reset-password, POST /auth/reset-password/confirm |
| OAuth (VK / Яндекс) | /auth/oauth/{provider} | GET /auth/oauth/{provider}/login?redirect_uri= |
Аккаунт нужен для: избранного, отзывов, маршрутов, AI-чата, подписки, заявок на объекты.
- Имя и Фамилия (складываются в ФИО),
- Email — на него придёт письмо подтверждения,
- Пароль — минимум 8 символов (и при регистрации, и при смене/сбросе),
- Подтверждение пароля — должно совпадать,
- Согласие с условиями — обязательно (без него регистрация не завершится).
?ref=....Ошибки: 400 — неверный email/короткий пароль (мин. 8) / пустое имя; 409 — email уже зарегистрирован.
Сессия: access-токен живёт 15 минут, refresh — 7 дней (автопродление). Выход — кнопка «Выход» в профиле.
Привязка VK / Яндекс: профиль → Соцсети (/profile/social). Отвязка — там же. Лимит попыток OAuth-входа: 10/мин на IP.
| Ошибка | Причина | Решение |
|---|---|---|
| Пароль < 8 символов | валидация | придумайте пароль от 8 символов |
| «Email не подтверждён» при голосовании | нет подтверждения | перейдите по ссылке из письма или «Отправить повторно» |
| «Пароль неверный» | опечатка | сброс пароля |
| Письмо не пришло | спам/задержка | «Отправить повторно», проверьте спам |
| Метод | Путь | Кто |
|---|---|---|
| POST | /auth/register | публично |
| POST | /auth/login | публично |
| POST | /auth/refresh | cookie |
| POST | /auth/logout | auth |
| GET | /auth/verify-email?token= | публично |
| POST | /auth/resend-verification | auth |
| POST | /auth/reset-password | публично |
| POST | /auth/reset-password/confirm | публично |
| GET | /auth/oauth/available, /auth/oauth/providers | публично |
| GET | /auth/oauth/{provider}/login | публично |
yalarba-nuxt/app/pages/auth/api_yalarba/internal/domain/auth/api_yalarba/internal/domain/auth/oauth/| Страница | URL | Требования |
|---|---|---|
| Список маршрутов | /routes | публично (вкладки: Популярные / 🤖 AI-маршруты / Мои) |
| Создать свой | /routes/new | авторизация |
| AI-маршрут | /routes/ai | авторизация + тариф «Стандарт 500» |
| Карточка маршрута | /routes/[id] | публично |
| Редактирование | /routes/[id]/edit | владелец |
Маршрут = набор точек (объектов) с порядком, временем в каждой точке и днём. Автоматически считаются: общее расстояние (км), общая длительность, бюджет. Экспорт в GPX.
/routes/new → заполните Название, Дней (мин. 1), описание (необязательно).- «💾 Сохранить» — приватный (виден только вам),
- «📤 Опубликовать» — публичный (попадает на /routes).
Переход с деталки объекта: кнопка «добавить в маршрут» → /routes/new?add_object=<slug> (точка подставляется автоматически).
/routes/ai — заполните параметры:- Регион (по умолчанию «Республика Башкортостан»),
- Дней: 1 / 2 / 3 / 5 / 7 / 14,
- Бюджет: слайдер 3 000 – 100 000 ₽ (шаг 1000),
- Интересы: до 5 из 15 (природа, история, поход, города, сплав, горы, гастротур, здоровье, лыжи, пещеры, озёра, фототур, семейный, экстрим, паломничество),
- Транспорт: автомобиль / пешком / автобус / смешанный,
- Начальная точка: один из 10 городов РБ (Уфа, Стерлитамак, Салават, Нефтекамск, Белорецк, Сибай, Октябрьский, Туймазы, Ишимбай, Мелеуз),
- Сезон: лето / осень / зима / весна,
- Сложность: лёгкий / средний / сложный,
- «С детьми» — чекбокс.
⚠️ AI-маршруты доступны только с подпиской «Стандарт 500 ₽/мес» (пока тарифы туриста — целевая модель, доступ может включаться пилотно).
/routes/[id]/export.gpx (для навигаторов).| Ошибка | Причина | Решение |
|---|---|---|
| «Доступно только со Стандарт» | AI-маршрут без тарифа | оформите подписку или создайте вручную |
| Нет точек | не добавили ни одной точки | добавьте через поиск или клик по карте |
| Ошибка геокодинга точки | адрес не найден | введите адрес вручную/координаты |
| Метод | Путь | Кто |
|---|---|---|
| GET | /routes | публично |
| GET | /routes/{id}, /routes/slug/{slug} | публично (id — optional auth) |
| GET | /routes/ai/popular | публично |
| GET | /routes/mine | auth |
| POST | /routes | auth |
| PUT/DELETE | /routes/{id} | владелец |
| POST | /routes/{id}/share, /routes/{id}/recalculate | владелец |
| POST | /routes/ai/generate, /routes/ai/regenerate/{id} | auth + тариф |
| GET | /routes/{id}/export.gpx | публично |
Тело создания: {title, description, duration_days, is_public, waypoints:[{object_id, sort_order, title, address, latitude, longitude, note, stay_duration_min, day_number}]}.
yalarba-nuxt/app/pages/routes/, components/RouteBuilder.vueapi_yalarba/internal/domain/route/Раздел для туристов: как находить объекты, применять фильтры, пользоваться картой с кластерами.
/search (yalarba-nuxt/app/pages/search/index.vue).query) + расширенный семантический через AI (сортировка «по релевантности»).sessionStorage (результаты 5 мин, гео 30 мин), история — последние 5 запросов.Введите запрос в поле поиска. Ищется по названию, описанию, городу, владельцу.
| Фильтр | Что делает |
|---|---|
| Категория | тип объекта (комбобокс с поиском), мультивыбор, авто-расширение на подтипы |
| Город | фильтр по городу |
| Владелец | имя/название владельца |
| Цена | от/до |
| Мин. рейтинг | 4.5 / 4 / 3.5 / 3 / 2 / 1 |
| Даты | доступность объекта на даты (от/до) |
| Удобства | мультиселект (Wi-Fi, парковка и т.п.) |
| Локация | «рядом со мной» (геолокация) или координаты + радиус 1–100 км |
по релевантности (AI), по рейтингу, цена ↑/↓, по расстоянию, новые, по названию.
По умолчанию 12 объектов на страницу (максимум 100 на запрос). Кнопки «Назад/Вперёд» + номера страниц.
Кластеры считаются сервером: POST /objects/map-cluster с границами {north, south, east, west, zoom}.
| Ситуация | Причина | Решение |
|---|---|---|
| Пустая выдача | слишком узкие фильтры | уберите фильтры, расширьте радиус |
| Карта не загрузилась | сеть/Leaflet | обновите страницу |
| Много объектов на карте | без кластеров | уменьшите масштаб (кластеры включаются автоматически) |
| Метод | Путь | Описание |
|---|---|---|
| GET | /objects/search | поиск: query, category_id, city, owner_name, price_min, price_max, rating_min, amenity_ids, date_from, date_to, lat, lng, radius, sort_by, sort_order, page, per_page, mode |
| POST | /objects/map-cluster | кластеры: {north, south, east, west, zoom} |
| GET | /objects/map-cluster | то же GET-версией |
Параметры поиска: sort_by=relevance → гибридный AI-поиск; mode=semantic → чистый семантический; rating_min 0–5; category_id — CSV, расширяется на подтипы и группы (stay/sport/culture/health).
yalarba-nuxt/app/pages/search/index.vue, stores/search.ts, utils/constants.tsapi_yalarba/internal/domain/object/, api_yalarba/internal/domain/maplink/| Страница | URL | Тариф |
|---|---|---|
| Дашборд аналитики | /profile/analytics | has_analytics (budget+) |
| Аналитика объекта | на дашборде, выбор объекта | то же |
| Экспорт | /profile/export | has_export (business+) |
Данные собираются автоматически (события просмотров/кликов с сайта, ЯлАрбы и виджета) и агрегируются по дням (object_daily_stats).
total_views — просмотры,total_unique_visitors — уникальные посетители,avg_views_per_day — среднее в день,total_contact_clicks — клики по контактам,top_object — самый просматриваемый объект,daily_stats — динамика за 30 дней,traffic_sources — источники трафика.Выберите объект — дополнительные метрики:
returning_visitors / returning_share — вернувшиеся посетители,total_phone_clicks, total_site_clicks, total_email_clicks,click_conversion_rate — конверсия в клик,inquiries_count, favorites_count, reviews_count,traffic_sources + source_breakdown (easysite / yalarba / widget),geo — города/регионы посетителей,inquiry_trend, recent_inquiries,competitors — сравнение с категорией./profile/export → выберите формат (CSV — с BOM для Excel / JSON) и период (1–365 дней):
| Выгрузка | Что содержит |
|---|---|
| Объекты | ID, название, категория, тип, город, адрес, координаты, цена, контакты, статус, просмотры, отзывы |
| Аналитика | агрегаты по дням |
| Аналитика объекта | по конкретному объекту |
| Отзывы | фидбек по объекту |
| Персональные данные | по 152-ФЗ ст.20 (JSON) |
Экспорт доступен при tariff.has_export (business, vip, municipal, nko). Иначе — «экспорт недоступен на вашем тарифе».
| Ошибка | Причина | Решение |
|---|---|---|
| Аналитика пустая | мало событий / агрегация не запущена | дождитесь данных (агрегация по дням, backfill 90 дней) |
| «Экспорт недоступен» | тариф без has_export | повысьте тариф (business+) |
| CSV кривой в Excel | без BOM | открывайте CSV (BOM уже добавляется автоматически) |
| Метод | Путь | Кто | |
|---|---|---|---|
| GET | /analytics/dashboard | auth + verified | |
| GET | /analytics/objects/{id} | владелец | |
| GET | /analytics/objects/{id}/competitors | владелец | |
| POST | /analytics/events | публично (rate limit) | |
| POST | /analytics/internal/events | только Docker-сеть | |
| GET | /analytics/admin/dashboard?days= | admin | |
| GET | /analytics/admin/objects | admin | |
| GET | `/export/objects?format=csv\ | json` | auth + has_export |
| GET | /export/analytics?format=&days= | auth + has_export | |
| GET | /export/analytics/objects/{id} | владелец | |
| GET | /export/feedbacks?object_id= | auth + has_export |
easySite/app/pages/profile/analytics.vue, export.vue, components/ObjectAnalyticsPanel.vueapi_easysite/internal/domain/analytics/, export/cmd/main.go (backfill 90 дней + тикер ежечасно, object_daily_stats)Заявки с объектов (из виджета, страницы объекта, ЯлАрбы) и заказы автоматически превращаются в лиды в вашей CRM. Поддерживаются AmoCRM (OAuth v4) и Bitrix24 (webhook/rest). Доступно на тарифе с флагом has_crm (VIP).
| Страница | URL |
|---|---|
| Интеграции | /profile/crm |
client_id, client_secret.redirect_uri — например https://ваш-сайт.ru/crm/amocrm/callback./profile/crm заполните:- client_id, client_secret, redirect_uri,
- subdomain — поддомен аккаунта (без .amocrm.ru).
https://портал.bitrix24.ru/rest/1/xxxx/
webhook_url в /profile/crm.crm.lead.add.json).crm_sent (повторно не отправляются).active | error | disabled. При ошибке — проверьте токены/права./profile/crm.| Ошибка | Причина | Решение |
|---|---|---|
| «Интеграция недоступна» | тариф без has_crm | повысьте до VIP |
| Лиды не создаются | неверные креды/правa | проверьте client_secret, права вебхука |
| OAuth-токен протух | интеграция отключена | переподключите, refresh автоматический |
Статус error | ошибка отправки | нажмите «Тест», исправьте параметры |
| Метод | Путь | Кто |
|---|---|---|
| GET/POST | /crm/integrations | auth + has_crm |
| PUT/DELETE | /crm/integrations/{id} | владелец |
| POST | /crm/integrations/{id}/test | владелец |
easySite/app/pages/profile/crm.vueapi_easysite/internal/domain/crm/ (AmoCRM OAuth v4, Bitrix24 webhook/rest, producer-consumer, crm_sent)| Действие | URL/API |
|---|---|
| Редактирование | /objects/[id]/edit |
| Расширения (extension) | в форме редактирования, ExtensionForm |
| Акции | блок «Акции и новости» на /objects/[id]/edit |
| События | блок «События» |
| Удаление | кнопка 🗑️ на карточке (DELETE /objects/{id}) |
| Batch-операции | /objects/my-objects (галочки + массовые действия) |
Откройте /objects/[id]/edit. Доступно:
short_name*, long_name, title, description, short_description, status (draft/moderation/active).prices[], контакты (phone, email, site), время работы.has_payments): enabled, method (link|sbp|manual), payment_link, СБП-реквизиты (sbp_bank/inn/bik/account/tsp/city/mcc).general (лимит тарифа), title (до 3), description (до 5, с подписью).publish_to_b2c — публикация на YalArba.ru (B2C-витрину).extra_attrs key-value.На странице редактирования:
sale (скидка 🔥) / notice (уведомление ℹ️), discount_percent, valid_from/until, is_featured. Лимиты тарифа: max_sales, max_notices.none|daily|weekly|monthly|yearly, при повторе обязательно «повторять до»), «весь день». Лимит max_events.Оба раздела привязаны к объекту и попадают в календарь B2C (yalarba.ru) — только для объектов с publish_to_b2c=true, is_active=true, status=active.
GET /objects/{id}/orders, смена статуса (paid/cancelled).GET /objects/{id}/bookings, создание POST /objects/{id}/bookings/manual, статусы requested/confirmed/cancelled (проверка пересечений дат).GET/POST /objects/{id}/slots/admin, PUT/DELETE .../slots/admin/{slotId}.GET /objects/{id}/customers?segment=, POST /objects/{id}/customers/mail (тема+сообщение, SMTP).На /objects/my-objects выберите объекты галочками → массовые действия:
POST /objects/batch/update — массовое обновление полей (например, цены),POST /objects/batch/update-extensions — массовое обновление расширений,POST /objects/batch/change-type — смена типа,POST /objects/batch/delete — массовое удаление.Лимит: до 100 объектов за раз.
Кнопка 🗑️ на карточке (или DELETE /objects/{id}). Мягкое удаление (GORM DeletedAt) — объект скрывается, данные сохраняются в БД.
GET /update-history/model/object/{objectId} — журнал изменений объекта.
| Ошибка | Причина | Решение |
|---|---|---|
| 403 при сохранении | вы не владелец | проверьте права |
| Лимит событий/акций | превышен max_events/max_sales | повысьте тариф |
| Фото цены не загружается | >1 МБ | сожмите фото до 1 МБ |
| Batch > 100 | лимит | разделите на части |
easySite/app/pages/objects/[id]/edit.vue, easySite/app/components/ObjectForm.vue, ExtensionForm.vue, my-objects.vueapi_easysite/internal/domain/object/, promotion/, event/, objectpayment/, booking/, slot/, batchops/, updatehistory/После создания объект проходит автоматическую + ручную модерацию. Статусы: draft → moderation → active, или inactive (скрыт), rejected (отклонён).
| Статус | Значение |
|---|---|
draft | черновик (виден только владельцу) |
moderation | на проверке модератором |
active | опубликован (виден всем, в т.ч. на B2C при publish_to_b2c) |
inactive | скрыт владельцем/системой |
rejected | отклонён (причина — комментарий модератора) |
Статус виден на бейджах /objects/my-objects (draft=серый, moderation=жёлтый, active=зелёный, rejected=красный) и счётчиками в профиле.
| # | Критерий | Вес | Авто-проверка |
|---|---|---|---|
| 1 | Фотографии | critical | ≥1 фото |
| 2 | Контакты | critical | phone или email |
| 3 | Описание | high | ≥500 символов |
| 4 | Адрес и координаты | high | address или lat/lng |
| 5 | Цена | high | price > 0 |
| 6 | Категория | high | object_type_id задан |
| 7 | Удобства | medium | ≥1 amenity |
| 8 | Грамотность | medium | только человек |
| 9 | Доп. классификаторы | low | любой из 6 списков |
| 10 | Сайт и соцсети | low | site задан |
| 11 | Нет дубликатов | high | авто (похожее название+город) |
| 12 | Нет стоп-слов | high | авто |
| 13 | Нет токсичности (ML) | medium | авто (moderation-svc) |
Автоматические проверки выполняются сразу; человеческая — модератором в /admin/objects → review/[id] (сводка по весам critical/high/medium/low, авто-индикаторы ✅/❌).
Чтобы объект одобрили, проверьте перед отправкой:
moderation).moderation.publish_to_b2c=true попадает на yalarba.ru (поиск, каталог, карта). Создаётся новость «Объект добавлен» (авто-публикация).moderation_hours): у VIP — быстрее (24 ч), у free — стандартный.| Метод | Путь | Кто |
|---|---|---|
| GET | /admin/objects/moderation | модератор |
| GET | /admin/objects/{id}/review | модератор |
| PUT | /admin/objects/{id}/review {results:[{criteria_id, passed, comment}]} | модератор |
| PATCH | /admin/objects/{id}/approve | модератор |
| PATCH | /admin/objects/{id}/reject | модератор |
| GET | /admin/objects/content-review | модератор |
easySite/app/pages/admin/objects/, my-objects.vueapi_easysite/internal/domain/moderation/, object/ (статусы), news/ (авто-публикация)| Страница | URL |
|---|---|
| Мастер создания | /objects/create |
| Пошаговая инструкция | /objects/add-guide |
| Мои объекты | /objects/my-objects |
Объект создаётся в мастере из 9 шагов. На первом шаге создаётся черновик (status=draft), остальные шаги дополняют его. При отправке на модерацию статус → moderation.
| Шаг | Что заполняете |
|---|---|
| 0. Название и тип | short_name* (≤100), long_name, title, тип объекта (ClassifierSelect), tourism-типы |
| 1. Параметры | ExtensionForm — поля зависят от типа объекта (категории) |
| 2. Описание | short_description, description |
| 3. Адрес | адрес (каскад ГАРН/ФИАС), city, координаты (карта/пин/геокодинг) |
| 4. Фото | ImageUploader (доступен после создания черновика) |
| 5. Контакты | phone, email, site |
| 6. Время работы | working_hours |
| 7. Цены и удобства | prices[], amenity_ids, транспорт/возраст/группы/культурное наследие/риски |
| 8. Предпросмотр | сводка |
address_quality: good) — иначе none/unmatched.POST /objects/import-from-map).photo_limit_reached → модалка «Повысить тариф».| Тариф | Объектов | Фото |
|---|---|---|
| free | 1 | 1 |
| budget | 5 | 3 |
| business | ∞ | 10 |
| vip | ∞ | ∞ |
| municipal | 50 | 30 |
| nko | 20 | 20 |
При превышении — tariff_limit_reached → предложение повысить тариф.
Черновик автоматически сохраняется в localStorage (stores/objectDraft) — при обрыве можно продолжить.
| Ошибка | Причина | Решение |
|---|---|---|
tariff_limit_reached | превышен лимит объектов | повысьте тариф |
photo_limit_reached | превышен лимит фото | удалите лишние или повысьте тариф |
| Адрес не найден | нет в ФИАС | введите вручную, координаты через пин |
| Не сохранён шаг 0 | short_name пустое | заполните название |
| Метод | Путь | Кто |
|---|---|---|
| POST | /objects (status=draft) | auth |
| PUT | /objects/{id} | владелец |
| POST | /objects/import-from-map {url} | auth |
| GET | /object-types, /tourism-types, /amenities, /transport-types, /age-groups, /group-types, /cultural-heritage-types, /risk-factors | публично |
| GET | /addresses/localities, /streets, /houses, /geocode, /reverse | публично |
| POST | /upload (multipart file+object_id) | владелец |
| POST | /upload/price | владелец (фото позиции прайса, ≤1 МБ) |
easySite/app/components/objects/ObjectWizard.vue, LocationPicker.vue, AddressCascade.vue, ExtensionForm.vue, easySite/app/pages/objects/create.vueapi_easysite/internal/domain/object/, address/, upload/EasySite — B2B-платформа для владельцев туристических объектов. Регистрация → подтверждение email → заполнение профиля → верификация модератором (проверка личности/бизнеса) → публикация объектов.
| Страница | URL |
|---|---|
| Регистрация | /auth/register |
| Вход | /auth/login |
| Восстановление пароля | /auth/forgot-password, /auth/reset-password |
| Подтверждение email | /auth/verify-email, /auth/verify-email-pending |
| Профиль + подача на верификацию | /profile/edit |
- Email (валидный),
- Имя и Фамилия (мин. 2 символа),
- Пароль (мин. 8 символов) + подтверждение,
- Согласие (152-ФЗ) — обязательно,
- Маркетинговое согласие — опционально,
- Тип предприятия: ИП / ООО / АО / МУП / ГУП / АУ / НКО / (физлицо),
- Самозанятый (НПД) — чекбокс.
Верификация email обязательна для публикации отзывов/заявок; согласия обязательны для CRUD объектов.
/profile/edit — поля: full_name, inn (до 12), phone, city, email, enterprise_type, org_full_name, org_short_name, org_inn, address, planned_objects_count; аватар — загрузка/удаление. Сохранение — кнопка «Сохранить».
POST /account/me/submit-verification) — статус станет pending.phone_verified (телефон подтверждён), inn_checked (ИНН проверен), address_confirmed (адрес подтверждён), objects_discussed (объекты обсуждены), responsibility_informed (об ответственности уведомлён).not_submitted | pending | approved | rejected./profile.После верификации становятся доступны: публикация объектов, аналитика, экспорт и др. Для администраторов/модераторов — раздел /admin/verification.
| Ошибка | Причина | Решение |
|---|---|---|
| Пароль < 8 | валидация | пароль от 8 символов |
| «Email не подтверждён» | нет подтверждения | ссылка из письма / «Отправить повторно» |
| Заявка на проверку не уходит | профиль не заполнен | заполните все обязательные поля |
| Верификация отклонена | чеклист не выполнен | исправьте по комментарию модератора |
| Метод | Путь | Кто |
|---|---|---|
| POST | /auth/register, /auth/login, /auth/refresh, /auth/logout | публично |
| POST | /auth/reset-password, /auth/reset-password/confirm | публично |
| GET | /auth/verify-email?token= | публично |
| POST | /auth/resend-verification | auth |
| PUT | /account/me | auth |
| POST | /account/me/avatar, DELETE /account/me/avatar | auth |
| POST | /account/me/submit-verification | auth |
| GET | /account/admin/accounts/pending-verification | admin |
| PUT | /account/admin/accounts/moderator-verify | admin |
easySite/app/pages/auth/, easySite/app/pages/profile/edit.vue, easySite/app/pages/admin/verification/api_easysite/internal/domain/auth/, api_easysite/internal/domain/account/| Страница | URL |
|---|---|
| Тарифы | /pricing |
| Оплата | /pay |
| Моя подписка | /profile → вкладка «Подписка» |
Оплата — ручной перевод (карта Т-Банка или СБП по QR). После перевода укажите назначение платежа, админ подтверждает → создаётся подписка.
| slug | Название | Цена | Объектов | Фото/объект | Аналитика | Экспорт | API | Платежи | CRM | Виджет |
|---|---|---|---|---|---|---|---|---|---|---|
free | Бесплатный | 0 ₽ | 1 | 1 | – | – | – | – | – | – |
budget | Бюджетная 500 | 500 ₽/мес | 5 | 3 | ✓ | – | – | – | – | – |
business | Бизнес 1000 | 1000 ₽/мес | ∞ | 10 | ✓ | ✓ | – | – | – | – |
vip | VIP 2500 | 2500 ₽/мес | ∞ | ∞ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
municipal | Муниципальный | по договорённости | 50 | 30 | ✓ | ✓ | ✓ | – | – | – |
nko | Социальный | 0 ₽ | 20 | 20 | ✓ | ✓ | – | – | – | – |
Особенности:
municipal — только для МУП/ГУП/АУ; nko — для НКО.business и nko имеют триал (14 и 30 дней соответственно).has_analytics, has_priority_boost, has_export, has_api, has_payments, has_crm, has_widget, moderation_hours, max_sales, max_notices, max_events, support_level.- карта Т-Банка 2200 7005 6131 9004, или
- СБП по QR.
{tariff_slug} {N}мес {email}
Пример: business 1мес ivan@mail.ru.
POST /manual-payments). Статус платежа — pending.Если назначение платежа заполнено неверно — админ не сможет сопоставить платёж, обработка затянется. Пишите точно по шаблону.
/profile → «Подписка».PUT /subscriptions/cancel)./profile → «Платежи» (GET /me/payments, GET /me/manual-payments).subscription_expiring).POST /subscriptions — создание подписки автоматически (например, после подтверждённого ручного платежа). Обычно пользователю не требуется вызывать вручную.
| Ошибка | Причина | Решение |
|---|---|---|
| Платёж «завис» в pending | назначение платежа не совпало | напишите в поддержку с номером перевода и email |
| Тариф не активировался | подтверждение ещё не прошло | подождите (обычно в течение рабочего дня) |
| Недоступен раздел (CRM/виджет/экспорт) | тариф без флага | повысьте тариф |
| Метод | Путь | Кто |
|---|---|---|
| GET | /tariffs, /tariffs/{slug} | публично |
| GET | /me/subscription | auth |
| POST | /subscriptions | auth |
| PUT | /subscriptions/cancel | auth |
| GET | /me/manual-payments, /me/payments | auth |
| POST | /manual-payments | auth |
| GET | /admin/manual-payments | admin |
| PUT | /admin/manual-payments/{id}/confirm / /reject | admin |
easySite/app/pages/pay/index.vue, pricing.vue, admin/payments.vue, admin/subscriptions/api_easysite/internal/domain/tariff/, subscription/, manualpayment/Виджет — кнопка заявок на вашем сайте. Посетитель нажимает → открывается форма → заявка приходит вам (в профиль + в CRM при подключении). Доступен на тарифе с флагом has_widget (Business+).
| Страница | URL |
|---|---|
| Настройка | /profile/widget |
| Вставка | код на ваш сайт |
/profile/widget → «Создать виджет»:
| Параметр | Описание |
|---|---|
| Объект | конкретный объект или «все объекты» (null) |
| Цвет | primary_color (hex) |
| Позиция | правый/левый нижний угол |
| Заголовок | title (≤100) |
| Текст кнопки | button_text (≤50) |
| Иконка кнопки | чат / телефон / календарь |
| Поля формы | чекбоксы: имя, телефон, email, комментарий, даты |
| Сообщение после отправки | success_message |
| Разрешённые домены | allowed_domains — где виджет можно встраивать (защита от чужого размещения) |
Создание требует: авторизацию + подтверждённый email + тариф с has_widget.
После создания получите embed_code:
<script async defer src="{base}/widget/embed.js" data-widget-id="{id}"></script>
Вставьте его перед </body> на вашем сайте (или в шаблон CMS/лендинга).
GET /objects/{id}/customers (объединение заявок и заказов), в раздел «Заявки» профиля, в CRM (если подключена).| Ошибка | Причина | Решение |
|---|---|---|
| «Виджет недоступен» | тариф без has_widget | повысьте тариф (Business+) |
| Заявки не приходят | виджет на другом домене | добавьте домен в allowed_domains |
| Кнопка не видна | код вставлен неверно | проверьте data-widget-id, вставьте перед </body> |
| Метод | Путь | Кто |
|---|---|---|
| GET/POST | /widget/configs | auth + verified + has_widget |
| PUT/DELETE | /widget/configs/{id} | владелец |
| GET | /widget/config/{widget_id} | публично |
| POST | /widget/inquiry | публично (rate limit 5/час/IP, honeypot) |
| GET | /widget/embed.js | публично (go:embed widget.min.js) |
easySite/app/pages/profile/widget.vue, easySite/widget/ (JS)api_easysite/internal/domain/widget/