UI/UX ТЗ: карточка объекта и экран монтажников¶
Детализация интерфейсов для CRM-модуля
alatyr-service. Базовая модель данных: crm-objects-spec.md.
Дата решения: 2026-08-09
Статус: дизайн v1 утверждён для реализации MVP
Стек: React, Wouter, TanStack Query, Radix UI, Tailwind CSS, Lucide
Цели интерфейса¶
Карточка объекта должна за 10–15 секунд отвечать:
- Что это за объект, кто заказчик и кто ответственный?
- Где объект находится по срокам и статусу?
- Что выполнено, что просрочено и что блокирует работу?
- Кто сейчас работает на объекте?
- Сколько начислено монтажникам и сколько выплачено?
- Какие договоры, счета, акты и платежи связаны с объектом?
Экран сотрудников должен за 10–15 секунд отвечать:
- Кто сегодня на смене и где?
- У кого незакрытая или спорная смена?
- Сколько часов и денег начислено за период?
- Сколько выплачено и какой остаток?
- На какие объекты назначен конкретный сотрудник?
Навигационная архитектура¶
Новые рабочие сущности не добавляются девятой и десятой вкладками в существующую сетку /admin. Для них создаются отдельные маршруты:
/admin/requests— список заявок;/admin/requests/:id— полная карточка заявки;/admin/objects— список объектов;/admin/objects/new— создание объекта;/admin/objects/:id— карточка объекта;/admin/workers— экран сотрудников производственного блока;/admin/workers/:id— карточка сотрудника;/admin/timesheet— полный табель смен.
В существующем /admin добавляются две заметные ссылки: Объекты и Сотрудники. На первом этапе они могут быть кнопками в заголовке. После появления трёх и более отдельных CRM-разделов следует выделить общий AdminLayout с боковой навигацией.
Карточки заявки, объекта и сотрудника открываются отдельными страницами, а не Dialog/модальными окнами. Модальные окна используются только для коротких атомарных действий: назначить сотрудника, закрыть смену, добавить начисление, зафиксировать выплату или подтвердить опасное действие.
Текущую вкладку /admin с управлением системными ролями следует переименовать из Сотрудники в Доступ, чтобы не смешивать права входа с производственным учётом.
Хлебные крошки¶
Админка / Объекты / 2026-015Админка / Сотрудники / Иван ПетровАдминка / Заявки / #125
Клик по коду или имени возвращает на соответствующий список. Кнопка браузера «Назад» не должна терять фильтры списка: они хранятся в query string.
Карточка объекта¶
Маршрут и роли¶
Маршрут: /admin/objects/:id
admin— полный доступ, включая финансы, ставки и выплаты;manager— объект, документы, задачи, бригада и смены; выплаты по настройке прав;- пользователь с permission
crm.assigned_objects.read— только назначенные объекты, задачи, состав бригады и смены без финансов; master— в MVP не открывает админскую карточку, работает через Telegram и/master.
Компоновка desktop¶
Рабочая ширина увеличивается с текущих max-w-6xl до max-w-7xl. Страница состоит из закрепляемой шапки объекта, полосы KPI и вкладок.
┌──────────────────────────────────────────────────────────────────────────────┐
│ Админка / Объекты / 2026-015 [Действия ▾] [Изменить]│
│ 2026-015 · Склад Иванова в Химках [В работе] │
│ ООО Иванов и Ко · Химки, ул. Заводская, 10 · ИП Головин │
│ Ответственный: Роман · Дедлайн: 28.08.2026 · обновлено 12 минут назад │
├──────────────────────────────────────────────────────────────────────────────┤
│ Договоры Получено Остаток Бригада Задачи │
│ 4 800 000 ₽ 2 100 000 ₽ 2 700 000 ₽ 4 человека 3 просрочено │
│ 44% [████░░░░░] │
├──────────────────────────────────────────────────────────────────────────────┤
│ Обзор | Работы | Бригада и смены | Финансы | Документы | История │
├──────────────────────────────────────────────────────────────────────────────┤
│ Основная колонка 2/3 │ Правая колонка 1/3 │
│ │ │
│ Ближайшие этапы │ Состояние объекта │
│ Открытые задачи │ Ответственные │
│ Последние события │ Быстрые действия │
└──────────────────────────────────────────────────────────────────────────────┘
Шапка объекта¶
Шапка остаётся видимой при прокрутке вкладки на desktop. Она содержит:
- неизменяемый
objects.codeмоноширинным небольшим текстом; - редактируемое
objects.name; - статус с текстом и Badge, не только цветом;
- клиент, адрес и
ownCompanyId; - менеджер, плановый дедлайн, дата последнего изменения;
- предупреждение о паузе или просрочке отдельной строкой;
- основную кнопку
Изменить; - меню
Действия.
Меню Действия:
- изменить статус;
- добавить договор;
- выставить счёт по этапу;
- добавить монтажника;
- создать задачу;
- открыть Telegram-чат;
- скопировать ссылку;
- закрыть или отменить объект.
Опасные действия отделяются Separator и требуют подтверждения. Изменение objects.code в UI отсутствует.
Полоса KPI¶
Пять компактных показателей:
- сумма активных договоров;
- получено и процент оплаты;
- остаток к получению;
- активная бригада и открытые смены сегодня;
- открытые и просроченные задачи.
KPI кликабельны и переключают на соответствующую вкладку. Числа используют табличные цифры. Красный цвет применяется только для фактической просрочки или ошибки; обычный остаток не красный.
Вкладка «Обзор»¶
Главная рабочая сводка. Она не дублирует все таблицы целиком.
Основная колонка:
Ближайшие этапы— до пяти этапов по плановой дате;Требует внимания— просрочки, спорные смены, неподписанные акты, непривязанные документы МД;Открытые задачи— до семи задач с исполнителем и сроком;Последние события— хронология изaudit_log.
Правая колонка:
- статус и причина паузы;
- клиент и основной контакт;
- менеджер и прораб;
- направления работ;
- даты старта, дедлайна и гарантии;
- быстрые действия.
Если проблем нет, блок Требует внимания показывает спокойное пустое состояние «Критичных вопросов нет», а не исчезает.
Вкладка «Работы»¶
Объединяет этапы и задачи в производственный контекст.
Верхняя часть:
- переключатель
Этапы / Задачи; - фильтры по разделу, исполнителю, статусу;
- кнопки
Добавить этапилиНовая задача.
Этапы показываются вертикальным списком:
- название, тип и период;
- плановая и фактическая дата;
- сумма и оплачено;
- статус;
- связанный счёт или акт МД;
- меню редактирования.
Задачи показываются таблицей на desktop и карточками на mobile:
- приоритет;
- раздел и место;
- задача;
- исполнитель;
- срок;
- фото до/после;
- статус и проверка прорабом.
Вкладка «Бригада и смены»¶
Верхний блок Состав бригады:
- сотрудник;
- роль на объекте;
- период назначения;
- ставка по умолчанию;
- статус Telegram;
- активная смена;
- меню назначения.
Кнопка Добавить монтажника открывает Sheet справа:
- сотрудник;
- роль;
- период;
- тип ставки;
- значение ставки;
- примечание;
- подтверждение.
Ниже Смены по объекту:
- диапазон дат, по умолчанию текущий месяц;
- фильтр по сотруднику и статусу;
- строки: дата, сотрудник, старт, конец, часы, ставка-снимок, начисление, статус;
- итоги: человеко-часы, начислено, подтверждено, выплачено;
- переход в полный табель.
Ставка в прошлой смене отображается как снимок и не редактируется напрямую. Исправление делается корректирующим начислением.
Вкладка «Финансы»¶
Доступна только ролям с финансовым разрешением.
Верх:
- сумма договоров;
- получено;
- дебиторка;
- начислено бригаде;
- выплачено бригаде;
- фактическая маржа, если включён учёт себестоимости.
Далее три внутренних переключателя:
Клиентские платежи;Начисления бригаде;Выплаты бригаде.
Каждая таблица имеет собственную кнопку добавления. Начисления и выплаты не объединяются в одну сущность.
Вкладка «Документы»¶
Группы:
- договоры и допсоглашения;
- счета из «Моё Дело»;
- акты из «Моё Дело»;
- производственные файлы и фотографии.
Панель действий:
Обновить из Моё Дело;Привязать документ;Добавить файл;Выставить счёт;Сформировать акт.
Для каждой ссылки МД показываются собственное ИП, тип, номер, дата, сумма, статус синхронизации и время последнего обновления. Если документ нельзя однозначно связать, показывается Требует привязки.
Вкладка «История»¶
Неизменяемый журнал:
- дата и время;
- пользователь или автоматизация;
- действие;
- сущность;
- старое и новое значение для важных полей;
- источник: CRM, Telegram, cron, «Моё Дело».
Фильтры: тип события, автор, период. Журнал только для чтения.
Mobile¶
На ширине меньше 768px:
- шапка не sticky и складывается в одну колонку;
- KPI становятся горизонтально прокручиваемыми карточками;
- вкладки прокручиваются по горизонтали;
- таблицы смен, задач и документов превращаются в карточки;
- основная кнопка находится внизу экрана как sticky action bar;
- вторичные действия остаются в меню;
- минимальная зона нажатия 44×44 px.
Экран сотрудников¶
Назначение¶
Экран показывает всех людей, у которых есть employee_profiles, независимо от системной роли входа.
Рабочие должности:
Монтажник;Бригадир;Прораб;ИТР;Сотрудник.
Рабочая должность не определяет доступ. Например, прораб может иметь системную роль master с расширенным permission-набором, а ИТР — manager. Управление системными ролями admin | manager | master | client остаётся в отдельном разделе Доступ.
Маршрут: /admin/workers
Компоновка¶
┌──────────────────────────────────────────────────────────────────────────────┐
│ Сотрудники [Экспорт] [Добавить сотрудника]│
│ Смены, назначения, начисления и выплаты │
├──────────────────────────────────────────────────────────────────────────────┤
│ Сегодня на смене 3 │ Требуют проверки 2 │ Начислено август 184 500 ₽ │
│ К выплате 72 000 ₽ │ Без Telegram 1 │
├──────────────────────────────────────────────────────────────────────────────┤
│ Сотрудники | Табель | Начисления | Выплаты │
├──────────────────────────────────────────────────────────────────────────────┤
│ Поиск... Статус ▾ Объект ▾ Telegram ▾ Период ▾ [Сбросить] │
├──────────────────────────────────────────────────────────────────────────────┤
│ Сотрудник │ Сегодня │ Объекты │ Часы │ Начислено │ Выплачено │ Остаток │ ...│
│ Иван │ 09:12– │ 2 │ 126 │ 94 500 │ 70 000 │ 24 500 │ ...│
└──────────────────────────────────────────────────────────────────────────────┘
KPI¶
Сегодня на смене— число активных смен;Требуют проверки— auto_closed, disputed и черновые начисления;Начислено за период;К выплате;Без Telegram— сотрудники без привязки.
Клик применяет соответствующий фильтр.
Вкладка «Сотрудники»¶
Основная таблица:
- имя, телефон, Telegram;
- должность: монтажник, бригадир, прораб, ИТР или сотрудник;
- текущая смена и объект;
- активные назначения;
- часы за выбранный период;
- начислено;
- выплачено;
- остаток;
- статус сотрудника;
- меню действий.
Фильтры: поиск по имени, должность, активность, объект, Telegram, период. Сортировка по имени, часам, начислению и остатку. По умолчанию сначала показываются активные смены, затем сотрудники с проблемами, затем остальные.
Меню строки:
- открыть карточку;
- назначить на объект;
- пригласить в Telegram;
- изменить резервную ставку;
- добавить начисление;
- зафиксировать выплату;
- деактивировать.
Вкладка «Табель»¶
Полный журнал worker_shifts:
- дата;
- сотрудник;
- объект;
- начало и конец;
- перерыв;
- часы;
- тип и значение ставки-снимка;
- сумма;
- статус;
- фото начала и конца;
- действия проверки.
Группировка: по дням или сотрудникам. Итоговая строка пересчитывается по текущим фильтрам.
Действия:
- закрыть забытую смену;
- оспорить;
- подтвердить;
- создать корректировку;
- открыть фото.
Вкладка «Начисления»¶
Таблица worker_accruals:
- дата;
- сотрудник;
- объект;
- вид;
- основание;
- сумма;
- статус;
- кто подтвердил.
Массовое действие P0: выбрать несколько черновиков и подтвердить. Отмена подтверждённого начисления создаёт обратную корректировку, а не удаляет запись.
Вкладка «Выплаты»¶
Таблица worker_payments:
- дата;
- сотрудник;
- объект или «несколько объектов»;
- вид выплаты;
- способ;
- период;
- сумма;
- комментарий;
- автор.
Кнопка Зафиксировать выплату открывает Dialog. Перед сохранением показываются начислено, уже выплачено и остаток. Переплата разрешается только admin после дополнительного подтверждения.
Карточка сотрудника¶
Маршрут: /admin/workers/:id
Шапка:
- имя и статус;
- должность и системная роль доступа отдельными Badge;
- телефон и Telegram;
- резервная ставка;
- активная смена;
- кнопки
Назначить на объект,Начислить,Выплатить.
KPI за выбранный период:
- часы;
- смены;
- начислено;
- выплачено;
- остаток.
Вкладки:
Обзор— активные назначения, должность и предупреждения;Объекты и условия— история назначений и версия условий оплаты на каждом объекте;Смены;Разовые работы;Начисления;Выплаты;История.
Финансовые вкладки скрываются для ролей без разрешения, а не только блокируются на клиенте: API также проверяет право.
Вкладка Объекты и условия показывает по каждому назначению:
- объект, роль и период;
- схема оплаты: почасовая, сменная, сдельная, за завершение или смешанная;
- ставку, фиксированную сумму и условия премии;
- согласованные разовые работы вне основной компетенции;
- кто и когда изменил условия;
- ссылку на версию условий, по которой рассчитаны прошлые смены.
Вкладка Разовые работы показывает цепочку:
Предложено → Принято → Выполняется → Сдано → Принято → Начислено.
Сумма видна до принятия задания и после принятия не меняется без новой версии
договорённости.
Вкладка Смены дополнительно показывает источник отметки:
Telegram, MAX, web или менеджер, а также фото/сообщения, которые подтверждают
присутствие. Спорные и незакрытые смены выделяются статусом, а не только цветом.
Персональная расшифровка¶
Вкладка Обзор содержит таблицу По объектам:
| Объект | Роль на объекте | Смены | Часы | Начислено | Выплачено | Остаток |
|---|---|---|---|---|---|---|
2026-015 · Склад Иванова |
Бригадир | 14 | 126,0 | 94 500 ₽ | 70 000 ₽ | 24 500 ₽ |
Клик по строке применяет objectId ко вкладкам Смены, Начисления и Выплаты.
Вкладка Смены показывает, где и сколько человек отработал:
- объект и роль на нём;
- дата;
- начало, конец и перерыв;
- итоговые часы;
- ставка-снимок;
- рассчитанная сумма;
- статус и подтверждение.
Вкладка Начисления показывает, сколько человек заработал:
- начисления за смены;
- сдельные работы;
- премии;
- штрафы;
- корректировки;
- итог подтверждённых начислений.
Вкладка Выплаты показывает, сколько и как выплачено:
- дата выплаты;
- сумма;
- способ: банк, наличные или перевод на карту;
- объект или несколько объектов;
- расчётный период;
- назначение: зарплата, аванс, премия, компенсация;
- комментарий и автор записи.
В шапке расчёта всегда видна формула: Начислено − Выплачено = Остаток. Неподтверждённые начисления показываются рядом отдельной суммой и не входят в остаток.
Формы и диалоги¶
Добавление монтажника на объект¶
Обязательные поля:
- сотрудник;
- роль;
- дата начала;
- схема оплаты;
- почасовая/сменная ставка или фиксированная сумма;
- условие начисления за завершение;
- премия: нет, фиксированная, процентная или ручная;
- текст согласованных условий.
Проверки:
- нельзя создать дублирующее активное назначение того же сотрудника на тот же объект;
- значение ставки больше нуля;
- дата окончания не раньше даты начала;
- процентная ставка хранится отдельно от денежной;
- изменение ставки действующего назначения показывает предупреждение: прошлые смены не изменятся.
Закрытие смены вручную¶
Поля:
- время окончания;
- перерыв;
- причина ручного изменения;
- рассчитанные часы;
- ставка-снимок;
- предварительная сумма.
После сохранения создаются закрытая смена и черновик начисления. Причина обязательна для auto_closed и при изменении времени более чем на 30 минут.
Начисление¶
Поля:
- сотрудник;
- объект;
- тип;
- сумма;
- основание;
- связанная смена или задача;
- статус
Сохранить черновик/Подтвердить.
Для Штраф/удержание дополнительно обязательны причина, подтверждающий и
ссылка на нарушение/событие. UI не предлагает автоматический штраф за
незакрытую смену; сначала создаётся задача проверки табеля.
Карточка заявки как отдельная страница¶
Маршрут: /admin/requests/:id.
Страница сохраняет уже реализованные данные: клиент, источник, описание, компания, будущий объект, типы объекта, договор, счета, оплату и историю. Дополнительно:
- URL можно отправить менеджеру и восстановить после перезагрузки;
- браузерная кнопка «Назад» возвращает к прежним фильтрам списка;
- документы и история не ограничены высотой модального окна;
- кнопки
Сохранить,Выставить счёт,В объектнаходятся в явной панели действий; - при автоматическом переходе после оплаты страница перенаправляет на созданный
/admin/objects/:idи показывает ссылку на исходную заявку.
Выплата¶
Поля:
- сотрудник;
- объект или несколько объектов;
- тип выплаты;
- сумма;
- способ;
- дата;
- расчётный период;
- комментарий.
После сохранения показывается новый остаток. Выплату нельзя редактировать после закрытия расчётного периода; исправление выполняется корректирующей записью.
Состояния интерфейса¶
Каждая страница и вкладка обязана иметь:
- skeleton при первой загрузке;
- локальный spinner только на изменяемой кнопке при мутации;
- пустое состояние с объяснением и основным действием;
- ошибку загрузки с кнопкой
Повторить; - toast после успешной операции;
- предупреждение о несохранённых изменениях;
- явное состояние отсутствия прав;
- дату последней синхронизации для данных «Моё Дело».
Optimistic update разрешён для заметок и простых статусов. Для денег, ставок, смен, начислений и выплат UI ждёт подтверждённый ответ сервера.
Визуальные правила¶
Используется существующая тема alatyr-service:
- основной акцент
--primary— терракотовый; - нейтральные фон, карточки и границы;
- текущие
Button,Badge,Card,Tabs,Table,Sheet,Dialog; - Lucide-иконки только вместе с подписью для основных действий;
- финансовые числа с
font-variant-numeric: tabular-nums; - Badge всегда содержит текст статуса;
- не более одной основной filled-кнопки в видимой области;
- без декоративных иллюстраций и лишних теней.
Семантика:
destructive— ошибка, отмена, просрочка;- предупреждение — пауза, спорная смена, документ без связи;
- success — подтверждённое завершение или оплата;
- обычные рабочие статусы остаются нейтральными.
Компонентная декомпозиция¶
pages/
admin/
RequestsPage.tsx
RequestDetailPage.tsx
ObjectsPage.tsx
ObjectCreatePage.tsx
ObjectDetailPage.tsx
WorkersPage.tsx
WorkerDetailPage.tsx
TimesheetPage.tsx
components/crm/
AdminCrmNav.tsx
ObjectHeader.tsx
ObjectKpiStrip.tsx
ObjectOverviewTab.tsx
ObjectWorksTab.tsx
ObjectCrewTab.tsx
ObjectFinanceTab.tsx
ObjectDocumentsTab.tsx
AuditHistoryTab.tsx
AssignmentSheet.tsx
ShiftReviewDialog.tsx
AccrualDialog.tsx
WorkerPaymentDialog.tsx
WorkerSummaryTable.tsx
TimesheetTable.tsx
Не добавлять новые CRM-компоненты внутрь уже крупного client/src/pages/Admin.tsx. Общие типы запросов и ответов вынести в shared/ или client/src/types/crm.ts.
Требования к API-ответам¶
Карточка объекта не должна выполнять десятки последовательных запросов. P0:
GET /api/objects/:id/summary— шапка, KPI, предупреждения и права;- отдельные paginated endpoints для вкладок;
- каждый финансовый ответ содержит суммы в копейках;
- сервер возвращает вычисленные права
permissions, чтобы UI скрывал недоступные действия; - мутации возвращают обновлённую сущность и
updatedAt; - ошибки используют единый формат
{ code, message, fieldErrors? }.
Для списка монтажников:
- один агрегирующий endpoint для строк и KPI;
- фильтры и сортировка выполняются на сервере;
- pagination cursor или page/limit;
- query string является источником состояния фильтров.
Приоритет реализации¶
P0¶
- Маршруты и общий CRM-nav; заявки, объекты и сотрудники открываются страницами.
- Карточка объекта: шапка, KPI,
Обзор. - Версионируемые условия назначения: почасовая, сменная, сдельная, фиксированная за завершение и смешанная оплата.
- Вкладка
Бригада и смены. - Экран сотрудников: список, должности и KPI.
- Табель, события Telegram/web, ручное закрытие спорной смены; MAX через адаптер после проверки его API.
- Разовые согласованные работы, включая задачи вне основной компетенции.
- Начисления, премии, отрицательные корректировки и выплаты с раздельными формами.
- Права
admin/managerи отдельные permissions для прораба или ИТР. - Mobile-режим для основных операций.
P1¶
- массовое подтверждение начислений;
- сохранённые наборы фильтров;
- экспорт табеля;
- глубокая интеграция документов «Моё Дело»;
- сдельные и процентные автоматические расчёты;
- расширенная история изменений.
Не входит в MVP¶
- календарь с drag-and-drop;
- карта и геолокация;
- биометрия;
- автоматическое распознавание фото;
- полноценная бухгалтерская зарплата и налоги;
- удаление подтверждённых финансовых записей.
Критерии приёмки¶
- Given менеджер открывает объект, when загружается карточка, then без переходов видны статус, клиент, дедлайн, финансовая сводка, бригада и проблемы.
- Given у объекта несколько договоров, when открывается карточка, then объект показывается под одним неизменяемым кодом.
- Given сотрудник создан, when администратор выбирает должность, then доступны варианты Монтажник, Бригадир, Прораб, ИТР и Сотрудник независимо от системной роли.
- Given сотрудник назначается на объект, when менеджер сохраняет назначение, then сотрудник появляется в бригаде с ролью, периодом и ставкой.
- Given сотрудник на разных объектах имеет разные условия, when открывается его отдельная страница, then по каждому объекту видны своя схема, ставка, премия, разовые работы и история изменений.
- Given сотрудник отмечается или отправляет фото в привязанный Telegram/MAX канал, when событие обработано, then оно связано с объектом и показано в табеле с источником и статусом проверки.
- Given карточка заявки, объекта или сотрудника открыта, when пользователь копирует URL или обновляет страницу, then открывается та же сущность, а не общий список или потерянное модальное окно.
- Given открыта карточка сотрудника за период, when загружается расчёт, then видны все объекты, смены, часы, начисления, выплаты по способам и остаток.
- Given смена закрывается, when сервер подтверждает расчёт, then в табеле видны часы, ставка-снимок, сумма и черновик начисления.
- Given ставка назначения меняется, when открывается старая смена, then её сумма остаётся прежней.
- Given фиксируется выплата, when операция завершена, then обновляются
выплаченоиостаток, но начисления не изменяются. - Given пользователь без финансового права открывает объект, when строится UI, then финансовые вкладки и суммы не возвращаются API и не отображаются.
- Given экран открыт на телефоне, when пользователь выполняет основное действие, then оно доступно без горизонтальной прокрутки всей страницы.