Skip to content

План доработок и дорожная карта до 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 CRUD16.07.2026
WP-2✅ ВыполненоGET settings, tax presentationRead-only бюджет, markup, НДС и УСНOpenAPI; UI save/reload; items-PDF16.07.2026
WP-3✅ ВыполненоПроектный счёт через fpdfГенерация/скачивание из UIGo-тесты; UI; визуальный рендер A416.07.2026
WP-4✅ ВыполненоGET list + snake_case DTOРеальный список, генерация, download/status4 типа из UI; status transition16.07.2026
WP-5🟡 В работеPDF-правки, банк, подписант, detailПоля подписанта и чекбокс detailМиграция и detail UI/PDF пройдены; нужен подписант16.07.2026
WP-6✅ Выполненоsources[], приоритет, rollbackШтатный autocomplete, costs, список/KPIПеремещение, закупка и аренда пройдены из UI16.07.2026
WP-7✅ Выполненоparent-связь, addendum API, fpdfФорма, список, download/statusGo/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 из UI16.07.2026
WP-10🟡 В работеPDF-карточкаКоманда, задачи, чат, проект, файлы, компании8/10 пунктов проверены в живом UI; нужен визуальный PDF-регресс16.07.2026

Уточнения после сверки с кодом ​

  • budget.Repository.Get уже возвращает дефолтные настройки; дефект 404 вызван отсутствующей регистрацией HTTP GET /budget/settings, а не отсутствием fallback в repository/service.
  • У статей затрат сейчас есть только create/list. Упомянутого ниже updateCostItem/PATCH нет; обновление и удаление нужно реализовать отдельным CRUD-подпунктом до закрытия сущности целиком.
  • Первый блок реализации начат с WP-1/WP-2: frontend payload приведён к notes и markup_percent/vat_display_mode, GET настроек добавлен вместе с handler-тестом и обновлением контрактов.

Ключевые открытия из кода (упрощают план) ​

  1. fpdf-рендерер уже умеет счёт. В render/fpdf.go есть case "invoice": generateInvoice(...), и standalone-счёт компании уже идёт через него. Только проектный Create(TypeInvoice) жёстко ходит через HTML-шаблон из БД → заглушку SimplePDFGenerator. Чинится маршрутизацией, а не написанием нового генератора.
  2. DocumentsRepository.List(ctx, filter) уже существует (storage/documents_pg.go:25). Для списка документов нужен только HTTP-хендлер + фронт.
  3. CreateProjectDoc (акт/договор) уже реализует нужный паттерн «RenderDoc-first, шаблон — fallback» (generator.go:998). Его и копируем для счёта.
  4. Автоплан считает покрытие по 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] Добавить PATCH /finance/cost-items/:id для ручных статей; source-generated статьи изменяются через исходную сущность. — проверено: unit-тесты finance и go test ./....
  • [x] Добавить DELETE /finance/cost-items/:id для ручных статей. — проверено: unit-тесты finance и 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] Зарегистрировать GET /projects/:id/budget/settings; repository fallback возвращает 200 с дефолтами. — проверено: handler-тест и 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] Проектный счёт без template_id перевести на RenderDoc(TypeInvoice); HTML оставить только для явно выбранного шаблона. — проверено unit-тестами и созданием счёта № 2 из UI.
  • [x] Добавить НДС/сумму прописью/форматы/назначение платежа/подписи и М.П. — проверено рендером скачанного UI-файла через pdftoppm: одна читаемая A4-страница без повреждённой кириллицы.
  • [x] SimplePDFGenerator пометить deprecated и оставить для аварийного HTML-пути. — проверено code review и go test ./....

Отклонено (пока): внешний HTML→PDF движок (gotenberg/chromedp) — новый контейнер в композе, шрифты, таймауты; это правильная цель для «брендированных» шаблонов, но не для фикса до 24.07. Зафиксировано в бэклоге.

WP-4. Документы: реальный список + вкладка + генерация из UI (дефекты #5, #8) — ✅ Выполнено 16.07.2026 ​

  • [x] Добавить GET /api/v1/documents?project_id=&type=&status=&limit=&offset= с обязательным project scope для не-админов. — проверено handler-тестами и живым списком проекта.
  • [x] Перевести ответы Create* на единый snake_case DTO. — проверено handler-тестом: PascalCase не попадает в JSON; frontend получает 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] Добавить detail: categories|items и UI-чекбокс; проверить обе сметы из интерфейса. — проверено: из UI создана смета № 4 с detail=items, скачанный PDF визуально проверен через pdftoppm и содержит три исходные статьи; категорийный режим проверен сметой № 3.

WP-6. Логистика: операция создаётся (дефект #4) — ✅ Выполнено 16.07.2026 ​

Перемещение (главный путь):

  • [x] Бэк: расширить auto-plan/preview|confirm полем sources[] и учитывать их до основного склада. — проверено handler/service unit-тестами, генераторами контрактов и go test ./....
  • [x] Фронт (buildAutoPlanPayload): отправлять источники, выбранные на шаге 2. — проверено typecheck/build; живой preview принял новый payload без strict-JSON ошибки.
  • [x] Синхронизировать понятие «доступно»: в шаге 2 показывать только реальные внутренние источники warehouse|project, не считать виртуальные purchase/rental складом. — проверено в UI на заявке № 87: Acer — 0 / отсутствует, HDMI — 1 / частично, радиосистема — 1 / обеспечено; payload внешнего сценария сохраняет полное requested_qty для последовательного internal → external fallback.

Покупка/аренда:

  • [x] Для purchase|rental не требовать from_location_id; «Откуда» остаётся виртуальной меткой. — проверено из UI: preview и confirm закупки прошли без реальной исходной локации.
  • [x] Разделить «Стоимость закупки/аренды» и «Логистические расходы». — цена внешнего обеспечения больше не переносится в planned_cost; оба поля визуально разделены.

Списки/дашборд:

  • [x] Не отфильтровывать дочерние операции без заполненного маршрута; использовать project_name ответа. — созданная закупка отображается в списке, KPI изменился; тестовый проект виден в заявках.
  • [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: радиосистема выбрана, availability 1/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] Добавить TypeAddendum = "addendum", отдельную нумерацию и единый snake_case DTO с parent_document_id. — проверено: handler-тест, go test ./..., живой список показывает дополнительные соглашения № 1–4.
  • [x] Реализовать POST /api/v1/projects/:id/documents/addendum с проверкой, что contract_id — договор того же проекта. — проверено созданием соглашения к договору № 3 из UI; связь подтверждена в БД.
  • [x] Сгенерировать fpdf: ссылка на договор, нумерованные изменения, при new_total таблица позиций и новая стоимость, реквизиты и подписи. — проверено скачанным PDF соглашения № 4: две читаемые A4-страницы без наложений, позиции и итог 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] Проверить наличие documents.manage и выдачу manager/head_of_department. — проверено в живой БД: permission выдан ровно admin, manager, head_of_department; новая permission-запись не создавалась.
  • [x] Убрать мёртвую ветку project_manager. — проверено unit-тестами document/templates: роль без documents.manage получает 403.
  • [x] Пометить АРМ бухгалтера/юриста как не выведенные в UI. — зафиксировано в документации.
  • [x] Выполнить живой RBAC-регресс за logist@seed.rms. — административное меню исчезло; генерация сметы из вкладки документов отклонена UI-сценарием с «Недостаточно прав», число документов не изменилось; после проверки административная сессия восстановлена.

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] Задачи: показывать тикающую длительность now − started_at, а не время старта. — проверено из UI: после исправления нормализации active_session_started_at счётчик увеличивается как 00:00:15 → 00:00:17, пауза/возобновление работают.
  • [x] Чат: отправлять сообщение по Enter, оставив Shift+Enter для новой строки. — проверено из UI: Enter отправил [TEST] Enter отправляет сообщение; Shift+Enter сохранил значение Строка 1\nСтрока 2 без отправки.
  • [x] Проект: показывать «Локация *» сразу, заменить менеджера на VAutocomplete, убрать фиктивные «8% задач». — проверено из UI созданием проекта и списком проектов: локация обязательна, менеджер ищется, прогресс без задач равен 0%.
  • [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.07WP-2: settings 200-с-дефолтамиWP-1: name→notes; WP-2: блок настроек на модель бэкаСтатьи затрат создаются из UI; «Настройки сметы» сохраняются; наценка попадает в итоги
Пн 20.07WP-3: счёт через fpdf + НДС/пропись/подписи; snake_case DTO ответовWP-4 (начало): каркас вкладки «Документы» на реальном APIСчёт скачивается читаемым PDF с НДС; тост генерации даёт ссылку
Вт 21.07WP-4: GET /documents; WP-5: правки акта/договора, банк заказчика, detail=itemsWP-4: список/фильтры/скачать/статус + кнопки генерации; чекбокс детализацииВкладка «Документы» показывает реальные документы; смета с детализацией по статьям; договор с банком заказчика
Ср 22.07WP-6: sources в auto-plan preview/confirm + тестыWP-6: отправка источников, фикс валидации «Покупки», разделение цены и логистических расходовЗаявка → операция создаётся и «Перемещением», и «Покупкой»; операции видны в списке
Чт 23.07WP-7: addendum (миграция, тип, шаблон, роут); WP-8: валидатор счетовWP-7: форма доп. соглашения; WP-8: маска счётаДоп. соглашение генерируется по договору; кривые счета не сохраняются; staging почищен
Пт 24.07WP-9: seed-роли + documents.manageWP-10: UX-полировкаПолный регресс по флоу-чек-листу зелёный; docs-контейнер пересобран

Порядок жёсткий по зависимостям: WP-4 (DTO ответов) до кнопок генерации; WP-6 бэк до фронта; WP-7 после WP-3/WP-5 (переиспользует исправленные блоки реквизитов/подписей).

Definition of Done ​

  1. Сквозной сценарий из full-flow проходит из UI без обращения к API руками (сейчас этапы 5–7 требуют curl).
  2. Все четыре PDF + доп. соглашение читаемы, с НДС и суммой прописью; счёт содержит корректные р/с и к/с.
  3. go test ./... зелёный, контракты перегенерированы, sqlmock-тесты обновлены под новые запросы.
  4. Прогон за logist@seed.rms с новой (не-manager) ролью seed показывает корректное сужение прав.
  5. Реестр дефектов обновлён: каждому пункту проставлен статус «починено в WP-N» либо перенесён в бэклог.

Бэклог после 24.07 (сознательно не в этом спринте) ​

  • HTML→PDF движок (gotenberg) + брендированные шаблоны документов с логотипом.
  • Вывод АРМ бухгалтера/юриста, кассы и payroll на фронт.
  • Детализация прав: ограничение «ответственных» командой проекта, scope дашборда по ролям.
  • Единый сервис доступности оборудования (UI и автоплан считают из одного источника).
  • QR-код оплаты в счёте, статусная модель документов (issued → sent → paid) с уведомлениями.

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