function ivr_get_config($engine) { global $ext; switch ($engine) { case "asterisk": $ddial_contexts = array(); $ivrlist = ivr_list(); if (is_array($ivrlist)) { foreach ($ivrlist as $item) { $id = "ivr-" . $item['ivr_id']; $details = ivr_get_details($item['ivr_id']); $announcement_id = isset($details['announcement_id']) ? $details['announcement_id'] : ''; $timeout_id = isset($details['timeout_id']) ? $details['timeout_id'] : ''; $invalid_id = isset($details['invalid_id']) ? $details['invalid_id'] : ''; $loops = isset($details['loops']) ? $details['loops'] : '2'; $retvm = isset($details['retvm']) ? $details['retvm'] : ''; if (!empty($details['enable_directdial'])) { if ($details['enable_directdial'] == 'CHECKED') { $ext->addInclude($id, 'from-did-direct-ivr'); //generated in core module } else { $ext->addInclude($id, 'from-ivr-directory-' . $details['enable_directdial']); $ddial_contexts[$details['enable_directdial']] = true; } } // I'm not sure I like the ability of people to send voicemail from the IVR. // Make it a config option, possibly? // $ext->addInclude($item[0],'app-messagecenter'); if (!empty($details['enable_directory'])) { $ext->addInclude($id, 'app-directory'); $dir = featurecodes_getFeatureCode('infoservices', 'directory'); $ext->add($id, '#', '', new ext_dbdel('${BLKVM_OVERRIDE}')); $ext->add($id, '#', '', new ext_setvar('__NODEST', '')); $ext->add($id, '#', '', new ext_goto("app-directory,{$dir},1")); } $ext->add($id, 'h', '', new ext_hangup('')); if ($announcement_id) { $announcement_msg = recordings_get_file($announcement_id); $ext->add($id, 's', '', new ext_setvar('MSG', "{$announcement_msg}")); } else { $ext->add($id, 's', '', new ext_setvar('MSG', "")); } $ext->add($id, 's', '', new ext_setvar('LOOPCOUNT', 0)); $ext->add($id, 's', '', new ext_setvar('__DIR-CONTEXT', $details['dircontext'])); $ext->add($id, 's', '', new ext_setvar('_IVR_CONTEXT_${CONTEXT}', '${IVR_CONTEXT}')); $ext->add($id, 's', '', new ext_setvar('_IVR_CONTEXT', '${CONTEXT}')); $ext->add($id, 's', '', new ext_gotoif('$["${CDR(disposition)}" = "ANSWERED"]', 'begin')); $ext->add($id, 's', '', new ext_answer('')); $ext->add($id, 's', '', new ext_wait('1')); $ext->add($id, 's', 'begin', new ext_digittimeout(3)); $ext->add($id, 's', '', new ext_responsetimeout($details['timeout'])); if ($retvm) { $ext->add($id, 's', '', new ext_setvar('__IVR_RETVM', 'RETURN')); } else { $ext->add($id, 's', '', new ext_setvar('__IVR_RETVM', '')); } $ext->add($id, 's', '', new ext_execif('$["${MSG}" != ""]', 'Background', '${MSG}')); $ext->add($id, 's', '', new ext_waitexten()); $ext->add($id, 'hang', '', new ext_playback('vm-goodbye')); $ext->add($id, 'hang', '', new ext_hangup('')); $default_t = true; // Actually add the IVR commands now. $dests = ivr_get_dests($item['ivr_id']); $timeout = false; $invalid = false; $addloop = false; if (!empty($dests)) { foreach ($dests as $dest) { if ($dest['selection'] == 't' && empty($details['alt_timeout'])) { $timeout = true; } elseif ($dest['selection'] == 'i' && empty($details['alt_invalid'])) { $invalid = true; } elseif ($dest['selection'] == 't' && !empty($details['alt_timeout'])) { $timeout = true; if ($timeout_id) { $timeout_msg = recordings_get_file($timeout_id); $ext->add($id, $dest['selection'], '', new ext_setvar('MSG', "{$timeout_msg}")); } $ext->add($id, $dest['selection'], '', new ext_setvar('LOOPCOUNT', '$[${LOOPCOUNT} + 1]')); $ext->add($id, $dest['selection'], '', new ext_gotoif('$[${LOOPCOUNT} <= ' . $loops . ']', 's,begin')); } elseif ($dest['selection'] == 'i' && !empty($details['alt_invalid'])) { $invalid = true; $ext->add($id, $dest['selection'], '', new ext_setvar('LOOPCOUNT', '$[${LOOPCOUNT} + 1]')); if ($invalid_id) { $invalid_msg = recordings_get_file($invalid_id); $ext->add($id, $dest['selection'], '', new ext_setvar('MSG', "{$invalid_msg}")); } else { $ext->add($id, $dest['selection'], '', new ext_execif('$[${LOOPCOUNT} <= ' . $loops . ']', 'Playback', 'invalid')); } $ext->add($id, $dest['selection'], '', new ext_gotoif('$[${LOOPCOUNT} <= ' . $loops . ']', 's,begin')); } $ext->add($id, $dest['selection'], '', new ext_dbdel('${BLKVM_OVERRIDE}')); $ext->add($id, $dest['selection'], '', new ext_setvar('__NODEST', '')); // if the goto goes loops back to this ivr, then don't go to the begining or it will break the return to previous ivr info // $dest_context = trim(strtok($dest['dest'], ",|")); if ($dest_context == $id) { $dest['dest'] = $id . ',s,begin'; } if ($dest['ivr_ret']) { $ext->add($id, $dest['selection'], '', new ext_gotoif('$["x${IVR_CONTEXT_${CONTEXT}}" = "x"]', $dest['dest'] . ':${IVR_CONTEXT_${CONTEXT}},return,1')); } else { $ext->add($id, $dest['selection'], '', new ext_goto($dest['dest'])); } } } // Apply invalid if required if (!$invalid) { if ($invalid_id) { $invalid_msg = recordings_get_file($invalid_id); $ext->add($id, 'i', '', new ext_setvar('MSG', "{$invalid_msg}")); } else { $ext->add($id, 'i', '', new ext_playback('invalid')); } $ext->add($id, 'i', '', new ext_goto('loop,1')); $addloop = true; } if (!$timeout) { if ($timeout_id) { $timeout_msg = recordings_get_file($timeout_id); $ext->add($id, 't', '', new ext_setvar('MSG', "{$timeout_msg}")); } $ext->add($id, 't', '', new ext_goto('loop,1')); $addloop = true; } if ($addloop) { $ext->add($id, 'loop', '', new ext_setvar('LOOPCOUNT', '$[${LOOPCOUNT} + 1]')); $ext->add($id, 'loop', '', new ext_gotoif('$[${LOOPCOUNT} > ' . $loops . ']', 'hang,1')); $ext->add($id, 'loop', '', new ext_goto($id . ',s,begin')); // these need to be reset or inheritance problems makes them go away in some conditions and infinite inheritance creates other problems // reset the message including blanking it if set by a sub-ivr $announcement_msg = $announcement_id ? $announcement_msg : ''; $ext->add($id, 'return', '', new ext_setvar('MSG', "{$announcement_msg}")); $ext->add($id, 'return', '', new ext_setvar('_IVR_CONTEXT', '${CONTEXT}')); $ext->add($id, 'return', '', new ext_setvar('_IVR_CONTEXT_${CONTEXT}', '${IVR_CONTEXT_${CONTEXT}}')); $ext->add($id, 'return', '', new ext_goto($id . ',s,begin')); } } if (!empty($ddial_contexts)) { global $version; $ast_lt_14 = version_compare($version, '1.4', 'lt'); foreach (array_keys($ddial_contexts) as $dir_id) { $context = 'from-ivr-directory-' . $dir_id; $entries = function_exists('directory_get_dir_entries') ? directory_get_dir_entries($dir_id) : array(); foreach ($entries as $dstring) { $exten = $dstring['dial'] == '' ? $dstring['foreign_id'] : $dstring['dial']; if ($exten == '' || $exten == 'custom') { continue; } if ($ast_lt_14) { $ext->add($context, $exten, '', new ext_execif('$["${BLKVM_OVERRIDE}" != ""]', 'dbDel', '${BLKVM_OVERRIDE}')); } else { $ext->add($context, $exten, '', new ext_execif('$["${BLKVM_OVERRIDE}" != ""]', 'Noop', 'Deleting: ${BLKVM_OVERRIDE}: ${DB_DELETE(${BLKVM_OVERRIDE})}')); } $ext->add($context, $exten, '', new ext_setvar('__NODEST', '')); $ext->add($context, $exten, '', new ext_goto('1', $exten, 'from-internal')); } } } } break; } }
function ivr_get_config($engine) { global $ext; switch ($engine) { case "asterisk": $ddial_contexts = array(); $ivrlist = ivr_get_details(); if (!is_array($ivrlist)) { break; } if (function_exists('queues_list')) { //draw a list of ivrs included by any queues $queues = queues_list(true); $qivr = array(); foreach ($queues as $q) { $thisq = queues_get($q[0]); if ($thisq['context'] && strpos($thisq['context'], 'ivr-') === 0) { $qivr[] = str_replace('ivr-', '', $thisq['context']); } } } foreach ($ivrlist as $ivr) { $c = 'ivr-' . $ivr['id']; $ivr = ivr_get_details($ivr['id']); $ext->addSectionComment($c, $ivr['name'] ? $ivr['name'] : 'IVR ' . $ivr['id']); if ($ivr['directdial']) { if ($ivr['directdial'] == 'ext-local') { $ext->addInclude($c, 'from-did-direct-ivr'); //generated in core module } else { //generated by directory $ext->addInclude($c, 'from-ivr-directory-' . $ivr['directdial']); $directdial_contexts[$ivr['directdial']] = $ivr['directdial']; } } //set variables for loops when used if ($ivr['timeout_loops'] != 'disabled' && $ivr['timeout_loops'] > 0) { $ext->add($c, 's', '', new ext_setvar('TIMEOUT_LOOPCOUNT', 0)); } if ($ivr['invalid_loops'] != 'disabled' && $ivr['invalid_loops'] > 0) { $ext->add($c, 's', '', new ext_setvar('INVALID_LOOPCOUNT', 0)); } $ext->add($c, 's', '', new ext_setvar('_IVR_CONTEXT_${CONTEXT}', '${IVR_CONTEXT}')); $ext->add($c, 's', '', new ext_setvar('_IVR_CONTEXT', '${CONTEXT}')); if ($ivr['retvm']) { $ext->add($c, 's', '', new ext_setvar('__IVR_RETVM', 'RETURN')); } else { //TODO: do we need to set anything at all? $ext->add($c, 's', '', new ext_setvar('__IVR_RETVM', '')); } if ($ivr['alertinfo'] != '') { $ext->add($c, 's', '', new ext_setvar('__ALERT_INFO', str_replace(';', '\\;', $ivr['alertinfo']))); } $ext->add($c, 's', '', new ext_gotoif('$["${CHANNEL(state)}" = "Up"]', 'skip')); $ext->add($c, 's', '', new ext_answer('')); $ext->add($c, 's', '', new ext_wait('1')); $ivr_announcement = recordings_get_file($ivr['announcement']); $ext->add($c, 's', 'skip', new ext_set('IVR_MSG', $ivr_announcement)); $ext->add($c, 's', 'start', new ext_digittimeout(3)); //$ext->add($ivr_id, 's', '', new ext_responsetimeout($ivr['timeout_time'])); $ext->add($c, 's', '', new ext_execif('$["${IVR_MSG}" != ""]', 'Background', '${IVR_MSG}')); $ext->add($c, 's', '', new ext_waitexten($ivr['timeout_time'])); // Actually add the IVR entires now $entries = ivr_get_entries($ivr['id']); if ($entries) { foreach ($entries as $e) { //dont set a t or i if there already defined above if ($e['selection'] == 't' && $ivr['timeout_loops'] != 'disabled') { continue; } if ($e['selection'] == 'i' && $ivr['invalid_loops'] != 'disabled') { continue; } //only display these two lines if the ivr is included in any queues if (function_exists('queues_list') && in_array($ivr['id'], $qivr)) { $ext->add($c, $e['selection'], '', new ext_macro('blkvm-clr')); $ext->add($c, $e['selection'], '', new ext_setvar('__NODEST', '')); } if ($e['ivr_ret']) { $ext->add($c, $e['selection'], '', new ext_gotoif('$["x${IVR_CONTEXT_${CONTEXT}}" = "x"]', $e['dest'] . ':${IVR_CONTEXT_${CONTEXT}},return,1')); } else { $ext->add($c, $e['selection'], 'ivrsel-' . $e['selection'], new ext_goto($e['dest'])); } } } // add invalid destination if required if ($ivr['invalid_loops'] != 'disabled') { if ($ivr['invalid_loops'] > 0) { $ext->add($c, 'i', '', new ext_set('INVALID_LOOPCOUNT', '$[${INVALID_LOOPCOUNT}+1]')); $ext->add($c, 'i', '', new ext_gotoif('$[${INVALID_LOOPCOUNT} > ' . $ivr['invalid_loops'] . ']', 'final')); switch ($ivr['invalid_retry_recording']) { case 'default': $invalid_annoucement = 'no-valid-responce-pls-try-again'; break; case '': $invalid_annoucement = ''; break; default: $invalid_annoucement = recordings_get_file($ivr['invalid_retry_recording']); break; } if ($ivr['invalid_append_announce'] || $invalid_annoucement == '') { $invalid_annoucement .= '&' . $ivr_announcement; } $ext->add($c, 'i', '', new ext_set('IVR_MSG', trim($invalid_annoucement, '&'))); $ext->add($c, 'i', '', new ext_goto('s,start')); } $label = 'final'; switch ($ivr['invalid_recording']) { case 'default': $ext->add($c, 'i', $label, new ext_playback('no-valid-responce-transfering')); $label = ''; break; case '': break; default: $ext->add($c, 'i', $label, new ext_playback(recordings_get_file($ivr['invalid_recording']))); $label = ''; break; } if (!empty($ivr['invalid_ivr_ret'])) { $ext->add($c, 'i', $label, new ext_gotoif('$["x${IVR_CONTEXT_${CONTEXT}}" = "x"]', $ivr['invalid_destination'] . ':${IVR_CONTEXT_${CONTEXT}},return,1')); } else { $ext->add($c, 'i', $label, new ext_goto($ivr['invalid_destination'])); } } else { // If no invalid destination provided we need to do something $ext->add($c, 'i', '', new ext_playback('sorry-youre-having-problems')); $ext->add($c, 'i', '', new ext_goto('1', 'hang')); } // Apply timeout destination if required if ($ivr['timeout_loops'] != 'disabled') { if ($ivr['timeout_loops'] > 0) { $ext->add($c, 't', '', new ext_set('TIMEOUT_LOOPCOUNT', '$[${TIMEOUT_LOOPCOUNT}+1]')); $ext->add($c, 't', '', new ext_gotoif('$[${TIMEOUT_LOOPCOUNT} > ' . $ivr['timeout_loops'] . ']', 'final')); switch ($ivr['timeout_retry_recording']) { case 'default': $timeout_annoucement = 'no-valid-responce-pls-try-again'; break; case '': $timeout_annoucement = ''; break; default: $timeout_annoucement = recordings_get_file($ivr['timeout_retry_recording']); break; } if ($ivr['timeout_append_announce'] || $timeout_annoucement == '') { $timeout_annoucement .= '&' . $ivr_announcement; } $ext->add($c, 't', '', new ext_set('IVR_MSG', trim($timeout_annoucement, '&'))); $ext->add($c, 't', '', new ext_goto('s,start')); } $label = 'final'; switch ($ivr['timeout_recording']) { case 'default': $ext->add($c, 't', $label, new ext_playback('no-valid-responce-transfering')); $label = ''; break; case '': break; default: $ext->add($c, 't', $label, new ext_playback(recordings_get_file($ivr['timeout_recording']))); $label = ''; break; } if (!empty($ivr['timeout_ivr_ret'])) { $ext->add($c, 't', $label, new ext_gotoif('$["x${IVR_CONTEXT_${CONTEXT}}" = "x"]', $ivr['timeout_destination'] . ':${IVR_CONTEXT_${CONTEXT}},return,1')); } else { $ext->add($c, 't', $label, new ext_goto($ivr['timeout_destination'])); } } else { // If no invalid destination provided we need to do something $ext->add($c, 't', '', new ext_playback('sorry-youre-having-problems')); $ext->add($c, 't', '', new ext_goto('1', 'hang')); } // these need to be reset or inheritance problems makes them go away in some conditions //and infinite inheritance creates other problems $ext->add($c, 'return', '', new ext_setvar('_IVR_CONTEXT', '${CONTEXT}')); $ext->add($c, 'return', '', new ext_setvar('_IVR_CONTEXT_${CONTEXT}', '${IVR_CONTEXT_${CONTEXT}}')); $ext->add($c, 'return', '', new ext_set('IVR_MSG', $ivr_announcement)); $ext->add($c, 'return', '', new ext_goto('s,start')); //h extension $ext->add($c, 'h', '', new ext_hangup('')); $ext->add($c, 'hang', '', new ext_playback('vm-goodbye')); $ext->add($c, 'hang', '', new ext_hangup('')); } //generate from-ivr-directory contexts for direct dialing a directory entire if (!empty($directdial_contexts)) { foreach ($directdial_contexts as $dir_id) { $c = 'from-ivr-directory-' . $dir_id; $entries = function_exists('directory_get_dir_entries') ? directory_get_dir_entries($dir_id) : array(); foreach ($entries as $dstring) { $exten = $dstring['dial'] == '' ? $dstring['foreign_id'] : $dstring['dial']; if ($exten == '' || $exten == 'custom') { continue; } $ext->add($c, $exten, '', new ext_macro('blkvm-clr')); $ext->add($c, $exten, '', new ext_setvar('__NODEST', '')); $ext->add($c, $exten, '', new ext_goto('1', $exten, 'from-internal')); } } } break; } }
function directory_draw_entries($id) { $sql = 'SELECT id,name FROM directory_entries ORDER BY name'; $results = sql($sql, 'getAll', DB_FETCHMODE_ASSOC); $html = ''; $html .= '<table id="dir_entries_tbl" class="table table-striped">'; $headers = mod_func_iterator('draw_entries_table_header_directory'); $html .= '<thead><tr>'; foreach ($headers as $mod => $header) { foreach ($header as $h) { if (is_array($h)) { $html .= '<th ' . $h['attr'] . '/>'; $html .= $h['val']; $html .= '</th>'; } else { $html .= '<th>' . $h . '</th>'; } } } $html .= '</tr></thead>'; $newuser = '******'; $newuser .= '<option value="none" selected> == ' . _('Choose One') . ' == </option>'; $newuser .= '<option value="all">' . _('All Users') . '</option>'; $newuser .= '<option value="|">' . _('Custom') . '</option>'; //TODO: could this cause a problem with the '|' separator if a name has a '|' in it? (probably not check for comment where parsed foreach ((array) core_users_list() as $user) { $newuser .= '<option value="' . $user[0] . '|' . $user[1] . '">(' . $user[0] . ') ' . $user[1] . "</option>\n"; } $newuser .= '</select>'; $html .= '<tfoot><tr><td id="addbut"><a href="#" class="info"><i class="fa fa-plus" name="image" style="font-size: 20px;cursor:pointer;color:#0070a3;" /><span>' . _('Add new entry.') . '</span></a></td><td colspan="' . (count(directory_draw_entries_table_header_directory()) - 1) . '"id="addrow" style="display: none;">' . $newuser . '</td></tr></tfoot>'; $html .= '<tbody>'; $entries = directory_get_dir_entries($id); $inuse = array(); foreach ($entries as $e) { $realid = $e['type'] == 'custom' ? 'custom' : $e['foreign_id']; $value = $e['foreign_id'] . "|" . $e['foreign_name']; $foreign_name = $e['foreign_name'] == '' ? 'Custom Entry' : $e['foreign_name']; $html .= directory_draw_entries_tr($id, $realid, $e['name'], $foreign_name, $e['audio'], $e['dial'], $e['e_id'], false, $value); if ($e['type'] == 'custom') { $inuse[] = $e['name']; } else { $inuse[] = $e['foreign_id'] . "|" . $e['foreign_name']; } } $html .= '</tbody></table>'; $html .= '<script>var inuse = ' . json_encode($inuse) . '</script>'; return $html; }