# Конструктор SMS со статусами заказов Для служебных SMS рекомендуем несколько равнозначных формулировок вместо одного неизменного текста. Меняется только фраза: номер заказа, статус, трек и место получения берутся из события. Разнообразие текста не гарантирует доставку и не заменяет соблюдение лимитов. Готовая реализация на PHP 8.1+: [OrderMessageBuilder.php](php/OrderMessageBuilder.php). Это чистая функция, она не обращается к API и не отправляет SMS. Поддержаны события tC8 `order_accepted`, `order_ready_for_pickup`, `order_tracking_assigned`. Наличие трека само по себе не утверждает, что заказ уже передан перевозчику. ```php require '/path/to/OrderMessageBuilder.php'; $message = \SMSFlake\OrderMessageBuilder::build( 'order_tracking_assigned', ['order_id' => 129166, 'tracking_no' => '1234567890'], $savedHistory, // [] для первого события; далее история из постоянного хранилища 'iFarfor' ); // Например: iFarfor: Номер отслеживания заказа №129166: 1234567890. ``` Для каждого типа события и канала храните `next_history` постоянно. Конструктор случайно выбирает ещё не использованный вариант; после четырёх вариантов начинается новый цикл, без немедленного повтора последнего варианта. Бесконечно уникальных формулировок конечный набор дать не может. В одной транзакции заблокируйте строку истории, прочитайте её, сформируйте SMS и сохраните новую историю вместе с текстом в исходящей очереди. Это исключает совпадения от параллельных работников. Для каждого нового события заранее сохраните постоянный уникальный `msg_id` (1–16 символов `A-Z a-z 0-9 _ : -`). При сетевой ошибке повторяйте тот же текст и тот же `msg_id`, без повторного запуска конструктора. Код API `20102` означает занятый идентификатор; сверьте сохранённое событие, а не создавайте новый ID автоматически. Передавайте `text` в поле `message` второго API SMSFlake: ```json {"from":"iFarfor","to":"79990000001","message":"iFarfor: Трек заказа №129166: 1234567890.","msg_id":"ord129166trk1"} ``` `POST /sms/v1/sms`, Basic Auth: почта аккаунта и активный API-ключ. Полученный успешный ответ подтверждает постановку в очередь, а не доставку. Ключ берите из защищённого конфига; не включайте его в шаблон, навык или журнал. При создании своего конструктора определите реальные статусы, подготовьте 3–5 равнозначных фраз на статус, проверяйте обязательные поля, кодировку и длину SMS. Не добавляйте невидимые символы, случайные опечатки, ложные сроки или обещания. История не должна хранить номера клиентов или тексты сообщений. Автоматическая отправка идёт с 10:00 включительно до 19:00 исключительно по часовому поясу аккаунта отправителя, с интервалами 60–180 секунд; ручная очередь имеет приоритет. Сохраните ограничения тарифа и телефона. При подключении tC8 обрабатывайте только новые события после включения SMS-канала, в том числе смены статуса существующего заказа. Не перечитывайте историческую очередь, старые `emailsend=0` и неудачные Telegram-уведомления.