AURORA-1905: выгрузка форм 1 и 4 — порядок столбцов и заголовки как на экране #260

Open
aep wants to merge 1 commits from feat/253-aurora-1905-form1-form4-export-layout into test
Owner

Closes #253.

Проблема

Выгрузка Excel листов АХР/КВ/Операц/Структура форм 1 и 4 расходилась с экраном сразу по нескольким причинам: пропавшие «Факт 1/2/3 кв» в FORM_4, неверный порядок «Комментарий»/«Скорректированный план» во 2-4 кв., перепутанные заголовки групп («Резерв Финансового Комитета» вместо «План {year}», «Факт РСБУ 3 кв» вместо «4 кв»), задвоенный «Платежи в 2027 году» с неверным годом, ЦКК-поля не на своих местах.

Что сделано

  • FORM_4 дубль вызова патча: _patch_form4_regular_columns() вызывался дважды — второй вызов стирал только что добавленные actual_rsbu_spod_q1..q3. Убрал второй вызов.
  • actual_rsbu_spod ключи: SQL отдаёт это поле только для 4 кв.; для 1-3 кв. теперь q{n}.actual_quarter (как на экране), не всегда пустой q{n}.actual_rsbu_spod.
  • Базовая раскладка FORM1_DEPTH_COLUMNS (наследуется и формой 4): убраны collegial.empty и группы shift (ключ sum, SQL не отдаёт); в q2/q3 добавлен comment_correct/adj_comment сразу после reserve_correct (раньше отсутствовал); в q4 то же поле вынесено из rev_correct в отдельный comment_correct на то же место; approved.plan переименован из скопированного «Резерв Финансового Комитета» в «План {year}»; q4 quarter_correct — из ошибочного «Факт РСБУ 3 кв» в «Факт РСБУ 4 кв {year_short}».
  • render_column_years: добавлен плейсхолдер year_plus_2; contract_summary получил future_y2 «Платежи в {year_plus_2} году» (раньше отсутствовал в базе, а патч FORM_4 дублировал его с неверным {next_year} = +1 год вместо +2). На экране «Операц» формы 1 такой колонки нет — новая FORM1_OPER_DEPTH_COLUMNS без future_y2, подключена в _create_xlsxwriter_sheet_writers только для сheeta OPER.
  • FORM4_OPER ЦКК: proc_plan/proc_method после переименования уезжали в конец блока (pop+переприсвоение добавляет ключ в конец словаря) — вернул порядок экрана через _reorder_children.
  • Фронт (FORM_1/{AHR,CAP,OPER}.js): в q4 узел «Комментарий» (GG) шёл после «Скорректированный план» (GH) — переставлен перед, как в 1-3 кв.

Rulings (решения без обсуждения)

  1. Классифицировал bounded — восстановление заявленного соответствия экран/выгрузка, без новых возможностей.
  2. Намеренно НЕ трогал признанный тикетом дубль ключей q{1,2,3}.actual_quarter (встречается и внутри своего квартала, и в сводной колонке «Факт N кв» перед итогами) — тикет явно разрешает это, как и на экране.
  3. Для FORM1_OPER_DEPTH_COLUMNS использовал copy.deepcopy + pop("future_y2"), а не отдельную ручную раскладку — минимальный диф, одна точка расхождения с AHR/CAP.
  4. Оставил без изменений defensive-пустые pop("shift", None)/pop("collegial"...empty", None) вызовы внутри _patch_form4_regular_columns (они стали no-op после фикса базовой раскладки) — тикет явно просил убрать только comment_correct-setdefault и actual_rsbu_spod-удаление, трогать остальное не просил.

Тесты

  • api/tests/unit/test_export_form1_form4_mapping.py (новый, 10 тестов): нет collegial.empty/shift.sum; в FORM4_DEPTH_COLUMNS перед totals есть q1/q2/q3.actual_quarter (по 2 вхождения, дубль признан) и ровно один q4.actual_rsbu_spod; adj_comment идёт сразу после adj_reserve в q2/q3/q4 для FORM1_DEPTH_COLUMNS/FORM4_DEPTH_COLUMNS/FORM4_STRUCTURE_DEPTH_COLUMNS; ЦКК procurement_plan/procurement_method — перед comment; FORM1_OPER_DEPTH_COLUMNS без future_y2, у AHR/CAP он есть; render_column_years резолвит «Платежи в 2028 году», «План 2026», «Факт РСБУ 4 кв 26» для FORM_1/FORM_4/FORM_4_STRUCTURE; повторный importlib.reload модуля не меняет раскладку (регресс на дубль вызова патча, как просил тикет).
  • web/.../utils/form1Q4CommentOrder.test.js (новый, 3 теста): порядок q4.adj_reserve → q4.adj_comment → q4.corrected_plan для AHR/CAP/OPER. Проверено, что тест падал на исходных файлах test (comment<plan: false на всех трёх) до правки.
  • pytest tests/unit — 68 passed, 2 failed, оба failed не связаны с этой правкой (test_export_service_query_params.py, экспорт-сервис, те же 2 падения на test без моих изменений).
  • Интеграционные тесты и реальный .xlsx — НЕ ЗАПУСКАЛИСЬ: в этом окружении нет Postgres. Структура и тексты заголовков проверены юнит-тестами через реальный XlsxDepthSheetWriter, но сам файл визуально не открывал.
  • Frontend: node --test src/components/RealtimeTable/utils/*.test.js — 11/11. npm run build — без ошибок. Biome на изменённых файлах — 0 ошибок/предупреждений (как и на baseline).

Ручная проверка (acceptance criteria, не автоматизировано)

  • Выгрузить АХР/КВ/Операц формы 4 («Проектная деятельность») — есть «Факт 1 кв», «Факт 2 кв», «Факт 3 кв» со значениями, «Факт 4 кв + СПОД» на месте.
  • В выгрузке форм 1 и 4 «Комментарий» 2-4 кв. стоит сразу после «Корректировки из резерва», перед «Скорректированный план».
  • Группа «Итоговая смета расходов» подписана «План {year}», а не «Резерв Финансового Комитета»; 4 кв. факта РСБУ подписан «4 кв», не «3 кв».
  • «Платежи в {year+2} году» на АХР/КВ формы 1 и 4 — один раз, с правильным годом (year+2, не year+1); на «Операц» формы 1 колонки нет вовсе.
  • Операц формы 4: «План закупок»/«Способ закупки» ЦКК — перед «Комментарий», как на экране.
  • Выгрузка формы 2 (Смета РФ, AURORA-1902) не затронута этой правкой.

🤖 Generated with Claude Code

Closes #253. ## Проблема Выгрузка Excel листов АХР/КВ/Операц/Структура форм 1 и 4 расходилась с экраном сразу по нескольким причинам: пропавшие «Факт 1/2/3 кв» в FORM_4, неверный порядок «Комментарий»/«Скорректированный план» во 2-4 кв., перепутанные заголовки групп («Резерв Финансового Комитета» вместо «План {year}», «Факт РСБУ 3 кв» вместо «4 кв»), задвоенный «Платежи в 2027 году» с неверным годом, ЦКК-поля не на своих местах. ## Что сделано - **FORM_4 дубль вызова патча**: `_patch_form4_regular_columns()` вызывался дважды — второй вызов стирал только что добавленные `actual_rsbu_spod_q1..q3`. Убрал второй вызов. - **actual_rsbu_spod ключи**: SQL отдаёт это поле только для 4 кв.; для 1-3 кв. теперь `q{n}.actual_quarter` (как на экране), не всегда пустой `q{n}.actual_rsbu_spod`. - **Базовая раскладка `FORM1_DEPTH_COLUMNS`** (наследуется и формой 4): убраны `collegial.empty` и группы `shift` (ключ `sum`, SQL не отдаёт); в q2/q3 добавлен `comment_correct`/`adj_comment` сразу после `reserve_correct` (раньше отсутствовал); в q4 то же поле вынесено из `rev_correct` в отдельный `comment_correct` на то же место; `approved.plan` переименован из скопированного «Резерв Финансового Комитета» в «План {year}»; q4 `quarter_correct` — из ошибочного «Факт РСБУ 3 кв» в «Факт РСБУ 4 кв {year_short}». - **`render_column_years`**: добавлен плейсхолдер `year_plus_2`; `contract_summary` получил `future_y2` «Платежи в {year_plus_2} году» (раньше отсутствовал в базе, а патч FORM_4 дублировал его с неверным `{next_year}` = +1 год вместо +2). На экране «Операц» формы 1 такой колонки нет — новая `FORM1_OPER_DEPTH_COLUMNS` без `future_y2`, подключена в `_create_xlsxwriter_sheet_writers` только для сheeta OPER. - **FORM4_OPER ЦКК**: `proc_plan`/`proc_method` после переименования уезжали в конец блока (pop+переприсвоение добавляет ключ в конец словаря) — вернул порядок экрана через `_reorder_children`. - **Фронт** (`FORM_1/{AHR,CAP,OPER}.js`): в q4 узел «Комментарий» (GG) шёл после «Скорректированный план» (GH) — переставлен перед, как в 1-3 кв. ## Rulings (решения без обсуждения) 1. Классифицировал bounded — восстановление заявленного соответствия экран/выгрузка, без новых возможностей. 2. Намеренно НЕ трогал признанный тикетом дубль ключей `q{1,2,3}.actual_quarter` (встречается и внутри своего квартала, и в сводной колонке «Факт N кв» перед итогами) — тикет явно разрешает это, как и на экране. 3. Для `FORM1_OPER_DEPTH_COLUMNS` использовал `copy.deepcopy` + `pop("future_y2")`, а не отдельную ручную раскладку — минимальный диф, одна точка расхождения с AHR/CAP. 4. Оставил без изменений defensive-пустые `pop("shift", None)`/`pop("collegial"...empty", None)` вызовы внутри `_patch_form4_regular_columns` (они стали no-op после фикса базовой раскладки) — тикет явно просил убрать только `comment_correct`-setdefault и `actual_rsbu_spod`-удаление, трогать остальное не просил. ## Тесты - `api/tests/unit/test_export_form1_form4_mapping.py` (новый, 10 тестов): нет `collegial.empty`/`shift.sum`; в `FORM4_DEPTH_COLUMNS` перед `totals` есть `q1/q2/q3.actual_quarter` (по 2 вхождения, дубль признан) и ровно один `q4.actual_rsbu_spod`; `adj_comment` идёт сразу после `adj_reserve` в q2/q3/q4 для `FORM1_DEPTH_COLUMNS`/`FORM4_DEPTH_COLUMNS`/`FORM4_STRUCTURE_DEPTH_COLUMNS`; ЦКК `procurement_plan`/`procurement_method` — перед `comment`; `FORM1_OPER_DEPTH_COLUMNS` без `future_y2`, у AHR/CAP он есть; `render_column_years` резолвит «Платежи в 2028 году», «План 2026», «Факт РСБУ 4 кв 26» для FORM_1/FORM_4/FORM_4_STRUCTURE; повторный `importlib.reload` модуля не меняет раскладку (регресс на дубль вызова патча, как просил тикет). - `web/.../utils/form1Q4CommentOrder.test.js` (новый, 3 теста): порядок `q4.adj_reserve → q4.adj_comment → q4.corrected_plan` для AHR/CAP/OPER. Проверено, что тест падал на исходных файлах `test` (`comment<plan: false` на всех трёх) до правки. - `pytest tests/unit` — 68 passed, 2 failed, оба failed не связаны с этой правкой (`test_export_service_query_params.py`, экспорт-сервис, те же 2 падения на `test` без моих изменений). - **Интеграционные тесты и реальный .xlsx — НЕ ЗАПУСКАЛИСЬ: в этом окружении нет Postgres.** Структура и тексты заголовков проверены юнит-тестами через реальный `XlsxDepthSheetWriter`, но сам файл визуально не открывал. - Frontend: `node --test src/components/RealtimeTable/utils/*.test.js` — 11/11. `npm run build` — без ошибок. Biome на изменённых файлах — 0 ошибок/предупреждений (как и на baseline). ## Ручная проверка (acceptance criteria, не автоматизировано) - [ ] Выгрузить АХР/КВ/Операц формы 4 («Проектная деятельность») — есть «Факт 1 кв», «Факт 2 кв», «Факт 3 кв» со значениями, «Факт 4 кв + СПОД» на месте. - [ ] В выгрузке форм 1 и 4 «Комментарий» 2-4 кв. стоит сразу после «Корректировки из резерва», перед «Скорректированный план». - [ ] Группа «Итоговая смета расходов» подписана «План {year}», а не «Резерв Финансового Комитета»; 4 кв. факта РСБУ подписан «4 кв», не «3 кв». - [ ] «Платежи в {year+2} году» на АХР/КВ формы 1 и 4 — один раз, с правильным годом (year+2, не year+1); на «Операц» формы 1 колонки нет вовсе. - [ ] Операц формы 4: «План закупок»/«Способ закупки» ЦКК — перед «Комментарий», как на экране. - [ ] Выгрузка формы 2 (Смета РФ, AURORA-1902) не затронута этой правкой. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 1 commit 2026-10-30 21:04:46 +03:00
Выгрузка Excel листов АХР/КВ/Операц/Структура форм 1 и 4 расходилась с экраном
по нескольким независимым причинам:

- FORM_4: _patch_form4_regular_columns() вызывался дважды — второй вызов
  стирал только что добавленные actual_rsbu_spod_q1..q3, поэтому в выгрузке
  были только «Факт 4 кв + СПОД», без «Факт 1/2/3 кв». Убрал второй вызов
  и больше не удаляю эти ключи в самом патче.
- _patch_form4_actual_rsbu_spod_columns: SQL отдаёт actual_rsbu_spod только
  для 4 кв.; для 1-3 кв. ключ теперь q{n}.actual_quarter (как на экране),
  не q{n}.actual_rsbu_spod (всегда пустой).
- Базовая раскладка FORM1_DEPTH_COLUMNS (отражается и в FORM_4, т.к. она из неё
  строится): убрал collegial.empty и группы "shift" (ключ sum, SQL не отдаёт);
  в q2/q3 добавил comment_correct (adj_comment) сразу после reserve_correct —
  раньше его не было вовсе; в q4 то же поле вынес из rev_correct в отдельный
  comment_correct на то же место (было в начале квартала вместе с комментарием
  корректировки плана). group "approved.plan" переименована из скопированного
  "Резерв Финансового Комитета" в "План {year}"; q4 "quarter_correct" — из
  ошибочного "Факт РСБУ 3 кв" в "Факт РСБУ 4 кв {year_short}".
- render_column_years: добавлен плейсхолдер year_plus_2 (year+2); contract_summary
  получил future_y2 "Платежи в {year_plus_2} году" (раньше его не было, и FORM_4
  patch всё равно дублировал его с неверным {next_year}). На экране «Операц»
  формы 1 такой колонки нет — для неё новая FORM1_OPER_DEPTH_COLUMNS без future_y2.
- FORM4_OPER: proc_plan/proc_method после переименования уезжали в конец блока
  ckk (pop+переприсвоение добавляет ключ в конец словаря) — вернул порядок
  экрана через _reorder_children.
- web/.../FORM_1/{AHR,CAP,OPER}.js: в q4 узел "Комментарий" (adj_comment, GG)
  шёл после "Скорректированный план" (corrected_plan, GH) — переставил перед,
  как в 1-3 кв.

Issue: #253 (AURORA-1905, эпик AURORA-1876, Высокий приоритет)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This pull request can be merged automatically.
You are not authorized to merge this pull request.

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin feat/253-aurora-1905-form1-form4-export-layout:feat/253-aurora-1905-form1-form4-export-layout
git checkout feat/253-aurora-1905-form1-form4-export-layout
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RSHB/DFiP_Budget_planing#260
No description provided.