diff --git a/app/destinations/resources/classes/destinations.php b/app/destinations/resources/classes/destinations.php index a5bb0bbc2e..bb2738df61 100644 --- a/app/destinations/resources/classes/destinations.php +++ b/app/destinations/resources/classes/destinations.php @@ -17,14 +17,670 @@ The Initial Developer of the Original Code is Mark J Crane - Portions created by the Initial Developer are Copyright (C) 2017 + Portions created by the Initial Developer are Copyright (C) 2017 - 2020 the Initial Developer. All Rights Reserved. Contributor(s): Mark J Crane */ +/** + * destinations + * + * @method get_array get the destinations + * @method select build the html select + */ +if (!class_exists('destinations')) { + class destinations { + /** + * destinations array + */ + public $destinations; + public $db; + /** + * declare private variables + */ + private $app_name; + private $app_uuid; + private $permission_prefix; + private $list_page; + private $table; + private $uuid_prefix; + + /** + * Called when the object is created + */ + public function __construct() { + //connect to the database if not connected + if (!$this->db) { + require_once "resources/classes/database.php"; + $database = new database; + $database->connect(); + $this->db = $database->db; + } + + //assign private variables + $this->app_name = 'destinations'; + $this->app_uuid = '5ec89622-b19c-3559-64f0-afde802ab139'; + $this->permission_prefix = 'destination_'; + $this->list_page = 'destinations.php'; + $this->table = 'destinations'; + $this->uuid_prefix = 'destination_'; + } + + /** + * Called when there are no references to a particular object + * unset the variables used in the class + */ + public function __destruct() { + foreach ($this as $key => $value) { + unset($this->$key); + } + } + + /** + * Build the destination select list + * @var string $destination_type can be ivr, dialplan, call_center_contact or bridge + * @var string $destination_name - current name + * @var string $destination_value - current value + */ + public function select($destination_type, $destination_name, $destination_value) { + + //set the global variables + global $db_type; + + //get the destinations + if (!is_array($this->destinations)) { + + //get the array from the app_config.php files + $config_list = glob($_SERVER["DOCUMENT_ROOT"] . PROJECT_PATH . "/*/*/app_config.php"); + $x = 0; + foreach ($config_list as &$config_path) { + include($config_path); + $x++; + } + $i = 0; + foreach ($apps as $x => &$app) { + if (isset($app['destinations'])) foreach ($app['destinations'] as &$row) { + if (permission_exists($this->singular($row["name"])."_destinations")) { + $this->destinations[] = $row; + } + } + } + //put the array in order + if ($this->destinations !== null && is_array($this->destinations)) { + foreach ($this->destinations as $row) { + $option_groups[] = $row['label']; + } + array_multisort($option_groups, SORT_ASC, $this->destinations); + } + //add the sql and data to the array + if ($this->destinations !== null && is_array($this->destinations)) { + $x = 0; + foreach ($this->destinations as $row) { + if ($row['type'] = 'sql') { + $table_name = preg_replace('#[^a-zA-Z0-9_]#', '', $row['name']); + if (isset($row['sql'])) { + if (is_array($row['sql'])) { + $sql = trim($row['sql'][$db_type])." "; + } + else { + $sql = trim($row['sql'])." "; + } + } + else { + $field_count = count($row['field']); + $fields = ''; + $c = 1; + foreach ($row['field'] as $key => $value) { + $key = preg_replace('#[^a-zA-Z0-9_]#', '', $key); + $value = preg_replace('#[^a-zA-Z0-9_]#', '', $value); + if ($field_count != $c) { $delimiter = ','; } else { $delimiter = ''; } + $fields .= $value." as ".$key.$delimiter." "; + $c++; + } + $sql = "select ".$fields; + $sql .= " from v_".$table_name." "; + } + if (isset($row['where'])) { + $sql .= trim($row['where'])." "; + } + $sql .= "order by ".trim($row['order_by']); + $sql = str_replace("\${domain_uuid}", $_SESSION['domain_uuid'], $sql); + $database = new database; + $result = $database->select($sql, null, 'all'); + + $this->destinations[$x]['result']['sql'] = $sql; + $this->destinations[$x]['result']['data'] = $result; + } + $x++; + } + } + + $this->destinations[$x]['type'] = 'array'; + $this->destinations[$x]['label'] = 'other'; + $this->destinations[$x]['name'] = 'dialplans'; + $this->destinations[$x]['field']['name'] = "name"; + $this->destinations[$x]['field']['destination'] = "destination"; + $this->destinations[$x]['select_value']['dialplan'] = "transfer:\${destination}"; + $this->destinations[$x]['select_value']['ivr'] = "menu-exec-app:transfer \${destination}"; + $this->destinations[$x]['select_label'] = "\${name}"; + $y = 0; + $this->destinations[$x]['result']['data'][$y]['label'] = 'check_voicemail'; + $this->destinations[$x]['result']['data'][$y]['name'] = '*98'; + $this->destinations[$x]['result']['data'][$y]['destination'] = '*98 XML ${context}'; + $y++; + $this->destinations[$x]['result']['data'][$y]['label'] = 'company_directory'; + $this->destinations[$x]['result']['data'][$y]['name'] = '*411'; + $this->destinations[$x]['result']['data'][$y]['destination'] = '*411 XML ${context}'; + $y++; + $this->destinations[$x]['result']['data'][$y]['label'] = 'hangup'; + $this->destinations[$x]['result']['data'][$y]['name'] = 'hangup'; + $this->destinations[$x]['result']['data'][$y]['application'] = 'hangup'; + $this->destinations[$x]['result']['data'][$y]['destination'] = ''; + $y++; + $this->destinations[$x]['result']['data'][$y]['label'] = 'record'; + $this->destinations[$x]['result']['data'][$y]['name'] = '*732'; + $this->destinations[$x]['result']['data'][$y]['destination'] = '*732 XML ${context}'; + $y++; + } + + //remove special characters from the name + $destination_id = str_replace("]", "", $destination_name); + $destination_id = str_replace("[", "_", $destination_id); + + //set the css style + $select_style = 'width: 200px;'; + + //add additional + if (if_group("superadmin")) { + $response = "\n"; + $response .= "\n"; + } + + //set default to false + $select_found = false; + + $response .= " \n"; + if (if_group("superadmin")) { + $response .= ""; + } + + //return the formatted destinations + return $response; + } + + /** + * Get all the destinations + * @var string $destination_type can be ivr, dialplan, call_center_contact or bridge + */ + public function all($destination_type) { + + //set the global variables + global $db_type; + + //get the destinations + if (!is_array($this->destinations)) { + + //get the array from the app_config.php files + $config_list = glob($_SERVER["DOCUMENT_ROOT"] . PROJECT_PATH . "/*/*/app_config.php"); + $x = 0; + foreach ($config_list as &$config_path) { + include($config_path); + $x++; + } + $i = 0; + foreach ($apps as $x => &$app) { + if (isset($app['destinations'])) { + foreach ($app['destinations'] as &$row) { + $this->destinations[] = $row; + } + } + } + + //put the array in order + foreach ($this->destinations as $row) { + $option_groups[] = $row['label']; + } + array_multisort($option_groups, SORT_ASC, $this->destinations); + + //add the sql and data to the array + $x = 0; + foreach ($this->destinations as $row) { + if ($row['type'] = 'sql') { + $table_name = preg_replace('#[^a-zA-Z0-9_]#', '', $row['name']); + if (isset($row['sql'])) { + if (is_array($row['sql'])) { + $sql = trim($row['sql'][$db_type])." "; + } + else { + $sql = trim($row['sql'])." "; + } + } + else { + $field_count = count($row['field']); + $fields = ''; + $c = 1; + foreach ($row['field'] as $key => $value) { + $key = preg_replace('#[^a-zA-Z0-9_]#', '', $key); + $value = preg_replace('#[^a-zA-Z0-9_]#', '', $value); + if ($field_count != $c) { $delimiter = ','; } else { $delimiter = ''; } + $fields .= $value." as ".$key.$delimiter." "; + $c++; + } + $sql = "select ".$fields; + $sql .= " from v_".$table_name." "; + } + if (isset($row['where'])) { + $sql .= trim($row['where'])." "; + } + $sql .= "order by ".trim($row['order_by']); + $sql = str_replace("\${domain_uuid}", $_SESSION['domain_uuid'], $sql); + $database = new database; + $result = $database->select($sql, null, 'all'); + + $this->destinations[$x]['result']['sql'] = $sql; + $this->destinations[$x]['result']['data'] = $result; + } + $x++; + } + $this->destinations[$x]['type'] = 'array'; + $this->destinations[$x]['label'] = 'other'; + $this->destinations[$x]['name'] = 'dialplans'; + $this->destinations[$x]['field']['name'] = "name"; + $this->destinations[$x]['field']['destination'] = "destination"; + $this->destinations[$x]['select_value']['dialplan'] = "transfer:\${destination}"; + $this->destinations[$x]['select_value']['ivr'] = "menu-exec-app:transfer \${destination}"; + $this->destinations[$x]['select_label'] = "\${name}"; + $y = 0; + $this->destinations[$x]['result']['data'][$y]['label'] = 'check_voicemail'; + $this->destinations[$x]['result']['data'][$y]['name'] = '*98'; + $this->destinations[$x]['result']['data'][$y]['destination'] = '*98 XML ${context}'; + $y++; + $this->destinations[$x]['result']['data'][$y]['label'] = 'company_directory'; + $this->destinations[$x]['result']['data'][$y]['name'] = '*411'; + $this->destinations[$x]['result']['data'][$y]['destination'] = '*411 XML ${context}'; + $y++; + $this->destinations[$x]['result']['data'][$y]['label'] = 'hangup'; + $this->destinations[$x]['result']['data'][$y]['name'] = 'hangup'; + $this->destinations[$x]['result']['data'][$y]['application'] = 'hangup'; + $this->destinations[$x]['result']['data'][$y]['destination'] = ''; + $y++; + $this->destinations[$x]['result']['data'][$y]['label'] = 'record'; + $this->destinations[$x]['result']['data'][$y]['name'] = '*732'; + $this->destinations[$x]['result']['data'][$y]['destination'] = '*732 XML ${context}'; + $y++; + } + + //remove special characters from the name + $destination_id = str_replace("]", "", $destination_name); + $destination_id = str_replace("[", "_", $destination_id); + + //set default to false + $select_found = false; + + foreach ($this->destinations as $row) { + + $name = $row['name']; + $label = $row['label']; + $destination = $row['field']['destination']; + + //add multi-lingual support + if (file_exists($_SERVER["PROJECT_ROOT"]."/app/".$name."/app_languages.php")) { + $language2 = new text; + $text2 = $language2->get($_SESSION['domain']['language']['code'], 'app/'.$name); + } + + if (count($row['result']['data']) > 0 and strlen($row['select_value'][$destination_type]) > 0) { + $label2 = $label; + foreach ($row['result']['data'] as $data) { + $select_value = $row['select_value'][$destination_type]; + $select_label = $row['select_label']; + foreach ($row['field'] as $key => $value) { + if ($key == 'destination' and is_array($value)){ + if ($value['type'] == 'csv') { + $array = explode($value['delimiter'], $data[$key]); + $select_value = str_replace("\${destination}", $array[0], $select_value); + $select_label = str_replace("\${destination}", $array[0], $select_label); + } + } + else { + if (strpos($value,',') !== false) { + $keys = explode(",", $value); + foreach ($keys as $k) { + if (strlen($data[$k]) > 0) { + $select_value = str_replace("\${".$key."}", $data[$k], $select_value); + if (strlen($data['label']) == 0) { + $select_label = str_replace("\${".$key."}", $data[$k], $select_label); + } + else { + $label = $data['label']; + $select_label = str_replace("\${".$key."}", $text2['option-'.$label], $select_label); + } + } + } + } + else { + $select_value = str_replace("\${".$key."}", $data[$key], $select_value); + if (strlen($data['label']) == 0) { + $select_label = str_replace("\${".$key."}", $data[$key], $select_label); + } + else { + $label = $data['label']; + $select_label = str_replace("\${".$key."}", $text2['option-'.$label], $select_label); + } + } + //application: hangup + if (strlen($data['application']) > 0) { + $select_value = str_replace("transfer", $data['application'], $select_value); + } + } + } + + $select_value = str_replace("\${domain_name}", $_SESSION['domain_name'], $select_value); + $select_value = str_replace("\${context}", $_SESSION['domain_name'], $select_value); + $select_label = str_replace("\${domain_name}", $_SESSION['domain_name'], $select_label); + $select_label = str_replace("\${context}", $_SESSION['domain_name'], $select_label); + $select_label = str_replace("✉", 'email-icon', $select_label); + $select_label = escape(trim($select_label)); + $select_label = str_replace('email-icon', '✉', $select_label); + if ($select_value == $destination_value) { $selected = "selected='selected' "; $select_found = true; } else { $selected = ''; } + if ($label2 == 'destinations') { $select_label = format_phone($select_label); } + $array[$label][$select_label] = $select_value; + } + unset($text); + } + } + if (!$select_found) { + $destination_label = str_replace(":", " ", $destination_value); + $destination_label = str_replace("menu-exec-app", "", $destination_label); + $destination_label = str_replace("transfer", "", $destination_label); + $destination_label = str_replace("XML ".$_SESSION['domain_name'], "", $destination_label); + $array[$label][$destination_label] = $destination_value; + } + + //return the formatted destinations + return $array; + } + + /** + * valid destination + */ + public function valid($destination) { + $destinations = $this->all('dialplan'); + foreach($destinations as $category => $array) { + if (is_array($array)) { + foreach ($array as $key => $value) { + if ($destination == $value) { + return true; + } + } + } + } + return false; + } + + /** + * delete records + */ + public function delete($records) { + if (permission_exists($this->permission_prefix.'delete')) { + + //add multi-lingual support + $language = new text; + $text = $language->get(); + + //validate the token + $token = new token; + if (!$token->validate($_SERVER['PHP_SELF'])) { + message::add($text['message-invalid_token'],'negative'); + header('Location: '.$this->list_page); + exit; + } + + //delete multiple records + if (is_array($records) && @sizeof($records) != 0) { + + //build the delete array + foreach ($records as $x => $record) { + if ($record['checked'] == 'true' && is_uuid($record['uuid'])) { + + //build delete array + $array[$this->table][$x][$this->uuid_prefix.'uuid'] = $record['uuid']; + + //get the dialplan uuid and context + $sql = "select dialplan_uuid, destination_context from v_destinations "; + $sql .= "where destination_uuid = :destination_uuid "; + $parameters['destination_uuid'] = $record['uuid']; + $database = new database; + $row = $database->select($sql, $parameters, 'row'); + unset($sql, $parameters); + + //include dialplan in array + if (is_uuid($row['dialplan_uuid'])) { + $array['dialplan_details'][$x]['dialplan_uuid'] = $row["dialplan_uuid"]; + $array['dialplans'][$x]['dialplan_uuid'] = $row["dialplan_uuid"]; + $destination_contexts[] = $row['destination_context']; + } + + } + } + + //delete the checked rows + if (is_array($array) && @sizeof($array) != 0) { + + //grant temporary permissions + $p = new permissions; + $p->add('dialplan_delete', 'temp'); + $p->add('dialplan_detail_delete', 'temp'); + + //execute delete + $database = new database; + $database->app_name = $this->app_name; + $database->app_uuid = $this->app_uuid; + $database->delete($array); + unset($array); + + //revoke temporary permissions + $p->delete('dialplan_delete', 'temp'); + $p->delete('dialplan_detail_delete', 'temp'); + + //synchronize the xml config + save_dialplan_xml(); + + //clear the cache + if (is_array($destination_contexts) && @sizeof($destination_contexts) != 0) { + $destination_contexts = array_unique($destination_contexts); + $cache = new cache; + foreach ($destination_contexts as $destination_context) { + $cache->delete("dialplan:".$destination_context); + } + } + + //set message + message::add($text['message-delete']); + + } + unset($records); + + } + } + } //method + + /** + * define singular function to convert a word in english to singular + */ + public function singular($word) { + //"-es" is used for words that end in "-x", "-s", "-z", "-sh", "-ch" in which case you add + if (substr($word, -2) == "es") { + if (substr($word, -4) == "sses") { // eg. 'addresses' to 'address' + return substr($word,0,-2); + } + elseif (substr($word, -3) == "ses") { // eg. 'databases' to 'database' (necessary!) + return substr($word,0,-1); + } + elseif (substr($word, -3) == "ies") { // eg. 'countries' to 'country' + return substr($word,0,-3)."y"; + } + elseif (substr($word, -3, 1) == "x") { + return substr($word,0,-2); + } + elseif (substr($word, -3, 1) == "s") { + return substr($word,0,-2); + } + elseif (substr($word, -3, 1) == "z") { + return substr($word,0,-2); + } + elseif (substr($word, -4, 2) == "sh") { + return substr($word,0,-2); + } + elseif (substr($word, -4, 2) == "ch") { + return substr($word,0,-2); + } + else { + return rtrim($word, "s"); + } + } + else { + return rtrim($word, "s"); + } + } //method + + } //class +} +/* +$obj = new destinations; +//$destinations = $obj->destinations; +echo $obj->select('ivr', 'example1', 'menu-exec-app:transfer 32 XML voip.fusionpbx.com'); +echo $obj->select('ivr', 'example2', ''); +echo $obj->select('ivr', 'example3', ''); +echo $obj->select('ivr', 'example4', ''); +echo $obj->select('ivr', 'example5', ''); +echo $obj->select('ivr', 'example6', ''); +*/ ?>