fix(mera): кликабельная ссылка на политику ПДн в чекбоксе согласия + синхронизация версии (блоки 2, 5.4) #2886
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2886
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/mera-consent-policy-link"
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?
Юр-документ владельца от 14.08.2026, блоки 2 и 5.4. Требование (позиция РКН): текст рядом с чекбоксом должен быть кликабельной ссылкой на сам документ, а не упоминанием его существования.
Что было по факту. Аудит показал: чекбокс не предустановлен ✓, отправка без галочки невозможна ✓ (early-return на фронте +
Literal[True]→ 422 на бэке + CHECK-констрейнт в БД), а вот рядом с чекбоксом стоял простой текст со ссылкой на закон — ни одногоhrefв файле не было. Плюс версия политики в БД писалась как2026-07, при том что политика утверждена 13 августа.Что сделано
next/linkна/mera-public/privacy,target="_blank"(клик не должен сбрасывать заполненную форму)._CONSENT_POLICY_VERSION→2026-08-13, выведена изPRIVACY_APPROVAL— версия обязана указывать на редакцию документа, на который согласие теперь фактически ссылается._CONSENT_TEXT_SNAPSHOTобновлён под новый текст (плоский, без разметки).PRIVACY_PATHвынесен вlib/legal-copy.ts(модуль без импортов),content.tsего ре-экспортирует — существующие потребители не тронуты. Так B2B-виджет не тянет модуль лэндинга с реквизитами и банковскими данными.Тесты — главная ловушка этой правки.
test_consent_text_frontend_sync.pyвытаскивал текст регэкспом<span>(.*?)</span>и сравнивал побайтово с бэкендовым снапшотом: любая разметка внутри<span>его роняла. Экстрактор починен (снимает{" "}-спейсеры, JSX-комментарии и теги, нормализует пробелы) и не ослаблен — при расхождении текстов по-прежнему падает. Добавлено: 2 юнит-теста на сам экстрактор и новыйtest_consent_policy_version_matches_privacy_approval_date, который парсит дату утверждения изcontent.tsи падает при рассинхронизации версии — ровно та тихая ловушка, которую нашёл аудит.Ссылка через
next/link, а не<a>— намеренно: в продеbasePath="/trade-in", голый<a href="/mera-public/privacy">вёл бы в 404.Легаси
HeroTransparency.tsx(недостижим с живого маршрута) приведён к той же формулировке без ссылки, чтобы тексты не разъехались.Проверено: бэк —
test_consent_text_frontend_sync.py+test_trade_in_lead.py20 passed,test_estimate_consent_gate.py14 passed,ruffчисто; фронт —tsc --noEmit,next lint,vitest29/29,check:mera-public-isolation(18 файлов).Конфликт при мерже:
lib/legal-copy.tsсоздаётся и в PR #2884 — файлы сольются вручную (тамSHORT_ESTIMATE_DISCLAIMER, здесьPRIVACY_PATH).Что этот PR НЕ закрывает: IP пишется из первого хопа
X-Forwarded-Forбез проверки доверенного прокси, то есть подделываем клиентом — для доказательной силы это стоит закрыть отдельно (Caddy наш). И у соседнего контура согласия — на саму оценку (_ESTIMATE_CONSENT_*) — фронтового чекбокса нет вовсе.РКН/владелец: рядом с чекбоксом согласия должна быть ссылка на сам документ политики обработки ПДн, а не упоминание закона. Чекбокс в LeadForm.tsx (v2, живой /trade-in/v2) теперь линкует "Политикой обработки персональных данных" на /mera-public/privacy (target=_blank, чтобы не терять заполненную форму). Путь вынесен в новый src/lib/legal-copy.ts (модуль без импортов) — content.ts ре-экспортирует оттуда, чтобы B2B-виджет не тянул B2C-лэндинг-модуль целиком. _CONSENT_TEXT_SNAPSHOT/_CONSENT_POLICY_VERSION в lead.py обновлены под новый плоский текст и дату утверждения политики (PRIVACY_APPROVAL: 2026-08-13). test_consent_text_frontend_sync.py: экстрактор теперь снимает JSX-теги/{" "} спейсеры перед сравнением (иначе сломался бы на разметке ссылки) + новый тест держит _CONSENT_POLICY_VERSION в синхроне с PRIVACY_APPROVAL из content.ts, чтобы версия не расходилась молча с редакцией документа. Легаси-дубль в HeroTransparency.tsx (недостижим с живого роута) — текст приведён в соответствие без ссылки: компонент не смонтирован нигде, и нет теста, который держал бы там ссылку в актуальном состоянии.