# Страны и телефонные коды

Справочник `app/PhoneCountries.php` содержит **245 стран и территорий** с русскими названиями и международными телефонными кодами. `PhoneCountries::all()` возвращает массив по коду страны в нижнем регистре: `name`, `dial` (цифры без `+`) и `flag` (путь к локальному SVG). Порядок — по русскому названию; интерфейс может вынести Беларусь и другие часто используемые страны в отдельную группу.

Все данные и 245 флагов находятся в проекте. Страницы входа не обращаются к CDN, GitHub или внешнему справочнику. Миграция БД для списка стран не нужна. Флаги — SVG, поэтому их отображение не зависит от поддержки эмодзи в Windows.

## Поле телефона

На входе и при смене номера флаг, код и номер показаны в одной общей рамке. Нажатие на флаг/код открывает список с поиском по русскому названию, ISO-коду и телефонному префиксу. Беларусь выбрана по умолчанию; наиболее используемые направления вынесены в начало. Список управляется клавиатурой: стрелки, Enter и Escape; Home/End при пустом поиске переходят к началу/концу списка. Можно вставить полный номер с `+` или `00`, либо вводить цифры после выбранного международного кода. Смена страны сохраняет уже введённую часть номера. Автоматического удаления национальных нулей для всех стран нет: они могут быть значимыми, поэтому при сомнении следует вставлять полный международный номер. Поддерживаются прежние белорусские формы `80…` и `375…`.

Для общих кодов ручной выбор Канады/США или Казахстана/России сохраняется. Если определить территорию только по коду невозможно, используются предсказуемые значения по умолчанию; код сам по себе не доказывает страну номера. «Другая страна» позволяет ввести международный номер вручную, включая направления вне географического справочника.

Видимое поле с JavaScript содержит часть номера после кода, а на сервер по-прежнему передаётся один полный `phone`. ISO выбора нужен только интерфейсу и не меняет SMS-проверки. Без JavaScript сохраняется обычное поле полного международного номера. Страны и флаги подключены только на страницах кабинета.

Проверка интерфейса: `node tests/phone-input.cjs` — **47/47** проверок модели и событий DOM (сборка номера, общие коды, поиск, клавиатура, выбор и отправляемое значение). PHP/JS lint пройден. На обоих локальных серверах проверены HTML и новые ассеты; все 246 SVG (245 флагов и глобус) доступны через предпросмотр с типом `image/svg+xml`, выбранные основные флаги дополнительно проверены через Apache. Это проверки серверных ответов и кода, визуальная проверка нового поля в браузере в этой сессии не выполнялась.

Полный тест `tests/customer-phone-http.php` сохраняет защиту от запуска при включённой рабочей SMS-интеграции; в этой проверке интерфейса он безопасно остановился до создания тестовых данных. Настройки провайдера не переключались, реальные коды не отправлялись.

## Источники и лицензии

Снимок получен **18 октября 2026 года**. Точные ревизии и SHA-256 исходных данных/флагов сохранены в `phone-countries.sources.json`.

| Данные | Первичный источник | Лицензия |
| --- | --- | --- |
| Коды стран и набор географических территорий | [Google libphonenumber, PhoneNumberMetadata.xml](https://github.com/google/libphonenumber/blob/33be5664343676b27761213d8f5500d682568ea7/resources/PhoneNumberMetadata.xml) | [Apache License 2.0](licenses/google-libphonenumber-LICENSE.txt) |
| Русские названия | [Unicode CLDR, ru/territories.json](https://github.com/unicode-org/cldr-json/blob/91c267402229a59e3ef2774544f001bf959e8809/cldr-json/cldr-localenames-full/main/ru/territories.json) | [Unicode License V3](licenses/unicode-CLDR-LICENSE.txt) |
| Флаги 4:3 | [lipis/flag-icons](https://github.com/lipis/flag-icons/tree/ac7e0eb3259eb62aa6100c435607e2fe03896a97/flags/4x3) | [MIT](licenses/flag-icons-LICENSE.txt) |

Телефонные коды могут совпадать: например, Россия и Казахстан используют `+7`, США и Канада — `+1`. Идентификатор выбора — код страны, а не телефонный префикс. Негеографические сервисы `001` из Google исключены, поскольку у них нет страны и флага. Дополнительные территориальные коды Google/CLDR `AC`, `TA`, `XK` сохранены. Исходные файлы флагов `sh-ac.svg` и `sh-ta.svg` записаны как `ac.svg` и `ta.svg`; остальные имена совпадают.

Наличие страны в списке не означает доступность доставки SMS в этой стране. Доступность определяется договором, тарифами и настройками SMS-провайдера. Справочник не включает отправку SMS и не изменяет проверки готовности RocketSMS.

## Обновление

Инструмент `tools/update-phone-countries.py` использует только стандартную библиотеку Python. Он предназначен для ручного обслуживания, не вызывается сайтом и требует сеть только во время обновления.

```powershell
# Воспроизвести закреплённые ревизии из phone-countries.sources.json:
python tools/update-phone-countries.py

# Явно получить новые ревизии первичных источников:
python tools/update-phone-countries.py --latest
```

До записи файлов инструмент проверяет наличие русского названия, корректность телефонного кода, покрытие не менее 230 территорий и наличие SVG для каждой страны. SVG разбираются как XML; внешние ссылки, скрипты и встроенные внешние изображения запрещены. После обновления следует проверить изменения справочника/лицензий, выполнить PHP lint и проверить работу выбора страны с общими кодами `+1` и `+7`. Изменения схемы, аккаунтов и настроек SMS не требуются.
