diff --git a/app/calls/resources/classes/follow_me.php b/app/calls/resources/classes/follow_me.php index d494549ccc..70140f1451 100644 --- a/app/calls/resources/classes/follow_me.php +++ b/app/calls/resources/classes/follow_me.php @@ -43,6 +43,7 @@ include "root.php"; public $outbound_caller_id_name; public $outbound_caller_id_number; private $extension; + private $number_alias; private $toll_allow; public $destination_data_1; @@ -248,6 +249,7 @@ include "root.php"; $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"]; } @@ -266,150 +268,171 @@ include "root.php"; } unset ($prep_statement); - //add follow me - if (strlen($follow_me_uuid) == 0) { - $this->add(); + //set the extension dial string + $sql = "select * from v_follow_me_destinations "; + $sql .= "where follow_me_uuid = '".$this->follow_me_uuid."' "; + $sql .= "order by follow_me_order asc "; + $prep_statement_2 = $db->prepare(check_sql($sql)); + $prep_statement_2->execute(); + $result = $prep_statement_2->fetchAll(PDO::FETCH_NAMED); + $dial_string = "{"; + if ($this->follow_me_ignore_busy != 'true') { + $dial_string .= "fail_on_single_reject=USER_BUSY,"; + } + $dial_string .= "instant_ringback=true,"; + $dial_string .= "ignore_early_media=true"; + $dial_string .= ",domain_uuid=".$_SESSION['domain_uuid']; + $dial_string .= ",sip_invite_domain=".$_SESSION['domain_name']; + $dial_string .= ",domain_name=".$_SESSION['domain_name']; + $dial_string .= ",domain=".$_SESSION['domain_name']; + $dial_string .= ",extension_uuid=".$this->extension_uuid; + $dial_string .= ",group_confirm_key=exec,group_confirm_file=lua confirm.lua"; + + $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 from v_destinations where domain_uuid = '$this->domain_uuid' and destination_type = 'inbound' and destination_uuid = '$this->follow_me_caller_id_uuid'"; + $prep_statement_caller = $db->prepare($sql_caller); + if ($prep_statement_caller) { + $prep_statement_caller->execute(); + $row_caller = $prep_statement_caller->fetch(PDO::FETCH_ASSOC); + + $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']; + } + + if (strlen($caller_id_name) > 0) { + $dial_string_caller_id_name = $caller_id_name; + } + if (strlen($caller_id_number) > 0) { + $dial_string_caller_id_number = $caller_id_number; + } + } } - //set the extension dial string - $sql = "select * from v_follow_me_destinations "; - $sql .= "where follow_me_uuid = '".$this->follow_me_uuid."' "; - $sql .= "order by follow_me_order asc "; - $prep_statement_2 = $db->prepare(check_sql($sql)); - $prep_statement_2->execute(); - $result = $prep_statement_2->fetchAll(PDO::FETCH_NAMED); - $dial_string = "{"; - if ($this->follow_me_ignore_busy != 'true') { - $dial_string .= "fail_on_single_reject=USER_BUSY,"; - } - $dial_string .= "instant_ringback=true,"; - $dial_string .= "ignore_early_media=true"; - $dial_string .= ",domain_uuid=".$_SESSION['domain_uuid']; - $dial_string .= ",sip_invite_domain=".$_SESSION['domain_name']; - $dial_string .= ",domain_name=".$_SESSION['domain_name']; - $dial_string .= ",domain=".$_SESSION['domain_name']; - $dial_string .= ",extension_uuid=".$this->extension_uuid; - $dial_string .= ",group_confirm_key=exec,group_confirm_file=lua confirm.lua"; + if (strlen($this->cid_name_prefix) > 0) { + $dial_string .= ",origination_caller_id_name=".$this->cid_name_prefix."$dial_string_caller_id_name"; + } + else { + $dial_string .= ",origination_caller_id_name=$dial_string_caller_id_name"; + } - $dial_string_caller_id_name = "\${effective_caller_id_name}"; - $dial_string_caller_id_number = "\${effective_caller_id_number}"; + if (strlen($this->cid_number_prefix) > 0) { + //$dial_string .= ",origination_caller_id_number=".$this->cid_number_prefix.""; + $dial_string .= ",origination_caller_id_number=".$this->cid_number_prefix."$dial_string_caller_id_number"; + } + else { + $dial_string .= ",origination_caller_id_number=$dial_string_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 from v_destinations where domain_uuid = '$this->domain_uuid' and destination_type = 'inbound' and destination_uuid = '$this->follow_me_caller_id_uuid'"; - $prep_statement_caller = $db->prepare($sql_caller); - if ($prep_statement_caller) { - $prep_statement_caller->execute(); - $row_caller = $prep_statement_caller->fetch(PDO::FETCH_ASSOC); + if (strlen($this->accountcode) == 0) { + $dial_string .= ",sip_h_X-accountcode=\${accountcode}"; + } + else { + $dial_string .= ",sip_h_X-accountcode=".$this->accountcode; + $dial_string .= ",accountcode=".$this->accountcode; + } - $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']; - } - - if (strlen($caller_id_name) > 0) { - $dial_string_caller_id_name = $caller_id_name; - } - if (strlen($caller_id_number) > 0) { - $dial_string_caller_id_number = $caller_id_number; - } - } - } - - if (strlen($this->cid_name_prefix) > 0) { - $dial_string .= ",origination_caller_id_name=".$this->cid_name_prefix."$dial_string_caller_id_name"; - } - else { - $dial_string .= ",origination_caller_id_name=$dial_string_caller_id_name"; - } - - if (strlen($this->cid_number_prefix) > 0) { - //$dial_string .= ",origination_caller_id_number=".$this->cid_number_prefix.""; - $dial_string .= ",origination_caller_id_number=".$this->cid_number_prefix."$dial_string_caller_id_number"; - } - else { - $dial_string .= ",origination_caller_id_number=$dial_string_caller_id_number"; - } - - if (strlen($this->accountcode) > 0) { - $dial_string .= ",sip_h_X-accountcode=".$this->accountcode; - $dial_string .= ",accountcode=".$this->accountcode; - } + if ($this->toll_allow != '') { $dial_string .= ",toll_allow='".$this->toll_allow."'"; - $dial_string .= "}"; - $x = 0; - if (is_array($result)) foreach ($result as &$row) { - if ($x > 0) { - $dial_string .= ","; + } + + $dial_string .= "}"; + $x = 0; + if (is_array($result)) foreach ($result as &$row) { + if ($x > 0) { + $dial_string .= ","; + } + if (($presence_id = extension_presence_id($row["follow_me_destination"])) !== false) { + //set the dial string + // using here `sofia_contact` instead of `user/` allows add registered device + // so you can make follow me for extension `100` like `100` and avoid recusion + // but it ignores DND/CallForwad settings + if (strlen($_SESSION['domain']['dial_string']['text']) == 0) { + $dial_string .= "["; + $dial_string .= "outbound_caller_id_number=$dial_string_caller_id_number,"; + $dial_string .= "presence_id=".$presence_id."@".$_SESSION['domain_name'].','; + if ($row["follow_me_prompt"] == "1") { + $dial_string .= "group_confirm_key=exec,group_confirm_file=lua confirm.lua,confirm=true,"; + } + $dial_string .= "leg_delay_start=".$row["follow_me_delay"].","; + $dial_string .= "leg_timeout=".$row["follow_me_timeout"]."]"; + $dial_string .= "\${sofia_contact(".$row["follow_me_destination"]."@".$_SESSION['domain_name'].")}"; } - if (extension_exists($row["follow_me_destination"])) { - //set the dial string - if (strlen($_SESSION['domain']['dial_string']['text']) == 0) { - $dial_string .= "["; - $dial_string .= "outbound_caller_id_number=$dial_string_caller_id_number,"; - $dial_string .= "presence_id=".$row["follow_me_destination"]."@".$_SESSION['domain_name'].","; - if ($row["follow_me_prompt"] == "1") { - $dial_string .= "group_confirm_key=exec,group_confirm_file=lua confirm.lua,confirm=true,"; - } - $dial_string .= "leg_delay_start=".$row["follow_me_delay"].","; - $dial_string .= "leg_timeout=".$row["follow_me_timeout"]."]"; - $dial_string .= "\${sofia_contact(".$row["follow_me_destination"]."@".$_SESSION['domain_name'].")}"; + else { + //get the session dial string + $dial_string_template = $_SESSION['domain']['dial_string']['text']; + + //replace the variables with the values + $dial_string_template = str_replace("sip_invite_domain=\${domain_name},", "", $dial_string_template); + $dial_string_template = str_replace("presence_id=\${dialed_user}@\${dialed_domain}", "", $dial_string_template); + $dial_string_template = str_replace("\${dialed_user}", $row["follow_me_destination"], $dial_string_template); + $dial_string_template = str_replace("\${dialed_domain}", $_SESSION['domain_name'], $dial_string_template); + $dial_string_template = str_replace("\${call_timeout}", $row["follow_me_timeout"], $dial_string_template); + $dial_string_template = str_replace("\${leg_timeout}", $row["follow_me_timeout"], $dial_string_template); + + //seperate the variables from the bridge statement + preg_match_all('/{((?:[^{}]|(?R))*)}/', $dial_string_template, $matches, PREG_PATTERN_ORDER); + $dial_string_variables = $matches[1][0]; + $dial_string_bridge = $matches[1][1]; + + //add to the dial string + $dial_string .= "["; + $dial_string .= $dial_string_variables; + if ($row["follow_me_prompt"] == "1") { + $dial_string .= ",group_confirm_key=exec,group_confirm_file=lua confirm.lua,confirm=true"; + } + $dial_string .= "]"; + $dial_string .= $dial_string_bridge; + } + } + else { + $presence_id = extension_presence_id($this->extension, $this->number_alias); + $dial_string .= "["; + if ($_SESSION['cdr']['follow_me_fix']['boolean'] == "true"){ + $dial_string .= "outbound_caller_id_name=".$this->outbound_caller_id_name; + $dial_string .= ",outbound_caller_id_number=".$this->outbound_caller_id_number; + $dial_string .= ",origination_caller_id_name=".$this->outbound_caller_id_name; + $dial_string .= ",origination_caller_id_number=".$this->outbound_caller_id_number; + } + else{ + $dial_string .= "outbound_caller_id_number=$dial_string_caller_id_number"; + } + $dial_string .= ",presence_id=".$presence_id."@".$_SESSION['domain_name']; + if ($row["follow_me_prompt"] == "1") { + $dial_string .= ",group_confirm_key=exec,group_confirm_file=lua confirm.lua,confirm=true,"; + } + $dial_string .= ",leg_delay_start=".$row["follow_me_delay"]; + $dial_string .= ",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 ($_SESSION['domain_uuid'], $row["follow_me_destination"]); + $dial_string .= $bridge[0]; + } + elseif ($_SESSION['domain']['bridge']['text'] == "loopback") { + $dial_string .= "loopback/".$row["follow_me_destination"]."/".$_SESSION['domain_name']; + } + elseif ($_SESSION['domain']['bridge']['text'] == "lcr") { + $dial_string .= "lcr/".$_SESSION['lcr']['profile']['text']."/".$_SESSION['domain_name']."/".$row["follow_me_destination"]; } else { - $replace_value = $row["follow_me_destination"]; - if ($row["follow_me_prompt"] == "1") { - $replace_value .= "[group_confirm_key=exec,group_confirm_file=lua confirm.lua,confirm=true]"; - } - $local_dial_string = $_SESSION['domain']['dial_string']['text']; - $local_dial_string = str_replace("\${dialed_user}", $replace_value, $local_dial_string); - $local_dial_string = str_replace("\${dialed_domain}", $_SESSION['domain_name'], $local_dial_string); - $local_dial_string = str_replace("\${call_timeout}", $row["follow_me_timeout"], $local_dial_string); - $local_dial_string = str_replace("\${leg_timeout}", $row["follow_me_timeout"], $local_dial_string); - $dial_string .= $local_dial_string; + $dial_string .= "loopback/".$row["follow_me_destination"]."/".$_SESSION['domain_name']; } } else { - $dial_string .= "["; - if ($_SESSION['cdr']['follow_me_fix']['boolean'] == "true"){ - $dial_string .= "outbound_caller_id_name=".$this->outbound_caller_id_name; - $dial_string .= ",outbound_caller_id_number=".$this->outbound_caller_id_number; - $dial_string .= ",origination_caller_id_name=".$this->outbound_caller_id_name; - $dial_string .= ",origination_caller_id_number=".$this->outbound_caller_id_number; - } - else{ - $dial_string .= "outbound_caller_id_number=$dial_string_caller_id_number"; - } - $dial_string .= ",presence_id=".$this->extension."@".$_SESSION['domain_name']; - if ($row["follow_me_prompt"] == "1") { - $dial_string .= ",group_confirm_key=exec,group_confirm_file=lua confirm.lua,confirm=true,"; - } - $dial_string .= ",leg_delay_start=".$row["follow_me_delay"]; - $dial_string .= ",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 ($_SESSION['domain_uuid'], $row["follow_me_destination"]); - $dial_string .= $bridge[0]; - } - elseif ($_SESSION['domain']['bridge']['text'] == "loopback") { - $dial_string .= "loopback/".$row["follow_me_destination"]."/".$_SESSION['domain_name']; - } - elseif ($_SESSION['domain']['bridge']['text'] == "lcr") { - $dial_string .= "lcr/".$_SESSION['lcr']['profile']['text']."/".$_SESSION['domain_name']."/".$row["follow_me_destination"]; - } - else { - $dial_string .= "loopback/".$row["follow_me_destination"]."/".$_SESSION['domain_name']; - } - } - else { - $dial_string .= $row["follow_me_destination"]; - } + $dial_string .= $row["follow_me_destination"]; } - $x++; } - $this->dial_string = $dial_string; + $x++; + } + $dial_string = str_replace(",]", "]", $dial_string); + $this->dial_string = $dial_string; $sql = "update v_follow_me set "; $sql .= "dial_string = '".$this->dial_string."' ";