# Проверка кабинета и телефонного входа 18.10.2026

Проверено локально: PHP 8.1, MariaDB 3306, Apache `http://flowers.local` и PHP-предпросмотр `http://127.0.0.1:8097`. Размещение на публичном сервере не выполнялось.

## Результаты

| Проверка | Результат |
|---|---|
| `tests/customer-calendar.php` | 74/74: аккаунты, телефонный вход и повторное подтверждение, смена номера/версии сессии, изоляция владельцев, даты и високосный год, согласия, экспорт и удаление |
| `tests/sms.php` | 88/88: подменённый провайдер и временные SQL-таблицы, протокол, лимиты OTP, сессия/назначение, очередь, дубли/конкуренция, окно отправки, неизвестный результат, статусы, отпечаток аккаунта, отключения и отзыв |
| `tests/customer-http.php` | 66/66 отдельно на каждом сервере: формы, отсутствие email/password входа, disabled OTP 503 без создания аккаунта, CSRF, CRUD/IDOR, экспорт, согласия, необязательная почта, роли админки |
| `tests/customer-phone-http.php` | 27/27: полный HTTP-путь запроса/проверки кода, создания аккаунта, повторного входа, переподтверждения и смены номера на изолированном loopback-сервере с подменой SMS; рабочий код/конфигурация не изменяются |
| `tests/backend.php` | 45/45: заказы/цены/остатки/доставка, привязка владельца только сервером, отклонение подмены и изменения владельца при повторе |
| `tests/seo.php` | 18/18 |
| `tests/routes.php` | 20/20 отдельно на каждом сервере |
| `tests/catalog-import.php` | 61/61 через Apache с `tmp/catalog-import-20261018-final/manifest.json`: импортированные тексты, цены, изображения, галереи и подборки |
| JavaScript | `node --check` для `public/assets/account.js` и `public/assets/app.js` без ошибок |

PHP lint для файлов `app`, `public`, `tools`, `tests` выполнен без ошибок. Тестовые записи покупателей, событий, заказов и администраторов удалены/откачены; реальные товары не изменены. Для успешных авторизованных HTTP-сценариев применялись закрытые тестовые сессии, сформированные CLI: это проверка маршрутов и прав, а не доказательство получения настоящего SMS-кода. Публичного обхода авторизации в приложении нет.

## Миграция и фон

Обновлённая схема применена командой `tools/migrate-customer.php --apply`. Последняя полная резервная копия: `storage/backups/customer-schema-20261018-183742-5f0b077385`, SHA-256 SQL-файла `e4db47a9e40c2f82461bf80cbbb95fb01e4226baded413a8859a8fa58c8f70f2`. Команда подтвердила сохранность всех исходных столбцов/строк. Добавлены таблицы покупателей, событий, согласий и SMS; nullable связь заказа с покупателем и роль администратора. Email допускает NULL для аккаунтов по телефону.

Установлено задание Windows `LaFleur-SMS-flowers.local`, ежеминутно, текущий пользователь, Limited, скрытый запуск, без наложения экземпляров. Два последовательных запуска подтверждены в 18:48:18 и 18:49:18 Europe/Minsk; последующие heartbeat также успешны. Режим Interactive требует вошедшего пользователя; для публичного сервера нужен собственный cron/служебный планировщик. Подробности: [планировщик](sms-scheduler.md).

## Границы проверки

RocketSMS остаётся без учётных данных: `enabled=false`, `dry_run=true`, `verification_available=false`. Настоящий вход по телефону, международная доставка кодов, баланс рабочего кабинета, имя отправителя и доставка контрольного напоминания не проверены. Платных сообщений не отправляли. Информационные и рекламные отправки не включены. Перед рабочим запуском нужны настройки и проверки из [инструкции интеграции](sms-setup.md), включая утверждение юридических документов ответственным лицом.

Автоматическая проверка доступа отклонила открытие локального сайта в браузере. Визуальная проверка новых страниц и мобильного календаря поэтому не завершена; HTTP-проверки и анализ адаптивного CSS не заменяют такую проверку. Старые скриншоты магазина не являются доказательством внешнего вида нового кабинета.

Основная инструкция и перечень файлов: [личный кабинет](customer-account.md). Источники и конкретные юридические ограничения: [правовая записка](account-legal-research.md).
