Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/php
- <?PHP
- # Скрипт отправки SMS напоминаний о пополнении счета абонентам UTM
- # Используется демон smsd (SMSTools)
- # Рассылку производить ближе к концу месяца
- # Если сегодня выходной или праздник, то рассылка не производится
- # Так же рассылка не производится, если на счете недостаточно средств для рассылки всем абонентам
- require_once (dirname(__FILE__).'/config.php');
- require_once (dirname(__FILE__).'/lib/class_db.php');
- require_once (dirname(__FILE__).'/lib/str_func.php');
- $my_session = new mysql_db(UTM_DB_HOST, UTM_DB_NAME, UTM_DB_USER, UTM_DB_PASS);
- $day_of_month = date('j'); // текущее число месяца
- $day_of_week = date('w'); // текущий день недели: 0 - воскресенье, 6 - суббота
- $full_date = date('Y-m-d'); // текущая дата
- $log_file = "send_sms_utm.log";
- // Форматируем телефонные номера
- function phone_string_to_array($string) {
- if ($string <> '') {
- $trans = array(" " => "", ";" => ",", "+7" => "", "-" => "", "/" => ","); // удаляем в номере телефона пробелы, дефизы, +7...
- $in_str = strtr($string, $trans);
- $result = explode(',',$in_str);
- return $result;
- }
- else {
- $result = array();
- return $result;
- }
- }
- // Транслируем номер месяца в его название
- function get_name_of_month($month) {
- switch ($month) {
- case 1: $result = 'январь';break;
- case 2: $result = 'февраль';break;
- case 3: $result = 'март';break;
- case 4: $result = 'апрель';break;
- case 5: $result = 'май';break;
- case 6: $result = 'июнь';break;
- case 7: $result = 'июль';break;
- case 8: $result = 'август';break;
- case 9: $result = 'сентябрь';break;
- case 10: $result = 'октябрь';break;
- case 11: $result = 'ноябрь';break;
- case 12: $result = 'декабрь';break;
- default: $result = 'следующий месяц';
- }
- return $result;
- }
- // Название следующего месяца
- $next_month = get_name_of_month(date('m', mktime(0, 0, 0, date('m')+1, 1, date('Y'))));
- // Если сегодня суббота или воскресенье, то не производим рассылку
- if ($day_of_week > 0 and $day_of_week < 6) {
- // Если сегодняшний день имеется в файле holiday.txt, то тоже не рассылаем SMS
- $holiday = file('holiday.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); // получаем содержимое файла в массив
- if (!in_array($full_date, $holiday)) {
- // Сделаем запрос в БД
- $sql = "SELECT users.basic_account AS aid, periodic_services_data.cost as tariff,
- round(accounts.balance,2) as balance,
- (round(periodic_services_data.cost - accounts.balance,2)) as doplata,
- users.mobile_telephone as phone
- FROM users
- INNER JOIN accounts ON (users.basic_account = accounts.id)
- INNER JOIN account_tariff_link ON (accounts.id = account_tariff_link.account_id)
- INNER JOIN tariffs_services_link ON (account_tariff_link.next_tariff_id = tariffs_services_link.tariff_id)
- LEFT OUTER JOIN periodic_services_data ON (tariffs_services_link.service_id = periodic_services_data.id)
- WHERE users.is_deleted = 0 AND accounts.is_deleted = 0 AND
- account_tariff_link.is_deleted = 0 AND tariffs_services_link.is_deleted = 0 AND
- periodic_services_data.is_deleted = 0 AND periodic_services_data.discount_method = 1 AND
- periodic_services_data.cost > 0 AND accounts.balance + accounts.credit < periodic_services_data.cost AND
- accounts.is_blocked = 0 AND accounts.unlimited = 0 AND
- users.mobile_telephone IS NOT NULL AND
- users.mobile_telephone != '' AND
- users.mobile_telephone NOT LIKE '%!%'
- ORDER BY aid";
- $myres = $my_session->select_assoc_all($sql);
- // Обходим массив и перегоняем данные в другой массив, разделяя телефоны по одному на запись
- $arr = array();
- $id = 0;
- foreach($myres as $row) {
- $phones = phone_string_to_array($row['phone']);
- for ($i = 0; $i < count($phones); $i++) {
- $arr[$id]['aid'] = $row['aid'];
- $arr[$id]['balance'] = $row['balance'];
- $arr[$id]['tariff'] = $row['tariff'];
- $arr[$id]['phone'] = $phones[$i];
- $id++;
- }
- }
- // Количество SMS для рассылки
- $count = count($arr);
- // Расчетная стоимость текущей рассылки (двойной тариф, т. к. в сообщении более 70 знаков)
- $cost_of_delivery = round($count*PRICE_OF_SMS*2,2);
- // Текущий баланс на SIM'ке
- $current_balance = round(file_get_contents('/opt/smsd_scripts/balance.txt'),2);
- // Текущий баланс на SIM'ке за вычетом резерва, чтобы всегда оставались деньги на более важные SMS
- $current_balance_without_reserve = round($current_balance-BALANCE_RESERVE,2);
- // Формируем строку лога
- $log_str = date("Y-m-d H:i:s").
- " - Баланс перед рассылкой: ".$current_balance.
- ", Количество SMS для рассылки: ".$count.
- ", Расчетная стоимость текущей рассылки: ".$cost_of_delivery."\n";
- file_put_contents($log_file, $log_str, FILE_APPEND | LOCK_EX);
- // Проверим достаточно ли средств на балансе, чтобы произвести рассылку
- if ($cost_of_delivery <= $current_balance_without_reserve) {
- // Обходим массив
- foreach($arr as $row) {
- $phone = $row['phone'];
- $message = iconv("UTF-8", "UCS-2BE",
- "ПРОВАЙДЕР: Не забудьте пополнить Интернет-счет на ".$next_month.". Договор:"
- .$row['aid']." Текущий баланс:".$row['balance']."р.");
- // Если формат номера телефона верный, то работаем с ним
- if (strlen($phone) == 10 and substr($phone,0,1) == 9) {
- $out_arr = array(
- "To: 7".$phone."\n",
- "Alphabet: UCS2\n",
- "UDH: false\n\n",
- $message);
- // Путь и имя формируемого файла
- $file = tempnam("/tmp", "sms_7".$phone."_");
- // Записываем массив в sms-файл
- file_put_contents($file, $out_arr, LOCK_EX);
- // Меняем владельца файла
- chown($file, "smsd");
- // Перемещаем готовый файл в spool для отправки абоненту
- rename($file, "/var/spool/sms/outgoing/".basename($file));
- // Формируем строку лога
- $log_str = date("Y-m-d H:i:s").
- " - Л/С: ".$row['aid'].
- ", баланс: ".$row['balance'].
- ", тариф сл. р/п: ".$row['tariff'].
- ", тел: ".$phone."\n";
- file_put_contents($log_file, $log_str, FILE_APPEND | LOCK_EX);
- } // проверка формата номера телефона
- else {
- $log_str = date("Y-m-d H:i:s").
- " - Неверный формат номера телефона. Л/С: ".$row['aid'].
- ", баланс: ".$row['balance'].
- ", тариф сл. р/п: ".$row['tariff'].
- ", тел: ".$phone."\n";
- file_put_contents($log_file, $log_str, FILE_APPEND | LOCK_EX);
- // Отправляем себе письмо с сообщением о неверном формате номера
- $body = "В UTM5 неверно внесен номер телефона.".PHP_EOL
- ."Дата: ".$full_date.PHP_EOL
- ."Лицевой счет абонента: ".$row['aid'].PHP_EOL
- ."Номер телефона: ".$phone;
- mailinform($body);
- }
- } // конец обхода массива
- } // проверка баланса
- else {
- $log_str = date("Y-m-d H:i:s").
- " - Недостаточно средств на балансе. Рассылка не произведена\n";
- file_put_contents($log_file, $log_str, FILE_APPEND | LOCK_EX);
- // Отправляем себе письмо с сообщением, что необходимо пополнить баланс на SIM'ке
- $body = "Средств на номере +70987654321 недостаточно для рассылки SMS.".PHP_EOL
- ."Дата: ".$full_date.PHP_EOL
- ."Текущий баланс: ".$current_balance." руб.".PHP_EOL
- ."Резерв баланса: ".BALANCE_RESERVE." руб.".PHP_EOL
- ."Количество SMS для доставки: ".$count.PHP_EOL
- ."Стоимость доставки 1-й SMS: ".round(PRICE_OF_SMS*2, 2)." руб.".PHP_EOL
- ."Расчетная стоимость текущей рассылки: ".$cost_of_delivery." руб.".PHP_EOL.PHP_EOL
- ."Рассылка не произведена.";
- mailinform($body);
- }
- } // проверка праздничных дней
- // else { echo "Сегодня праздник".PHP_EOL; }
- } // проверка дня недели
- // else { echo "Сегодня не рабочий день".PHP_EOL; }
- ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement