# Контроль переноса — демонстрация

Рабочий пример для портфолио: перенос трёх полей контакта с предварительной
проверкой, защитой занятых значений, журналом и откатом. Все десять записей,
имена, организации и адреса полностью синтетические. Адреса используют
зарезервированный домен `.example`.

Это самостоятельная демонстрация алгоритма и интерфейса. Она не является
выполненным клиентским проектом, не подключается к Pyrus и не заявляет
совместимость с его API.

## Запуск

Откройте `index.html` двойным кликом в современном браузере. Интернет, установка
зависимостей и сервер не нужны. Папку можно скопировать целиком на другой
компьютер. Также поддерживается обычный статический HTTP-хостинг.

## Что проверить

1. Нажмите **«Проверить перенос»**. Данные не изменятся. Сводка покажет:
   4 записи к переносу, 3 совпадающие, 2 конфликта, 1 ошибку.
2. В таблице зелёным показаны будущие значения. Правила: удалить пробелы по
   краям имени/email, привести email к нижнему регистру, преобразовать A/B/C
   в Премиум/Стандарт/Базовый.
3. Нажмите **«Перенести записи»**. Изменятся 4 записи и 11 полей. Записи с
   конфликтом или ошибкой не меняются целиком. Исходные данные сохранятся
   в резервной копии в памяти вкладки; сведения об изменениях попадут в журнал.
4. Нажмите **«Повторить проверку»**. Получится 0 новых изменений и 7 совпадающих
   записей. Две конфликтные и одна ошибочная запись по-прежнему пропускаются.
5. **«Скачать JSON»** экспортирует текущие данные, предварительный план (если
   проверка выполнена), журнал и резервную копию (если перенос выполнен).
6. **«Откатить перенос»** вернёт исходный пакет. Проверку нужно выполнить заново.
7. **«Начать заново»** восстанавливает демонстрационные данные и очищает журнал.

## Ограничения

- Набор и правила встроены. Импорта произвольных пользовательских файлов нет.
- Данные и резервная копия находятся только в оперативной памяти вкладки:
  перезагрузка страницы сбрасывает их. Для сохранения доступен экспорт JSON.
- Никаких сетевых запросов, аналитики, cookie и внешних библиотек нет.
- Нет реальной базы, внешних API, авторизации, обработки параллельных изменений,
  транзакций сервера или долговременного хранения. Эти части нужны при переносе
  подхода в рабочую интеграцию.
- Email проверяется синтаксически, существование почтового ящика не проверяется.
- Алгоритм останавливает применение устаревшего плана и откат при изменении
  данных после переноса. В пользовательском интерфейсе редактирования нет.

## Устройство

- `engine.js` — независимый от DOM алгоритм; доступен браузеру и Node.js.
- `app.js` — интерфейс, состояния, журнал и экспорт.
- `styles.css` — адаптивное оформление, управление с клавиатуры.
- `engine.test.cjs` — проверки алгоритма встроенным Node Test Runner.

## Автоматические проверки

В папке этого демо выполните:

```sh
node --test engine.test.cjs
```

Проверяются классификация, отсутствие изменений при предварительной проверке,
защита занятых полей, резервирование, повторный запуск без изменений, точный
откат, отказ для устаревшего плана, повторяющиеся ID и некорректные данные.

Визуальную проверку проводите отдельно: desktop/mobile, прокрутка таблицы,
управление клавиатурой, полный сценарий переноса и выгрузка JSON.
