# Квиз-лендинги

*Для разработчиков. Состояние на 25.09.2026. Подробности, переменные и выкатка — README репозиториев `Buharestskie/mfctest`, `do-nula-refinancing-2`, `bfl_fspp`, `mfcspisan`. Что видит отдел продаж — статья «Заявки с лендингов».*

## Коротко

Четыре лендинга-квиза — лидогенераторы отдела продаж. Посетитель отвечает на несколько вопросов и оставляет телефон, лендинг заводит в amoCRM контакт и сделку, а три из четырёх — ещё и примечание с ответами (у `do-nula-refinancing-2` примечания нет: ответы только в полях сделки). Своей бизнес-логики у них почти нет: сборка заявки, лимиты от спама и, у трёх из четырёх, код из SMS.

<table id="bkmrk-%D0%A0%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B9%D0%A1%D0%B0%D0%B9%D1%82%D0%A7%D1%82%D0%BE-%D0%BE"><thead><tr><th>Репозиторий</th><th>Сайт</th><th>Что обещает</th><th>Воронка → этап</th><th>После телефона</th><th>Где живёт</th></tr></thead><tbody><tr><td>`do-nula-refinancing-2`</td><td>реструктуризация.online</td><td>реструктуризация долгов</td><td>«Продажи МПП» → «Квалификация»</td><td>код из SMS</td><td>`global`</td></tr><tr><td>`bfl_fspp`</td><td>fssp.site</td><td>проверка долгов по базе ФССП (обращения к ФССП в коде нет)</td><td>«Продажи МПП» → «Квалификация»</td><td>код из SMS</td><td>`global`</td></tr><tr><td>`mfcspisan`</td><td>mfcspisan.ru</td><td>списание долгов через МФЦ</td><td>«Продажи МПП» → «Квалификация»</td><td>код из SMS</td><td>сторонний сервер, доступа нет</td></tr><tr><td>`mfctest`</td><td>mfctest.ru</td><td>списание долгов через МФЦ</td><td>«МПП ИИ-агент» → «Новый лид Тест»</td><td>ссылка в мессенджер, бот монолита donula</td><td>`global`</td></tr></tbody></table>

## Родословная

Первым был `do-nula-refinancing-2` (апрель 2026). `bfl_fspp` — его форк, `mfcspisan` — форк `bfl_fspp`: файлы бэкенда местами совпадают байт в байт, `requirements.txt` одинаковый у всех. `mfctest` стоит особняком: это лендинг `pages/dolgimfc`, вырезанный из монолита donula, с переписанным бэкендом. Аудит 11.09.2026 рекомендовал слить четыре лендинга в один параметризуемый — различаются набор вопросов, домен, воронка и тексты, ровно то, что выносится в конфиг. Не сделано.

## Как устроен каждый

- **Один процесс FastAPI** (Python 3.12, httpx) раздаёт статику лендинга и несколько JSON-ручек. Redis — коды из SMS и лимиты по IP. Базы нет. У `mfctest` статику отдаёт nginx прямо с диска, бэкенд видит только `/quiz/`.
- **В amoCRM лендинги сами не ходят** — только через шлюз [amocrm-service](https://wiki.donula26.ru/books/razrabotka/page/kak-xodit-v-amocrm-iz-svoego-servisa), который держит токен, лимит и квоты. Шлюз пускает только адреса из своего allowlist: сети контейнеров на `global` и адрес стороннего сервера `mfcspisan`. Переехал лендинг — поправить allowlist, иначе анкета отвечает `502`.
- **SMS** — через `beeline-service`. У `do-nula` и `bfl_fspp` первый код запрашивает фронт после отрисовки страницы ввода кода, у `mfcspisan` — сервер внутри `/quiz/submit`.
- **Сделка создаётся до подтверждения кода.** Проверка кода в amoCRM ничего не пишет, подтверждённые и неподтверждённые заявки в воронке не различить.
- **ID воронок, этапов, полей и тегов — константы в `app/constants.py`.** Пересоздали поле в amoCRM — правка кода и пересборка образа.
- **Юридические документы** (`legal/` у трёх лендингов, с 22.09.2026): каждая редакция — отдельный файл с датой в имени, старые остаются доступны по адресу с датой, дата действующей редакции согласия пишется в сделку. Существующий файл не правят — добавляют новый. Документы запечены в образ: новая редакция появится после пересборки. У `bfl_fspp` этого обновления нет.

## mfctest: две сделки

После телефона сделка «Лид с сайта» создаётся сразу, SMS нет. Потом посетитель выбирает мессенджер, ссылка ведёт в бота монолита donula с параметром `ai-<id сделки>`. Бот заводит **свою** сделку «ИИ Лид» в той же воронке и записывает строку `ai-<id>` в её поле; сделку лендинга он не трогает. Связь двух сделок — только эта строка.

## Выкатка

- `do-nula-refinancing-2`, `bfl_fspp`, `mfctest` — на `global` git-клоны `main`: `git pull --ff-only` и `docker compose up -d --build`. У всех трёх есть внешняя проба («Реструктуризация долгов», «Проверка по ФССП», «Анкета МФЦ», на статус-странице скрыты) — выкатка в окне обслуживания.
- `mfctest`: статику nginx берёт прямо с диска, после `git pull` она уже на сайте; пересборка нужна для бэкенда и документов.
- `mfcspisan` — на стороннем сервере, как он там выкатывается, неизвестно; пробы у нас нет.

## На что наступают

- **Домен `mfctest.ru` ещё указывает на старый сервер `app`.** Пока app жив, трафик идёт через него, и проба смотрит туда же. Перед выключением app A-запись нужно переключить.
- **У `mfctest` корень сайта совпадает с корнем проекта.** Всё, что не закрыто в nginx, видно снаружи — включая README и compose. Секреты в репозиторий не класть.
- **Кнопка «Изменить номер»** у `do-nula` создаёт новые контакт и сделку, у `bfl_fspp` и `mfcspisan` меняет телефон у того же контакта.
- **Сбой после создания сделки даёт дубль.** Если упал запрос примечания или отправка SMS, посетитель видит ошибку, а сделка уже есть — повторная отправка создаст вторую.
- **Сборка на `global` ходит в зеркало PyPI** (прописано в `Dockerfile` через `ENV`): прямой PyPI из сети сборки недоступен. У `mfcspisan` зеркала нет — при переносе на `global` сборка упадёт.
- **Без файла согласия в `legal/soglasie/` каждая анкета падает с `500`:** дата редакции обязательна для сделки.
- **Кэш браузера.** Скрипты подключены с меткой версии в адресе — после правки JS/CSS её нужно поменять в HTML.