77 Commits

Author SHA1 Message Date
Andrey Epifancev
234103606b feat(form2): скрыть сателлитные строки на листе АХР и заблокировать добавление для аренды/коммуналки/охраны (AURORA-1887)
Упрощённый дизайн (согласован в чате 2026-10-31, расходится с архитектурным
предложением из тикета): без слияния budget_line, без миграции данных, без
изменения протокола WS, без изменения v_svod2_rf.

- v3.v_form2_sheet_jsonb (0054): при p_sheet='AHR' не возвращает INPUT-строки
  с budget_line.source_sheet IN ('AHR_LIMIT','AHR_RENT','AHR_UTILITY',
  'AHR_SECURITY'); ручные строки (включая «сверх лимита», AURORA-1907)
  остаются видимыми. Листы-источники не затронуты. Суммы на заголовках статей
  считаются независимо от видимости строк — не меняются.
- header.can_add_row (новое поле, только p_sheet='AHR'): false для статей
  аренды/коммуналки/охраны (v3._form2_satellite_expense_item, новый helper),
  true для лимитных и обычных статей. Фронт (RealtimeTable.jsx handleAddRow,
  utils/rowUtils.js canAddRowForHeader) блокирует «Добавить строку» по этому
  флагу — тот же паттерн, что у FormsNoCanAddRow/isVspAdditionRow (без
  серверной валидации в add_budget_line).
- Обновлены тесты, которые проверяли суммы/источник через теперь скрытые
  INPUT-строки на AHR (test_form2_ahr_limit.py,
  test_form2_ahr_satellite_spod_integration.py,
  test_form2_ahr_satellite_integration.py) — сравнение переведено на
  заголовок статьи (до/после патча) и на лист-источник.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-31 21:59:04 +04:00
Andrey Epifancev
fe9dfbc7e1 feat(form2): признак источника строки АХР и раздельные суммы лимита/сверх лимита (AURORA-1907)
Миграция 0053: v3.budget_line.source_sheet (NULL | AHR_LIMIT | AHR_RENT |
AHR_UTILITY | AHR_SECURITY) — явный признак источника строки вместо
сопоставления по совпадению имени с LEAF limit_template. Backfill
существующих строк: сателлиты — из v3.form2_ahr_satellite_line_source,
лимитные — минимальный id в группе (форма, статья, имя LEAF), остальные
совпавшие по имени становятся ручными (RAISE NOTICE со списком).

_ensure_form2_ahr_limit_sync_line теперь ищет строку по source_sheet='AHR_LIMIT'
(а не по имени) — тот же класс бага, что чинил #265/AURORA-1909 для сателлитов
аренды/коммуналки/охраны, теперь для лимитов. is_form2_ahr_satellite_line,
del_budget_line (guard на удаление) и get_form2_ahr_satellite_delta переведены
на признак источника. Новая v3._form2_expense_item_has_limit выносит правило
«у статьи есть лимит» в отдельную функцию.

v_form2_sheet_jsonb: header.source ('AHR_LIMIT'/'AHR_RENT'/'AHR_UTILITY'/
'AHR_SECURITY'/'MANUAL'), header.is_over_limit для ручных строк на статьях
с лимитом; plan.limit_year/over_limit_year (только на листе AHR, свёрнуты по
дереву статей через mv_expense_item_tree.desc_ids) — plan.year не меняется,
остаётся суммой всех строк.

Фронт: AHR.js — колонки «В пределах лимита, год»/«Сверх лимита, год» после
«План, год» (нередактируемые — нет случая в v3._apply_form_cell); Cell.jsx —
чип «сверх лимита» в ячейке наименования по header.is_over_limit, без заливки
строки. export_mappings.py — те же два поля в экспорт АХР.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-31 17:54:55 +04:00
Andrey Epifancev
ab765f028d fix(form2): лимиты АХР — годовые нормативы делятся на 4, сумма без НДС, тыс. руб. в АХР
AURORA-1897: лист «АХР лимиты» формы 2 дублировал годовой норматив ДМС/оргтехники
в каждом квартале вместо деления на 4, считал сумму от лимита с НДС (смета
ведётся без НДС) и переносил рубли в план АХР, где всё остальное в тыс. руб.

Миграция 0052_form2_ahr_limit_period_vat_units:
- v3.limit_template.period (YEAR/QUARTER/MONTH) + точечные правки справочника
  (id 24/25 ДМС и id 13-15 принтеры/МФУ/копиры — YEAR; id 7/8 SIM-карты —
  заполнен limit_without_vat; id 21 — unit по аналогии с бумагой).
- v3._form2_ahr_limit_amount(period, limit, qty) — рубли без НДС, без
  проверки по названию; старая 4-арг. сигнатура удалена.
- v3.v_form2_view (ветка AHR_LIMIT), v3.sync_form2_ahr_satellite_lines(_line)
  пересозданы: amount/plan считаются от limit_without_vat, план АХР делится
  на 1000, добавлены amount_year и строка «Итого» (id=0, row_type ROOT).
- v3._limit_template_path_set дописывает id=0 в path-set, чтобы «Итого»
  попадала в diff PATCH-ответа.
- Пересинхронизированы все существующие формы 2.

Ветки аренды/коммуналки/охраны и add_budget_line (AURORA-1887/1909) не тронуты.

Тесты: api/tests/integration/test_form2_ahr_limit.py (7 тестов, числа из
тикета: id24 qty10→69645/69.645, id3→2000/2.0, id7→7500/7.5, id13→6471.875/
6.471875, id17→7500/7.5, «Итого», регрессия АХР_RENT без деления).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-31 15:35:23 +04:00
Andrey Epifancev
91cbe99c32 fix(form2): добавление записи на сателлите АХР не захватывает ручную строку
v3.add_budget_line (ветка сателлитов AHR_RENT/AHR_UTILITY/AHR_SECURITY)
искала любую существующую строку статьи без ORDER BY и без исключения
ручных/уже привязанных строк, и переиспользовала её как заготовку для
новой записи. Если у статьи ещё не было строк в
v3.form2_ahr_satellite_line_source (типично — первая запись при наличии
ручной строки той же статьи), sync переименовывал и перезаписывал план/факт
чужой ручной строки, блокируя её для правки.

Теперь для каждой новой записи сателлита всегда создаётся отдельная
пустая строка-заготовка — sync забирает её как строку именно этой записи.
Заодно удалён мёртвый код (_ensure_form2_ahr_sync_line,
_upsert_form2_ahr_sync_values), не имевший вызывающих мест.

AURORA-1907 (лимитная часть) и AURORA-1887 (статьи 314/24/779 в коде) —
отдельные задачи, не затронуты.

Closes #265.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-31 15:07:44 +04:00
Andrey Epifancev
d41668dc27 feat(form2): колонка «СПОД» в сателлитах АХР (аренда/коммуналка/охрана)
Добавлен столбец «СПОД» между «Декабрь» и «Итог IV кв.» на листах
AHR_RENT/AHR_UTILITY/AHR_SECURITY формы 2, с переносом значения в
budget_line_quarter.actual_spod синхронизируемой строки АХР (Support)
и, через уже существующую логику, в итог 4 кв. и года АХР/Смет/сводов.

- rent_detail/utility_detail/security_detail: колонка actual_spod
  (ALTER TABLE + ORM).
- v3.v_form2_view: fact_q4.spod и fact_q4.total с учётом spod в ветках
  AHR_RENT/AHR_UTILITY/AHR_SECURITY.
- v3._apply_form_cell: fact_q4.spod разрешён как обычное поле месяца.
- v3._upsert_form2_ahr_detail_sync_values: DROP+CREATE с новым
  параметром p_actual_spod (DROP обязателен из-за неоднозначности
  перегрузки с DEFAULT).
- v3.sync_form2_ahr_satellite_lines/line: actual_spod передаётся из
  rd/ud/sd в апсерт.
- v3.v_svod2_go: строка аренды также считается заполненной по
  actual_spod.
- Data-миграция: 'fact_q4.spod' добавлен в column_keys этапов, где уже
  есть 'fact_q4.dec' (phase_template/form_phase), идемпотентно.
- Тело CREATE OR REPLACE для v_form2_view/sync_form2_ahr_satellite_*
  собрано вручную по миграциям 0033/0034 + regexp-патчам из 0037
  (pg_get_functiondef на живой БД недоступен в этой среде — см.
  Rulings в PR).

Тесты: node --test на новых accessorKey в конфигах фронта + unit-тест
на 0049/0050 (v_svod2_go теперь засчитывает actual_spod для аренды).
Интеграционные тесты добавлены, но не выполнены — нет доступа к
Postgres в этой рабочей среде (см. Rulings в PR).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-31 00:24:56 +04:00
8d6e7ba51b svod2-filter-fix2: если заполнен только всп не берем в свод 2 2026-10-21 17:31:34 +03:00
f92c0e8d32 svod2-filter-fix: строки совсем без значений не попадают в свод 2 2026-10-21 15:38:48 +03:00
07cdcc6ed4 svod2-filter-fix: пофиксил фильтр по наличию записи в contract-detail в своде 2 2026-10-21 11:36:14 +03:00
PotapovaA
f152430805 удаление старых функций в бд (добавление и обновление всп) 2026-10-13 16:07:12 +03:00
f331c6f01f form3-source: источник строки в своде формы 3 2026-10-01 13:26:42 +03:00
7e3c6df796 columns-svod-2: поправил ключи для колонок свода 2 2026-10-01 11:41:11 +03:00
172b343c69 export-optimize-refresh: очередь загрузки при экспорте 2026-09-30 20:40:21 +03:00
341e8b3936 last-column: Колонка Сумма оплаты структуры формы 4 2026-09-30 14:02:41 +03:00
18faf6a724 svod-fix: свод 2 из формы 2, новый свод 1 для формы 3 2026-09-28 17:01:07 +03:00
1e02b0ca61 fix-columns: добавил комментарий, строки из Лимита не удаляются 2026-09-28 13:19:26 +03:00
d6da54ecf4 form3-expense: добавил новые статьи в форму 3, возможность удаления задач 2026-09-25 14:20:04 +03:00
909c16bf9b sattelite-fix: добавил формулу для принтеров и мфу 2026-09-25 10:26:33 +03:00
469cd0e8c4 Merge pull request 'delete-sattelite-rows' (#175) from delete-sattelite-rows into test
Reviewed-on: #175
2026-09-24 13:49:34 +03:00
a105b3296b Merge pull request 'form3-pages: новая разметка третьей формы, сводные отчеты по третьей форме на бэке' (#174) from form3-pages into test
Reviewed-on: #174
Reviewed-by: PotapovaA <potapovaanna113@mail.ru>
2026-09-24 13:49:13 +03:00
7cb8072ff4 delete-sattelite-rows: нельзя удалить строку из сателитов в ахр 2026-09-24 13:19:31 +03:00
adfc2dda81 form3-pages: новая разметка третьей формы, сводные отчеты по третьей форме на бэке 2026-09-24 12:28:27 +03:00
9e04c11b94 form1-sub_sub-fix: правки по статьям 2026-09-23 11:25:34 +03:00
370e2e87fe form1-sub_sub-fix: правки по вставке из сателитов 2026-09-22 18:32:05 +03:00
a9fd54398b form1-sub_sub-fix: правки по порядку статей 2026-09-22 17:18:07 +03:00
a3ffa2264c form1-sub_sub-fix: вставка в форму 4 с названием 2026-09-22 14:02:40 +03:00
88f74f24b9 form1-sub_sub-fix: фикс листа структура в форме 4 2026-09-22 13:20:33 +03:00
c6fb3ef403 form1-sub_sub-fix: фикс 4 уровня для первой формы 2026-09-22 12:39:07 +03:00
99ef647c5c sort-fix: восстановил сортировку, новый слой expense_item в листах АХР 2026-09-22 07:42:38 +03:00
28ed76fcd1 Название статьи редактируемо и по умолчанию пустое 2026-09-18 15:36:37 +03:00
11e496d13c Данные из сателитныхх листов в АХР 2026-09-18 14:50:19 +03:00
23c19a6914 new-expenses: правки по статьям расхода 2026-09-17 13:08:06 +03:00
96f550caed fixes-form: добавил новые статьи 2026-09-16 15:40:35 +03:00
922add04ef new-rows: новые строки в формах 2026-09-15 10:30:27 +03:00
ce34655166 insert-new-row: ельзя вставить строку вне своего этапа, оставются ссп и рф при смене роли 2026-09-02 09:35:54 +03:00
d4ca6486c1 new-role: Исполнитель ДУРРС 2026-08-31 12:24:06 +03:00
46642ceb2d remove-programs: обновление и удаление програм и проектов четвертой формы 2026-08-28 17:42:12 +03:00
5dfb9653c2 delete-from-cell: удаление данных из ячейки numeric делает значение 0 2026-08-28 12:38:27 +03:00
4708acbd20 svod: свод 2 2026-08-27 16:52:58 +03:00
6f6f35c8b1 svod: свод 1 2026-08-26 13:09:54 +03:00
80ef16bd02 computed-fix: добавил поле carryover к кварталам проектов 2026-08-21 17:15:08 +03:00
3bbc42fa45 name-fix: нельзя редактировать имя расхода в форме 4 2026-08-21 14:24:49 +03:00
9095cad992 project-back-fix: экпорт проектов, нельзя ставить отрицательные числа в полях проектов, создание года только на следующий год 2026-08-20 21:27:08 +03:00
4e8be39df1 tech-num-fix: поправил формирование технического номера проекта, исправил шаблоны для формы 4, поправил получение стадий у проектов 2026-08-19 17:31:58 +03:00
75875d266d projects-summary-handler: ручка для таблицы снизу страницы навигации 2026-08-14 09:10:42 +03:00
d4c11243b9 projects-handlers: ручки со списком проектов со сметами и их обновление 2026-08-13 13:45:56 +03:00
3568b12cd4 fix-editable-columns: пофиксил возвращение редактируемых колонок 2026-08-07 09:09:35 +03:00
ad7a58594d booking-fix: бронь берется из других полей, поправил список колонок, которые можно добавлять в этапы, даты редактируются в российском формате, отдаются метаданные по редактируемым колонкам 2026-08-06 11:50:27 +03:00
57f919ac0c phase-directions: направления в фазах, год в зависимости от года формы или проекта, фикс с колонками для редактирования 2026-08-03 18:46:16 +03:00
dfb3ea783e form2-limit-migrations: миграции для листа лимиты и для второй формы в целом 2026-07-30 16:56:07 +03:00
9bf17c6eb3 delete-projects: удаление проектов, фикс редактируемых полей в форме 4, нельзя удалить самого себя, нельзя выбрать неактивный ссп для экспорта всп, фикс для показа доступных полей для редактирования (бэк) 2026-07-30 14:30:42 +03:00