План доработок и дорожная карта до 24.07
План закрывает дефекты из реестра прогона 16.07.2026. Решения выбраны под текущую архитектуру: Go-модули с строгим DTO-биндингом и contract-first подходом (go run ./cmd/generate_contracts && go run ./cmd/generate_endpoints после изменения DTO/роутов, sqlmock-тесты фиксируют SQL), fpdf-рендерер документов, Vue 3 фронт с API-модулями в src/api/*.
Правило проекта: поля берём из бэкенда — при расхождении контракта чиним фронт под бэк, бэк меняем только там, где модели не хватает по сути.
Статус реализации
Статусы: ⚪ запланировано · 🟡 в работе · ⛔ заблокировано · ✅ выполнено. Подпункт отмечается только после проверки; весь WP зачёркивается только после полного DoD и живого UI/API-регресса.
| WP | Статус | Бэкенд | Фронтенд | Проверка | Дата |
|---|---|---|---|---|---|
| WP-1 | ✅ Выполнено | CRUD ручных статей; source-generated защищены | Создание, редактирование и удаление | go test ./...; typecheck/build; живой UI CRUD | 16.07.2026 |
| WP-2 | ✅ Выполнено | GET settings, tax presentation | Read-only бюджет, markup, НДС и УСН | OpenAPI; UI save/reload; items-PDF | 16.07.2026 |
| WP-3 | ✅ Выполнено | Проектный счёт через fpdf | Генерация/скачивание из UI | Go-тесты; UI; визуальный рендер A4 | 16.07.2026 |
| WP-4 | ✅ Выполнено | GET list + snake_case DTO | Реальный список, генерация, download/status | 4 типа из UI; status transition | 16.07.2026 |
| WP-5 | 🟡 В работе | PDF-правки, банк, подписант, detail | Поля подписанта и чекбокс detail | Миграция и detail UI/PDF пройдены; нужен подписант | 16.07.2026 |
| WP-6 | ✅ Выполнено | sources[], приоритет, rollback | Штатный autocomplete, costs, список/KPI | Перемещение, закупка и аренда пройдены из UI | 16.07.2026 |
| WP-7 | ✅ Выполнено | parent-связь, addendum API, fpdf | Форма, список, download/status | Go/OpenAPI; UI; визуальный PDF-регресс | 16.07.2026 |
| WP-8 | 🟡 В работе | Валидатор ЦБ + protected cleanup | Маска и ошибки | Cleanup выполнен; нужны master-data РМС | 16.07.2026 |
| WP-9 | ✅ Выполнено | Реальные seed-роли; permission без дубля | Admin-меню скрыто не-админу | Двойной seed; SQL; live 403 из UI | 16.07.2026 |
| WP-10 | 🟡 В работе | PDF-карточка | Команда, задачи, чат, проект, файлы, компании | 8/10 пунктов проверены в живом UI; нужен визуальный PDF-регресс | 16.07.2026 |
Уточнения после сверки с кодом
budget.Repository.Getуже возвращает дефолтные настройки; дефект404вызван отсутствующей регистрацией HTTPGET /budget/settings, а не отсутствием fallback в repository/service.- У статей затрат сейчас есть только create/list. Упомянутого ниже
updateCostItem/PATCHнет; обновление и удаление нужно реализовать отдельным CRUD-подпунктом до закрытия сущности целиком. - Первый блок реализации начат с WP-1/WP-2: frontend payload приведён к
notesиmarkup_percent/vat_display_mode, GET настроек добавлен вместе с handler-тестом и обновлением контрактов.
Ключевые открытия из кода (упрощают план)
- fpdf-рендерер уже умеет счёт. В
render/fpdf.goестьcase "invoice": generateInvoice(...), и standalone-счёт компании уже идёт через него. Только проектныйCreate(TypeInvoice)жёстко ходит через HTML-шаблон из БД → заглушкуSimplePDFGenerator. Чинится маршрутизацией, а не написанием нового генератора. DocumentsRepository.List(ctx, filter)уже существует (storage/documents_pg.go:25). Для списка документов нужен только HTTP-хендлер + фронт.CreateProjectDoc(акт/договор) уже реализует нужный паттерн «RenderDoc-first, шаблон — fallback» (generator.go:998). Его и копируем для счёта.- Автоплан считает покрытие по
repo.AutoPlanSources(requestID, mainWarehouseID)и не получает источники, выбранные логистом в мастере, — фронт их просто не отправляет (buildAutoPlanPayloadне имеет поля sources).
Пакеты работ
WP-1. Смета: статьи затрат из UI (дефект #2) — ✅ Выполнено 16.07.2026
Решение: фронт подстраивается под контракт бэка (модель бэка достаточна: человекочитаемое имя статьи живёт в notes, и генератор PDF/список уже читают его оттуда).
- [x]
В— проверено:createCostItemмаппитьname→notes;normalizeCostItemчитать изtitleс fallback наnotes.pnpm typecheck,pnpm build. - [x]
Добавить— проверено: unit-тесты finance иPATCH /finance/cost-items/:idдля ручных статей; source-generated статьи изменяются через исходную сущность.go test ./.... - [x]
Добавить— проверено: unit-тесты finance иDELETE /finance/cost-items/:idдля ручных статей.go test ./.... - [x]
Добавить редактирование/удаление в UI и выполнить живой CRUD-регресс.— проверено в интерфейсе проекта: создание → редактирование → удаление временной статьи;pnpm typecheck,pnpm build.
Отклонено: добавление колонки name на бэке — дублирует notes, требует миграцию + regen контрактов + правку sqlmock-тестов ради нулевой пользы.
WP-2. Смета: настройки (дефект #3) — ✅ Выполнено 16.07.2026
Решение: привести блок «Настройки сметы» к модели бэка (markup_percent, vat_display_mode, usn_*, notes), а «плановый бюджет» оставить полю проекта, которым он и является.
- [x]
Зарегистрировать— проверено: handler-тест иGET /projects/:id/budget/settings; repository fallback возвращает 200 с дефолтами.go test ./.... - [x]
Сделать плановый бюджет read-only, пересчитывать сумму сметы в— проверено:markup_percent, отправлять{markup_percent, vat_display_mode}.pnpm typecheck,pnpm build. - [x]
Перегенерировать контракты и endpoints.— проверено генераторами и OpenAPI consistency check. - [x]
Выполнить живой API/UI-регресс сохранения настроек и обновления итогов.— проверено в интерфейсе проекта: плановый бюджет read-only,770 000 → 847 000даётmarkup_percent=10, режим НДС сохраняется; затем исходные значения восстановлены. - [x]
Вернуть одну галочку УСН, которая добавляет налог к ценам позиций.— проверено из UI на проекте 10:usn_percent=6,usn_display_mode=included, итог770 000 → 816 200; после reload галочка сохранилась. В items-PDF сметы № 6 УСН распределён по строкам400 000/250 000/120 000 → 424 000/265 000/127 200; отдельной строки УСН нет. Автотест:TestLoadProjectDocumentItemsDistributesIncludedUSNAcrossDetailedItems.
WP-3. Счёт: читаемый PDF (дефект #1) — ✅ Выполнено 16.07.2026
Решение: проектный счёт перевести на структурный fpdf-путь по образцу CreateProjectDoc.
- [x]
Проектный счёт без— проверено unit-тестами и созданием счёта № 2 из UI.template_idперевести наRenderDoc(TypeInvoice); HTML оставить только для явно выбранного шаблона. - [x]
Добавить НДС/сумму прописью/форматы/назначение платежа/подписи и М.П.— проверено рендером скачанного UI-файла черезpdftoppm: одна читаемая A4-страница без повреждённой кириллицы. - [x]
— проверено code review иSimplePDFGeneratorпометить deprecated и оставить для аварийного HTML-пути.go test ./....
Отклонено (пока): внешний HTML→PDF движок (gotenberg/chromedp) — новый контейнер в композе, шрифты, таймауты; это правильная цель для «брендированных» шаблонов, но не для фикса до 24.07. Зафиксировано в бэклоге.
WP-4. Документы: реальный список + вкладка + генерация из UI (дефекты #5, #8) — ✅ Выполнено 16.07.2026
- [x]
Добавить— проверено handler-тестами и живым списком проекта.GET /api/v1/documents?project_id=&type=&status=&limit=&offset=с обязательным project scope для не-админов. - [x]
Перевести ответы— проверено handler-тестом: PascalCase не попадает в JSON; frontend получаетCreate*на единый snake_case DTO.id. - [x]
Подключить реальный список, скачать, смену статуса и генерацию четырёх типов.— проверено из UI: созданы счёт № 2, смета № 3, акт № 2, договор № 2; договор переведён draft → issued; скачивание вернуло и открыло PDF-ссылку.
WP-5. Шаблоны акта/договора + детализация (дефекты #9, #10) — 🟡 В работе
- [x]
Убрать дубль «ИТОГО», добавить НДС в акт и заполнение подписей организациями/ИНН.— проверено render unit-тестом; живой PDF-регресс типов ещё выполняется. - [x]
Дополнить— реализовано адаптером, требуется живой договор после миграции.companyContextосновнымcompany_bank_accounts. - [ ] Добавить
director_name/director_title(additive-миграция, API и форма) и проверить симметричное «в лице …» в договоре. Миграция0125применена, поля формы проверены; живой PDF ждёт заполнения реального подписанта. - [x]
Добавить— проверено: из UI создана смета № 4 сdetail: categories|itemsи UI-чекбокс; проверить обе сметы из интерфейса.detail=items, скачанный PDF визуально проверен черезpdftoppmи содержит три исходные статьи; категорийный режим проверен сметой № 3.
WP-6. Логистика: операция создаётся (дефект #4) — ✅ Выполнено 16.07.2026
Перемещение (главный путь):
- [x]
Бэк: расширить— проверено handler/service unit-тестами, генераторами контрактов иauto-plan/preview|confirmполемsources[]и учитывать их до основного склада.go test ./.... - [x]
Фронт (— проверено typecheck/build; живой preview принял новый payload без strict-JSON ошибки.buildAutoPlanPayload): отправлять источники, выбранные на шаге 2. - [x]
Синхронизировать понятие «доступно»: в шаге 2 показывать только реальные внутренние источники— проверено в UI на заявке № 87: Acer —warehouse|project, не считать виртуальные purchase/rental складом.0 / отсутствует, HDMI —1 / частично, радиосистема —1 / обеспечено; payload внешнего сценария сохраняет полноеrequested_qtyдля последовательного internal → external fallback.
Покупка/аренда:
- [x]
Для— проверено из UI: preview и confirm закупки прошли без реальной исходной локации.purchase|rentalне требоватьfrom_location_id; «Откуда» остаётся виртуальной меткой. - [x]
Разделить «Стоимость закупки/аренды» и «Логистические расходы».— цена внешнего обеспечения больше не переносится вplanned_cost; оба поля визуально разделены.
Списки/дашборд:
- [x]
Не отфильтровывать дочерние операции без заполненного маршрута; использовать— созданная закупка отображается в списке, KPI изменился; тестовый проект виден в заявках.project_nameответа. - [x]
Откатывать частично созданную операцию, если создание связанной задачи завершилось ошибкой; валидировать даты проекта на фронте.— проверено unit-тестом rollback; ошибочный живой прогон отменён через UI. - [x]
Выполнить отдельный сценарий аренды и проверить список/KPI.— проверено из UI: создана операция аренды по заявке № 95;uncovered=0, операция видна в списке, KPI изменилисьвсего 45→46,активных 24→25,аренда 19→20. - [x]
Выполнить живой confirm прямого перемещения и проверить список/KPI.— телепортированный dropdown заменён штатнымVAutocomplete; проверено из UI операцией[TEST] WP-6 Перемещение 5: радиосистема выбрана, availability1/1, маршрут сохранён, строка видна в списке; KPIвсего 46→47,активных 25→26,внутренний трансфер 3→4.
WP-7. Доп. соглашение (дефект #6) — ✅ Выполнено 16.07.2026
Решение: новый тип в существующем модуле generated-документов — минимум нового кода, вся инфраструктура (нумерация, S3, статусы, download) переиспользуется.
- [x]
Добавить additive-миграцию фактической таблицы— проверено: миграцияdocuments.parent_document_id BIGINT NULL REFERENCES documents(id) ON DELETE RESTRICTс индексом и down-сценарием.0126применена на локальном стенде; SQL-запрос подтвердилaddendum.project_id=10,parent_document_id=29. - [x]
Добавить— проверено: handler-тест,TypeAddendum = "addendum", отдельную нумерацию и единыйsnake_caseDTO сparent_document_id.go test ./..., живой список показывает дополнительные соглашения № 1–4. - [x]
Реализовать— проверено созданием соглашения к договору № 3 из UI; связь подтверждена в БД.POST /api/v1/projects/:id/documents/addendumс проверкой, чтоcontract_id— договор того же проекта. - [x]
Сгенерировать fpdf: ссылка на договор, нумерованные изменения, при— проверено скачанным PDF соглашения № 4: две читаемые A4-страницы без наложений, позиции и итогnew_totalтаблица позиций и новая стоимость, реквизиты и подписи.825 000,00, договор № 3 и обе стороны отображены; незаполненный подписант исполнителя остаётся отдельным master-data пунктом WP-5. - [x]
Добавить во вкладку «Документы» форму: договор проекта, изменения, новая сумма и примечание.— проверено полным UI-сценарием создание → список → скачивание; промежуточные соглашения № 1–3 переведены вcancelled. - [x]
Перегенерировать контракты/endpoints и добавить тесты рендерера/DTO.— проверено: 43 schemas, 304 endpoints, OpenAPI consistency check,pnpm typecheck,pnpm build.
WP-8. Реквизиты: валидация счетов + чистка (дефект #7) — 🟡 В работе
- [x]
Бэк-валидатор (общий для реквизитов «Моей компании» и счетов компаний): 20 цифр; тип р/с/к/с; контрольный ключ по алгоритму ЦБ.— проверено unit-тестами пакетаinternal/bankaccountиgo test ./.... - [x]
Фронт: маска 20 цифр + сообщение валидации.— провереноpnpm typecheck,pnpm buildи живой формой: существующий р/с с префиксом301блокирует сохранение с явным сообщением. - [x]
Добавить операторский dry-run, выводящий точные ID, старые значения и зависимости.— проверено:go run ./cmd/remediation_cleanup --dry-run; режим изменения защищён одновременными--applyи точным--confirm. - [x]
После явного подтверждения выполнить согласованный cleanup.— проверено protected apply и повторным dry-run: удалены операции82/88/89с items/events, поездка2перепривязана11→8(Москва) и10→9(Сочи), дубли локаций10/11удалены; целевые выборки пусты. - [x]
Не удалять и не переносить «ДЖАЙНЕР» из внутренних реквизитов.— подтверждено бизнес-правило: РМС может выставлять документы от нескольких своих юрлиц/ИП, с НДС и без НДС;requisites.id=4— намеренное тестовое юрлицо. - [ ] Заполнить корректные master-data для ООО «РМС ГРУПП» (
requisites.id=6): р/с, Ф.И.О. и должность подписанта. До получения истинных значений данные не изменять.
WP-9. RBAC и seed (дефекты #17, #18-частично) — ✅ Выполнено 16.07.2026
- [x]
Seed: выдавать реальные системные роли (— проверено двумя последовательнымиengineer,accountant,lawyer,employee), функции оставить; сохранить идемпотентный upsert./app/seedи SQL:logist=employee+logistician,engineer,accountant,lawyer,executor=employee; вuser_rolesровно одна соответствующая роль без старогоmanager. - [x]
Проверить наличие— проверено в живой БД: permission выдан ровноdocuments.manageи выдачуmanager/head_of_department.admin,manager,head_of_department; новая permission-запись не создавалась. - [x]
Убрать мёртвую ветку— проверено unit-тестами document/templates: роль безproject_manager.documents.manageполучает 403. - [x]
Пометить АРМ бухгалтера/юриста как не выведенные в UI.— зафиксировано в документации. - [x]
Выполнить живой RBAC-регресс за— административное меню исчезло; генерация сметы из вкладки документов отклонена UI-сценарием с «Недостаточно прав», число документов не изменилось; после проверки административная сессия восстановлена.logist@seed.rms.
WP-10. UX-полировка из реестра (#11–14, #19–26) — 🟡 В работе
- [x]
Команда: после сохранения сбрасывать выбранные роли и автоматически закрывать диалог.— проверено из UI: добавлена Волкова Елена с ролью «Инженер», диалог закрылся; при повторном открытии сотрудник и все роли сброшены. - [x]
Команда: после создания проекта добавлять ответственного менеджера в команду одним POST.— проверено из UI на проекте[TEST] WP-10 UX 2026: Логинов Борис появился в команде сразу после создания. - [x]
Задачи: явно пометить «Описание *», объяснять disabled-кнопку сохранения и сохранять «Примечание».— проверено из UI задачей[TEST] WP-10 note: обязательная метка/причина блокировки отображаются, примечание сохранено и показано в карточке. - [x]
Задачи: показывать тикающую длительность— проверено из UI: после исправления нормализацииnow − started_at, а не время старта.active_session_started_atсчётчик увеличивается как00:00:15 → 00:00:17, пауза/возобновление работают. - [x]
Чат: отправлять сообщение по Enter, оставив Shift+Enter для новой строки.— проверено из UI: Enter отправил[TEST] Enter отправляет сообщение; Shift+Enter сохранил значениеСтрока 1\nСтрока 2без отправки. - [x]
Проект: показывать «Локация *» сразу, заменить менеджера на— проверено из UI созданием проекта и списком проектов: локация обязательна, менеджер ищется, прогресс без задач равен 0%.VAutocomplete, убрать фиктивные «8% задач». - [x]
Файлы: исправить заголовок «Список заявок» на «Файлы».— проверено из UI: активная вкладка проекта содержит заголовокФайлы. - [x]
Компании: заполнить колонку «Тип» реальными данными.— проверено из UI:[TEST] СбербанкпоказываетПАОв списке и карточке; записи без типа корректно остаются—. - [ ] PDF-карточка компании: нормализовать регистр организационно-правовой формы/названия и убрать пустую страницу/плохие переносы. Код и unit-тест готовы, генерация вызвана кнопкой «Печать карточки»; автоматическое открытие/сохранение файла заблокировано политикой загрузок браузера, поэтому визуальный DoD не отмечен.
- [ ] Выполнить живой UI-регресс каждого пункта и полный
pnpm typecheck/pnpm build. Typecheck/build и 8 UI-сценариев прошли; остаётся визуальная проверка PDF-карточки.
Дорожная карта 17.07 → 24.07
Оценка ёмкости: 1 бэк + 1 фронт (если человек один — резать по приоритету сверху вниз, WP-10 и WP-9 двигаются за 24.07).
| День | Бэкенд | Фронтенд | Результат дня (проверяемый) |
|---|---|---|---|
| Пт 17.07 | WP-2: settings 200-с-дефолтами | WP-1: name→notes; WP-2: блок настроек на модель бэка | Статьи затрат создаются из UI; «Настройки сметы» сохраняются; наценка попадает в итоги |
| Пн 20.07 | WP-3: счёт через fpdf + НДС/пропись/подписи; snake_case DTO ответов | WP-4 (начало): каркас вкладки «Документы» на реальном API | Счёт скачивается читаемым PDF с НДС; тост генерации даёт ссылку |
| Вт 21.07 | WP-4: GET /documents; WP-5: правки акта/договора, банк заказчика, detail=items | WP-4: список/фильтры/скачать/статус + кнопки генерации; чекбокс детализации | Вкладка «Документы» показывает реальные документы; смета с детализацией по статьям; договор с банком заказчика |
| Ср 22.07 | WP-6: sources в auto-plan preview/confirm + тесты | WP-6: отправка источников, фикс валидации «Покупки», разделение цены и логистических расходов | Заявка → операция создаётся и «Перемещением», и «Покупкой»; операции видны в списке |
| Чт 23.07 | WP-7: addendum (миграция, тип, шаблон, роут); WP-8: валидатор счетов | WP-7: форма доп. соглашения; WP-8: маска счёта | Доп. соглашение генерируется по договору; кривые счета не сохраняются; staging почищен |
| Пт 24.07 | WP-9: seed-роли + documents.manage | WP-10: UX-полировка | Полный регресс по флоу-чек-листу зелёный; docs-контейнер пересобран |
Порядок жёсткий по зависимостям: WP-4 (DTO ответов) до кнопок генерации; WP-6 бэк до фронта; WP-7 после WP-3/WP-5 (переиспользует исправленные блоки реквизитов/подписей).
Definition of Done
- Сквозной сценарий из full-flow проходит из UI без обращения к API руками (сейчас этапы 5–7 требуют curl).
- Все четыре PDF + доп. соглашение читаемы, с НДС и суммой прописью; счёт содержит корректные р/с и к/с.
go test ./...зелёный, контракты перегенерированы, sqlmock-тесты обновлены под новые запросы.- Прогон за
logist@seed.rmsс новой (не-manager) ролью seed показывает корректное сужение прав. - Реестр дефектов обновлён: каждому пункту проставлен статус «починено в WP-N» либо перенесён в бэклог.
Бэклог после 24.07 (сознательно не в этом спринте)
- HTML→PDF движок (gotenberg) + брендированные шаблоны документов с логотипом.
- Вывод АРМ бухгалтера/юриста, кассы и payroll на фронт.
- Детализация прав: ограничение «ответственных» командой проекта, scope дашборда по ролям.
- Единый сервис доступности оборудования (UI и автоплан считают из одного источника).
- QR-код оплаты в счёте, статусная модель документов (issued → sent → paid) с уведомлениями.