Сметы — клиентские и подрядные.
Двусторонний учёт. Каждая работа имеет четыре цены, каждая смета принадлежит одной стороне (CLIENT / CONTRACTOR), при этом связана с документами другой стороны.
Каталог как источник цен
Цены подтягиваются из CatalogItem по стороне сметы. Журнал изменений хранится в CatalogItemPriceHistory.
Excel-импорт
Шаблоны xlsx с маппингом групп, материалов и работ.
Подрядная смета из клиентской
Один клик — подрядная смета с теми же строками и подрядными ценами.
Маржа по строкам
Когда строки сопоставлены по каталогу, маржа считается по каждой позиции.
Корректировки — единственный способ изменить утверждённую смету.
Добавление, удаление и замена строк через отдельный документ. Со своим маршрутом согласования и иммутабельностью.
Системные корректировки
isSystemGenerated = true — автоматически создаются актом разграничения для закрытия сметы.
Инициация из кабинета подрядчика
Подрядчик предлагает корректировку — мы принимаем или отклоняем.
Дельта «было / стало»
UI показывает построчные изменения с дельтами по количеству и цене.
Обязательный комментарий
При изменении цены — только ADMIN может снять обязательность.
Акты КС-2 и накопительный учёт.
КС-2 формируются по договору с учётом всего, что уже было сдано. Сторнирование — минусовыми позициями.
Договоры, доп. соглашения и ПДЦ.
Каждая смета — на договор. Каждый договор — на сторону (клиент или подрядчик) и объект.
Нормативно-справочная информация.
Каталог элементов с двумя парами цен, группировкой, пресетами и историей. Объекты строительства, схемы согласования.
CatalogItem
4 цены: clientMaterial, clientWorks, contractorMaterial, contractorWorks.
CatalogGroup
Иерархия групп с пресетами — готовые комплекты строк для типовых смет.
ConstructionObject
Адрес и группа объектов — для условий маршрутизации согласований.
ApprovalRoute
Шаги, условия (сторона, сумма, маржа), исключения (PriceChangeException).
Workflow согласований.
ApprovalRoute с шагами и условиями — ApprovalInstance с решениями и аудитом. Уведомления по email и WebSocket.
Кабинеты и матрица прав.
Три интерфейса (внутренний кабинет + два портала) и восемь ролей. Изоляция кабинетов — инвариант.
Печатные формы и выгрузки.
Все унифицированные формы и XLSX-выгрузки. Генерация через BullMQ-очередь — не блокирует UI.
Аудит и уведомления.
Каждое действие логируется в AuditLog — включая действия из внешних кабинетов. Уведомления — email + WebSocket + колокольчик.
AuditLog
Кто, что, когда, с каким документом, из какого кабинета. Иммутабельные записи.
Notification
readAt, mark-as-read эндпоинты. Кабинет показывает счётчик непрочитанных.
Раскрытие ПД
Отдельное событие аудита с causeReason — кто и зачем раскрыл паспорт клиента.
WebSocket
Live-обновления маржи и статусов документов без перезагрузки страницы.
Безопасность и инфраструктура.
JWT с ротацией refresh-токенов, RBAC, изоляция кабинетов на уровне БД, шифрование ПД и паспортных полей.