Advertisement
apog

send_sms_utm.php

Dec 23rd, 2014
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 9.49 KB | None | 0 0
  1. #!/usr/bin/php
  2.  
  3. <?PHP
  4.  
  5. # Скрипт отправки SMS напоминаний о пополнении счета абонентам UTM
  6. # Используется демон smsd (SMSTools)
  7. # Рассылку производить ближе к концу месяца
  8. # Если сегодня выходной или праздник, то рассылка не производится
  9. # Так же рассылка не производится, если на счете недостаточно средств для рассылки всем абонентам
  10.  
  11. require_once (dirname(__FILE__).'/config.php');
  12. require_once (dirname(__FILE__).'/lib/class_db.php');
  13. require_once (dirname(__FILE__).'/lib/str_func.php');
  14.  
  15. $my_session = new mysql_db(UTM_DB_HOST, UTM_DB_NAME, UTM_DB_USER, UTM_DB_PASS);
  16.  
  17. $day_of_month = date('j'); // текущее число месяца
  18. $day_of_week = date('w'); // текущий день недели: 0 - воскресенье, 6 - суббота
  19. $full_date = date('Y-m-d'); // текущая дата
  20. $log_file = "send_sms_utm.log";
  21.  
  22. // Форматируем телефонные номера
  23. function phone_string_to_array($string) {
  24.     if ($string <> '') {
  25.         $trans = array(" " => "", ";" => ",", "+7" => "", "-" => "", "/" => ","); // удаляем в номере телефона пробелы, дефизы, +7...
  26.         $in_str = strtr($string, $trans);
  27.         $result = explode(',',$in_str);
  28.         return $result;
  29.     }
  30.     else {
  31.         $result = array();
  32.         return $result;
  33.     }
  34. }
  35.  
  36. // Транслируем номер месяца в его название
  37. function get_name_of_month($month) {
  38.     switch ($month) {
  39.         case 1:  $result = 'январь';break;
  40.         case 2:  $result = 'февраль';break;
  41.         case 3:  $result = 'март';break;
  42.         case 4:  $result = 'апрель';break;
  43.         case 5:  $result = 'май';break;
  44.         case 6:  $result = 'июнь';break;
  45.         case 7:  $result = 'июль';break;
  46.         case 8:  $result = 'август';break;
  47.         case 9:  $result = 'сентябрь';break;
  48.         case 10: $result = 'октябрь';break;
  49.         case 11: $result = 'ноябрь';break;
  50.         case 12: $result = 'декабрь';break;
  51.         default: $result = 'следующий месяц';
  52.     }
  53.     return $result;
  54. }
  55.  
  56. // Название следующего месяца
  57. $next_month = get_name_of_month(date('m', mktime(0, 0, 0, date('m')+1, 1, date('Y'))));
  58.  
  59. // Если сегодня суббота или воскресенье, то не производим рассылку
  60. if ($day_of_week > 0 and $day_of_week < 6) {
  61.     // Если сегодняшний день имеется в файле holiday.txt, то тоже не рассылаем SMS
  62.     $holiday = file('holiday.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); // получаем содержимое файла в массив
  63.     if (!in_array($full_date, $holiday)) {
  64.     // Сделаем запрос в БД
  65.     $sql = "SELECT users.basic_account AS aid, periodic_services_data.cost as tariff,
  66.         round(accounts.balance,2) as balance,
  67.         (round(periodic_services_data.cost - accounts.balance,2)) as doplata,
  68.         users.mobile_telephone as phone
  69.         FROM users
  70.         INNER JOIN accounts ON (users.basic_account = accounts.id)
  71.         INNER JOIN account_tariff_link ON (accounts.id = account_tariff_link.account_id)
  72.         INNER JOIN tariffs_services_link ON (account_tariff_link.next_tariff_id = tariffs_services_link.tariff_id)
  73.         LEFT OUTER JOIN periodic_services_data ON (tariffs_services_link.service_id = periodic_services_data.id)
  74.         WHERE users.is_deleted = 0 AND  accounts.is_deleted = 0 AND
  75.         account_tariff_link.is_deleted = 0 AND tariffs_services_link.is_deleted = 0 AND
  76.         periodic_services_data.is_deleted = 0 AND periodic_services_data.discount_method = 1 AND
  77.         periodic_services_data.cost > 0 AND accounts.balance + accounts.credit < periodic_services_data.cost AND
  78.         accounts.is_blocked = 0 AND accounts.unlimited = 0 AND
  79.         users.mobile_telephone IS NOT NULL AND
  80.         users.mobile_telephone != '' AND
  81.         users.mobile_telephone NOT LIKE '%!%'
  82.         ORDER BY aid";
  83.     $myres = $my_session->select_assoc_all($sql);
  84.     // Обходим массив и перегоняем данные в другой массив, разделяя телефоны по одному на запись
  85.     $arr = array();
  86.     $id = 0;
  87.     foreach($myres as $row) {
  88.         $phones = phone_string_to_array($row['phone']);
  89.         for ($i = 0; $i < count($phones); $i++) {
  90.         $arr[$id]['aid'] = $row['aid'];
  91.         $arr[$id]['balance'] = $row['balance'];
  92.         $arr[$id]['tariff'] = $row['tariff'];
  93.         $arr[$id]['phone'] = $phones[$i];
  94.         $id++;
  95.         }
  96.     }
  97.     // Количество SMS для рассылки
  98.     $count = count($arr);
  99.     // Расчетная стоимость текущей рассылки (двойной тариф, т. к. в сообщении более 70 знаков)
  100.     $cost_of_delivery = round($count*PRICE_OF_SMS*2,2);
  101.     // Текущий баланс на SIM'ке
  102.     $current_balance = round(file_get_contents('/opt/smsd_scripts/balance.txt'),2);
  103.     // Текущий баланс на SIM'ке за вычетом резерва, чтобы всегда оставались деньги на более важные SMS
  104.     $current_balance_without_reserve = round($current_balance-BALANCE_RESERVE,2);
  105.     // Формируем строку лога
  106.     $log_str = date("Y-m-d H:i:s").
  107.             " - Баланс перед рассылкой: ".$current_balance.
  108.             ", Количество SMS для рассылки: ".$count.
  109.             ", Расчетная стоимость текущей рассылки: ".$cost_of_delivery."\n";
  110.     file_put_contents($log_file, $log_str, FILE_APPEND | LOCK_EX);
  111.     // Проверим достаточно ли средств на балансе, чтобы произвести рассылку
  112.     if ($cost_of_delivery <= $current_balance_without_reserve) {
  113.         // Обходим массив
  114.         foreach($arr as $row) {
  115.         $phone = $row['phone'];
  116.         $message = iconv("UTF-8", "UCS-2BE",
  117.                 "ПРОВАЙДЕР: Не забудьте пополнить Интернет-счет на ".$next_month.". Договор:"
  118.                 .$row['aid']." Текущий баланс:".$row['balance']."р.");
  119.         // Если формат номера телефона верный, то работаем с ним
  120.         if (strlen($phone) == 10 and substr($phone,0,1) == 9) {
  121.             $out_arr = array(
  122.                 "To: 7".$phone."\n",
  123.                 "Alphabet: UCS2\n",
  124.                 "UDH: false\n\n",
  125.                 $message);
  126.             // Путь и имя формируемого файла
  127.             $file = tempnam("/tmp", "sms_7".$phone."_");
  128.             // Записываем массив в sms-файл
  129.             file_put_contents($file, $out_arr, LOCK_EX);
  130.             // Меняем владельца файла
  131.             chown($file, "smsd");
  132.             // Перемещаем готовый файл в spool для отправки абоненту
  133.             rename($file, "/var/spool/sms/outgoing/".basename($file));
  134.             // Формируем строку лога
  135.             $log_str = date("Y-m-d H:i:s").
  136.                 " - Л/С: ".$row['aid'].
  137.                 ", баланс: ".$row['balance'].
  138.                 ", тариф сл. р/п: ".$row['tariff'].
  139.                 ", тел: ".$phone."\n";
  140.             file_put_contents($log_file, $log_str, FILE_APPEND | LOCK_EX);
  141.         } // проверка формата номера телефона
  142.         else {
  143.             $log_str = date("Y-m-d H:i:s").
  144.                 " - Неверный формат номера телефона. Л/С: ".$row['aid'].
  145.                 ", баланс: ".$row['balance'].
  146.                 ", тариф сл. р/п: ".$row['tariff'].
  147.                 ", тел: ".$phone."\n";
  148.             file_put_contents($log_file, $log_str, FILE_APPEND | LOCK_EX);
  149.             // Отправляем себе письмо с сообщением о неверном формате номера
  150.             $body = "В UTM5 неверно внесен номер телефона.".PHP_EOL
  151.                 ."Дата: ".$full_date.PHP_EOL
  152.                 ."Лицевой счет абонента: ".$row['aid'].PHP_EOL
  153.                 ."Номер телефона: ".$phone;
  154.             mailinform($body);
  155.         }
  156.         } // конец обхода массива
  157.     } // проверка баланса
  158.     else {
  159.         $log_str = date("Y-m-d H:i:s").
  160.             " - Недостаточно средств на балансе. Рассылка не произведена\n";
  161.         file_put_contents($log_file, $log_str, FILE_APPEND | LOCK_EX);
  162.         // Отправляем себе письмо с сообщением, что необходимо пополнить баланс на SIM'ке
  163.         $body = "Средств на номере +70987654321 недостаточно для рассылки SMS.".PHP_EOL
  164.         ."Дата: ".$full_date.PHP_EOL
  165.         ."Текущий баланс: ".$current_balance." руб.".PHP_EOL
  166.         ."Резерв баланса: ".BALANCE_RESERVE." руб.".PHP_EOL
  167.         ."Количество SMS для доставки: ".$count.PHP_EOL
  168.         ."Стоимость доставки 1-й SMS: ".round(PRICE_OF_SMS*2, 2)." руб.".PHP_EOL
  169.         ."Расчетная стоимость текущей рассылки: ".$cost_of_delivery." руб.".PHP_EOL.PHP_EOL
  170.         ."Рассылка не произведена.";
  171.         mailinform($body);
  172.     }
  173.     } // проверка праздничных дней
  174.     // else { echo "Сегодня праздник".PHP_EOL; }
  175. } // проверка дня недели
  176. // else { echo "Сегодня не рабочий день".PHP_EOL; }
  177. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement