<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=us-ascii">
<META content="MSHTML 6.00.2900.2627" name=GENERATOR></HEAD>
<BODY>
<DIV><SPAN class=426590822-16052005><FONT face=Arial size=2>My dial plan seems 
to work great - in that when I call extensions 1234 it connects to 1234.&nbsp; 
Strangely, after the call terminates (the other side hangs up first), Asterisk 
continues in the same context and then matches to extensions _. which causes an 
invalid extension error!</FONT></SPAN></DIV>
<DIV><SPAN class=426590822-16052005><FONT face=Arial 
size=2></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=426590822-16052005><FONT face=Arial size=2>Why does asterisk 
not leave the context (called internalmenu) after the remote hangup?&nbsp; 
Instead, it continues to the InternalInvalid context (included later in the 
InternalMenu context).&nbsp;&nbsp; I'm confused!</FONT></SPAN></DIV>
<DIV><SPAN class=426590822-16052005><FONT face=Arial 
size=2></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=426590822-16052005><FONT face=Arial size=2>Here is a snippet of 
the relevant context and macro.&nbsp; Thanks,</FONT></SPAN></DIV>
<DIV><SPAN class=426590822-16052005><FONT face=Arial 
size=2>Mike</FONT></SPAN></DIV><SPAN class=426590822-16052005><FONT face=Arial 
size=2>
<DIV>&nbsp;</DIV>
<DIV><BR>;****************************************************************<BR>; 
Macros<BR>;****************************************************************</DIV>
<DIV>&nbsp;</DIV>
<DIV>[macro-stdexten]<BR>;<BR>; Standard extension macro:<BR>;&nbsp;&nbsp; 
${ARG1} - Extension&nbsp; (we could have used ${MACRO_EXTEN} here as 
well<BR>;&nbsp;&nbsp; ${ARG2} - Device(s) to ring<BR>;<BR>exten =&gt; 
s,1,Playback(transfer,skip)&nbsp;&nbsp;; "Please hold while..." but skip if 
channel is not up<BR>;exten =&gt; s,2,SendText('Calling extension 
'${ARG1})&nbsp;; Tell the user what extension being called<BR>exten =&gt; 
s,2,SetVar(LastStatus=CallDone)&nbsp;; Ensure script knows that a Dial was 
completed<BR>exten =&gt; s,3,Dial(${ARG2},${RINGTIME},r)&nbsp;; Ring the 
interface, 20 seconds maximum<BR>exten =&gt; 
s,4,NoOp(${DIALSTATUS})&nbsp;&nbsp;; Show status after hangup<BR>exten =&gt; 
s,5,Goto(s-${DIALSTATUS},1)&nbsp;&nbsp;; Jump based on status 
(NOANSWER,BUSY,CHANUNAVAIL,CONGESTION,ANSWER)</DIV>
<DIV>&nbsp;</DIV>
<DIV>exten =&gt; s-NOANSWER,1,Voicemail(u${ARG1})&nbsp;; If unavailable, send to 
voicemail w/ unavail announce</DIV>
<DIV>&nbsp;</DIV>
<DIV>exten =&gt; s-BUSY,1,Voicemail(b${ARG1})&nbsp;&nbsp;; If busy, send to 
voicemail w/ busy announce</DIV>
<DIV>&nbsp;</DIV>
<DIV>exten =&gt; s-ANSWER,1,NoOp&nbsp;&nbsp;&nbsp;; If call answered, then do 
nothing after hangup</DIV>
<DIV>&nbsp;</DIV>
<DIV>exten =&gt; _s-.,1,Goto(s-NOANSWER,1)&nbsp;&nbsp;; Treat anything else as 
no answer</DIV>
<DIV>&nbsp;</DIV>
<DIV>exten =&gt; a,1,VoicemailMain(${ARG1})&nbsp;&nbsp;; If they press *, send 
the user into VoicemailMain</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV>;****************************************************************<BR>; 
Extensions available to all 
callers<BR>;****************************************************************<BR>[default]</DIV>
<DIV>&nbsp;</DIV>
<DIV>; Local extensions begin with 2XXX<BR>exten =&gt; 
${EXT_MIKE},1,Macro(stdexten,${EXTEN},${CON_MIKE})&nbsp;&nbsp;; Mike Stahl 
extension<BR>exten =&gt; 
${EXT_SPA1},1,Macro(stdexten,${EXTEN},${CON_SPA1})&nbsp;&nbsp;; SPA line 1 
extension<BR>exten =&gt; 
${EXT_SPA2},1,Macro(stdexten,${EXTEN},${CON_SPA2})&nbsp;&nbsp;; SPA line 2 
extension<BR>exten =&gt; 
${EXT_DIANA},1,Macro(fakeexten,${EXTEN},${CON_DIANA})&nbsp;&nbsp;; Diana Stahl 
extension<BR>exten =&gt; 
${EXT_KLAUS},1,Macro(stdexten,${EXTEN},${CON_KLAUS})&nbsp;&nbsp;; Klaus Stahl 
extension<BR>exten =&gt; 
${EXT_BOB},1,Macro(fakeexten,${EXTEN},${CON_BOB})&nbsp;&nbsp;; Bob Stahl 
extension<BR>exten =&gt; 
${EXT_BILL},1,Macro(fakeexten,${EXTEN},${CON_BILL})&nbsp;&nbsp;; Bill Stahl 
extension</DIV>
<DIV>&nbsp;</DIV>
<DIV>; Direct into voicemail system<BR>exten =&gt; 
${EXT_VOICEMAIL},1,VoicemailMain<BR>exten =&gt; ${EXT_VOICEMAIL},2,Hangup</DIV>
<DIV>&nbsp;</DIV>
<DIV>; Dial by name<BR>exten =&gt; 1,1,Directory(default)&nbsp;&nbsp;&nbsp;; 
Send user to the directory</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV>;****************************************************************<BR>; Menu 
available to internal callers - full 
access<BR>;****************************************************************<BR>[menuinternal]</DIV>
<DIV>&nbsp;</DIV>
<DIV>include =&gt; fwd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; Allow outbound access on 
FWD using 8 prefix<BR>include =&gt; trunkfullaccess&nbsp;&nbsp;&nbsp;; Allow 
full access to external line(s)<BR>include =&gt; 
default&nbsp;&nbsp;&nbsp;&nbsp;; Allow access to all extensions</DIV>
<DIV>&nbsp;</DIV>
<DIV>; Administration menu<BR>exten =&gt; 
${EXT_ADMIN},1,Goto(menuadmin,s,1)</DIV>
<DIV>&nbsp;</DIV>
<DIV>; After a message left, offer instruction what to do.<BR>; This menu is 
never reached INITIALLY if a specific extension is entered<BR>exten =&gt; 
s,1,GotoIf($["${LastStatus}" != "CallDone"] &amp; $["${LastStatus}" != 
""]?4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>exten =&gt; 
s,2,SetVar(LastStatus=Try1)<BR>exten =&gt; s,3,Goto(11)<BR>exten =&gt; 
s,4,GotoIf($["${LastStatus}" != 
"Try1"]?10)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>exten =&gt; 
s,5,SetVar(LastStatus=UserIdle)<BR>exten =&gt; s,6,Goto(11)<BR>exten =&gt; 
s,7,GotoIf($["${LastStatus}" != 
"InvalidExtension"]?13)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<BR>exten =&gt; s,8,SetVar(LastStatus=UserInvalid)<BR>exten =&gt; 
s,9,Goto(11)<BR>exten =&gt; s,10,SetVar(LastStatus=Error)<BR>exten =&gt; 
s,11,Background(ocg/enterextension)&nbsp;; PLAY enter the extension you wish to 
dial </DIV>
<DIV>&nbsp;</DIV>
<DIV>; "*" Repeat the previous menu<BR>exten =&gt; *,1,Goto(s,1)</DIV>
<DIV>&nbsp;</DIV>
<DIV>; "#" hangup <BR>exten =&gt; 
#,1,Goto(internalendcall,s,1)&nbsp;&nbsp;&nbsp;; End the call</DIV>
<DIV>&nbsp;</DIV>
<DIV>; If any other extension then say invalid (used only for initial connection 
to allow connection<BR>; instead of 403 error)<BR>include =&gt; 
internalinvalid</DIV>
<DIV>&nbsp;</DIV>
<DIV>; If they take too long, check if completed something useful (LastStatus) 
go back to menu, else timeout<BR>exten =&gt; t,1,GotoIf($["${LastStatus}" = 
"UserIdle"] | $["${LastStatus}" = "UserInvalid"] | $["${LastStatus}" = 
"Error"]?internalendcall,s,1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<BR>exten =&gt; t,2,Wait(RepeatMenuWaitTime)&nbsp;&nbsp;; Wait for seconds 
before playing menu after&nbsp; last command/event<BR>exten =&gt; 
t,3,Goto(s,1)&nbsp;&nbsp;&nbsp;&nbsp;; Go back to the main menu and repeat 
prompt</DIV>
<DIV>&nbsp;</DIV>
<DIV>; If they enter an invalid extension.&nbsp; Should only get here from 
_.,1<BR>exten =&gt; i,1,SetVar(LastStatus=InvalidExtension)<BR>exten =&gt; 
i,2,Background(pbx-invalid)&nbsp;&nbsp; ; "That's not valid, try again" 
<BR>exten =&gt; i,3,Wait(1) <BR>exten =&gt; i,4,Goto(s,1) </DIV>
<DIV>&nbsp;</DIV>
<DIV>; timeout overall<BR>exten =&gt; T,1,Goto(internalendcall,s,1)</DIV>
<DIV>&nbsp;</DIV>
<DIV>[internalinvalid]<BR>; This must be in a macro to ensure proper order of 
execution<BR>exten =&gt; _.,1,GotoIf($["${LastStatus}" = 
"CallDone"]?internalmenu,t,2)&nbsp;&nbsp; ; For some reason drop here after call 
done<BR>exten =&gt; _.,2,goto(menuinternal,i,1)&nbsp;&nbsp;; Why do we go here 
after last extensinon called hangup / noanswer</DIV>
<DIV>&nbsp;</DIV>
<DIV>[internalendcall]<BR>; End the call to the internal user<BR>exten =&gt; 
s,1,Playback(vm-goodbye)<BR>exten =&gt; s,2,hangup</DIV>
<DIV></FONT></SPAN>&nbsp;</DIV></BODY></HTML>