AURORA-1899: база разрядности — тыс. руб., масштабировать только денежные колонки #288
Loading…
x
Reference in New Issue
Block a user
No description provided.
Delete Branch "feat/285-aurora-1899-denomination-base-thousand"
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?
Проблема
Селектор разрядности (AURORA-1650,
bce897f) считал базой данных рубли.На самом деле суммы в базе хранятся в тыс. руб. (подписи «тыс. руб.» на
формах 1/4, «В тыс. рублей» на сателлитах и в Смете формы 2; после
AURORA-1897 — и лимитные строки АХР). Из-за этого:
при выборе «в тыс. руб.» значения делились ещё раз (план 1 500 тыс.
руб. показывался как 1,5).
qty_q1..q4,*_qty), площади (rented_area), ставке НДС (vat_rate), курсу(
exchange_rate), кодам (section_code,item_id,num_group...),внутреннему заказу, сумме в валюте (
amount_foreign) — в основнойтаблице и в своде 2.
в ячейке 1,5, а в редакторе — 1500.
Issue: #285.
Что сделано
web/src/components/RealtimeTable/utils/moneyUtils.js(новый модуль,без импорта конфигов форм — работает под
node --test):UNIT_IN_RUB,getDisplayFactor(baseUnit, denomination);getMoneyUnit(columnDef, sheetName)→'thousand' | 'rub' | null,с порядком проверки: явный
columnDef.moneyUnit→TEXT_COLUMN_IDS/список не-денежных последних сегментов
accessorKey→ листAHR_LIMIT(rub) → по умолчанию'thousand';TEXT_COLUMN_IDSперенесён изCell.jsx(там теперь только импорт);resolveDenomination/DEFAULT_DENOMINATION(пригодны к реюзу —используются
useDenomination.js);AHR_LIMIT_SHEET— общая константа дляtableColumns.jsxиSettingPanel.jsx.useDenomination.js: значение по умолчанию'thousand'; ключхранения — суффикс
_denomination_v2(старые сохранённые'rub'/'thousand'больше не читаются со старым смыслом);getDenominationDivisorубран как неверный по смыслу (предполагал базу «рубли»).
tableColumns.jsx/Cell.jsx:displayDivisorзаменён наdisplayFactor(умножение, не деление); множитель считается наколонку через
getMoneyUnit/getDisplayFactorс учётомsheetName(проброшен из
RealtimeTable.jsx); учтено в кеше (_hash,cached.displayFactor, memo-сравнение вCell.jsx);isEditableзапрещает редактирование денежной ячейки, если разрядность не базовая
(
factor !== 1); на листеAHR_LIMITмножитель всегда1независимоот сохранённой разрядности.
SettingPanel.jsx: селектор скрыт на листеAHR_LIMIT; рядом сселектором подсказка «Ввод сумм — в тыс. руб.».
SvodPage/SummaryTable.jsx,Svod2Page.jsx,ProjectSummariesPage.jsx:масштабирование по признаку
meta.moneyвместо regex по id (свод 1,своды проектов) и вместо блок-листа текстовых id (свод 2, где он
ошибочно задевал
num_group/internal_order/vat_rate— ониопределены через
textColumnи раньше тоже делились). Построителиколонок (
valueColumn/numericColumn) проставляютmeta: { money: true }на денежных метриках.
DenominationSelect.jsx: «в млн руб.», «в млрд руб.» (без точкипосле «млн»/«млрд»).
Тесты
web/src/components/RealtimeTable/utils/moneyUtils.test.js(
node --test):getDisplayFactorдля всех пар единиц из примеровтикета;
getMoneyUnitдля всех примеров тикета (денежные/не-денежныеколонки,
AHR_LIMIT, явныйmoneyUnitв т.ч.null); дополнительно —суффикс
*_qty,TEXT_COLUMN_IDS-кейсы вне общего списка,resolveDenomination, составUNIT_IN_RUB,AHR_LIMIT_SHEET.cd web && node --test src/components/RealtimeTable/utils/*.test.js:52/52 зелёных (42 существовавших + 10 новых).
npm run buildпроходит без ошибок.«в тыс.» 1 500, «в млн» 1,5, «в руб.» 1 500 000; ставка НДС 20 всегда
20; при «в млн» ячейка плана не открывает редактор, при «в тыс.» —
открывает; свод 2: ID группы номенклатуры/внутренний заказ/ставка НДС
не меняются при переключении; лист «АХР лимиты» — без селектора,
количество и рубли без изменений.
Rulings
область файлов). Нужный результат AURORA-1897 (лимитные строки АХР в
тыс. руб.) уже описан текстом самого тикета AURORA-1899 и учтён в
getMoneyUnitкак особый случай листаAHR_LIMIT. Код-зависимости отAURORA-1897 нет — решение сознательное, ветка создана заново от
origin/test.AHR_LIMITселектор скрыт, исохранённая разрядность для него никогда не меняется пользователем —
она осталась бы на дефолтном
'thousand', а база листа —'rub'.Без явного обхода это дало бы множитель
0.001(тысячи делились быещё раз на 1000) и как побочный эффект заблокировало бы редактирование
лимитов (мой же gate «фактор ≠ 1 → не редактируется»). Решение:
в
getCellDisplayFactorдля листаAHR_LIMITмножитель всегда1независимо от сохранённой/дефолтной разрядности — соответствует
акцептансу «значения в рублях, как есть».
применён и для администратора (до проверки
userRoleId === admin),а не только для обычных ролей по этапам: искажённое значение в ячейке
не должно быть точкой записи независимо от роли — это защита от
опечатки в данных, не от доступа.
getDenominationDivisorи полеdivisorхукаuseDenominationудалены, а не оставлены для обратной совместимости: оба явно
предполагали базу «рубли» — именно это и было источником багов 1–2 из
тикета. Единственные потребители (
SummaryTable.jsx,Svod2Page.jsx)переведены на
getDisplayFactor('thousand', denomination).localStorageдля всех мест с селектором разрядности (основнаятаблица, свод 1/своды проектов, свод 2) получили суффикс
_v2, нетолько основная таблица — старые сохранённые значения
'rub'/'thousand'имели другой смысл везде одинаково.🤖 Generated with Claude Code