| 133 | | ;------------------------------------------------------------------------ |
|---|
| 134 | | ; [macro-vm] |
|---|
| 135 | | ;------------------------------------------------------------------------ |
|---|
| 136 | | ; CONTEXT: macro-vm |
|---|
| 137 | | ; PURPOSE: call voicemail system and extend with personal ivr |
|---|
| 138 | | ; |
|---|
| 139 | | ; Under normal use, this macro will call the voicemail system with the extension and |
|---|
| 140 | | ; desired greeting mode of busy, unavailable or as specified with direct voicemail |
|---|
| 141 | | ; calls (usually unavailable) when entered from destinations. |
|---|
| 142 | | ; |
|---|
| 143 | | ; The voicemail system's two greetings have been 'hijacked' as follows to extend the |
|---|
| 144 | | ; system by giving the option of a private 'ivr' for each voicemail user. The following |
|---|
| 145 | | ; applies to both the busy and unavailable modes of voicemail and can be applied to one |
|---|
| 146 | | ; or both, and differently. |
|---|
| 147 | | ; |
|---|
| 148 | | ; Global Defaults: |
|---|
| 149 | | ; |
|---|
| 150 | | ; The following are default values, used in both busy and unavail modes if no specific |
|---|
| 151 | | ; values are specified. |
|---|
| 152 | | ; |
|---|
| 153 | | ; VMX_REPEAT |
|---|
| 154 | | ; The number of times to repeat the users message if no option is pressed. |
|---|
| 155 | | ; VMX_TIMEOUT |
|---|
| 156 | | ; The timeout to wait after playing message before repeating or giving up. |
|---|
| 157 | | ; VMX_LOOPS |
|---|
| 158 | | ; The number of times it should replay the message and check for an option when |
|---|
| 159 | | ; an invalid option is pressed. |
|---|
| 160 | | ; |
|---|
| 161 | | ; VMX_OPTS_DOVM |
|---|
| 162 | | ; Default voicemail option to use if vm is chosen as an option. No options will |
|---|
| 163 | | ; cause Allison's generic message, 's' will go straight to beep. |
|---|
| 164 | | ; VMX_OPTS_TIMEOUT |
|---|
| 165 | | ; Default voicemail option to use if it times out with no options. No options will |
|---|
| 166 | | ; cause Allison's generic message, 's' will go straight to beep. |
|---|
| 167 | | ; IF THE USER PRESSES # - it will look like a timeout as well since no option will |
|---|
| 168 | | ; be presented. If the user wishes to enable a mode where a caller can press # |
|---|
| 169 | | ; during their message and it goes straight to voicemail with only a 'beep' then |
|---|
| 170 | | ; this should be set to 's'. |
|---|
| 171 | | ; VMX_OPTS_LOOPS |
|---|
| 172 | | ; Default voicemail option to use if to many wrong options occur. No options will |
|---|
| 173 | | ; cause Allison's generic message, 's' will go straight to beep. |
|---|
| 174 | | ; |
|---|
| 175 | | ; VMX_CONTEXT |
|---|
| 176 | | ; Default context for user destinations if not supplied in the user's settings |
|---|
| 177 | | ; VMX_PRI |
|---|
| 178 | | ; Default priority for user destinations if not supplied in the user's settings |
|---|
| 179 | | ; |
|---|
| 180 | | ; VMX_TIMEDEST_CONTEXT |
|---|
| 181 | | ; Default context for timeout destination if not supplied in the user's settings |
|---|
| 182 | | ; VMX_TIMEDEST_EXT |
|---|
| 183 | | ; Default extension for timeout destination if not supplied in the user's settings |
|---|
| 184 | | ; VMX_TIMEDEST_PRI |
|---|
| 185 | | ; Default priority for timeout destination if not supplied in the user's settings |
|---|
| 186 | | ; |
|---|
| 187 | | ; VMX_LOOPDEST_CONTEXT |
|---|
| 188 | | ; Default context for loops destination if not supplied in the user's settings |
|---|
| 189 | | ; VMX_LOOPDEST_EXT |
|---|
| 190 | | ; Default extension for loops destination if not supplied in the user's settings |
|---|
| 191 | | ; VMX_LOOPDEST_PRI |
|---|
| 192 | | ; Default priority for loops destination if not supplied in the user's settings |
|---|
| 193 | | ; |
|---|
| 194 | | ; |
|---|
| 195 | | ; The AMPUSER database variable has been extended with a 'vmx' tree (vm-extension). A |
|---|
| 196 | | ; duplicate set is included for both unavail and busy. You could choose for to have an |
|---|
| 197 | | ; ivr when unavail is taken, but not with busy - or a different once with busy. |
|---|
| 198 | | ; The full list is below, each specific entry is futher described: |
|---|
| 199 | | ; |
|---|
| 200 | | ; state: Whether teh current mode is enabled or disabled. Anything but 'enabled' is |
|---|
| 201 | | ; treated as disabled. |
|---|
| 202 | | ; repeat: This is the number of times that the users message should be played after the |
|---|
| 203 | | ; timeout if the user has not entered anything. It is just a variable to the |
|---|
| 204 | | ; Read() function which will do the repeating. |
|---|
| 205 | | ; timeout: This is how long to wait after the message has been read for a response from |
|---|
| 206 | | ; the user. A caller can enter a digit any time during the playback. |
|---|
| 207 | | ; loops: This is the number of loops that the system will allow a caller to retry if |
|---|
| 208 | | ; they enter a bad menu choice, before going to the loop failover destination |
|---|
| 209 | | ; vmxopts: This is the vm options to send to the voicemail command used when a specific |
|---|
| 210 | | ; voicemail destination is chosen (inidcated by 'dovm' in the ext field). This is |
|---|
| 211 | | ; typically either set to 's' or left blank. When set to 's' there will be no |
|---|
| 212 | | ; message played when entering the voicemail, just a beep. When blank, you will |
|---|
| 213 | | ; have Allison's generic message played. It is not typical to play the greetings |
|---|
| 214 | | ; since they have been 'hijacked' for these IVR's and from a caller's perspecitive |
|---|
| 215 | | ; this system appears interconnected with the voicemail so instructions can be |
|---|
| 216 | | ; left there. |
|---|
| 217 | | ; timedest: The three variables: ext, context and pri are the goto destination if the caller |
|---|
| 218 | | ; enters no options and it timesout. None have to be set and a system default |
|---|
| 219 | | ; will be used. If just ext is set, then defaults will be used for context and |
|---|
| 220 | | ; pri, etc. |
|---|
| 221 | | ; loopdest: This is identical to timedest but used if the caller exceeds the maximum invalid |
|---|
| 222 | | ; menu choices. |
|---|
| 223 | | ; [0-9*]: The user can specify up to 11 ivr options, all as single digits from 0-9 or *. The |
|---|
| 224 | | ; # key can not be used since it is used as a terminator key for the Read command |
|---|
| 225 | | ; and will never be returned. A minimum of the ext must be specified for each valid |
|---|
| 226 | | ; option and as above, the context and priority can also be specified if the default |
|---|
| 227 | | ; is not to be used. |
|---|
| 228 | | ; Option '0' takes on a special meaning. Since a user is able to break out of the |
|---|
| 229 | | ; voicemail command once entering it with a 0, if specified, the 0 destination will |
|---|
| 230 | | ; be used. |
|---|
| 231 | | ; Option '*' can also be used to breakout. It is undecided at this point whether |
|---|
| 232 | | ; providing that option will be used as well. (probably should). |
|---|
| 233 | | ; |
|---|
| 234 | | ; |
|---|
| 235 | | ; /AMPUSER/<ext>/vmx/[busy|unavail]/state: enabled|disabled |
|---|
| 236 | | ; /AMPUSER/<ext>/vmx/[busy|unavail]/repeat: n (times to repeat message) |
|---|
| 237 | | ; /AMPUSER/<ext>/vmx/[busy|unavail]/timeout: n (timeout to wait for digit) |
|---|
| 238 | | ; /AMPUSER/<ext>/vmx/[busy|unavail]/loops: n (loop returies for invalid entries) |
|---|
| 239 | | ; /AMPUSER/<ext>/vmx/[busy|unavail]/vmxopts/dovm: vmoptions (if ext is dovm) |
|---|
| 240 | | ; /AMPUSER/<ext>/vmx/[busy|unavail]/vmxopts/timeout: vmoptions (if timeout) |
|---|
| 241 | | ; /AMPUSER/<ext>/vmx/[busy|unavail]/vmxopts/loops: vmoptions (if loops) |
|---|
| 242 | | ; /AMPUSER/<ext>/vmx/[busy|unavail]/timedest/ext: extension (if timeout) |
|---|
| 243 | | ; /AMPUSER/<ext>/vmx/[busy|unavail]/timedest/context: context (if timeout) |
|---|
| 244 | | ; /AMPUSER/<ext>/vmx/[busy|unavail]/timedest/pri: priority (if timeout) |
|---|
| 245 | | ; /AMPUSER/<ext>/vmx/[busy|unavail]/loopdest/ext: extension (if too many failures) |
|---|
| 246 | | ; /AMPUSER/<ext>/vmx/[busy|unavail]/loopdest/context: context (if too many failures) |
|---|
| 247 | | ; /AMPUSER/<ext>/vmx/[busy|unavail]/loopdest/pri: priority (if too many failures) |
|---|
| 248 | | ; /AMPUSER/<ext>/vmx/[busy|unavail]/[0-9*]/ext: extension (dovm for vm access) |
|---|
| 249 | | ; /AMPUSER/<ext>/vmx/[busy|unavail]/[0-9*]/context: context |
|---|
| 250 | | ; /AMPUSER/<ext>/vmx/[busy|unavail]/[0-9*]/pri: priority |
|---|
| 251 | | ;------------------------------------------------------------------------ |
|---|
| 267 | | |
|---|
| 268 | | |
|---|
| 269 | | ; If vmx not enabled for the current mode,then jump to normal voicemail behavior |
|---|
| 270 | | ; |
|---|
| 271 | | exten => vmx,1,Set(MODE=${IF($["${ARG2}"="BUSY"]?busy:unavail)}) |
|---|
| 272 | | exten => vmx,n,GotoIf($["${ARG2}" != "DIRECTDIAL"]?notdirect) |
|---|
| 273 | | exten => vmx,n,Set(MODE=${IF($["${REGEX("[b]" ${VM_DDTYPE})}" = "1"]?busy:${MODE})}) |
|---|
| 274 | | exten => vmx,n(notdirect),Noop(Checking if ext ${ARG1} is enabled: ${DB(AMPUSER/${ARG1}/vmx/${MODE}/state)}) |
|---|
| 275 | | exten => vmx,n,GotoIf($["${DB(AMPUSER/${ARG1}/vmx/${MODE}/state)}" != "enabled"]?s-${ARG2},1) |
|---|
| 276 | | |
|---|
| 277 | | ; If the required voicemail file does not exist, then abort and go to normal voicemail behavior |
|---|
| 278 | | ; TODO: figure out which is proper file (.wav or .WAV) and maybe find a better way |
|---|
| 279 | | ; |
|---|
| 280 | | exten => vmx,n,Macro(get-vmcontext,${ARG1}) |
|---|
| 281 | | exten => vmx,n(file),System(ls /var/spool/asterisk/voicemail/${VMCONTEXT}/${ARG1}/${MODE}.wav) |
|---|
| 282 | | |
|---|
| 283 | | ; Get the repeat, timeout and loop times to use if they are overriden form the global settings |
|---|
| 284 | | ; |
|---|
| 285 | | exten => vmx,n,Set(LOOPCOUNT=0) |
|---|
| 286 | | exten => vmx,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/repeat)}" = "0"]?vmxtime) |
|---|
| 287 | | exten => vmx,n,Set(VMX_REPEAT=${DB_RESULT}) |
|---|
| 288 | | exten => vmx,n(vmxtime),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/timeout)}" = "0"]?vmxloops) |
|---|
| 289 | | exten => vmx,n,Set(VMX_TIMEOUT=${DB_RESULT}) |
|---|
| 290 | | exten => vmx,n(vmxloops),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/loops)}" = "0"]?vmxanswer) |
|---|
| 291 | | exten => vmx,n,Set(VMX_LOOPS=${DB_RESULT}) |
|---|
| 292 | | exten => vmx,n(vmxanswer),Answer() |
|---|
| 293 | | |
|---|
| 294 | | ; Now play the users voicemail recording as the basis for their ivr, the Read command will repeat as needed and if it timesout |
|---|
| 295 | | ; then we go to the timeout. Otherwise handle invalid options by looping until the limit until a valid option is played. |
|---|
| 296 | | ; |
|---|
| 297 | | exten => vmx,n(loopstart),Read(ACTION,/var/spool/asterisk/voicemail/${VMCONTEXT}/${ARG1}/${MODE},1,skip,${VMX_REPEAT},${VMX_TIMEOUT}) |
|---|
| 298 | | exten => vmx,n,GotoIf($["${EXISTS(${ACTION})}" = "1"]?checkopt) |
|---|
| 299 | | |
|---|
| 300 | | ; If we are here we timed out, go to the required destination |
|---|
| 301 | | ; |
|---|
| 302 | | exten => vmx,n(noopt),Noop(Timeout: going to timeout dest) |
|---|
| 303 | | exten => vmx,n,Set(VMX_OPTS=${VMX_OPTS_TIMEOUT}) |
|---|
| 304 | | exten => vmx,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/vmxopts/timeout)}" = "0"]?chktime) |
|---|
| 305 | | exten => vmx,n,Set(VMX_OPTS=${DB_RESULT}) |
|---|
| 306 | | exten => vmx,n(chktime),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/timedest/ext)}" = "0"]?dotime) |
|---|
| 307 | | exten => vmx,n,Set(VMX_TIMEDEST_EXT=${DB_RESULT}) |
|---|
| 308 | | exten => vmx,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/timedest/context)}" = "0"]?timepri) |
|---|
| 309 | | exten => vmx,n,Set(VMX_TIMEDEST_CONTEXT=${DB_RESULT}) |
|---|
| 310 | | exten => vmx,n(timepri),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/timedest/pri)}" = "0"]?dotime) |
|---|
| 311 | | exten => vmx,n,Set(VMX_TIMEDEST_PRI=${DB_RESULT}) |
|---|
| 312 | | exten => vmx,n(dotime),Goto(${VMX_TIMEDEST_CONTEXT},${VMX_TIMEDEST_EXT},${VMX_TIMEDEST_PRI}) |
|---|
| 313 | | |
|---|
| 314 | | ; We got an option, check if the option is defined, or one of the system defaults |
|---|
| 315 | | ; |
|---|
| 316 | | exten => vmx,n(checkopt),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/${ACTION}/ext)}" = "1"]?doopt) |
|---|
| 317 | | exten => vmx,n,GotoIf($["${ACTION}" = "0"]?o,1) |
|---|
| 318 | | exten => vmx,n,GotoIf($["${ACTION}" = "*"]?adef,1) |
|---|
| 319 | | |
|---|
| 320 | | ; Got invalid option loop until the max |
|---|
| 321 | | ; |
|---|
| 322 | | exten => vmx,n,Set(LOOPCOUNT=$[${LOOPCOUNT} + 1]) |
|---|
| 323 | | exten => vmx,n,GotoIf($[${LOOPCOUNT} > ${VMX_LOOPS}]?toomany) |
|---|
| 324 | | exten => vmx,n,Playback(pm-invalid-option&please-try-again) |
|---|
| 325 | | exten => vmx,n,Goto(loopstart) |
|---|
| 326 | | |
|---|
| 327 | | ; tomany: to many invalid options, go to the specified destination |
|---|
| 328 | | ; |
|---|
| 329 | | exten => vmx,n(toomany),Noop(Too Many invalid entries, got to invalid dest) |
|---|
| 330 | | exten => vmx,n,Set(VMX_OPTS=${VMX_OPTS_LOOPS}) |
|---|
| 331 | | exten => vmx,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/vmxopts/loops)}" = "0"]?chkloop) |
|---|
| 332 | | exten => vmx,n,Set(VMX_OPTS=${DB_RESULT}) |
|---|
| 333 | | exten => vmx,n(chkloop),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/loopdest/ext)}" = "0"]?doloop) |
|---|
| 334 | | exten => vmx,n,Set(VMX_LOOPDEST_EXT=${DB_RESULT}) |
|---|
| 335 | | exten => vmx,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/loopdest/context)}" = "0"]?looppri) |
|---|
| 336 | | exten => vmx,n,Set(VMX_LOOPDEST_CONTEXT=${DB_RESULT}) ;TODO make configurable per above |
|---|
| 337 | | exten => vmx,n(looppri),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/loopdest/pri)}" = "0"]?doloop) |
|---|
| 338 | | exten => vmx,n,Set(VMX_LOOPDEST_PRI=${DB_RESULT}) ;TODO make configurable per above |
|---|
| 339 | | exten => vmx,n(doloop),Goto(${VMX_LOOPDEST_CONTEXT},${VMX_LOOPDEST_EXT},${VMX_LOOPDEST_PRI}) |
|---|
| 340 | | |
|---|
| 341 | | ; doopt: execute the valid option that was chosen |
|---|
| 342 | | ; |
|---|
| 343 | | exten => vmx,n(doopt),Noop(Got a valid option: ${DB_RESULT}) |
|---|
| 344 | | exten => vmx,n,Set(VMX_EXT=${DB_RESULT}) |
|---|
| 345 | | ; |
|---|
| 346 | | ; Special case, if this option was to go to voicemail, set options and go |
|---|
| 347 | | ; |
|---|
| 348 | | exten => vmx,n,GotoIf($["${VMX_EXT}" != "dovm"]?getdest) |
|---|
| 349 | | exten => vmx,n(vmxopts),Set(VMX_OPTS=${VMX_OPTS_DOVM}) |
|---|
| 350 | | exten => vmx,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/vmxopts/dovm)}" = "0"]?vmxdovm) |
|---|
| 351 | | exten => vmx,n(vmxopts),Set(VMX_OPTS=${DB_RESULT}) |
|---|
| 352 | | exten => vmx,n(vmxdovm),goto(dovm,1) |
|---|
| 353 | | ; |
|---|
| 354 | | ; General case, setup the goto destination and go there (no error checking, its up to the GUI's to assure |
|---|
| 355 | | ; reasonable values |
|---|
| 356 | | ; |
|---|
| 357 | | exten => vmx,n(getdest),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/${ACTION}/context)}" = "0"]?vmxpri) |
|---|
| 358 | | exten => vmx,n,Set(VMX_CONTEXT=${DB_RESULT}) |
|---|
| 359 | | exten => vmx,n(vmxpri),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/${ACTION}/pri)}" = "0"]?vmxgoto) |
|---|
| 360 | | exten => vmx,n,Set(VMX_PRI=${DB_RESULT}) |
|---|
| 361 | | exten => vmx,n(vmxgoto),Goto(${VMX_CONTEXT},${VMX_EXT},${VMX_PRI}) |
|---|
| 362 | | |
|---|
| 363 | | ; If the required voicemail file is not present, then revert to normal voicemail |
|---|
| 364 | | ; behavior treating as if it was not set |
|---|
| 365 | | ; |
|---|
| 366 | | exten => vmx,file+101,Noop(File for mode: ${MODE} does not exist, going to normal voicemail) |
|---|
| 367 | | exten => vmx,n,Goto(s-${ARG2},1) |
|---|
| 368 | | |
|---|
| 369 | | ; Drop into voicemail either as a direct destination (in which case VMX_OPTS might be set to something) or |
|---|
| 370 | | ; if the user timed out or broke out of the loop then VMX_OPTS is always cleared such that an Allison |
|---|
| 371 | | ; message is played and the caller know's what is going on. |
|---|
| 372 | | ; |
|---|
| 373 | | exten => dovm,1,Noop(VMX Timeout - go to voicemail) |
|---|
| 374 | | exten => dovm,n,Voicemail(${ARG1}@${VMCONTEXT}|${VMX_OPTS}${VMGAIN}) ; no flags, so allison plays please leave ... |
|---|
| 375 | | exten => dovm,n,Goto(exit-${VMSTATUS},1) |
|---|
| 1334 | | |
|---|
| 1335 | | ;------------------------------------------------------------------------ |
|---|
| 1336 | | |
|---|
| 1337 | | ;------------------------------------------------------------------------ |
|---|
| 1338 | | ; [findmefollow-ringallv2] |
|---|
| 1339 | | ;------------------------------------------------------------------------ |
|---|
| 1340 | | ; This context, to be included in from-internal, implements the PreRing part of findmefollow |
|---|
| 1341 | | ; as well as the GroupRing part. It also communicates between the two so that if DND is set |
|---|
| 1342 | | ; on the primary extension, and mastermode is enabled, then the other extensions will not ring |
|---|
| 1343 | | ; |
|---|
| 1344 | | ;------------------------------------------------------------------------ |
|---|
| 1345 | | [findmefollow-ringallv2] |
|---|
| 1346 | | exten => _FMPR-.,1,Noop(In FMPR ${FMGRP} with ${EXTEN:5}) |
|---|
| 1347 | | exten => _FMPR-.,n,Set(RingGroupMethod=) |
|---|
| 1348 | | exten => _FMPR-.,n,Set(USE_CONFIRMATION=) |
|---|
| 1349 | | exten => _FMPR-.,n,Set(RINGGROUP_INDEX=) |
|---|
| 1350 | | exten => _FMPR-.,n,Macro(simple-dial,${EXTEN:5},${FMREALPRERING}) |
|---|
| 1351 | | exten => _FMPR-.,n,GotoIf($["${DIALSTATUS}" != "BUSY"]?nodnd) |
|---|
| 1352 | | exten => _FMPR-.,n,Set(DB(FM/DND/${FMGRP}/${FMUNIQUE})=DND) |
|---|
| 1353 | | exten => _FMPR-.,n(nodnd),Noop(Ending FMPR ${FMGRP} with ${EXTEN:5} and dialstatus ${DIALSTATUS}) |
|---|
| 1354 | | exten => _FMPR-.,n,Hangup() |
|---|
| 1355 | | |
|---|
| 1356 | | exten => _FMGL-.,1,Noop(In FMGL ${FMGRP} with ${EXTEN:5}) |
|---|
| 1357 | | exten => _FMGL-.,n,GotoIf($["${DB(FM/DND/${FMGRP}/${FMUNIQUE})}" = "DND"]?dodnd) |
|---|
| 1358 | | exten => _FMGL-.,n,Wait(1) |
|---|
| 1359 | | exten => _FMGL-.,n,GotoIf($["${DB(FM/DND/${FMGRP}/${FMUNIQUE})}" = "DND"]?dodnd) |
|---|
| 1360 | | exten => _FMGL-.,n,Wait(1) |
|---|
| 1361 | | exten => _FMGL-.,n,GotoIf($["${DB(FM/DND/${FMGRP}/${FMUNIQUE})}" = "DND"]?dodnd) |
|---|
| 1362 | | exten => _FMGL-.,n,Wait(${FMPRERING}) |
|---|
| 1363 | | exten => _FMGL-.,n,GotoIf($["${DB(FM/DND/${FMGRP}/${FMUNIQUE})}" = "DND"]?dodnd) |
|---|
| 1364 | | exten => _FMGL-.,n,DBDel(FM/DND/${FMGRP}/${FMUNIQUE}) |
|---|
| 1365 | | exten => _FMGL-.,n(dodial),Macro(dial,${FMGRPTIME},${DIAL_OPTIONS},${EXTEN:5}) |
|---|
| 1366 | | exten => _FMGL-.,n,Noop(Ending FMGL ${FMGRP} with ${EXTEN:5} and dialstatus ${DIALSTATUS}) |
|---|
| 1367 | | exten => _FMGL-.,n,Hangup() |
|---|
| 1368 | | exten => _FMGL-.,n+10(dodnd),DBDel(FM/DND/${FMGRP}/${FMUNIQUE}) |
|---|
| 1369 | | exten => _FMGL-.,n,GotoIf($["${FMPRIME}" = "FALSE"]?dodial) |
|---|
| 1370 | | exten => _FMGL-.,n,Noop(Got DND in FMGL ${FMGRP} with ${EXTEN:5} in ${RingGroupMethod} mode, aborting) |
|---|
| 1371 | | exten => _FMGL-.,n,Hangup() |
|---|