AURORA-1900: единые подписи «тыс. руб.» и НДС на экране и в выгрузке #291
Loading…
x
Reference in New Issue
Block a user
No description provided.
Delete Branch "feat/289-aurora-1900-unit-vat-labels"
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 #289.
Стек веток (важно для ревью)
Эта ветка стоит не на test, а поверх PR #288 (AURORA-1899, модуль
web/src/components/RealtimeTable/utils/moneyUtils.jsсgetMoneyUnit/getDisplayFactor/UNIT_IN_RUB/AHR_LIMIT_SHEET, переписанныйuseDenomination.jsс дефолтом'thousand'и ключом_denomination_v2,displayFactorвtableColumns.jsx/Cell.jsx).test → PR #288 (AURORA-1899) → эта ветка (коммит
24ca441).Диф этого PR временно включает коммит #288 (он ещё не в test). PR создан
с
--base testпо процессу; после мерджа #288 ревьюеру будет проще смотретьтолько коммит
24ca441.Проблема
Единица и учёт НДС в заголовках денежных колонок подписаны по-разному на
разных формах, где-то не подписаны вовсе. Выгрузка в Excel расходится с
экраном:
export_mappings.pyвсегда писал «тыс. руб.» (денежные значения вбазе хранятся в тыс. руб., денежный селектор на экран не влияет на выгрузку),
при этом в 96 местах — с опечаткой «с учетом НДC» (латинская C).
Что сделано
Экран
formatHeaderUnit(header, denomination)(headerYearUtils.js, рядом сformatHeaderYear) — подставляет в заголовок плейсхолдер{unit}поразрядности: «руб.», «тыс. руб.», «млн руб.», «млрд руб.». Переиспользует
resolveDenomination/UNIT_IN_RUBиз AURORA-1899, не дублирует маппингединиц. Без переданной разрядности — литерал «тыс. руб.» (дефолт).
TableHead.jsx:formatHeaderUnitвызывается сразу послеformatHeaderYear, разрядность приходит новым пропомdenomination(проброшен из
RealtimeTable.jsx).CollapsibleTree.jsx,templateColumns.js(шаблоны этапов): литерал«тыс. руб.» — там нет живого контекста разрядности.
{unit}вместо «тыс. руб.» в заголовках FORM_1 (OPER/AHR/CAP/AHR_P_NO_LOCAL/CAP_NO_LOCAL), FORM_4 (AHR/CAP/OPER/STRUCTURE) — скриптовый
проход + ручная проверка диффа.
AHR_LIMIT.jsне трогали — рублёвоеисключение AURORA-1899/#288.
планируемые...», «Итого», «Утверждённые...», «Фактические...»,
«Скорректированная...» →
, {unit}); FORM_2 OPER/AHR/CAP («Планированиегодовых показателей» →
, {unit} (без НДС)); FORM_2 SMETA («В тыс.рублей» → «В {unit} (без НДС)»); FORM_2 АХР аренда/коммуналка/охрана (план
«Планируемая сумма расходов на {year} год» →
, {unit}; факт «В тыс.рублей» →
{unit}); FORM_2 OTCH9F («Сумма (тыс. руб.)» → «Сумма({unit})», «Тыс. руб.» →
{unit}); PROJECT CURRENT_EXPENSES/LIMIT (тригруппы «...по ${planTitle}» →
, {unit}).SvodPage.jsx+SummaryTable.jsx): меткиMETRICS/FORM_3_METRIC_LABELSполучили, {unit};scaleColumnsвSummaryTable.jsxтеперь прогоняет заголовки черезformatHeaderUnitсживой разрядностью (раньше трогал только значения ячеек).
Svod2Page.jsx): «тыс. руб.» →{unit}в трёх заголовках(payment_amount, contract.ceiling, contract.expenses_qN);
scaleNumericColumnsаналогично прогоняет заголовки черезformatHeaderUnit.есть (default: экран не трогаем, выгрузку подгоняем под экран).
Выгрузка (
export_mappings.py/export_service.py)FORM1_DEPTH_COLUMNS: «с учетом НДC» (латинская C, 96 мест) →плейсхолдер
{vat}; «План {year}(тыс. руб.) с учетом НДС» → «План {year}(тыс. руб.) {vat_plan}» (плейсхолдер только для НДС-части — единица в
выгрузке всегда литерал «тыс. руб.», разрядность не экспортируется).
Правка этого словаря автоматически применяется к
FORM4_DEPTH_COLUMNS/FORM4_STRUCTURE_DEPTH_COLUMNS/FORM4_OPER_DEPTH_COLUMNS— они строятсяиз него через
_rename_depth_columns/copy.deepcopyпри загрузке модуля.render_column_years(columns, year, extra=None): необязательныйextra— дополнительные плейсхолдеры (например
{vat}/{vat_plan}), резолвятсятой же функцией
_replace_column_year_placeholders, что и{year}._create_xlsxwriter_sheet_writers: по листу передаёт нужныйextra—Ф.1 OPER/CAP → «с учётом НДС»; Ф.1 AHR и все листы Ф.4 (OPER/AHR/CAP/
STRUCTURE) → «без НДС» (соответствует экрану).
SMETA_COLUMNS: ко всем денежным меткам (кромеsection_code/name)добавлено «, тыс. руб.».
export_summary_payload): в строку метаданных добавлена("Единица", "тыс. руб.").Тесты
node --test src/components/RealtimeTable/utils/*.test.js— 55/55зелёных (51 существовавших + 4 новых на
formatHeaderUnit:подстановка по разрядности, заголовок без плейсхолдера не меняется,
дефолт на
undefined/null/'').npm run build— без ошибок.pytest tests/unit(venv с зависимостями изrequirements-dev.txt) —102 passed, 15 из них новые в
tests/unit/test_export_mappings_labels.py(нет латинской C в НДС ни при каком
vat-варианте; Ф.1 AHR → «без НДС»,Ф.1 OPER/CAP → «с учётом НДС», все листы Ф.4 → «без НДС»; после рендера
не осталось
{vat}/{vat_plan}/{unit};SMETA_COLUMNS— «тыс. руб.»у всех денежных меток и не у
section_code/name). 2 оставшихсяfailed в
test_export_service_query_params.py(
ignore_non_applicable_query_paramsvsignore_unsupported_sheet_params)— предсуществующие, не связаны с этой веткой, не трогал.
Rulings
под-колонках при противоречащем групповом заголовке «с учётом складского
НДС» (который тикет просил не трогать, вопрос 1 открыт). Для экспорта
выбрал «без НДС» как финальную формулировку для Ф.1 AHR и всех листов
Ф.4 — по явному дефолту тикета («соответствует экрану»), раз группа
{vat}/{vat_plan}общая для OPER/AHR/CAP вFORM1_DEPTH_COLUMNS.export_mappings.pyнет — AURORA-1903/#287 с ним не влит и не стекуетсясюда. Использовал
SMETA_COLUMNS, как и предполагал тикет на этот случай.только к этой ровно named группе (Ф.2 OPER/AHR/CAP), не к остальным
денежным под-группам тех же листов (корректировки/бронь/перенос/
секвестр и т.п.) — тикет привёл это как пример («и аналогично для
остальных денежных групп»), но лист OPER/AHR/CAP для Ф.2 содержит
десятки таких под-групп без явного списка от продукта; расширять
трактовку без входа от заказчика не стал, чтобы не гадать за продукт.
(единственное число); применил
, {unit}к каждой из топ-групп листа(План/Утверждено/Факт/Скорректировано) — иначе на экране остались бы
непомеченные суммы по остальным стадиям.
CURRENT_EXPENSES.js/LIMIT.js); экспорт формы 3 (
FORM3_CURRENT_EXPENSES_ DEPTH_COLUMNS/FORM3_LIMIT_DEPTH_COLUMNS,export_project_report_to_xlsx)не трогал — не упомянут в «Где»/«Что сделать» тикета, у него нет
метаданных-строки с единицей сейчас и это не часть явного списка правок.
export_summary_payload(Свод 1/2).
export_project_report_to_xlsx(форма 3) не трогал — потой же причине, что выше.
npm installв этом воркспейсе шёл не черезкорпоративный Nexus (недоступен из песочницы — 302 на страницу логина),
а через публичный registry.npmjs.org (доступен). Lockfile после установки
чуть отличался (убрана опциональная transitive-зависимость
yamlподtailwindcss); откатилpackage-lock.jsonперед коммитом, чтобы нетащить в диф посторонний дрейф.
Экран: {unit}-плейсхолдер (formatHeaderUnit, переиспользует разрядность из useDenomination/moneyUtils AURORA-1899) в TableHead.jsx, CollapsibleTree.jsx, templateColumns.js; литерал «тыс. руб.» → {unit} в заголовках FORM_1/FORM_2/ FORM_4/PROJECT (кроме AHR_LIMIT.js — рублёвое исключение не трогаем) и в своих колонках Свод1/Свод2 (SummaryTable.scaleColumns, Svod2Page. scaleNumericColumns). Текст НДС на экране не менялся. Выгрузка: «с учетом НДC» (латинская C, 96 мест в FORM1_DEPTH_COLUMNS и производных FORM4_*) → плейсхолдер {vat}/{vat_plan}, резолвится по листу через render_column_years(..., extra=...) — Ф.1 OPER/CAP «с учётом НДС», Ф.1 AHR и все листы Ф.4 «без НДС» (соответствует экрану). SMETA_COLUMNS — «, тыс. руб.» у сумм. Своды — строка метаданных «Единица: тыс. руб.». Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>