AURORA-1897: лимиты АХР ф.2 — период, НДС, единицы #269
Open
aep
wants to merge 4 commits from
feat/266-aurora-1897-ahr-limit-period-vat-units into test
pull from: feat/266-aurora-1897-ahr-limit-period-vat-units
merge into: RSHB:test
RSHB:main
RSHB:feat/265-aurora-1909-ahr-manual-row-capture
RSHB:feat/264-aurora-1895-formula-localstorage
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/252-aurora-1902-form2-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/266-aurora-1897-ahr-limit-period-vat-units"
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 #266.
Стек веток (важно для ревью)
Эта ветка стоит не на
test, а поверх цепочки незамерженных PR:test→ PR #263 (AURORA-1906, миграция0050_form2_ahr_spod_column) →PR #268 (AURORA-1909, миграция
0051_form2_ahr_satellite_new_line) → этаветка (миграция
0052_form2_ahr_limit_period_vat_units).Диф этого PR временно включает коммиты #263 и #268 (они ещё не в
test).PR создан с
--base testпо процессу; после мерджа #263/#268 ревьюеру будетпроще смотреть только 4 файла последнего коммита (
ab765f0).Summary
AURORA-1897 (эпик AURORA-1876): лист «АХР лимиты» формы 2 (ПД) закрывает три
пункта разбора заказчика одной миграцией и формулой:
РФ») и оргтехника (id 13 «принтеры», 14 «МФУ», 15 «копировальные
аппараты») дублировали годовую сумму в каждом квартале вместо деления на
4. Причина — у этих строк в справочнике не было отметки «годовой»
(
unitбылNULLдля ДМС, формула для принтеров/МФУ/копиров былазахардкожена по названию). Добавлена колонка
v3.limit_template.period(
YEAR/QUARTER/MONTH), размеченная по факту и backfill'ом поunit LIKE '%/год'/'%/месяц'.limit_with_vat, хотя смета формы 2 ведётся без НДС. Переключено наlimit_without_vat. У SIM-карт (id 7, 8) этот столбец былNULL—заполнен по аналогии с id 9 (
450с НДС →375без, тот же лимит).У принтеров/МФУ/копиров (id 13-15)
limit_with_vatбылNULL,limit_without_vat= 0 — заполнены по вопросу 2 из тикета (0,57 × 10900— цена с НДС → годовой норматив 6213 руб./шт., без НДС 5177,50).
рублях (справочник, подписи фронта), а план АХР и Смета формы 2 — в
тыс. руб. Перенос в план АХР (
sync_form2_ahr_satellite_line(s)) теперьделит на 1000 для лимитных строк. Аренда/коммуналка/охрана (тыс. руб. уже
в источнике) не тронуты.
Одна миграция
0052_form2_ahr_limit_period_vat_units, т.к. все три правкименяют одну формулу и три вызывающие SQL-функции:
v3._form2_ahr_limit_amount(p_period, p_limit, p_qty)— новая 3-аргументнаясигнатура (была 4-аргументная
(name, unit, limit_with_vat, qty)сregexp-проверкой по названию для принтеров/МФУ/копиров — убрана полностью).
Старая сигнатура удалена
DROP FUNCTIONпосле того, как переписаны все тривызывающие функции.
v3.v_form2_view(веткаAHR_LIMIT),v3.sync_form2_ahr_satellite_lines,v3.sync_form2_ahr_satellite_line— пересозданы целиком (CREATE OR REPLACEс полным телом, без regexp-патчей, как раньше в 0037). ВеткиAHR/CAP/OPER/AHR_RENT/AHR_UTILITY/AHR_SECURITY/OTCH9F/SMETA и переносы
аренды/коммуналки/охраны скопированы без изменений — это зона
AURORA-1887/AURORA-1909, не трогаю.
amount_year(сумма 4 кварталов) иperiodвкаждой строке, плюс последнюю строку «Итого» (
row_type='ROOT',data.id=0,sort_order=999999, суммы по всемLEAF). ТипROOTобязателен — фронт строит дерево по
ROW_TYPE_LEVELS(
web/src/components/RealtimeTable/utils/rowUtils.js), иначе строканеизвестного типа легла бы в предыдущую секцию.
v3._limit_template_path_setдописываетid=0к path-set, если вход непуст — иначе строка «Итого» не попадала бы в diff ответа
PATCH .../cellпри изменении любой лимитной ячейки.
PERFORM v3.sync_form2_ahr_satellite_lines(id)по всемсуществующим
v3.budget_form WHERE form_type_code = 'FORM_2'.Модель
api/src/db/models/limit_template.pyдополнена полемperiod(с тем же
CHECK, что в БД).Test plan
api/tests/integration/test_form2_ahr_limit.py,7 интеграционных тестов через API (
GET .../sheet/AHR_LIMIT,PATCH .../sheet/AHR_LIMIT/cell,GET .../sheet/AHR), числа точно изтикета:
qty_q1=10→amount_q1=69645,amount_year=69645; АХРplan.q1=69.645.qty_q2=1→amount_q2=2000; АХРplan.q2=2.0.NULL),qty_q1=20→amount_q1=7500(не 0); АХРplan.q1=7.5.qty_q1=5→amount_q1=6471.875; АХРplan.q1=6.471875.qty_q3=2→amount_q3=7500; АХРplan.q3=7.5— считается как раньше, поменялсятолько источник НДС.
row_type=ROOT,data.id=0,попадает в diff
PATCH-ответа, сумма равна сумме всехLEAF.PATCH AHR_RENT plan.q1=100переносится в АХР как100,без деления — ветки аренды/коммуналки/охраны не задеты.
postgres:16в Docker (локальный порт55441), не общий
perf-pg(он сейчас на 0053, несовместим с цепочкой0050→0051→0052 этой ветки).
alembic upgrade headс нуля, контейнер удалёнпосле прогона.
cd api && pytest(245 тестов всего с учётом новых):231 passed, 3 failed, 4 skipped(238 тестов) +7 новых тестов лимитов АХР = 238 passed, 3 failed, 4 skipped итого
(245 собрано).
0051, тот жеконтейнер, та же фикстура, без нового тестового файла):
224 passed, 3 failed, 4 skipped(231 тест).одинаковыми до и после миграции:
tests/integration/test_db_functions_integration.py::test_backend_calls_form3_add_project_and_add_line_functions(FORM_3, report_type
LIMIT— это разные "LIMIT", неv3.limit_template/AHR_LIMIT).tests/unit/test_export_service_query_params.py::test_export_full_form_ignores_non_applicable_params_for_other_sheetstests/unit/test_export_service_query_params.py::test_export_form_payload_forwards_ignore_flag(оба —
ExportServiceне принимает кваргignore_non_applicable_query_params,который ожидает тест; код экспорта не трогал).
Чеклист для человека перед реальным деплоем
Диагностические запросы «на копии продовой БД» из тикета недоступны в этом
окружении (нет доступа к проду) — пожалуйста, прогоните перед прод-деплоем:
v3.form_limitстрок (все формы 2)qty_qNне пустой для id 23/24/25 (ДМС) и 13/14/15 (принтеры/МФУ/копиры)— после миграции их квартальная сумма уменьшится в 4 раза (годовой план
делится, а не дублируется) и будет учитывать
period/новыеlimit_with_vat/limit_without_vatдля id 13-15.АХР (суммы в тыс. руб. вместо руб.) для всех существующих форм 2 — эта
миграция делает
PERFORM v3.sync_form2_ahr_satellite_lines(id)по всемFORM_2, т.е. пересчитывает всё при деплое; имеет смысл сверить дельтусо Сметой формы 2 и сводами 1/2 до переключения трафика.
limit_without_vat/limit_with_vatзаполнены по умолчанию (375 и6213/5177.5 соответственно, см. «Открытые вопросы» ниже); если у
заказчика другие значения — скорректировать справочник отдельным UPDATE
до или после деплоя.
Открытые вопросы к заказчику (не блокируют; реализовано по умолчанию)
сумма квартала = количество × годовой лимит / 4 (как уже было для
«бизнес РФ», id 23). Модель ввода не меняется. (реализовано)
0,57 × 10900— цена с НДС. По умолчаниюлимит без НДС = 5177,50 руб./шт./год (
6213 / 1.2). (реализовано)человека в квартал, по аналогии с id 20 «Бумага». По умолчанию — да,
unit = '1 чел/квартал'. (реализовано)Rulings I made
_form2_ahr_limit_amountновая сигнатура —(period varchar, limit numeric, qty numeric), ровно как в тикете; старая 4-арг. версияудаляется
DROP FUNCTIONпосле переписывания трёх вызывающих функций(порядок важен — иначе осталась бы неиспользуемая старая версия).
v3.v_form2_view/sync_form2_ahr_satellite_lines/sync_form2_ahr_satellite_lineвзял из0050_form2_ahr_spod_column.sql(а не из
0037, как в оригинальном тексте тикета) — это актуальнаяверсия на голове цепочки 0050→0051 этой ветки; подтвердил grep'ом, что
0051 эти три функции не трогает (правит только
v3.add_budget_line).UNION ALLс отдельной агрегирующейподзапросом (сумма всех
LEAFпоamount_qN/amount_year), а не какещё одна запись в основном дереве
tree/agg— проще и не меняетсемантику рекурсивного CTE для настоящих секций/групп.
v3._limit_template_path_setпри пустом/NULLвходе продолжаетвозвращать
NULL(поведение не менял) —0добавляется только когдавход не пуст, как явно написано в тикете.
postgres:16в Docker на порту 55441 (не55432/
perf-pg, который сейчас на несовместимой ревизии 0053), контейнерудалён после прогона тестов.
том же контейнере на revision
0051(а неgit revert/stash рабочегодерева) — чище развязывает "код без миграции" от "БД без миграции" и не
трогает untracked/staged файлы в worktree.
🤖 Generated with Claude Code
Checkout
From your project repository, check out a new branch and test the changes.