X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=fs_selfservice%2Ffri%2Fmodules%2Ffollowme.module;fp=fs_selfservice%2Ffri%2Fmodules%2Ffollowme.module;h=85a1f3776e049667982d8b0999c11f8f76a1ac20;hp=0000000000000000000000000000000000000000;hb=3a17b276638200475d54201fa62566b7440e819a;hpb=46c6025ca0759b96e5bd16e7ce4b16d4df8a0988 diff --git a/fs_selfservice/fri/modules/followme.module b/fs_selfservice/fri/modules/followme.module new file mode 100644 index 000000000..85a1f3776 --- /dev/null +++ b/fs_selfservice/fri/modules/followme.module @@ -0,0 +1,678 @@ +" . _("Follow Me") . "

"; + } + + return $ret; + } + + /* + * Acts on the user settings + * + * @param $args + * Common arguments + * @param $a + * action + */ + function action($args) { + + global $STANDALONE; + global $ARI_ADMIN_USERNAME; + global $SETTINGS_ALLOW_VMX_SETTINGS; + + // args + $m = getArgument($args,'m'); + $a = getArgument($args,'a'); + + $lang_code = getArgument($args,'lang_code'); + + $follow_me_prering_time = getArgument($args,'follow_me_prering_time'); + $follow_me_listring_time = getArgument($args,'follow_me_listring_time'); + $follow_me_list = getArgument($args,'follow_me_list'); + $follow_me_confirm = getArgument($args,'follow_me_confirm'); + $follow_me_ddial = getArgument($args,'follow_me_ddial'); + $follow_me_disabled = getArgument($args,'follow_me_disabled'); + + $language = new Language(); + + // Lets see if we can make heads or tails of this code?!? + + // The action is 'update + if ($a=='update') { + + // Get the extension and make sure we are not in + // admin mode + $exten = $_SESSION['ari_user']['extension']; + if ($exten!=$ARI_ADMIN_USERNAME) { + + + // Make sure Follow-Me setup has not been deleted for this user since the last refresh + $follow_me_disabled_delayed = $_COOKIE['ari_follow_me_disabled']; + if (! $_COOKIE['ari_follow_me_disabled']) { + + $follow_me_disabled = ($this->getFollowMeListRingTime($exten) > 0)?0:1; + + if ($follow_me_disabled) { + + setcookie("ari_follow_me_disabled", $follow_me_disabled, time()+365*24*60*60); + $follow_me_disabled_delayed = $follow_me_disabled; + $_SESSION['ari_error'] = + _("Your Follow-Me has been disabled, REFRESH your browser to remove this message") . "
" . + sprintf(_("Check with your Telephone System Administrator if you think there is a problem")); + } + } + + + + if (! $follow_me_disabled_delayed) { + + // assume no errors, don't update SQL if errors occured + $follow_me_update_succeeded=1; + + // update follow me pre-ring time + if (!$STANDALONE['use']) { + + $stripped_follow_me_prering_time = preg_replace('/-|\s/','',$follow_me_prering_time); + if (!is_numeric($stripped_follow_me_prering_time)) { + $_SESSION['ari_error'] = + _("Follow-Me pre-ring time not changed") . "
" . + sprintf(_("Number %s must be an interger number of seconds"),$follow_me_prering_time); + $follow_me_update_succeeded=0; + } + else { + + // set database + $this->setFollowMePreRingTime($exten,$stripped_follow_me_prering_time); + + // store cookie + $stripped = preg_replace('/-|\s/','',$_COOKIE['ari_follow_me_prering_time']); + if ($follow_me_prering_time && $stripped!=$stripped_follow_me_prering_time) { + setcookie("ari_follow_me_prering_time", $follow_me_prering_time, time()+365*24*60*60); + } + } + } + + // update follow me list ring time + if (!$STANDALONE['use']) { + + $stripped_follow_me_listring_time = preg_replace('/-|\s/','',$follow_me_listring_time); + if (!is_numeric($stripped_follow_me_listring_time)) { + $_SESSION['ari_error'] = + _("Follow-Me list ring time not changed") . "
" . + sprintf(_("Number %s must be an interger number of seconds"),$follow_me_listring_time); + $follow_me_update_succeeded=0; + } + else { + + // set database + $this->setFollowMeListRingTime($exten,$stripped_follow_me_listring_time); + + // store cookie + $stripped = preg_replace('/-|\s/','',$_COOKIE['ari_follow_me_listring_time']); + if ($follow_me_listring_time && $stripped!=$stripped_follow_me_listring_time) { + setcookie("ari_follow_me_listring_time", $follow_me_listring_time, time()+365*24*60*60); + } + } + } + + // update follow me list + if (!$STANDALONE['use']) { + + $grplist = explode("\n", $follow_me_list); + + if (!$grplist) { + $grplist = null; + } + + foreach (array_keys($grplist) as $key) { + //trim it + $grplist[$key] = trim($grplist[$key]); + + // Lookup the extension and append hash if not a user, and remove invalid chars + $grplist[$key] = $this->lookupSetExtensionFormat($grplist[$key]); + + // remove blanks + if ($grplist[$key] == "") unset($grplist[$key]); + } + + // check for duplicates, and re-sequence + $grplist = array_values(array_unique($grplist)); + + $stripped_follow_me_list = implode("-",$grplist); + + if ($stripped_follow_me_list == "") { + $_SESSION['ari_error'] = + _("Follow-Me list must contain at least one valid number") . "
" . + sprintf(_("The following: %s is not valid"),$follow_me_list); + $follow_me_update_succeeded=0; + } + else { + + // set database + $this->setFollowMeList($exten,$stripped_follow_me_list); + + // store cookie + $stripped = preg_replace('/|\(|\)|\s/','',$_COOKIE['ari_follow_me_list']); + if ($follow_me_list && $stripped!=$stripped_follow_me_list) { + setcookie("ari_follow_me_list", $follow_me_list, time()+365*24*60*60); + } + } + } + + // update follow me confirm + if (!$STANDALONE['use']) { + + // set database + $this->setFollowMeConfirm($exten,$follow_me_confirm); + $this->setFollowMeDDial($exten,$follow_me_ddial); + + // store cookie + setcookie("ari_follow_me_confirm", $follow_me_confirm, time()+365*24*60*60); + setcookie("ari_follow_me_ddial", $follow_me_ddial, time()+365*24*60*60); + } + + //If no errors than update the SQL table to keep in sync + if ($follow_me_update_succeeded) { + $this->setFollowMeMySQL($exten, $follow_me_prering_time, $follow_me_listring_time, $follow_me_list, $follow_me_confirm); + } + + } //if !follow_me_disabled + } + } + + // redirect to see updated page + $ret .= " + + + "; + + return $ret; + } + + /* + * Displays stats page + * + * @param $args + * Common arguments + */ + function display($args) { + + global $STANDALONE; + global $ARI_ADMIN_USERNAME; + global $SETTINGS_PRERING_LOW; + global $SETTINGS_PRERING_HIGH; + global $SETTINGS_LISTRING_LOW; + global $SETTINGS_LISTRING_HIGH; + + global $SETTINGS_FOLLOW_ME_LIST_MAX; + + global $loaded_modules; + + // args + $m = getArgument($args,'m'); + $q = getArgument($args,'q'); + $start = getArgument($args,'start'); + $span = getArgument($args,'span'); + + $displayname = $_SESSION['ari_user']['displayname']; + $exten = $_SESSION['ari_user']['extension']; + + $language = new Language(); + $display = new DisplaySearch(); + + // build controls + if ($exten!=$ARI_ADMIN_USERNAME) { + + // call forward settings + if (!$STANDALONE['use']) { + + $follow_me_prering_time = $this->getFollowMePreRingTime($exten); + $follow_me_listring_time = $this->getFollowMeListRingTime($exten); + $follow_me_list = explode("-", $this->getFollowMeList($exten) ); + $follow_me_confirm = $this->getFollowMeConfirm($exten); + $follow_me_ddial = $this->getFollowMeDDial($exten); + + $FOLLOW_ME_LIST_MAX = (count($follow_me_list) > $SETTINGS_FOLLOW_ME_LIST_MAX) ? count($follow_me_list):$SETTINGS_FOLLOW_ME_LIST_MAX; + + //TODO: Set this better than this? + $follow_me_disabled = ($follow_me_listring_time > 0)?0:1; + setcookie("ari_follow_me_disabled", $follow_me_disabled, time()+365*24*60*60); + + $followme_text.= ""; + + if (!$follow_me_disabled) { + // $followme_text .= ""; + $followme_text .= ""; // Blank Line + + $followme_text .= ""; + + $followme_text .= ""; + + $followme_text .= ""; // Blank Line + $followme_text .= ""; + $followme_text .= ""; + + $followme_text .= ""; // Blank Line + $followme_text .= ""; + + $followme_text .= ""; + $followme_text .= ""; + + + $followme_text .= ""; // Blank Line + + $followme_text .= ""; + $followme_text .= ""; // Blank Line + $followme_text .= "


" . _("Follow Me") . "

 
" . _("Enable") . ""; + $followme_text .= _( "Dial-by-name Directory, IVR, and internal + calls will ring the numbers in the FollowMe + List. Any FreePBX routes that directly + reference a FollowMe are unaffected by this + enable/disable setting."); + $followme_text .= "
 
" . _("Follow Me List:"); + $followme_text .= "" . sprintf(_("Extensions and outside numbers to ring next.")) ."

"; + $followme_text .= sprintf(_("Include %s to keep it ringing."),"".$exten."") . "
"; + $followme_text .= "
 
"; + $followme_text .= sprintf(_("Ring %s First For:"), $exten); + $followme_text .= "" . sprintf( _("Time to ring extension %s before ringing the %s Follow Me List %s"), "".$exten."","",""); + $followme_text .= "
"; + + $followme_text .= ""; + + $followme_text .= "" . _("seconds") . ""; + $followme_text .= "
" . _("Ring Followme List for:") . "" . _("Time to ring the Follow Me List.") . "
"; + + $followme_text .= ""; + + $followme_text .= "" . _("seconds") . "
 
" . _("Use Confirmation:") . "". _("Outside lines that are part of the Follow Me List will be called and offered a menu:

\"You have an incoming call. Press 1 to accept or 2 to decline.\"

This keeps calls from ending up in external voicemail. Make sure that the List Ring Time is long enough to allow for you to hear and react to this message."); + $followme_text .= "
"; + $followme_text .= ""; + $followme_text .= "" . _("Enable") . "
 
"; + } + } + + } + + // build page content + $ret .= checkErrorMessage(); + + if ($_SESSION['ari_user']['admin_settings']) { + $headerText = _("Followme Settings"); + } else { + $headerText = sprintf(_("Followme Settings for %s (%s)"),$displayname,$exten); + } + + $ret .= $display->displayHeaderText($headerText); + $ret .= $display->displayLine(); + + $ret .= + "\n\n"; + + $ret .= + "
+ + + + " . $followme_text . " +
+ +
"; + + return $ret; + } + + + /* + * Sets Follow Me Pre-Ring Time + * + * @param $exten + * Extension to modify + * @param $follow_me_prering_time + * Pre-Ring Time to ring + */ + function setFollowMePreRingTime($exten,$follow_me_prering_time) { + + global $asterisk_manager_interface; + + $value_opt = $follow_me_prering_time; + + $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database put AMPUSER $exten/followme/prering $value_opt\r\n\r\n"); + } + + /* + * Gets Follow Me Pre-Ring Time if set + * + * @param $exten + * Extension to get information about + * @return $number + * follow me pre-ring time returned if set + */ + function getFollowMePreRingTime($exten) { + + global $asterisk_manager_interface; + + $number = ''; + + $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database get AMPUSER $exten/followme/prering\r\n\r\n"); + if (is_numeric($response)) { + $number = $response; + } + + $stripped = preg_replace('/-|\(|\)|\s/','',$_COOKIE['ari_follow_me_prering_time']); + if ($stripped==$number) { + $number = $_COOKIE['ari_follow_me_prering_time']; + } + + return $number; + } + + /* + * Sets Follow Me List Ring Time + * + * @param $exten + * Extension to modify + * @param $follow_me_listring_time + * List Ring Time to ring + */ + function setFollowMeListRingTime($exten,$follow_me_listring_time) { + + global $asterisk_manager_interface; + + $value_opt = $follow_me_listring_time; + + $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database put AMPUSER $exten/followme/grptime $value_opt\r\n\r\n"); + } + + /* + * Gets Follow Me List-Ring Time if set + * + * @param $exten + * Extension to get information about + * @return $number + * follow me list-ring time returned if set + */ + function getFollowMeListRingTime($exten) { + + global $asterisk_manager_interface; + + $number = ''; + + $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database get AMPUSER $exten/followme/grptime\r\n\r\n"); + if (is_numeric($response)) { + $number = $response; + } + + $stripped = preg_replace('/-|\(|\)|\s/','',$_COOKIE['ari_follow_me_listring_time']); + if ($stripped==$number) { + $number = $_COOKIE['ari_follow_me_listring_time']; + } + + return $number; + } + + /* + * Sets Follow Me List + * + * @param $exten + * Extension to modify + * @param $follow_me_list + * Follow Me List + */ + function setFollowMeList($exten,$follow_me_list) { + + global $asterisk_manager_interface; + + $value_opt = $follow_me_list; + + $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database put AMPUSER $exten/followme/grplist $value_opt\r\n\r\n"); + } + + /* + * Gets Follow Me List if set + * + * @param $exten + * Extension to get information about + * @return $data + * follow me list if set + */ + function getFollowMeList($exten) { + + global $asterisk_manager_interface; + + $number = ''; + + $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database get AMPUSER $exten/followme/grplist\r\n\r\n"); + + //TODO: really need to check for a bogus response, see how other side does it + // + return preg_replace("/[^0-9*\-]/", "", $response); + } + + /* + * Sets Follow Confirmation Setting + * + * @param $exten + * Extension to modify + * @param $follow_me_cofirm + * Follow Me Confirm Setting + */ + function setFollowMeConfirm($exten,$follow_me_confirm) { + + global $asterisk_manager_interface; + + $value_opt = ($follow_me_confirm)?'ENABLED':'DISABLED'; + + $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database put AMPUSER $exten/followme/grpconf $value_opt\r\n\r\n"); + } + + /* + * Gets Follow Me Confirmation Setting + * + * @param $exten + * Extension to get information about + * @return $data + * follow me confirm setting + */ + function getFollowMeConfirm($exten) { + + global $asterisk_manager_interface; + + $number = ''; + + $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database get AMPUSER $exten/followme/grpconf\r\n\r\n"); + + if (preg_match("/ENABLED/",$response)) { + $response='checked'; + } + else { + $response=''; + } + + //TODO: really need to check for a bogus response, see how other side does it + // + return $response; + + } + + /* + * Sets Follow Ddial Setting + * + * @param $exten + * Extension to modify + * @param $follow_me_ddial + * Follow Me Ddial Setting + */ + function setFollowMeDDial($exten,$follow_me_ddial) { + + global $asterisk_manager_interface; + + $value_opt = ($follow_me_ddial)?'DIRECT':'EXTENSION'; + + $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database put AMPUSER $exten/followme/ddial $value_opt\r\n\r\n"); + } + + /* + * Gets Follow Me Ddial Setting + * + * @param $exten + * Extension to get information about + * @return $data + * follow me ddial setting + */ + function getFollowMeDDial($exten) { + + global $asterisk_manager_interface; + + $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database get AMPUSER $exten/followme/ddial\r\n\r\n"); + + if (preg_match("/EXTENSION/",$response)) { + $response=''; + } + else { + $response='checked'; + } + + //TODO: really need to check for a bogus response, see how other side does it + // + return $response; + + } + + + + + + /* + * Gets FreePBX Version + */ + function getFreePBXVersion() { + + if (isset($_SESSION['dbh_asterisk'])) { + $sql = "SELECT * FROM admin WHERE variable = 'version'"; + $results = $_SESSION['dbh_asterisk']->getAll($sql); + if(DB::IsError($results)) { + $_SESSION['ari_error'] = $results->getMessage(); + } + + return $results[0][1]; + } + } + + /* + * Sets Follow-Me Settings in FreePBX MySQL Database + * + * @param $exten + * Extension to modify + * @param $follow_me_prering_time + * Pre-Ring Time to ring + * @param $follow_me_listring_time + * List Ring Time to ring + * @param $follow_me_list + * Follow Me List + * @param $follow_me_list + * Follow Me Confirm Setting + * + */ + function setFollowMeMySQL($exten, $follow_me_prering_time, $follow_me_listring_time, $follow_me_list, $follow_me_confirm) { + + if (isset($_SESSION['dbh_asterisk'])) { + + //format for SQL database + $follow_me_confirm = ($follow_me_confirm)?'CHECKED':''; + + $sql = "UPDATE findmefollow SET grptime = '" . $follow_me_listring_time . "', grplist = '". + str_replace("'", "''", trim($follow_me_list)) . "', pre_ring = '" . $follow_me_prering_time . + "', needsconf = '" . $follow_me_confirm . "' WHERE grpnum = $exten LIMIT 1"; + $results = $_SESSION['dbh_asterisk']->query($sql); + + if(DB::IsError($results)) { + $_SESSION['ari_error'] = $results->getMessage(); + } + + return 1; + } + } + + function lookupSetExtensionFormat($exten) { + + if (trim($exten) == "") return $exten; + + $exten = preg_replace("/[^0-9*]/", "", $exten); + + $sql = "SELECT extension FROM users WHERE extension = '".$exten."'"; + $asa = $_SESSION['dbh_asterisk']->getrow($sql, DB_FETCHMODE_ASSOC); + if (!is_array($asa)) { + return $exten.'#'; + } else { + return $exten; + } + } + + +} // class + +?>