diff --git a/Caddyfile b/Caddyfile index 1e6a0e25..8624f14f 100644 --- a/Caddyfile +++ b/Caddyfile @@ -251,6 +251,31 @@ meraocenka.ru { } } + # Короткие адреса юридических документов. Именно они напечатаны ВНУТРИ + # самих документов (оферта ссылается на meraocenka.ru/refund, политика + # возврата — на meraocenka.ru/oferta) и уходят в заявку эквайеру, поэтому + # обязаны резолвиться сами по себе, а не только длинным + # /trade-in/mera-public/. Обратное направление тоже рабочее: длинный + # путь ловит handle ниже — навигация внутри сайта ходит по нему, потому что + # то же поддерево открывается и с gendsgn.ru/trade-in/mera-public, где + # короткого /oferta нет. + # + # `rewrite`, а не `redir`: адрес в строке браузера должен остаться коротким + # — модератор эквайера открывает ссылку из заявки и видит ровно тот URL, + # который в ней указан. Каноничность для поисковиков задана отдельно, через + # `alternates.canonical` на каждой из трёх страниц. + # + # Пути перечислены поимённо, а не шаблоном: allowlist-by-default этого + # site-блока — часть периметра (#2545), и превращать его в «любой корневой + # путь проксируется» ради трёх страниц нельзя. + @meraLegalDocs path /oferta /refund /privacy + handle @meraLegalDocs { + rewrite * /trade-in/mera-public{path} + reverse_proxy tradein-frontend:3000 { + header_up -X-Authenticated-User + } + } + # Подстраницы САМОГО лэндинга. Нужны с момента мержа #2615: футер ссылается # на политику обработки ПДн через next/link (`PRIVACY_PATH`), а Next с # basePath эмитит её как /trade-in/mera-public/privacy. Без этого handle diff --git a/scripts/smoke-mera-perimeter.sh b/scripts/smoke-mera-perimeter.sh index cda7725a..99e53ef5 100644 --- a/scripts/smoke-mera-perimeter.sh +++ b/scripts/smoke-mera-perimeter.sh @@ -5,6 +5,8 @@ # 1. meraocenka.ru отдаёт 200 анонимно (публичный лэндинг). # 1b. Подстраница лэндинга /trade-in/mera-public/privacy отдаёт 200 — # политика ПДн, на которую ссылается футер. +# 1c. Короткие адреса /oferta, /refund, /privacy отдают 200 — эти URL +# напечатаны внутри самих юридических документов и уходят эквайеру. # 2. meraocenka.ru/v2 и /trade-in/v2, /trade-in/api/* (B2B-пути) отдают 404 — # allowlist-by-default, НЕ были случайно проброшены на B2B-дерево # tradein-frontend. Проверяются обе формы — с basePath-префиксом и без. @@ -52,6 +54,15 @@ check "meraocenka.ru root — public 200" "$BASE_MERA/" 200 # обязательный по 152-ФЗ документ станет недоступен с публичной страницы. check "meraocenka.ru privacy — public 200" "$BASE_MERA/trade-in/mera-public/privacy" 200 +# 1c. Короткие адреса юридических документов. Это НЕ дубль проверки 1b: именно +# эти три URL напечатаны внутри самих документов и уходят в заявку +# эквайеру — если rewrite выпадет из Caddyfile, оферта будет ссылаться на +# 404, и заявку завернут. Проверяем все три поимённо, потому что и в +# Caddyfile они перечислены поимённо (allowlist, не шаблон). +check "meraocenka.ru/oferta — public 200" "$BASE_MERA/oferta" 200 +check "meraocenka.ru/refund — public 200" "$BASE_MERA/refund" 200 +check "meraocenka.ru/privacy — public 200" "$BASE_MERA/privacy" 200 + # 2. B2B-путь на публичном домене — 404 (allowlist-by-default), не 200/401. check "meraocenka.ru/v2 — B2B path must 404" "$BASE_MERA/v2" 404 diff --git a/tradein-mvp/frontend/src/app/mera-public/_components/SiteFooter.tsx b/tradein-mvp/frontend/src/app/mera-public/_components/SiteFooter.tsx index 086d4abc..c5d9b6e2 100644 --- a/tradein-mvp/frontend/src/app/mera-public/_components/SiteFooter.tsx +++ b/tradein-mvp/frontend/src/app/mera-public/_components/SiteFooter.tsx @@ -1,15 +1,17 @@ /** * SiteFooter — подвал. Серверный компонент. * - * Что здесь честно ОТСУТСТВУЕТ: - * - Реквизиты юрлица/ИП. В репозитории их нет (поиск по коду, бэкенду и - * разметке не дал ни наименования, ни ИНН/ОГРН), а выдумывать реквизиты - * оператора персональных данных на публичной странице нельзя. Блок - * рендерится, как только `LEGAL_ENTITY` в content.ts перестанет быть null; - * заполнить обязательно до открытия домена наружу — 152-ФЗ требует - * идентифицируемого оператора. - * - E-mail поддержки: реального адреса в коде тоже нет. Единственный - * проверяемый канал — телеграм-бот из `v2/SupportChatContext.tsx`. + * 2026-08-13: блоки реквизитов и почты, которых здесь раньше не было, теперь + * рендерятся — данные появились (`LEGAL_ENTITY`, `SUPPORT_EMAIL` в content.ts), + * и это не косметика: наименование, ИНН, ОГРН и работающий контакт на странице + * с офертой — прямое требование модерации эквайера и условие идентифицируемости + * оператора по 152-ФЗ. Значения импортируются, а не пишутся строками: тот же + * набор рендерят оферта и политика ПДн, и разъехаться они не должны. + * + * Ссылки на документы ведут по ВНУТРЕННИМ путям (`OFFER_PATH` и соседи), а не + * по коротким meraocenka.ru/oferta: короткие адреса существуют только на + * публичном хосте (rewrite в Caddy), а это же поддерево открывается и с + * gendsgn.ru/trade-in/mera-public — там короткая ссылка ушла бы в 404. * * Внешняя ссылка проверяется `safeUrl` (правило frontend.md: ничего в href без * валидации схемы) и открывается в новой вкладке с rel="noreferrer". @@ -21,8 +23,11 @@ import { safeUrl } from "@/lib/safeUrl"; import { LEGAL_ENTITY, + OFFER_PATH, PRIVACY_PATH, + REFUND_PATH, REGION_NAME, + SUPPORT_EMAIL, SUPPORT_TELEGRAM_LABEL, SUPPORT_TELEGRAM_URL, } from "../content"; @@ -49,6 +54,12 @@ export function SiteFooter() {

Связаться

+

+ Почта:{" "} + + {SUPPORT_EMAIL} + +

{telegramHref ? (

Поддержка в Telegram:{" "} @@ -61,14 +72,22 @@ export function SiteFooter() { {SUPPORT_TELEGRAM_LABEL}

- ) : ( -

Контакты появятся к запуску.

- )} + ) : null}

Документы

); diff --git a/tradein-mvp/frontend/src/app/mera-public/refund/page.tsx b/tradein-mvp/frontend/src/app/mera-public/refund/page.tsx new file mode 100644 index 00000000..c541b29c --- /dev/null +++ b/tradein-mvp/frontend/src/app/mera-public/refund/page.tsx @@ -0,0 +1,214 @@ +import type { Metadata } from "next"; +import Link from "next/link"; + +import { + LEGAL_DOCS_REVISION, + LEGAL_ENTITY, + OFFER_PATH, + PUBLIC_OFFER_URL, + PUBLIC_REFUND_URL, + SERVICE_PRICE_RUB, + SUPPORT_EMAIL, +} from "../content"; +import styles from "../landing.module.css"; + +/** + * Политика возврата денежных средств. + * + * ЗАЧЕМ ОТДЕЛЬНЫМ ДОКУМЕНТОМ, если раздел 8 оферты говорит то же самое. + * Порядок возврата — то, что модерация эквайера проверяет последним и отдельным + * пунктом; кроме того, у документа своя аудитория: человек, у которого уже + * списались деньги, читает не договор целиком, а страницу «как вернуть». + * Приоритет при расхождении отдан оферте — это записано и здесь (п. 1.2), и в + * самой оферте (п. 8.0), чтобы дублирование не создало второй источник истины. + * + * ОТКУДА ТЕКСТ. Редакция владельца от 13.08.2026 (docx), перенесённая + * дословно; плейсхолдер `[адрес электронной почты]` заменён на `SUPPORT_EMAIL`, + * цена и реквизиты — из `content.ts`. + * + * ЧТО ЗДЕСЬ ОПИСАНО РАНЬШЕ КОДА. Разделы 2.1 и 4 обещают АВТОМАТИЧЕСКИЙ возврат + * при техническом сбое — платёжного контура в репозитории ещё нет, значит на + * момент публикации это установленный порядок, а не наблюдаемое поведение + * системы. Так и задумано (документ публикуется до подключения эквайринга — + * без него заявку не примут), но при включении оплаты автоматический возврат + * обязан появиться в коде вместе с кнопкой, а не после неё: обещание уже + * опубликовано и является условием договора. + */ + +export const metadata: Metadata = { + title: "Политика возврата денежных средств — МЕРА", + description: + "Условия, порядок и сроки возврата денежных средств за расчёт сервиса «МЕРА».", + alternates: { canonical: PUBLIC_REFUND_URL }, +}; + +export default function MeraPublicRefundPage() { + const entity = LEGAL_ENTITY; + + return ( +
+
+ + ← На главную + + +

Политика возврата денежных средств

+

+ сервис «МЕРА» (meraocenka.ru). Редакция от {LEGAL_DOCS_REVISION} +

+ +

1. Общие положения

+

+ 1.1. Настоящая Политика определяет условия, порядок и сроки возврата + денежных средств, уплаченных Заказчиком за услугу сервиса «МЕРА» на + сайте meraocenka.ru (далее — «Услуга»), стоимость которой составляет{" "} + {SERVICE_PRICE_RUB} (сто пятьдесят) рублей за один расчёт. +

+

+ 1.2. Настоящая Политика размещена в свободном доступе в сети Интернет + по адресу {PUBLIC_REFUND_URL} и является неотъемлемой частью{" "} + + Публичной оферты + + , размещённой по адресу {PUBLIC_OFFER_URL}. Оферта и настоящая + Политика применяются совместно; в случае противоречий между ними + приоритет имеет Оферта. +

+

+ 1.3. Услуга считается оказанной с момента отображения результата + расчёта Заказчику на сайте либо направления его на указанную + Заказчиком электронную почту — в зависимости от того, что наступит + раньше. После этого момента оплата по общему правилу возврату не + подлежит, за исключением случаев, перечисленных в разделе 3 настоящей + Политики. +

+ +

2. Кто принимает решение о возврате

+

+ 2.1. Решения о возврате денежных средств по основаниям, не требующим + обращения Заказчика (технический сбой — раздел 4), принимаются + автоматически системой сайта без участия сотрудников Исполнителя. +

+

+ 2.2. Решения о возврате денежных средств по обращениям Заказчика (п. + 3.3–3.4) рассматриваются сотрудником службы поддержки Исполнителя, + ответственным за обработку почтового ящика{" "} + + {SUPPORT_EMAIL} + + . Итоговое решение по спорным или нестандартным случаям принимает + директор {entity ? entity.shortName : "Исполнителя"} либо + уполномоченное им лицо. +

+ +

3. Условия возврата

+

3.1. Возврат не производится, если:

+
    +
  • + Услуга оказана надлежащим образом — результат расчёта был + сформирован и предоставлен Заказчику; +
  • +
  • + основанием для обращения является несогласие Заказчика с полученным + числовым значением расчёта (расчёт носит индикативный характер, что + не является основанием для возврата). +
  • +
+

3.2. Возврат производится в полном объёме в следующих случаях:

+
    +
  • + технический сбой на стороне сервиса — расчёт не был предоставлен + Заказчику после оплаты (подробно — раздел 4); +
  • +
  • + Заказчик отказался от Услуги до момента её фактического оказания (то + есть до появления результата на экране или в почте); +
  • +
  • + денежные средства были списаны повторно из-за технической ошибки + платёжной формы; +
  • +
  • + оплата была произведена без согласия владельца карты — при + подтверждении этого факта банком-эмитентом. +
  • +
+

+ 3.3. Для случаев, указанных в п. 3.2 (кроме технического сбоя, который + обрабатывается автоматически), Заказчик направляет обращение на{" "} + + {SUPPORT_EMAIL} + {" "} + с указанием даты и примерного времени оплаты, суммы и последних 4 цифр + карты. +

+

+ 3.4. Срок рассмотрения обращения и возврата — не позднее 10 (десяти) + рабочих дней с момента получения обращения Исполнителем. +

+ +

4. Отдельный случай: оплата прошла, а расчёт не сформирован

+

+ 4.1. Если после успешной оплаты сервис по техническим причинам не смог + сформировать результат расчёта (сбой, ошибка обработки данных, + недоступность сервиса) в течение 15 (пятнадцати) минут с момента + оплаты, Услуга считается неоказанной. +

+

+ 4.2. Возврат в этом случае производится автоматически, в полном + объёме, без необходимости обращения Заказчика с заявлением или + претензией. +

+

+ 4.3. Срок такого автоматического возврата — не позднее 3 (трёх) + рабочих дней с момента фиксации сбоя системой. +

+

+ 4.4. Если по истечении указанного срока возврат не поступил, Заказчик + вправе обратиться на{" "} + + {SUPPORT_EMAIL} + {" "} + — такое обращение рассматривается вне очереди. +

+ +

5. Способ возврата

+

+ 5.1. Возврат денежных средств во всех случаях производится тем же + способом, которым была произведена оплата (на ту же банковскую карту), + если иной способ не согласован с Заказчиком дополнительно. +

+

+ 5.2. Срок зачисления денежных средств на счёт Заказчика после инициации + возврата зависит от банка-эмитента карты Заказчика и обычно составляет + от 1 до 30 календарных дней — это правило платёжных систем, а не + Исполнителя. +

+ +

6. Права потребителя

+

+ 6.1. Настоящая Политика не ограничивает права Заказчика — физического + лица, установленные Законом РФ от 07.02.1992 № 2300-1 «О защите прав + потребителей». В части, где условия настоящей Политики противоречили бы + указанному Закону, применяются положения Закона. +

+ +

7. Контакты по вопросам возврата

+

+ E-mail:{" "} + + {SUPPORT_EMAIL} + +

+ {entity ? ( +

+ {entity.shortName}, ИНН {entity.inn}, ОГРН {entity.ogrn} +

+ ) : null} +
+
+ ); +}