Skip to content

Полный флоу-тест: от компании до чата ​

Сценарий полного ведения проекта, каким его видит клиент. Каждый этап — самостоятельный чек-лист: «Шаги» можно выполнять при регрессе буквально по пунктам, «Фактический результат» — состояние на прогоне 16.07.2026.

Роль по умолчанию: admin@seed.rms (этапы 1–6), logist@seed.rms (этап 7), manager@seed.rms (этапы 8–9).

1. Компании ​

Шаги:

  1. Меню «Компании» → «Добавить компанию».
  2. В поле «ИНН компании» ввести ИНН (например, 7707083893) → выбрать подсказку DaData.
  3. Проверить автозаполнение: название, КПП, юр. название, ОГРН, ген. директор, должность, адрес.
  4. Дозаполнить email/телефон → «Сохранить».
  5. В карточке компании: вкладка «Реквизиты» → «Добавить счет» → ввести БИК (044525225) → проверить автозаполнение банка → ввести 20-значный счёт → «Создать счет».
  6. Кнопка «Печать карточки» → должен выгрузиться PDF.

Ожидаемо: компания создана, карточка заполнена, счёт помечен «Основной», PDF карточки содержит реквизиты и банковский счёт.

Фактически: ✅ работает целиком, включая DaData по ИНН и БИК. Замечания:

  • Колонка «Тип» в списке компаний всегда пустая («—»), хотя тип (ПАО/ООО) в данных есть — он виден в PDF карточки.
  • В PDF карточки тип и юр. название приводятся к «Пао», «Публичное акционерное общество "сбербанк россии"» — кривая нормализация регистра.
  • Вторая страница PDF почти пустая (только подпись «Карточка сформирована автоматически»).
  • Узкие колонки-лейблы в PDF рвут слова («Руководител / ь»).

2. Контакты ​

Шаги:

  1. В карточке компании → вкладка «Контакты» → «Новый контакт».
  2. Заполнить имя/фамилию/должность/телефон/email → «Создать и привязать».
  3. Проверить счётчик «Контакты» в карточке компании (должен стать 1).
  4. Раздел «Контакты» → найти контакт, открыть карточку → вкладки «Основная информация / Компании / Проекты».

Ожидаемо: контакт создан, привязан к компании, виден в общем списке с названием компании.

Фактически: ✅ работает. Кнопка «Привязать контакт» позволяет привязать существующий.

3. Проект ​

Шаги:

  1. «Проекты» → «Добавить проект».
  2. Заполнить: название, Компания (поиск по названию — клиент), Контактное лицо (список фильтруется по выбранной компании), Моя компания (юрлицо-исполнитель, определяет режим/ставку НДС), режим НДС «Наследовать», Локация (обязательное), статус, менеджер, Отдел (обязательное), плановый бюджет, даты.
  3. «Сохранить» → проект появляется в списке; открыть карточку.

Ожидаемо: карточка проекта с клиентом, контактом, локацией, датами, бюджетом; вкладки Задачи / Файлы / Оборудование / Логистика / Команда / Бюджет-Смета / Документы.

Фактически: ✅ работает. Замечания:

  • «Локация» до первого сабмита не помечена как обязательная — узнаёшь только по красной подсветке после «Сохранить».
  • Селект «Менеджер проекта» не фильтруется по вводу с клавиатуры (в отличие от компании/контакта/локации) — при 25+ сотрудниках неудобно.
  • У свежесозданного проекта без задач в шапке сразу «Выполнено 8% задач» — число из ниоткуда.
  • «Плановый бюджет» проекта не связан с «Плановым бюджетом» в настройках сметы (см. этап 5).
  • В справочнике локаций есть дубли («Москва, ул. Тверская, 7» дважды).

4. Команда проекта ​

Шаги:

  1. Карточка проекта → вкладка «Команда» → «Добавить участника».
  2. Выбрать сотрудника, ставку ₽/час, отметить роли в проекте (Менеджер проекта / Логист / Инженер / Бухгалтер / Исполнитель / …) → «Сохранить».
  3. Повторить для всех членов команды.
  4. Проверить статусы участников.

Ожидаемо: участники добавлены с ролями, ждут подтверждения («Ожидает»).

Фактически: ✅ в целом работает, но диалог ведёт себя коварно:

  • После «Сохранить» диалог не закрывается и не сбрасывает чекбоксы ролей — при добавлении следующего участника роли предыдущего остаются отмеченными. На прогоне инженер получил лишнюю роль «Логист» незаметно для оператора.
  • Менеджер, назначенный «Ответственным» при создании проекта, автоматически в команду не добавляется — его нужно добавлять руками.
  • Empty-state пустой команды: «По вашему запросу участники не найдены» вместо нейтрального «В команде пока нет участников».
  • Повторное добавление того же сотрудника бэкенд обрабатывает как upsert (дублей не создаёт) — хорошо.

5. Бюджет и смета ​

Шаги:

  1. Вкладка «Бюджет/Смета» → «Добавить статью»: название, категория, плановая/фактическая сумма → «Сохранить».
  2. Проверить KPI (план/факт/отклонение/маржинальность), блок «Итоги» (базовая сумма, наценка, НДС, итоговая).
  3. Блок «Настройки сметы»: плановый бюджет, сумма сметы → «Сохранить».
  4. «Сгенерировать смету» → должен появиться документ.

Ожидаемо: статьи добавляются, итоги пересчитываются, настройки сохраняются, смета генерируется.

Фактически: ⚠️ два блокера контракта фронт↔бэк:

  • «Добавить статью» всегда падает с 400 {"field":"name","message":"unknown field"}. Фронт (src/api/finance/index.ts) шлёт name, бэкенд (createCostItemRequest) принимает только project_id, category, planned_amount, actual_amount, notes со строгой валидацией. Человекочитаемое название статьи бэкенд хранит в notes.
  • «Настройки сметы» всегда падают с 400 {"field":"planned_budget","message":"unknown field"}. Бэкенд (updateSettingsRequest модуля budget) ждёт markup_percent, usn_percent, usn_display_mode, vat_display_mode, notes — фронт шлёт другую модель (плановый бюджет + сумма сметы). GET /projects/:id/budget/settings при этом отдаёт 404, т.е. фронт даже не читает актуальные настройки.

При статьях, созданных напрямую через API (POST /api/v1/finance/cost-items с notes), всё остальное работает: ✅ статьи отображаются (название берётся из notes), категории группируются, «Итоги» при режиме «НДС включён 22%» считают правильно: база 770 000,00 → НДС в т.ч. 138 852,46 (= 770 000 × 22/122), итог 770 000,00.

  • «Сгенерировать смету» ✅ создаёт документ, но тост говорит просто «Смета создана» без ID/ссылки: бэкенд отвечает Go-полями ID/ProjectID/..., а фронт ждёт id — идентификатор теряется.

6. Документы ​

Подробный разбор — на отдельной странице Генерация документов.

Кратко: генерация сметы/счёта/акта/договора работает через POST /api/v1/projects/:id/documents/{estimate|invoice|act|contract}, файлы уходят в S3 и видны во вкладке «Файлы» проекта. Но:

  • вкладка «Документы» проекта показывает захардкоженный мок («Счет #661, Иван Иванов…» ×9) — реальных документов там нет, и API списка документов по проекту не существует;
  • PDF счёта нечитаем (битая кириллица);
  • типа «доп. соглашение» нет;
  • заголовок вкладки «Файлы» — «Список заявок» (копипаст).

7. Логистика (за логиста) ​

Шаги:

  1. За менеджера/админа: вкладка «Оборудование» проекта → «Добавить» → выбрать позицию из каталога (цена подтягивается) → при дефиците появляется «Создать заявку» → подтвердить.
  2. Проверить: вкладка «Логистика» проекта — заявка «На рассмотрении»; блок итогов оборудования — «НДС включён», сумма НДС.
  3. Перелогиниться логистом → «Логистика» → вкладка «Заявки от менеджеров» → открыть заявку.
  4. «Создать операции» → мастер: 1) выбор оборудования, 2) проверка наличия + тип обеспечения (Перемещение/Аренда/Покупка), 3) параметры маршрута, 4) preview → «Сохранить».

Ожидаемо: операция создаётся, заявка переходит «В работе», операция видна в «Списке операций».

Фактически: ⚠️ создание заявки и её видимость логисту — ✅; создать операцию не удалось ни одним способом:

  • Перемещение: шаг 2 показывает «1 шт. Обеспечено» (источник — склад Бутово), но preview автоплана (POST /equipment-requests/:id/auto-plan/preview) возвращает available_main_warehouse_qty: 0, uncovered_qty: 1, has_errors: true — бэкенд считает только основной склад и не получает выбранные в мастере источники. «Сохранить» заблокирована навсегда.
  • Покупка: на шаге 3 «Откуда = Закупка» — это не локация из справочника, а валидатор фронта (canSubmitRoutes в src/pages/logistics.vue) требует резолва from_location_id. «Далее» заблокирована навсегда.
  • Дашборд логистики (Всего операций / В пути / Доставлено) показывает нули, «Список операций» пуст, при этом в списке заявок есть сид-заявка со статусом «В пути» — операции в списки не попадают.
  • В списках заявок часть проектов отображается как «Проект #3» вместо названия.

Дополнительно ✅: при создании заявки на оборудование автоматически создаётся задача «Новая заявка на оборудование» в канбане проекта — связка логистики и задач работает.

8. Задачи ​

Шаги:

  1. Вкладка «Задачи» проекта → «Добавить задачу»: заголовок, ответственный, дедлайн, описание (обязательно!) → «Сохранить».
  2. В карточке задачи: «Начать выполнение» → статус «В работе», пошёл учёт времени.
  3. «Завершить» → статус «Готово», зафиксировано время.
  4. Написать комментарий в чате задачи.

Ожидаемо: канбан Планируется / В работе / Завершено / Отложено, статусы двигаются, чат работает.

Фактически: ✅ работает. Замечания:

  • «Описание» обязательно для сохранения, но не помечено — кнопка «Сохранить» просто серая без объяснений (валидация: title + assignee + deadline + description).
  • Поле «Примечание», заполненное в форме создания, в карточке не появилось («Без примечаний»).
  • Пока задача «В работе», «Учтено времени» показывает время старта (13:55:08), а не длительность; после завершения — корректную длительность (00:00:29).
  • Список «Ответственный» не ограничен командой проекта — можно назначить любого сотрудника компании.
  • Enter в чате не отправляет сообщение — только кнопка.

9. Чаты ​

Шаги:

  1. Плавающая кнопка «Открыть чаты» (внизу справа на любой странице).
  2. Вкладки: Личные / Задачи / Группы. Чат проекта создаётся автоматически при создании проекта.
  3. Отправить сообщение в чат проекта и в личный чат.

Ожидаемо/Фактически: ✅ работает: сообщения доставляются, диалог поднимается в списке, у чатов задач отдельная вкладка. Раздел «Чаты» в главном меню отсутствует (страница /chats существует) — вход только через плавающую кнопку.

Загружаем документацию…