skn писал(а):
а что именно вы хотете рассылать, когда и зачем?
как вариант формируете список номеров, например отчетом и по нему делаете рассылку...
Хочу сделать автоматизированную рассылку уведомлений клиентам о том, что у них скоро закончится учетный период, а так же сообщить им что необходимо пополнить счет. Рассылать за три дня до окончания учетного периода.
Сделать рассылку о пополниении лицевого счета (на это тут скрипт на форуме пробегал).
В идеале, использовать уже имеющуюся информацию с договора (не плодить сущности)
Было бы хорошо, если все рассылки управлялись бы из одного места.
потому как скрипты все же не обладают интерфейсом, чтобы централизованно контролировать результат их работы и взаимодействие со шлюзом смс, создавать очередь смс, и мониторить их отправку.
Воспользовавшись вашим советом (делать скриптом), я набросал небольшое т.з. для человека, предложившего мне свою помощь по написанию скрипта. По нему можно понять как я хочу решить эту задачу.
Код:
Мне нужен следующий функционал:
работа на биллинге версии 5.2 и выше;
отправка СМС за N дней до окончания учетного периода (N - настраиваемая константа = 3);
учетные периоды для модуля DialUP, номер модуля mod (mod - настраиваемая константа = 4);
телефонный номер брать из поля tel с договора ( tel - настраиваемая константа =12, тип поля "Телефон"), использовать все номера формата +79XX-XXX-XXXX и номера, в которых в комментариях к номеру написано "Мобильный";
отсылать по всем договорам, у которых статус = активен, стоит флаг fn на договоре ( fn - настраиваемая константа = 40, тип поля = флаг) и сумма на счету меньше месячной абонетской платы по тарифу, который будет действовать на договоре на планируемую дату активации следующего учетного периода.
Сумма на счету - брать с договора;
Сумма абонентской платы по тарифу - брать из таблицы в базе bgbilling'a SQL запросом
SELECT `cost` FROM `tariff_cost` WHERE `tpid` = tpid; (где tpid - id тарифа на договоре пользователя, который будет действовать на договоре на планируемую дату активации следующего учетного периода);
шаблон сообщения брать из файла заданного констатной sms_tpl ( sms_tpl = /home/bgbilling/BGBillingServer/data/sms_period_notify.txt ). Шаблон содержит полный текст сообщения, формат - plain text, кодировка UTF8. Перед отправкой сообщения заменить в шаблоне:
%username% на ФИО пользователя из договора (id параметра договора, содержащего ФИО абонента задаетя констатной cFio = 6, тип параметра "текстовое поле")
%dogovor% - номер договора;
%balans% - состояние лицевого счета на договоре, формате # ### округлена до целого в меньшую сторону;
%tarifpay% - абонентская плата по тарифу, который будет действовать на договоре на планируемую дату активации следующего учетного периода (из таблицы tariff_cost базы данных биллинга в mySQL), в формате # ### округлена до целого в большую сторону;
%tarifname% - название тарифного плана, который будет действовать на договоре на планируемую дату активации следующего учетного периода;
%needtopay% - сумма к оплате, вычисляется как min(0, (%tarifpay% - %balans%)), формате # ### округлена до целого в большую сторону;
%period_end% -дата окончания учетного периода;
%period_start% - дата начала СЛЕДУЮЩЕГО учетного периода (по сути это %period_end% + 1 day);
Даты %period_end% и %period_start% в сообщение вставлять в формате dd.mm.yyyy;
отсылать через шлюз MTS (описание протокола: http://www.mcommunicator.ru/m2m/m2m_api ... endMessage)
настраиваемые параметры для работы со шлюзом MTS: (mts_naming,mts_login, mts_password - задаются константами);
способ работы со шлюзом MTS - любой, на ваше усмотрение;
записывать в лог скриптов поведения для договоров факт выполнения скрипта и результат операции;
записывать в лог файл logname (logname = '/home/bgbilling/logs/send_sms.log') в формате
дату и время события, описание события следующие события:
начало выполнения скрипта, все возникающие ошибки в процессе работы скрипта, окончание работы скрипта, итог работы скрипта (сколько времени выполнялся скрипт, сколько пользователей обработано, сколько сообщений отправлено, сколько из них неуспешно);