Copyright (C) 2010 - 2019 All Rights Reserved. Contributor(s): Mark J Crane Luis Daniel Lucio Quiroz Salvatore Caruso Riccardo Granchi Errol Samuels */ include "root.php"; //define the follow me class class follow_me { public $domain_uuid; private $domain_name; public $db_type; public $follow_me_uuid; public $cid_name_prefix; public $cid_number_prefix; public $accountcode; public $follow_me_enabled; public $follow_me_caller_id_uuid; public $follow_me_ignore_busy; public $outbound_caller_id_name; public $outbound_caller_id_number; private $extension; private $number_alias; private $toll_allow; public $destination_data_1; public $destination_type_1; public $destination_delay_1; public $destination_prompt_1; public $destination_timeout_1; public $destination_data_2; public $destination_type_2; public $destination_delay_2; public $destination_prompt_2; public $destination_timeout_2; public $destination_data_3; public $destination_type_3; public $destination_delay_3; public $destination_prompt_3; public $destination_timeout_3; public $destination_data_4; public $destination_type_4; public $destination_delay_4; public $destination_prompt_4; public $destination_timeout_4; public $destination_data_5; public $destination_type_5; public $destination_delay_5; public $destination_prompt_5; public $destination_timeout_5; public $destination_timeout = 0; public $destination_order = 1; public function add() { //build follow me insert array $array['follow_me'][0]['follow_me_uuid'] = $this->follow_me_uuid; $array['follow_me'][0]['domain_uuid'] = $this->domain_uuid; $array['follow_me'][0]['cid_name_prefix'] = $this->cid_name_prefix; if (strlen($this->cid_number_prefix) > 0) { $array['follow_me'][0]['cid_number_prefix'] = $this->cid_number_prefix; } $array['follow_me'][0]['follow_me_caller_id_uuid'] = is_uuid($this->follow_me_caller_id_uuid) ? $this->follow_me_caller_id_uuid : null; $array['follow_me'][0]['follow_me_enabled'] = $this->follow_me_enabled; $array['follow_me'][0]['follow_me_ignore_busy'] = $this->follow_me_ignore_busy; //grant temporary permissions $p = new permissions; $p->add('follow_me_add', 'temp'); //execute insert $database = new database; $database->app_name = 'calls'; $database->app_uuid = '19806921-e8ed-dcff-b325-dd3e5da4959d'; $database->save($array); unset($array); //revoke temporary permissions $p->delete('follow_me_add', 'temp'); $this->follow_me_destinations(); } public function update() { //build follow me update array $array['follow_me'][0]['follow_me_uuid'] = $this->follow_me_uuid; $array['follow_me'][0]['cid_name_prefix'] = $this->cid_name_prefix; $array['follow_me'][0]['cid_number_prefix'] = $this->cid_number_prefix; $array['follow_me'][0]['follow_me_caller_id_uuid'] = is_uuid($this->follow_me_caller_id_uuid) ? $this->follow_me_caller_id_uuid : null; $array['follow_me'][0]['follow_me_enabled'] = $this->follow_me_enabled; $array['follow_me'][0]['follow_me_ignore_busy'] = $this->follow_me_ignore_busy; //grant temporary permissions $p = new permissions; $p->add('follow_me_add', 'temp'); //execute update $database = new database; $database->app_name = 'calls'; $database->app_uuid = '19806921-e8ed-dcff-b325-dd3e5da4959d'; $database->save($array); unset($array); //revoke temporary permissions $p->delete('follow_me_add', 'temp'); $this->follow_me_destinations(); } public function follow_me_destinations() { //delete related follow me destinations $array['follow_me_destinations'][0]['follow_me_uuid'] = $this->follow_me_uuid; //grant temporary permissions $p = new permissions; $p->add('follow_me_destination_delete', 'temp'); //execute delete $database = new database; $database->app_name = 'calls'; $database->app_uuid = '19806921-e8ed-dcff-b325-dd3e5da4959d'; $database->delete($array); unset($array); //revoke temporary permissions $p->delete('follow_me_destination_delete', 'temp'); //build follow me destinations insert array $x = 0; if (strlen($this->destination_data_1) > 0) { $array['follow_me_destinations'][$x]['follow_me_destination_uuid'] = uuid(); $array['follow_me_destinations'][$x]['domain_uuid'] = $this->domain_uuid; $array['follow_me_destinations'][$x]['follow_me_uuid'] = $this->follow_me_uuid; $array['follow_me_destinations'][$x]['follow_me_destination'] = $this->destination_data_1; $array['follow_me_destinations'][$x]['follow_me_timeout'] = $this->destination_timeout_1; $array['follow_me_destinations'][$x]['follow_me_delay'] = $this->destination_delay_1; $array['follow_me_destinations'][$x]['follow_me_prompt'] = $this->destination_prompt_1; $array['follow_me_destinations'][$x]['follow_me_order'] = '1'; $this->destination_order++; $x++; } if (strlen($this->destination_data_2) > 0) { $array['follow_me_destinations'][$x]['follow_me_destination_uuid'] = uuid(); $array['follow_me_destinations'][$x]['domain_uuid'] = $this->domain_uuid; $array['follow_me_destinations'][$x]['follow_me_uuid'] = $this->follow_me_uuid; $array['follow_me_destinations'][$x]['follow_me_destination'] = $this->destination_data_2; $array['follow_me_destinations'][$x]['follow_me_timeout'] = $this->destination_timeout_2; $array['follow_me_destinations'][$x]['follow_me_delay'] = $this->destination_delay_2; $array['follow_me_destinations'][$x]['follow_me_prompt'] = $this->destination_prompt_2; $array['follow_me_destinations'][$x]['follow_me_order'] = '2'; $this->destination_order++; $x++; } if (strlen($this->destination_data_3) > 0) { $array['follow_me_destinations'][$x]['follow_me_destination_uuid'] = uuid(); $array['follow_me_destinations'][$x]['domain_uuid'] = $this->domain_uuid; $array['follow_me_destinations'][$x]['follow_me_uuid'] = $this->follow_me_uuid; $array['follow_me_destinations'][$x]['follow_me_destination'] = $this->destination_data_3; $array['follow_me_destinations'][$x]['follow_me_timeout'] = $this->destination_timeout_3; $array['follow_me_destinations'][$x]['follow_me_delay'] = $this->destination_delay_3; $array['follow_me_destinations'][$x]['follow_me_prompt'] = $this->destination_prompt_3; $array['follow_me_destinations'][$x]['follow_me_order'] = '3'; $this->destination_order++; $x++; } if (strlen($this->destination_data_4) > 0) { $array['follow_me_destinations'][$x]['follow_me_destination_uuid'] = uuid(); $array['follow_me_destinations'][$x]['domain_uuid'] = $this->domain_uuid; $array['follow_me_destinations'][$x]['follow_me_uuid'] = $this->follow_me_uuid; $array['follow_me_destinations'][$x]['follow_me_destination'] = $this->destination_data_4; $array['follow_me_destinations'][$x]['follow_me_timeout'] = $this->destination_timeout_4; $array['follow_me_destinations'][$x]['follow_me_delay'] = $this->destination_delay_4; $array['follow_me_destinations'][$x]['follow_me_prompt'] = $this->destination_prompt_4; $array['follow_me_destinations'][$x]['follow_me_order'] = '4'; $this->destination_order++; $x++; } if (strlen($this->destination_data_5) > 0) { $array['follow_me_destinations'][$x]['follow_me_destination_uuid'] = uuid(); $array['follow_me_destinations'][$x]['domain_uuid'] = $this->domain_uuid; $array['follow_me_destinations'][$x]['follow_me_uuid'] = $this->follow_me_uuid; $array['follow_me_destinations'][$x]['follow_me_destination'] = $this->destination_data_5; $array['follow_me_destinations'][$x]['follow_me_timeout'] = $this->destination_timeout_5; $array['follow_me_destinations'][$x]['follow_me_delay'] = $this->destination_delay_5; $array['follow_me_destinations'][$x]['follow_me_prompt'] = $this->destination_prompt_5; $array['follow_me_destinations'][$x]['follow_me_order'] = '5'; $this->destination_order++; $x++; } if (is_array($array) && @sizeof($array) != 0) { //grant temporary permissions $p = new permissions; $p->add('follow_me_destination_add', 'temp'); //execute insert $database = new database; $database->app_name = 'calls'; $database->app_uuid = '19806921-e8ed-dcff-b325-dd3e5da4959d'; $database->save($array); unset($array); //revoke temporary permissions $p->delete('follow_me_destination_add', 'temp'); } } public function set() { //determine whether to update the dial string $sql = "select * from v_extensions "; $sql .= "where domain_uuid = :domain_uuid "; $sql .= "and extension_uuid = :extension_uuid "; $parameters['domain_uuid'] = $this->domain_uuid; $parameters['extension_uuid'] = $this->extension_uuid; $database = new database; $row = $database->select($sql, $parameters, 'row'); if (is_array($row) && @sizeof($row) != 0) { $this->extension = $row["extension"]; $this->accountcode = $row["accountcode"]; $this->toll_allow = $row["toll_allow"]; $this->number_alias = $row["number_alias"]; $this->outbound_caller_id_name = $row["outbound_caller_id_name"]; $this->outbound_caller_id_number = $row["outbound_caller_id_number"]; } unset($sql, $parameters, $row); //determine whether to update the dial string $sql = "select d.domain_name, f.* "; $sql .= "from v_follow_me as f, v_domains as d "; $sql .= "where f.domain_uuid = :domain_uuid "; $sql .= "and f.follow_me_uuid = :follow_me_uuid "; $sql .= "and d.domain_uuid = f.domain_uuid "; $parameters['domain_uuid'] = $this->domain_uuid; $parameters['follow_me_uuid'] = $this->follow_me_uuid; $database = new database; $row = $database->select($sql, $parameters, 'row'); if (is_array($row) && @sizeof($row) != 0) { $follow_me_uuid = $row["follow_me_uuid"]; $this->domain_name = $row["domain_name"]; $this->follow_me_enabled = $row["follow_me_enabled"]; $this->cid_name_prefix = $row["cid_name_prefix"]; $this->cid_number_prefix = $row["cid_number_prefix"]; } unset($sql, $parameters, $row); //set the extension dial string $sql = "select * from v_follow_me_destinations "; $sql .= "where follow_me_uuid = :follow_me_uuid "; $sql .= "order by follow_me_order asc "; $parameters['follow_me_uuid'] = $this->follow_me_uuid; $database = new database; $result = $database->select($sql, $parameters, 'all'); /* $dial_string_caller_id_name = "\${effective_caller_id_name}"; $dial_string_caller_id_number = "\${effective_caller_id_number}"; if (strlen($this->follow_me_caller_id_uuid) > 0) { $sql_caller = "select destination_number, destination_description, destination_caller_id_number, destination_caller_id_name "; $sql_caller .= "from v_destinations "; $sql_caller .= "where domain_uuid = :domain_uuid "; $sql_caller .= "and destination_type = 'inbound' "; $sql_caller .= "and destination_uuid = :destination_uuid "; $parameters['domain_uuid'] = $this->domain_uuid; $parameters['destination_uuid'] = $this->follow_me_caller_id_uuid; $database = new database; $row_caller = $database->select($sql_caller, $parameters, 'row'); if (is_array($row_caller) && @sizeof($row_caller) != 0) { $caller_id_number = $row_caller['destination_caller_id_number']; if (strlen($caller_id_number) == 0){ $caller_id_number = $row_caller['destination_number']; } $caller_id_name = $row_caller['destination_caller_id_name']; if (strlen($caller_id_name) == 0){ $caller_id_name = $row_caller['destination_description']; } } unset($sql_caller, $parameters, $row_caller); } */ $x = 0; if (is_array($result) && @sizeof($result) != 0) { foreach ($result as &$row) { if ($x > 0) { $dial_string .= ","; } //determine if the destination is a local sip user $sql = "select extension, number_alias from v_extensions "; $sql .= "where domain_uuid = :domain_uuid "; $sql .= "and ( "; $sql .= "extension = :extension "; $sql .= "or number_alias = :number_alias "; $sql .= ") "; $parameters['domain_uuid'] = $this->domain_uuid; $parameters['extension'] = $row["follow_me_destination"]; $parameters['number_alias'] = $row["follow_me_destination"]; $database = new database; $field = $database->select($sql, $parameters, 'row'); if (isset($field['extension'])) { if (is_numeric($field['extension'])) { $presence_id = $field['extension']; } else { $presence_id = $field['number_alias']; } $variables[] = "presence_id=".$presence_id."@".$this->domain_name; if ($row["follow_me_prompt"] == "1") { $variables[] = "group_confirm_key=exec"; $variables[] = "group_confirm_file=lua confirm.lua"; $variables[] = "confirm=true"; } if ($this->follow_me_ignore_busy != 'true') { $variables[] = "fail_on_single_reject=USER_BUSY"; } //accountcode if (strlen($this->accountcode) == 0) { $variables[] = "sip_h_X-accountcode=\${accountcode}"; } else { $variables[] = "sip_h_X-accountcode=".$this->accountcode; $variables[] = "accountcode=".$this->accountcode; } //toll allow if ($this->toll_allow != '') { $variables[] = "toll_allow=''".str_replace(",", "\,", $this->toll_allow)."''"; } $variables[] = "instant_ringback=true"; $variables[] = "ignore_early_media=true"; $variables[] = "domain_uuid=".$this->domain_uuid; $variables[] = "sip_invite_domain=".$this->domain_name; $variables[] = "domain_name=".$this->domain_name; $variables[] = "domain=".$this->domain_name; $variables[] = "extension_uuid=".$this->extension_uuid; $variables[] = "leg_delay_start=".$row["follow_me_delay"]; $variables[] = "originate_delay_start=".$row["follow_me_delay"]; $variables[] = "leg_timeout=".$row["follow_me_timeout"]; $dial_string .= "[".implode(",", $variables)."]\${sofia_contact(*/".$row["follow_me_destination"]."@".$this->domain_name.")}"; //$dial_string .= "[".implode(",", $variables)."]user/".$row["follow_me_destination"]."@".$this->domain_name; //$dial_string .= "loopback/export:".implode("\,export:", $variables)."\,transfer:".$row["follow_me_destination"]."/".$this->domain_name."/inline"; unset($variables); } else { if (is_numeric($this->extension)) { $presence_id = $this->extension; } else { $presence_id = $this->number_alias; } $variables[] = "presence_id=".$presence_id."@".$this->domain_name; //set the caller id if ($_SESSION['follow_me']['outbound_caller_id']['boolean'] == "true") { if (strlen($this->outbound_caller_id_name) > 0) { $variables[] = "origination_caller_id_name=".$this->cid_name_prefix.$this->outbound_caller_id_name; $variables[] = "effective_caller_id_name=".$this->cid_name_prefix.$this->outbound_caller_id_name; } if (strlen($this->outbound_caller_id_number) > 0) { $variables[] = "origination_caller_id_number=".$this->cid_number_prefix.$this->outbound_caller_id_number; $variables[] = "effective_caller_id_number=".$this->cid_number_prefix.$this->outbound_caller_id_number; } } else { if ($_SESSION['domain']['bridge']['text'] == "loopback") { //set the outbound caller id number if the caller id number is a user //$variables[] = "origination_caller_id_number=\${cond(\${from_user_exists} == true ? ".$this->outbound_caller_id_number." : \${origination_caller_id_number})}"; $variables[] = "effective_caller_id_number=\${cond(\${from_user_exists} == true ? ".$this->outbound_caller_id_number." : \${effective_caller_id_number})}"; //$variables[] = "origination_caller_id_name=\${cond(\${from_user_exists} == true ? ".$this->outbound_caller_id_name." : \${origination_caller_id_name})}"; $variables[] = "effective_caller_id_name=\${cond(\${from_user_exists} == true ? ".$this->outbound_caller_id_name." : \${effective_caller_id_name})}"; } else { //$variables[] .="origination_caller_id_number=\${cond(\${from_user_exists} == true ? \${outbound_caller_id_number} : )}"; $variables[] .="effective_caller_id_number=\${cond(\${from_user_exists} == true ? \${outbound_caller_id_number} : )}"; //$variables[] .="origination_caller_id_name=\${cond(\${from_user_exists} == true ? \${outbound_caller_id_name} : )}"; $variables[] .="effective_caller_id_name=\${cond(\${from_user_exists} == true ? \${outbound_caller_id_name} : )}"; } } //accountcode if (strlen($this->accountcode) == 0) { $variables[] = "sip_h_X-accountcode=\${accountcode}"; } else { $variables[] = "sip_h_X-accountcode=".$this->accountcode; $variables[] = "accountcode=".$this->accountcode; } //toll allow if ($this->toll_allow != '') { $variables[] = "toll_allow=''".str_replace(",", "\,", $this->toll_allow)."''"; } if ($this->follow_me_ignore_busy != 'true') { $variables[] = "fail_on_single_reject=USER_BUSY"; } if ($row["follow_me_prompt"] == "1") { $variables[] = "group_confirm_key=exec"; $variables[] = "group_confirm_file=lua confirm.lua"; $variables[] = "confirm=true"; } $variables[] = "instant_ringback=true"; $variables[] = "ignore_early_media=true"; $variables[] = "domain_uuid=".$this->domain_uuid; $variables[] = "sip_invite_domain=".$this->domain_name; $variables[] = "domain_name=".$this->domain_name; //$variables[] = "domain=".$this->domain_name; $variables[] = "extension_uuid=".$this->extension_uuid; $variables[] = "leg_delay_start=".$row["follow_me_delay"]; $variables[] = "originate_delay_start=".$row["follow_me_delay"]; $variables[] = "sleep=".($row["follow_me_delay"] * 1000); $variables[] = "leg_timeout=".$row["follow_me_timeout"]; if (is_numeric($row["follow_me_destination"])) { if ($_SESSION['domain']['bridge']['text'] == "outbound" || $_SESSION['domain']['bridge']['text'] == "bridge") { $bridge = outbound_route_to_bridge ($this->domain_uuid, $row["follow_me_destination"]); $dial_string .= "[".implode(",", $variables)."]".$bridge[0]; } else if ($_SESSION['domain']['bridge']['text'] == "loopback") { $variables[] = "is_follow_me_loopback=true"; $sleep_time = "sleep:".($row["follow_me_delay"] * 1000); //$dial_string .= "loopback/".$row["follow_me_destination"]."/".$this->domain_name; $dial_string .= "loopback/".$sleep_time."\,export:".implode("\,export:", $variables)."\,transfer:".$row["follow_me_destination"]."/".$this->domain_name."/inline"; } else if ($_SESSION['domain']['bridge']['text'] == "lcr") { $dial_string .= "[".implode(",", $variables)."]lcr/".$_SESSION['lcr']['profile']['text']."/".$this->domain_name."/".$row["follow_me_destination"]; } else { //$dial_string .= "loopback/".$row["follow_me_destination"]."/".$this->domain_name; $sleep_time = "sleep:".($row["follow_me_delay"] * 1000); $dial_string .= "loopback/".$sleep_time."\,export:".implode("\,export:", $variables)."\,transfer:".$row["follow_me_destination"]."/".$this->domain_name."/inline"; } } else { $dial_string .= $row["follow_me_destination"]; } } unset($sql, $parameters, $field); $x++; } } //$dial_string = str_replace(",]", "]", $dial_string); $this->dial_string = "{ignore_early_media=true}".$dial_string; unset($variables); //get the extension_uuid $parameters['follow_me_uuid'] = $this->follow_me_uuid; $sql = "select extension_uuid from v_extensions "; $sql .= "where follow_me_uuid = :follow_me_uuid "; $database = new database; $result = $database->select($sql, $parameters); $extension_uuid = $result[0]['extension_uuid']; //grant temporary permissions $p = new permissions; $p->add("follow_me_edit", 'temp'); $p->add("extension_edit", 'temp'); //add follow me to the array $array['follow_me'][0]["follow_me_uuid"] = $this->follow_me_uuid; $array['follow_me'][0]["domain_uuid"] = $this->domain_uuid; $array['follow_me'][0]["dial_string"] = $this->dial_string; //is follow me enabled $dial_string = ''; if ($this->follow_me_enabled == "true") { $dial_string = $this->dial_string; } //add extensions to the array $array['extensions'][0]["extension_uuid"] = $extension_uuid; $array['extensions'][0]["dial_domain"] = $this->domain_name; $array['extensions'][0]["dial_string"] = ''; $array['extensions'][0]["follow_me_destinations"] = $dial_string; $array['extensions'][0]["follow_me_enabled"] = $this->follow_me_enabled; //save the destination $database = new database; $database->app_name = 'follow_me'; $database->app_uuid = '19806921-e8ed-dcff-b325-dd3e5da4959d'; $database->save($array); //remove the temporary permission $p->delete("follow_me_edit", 'temp'); $p->delete("extension_edit", 'temp'); } //function } //class ?>