Beispiel #1
0
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;
}