From f0b4450ee25a1d713fe56cbcfe96c565c0363353 Mon Sep 17 00:00:00 2001 From: FusionPBX Date: Mon, 29 Sep 2025 13:00:50 -0600 Subject: [PATCH] Update dialplan.php --- app/dialplans/resources/classes/dialplan.php | 2886 +++++++++--------- 1 file changed, 1443 insertions(+), 1443 deletions(-) diff --git a/app/dialplans/resources/classes/dialplan.php b/app/dialplans/resources/classes/dialplan.php index 065efa30be..3f5b43080c 100644 --- a/app/dialplans/resources/classes/dialplan.php +++ b/app/dialplans/resources/classes/dialplan.php @@ -25,1557 +25,1557 @@ */ //define the dialplan class - class dialplan { + class dialplan { - //variables - public $domain_uuid; - public $dialplan_uuid; - public $dialplan_detail_uuid; - public $xml; - public $json; - public $display_type; - public $default_context; - public $bridges; - public $variables; + //variables + public $domain_uuid; + public $dialplan_uuid; + public $dialplan_detail_uuid; + public $xml; + public $json; + public $display_type; + public $default_context; + public $bridges; + public $variables; - //dialplans - public $dialplan_details; - public $dialplan_name; - public $dialplan_number; - public $dialplan_destination; - public $dialplan_continue; - public $dialplan_order; - public $dialplan_context; - public $dialplan_global; - public $dialplan_enabled; - public $dialplan_description; + //dialplans + public $dialplan_details; + public $dialplan_name; + public $dialplan_number; + public $dialplan_destination; + public $dialplan_continue; + public $dialplan_order; + public $dialplan_context; + public $dialplan_global; + public $dialplan_enabled; + public $dialplan_description; - //dialplan_details - public $dialplan_detail_tag; - public $dialplan_detail_order; - public $dialplan_detail_type; - public $dialplan_detail_data; - public $dialplan_detail_break; - public $dialplan_detail_inline; - public $dialplan_detail_group; + //dialplan_details + public $dialplan_detail_tag; + public $dialplan_detail_order; + public $dialplan_detail_type; + public $dialplan_detail_data; + public $dialplan_detail_break; + public $dialplan_detail_inline; + public $dialplan_detail_group; - //xml - public $uuid; - public $context; - public $source; - public $destination; - public $is_empty; - public $array; + //xml + public $uuid; + public $context; + public $source; + public $destination; + public $is_empty; + public $array; - /** - * declare public/private properties - */ - private $app_name; - public $app_uuid; - private $permission_prefix; - public $list_page; - private $table; - private $uuid_prefix; - private $toggle_field; - private $toggle_values; + /** + * declare public/private properties + */ + private $app_name; + public $app_uuid; + private $permission_prefix; + public $list_page; + private $table; + private $uuid_prefix; + private $toggle_field; + private $toggle_values; - /** - * Set in the constructor. Must be a database object and cannot be null. - * @var database Database Object - */ - private $database; + /** + * Set in the constructor. Must be a database object and cannot be null. + * @var database Database Object + */ + private $database; - //class constructor - public function __construct() { - //set the default value - $this->dialplan_global = false; + //class constructor + public function __construct() { + //set the default value + $this->dialplan_global = false; - //assign property defaults - $this->app_name = 'dialplans'; - $this->app_uuid = '742714e5-8cdf-32fd-462c-cbe7e3d655db'; //dialplans - $this->permission_prefix = 'dialplan_'; - $this->list_page = 'dialplans.php'; - $this->table = 'dialplans'; - $this->uuid_prefix = 'dialplan_'; - $this->toggle_field = 'dialplan_enabled'; - $this->toggle_values = ['true','false']; + //assign property defaults + $this->app_name = 'dialplans'; + $this->app_uuid = '742714e5-8cdf-32fd-462c-cbe7e3d655db'; //dialplans + $this->permission_prefix = 'dialplan_'; + $this->list_page = 'dialplans.php'; + $this->table = 'dialplans'; + $this->uuid_prefix = 'dialplan_'; + $this->toggle_field = 'dialplan_enabled'; + $this->toggle_values = ['true','false']; - //open a database connection - if (empty($setting_array['database'])) { - $this->database = database::new(); - } else { - $this->database = $setting_array['database']; + //open a database connection + if (empty($setting_array['database'])) { + $this->database = database::new(); + } else { + $this->database = $setting_array['database']; + } + } + + public function dialplan_add() { + //build insert array + $array['dialplans'][0]['dialplan_uuid'] = $this->dialplan_uuid; + $array['dialplans'][0]['domain_uuid'] = !$this->dialplan_global ? $this->domain_uuid : null; + $array['dialplans'][0]['app_uuid'] = $this->app_uuid; + $array['dialplans'][0]['dialplan_name'] = $this->dialplan_name; + $array['dialplans'][0]['dialplan_number'] = $this->dialplan_number; + $array['dialplans'][0]['dialplan_destination'] = $this->dialplan_destination; + $array['dialplans'][0]['dialplan_continue'] = $this->dialplan_continue; + $array['dialplans'][0]['dialplan_order'] = $this->dialplan_order; + $array['dialplans'][0]['dialplan_context'] = $this->dialplan_context; + $array['dialplans'][0]['dialplan_enabled'] = $this->dialplan_enabled; + $array['dialplans'][0]['dialplan_description'] = $this->dialplan_description; + + //grant temporary permissions + $p = permissions::new(); + $p->add('dialplan_add', 'temp'); + + //execute insert + $this->database->app_name = 'dialplans'; + $this->database->app_uuid = '742714e5-8cdf-32fd-462c-cbe7e3d655db'; + $this->database->save($array); + unset($array); + + //clear the destinations session array + if (isset($_SESSION['destinations']['array'])) { + unset($_SESSION['destinations']['array']); } - } - public function dialplan_add() { - //build insert array - $array['dialplans'][0]['dialplan_uuid'] = $this->dialplan_uuid; - $array['dialplans'][0]['domain_uuid'] = !$this->dialplan_global ? $this->domain_uuid : null; - $array['dialplans'][0]['app_uuid'] = $this->app_uuid; - $array['dialplans'][0]['dialplan_name'] = $this->dialplan_name; - $array['dialplans'][0]['dialplan_number'] = $this->dialplan_number; - $array['dialplans'][0]['dialplan_destination'] = $this->dialplan_destination; + //revoke temporary permissions + $p->delete('dialplan_add', 'temp'); + } + + public function dialplan_update() { + //build update array + $array['dialplans'][0]['dialplan_uuid'] = $this->dialplan_uuid; + $array['dialplans'][0]['dialplan_name'] = $this->dialplan_name; + if (!empty($this->dialplan_continue)) { $array['dialplans'][0]['dialplan_continue'] = $this->dialplan_continue; - $array['dialplans'][0]['dialplan_order'] = $this->dialplan_order; - $array['dialplans'][0]['dialplan_context'] = $this->dialplan_context; - $array['dialplans'][0]['dialplan_enabled'] = $this->dialplan_enabled; - $array['dialplans'][0]['dialplan_description'] = $this->dialplan_description; + } - //grant temporary permissions - $p = permissions::new(); - $p->add('dialplan_add', 'temp'); + $array['dialplans'][0]['dialplan_order'] = $this->dialplan_order; + $array['dialplans'][0]['dialplan_context'] = $this->dialplan_context; + $array['dialplans'][0]['dialplan_enabled'] = $this->dialplan_enabled; + $array['dialplans'][0]['dialplan_description'] = $this->dialplan_description; - //execute insert - $this->database->app_name = 'dialplans'; - $this->database->app_uuid = '742714e5-8cdf-32fd-462c-cbe7e3d655db'; - $this->database->save($array); - unset($array); + //grant temporary permissions + $p = permissions::new(); + $p->add('dialplan_edit', 'temp'); - //clear the destinations session array - if (isset($_SESSION['destinations']['array'])) { - unset($_SESSION['destinations']['array']); + //execute update + $this->database->app_name = 'dialplans'; + $this->database->app_uuid = '742714e5-8cdf-32fd-462c-cbe7e3d655db'; + $this->database->save($array); + unset($array); + + //revoke temporary permissions + $p->delete('dialplan_edit', 'temp'); + } + + private function app_uuid_exists() { + $sql = "select count(*) from v_dialplans "; + $sql .= "where (domain_uuid = :domain_uuid or domain_uuid is null) "; + $sql .= "and app_uuid = :app_uuid "; + $parameters['domain_uuid'] = $this->domain_uuid; + $parameters['app_uuid'] = $this->app_uuid; + return $this->database->select($sql, $parameters ?? null, 'column') != 0 ? true : false; + unset($sql, $parameters); + } + + public function dialplan_exists() { + $sql = "select count(*) from v_dialplans "; + $sql .= "where (domain_uuid = :domain_uuid or domain_uuid is null)"; + $sql .= "and dialplan_uuid = :dialplan_uuid "; + $parameters['domain_uuid'] = $this->domain_uuid; + $parameters['dialplan_uuid'] = $this->dialplan_uuid; + return $this->database->select($sql, $parameters ?? null, 'column') != 0 ? true : false; + unset($sql, $parameters); + } + + public function import($domains) { + //set the row id + $x = 0; + + //get the array of xml files + $xml_list = glob($_SERVER["DOCUMENT_ROOT"] . PROJECT_PATH . "/*/*/resources/switch/conf/dialplan/*.xml"); + + //add a band-aid for CLI editors with faulty syntax highlighting + /* **/ + + //build the dialplan xml array + /* + foreach ($xml_list as $xml_file) { + $xml_string = file_get_contents($xml_file); + + //prepare the xml + if (!empty($xml_string)) { + //replace the variables + $length = (is_numeric($_SESSION["security"]["pin_length"]["var"])) ? $_SESSION["security"]["pin_length"]["var"] : 8; + $xml_string = str_replace("{v_context}", $domain['domain_name'], $xml_string); + $xml_string = str_replace("{v_pin_number}", generate_password($length, 1), $xml_string); + //convert the xml string to an xml object + $xml = simplexml_load_string($xml_string); + //convert to json + $json = json_encode($xml); + //convert to an array + $dialplan = json_decode($json, true); } - - //revoke temporary permissions - $p->delete('dialplan_add', 'temp'); - } - - public function dialplan_update() { - //build update array - $array['dialplans'][0]['dialplan_uuid'] = $this->dialplan_uuid; - $array['dialplans'][0]['dialplan_name'] = $this->dialplan_name; - if (!empty($this->dialplan_continue)) { - $array['dialplans'][0]['dialplan_continue'] = $this->dialplan_continue; + if (!empty($this->json)) { + //convert to an array + $dialplan = json_decode($json, true); } + $_SESSION['dialplans']['default'][] = $dialplan; + } + */ - $array['dialplans'][0]['dialplan_order'] = $this->dialplan_order; - $array['dialplans'][0]['dialplan_context'] = $this->dialplan_context; - $array['dialplans'][0]['dialplan_enabled'] = $this->dialplan_enabled; - $array['dialplans'][0]['dialplan_description'] = $this->dialplan_description; + //loop through each domain + if (!empty($domains) && is_array($domains) && @sizeof($domains) != 0) { + foreach ($domains as $domain) { + //debug info + //echo "domain name ".$domain['domain_name']."\n"; - //grant temporary permissions - $p = permissions::new(); - $p->add('dialplan_edit', 'temp'); + //determine if the dialplan already exists + $sql = "select app_uuid from v_dialplans "; + $sql .= "where (domain_uuid = :domain_uuid or domain_uuid is null) "; + $sql .= "and app_uuid is not null "; + $parameters['domain_uuid'] = $domain['domain_uuid']; + $app_uuids = $this->database->select($sql, $parameters, 'all'); + unset($parameters); - //execute update - $this->database->app_name = 'dialplans'; - $this->database->app_uuid = '742714e5-8cdf-32fd-462c-cbe7e3d655db'; - $this->database->save($array); - unset($array); + //process the dialplan xml files + //foreach ($_SESSION['dialplans']['default'] as $dialplan) { + foreach ($xml_list as $xml_file) { + //get the xml string + $xml_string = file_get_contents($xml_file); - //revoke temporary permissions - $p->delete('dialplan_edit', 'temp'); - } + //prepare the xml + if (!empty($xml_string)) { + //replace the variables + $length = (!empty($_SESSION["security"]["pin_length"]["var"])) ? $_SESSION["security"]["pin_length"]["var"] : 8; + $xml_string = str_replace("{v_context}", $domain['domain_name'], $xml_string); + $xml_string = str_replace("{v_pin_number}", generate_password($length, 1), $xml_string); - private function app_uuid_exists() { - $sql = "select count(*) from v_dialplans "; - $sql .= "where (domain_uuid = :domain_uuid or domain_uuid is null) "; - $sql .= "and app_uuid = :app_uuid "; - $parameters['domain_uuid'] = $this->domain_uuid; - $parameters['app_uuid'] = $this->app_uuid; - return $this->database->select($sql, $parameters ?? null, 'column') != 0 ? true : false; - unset($sql, $parameters); - } + //convert the xml string to an xml object + $xml = simplexml_load_string($xml_string); - public function dialplan_exists() { - $sql = "select count(*) from v_dialplans "; - $sql .= "where (domain_uuid = :domain_uuid or domain_uuid is null)"; - $sql .= "and dialplan_uuid = :dialplan_uuid "; - $parameters['domain_uuid'] = $this->domain_uuid; - $parameters['dialplan_uuid'] = $this->dialplan_uuid; - return $this->database->select($sql, $parameters ?? null, 'column') != 0 ? true : false; - unset($sql, $parameters); - } + //convert to json + $json = json_encode($xml); - public function import($domains) { - //set the row id - $x = 0; + //convert to an array + $dialplan = json_decode($json, true); - //get the array of xml files - $xml_list = glob($_SERVER["DOCUMENT_ROOT"] . PROJECT_PATH . "/*/*/resources/switch/conf/dialplan/*.xml"); - - //add a band-aid for CLI editors with faulty syntax highlighting - /* **/ - - //build the dialplan xml array - /* - foreach ($xml_list as $xml_file) { - $xml_string = file_get_contents($xml_file); - - //prepare the xml - if (!empty($xml_string)) { - //replace the variables - $length = (is_numeric($_SESSION["security"]["pin_length"]["var"])) ? $_SESSION["security"]["pin_length"]["var"] : 8; - $xml_string = str_replace("{v_context}", $domain['domain_name'], $xml_string); - $xml_string = str_replace("{v_pin_number}", generate_password($length, 1), $xml_string); - //convert the xml string to an xml object - $xml = simplexml_load_string($xml_string); - //convert to json - $json = json_encode($xml); - //convert to an array - $dialplan = json_decode($json, true); - } - if (!empty($this->json)) { - //convert to an array - $dialplan = json_decode($json, true); - } - $_SESSION['dialplans']['default'][] = $dialplan; - } - */ - - //loop through each domain - if (!empty($domains) && is_array($domains) && @sizeof($domains) != 0) { - foreach ($domains as $domain) { - //debug info - //echo "domain name ".$domain['domain_name']."\n"; - - //determine if the dialplan already exists - $sql = "select app_uuid from v_dialplans "; - $sql .= "where (domain_uuid = :domain_uuid or domain_uuid is null) "; - $sql .= "and app_uuid is not null "; - $parameters['domain_uuid'] = $domain['domain_uuid']; - $app_uuids = $this->database->select($sql, $parameters, 'all'); - unset($parameters); - - //process the dialplan xml files - //foreach ($_SESSION['dialplans']['default'] as $dialplan) { - foreach ($xml_list as $xml_file) { - //get the xml string - $xml_string = file_get_contents($xml_file); - - //prepare the xml - if (!empty($xml_string)) { - //replace the variables - $length = (!empty($_SESSION["security"]["pin_length"]["var"])) ? $_SESSION["security"]["pin_length"]["var"] : 8; - $xml_string = str_replace("{v_context}", $domain['domain_name'], $xml_string); - $xml_string = str_replace("{v_pin_number}", generate_password($length, 1), $xml_string); - - //convert the xml string to an xml object - $xml = simplexml_load_string($xml_string); - - //convert to json - $json = json_encode($xml); - - //convert to an array - $dialplan = json_decode($json, true); + } + if (!empty($this->json)) { + //convert to an array + $dialplan = json_decode($json, true); + } + //ensure the condition array is uniform + if (!empty($dialplan)) { + if (empty($dialplan['condition'][0])) { + $tmp = $dialplan['condition']; + unset($dialplan['condition']); + $dialplan['condition'][0] = $tmp; } - if (!empty($this->json)) { - //convert to an array - $dialplan = json_decode($json, true); + } + + //determine if the dialplan already exists + $app_uuid_exists = false; + foreach($app_uuids as $row) { + if ($dialplan['@attributes']['app_uuid'] == $row['app_uuid']) { + $app_uuid_exists = true; } + } - //ensure the condition array is uniform - if (!empty($dialplan)) { - if (empty($dialplan['condition'][0])) { - $tmp = $dialplan['condition']; - unset($dialplan['condition']); - $dialplan['condition'][0] = $tmp; - } - } + //check if the dialplan exists + if (!$app_uuid_exists) { - //determine if the dialplan already exists - $app_uuid_exists = false; - foreach($app_uuids as $row) { - if ($dialplan['@attributes']['app_uuid'] == $row['app_uuid']) { - $app_uuid_exists = true; - } - } - - //check if the dialplan exists - if (!$app_uuid_exists) { - - //dialplan global - if (isset($dialplan['@attributes']['global']) && $dialplan['@attributes']['global'] == "true") { - $dialplan_global = true; - } - else { - $dialplan_global = false; - } - - //get the dialplan context - $dialplan_context = $dialplan['@attributes']['context']; - $dialplan_context = str_replace("\${domain_name}", $domain['domain_name'], $dialplan_context); - - //set the domain_uuid - if ($dialplan_global) { - $domain_uuid = null; - } - else { - $domain_uuid = $domain['domain_uuid']; - } - - //get the attributes - $dialplan_uuid = uuid(); - - $array['dialplans'][$x]['dialplan_uuid'] = $dialplan_uuid; - $array['dialplans'][$x]['domain_uuid'] = $domain_uuid; - $array['dialplans'][$x]['app_uuid'] = $dialplan['@attributes']['app_uuid']; - $array['dialplans'][$x]['dialplan_name'] = $dialplan['@attributes']['name']; - $array['dialplans'][$x]['dialplan_number'] = $dialplan['@attributes']['number'] ?? null; - $array['dialplans'][$x]['dialplan_context'] = $dialplan_context; - if (!empty($dialplan['@attributes']['destination'])) { - $array['dialplans'][$x]['dialplan_destination'] = $dialplan['@attributes']['destination']; - } - if (!empty($dialplan['@attributes']['continue'])) { - $array['dialplans'][$x]['dialplan_continue'] = $dialplan['@attributes']['continue']; - } - $array['dialplans'][$x]['dialplan_order'] = $dialplan['@attributes']['order']; - if (!empty($dialplan['@attributes']['enabled'])) { - $array['dialplans'][$x]['dialplan_enabled'] = $dialplan['@attributes']['enabled']; - } - else { - $array['dialplans'][$x]['dialplan_enabled'] = true; - } - $array['dialplans'][$x]['dialplan_description'] = $dialplan['@attributes']['description'] ?? null; - - //loop through the condition array - $y = 0; - $group = 0; - $order = 5; - if (isset($dialplan['condition'])) { - foreach ($dialplan['condition'] as $row) { - - $array['dialplans'][$x]['dialplan_details'][$y]['domain_uuid'] = $domain_uuid; - $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_uuid'] = $dialplan_uuid; - $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_tag'] = 'condition'; - $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_order'] = $order; - $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_type'] = $row['@attributes']['field'] ?? null; - $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_data'] = $row['@attributes']['expression'] ?? null; - if (!empty($row['@attributes']['break'])) { - $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_break'] = $row['@attributes']['break']; - } - $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_group'] = $group; - if (isset($row['@attributes']['enabled'])) { - $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_enabled'] = $row['@attributes']['enabled']; - } - else { - $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_enabled'] = true; - } - $y++; - - if (!empty($row['action']) || !empty($row['anti-action'])) { - $condition_self_closing_tag = false; - if (empty($row['action'][0])) { - if ($row['action']['@attributes']['application']) { - $tmp = $row['action']; - unset($row['action']); - $row['action'][0] = $tmp; - } - } - if (empty($row['anti-action'][0])) { - if (!empty($row['anti-action']['@attributes']['application'])) { - $tmp = $row['anti-action']; - unset($row['anti-action']); - $row['anti-action'][0] = $tmp; - } - } - $order = $order + 5; - if (isset($row['action'])) { - foreach ($row['action'] as $row2) { - $array['dialplans'][$x]['dialplan_details'][$y]['domain_uuid'] = $domain_uuid; - $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_uuid'] = $dialplan_uuid; - $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_tag'] = 'action'; - $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_order'] = $order; - $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_type'] = $row2['@attributes']['application']; - $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_data'] = $row2['@attributes']['data'] ?? null; - if (!empty($row2['@attributes']['inline'])) { - $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_inline'] = $row2['@attributes']['inline']; - } - else { - $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_inline'] = null; - } - $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_group'] = $group; - if (isset($row2['@attributes']['enabled'])) { - $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_enabled'] = $row2['@attributes']['enabled']; - } - else { - $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_enabled'] = true; - } - $y++; - - //increase the order number - $order = $order + 5; - } - } - if (isset($row['anti-action'])) { - foreach ($row['anti-action'] as $row2) { - $array['dialplans'][$x]['dialplan_details'][$y]['domain_uuid'] = $domain_uuid; - $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_uuid'] = $dialplan_uuid; - $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_tag'] = 'anti-action'; - $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_order'] = $order; - $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_type'] = $row2['@attributes']['application']; - $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_data'] = $row2['@attributes']['data']; - if (!empty($row2['@attributes']['inline'])) { - $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_inline'] = $row2['@attributes']['inline']; - } - else { - $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_inline'] = null; - } - $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_group'] = $group; - if (isset($row2['@attributes']['enabled'])) { - $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_enabled'] = $row2['@attributes']['enabled']; - } - else { - $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_enabled'] = true; - } - $y++; - - //increase the order number - $order = $order + 5; - } - } - } - else { - $condition_self_closing_tag = true; - } - - //if not a self closing tag then increment the group - if (!$condition_self_closing_tag) { - $group++; - } - - //increment the values - $order = $order + 5; - - //increase the row number - $x++; - } - } - - //update the session array - $_SESSION['upgrade']['app_defaults']['dialplans'][$domain['domain_name']][]['dialplan_name'] = $dialplan_name ?? null; - - } //app_uuid exists - } //end foreach $xml_list - - //grant temporary permissions - $p = permissions::new(); - $p->add('dialplan_add', 'temp'); - $p->add('dialplan_edit', 'temp'); - $p->add('dialplan_detail_add', 'temp'); - $p->add('dialplan_detail_edit', 'temp'); - - //save the data - if (!empty($array)) { - $this->database->app_name = 'dialplans'; - $this->database->app_uuid = '742714e5-8cdf-32fd-462c-cbe7e3d655db'; - $this->database->save($array); - unset($array); - } - - //revoke temporary permissions - $p->delete('dialplan_add', 'temp'); - $p->delete('dialplan_edit', 'temp'); - $p->delete('dialplan_detail_add', 'temp'); - $p->delete('dialplan_detail_edit', 'temp'); - - //add dialplan xml when the dialplan_xml is null - $this->source = 'details'; - $this->destination = 'database'; - $this->context = $domain['domain_name']; - $this->is_empty = 'dialplan_xml'; - $this->xml(); - - } //foreach domains - } - } - - public function outbound_routes($destination_number) { - - //normalize the destination number - $destination_number = trim($destination_number); - - //check the session array if it doesn't exist then build the array - if (empty($_SESSION[$_SESSION['domain_uuid']]['outbound_routes'])) { - //get the outbound routes from the database - $sql = "select * "; - $sql .= "from v_dialplans as d, "; - $sql .= "v_dialplan_details as s "; - $sql .= "where "; - $sql .= "( "; - $sql .= "d.domain_uuid = :domain_uuid "; - $sql .= "or d.domain_uuid is null "; - $sql .= ") "; - $sql .= "and d.app_uuid = '8c914ec3-9fc0-8ab5-4cda-6c9288bdc9a3' "; - $sql .= "and d.dialplan_enabled = true "; - $sql .= "and d.dialplan_uuid = s.dialplan_uuid "; - $sql .= "order by "; - $sql .= "d.dialplan_order asc, "; - $sql .= "d.dialplan_name asc, "; - $sql .= "d.dialplan_uuid asc, "; - $sql .= "s.dialplan_detail_group asc, "; - $sql .= "case s.dialplan_detail_tag "; - $sql .= "when 'condition' then 1 "; - $sql .= "when 'action' then 2 "; - $sql .= "when 'anti-action' then 3 "; - $sql .= "else 100 end, "; - $sql .= "s.dialplan_detail_order asc "; - $parameters['domain_uuid'] = $this->domain_uuid; - $dialplans = $this->database->select($sql, $parameters ?? null, 'all'); - unset($sql, $parameters); - $x = 0; $y = 0; - if (!empty($dialplans)) { - foreach ($dialplans as $row) { - //if the previous dialplan uuid has not been set then set it - if (!isset($previous_dialplan_uuid)) { $previous_dialplan_uuid = $row['dialplan_uuid']; } - - //increment dialplan ordinal number - if ($previous_dialplan_uuid != $row['dialplan_uuid']) { - $x++; $y = 0; - } - - //build the array - $array[$x]['dialplan_uuid'] = $row['dialplan_uuid']; - $array[$x]['dialplan_context'] = $row['dialplan_context']; - $array[$x]['dialplan_name'] = $row['dialplan_name']; - $array[$x]['dialplan_continue'] = $row['dialplan_continue']; - $array[$x]['dialplan_order'] = $row['dialplan_order']; - $array[$x]['dialplan_enabled'] = $row['dialplan_enabled']; - $array[$x]['dialplan_description'] = $row['dialplan_description']; - if (!empty($row['dialplan_detail_uuid'])) { - $array[$x]['dialplan_details'][$y]['dialplan_uuid'] = $row['dialplan_uuid']; - $array[$x]['dialplan_details'][$y]['dialplan_detail_uuid'] = $row['dialplan_detail_uuid']; - $array[$x]['dialplan_details'][$y]['dialplan_detail_tag'] = $row['dialplan_detail_tag']; - $array[$x]['dialplan_details'][$y]['dialplan_detail_type'] = $row['dialplan_detail_type']; - $array[$x]['dialplan_details'][$y]['dialplan_detail_data'] = $row['dialplan_detail_data']; - $y++; - } - - //set the previous dialplan_uuid - $previous_dialplan_uuid = $row['dialplan_uuid']; - } - } - - //set the session array - $_SESSION[$_SESSION['domain_uuid']]['outbound_routes'] = $array; - } - - //find the matching outbound routes - if (isset($_SESSION[$_SESSION['domain_uuid']]['outbound_routes'])) { - foreach ($_SESSION[$_SESSION['domain_uuid']]['outbound_routes'] as $row) { - if (isset($row['dialplan_details'])) { - foreach ($row['dialplan_details'] as $field) { - if ($field['dialplan_detail_tag'] == "condition") { - if ($field['dialplan_detail_type'] == "destination_number") { - $dialplan_detail_data = $field['dialplan_detail_data']; - $pattern = '/'.$dialplan_detail_data.'/'; - preg_match($pattern, $destination_number, $matches, PREG_OFFSET_CAPTURE); - if (count($matches) == 0) { - $regex_match = false; + //dialplan global + if (isset($dialplan['@attributes']['global']) && $dialplan['@attributes']['global'] == "true") { + $dialplan_global = true; } else { - $regex_match = true; - $regex_match_1 = $matches[1][0]; - $regex_match_2 = $matches[2][0]; - $regex_match_3 = $matches[3][0]; + $dialplan_global = false; + } + + //get the dialplan context + $dialplan_context = $dialplan['@attributes']['context']; + $dialplan_context = str_replace("\${domain_name}", $domain['domain_name'], $dialplan_context); + + //set the domain_uuid + if ($dialplan_global) { + $domain_uuid = null; + } + else { + $domain_uuid = $domain['domain_uuid']; + } + + //get the attributes + $dialplan_uuid = uuid(); + + $array['dialplans'][$x]['dialplan_uuid'] = $dialplan_uuid; + $array['dialplans'][$x]['domain_uuid'] = $domain_uuid; + $array['dialplans'][$x]['app_uuid'] = $dialplan['@attributes']['app_uuid']; + $array['dialplans'][$x]['dialplan_name'] = $dialplan['@attributes']['name']; + $array['dialplans'][$x]['dialplan_number'] = $dialplan['@attributes']['number'] ?? null; + $array['dialplans'][$x]['dialplan_context'] = $dialplan_context; + if (!empty($dialplan['@attributes']['destination'])) { + $array['dialplans'][$x]['dialplan_destination'] = $dialplan['@attributes']['destination']; + } + if (!empty($dialplan['@attributes']['continue'])) { + $array['dialplans'][$x]['dialplan_continue'] = $dialplan['@attributes']['continue']; + } + $array['dialplans'][$x]['dialplan_order'] = $dialplan['@attributes']['order']; + if (!empty($dialplan['@attributes']['enabled'])) { + $array['dialplans'][$x]['dialplan_enabled'] = $dialplan['@attributes']['enabled']; + } + else { + $array['dialplans'][$x]['dialplan_enabled'] = true; + } + $array['dialplans'][$x]['dialplan_description'] = $dialplan['@attributes']['description'] ?? null; + + //loop through the condition array + $y = 0; + $group = 0; + $order = 5; + if (isset($dialplan['condition'])) { + foreach ($dialplan['condition'] as $row) { + + $array['dialplans'][$x]['dialplan_details'][$y]['domain_uuid'] = $domain_uuid; + $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_uuid'] = $dialplan_uuid; + $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_tag'] = 'condition'; + $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_order'] = $order; + $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_type'] = $row['@attributes']['field'] ?? null; + $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_data'] = $row['@attributes']['expression'] ?? null; + if (!empty($row['@attributes']['break'])) { + $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_break'] = $row['@attributes']['break']; + } + $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_group'] = $group; + if (isset($row['@attributes']['enabled'])) { + $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_enabled'] = $row['@attributes']['enabled']; + } + else { + $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_enabled'] = true; + } + $y++; + + if (!empty($row['action']) || !empty($row['anti-action'])) { + $condition_self_closing_tag = false; + if (empty($row['action'][0])) { + if ($row['action']['@attributes']['application']) { + $tmp = $row['action']; + unset($row['action']); + $row['action'][0] = $tmp; + } + } + if (empty($row['anti-action'][0])) { + if (!empty($row['anti-action']['@attributes']['application'])) { + $tmp = $row['anti-action']; + unset($row['anti-action']); + $row['anti-action'][0] = $tmp; + } + } + $order = $order + 5; + if (isset($row['action'])) { + foreach ($row['action'] as $row2) { + $array['dialplans'][$x]['dialplan_details'][$y]['domain_uuid'] = $domain_uuid; + $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_uuid'] = $dialplan_uuid; + $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_tag'] = 'action'; + $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_order'] = $order; + $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_type'] = $row2['@attributes']['application']; + $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_data'] = $row2['@attributes']['data'] ?? null; + if (!empty($row2['@attributes']['inline'])) { + $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_inline'] = $row2['@attributes']['inline']; + } + else { + $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_inline'] = null; + } + $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_group'] = $group; + if (isset($row2['@attributes']['enabled'])) { + $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_enabled'] = $row2['@attributes']['enabled']; + } + else { + $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_enabled'] = true; + } + $y++; + + //increase the order number + $order = $order + 5; + } + } + if (isset($row['anti-action'])) { + foreach ($row['anti-action'] as $row2) { + $array['dialplans'][$x]['dialplan_details'][$y]['domain_uuid'] = $domain_uuid; + $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_uuid'] = $dialplan_uuid; + $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_tag'] = 'anti-action'; + $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_order'] = $order; + $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_type'] = $row2['@attributes']['application']; + $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_data'] = $row2['@attributes']['data']; + if (!empty($row2['@attributes']['inline'])) { + $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_inline'] = $row2['@attributes']['inline']; + } + else { + $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_inline'] = null; + } + $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_group'] = $group; + if (isset($row2['@attributes']['enabled'])) { + $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_enabled'] = $row2['@attributes']['enabled']; + } + else { + $array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_enabled'] = true; + } + $y++; + + //increase the order number + $order = $order + 5; + } + } + } + else { + $condition_self_closing_tag = true; + } + + //if not a self closing tag then increment the group + if (!$condition_self_closing_tag) { + $group++; + } + + //increment the values + $order = $order + 5; + + //increase the row number + $x++; + } + } + + //update the session array + $_SESSION['upgrade']['app_defaults']['dialplans'][$domain['domain_name']][]['dialplan_name'] = $dialplan_name ?? null; + + } //app_uuid exists + } //end foreach $xml_list + + //grant temporary permissions + $p = permissions::new(); + $p->add('dialplan_add', 'temp'); + $p->add('dialplan_edit', 'temp'); + $p->add('dialplan_detail_add', 'temp'); + $p->add('dialplan_detail_edit', 'temp'); + + //save the data + if (!empty($array)) { + $this->database->app_name = 'dialplans'; + $this->database->app_uuid = '742714e5-8cdf-32fd-462c-cbe7e3d655db'; + $this->database->save($array); + unset($array); + } + + //revoke temporary permissions + $p->delete('dialplan_add', 'temp'); + $p->delete('dialplan_edit', 'temp'); + $p->delete('dialplan_detail_add', 'temp'); + $p->delete('dialplan_detail_edit', 'temp'); + + //add dialplan xml when the dialplan_xml is null + $this->source = 'details'; + $this->destination = 'database'; + $this->context = $domain['domain_name']; + $this->is_empty = 'dialplan_xml'; + $this->xml(); + + } //foreach domains + } + } + + public function outbound_routes($destination_number) { + + //normalize the destination number + $destination_number = trim($destination_number); + + //check the session array if it doesn't exist then build the array + if (empty($_SESSION[$_SESSION['domain_uuid']]['outbound_routes'])) { + //get the outbound routes from the database + $sql = "select * "; + $sql .= "from v_dialplans as d, "; + $sql .= "v_dialplan_details as s "; + $sql .= "where "; + $sql .= "( "; + $sql .= "d.domain_uuid = :domain_uuid "; + $sql .= "or d.domain_uuid is null "; + $sql .= ") "; + $sql .= "and d.app_uuid = '8c914ec3-9fc0-8ab5-4cda-6c9288bdc9a3' "; + $sql .= "and d.dialplan_enabled = true "; + $sql .= "and d.dialplan_uuid = s.dialplan_uuid "; + $sql .= "order by "; + $sql .= "d.dialplan_order asc, "; + $sql .= "d.dialplan_name asc, "; + $sql .= "d.dialplan_uuid asc, "; + $sql .= "s.dialplan_detail_group asc, "; + $sql .= "case s.dialplan_detail_tag "; + $sql .= "when 'condition' then 1 "; + $sql .= "when 'action' then 2 "; + $sql .= "when 'anti-action' then 3 "; + $sql .= "else 100 end, "; + $sql .= "s.dialplan_detail_order asc "; + $parameters['domain_uuid'] = $this->domain_uuid; + $dialplans = $this->database->select($sql, $parameters ?? null, 'all'); + unset($sql, $parameters); + $x = 0; $y = 0; + if (!empty($dialplans)) { + foreach ($dialplans as $row) { + //if the previous dialplan uuid has not been set then set it + if (!isset($previous_dialplan_uuid)) { $previous_dialplan_uuid = $row['dialplan_uuid']; } + + //increment dialplan ordinal number + if ($previous_dialplan_uuid != $row['dialplan_uuid']) { + $x++; $y = 0; + } + + //build the array + $array[$x]['dialplan_uuid'] = $row['dialplan_uuid']; + $array[$x]['dialplan_context'] = $row['dialplan_context']; + $array[$x]['dialplan_name'] = $row['dialplan_name']; + $array[$x]['dialplan_continue'] = $row['dialplan_continue']; + $array[$x]['dialplan_order'] = $row['dialplan_order']; + $array[$x]['dialplan_enabled'] = $row['dialplan_enabled']; + $array[$x]['dialplan_description'] = $row['dialplan_description']; + if (!empty($row['dialplan_detail_uuid'])) { + $array[$x]['dialplan_details'][$y]['dialplan_uuid'] = $row['dialplan_uuid']; + $array[$x]['dialplan_details'][$y]['dialplan_detail_uuid'] = $row['dialplan_detail_uuid']; + $array[$x]['dialplan_details'][$y]['dialplan_detail_tag'] = $row['dialplan_detail_tag']; + $array[$x]['dialplan_details'][$y]['dialplan_detail_type'] = $row['dialplan_detail_type']; + $array[$x]['dialplan_details'][$y]['dialplan_detail_data'] = $row['dialplan_detail_data']; + $y++; + } + + //set the previous dialplan_uuid + $previous_dialplan_uuid = $row['dialplan_uuid']; + } + } + + //set the session array + $_SESSION[$_SESSION['domain_uuid']]['outbound_routes'] = $array; + } + + //find the matching outbound routes + if (isset($_SESSION[$_SESSION['domain_uuid']]['outbound_routes'])) { + foreach ($_SESSION[$_SESSION['domain_uuid']]['outbound_routes'] as $row) { + if (isset($row['dialplan_details'])) { + foreach ($row['dialplan_details'] as $field) { + if ($field['dialplan_detail_tag'] == "condition") { + if ($field['dialplan_detail_type'] == "destination_number") { + $dialplan_detail_data = $field['dialplan_detail_data']; + $pattern = '/'.$dialplan_detail_data.'/'; + preg_match($pattern, $destination_number, $matches, PREG_OFFSET_CAPTURE); + if (count($matches) == 0) { + $regex_match = false; + } + else { + $regex_match = true; + $regex_match_1 = $matches[1][0]; + $regex_match_2 = $matches[2][0]; + $regex_match_3 = $matches[3][0]; + } + } + } + if ($regex_match) { + //get the variables + if ($field[dialplan_detail_type] == "set" && $field[dialplan_detail_tag] == "action") { + //only set variables with values not variables + if (strpos($field[dialplan_detail_data], '$') === false) { + $this->variables .= $field[dialplan_detail_data].","; + } + } + //process the $x detail data variables + if ($field['dialplan_detail_tag'] == "action" && $field['dialplan_detail_type'] == "bridge" && $dialplan_detail_data != "\${enum_auto_route}") { + $dialplan_detail_data = $field['dialplan_detail_data']; + $dialplan_detail_data = str_replace("\$1", $regex_match_1, $dialplan_detail_data); + $dialplan_detail_data = str_replace("\$2", $regex_match_2, $dialplan_detail_data); + $dialplan_detail_data = str_replace("\$3", $regex_match_3, $dialplan_detail_data); + $this->bridges = $dialplan_detail_data; + } + } //if + } //foreach + } //if + } //foreach + } //if + } //function + + //combines array dialplans and dialplan details arrays to match results from the database + public function prepare_details($database_array) { + $array = []; + $id = 0; + foreach($database_array['dialplans'] as $row) { + if (!empty($row['dialplan_details'])) { + foreach($row['dialplan_details'] as $detail) { + if ($detail['dialplan_detail_enabled'] == true) { + $array[$id]['domain_uuid'] = $row['domain_uuid']; + $array[$id]['dialplan_uuid'] = $row['dialplan_uuid']; + $array[$id]['app_uuid'] = $row['app_uuid']; + $array[$id]['dialplan_context'] = $row['dialplan_context']; + $array[$id]['dialplan_name'] = $row['dialplan_name']; + $array[$id]['dialplan_number'] = $row['dialplan_number']; + $array[$id]['dialplan_continue'] = $row['dialplan_continue']; + $array[$id]['dialplan_order'] = $row['dialplan_order']; + $array[$id]['dialplan_enabled'] = $row['dialplan_enabled']; + $array[$id]['dialplan_description'] = $row['dialplan_description']; + $array[$id]['dialplan_detail_uuid'] = $detail['dialplan_detail_uuid']; + $array[$id]['dialplan_detail_tag'] = $detail['dialplan_detail_tag']; + $array[$id]['dialplan_detail_type'] = $detail['dialplan_detail_type']; + $array[$id]['dialplan_detail_data'] = $detail['dialplan_detail_data']; + $array[$id]['dialplan_detail_break'] = $detail['dialplan_detail_break']; + $array[$id]['dialplan_detail_inline'] = $detail['dialplan_detail_inline']; + $array[$id]['dialplan_detail_group'] = $detail['dialplan_detail_group']; + $array[$id]['dialplan_detail_order'] = $detail['dialplan_detail_order']; + $array[$id]['dialplan_detail_enabled'] = $detail['dialplan_detail_enabled']; + $id++; + } + } + } + } + //sort the dataset by group and then by order before returning the values + $dialplan_detail_group = array_column($array, 'dialplan_detail_group'); + $dialplan_detail_order = array_column($array, 'dialplan_detail_order'); + array_multisort($dialplan_detail_group, SORT_ASC, $dialplan_detail_order, SORT_ASC, $array); + $this->dialplan_details = $array; + } + + //reads dialplan details from the database to build the xml + public function xml() { + + //set the xml array and then concatenate the array to a string + /* $xml = "\n"; */ + //$xml .= "\n"; + //$xml .= "
\n"; + //$xml .= " context . "\">\n"; + + //set defaults + $previous_dialplan_uuid = ""; + $previous_dialplan_detail_group = ""; + $dialplan_tag_status = "closed"; + $condition_tag_status = "closed"; + + //get the dialplans from the dialplan_xml field in the dialplans table + if ($this->source == "dialplans") { + + //get the data using a join between the dialplans and dialplan details tables + $sql = "select dialplan_uuid, dialplan_xml "; + $sql .= "from v_dialplans "; + if (is_uuid($this->uuid)) { + $sql .= "where dialplan_uuid = :dialplan_uuid "; + $parameters['dialplan_uuid'] = $this->uuid; + } + else { + if (!empty($this->context)) { + if ($this->context == "public" || substr($this->context, 0, 7) == "public@" || substr($this->context, -7) == ".public") { + $sql .= "where dialplan_context = :dialplan_context "; + } + else { + $sql .= "where (dialplan_context = :dialplan_context or dialplan_context = '\${domain_name}' or dialplan_context = 'global') "; + } + $sql .= "and dialplan_enabled = true "; + $parameters['dialplan_context'] = $this->context; + } + } + if ($this->is_empty == "dialplan_xml") { + $sql .= "and p.dialplan_xml is null "; + } + $sql .= "order by "; + $sql .= "dialplan_context asc, "; + $sql .= "dialplan_order asc "; + $results = $this->database->select($sql, $parameters ?? null, 'all'); + if (!empty($results)) { + foreach ($results as $row) { + $dialplans[$row["dialplan_uuid"]] = $row["dialplan_xml"]; + } + } + unset($sql, $parameters, $results, $row); + + } + + //get the dialplans from the dialplan details + if ($this->source == "details") { + + //get the domains + if (!isset($domains)) { + $sql = "select * from v_domains "; + $result = $this->database->select($sql, null, 'all'); + if (!empty($result)) { + foreach($result as $row) { + $domains[$row['domain_uuid']] = $row['domain_name']; + } + } + unset($sql, $result, $row); + } + + //get the data using a join between the dialplans and dialplan details tables + if (empty($this->dialplan_details)) { + $sql = "select \n"; + $sql .= "p.domain_uuid, p.dialplan_uuid, p.app_uuid, p.dialplan_context, p.dialplan_name, p.dialplan_number, \n"; + $sql .= "p.dialplan_continue, p.dialplan_order, p.dialplan_enabled, p.dialplan_description, \n"; + $sql .= "s.dialplan_detail_uuid, s.dialplan_detail_tag, s.dialplan_detail_type, s.dialplan_detail_data, \n"; + $sql .= "s.dialplan_detail_break, s.dialplan_detail_inline, s.dialplan_detail_group, s.dialplan_detail_order, s.dialplan_detail_enabled \n"; + $sql .= "from v_dialplans as p, v_dialplan_details as s \n"; + $sql .= "where p.dialplan_uuid = s.dialplan_uuid \n"; + if ($this->is_empty == "dialplan_xml") { + $sql .= "and p.dialplan_xml is null \n"; + } + if (isset($this->context)) { + if ($this->context == "public" || substr($this->context, 0, 7) == "public@" || substr($this->context, -7) == ".public") { + $sql .= "and p.dialplan_context = :dialplan_context \n"; + } + else { + $sql .= "and (p.dialplan_context = :dialplan_context or p.dialplan_context = '\${domain_name}' or dialplan_context = 'global') \n"; + } + $parameters['dialplan_context'] = $this->context; + } + if (is_uuid($this->uuid)) { + $sql .= "and p.dialplan_uuid = :dialplan_uuid \n"; + $parameters['dialplan_uuid'] = $this->uuid; + } + $sql .= "and (s.dialplan_detail_enabled = true or s.dialplan_detail_enabled is null) \n"; + $sql .= "order by \n"; + $sql .= "p.dialplan_order asc, \n"; + $sql .= "p.dialplan_name asc, \n"; + $sql .= "p.dialplan_uuid asc, \n"; + $sql .= "s.dialplan_detail_group asc, \n"; + $sql .= "case s.dialplan_detail_tag \n"; + $sql .= "when 'condition' then 0 \n"; + $sql .= "when 'regex' then 1 \n"; + $sql .= "when 'action' then 2 \n"; + $sql .= "when 'anti-action' then 3 \n"; + $sql .= "else 100 end, \n"; + $sql .= "s.dialplan_detail_order asc \n"; + $this->dialplan_details = $this->database->select($sql, $parameters ?? null, 'all'); + unset($sql, $parameters); + + //return if no records were found to update + if (empty($this->dialplan_details)) { + return; + } + } + + //define the values before they are used + $previous_dialplan_uuid = null; + $previous_dialplan_detail_group = null; + $dialplan_tag_status = null; + + //loop through the results to get the xml from the dialplan_xml field or from dialplan details table + $x = 0; + if (!empty($this->dialplan_details)) { + foreach ($this->dialplan_details as $row) { + + //clear flag pass + $pass = false; + + //get the dialplan + $domain_uuid = $row["domain_uuid"]; + $dialplan_uuid = $row["dialplan_uuid"]; + //$app_uuid = $row["app_uuid"]; + $this->context = $row["dialplan_context"]; + $dialplan_name = $row["dialplan_name"]; + //$dialplan_number = $row["dialplan_number"]; + $dialplan_continue = $row["dialplan_continue"]; + //$dialplan_order = $row["dialplan_order"]; + //$dialplan_enabled = $row["dialplan_enabled"]; + //$dialplan_description = $row["dialplan_description"]; + + //$get the dialplan details + //$dialplan_detail_uuid = $row["dialplan_detail_uuid"]; + $dialplan_detail_tag = $row["dialplan_detail_tag"]; + $dialplan_detail_type = $row["dialplan_detail_type"]; + $dialplan_detail_data = $row["dialplan_detail_data"]; + $dialplan_detail_break = $row["dialplan_detail_break"]; + $dialplan_detail_inline = $row["dialplan_detail_inline"]; + $dialplan_detail_group = $row["dialplan_detail_group"]; + //$dialplan_detail_order = $row["dialplan_detail_order; + + //remove $$ and replace with $ + $dialplan_detail_data = str_replace("$$", "$", $dialplan_detail_data ?? ''); + + //get the dialplan detail inline + $detail_inline = ""; + if ($dialplan_detail_inline) { + if (!empty($dialplan_detail_inline)) { + $detail_inline = " inline=\"" . $dialplan_detail_inline . "\""; + } + } + + //close the tags + if ($dialplan_tag_status != "closed") { + if (($previous_dialplan_uuid != $dialplan_uuid) || ($previous_dialplan_detail_group != $dialplan_detail_group)) { + + if ($condition_tag_status != "closed") { + + if ($condition_attribute && (!empty($condition_attribute))) { + $xml .= " \n"; + $condition_attribute = ""; + $condition_tag_status = "closed"; + } + else if (!empty($condition) && substr($condition, -1) == ">") { + $xml .= " ".$condition; + $condition = ""; + $condition_tag_status = "closed"; + } + else if (!empty($condition)) { + $xml .= " ".$condition . "/>"; + $condition = ""; + $condition_tag_status = "closed"; + } + else if ($condition_tag_status != "closed") { + $xml .= " \n"; + $condition_tag_status = "closed"; + } + $condition_tag_status = "closed"; + } + } + if ($previous_dialplan_uuid != $dialplan_uuid) { + //close the extension tag + if (!empty($previous_dialplan_uuid)) { + $xml .= "\n"; + } + + //add to the dialplans + $dialplans[$previous_dialplan_uuid] = $xml ?? ''; + $xml = ''; + + $dialplan_tag_status = "closed"; + } + } + + //open the tags + if ($dialplan_tag_status == "closed") { + + $xml = ''; + $xml .= "\n"; + + $dialplan_tag_status = "open"; + $first_action = true; + $condition = ""; + $condition_attribute = ""; + } + if (isset($dialplan_detail_tag) && $dialplan_detail_tag == "condition" || $dialplan_detail_tag == "regex") { + //determine the type of condition + if ($dialplan_detail_type == "hour") { + $condition_type = 'time'; + } + else if ($dialplan_detail_type == "minute") { + $condition_type = 'time'; + } + else if ($dialplan_detail_type == "minute-of-day") { + $condition_type = 'time'; + } + else if ($dialplan_detail_type == "mday") { + $condition_type = 'time'; + } + else if ($dialplan_detail_type == "mweek") { + $condition_type = 'time'; + } + else if ($dialplan_detail_type == "mon") { + $condition_type = 'time'; + } + else if ($dialplan_detail_type == "time-of-day") { + $condition_type = 'time'; + } + else if ($dialplan_detail_type == "yday") { + $condition_type = 'time'; + } + else if ($dialplan_detail_type == "year") { + $condition_type = 'time'; + } + else if ($dialplan_detail_type == "wday") { + $condition_type = 'time'; + } + else if ($dialplan_detail_type == "week") { + $condition_type = 'time'; + } + else if ($dialplan_detail_type == "date-time") { + $condition_type = 'time'; + } + else { + $condition_type = 'default'; + } + + //finalize any previous pending condition statements + if ($condition_tag_status == "open") { + if (!empty($condition) && substr($condition, -1) == ">") { + $xml .= $condition . "\n"; + $condition = ''; + $condition_tag_status = "closed"; + } + else if (!empty($condition)) { + $xml .= $condition . "/>\n"; + $condition = ''; + $condition_tag_status = "closed"; + } + else if (!empty($condition_attribute) && $condition_tag_status == "open") { + // previous condition(s) must have been of type time + // do not finalize if new condition is also of type time + if ($condition_type != 'time') { + // note: condition_break here is value from the previous loop + $xml .= " \n"; + $condition_attribute = ''; + $condition_tag_status = "closed"; + } + //else { + // $xml .= " \n"; + // $condition_tag_status = "closed"; + //} + } + } + + //get the condition break attribute + $condition_break = ""; + if ($dialplan_detail_break) { + if (!empty($dialplan_detail_break)) { + $condition_break = " break=\"" . $dialplan_detail_break . "\""; + } + } + + //condition tag but leave off the ending + if ($condition_type == "default") { + if (isset($dialplan_detail_type) && $dialplan_detail_tag == 'condition' && $dialplan_detail_type == 'regex') { + $condition = " "; + } + elseif (isset($dialplan_detail_type) && $dialplan_detail_tag == 'regex') { + $condition = " "; + } + else { + $condition = " \n"; + $condition_attribute = ""; + } + else if (!empty($condition) && !empty($condition_tag_status) && substr($condition, -1) == ">") { + $xml .= $condition . "\n"; + $condition = ""; + } + else if (!empty($condition) && !empty($condition_tag_status)) { + $xml .= $condition . ">\n"; + $condition = ""; } } } - if ($regex_match) { - //get the variables - if ($field[dialplan_detail_type] == "set" && $field[dialplan_detail_tag] == "action") { - //only set variables with values not variables - if (strpos($field[dialplan_detail_data], '$') === false) { - $this->variables .= $field[dialplan_detail_data].","; - } - } - //process the $x detail data variables - if ($field['dialplan_detail_tag'] == "action" && $field['dialplan_detail_type'] == "bridge" && $dialplan_detail_data != "\${enum_auto_route}") { - $dialplan_detail_data = $field['dialplan_detail_data']; - $dialplan_detail_data = str_replace("\$1", $regex_match_1, $dialplan_detail_data); - $dialplan_detail_data = str_replace("\$2", $regex_match_2, $dialplan_detail_data); - $dialplan_detail_data = str_replace("\$3", $regex_match_3, $dialplan_detail_data); - $this->bridges = $dialplan_detail_data; - } - } //if - } //foreach - } //if - } //foreach - } //if - } //function - //combines array dialplans and dialplan details arrays to match results from the database - public function prepare_details($database_array) { - $array = []; - $id = 0; - foreach($database_array['dialplans'] as $row) { - if (!empty($row['dialplan_details'])) { - foreach($row['dialplan_details'] as $detail) { - if ($detail['dialplan_detail_enabled'] == true) { - $array[$id]['domain_uuid'] = $row['domain_uuid']; - $array[$id]['dialplan_uuid'] = $row['dialplan_uuid']; - $array[$id]['app_uuid'] = $row['app_uuid']; - $array[$id]['dialplan_context'] = $row['dialplan_context']; - $array[$id]['dialplan_name'] = $row['dialplan_name']; - $array[$id]['dialplan_number'] = $row['dialplan_number']; - $array[$id]['dialplan_continue'] = $row['dialplan_continue']; - $array[$id]['dialplan_order'] = $row['dialplan_order']; - $array[$id]['dialplan_enabled'] = $row['dialplan_enabled']; - $array[$id]['dialplan_description'] = $row['dialplan_description']; - $array[$id]['dialplan_detail_uuid'] = $detail['dialplan_detail_uuid']; - $array[$id]['dialplan_detail_tag'] = $detail['dialplan_detail_tag']; - $array[$id]['dialplan_detail_type'] = $detail['dialplan_detail_type']; - $array[$id]['dialplan_detail_data'] = $detail['dialplan_detail_data']; - $array[$id]['dialplan_detail_break'] = $detail['dialplan_detail_break']; - $array[$id]['dialplan_detail_inline'] = $detail['dialplan_detail_inline']; - $array[$id]['dialplan_detail_group'] = $detail['dialplan_detail_group']; - $array[$id]['dialplan_detail_order'] = $detail['dialplan_detail_order']; - $array[$id]['dialplan_detail_enabled'] = $detail['dialplan_detail_enabled']; - $id++; + if ($this->context == "public" || substr($this->context, 0, 7) == "public@" || substr($this->context, -7) == ".public") { + if ($dialplan_detail_tag == "action") { + if ($first_action) { + //add the call direction and domain name and uuid + $xml .= " \n"; + if (!empty($domain_uuid)) { + $domain_name = $domains[$domain_uuid]; + $xml .= " \n"; + } + if (!empty($domain_name)) { + $xml .= " \n"; + } + $first_action = false; + } + } + } + if ($dialplan_detail_tag == "action") { + $xml .= " \n"; + } + if ($dialplan_detail_tag == "anti-action") { + $xml .= " \n"; + } + + //reset back to first action if the group has changed + if ($previous_dialplan_detail_group != $dialplan_detail_group) { + $first_action = true; + } + + //save the previous values + $previous_dialplan_uuid = $dialplan_uuid; + $previous_dialplan_detail_group = $dialplan_detail_group; + + //increment the x + $x++; + + //set flag pass + $pass = true; + } + } + unset($row); + + //prevent partial dialplan (pass=nil may be error in sql or empty resultset) + if (isset($pass) && $pass == false) { + if (!empty($this->details)) { + echo 'error while build context: ' . $this->context; + } + } + + //close the extension tag if it was left open + if ($dialplan_tag_status == "open") { + if ($condition_tag_status == "open") { + if ($condition_attribute && (!empty($condition_attribute))) { + $xml .= " \n"; + } + else if (!empty($condition) && substr($string, -1) == ">") { + $xml .= $condition . "\n"; + } + else if (!empty($condition)) { + $xml .= $condition . "/>\n"; + } + else { + $xml .= " \n"; + } + } + $xml .= "\n"; + + //add to the dialplans array + $dialplans[$dialplan_uuid] = $xml; + } + + //set the xml array and then concatenate the array to a string + //$xml .= " \n"; + //$xml .= "
\n"; + //$xml .= "
\n"; + + } //end if source = details + + //return the array + if ($this->destination == "array") { + return $dialplans; + } + + //save the dialplan xml + if ($this->destination == "database") { + if (!empty($dialplans)) { + $x = 0; + foreach ($dialplans as $key => $value) { + if (is_uuid($key) && !empty($value)) { + //build update array + $array['dialplans'][$x]['dialplan_uuid'] = $key; + $array['dialplans'][$x]['dialplan_xml'] = $value; + + //grant temporary permissions + $p = permissions::new(); + $p->add('dialplan_edit', 'temp'); + + //execute update + $this->database->app_name = 'dialplans'; + $this->database->app_uuid = '742714e5-8cdf-32fd-462c-cbe7e3d655db'; + $this->database->save($array); + unset($array); + + //revoke temporary permissions + $p->delete('dialplan_edit', 'temp'); } } } } - //sort the dataset by group and then by order before returning the values - $dialplan_detail_group = array_column($array, 'dialplan_detail_group'); - $dialplan_detail_order = array_column($array, 'dialplan_detail_order'); - array_multisort($dialplan_detail_group, SORT_ASC, $dialplan_detail_order, SORT_ASC, $array); - $this->dialplan_details = $array; + + } + + public function defaults() { + + //get the array of xml files and then process thm + $xml_list = glob($_SERVER["DOCUMENT_ROOT"] . PROJECT_PATH . "/*/*/resources/switch/conf/dialplan/*.xml"); + foreach ($xml_list as $xml_file) { + //get and parse the xml + $xml_string = file_get_contents($xml_file); + //get the order number prefix from the file name + $name_array = explode('_', basename($xml_file)); + if (is_numeric($name_array[0])) { + $dialplan_order = $name_array[0]; + } + else { + $dialplan_order = 0; + } + $dialplan->dialplan_order = $dialplan_order; + + $this->xml = $xml_string; + $this->import(); + } + + //update the dialplan order + $sql[] = "update v_dialplans set dialplan_order = '870' where dialplan_order = '980' and dialplan_name = 'cidlookup' "; + $sql[] = "update v_dialplans set dialplan_order = '880' where dialplan_order = '990' and dialplan_name = 'call_screen' "; + $sql[] = "update v_dialplans set dialplan_order = '890' where dialplan_order = '999' and dialplan_name = 'local_extension' "; + foreach ($sql as $query) { + $this->database->execute($query); + } + unset($sql, $query); + + //add xml for each dialplan where the dialplan xml is empty + $this->source = "details"; + $this->destination = "database"; + $this->is_empty = "dialplan_xml"; + $array = $this->xml(); + //print_r($array); + unset($this->source, $this->destination, $this->is_empty, $array); + + } + + /** + * delete records + */ + public function delete($records) { + + //determine app and permission prefix + if ($this->app_uuid == 'c03b422e-13a8-bd1b-e42b-b6b9b4d27ce4') { + $this->app_name = 'dialplan_inbound'; + $this->permission_prefix = 'inbound_route_'; + } + else if ($this->app_uuid == '8c914ec3-9fc0-8ab5-4cda-6c9288bdc9a3') { + $this->app_name = 'dialplan_outbound'; + $this->permission_prefix = 'outbound_route_'; + } + else if ($this->app_uuid == '16589224-c876-aeb3-f59f-523a1c0801f7') { + $this->app_name = 'fifo'; + $this->permission_prefix = 'fifo_'; + } + else if ($this->app_uuid == '4b821450-926b-175a-af93-a03c441818b1') { + $this->app_name = 'time_conditions'; + $this->permission_prefix = 'time_condition_'; + } + else { + //use default in constructor + } + + 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 (!empty($records)) { + + //build the delete array + foreach ($records as $x => $record) { + if (!empty($record['checked']) && $record['checked'] == 'true' && is_uuid($record['uuid'])) { + + //build delete array + $array[$this->table][$x][$this->uuid_prefix.'uuid'] = $record['uuid']; + $array['dialplan_details'][$x]['dialplan_uuid'] = $record['uuid']; + + //get the dialplan context + $sql = "select dialplan_context from v_dialplans "; + $sql .= "where dialplan_uuid = :dialplan_uuid "; + $parameters['dialplan_uuid'] = $record['uuid']; + $dialplan_contexts[] = $this->database->select($sql, $parameters ?? null, 'column'); + unset($sql, $parameters); + + } + } + + //delete the checked rows + if (!empty($array)) { + + //grant temporary permissions + $p = permissions::new(); + $p->add('dialplan_delete', 'temp'); + $p->add('dialplan_detail_delete', 'temp'); + + //execute delete + $this->database->app_name = $this->app_name; + $this->database->app_uuid = $this->app_uuid; + $this->database->delete($array); + + //revoke temporary permissions + $p->delete('dialplan_delete', 'temp'); + $p->delete('dialplan_detail_delete', 'temp'); + + //clear the cache + if (!empty($dialplan_contexts)) { + $dialplan_contexts = array_unique($dialplan_contexts, SORT_STRING); + $cache = new cache; + foreach ($dialplan_contexts as $dialplan_context) { + $cache->delete("dialplan:".$dialplan_context); + } + } + + //clear the destinations session array + if (isset($_SESSION['destinations']['array'])) { + unset($_SESSION['destinations']['array']); + } + + //set message + message::add($text['message-delete'].': '.@sizeof($array[$this->table])); + + } + unset($records, $array); + + } } + } - //reads dialplan details from the database to build the xml - public function xml() { + public function delete_details($records) { + //set private variables + $this->table = 'dialplan_details'; + $this->uuid_prefix = 'dialplan_detail_'; - //set the xml array and then concatenate the array to a string - /* $xml = "\n"; */ - //$xml .= "\n"; - //$xml .= "
\n"; - //$xml .= " context . "\">\n"; + //determine app and permission prefix + if ($this->app_uuid == 'c03b422e-13a8-bd1b-e42b-b6b9b4d27ce4') { + $this->app_name = 'dialplan_inbound'; + $this->permission_prefix = 'inbound_route_'; + } + else if ($this->app_uuid == '8c914ec3-9fc0-8ab5-4cda-6c9288bdc9a3') { + $this->app_name = 'dialplan_outbound'; + $this->permission_prefix = 'outbound_route_'; + } + else if ($this->app_uuid == '16589224-c876-aeb3-f59f-523a1c0801f7') { + $this->app_name = 'fifo'; + $this->permission_prefix = 'fifo_'; + } + else if ($this->app_uuid == '4b821450-926b-175a-af93-a03c441818b1') { + $this->app_name = 'time_conditions'; + $this->permission_prefix = 'time_condition_'; + } + else { + $this->permission_prefix = 'dialplan_detail_'; + } - //set defaults - $previous_dialplan_uuid = ""; - $previous_dialplan_detail_group = ""; - $dialplan_tag_status = "closed"; - $condition_tag_status = "closed"; + if (permission_exists($this->permission_prefix.'delete')) { - //get the dialplans from the dialplan_xml field in the dialplans table - if ($this->source == "dialplans") { - - //get the data using a join between the dialplans and dialplan details tables - $sql = "select dialplan_uuid, dialplan_xml "; - $sql .= "from v_dialplans "; - if (is_uuid($this->uuid)) { - $sql .= "where dialplan_uuid = :dialplan_uuid "; - $parameters['dialplan_uuid'] = $this->uuid; - } - else { - if (!empty($this->context)) { - if ($this->context == "public" || substr($this->context, 0, 7) == "public@" || substr($this->context, -7) == ".public") { - $sql .= "where dialplan_context = :dialplan_context "; - } - else { - $sql .= "where (dialplan_context = :dialplan_context or dialplan_context = '\${domain_name}' or dialplan_context = 'global') "; - } - $sql .= "and dialplan_enabled = true "; - $parameters['dialplan_context'] = $this->context; - } - } - if ($this->is_empty == "dialplan_xml") { - $sql .= "and p.dialplan_xml is null "; - } - $sql .= "order by "; - $sql .= "dialplan_context asc, "; - $sql .= "dialplan_order asc "; - $results = $this->database->select($sql, $parameters ?? null, 'all'); - if (!empty($results)) { - foreach ($results as $row) { - $dialplans[$row["dialplan_uuid"]] = $row["dialplan_xml"]; - } - } - unset($sql, $parameters, $results, $row); + //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; } - //get the dialplans from the dialplan details - if ($this->source == "details") { + //delete multiple records + if (!empty($records)) { - //get the domains - if (!isset($domains)) { - $sql = "select * from v_domains "; - $result = $this->database->select($sql, null, 'all'); - if (!empty($result)) { - foreach($result as $row) { - $domains[$row['domain_uuid']] = $row['domain_name']; - } - } - unset($sql, $result, $row); - } + //build the delete array + foreach ($records as $x => $record) { + if (!empty($record['checked']) && $record['checked'] == 'true' && is_uuid($record['uuid'])) { - //get the data using a join between the dialplans and dialplan details tables - if (empty($this->dialplan_details)) { - $sql = "select \n"; - $sql .= "p.domain_uuid, p.dialplan_uuid, p.app_uuid, p.dialplan_context, p.dialplan_name, p.dialplan_number, \n"; - $sql .= "p.dialplan_continue, p.dialplan_order, p.dialplan_enabled, p.dialplan_description, \n"; - $sql .= "s.dialplan_detail_uuid, s.dialplan_detail_tag, s.dialplan_detail_type, s.dialplan_detail_data, \n"; - $sql .= "s.dialplan_detail_break, s.dialplan_detail_inline, s.dialplan_detail_group, s.dialplan_detail_order, s.dialplan_detail_enabled \n"; - $sql .= "from v_dialplans as p, v_dialplan_details as s \n"; - $sql .= "where p.dialplan_uuid = s.dialplan_uuid \n"; - if ($this->is_empty == "dialplan_xml") { - $sql .= "and p.dialplan_xml is null \n"; - } - if (isset($this->context)) { - if ($this->context == "public" || substr($this->context, 0, 7) == "public@" || substr($this->context, -7) == ".public") { - $sql .= "and p.dialplan_context = :dialplan_context \n"; - } - else { - $sql .= "and (p.dialplan_context = :dialplan_context or p.dialplan_context = '\${domain_name}' or dialplan_context = 'global') \n"; - } - $parameters['dialplan_context'] = $this->context; - } - if (is_uuid($this->uuid)) { - $sql .= "and p.dialplan_uuid = :dialplan_uuid \n"; - $parameters['dialplan_uuid'] = $this->uuid; - } - $sql .= "and (s.dialplan_detail_enabled = true or s.dialplan_detail_enabled is null) \n"; - $sql .= "order by \n"; - $sql .= "p.dialplan_order asc, \n"; - $sql .= "p.dialplan_name asc, \n"; - $sql .= "p.dialplan_uuid asc, \n"; - $sql .= "s.dialplan_detail_group asc, \n"; - $sql .= "case s.dialplan_detail_tag \n"; - $sql .= "when 'condition' then 0 \n"; - $sql .= "when 'regex' then 1 \n"; - $sql .= "when 'action' then 2 \n"; - $sql .= "when 'anti-action' then 3 \n"; - $sql .= "else 100 end, \n"; - $sql .= "s.dialplan_detail_order asc \n"; - $this->dialplan_details = $this->database->select($sql, $parameters ?? null, 'all'); - unset($sql, $parameters); + //build delete array + $array[$this->table][$x][$this->uuid_prefix.'uuid'] = $record['uuid']; + $array[$this->table][$x]['dialplan_uuid'] = $this->dialplan_uuid; + + //get the dialplan context + $sql = "select dialplan_context from v_dialplans "; + $sql .= "where dialplan_uuid = :dialplan_uuid "; + $parameters['dialplan_uuid'] = $this->dialplan_uuid; + $dialplan_contexts[] = $this->database->select($sql, $parameters ?? null, 'column'); + unset($sql, $parameters); - //return if no records were found to update - if (empty($this->dialplan_details)) { - return; } } - //define the values before they are used - $previous_dialplan_uuid = null; - $previous_dialplan_detail_group = null; - $dialplan_tag_status = null; + //delete the checked rows + if (!empty($array)) { - //loop through the results to get the xml from the dialplan_xml field or from dialplan details table - $x = 0; - if (!empty($this->dialplan_details)) { - foreach ($this->dialplan_details as $row) { + //grant temporary permissions + $p = permissions::new(); + $p->add('dialplan_detail_delete', 'temp'); - //clear flag pass - $pass = false; + //execute delete + $this->database->app_name = $this->app_name; + $this->database->app_uuid = $this->app_uuid; + $this->database->delete($array); - //get the dialplan - $domain_uuid = $row["domain_uuid"]; - $dialplan_uuid = $row["dialplan_uuid"]; - //$app_uuid = $row["app_uuid"]; - $this->context = $row["dialplan_context"]; - $dialplan_name = $row["dialplan_name"]; - //$dialplan_number = $row["dialplan_number"]; - $dialplan_continue = $row["dialplan_continue"]; - //$dialplan_order = $row["dialplan_order"]; - //$dialplan_enabled = $row["dialplan_enabled"]; - //$dialplan_description = $row["dialplan_description"]; + //revoke temporary permissions + $p->delete('dialplan_detail_delete', 'temp'); - //$get the dialplan details - //$dialplan_detail_uuid = $row["dialplan_detail_uuid"]; - $dialplan_detail_tag = $row["dialplan_detail_tag"]; - $dialplan_detail_type = $row["dialplan_detail_type"]; - $dialplan_detail_data = $row["dialplan_detail_data"]; - $dialplan_detail_break = $row["dialplan_detail_break"]; - $dialplan_detail_inline = $row["dialplan_detail_inline"]; - $dialplan_detail_group = $row["dialplan_detail_group"]; - //$dialplan_detail_order = $row["dialplan_detail_order; - - //remove $$ and replace with $ - $dialplan_detail_data = str_replace("$$", "$", $dialplan_detail_data ?? ''); - - //get the dialplan detail inline - $detail_inline = ""; - if ($dialplan_detail_inline) { - if (!empty($dialplan_detail_inline)) { - $detail_inline = " inline=\"" . $dialplan_detail_inline . "\""; - } + //clear the cache + if (!empty($dialplan_contexts)) { + $dialplan_contexts = array_unique($dialplan_contexts, SORT_STRING); + $cache = new cache; + foreach ($dialplan_contexts as $dialplan_context) { + $cache->delete("dialplan:".$dialplan_context); } + } - //close the tags - if ($dialplan_tag_status != "closed") { - if (($previous_dialplan_uuid != $dialplan_uuid) || ($previous_dialplan_detail_group != $dialplan_detail_group)) { - - if ($condition_tag_status != "closed") { - - if ($condition_attribute && (!empty($condition_attribute))) { - $xml .= " \n"; - $condition_attribute = ""; - $condition_tag_status = "closed"; - } - else if (!empty($condition) && substr($condition, -1) == ">") { - $xml .= " ".$condition; - $condition = ""; - $condition_tag_status = "closed"; - } - else if (!empty($condition)) { - $xml .= " ".$condition . "/>"; - $condition = ""; - $condition_tag_status = "closed"; - } - else if ($condition_tag_status != "closed") { - $xml .= " \n"; - $condition_tag_status = "closed"; - } - $condition_tag_status = "closed"; - } - } - if ($previous_dialplan_uuid != $dialplan_uuid) { - //close the extension tag - if (!empty($previous_dialplan_uuid)) { - $xml .= "\n"; - } - - //add to the dialplans - $dialplans[$previous_dialplan_uuid] = $xml ?? ''; - $xml = ''; - - $dialplan_tag_status = "closed"; - } - } - - //open the tags - if ($dialplan_tag_status == "closed") { - - $xml = ''; - $xml .= "\n"; - - $dialplan_tag_status = "open"; - $first_action = true; - $condition = ""; - $condition_attribute = ""; - } - if (isset($dialplan_detail_tag) && $dialplan_detail_tag == "condition" || $dialplan_detail_tag == "regex") { - //determine the type of condition - if ($dialplan_detail_type == "hour") { - $condition_type = 'time'; - } - else if ($dialplan_detail_type == "minute") { - $condition_type = 'time'; - } - else if ($dialplan_detail_type == "minute-of-day") { - $condition_type = 'time'; - } - else if ($dialplan_detail_type == "mday") { - $condition_type = 'time'; - } - else if ($dialplan_detail_type == "mweek") { - $condition_type = 'time'; - } - else if ($dialplan_detail_type == "mon") { - $condition_type = 'time'; - } - else if ($dialplan_detail_type == "time-of-day") { - $condition_type = 'time'; - } - else if ($dialplan_detail_type == "yday") { - $condition_type = 'time'; - } - else if ($dialplan_detail_type == "year") { - $condition_type = 'time'; - } - else if ($dialplan_detail_type == "wday") { - $condition_type = 'time'; - } - else if ($dialplan_detail_type == "week") { - $condition_type = 'time'; - } - else if ($dialplan_detail_type == "date-time") { - $condition_type = 'time'; - } - else { - $condition_type = 'default'; - } - - //finalize any previous pending condition statements - if ($condition_tag_status == "open") { - if (!empty($condition) && substr($condition, -1) == ">") { - $xml .= $condition . "\n"; - $condition = ''; - $condition_tag_status = "closed"; - } - else if (!empty($condition)) { - $xml .= $condition . "/>\n"; - $condition = ''; - $condition_tag_status = "closed"; - } - else if (!empty($condition_attribute) && $condition_tag_status == "open") { - // previous condition(s) must have been of type time - // do not finalize if new condition is also of type time - if ($condition_type != 'time') { - // note: condition_break here is value from the previous loop - $xml .= " \n"; - $condition_attribute = ''; - $condition_tag_status = "closed"; - } - //else { - // $xml .= " \n"; - // $condition_tag_status = "closed"; - //} - } - } - - //get the condition break attribute - $condition_break = ""; - if ($dialplan_detail_break) { - if (!empty($dialplan_detail_break)) { - $condition_break = " break=\"" . $dialplan_detail_break . "\""; - } - } - - //condition tag but leave off the ending - if ($condition_type == "default") { - if (isset($dialplan_detail_type) && $dialplan_detail_tag == 'condition' && $dialplan_detail_type == 'regex') { - $condition = " "; - } - elseif (isset($dialplan_detail_type) && $dialplan_detail_tag == 'regex') { - $condition = " "; - } - else { - $condition = " \n"; - $condition_attribute = ""; - } - else if (!empty($condition) && !empty($condition_tag_status) && substr($condition, -1) == ">") { - $xml .= $condition . "\n"; - $condition = ""; - } - else if (!empty($condition) && !empty($condition_tag_status)) { - $xml .= $condition . ">\n"; - $condition = ""; - } - } - } - - if ($this->context == "public" || substr($this->context, 0, 7) == "public@" || substr($this->context, -7) == ".public") { - if ($dialplan_detail_tag == "action") { - if ($first_action) { - //add the call direction and domain name and uuid - $xml .= " \n"; - if (!empty($domain_uuid)) { - $domain_name = $domains[$domain_uuid]; - $xml .= " \n"; - } - if (!empty($domain_name)) { - $xml .= " \n"; - } - $first_action = false; - } - } - } - if ($dialplan_detail_tag == "action") { - $xml .= " \n"; - } - if ($dialplan_detail_tag == "anti-action") { - $xml .= " \n"; - } - - //reset back to first action if the group has changed - if ($previous_dialplan_detail_group != $dialplan_detail_group) { - $first_action = true; - } - - //save the previous values - $previous_dialplan_uuid = $dialplan_uuid; - $previous_dialplan_detail_group = $dialplan_detail_group; - - //increment the x - $x++; - - //set flag pass - $pass = true; - } } - unset($row); + unset($records, $array); - //prevent partial dialplan (pass=nil may be error in sql or empty resultset) - if (isset($pass) && $pass == false) { - if (!empty($this->details)) { - echo 'error while build context: ' . $this->context; - } - } + } + } + } - //close the extension tag if it was left open - if ($dialplan_tag_status == "open") { - if ($condition_tag_status == "open") { - if ($condition_attribute && (!empty($condition_attribute))) { - $xml .= " \n"; - } - else if (!empty($condition) && substr($string, -1) == ">") { - $xml .= $condition . "\n"; - } - else if (!empty($condition)) { - $xml .= $condition . "/>\n"; - } - else { - $xml .= " \n"; - } - } - $xml .= "\n"; + /** + * toggle records + */ + public function toggle($records) { - //add to the dialplans array - $dialplans[$dialplan_uuid] = $xml; - } + //determine app and permission prefix + if ($this->app_uuid == 'c03b422e-13a8-bd1b-e42b-b6b9b4d27ce4') { + $this->app_name = 'dialplan_inbound'; + $this->permission_prefix = 'inbound_route_'; + } + else if ($this->app_uuid == '8c914ec3-9fc0-8ab5-4cda-6c9288bdc9a3') { + $this->app_name = 'dialplan_outbound'; + $this->permission_prefix = 'outbound_route_'; + } + else if ($this->app_uuid == '16589224-c876-aeb3-f59f-523a1c0801f7') { + $this->app_name = 'fifo'; + $this->permission_prefix = 'fifo_'; + } + else if ($this->app_uuid == '4b821450-926b-175a-af93-a03c441818b1') { + $this->app_name = 'time_conditions'; + $this->permission_prefix = 'time_condition_'; + } + else { + //use default in constructor + } - //set the xml array and then concatenate the array to a string - //$xml .= " \n"; - //$xml .= "
\n"; - //$xml .= "
\n"; + if (permission_exists($this->permission_prefix.'edit')) { - } //end if source = details + //add multi-lingual support + $language = new text; + $text = $language->get(); - //return the array - if ($this->destination == "array") { - return $dialplans; + //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; } - //save the dialplan xml - if ($this->destination == "database") { - if (!empty($dialplans)) { - $x = 0; - foreach ($dialplans as $key => $value) { - if (is_uuid($key) && !empty($value)) { - //build update array - $array['dialplans'][$x]['dialplan_uuid'] = $key; - $array['dialplans'][$x]['dialplan_xml'] = $value; + //toggle the checked records + if (!empty($records)) { - //grant temporary permissions + //get current toggle state + foreach($records as $x => $record) { + if (!empty($record['checked']) && $record['checked'] == 'true' && is_uuid($record['uuid'])) { + $uuids[] = "'".$record['uuid']."'"; + } + } + if (!empty($uuids)) { + $sql = "select ".$this->uuid_prefix."uuid as uuid, ".$this->toggle_field." as toggle, dialplan_context from v_".$this->table." "; + $sql .= "where ".$this->uuid_prefix."uuid in (".implode(', ', $uuids).") "; + if (!permission_exists('dialplan_all')) { + $sql .= "and (domain_uuid = :domain_uuid or domain_uuid is null) "; + $parameters['domain_uuid'] = $_SESSION['domain_uuid']; + } + $rows = $this->database->select($sql, $parameters ?? null, 'all'); + if (!empty($rows)) { + foreach ($rows as $row) { + $states[$row['uuid']] = $row['toggle']; + $dialplan_contexts[] = $row['dialplan_context']; + } + } + unset($sql, $parameters, $rows, $row); + } + + //build update array + $x = 0; + foreach($states as $uuid => $state) { + $array[$this->table][$x][$this->uuid_prefix.'uuid'] = $uuid; + $array[$this->table][$x][$this->toggle_field] = $state == $this->toggle_values[0] ? $this->toggle_values[1] : $this->toggle_values[0]; + $x++; + } + + //save the changes + if (!empty($array)) { + + //grant temporary permissions $p = permissions::new(); $p->add('dialplan_edit', 'temp'); - //execute update - $this->database->app_name = 'dialplans'; - $this->database->app_uuid = '742714e5-8cdf-32fd-462c-cbe7e3d655db'; + //save the array + $this->database->app_name = $this->app_name; + $this->database->app_uuid = $this->app_uuid; $this->database->save($array); unset($array); - //revoke temporary permissions + //revoke temporary permissions $p->delete('dialplan_edit', 'temp'); - } - } - } - } - - } - - public function defaults() { - - //get the array of xml files and then process thm - $xml_list = glob($_SERVER["DOCUMENT_ROOT"] . PROJECT_PATH . "/*/*/resources/switch/conf/dialplan/*.xml"); - foreach ($xml_list as $xml_file) { - //get and parse the xml - $xml_string = file_get_contents($xml_file); - //get the order number prefix from the file name - $name_array = explode('_', basename($xml_file)); - if (is_numeric($name_array[0])) { - $dialplan_order = $name_array[0]; - } - else { - $dialplan_order = 0; - } - $dialplan->dialplan_order = $dialplan_order; - - $this->xml = $xml_string; - $this->import(); - } - - //update the dialplan order - $sql[] = "update v_dialplans set dialplan_order = '870' where dialplan_order = '980' and dialplan_name = 'cidlookup' "; - $sql[] = "update v_dialplans set dialplan_order = '880' where dialplan_order = '990' and dialplan_name = 'call_screen' "; - $sql[] = "update v_dialplans set dialplan_order = '890' where dialplan_order = '999' and dialplan_name = 'local_extension' "; - foreach ($sql as $query) { - $this->database->execute($query); - } - unset($sql, $query); - - //add xml for each dialplan where the dialplan xml is empty - $this->source = "details"; - $this->destination = "database"; - $this->is_empty = "dialplan_xml"; - $array = $this->xml(); - //print_r($array); - unset($this->source, $this->destination, $this->is_empty, $array); - - } - - /** - * delete records - */ - public function delete($records) { - - //determine app and permission prefix - if ($this->app_uuid == 'c03b422e-13a8-bd1b-e42b-b6b9b4d27ce4') { - $this->app_name = 'dialplan_inbound'; - $this->permission_prefix = 'inbound_route_'; - } - else if ($this->app_uuid == '8c914ec3-9fc0-8ab5-4cda-6c9288bdc9a3') { - $this->app_name = 'dialplan_outbound'; - $this->permission_prefix = 'outbound_route_'; - } - else if ($this->app_uuid == '16589224-c876-aeb3-f59f-523a1c0801f7') { - $this->app_name = 'fifo'; - $this->permission_prefix = 'fifo_'; - } - else if ($this->app_uuid == '4b821450-926b-175a-af93-a03c441818b1') { - $this->app_name = 'time_conditions'; - $this->permission_prefix = 'time_condition_'; - } - else { - //use default in constructor - } - - 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 (!empty($records)) { - - //build the delete array - foreach ($records as $x => $record) { - if (!empty($record['checked']) && $record['checked'] == 'true' && is_uuid($record['uuid'])) { - - //build delete array - $array[$this->table][$x][$this->uuid_prefix.'uuid'] = $record['uuid']; - $array['dialplan_details'][$x]['dialplan_uuid'] = $record['uuid']; - - //get the dialplan context - $sql = "select dialplan_context from v_dialplans "; - $sql .= "where dialplan_uuid = :dialplan_uuid "; - $parameters['dialplan_uuid'] = $record['uuid']; - $dialplan_contexts[] = $this->database->select($sql, $parameters ?? null, 'column'); - unset($sql, $parameters); + //clear the cache + if (!empty($dialplan_contexts)) { + $dialplan_contexts = array_unique($dialplan_contexts, SORT_STRING); + $cache = new cache; + foreach ($dialplan_contexts as $dialplan_context) { + $cache->delete("dialplan:".$dialplan_context); + } } - } - //delete the checked rows - if (!empty($array)) { + //clear the destinations session array + if (isset($_SESSION['destinations']['array'])) { + unset($_SESSION['destinations']['array']); + } - //grant temporary permissions - $p = permissions::new(); - $p->add('dialplan_delete', 'temp'); - $p->add('dialplan_detail_delete', 'temp'); + //set message + message::add($text['message-toggle']); + } + unset($records, $states); + } - //execute delete - $this->database->app_name = $this->app_name; - $this->database->app_uuid = $this->app_uuid; - $this->database->delete($array); + } + } - //revoke temporary permissions - $p->delete('dialplan_delete', 'temp'); - $p->delete('dialplan_detail_delete', 'temp'); + /** + * copy records + */ + public function copy($records) { - //clear the cache - if (!empty($dialplan_contexts)) { - $dialplan_contexts = array_unique($dialplan_contexts, SORT_STRING); - $cache = new cache; - foreach ($dialplan_contexts as $dialplan_context) { - $cache->delete("dialplan:".$dialplan_context); - } - } - - //clear the destinations session array - if (isset($_SESSION['destinations']['array'])) { - unset($_SESSION['destinations']['array']); - } - - //set message - message::add($text['message-delete'].': '.@sizeof($array[$this->table])); - - } - unset($records, $array); - - } + //determine app and permission prefix + if ($this->app_uuid == 'c03b422e-13a8-bd1b-e42b-b6b9b4d27ce4') { + $this->app_name = 'dialplan_inbound'; + $this->permission_prefix = 'inbound_route_'; } - } - - public function delete_details($records) { - //set private variables - $this->table = 'dialplan_details'; - $this->uuid_prefix = 'dialplan_detail_'; - - //determine app and permission prefix - if ($this->app_uuid == 'c03b422e-13a8-bd1b-e42b-b6b9b4d27ce4') { - $this->app_name = 'dialplan_inbound'; - $this->permission_prefix = 'inbound_route_'; - } - else if ($this->app_uuid == '8c914ec3-9fc0-8ab5-4cda-6c9288bdc9a3') { - $this->app_name = 'dialplan_outbound'; - $this->permission_prefix = 'outbound_route_'; - } - else if ($this->app_uuid == '16589224-c876-aeb3-f59f-523a1c0801f7') { - $this->app_name = 'fifo'; - $this->permission_prefix = 'fifo_'; - } - else if ($this->app_uuid == '4b821450-926b-175a-af93-a03c441818b1') { - $this->app_name = 'time_conditions'; - $this->permission_prefix = 'time_condition_'; - } - else { - $this->permission_prefix = 'dialplan_detail_'; - } - - 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 (!empty($records)) { - - //build the delete array - foreach ($records as $x => $record) { - if (!empty($record['checked']) && $record['checked'] == 'true' && is_uuid($record['uuid'])) { - - //build delete array - $array[$this->table][$x][$this->uuid_prefix.'uuid'] = $record['uuid']; - $array[$this->table][$x]['dialplan_uuid'] = $this->dialplan_uuid; - - //get the dialplan context - $sql = "select dialplan_context from v_dialplans "; - $sql .= "where dialplan_uuid = :dialplan_uuid "; - $parameters['dialplan_uuid'] = $this->dialplan_uuid; - $dialplan_contexts[] = $this->database->select($sql, $parameters ?? null, 'column'); - unset($sql, $parameters); - - } - } - - //delete the checked rows - if (!empty($array)) { - - //grant temporary permissions - $p = permissions::new(); - $p->add('dialplan_detail_delete', 'temp'); - - //execute delete - $this->database->app_name = $this->app_name; - $this->database->app_uuid = $this->app_uuid; - $this->database->delete($array); - - //revoke temporary permissions - $p->delete('dialplan_detail_delete', 'temp'); - - //clear the cache - if (!empty($dialplan_contexts)) { - $dialplan_contexts = array_unique($dialplan_contexts, SORT_STRING); - $cache = new cache; - foreach ($dialplan_contexts as $dialplan_context) { - $cache->delete("dialplan:".$dialplan_context); - } - } - - } - unset($records, $array); - - } + else if ($this->app_uuid == '8c914ec3-9fc0-8ab5-4cda-6c9288bdc9a3') { + $this->app_name = 'dialplan_outbound'; + $this->permission_prefix = 'outbound_route_'; + } + else if ($this->app_uuid == '16589224-c876-aeb3-f59f-523a1c0801f7') { + $this->app_name = 'fifo'; + $this->permission_prefix = 'fifo_'; + } + else if ($this->app_uuid == '4b821450-926b-175a-af93-a03c441818b1') { + $this->app_name = 'time_conditions'; + $this->permission_prefix = 'time_condition_'; + } + else { + //use default in constructor } - } - /** - * toggle records - */ - public function toggle($records) { + if (permission_exists($this->permission_prefix.'add')) { - //determine app and permission prefix - if ($this->app_uuid == 'c03b422e-13a8-bd1b-e42b-b6b9b4d27ce4') { - $this->app_name = 'dialplan_inbound'; - $this->permission_prefix = 'inbound_route_'; - } - else if ($this->app_uuid == '8c914ec3-9fc0-8ab5-4cda-6c9288bdc9a3') { - $this->app_name = 'dialplan_outbound'; - $this->permission_prefix = 'outbound_route_'; - } - else if ($this->app_uuid == '16589224-c876-aeb3-f59f-523a1c0801f7') { - $this->app_name = 'fifo'; - $this->permission_prefix = 'fifo_'; - } - else if ($this->app_uuid == '4b821450-926b-175a-af93-a03c441818b1') { - $this->app_name = 'time_conditions'; - $this->permission_prefix = 'time_condition_'; - } - else { - //use default in constructor + //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; } - if (permission_exists($this->permission_prefix.'edit')) { + //copy the checked records + if (!empty($records)) { - //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; - } - - //toggle the checked records - if (!empty($records)) { - - //get current toggle state - foreach($records as $x => $record) { - if (!empty($record['checked']) && $record['checked'] == 'true' && is_uuid($record['uuid'])) { - $uuids[] = "'".$record['uuid']."'"; - } + //get checked records + foreach($records as $x => $record) { + if (!empty($record['checked']) && $record['checked'] == 'true' && is_uuid($record['uuid'])) { + $uuids[] = "'".$record['uuid']."'"; } - if (!empty($uuids)) { - $sql = "select ".$this->uuid_prefix."uuid as uuid, ".$this->toggle_field." as toggle, dialplan_context from v_".$this->table." "; + } + + //create insert array from existing data + if (!empty($uuids)) { + + //primary table + $sql = "select * from v_".$this->table." "; $sql .= "where ".$this->uuid_prefix."uuid in (".implode(', ', $uuids).") "; - if (!permission_exists('dialplan_all')) { - $sql .= "and (domain_uuid = :domain_uuid or domain_uuid is null) "; - $parameters['domain_uuid'] = $_SESSION['domain_uuid']; - } $rows = $this->database->select($sql, $parameters ?? null, 'all'); if (!empty($rows)) { - foreach ($rows as $row) { - $states[$row['uuid']] = $row['toggle']; - $dialplan_contexts[] = $row['dialplan_context']; + $y = 0; + foreach ($rows as $x => $row) { + //set a unique uuid + $primary_uuid = uuid(); + + //copy data + $array[$this->table][$x] = $row; + + //app_uuid needs to be unique for copied dialplans + //except for inbound and outbound routes, fifo, time conditions + $app_uuid = $row['app_uuid']; + switch ($app_uuid) { + case "c03b422e-13a8-bd1b-e42b-b6b9b4d27ce4": break; + case "8c914ec3-9fc0-8ab5-4cda-6c9288bdc9a3": break; + case "16589224-c876-aeb3-f59f-523a1c0801f7": break; + case "4b821450-926b-175a-af93-a03c441818b1": break; + default: $app_uuid = uuid(); + } + + //dialplan copy should have a unique app_uuid + $array[$this->table][$x]['app_uuid'] = $app_uuid; + + //overwrite + $array[$this->table][$x][$this->uuid_prefix.'uuid'] = $primary_uuid; + $array[$this->table][$x]['dialplan_description'] = trim($row['dialplan_description'].' ('.$text['label-copy'].')'); + + //details sub table + $sql_2 = "select * from v_dialplan_details where dialplan_uuid = :dialplan_uuid"; + $parameters_2['dialplan_uuid'] = $row['dialplan_uuid']; + $rows_2 = $this->database->select($sql_2, $parameters_2 ?? null, 'all'); + if (!empty($rows_2)) { + foreach ($rows_2 as $row_2) { + + //copy data + $array['dialplan_details'][$y] = $row_2; + + //overwrite + $array['dialplan_details'][$y]['dialplan_detail_uuid'] = uuid(); + $array['dialplan_details'][$y]['dialplan_uuid'] = $primary_uuid; + + //increment + $y++; + + } + } + unset($sql_2, $parameters_2, $rows_2, $row_2); + + //get dialplan contexts + $dialplan_contexts[] = $row['dialplan_context']; } } unset($sql, $parameters, $rows, $row); - } + } - //build update array - $x = 0; - foreach($states as $uuid => $state) { - $array[$this->table][$x][$this->uuid_prefix.'uuid'] = $uuid; - $array[$this->table][$x][$this->toggle_field] = $state == $this->toggle_values[0] ? $this->toggle_values[1] : $this->toggle_values[0]; - $x++; - } + //save the changes and set the message + if (!empty($array)) { - //save the changes - if (!empty($array)) { + //grant temporary permissions + $p = permissions::new(); + $p->add('dialplan_detail_add', 'temp'); - //grant temporary permissions - $p = permissions::new(); - $p->add('dialplan_edit', 'temp'); + //save the array + $this->database->app_name = $this->app_name; + $this->database->app_uuid = $this->app_uuid; + $this->database->save($array); + //view_array($this->database->message); + unset($array); - //save the array - $this->database->app_name = $this->app_name; - $this->database->app_uuid = $this->app_uuid; - $this->database->save($array); - unset($array); + //revoke temporary permissions + $p->delete('dialplan_detail_add', 'temp'); - //revoke temporary permissions - $p->delete('dialplan_edit', 'temp'); - - //clear the cache - if (!empty($dialplan_contexts)) { - $dialplan_contexts = array_unique($dialplan_contexts, SORT_STRING); - $cache = new cache; - foreach ($dialplan_contexts as $dialplan_context) { - $cache->delete("dialplan:".$dialplan_context); - } + //clear the cache + if (!empty($dialplan_contexts)) { + $dialplan_contexts = array_unique($dialplan_contexts, SORT_STRING); + $cache = new cache; + foreach ($dialplan_contexts as $dialplan_context) { + $cache->delete("dialplan:".$dialplan_context); } - - //clear the destinations session array - if (isset($_SESSION['destinations']['array'])) { - unset($_SESSION['destinations']['array']); - } - - //set message - message::add($text['message-toggle']); - } - unset($records, $states); - } - - } - } - - /** - * copy records - */ - public function copy($records) { - - //determine app and permission prefix - if ($this->app_uuid == 'c03b422e-13a8-bd1b-e42b-b6b9b4d27ce4') { - $this->app_name = 'dialplan_inbound'; - $this->permission_prefix = 'inbound_route_'; - } - else if ($this->app_uuid == '8c914ec3-9fc0-8ab5-4cda-6c9288bdc9a3') { - $this->app_name = 'dialplan_outbound'; - $this->permission_prefix = 'outbound_route_'; - } - else if ($this->app_uuid == '16589224-c876-aeb3-f59f-523a1c0801f7') { - $this->app_name = 'fifo'; - $this->permission_prefix = 'fifo_'; - } - else if ($this->app_uuid == '4b821450-926b-175a-af93-a03c441818b1') { - $this->app_name = 'time_conditions'; - $this->permission_prefix = 'time_condition_'; - } - else { - //use default in constructor - } - - if (permission_exists($this->permission_prefix.'add')) { - - //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; - } - - //copy the checked records - if (!empty($records)) { - - //get checked records - foreach($records as $x => $record) { - if (!empty($record['checked']) && $record['checked'] == 'true' && is_uuid($record['uuid'])) { - $uuids[] = "'".$record['uuid']."'"; } - } - //create insert array from existing data - if (!empty($uuids)) { + //set message + message::add($text['message-copy']); - //primary table - $sql = "select * from v_".$this->table." "; - $sql .= "where ".$this->uuid_prefix."uuid in (".implode(', ', $uuids).") "; - $rows = $this->database->select($sql, $parameters ?? null, 'all'); - if (!empty($rows)) { - $y = 0; - foreach ($rows as $x => $row) { - //set a unique uuid - $primary_uuid = uuid(); + } + unset($records); + } - //copy data - $array[$this->table][$x] = $row; - - //app_uuid needs to be unique for copied dialplans - //except for inbound and outbound routes, fifo, time conditions - $app_uuid = $row['app_uuid']; - switch ($app_uuid) { - case "c03b422e-13a8-bd1b-e42b-b6b9b4d27ce4": break; - case "8c914ec3-9fc0-8ab5-4cda-6c9288bdc9a3": break; - case "16589224-c876-aeb3-f59f-523a1c0801f7": break; - case "4b821450-926b-175a-af93-a03c441818b1": break; - default: $app_uuid = uuid(); - } - - //dialplan copy should have a unique app_uuid - $array[$this->table][$x]['app_uuid'] = $app_uuid; - - //overwrite - $array[$this->table][$x][$this->uuid_prefix.'uuid'] = $primary_uuid; - $array[$this->table][$x]['dialplan_description'] = trim($row['dialplan_description'].' ('.$text['label-copy'].')'); - - //details sub table - $sql_2 = "select * from v_dialplan_details where dialplan_uuid = :dialplan_uuid"; - $parameters_2['dialplan_uuid'] = $row['dialplan_uuid']; - $rows_2 = $this->database->select($sql_2, $parameters_2 ?? null, 'all'); - if (!empty($rows_2)) { - foreach ($rows_2 as $row_2) { - - //copy data - $array['dialplan_details'][$y] = $row_2; - - //overwrite - $array['dialplan_details'][$y]['dialplan_detail_uuid'] = uuid(); - $array['dialplan_details'][$y]['dialplan_uuid'] = $primary_uuid; - - //increment - $y++; - - } - } - unset($sql_2, $parameters_2, $rows_2, $row_2); - - //get dialplan contexts - $dialplan_contexts[] = $row['dialplan_context']; - } - } - unset($sql, $parameters, $rows, $row); - } - - //save the changes and set the message - if (!empty($array)) { - - //grant temporary permissions - $p = permissions::new(); - $p->add('dialplan_detail_add', 'temp'); - - //save the array - $this->database->app_name = $this->app_name; - $this->database->app_uuid = $this->app_uuid; - $this->database->save($array); - //view_array($this->database->message); - unset($array); - - //revoke temporary permissions - $p->delete('dialplan_detail_add', 'temp'); - - //clear the cache - if (!empty($dialplan_contexts)) { - $dialplan_contexts = array_unique($dialplan_contexts, SORT_STRING); - $cache = new cache; - foreach ($dialplan_contexts as $dialplan_context) { - $cache->delete("dialplan:".$dialplan_context); - } - } - - //set message - message::add($text['message-copy']); - - } - unset($records); - } - - } - } //method + } + } //method } //class