AURORA-1541: таблица корректировки — подключена к реальному API (#206) #215

Merged
aep merged 29 commits from feat/206-corrections-ui into main 2026-11-02 20:12:17 +03:00
Owner

Closes #206.

Вкладка «Таблица корректировки» карточки версии консолидации: Task 1–9 (дизайн, модель, таблица, окно корректировки, решения по строкам) выполнены раньше (см. ledger .superpowers/sdd/2026-10-28-corrections-table-ui/progress.md), ветка ждала реального API AURORA-1540/1751. Этот PR — Task 8: подключение к API после слияния arm-core #208.

Что сделано

  • Влит main (#208) — один тривиальный конфликт импортов в ConsolidationReportPage.tsx (ChessContent + CorrectionContent рядом).
  • Реальный контракт #208 не совпал с тем, что фронт ожидал: не единая POST …/corrections/allocations, а разделённые PUT/DELETE …/vgo-assignments/rule + PUT …/vgo-assignments/exclude, ответ — список решений, а не вся таблица. Расхождение закрыто внутри allocate() (services/api/corrections.ts) — она сама маршрутизирует по action и перечитывает таблицу; CorrectionContent/CorrectionEditorModal не трогал.
  • api.del (api/client.ts) научен отправлять тело — нужно для DELETE …/vgo-assignments/rule.
  • Фейк контракта (correctionsFake.ts + тест) и флаг CORRECTIONS_MOCK/REACT_APP_CORRECTIONS_MOCK убраны (R-27). mockData/mockCalc остались тестовыми фикстурами моделей.
  • R-35 (design.md): порог 5% в живом контроле окна и подписи фильтра приведены к факту реального API (строго >, не ≥ — снимает расхождение R-34).
  • README/ARCHITECTURE/spec.md обновлены под реальный контракт.

Rulings без обсуждения (design.md)

  • R-35 — граница 5% синхронизирована с фактическим поведением API 1540, а не с неоднозначным текстом контракта; вопрос «включительно или нет» остаётся открытым для Лысенко, фронт просто не расходится с текущим сервером.

Проверено

  • npm test — 544/544 (в т.ч. переписанный тест границы 5%).
  • npm run lint, make web-check (biome + tsc + build) — чисто.
  • Браузер на реальном стенде (не CDP-подмена, настоящий dev-логин ka_go@armka.local), версия «Русский Бисквит — 2025 К1»: загрузка таблицы (агрегаты + нераспределённые), PUT vgo-assignments/exclude (туда-обратно), DELETE vgo-assignments/rule (тело реально ушло), PUT vgo-assignments/rule (ASSIGN), saveCorrection на реальном агрегате, экспорт xlsx — всё 200, консоль чистая.

Не проверено (см. tasks.md §8.1, не блокер)

Полноэкранный режим, 409/CORRECTION_VERSION_CONFLICT, приватное окно без localStorage, именные сценарии спеки (Сатурн — Архол и т.п. — это фикстуры pytest бэкенда, не демо-данные стенда), allocate/VALIDATION_ERROR на нескольких entry_ids.

check-full

В процессе работы нашёл и вынес отдельным PR (#213/#214, пока не смёржен) несвязанный баг main: test_env_test_is_read сверял старый порт 5431 вместо актуального 5432 (хвост ревью #208, I-5) — упал в make check-full этой ветки. После мёржа #214 и повторного слияния main сюда make check-full стоит прогнать заново; до правки порта всё остальное (1918 тестов бэкенда, включая arm_statements) было зелёным.

🤖 Generated with Claude Code

Closes #206. Вкладка «Таблица корректировки» карточки версии консолидации: Task 1–9 (дизайн, модель, таблица, окно корректировки, решения по строкам) выполнены раньше (см. ledger `.superpowers/sdd/2026-10-28-corrections-table-ui/progress.md`), ветка ждала реального API AURORA-1540/1751. Этот PR — Task 8: подключение к API после слияния arm-core #208. ## Что сделано - Влит `main` (#208) — один тривиальный конфликт импортов в `ConsolidationReportPage.tsx` (ChessContent + CorrectionContent рядом). - Реальный контракт #208 не совпал с тем, что фронт ожидал: не единая `POST …/corrections/allocations`, а разделённые `PUT`/`DELETE …/vgo-assignments/rule` + `PUT …/vgo-assignments/exclude`, ответ — список решений, а не вся таблица. Расхождение закрыто внутри `allocate()` (`services/api/corrections.ts`) — она сама маршрутизирует по `action` и перечитывает таблицу; `CorrectionContent`/`CorrectionEditorModal` не трогал. - `api.del` (`api/client.ts`) научен отправлять тело — нужно для `DELETE …/vgo-assignments/rule`. - Фейк контракта (`correctionsFake.ts` + тест) и флаг `CORRECTIONS_MOCK`/`REACT_APP_CORRECTIONS_MOCK` убраны (R-27). `mockData`/`mockCalc` остались тестовыми фикстурами моделей. - R-35 (design.md): порог 5% в живом контроле окна и подписи фильтра приведены к факту реального API (строго `>`, не `≥` — снимает расхождение R-34). - README/ARCHITECTURE/spec.md обновлены под реальный контракт. ## Rulings без обсуждения (design.md) - R-35 — граница 5% синхронизирована с фактическим поведением API 1540, а не с неоднозначным текстом контракта; вопрос «включительно или нет» остаётся открытым для Лысенко, фронт просто не расходится с текущим сервером. ## Проверено - `npm test` — 544/544 (в т.ч. переписанный тест границы 5%). - `npm run lint`, `make web-check` (biome + tsc + build) — чисто. - Браузер на реальном стенде (не CDP-подмена, настоящий dev-логин `ka_go@armka.local`), версия «Русский Бисквит — 2025 К1»: загрузка таблицы (агрегаты + нераспределённые), `PUT vgo-assignments/exclude` (туда-обратно), `DELETE vgo-assignments/rule` (тело реально ушло), `PUT vgo-assignments/rule` (ASSIGN), `saveCorrection` на реальном агрегате, экспорт xlsx — всё 200, консоль чистая. ## Не проверено (см. tasks.md §8.1, не блокер) Полноэкранный режим, 409/`CORRECTION_VERSION_CONFLICT`, приватное окно без `localStorage`, именные сценарии спеки (Сатурн — Архол и т.п. — это фикстуры pytest бэкенда, не демо-данные стенда), `allocate`/`VALIDATION_ERROR` на нескольких `entry_ids`. ## check-full В процессе работы нашёл и вынес отдельным PR (#213/#214, пока не смёржен) несвязанный баг main: `test_env_test_is_read` сверял старый порт 5431 вместо актуального 5432 (хвост ревью #208, I-5) — упал в `make check-full` этой ветки. После мёржа #214 и повторного слияния `main` сюда `make check-full` стоит прогнать заново; до правки порта всё остальное (1918 тестов бэкенда, включая `arm_statements`) было зелёным. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 29 commits 2026-11-02 20:09:28 +03:00
OpenSpec change corrections-table-ui: proposal, design, спека
corrections-table-ui и дельта intercompany-matrix-ui (вкладка
доступна). AURORA-1541.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Типы 1:1 с components.schemas контракта корректировок, клиент API
(таблица, сохранение, отзыв, разнесение, экспорт), флаг
REACT_APP_CORRECTIONS_MOCK в Config. Ветка фейка пока бросает ошибку
(фейк — в следующей задаче). Строка R-1 в design.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Стороны нового агрегата по знаку строки, RULE_REQUIRED, ENTRY_NOT_IN_VERSION,
атомарность allocate, возврат прежнего правила в кандидаты, тесты.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Состояние окна «Корректировка операции», проверки ввода, живой контроль
(исходные суммы и распределение), кандидаты «Добавить строку ОСВ» и
черновик в localStorage. Деньги — строки, сложение через sumAmounts,
ввод через parseAmountInput; процент — percentOfSmaller из mockCalc.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Копейки, процент и порог 5 % вынесены из mockCalc в utils/money;
  editorModel больше не зависит от фейка, тесты перенесены.
- Один разбор суммы строки ввода для проверки, живого контроля и сравнения;
  некорректные строки в живой контроль не входят.
- isDirty сравнивает суммы копейками; комментарий — точно.
- Черновик: savedAt проверяется через Date.parse.
- Тесты границ порога, пустых сторон и неизвестного rule_id.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Флажок «Учитывать в КФО» и меню строк (перенести, убрать, вернуть к
автоматике) отправляют allocate; «Отменить корректировку» открывает окно
с обязательным комментарием и вызывает revoke. Ошибки — уведомление с
текстом сервера, 409 — ещё перечитывание таблицы. Подсказки режима только
чтения вынесены в readOnly.ts, подсказка «Недоступно» убрана (T4.14).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
T6.11: при пересборке окна из нового агрегата (правок не было) база черновика
обновляется до текущей редакции корректировки, иначе при следующем открытии
показывалась ложная плашка об изменении.
T6.12: подпись кнопки «Выбрать» называет контрагента; ошибки полей статьи
объявляются role=alert.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
I-1: локальный notification.useNotification с getContainer на бокс вкладки; M-6, M-8: комментарии.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
I-2: sourceDiff = суммы сторон, отклонение и порог из агрегата; diffOf только для распределения.
M-1: целая часть суммы не более 16 цифр («Слишком большая сумма»). M-6, M-7: комментарий, один percentText.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
I-3: u|<side>|<entry_ids>; тест на две позиции с одинаковыми entry_ids.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
M-4, M-8.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
I-4, M-3, M-9, M-10, M-11.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
AllocationIn получил side: строка с дебетовым и кредитовым сальдо даёт
две позиции, решение касается одной. Флажок, меню строки, окно
корректировки и фейк передают и ищут позицию по строке и стороне.
Контракт — docs PR #184.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- отзыв корректировки убран (RevokeModal, revokeCorrection, пункт меню агрегата);
  `status` из тела PUT убран — сервер сразу применяет (R-29, R-30);
- «Учитывать в КФО»: у агрегата отмечен и закреплён, у строк агрегата флажка нет,
  у нераспределённых — EXCLUDE/INCLUDE; `excluded` у строки агрегата убран (R-31, R-32);
- у нераспределённой — строка баланса владельца `line_code`, фильтр «Строка баланса»
  действует и на неё (R-33);
- фейк: ENTRY_ALLOCATED для EXCLUDE/INCLUDE строки агрегата, ENTRY_EXCLUDED для ASSIGN
  исключённой; «Убрать из правила» отдаёт строку с line_code;
- спека, design.md (R-29…R-34), tasks §9, план Task 9, README/ARCHITECTURE.

Источник: AURORA-1395 #9920570, WIP API arm-core #208.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Конфликт в ConsolidationReportPage.tsx — импорт ChessContent (main) и
CorrectionContent (эта ветка), оставлены оба.
Нужно для DELETE .../vgo-assignments/rule (снятие правила) — API
ждёт statement_type/entry_ids в теле. Единственный прежний вызов
(files.ts, без тела) не затронут.
Реальный контракт AURORA-1540/1751 не дал единой POST .../allocations:
решение по строке разбито на PUT/DELETE .../vgo-assignments/rule
(привязка/снятие правила) и PUT .../vgo-assignments/exclude (КФО),
ответ — список VgoAssignmentOut, а не вся таблица. allocate()
маршрутизирует по action и перечитывает таблицу сама — вызывающий код
(CorrectionContent, CorrectionEditorModal) не менялся.

Фейк контракта (CORRECTIONS_MOCK) убран — API уже есть. mockData/mockCalc
остаются тестовыми фикстурами (R-27).

Проверено на реальном стенде (Русский Бисквит — 2025 К1): загрузка
таблицы, EXCLUDE/INCLUDE, ASSIGN, снятие правила, сохранение
корректировки, экспорт — без ошибок в консоли.
Фронт закладывал >= 5% (R-34, из неоднозначного текста контракта
«от 5% включительно»), а API 1540 (domain/corrections.py) считает
строго больше. Приведены к факту: живой контроль окна (editorModel),
подпись фильтра «Отклонение, %», тест на границе (ровно 5.00% больше
не красный, добавлен случай 5.01%).
aep merged commit 49b18b8484 into main 2026-11-02 20:12:17 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RSHB/arm-core#215
No description provided.