composer dump-autoload php artisan db:seed php artisan schedule:run или php artisan schedule:work
Для тестов отправки номер телефона и емейл захардкожен мой, места можно найти по TODO: delete next line
В общих чертах алгоритм таков: -по расписанию раз в минуту создается список сообщений на отправку для рассылок, чей срок подошел Канал выбирается первый в очереди для рассылки и настроек клиента (настройки клиента - заглушка ввиде геттера аттрибута)
-Email высылаются сразу по SMTP. Шаблоны емейлов тут resources\views\emails\mailing (протестировано). Результат отправки выставялется сразу. В шаблоне подставляется картинка-пиксель для отслеживания окрытиия. Статус проставляется (протестировано)
-Телеграм высылается сразу с использованием существовавшего метода в helpers (не протестировано). Результат отправки выставляется сразу.
-SMS и Whatsapp отправляются пачками по 1000 за итерацию на idigitl и встают в статус "отправляются" и по мере поступления коллбеков от сервиса статус сообщений обновляется. Для Whatsapp передается выбранный шаблон. Шаблон пока в config. Так же передается разрешенное время доставки. (не протестировано - доведено до ответа сервиса "вам не присвоено имя для отправки", коллбеки протестировал с помощью postman)
Во всех каналах перед отправкой сообщения клиент проверяется на "черный список" и если он в нем - задается соотв. статус
При ошибке отправки или коллбеке, свидетельсвующем о "недоставке" или ошибке срабатывает $message->queueNext(); - планирует сообщение следующий по порядку канал при его наличии
Каждый такт рассылки проверяем не закончились ли все сообщения, тогда помечаем ее как завершенную. Какого-то таймаута не предусмотрено, то есть если не придет какой-то колбек то так и будет.
При этом статистику можно смотреть в любой момент времени. Она появляется внизу страницы рассылки.
Менять рассылки, которые начались или завершились - нельзя. Если запланирована но не началась - можно.
Можно создавать копии рассылок с любым статусом.
Короткие ссылки - проставляются автоматом в текст - сейчас стоит только в email. В другие каналы при необходимостии копипастим - привязка идет к ID сообщения, так что все будет работать. $text = LinkCounter::shortenLinks($message->mailingList->text, $message->id); В SMS/Whatsapp это может поменять длину итоговорого сообщения!
Адрес формируется как /shorturl/{slug}/{message_id} $link->slug = base_convert($link->id, 10, 36); - то есть получится весьма коротко
Сделаны срезы по статусам доставки, статусам открытия, октрытым ссылкам. Далее на основе любого канала + статуса можно формировать сегмент (не реализовано, совместить с формой создания сегмента)
Сделано пока ввиде заглушки - обычный сегмент с статусом авто (помечено в списке) Думаю, лучше будет не делать копии сегментов на момент "планирования". Это и сложнее, и создаст накладку по времени. При отправке, максимально близко к этому событию сегмент считывается. То есть при сценариии - запланирована рассылка наовогоднего поздравления выбранным сотрудникам - автоматический сегмент обновляем при добавлении сотрудника, а при рассылке читаем состояние сегмента в момент отправки.