feat(mera/pdf): дисклеймер 135-ФЗ в подвале каждой страницы отчёта (блок 4.2) #2885

Merged
lekss361 merged 2 commits from feat/mera-pdf-135fz-footer into main 2026-08-14 12:47:38 +00:00
Owner

Юр-документ владельца от 14.08.2026, блок 4: в подвале каждой страницы PDF (не только первой) должен печататься дисклеймер про 135-ФЗ.

Сегодня в подвале только номер отчёта, дата, «действителен до» и вордмарк. Правового текста нет вообще; ближайшие по смыслу строки — brand.pdf_disclaimer (только обложка, у generic-бренда пустой) и «Расчёт носит ориентировочный характер и не является офертой» (только стр. 4).

Что сделано

  • Текст вынесен в константу _PDF_135FZ_FOOTER_NOTICE, печатается через ранее мёртвый слот page_note в _page_footer → попадает в @bottom-center, то есть на все страницы.
  • Бюджет высоты подвала выбран сжатием самого хрома (~13pt): margin-top 6→4pt, padding-top 8→6pt, line-height 1.35→1.15, отступы разделителя 6→3pt. Текст — 5pt, line-height 1.15.
  • @page margin-bottom 19→21mm — только после того, как сжатия не хватило (~58pt требуемых против 53.9pt исходных).

Главный риск и его проверка. Увеличение нижнего поля — ровно то, что порождает пятую пустую страницу (регрессия, которую чинил 42a50cf8). Воркер проверить не смог: на Windows нет нативных Pango/cairo, а tests/test_pdf_real_render.py самоскипается — в CI тоже, поэтому зелёный CI здесь ничего не доказывает.

Прогнал реальный рендер в докер-образе с нативным WeasyPrint 69.0 на коде этой ветки:

PAGES(normal report): 4 | expected 4      ← пятой пустой страницы нет
PDF magic ok: True
page 1: 135-ФЗ в тексте страницы = True
page 2: 135-ФЗ в тексте страницы = True
page 3: 135-ФЗ в тексте страницы = True
page 4: 135-ФЗ в тексте страницы = True
PAGES(insufficient_data): 1 | expected 1  ← одностраничный empty-state не сломан

Follow-up (не в этом PR): одностраничный empty-state _build_insufficient_data_page running-подвал не подключает вообще, поэтому дисклеймера там нет. Если владелец считает его тоже обязательным — отдельная задача с другим бюджетом вёрстки.

Проверено дополнительно: ruff check чисто, test_pdf_security.py 41 passed, test_trade_in_pdf_dual_price.py 25 passed, смежные 59 passed.

Юр-документ владельца от 14.08.2026, блок 4: в подвале **каждой** страницы PDF (не только первой) должен печататься дисклеймер про 135-ФЗ. Сегодня в подвале только номер отчёта, дата, «действителен до» и вордмарк. Правового текста нет вообще; ближайшие по смыслу строки — `brand.pdf_disclaimer` (только обложка, у generic-бренда пустой) и «Расчёт носит ориентировочный характер и не является офертой» (только стр. 4). **Что сделано** - Текст вынесен в константу `_PDF_135FZ_FOOTER_NOTICE`, печатается через ранее мёртвый слот `page_note` в `_page_footer` → попадает в `@bottom-center`, то есть на все страницы. - Бюджет высоты подвала выбран сжатием самого хрома (~13pt): `margin-top` 6→4pt, `padding-top` 8→6pt, `line-height` 1.35→1.15, отступы разделителя 6→3pt. Текст — 5pt, `line-height` 1.15. - `@page margin-bottom` 19→21mm — только после того, как сжатия не хватило (~58pt требуемых против 53.9pt исходных). **Главный риск и его проверка.** Увеличение нижнего поля — ровно то, что порождает пятую пустую страницу (регрессия, которую чинил 42a50cf8). Воркер проверить не смог: на Windows нет нативных Pango/cairo, а `tests/test_pdf_real_render.py` самоскипается — в CI тоже, поэтому зелёный CI здесь ничего не доказывает. Прогнал реальный рендер в докер-образе с нативным WeasyPrint 69.0 на коде этой ветки: ``` PAGES(normal report): 4 | expected 4 ← пятой пустой страницы нет PDF magic ok: True page 1: 135-ФЗ в тексте страницы = True page 2: 135-ФЗ в тексте страницы = True page 3: 135-ФЗ в тексте страницы = True page 4: 135-ФЗ в тексте страницы = True PAGES(insufficient_data): 1 | expected 1 ← одностраничный empty-state не сломан ``` **Follow-up (не в этом PR):** одностраничный empty-state `_build_insufficient_data_page` running-подвал не подключает вообще, поэтому дисклеймера там нет. Если владелец считает его тоже обязательным — отдельная задача с другим бюджетом вёрстки. Проверено дополнительно: `ruff check` чисто, `test_pdf_security.py` 41 passed, `test_trade_in_pdf_dual_price.py` 25 passed, смежные 59 passed.
lekss361 added 1 commit 2026-08-14 12:33:17 +00:00
fix(tradein/pdf): 135-ФЗ дисклеймер в футере каждой страницы (Блок 4.2)
Some checks failed
CI / changes (pull_request) Successful in 7s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / changes (pull_request) Successful in 8s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Failing after 4m42s
eb0f082790
Running @bottom-center margin-box печатал только мета/wordmark — юр-требование
(индикативный расчёт, не отчёт об оценке по 135-ФЗ) отсутствовало на всех 4
страницах. Бюджет высоты подвала = margin-bottom (19mm≈53.9pt) уже был
заполнен почти впритык (~51pt) после 42a50cf8 (ровно 4 страницы без пустых).

Сжат существующий HUD-хром внутри _page_footer (margin-top 6→4pt, padding-top
8→6pt, line-height мета/wordmark 1.35→1.15, разделитель margin 6pt 0→3pt 0,
экономия ~13pt) + добавлен текст дисклеймера отдельным блоком (5pt/line-height
1.15, ~3 строки ≈17pt). Экономии внутри подвала не хватило без деградации до
нечитаемого — минимально поднят @page margin-bottom 19mm→21mm (+2mm).

Реальный WeasyPrint-рендер (native Pango/cairo) недоступен на Windows-деве —
пагинация (риск отката к 5-й пустой странице из-за margin-bottom на всех 4
страницах) не подтверждена локально, арифметика в docstring _page_footer.
bot-backend added 1 commit 2026-08-14 12:41:47 +00:00
merge main в ветку PDF-подвала (перезапуск CI после флака test_auth_api таймингов)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 13s
CI / changes (pull_request) Successful in 13s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 4m51s
7d89c87e21
lekss361 merged commit 321cf85e87 into main 2026-08-14 12:47:38 +00:00
lekss361 deleted branch feat/mera-pdf-135fz-footer 2026-08-14 12:47:38 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2885
No description provided.