354 Commits

Author SHA1 Message Date
aep
f459819109 Merge pull request 'AURORA-1886: снятие или перенос даты закрытия возвращает ВСП в действующие (поверх #328, мерж после #323)' (#331) from feat/329-aurora-1886-vsp-reopen into test 2026-11-12 17:03:52 +03:00
aep
2b780f5267 Merge pull request 'feat: формулы ячеек на сервере, маркер fx для всех пользователей (AURORA-1896)' (#323) from feat/320-aurora-1896-cell-formulas into test 2026-11-12 17:03:41 +03:00
aep
ea69099540 Merge pull request 'AURORA-1879: одноимённые этапы «Поддержки» и «Развития» — раздельно в списке, правке, удалении и аудите' (#315) from feat/312-aurora-1879-form-phase-direction into test 2026-11-12 17:02:34 +03:00
aep
ab7d25ed2d Merge pull request 'AURORA-1900 (возврат 12.11): единицы у всех денежных колонок, комментарии без денежных подписей, НДС шапки плана в Excel как на экране' (#334) from feat/333-aurora-1900-units-rework into test 2026-11-12 17:01:47 +03:00
Andrey Epifancev
f5e9ff37a4 fix(export): единицы и НДС шапки плана в Excel как на экране; collegial.approved — денежная (AURORA-1900)
Возврат тестировщика 12.11.

- Шапка «План {year} (тыс. руб.) {vat_plan}» подставляла текст подколонок:
  Ф.1 АХР и все листы Ф.4 выгружались «без НДС», а на экране — «с учётом
  складского НДС» (Ф.4 КВ — «с учётом НДС»). Теперь у шапки своя подпись
  по экрану (FORM1/FORM4_SHEET_PLAN_VAT_WORDING), подколонки не менялись.
- Раскладки Excel (FORM1/FORM2 depth, АХР-сателлиты, проекты, SMETA формы 2/4,
  патчи формы 4): «тыс. руб.» по тому же правилу, что на экране; у комментариев
  убран подзаголовок «Сумма, тыс. руб. (…)».
- «Коллегиальные органы → Сумма (без НДС)» (collegial.approved,
  collegial_approval.approved_amount NUMERIC) считалась текстом (AURORA-1899):
  не масштабировалась разрядностью и не получала единицу. Теперь денежная.
- test_export_unit_labels.py: на реальных раскладках выгрузки форм 1/2/4 у каждой
  денежной колонки есть «тыс. руб.», у текстовых нет, шапка плана — как на экране.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 14:44:43 +04:00
Andrey Epifancev
7f6641e21a fix(vsp): снятие или перенос даты закрытия возвращает ВСП в действующие (AURORA-1886, #329)
Миграция 0062: v3.upd_vsp получает p_clear_closed_at (DROP + CREATE), снятие
даты пишется в аудит. Репозиторий передаёт флаг при closed_at=null, сервис
ставит is_active=True при null или будущей дате.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 11:23:55 +04:00
Andrey Epifancev
72b57a0c53 test(vsp): красные тесты возврата ВСП в действующие (AURORA-1886, #329)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 11:23:21 +04:00
Andrey Epifancev
744b71fbe7 fix(vsp): админ получает ВСП по id включая удалённые; прошедшая дата закрытия сразу закрывает ВСП (AURORA-1885, #327)
- VSPRepository.get: with_deleted=True означает «включая удалённые», а не «только удалённые»
- VSPService.update: ключ closed_at (имя поля модели) вместо close_date (входной alias)
- тесты: integration test_vsp.py, unit test_vsp_service_close_date.py

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 11:11:50 +04:00
Andrey Epifancev
38036b31af chore(formulas): миграция 0060 → 0061 поверх 0060_form_phase_direction_fix (#315) (AURORA-1896)
Порядок мержа фиксирован: #315 → #317 → #319 → #323. design.md #22.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 01:08:21 +04:00
Andrey Epifancev
551ef0ec14 fix(form2): открытый АХР пересчитывает итоги после удаления записи аренды/коммуналки/охраны (AURORA-1887, #324)
notify_ahr_about_satellite_change рассылал на АХР row_deleted по скрытой
(AURORA-1887) строке сателлита с пустым result: фронт не находил строку
и не получал пересчитанных заголовков — итоги статьи, раздела и сметы
оставались прежними до перезагрузки.

Теперь в result — заголовки ROOT/GROUP/ITEM/SUB_ITEM/SUB_SUB_ITEM по пути
статьи удалённой строки (как del_budget_line для обычных листов). Поиск
строки по аудиту и выборка заголовков вынесены в
SheetRepository/SheetService.get_form2_ahr_satellite_delete_delta.
Протокол WS и фронт не меняются.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 23:51:48 +04:00
Andrey Epifancev
54e60dcf8e test(formulas): GET formulas без доступа, спека приведена к коду (AURORA-1896, M-5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 21:06:53 +04:00
Andrey Epifancev
e107fa418d perf(formulas): равенство по владельцу вместо IS NOT DISTINCT FROM, отказ на Infinity (AURORA-1896, M-1, M-2, M-3)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 21:06:53 +04:00
Andrey Epifancev
ecef6eb247 fix(formulas): рассылка WS не несёт формулу клиента при отказе в доступе (AURORA-1896, I-1)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 21:06:53 +04:00
Andrey Epifancev
683e12c52f chore(formulas): номер миграции 0060 после rebase на test (AURORA-1896)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 20:10:55 +04:00
Andrey Epifancev
18573d6dc4 test(formulas): правки WS-тестов T5.1–T5.3 (AURORA-1896)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 20:07:42 +04:00
Andrey Epifancev
af687a7e22 feat(formulas): formula и formula_meta в cell_updated по WebSocket (AURORA-1896)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 20:07:04 +04:00
Andrey Epifancev
84dbaaf361 test(formulas): правки minor-находок T1.1–T4.2 (AURORA-1896)
T1.1 каскад hard_delete проверяется по AHR_LIMIT; T1.2 тесты триггеров
rent/utility/security/fixed_asset_report; T1.3 NaN в set_cell_formulas
отклоняется (0059 правится на месте); T3.1 unit-кейсы asyncpg-обёртки;
T3.2 предусловие SAVEPOINT-теста и комментарий к 403; T4.1 проверка
незаписи значения при 422 отчёта проекта; T4.2 убрана мёртвая логика.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 20:07:04 +04:00
Andrey Epifancev
187988bd76 feat(formulas): формулы в отчётах проектов — запись и GET formulas (AURORA-1896)
PATCH cell/cells отчёта проекта пишут формулу в той же транзакции, GET
.../report/{year}/{report_type}/formulas возвращает формулы отчёта.
Тесты: roundtrip, снятие формулы, каскад удаления проекта, триггер
rf_project_report_line (del_form3_line и прямой DELETE).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 20:07:04 +04:00
Andrey Epifancev
5bc6a755bc feat(formulas): запись формулы при правке ячейки формы и GET formulas листа (AURORA-1896)
SheetService.update_cell_with_formula/update_cells пишут формулу после значения в одной
транзакции, GET /form/{id}/sheet/{sheet}/formulas. Ошибки БД с обёрткой asyncpg
"<class ...>: invalid_formula: ..." теперь корректно мапятся в 422.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 20:07:04 +04:00
Andrey Epifancev
1d6d95db9f feat(formulas): CellFormulaRepository, invalid_formula → 422, схемы (AURORA-1896)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 20:07:04 +04:00
Andrey Epifancev
a29207f814 feat(formulas): таблица cell_formula, set/v_cell_formulas, триггеры очистки, миграция 0059 (AURORA-1896)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 20:07:04 +04:00
Andrey Epifancev
7a5c89eca6 AURORA-1879: миграция 0059 → 0060 (0059 занята AURORA-1984, PR #306)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 19:36:40 +04:00
Andrey Epifancev
525f801187 Merge remote-tracking branch 'origin/test' into feat/312-aurora-1879-form-phase-direction 2026-11-11 19:35:11 +04:00
aep
4dc111a0ce Merge pull request 'AURORA-1984: проекты ПД без программы (+1979, 1980, 1989)' (#306) from feat/305-aurora-1984-pd-standalone-projects into test 2026-11-11 18:12:22 +03:00
Andrey Epifancev
8798f092c4 fix(stages): именованный dollar-тег в DO-блоке 0059, правка интеграционных тестов этапов (AURORA-1879)
- sql_migration._split_statements узнаёт только $tag$, пустой $$ ломал разбиение:
  DO $$ … $$ → DO $do$ … $do$.
- test_form_phases_delete_removes_only_named_phase: ?sheet= без direction
  фильтрует direction IS NULL — читаем весь список и отбираем AHR в тесте.
- test_form_phases_duplicate_without_direction_rejected: после ошибки
  сессия клиента откатывается, число строк не проверяем; защиту БД
  проверяет новый test_form_phase_nodir_unique_index_blocks_duplicate.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 16:53:42 +04:00
Andrey Epifancev
92f6049a73 fix(stages): FormPhaseService.create отклоняет дубль этапа на листе и направлении (AURORA-1879)
Интеграционные тесты одноимённых этапов, PATCH/DELETE одного этапа, дубль без направления, direction в аудите.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 16:39:24 +04:00
Andrey Epifancev
9e15fad226 fix(stages): direction в первичном ключе ORM FormPhase, детерминированный порядок списка, миграция 0059 (AURORA-1879)
- ORM: direction входит в PK (nullable), одноимённые этапы Support/Development больше не склеиваются
- get_list: ORDER BY sheet, direction (NULL первыми), opens_at, phase_code
- 0059: del_form_phase фильтрует по phase_code, direction в v_phase_id (add/upd/del) и в payload upd,
  чистка дублей без направления и частичный уникальный индекс form_phase_nodir_uidx

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 16:39:24 +04:00
Andrey Epifancev
3b5f6025aa fix(export): заливки колонок на листах Операц/АХР/КВ Сметы РФ (AURORA-1902)
Возврат тестирования 10.11: в выгрузке формы 2 не было цветных заливок.
XlsxDepthSheetWriter._set_palette искал цвет только по пути ключей дерева
колонок (section_code, god.….q2), а FORM2_COLORS ключуется путём данных
(header.section_code, booking.y2026.q2) — совпадений 0 из 162. Теперь, если
по пути дерева цвета нет, он берётся по плоскому ключу данных колонки.
Форма 1 не меняется (её цвета находятся по пути дерева, как раньше).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 15:40:03 +04:00
Andrey Epifancev
e5660add7a AURORA-1984: правки по итоговому ревью (M-5, M-6, M-7)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 23:16:20 +04:00
Andrey Epifancev
f5ce14fd11 AURORA-1984: самостоятельный проект — уровень программы в дереве и в выгрузке
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 23:05:59 +04:00
Andrey Epifancev
321943db56 AURORA-1979: подпись программы и проекта в третьем столбце и выгрузке
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 22:35:02 +04:00
Andrey Epifancev
69c4a8f9c9 AURORA-1984: событие project_added без программы
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 22:27:16 +04:00
Andrey Epifancev
209d36e832 AURORA-1984: создание, переименование и удаление проекта без программы в SQL
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 22:23:28 +04:00
Andrey Epifancev
836e812bad AURORA-1984: самостоятельный проект в модели и листе формы 4
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 22:18:22 +04:00
aep
bf449c5754 Merge pull request 'fix(form2): дельта АХР пуста для статей глубины 4 после правки лимита (AURORA-1850, часть #296)' (#301) from feat/296-ahr-delta-depth4 into test 2026-11-08 17:11:12 +03:00
Andrey Epifancev
d341d21ec6 fix(form2): дельта АХР после правки лимита пуста для статей глубины 4 (AURORA-1850, #296)
0053 пересоздала v3.get_form2_ahr_satellite_delta по телу из 0031 с
сопоставлением лимитного шаблона «ei.depth = 3 AND (item_id OR
num_group_id)» и откатила правку 0037. Лимиты с кодом num_group_id статьи
глубины 4 (принтеры / МФУ / копиры) не попадали в target_lines, дельта
была пустой, и открытый АХР не обновлял сумму до перезагрузки.

Миграция 0058 пересоздаёт функцию с матчером 0037
((depth = 3 AND item_id = code) OR num_group_id = code); остальное тело —
как в 0053.

Тест-защита 0037 ждал в дельте INPUT-строку, которую AURORA-1887 скрыл на
листе AHR, — теперь проверяет заголовок SUB_SUB_ITEM статьи глубины 4.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 17:24:28 +04:00
Andrey Epifancev
8ba26427dd fix(tests): test_form2_ahr_limit — чтение plan.qN без KeyError после null-strip (AURORA-1897, #296)
После AURORA-1848 GET листа вырезает null-поля, поэтому у заголовка статьи
без плана в квартале ключа plan.qN нет вовсе, и чтение «до» падало
KeyError до проверки самой логики. Заменено на plan.get("qN") or 0.
Продуктовый код не меняется: с правкой все 7 тестов зелёные на test
(после PR #295).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 16:04:33 +04:00
Andrey Epifancev
77bfdf69fd perf(svod2): v_svod2_facets с SET jit TO off (O-1)
JIT добавлял ~1,4 с к вызову с буквальными параметрами (стенд масштаба 1: 1500 мс против 43 мс).
Тест: функции svod2 имеют jit=off. Убран тест формы плана: функция с SET не разворачивается.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 11:58:31 +04:00
Andrey Epifancev
5db0bd4cee fix(svod2): серверный поиск совпадает с экраном — пустое поле contract_detail не затирает contract_summary (R-30, решение пользователя 08.11)
В v3.svod2_lines counterparty/reference/deadline/comment берутся как COALESCE(detail, summary).
Оракулы (Python, JS, векторы) отбрасывают null при слиянии, legacy_full() снова читает
ответ без параметров. Тесты: пустое поле detail, отсутствие строки detail, перекрытие непустым detail.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 11:45:37 +04:00
Andrey Epifancev
737ff55b42 test(api): схема OpenAPI свода 2 допускает Svod2PageResponse рядом с BaseListResponse (AURORA-1843)
Контрольный тест тяжёлых GET (AURORA-1848) требовал одну ссылку на BaseListResponse;
режим страниц добавляет второй вариант ответа.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 11:31:51 +04:00
Andrey Epifancev
c69a8e586b Merge remote-tracking branch 'origin/feat/220-aurora-1842-svod2-column-virtual' into feat/236-aurora-1843-svod2-server-paging
# Conflicts:
#	api/tests/integration/conftest.py
2026-11-08 11:02:38 +04:00
Andrey Epifancev
79c841dcaf Merge origin/feat/220 в feat/236 (сервер): свод 2 постранично поверх test (AURORA-1843)
Конфликты summary.py, summary_repository.py, summary_service.py,
test_summary2_related_records_sql.py: сохранены новые методы страниц и фасетов,
режим без параметров идёт по быстрому JSON-пути test (AURORA-1848).
Миграция переименована в 0057 (down_revision 0056); в svod2_lines добавлена
поправка 0050 (СПОД аренды, только ГО). Эталон svod2_legacy_golden перезаписан
под ответ без null-полей; legacy_full оракулов строится прямым вызовом функции.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 11:02:30 +04:00
Andrey Epifancev
36d19f1e2f fix(forms): add_budget_line проставляет created_by, NULL-автор удаляется только ADMIN (O-1)
R-4 (решение пользователя 08.11). В миграцию 0056 добавлен v3.add_budget_line:
тело = 0051_form2_ahr_satellite_new_line + только created_by = current_user_id() в
двух INSERT (обычная строка и заготовка записи сателлита). Авто-зеркальные строки
sync (_ensure_form2_ahr_*_sync_line) остаются с NULL. Backfill не делается.
del_budget_line: NULL-автор -> удаляет только ADMIN (комментарий в SQL + тесты).
xfail-тест владельца снят; добавлены тесты NULL-автора (исполнитель 403, ADMIN 200).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 10:59:55 +04:00
Andrey Epifancev
c2595ca0a9 Merge remote-tracking branch 'origin/test' into feat/255-aurora-1938-transfer-econ-calc 2026-11-08 09:56:33 +04:00
Andrey Epifancev
3fb1a3b162 Merge remote-tracking branch 'origin/test' into feat/249-aurora-1936-row-delete-confirm 2026-11-08 09:56:16 +04:00
Andrey Epifancev
d1922c9354 fix(forms): перенумеровать миграцию 1936 в 0056, пересобрать del_budget_line поверх 0053, починить тесты
Миграция 0050_budget_line_delete_owner_guard -> 0056 (down 0055, стек поверх 0055 AURORA-1938).
Тело v3.del_budget_line = актуальное тело из 0053_form2_ahr_source_sheet (AURORA-1907:
запрет удаления АХР-строк с source_sheet IS NOT NULL, ручные удаляются) + только owner-guard;
раньше копия опиралась на 0040 и откатывала 1907.

Тесты: доступ к форме id=1 даёт отдельная пара исполнителей isp2/isp3 (isp1 больше не
добавляется в org 1 — это ломало тесты «исполнитель из чужой организации»); окно фазы
DFIP в фикстуре продлено (истекло 2026-06-06, add_line возвращал 403); маркер
internal_order не приходит в INPUT-строке add_line — берём единственную INPUT-строку;
добавлен тест 1907 (строка из сателлита не удаляется напрямую). Тест «владелец удаляет свою
строку» помечен xfail(strict): add_budget_line не заполняет budget_line.created_by (O-1).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 09:56:16 +04:00
aep
3e00f91c69 Merge pull request 'AURORA-1905: выгрузка форм 1 и 4 — порядок столбцов и заголовки как на экране' (#260) from feat/253-aurora-1905-form1-form4-export-layout into test 2026-11-08 08:51:39 +03:00
aep
e52e8b6cd9 Merge pull request 'AURORA-1902: Смета РФ — выгрузка Операц/АХР/КВ своей раскладкой' (#259) from feat/252-aurora-1902-form2-export-layout into test 2026-11-08 08:51:25 +03:00
Andrey Epifancev
1f885866c4 Merge remote-tracking branch 'origin/test' into feat/255-aurora-1938-transfer-econ-calc 2026-11-08 09:45:37 +04:00
Andrey Epifancev
5ad5cbb3a3 Мерж feat/252 (AURORA-1902) в feat/253: стек выгрузки FORM_2 + FORM_1/4 (AURORA-1905)
Конфликт export_service.py: «Операц» формы 1 берёт FORM1_OPER_DEPTH_COLUMNS (без «Платежи в year+2»),
остальные листы — кортеж (колонки, цвета, extra, нормализатор) из #259.
Тест test_export_form2_mapping сравнивает Операц Ф.1 с FORM1_OPER_DEPTH_COLUMNS.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 09:42:00 +04:00