AURORA-1902: Смета РФ — выгрузка Операц/АХР/КВ своей раскладкой #259
Open
aep
wants to merge 1 commits from
feat/252-aurora-1902-form2-export-layout into test
pull from: feat/252-aurora-1902-form2-export-layout
merge into: RSHB:test
RSHB:main
RSHB:feat/254-aurora-1906-spod-column
RSHB:feat/255-aurora-1938-transfer-econ-calc
RSHB:feat/250-aurora-1888-stages-role-filter
RSHB:feat/253-aurora-1905-form1-form4-export-layout
RSHB:feat/251-aurora-1901-smeta-rf-column-order
RSHB:feat/249-aurora-1936-row-delete-confirm
RSHB:feat/248-aurora-1877-token-refresh
RSHB:feat/246-aurora-1944-wheel-scroll-step
RSHB:feat/236-aurora-1843-svod2-server-paging-perf
RSHB:feat/236-aurora-1843-svod2-server-paging-web
RSHB:feat/236-aurora-1843-svod2-server-paging
RSHB:feat/214-aurora-1841-dict-vsp-virtual
RSHB:feat/220-aurora-1842-svod2-column-virtual
RSHB:feat/216-aurora-1846-form4-sheet-sum
RSHB:feat/235-aurora-1850-upd-form-cells-subtree
RSHB:feat/233-aurora-1848-sheet-json-no-pydantic-b
RSHB:feat/234-aurora-1839-cell-memo
RSHB:feat/233-aurora-1848-sheet-json-no-pydantic
RSHB:feat/237-aurora-1845-ws-connection-cache
RSHB:feat/215-aurora-1844-upd-form-cells-full-rows
RSHB:feat/226-aurora-1837-cell-styles-css
RSHB:feat/207-aurora-1831-project-tn-race
RSHB:feat/208-aurora-1832-phase-dates-tz
RSHB:feat/209-aurora-1833-greenlet-dev
RSHB:feat/206-aurora-1830-users-me-local-email
RSHB:feat/212-aurora-1838-ws-immutable-update
RSHB:feat/211-aurora-1836-row-measure
RSHB:feat/205-aurora-1922-pg15-migration-0012
RSHB:feat/213-aurora-1840-sheet-modals
RSHB:feat/210-aurora-1835-svod1-formatter
RSHB:test
RSHB:svod2-filter-fix2
RSHB:indent-export
RSHB:export-hierarchy
RSHB:svod2-filter-fix
RSHB:fix-id-column
RSHB:export-year-fix
RSHB:form3-source
RSHB:columns-svod-2
RSHB:export-optimize-refresh
RSHB:last-column
RSHB:svod-fix
RSHB:fix-columns
RSHB:form3-expense
RSHB:sattelite-fix
RSHB:delete-sattelite-rows
RSHB:form3-pages
RSHB:form1-sub_sub-fix
RSHB:sort-fix
RSHB:fixes-form
RSHB:new-expenses
RSHB:new-rows
RSHB:fix-style
RSHB:phase-template-edit
RSHB:fixes
RSHB:add-btn-reset-filter
RSHB:vsp-choice-fix
RSHB:project-filters-fix
RSHB:width-column-header-name
RSHB:task-filter-navigation
RSHB:auth
RSHB:icons-program-project
RSHB:export-optimize
RSHB:org-unit-limits
RSHB:auth-v2
RSHB:tasks-filters
RSHB:insert-row-fix
RSHB:svod-roles
RSHB:new-role-fix
RSHB:phase-edit-fix
RSHB:new-role
RSHB:delete-from-cell
RSHB:svod-cahe-and-table-direction
RSHB:direction-stage-fix
RSHB:backslash-fix
RSHB:svod
RSHB:front-svod-form-1
RSHB:projects-filters
RSHB:remove-row-fix
RSHB:computed-fix
RSHB:modal-add-year-project
RSHB:name-fix
RSHB:audit-logs-projects
RSHB:meta-form-3
RSHB:project-back-fix
RSHB:fix-sticky-columns
RSHB:fixies-3-form
RSHB:tech-num-fix
RSHB:fix-logic-limitation
RSHB:projects-fix
RSHB:3-form-project
RSHB:project-add-year-handler
RSHB:projects-summary-handler
RSHB:AURORA-1247
RSHB:projects-handlers
RSHB:vsp-choose-form2-2
RSHB:directions-fix
RSHB:add-validation
RSHB:add-checkbox-export-vsp
RSHB:fix-update-column-config
RSHB:fix-editable-columns
RSHB:add-biome-front
RSHB:vsp-choose-form2
RSHB:export-form-4
RSHB:booking-fix
RSHB:fix-front-tables
RSHB:phase-directions
RSHB:AURORA-1225
RSHB:fix-mapping-form-2-oper
RSHB:AURORA-1076-fix
RSHB:fix-add-row-program-4-form
RSHB:form2-limit-migrations
RSHB:delete-projects
RSHB:AURORA-1076
RSHB:form-4-add-row
RSHB:fix-logs
RSHB:AURORA-1206
RSHB:AURORA-894
RSHB:add-line-log-hotfix
RSHB:form-export-fix
RSHB:form-4-sql
RSHB:table-optimization-fix
RSHB:header_forms
RSHB:form-4-expense-item-filters
RSHB:entity-type-hotfix
RSHB:form-3-phases-timezones
RSHB:form-4-handlers
RSHB:export-fix
RSHB:close-date-vsp-fix
RSHB:deleted-user-auth-fix
RSHB:smeta-fix
RSHB:front-fixes
RSHB:line_id_code_full
RSHB:line_id_code
RSHB:timezones
RSHB:filenames-fix
RSHB:AURORA-1174-73
RSHB:project-sheets
RSHB:AURORA-1166
RSHB:websocket-projects
RSHB:project-front
RSHB:form3-permissions
RSHB:location_from_to_placement_type
RSHB:fix-vsp-filters
RSHB:fix-tests-and-functions
RSHB:mig2-fix
RSHB:vsp_fixes
RSHB:fix-ssp-title
RSHB:AURORA-1148
RSHB:fix-vsp-form-edit
RSHB:sql-funcs2-fix
RSHB:AURORA-1132
RSHB:logs
RSHB:AURORA-1147
RSHB:export-optimization
RSHB:AURORA-1131
RSHB:sql-funcs-fix
RSHB:vsp-dropdown-form
RSHB:form_2-back
RSHB:migrations
RSHB:websocket-self-flag
RSHB:reload-fix
RSHB:test-stand-fix
RSHB:excel-empty-fix
RSHB:requirements-fix
RSHB:AURORA-1096-back
RSHB:AURORA-1098
RSHB:AURORA-1096
RSHB:ws-user-id-fix
RSHB:expense-item-handler
RSHB:fix-date-phase
RSHB:excel-fix
RSHB:vsp-edit-field-fix
RSHB:vsp-fix-back
RSHB:vsp-back
RSHB:create-form-back
RSHB:export-direction-fix
RSHB:change-role-fix
RSHB:org-unit-users-fix
RSHB:audit-fix
RSHB:org-archive
RSHB:del_row_fix
RSHB:websocket_locks
RSHB:new_line_id
RSHB:admin-back
RSHB:form-fix
RSHB:ws
RSHB:ssp-fix
RSHB:stages-back
RSHB:form_124_write
RSHB:form_124
RSHB:new-model
RSHB:test-tsygankov
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
No description provided.
Delete Branch "feat/252-aurora-1902-form2-export-layout"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #252.
Проблема
Листы Операц/АХР/КВ формы «Смета РФ» (FORM_2) выгружались раскладкой формы 1 — из 163 колонок экрана совпадали по ключу только 83, 97 колонок выгрузки были всегда пустыми, заголовки групп — от формы 1. На экране также был лишний столбец «Адрес ВСП» (его нет в исходной форме РФ), и ВСП выгружался бы числовым id, а не номером как на экране.
Что сделано
FORM2_DEPTH_COLUMNS/FORM2_COLORS(export_mappings.py) — дерево колонок и цвета для Операц/АХР/КВ, сгенерированы изweb/src/.../FORM_2/{OPER,AHR,CAP}.js. 162 листа — тот же порядок, что на экране, минусheader.vsp_address. Каждая группа — чисто визуальная обёртка для Excel-заголовков ("key": None), каждый лист несёт полный путь к данным как явный"key"(например"booking.y2027.q1"), поэтому отображение колонок в несколько визуальных групп не влияет на то, откуда реально берётся значение.Form2DepthRowNormalizer— в отличие отForm1DepthRowNormalizer, не поднимаетheader.*на верхний уровень (FORM_2 ожидаетheader.section_code,header.vsp_idи т.д., а не плоскиеsection/vsp_id)._create_xlsxwriter_sheet_writers: выделена отдельная ветка дляFormTypeEnum.FORM_2(раньше FORM_2 попадала в общийelseвместе с FORM_1 — в этом и была причина бага). Сателлиты АХР (AHR_RENT/AHR_UTILITY/AHR_SECURITY, относятся к AURORA-1904) иSTRUCTUREне трогал.VSPRepository.get_reg_numbers_by_ids+ExportService._resolve_form2_vsp_numbers: один запрос резолвит все встретившиесяheader.vsp_id(включая закрытые ВСП) вregistration_numberперед записью в Excel.FORM_2/{OPER,AHR,CAP}.js(по умолчанию из тикета — см. Rulings), убрана мёртвая ссылка на него вStages/constants.js.Rulings (решения без обсуждения)
OPER.js/AHR.js/CAP.js), а не вручную — так и предлагал тикет. Корректность порядка листьев проверена программно по алгоритму самогоXlsxDepthSheetWriter._columns_dict_to_flat(не только моей копией, но и реальным классом — см. тесты), а идентичность колонок между OPER/AHR/CAP — сверкой списков ключей всех трёх файлов, а не на слово из тикета."key": None, все листья несут полный путь явным"key". Отступил от подхода FORM1_DEPTH_COLUMNS (где часть пути собирается из вложенности групп), потому что у FORM_2 несколько визуально различных групп (Корректировки/Согласование платежей/Фактические расходы и т.д.) пишут в один и тот жеdata.q{n}.*префикс — с «честной» вложенностью это дало бы коллизию имён у дочерних групп. Явный путь на каждом листе проще и надёжнее при ручной сверке.FORM2_COLORS,"palette") взяты по инструкции тикета (greenColumn→"green"и т.д., переиспользуется существующийPALETTE) — это красит ЯЧЕЙКИ СТРОК по_set_palette/palette, а не фон заголовков групп (_header_format, который адресуется ПУТЁМ ПО СЫРЫМ КЛЮЧАМ СЛОВАРЯ, а не플 плоским ключом). Фон самих заголовков групп Excel я не настраивал — вFORM1_COLORS/FORM4_COLORSэто тоже не было явной частью контракта, а в критерии приёмки тикета заголовки-цвета не упоминаются (только порядок, заголовки-текст и значения).is_deleted, не поis_active) — так просил тикет явно.Тесты
api/tests/unit/test_export_form2_mapping.py(новый, 11 тестов): порядок листьевFORM2_DEPTH_COLUMNSчерез реальныйXlsxDepthSheetWriterсовпадает с 162 ключами экрана; у всех трёх листов есть цвет на каждый лист;render_column_yearsрезолвит{year}/{year+1}в заголовках групп;_create_xlsxwriter_sheet_writers(..., FORM_2, ...)отдаёт раскладку FORM_2 (и явно НЕ совпадает с FORM_1 —_create_xlsxwriter_sheet_writers(..., FORM_1, ...)по-прежнему отдаётFORM1_DEPTH_COLUMNS);Form2DepthRowNormalizerне поднимаетheader.*;_resolve_form2_vsp_numbersподменяет id на номер одним запросом и ничего не делает, еслиvsp_idнет вовсе.pytest tests/unit— 69 passed, 2 failed, оба failed не связаны с этой правкой (test_export_service_query_params.py, экспорт SMETA/ignore_non_applicable_query_params— я его не трогал, те же 2 падения наtest).XlsxDepthSheetWriter), но визуально файл.xlsxя не открывал и не видел — нужна ручная проверка на стенде с БД.node --test src/components/RealtimeTable/utils/*.test.js— 8/8.npm run build— без ошибок. Biome на изменённых файлах (OPER.js/AHR.js/CAP.js/Stages/constants.js) — то же число предсуществу��щих warning'ов, что вtest(не добавил новых).Ручная проверка (acceptance criteria, не автоматизировано)
Не в объёме
AURORA-1904 (AHR_LIMIT и сателлиты) — отдельная задача, не трогал
AHR_RENT/AHR_UTILITY/AHR_SECURITY. AURORA-1900 (подписи «тыс. руб.» в заголовках).🤖 Generated with Claude Code
Листы Операц/АХР/КВ формы «Смета РФ» (FORM_2) выгружались раскладкой формы 1 (FORM1_DEPTH_COLUMNS, 180 колонок формы 1) — из 163 колонок экрана совпадали по ключу только 83, 97 колонок выгрузки были всегда пустыми (блоки формы 1, которых нет в данных формы 2), заголовки групп — от формы 1. Также на экране был лишний столбец «Адрес ВСП», которого нет в исходной форме РФ, и ВСП выгружался бы числовым id вместо номера, который виден на экране. - FORM2_DEPTH_COLUMNS/FORM2_COLORS (export_mappings.py) — сгенерированы из web/src/.../FORM_2/{OPER,AHR,CAP}.js (колонки идентичны у всех трёх листов, проверено программно; различаются только цвета). 162 листа дерева — байт-в-байт тот же порядок, что на экране, минус header.vsp_address. Каждая группа — чисто визуальная обёртка ("key": None), каждый лист несёт полный путь данных как "key" (например "booking.y2027.q1"), поэтому порядок вложенности групп для Excel-заголовков не завязан на реальный путь к данным. - Form2DepthRowNormalizer (export_normalizers.py) — в отличие от Form1DepthRowNormalizer, не поднимает header.* на верхний уровень: FORM_2 ожидает их как header.section_code, header.vsp_id и т.д. - _create_xlsxwriter_sheet_writers: отдельная ветка для FormTypeEnum.FORM_2 (раньше FORM_2 попадала в общий else вместе с FORM_1). Сателлиты АХР (AHR_RENT/UTILITY/SECURITY, AURORA-1904) и STRUCTURE не трогал. - VSPRepository.get_reg_numbers_by_ids + ExportService._resolve_form2_vsp_numbers: один запрос резолвит все встретившиеся header.vsp_id (включая закрытые ВСП) в registration_number перед записью в Excel, как уже показывает экран. - web/.../FORM_2/{OPER,AHR,CAP}.js: убран столбец «Адрес ВСП» (E1) и его цвет — по умолчанию, т.к. его нет в исходной форме РФ (см. Rulings в PR). Убрана мёртвая ссылка на него в Stages/constants.js. Issue: #252 (AURORA-1902, эпик AURORA-1876, Высокий приоритет) Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>Checkout
From your project repository, check out a new branch and test the changes.