Page:
ТЕХНИЧЕСКАЯ СПЕЦИФИКАЦИЯ (FRD)
Clone
Table of Contents
- ТЕХНИЧЕСКАЯ СПЕЦИФИКАЦИЯ (FRD)
- НАПРАВЛЕНИЕ 1. Ядро системы (Скелет, Сущности, RBAC)
- 1.1. Модель данных (Mongoose Schemas)
- 1.2. Архитектура и API (Backend)
- 1.3. Frontend (Vue 3 + PrimeVue)
- НАПРАВЛЕНИЕ 2. Управление задачами и Автоматизация
- НАПРАВЛЕНИЕ 3. Загрузка, хранение и парсинг документов
- НАПРАВЛЕНИЕ 4. Шаблонизатор создания документов
- Скрытые требования и Архитектурные решения (Non-Functional)
- План передачи в разработку (Next Steps)
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.
ТЕХНИЧЕСКАЯ СПЕЦИФИКАЦИЯ (FRD)
Проект: Система управления юридическими процессами (Банкротство) Стек: Node.js, Express, MongoDB (Mongoose), node-cron | Vue 3, PrimeVue (PrimeUI)
НАПРАВЛЕНИЕ 1. Ядро системы (Скелет, Сущности, RBAC)
1.1. Модель данных (Mongoose Schemas)
В MongoDB мы используем вложенность там, где данные всегда читаются вместе, и ссылки (ObjectId), где данные имеют самостоятельную жизнь.
- User (Пользователи)
email(String, unique)passwordHash(String)role(Enum: 'admin', 'manager', 'lawyer')permissions(Array of Strings) - для гибкого RBAC.settings(Object) - настройки уведомлений, токены интеграций (Яндекс.Диск).
- Debtor (Должник)
fullName/companyName(String)inn,snils,passport(String)financialData(Object) - гибкая структура для активов, счетов, доходов.addresses(Array of Objects) - ФИАС адреса.
- Process (Процедура/Дело)
debtorId(ObjectId -> Debtor)assignedLawyers(Array of ObjectId -> User)courtCaseNumber(String, unique) - номер дела (А56-1529/2023).status(Enum: 'active', 'completed', 'archived')currentStageId(ObjectId -> Stage)metadata(Object) - специфичные поля (дата введения, номер в ЕФРСБ и т.д.).
1.2. Архитектура и API (Backend)
- Auth Middleware: JWT-токены. Проверка ролей через кастомный middleware
checkRole(['admin', 'manager']). - API Endpoints:
POST /api/auth/login,POST /api/auth/registerCRUD /api/debtorsCRUD /api/processes
- Data Isolation: В Express middleware для ролей 'lawyer' принудительно добавляется фильтр
{ assignedLawyers: req.user.id }ко всем запросам кProcess.
1.3. Frontend (Vue 3 + PrimeVue)
- Layout:
AppShell.vueс боковым меню (p-menuилиp-sidebar) и хедером с профилем. - Роутинг: Vue Router с навигационными гардами (
beforeEach) для проверки прав доступа. - Компоненты:
- Таблицы сущностей:
p-datatableс пагинацией, сортировкой и фильтрацией. - Формы создания:
p-dialog(модальные окна) сp-formи валидацией черезVeeValidate+Zod/Yup.
- Таблицы сущностей:
НАПРАВЛЕНИЕ 2. Управление задачами и Автоматизация
2.1. Модель данных
- StageTemplate (Этап - шаблон для админа)
name,order(Number),defaultDurationDays(Number).
- TaskTemplate (Тип задачи - шаблон)
name,description,defaultDurationDays,stageTemplateId.triggers(Array) - см. пункт 2.2.
- Task (Инстанс задачи у юриста)
processId,stageId,templateId.assigneeId(ObjectId -> User).status(Enum: 'todo', 'in_progress', 'done', 'overdue').deadline(Date).report(Object: { text, completedAt, completedBy, attachments }).
2.2. Логика Автоматизации (Event-Driven)
Чтобы одна задача порождала другую, используем паттерн "Наблюдатель" или триггеры в БД.
- Механика: В
TaskTemplateдобавляется полеonCompleteTriggers: массив объектов{ targetTaskTemplateId, delayDays }. - Backend Logic: При
PATCH /api/tasks/:id(смена статуса на 'done'):- Сохраняем отчет.
- Находим
TaskTemplateтекущей задачи. - Если есть
onCompleteTriggers, создаем новые инстансыTaskс расчетомdeadline = now + delayDays.
- Cron (node-cron): Задача
checkDeadlinesзапускается раз в сутки (или раз в час). Ищет задачи со статусомtodo/in_progress, гдеdeadline < now, и меняет статус наoverdue. Отправляет событие в шину уведомлений.
2.3. Frontend (3 интерфейса)
- Проджект-менеджер (Внутри Процесса):
- Используется
p-accordionилиp-treeдля группировки задач по Этапам. - Прогресс-бар этапа:
p-progressbar. - Чекбокс задачи:
p-checkbox. При клике открываетсяp-dialogдля ввода отчета.
- Используется
- Таск-менеджер (Глобальный):
p-datatableс глобальным списком всех задач пользователя.- Фильтры:
p-dropdown(Статус, Тип),p-calendar(Дедлайн).
- Календарь:
- Используется
p-calendar(в режиме view="month" / "week") или кастомная интеграция с FullCalendar.js (если PrimeVue не даст нужного UX), но для MVP подойдетp-schedule(если есть в PrimeVue) или стандартныйp-dataviewс группировкой по датам.
- Используется
НАПРАВЛЕНИЕ 3. Загрузка, хранение и парсинг документов
3.1. Модель данных и Хранение
- Document
processId,type(Enum: 'bank_statement', 'court_act', 'contract', 'other').fileName,mimeType,size.storagePath(путь в локальной ФС или ключ в облаке).parsedData(Object) - результаты парсинга.
- Storage Adapter Pattern: На бэкенде создаем абстрактный класс
Storage, и реализацииLocalStorage,YandexDiskStorage. Выбор через конфиг.
3.2. Парсинг и Триггеры (Background Jobs)
Загрузка файла не должна блокировать HTTP-запрос.
- API:
POST /api/documents/upload. Принимаетmultipart/form-data. Сохраняет метаданные в Mongo, файл на диск. Возвращает 202 Accepted. - Worker (Cron/Queue): Фоновый процесс забирает новые документы.
- Если тип
bank_statement(CSV): Парсим CSV (библиотекаcsv-parser). Создаем записи в коллекцииFinancialTransaction. Создаем задачу "Провести анализ подозрительных операций". - Если тип
court_act(PDF): (Для MVP) просто сохраняем. В будущем можно подключить OCR/NLP для извлечения даты и номера дела.
- Если тип
3.3. Frontend
- Загрузка:
p-fileupload(режим advanced). Drag-and-drop зона. - Метаданные: Перед отправкой файла модальное окно с
p-dropdownдля выбора "Типа документа" и привязки к "Процессу" (если загрузка идет из общего раздела). - Просмотр:
p-datatableсо списком документов. Кнопка "Скачать" генерирует presigned URL или стримит файл через Express.
НАПРАВЛЕНИЕ 4. Шаблонизатор создания документов
4.1. Выбор инструмента (Backend)
Для генерации DOCX из шаблонов в Node.js идеальным решением является связка pizzip (для распаковки zip/docx) + docxtemplater (для замены тегов).
- Альтернатива:
docx(создание с нуля), но она не подходит для шаблонов с версткой.
4.2. Модель данных
- DocumentTemplate
name,category(например, "Для суда", "Для должников").fileBuffer(Binary) или путь к файлу.variables(Array of Strings) - список тегов, найденных в документе (например,{{Должник.ФИО}},{{Процесс.НомерДела}}).
4.3. Логика работы (Backend)
- Загрузка шаблона (Админ): Админ загружает
.docx. Бэкенд с помощьюdocxtemplaterсканирует файл, находит все теги{{...}}и сохраняет их в массивvariables. - Генерация (Юрист):
- Юрист выбирает шаблон.
- Бэкенд собирает контекст (Context Object): подтягивает данные из
Process,Debtor,Userи маппит их на теги шаблона. docxtemplaterрендерит файл.- Если выбрано несколько шаблонов, используется
archiver(npm пакет) для создания ZIP-архива на лету. - Файл отдается клиенту через
res.download().
4.4. Frontend
- Админ-панель:
p-fileuploadдля загрузки.docx.- После загрузки отображается
p-chipsилиp-listboxс найденными переменными, чтобы админ мог проверить, все ли теги распознаны.
- Интерфейс юриста:
- Список шаблонов:
p-dataviewс карточками илиp-datatable. - Чекбоксы для множественного выбора.
- Кнопка "Сгенерировать и скачать". Во время генерации показывается
p-progressbar(indeterminate) илиp-blockui.
- Список шаблонов:
Скрытые требования и Архитектурные решения (Non-Functional)
- Уведомления (Email & Push):
- Backend: Используем
nodemailerдля Email. Для Push (внутри PWA) используемweb-push(VAPID keys). - Cron: Задача
sendDailyDigestраз в сутки собирает все непрочитанные уведомления и шлет дайджест на почту.
- Backend: Используем
- Интеграции (КАД, ЕГРЮЛ, Яндекс.Диск):
- Выносим в отдельный модуль
integrations/. - Обязательно используем паттерн Retry with Exponential Backoff (библиотека
axios-retry), так как гос. API часто лежат или отдают 503. - Кэширование ответов ЕГРЮЛ/ФИАС в Redis (если появится в стеке) или в коллекции MongoDB с TTL (Time To Live), чтобы не платить за лишние запросы к DaData.
- Выносим в отдельный модуль
- PWA (Progressive Web App):
- На фронтенде используем
vite-plugin-pwa. - Настраиваем
manifest.jsonи Service Worker для оффлайн-кэширования статики (но не API-запросов, так как данные должны быть свежими).
- На фронтенде используем
План передачи в разработку (Next Steps)
- Для Backend-разработчика:
- Инициализировать репозиторий.
- Написать миграции/сиды для Mongoose (создать базовые роли, этапы и типы задач).
- Реализовать модуль Auth и RBAC middleware.
- Для Frontend-разработчика:
- Поднять Vue 3 + Vite + PrimeVue.
- Настроить Axios interceptor для обработки JWT и глобальных ошибок.
- Сверстать
AppShellи базовые роуты.
- Совместно:
- Согласовать Swagger/OpenAPI спецификацию (можно использовать
tsoaилиswagger-jsdocв Express).
- Согласовать Swagger/OpenAPI спецификацию (можно использовать
Данный документ является достаточным основанием для спринта №1 (Архитектура и Ядро) и содержит четкие векторы для спринтов №2, №3 и №4.