Отчет о пропущенных за день звонках на почту

    Потребовался скрипт для одного из клиентов, для уведомления на почту о пропущенных за день звонках. Возможно он и не сильно мудреный, но думаю и другим может пригодиться. В запросе выбираются данные о неотвеченных входящих звонках за вчерашний день. Такая информация довольно актуальна многим организациям, ведь если клиенты не дозвонились им, могут дозвониться другим. На сервере установлен Asterisk 1.6, СУБД MySQL

    Вот сам скрипт:
    <?php
    
    /* Переменные для соединения с базой данных */ 
    $hostname = "localhost"; 
    $username = "dbuser"; 
    $password = "dbpass"; 
    $dbName = "dbname"; 
    
    /* Таблица MySQL, в которой хранятся данные */ 
    $cdrtable = "cdr"; 
    
    /* Переменные для определения вчерашней даты */ 
    $time = mktime(date('H'), date('i'), date('s'), date('m'), date('d')-1, date('Y'));
    $ydate = date("d.m.Y", $time);
    
    /* создать соединение */ 
    mysql_connect($hostname,$username,$password) OR DIE("Не могу создать соединение "); 
    
    /* выбрать базу данных. Если произойдет ошибка - вывести ее */ 
    mysql_select_db($dbName) or die(mysql_error());
    
    /* запрос данных . номерация у нас трехзначная, поэтому LENGTH(  `src` ) >3, отсекаем исходящие вызовы */ 
    $query = "SELECT  `dst` ,  `src` ,  `duration` ,  `dstchannel` ,  `calldate`
    	  FROM  `cdr`
    	  WHERE DATE_SUB( CURDATE( ) , INTERVAL 1 DAY ) <=  `calldate`
    		AND CURDATE( ) >  `calldate`
    		AND  `disposition` =  'NO ANSWER'
    		AND LENGTH(  `src` ) >3"; 
    
    /* Выполнить запрос. Если произойдет ошибка - вывести ее. */ 
    $res=mysql_query($query) or die(mysql_error());
    
    /* Как много нашлось строк */ 
    $number = mysql_num_rows($res); 
    
    /* заголовок письма */ 
    $mes="Отчет о пропущенных вызовах за $ydate.\r\n\r\n";
    
    /* готовим текст письма*/ 
    if ($number == 0) { 
      $mes .= "Пропущенных вызовов не было"; 
    } else { 
      
      /* Получать по одной строке из таблицы в массив $row, пока строки не кончатся */  
      while ($row=mysql_fetch_array($res)) { 
        $mes .= "   ".$row['calldate'].". От ".$row['src'];
        $mes .= " Абонент ".mb_substr($row['dstchannel'],4,3);
        $mes .= ". Ожидание  ".$row['duration']." сек.\r\n"; 
      } 
    }
     
    /* Отправляем письмо */ 
    mail('admin@mail.domain', $ydate.' report', $mes);
    ?> 
    


    Постарался комментировать достаточно подробно, если что не будет работать, спрашивайте.

    Пример письма:

    Отчет о пропущенных вызовах за 29.10.2012.

    2012-10-29 11:46:38. От 4959819231 Абонент 109. Ожидание 45 сек.
    2012-10-29 13:18:45. От 4956103380 Абонент 104. Ожидание 47 сек.
    2012-10-29 14:33:13. От 4959819331 Абонент 104. Ожидание 53 сек.
    2012-10-29 16:58:40. От 9030293453 Абонент 101. Ожидание 12 сек.
    Поделиться публикацией

    Комментарии 17

      +3
      Простите, а кто и как кладет эти данные в базу?
        +2
        Asterisk кладёт информацию о звонках CDR в mysql в стандартной комплектации, даже в Trixbox и других версиях.
          0
          ну тут база не слишком важна впринципе, он и в pgsql может писать. Может еще добавите в статью пару фишек(полезных мини скриптов в быту) каких-то?
            0
            Делал интеграцию в ИМ, где по uniqueid дергалась запись с сервера *, и менеждер может её прослушать в браузере.

            Еще интересным будет сразу ссылка в письме на обратный звонок (на форму или сразу на генерацию call-файла или agi).
              0
              Ээто готовый функционал автоответчика в астериске.
              я это еще в 2005 году настраивал по готовому куску конфига
                0
                uniqueid совсем не unique, а цифры в записи wav могут на единицу, но отличаться от uniqueid.
                Пришлось городить своё макро, которое пишет имя записываемого файла в userfield.
                Вообще вся таблица cdr — одно большое индусское недоразумение, без индексов, без enum, без уникальных полей.
                Не зря разработчик того же asternic всё парсит в свою таблицу с нормальными индексами и быстрой выборкой.
                  0
                  Кстати, в * 11 уже есть поле в таблице — recordingfile, и содержит нужное значение: exten-105-302-20130330-152308-1364642588.33.wav
          0
          Интересно зачем минусуют? Не нужен скрипт, так не нужен. Или еще что?
            +3
            Наверное, потому что сильно просто. Две азбучные функции объединенные в одном, так сказать, скрипте. Ни тебе изюминки, ни тебе какого-нибудь хитрого подхода. Почти <?php echo "Hello, world!"; ?>
              0
              Ну иногда и простое писать лень, когда есть готовое
                +1
                Пардон, но это совсем не готовое. Нет никаких обвязок, не оформлено ни как класс, ни как модуль или не знаю библиотека, непонятно кто и когда этот скрипт запускает. Здесь изложен схематический алгоритм. Но он настолько простой, просто как два примера использования функций из документации на php.net скопировано и под одним заголовком подано.
                  0
                  Нужно из командной строки набрать php myscript.php или добавить эту команду в cron. Какие классы, какие обвязки? Рабочий скрипт с сервера asterisk.
                    0
                    «номерация у нас трехзначная, поэтому LENGTH( `src` ) >3, отсекаем исходящие вызовы»

                    Это рабочий скрипт, который работает для вашей конфигурации. Соглашусь, что тривиальный запрос + тривиальный код вокруг него — не такая и проблема, чтобы искать и подпиливать его под себя, вместо того, чтобы написать на коленке за 15 минут.
                      0
                      Когда потребуется подобный скрипт, его быстрее написать, чем найти этот топик.
                        0
                        Ну я об этом и сказал «вместо того, чтобы написать на коленке за 15 минут.» :-)
            +1
            Подобные вещи, кстати говоря, удобно хранить и управлять в gist.github.com/
              +1
              Я считаю что привызяваться к `disposition` = 'NO ANSWER' не совсем корректно.

              Считаю что правильнее делать проверку на billsec = 0

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое