feat(mera): оферта, политика возврата и утверждённая политика ПДн + реквизиты #2874

Merged
lekss361 merged 1 commit from feat/mera-legal-docs into main 2026-08-13 17:13:16 +00:00
Owner

Зачем

Юридический блокер публичного B2C-запуска. Два пункта из чек-листа владельца были закрыты «нечем»:

  • оферты не существовало вообще — на лэндинге была только страница про ПДн;
  • privacy-страница в собственной шапке писала, что она НЕ утверждённая политика по ст. 18.1 152-ФЗ (реквизитов оператора в репозитории не было, выдумывать их нельзя) — в таком виде заявка эквайера не проходит.

Плюс гейт G6 из mera-b2c-paid-flow-decision.md: LEGAL_ENTITY == null → нет реквизитов, нет продажи.

Владелец прислал редакции всех трёх документов (13.08.2026) и реквизиты; выбраны почта support@meraocenka.ru и эквайер CloudPayments.

Что в PR

  • content.tsLEGAL_ENTITY заполнен (ООО «ПРОЕКТ ФЛЭТ», ИНН/КПП/ОГРН, юр. и фактический адрес, директор, банковские реквизиты); добавлены SUPPORT_EMAIL, SERVICE_PRICE_RUB, LEGAL_DOCS_REVISION, PRIVACY_APPROVAL, внутренние пути и короткие публичные URL документов. Это единственное место, где живут реквизиты: подвал, оферта, политика возврата и политика ПДн рендерят поля, а не повторяют строки.
  • Новые страницы /mera-public/oferta и /mera-public/refund — редакции владельца перенесены дословно; плейсхолдер [адрес электронной почты] заменён на почту поддержки.
  • privacy/page.tsx переписана на утверждённую редакцию — с названным оператором, реквизитами и приказом об утверждении.
  • SiteFooter — почта, ссылки на все три документа, реквизиты с ОГРН.
  • Caddyfile — короткие адреса /oferta, /refund, /privacy через rewrite на поддерево лэндинга. Именно эти URL напечатаны внутри самих документов и уйдут в заявку эквайеру; сегодня они отдавали 404. Пути перечислены поимённо — allowlist-by-default периметра не ослаблен.
  • smoke-mera-perimeter.sh — три проверки на короткие адреса.

Что сохранено намеренно

  • Условность по PUBLIC_ESTIMATE_ENABLED. Утверждённый текст политики (п. 5.1) описывает передачу адреса на сервер, но публичный расчёт ещё выключен и адрес физически не покидает браузер. Поэтому при false рендерится п. 5.4: «публичный расчёт ещё не открыт… пункты 5.1–5.2 применяются с момента открытия». Снимать вместе с флагом, а не потом.
  • Срок хранения оплаченного отчёта рендерится из PAID_REPORT_RETENTION_MONTHS, а не числом в тексте — гейтится test_paid_retention_text_consistency.py (тест ловит и число в комментарии, проверено).
  • ОГРН сверен с ЕГРЮЛ: в исходном сообщении владельца был с опечаткой (…028028), в документах и здесь — верный …028281.

Что этот PR НЕ делает

Не включает приём оплаты: платёжного контура в коде нет, PUBLIC_ESTIMATE_ENABLED по-прежнему false. Оферта с ценой публикуется раньше кнопки намеренно — без неё эквайер не примет заявку.

Разделы 2.1 и 4 политики возврата обещают автоматический возврат при техническом сбое. На момент публикации это установленный порядок, а не наблюдаемое поведение системы; при подключении оплаты автовозврат обязан появиться в коде вместе с кнопкой — обещание уже опубликовано и является условием договора.

Проверено локально

  • tsc --noEmit, next lint, vitest (29 тестов), check:mera-public-isolation (18 файлов, закрытый контур не найден)
  • next build — все три страницы пререндерены статикой
  • pytest tests/test_paid_retention_text_consistency.py — 3 passed
  • caddy validate + caddy adapt — маршрут /oferta|/refund|/privacy → /trade-in/mera-public{path} на месте
  • next start + curl всех трёх страниц: реквизиты, ОГРН, почта, цена и п. 5.4 рендерятся; в подвале лэндинга — почта, три ссылки и реквизиты

Прод-проверка коротких адресов — после мержа и деплоя (smoke-скрипт).

## Зачем Юридический блокер публичного B2C-запуска. Два пункта из чек-листа владельца были закрыты «нечем»: - **оферты не существовало вообще** — на лэндинге была только страница про ПДн; - **privacy-страница в собственной шапке писала, что она НЕ утверждённая политика** по ст. 18.1 152-ФЗ (реквизитов оператора в репозитории не было, выдумывать их нельзя) — в таком виде заявка эквайера не проходит. Плюс гейт G6 из `mera-b2c-paid-flow-decision.md`: `LEGAL_ENTITY == null` → нет реквизитов, нет продажи. Владелец прислал редакции всех трёх документов (13.08.2026) и реквизиты; выбраны почта `support@meraocenka.ru` и эквайер CloudPayments. ## Что в PR - **`content.ts`** — `LEGAL_ENTITY` заполнен (ООО «ПРОЕКТ ФЛЭТ», ИНН/КПП/ОГРН, юр. и фактический адрес, директор, банковские реквизиты); добавлены `SUPPORT_EMAIL`, `SERVICE_PRICE_RUB`, `LEGAL_DOCS_REVISION`, `PRIVACY_APPROVAL`, внутренние пути и короткие публичные URL документов. Это единственное место, где живут реквизиты: подвал, оферта, политика возврата и политика ПДн рендерят поля, а не повторяют строки. - **Новые страницы** `/mera-public/oferta` и `/mera-public/refund` — редакции владельца перенесены дословно; плейсхолдер `[адрес электронной почты]` заменён на почту поддержки. - **`privacy/page.tsx`** переписана на утверждённую редакцию — с названным оператором, реквизитами и приказом об утверждении. - **`SiteFooter`** — почта, ссылки на все три документа, реквизиты с ОГРН. - **`Caddyfile`** — короткие адреса `/oferta`, `/refund`, `/privacy` через `rewrite` на поддерево лэндинга. Именно эти URL напечатаны внутри самих документов и уйдут в заявку эквайеру; сегодня они отдавали 404. Пути перечислены поимённо — allowlist-by-default периметра не ослаблен. - **`smoke-mera-perimeter.sh`** — три проверки на короткие адреса. ## Что сохранено намеренно - **Условность по `PUBLIC_ESTIMATE_ENABLED`.** Утверждённый текст политики (п. 5.1) описывает передачу адреса на сервер, но публичный расчёт ещё выключен и адрес физически не покидает браузер. Поэтому при `false` рендерится п. 5.4: «публичный расчёт ещё не открыт… пункты 5.1–5.2 применяются с момента открытия». Снимать вместе с флагом, а не потом. - **Срок хранения оплаченного отчёта** рендерится из `PAID_REPORT_RETENTION_MONTHS`, а не числом в тексте — гейтится `test_paid_retention_text_consistency.py` (тест ловит и число в комментарии, проверено). - **ОГРН сверен с ЕГРЮЛ**: в исходном сообщении владельца был с опечаткой (…028028), в документах и здесь — верный …028281. ## Что этот PR НЕ делает Не включает приём оплаты: платёжного контура в коде нет, `PUBLIC_ESTIMATE_ENABLED` по-прежнему `false`. Оферта с ценой публикуется раньше кнопки намеренно — без неё эквайер не примет заявку. Разделы 2.1 и 4 политики возврата обещают **автоматический** возврат при техническом сбое. На момент публикации это установленный порядок, а не наблюдаемое поведение системы; при подключении оплаты автовозврат обязан появиться в коде вместе с кнопкой — обещание уже опубликовано и является условием договора. ## Проверено локально - `tsc --noEmit`, `next lint`, `vitest` (29 тестов), `check:mera-public-isolation` (18 файлов, закрытый контур не найден) - `next build` — все три страницы пререндерены статикой - `pytest tests/test_paid_retention_text_consistency.py` — 3 passed - `caddy validate` + `caddy adapt` — маршрут `/oferta|/refund|/privacy → /trade-in/mera-public{path}` на месте - `next start` + curl всех трёх страниц: реквизиты, ОГРН, почта, цена и п. 5.4 рендерятся; в подвале лэндинга — почта, три ссылки и реквизиты Прод-проверка коротких адресов — после мержа и деплоя (smoke-скрипт).
lekss361 added 1 commit 2026-08-13 17:11:24 +00:00
feat(mera): оферта, политика возврата и утверждённая политика ПДн + реквизиты
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 8s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (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 / frontend-checks (pull_request) Successful in 56s
c6243b166f
Юридический блокер публичного B2C-запуска (G6 в mera-b2c-paid-flow-decision.md:
`LEGAL_ENTITY == null` → нет реквизитов, нет продажи) и входное требование
модерации эквайера: оферты не было вообще, а privacy-страница в собственной
шапке писала, что она НЕ утверждённая политика по ст. 18.1 152-ФЗ.

Что сделано:
- content.ts: `LEGAL_ENTITY` заполнен (ООО «ПРОЕКТ ФЛЭТ», ИНН/КПП/ОГРН, адреса,
  директор, банковские реквизиты), добавлены `SUPPORT_EMAIL`,
  `SERVICE_PRICE_RUB`, пути и короткие публичные URL документов. Единый
  источник — подвал, оферта, возврат и ПДн рендерят эти поля, а не повторяют
  строки. ОГРН сверен с открытыми данными ЕГРЮЛ (в исходном сообщении владельца
  был с опечаткой …028028, верный …028281).
- Новые страницы /mera-public/oferta и /mera-public/refund — редакции владельца
  от 13.08.2026 дословно, плейсхолдер `[адрес электронной почты]` заменён на
  support@meraocenka.ru.
- privacy/page.tsx переписана на утверждённую редакцию с оператором и
  реквизитами приказа. Сохранены оба инварианта честности: раздел про страницу
  ввода адреса условен по `PUBLIC_ESTIMATE_ENABLED` (п. 5.4 — пока публичный
  расчёт выключен, адрес не покидает браузер), срок хранения оплаченного отчёта
  рендерится из `PAID_REPORT_RETENTION_MONTHS`, а не числом в тексте
  (test_paid_retention_text_consistency.py).
- Caddyfile: короткие адреса /oferta, /refund, /privacy → rewrite на поддерево
  лэндинга. Именно они напечатаны внутри документов и уйдут в заявку эквайеру.
  Пути перечислены поимённо — allowlist-by-default периметра не ослаблен.
- smoke-mera-perimeter.sh: три новые проверки на короткие адреса.

Публикация оферты НЕ включает приём оплаты: платёжного контура в коде нет,
`PUBLIC_ESTIMATE_ENABLED` по-прежнему false. Оферта публикуется раньше кнопки
намеренно — без неё эквайер не примет заявку.

Проверено локально: tsc, next lint, vitest (29), isolation guard, next build
(три страницы пререндерены), pytest test_paid_retention_text_consistency (3),
caddy validate + adapt (rewrite на месте), рендер всех трёх страниц через
next start — реквизиты, почта и цена на месте.
lekss361 merged commit 67ce65daf1 into main 2026-08-13 17:13:16 +00:00
lekss361 deleted branch feat/mera-legal-docs 2026-08-13 17:13:18 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
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#2874
No description provided.