docs(openspec): consolidations-ui — расхождения закрыты, дельта consolidated-osv-ui «Единицы» (AURORA-1589, PR #166)
Решение владельца 23.10.2026: PR доводим сами, 71ef633 остаётся. design.md: Known issues 1–14 закрыты, открыты 15 (lucide-react в Nexus), 16 (предупреждение вне модалок), 17 (красное поле поиска в [42]); решения без обсуждения (л)–(х), пересмотр (е) и (к). Спека: несохранённые правки в модалках, ошибки [35], [31-00] при неактивных вкладках. tasks.md, web/ARCHITECTURE.md, web/CLAUDE.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
2fa672a2fb
commit
c8a89d4c63
@ -9,8 +9,11 @@ PR RSHB/arm-core#166 (ветка `AURORA-1589`, автор — Степанов,
|
||||
меняется. В ветку добавлена вторая библиотека иконок `lucide-react` (иконки макета: меню «⋯», «Взять в работу», «К
|
||||
отчётности», боковое меню).
|
||||
|
||||
Спеку, документацию и тесты ведёт ревьюер коммитами в ветку автора (правило владельца для чужих PR); продуктовый код
|
||||
правит автор. Спека описывает **целевое** поведение; расхождения кода ветки (коммит 71ef633) — раздел «Known issues».
|
||||
Спеку, документацию и тесты ведёт ревьюер коммитами в ветку автора (правило владельца для чужих PR). Спека описывает
|
||||
**целевое** поведение; расхождения кода ветки (коммит 71ef633) с ней — раздел «Known issues». Решение владельца
|
||||
23.10.2026 после ревью раунда 1: продуктовый код ревьюер исправляет сам в этой же ветке (ручной код автора
|
||||
не переписывается сверх нужного), коммит 71ef633 («Единицы» сводной ОСВ) остаётся в PR и тоже исправляется, его
|
||||
поведение описано дельтой `consolidated-osv-ui`. Известные расхождения 1–14 закрыты (раздел «Known issues»).
|
||||
Источники: макет [34], [35], [42], [30], [33-01], [33], [31-00] (`docs/mockup/INDEX.md`), описание AURORA-1589, ТЗ
|
||||
«Статусная модель» (`docs/source/tz/…08_4. Статусная модель.md`), гайд фронта по API §5.7.
|
||||
|
||||
@ -46,40 +49,43 @@ PR RSHB/arm-core#166 (ветка `AURORA-1589`, автор — Степанов,
|
||||
|
||||
## Known issues
|
||||
|
||||
Расхождения кода ветки `AURORA-1589` (71ef633) с целевой спекой — по пунктам ревью раунда 1; исправляет автор PR.
|
||||
Расхождения кода ветки `AURORA-1589` (71ef633) с целевой спекой по ревью раунда 1. По решению владельца (23.10.2026)
|
||||
1–14 исправлены ревьюером в этой же ветке; открытыми остаются 15 и часть 16.
|
||||
|
||||
1. **404 при смене статуса.** `services/api/consolidations.ts` `updateStatus` шлёт `POST /consolidation/versions/{id}/status`
|
||||
(нет «s»); нужен `/consolidations/versions/{id}/status`.
|
||||
2. **Переходы — заглушка `mockStatusMappingFetch()` внутри модалки** (`ChangeStatusModal.tsx`). Нужна одна константа (D-1)
|
||||
рядом с подписями статусов. Для статусов без переходов сейчас `nextStatusOptions = undefined`: форма скрыта, кнопка
|
||||
«Изменить статус» в шапке при этом активна.
|
||||
3. **«Новый этап» предвыбран** (`initialValues.to_status = nextStatusOptions[0]`, на стенде — «Отменён»); нужно пусто (D-5).
|
||||
4. **Кнопка «Изменить статус»**: подсказка «Сначала возьмите версию в работу» вместо «Возьмите консолидацию в работу»;
|
||||
отсутствие ручных переходов не учитывается (при своей блокировке `VERIFIED` кнопка активна, модалка пустая).
|
||||
5. **Колонка «Версия» инвертирована** (`ConsoleTable/config.tsx`): показывает «1» и скрывает 2+; нужно наоборот.
|
||||
6. **«Только в работе» включён по умолчанию** (`ConsoleTable.tsx`: `searchParams.get('in_work_only') || true`, флажок
|
||||
отмечен, пока параметр не `'false'`); нужно выключен (D-6).
|
||||
7. **Пункты «⋯» не `disabled`**: у них только класс `ant-dropdown-menu-item-disabled`, клик обрабатывается
|
||||
(«История изменений» ведёт в пустой «Журнал действий», остальные — `message.info('Будет позже')`); в `ITEMS` лишний
|
||||
пустой элемент `{}`.
|
||||
8. **Подпись `CANCELLED` — «Отменён»** (нужно «Отменена», D-9); «Взять в работу» блокируется сравнением
|
||||
`row.status === 'Отменён'` — после переименования условие перестанет срабатывать (D-10).
|
||||
9. **Перехват [35]**: плейсхолдер поля причины «Type message»; проверка длины `< 1000` вместо `≤ 1000`; квартал в тексте —
|
||||
`Q3` вместо «К3»; опечатки «обнаржуена», «нформацию».
|
||||
10. **Пояснение под заголовком**: для `INITIATED`, `DOCUMENTS_PROCESSING`, `DATA_CORRECTION` повторяется название статуса;
|
||||
тексты `VERIFIED` и `CONSOLIDATION_RF` в `consStatusDescriptionMapping` расходятся с макетом [30], [33-01].
|
||||
11. **Модалка [31-00] «Остались неуказанные ИНН»** не реализована. Другие вкладки отчёта в ветке пока неактивны
|
||||
(`OsvTabs`), поэтому сценарий проверяется после появления вкладки «Шахматка» (PR #158) или в нём же.
|
||||
12. **«+ Создать» активна при одном отмеченном ЮЛ** (`NewConsoleModal.tsx`, `!legEntIds?.length`); нужно не меньше двух
|
||||
(сервер отвечает 422 `PERIMETER_TOO_SMALL`).
|
||||
13. **Модалка «Изменить статус», замечено при написании спеки** (в комментарий ревью раунда 1 не вошло): ошибка
|
||||
`getVersionCard` не обрабатывается — модалка остаётся в загрузке; `comment.trim()` вызывается на значении
|
||||
`Form.useWatch`, которое до монтирования формы `undefined`.
|
||||
14. **Тестов нет.** Чистые правила (подпись версии, переходы, активность кнопок, параметр `in_work_only`) зашиты в
|
||||
компоненты; тесты vitest — после их выноса в чистые функции (`tasks.md`).
|
||||
15. **`lucide-react@0.263.1` в зеркале npm банка не проверен.** Пакет в `dependencies`, снимок контура его оставляет
|
||||
(`docs/dev/contour-transfer-guide.md` §3.2); если версии нет в Nexus, сборка в контуре упадёт.
|
||||
16. **Предупреждение браузера о несохранённых правках** (пункт AURORA-1589) не реализовано; в спеку не входит (решение (е)).
|
||||
1. ~~404 при смене статуса~~ — закрыто: `updateStatus` шлёт `POST /consolidations/versions/{id}/status` (была опечатка
|
||||
`/consolidation/…`; эндпоинт в main есть, на стенде отвечает 409 `TRANSITION_NOT_ALLOWED` на недопустимый переход).
|
||||
2. ~~Переходы — заглушка `mockStatusMappingFetch()`~~ — закрыто: синхронная константа `MANUAL_TRANSITIONS` в
|
||||
`web/src/utils/consolidations.ts` (зеркало бэка, D-1) и `manualTransitions(status)` — пустой список без переходов.
|
||||
3. ~~«Новый этап» предвыбран~~ — закрыто: по умолчанию пусто, плейсхолдер «Выберите этап» (D-5).
|
||||
4. ~~Кнопка «Изменить статус»~~ — закрыто: активность — `canChangeStatus` (своя блокировка и есть ручные переходы),
|
||||
подсказка «Возьмите консолидацию в работу» без своей блокировки (D-3).
|
||||
5. ~~Колонка «Версия» инвертирована~~ — закрыто: `versionLabel` (1 → пусто, 2+ → номер).
|
||||
6. ~~«Только в работе» включён по умолчанию~~ — закрыто: `parseInWorkOnly` (включён только `?in_work_only=true`),
|
||||
параметр запроса — boolean через `api.get(path, params)` (D-6).
|
||||
7. ~~Пункты «⋯» не `disabled`~~ — закрыто: `disabled: true`, подсказка «Будет позже», переход в журнал и
|
||||
`message.info` убраны, пустой элемент `{}` убран, клик по меню не выбирает строку таблицы.
|
||||
8. ~~«Отменён»~~ — закрыто: «Отменена»; «Взять в работу» блокирует `canTakeInWork(status_code)` — у строки списка есть код
|
||||
статуса (`ConsRow.status_code`), подпись только для показа и фильтра (D-9, D-10).
|
||||
9. ~~Перехват [35]~~ — закрыто: плейсхолдер «Укажите причину замены», счётчик 0/1000, `isValidReason` (≤ 1000 после
|
||||
обрезки), «К3» через `quarterShortLabel`, опечатки исправлены, ФИО с инициалами без второй точки (`endSentence`).
|
||||
10. ~~Пояснение под заголовком~~ — закрыто: `CONS_STATUS_DESCRIPTION` / `consStatusDescription` (тексты спеки; нет текста —
|
||||
пусто, название статуса не повторяется).
|
||||
11. ~~Модалка [31-00]~~ — закрыто: `UnmappedInnModal` и проверка в `OsvTabs` (`needsUnmappedWarning`). Вкладки шагов
|
||||
пока неактивны, поэтому на стенде модалка проверена на временной копии с активной «Шахматкой» (решение (м)).
|
||||
12. ~~«+ Создать» при одном ЮЛ~~ — закрыто: `MIN_PERIMETER = 2`, кнопка неактивна, у поля — «Выберите не меньше двух ЮЛ».
|
||||
13. ~~Модалка «Изменить статус»: загрузка без обработки ошибок, `comment.trim()` на `undefined`~~ — закрыто: модалка
|
||||
карточку не грузит, получает её со страницы (`card`), после 200 страница берёт карточку из ответа (D-4);
|
||||
`canSubmitStatusChange` принимает `undefined`; ошибки — текст сервера, модалка открыта.
|
||||
14. ~~Тестов нет~~ — закрыто: `web/src/utils/consolidations.test.ts`, `formatScaledAmount` в `web/src/utils/money.test.ts`.
|
||||
15. **`lucide-react@0.263.1` в зеркале npm банка не проверен** (открыто). Пакет в `dependencies`, снимок контура его
|
||||
оставляет (`docs/dev/contour-transfer-guide.md` §3.2); если версии нет в Nexus, сборка в контуре упадёт. Вопрос автору
|
||||
PR / платформе.
|
||||
16. **Предупреждение браузера о несохранённых правках** — частично: сделано для трёх модалок экранов консолидаций
|
||||
(требование «Предупреждение о несохранённых правках в модалках консолидаций», решение (л)). Открыто: нужно ли оно в
|
||||
остальных формах приложения (справочники, проверка документов) и при переходе по меню вне модалок (у `BrowserRouter`
|
||||
нет `useBlocker`, нужен переход на data router) — вопрос владельцу.
|
||||
17. **Поле поиска в блоке «ЮЛ консолидации» [42] подсвечивается красным**, когда у поля ошибка «Выберите не меньше двух
|
||||
ЮЛ» (antd передаёт статус `Form.Item` вложенному `Input`); так было и с прежним правилом `required`. Косметика, открыто.
|
||||
|
||||
## Decisions made without discussion
|
||||
|
||||
@ -104,7 +110,7 @@ PR RSHB/arm-core#166 (ветка `AURORA-1589`, автор — Степанов,
|
||||
расширение триггера — MODIFIED требования.
|
||||
- **2026-10-23 (е). Предупреждение браузера о несохранённых правках не включено в спеку**: пункт задачи касается всех форм
|
||||
и модалок приложения, а не экранов консолидаций; остаётся задачей автора в `tasks.md`. Цена ошибки: требование появится
|
||||
отдельной спекой (или дельтой) позже.
|
||||
отдельной спекой (или дельтой) позже. **Пересмотрено 23.10.2026:** для модалок экранов консолидаций — решение (л).
|
||||
- **2026-10-23 (ж). Подпись `DOCUMENTS_PROCESSING` оставлена «Обработка документов»** (как в `main`); в ТЗ — «Загрузка,
|
||||
распознавание и корректировка документов», в словаре UI — «Загрузка и распознавание документов». Вопрос аналитику.
|
||||
Цена ошибки: замена одной подписи.
|
||||
@ -115,3 +121,38 @@ PR RSHB/arm-core#166 (ветка `AURORA-1589`, автор — Степанов,
|
||||
сливается в этот `main`.
|
||||
- **2026-10-23 (к). «Единицы» и «Знаков после запятой» сводной ОСВ (коммит 71ef633, AURORA-1539) в спеку не включены** —
|
||||
автору предложено вынести их в отдельный PR. Цена ошибки: если коммит останется в PR, его поведение будет без спеки.
|
||||
**Пересмотрено 23.10.2026 решением владельца:** коммит остаётся в PR, поведение описано дельтой `consolidated-osv-ui`
|
||||
(«Единицы и знаки после запятой»).
|
||||
- **2026-10-23 (л). Предупреждение о несохранённых правках — `beforeunload` в трёх модалках экранов консолидаций**
|
||||
(перехват с причиной, «Изменить статус», «Новая консолидация»; хук `web/src/hooks/useBeforeUnload.ts`), требование —
|
||||
в спеке `consolidations-ui`. Пересматривает (е) в части этих экранов. Обоснование: в задаче — «в открытой форме или
|
||||
модалке»; модалки этого PR — понятное место, маска модалки и так закрывает меню; формы других экранов и переход по
|
||||
меню вне модалок требуют решения владельца (Known issues 16). Цена ошибки: если предупреждение нужно и в других формах —
|
||||
подключить тот же хук; если не нужно вовсе — убрать три вызова.
|
||||
- **2026-10-23 (м). Модалка [31-00] — в `OsvTabs` с параметрами `onNavigate` / `enabledTabs`**; пока шагов нет, вкладки
|
||||
неактивны и модалка не вызывается, на стенде она проверена на временной копии с активной «Шахматкой». Обоснование: PR
|
||||
шахматки (#158) только передаёт переход, модалку не пишет. Цена ошибки: подключение вкладки — две строки.
|
||||
- **2026-10-23 (н). Ошибки в модалках — текст сервера** (`ApiError.message`, по-русски) вместо карты фронтовых текстов;
|
||||
исключение — 409 `VERSION_NOT_EDITABLE` в [35] (текст спеки). Обоснование: незнакомые коды и 403 раньше проходили молча
|
||||
или «Что-то пошло не так». Цена ошибки: замена строк.
|
||||
- **2026-10-23 (о). Пояснения статусов без текстов** (`ADJUSTMENT`, `ARCHIVED`, `REJECTED`) — пусто под заголовком;
|
||||
`CONSOLIDATION_GO`, `VERIFICATION_RF`, `VERIFICATION_GO` — тексты автора PR, с ТЗ не сверены. Цена ошибки: строки в
|
||||
`CONS_STATUS_DESCRIPTION`.
|
||||
- **2026-10-23 (п). Единицы: «млн руб.», «млрд руб.» без точки** (сокращения «млн», «млрд» пишутся без точки; у автора —
|
||||
«млн. руб.»); по умолчанию «руб.» и 2 знака, хотя в макете [30] выбрано «тыс. руб.»: контрольные цифры спеки
|
||||
`consolidated-osv-ui` и гайда тестировщика — в рублях. Цена ошибки: одна строка умолчания.
|
||||
- **2026-10-23 (р). Масштаб сумм — на строке и BigInt, округление половины от нуля** (`formatScaledAmount`, как в
|
||||
Excel); ноль — «—» по исходной сумме, ненулевая сумма, округлённая до нуля, — «0,00» без минуса. Обоснование: правило
|
||||
«суммы — строками» (`utils/money.ts`), у автора был `Number()` и потерян `zeroDash`. Цена ошибки: одна функция и тест.
|
||||
- **2026-10-23 (с). После создания консолидации боковое меню перечитывает список с `in_work_only: false`**: переход
|
||||
открывает список без `?in_work_only` (флажок выключен). Цена ошибки: низкая.
|
||||
- **2026-10-23 (т). Строка ЮЛ модалки [42] — сам флажок antd (`<label>` на всю строку)** вместо `div role="checkbox"`
|
||||
(замечание biome `useSemanticElements`); клик по наименованию или ИНН переключает, клавиатура — как у флажка. Цена
|
||||
ошибки: низкая.
|
||||
- **2026-10-23 (у). «Ответственный» после «Взять в работу» — перечитывание панели «Организации»** через `reloadKey`
|
||||
страницы (`ConsoleTableWidget onVersionLocked`); список перечитывается только после успеха или 409
|
||||
`VERSION_NOT_EDITABLE`, не после каждой ошибки. Цена ошибки: низкая.
|
||||
- **2026-10-23 (ф). Чистые правила — `web/src/utils/consolidations.ts`**, подписи и пояснения статусов перенесены туда
|
||||
из `widgets/ConsoleTable/consts.ts` (там остались цвета бейджей). Цена ошибки: низкая.
|
||||
- **2026-10-23 (х). Отступ секций бокового меню — `padding: 12px 0`** (у автора закомментирован `12px`): по вертикали —
|
||||
как в макете [34], по горизонтали пункты остаются на одной линии с кнопкой «Новая консолидация». Цена ошибки: CSS.
|
||||
|
||||
@ -4,8 +4,9 @@
|
||||
макета: список консолидаций ГК [34] с «Взять в работу» и перехватом [35], модалку «Новая консолидация» [42] и кнопку
|
||||
«Изменить статус» в карточке версии [30] с модалкой [33-01]. Бэкенд этих действий уже в main (`consolidations-api`:
|
||||
список с `in_work_only`, блокировка и перехват, ручная смена статуса). У экранов нет UI-спеки. Спеку, документацию и тесты
|
||||
ведёт ревьюер коммитами в ветку автора (правило владельца): спека задаёт целевое поведение, расхождения кода ветки с ней —
|
||||
`design.md`, «Known issues»; продуктовый код правит автор.
|
||||
ведёт ревьюер коммитами в ветку автора (правило владельца). После ревью раунда 1 владелец решил (23.10.2026) довести PR
|
||||
самим в этой же ветке: расхождения кода с целевой спекой (бывшие «Known issues» `design.md`) исправлены ревьюером, коммит
|
||||
71ef633 («Единицы» сводной ОСВ) остаётся в PR и тоже исправлен.
|
||||
|
||||
## What Changes
|
||||
|
||||
@ -21,21 +22,25 @@
|
||||
- «Изменить статус» [33-01]: допустимые переходы — зеркало `MANUAL_TRANSITIONS` бэка, по умолчанию ничего не выбрано,
|
||||
кнопка доступна только владельцу блокировки и при наличии ручных переходов.
|
||||
- Модалка [31-00] «Остались неуказанные ИНН» при уходе со «Сводной ОСВ» на другую вкладку отчёта.
|
||||
- Новая спека `consolidations-ui` (ADDED Requirements).
|
||||
- Предупреждение браузера о несохранённых правках в модалках этих экранов («Взять в работу» с причиной, «Изменить
|
||||
статус», «Новая консолидация»).
|
||||
- Сводная ОСВ [30]: «Единицы» (руб. / тыс. руб. / млн руб. / млрд руб.) и «Знаков после запятой» (0–3) — масштаб на
|
||||
строках без float, ноль — «—».
|
||||
- Новая спека `consolidations-ui` (ADDED Requirements), дельта `consolidated-osv-ui` (ADDED).
|
||||
- Чистые правила экранов — `web/src/utils/consolidations.ts`, масштаб сумм — `formatScaledAmount` в `web/src/utils/money.ts`,
|
||||
тесты vitest.
|
||||
- Документация фронта: `web/CLAUDE.md` (вторая библиотека иконок `lucide-react`), `web/ARCHITECTURE.md` (новые виджеты).
|
||||
|
||||
## Non-goals
|
||||
|
||||
- Исправление продуктового кода по «Known issues» (`design.md`) — за автором PR.
|
||||
- «Единицы» и «Знаков после запятой» в сводной ОСВ (коммит 71ef633, AURORA-1539) — автору предложено вынести в отдельный
|
||||
PR; в эту спеку не входят.
|
||||
- Полный маршрут согласования (переходы Среза 7), «Добавить версию», «Отключить подтверждение КФО», «История изменений»,
|
||||
«Редактировать состав», «Импорт», «Дата верификации», «Утверждён в РФ» / «Верифицирован в ГО» — зонтичная задача
|
||||
AURORA-1416.
|
||||
- ГСК консолидации в API списка и карточки (колонка «ГСК») — отдельная задача ядра; до неё колонка пустая.
|
||||
- Список допустимых переходов из API (`allowed_transitions`) — с маршрутом согласования; до него фронт держит зеркало.
|
||||
- Предупреждение браузера о несохранённых правках (пункт задачи AURORA-1589) — касается всех форм приложения, в эту спеку
|
||||
не входит (`design.md`, решение без обсуждения (е)).
|
||||
- Предупреждение браузера о несохранённых правках в формах вне экранов консолидаций (справочники, проверка документов) и
|
||||
при переходе по меню приложения — открытый вопрос владельцу (`design.md`, «Открытые вопросы»).
|
||||
- «Настройка таблицы», «На весь экран», фильтры по суммам в сводной ОСВ — задача «Сводная ОСВ: UI по макету».
|
||||
- Изменения бэкенда и DBML.
|
||||
|
||||
## Capabilities
|
||||
@ -46,12 +51,16 @@
|
||||
|
||||
### Modified Capabilities
|
||||
|
||||
Нет: `consolidation-setup` (состав модалки [42], создание, «К отчётности») и `consolidated-osv-ui` (сводная ОСВ) не
|
||||
правятся — добавленное поведение описано в новой спеке (`design.md`, решение без обсуждения (а)).
|
||||
- `consolidated-osv-ui`: ADDED требование «Единицы и знаки после запятой» (коммит 71ef633 остаётся в PR, решение
|
||||
владельца 23.10.2026). `consolidation-setup` (состав модалки [42], создание, «К отчётности») не правится — вид модалки
|
||||
и шапка карточки описаны в новой спеке (`design.md`, решение без обсуждения (а)).
|
||||
|
||||
## Impact
|
||||
|
||||
- `web/src/widgets/ConsoleTable/` (`ConsoleTable.tsx`, `LockModal.tsx`, `config.tsx`, `consts.ts`),
|
||||
- `web/src/utils/consolidations.ts` (+ тест), `web/src/utils/money.ts` (`formatScaledAmount`, + тест),
|
||||
`web/src/hooks/useBeforeUnload.ts`, `web/src/widgets/ConsolidatedOsv/` (`OsvTabs.tsx` — модалка [31-00],
|
||||
`useNumberDisplay.tsx`, `OsvTable.tsx`),
|
||||
- `web/src/widgets/ConsoleTable/` (`ConsoleTable.tsx`, `LockModal.tsx`, `config.tsx`, `consts.ts`, `flatten.ts`),
|
||||
`web/src/widgets/StatusChangeModal/ChangeStatusModal.tsx`, `web/src/widgets/NewConsoleModal/`
|
||||
(`NewConsoleModal.tsx`, `CompanyOptionRow.tsx`), `web/src/widgets/ConsoleLegalEntities/`,
|
||||
`web/src/layouts/ConsolidatedOsvPage.tsx`, `web/src/layouts/ConsolidationsList.tsx`,
|
||||
|
||||
@ -0,0 +1,26 @@
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: Единицы и знаки после запятой
|
||||
Над таблицей сводной ОСВ [30] SHALL быть два выпадающих списка: «Единицы» — «руб.», «тыс. руб.», «млн руб.», «млрд руб.»
|
||||
(по умолчанию «руб.»: суммы API — в рублях) и «Знаков после запятой» — 0, 1, 2, 3 (по умолчанию 2). Выбор SHALL менять
|
||||
только показ сумм шести денежных колонок (сальдо на начало, обороты, сальдо на конец, Дт/Кт); запрос, фильтры и экспорт в
|
||||
xlsx не меняются. Пересчёт SHALL выполняться над строкой суммы из API без арифметики с плавающей точкой: запятая
|
||||
сдвигается на 3/6/9 разрядов, округление до выбранного числа знаков — половина от нуля, разряды разделяются пробелом,
|
||||
дробная часть — через запятую. Нулевая сумма SHALL показываться «—» при любых единицах; ненулевая сумма, округлившаяся до
|
||||
нуля, — нулём с выбранным числом знаков, без знака «минус».
|
||||
|
||||
#### Scenario: Тысячи рублей
|
||||
- **WHEN** выбраны «тыс. руб.» и 3 знака, сумма строки — `24000.00`
|
||||
- **THEN** в ячейке «24,000»
|
||||
|
||||
#### Scenario: Округление без потери разрядов
|
||||
- **WHEN** выбраны «тыс. руб.» и 2 знака, сумма — `4454151.93`
|
||||
- **THEN** в ячейке «4 454,15»
|
||||
|
||||
#### Scenario: Ноль
|
||||
- **WHEN** сумма ячейки — `0.00`, выбраны любые единицы и число знаков
|
||||
- **THEN** в ячейке «—»
|
||||
|
||||
#### Scenario: Малая сумма в крупных единицах
|
||||
- **WHEN** выбраны «млн руб.» и 2 знака, сумма — `-0.40`
|
||||
- **THEN** в ячейке «0,00»
|
||||
@ -58,7 +58,9 @@
|
||||
После 200/201 модалка SHALL закрыться с сообщением «Консолидация взята в работу.» и перечитать список. Ответ 409
|
||||
`LOCKED_BY_OTHER` на запрос без причины (версию успели взять) SHALL переводить модалку в режим перехвата с предупреждением
|
||||
«<ФИО> только что взял(-а) консолидацию в работу.» и пустым полем причины. Ответ 409 `VERSION_NOT_EDITABLE` SHALL
|
||||
закрывать модалку с сообщением «Нельзя взять в работу отменённую версию.». У версии со статусом `CANCELLED` кнопка
|
||||
закрывать модалку с сообщением «Нельзя взять в работу отменённую версию.». Прочие ошибки (403 без права
|
||||
`CONSOLIDATION_EDIT`, иные 409/422) SHALL показываться текстом сервера (`ApiError.message`), модалка остаётся открытой. ФИО
|
||||
в тексте модалки не получает вторую точку («Соколов А. В. Укажите причину замены.»). У версии со статусом `CANCELLED` кнопка
|
||||
«Взять в работу» SHALL быть неактивной (условие — по коду статуса, а не по подписи); у версии, которую держит текущий
|
||||
пользователь, вместо неё SHALL показываться неактивная кнопка «В работе».
|
||||
|
||||
@ -80,6 +82,15 @@
|
||||
- **WHEN** версия в статусе «Отменена»
|
||||
- **THEN** «Взять в работу» в её строке неактивна
|
||||
|
||||
#### Scenario: Нет права
|
||||
- **WHEN** пользователь без `CONSOLIDATION_EDIT` подтверждает перехват, сервер отвечает 403
|
||||
- **THEN** показан текст ответа сервера («недостаточно прав: требуется CONSOLIDATION_EDIT»), модалка открыта
|
||||
|
||||
#### Scenario: Панель «Организации» после взятия в работу
|
||||
- **WHEN** в списке выбрана версия, аналитик берёт её в работу
|
||||
- **THEN** список и карточка выбранной версии перечитаны, «Ответственный» в панели «Организации» — текущий владелец
|
||||
блокировки
|
||||
|
||||
### Requirement: Меню «⋯» строки консолидации
|
||||
Меню «⋯» строки SHALL содержать пункты «Добавить версию», «Отключить подтверждение КФО», «История изменений» с иконками
|
||||
[43]. Пока функции нет, пункты SHALL быть неактивными (`disabled`) с подсказкой «Будет позже»; нажатие на неактивный пункт
|
||||
@ -214,7 +225,9 @@ SHALL быть неактивной с подсказкой «Возьмите
|
||||
При уходе со вкладки «ОСВ» на другую вкладку отчёта версии, если в сводке `unmapped_total > 0`, фронт SHALL показывать
|
||||
модалку [31-00] «Остались неуказанные ИНН»: «В ОСВ остались неуказанные ИНН», «Не заполнено ИНН: N. Точно хотите перейти
|
||||
в другой раздел?», кнопки «Остаться» / «Перейти». «Остаться» SHALL закрывать модалку без перехода, «Перейти» — выполнять
|
||||
переход. При `unmapped_total = 0` переход SHALL выполняться без модалки.
|
||||
переход. При `unmapped_total = 0` переход SHALL выполняться без модалки. Пока шагов после ОСВ нет, их вкладки
|
||||
неактивны («Будет в следующих срезах») и модалка не вызывается; вкладка становится активной, когда для неё задан переход
|
||||
(первой — «Шахматка»).
|
||||
|
||||
#### Scenario: Есть несопоставленные строки
|
||||
- **WHEN** в сводке `unmapped_total = 2` и аналитик выбирает другую вкладку отчёта
|
||||
@ -224,3 +237,18 @@ SHALL быть неактивной с подсказкой «Возьмите
|
||||
#### Scenario: Все строки сопоставлены
|
||||
- **WHEN** `unmapped_total = 0` и аналитик выбирает другую вкладку отчёта
|
||||
- **THEN** вкладка открывается без модалки
|
||||
|
||||
### Requirement: Предупреждение о несохранённых правках в модалках консолидаций
|
||||
Пока открыта модалка с начатым вводом, браузер SHALL спрашивать подтверждение при закрытии или перезагрузке вкладки
|
||||
(стандартный диалог `beforeunload`, текст задаёт браузер): «Взять консолидацию в работу?» — введена причина перехвата
|
||||
(непустая после обрезки пробелов); «Изменить статус» — выбран новый этап или введён комментарий; «Новая консолидация» —
|
||||
выбрано хотя бы одно из полей ГК, ГСК, год, квартал. После закрытия модалки (отправка или «Отмена») предупреждения нет.
|
||||
Переход по меню приложения при открытой модалке закрыт её маской.
|
||||
|
||||
#### Scenario: Причина перехвата введена
|
||||
- **WHEN** в модалке перехвата введена причина «Отпуск» и аналитик перезагружает вкладку
|
||||
- **THEN** браузер показывает диалог подтверждения ухода
|
||||
|
||||
#### Scenario: Ничего не введено
|
||||
- **WHEN** модалка «Изменить статус» открыта, этап не выбран, комментарий пуст, аналитик закрывает вкладку
|
||||
- **THEN** вкладка закрывается без диалога
|
||||
|
||||
@ -6,27 +6,36 @@
|
||||
- [x] 1.3 `web/CLAUDE.md` — `lucide-react` в «Стек»; `web/ARCHITECTURE.md` — новые виджеты экранов консолидаций.
|
||||
- [x] 1.4 Гайд фронта по API §5.7 — заметка о зеркале ручных переходов (PR в RSHB/arm-ka-docs, сливать вместе с #166).
|
||||
|
||||
## 2. Автор PR
|
||||
## 2. Исправления по ревью раунда 1 (ревьюер, решение владельца 23.10.2026)
|
||||
|
||||
- [ ] 2.1 Исправить «Known issues» 1–13 из `design.md`.
|
||||
- [ ] 2.2 Вынести коммит 71ef633 («Единицы» сводной ОСВ, AURORA-1539) в отдельный PR.
|
||||
- [ ] 2.3 Вынести чистые правила из компонентов в функции без React: подпись колонки «Версия», константа ручных переходов
|
||||
(D-1), активность кнопки «Изменить статус» (D-3), активность «Изменить статус» в модалке, параметр `in_work_only`,
|
||||
подписи и пояснения статусов.
|
||||
- [ ] 2.4 Предупреждение браузера о несохранённых правках (пункт AURORA-1589; вне спеки, решение (е) в `design.md`).
|
||||
- [x] 2.1 Исправить «Known issues» 1–14 из `design.md` (путь смены статуса, `MANUAL_TRANSITIONS` константой, статус для
|
||||
модалки из карточки страницы, ничего не выбрано, кнопка «Изменить статус» по спеке, «Версия», «Только в работе»,
|
||||
«⋯» `disabled`, ошибки текстом сервера, [35], «Отменена», пояснения статусов, «+ Создать» от двух ЮЛ, [31-00],
|
||||
отступ бокового меню, ошибка загрузки списка, «Ответственный» после «Взять в работу», Sidebar с объектом в thunk).
|
||||
- [x] 2.2 Коммит 71ef633 оставить в PR (решение владельца): масштаб сумм на строках без float (`formatScaledAmount`),
|
||||
«—» для нулей, дельта `consolidated-osv-ui`.
|
||||
- [x] 2.3 Вынести чистые правила из компонентов: `web/src/utils/consolidations.ts` (подписи и пояснения статусов,
|
||||
`MANUAL_TRANSITIONS`, `canChangeStatus`, `canSubmitStatusChange`, `isValidReason`, `versionLabel`,
|
||||
`parseInWorkOnly`, `canTakeInWork`, `needsUnmappedWarning`, `endSentence`).
|
||||
- [x] 2.4 Предупреждение браузера о несохранённых правках — в модалках экранов консолидаций (решение (л)); остальные
|
||||
формы — вопрос владельцу (Known issues 16).
|
||||
- [ ] 2.5 Проверить наличие `lucide-react@0.263.1` в зеркале npm банка (Known issues 15) или заменить иконки на
|
||||
`@ant-design/icons`.
|
||||
- [ ] 2.6 Перед слиянием: `make web-check`, `npm test`, `npm run lint` — зелёные, вывод в описание PR.
|
||||
- [ ] 2.7 Сверка экранов с макетом [34], [35], [42], [30], [33-01], [31-00] на стенде; сценарий AURORA-1589: взять версию
|
||||
в работу → «Изменить статус» → «Отменена» с комментарием → новый статус в списке и запись в истории; то же для
|
||||
возврата в «Инициация».
|
||||
`@ant-design/icons` — вопрос автору PR.
|
||||
- [x] 2.6 Проверки в копии ветки с `lucide-react`: `tsc --noEmit`, `biome check`, `prettier --check`, `eslint` (0 ошибок,
|
||||
предупреждений меньше, чем на main), `vitest run`, `npm run build` — зелёные.
|
||||
- [x] 2.7 Сверка на стенде: список [34] (флажок, «Версия», «⋯»), [35] (свободная версия, перехват и гонка — с подменой
|
||||
ответа, 403 без права), «Изменить статус» (варианты, пустой выбор, 409 `TRANSITION_NOT_ALLOWED` подменой тела,
|
||||
карточка из ответа — подменой ответа; статусы стенда не менялись), [42] (одно / два ЮЛ, без создания), сводная ОСВ
|
||||
(единицы, «—»), [31-00] — на временной копии. Сценарий AURORA-1589 со сменой статуса на реальных данных
|
||||
(«Отменена» необратима) — за тестировщиком на отдельной версии.
|
||||
|
||||
## 3. Тесты (ревьюер, после 2.3)
|
||||
## 3. Тесты (ревьюер)
|
||||
|
||||
- [ ] 3.1 vitest на вынесенные функции: «Версия» (1 → пусто, 2 → «2»); переходы — совпадение с `MANUAL_TRANSITIONS`
|
||||
- [x] 3.1 vitest на вынесенные функции: «Версия» (1 → пусто, 2 → «2»); переходы — совпадение с `MANUAL_TRANSITIONS`
|
||||
и пустой список для `VERIFIED`, `CANCELLED`, статусов Среза 7; кнопка «Изменить статус» (своя / чужая / нет
|
||||
блокировки × есть / нет переходов); модалка — нет выбора, комментарий из пробелов; `in_work_only` по умолчанию `false`;
|
||||
подписи «Корректировка данных», «Отменена»; пояснение не равно подписи для статусов из спеки.
|
||||
подписи «Корректировка данных», «Отменена»; пояснение не равно подписи; причина ровно 1000 символов;
|
||||
`formatScaledAmount` (сдвиг, округление, ноль, большие суммы без потери разрядов).
|
||||
|
||||
## 4. После слияния
|
||||
|
||||
|
||||
@ -12,7 +12,8 @@ SPA поверх API arm-core (`/api/v1`). Своих данных и бизне
|
||||
| `src/auth/` | профиль `/me`, dev-вход, права для меню | `api/` |
|
||||
| `src/services/api/` | вызовы ресурсов arm-core | `api/`, `types/` |
|
||||
| `src/store/` | состояние экранов (Redux Toolkit) | `services/api/` |
|
||||
| `src/utils/` | чистые функции: деньги, подписи, скачивание | `types/` |
|
||||
| `src/utils/` | чистые функции: деньги, подписи, скачивание, правила консолидаций | `types/` |
|
||||
| `src/hooks/` | общие React-хуки (виртуальный список, предупреждение `beforeunload`) | React |
|
||||
| `src/types/` | DTO API (повторяют `../api/src/schemas/`) | — |
|
||||
| `src/components/` | примитивы UI (таблица, теги, заголовок) | antd |
|
||||
| `src/widgets/` | блоки экранов (`DocumentReview` — проверка документа со сканом, `ConsolidatedOsv` — сводная ОСВ, `FilesDrawer`; консолидации — см. ниже) | `components/`, `store/`, `services/api/`, `utils/` |
|
||||
@ -27,7 +28,11 @@ SPA поверх API arm-core (`/api/v1`). Своих данных и бизне
|
||||
|---|---|---|
|
||||
| `ConsoleTable/ConsoleTable.tsx` | [34] | список консолидаций ГК: дерево версий, «Только в работе» (`in_work_only`), действия строки, меню «⋯» |
|
||||
| `ConsoleTable/LockModal.tsx` | [35] | «Взять в работу» (`POST …/lock`) и перехват с причиной (`takeover_reason`) |
|
||||
| `ConsoleTable/consts.ts` | — | подписи, цвета и пояснения статусов версии — одно место для списка, карточки и модалки |
|
||||
| `../utils/consolidations.ts` | — | правила без React: подписи и пояснения статусов версии, ручные переходы (`MANUAL_TRANSITIONS` — зеркало бэка), своя блокировка, «Версия», `in_work_only`, причина ≤ 1000 |
|
||||
| `ConsoleTable/consts.ts` | — | цвета бейджей статусов версии |
|
||||
| `ConsolidatedOsv/OsvTabs.tsx` | [30], [31-00] | вкладки шагов отчёта и «Остались неуказанные ИНН» при уходе с «ОСВ» |
|
||||
| `ConsolidatedOsv/useNumberDisplay.tsx` | [30] | «Единицы» и «Знаков после запятой» сводной ОСВ (`formatScaledAmount` из `utils/money.ts`) |
|
||||
| `../hooks/useBeforeUnload.ts` | — | предупреждение браузера о несохранённых правках в открытой модалке |
|
||||
| `ConsoleLegalEntities/` | [34] | панель «Организации» выбранной версии и чек-лист |
|
||||
| `NewConsoleModal/` (`CompanyOptionRow.tsx`) | [42] | «Новая консолидация»; строка ЮЛ с ИНН отдельной колонкой |
|
||||
| `StatusChangeModal/ChangeStatusModal.tsx` | [33-01] | «Изменить статус» (`POST …/status`); открывается из шапки `layouts/ConsolidatedOsvPage.tsx` |
|
||||
|
||||
@ -44,7 +44,8 @@ arm-web перенесены в arm-core #150–#157 (arm-web#7 → #151), сп
|
||||
(скан PDF, экспорт xlsx) с той же обработкой токена/401/ошибок.
|
||||
- `src/services/api/` — функции по ресурсам arm-core (consolidations, files, documents, osv, directories/…).
|
||||
- `src/utils/` — чистые функции без React/store/API: деньги (`money.ts`, суммы — строки), подписи статусов/типов/периодов
|
||||
(`labels.ts`), скачивание и имя файла (`download.ts`).
|
||||
(`labels.ts`), скачивание и имя файла (`download.ts`), правила экранов консолидаций (`consolidations.ts`: статусы,
|
||||
ручные переходы, блокировка).
|
||||
- `src/auth/` — `AuthGate` (профиль `/me`), `DevLogin` (`POST /dev/token`, только не в production), `token.ts`.
|
||||
- `src/store/` — Redux Toolkit: `store.ts`, слайсы `companyGroupsSlice` и `consolidations` (+ `thunks.ts`).
|
||||
- `src/layouts/` — страницы (маршруты в `src/App.tsx`, в т.ч. `/documents/:document_id` и
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user