From b499787d10e0c55327fb07a4711b46d841310871 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Wed, 28 Oct 2026 22:05:02 +0400 Subject: [PATCH] =?UTF-8?q?docs(web):=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8?= =?UTF-8?q?=D1=86=D0=B0=20=D0=BA=D0=BE=D1=80=D1=80=D0=B5=D0=BA=D1=82=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=BE=D0=BA=20=E2=80=94=20README,=20ARCHITEC?= =?UTF-8?q?TURE,=20tasks=20(#206)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../changes/corrections-table-ui/design.md | 4 ++ .../changes/corrections-table-ui/tasks.md | 42 +++++++++++++++++++ web/ARCHITECTURE.md | 29 +++++++++++++ web/README.md | 10 +++++ 4 files changed, 85 insertions(+) create mode 100644 openspec/changes/corrections-table-ui/tasks.md diff --git a/openspec/changes/corrections-table-ui/design.md b/openspec/changes/corrections-table-ui/design.md index 00b07e5..37942d8 100644 --- a/openspec/changes/corrections-table-ui/design.md +++ b/openspec/changes/corrections-table-ui/design.md @@ -200,3 +200,7 @@ | 28.10.2026 | R-18: суммы в окне показываются в рублях (`1 000 000,00`) независимо от единиц панели, а в полях ввода — как есть (`1000000.00`, пробелы запрещены R-4); у строки контроля без процента (`percent = null`, одна сторона 0) процент не пишется, у равенства — «= 0,00» | единицы панели — про таблицу; дизайн показывает «(100%)» там, где процент к меньшей стороне не определён, фронт его не выдумывает | расхождение с дизайном в тексте контроля | | 28.10.2026 | R-19: агрегат исчез из ответа — окно открыто, стороны «—», «Сохранить» неактивна, пояснение в плашке; ключ PUT берётся из ответа, поэтому без агрегата сохранить нельзя | Review Focus плана | — | | 28.10.2026 | R-20: в окне нет названий статей рядом с кодом («дт 1230 Дебиторская задолженность» в дизайне) | в ответе API названий статей нет, а фронт их не выдумывает | добавить поле `article_name` в контракт и показать | +| 28.10.2026 | R-21: код фейка (`correctionsFake`, `mockData`, `mockCalc`, ~20 КБ исходников) остаётся в прод-бандле при сборке без флага; сам не вырезал | `Config.CORRECTIONS_MOCK` — обычное чтение `process.env.REACT_APP_CORRECTIONS_MOCK`, импорты статические: `npm run build` без флага даёт строку «Требуется сверка» в `index_script`; вырезание требует динамического импорта фейка или `define`-константы в rsbuild — не мелкая правка; Task 8 фейк всё равно удаляет | лишние ~8 КБ gzip в бандле до Task 8; вопрос владельцу: делать ли вырезание сейчас | +| 28.10.2026 | R-22: Prettier и ESLint применены к файлам задачи (`npm run lint` падал на форматировании 17 файлов, на вложенных тернарниках окна и BOM-литерале в фейке); BOM — `\uFEFF`, поведение то же | `npm run lint` — шаг проверки Task 7 | — | +| 28.10.2026 | R-23: «Вернуть к автоматике» на нераспределённой строке в фейке только снимает «исключена» и не возвращает строку в правило | фейк не знает, какое правило было автоматическим; настоящее поведение — на бэкенде (1540) | аналитик на демо на фейке не увидит возврата; проверить при подключении API | +| 28.10.2026 | R-24: у агрегата флажок «Учитывать в КФО» — серый неактивный индикатор «Да / Частично / Нет», а в дизайне зелёный | решение 28.10 (флажок ставится на строках, у агрегата производное) | ответ по п. 4 «на агрегат» | diff --git a/openspec/changes/corrections-table-ui/tasks.md b/openspec/changes/corrections-table-ui/tasks.md new file mode 100644 index 0000000..747ede6 --- /dev/null +++ b/openspec/changes/corrections-table-ui/tasks.md @@ -0,0 +1,42 @@ +## 1. Типы контракта, клиент API, флаг фейка + +- [x] 1.1 Типы `src/types/corrections.ts` по контракту `docs/dev/api-contract-corrections.md` +- [x] 1.2 Клиент `src/services/api/corrections.ts` (таблица, сохранение, отмена, разнесение, экспорт) и флаг `Config.CORRECTIONS_MOCK` + +## 2. Фейк контракта и модель таблицы + +- [x] 2.1 Фейк `correctionsFake` и данные дизайна `mockData` / `mockCalc` под флагом `REACT_APP_CORRECTIONS_MOCK` +- [x] 2.2 Чистая модель таблицы `tableModel.ts`: строки, фильтры, пресет правила, итоги + +## 3. Модель окна корректировки и черновик + +- [x] 3.1 `editorModel.ts`: состояние окна, проверки ввода, контроль баланса, кандидаты для выбора строки +- [x] 3.2 Деньги копейками в `utils/money.ts`, черновик в `draftStorage.ts` + +## 4. Вкладка и таблица только на чтение + +- [x] 4.1 Вкладка «Таблица корректировки»: загрузка, ошибка с «Повторить», пусто, экспорт, полный экран +- [x] 4.2 Таблица с группами колонок, раскрытием агрегата, нераспределёнными записями, «Итого» +- [x] 4.3 Панель: отображение, пресет правила, тип записи, единицы, знаки, сброс фильтров, настройка таблицы; фильтры в заголовках + +## 5. Решения по строкам, отмена корректировки, только чтение + +- [x] 5.1 Флажок «Учитывать в КФО» и меню строки (перенос в правило, убрать из правила, вернуть к автоматике) +- [x] 5.2 Отмена корректировки с комментарием, подсказки режима «только чтение», обработка 409 + +## 6. Окно «Корректировка операции» + +- [x] 6.1 Окно: стороны, строки ОСВ, распределение корректировки, контроль баланса, комментарий, сохранение +- [x] 6.2 Выбор нераспределённой строки (picker), черновик, плашки конфликта, доступность с клавиатуры + +## 7. Сверка с дизайном, проверки, документация + +- [x] 7.1 Проход сценариев спеки в браузере на фейке и сверка частей экрана с дизайном (ширина 1920) +- [x] 7.2 `make web-check`, `npm test`, `npm run lint`, `openspec validate corrections-table-ui --strict` +- [x] 7.3 README (флаг фейка) и ARCHITECTURE (виджет `CorrectionTable`) + +## 8. Подключение к API (после слияния AURORA-1540) + +- [ ] 8.1 Влить `main`, запустить без флага на стенде на реальной версии, пройти сценарии спеки +- [ ] 8.2 Расхождения ответа с контрактом — правка фейка и типов или замечание в PR 1540; убрать фейк (`correctionsFake`, `mockData`, `mockCalc`) и флаг +- [ ] 8.3 `make check-full`, PR в `main` diff --git a/web/ARCHITECTURE.md b/web/ARCHITECTURE.md index b3a44ec..9950541 100644 --- a/web/ARCHITECTURE.md +++ b/web/ARCHITECTURE.md @@ -39,6 +39,35 @@ SPA поверх API arm-core (`/api/v1`). Своих данных и бизне | `NewConsoleModal/` (`CompanyOptionRow.tsx`) | [42] | «Новая консолидация»; строка ЮЛ с ИНН отдельной колонкой | | `StatusChangeModal/ChangeStatusModal.tsx` | [33-01] | «Изменить статус» (`POST …/status`); открывается из шапки `layouts/ConsolidationReportPage.tsx` | +### Виджет «Таблица корректировки» (`widgets/CorrectionTable/`) + +Требования — `../openspec/changes/corrections-table-ui/` (спека `corrections-table-ui`, решения — `design.md`). Контракт — +`../../docs/dev/api-contract-corrections.md`, типы — `src/types/corrections.ts`, вызовы — `src/services/api/corrections.ts` +(под флагом `REACT_APP_CORRECTIONS_MOCK` вместо HTTP — `correctionsFake.ts`, см. README). + +Поток данных: страница отчёта → `CorrectionContent` (вкладка: загрузка, ошибка с «Повторить», экспорт, полный экран) +→ хук `useCorrectionTable` (запрос; применяется только ответ последнего запроса, `latestOnly`) → таблица целиком хранится в +родителе; `CorrectionTable` только рисует, фильтры/раскрытие/колонки — состояние родителя. Решение по строке (флажок, +меню) → `allocate` → таблица заменяется ответом; «Корректировать» → `CorrectionEditorModal` → `saveCorrection` +(`PUT`, `expected_version_no`) → подмена одного агрегата; отмена — `RevokeModal` → `revokeCorrection`. Черновик окна — +`localStorage` (`draftStorage`). + +| Файл | Тип | Что делает | +|---|---|---| +| `tableModel.ts` | чистый | строки таблицы (агрегат, его строки ОСВ, нераспределённые), фильтры, пресет правила, итоги | +| `editorModel.ts` | чистый | состояние окна: исходное из агрегата, проверки ввода, контроль баланса, кандидаты в picker, пересборка | +| `editorView.ts` | чистый | тексты окна: ошибки сохранения, плашка черновика, строка контроля, подпись «Выбрать» | +| `readOnly.ts` | чистый | подсказки «только чтение», меню строки (`allocationMenu`), тело запроса разнесения | +| `draftStorage.ts` | чистый | черновик окна в `localStorage` (ключ: пользователь + версия + агрегат) | +| `columns.ts` | чистый | ключи и группы колонок для «Настройки таблицы» | +| `useCorrectionTable.ts` | хук | загрузка, `reload`/`replace`/`replaceAggregate` | +| `CorrectionContent.tsx`, `CorrectionToolbar.tsx`, `CorrectionTable.tsx`, `HeaderFilter.tsx` | компоненты | вкладка, панель, таблица с группами колонок, воронки в заголовках | +| `CorrectionEditorModal.tsx`, `EditorSide.tsx`, `AllocationPicker.tsx`, `RevokeModal.tsx` | компоненты | окно «Корректировка операции», сторона окна, выбор нераспределённой строки, отмена | +| `mockData.ts`, `mockCalc.ts` | фейк | данные дизайна и пересчёт агрегата; вырезаются при подключении API | +| `../../utils/money.ts` | чистый | деньги копейками (`toCents`, `percentOfSmaller`, порог 5 %) | + +Чистые модули покрыты vitest (`*.test.ts`); компоненты тестов не имеют (нет DOM-библиотеки), их проверяют в браузере. + ## Границы - Сетевые запросы — только через `src/api/client.ts`; `fetch` напрямую не вызывается. - `components/` не знают про store и API; `types/` ни от чего не зависят. diff --git a/web/README.md b/web/README.md index 9c54972..4a6b073 100644 --- a/web/README.md +++ b/web/README.md @@ -65,6 +65,16 @@ SPA кредитного аналитика поверх API `arm-core` (`/api/v «Разберите строки без кода: N» ведёт к первой); панель файлов ЮЛ показывает счётчик предупреждений файла и документа. Карта модулей — `ARCHITECTURE.md`. +## Таблица корректировок на фейке (`REACT_APP_CORRECTIONS_MOCK`) + +Вкладка «Таблица корректировки» отчёта версии ждёт API `…/corrections` (AURORA-1540). Пока его нет, фронт работает на +**фейке контракта**: `REACT_APP_CORRECTIONS_MOCK=true npm run start` — вместо HTTP-запросов вызываются функции +`src/services/api/correctionsFake.ts` с данными из дизайна 23.10 (`widgets/CorrectionTable/mockData.ts`). Состояние +фейка живёт в памяти страницы и сбрасывается перезагрузкой; решения по строкам, сохранение и отмена корректировки, +экспорт (CSV вместо xlsx) работают. Без флага (по умолчанию, в том числе в `npm run build`) фронт ходит в настоящий API. +Флаг читается при сборке из `Config.CORRECTIONS_MOCK` (`src/conf/config.ts`), но код фейка в бандл попадает всегда +(не вырезается) — см. design.md, R-21. Черновики окна корректировки лежат в `localStorage` браузера. + ## Ограничения - Нет блокировки версии («Взять в работу»), сопоставления контрагентов, экрана чек-листа, комментариев, удаления файлов,