Newer
Older
ubFramework / Portal / docroot / include / voip / voip_lib.php
@Christopher W. Olsen Christopher W. Olsen on 10 Dec 2017 20 KB Cleaning Up Making It A Sub Module
<?php

/**
 * Copyright (c) 2015, Christopher W.
 * Olsen <cwolsen@uBixStudios.com>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 1. Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 * must display the following acknowledgement:
 * This product includes software developed by uBix Technologies.
 * 4. Neither the name of uBix Studios nor the
 * names of its contributors may be used to endorse or promote products
 * derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY uBix Studios ''AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL uBix Studios BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * $Id: account_settings_json.php 85 2015-11-27 01:44:45Z reddawg $
 */

/* Start Defines */
define ( 'KEY_CHARS', 'abcdefghijklmnopqrstwxyz1234567890' );

/* Start of uBix VoIP Class */
class ubVoIP {

  private $data;

  private $voipServers;

  public $voip_servers = array (
    "AS-EAST-001.uBixVoIP.net" => "AS-EAST-001",
    "AS-EAST-002.uBixVoIP.net" => "AS-EAST-002",
    "AS-EAST-003.uBixVoIP.net" => "AS-EAST-003",
    "AS-EAST-004.uBixVoIP.net" => "AS-EAST-004",
    "AS-EAST-INT-004.uBixVoIP.net" => "AS-EAST-INT-004" 
  );

  public $voip_ports = array (
    5060 
  );

  public $voip_transports = array (
    "DNSnaptr",
    "TCPPreferred",
    "UDPOnly" 
  );

  /* Class Constructor */
  public function __construct(&$_data) {

    $this->data = &$_data;
  
  }

  /* END: Class Constructor */
  public function genAccountCode_Old($len = 16) {

    define ( 'KEY_CHARS', 'abcdefghijklmnopqrstwxyz1234567890' );
    
    $k = str_repeat ( '.', $len );
    
    while ( $len-- ) {
      $k [$len] = substr ( KEY_CHARS, mt_rand ( 0, strlen ( KEY_CHARS ) - 1 ), 1 );
    }
    
    //$query = "SELECT account_code"
    

    return $k;
  
  }

  /*
   *
   * This Function Returns The VoIP Accounts
   *
   */
  public function getAccountCodes($codeFirst = 0, $all = 0, $json = 0) {

    $query = "SELECT account_number, voip_code, account_code, company, system_version FROM accounts WHERE status = 1 ORDER BY company";
    $result = $this->data->DB ['main']->query ( $query );
    
    if ($json == 0)
      if ($all == 1)
        $vcodes = "<option value=\"\">All</option>\n";
      else
        $vcodes = "<option value=\"\">Please Select</option>\n";
    else if ($all == 1)
      $vcodes [] = array (
        'Desc' => 'All',
        'ID' => '' 
      );
    else
      $vcodes [] = array (
        'Desc' => 'Please Select',
        'ID' => '' 
      );
    
    while ( $qData = $result->fetch_assoc () ) {
      $account_code = ($qData ['system_version'] == 1) ? $qData ['voip_code'] : $qData ['account_code'];
      if ($json == 0) {
        if ($codeFirst == 0) {
          if ($this->data->data ['voip_code'] == $account_code)
            $vcodes .= "<option value=\"" . $account_code . "\" selected>" . $qData ['company'] . " - " . $account_code . " - " . $qData ['account_number'] . "</option>\n";
          else
            $vcodes .= "<option value=\"" . $account_code . "\">" . $qData ['company'] . " - " . $account_code . " - " . $qData ['account_number'] . "</option>\n";
        }
        else {
          if ($this->data->data ['voip_code'] == $qData ['voip_code'])
            $vcodes .= "<option value=\"" . $account_code . "\" selected>" . $account_code . " - " . $qData ['company'] . " - " . $qData ['account_number'] . "</option>\n";
          else
            $vcodes .= "<option value=\"" . $account_code . "\">" . $account_code . " - " . $qData ['company'] . " - " . $qData ['account_number'] . "</option>\n";
        }
      }
      else {
        $voip_code = ($qData ['system_version'] == 1) ? $qData ['voip_code'] : $qData ['account_code'];
        if ($codeFirst == 0)
          $vcodes [] = array (
            'Desc' => $qData ['company'] . " : " . $qData ['account_number'],
            'ID' => $voip_code 
          );
        else
          $vcodes [] = array (
            'Desc' => $qData ['account_number'] . " : " . $qData ['company'],
            'ID' => $voip_code 
          );
      }
    }
    $result->free ();
    
    return ($vcodes);
  
  }

  public function getCarriers() {
    $query = "SELECT carrier_id,name FROM carriers ORDER BY name";

    $result = $this->data->DB['main']->query($query);

    $carriers [] = array (
      'Desc' => 'All Carriers',
      'ID' => '' 
    );

    while ($cData = $result->fetch_assoc()) {
      $carriers[] = array('ID' => $cData['carrier_id'],'Desc' => $cData['name']);
    }
    $result->free();
    return($carriers);
  }

  public function getAccounts($accountFirst = 0/*, $json = 0*/) {

    $query = "SELECT account_number, company FROM accounts WHERE voip_code != '' ORDER BY company";
    $result = $this->data->DB ['main']->query ( $query );
    /*
     * if ($json == 0) {
     * $vcodes = "<option value=\"\">All</option>\n";
     *
     * while ( $qData = $result->fetch_assoc () ) {
     * if ($accountFirst == 0) {
     * if ($this->data->data ['account_number'] == $qData ['account_number'])
     * $vcodes .= "<option value=\"" . $qData ['account_number'] . "\" selected>" . $qData ['company'] . " : " . $qData ['account_number'] . "</option>\n";
     * else
     * $vcodes .= "<option value=\"" . $qData ['account_number'] . "\">" . $qData ['company'] . " : " . $qData ['account_number'] . "</option>\n";
     * } else {
     * if ($this->data->data ['account_number'] == $qData ['account_number'])
     * $vcodes .= "<option value=\"" . $qData ['account_number'] . "\" selected>" . $qData ['account_number'] . " : " . $qData ['company'] . "</option>\n";
     * else
     * $vcodes .= "<option value=\"" . $qData ['account_number'] . "\">" . $qData ['account_number'] . " : " . $qData ['company'] . "</option>\n";
     * }
     * }
     * } else {
     */
    $vcodes [] = array (
      'Desc' => 'All Accounts',
      'ID' => '' 
    );
    while ( $qData = $result->fetch_assoc () ) {
      if ($accountFirst == 0)
        $vcodes [] = array (
          'Desc' => $qData ['company'] . " : " . $qData ['account_number'],
          'ID' => $qData ['account_number'] 
        );
      else
        $vcodes [] = array (
          'Desc' => $qData ['account_number'] . " : " . $qData ['company'],
          'ID' => $qData ['account_number'] 
        );
    }
    /*
     * }
     */
    
    $result->free ();
    
    return ($vcodes);
  
  }

  /* END: getAccounts */
  
  /*
   * getServers($eI = 0)
   * eI = Extended Info
   */
  public function getServers($eI = 0) {

    $serverList = array ();
    
    if ($eI == 1)
      $query = "SELECT server_name, server_address, server_transports, server_ports FROM voip_servers ORDER BY server_name";
    else
      $query = "SELECT server_name, server_address FROM voip_servers ORDER BY server_name";
    
    $result = $this->data->DB ['main']->query ( $query );
    
    while ( $qData = $result->fetch_assoc () )
      $serverList [] = $qData;
    
    $result->free ();
    
    return ($serverList);
  
  }

  public function getMailboxes($accountCode = "") {

    if ($accountCode != "")
      $query = "SELECT mailbox, context FROM voicemail WHERE context = '" . $accountCode . "-voicemail'";
    else
      $query = "SELECT mailbox, context FROM voicemail";
    
    $result = $this->data->DB ['voicemail']->query ( $query );
    
    $mailboxList [] = Array (
      'label' => "No Mailbox",
      'mailbox' => '' 
    );
    
    while ( $qData = $result->fetch_row () )
      $mailboxList [] = Array (
        'label' => $qData [0],
        'mailbox' => $qData [0] . "@" . $qData [1] 
      );
    
    $result->free ();
    
    return ($mailboxList);
  
  }

  public function genPassword($length = 10) {

    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    return substr ( str_shuffle ( $chars ), 0, $length );
  
  }

  public function selectServer($server) {

    $opts = "";
    
    foreach ( $this->voip_servers as $key => $val ) {
      if ($server == $key)
        $opts .= "<option value=\"" . $key . "\" selected>" . $val . "</option>";
      else
        $opts .= "<option value=\"" . $key . "\">" . $val . "</option>";
    }
    
    return ($opts);
  
  }

  /* END: selectServer */
  public function selectPort($port) {

    $opts = "";
    
    foreach ( $this->voip_ports as $key ) {
      if ($port == $key)
        $opts .= "<option value=\"" . $key . "\" selected>" . $key . "</option>";
      else
        $opts .= "<option value=\"" . $key . "\">" . $key . "</option>";
    }
    return ($opts);
  
  }

  /* END: selectPort */
  public function selectTransport($transport) {

    $opts = "";
    foreach ( $this->voip_transports as $key ) {
      if ($transport == $key)
        $opts .= "<option value=\"" . $key . "\" selected>" . $key . "</option>";
      else
        $opts .= "<option value=\"" . $key . "\">" . $key . "</option>";
    }
    return ($opts);
  
  }

  /* END: selectTransport */
  public function getExtensions_PO($an = '', $ext = '', $wvc = false) {

    $opts = "<option value=\"\">Not Assigned</option>";
    if ($an != '') {
      $query = "SELECT voip_code FROM accounts WHERE account_number = '$an'";
      $result = $this->data->DB ['main']->query ( $query );
      $vc = $result->fetch_row () [0];
      $result->free ();
      $query = "SELECT name, accountcode FROM sippeers WHERE accountcode = '$vc' ORDER BY name";
    }
    else
      $query = "SELECT name, accountcode FROM sippeers ORDER BY name";
    $result = $this->data ['voip_db']->query ( $query );
    while ( $qData = $result->fetch_assoc () ) {
      if ($ext == $qData ['name'])
        if ($wvc == false)
          $opts .= "<option value=\"" . $qData ['name'] . "\" selected>" . $qData ['name'] . "</option>";
        else
          $opts .= "<option value=\"" . $qData ['name'] . ":" . $qData ['accountcode'] . "\" selected>" . $qData ['name'] . "</option>";
      else if ($wvc == false)
        $opts .= "<option value=\"" . $qData ['name'] . "\">" . $qData ['name'] . "</option>";
      else
        $opts .= "<option value=\"" . $qData ['name'] . ":" . $qData ['accountcode'] . "\">" . $qData ['name'] . "</option>";
    }
    $result->free ();
    return ($opts);
  
  }

  /* END: getExtensions */
  public function getSecret($ext) {

    $query = "SELECT secret FROM sippeers WHERE NAME = '$ext'";
    $result = $this->data ['voip_db']->query ( $query );
    if ($result === false)
      $secret = time ();
    else {
      $secret = $result->fetch_row () [0];
      $result->free ();
    }
    return ($secret);
  
  }

  /* END: getSecret */
  public function deviceList($vdtid = '', $wL = 0, $json = 0) {

    $query = "SELECT vdtid, manufacturer, model, firmware, line_keys FROM voip_device_types ORDER BY manufacturer, model";
    $result = $this->data->DB ['main']->query ( $query );
    while ( $qData = $result->fetch_assoc () ) {
      if ($wL == 0)
        $sV = $qData ['vdtid'];
      else
        $sV = $qData ['vdtid'] . ":" . $qData ['line_keys'];
      if ($json == 0) {
        $opts = "<option value=\"0\">Select Device</option>";
        if ($vdtid == $qData ['vdtid'])
          $opts .= "<option value=\"" . $sV . "\" selected>" . $qData ['manufacturer'] . " " . $qData ['model'] . " - Firmware: " . $qData ['firmware'] . " - Line Keys: " . $qData ['line_keys'] . "</option>";
        else
          $opts .= "<option value=\"" . $sV . "\">" . $qData ['manufacturer'] . " " . $qData ['model'] . " - Firmware: " . $qData ['firmware'] . " - Line Keys: " . $qData ['line_keys'] . "</option>";
      }
      else {
        $opts [] = array (
          'Desc' => $qData ['manufacturer'] . " " . $qData ['model'] . " - Firmware: " . $qData ['firmware'] . " - Line Keys: " . $qData ['line_keys'],
          'ID' => $sV 
        );
      }
    }
    $result->free ();
    return ($opts);
  
  }

  /* END: deviceList */
  public function deviceLines($vdtid) {

    if ($vdtid != "") {
      $query = "SELECT line_keys FROM voip_device_types WHERE vdtid = $vdtid";
      $result = $this->data->DB ['main']->query ( $query );
      $ret = $result->fetch_row () [0];
      $result->free ();
    }
    else
      $ret = "0";
    return ($ret);
  
  }

  /* END: deviceLine */
  public function getExtensions($an = '', $ext = '', $wvc = false, $json = false) {

    if ($an != '') {
      $query = "SELECT voip_code FROM accounts WHERE account_number = '$an'";
      $result = $this->data->DB ['main']->query ( $query );
      $vc = $result->fetch_row () [0];
      $result->free ();
      $query = "SELECT name, accountcode FROM sippeers WHERE accountcode = '$vc' ORDER BY name";
    }
    else
      $query = "SELECT name, accountcode FROM sippeers ORDER BY name";
    
    $result = $this->data->DB ['voip']->query ( $query );
    
    if ($json == false) {
      $opts = "<option value=\"\">Not Assigned</option>";
      while ( $qData = $result->fetch_assoc () ) {
        if ($ext == $qData ['name'])
          if ($wvc == false)
            $opts .= "<option value=\"" . $qData ['name'] . "\" selected>" . $qData ['name'] . "</option>";
          else
            $opts .= "<option value=\"" . $qData ['name'] . ":" . $qData ['accountcode'] . "\" selected>" . $qData ['name'] . "</option>";
        else if ($wvc == false)
          $opts .= "<option value=\"" . $qData ['name'] . "\">" . $qData ['name'] . "</option>";
        else
          $opts .= "<option value=\"" . $qData ['name'] . ":" . $qData ['accountcode'] . "\">" . $qData ['name'] . "</option>";
      }
    }
    else {
      $opts [] = array (
        'Desc' => 'Not Assigned',
        'ID' => '' 
      );
      
      while ( $qData = $result->fetch_assoc () ) {
        if ($wvc == false)
          $opts [] = array (
            'Desc' => substr ( $qData ['name'], strlen ( $qData ['accountcode'] ) ),
            'ID' => $qData ['name'] 
          );
        else
          $opts [] = array (
            'Desc' => $qData ['name'],
            'ID' => $qData ['name'] . ":" . $qData ['accountcode'] 
          );
      }
    }
    $result->free ();
    return ($opts);
  
  }

  public function peerInfo($peer, $aL, $voipCode) {

    if ($aL == 1) {
      $query = "SELECT server_primary, server_backup, transport_primary, transport_backup, server_port_primary, server_port_backup FROM accounts WHERE voip_code = '" . $voipCode . "'";
      $result = $this->data->DB ['main']->query ( $query );
      $qData = $result->fetch_assoc ();
      $result->free ();
      $server_primary [] = array (
        'Desc' => explode ( ".", $qData ['server_primary'] ) [0],
        'ID' => $qData ['server_primary'] 
      );
      $server_backup [] = array (
        'Desc' => explode ( ".", $qData ['server_backup'] ) [0],
        'ID' => $qData ['server_backup'] 
      );
      $transport_primary [] = array (
        'Desc' => $qData ['transport_primary'],
        'ID' => $qData ['transport_primary'] 
      );
      $transport_backup [] = array (
        'Desc' => $qData ['transport_backup'],
        'ID' => $qData ['transport_backup'] 
      );
      $server_port_primary [] = array (
        'Desc' => $qData ['server_port_primary'],
        'ID' => $qData ['server_port_primary'] 
      );
      $server_port_backup [] = array (
        'Desc' => $qData ['server_port_backup'],
        'ID' => $qData ['server_port_backup'] 
      );
    }
    else {
      $server_primary [] = array (
        'Desc' => 'Select' 
      );
      $server_backup [] = array (
        'Desc' => 'Select' 
      );
      $transport_primary [] = array (
        'Desc' => 'Select' 
      );
      $transport_backup [] = array (
        'Desc' => 'Select' 
      );
      $server_port_primary [] = array (
        'Desc' => 'Select' 
      );
      $server_port_backup [] = array (
        'Desc' => 'Select' 
      );
      foreach ( $this->voip_servers as $key => $val ) {
        $server_primary [] = array (
          'Desc' => $val,
          'ID' => $key 
        );
        $server_backup [] = array (
          'Desc' => $val,
          'ID' => $key 
        );
      }
      foreach ( $this->voip_ports as $key ) {
        $server_port_primary [] = array (
          'Desc' => $key,
          'ID' => $key 
        );
        $server_port_backup [] = array (
          'Desc' => $key,
          'ID' => $key 
        );
      }
      foreach ( $this->voip_transports as $key ) {
        $transport_primary [] = array (
          'Desc' => $key,
          'ID' => $key 
        );
        $transport_backup [] = array (
          'Desc' => $key,
          'ID' => $key 
        );
      }
    }
    $peerInfo [] = array (
      'server_primary' => $server_primary,
      'server_backup' => $server_backup,
      'transport_primary' => $transport_primary,
      'transport_backup' => $transport_backup,
      'server_port_primary' => $server_port_primary,
      'server_port_backup' => $server_port_backup 
    );
    return ($peerInfo);
  
  }

  /**
   *
   * @param unknown $phoneNumber          
   * @return string
   */
  function formatPhoneNumber_Old($phoneNumber) {

    $phoneNumber = preg_replace ( '/[^0-9]/', '', $phoneNumber );
    if (strlen ( $phoneNumber ) > 10) {
      $countryCode = substr ( $phoneNumber, 0, strlen ( $phoneNumber ) - 10 );
      $areaCode = substr ( $phoneNumber, -10, 3 );
      $nextThree = substr ( $phoneNumber, -7, 3 );
      $lastFour = substr ( $phoneNumber, -4, 4 );
      $phoneNumber = $countryCode . '-' . $areaCode . '-' . $nextThree . '-' . $lastFour;
      // $phoneNumber = '+'.$countryCode.'-'.$areaCode.'-'.$nextThree.'-'.$lastFour;
      // $phoneNumber = $countryCode . $areaCode . $nextThree . $lastFour;
    }
    else if (strlen ( $phoneNumber ) == 10) {
      $areaCode = substr ( $phoneNumber, 0, 3 );
      $nextThree = substr ( $phoneNumber, 3, 3 );
      $lastFour = substr ( $phoneNumber, 6, 4 );
      $phoneNumber = $areaCode . '-' . $nextThree . '-' . $lastFour;
    }
    else if (strlen ( $phoneNumber ) == 7) {
      $nextThree = substr ( $phoneNumber, 0, 3 );
      $lastFour = substr ( $phoneNumber, 3, 4 );
      $phoneNumber = $nextThree . '-' . $lastFour;
    }
    return $phoneNumber;
  
  }

  function formatPhoneNumber($phoneNumber) {

    $phoneNumber = preg_replace ( '/[^0-9]/', '', $phoneNumber );
    
    if (strlen ( $phoneNumber ) > 10)
      $pN = substr ( $phoneNumber, 0, strlen ( $phoneNumber ) - 10 ) . '-' . substr ( $phoneNumber, -10, 3 ) . '-' . substr ( $phoneNumber, -7, 3 ) . '-' . substr ( $phoneNumber, -4, 4 );
    else if (strlen ( $phoneNumber ) == 10)
      $pN = substr ( $phoneNumber, 0, 3 ) . '-' . substr ( $phoneNumber, 3, 3 ) . '-' . substr ( $phoneNumber, 6, 4 );
    else if (strlen ( $phoneNumber ) == 7)
      $pN = substr ( $phoneNumber, 0, 3 ) . '-' . substr ( $phoneNumber, 3, 4 );
    else
      $pN = "[" . $phoneNumber . "]";
    
    return $pN;
  
  }

  public function genAccountCode($len = 16) {

    global $db;
    
    tryAgain:
    $k = str_repeat ( '.', $len );
    
    while ( $len-- ) {
      $k [$len] = substr ( KEY_CHARS, mt_rand ( 0, strlen ( KEY_CHARS ) - 1 ), 1 );
    }
    
    $query = "SELECT account_code FROM accounts WHERE account_code = '" . $k . "'";
    
    $res = $this->data->DB ['main']->query ( $query );
    
    if ($res->num_rows > 0)
      goto tryAgain;
    
    return $k;
  
  }

}

function voip_getCodes() {

  $query = "SELECT voip_code,company FROM accounts ORDER BY voip_code";
  $result = $ubF->DB ['main']->query ( $query );
  
  $vcodes = "<option value=\"\">All</option>\n";
  while ( $qData = $result->fetch_assoc () ) {
    if ($form_data ['voip_code'] == $qData ['voip_code'])
      $vcodes .= "<option value=\"" . $qData ['voip_code'] . "\" selected>" . $qData ['voip_code'] . " : " . $qData ['company'] . "</option>\n";
    else
      $vcodes .= "<option value=\"" . $qData ['voip_code'] . "\">" . $qData ['voip_code'] . " : " . $qData ['company'] . "</option>\n";
  }
  $result->free ();
  
  return ($vcodes);

}

?>