From robert at gforge.opensource-sw.net Thu Aug 16 11:49:21 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Thu, 16 Aug 2007 11:49:21 -0700 (PDT) Subject: [Outgroups-commits] r1 - / Message-ID: <20070816184921.80D268C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-16 11:41:34 -0700 (Thu, 16 Aug 2007) New Revision: 1 Added: branches/ tags/ trunk/ Log: Initial Tree From robert at gforge.opensource-sw.net Thu Aug 16 12:24:21 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Thu, 16 Aug 2007 12:24:21 -0700 (PDT) Subject: [Outgroups-commits] r2 - in trunk: . outgrps Message-ID: <20070816192421.3BA938C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-16 12:24:20 -0700 (Thu, 16 Aug 2007) New Revision: 2 Added: trunk/outgrps/ trunk/outgrps/functions.inc.php trunk/outgrps/install.php trunk/outgrps/install.sql trunk/outgrps/module.xml trunk/outgrps/page.outgrps.php trunk/outgrps/uninstall.php trunk/outgrps/uninstall.sql Log: Initial checkin of alpha source Added: trunk/outgrps/functions.inc.php =================================================================== --- trunk/outgrps/functions.inc.php (rev 0) +++ trunk/outgrps/functions.inc.php 2007-08-16 19:24:20 UTC (rev 2) @@ -0,0 +1,740 @@ +addoptlistitem('outgrpsel', '', 'Default'); + foreach ($outgrps as $key=>$val) { + $currentcomponent->addoptlistitem('outgrpsel', $key, $val.' ('.$key.') ', false); + } + $currentcomponent->setoptlistopts('outgrpsel', 'sort', false); + } + $currentcomponent->addguifunc('outgrps_configpageload'); + $currentcomponent->addprocessfunc('outgrps_configprocess'); + } +} + +//hook gui function +function outgrps_configpageload($compname) { + global $currentcomponent; + + // error_log('outgrps_configpageload entered'); + + if ($compname == 'extensions') { + // Init vars from $_REQUEST[] + $display = isset($_REQUEST['display'])?$_REQUEST['display']:null;; + $action = isset($_REQUEST['action'])?$_REQUEST['action']:null; + $extdisplay = isset($_REQUEST['extdisplay'])?$_REQUEST['extdisplay']:null; + + $current_value = outgrps_extension_get($extdisplay); + + $currentcomponent->addguielem('Extension Options', new gui_selectbox('outgrp', $currentcomponent->getoptlist('outgrpsel'), $current_value, _('Outbound Group'), _('Select a group for this extension. The group specifies which prefix to prepend for outbound calls when 9 is used. It also determines the number dialed for emergencies when this extension dials 911.'), false)); + } +} + + +//hook process function +function outgrps_configprocess($compname) { + global $currentcomponent; + + // error_log('outgrps_configprocess entered'); + + if ($compname == 'extensions') { + // Init vars from $_REQUEST[] + $action = isset($_REQUEST['action'])?$_REQUEST['action']:null; + $extdisplay = isset($_REQUEST['extdisplay'])?$_REQUEST['extdisplay']:null; + $outgrp = isset($_REQUEST['outgrp'])?$_REQUEST['outgrp']:null; + + if ($action == 'edit') { + outgrps_extension_set($extdisplay, $outgrp !== '' ? $outgrp : null); + } + } +} + +/* + +// Generates dialplan for outgrps +// We call this with retrieve_conf + +*/ + +function outgrps_get_config($engine) { + global $ext; // is this the best way to pass this? + global $asterisk_conf; + global $outgrps_globals; + global $db; + + // error_log('outgrps_get_config entered'); + + $trunk_tech = array(); + + //Retrieve each trunk tech for later lookup + $result = sql('select * from globals WHERE variable LIKE \'OUT\\_%\'', 'getAll'); + if (DB::IsError($result)) { + die_freepbx($result->getMessage()); + } + + foreach ($result as $tr) { + $trunk_tech[$tr[0]] = strtok($tr[1], '/'); + } + + $outgrps_globals = outgrps_globals_get(); + + $emer_num = $outgrps_globals['emer_num']; + $out_prefix = $outgrps_globals['out_prefix']; + $prefix_len = strlen($out_prefix); + + switch($engine) { + case "asterisk": + $ext->addInclude('outbound-allroutes', 'outgrps-routes'); + if ($emer_num) { + $ext->add('outgrps-routes', $emer_num, '', new ext_goto(1, 'emer')); + if ($out_prefix) { + $ext->add('outgrps-routes', $out_prefix.$emer_num, '', new ext_goto(1, 'emer')); + } + + $ext->add('outgrps-routes', 'emer', '', new ext_set('EMERGENCYROUTE','yes')); + $ext->add('outgrps-routes', 'emer', '', new ext_set('OUTNUM',$emer_num)); + $ext->add('outgrps-routes', 'emer', '', new ext_macro('outgrps-lookup')); + $ext->add('outgrps-routes', 'emer', '', new ext_goto(1, 'emer-grp-${OUTGRPS_ID}')); + } + + if ($out_prefix) { + $ext->add('outgrps-routes', '_'.$out_prefix.'.', '', new ext_set('OUTNUM','${EXTEN:'.$prefix_len.'}')); + $ext->add('outgrps-routes', '_'.$out_prefix.'.', '', new ext_macro('outgrps-lookup')); + $ext->add('outgrps-routes', '_'.$out_prefix.'.', '', new ext_goto(1, 'outb-grp-${OUTGRPS_ID}')); + } + + $group_list = sql('SELECT * FROM outgrps ORDER BY outgrp_id', 'getAll', DB_FETCHMODE_ASSOC); + if (DB::IsError($group_list)) { + die_freepbx($group_list->getMessage()); + } + + $trunks_query = $db->prepare('SELECT * FROM outgrps_trunks WHERE outgrp_id = ? AND trunk_type = ? ORDER BY trunk_prio'); + if (DB::IsError($trunks_query)) { + die_freepbx($trunks_query->getMessage()); + } + + foreach ($group_list as $group) { + $group_id = $group['outgrp_id']; + $emer_trunks = $db->execute($trunks_query, array($group_id, 1)); + if (DB::IsError($emer_trunks)) { + die_freepbx($emer_trunks->getMessage()); + } + $emer_cid = $group['emer_cid']; + if ($emer_num) { + if ($emer_trunks->numRows() > 0) { + if ("$emer_cid" != '') { + $ext->add('outgrps-routes', 'emer-grp-'.$group_id, '', new ext_set('OUTGRPS_ECID','"${QUOTE('.$group['emer_cid'].')}"')); + } + + while ($trunk =& $emer_trunks->fetchRow(DB_FETCHMODE_ASSOC)) { + $trunk_name = $trunk['trunk_name']; + $trunk_number = substr($trunk_name,4); // cut off OUT_ from $trunk + $trunk_pattern = $trunk['trunk_pattern']; + if ($trunk_pattern != '') { + $wild_position = strpos($trunk_pattern, '%'); + if ($wild_position !== false) { + $trunk_dial = substr($trunk_pattern, 0, $wild_position).'${OUTNUM}'.substr($trunk_pattern, $wild_position + 1); + } else { + $trunk_dial = $trunk_pattern; + } + } else { + $trunk_dial = '${OUTNUM}'; + } + $ext->add('outgrps-routes', 'emer-grp-'.$group_id, '', new ext_macro('outgrps-dialout-trunk',$trunk_number.','.$trunk_dial)); + } + $ext->add('outgrps-routes', 'emer-grp-'.$group_id, '', new ext_macro('outisbusy')); + } else { + $ext->add('outgrps-routes', 'emer-grp-'.$group_id, '', new ext_playback('no-911-1')); + $ext->add('outgrps-routes', 'emer-grp-'.$group_id, '', new ext_goto(1, 'invalid')); + } + } + if ($out_prefix) { + $out_trunks = $db->execute($trunks_query, array($group_id, 2)); + if ($out_trunks->numRows() > 0) { + if ($group['out_cid']) { + $ext->add('outgrps-routes', 'outb-grp-'.$group_id, '', new ext_set('OUTGRPS_CID','${QUOTE('.$group['out_cid'].')}')); + } + + if ($group['mohclass'] && $group['mohclass'] != 'default') { + $ext->add('outgrps-routes', 'outb-grp-'.$group_id, '', new ext_set("MOHCLASS", '${IF($["x${MOHCLASS}"="x"]?'.$group['mohclass'].':${MOHCLASS})}' )); + } + $first_trunk = true; + while ($trunk = &$out_trunks->fetchRow(DB_FETCHMODE_ASSOC)) { + $trunk_name = $trunk['trunk_name']; + $trunk_number = substr($trunk_name,4); // cut off OUT_ from $trunk + $trunk_pattern = $trunk['trunk_pattern']; + $trunk_password = $trunk['trunk_password']; + if ($first_trunk && $trunk_password != '') { + $pass = ','.$trunk_password; + $first_trunk = false; + } else { + $pass = ''; + } + + if ($trunk_pattern != '') { + $wild_position = strpos($trunk_pattern, '%'); + if ($wild_position !== false) { + $trunk_dial = substr($trunk_pattern, 0, $wild_position).'${OUTNUM}'.substr($trunk_pattern, $wild_position + 1); + } else { + $trunk_dial = $trunk_pattern; + } + } else { + $trunk_dial = '${OUTNUM}'; + } + + $ext->add('outgrps-routes', 'outb-grp-'.$group_id, '', new ext_macro('outgrps-dialout-trunk',$trunk_number.','.$trunk_dial.$pass)); + } + $ext->add('outgrps-routes', 'outb-grp-'.$group_id, '', new ext_macro('outisbusy')); + } else { + $ext->add('outgrps-routes', 'outb-grp-'.$group_id, '', new ext_playback('Playback(silence/1&invalid')); + $ext->add('outgrps-routes', 'outb-grp-'.$group_id, '', new ext_goto(1, 'invalid')); + } + } + } + + if ($emer_num) { + $ext->add('outgrps-routes', 'emer-grp-', '', new ext_playback('no-911-1')); + $ext->add('outgrps-routes', 'emer-grp-', '', new ext_goto(1, 'invalid')); + } + + if ($out_prefix) { + $ext->add('outgrps-routes', 'outb-grp-', '', new ext_playback('Playback(silence/1&invalid')); + $ext->add('outgrps-routes', 'outb-grp-', '', new ext_goto(1, 'invalid')); + } + + $ext->add('outgrps-routes', 'invalid', '', new ext_playtones('congestion')); + $ext->add('outgrps-routes', 'invalid', '', new ext_congestion()); + $ext->add('outgrps-routes', 'invalid', '', new ext_macro(hangupcall)); + + $ext->add('macro-outgrps-lookup', 's', '', new ext_dbget('OUTGRPS_ID', 'DEVICE/${CALLERID(number)}/outgrp')); + $ext->add('macro-outgrps-lookup', 's', '', new ext_gotoif('$["${OUTGRPS_ID}" != ""]', 'end')); + $ext->add('macro-outgrps-lookup', 's', '', new ext_set('OUTGRPS_ID', '$["${CALLERID(number)}" : "${OUTGRPS_GRPPATTERN}"]')); + $ext->add('macro-outgrps-lookup', 's', 'end', new ext_noop('Exiting macro-outgrps-lookup')); + + outgrps_dialout_trunk_macro(); + outgrps_dialout_other_macro(); + outgrps_dialout_custom_macro(); + outgrps_dialout_enum_macro(); + outgrps_callerid_macro(); + outgrps_callerid_get_macro(); + outgrps_callerid_set_macro(); + break; + } +} + +function outgrps_dialout_trunk_macro() +{ + global $ext; + + // dialout using a trunk, using pattern matching (don't strip any prefix) + // arg1 = trunk number, arg2 = number, arg3 = route password + // + // MODIFIED (PL) + // + // Modified both Dial() commands to include the new TRUNK_OPTIONS from the general + // screen of AMP + // + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_set('DIAL_TRUNK', '${ARG1}')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_set('DIAL_NUMBER', '${ARG2}')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_set('ROUTE_PASSWD', '${ARG3}')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_gotoif('$["${ROUTE_PASSWD}" = ""]', 'noauth')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_authenticate('${ROUTE_PASSWD}')); + $ext->add('macro-outgrps-dialout-trunk', 's', 'noauth', new ext_gotoif('$["x${OUTDISABLE_${DIAL_TRUNK}}" = "xon"]', 'disabletrunk,1')); + + // If NODEST is set, clear it. No point in remembering since dialout-trunk will just end in the + // bit bucket. But if answered by an outside line with transfer capability, we want NODEST to be + // clear so a subsequent transfer to an internal extension works and goes to voicemail or other + // destinations. + // + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_set('_NODEST', '')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_set('DIAL_TRUNK_OPTIONS', '${DIAL_OPTIONS}')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_set('GROUP()', 'OUT_${DIAL_TRUNK}')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_macro('user-callerid', 'SKIPTTL')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_macro('record-enable', '${CALLERID(number)},OUT')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_gotoif('$["${INTRACOMPANYROUTE}" = "YES"]', 'skipoutcid')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_set('DIAL_TRUNK_OPTIONS', '${TRUNK_OPTIONS}')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_macro('outgrps-callerid', '${DIAL_TRUNK}')); + $ext->add('macro-outgrps-dialout-trunk', 's', 'skipoutcid', new ext_gotoif('$["${OUTMAXCHANS_${DIAL_TRUNK}}foo" = "foo"]', 'nomax')); + $ext->add('macro-outgrps-dialout-trunk', 's', 'checkmax', new ext_gotoif('$[ ${GROUP_COUNT()} > ${OUTMAXCHANS_${DIAL_TRUNK}} ]', 'chanfull')); + $ext->add('macro-outgrps-dialout-trunk', 's', 'nomax', new ext_agi('fixlocalprefix')); + + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_gotoif('$[$["${MOHCLASS}" = "default"] | $["foo${MOHCLASS}" = "foo"]]', 'nomusic')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_set('DIAL_TRUNK_OPTIONS', 'M(setmusic^${MOHCLASS})${DIAL_TRUNK_OPTIONS}')); + + $ext->add('macro-outgrps-dialout-trunk', 's', 'nomusic', new ext_set('OUTNUM', '${OUTPREFIX_${DIAL_TRUNK}}${DIAL_NUMBER}')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_gotoif('$["${OUT_${DIAL_TRUNK}:0,5}" = "ENUM/"]', 'enum')); + + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_set('custom', '${CUT(OUT_${DIAL_TRUNK},:,1)}')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_gotoif('$["${custom}" = "AMP"]', 'custom')); + + $ext->add('macro-outgrps-dialout-trunk', 's', 'other', new ext_macro('outgrps-dialout-other')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_goto(1, 's-${DIALSTATUS}')); + + $ext->add('macro-outgrps-dialout-trunk', 's', 'custom', new ext_macro('outgrps-dialout-custom')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_goto(1, 's-${DIALSTATUS}')); + + $ext->add('macro-outgrps-dialout-trunk', 's', 'enum', new ext_macro('outgrps-dialout-enum')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_goto(1, 's-${DIALSTATUS}')); + + $ext->add('macro-outgrps-dialout-trunk', 's', 'chanfull', new ext_noop('max channels used up')); + $ext->add('macro-outgrps-dialout-trunk', 's', 'end', new ext_noop('Exiting macro-outgrps-dialout-trunk')); + + $ext->add('macro-outgrps-dialout-trunk', 's-BUSY', '', new ext_noop('TRUNK: Dial failed due to trunk reporting BUSY - giving up')); + $ext->add('macro-outgrps-dialout-trunk', 's-BUSY', '', new ext_busy(20)); + + $ext->add('macro-outgrps-dialout-trunk', '_s-.', '', new ext_gotoif('$[ $[ "${DIALSTATUS}" = "NOANSWER" ] | $[ "${DIALSTATUS}" = "CANCEL" ] ]', 'noreport')); + $ext->add('macro-outgrps-dialout-trunk', '_s-.', '', new ext_gotoif('$["x${OUTFAIL_${DIAL_TRUNK}}" = "x"]', 'noreport')); + $ext->add('macro-outgrps-dialout-trunk', '_s-.', '', new ext_agi('${OUTFAIL_${DIAL_TRUNK}}')); + $ext->add('macro-outgrps-dialout-trunk', '_s-.', 'noreport', new ext_noop('TRUNK: Dial failed due to ${DIALSTATUS} - failing through to next trunk')); + + $ext->add('macro-outgrps-dialout-trunk', 'disabletrunk', '', new ext_noop('TRUNK: ${OUT_${DIAL_TRUNK}} DISABLED - falling through to next trunk')); + + $ext->add('macro-outgrps-dialout-trunk', 'h', '', new ext_macro('hangupcall')); +} + +function outgrps_dialout_other_macro() { + global $ext; + + // Inherits DIAL_TRUNK, DIAL_NUMBER and DIAL_TRUNK_OPTIONS from caller. + + $ext->add('macro-outgrps-dialout-other', 's', '', new ext_dial('${OUT_${DIAL_TRUNK}}/${OUTNUM}','300,${DIAL_TRUNK_OPTIONS}')); + $ext->add('macro-outgrps-dialout-other', 's', 'end', new ext_noop('Exiting macro-outgrps-dialout-other')); +} + +function outgrps_dialout_custom_macro() { + global $ext; + + // Inherits DIAL_TRUNK, DIAL_NUMBER and DIAL_TRUNK_OPTIONS from caller. + + $ext->add('macro-outgrps-dialout-custom', 's', '', new ext_set('pre_num', '${CUT(OUT_${DIAL_TRUNK},$,1)}')); + $ext->add('macro-outgrps-dialout-custom', 's', '', new ext_set('the_num', '${CUT(OUT_${DIAL_TRUNK},$,2)}')); + $ext->add('macro-outgrps-dialout-custom', 's', '', new ext_set('post_num', '${CUT(OUT_${DIAL_TRUNK},$,3)}')); + $ext->add('macro-outgrps-dialout-custom', 's', '', new ext_gotoif('$["${the_num}" != "OUTNUM"]', 'skipoutnum')); + $ext->add('macro-outgrps-dialout-custom', 's', '', new ext_set('the_num', '${OUTNUM}')); + $ext->add('macro-outgrps-dialout-custom', 's', 'skipoutnum', new ext_dial('${pre_num:4}${the_num}${post_num}','300,${DIAL_TRUNK_OPTIONS}')); + $ext->add('macro-outgrps-dialout-custom', 's', 'end', new ext_noop('Exiting macro-outgrps-dialout-custom')); +} + +function outgrps_dialout_enum_macro() +{ + global $ext; + + // Inherits DIAL_TRUNK, DIAL_NUMBER and DIAL_TRUNK_OPTIONS from caller. + + // Replacement for asterisk's ENUMLOOKUP function + $ext->add('macro-outgrps-dialout-enum', 's', '', new ext_agi('enumlookup.agi')); + + // Now we have the variable DIALARR set to a list of URI's that can be called, in order of priority + // Loop through them trying them in order. + + $ext->add('macro-outgrps-dialout-enum', 's', 'dialloop', new ext_gotoif('$["foo${DIALARR}"="foo"]','end')); + $ext->add('macro-outgrps-dialout-enum', 's', '', new ext_set('TRYDIAL','${CUT(DIALARR,%,1)}')); + $ext->add('macro-outgrps-dialout-enum', 's', '', new ext_set('DIALARR','${CUT(DIALARR,%,2-)}')); + $ext->add('macro-outgrps-dialout-enum', 's', '', new ext_dial('${TRYDIAL}','300,${DIAL_TRUNK_OPTIONS}')); + $ext->add('macro-outgrps-dialout-enum', 's', '', new ext_noop('Dial exited in macro-outgrps-dialout-enum with ${DIALSTATUS}')); + + // Now, if we're still here, that means the Dial failed for some reason. + // If it's CONGESTION or CHANUNAVAIL we want to try again on a different + // different channel. If there's no more left, the dialloop tag will exit. + + $ext->add('macro-outgrps-dialout-enum', 's', '', new ext_gotoif('$[ $[ "${DIALSTATUS}" = "CHANUNAVAIL" ] | $[ "${DIALSTATUS}" = "CONGESTION" ] ]', 'dialloop')); + $ext->add('macro-outgrps-dialout-enum', 's', 'end', new ext_noop('Exiting macro-outgrps-dialout-enum')); +} + +function outgrps_callerid_macro() +{ + global $ext; + + // overrides callerid out trunks + // arg1 is trunk + // macro-user-callerid should be called _before_ using this macro + $ext->add('macro-outgrps-callerid', 's', '', new ext_set('CALLERID_TRUNK','${ARG1}')); + $ext->add('macro-outgrps-callerid', 's', '', new ext_macro('outgrps-callerid-get')); + + $ext->add('macro-outgrps-callerid', 's', '', new ext_set('EMERGENCY_CID','$["${QUOTE(${EMERGENCY_CID})}" | "${QUOTE(${OUTGRPS_ECID})}"]')); + $ext->add('macro-outgrps-callerid', 's', '', new ext_set('TRUNKOUTCID','$["${QUOTE(${OUTGRPS_CID})}" | "${QUOTE(${TRUNKOUTCID})}"]')); + + $ext->add('macro-outgrps-callerid', 's', '', new ext_macro('outgrps-callerid-set')); +} + +function outgrps_callerid_get_macro() { + global $ext; + + // Keep the original CallerID number, for failover to the next trunk. + $ext->add('macro-outgrps-callerid-get', 's', '', new ext_gotoif('$["${REALCALLERIDNUM:1:2}" != ""]', 'start')); + $ext->add('macro-outgrps-callerid-get', 's', '', new ext_set('REALCALLERIDNUM', '${CALLERID(number)}')); + $ext->add('macro-outgrps-callerid-get', 's', 'start', new ext_noop('REALCALLERIDNUM is ${REALCALLERIDNUM}')); + + // If this came through a ringgroup or CF, then we want to retain original CID unless + // OUTKEEPCID_${trunknum} is set. + // + $ext->add('macro-outgrps-callerid-get', 's', '', new ext_gotoif('$["${KEEPCID}" != "TRUE"]', 'normcid')); + $ext->add('macro-outgrps-callerid-get', 's', '', new ext_gotoif('$["x${OUTKEEPCID_${CALLERID_TRUNK}}" = "xon"]', 'normcid')); + $ext->add('macro-outgrps-callerid-get', 's', '', new ext_gotoif('$["foo${REALCALLERIDNUM}" = "foo"]', 'normcid')); + $ext->add('macro-outgrps-callerid-get', 's', '', new ext_set('USEROUTCID', '${REALCALLERIDNUM}')); + + $ext->add('macro-outgrps-callerid-get', 's', '', new ext_gotoif('$["foo${DB(AMPUSER/${REALCALLERIDNUM}/device)}" = "foo"]', 'bypass')); + $ext->add('macro-outgrps-callerid-get', 's', 'normcid', new ext_set('USEROUTCID','${DB(AMPUSER/${REALCALLERIDNUM}/outboundcid)}')); + $ext->add('macro-outgrps-callerid-get', 's', 'bypass', new ext_set('EMERGENCYCID','${DB(DEVICE/${REALCALLERIDNUM}/emergency_cid)}')); + $ext->add('macro-outgrps-callerid-get', 's', '', new ext_set('TRUNKOUTCID','${OUTCID_${CALLERID_TRUNK}}')); +} + +function outgrps_callerid_set_macro() { + global $ext; + + // We now have to make sure the CID is valid. If we find an AMPUSER with the same CID, we assume it is an internal + // call (would be quite a conincidence if not) and go through the normal processing to get that CID. If a device + // is set for this CID, then it must be internal + // + $ext->add('macro-outgrps-callerid-set', 's', '', new ext_gotoif('$["${EMERGENCYROUTE:1:2}" = ""]', 'usercid')); + $ext->add('macro-outgrps-callerid-set', 's', '', new ext_gotoif('$["${EMERGENCYCID:1:2}" = ""]', 'usercid')); + $ext->add('macro-outgrps-callerid-set', 's', '', new ext_set('CALLERID(all)','${EMERGENCYCID}')); + $ext->add('macro-outgrps-callerid-set', 's', '', new ext_goto('end')); + $ext->add('macro-outgrps-callerid-set', 's', 'usercid', new ext_gotoif('$["${USEROUTCID:1:2}" = ""]', 'trunkcid')); + $ext->add('macro-outgrps-callerid-set', 's', '', new ext_set('CALLERID(all)','${USEROUTCID}')); + $ext->add('macro-outgrps-callerid-set', 's', '', new ext_goto('hidden')); + $ext->add('macro-outgrps-callerid-set', 's', 'trunkcid', new ext_gotoif('$["${TRUNKOUTCID:1:2}" = ""]', 'hidden')); + $ext->add('macro-outgrps-callerid-set', 's', '', new ext_set('CALLERID(all)','${TRUNKOUTCID}')); +// $ext->add('macro-outgrps-callerid-set', 's', '', new ext_goto('hidden')); + $ext->add('macro-outgrps-callerid-set', 's', 'hidden', new ext_gotoif('$["x${CALLERID(name)}"!="xhidden"]', 'end')); + $ext->add('macro-outgrps-callerid-set', 's', '', new ext_setcallerpres('prohib_passed_screen')); + $ext->add('macro-outgrps-callerid-set', 's', 'end', new ext_noop('CallerID set to ${CALLERID(all)}')); + $ext->add('macro-outgrps-callerid-set', 's', '', new ext_noop('Exiting macro-outgrps-callerid-set')); +} + +function outgrps_globals_get() { + global $db; + + // error_log('outgrps_globals_get entered'); + + $globals = array(); + + $result = $db->getAssoc('SELECT variable, value FROM globals WHERE variable LIKE \'OUTGRPS\\__%\''); + if (DB::isError($result)) { + die_freepbx($result->getMessage()); + } + + foreach ($result as $name=>$value) { + $globals[strtolower(substr($name, 8))] = $value; + } + + return $globals; +} + +function outgrps_globals_set($global_list) { + global $db; + + // error_log('outgrps_globals_set entered'); + + $newlist = array(); + + $result = sql('DELETE IGNORE FROM globals WHERE variable LIKE \'OUTGRPS\\__%\''); + if (DB::isError($result)) { + die_freepbx($result->getMessage()); + } + + foreach ($global_list as $name=>$value) { + $newlist[] = array( 'OUTGRPS_'.strtoupper($name), $value ); + } + + $stmt = $db->autoPrepare('globals', array( 'variable', 'value' )); + if (DB::isError($stmt)) { + die_freepbx($stmt->getMessage()); + } + + $result = $db->executeMultiple($stmt, $newlist); + if (DB::isError($result)) { + die_freepbx($result->getMessage()); + } + + return $result != null; +} + +function outgrps_list() { + global $db; + + // error_log('outgrps_list entered'); + + $result = $db->getAssoc('SELECT outgrp_id, description FROM outgrps'); + return $result; +} + +function outgrps_get($id) { + // error_log('outgrps_get entered'); + + $group = sql("SELECT * FROM outgrps WHERE outgrp_id = '$id'",'getRow',DB_FETCHMODE_ASSOC); + if (DB::isError($group)) { + die_freepbx($group->getMessage()); + } + + if ($group) { + $result = sql("SELECT trunk_name, trunk_pattern FROM outgrps_trunks WHERE outgrp_id = $id AND trunk_type = 1"); + if (DB::isError($result)) { + die_freepbx($result->getMessage()); + } + + $trunks = array(); + while ($row = &$result->fetchRow(DB_FETCHMODE_ASSOC)) { + $trunks[] = $row; + } + $group['emer_trunks'] = $trunks; + + $result = sql("SELECT trunk_name, trunk_pattern FROM outgrps_trunks WHERE outgrp_id = '$id' AND trunk_type = 2"); + if (DB::isError($result)) { + die_freepbx($result->getMessage()); + } + + $trunks = array(); + while ($row = &$result->fetchRow(DB_FETCHMODE_ASSOC)) { + $trunks[] = $row; + } + $group['out_trunks'] = $trunks; + } + + return isset($group) ? $group : null; +} + +function outgrps_del($id) { + global $astman; + + // error_log('outgrps_del entered'); + + // Deleting outgrps and its associations + $results = sql("DELETE FROM outgrps WHERE outgrp_id = '$id'"); + + if ($astman) { + $astman->database_deltree('OUTGRPS', $id); + } + + $results = sql("DELETE FROM outgrps_trunks WHERE outgrp_id = '$id'"); +} + +function outgrps_add($values) { + global $astman, $db; + + // error_log('outgrps_add entered'); + + $grp_values = $values; + + if (isset($grp_values['emer_trunks'])) { + unset($grp_values['emer_trunks']); + } + + if (isset($grp_values['out_trunks'])) { + unset($grp_values['out_trunks']); + } + + $results = $db->autoExecute('outgrps', $grp_values); + + if ($astman) { + foreach ($values as $name => $value) { + switch ($name) { + case 'outgrp_id': + break; + case 'emer_trunks': + break; + case 'out_trunks': + break; + default: + $astman->database_put('OUTGRPS', $values['outgrp_id'].'/'.$name, $value); + break; + } + } + } + + $value_list = array(); + + if (isset($values['emer_trunks'])) { + $trunk_list = $values['emer_trunks']; + + foreach ($trunk_list as $index=>$trunk_entry) { + $value_list[] = array('outgrp_id'=>$values['outgrp_id'], 'trunk_type'=>1, 'trunk_prio'=>$index, 'trunk_name'=>$trunk_entry['trunk_name'], 'trunk_pattern'=>$trunk_entry['trunk_pattern']); + } + } + + if (isset($values['out_trunks'])) { + $trunk_list = $values['out_trunks']; + + foreach ($trunk_list as $index=>$trunk_entry) { + $value_list[] = array('outgrp_id'=>$values['outgrp_id'], 'trunk_type'=>2, 'trunk_prio'=>$index, 'trunk_name'=>$trunk_entry['trunk_name'], 'trunk_pattern'=>$trunk_entry['trunk_pattern']); + } + } + + $stmt = $db->autoPrepare('outgrps_trunks', outgrps_trunk_names()); + if (DB::isError($stmt)) { + die_freepbx($stmt->getMessage()."\n".$stmt->getUserInfo()."\n".$stmt->getDebugInfo()."\n"); + } + + $result = $db->executeMultiple($stmt, $value_list); + if (DB::isError($result)) { + die_freepbx($result->getMessage()."\n".$result->getUserInfo()."\n".$result->getDebugInfo()."\n"); + } +} + +function outgrps_edit($values) { + // error_log('outgrps_edit entered'); + + outgrps_del($values['outgrp_id']); + outgrps_add($values); +} + +function outgrps_extension_get($ext_id){ + // error_log('outgrps_extension_get entered'); + + $results = sql("SELECT outgrp_id FROM devices WHERE id = \"$ext_id\"","getRow",DB_FETCHMODE_ASSOC); + return isset($results) && isset($results['outgrp_id'])?$results['outgrp_id']:null; +} + +function outgrps_extension_set($ext_id, $outgrp_id){ + global $astman; + + // error_log('outgrps_extension_set entered'); + + $new_id = $outgrp_id === null ? 'null' : "\"$outgrp_id\""; + + $query = "UPDATE devices SET outgrp_id = $new_id WHERE id = \"$ext_id\""; + + $results = sql($query); + + if ($astman) { + if ($outgrp_id !== null) { + $astman->database_put("DEVICE", "$ext_id/outgrp", $outgrp_id); + } else { + $astman->database_del("DEVICE", "$ext_id/outgrp"); + } + } + return isset($results); +} + +// ensures post vars is valid +function outgrps_chk($post){ + // error_log('outgrps_chk entered'); + + return true; +} + +function outgrps_output_trunk($prefix, $key, $trunk_name, $trunk_pattern, $count) { + global $trunks, $trunkstate; + + echo "\r\n"; + echo " \r\n"; + if ($count > 0) { + echo " $key  \r\n"; + } else { + echo "   \r\n"; + } + echo " \r\n"; + if ($trunk_name != '') { + echo " \r\n"; + echo " \r\n"; + $opt_idx = 0; + foreach ($trunks as $name=>$display_description) { + echo " \r\n"; + $opt_idx++; + } + } + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo "  "._("Pattern:").''._("Enter an outgoing dial pattern for this trunk.

A % character in the pattern will be replaced with the dialed number without it's initial prefix.")."
\r\n"; + echo " \r\n"; + + if ($count > 0) { + echo " \r\n"; + if ($key > 0) { + echo " \""._("Move\r\n"; + } else { + echo " \r\n"; + } + // move down + + if ($key < ($count - 1)) { + echo " \""._("Move\r\n"; + } else { + echo " \r\n"; + } + } + echo " \r\n"; + echo "\r\n"; +} + +function outgrps_extract_trunks($prefix, &$values) { + $trunkdir = isset($values[$prefix.'_trunkdir'])?$values[$prefix.'_trunkdir']:''; + $trunkkey = isset($values[$prefix.'_trunkkey'])?$values[$prefix.'_trunkkey']:''; + + $trunks = array(); + + for ($idx = 0; ; $idx++) { + if (isset($_POST[$prefix.'_trunks_'.$idx.'_trunk_name'])) { + $name = $_POST[$prefix.'_trunks_'.$idx.'_trunk_name']; + $pattern = $_POST[$prefix.'_trunks_'.$idx.'_trunk_pattern']; + $trunks[] = array('trunk_name'=>$name, 'trunk_pattern'=>$pattern); + } else { + break; + } + } + + // delete blank entries and reorder + foreach (array_keys($trunks) as $key) { + if (empty($trunks[$key]['trunk_name'])) { + // delete this empty + unset($trunks[$key]); + + } else if (($key==($trunkkey - 1)) && ($trunkdir == 'up')) { + // swap this one with the one before (move up) + $temptrunk = $trunks[$key]; + $trunks[ $key ] = $trunks[ $key + 1 ]; + $trunks[ $key + 1 ] = $temptrunk; + + } else if (($key == ($trunkkey)) && ($trunkdir == 'down')) { + // swap this one with the one after (move down) + $temptrunk = $trunks[ $key + 1 ]; + $trunks[ $key + 1 ] = $trunks[ $key ]; + $trunks[ $key ] = $temptrunk; + } + } + unset($temptrunk); + return array_values($trunks); // resequence our numbers +} + Added: trunk/outgrps/install.php =================================================================== --- trunk/outgrps/install.php (rev 0) +++ trunk/outgrps/install.php 2007-08-16 19:24:20 UTC (rev 2) @@ -0,0 +1,44 @@ +query($sql); +if (DB::IsError($check)) { + die( "Can not create `outgrps` table: " . $check->getMessage() . "\n"); +} + +$sql = "CREATE TABLE IF NOT EXISTS outgrps_trunks ( + outgrp_id SMALLINT UNSIGNED NOT NULL, + trunk_type TINYINT UNSIGNED NOT NULL, + trunk_prio TINYINT UNSIGNED NOT NULL, + trunk_name varchar(20) NOT NULL, + trunk_pattern varchar(20) NOT NULL +);"; +$check = $db->query($sql); +if (DB::IsError($check)) { + die( "Can not create `outgrps_trunks` table: " . $check->getMessage() . "\n"); +} + +$sql = "SELECT outgrp_id from devices;"; +$check = $db->query($sql); +if (DB::IsError($check)) { + $sql = "ALTER TABLE devices ADD outgrp_id INTEGER;"; + $check = $db->query($sql); + if (DB::IsError($check)) { + die( "Can not alter `devices` table: " . $check->getMessage() . "\n"); + } +} + + +?> + Added: trunk/outgrps/install.sql =================================================================== --- trunk/outgrps/install.sql (rev 0) +++ trunk/outgrps/install.sql 2007-08-16 19:24:20 UTC (rev 2) @@ -0,0 +1 @@ +# empty file, see http://freepbx.org/trac/ticket/1277 \ No newline at end of file Added: trunk/outgrps/module.xml =================================================================== --- trunk/outgrps/module.xml (rev 0) +++ trunk/outgrps/module.xml 2007-08-16 19:24:20 UTC (rev 2) @@ -0,0 +1,30 @@ + + outgrps + Outbound Groups + 0.0.1.0 + Allows outbound routing based on the extension used for dialing. + +Membership in an Extension Group can be specified using a regular expression +which matches against the extension number. Individual extensions can be +assigned to specific Extension Groups. + +Outbound routing is done through a list of either FreePBX's standard Outbound +Routes or direct to a trunk. Digits can be prepended and appended to the +number before dialing. + +Emergency Call dialing (911 in North America) is also handled. + setup + Third Party Addon + + Outbound Extension Groups + + + asterisk 1.2 + + release/2.3/outgrps-0.0.1.0.tgz + + http://gforge.opensource-sw.net/projects/outgroups/ + + *0.0.1.0* Initial alpha release + + Added: trunk/outgrps/page.outgrps.php =================================================================== --- trunk/outgrps/page.outgrps.php (rev 0) +++ trunk/outgrps/page.outgrps.php 2007-08-16 19:24:20 UTC (rev 2) @@ -0,0 +1,354 @@ + + + + + +
+ +
+

"._("Outbound Group").' '.$itemid.' '._("deleted!")."

\r\n"; +} else { + echo "
\r\n"; + echo " \r\n"; + echo " \r\n"; + echo "

Outbound Group Settings

\r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo "
\r\n"; + echo " "._("Extension Pattern:").''._("This regular expression describes the default group number for each extension. The pattern is matched against the extension number, the first matching substring is the group number for that extension. For example, if an extension number is three digits long starting with a 2 in which the middle digit corresponds to the group, the pattern would be 2\([0-9]\)[0-9]. The group for an extension can be changed from the default in the Extension page.")."\r\n"; + echo "
\r\n"; + echo " "._("Emergency Number:").''._("The number to dial in the case of an emergency. For example, in North America the number would be 911.")."\r\n"; + echo "
\r\n"; + echo " "._("Outbound Prefix:").''._("The number to prefix outgoing calls which are to use Outbound Groups. For example, it is common to use 9 to request an outside line on most PBX systems.")."\r\n"; + echo "
 
\r\n"; + echo "
\r\n"; + + if ($itemid != '') { + //get details for this group + $thisItem = outgrps_get($itemid); + } else { + $thisItem = array(); + } + + $delURL = $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'].'&action=delete'; + $delButton = " +
\r\n + \r\n + \r\n + \r\n + \r\n +
\r\n"; + +?> + +

+ +


When an extension at this group dials 9 for an outbound call, the 9 is replaced by the group's prefix.

In addition, calls to 911 and 9911 are changed to the group's emergency number.")); ?>

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 3) ? 3 : count($trunks))); + +for ($i=0; $i < $num_new_boxes; $i++) { + outgrps_output_trunk('emer', $key, '', '', 0); + $key++; +} //for 0..$num_new_boxes ?> + + + + + + + + + + + + + + + + + + + + + + + + 3) ? 3 : count($trunks))); + +for ($i=0; $i < $num_new_boxes; $i++) { + outgrps_output_trunk('out', $key, '', '', 0); + $key++; +} //for 0..$num_new_boxes ?> + + + +


This number must be the same as the result of matching the device with the Extension Pattern to be used as a default group.")?>
+

+
    
This is used when there is no Emergency Caller ID specified for the device making the call.")?>
  + '._("The Trunk Sequence controls the order of trunks that will be used when an emergency call is made.")?>

+ + +
+
+
+ + +
 
This is used when there is no Caller ID specified for the user making the call.")?>
 :
This is useful for restricting calls to international destinations or 1-900 numbers.

A numerical password, or the path to an Authenticate password file can be used.

Leave this field blank to not prompt for password.")?>
 :
For example, choose a type appropriate for a destination country which may have announcements in the appropriate language.")?>
+ +
  +
For example, you'd want to pick the cheapest routes for long distance (ie, VoIP trunks first) followed by more expensive routes (POTS lines).")?>

+ + +

">
+ + + + +
Added: trunk/outgrps/uninstall.php =================================================================== --- trunk/outgrps/uninstall.php (rev 0) +++ trunk/outgrps/uninstall.php 2007-08-16 19:24:20 UTC (rev 2) @@ -0,0 +1,5 @@ + Added: trunk/outgrps/uninstall.sql =================================================================== --- trunk/outgrps/uninstall.sql (rev 0) +++ trunk/outgrps/uninstall.sql 2007-08-16 19:24:20 UTC (rev 2) @@ -0,0 +1,3 @@ +DROP TABLE IF EXISTS outgroups; + + From robert at gforge.opensource-sw.net Thu Aug 16 13:01:36 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Thu, 16 Aug 2007 13:01:36 -0700 (PDT) Subject: [Outgroups-commits] r3 - trunk/outgrps Message-ID: <20070816200136.250488C510@orangebang.dreamhost.com> Author: robert Date: 2007-08-16 13:01:35 -0700 (Thu, 16 Aug 2007) New Revision: 3 Modified: trunk/outgrps/install.sql Log: Auto Check-in of any outstanding patches Modified: trunk/outgrps/install.sql =================================================================== --- trunk/outgrps/install.sql 2007-08-16 19:24:20 UTC (rev 2) +++ trunk/outgrps/install.sql 2007-08-16 20:01:35 UTC (rev 3) @@ -1 +1 @@ -# empty file, see http://freepbx.org/trac/ticket/1277 \ No newline at end of file +# empty file, see http://freepbx.org/trac/ticket/1277 From robert at gforge.opensource-sw.net Thu Aug 16 13:19:33 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Thu, 16 Aug 2007 13:19:33 -0700 (PDT) Subject: [Outgroups-commits] r4 - in trunk: . release Message-ID: <20070816201933.312528C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-16 13:19:32 -0700 (Thu, 16 Aug 2007) New Revision: 4 Added: trunk/release/ trunk/release/2.3/ Log: Add Release directory structure From robert at gforge.opensource-sw.net Thu Aug 16 13:24:33 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Thu, 16 Aug 2007 13:24:33 -0700 (PDT) Subject: [Outgroups-commits] r5 - trunk/release Message-ID: <20070816202433.F10B28C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-16 13:24:32 -0700 (Thu, 16 Aug 2007) New Revision: 5 Added: trunk/release/2.2/ Log: Add 2.2 release From robert at gforge.opensource-sw.net Thu Aug 16 16:03:58 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Thu, 16 Aug 2007 16:03:58 -0700 (PDT) Subject: [Outgroups-commits] r6 - trunk/release Message-ID: <20070816230358.6CA078C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-16 16:03:57 -0700 (Thu, 16 Aug 2007) New Revision: 6 Removed: trunk/release/2.2/ Log: Remove version 2.2 From robert at gforge.opensource-sw.net Thu Aug 16 16:09:12 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Thu, 16 Aug 2007 16:09:12 -0700 (PDT) Subject: [Outgroups-commits] r8 - trunk/release Message-ID: <20070816230912.74D858C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-16 16:09:12 -0700 (Thu, 16 Aug 2007) New Revision: 8 Removed: trunk/release/2.2/ Log: Remove version 2.2 From robert at gforge.opensource-sw.net Thu Aug 16 16:15:22 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Thu, 16 Aug 2007 16:15:22 -0700 (PDT) Subject: [Outgroups-commits] r9 - trunk/release Message-ID: <20070816231522.EE9BF8C510@orangebang.dreamhost.com> Author: robert Date: 2007-08-16 16:15:22 -0700 (Thu, 16 Aug 2007) New Revision: 9 Added: trunk/release/2.2/ Log: Add 2.2 release From robert at gforge.opensource-sw.net Thu Aug 16 16:06:39 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Thu, 16 Aug 2007 16:06:39 -0700 (PDT) Subject: [Outgroups-commits] r7 - trunk/release Message-ID: <20070816230639.962F88C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-16 16:06:38 -0700 (Thu, 16 Aug 2007) New Revision: 7 Added: trunk/release/2.2/ Log: Add 2.2 release From robert at gforge.opensource-sw.net Thu Aug 23 14:06:53 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Thu, 23 Aug 2007 14:06:53 -0700 (PDT) Subject: [Outgroups-commits] r1 - / Message-ID: <20070823210653.B6FB98C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-23 14:06:53 -0700 (Thu, 23 Aug 2007) New Revision: 1 Added: branches/ tags/ trunk/ Log: Initial Directory Structure From robert at gforge.opensource-sw.net Thu Aug 23 14:08:03 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Thu, 23 Aug 2007 14:08:03 -0700 (PDT) Subject: [Outgroups-commits] r2 - in trunk: . outgrps Message-ID: <20070823210803.0595D8C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-23 14:08:01 -0700 (Thu, 23 Aug 2007) New Revision: 2 Added: trunk/outgrps/ trunk/outgrps/functions.inc.php trunk/outgrps/install.php trunk/outgrps/install.sql trunk/outgrps/module.xml trunk/outgrps/page.outgrps.php trunk/outgrps/uninstall.php trunk/outgrps/uninstall.sql Log: Initial Commit of Alpha code Added: trunk/outgrps/functions.inc.php =================================================================== --- trunk/outgrps/functions.inc.php (rev 0) +++ trunk/outgrps/functions.inc.php 2007-08-23 21:08:01 UTC (rev 2) @@ -0,0 +1,740 @@ +addoptlistitem('outgrpsel', '', 'Default'); + foreach ($outgrps as $key=>$val) { + $currentcomponent->addoptlistitem('outgrpsel', $key, $val.' ('.$key.') ', false); + } + $currentcomponent->setoptlistopts('outgrpsel', 'sort', false); + } + $currentcomponent->addguifunc('outgrps_configpageload'); + $currentcomponent->addprocessfunc('outgrps_configprocess'); + } +} + +//hook gui function +function outgrps_configpageload($compname) { + global $currentcomponent; + + // error_log('outgrps_configpageload entered'); + + if ($compname == 'extensions') { + // Init vars from $_REQUEST[] + $display = isset($_REQUEST['display'])?$_REQUEST['display']:null;; + $action = isset($_REQUEST['action'])?$_REQUEST['action']:null; + $extdisplay = isset($_REQUEST['extdisplay'])?$_REQUEST['extdisplay']:null; + + $current_value = outgrps_extension_get($extdisplay); + + $currentcomponent->addguielem('Extension Options', new gui_selectbox('outgrp', $currentcomponent->getoptlist('outgrpsel'), $current_value, _('Outbound Group'), _('Select a group for this extension. The group specifies which prefix to prepend for outbound calls when 9 is used. It also determines the number dialed for emergencies when this extension dials 911.'), false)); + } +} + + +//hook process function +function outgrps_configprocess($compname) { + global $currentcomponent; + + // error_log('outgrps_configprocess entered'); + + if ($compname == 'extensions') { + // Init vars from $_REQUEST[] + $action = isset($_REQUEST['action'])?$_REQUEST['action']:null; + $extdisplay = isset($_REQUEST['extdisplay'])?$_REQUEST['extdisplay']:null; + $outgrp = isset($_REQUEST['outgrp'])?$_REQUEST['outgrp']:null; + + if ($action == 'edit') { + outgrps_extension_set($extdisplay, $outgrp !== '' ? $outgrp : null); + } + } +} + +/* + +// Generates dialplan for outgrps +// We call this with retrieve_conf + +*/ + +function outgrps_get_config($engine) { + global $ext; // is this the best way to pass this? + global $asterisk_conf; + global $outgrps_globals; + global $db; + + // error_log('outgrps_get_config entered'); + + $trunk_tech = array(); + + //Retrieve each trunk tech for later lookup + $result = sql('select * from globals WHERE variable LIKE \'OUT\\_%\'', 'getAll'); + if (DB::IsError($result)) { + die_freepbx($result->getMessage()); + } + + foreach ($result as $tr) { + $trunk_tech[$tr[0]] = strtok($tr[1], '/'); + } + + $outgrps_globals = outgrps_globals_get(); + + $emer_num = $outgrps_globals['emer_num']; + $out_prefix = $outgrps_globals['out_prefix']; + $prefix_len = strlen($out_prefix); + + switch($engine) { + case "asterisk": + $ext->addInclude('outbound-allroutes', 'outgrps-routes'); + if ($emer_num) { + $ext->add('outgrps-routes', $emer_num, '', new ext_goto(1, 'emer')); + if ($out_prefix) { + $ext->add('outgrps-routes', $out_prefix.$emer_num, '', new ext_goto(1, 'emer')); + } + + $ext->add('outgrps-routes', 'emer', '', new ext_set('EMERGENCYROUTE','yes')); + $ext->add('outgrps-routes', 'emer', '', new ext_set('OUTNUM',$emer_num)); + $ext->add('outgrps-routes', 'emer', '', new ext_macro('outgrps-lookup')); + $ext->add('outgrps-routes', 'emer', '', new ext_goto(1, 'emer-grp-${OUTGRPS_ID}')); + } + + if ($out_prefix) { + $ext->add('outgrps-routes', '_'.$out_prefix.'.', '', new ext_set('OUTNUM','${EXTEN:'.$prefix_len.'}')); + $ext->add('outgrps-routes', '_'.$out_prefix.'.', '', new ext_macro('outgrps-lookup')); + $ext->add('outgrps-routes', '_'.$out_prefix.'.', '', new ext_goto(1, 'outb-grp-${OUTGRPS_ID}')); + } + + $group_list = sql('SELECT * FROM outgrps ORDER BY outgrp_id', 'getAll', DB_FETCHMODE_ASSOC); + if (DB::IsError($group_list)) { + die_freepbx($group_list->getMessage()); + } + + $trunks_query = $db->prepare('SELECT * FROM outgrps_trunks WHERE outgrp_id = ? AND trunk_type = ? ORDER BY trunk_prio'); + if (DB::IsError($trunks_query)) { + die_freepbx($trunks_query->getMessage()); + } + + foreach ($group_list as $group) { + $group_id = $group['outgrp_id']; + $emer_trunks = $db->execute($trunks_query, array($group_id, 1)); + if (DB::IsError($emer_trunks)) { + die_freepbx($emer_trunks->getMessage()); + } + $emer_cid = $group['emer_cid']; + if ($emer_num) { + if ($emer_trunks->numRows() > 0) { + if ("$emer_cid" != '') { + $ext->add('outgrps-routes', 'emer-grp-'.$group_id, '', new ext_set('OUTGRPS_ECID','"${QUOTE('.$group['emer_cid'].')}"')); + } + + while ($trunk =& $emer_trunks->fetchRow(DB_FETCHMODE_ASSOC)) { + $trunk_name = $trunk['trunk_name']; + $trunk_number = substr($trunk_name,4); // cut off OUT_ from $trunk + $trunk_pattern = $trunk['trunk_pattern']; + if ($trunk_pattern != '') { + $wild_position = strpos($trunk_pattern, '%'); + if ($wild_position !== false) { + $trunk_dial = substr($trunk_pattern, 0, $wild_position).'${OUTNUM}'.substr($trunk_pattern, $wild_position + 1); + } else { + $trunk_dial = $trunk_pattern; + } + } else { + $trunk_dial = '${OUTNUM}'; + } + $ext->add('outgrps-routes', 'emer-grp-'.$group_id, '', new ext_macro('outgrps-dialout-trunk',$trunk_number.','.$trunk_dial)); + } + $ext->add('outgrps-routes', 'emer-grp-'.$group_id, '', new ext_macro('outisbusy')); + } else { + $ext->add('outgrps-routes', 'emer-grp-'.$group_id, '', new ext_playback('no-911-1')); + $ext->add('outgrps-routes', 'emer-grp-'.$group_id, '', new ext_goto(1, 'invalid')); + } + } + if ($out_prefix) { + $out_trunks = $db->execute($trunks_query, array($group_id, 2)); + if ($out_trunks->numRows() > 0) { + if ($group['out_cid']) { + $ext->add('outgrps-routes', 'outb-grp-'.$group_id, '', new ext_set('OUTGRPS_CID','${QUOTE('.$group['out_cid'].')}')); + } + + if ($group['mohclass'] && $group['mohclass'] != 'default') { + $ext->add('outgrps-routes', 'outb-grp-'.$group_id, '', new ext_set("MOHCLASS", '${IF($["x${MOHCLASS}"="x"]?'.$group['mohclass'].':${MOHCLASS})}' )); + } + $first_trunk = true; + while ($trunk = &$out_trunks->fetchRow(DB_FETCHMODE_ASSOC)) { + $trunk_name = $trunk['trunk_name']; + $trunk_number = substr($trunk_name,4); // cut off OUT_ from $trunk + $trunk_pattern = $trunk['trunk_pattern']; + $trunk_password = $trunk['trunk_password']; + if ($first_trunk && $trunk_password != '') { + $pass = ','.$trunk_password; + $first_trunk = false; + } else { + $pass = ''; + } + + if ($trunk_pattern != '') { + $wild_position = strpos($trunk_pattern, '%'); + if ($wild_position !== false) { + $trunk_dial = substr($trunk_pattern, 0, $wild_position).'${OUTNUM}'.substr($trunk_pattern, $wild_position + 1); + } else { + $trunk_dial = $trunk_pattern; + } + } else { + $trunk_dial = '${OUTNUM}'; + } + + $ext->add('outgrps-routes', 'outb-grp-'.$group_id, '', new ext_macro('outgrps-dialout-trunk',$trunk_number.','.$trunk_dial.$pass)); + } + $ext->add('outgrps-routes', 'outb-grp-'.$group_id, '', new ext_macro('outisbusy')); + } else { + $ext->add('outgrps-routes', 'outb-grp-'.$group_id, '', new ext_playback('Playback(silence/1&invalid')); + $ext->add('outgrps-routes', 'outb-grp-'.$group_id, '', new ext_goto(1, 'invalid')); + } + } + } + + if ($emer_num) { + $ext->add('outgrps-routes', 'emer-grp-', '', new ext_playback('no-911-1')); + $ext->add('outgrps-routes', 'emer-grp-', '', new ext_goto(1, 'invalid')); + } + + if ($out_prefix) { + $ext->add('outgrps-routes', 'outb-grp-', '', new ext_playback('Playback(silence/1&invalid')); + $ext->add('outgrps-routes', 'outb-grp-', '', new ext_goto(1, 'invalid')); + } + + $ext->add('outgrps-routes', 'invalid', '', new ext_playtones('congestion')); + $ext->add('outgrps-routes', 'invalid', '', new ext_congestion()); + $ext->add('outgrps-routes', 'invalid', '', new ext_macro(hangupcall)); + + $ext->add('macro-outgrps-lookup', 's', '', new ext_dbget('OUTGRPS_ID', 'DEVICE/${CALLERID(number)}/outgrp')); + $ext->add('macro-outgrps-lookup', 's', '', new ext_gotoif('$["${OUTGRPS_ID}" != ""]', 'end')); + $ext->add('macro-outgrps-lookup', 's', '', new ext_set('OUTGRPS_ID', '$["${CALLERID(number)}" : "${OUTGRPS_GRPPATTERN}"]')); + $ext->add('macro-outgrps-lookup', 's', 'end', new ext_noop('Exiting macro-outgrps-lookup')); + + outgrps_dialout_trunk_macro(); + outgrps_dialout_other_macro(); + outgrps_dialout_custom_macro(); + outgrps_dialout_enum_macro(); + outgrps_callerid_macro(); + outgrps_callerid_get_macro(); + outgrps_callerid_set_macro(); + break; + } +} + +function outgrps_dialout_trunk_macro() +{ + global $ext; + + // dialout using a trunk, using pattern matching (don't strip any prefix) + // arg1 = trunk number, arg2 = number, arg3 = route password + // + // MODIFIED (PL) + // + // Modified both Dial() commands to include the new TRUNK_OPTIONS from the general + // screen of AMP + // + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_set('DIAL_TRUNK', '${ARG1}')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_set('DIAL_NUMBER', '${ARG2}')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_set('ROUTE_PASSWD', '${ARG3}')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_gotoif('$["${ROUTE_PASSWD}" = ""]', 'noauth')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_authenticate('${ROUTE_PASSWD}')); + $ext->add('macro-outgrps-dialout-trunk', 's', 'noauth', new ext_gotoif('$["x${OUTDISABLE_${DIAL_TRUNK}}" = "xon"]', 'disabletrunk,1')); + + // If NODEST is set, clear it. No point in remembering since dialout-trunk will just end in the + // bit bucket. But if answered by an outside line with transfer capability, we want NODEST to be + // clear so a subsequent transfer to an internal extension works and goes to voicemail or other + // destinations. + // + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_set('_NODEST', '')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_set('DIAL_TRUNK_OPTIONS', '${DIAL_OPTIONS}')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_set('GROUP()', 'OUT_${DIAL_TRUNK}')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_macro('user-callerid', 'SKIPTTL')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_macro('record-enable', '${CALLERID(number)},OUT')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_gotoif('$["${INTRACOMPANYROUTE}" = "YES"]', 'skipoutcid')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_set('DIAL_TRUNK_OPTIONS', '${TRUNK_OPTIONS}')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_macro('outgrps-callerid', '${DIAL_TRUNK}')); + $ext->add('macro-outgrps-dialout-trunk', 's', 'skipoutcid', new ext_gotoif('$["${OUTMAXCHANS_${DIAL_TRUNK}}foo" = "foo"]', 'nomax')); + $ext->add('macro-outgrps-dialout-trunk', 's', 'checkmax', new ext_gotoif('$[ ${GROUP_COUNT()} > ${OUTMAXCHANS_${DIAL_TRUNK}} ]', 'chanfull')); + $ext->add('macro-outgrps-dialout-trunk', 's', 'nomax', new ext_agi('fixlocalprefix')); + + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_gotoif('$[$["${MOHCLASS}" = "default"] | $["foo${MOHCLASS}" = "foo"]]', 'nomusic')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_set('DIAL_TRUNK_OPTIONS', 'M(setmusic^${MOHCLASS})${DIAL_TRUNK_OPTIONS}')); + + $ext->add('macro-outgrps-dialout-trunk', 's', 'nomusic', new ext_set('OUTNUM', '${OUTPREFIX_${DIAL_TRUNK}}${DIAL_NUMBER}')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_gotoif('$["${OUT_${DIAL_TRUNK}:0,5}" = "ENUM/"]', 'enum')); + + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_set('custom', '${CUT(OUT_${DIAL_TRUNK},:,1)}')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_gotoif('$["${custom}" = "AMP"]', 'custom')); + + $ext->add('macro-outgrps-dialout-trunk', 's', 'other', new ext_macro('outgrps-dialout-other')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_goto(1, 's-${DIALSTATUS}')); + + $ext->add('macro-outgrps-dialout-trunk', 's', 'custom', new ext_macro('outgrps-dialout-custom')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_goto(1, 's-${DIALSTATUS}')); + + $ext->add('macro-outgrps-dialout-trunk', 's', 'enum', new ext_macro('outgrps-dialout-enum')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_goto(1, 's-${DIALSTATUS}')); + + $ext->add('macro-outgrps-dialout-trunk', 's', 'chanfull', new ext_noop('max channels used up')); + $ext->add('macro-outgrps-dialout-trunk', 's', 'end', new ext_noop('Exiting macro-outgrps-dialout-trunk')); + + $ext->add('macro-outgrps-dialout-trunk', 's-BUSY', '', new ext_noop('TRUNK: Dial failed due to trunk reporting BUSY - giving up')); + $ext->add('macro-outgrps-dialout-trunk', 's-BUSY', '', new ext_busy(20)); + + $ext->add('macro-outgrps-dialout-trunk', '_s-.', '', new ext_gotoif('$[ $[ "${DIALSTATUS}" = "NOANSWER" ] | $[ "${DIALSTATUS}" = "CANCEL" ] ]', 'noreport')); + $ext->add('macro-outgrps-dialout-trunk', '_s-.', '', new ext_gotoif('$["x${OUTFAIL_${DIAL_TRUNK}}" = "x"]', 'noreport')); + $ext->add('macro-outgrps-dialout-trunk', '_s-.', '', new ext_agi('${OUTFAIL_${DIAL_TRUNK}}')); + $ext->add('macro-outgrps-dialout-trunk', '_s-.', 'noreport', new ext_noop('TRUNK: Dial failed due to ${DIALSTATUS} - failing through to next trunk')); + + $ext->add('macro-outgrps-dialout-trunk', 'disabletrunk', '', new ext_noop('TRUNK: ${OUT_${DIAL_TRUNK}} DISABLED - falling through to next trunk')); + + $ext->add('macro-outgrps-dialout-trunk', 'h', '', new ext_macro('hangupcall')); +} + +function outgrps_dialout_other_macro() { + global $ext; + + // Inherits DIAL_TRUNK, DIAL_NUMBER and DIAL_TRUNK_OPTIONS from caller. + + $ext->add('macro-outgrps-dialout-other', 's', '', new ext_dial('${OUT_${DIAL_TRUNK}}/${OUTNUM}','300,${DIAL_TRUNK_OPTIONS}')); + $ext->add('macro-outgrps-dialout-other', 's', 'end', new ext_noop('Exiting macro-outgrps-dialout-other')); +} + +function outgrps_dialout_custom_macro() { + global $ext; + + // Inherits DIAL_TRUNK, DIAL_NUMBER and DIAL_TRUNK_OPTIONS from caller. + + $ext->add('macro-outgrps-dialout-custom', 's', '', new ext_set('pre_num', '${CUT(OUT_${DIAL_TRUNK},$,1)}')); + $ext->add('macro-outgrps-dialout-custom', 's', '', new ext_set('the_num', '${CUT(OUT_${DIAL_TRUNK},$,2)}')); + $ext->add('macro-outgrps-dialout-custom', 's', '', new ext_set('post_num', '${CUT(OUT_${DIAL_TRUNK},$,3)}')); + $ext->add('macro-outgrps-dialout-custom', 's', '', new ext_gotoif('$["${the_num}" != "OUTNUM"]', 'skipoutnum')); + $ext->add('macro-outgrps-dialout-custom', 's', '', new ext_set('the_num', '${OUTNUM}')); + $ext->add('macro-outgrps-dialout-custom', 's', 'skipoutnum', new ext_dial('${pre_num:4}${the_num}${post_num}','300,${DIAL_TRUNK_OPTIONS}')); + $ext->add('macro-outgrps-dialout-custom', 's', 'end', new ext_noop('Exiting macro-outgrps-dialout-custom')); +} + +function outgrps_dialout_enum_macro() +{ + global $ext; + + // Inherits DIAL_TRUNK, DIAL_NUMBER and DIAL_TRUNK_OPTIONS from caller. + + // Replacement for asterisk's ENUMLOOKUP function + $ext->add('macro-outgrps-dialout-enum', 's', '', new ext_agi('enumlookup.agi')); + + // Now we have the variable DIALARR set to a list of URI's that can be called, in order of priority + // Loop through them trying them in order. + + $ext->add('macro-outgrps-dialout-enum', 's', 'dialloop', new ext_gotoif('$["foo${DIALARR}"="foo"]','end')); + $ext->add('macro-outgrps-dialout-enum', 's', '', new ext_set('TRYDIAL','${CUT(DIALARR,%,1)}')); + $ext->add('macro-outgrps-dialout-enum', 's', '', new ext_set('DIALARR','${CUT(DIALARR,%,2-)}')); + $ext->add('macro-outgrps-dialout-enum', 's', '', new ext_dial('${TRYDIAL}','300,${DIAL_TRUNK_OPTIONS}')); + $ext->add('macro-outgrps-dialout-enum', 's', '', new ext_noop('Dial exited in macro-outgrps-dialout-enum with ${DIALSTATUS}')); + + // Now, if we're still here, that means the Dial failed for some reason. + // If it's CONGESTION or CHANUNAVAIL we want to try again on a different + // different channel. If there's no more left, the dialloop tag will exit. + + $ext->add('macro-outgrps-dialout-enum', 's', '', new ext_gotoif('$[ $[ "${DIALSTATUS}" = "CHANUNAVAIL" ] | $[ "${DIALSTATUS}" = "CONGESTION" ] ]', 'dialloop')); + $ext->add('macro-outgrps-dialout-enum', 's', 'end', new ext_noop('Exiting macro-outgrps-dialout-enum')); +} + +function outgrps_callerid_macro() +{ + global $ext; + + // overrides callerid out trunks + // arg1 is trunk + // macro-user-callerid should be called _before_ using this macro + $ext->add('macro-outgrps-callerid', 's', '', new ext_set('CALLERID_TRUNK','${ARG1}')); + $ext->add('macro-outgrps-callerid', 's', '', new ext_macro('outgrps-callerid-get')); + + $ext->add('macro-outgrps-callerid', 's', '', new ext_set('EMERGENCY_CID','$["${QUOTE(${EMERGENCY_CID})}" | "${QUOTE(${OUTGRPS_ECID})}"]')); + $ext->add('macro-outgrps-callerid', 's', '', new ext_set('TRUNKOUTCID','$["${QUOTE(${OUTGRPS_CID})}" | "${QUOTE(${TRUNKOUTCID})}"]')); + + $ext->add('macro-outgrps-callerid', 's', '', new ext_macro('outgrps-callerid-set')); +} + +function outgrps_callerid_get_macro() { + global $ext; + + // Keep the original CallerID number, for failover to the next trunk. + $ext->add('macro-outgrps-callerid-get', 's', '', new ext_gotoif('$["${REALCALLERIDNUM:1:2}" != ""]', 'start')); + $ext->add('macro-outgrps-callerid-get', 's', '', new ext_set('REALCALLERIDNUM', '${CALLERID(number)}')); + $ext->add('macro-outgrps-callerid-get', 's', 'start', new ext_noop('REALCALLERIDNUM is ${REALCALLERIDNUM}')); + + // If this came through a ringgroup or CF, then we want to retain original CID unless + // OUTKEEPCID_${trunknum} is set. + // + $ext->add('macro-outgrps-callerid-get', 's', '', new ext_gotoif('$["${KEEPCID}" != "TRUE"]', 'normcid')); + $ext->add('macro-outgrps-callerid-get', 's', '', new ext_gotoif('$["x${OUTKEEPCID_${CALLERID_TRUNK}}" = "xon"]', 'normcid')); + $ext->add('macro-outgrps-callerid-get', 's', '', new ext_gotoif('$["foo${REALCALLERIDNUM}" = "foo"]', 'normcid')); + $ext->add('macro-outgrps-callerid-get', 's', '', new ext_set('USEROUTCID', '${REALCALLERIDNUM}')); + + $ext->add('macro-outgrps-callerid-get', 's', '', new ext_gotoif('$["foo${DB(AMPUSER/${REALCALLERIDNUM}/device)}" = "foo"]', 'bypass')); + $ext->add('macro-outgrps-callerid-get', 's', 'normcid', new ext_set('USEROUTCID','${DB(AMPUSER/${REALCALLERIDNUM}/outboundcid)}')); + $ext->add('macro-outgrps-callerid-get', 's', 'bypass', new ext_set('EMERGENCYCID','${DB(DEVICE/${REALCALLERIDNUM}/emergency_cid)}')); + $ext->add('macro-outgrps-callerid-get', 's', '', new ext_set('TRUNKOUTCID','${OUTCID_${CALLERID_TRUNK}}')); +} + +function outgrps_callerid_set_macro() { + global $ext; + + // We now have to make sure the CID is valid. If we find an AMPUSER with the same CID, we assume it is an internal + // call (would be quite a conincidence if not) and go through the normal processing to get that CID. If a device + // is set for this CID, then it must be internal + // + $ext->add('macro-outgrps-callerid-set', 's', '', new ext_gotoif('$["${EMERGENCYROUTE:1:2}" = ""]', 'usercid')); + $ext->add('macro-outgrps-callerid-set', 's', '', new ext_gotoif('$["${EMERGENCYCID:1:2}" = ""]', 'usercid')); + $ext->add('macro-outgrps-callerid-set', 's', '', new ext_set('CALLERID(all)','${EMERGENCYCID}')); + $ext->add('macro-outgrps-callerid-set', 's', '', new ext_goto('end')); + $ext->add('macro-outgrps-callerid-set', 's', 'usercid', new ext_gotoif('$["${USEROUTCID:1:2}" = ""]', 'trunkcid')); + $ext->add('macro-outgrps-callerid-set', 's', '', new ext_set('CALLERID(all)','${USEROUTCID}')); + $ext->add('macro-outgrps-callerid-set', 's', '', new ext_goto('hidden')); + $ext->add('macro-outgrps-callerid-set', 's', 'trunkcid', new ext_gotoif('$["${TRUNKOUTCID:1:2}" = ""]', 'hidden')); + $ext->add('macro-outgrps-callerid-set', 's', '', new ext_set('CALLERID(all)','${TRUNKOUTCID}')); +// $ext->add('macro-outgrps-callerid-set', 's', '', new ext_goto('hidden')); + $ext->add('macro-outgrps-callerid-set', 's', 'hidden', new ext_gotoif('$["x${CALLERID(name)}"!="xhidden"]', 'end')); + $ext->add('macro-outgrps-callerid-set', 's', '', new ext_setcallerpres('prohib_passed_screen')); + $ext->add('macro-outgrps-callerid-set', 's', 'end', new ext_noop('CallerID set to ${CALLERID(all)}')); + $ext->add('macro-outgrps-callerid-set', 's', '', new ext_noop('Exiting macro-outgrps-callerid-set')); +} + +function outgrps_globals_get() { + global $db; + + // error_log('outgrps_globals_get entered'); + + $globals = array(); + + $result = $db->getAssoc('SELECT variable, value FROM globals WHERE variable LIKE \'OUTGRPS\\__%\''); + if (DB::isError($result)) { + die_freepbx($result->getMessage()); + } + + foreach ($result as $name=>$value) { + $globals[strtolower(substr($name, 8))] = $value; + } + + return $globals; +} + +function outgrps_globals_set($global_list) { + global $db; + + // error_log('outgrps_globals_set entered'); + + $newlist = array(); + + $result = sql('DELETE IGNORE FROM globals WHERE variable LIKE \'OUTGRPS\\__%\''); + if (DB::isError($result)) { + die_freepbx($result->getMessage()); + } + + foreach ($global_list as $name=>$value) { + $newlist[] = array( 'OUTGRPS_'.strtoupper($name), $value ); + } + + $stmt = $db->autoPrepare('globals', array( 'variable', 'value' )); + if (DB::isError($stmt)) { + die_freepbx($stmt->getMessage()); + } + + $result = $db->executeMultiple($stmt, $newlist); + if (DB::isError($result)) { + die_freepbx($result->getMessage()); + } + + return $result != null; +} + +function outgrps_list() { + global $db; + + // error_log('outgrps_list entered'); + + $result = $db->getAssoc('SELECT outgrp_id, description FROM outgrps'); + return $result; +} + +function outgrps_get($id) { + // error_log('outgrps_get entered'); + + $group = sql("SELECT * FROM outgrps WHERE outgrp_id = '$id'",'getRow',DB_FETCHMODE_ASSOC); + if (DB::isError($group)) { + die_freepbx($group->getMessage()); + } + + if ($group) { + $result = sql("SELECT trunk_name, trunk_pattern FROM outgrps_trunks WHERE outgrp_id = $id AND trunk_type = 1"); + if (DB::isError($result)) { + die_freepbx($result->getMessage()); + } + + $trunks = array(); + while ($row = &$result->fetchRow(DB_FETCHMODE_ASSOC)) { + $trunks[] = $row; + } + $group['emer_trunks'] = $trunks; + + $result = sql("SELECT trunk_name, trunk_pattern FROM outgrps_trunks WHERE outgrp_id = '$id' AND trunk_type = 2"); + if (DB::isError($result)) { + die_freepbx($result->getMessage()); + } + + $trunks = array(); + while ($row = &$result->fetchRow(DB_FETCHMODE_ASSOC)) { + $trunks[] = $row; + } + $group['out_trunks'] = $trunks; + } + + return isset($group) ? $group : null; +} + +function outgrps_del($id) { + global $astman; + + // error_log('outgrps_del entered'); + + // Deleting outgrps and its associations + $results = sql("DELETE FROM outgrps WHERE outgrp_id = '$id'"); + + if ($astman) { + $astman->database_deltree('OUTGRPS', $id); + } + + $results = sql("DELETE FROM outgrps_trunks WHERE outgrp_id = '$id'"); +} + +function outgrps_add($values) { + global $astman, $db; + + // error_log('outgrps_add entered'); + + $grp_values = $values; + + if (isset($grp_values['emer_trunks'])) { + unset($grp_values['emer_trunks']); + } + + if (isset($grp_values['out_trunks'])) { + unset($grp_values['out_trunks']); + } + + $results = $db->autoExecute('outgrps', $grp_values); + + if ($astman) { + foreach ($values as $name => $value) { + switch ($name) { + case 'outgrp_id': + break; + case 'emer_trunks': + break; + case 'out_trunks': + break; + default: + $astman->database_put('OUTGRPS', $values['outgrp_id'].'/'.$name, $value); + break; + } + } + } + + $value_list = array(); + + if (isset($values['emer_trunks'])) { + $trunk_list = $values['emer_trunks']; + + foreach ($trunk_list as $index=>$trunk_entry) { + $value_list[] = array('outgrp_id'=>$values['outgrp_id'], 'trunk_type'=>1, 'trunk_prio'=>$index, 'trunk_name'=>$trunk_entry['trunk_name'], 'trunk_pattern'=>$trunk_entry['trunk_pattern']); + } + } + + if (isset($values['out_trunks'])) { + $trunk_list = $values['out_trunks']; + + foreach ($trunk_list as $index=>$trunk_entry) { + $value_list[] = array('outgrp_id'=>$values['outgrp_id'], 'trunk_type'=>2, 'trunk_prio'=>$index, 'trunk_name'=>$trunk_entry['trunk_name'], 'trunk_pattern'=>$trunk_entry['trunk_pattern']); + } + } + + $stmt = $db->autoPrepare('outgrps_trunks', outgrps_trunk_names()); + if (DB::isError($stmt)) { + die_freepbx($stmt->getMessage()."\n".$stmt->getUserInfo()."\n".$stmt->getDebugInfo()."\n"); + } + + $result = $db->executeMultiple($stmt, $value_list); + if (DB::isError($result)) { + die_freepbx($result->getMessage()."\n".$result->getUserInfo()."\n".$result->getDebugInfo()."\n"); + } +} + +function outgrps_edit($values) { + // error_log('outgrps_edit entered'); + + outgrps_del($values['outgrp_id']); + outgrps_add($values); +} + +function outgrps_extension_get($ext_id){ + // error_log('outgrps_extension_get entered'); + + $results = sql("SELECT outgrp_id FROM devices WHERE id = \"$ext_id\"","getRow",DB_FETCHMODE_ASSOC); + return isset($results) && isset($results['outgrp_id'])?$results['outgrp_id']:null; +} + +function outgrps_extension_set($ext_id, $outgrp_id){ + global $astman; + + // error_log('outgrps_extension_set entered'); + + $new_id = $outgrp_id === null ? 'null' : "\"$outgrp_id\""; + + $query = "UPDATE devices SET outgrp_id = $new_id WHERE id = \"$ext_id\""; + + $results = sql($query); + + if ($astman) { + if ($outgrp_id !== null) { + $astman->database_put("DEVICE", "$ext_id/outgrp", $outgrp_id); + } else { + $astman->database_del("DEVICE", "$ext_id/outgrp"); + } + } + return isset($results); +} + +// ensures post vars is valid +function outgrps_chk($post){ + // error_log('outgrps_chk entered'); + + return true; +} + +function outgrps_output_trunk($prefix, $key, $trunk_name, $trunk_pattern, $count) { + global $trunks, $trunkstate; + + echo "\r\n"; + echo " \r\n"; + if ($count > 0) { + echo " $key  \r\n"; + } else { + echo "   \r\n"; + } + echo " \r\n"; + if ($trunk_name != '') { + echo " \r\n"; + echo " \r\n"; + $opt_idx = 0; + foreach ($trunks as $name=>$display_description) { + echo " \r\n"; + $opt_idx++; + } + } + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo "  "._("Pattern:").''._("Enter an outgoing dial pattern for this trunk.

A % character in the pattern will be replaced with the dialed number without it's initial prefix.")."
\r\n"; + echo " \r\n"; + + if ($count > 0) { + echo " \r\n"; + if ($key > 0) { + echo " \""._("Move\r\n"; + } else { + echo " \r\n"; + } + // move down + + if ($key < ($count - 1)) { + echo " \""._("Move\r\n"; + } else { + echo " \r\n"; + } + } + echo " \r\n"; + echo "\r\n"; +} + +function outgrps_extract_trunks($prefix, &$values) { + $trunkdir = isset($values[$prefix.'_trunkdir'])?$values[$prefix.'_trunkdir']:''; + $trunkkey = isset($values[$prefix.'_trunkkey'])?$values[$prefix.'_trunkkey']:''; + + $trunks = array(); + + for ($idx = 0; ; $idx++) { + if (isset($_POST[$prefix.'_trunks_'.$idx.'_trunk_name'])) { + $name = $_POST[$prefix.'_trunks_'.$idx.'_trunk_name']; + $pattern = $_POST[$prefix.'_trunks_'.$idx.'_trunk_pattern']; + $trunks[] = array('trunk_name'=>$name, 'trunk_pattern'=>$pattern); + } else { + break; + } + } + + // delete blank entries and reorder + foreach (array_keys($trunks) as $key) { + if (empty($trunks[$key]['trunk_name'])) { + // delete this empty + unset($trunks[$key]); + + } else if (($key==($trunkkey - 1)) && ($trunkdir == 'up')) { + // swap this one with the one before (move up) + $temptrunk = $trunks[$key]; + $trunks[ $key ] = $trunks[ $key + 1 ]; + $trunks[ $key + 1 ] = $temptrunk; + + } else if (($key == ($trunkkey)) && ($trunkdir == 'down')) { + // swap this one with the one after (move down) + $temptrunk = $trunks[ $key + 1 ]; + $trunks[ $key + 1 ] = $trunks[ $key ]; + $trunks[ $key ] = $temptrunk; + } + } + unset($temptrunk); + return array_values($trunks); // resequence our numbers +} + Added: trunk/outgrps/install.php =================================================================== --- trunk/outgrps/install.php (rev 0) +++ trunk/outgrps/install.php 2007-08-23 21:08:01 UTC (rev 2) @@ -0,0 +1,44 @@ +query($sql); +if (DB::IsError($check)) { + die( "Can not create `outgrps` table: " . $check->getMessage() . "\n"); +} + +$sql = "CREATE TABLE IF NOT EXISTS outgrps_trunks ( + outgrp_id SMALLINT UNSIGNED NOT NULL, + trunk_type TINYINT UNSIGNED NOT NULL, + trunk_prio TINYINT UNSIGNED NOT NULL, + trunk_name varchar(20) NOT NULL, + trunk_pattern varchar(20) NOT NULL +);"; +$check = $db->query($sql); +if (DB::IsError($check)) { + die( "Can not create `outgrps_trunks` table: " . $check->getMessage() . "\n"); +} + +$sql = "SELECT outgrp_id from devices;"; +$check = $db->query($sql); +if (DB::IsError($check)) { + $sql = "ALTER TABLE devices ADD outgrp_id INTEGER;"; + $check = $db->query($sql); + if (DB::IsError($check)) { + die( "Can not alter `devices` table: " . $check->getMessage() . "\n"); + } +} + + +?> + Added: trunk/outgrps/install.sql =================================================================== --- trunk/outgrps/install.sql (rev 0) +++ trunk/outgrps/install.sql 2007-08-23 21:08:01 UTC (rev 2) @@ -0,0 +1 @@ +# empty file, see http://freepbx.org/trac/ticket/1277 \ No newline at end of file Added: trunk/outgrps/module.xml =================================================================== --- trunk/outgrps/module.xml (rev 0) +++ trunk/outgrps/module.xml 2007-08-23 21:08:01 UTC (rev 2) @@ -0,0 +1,30 @@ + + outgrps + Outbound Groups + 0.0.1.0 + Allows outbound routing based on the extension used for dialing. + +Membership in an Extension Group can be specified using a regular expression +which matches against the extension number. Individual extensions can be +assigned to specific Extension Groups. + +Outbound routing is done through a list of either FreePBX's standard Outbound +Routes or direct to a trunk. Digits can be prepended and appended to the +number before dialing. + +Emergency Call dialing (911 in North America) is also handled. + setup + Third Party Addon + + Outbound Extension Groups + + + asterisk 1.2 + + release/2.3/outgrps-0.0.1.0.tgz + + http://gforge.opensource-sw.net/projects/outgroups/ + + *0.0.1.0* Initial alpha release + + Added: trunk/outgrps/page.outgrps.php =================================================================== --- trunk/outgrps/page.outgrps.php (rev 0) +++ trunk/outgrps/page.outgrps.php 2007-08-23 21:08:01 UTC (rev 2) @@ -0,0 +1,354 @@ + + +
+ + +
+ +
+

"._("Outbound Group").' '.$itemid.' '._("deleted!")."

\r\n"; +} else { + echo "
\r\n"; + echo " \r\n"; + echo " \r\n"; + echo "

Outbound Group Settings

\r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo " \r\n"; + echo "
\r\n"; + echo " "._("Extension Pattern:").''._("This regular expression describes the default group number for each extension. The pattern is matched against the extension number, the first matching substring is the group number for that extension. For example, if an extension number is three digits long starting with a 2 in which the middle digit corresponds to the group, the pattern would be 2\([0-9]\)[0-9]. The group for an extension can be changed from the default in the Extension page.")."\r\n"; + echo "
\r\n"; + echo " "._("Emergency Number:").''._("The number to dial in the case of an emergency. For example, in North America the number would be 911.")."\r\n"; + echo "
\r\n"; + echo " "._("Outbound Prefix:").''._("The number to prefix outgoing calls which are to use Outbound Groups. For example, it is common to use 9 to request an outside line on most PBX systems.")."\r\n"; + echo "
 
\r\n"; + echo "
\r\n"; + + if ($itemid != '') { + //get details for this group + $thisItem = outgrps_get($itemid); + } else { + $thisItem = array(); + } + + $delURL = $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'].'&action=delete'; + $delButton = " +
\r\n + \r\n + \r\n + \r\n + \r\n +
\r\n"; + +?> + +

+ +


When an extension at this group dials 9 for an outbound call, the 9 is replaced by the group's prefix.

In addition, calls to 911 and 9911 are changed to the group's emergency number.")); ?>

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 3) ? 3 : count($trunks))); + +for ($i=0; $i < $num_new_boxes; $i++) { + outgrps_output_trunk('emer', $key, '', '', 0); + $key++; +} //for 0..$num_new_boxes ?> + + + + + + + + + + + + + + + + + + + + + + + + 3) ? 3 : count($trunks))); + +for ($i=0; $i < $num_new_boxes; $i++) { + outgrps_output_trunk('out', $key, '', '', 0); + $key++; +} //for 0..$num_new_boxes ?> + + + +


This number must be the same as the result of matching the device with the Extension Pattern to be used as a default group.")?>
+

+
    
This is used when there is no Emergency Caller ID specified for the device making the call.")?>
  + '._("The Trunk Sequence controls the order of trunks that will be used when an emergency call is made.")?>

+ + +
+
+
+ + +
 
This is used when there is no Caller ID specified for the user making the call.")?>
 :
This is useful for restricting calls to international destinations or 1-900 numbers.

A numerical password, or the path to an Authenticate password file can be used.

Leave this field blank to not prompt for password.")?>
 :
For example, choose a type appropriate for a destination country which may have announcements in the appropriate language.")?>
+ +
  +
For example, you'd want to pick the cheapest routes for long distance (ie, VoIP trunks first) followed by more expensive routes (POTS lines).")?>

+ + +

">
+ + + + +
Added: trunk/outgrps/uninstall.php =================================================================== --- trunk/outgrps/uninstall.php (rev 0) +++ trunk/outgrps/uninstall.php 2007-08-23 21:08:01 UTC (rev 2) @@ -0,0 +1,5 @@ + Added: trunk/outgrps/uninstall.sql =================================================================== --- trunk/outgrps/uninstall.sql (rev 0) +++ trunk/outgrps/uninstall.sql 2007-08-23 21:08:01 UTC (rev 2) @@ -0,0 +1,3 @@ +DROP TABLE IF EXISTS outgroups; + + From robert at gforge.opensource-sw.net Thu Aug 23 17:38:42 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Thu, 23 Aug 2007 17:38:42 -0700 (PDT) Subject: [Outgroups-commits] r3 - trunk/outgrps Message-ID: <20070824003842.A286E8C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-23 17:38:42 -0700 (Thu, 23 Aug 2007) New Revision: 3 Modified: trunk/outgrps/functions.inc.php trunk/outgrps/module.xml trunk/outgrps/page.outgrps.php Log: Redo version numbering. Rewrite module description. Rewrite a number of descriptions on the outgrps configuration page. Redesign the dialplans so that the correct destination is logged. Simplify the dialplans removing extraneous variable handling. Modified: trunk/outgrps/functions.inc.php =================================================================== --- trunk/outgrps/functions.inc.php 2007-08-23 21:08:01 UTC (rev 2) +++ trunk/outgrps/functions.inc.php 2007-08-24 00:38:42 UTC (rev 3) @@ -127,17 +127,19 @@ } $ext->add('outgrps-routes', 'emer', '', new ext_set('EMERGENCYROUTE','yes')); - $ext->add('outgrps-routes', 'emer', '', new ext_set('OUTNUM',$emer_num)); $ext->add('outgrps-routes', 'emer', '', new ext_macro('outgrps-lookup')); - $ext->add('outgrps-routes', 'emer', '', new ext_goto(1, 'emer-grp-${OUTGRPS_ID}')); + $ext->add('outgrps-routes', 'emer', '', new ext_goto(1, $emer_num, 'emer-grp-${OUTGRPS_ID}')); } if ($out_prefix) { - $ext->add('outgrps-routes', '_'.$out_prefix.'.', '', new ext_set('OUTNUM','${EXTEN:'.$prefix_len.'}')); $ext->add('outgrps-routes', '_'.$out_prefix.'.', '', new ext_macro('outgrps-lookup')); - $ext->add('outgrps-routes', '_'.$out_prefix.'.', '', new ext_goto(1, 'outb-grp-${OUTGRPS_ID}')); + $ext->add('outgrps-routes', '_'.$out_prefix.'.', '', new ext_goto(1, '${EXTEN:'.$prefix_len.'}', 'outb-grp-${OUTGRPS_ID}')); } + $ext->add('outgrps-routes', 'invalid', '', new ext_playtones('congestion')); + $ext->add('outgrps-routes', 'invalid', '', new ext_congestion()); + $ext->add('outgrps-routes', 'invalid', '', new ext_macro(hangupcall)); + $group_list = sql('SELECT * FROM outgrps ORDER BY outgrp_id', 'getAll', DB_FETCHMODE_ASSOC); if (DB::IsError($group_list)) { die_freepbx($group_list->getMessage()); @@ -158,7 +160,7 @@ if ($emer_num) { if ($emer_trunks->numRows() > 0) { if ("$emer_cid" != '') { - $ext->add('outgrps-routes', 'emer-grp-'.$group_id, '', new ext_set('OUTGRPS_ECID','"${QUOTE('.$group['emer_cid'].')}"')); + $ext->add('emer-grp-'.$group_id, '_.', '', new ext_set('OUTGRPS_ECID','"${QUOTE('.$group['emer_cid'].')}"')); } while ($trunk =& $emer_trunks->fetchRow(DB_FETCHMODE_ASSOC)) { @@ -168,30 +170,30 @@ if ($trunk_pattern != '') { $wild_position = strpos($trunk_pattern, '%'); if ($wild_position !== false) { - $trunk_dial = substr($trunk_pattern, 0, $wild_position).'${OUTNUM}'.substr($trunk_pattern, $wild_position + 1); + $trunk_dial = substr($trunk_pattern, 0, $wild_position).'${EXTEN}'.substr($trunk_pattern, $wild_position + 1); } else { $trunk_dial = $trunk_pattern; } } else { - $trunk_dial = '${OUTNUM}'; + $trunk_dial = '${EXTEN}'; } - $ext->add('outgrps-routes', 'emer-grp-'.$group_id, '', new ext_macro('outgrps-dialout-trunk',$trunk_number.','.$trunk_dial)); + $ext->add('emer-grp-'.$group_id, '_.', '', new ext_macro('outgrps-dialout-trunk',$trunk_number.','.$trunk_dial)); } - $ext->add('outgrps-routes', 'emer-grp-'.$group_id, '', new ext_macro('outisbusy')); + $ext->add('emer-grp-'.$group_id, '_.', '', new ext_macro('outisbusy')); } else { - $ext->add('outgrps-routes', 'emer-grp-'.$group_id, '', new ext_playback('no-911-1')); - $ext->add('outgrps-routes', 'emer-grp-'.$group_id, '', new ext_goto(1, 'invalid')); + $ext->add('emer-grp-'.$group_id, '_.', '', new ext_playback('no-911-1')); + $ext->add('emer-grp-'.$group_id, '_.', '', new ext_goto(1, 'invalid', 'outgrps-routes')); } } if ($out_prefix) { $out_trunks = $db->execute($trunks_query, array($group_id, 2)); if ($out_trunks->numRows() > 0) { if ($group['out_cid']) { - $ext->add('outgrps-routes', 'outb-grp-'.$group_id, '', new ext_set('OUTGRPS_CID','${QUOTE('.$group['out_cid'].')}')); + $ext->add('outb-grp-'.$group_id, '_.', '', new ext_set('OUTGRPS_CID','${QUOTE('.$group['out_cid'].')}')); } if ($group['mohclass'] && $group['mohclass'] != 'default') { - $ext->add('outgrps-routes', 'outb-grp-'.$group_id, '', new ext_set("MOHCLASS", '${IF($["x${MOHCLASS}"="x"]?'.$group['mohclass'].':${MOHCLASS})}' )); + $ext->add('outb-grp-'.$group_id, '_.', '', new ext_set("MOHCLASS", '${IF($["x${MOHCLASS}"="x"]?'.$group['mohclass'].':${MOHCLASS})}' )); } $first_trunk = true; while ($trunk = &$out_trunks->fetchRow(DB_FETCHMODE_ASSOC)) { @@ -209,46 +211,44 @@ if ($trunk_pattern != '') { $wild_position = strpos($trunk_pattern, '%'); if ($wild_position !== false) { - $trunk_dial = substr($trunk_pattern, 0, $wild_position).'${OUTNUM}'.substr($trunk_pattern, $wild_position + 1); + $trunk_dial = substr($trunk_pattern, 0, $wild_position).'${EXTEN}'.substr($trunk_pattern, $wild_position + 1); } else { $trunk_dial = $trunk_pattern; } } else { - $trunk_dial = '${OUTNUM}'; + $trunk_dial = '${EXTEN}'; } - $ext->add('outgrps-routes', 'outb-grp-'.$group_id, '', new ext_macro('outgrps-dialout-trunk',$trunk_number.','.$trunk_dial.$pass)); + $ext->add('outb-grp-'.$group_id, '_.', '', new ext_macro('outgrps-dialout-trunk',$trunk_number.','.$trunk_dial.$pass)); } - $ext->add('outgrps-routes', 'outb-grp-'.$group_id, '', new ext_macro('outisbusy')); + $ext->add('outb-grp-'.$group_id, '_.', '', new ext_macro('outisbusy')); } else { - $ext->add('outgrps-routes', 'outb-grp-'.$group_id, '', new ext_playback('Playback(silence/1&invalid')); - $ext->add('outgrps-routes', 'outb-grp-'.$group_id, '', new ext_goto(1, 'invalid')); + $ext->add('outb-grp-'.$group_id, '_.', '', new ext_playback('Playback(silence/1&invalid')); + $ext->add('outb-grp-'.$group_id, '_.', '', new ext_goto(1, 'invalid', 'outgrps-routes')); } } } if ($emer_num) { - $ext->add('outgrps-routes', 'emer-grp-', '', new ext_playback('no-911-1')); - $ext->add('outgrps-routes', 'emer-grp-', '', new ext_goto(1, 'invalid')); + $ext->add('emer-grp-invalid', '_.', '', new ext_playback('no-911-1')); + $ext->add('emer-grp-invalid', '_.', '', new ext_goto(1, 'invalid', 'outgrps-routes')); } if ($out_prefix) { - $ext->add('outgrps-routes', 'outb-grp-', '', new ext_playback('Playback(silence/1&invalid')); - $ext->add('outgrps-routes', 'outb-grp-', '', new ext_goto(1, 'invalid')); + $ext->add('outb-grp-invalid', '_.', '', new ext_playback('Playback(silence/1&invalid')); + $ext->add('outb-grp-invalid', '_.', '', new ext_goto(1, 'invalid', 'outgrps-routes')); } - $ext->add('outgrps-routes', 'invalid', '', new ext_playtones('congestion')); - $ext->add('outgrps-routes', 'invalid', '', new ext_congestion()); - $ext->add('outgrps-routes', 'invalid', '', new ext_macro(hangupcall)); - $ext->add('macro-outgrps-lookup', 's', '', new ext_dbget('OUTGRPS_ID', 'DEVICE/${CALLERID(number)}/outgrp')); $ext->add('macro-outgrps-lookup', 's', '', new ext_gotoif('$["${OUTGRPS_ID}" != ""]', 'end')); $ext->add('macro-outgrps-lookup', 's', '', new ext_set('OUTGRPS_ID', '$["${CALLERID(number)}" : "${OUTGRPS_GRPPATTERN}"]')); + $ext->add('macro-outgrps-lookup', 's', '', new ext_gotoif('$["${OUTGRPS_ID}" != ""]', 'end')); + $ext->add('macro-outgrps-lookup', 's', '', new ext_set('OUTGRPS_ID', 'invalid')); $ext->add('macro-outgrps-lookup', 's', 'end', new ext_noop('Exiting macro-outgrps-lookup')); outgrps_dialout_trunk_macro(); outgrps_dialout_other_macro(); - outgrps_dialout_custom_macro(); + outgrps_dialout_amp_macro(); outgrps_dialout_enum_macro(); outgrps_callerid_macro(); outgrps_callerid_get_macro(); @@ -300,12 +300,12 @@ $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_gotoif('$["${OUT_${DIAL_TRUNK}:0,5}" = "ENUM/"]', 'enum')); $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_set('custom', '${CUT(OUT_${DIAL_TRUNK},:,1)}')); - $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_gotoif('$["${custom}" = "AMP"]', 'custom')); + $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_gotoif('$["${custom}" = "AMP"]', 'amp')); - $ext->add('macro-outgrps-dialout-trunk', 's', 'other', new ext_macro('outgrps-dialout-other')); + $ext->add('macro-outgrps-dialout-trunk', 's', 'other', new ext_macro('outgrps-dialout-other', '${OUTNUM}')); $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_goto(1, 's-${DIALSTATUS}')); - $ext->add('macro-outgrps-dialout-trunk', 's', 'custom', new ext_macro('outgrps-dialout-custom')); + $ext->add('macro-outgrps-dialout-trunk', 's', 'amp', new ext_macro('outgrps-dialout-amp', '${OUTNUM}')); $ext->add('macro-outgrps-dialout-trunk', 's', '', new ext_goto(1, 's-${DIALSTATUS}')); $ext->add('macro-outgrps-dialout-trunk', 's', 'enum', new ext_macro('outgrps-dialout-enum')); @@ -332,22 +332,22 @@ // Inherits DIAL_TRUNK, DIAL_NUMBER and DIAL_TRUNK_OPTIONS from caller. - $ext->add('macro-outgrps-dialout-other', 's', '', new ext_dial('${OUT_${DIAL_TRUNK}}/${OUTNUM}','300,${DIAL_TRUNK_OPTIONS}')); + $ext->add('macro-outgrps-dialout-other', 's', '', new ext_dial('${OUT_${DIAL_TRUNK}}/${ARG1}','300,${DIAL_TRUNK_OPTIONS}')); $ext->add('macro-outgrps-dialout-other', 's', 'end', new ext_noop('Exiting macro-outgrps-dialout-other')); } -function outgrps_dialout_custom_macro() { +function outgrps_dialout_amp_macro() { global $ext; // Inherits DIAL_TRUNK, DIAL_NUMBER and DIAL_TRUNK_OPTIONS from caller. - $ext->add('macro-outgrps-dialout-custom', 's', '', new ext_set('pre_num', '${CUT(OUT_${DIAL_TRUNK},$,1)}')); - $ext->add('macro-outgrps-dialout-custom', 's', '', new ext_set('the_num', '${CUT(OUT_${DIAL_TRUNK},$,2)}')); - $ext->add('macro-outgrps-dialout-custom', 's', '', new ext_set('post_num', '${CUT(OUT_${DIAL_TRUNK},$,3)}')); - $ext->add('macro-outgrps-dialout-custom', 's', '', new ext_gotoif('$["${the_num}" != "OUTNUM"]', 'skipoutnum')); - $ext->add('macro-outgrps-dialout-custom', 's', '', new ext_set('the_num', '${OUTNUM}')); - $ext->add('macro-outgrps-dialout-custom', 's', 'skipoutnum', new ext_dial('${pre_num:4}${the_num}${post_num}','300,${DIAL_TRUNK_OPTIONS}')); - $ext->add('macro-outgrps-dialout-custom', 's', 'end', new ext_noop('Exiting macro-outgrps-dialout-custom')); + $ext->add('macro-outgrps-dialout-amp', 's', '', new ext_set('pre_num', '${CUT(OUT_${DIAL_TRUNK},$,1)}')); + $ext->add('macro-outgrps-dialout-amp', 's', '', new ext_set('the_num', '${CUT(OUT_${DIAL_TRUNK},$,2)}')); + $ext->add('macro-outgrps-dialout-amp', 's', '', new ext_set('post_num', '${CUT(OUT_${DIAL_TRUNK},$,3)}')); + $ext->add('macro-outgrps-dialout-amp', 's', '', new ext_gotoif('$["${the_num}" != "OUTNUM"]', 'skipoutnum')); + $ext->add('macro-outgrps-dialout-amp', 's', '', new ext_set('the_num', '${ARG1}')); + $ext->add('macro-outgrps-dialout-amp', 's', 'skipoutnum', new ext_dial('${pre_num:4}${the_num}${post_num}','300,${DIAL_TRUNK_OPTIONS}')); + $ext->add('macro-outgrps-dialout-amp', 's', 'end', new ext_noop('Exiting macro-outgrps-dialout-amp')); } function outgrps_dialout_enum_macro() @@ -383,8 +383,7 @@ // overrides callerid out trunks // arg1 is trunk // macro-user-callerid should be called _before_ using this macro - $ext->add('macro-outgrps-callerid', 's', '', new ext_set('CALLERID_TRUNK','${ARG1}')); - $ext->add('macro-outgrps-callerid', 's', '', new ext_macro('outgrps-callerid-get')); + $ext->add('macro-outgrps-callerid', 's', '', new ext_macro('outgrps-callerid-get', '${ARG1}')); $ext->add('macro-outgrps-callerid', 's', '', new ext_set('EMERGENCY_CID','$["${QUOTE(${EMERGENCY_CID})}" | "${QUOTE(${OUTGRPS_ECID})}"]')); $ext->add('macro-outgrps-callerid', 's', '', new ext_set('TRUNKOUTCID','$["${QUOTE(${OUTGRPS_CID})}" | "${QUOTE(${TRUNKOUTCID})}"]')); @@ -395,6 +394,7 @@ function outgrps_callerid_get_macro() { global $ext; + // arg1 is trunk // Keep the original CallerID number, for failover to the next trunk. $ext->add('macro-outgrps-callerid-get', 's', '', new ext_gotoif('$["${REALCALLERIDNUM:1:2}" != ""]', 'start')); $ext->add('macro-outgrps-callerid-get', 's', '', new ext_set('REALCALLERIDNUM', '${CALLERID(number)}')); @@ -404,14 +404,14 @@ // OUTKEEPCID_${trunknum} is set. // $ext->add('macro-outgrps-callerid-get', 's', '', new ext_gotoif('$["${KEEPCID}" != "TRUE"]', 'normcid')); - $ext->add('macro-outgrps-callerid-get', 's', '', new ext_gotoif('$["x${OUTKEEPCID_${CALLERID_TRUNK}}" = "xon"]', 'normcid')); + $ext->add('macro-outgrps-callerid-get', 's', '', new ext_gotoif('$["x${OUTKEEPCID_${ARG1}}" = "xon"]', 'normcid')); $ext->add('macro-outgrps-callerid-get', 's', '', new ext_gotoif('$["foo${REALCALLERIDNUM}" = "foo"]', 'normcid')); $ext->add('macro-outgrps-callerid-get', 's', '', new ext_set('USEROUTCID', '${REALCALLERIDNUM}')); $ext->add('macro-outgrps-callerid-get', 's', '', new ext_gotoif('$["foo${DB(AMPUSER/${REALCALLERIDNUM}/device)}" = "foo"]', 'bypass')); $ext->add('macro-outgrps-callerid-get', 's', 'normcid', new ext_set('USEROUTCID','${DB(AMPUSER/${REALCALLERIDNUM}/outboundcid)}')); $ext->add('macro-outgrps-callerid-get', 's', 'bypass', new ext_set('EMERGENCYCID','${DB(DEVICE/${REALCALLERIDNUM}/emergency_cid)}')); - $ext->add('macro-outgrps-callerid-get', 's', '', new ext_set('TRUNKOUTCID','${OUTCID_${CALLERID_TRUNK}}')); + $ext->add('macro-outgrps-callerid-get', 's', '', new ext_set('TRUNKOUTCID','${OUTCID_${ARG1}}')); } function outgrps_callerid_set_macro() { Modified: trunk/outgrps/module.xml =================================================================== --- trunk/outgrps/module.xml 2007-08-23 21:08:01 UTC (rev 2) +++ trunk/outgrps/module.xml 2007-08-24 00:38:42 UTC (rev 3) @@ -1,30 +1,31 @@ outgrps Outbound Groups - 0.0.1.0 + 0.1.0 Allows outbound routing based on the extension used for dialing. -Membership in an Extension Group can be specified using a regular expression -which matches against the extension number. Individual extensions can be -assigned to specific Extension Groups. +Membership in an Extension Group can be either adhoc (manual selection for each +extension) or determined using a regular expression which matches against the +extension number. -Outbound routing is done through a list of either FreePBX's standard Outbound -Routes or direct to a trunk. Digits can be prepended and appended to the -number before dialing. +Outbound routes are specified using trunks. A trunk-specific prefix and / or +suffix can be added to the number before dialing. -Emergency Call dialing (911 in North America) is also handled. +Emergency Call dialing (911 in North America) is fully configurable for both number +and route. The only limitation is that the emergency number users dial itself is +global although the number to dial out the trunk may be overridden in each group. setup Third Party Addon - Outbound Extension Groups + Outbound Groups asterisk 1.2 - release/2.3/outgrps-0.0.1.0.tgz + release/2.3/outgrps-0.1.0.tgz http://gforge.opensource-sw.net/projects/outgroups/ - *0.0.1.0* Initial alpha release + *0.1.0* Initial alpha release Modified: trunk/outgrps/page.outgrps.php =================================================================== --- trunk/outgrps/page.outgrps.php 2007-08-23 21:08:01 UTC (rev 2) +++ trunk/outgrps/page.outgrps.php 2007-08-24 00:38:42 UTC (rev 3) @@ -156,9 +156,31 @@

-


When an extension at this group dials 9 for an outbound call, the 9 is replaced by the group's prefix.

In addition, calls to 911 and 9911 are changed to the group's emergency number.")); ?>

+

+"); + if ($outgrps_globals['out_prefix'] !== '') { + echo _("
When an extension in this group dials ").$outgrps_globals['out_prefix']._(" for an outbound call, the ").$outgrps_globals['out_prefix']._(" is removed and the outbound trunks are used to dial the call.
"); + } else { + echo _("
If an Outbound Prefix (usually 9 to match legacy PBXs) is specfied above then when an extension in this group dials that prefix for an outbound call, the prefix is removed and the outbound trunks are used to dial the call.
"); + } + if ($outgrps_globals['emer_num'] !== '') { + echo _("
In addition, calls to ").$outgrps_globals['emer_num']; + if ($outgrps_globals['out_prefix'] !== '') { + echo _(" and ").$outgrps_globals['out_prefix'].$outgrps_globals['emer_num']; + } + echo _(" are changed to the group's emergency number and the call is made using the emergency trunks."); + } else { + echo _("
In addition, if an emergency number is specfied above then calls to that number are changed to the group's emergency number and the call is made using the emergency trunks."); + } + } +?> +

- +
From robert at gforge.opensource-sw.net Thu Aug 23 17:50:01 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Thu, 23 Aug 2007 17:50:01 -0700 (PDT) Subject: [Outgroups-commits] r4 - trunk/outgrps Message-ID: <20070824005001.55EB18C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-23 17:50:00 -0700 (Thu, 23 Aug 2007) New Revision: 4 Modified: trunk/outgrps/install.sql Log: Fix missing EOL which kill publish.pl Modified: trunk/outgrps/install.sql =================================================================== --- trunk/outgrps/install.sql 2007-08-24 00:38:42 UTC (rev 3) +++ trunk/outgrps/install.sql 2007-08-24 00:50:00 UTC (rev 4) @@ -1 +1 @@ -# empty file, see http://freepbx.org/trac/ticket/1277 \ No newline at end of file +# empty file, see http://freepbx.org/trac/ticket/1277 From robert at gforge.opensource-sw.net Thu Aug 23 17:50:40 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Thu, 23 Aug 2007 17:50:40 -0700 (PDT) Subject: [Outgroups-commits] r5 - / release Message-ID: <20070824005040.7A7F08C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-23 17:50:40 -0700 (Thu, 23 Aug 2007) New Revision: 5 Added: release/ release/2.3/ Log: Add directories for released modules From robert at gforge.opensource-sw.net Thu Aug 23 17:55:21 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Thu, 23 Aug 2007 17:55:21 -0700 (PDT) Subject: [Outgroups-commits] r6 - release/2.3 Message-ID: <20070824005521.2523F8C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-23 17:55:20 -0700 (Thu, 23 Aug 2007) New Revision: 6 Added: release/2.3/outgrps-0.1.0.tgz Log: Module Publish Script: outgrps 0.1.0 Added: release/2.3/outgrps-0.1.0.tgz =================================================================== (Binary files differ) Property changes on: release/2.3/outgrps-0.1.0.tgz ___________________________________________________________________ Name: svn:mime-type + application/tgz From robert at gforge.opensource-sw.net Thu Aug 23 17:58:14 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Thu, 23 Aug 2007 17:58:14 -0700 (PDT) Subject: [Outgroups-commits] r7 - trunk Message-ID: <20070824005814.293078C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-23 17:58:13 -0700 (Thu, 23 Aug 2007) New Revision: 7 Added: trunk/publish.pl Log: Modified publish.pl to match my environment Added: trunk/publish.pl =================================================================== --- trunk/publish.pl (rev 0) +++ trunk/publish.pl 2007-08-24 00:58:13 UTC (rev 7) @@ -0,0 +1,163 @@ +#!/usr/bin/perl + +# Developers: Use $debug to keep all svn ci activity from occuring, messages will then be printed. All files will still be created +# and module.xml modifications made since these can be reverted. Review carefully if you care concerned that it will +# lose work. +# +$debug = 0; +$checkphp = 1; +$rver = "2.3"; +$fwbranch = "branches/2.3"; +$framework = "framework"; + +my $reldir = "release/"; + +while ($moddir = shift @ARGV) { + next if (!-d $moddir); + if ($moddir =~ /$framework/) { + + # Framework module is special case. We export and pull in all the files of framework that we are going to want to udpate. For now this is + # all files under htdocs, agi-bin and bin. We have not included astetc since such files should be done with core modules. We have also + # temporarily chosen not to include FOP since it is likely FOP may be handled by a FOP module going forward. Othewise we will add it here. + # + # TODO: ADD FOP until we can get into a module + # + if (system("rm -rf $framework/agi-bin $framework/bin $framework/htdocs $framework/htdocs_panel $framework/upgrades $framework/libfreepbx.install.php")) { + die "FATAL: failed to remove previoulsly exported directories\n"; + } + if (system("svn export https://amportal.svn.sourceforge.net/svnroot/amportal/freepbx/$fwbranch/amp_conf/agi-bin $framework/agi-bin")) { + die "FATAL: failed to export agi-bin directory\n"; + } + if (system("svn export https://amportal.svn.sourceforge.net/svnroot/amportal/freepbx/$fwbranch/amp_conf/bin $framework/bin")) { + die "FATAL: failed to export bin directory\n"; + } + if (system("svn export https://amportal.svn.sourceforge.net/svnroot/amportal/freepbx/$fwbranch/amp_conf/htdocs $framework/htdocs")) { + die "FATAL: failed to export htdocs directory\n"; + } + if (system("svn export https://amportal.svn.sourceforge.net/svnroot/amportal/freepbx/$fwbranch/amp_conf/htdocs_panel $framework/htdocs_panel")) { + die "FATAL: failed to export htdocs_panel directory\n"; + } + if (system("svn export https://amportal.svn.sourceforge.net/svnroot/amportal/freepbx/$fwbranch/upgrades $framework/upgrades")) { + die "FATAL: failed to export upgrades directory\n"; + } + # svn doesn't seem to allow for a single file to be checked out so we need to do a kludgey workaround + # this is what we wanted: + # + # if (system("svn export https://amportal.svn.sourceforge.net/svnroot/amportal/freepbx/$fwbranch/libfreepbx.install.php $framework/libfreepbx.install.php")) + # + if (system("svn co --non-recursive https://amportal.svn.sourceforge.net/svnroot/amportal/freepbx/$fwbranch $framework/tmp")) { + die "FATAL: failed to checkout branch with libfreepbx.install.php\n"; + } + # Create the svnversion information for this framework snapshot + # + if (system("echo SVN VERSION: `svnversion $framework/tmp` > $framework/svnversion.txt")) { + die "FATAL: svnversion failed to create svnversion.txt\n"; + } + + if (system("mv $framework/tmp/libfreepbx.install.php $framework/")) { + die "FATAL: failed to mv libfreepbx.install.php to $framework\n"; + } + if (system("rm -rf $framework/tmp")) { + die "FATAL: failed to remove $framework/tmp\n"; + } + + # Now we must remove a few files which users may have legitimately edited. For now this is the main.conf.php file which is the current + # ARI file used for editing paramters and options. + # + if (system("rm -rf $framework/htdocs/recordings/includes/main.conf.php")) { + die "FATAL: failed to trim main.conf.php ARI file\n"; + } + + # Remove from htdocs root mainstyle.css and index.html as these are owned by root (need to investigate why these are there + # and change that. Also some others + # + # TODO: check if these are stiff there and need to be special cased + # + if (system("rm -rf $framework/htdocs/mainstyle.css")) { + die "FATAL: failed to trim htdocs/mainstyle.css\n"; + } + if (system("rm -rf $framework/htdocs/index.html")) { + die "FATAL: failed to trim htdocs/index.html\n"; + } + if (system("rm -rf $framework/htdocs/admin/modules/_cache")) { + die "FATAL: failed to trim modules/_cache\n"; + } + } + + open FH, "$moddir/module.xml"; + $newxml = ""; + $vers = "unset"; + $rawname = "unset"; + while () { + if ($vers == 'unset' && /(.+)<\/version>/) { $vers = $1; } + if (/(.+)<\/rawname>/) { $rawname = $1; } + $newxml .= $_; + } + close FH; + die "Don't know version of $moddir" if ($vers eq "unset"); + die "Don't know rawname of $moddir" if ($rawname eq "unset"); + # Automatically check in any files that were modified but weren't checked into SVN + chdir($moddir); + @arr = <*>; + $files = ""; + if ($moddir =~ /$framework/) { + while ($x = shift @arr) { + # Excluding module.xml which gets checked in later.. + next if ($x =~ /module.xml/); + next if ($x =~ /agi-bin/); + next if ($x =~ /bin/); + next if ($x =~ /htdocs/); + next if ($x =~ /htdocs_panel/); + next if ($x =~ /upgrades/); + next if ($x =~ /libfreepbx.install.php/); + next if ($x =~ /svnversion.txt/); + $files .= "$x "; + } + } else { + while ($x = shift @arr) { + # Excluding module.xml which gets checked in later.. + next if ($x =~ /module.xml/); + $files .= "$x "; + + # Quick and dirty check for php syntax errors at the top level of module directories. Should probably + # do this recursively in the future. Also - checks all files now but php -l seems to be ok with that. + # + if (-f $x && $checkphp) { + if (system("php -l $x")) { + die "FATAL: php syntax error detected in $x\n"; + } + } + } + } + if ($debug) { + print "svn ci -m \"Auto Check-in of any outstanding patches\" $files\n"; + } else { + system("svn ci -m \"Auto Check-in of any outstanding patches\" $files"); + } + chdir(".."); + # Now we know the version. Create the tar.gz + $filename = "$rawname-$vers.tgz"; + system("tar zcf $filename --exclude .svn $rawname"); + # Update the md5 info + open MD5, "md5sum $filename|"; + $md5 = ; + close MD5; + ($md5sum, $null) = split(/ /, $md5); + $newxml =~ s/.+<\/md5sum>/$md5sum<\/md5sum>/; + $newxml =~ s/.+<\/location>/$reldir$rver\/$filename<\/location>/; + open FH, ">$moddir/module.xml"; + print FH $newxml; + close FH; + if ($debug) { + print "mv $filename ../release/$rver\n"; + print "svn add ../release/$rver/$filename\n"; + print "svn ps svn:mime-type application/tgz ../release/$rver/$filename\n"; + print "svn ci ../release/$rver/$filename $rawname/module.xml -m \"Module Publish Script: $rawname $vers\"\n"; + } else { + system("mv $filename ../release/$rver"); + system("svn add ../release/$rver/$filename"); + system("svn ps svn:mime-type application/tgz ../release/$rver/$filename"); + system("svn ci ../release/$rver/$filename $rawname/module.xml -m \"Module Publish Script: $rawname $vers\""); + } +} + Property changes on: trunk/publish.pl ___________________________________________________________________ Name: svn:executable + * From robert at gforge.opensource-sw.net Thu Aug 23 19:16:55 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Thu, 23 Aug 2007 19:16:55 -0700 (PDT) Subject: [Outgroups-commits] r8 - trunk/outgrps Message-ID: <20070824021655.E85EB8C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-23 19:16:55 -0700 (Thu, 23 Aug 2007) New Revision: 8 Modified: trunk/outgrps/install.php trunk/outgrps/uninstall.sql Log: Update install/uninstall scripts Modified: trunk/outgrps/install.php =================================================================== --- trunk/outgrps/install.php 2007-08-24 00:58:13 UTC (rev 7) +++ trunk/outgrps/install.php 2007-08-24 02:16:55 UTC (rev 8) @@ -10,8 +10,8 @@ emer_cid varchar(40) NOT NULL, out_cid varchar(40) NOT NULL, password varchar(20) NOT NULL, - mohclass varchar(20) NOT NULL -);"; + mohclass varchar(20) NOT NULL);"; + $check = $db->query($sql); if (DB::IsError($check)) { die( "Can not create `outgrps` table: " . $check->getMessage() . "\n"); @@ -22,23 +22,23 @@ trunk_type TINYINT UNSIGNED NOT NULL, trunk_prio TINYINT UNSIGNED NOT NULL, trunk_name varchar(20) NOT NULL, - trunk_pattern varchar(20) NOT NULL -);"; + trunk_pattern varchar(20) NOT NULL);"; + $check = $db->query($sql); if (DB::IsError($check)) { die( "Can not create `outgrps_trunks` table: " . $check->getMessage() . "\n"); } $sql = "SELECT outgrp_id from devices;"; + $check = $db->query($sql); if (DB::IsError($check)) { - $sql = "ALTER TABLE devices ADD outgrp_id INTEGER;"; + $sql = "ALTER TABLE devices ADD outgrp_id SMALLINT;"; + $check = $db->query($sql); if (DB::IsError($check)) { die( "Can not alter `devices` table: " . $check->getMessage() . "\n"); } } - - ?> Modified: trunk/outgrps/uninstall.sql =================================================================== --- trunk/outgrps/uninstall.sql 2007-08-24 00:58:13 UTC (rev 7) +++ trunk/outgrps/uninstall.sql 2007-08-24 02:16:55 UTC (rev 8) @@ -1,3 +1,2 @@ -DROP TABLE IF EXISTS outgroups; - - +DROP TABLE IF EXISTS outgrps; +DROP TABLE IF EXISTS outgrps_trunks; From robert at gforge.opensource-sw.net Thu Aug 23 19:17:07 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Thu, 23 Aug 2007 19:17:07 -0700 (PDT) Subject: [Outgroups-commits] r9 - release/2.3 Message-ID: <20070824021707.240788C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-23 19:17:06 -0700 (Thu, 23 Aug 2007) New Revision: 9 Modified: release/2.3/outgrps-0.1.0.tgz Log: Module Publish Script: outgrps 0.1.0 Modified: release/2.3/outgrps-0.1.0.tgz =================================================================== (Binary files differ) From robert at gforge.opensource-sw.net Thu Aug 23 20:10:51 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Thu, 23 Aug 2007 20:10:51 -0700 (PDT) Subject: [Outgroups-commits] r10 - trunk/outgrps Message-ID: <20070824031051.880FF8C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-23 20:10:51 -0700 (Thu, 23 Aug 2007) New Revision: 10 Modified: trunk/outgrps/functions.inc.php trunk/outgrps/install.php trunk/outgrps/install.sql trunk/outgrps/page.outgrps.php Log: Fix copyrights Modified: trunk/outgrps/functions.inc.php =================================================================== --- trunk/outgrps/functions.inc.php 2007-08-24 02:17:06 UTC (rev 9) +++ trunk/outgrps/functions.inc.php 2007-08-24 03:10:51 UTC (rev 10) @@ -1,15 +1,15 @@ - Author: robert Date: 2007-08-23 20:11:08 -0700 (Thu, 23 Aug 2007) New Revision: 11 Modified: release/2.3/outgrps-0.1.0.tgz Log: Module Publish Script: outgrps 0.1.0 Modified: release/2.3/outgrps-0.1.0.tgz =================================================================== (Binary files differ) From robert at gforge.opensource-sw.net Fri Aug 24 00:41:18 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Fri, 24 Aug 2007 00:41:18 -0700 (PDT) Subject: [Outgroups-commits] r12 - tags Message-ID: <20070824074118.9173A8C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-24 00:41:18 -0700 (Fri, 24 Aug 2007) New Revision: 12 Added: tags/Release-0.1.0/ Log: Release 0.1.0 Copied: tags/Release-0.1.0 (from rev 11, trunk) From robert at gforge.opensource-sw.net Fri Aug 24 15:07:33 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Fri, 24 Aug 2007 15:07:33 -0700 (PDT) Subject: [Outgroups-commits] r13 - branches Message-ID: <20070824220733.4D9498C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-24 15:07:33 -0700 (Fri, 24 Aug 2007) New Revision: 13 Added: branches/branch-0.1/ Log: Branch for 0.1 releases. Copied: branches/branch-0.1 (from rev 12, tags/Release-0.1.0) From robert at gforge.opensource-sw.net Fri Aug 24 15:12:05 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Fri, 24 Aug 2007 15:12:05 -0700 (PDT) Subject: [Outgroups-commits] r14 - branches/branch-0.1/outgrps Message-ID: <20070824221205.9E06D8C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-24 15:12:05 -0700 (Fri, 24 Aug 2007) New Revision: 14 Modified: branches/branch-0.1/outgrps/functions.inc.php Log: Auto Check-in of any outstanding patches Modified: branches/branch-0.1/outgrps/functions.inc.php =================================================================== --- branches/branch-0.1/outgrps/functions.inc.php 2007-08-24 22:07:33 UTC (rev 13) +++ branches/branch-0.1/outgrps/functions.inc.php 2007-08-24 22:12:05 UTC (rev 14) @@ -24,6 +24,21 @@ return array('outgrp_id', 'trunk_type', 'trunk_prio' , 'trunk_name' , 'trunk_pattern'); } +// +// This should really be in extensions.class.php but until FreePBX is updated I'll put it here. +// +class ext_setcallerpres extends extension { + var $chan; + var $options; + function ext_setcallerpres($presentation) { + $this->presentation = $presentation; + } + + function output() { + return 'SetCallerPres('.$this->presentation.')'; + } +} + //brute force hoook to devices and extensions pages to inform the user that they can place these devices in their custom contexts function outgrps_configpageinit($compname) { global $currentcomponent; From robert at gforge.opensource-sw.net Fri Aug 24 15:14:58 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Fri, 24 Aug 2007 15:14:58 -0700 (PDT) Subject: [Outgroups-commits] r15 - branches/branch-0.1/outgrps release/2.3 Message-ID: <20070824221458.21DBD8C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-24 15:14:57 -0700 (Fri, 24 Aug 2007) New Revision: 15 Added: release/2.3/outgrps-0.1.1.tgz Modified: branches/branch-0.1/outgrps/module.xml Log: Module Publish Script: outgrps 0.1.1 Modified: branches/branch-0.1/outgrps/module.xml =================================================================== --- branches/branch-0.1/outgrps/module.xml 2007-08-24 22:12:05 UTC (rev 14) +++ branches/branch-0.1/outgrps/module.xml 2007-08-24 22:14:57 UTC (rev 15) @@ -1,7 +1,7 @@ outgrps Outbound Groups - 0.1.0 + 0.1.1 Allows outbound routing based on the extension used for dialing. Membership in an Extension Group can be either adhoc (manual selection for each @@ -22,10 +22,11 @@ asterisk 1.2 - release/2.3/outgrps-0.1.0.tgz + release/2.3/outgrps-0.1.1.tgz http://gforge.opensource-sw.net/projects/outgroups/ *0.1.0* Initial alpha release + *0.1.1* Move new ext_setcallerpres class to functions.inc.php for now. Added: release/2.3/outgrps-0.1.1.tgz =================================================================== (Binary files differ) Property changes on: release/2.3/outgrps-0.1.1.tgz ___________________________________________________________________ Name: svn:mime-type + application/tgz From robert at gforge.opensource-sw.net Fri Aug 24 22:21:05 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Fri, 24 Aug 2007 22:21:05 -0700 (PDT) Subject: [Outgroups-commits] r16 - branches/branch-0.1/outgrps Message-ID: <20070825052105.2006F8C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-24 22:21:04 -0700 (Fri, 24 Aug 2007) New Revision: 16 Modified: branches/branch-0.1/outgrps/functions.inc.php branches/branch-0.1/outgrps/module.xml Log: Fix include of extensions.class.php Modified: branches/branch-0.1/outgrps/functions.inc.php =================================================================== --- branches/branch-0.1/outgrps/functions.inc.php 2007-08-24 22:14:57 UTC (rev 15) +++ branches/branch-0.1/outgrps/functions.inc.php 2007-08-25 05:21:04 UTC (rev 16) @@ -11,6 +11,7 @@ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. +require 'extensions.class.php'; function outgrps_global_names() { return array('grppattern', 'out_prefix', 'emer_num'); Modified: branches/branch-0.1/outgrps/module.xml =================================================================== --- branches/branch-0.1/outgrps/module.xml 2007-08-24 22:14:57 UTC (rev 15) +++ branches/branch-0.1/outgrps/module.xml 2007-08-25 05:21:04 UTC (rev 16) @@ -1,7 +1,7 @@ outgrps Outbound Groups - 0.1.1 + 0.1.2 Allows outbound routing based on the extension used for dialing. Membership in an Extension Group can be either adhoc (manual selection for each @@ -22,11 +22,11 @@ asterisk 1.2 - release/2.3/outgrps-0.1.1.tgz + release/2.3/outgrps-0.1.2.tgz http://gforge.opensource-sw.net/projects/outgroups/ *0.1.0* Initial alpha release - *0.1.1* Move new ext_setcallerpres class to functions.inc.php for now. + *0.1.2* Move new ext_setcallerpres class to functions.inc.php for now. From robert at gforge.opensource-sw.net Fri Aug 24 22:21:28 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Fri, 24 Aug 2007 22:21:28 -0700 (PDT) Subject: [Outgroups-commits] r17 - release/2.3 Message-ID: <20070825052128.13B898C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-24 22:21:27 -0700 (Fri, 24 Aug 2007) New Revision: 17 Added: release/2.3/outgrps-0.1.2.tgz Log: Module Publish Script: outgrps 0.1.2 Added: release/2.3/outgrps-0.1.2.tgz =================================================================== (Binary files differ) Property changes on: release/2.3/outgrps-0.1.2.tgz ___________________________________________________________________ Name: svn:mime-type + application/tgz From robert at gforge.opensource-sw.net Sat Aug 25 01:37:40 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Sat, 25 Aug 2007 01:37:40 -0700 (PDT) Subject: [Outgroups-commits] r18 - branches/branch-0.1/outgrps Message-ID: <20070825083740.8118E8C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-25 01:37:39 -0700 (Sat, 25 Aug 2007) New Revision: 18 Modified: branches/branch-0.1/outgrps/functions.inc.php Log: Try again to get the require right Modified: branches/branch-0.1/outgrps/functions.inc.php =================================================================== --- branches/branch-0.1/outgrps/functions.inc.php 2007-08-25 05:21:27 UTC (rev 17) +++ branches/branch-0.1/outgrps/functions.inc.php 2007-08-25 08:37:39 UTC (rev 18) @@ -11,8 +11,11 @@ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -require 'extensions.class.php'; +if (!class_exists('extension')) { + require('extensions.class.php'); +} + function outgrps_global_names() { return array('grppattern', 'out_prefix', 'emer_num'); } From robert at gforge.opensource-sw.net Sat Aug 25 01:40:16 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Sat, 25 Aug 2007 01:40:16 -0700 (PDT) Subject: [Outgroups-commits] r19 - branches/branch-0.1/outgrps Message-ID: <20070825084016.B3DDA8C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-25 01:40:16 -0700 (Sat, 25 Aug 2007) New Revision: 19 Modified: branches/branch-0.1/outgrps/module.xml Log: Update module for version 0.1.3 Modified: branches/branch-0.1/outgrps/module.xml =================================================================== --- branches/branch-0.1/outgrps/module.xml 2007-08-25 08:37:39 UTC (rev 18) +++ branches/branch-0.1/outgrps/module.xml 2007-08-25 08:40:16 UTC (rev 19) @@ -1,7 +1,7 @@ outgrps Outbound Groups - 0.1.2 + 0.1.3 Allows outbound routing based on the extension used for dialing. Membership in an Extension Group can be either adhoc (manual selection for each @@ -22,11 +22,13 @@ asterisk 1.2 - release/2.3/outgrps-0.1.2.tgz + release/2.3/outgrps-0.1.3.tgz http://gforge.opensource-sw.net/projects/outgroups/ *0.1.0* Initial alpha release - *0.1.2* Move new ext_setcallerpres class to functions.inc.php for now. + *0.1.1* Move new ext_setcallerpres class to functions.inc.php for now. + *0.1.2* Added require of extensions.class.php. + *0.1.3* Make require conditional on existence of extensions.class. From robert at gforge.opensource-sw.net Sat Aug 25 01:40:25 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Sat, 25 Aug 2007 01:40:25 -0700 (PDT) Subject: [Outgroups-commits] r20 - release/2.3 Message-ID: <20070825084025.41CCD8C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-25 01:40:25 -0700 (Sat, 25 Aug 2007) New Revision: 20 Added: release/2.3/outgrps-0.1.3.tgz Log: Module Publish Script: outgrps 0.1.3 Added: release/2.3/outgrps-0.1.3.tgz =================================================================== (Binary files differ) Property changes on: release/2.3/outgrps-0.1.3.tgz ___________________________________________________________________ Name: svn:mime-type + application/tgz From robert at gforge.opensource-sw.net Sat Aug 25 02:06:43 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Sat, 25 Aug 2007 02:06:43 -0700 (PDT) Subject: [Outgroups-commits] r21 - branches/branch-0.1 Message-ID: <20070825090643.E69178C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-25 02:06:43 -0700 (Sat, 25 Aug 2007) New Revision: 21 Modified: branches/branch-0.1/publish.pl Log: Updated the publish script Modified: branches/branch-0.1/publish.pl =================================================================== --- branches/branch-0.1/publish.pl 2007-08-25 08:40:25 UTC (rev 20) +++ branches/branch-0.1/publish.pl 2007-08-25 09:06:43 UTC (rev 21) @@ -149,15 +149,15 @@ print FH $newxml; close FH; if ($debug) { - print "mv $filename ../release/$rver\n"; - print "svn add ../release/$rver/$filename\n"; - print "svn ps svn:mime-type application/tgz ../release/$rver/$filename\n"; - print "svn ci ../release/$rver/$filename $rawname/module.xml -m \"Module Publish Script: $rawname $vers\"\n"; + print "mv $filename release/$rver\n"; + print "svn add release/$rver/$filename\n"; + print "svn ps svn:mime-type application/tgz release/$rver/$filename\n"; + print "svn ci release/$rver/$filename $rawname/module.xml -m \"Module Publish Script: $rawname $vers\"\n"; } else { - system("mv $filename ../release/$rver"); - system("svn add ../release/$rver/$filename"); - system("svn ps svn:mime-type application/tgz ../release/$rver/$filename"); - system("svn ci ../release/$rver/$filename $rawname/module.xml -m \"Module Publish Script: $rawname $vers\""); + system("mv $filename release/$rver"); + system("svn add release/$rver/$filename"); + system("svn ps svn:mime-type application/tgz release/$rver/$filename"); + system("svn ci release/$rver/$filename $rawname/module.xml -m \"Module Publish Script: $rawname $vers\""); } } From robert at gforge.opensource-sw.net Mon Aug 27 14:30:28 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Mon, 27 Aug 2007 14:30:28 -0700 (PDT) Subject: [Outgroups-commits] r22 - branches/branch-0.1/outgrps Message-ID: <20070827213028.C1AFD8C510@orangebang.dreamhost.com> Author: robert Date: 2007-08-27 14:30:27 -0700 (Mon, 27 Aug 2007) New Revision: 22 Modified: branches/branch-0.1/outgrps/functions.inc.php branches/branch-0.1/outgrps/module.xml Log: Fix handling of default outgroup on Extensions page. Modified: branches/branch-0.1/outgrps/functions.inc.php =================================================================== --- branches/branch-0.1/outgrps/functions.inc.php 2007-08-25 09:06:43 UTC (rev 21) +++ branches/branch-0.1/outgrps/functions.inc.php 2007-08-27 21:30:27 UTC (rev 22) @@ -55,11 +55,11 @@ $extdisplay = isset($_REQUEST['extdisplay'])?$_REQUEST['extdisplay']:null; if ($extdisplay != '') { $outgrps = outgrps_list(); - $currentcomponent->addoptlistitem('outgrpsel', '', 'Default'); + $currentcomponent->addoptlist('outgrpsel', false); + $currentcomponent->addoptlistitem('outgrpsel', '-1', 'Default'); foreach ($outgrps as $key=>$val) { $currentcomponent->addoptlistitem('outgrpsel', $key, $val.' ('.$key.') ', false); } - $currentcomponent->setoptlistopts('outgrpsel', 'sort', false); } $currentcomponent->addguifunc('outgrps_configpageload'); $currentcomponent->addprocessfunc('outgrps_configprocess'); @@ -79,8 +79,9 @@ $extdisplay = isset($_REQUEST['extdisplay'])?$_REQUEST['extdisplay']:null; $current_value = outgrps_extension_get($extdisplay); + $current_value === null and $current_value = '-1'; - $currentcomponent->addguielem('Extension Options', new gui_selectbox('outgrp', $currentcomponent->getoptlist('outgrpsel'), $current_value, _('Outbound Group'), _('Select a group for this extension. The group specifies which prefix to prepend for outbound calls when 9 is used. It also determines the number dialed for emergencies when this extension dials 911.'), false)); + $currentcomponent->addguielem('Extension Options', new gui_selectbox('outgrp', $currentcomponent->getoptlist('outgrpsel'), $current_value, _('Outbound Group'), _('Select a group for this extension. The group determines how outbound and emergency calls are handled.'), false)); } } @@ -98,7 +99,7 @@ $outgrp = isset($_REQUEST['outgrp'])?$_REQUEST['outgrp']:null; if ($action == 'edit') { - outgrps_extension_set($extdisplay, $outgrp !== '' ? $outgrp : null); + outgrps_extension_set($extdisplay, $outgrp !== '-1' ? $outgrp : null); } } } Modified: branches/branch-0.1/outgrps/module.xml =================================================================== --- branches/branch-0.1/outgrps/module.xml 2007-08-25 09:06:43 UTC (rev 21) +++ branches/branch-0.1/outgrps/module.xml 2007-08-27 21:30:27 UTC (rev 22) @@ -1,7 +1,7 @@ outgrps Outbound Groups - 0.1.3 + 0.1.4 Allows outbound routing based on the extension used for dialing. Membership in an Extension Group can be either adhoc (manual selection for each @@ -22,7 +22,7 @@ asterisk 1.2 - release/2.3/outgrps-0.1.3.tgz + release/2.3/outgrps-0.1.4.tgz http://gforge.opensource-sw.net/projects/outgroups/ @@ -30,5 +30,6 @@ *0.1.1* Move new ext_setcallerpres class to functions.inc.php for now. *0.1.2* Added require of extensions.class.php. *0.1.3* Make require conditional on existence of extensions.class. + *0.1.4* Fix handling of default outgroup on extensions page. From robert at gforge.opensource-sw.net Mon Aug 27 14:30:50 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Mon, 27 Aug 2007 14:30:50 -0700 (PDT) Subject: [Outgroups-commits] r23 - release/2.3 Message-ID: <20070827213050.862418C510@orangebang.dreamhost.com> Author: robert Date: 2007-08-27 14:30:49 -0700 (Mon, 27 Aug 2007) New Revision: 23 Added: release/2.3/outgrps-0.1.4.tgz Log: Module Publish Script: outgrps 0.1.4 Added: release/2.3/outgrps-0.1.4.tgz =================================================================== (Binary files differ) Property changes on: release/2.3/outgrps-0.1.4.tgz ___________________________________________________________________ Name: svn:mime-type + application/tgz From robert at gforge.opensource-sw.net Tue Aug 28 23:37:18 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Tue, 28 Aug 2007 23:37:18 -0700 (PDT) Subject: [Outgroups-commits] r24 - branches/branch-0.1/outgrps Message-ID: <20070829063718.336BF8C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-28 23:37:17 -0700 (Tue, 28 Aug 2007) New Revision: 24 Modified: branches/branch-0.1/outgrps/functions.inc.php branches/branch-0.1/outgrps/module.xml branches/branch-0.1/outgrps/page.outgrps.php Log: Fix quoting of caller-id. Mark as needing reload after add or edit of extension group. Modified: branches/branch-0.1/outgrps/functions.inc.php =================================================================== --- branches/branch-0.1/outgrps/functions.inc.php 2007-08-27 21:30:49 UTC (rev 23) +++ branches/branch-0.1/outgrps/functions.inc.php 2007-08-29 06:37:17 UTC (rev 24) @@ -180,7 +180,7 @@ if ($emer_num) { if ($emer_trunks->numRows() > 0) { if ("$emer_cid" != '') { - $ext->add('emer-grp-'.$group_id, '_.', '', new ext_set('OUTGRPS_ECID','"${QUOTE('.$group['emer_cid'].')}"')); + $ext->add('emer-grp-'.$group_id, '_.', '', new ext_set('OUTGRPS_ECID','${QUOTE('.$group['emer_cid'].')}')); } while ($trunk =& $emer_trunks->fetchRow(DB_FETCHMODE_ASSOC)) { @@ -404,11 +404,14 @@ // arg1 is trunk // macro-user-callerid should be called _before_ using this macro $ext->add('macro-outgrps-callerid', 's', '', new ext_macro('outgrps-callerid-get', '${ARG1}')); - - $ext->add('macro-outgrps-callerid', 's', '', new ext_set('EMERGENCY_CID','$["${QUOTE(${EMERGENCY_CID})}" | "${QUOTE(${OUTGRPS_ECID})}"]')); - $ext->add('macro-outgrps-callerid', 's', '', new ext_set('TRUNKOUTCID','$["${QUOTE(${OUTGRPS_CID})}" | "${QUOTE(${TRUNKOUTCID})}"]')); - $ext->add('macro-outgrps-callerid', 's', '', new ext_macro('outgrps-callerid-set')); + $ext->add('macro-outgrps-callerid', 's', '', new ext_gotoif('${EMERGENCY_CID:1:2}','checktrunk')); + $ext->add('macro-outgrps-callerid', 's', '', new ext_set('EMERGENCY_CID','${QUOTE(${OUTGRPS_ECID})}')); + $ext->add('macro-outgrps-callerid', 's', 'checktrunk', new ext_gotoif('${OUTGRPS_CID:1:2}','','cidset')); + $ext->add('macro-outgrps-callerid', 's', '', new ext_set('TRUNKOUTCID','${QUOTE(${OUTGRPS_CID})}')); + $ext->add('macro-outgrps-callerid', 's', 'cidset', new ext_macro('outgrps-callerid-set')); + + $ext->add('macro-outgrps-callerid', 's', 'end', new ext_noop('Exiting outgrps_callerid_macro')); } function outgrps_callerid_get_macro() { Modified: branches/branch-0.1/outgrps/module.xml =================================================================== --- branches/branch-0.1/outgrps/module.xml 2007-08-27 21:30:49 UTC (rev 23) +++ branches/branch-0.1/outgrps/module.xml 2007-08-29 06:37:17 UTC (rev 24) @@ -1,7 +1,7 @@ outgrps Outbound Groups - 0.1.4 + 0.1.5 Allows outbound routing based on the extension used for dialing. Membership in an Extension Group can be either adhoc (manual selection for each @@ -12,7 +12,7 @@ suffix can be added to the number before dialing. Emergency Call dialing (911 in North America) is fully configurable for both number -and route. The only limitation is that the emergency number users dial itself is +and route. The only limitation is that the emergency number users themselves dial is global although the number to dial out the trunk may be overridden in each group. setup Third Party Addon @@ -22,14 +22,16 @@ asterisk 1.2 - release/2.3/outgrps-0.1.4.tgz + release/2.3/outgrps-0.1.5.tgz http://gforge.opensource-sw.net/projects/outgroups/ + *0.1.5* Fix quoting of caller-id. + Mark as needing reload after add or edit of extension group. + *0.1.4* Fix handling of default outgroup on extensions page. + *0.1.3* Make require conditional on existence of extensions.class. + *0.1.2* Added require of extensions.class.php. + *0.1.1* Move new ext_setcallerpres class to functions.inc.php for now. *0.1.0* Initial alpha release - *0.1.1* Move new ext_setcallerpres class to functions.inc.php for now. - *0.1.2* Added require of extensions.class.php. - *0.1.3* Make require conditional on existence of extensions.class. - *0.1.4* Fix handling of default outgroup on extensions page. Modified: branches/branch-0.1/outgrps/page.outgrps.php =================================================================== --- branches/branch-0.1/outgrps/page.outgrps.php 2007-08-27 21:30:49 UTC (rev 23) +++ branches/branch-0.1/outgrps/page.outgrps.php 2007-08-29 06:37:17 UTC (rev 24) @@ -54,6 +54,7 @@ switch ($action) { case "add": outgrps_add($group_field_values); + needreload(); redirect_standard(); break; case "delete": @@ -64,6 +65,7 @@ case "edit": $group_field_values['outgrp_id'] = $itemid; outgrps_edit($group_field_values); + needreload(); redirect_standard('itemid'); break; } @@ -111,7 +113,7 @@ echo " \r\n"; echo " \r\n"; echo " \r\n"; echo " \r\n"; echo " \r\n"; From robert at gforge.opensource-sw.net Tue Aug 28 23:37:42 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Tue, 28 Aug 2007 23:37:42 -0700 (PDT) Subject: [Outgroups-commits] r25 - release/2.3 Message-ID: <20070829063742.2E00B8C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-28 23:37:42 -0700 (Tue, 28 Aug 2007) New Revision: 25 Added: release/2.3/outgrps-0.1.5.tgz Log: Module Publish Script: outgrps 0.1.5 Added: release/2.3/outgrps-0.1.5.tgz =================================================================== (Binary files differ) Property changes on: release/2.3/outgrps-0.1.5.tgz ___________________________________________________________________ Name: svn:mime-type + application/tgz From robert at gforge.opensource-sw.net Thu Aug 30 13:13:46 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Thu, 30 Aug 2007 13:13:46 -0700 (PDT) Subject: [Outgroups-commits] r26 - tags Message-ID: <20070830201346.0B9368C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-30 13:13:45 -0700 (Thu, 30 Aug 2007) New Revision: 26 Added: tags/Release-0.1.1/ Log: Release 0.1.1 Copied: tags/Release-0.1.1 (from rev 14, branches/branch-0.1) From robert at gforge.opensource-sw.net Thu Aug 30 13:15:28 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Thu, 30 Aug 2007 13:15:28 -0700 (PDT) Subject: [Outgroups-commits] r27 - tags Message-ID: <20070830201528.100D78C510@orangebang.dreamhost.com> Author: robert Date: 2007-08-30 13:15:27 -0700 (Thu, 30 Aug 2007) New Revision: 27 Added: tags/Release-0.1.2/ Log: Release 0.1.2 Copied: tags/Release-0.1.2 (from rev 16, branches/branch-0.1) From robert at gforge.opensource-sw.net Thu Aug 30 13:16:05 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Thu, 30 Aug 2007 13:16:05 -0700 (PDT) Subject: [Outgroups-commits] r28 - tags Message-ID: <20070830201605.5D2178C511@orangebang.dreamhost.com> Author: robert Date: 2007-08-30 13:16:04 -0700 (Thu, 30 Aug 2007) New Revision: 28 Added: tags/Release-0.1.3/ Log: Release 0.1.3 Copied: tags/Release-0.1.3 (from rev 19, branches/branch-0.1) From robert at gforge.opensource-sw.net Thu Aug 30 13:16:49 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Thu, 30 Aug 2007 13:16:49 -0700 (PDT) Subject: [Outgroups-commits] r29 - tags Message-ID: <20070830201649.5430B8C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-30 13:16:46 -0700 (Thu, 30 Aug 2007) New Revision: 29 Added: tags/Release-0.1.4/ Log: Release 0.1.4 Copied: tags/Release-0.1.4 (from rev 22, branches/branch-0.1) From robert at gforge.opensource-sw.net Thu Aug 30 13:17:24 2007 From: robert at gforge.opensource-sw.net (robert at gforge.opensource-sw.net) Date: Thu, 30 Aug 2007 13:17:24 -0700 (PDT) Subject: [Outgroups-commits] r30 - tags Message-ID: <20070830201724.371FA8C50F@orangebang.dreamhost.com> Author: robert Date: 2007-08-30 13:17:22 -0700 (Thu, 30 Aug 2007) New Revision: 30 Added: tags/Release-0.1.5/ Log: Release 0.1.5 Copied: tags/Release-0.1.5 (from rev 24, branches/branch-0.1)
\r\n"; - echo " "._("Extension Pattern:").''._("This regular expression describes the default group number for each extension. The pattern is matched against the extension number, the first matching substring is the group number for that extension. For example, if an extension number is three digits long starting with a 2 in which the middle digit corresponds to the group, the pattern would be 2\([0-9]\)[0-9]. The group for an extension can be changed from the default in the Extension page.")."\r\n"; + echo " "._("Extension Pattern:").''._("This regular expression describes the default group number for each extension. The pattern is matched against the extension number, the first matching substring is the group number for that extension. For example, if an extension number is three digits long starting with a 2 in which the middle digit corresponds to the group, the pattern would be 2([0-9])[0-9]. The group for an extension can be changed from the default in the Extension page.")."\r\n"; echo "