Guest User

Untitled

a guest
Oct 6th, 2017
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 174.14 KB | None | 0 0
  1. ;--------------------------------------------------------------------------------;
  2. ; Do NOT edit this file as it is auto-generated by FreePBX. ;
  3. ;--------------------------------------------------------------------------------;
  4. ; For information on adding additional paramaters to this file, please visit the ;
  5. ; FreePBX.org wiki page, or ask on IRC. This file was created by the new FreePBX ;
  6. ; BMO - Big Module Object. Any similarity in naming with BMO from Adventure Time ;
  7. ; is totally deliberate. ;
  8. ;--------------------------------------------------------------------------------;
  9. [globals]
  10. CFDEVSTATE = TRUE
  11. MIXMON_BEEP =
  12. DNDDEVSTATE = TRUE
  13. FMDEVSTATE = TRUE
  14. QUEDEVSTATE = TRUE
  15. OPERATOR_XTN =
  16. VM_DDTYPE = b
  17. VM_GAIN = 12
  18. VM_OPTS = s
  19. VMX_LOOPS = 1
  20. VMX_OPTS_DOVM =
  21. VMX_OPTS_LOOP =
  22. VMX_REPEAT = 1
  23. VMX_TIMEOUT = 2
  24. DYNAMIC_FEATURES = apprecord
  25. INTERCOMCODE = *80
  26. ASTETCDIR = /etc/asterisk
  27. ASTMODDIR = /usr/lib64/asterisk/modules
  28. ASTVARLIBDIR = /var/lib/asterisk
  29. ASTAGIDIR = /var/lib/asterisk/agi-bin
  30. ASTSPOOLDIR = /var/spool/asterisk
  31. ASTRUNDIR = /var/run/asterisk
  32. ASTLOGDIR = /var/log/asterisk
  33. CWINUSEBUSY = 1
  34. AMPMGRUSER = admin
  35. AMPMGRPASS = 75fe501e9f7a75119ce17b7cc0aed8d0
  36. ASTMANAGERHOST = localhost
  37. AMPDBENGINE = mysql
  38. AMPDBHOST = localhost
  39. AMPDBNAME = asterisk
  40. AMPDBUSER = freepbxuser
  41. AMPDBPASS = 2427d1fdf2d10f1d437a6b7ec12ba7a9
  42. AMPBIN = /var/lib/asterisk/bin
  43. VMX_CONTEXT = from-internal
  44. VMX_PRI = 1
  45. VMX_TIMEDEST_CONTEXT =
  46. VMX_TIMEDEST_EXT = dovm
  47. VMX_TIMEDEST_PRI = 1
  48. VMX_LOOPDEST_CONTEXT =
  49. VMX_LOOPDEST_EXT = dovm
  50. VMX_LOOPDEST_PRI = 1
  51. MIXMON_DIR =
  52. MIXMON_POST =
  53. DIAL_OPTIONS = Ttr
  54. TRUNK_OPTIONS = T
  55. TRUNK_RING_TIMER = 300
  56. MIXMON_FORMAT = wav
  57. REC_POLICY = caller
  58. RINGTIMER_DEFAULT = 15
  59. TRANSFER_CONTEXT = from-internal-xfer
  60. ASTVERSION = 13.17.0
  61. ASTCHANDAHDI = 1
  62. NULL = ""
  63. ALLOW_SIP_ANON = no
  64. SIPLANG = en
  65. #include globals_custom.conf
  66.  
  67. ;end of [globals]
  68.  
  69. [app-cf-toggle]
  70. include => app-cf-toggle-custom
  71. exten => lang-playback,1,GosubIf($[${DIALPLAN_EXISTS(app-cf-toggle,${CHANNEL(language)})}]?app-cf-toggle,${CHANNEL(language)},${ARG1}():app-cf-toggle,en,${ARG1}())
  72. exten => lang-playback,n,Return()
  73.  
  74. exten => *96,1,Answer
  75. exten => *96,n,Wait(1)
  76. exten => *96,n,Macro(user-callerid,)
  77. exten => *96,n,Set(fromext=${AMPUSER})
  78. exten => *96,n,GotoIf($["${DB(CF/${fromext})}" = ""]?activate:deactivate)
  79. exten => *96,n(activate),Read(toext,agent-newlocation,,,,)
  80. exten => *96,n,GotoIf($["${toext}"=""]?activate)
  81. exten => *96,n,Wait(1)
  82. exten => *96,n(toext),Set(DB(CF/${fromext})=${toext})
  83. exten => *96,n,Set(STATE=BUSY)
  84. exten => *96,n,Gosub(app-cf-toggle,sstate,1())
  85. exten => *96,n,Gosub(app-cf-toggle,lang-playback,1(hook_0))
  86. exten => *96,n,Macro(hangupcall,)
  87. exten => *96,n(setdirect),Answer
  88. exten => *96,n,Wait(1)
  89. exten => *96,n,Macro(user-callerid,)
  90. exten => *96,n,Goto(toext)
  91. exten => *96,n(deactivate),Noop(Deleting: CF/${fromext} ${DB_DELETE(CF/${fromext})})
  92. exten => *96,n,Set(STATE=NOT_INUSE)
  93. exten => *96,n,Gosub(app-cf-toggle,sstate,1())
  94. exten => *96,n(hook_off),Playback(call-fwd-unconditional&de-activated)
  95. exten => *96,n,Macro(hangupcall,)
  96.  
  97. exten => sstate,1,Set(DEVICE_STATE(Custom:CF${fromext})=${STATE})
  98. exten => sstate,n,Set(DEVICES=${DB(AMPUSER/${fromext}/device)})
  99. exten => sstate,n,GotoIf($["${DEVICES}" = "" ]?return)
  100. exten => sstate,n,Set(LOOPCNT=${FIELDQTY(DEVICES,&)})
  101. exten => sstate,n,Set(ITER=1)
  102. exten => sstate,n(begin),Set(DEVICE_STATE(Custom:DEVCF${CUT(DEVICES,&,${ITER})})=${STATE})
  103. exten => sstate,n,Set(ITER=$[${ITER} + 1])
  104. exten => sstate,n,GotoIf($[${ITER} <= ${LOOPCNT}]?begin)
  105. exten => sstate,n(return),Return()
  106.  
  107. exten => en,1(hook_0),Playback(call-fwd-unconditional&for&extension)
  108. exten => en,n,SayDigits(${fromext})
  109. exten => en,n,Playback(is-set-to)
  110. exten => en,n,SayDigits(${toext})
  111. exten => en,n,Return()
  112.  
  113. exten => ja,1(hook_0),Playback(extension)
  114. exten => ja,n,SayDigits(${fromext})
  115. exten => ja,n,Playback(jp-no&call-fwd-unconditional&jp-wo)
  116. exten => ja,n,SayDigits(${toext})
  117. exten => ja,n,Playback(is-set-to)
  118. exten => ja,n,Return()
  119.  
  120. ;--== end of [app-cf-toggle] ==--;
  121.  
  122.  
  123. [app-cf-busy-prompting-on]
  124. include => app-cf-busy-prompting-on-custom
  125. exten => lang-playback,1,GosubIf($[${DIALPLAN_EXISTS(app-cf-busy-prompting-on,${CHANNEL(language)})}]?app-cf-busy-prompting-on,${CHANNEL(language)},${ARG1}():app-cf-busy-prompting-on,en,${ARG1}())
  126. exten => lang-playback,n,Return()
  127.  
  128. exten => *94,1,Answer
  129. exten => *94,n,Wait(1)
  130. exten => *94,n,Macro(user-callerid,)
  131. exten => *94,n,Gosub(app-cf-busy-prompting-on,lang-playback,1(hook_0))
  132. exten => *94,n,Set(fromext=${IF($["${fromext}"=""]?${AMPUSER}:${fromext})})
  133. exten => *94,n,Wait(1)
  134. exten => *94,n(startread),Gosub(app-cf-busy-prompting-on,lang-playback,1(hook_1))
  135. exten => *94,n,Gosub(app-cf-busy-prompting-on,lang-playback,1(hook_2))
  136. exten => *94,n,Macro(hangupcall,)
  137.  
  138. exten => _*94.,1,Answer
  139. exten => _*94.,n,Wait(1)
  140. exten => _*94.,n,Macro(user-callerid,)
  141. exten => _*94.,n,Set(fromext=${AMPUSER})
  142. exten => _*94.,n,Set(toext=${EXTEN:3})
  143. exten => _*94.,n,Set(DB(CFB/${fromext})=${toext})
  144. exten => _*94.,n,Gosub(app-cf-busy-prompting-on,lang-playback,1(hook_3))
  145. exten => _*94.,n,Macro(hangupcall,)
  146.  
  147. exten => en,1(hook_0),Read(fromext,call-fwd-on-busy&please-enter-your-extension-then-press-pound,,,,)
  148. exten => en,n,Return()
  149. exten => en,n(hook_1),Read(toext,agent-newlocation,,,,)
  150. exten => en,n,GotoIf($["${toext}"=""]?hook_1)
  151. exten => en,n,Wait(1)
  152. exten => en,n,Set(DB(CFB/${fromext})=${toext})
  153. exten => en,n,Return()
  154. exten => en,n(hook_2),Playback(call-fwd-on-busy&for&extension)
  155. exten => en,n,SayDigits(${fromext})
  156. exten => en,n,Playback(is-set-to)
  157. exten => en,n,SayDigits(${toext})
  158. exten => en,n,Return()
  159. exten => en,n(hook_3),Playback(call-fwd-on-busy&for&extension)
  160. exten => en,n,SayDigits(${fromext})
  161. exten => en,n,Playback(is-set-to)
  162. exten => en,n,SayDigits(${toext})
  163. exten => en,n,Return()
  164.  
  165. exten => ja,1(hook_0),Read(fromext,call-fwd-on-busy&extension&please-enter-your&vm-press-pound,,,,)
  166. exten => ja,n,Return()
  167. exten => ja,n(hook_1),Read(toext,ent-target-attendant&then-press-pound,,,,)
  168. exten => ja,n,GotoIf($["${toext}"=""]?hook_1)
  169. exten => ja,n,Wait(1)
  170. exten => ja,n,Set(DB(CFB/${fromext})=${toext})
  171. exten => ja,n,Return()
  172. exten => ja,n(hook_2),Playback(extension)
  173. exten => ja,n,SayDigits(${fromext})
  174. exten => ja,n,Playback(jp-no&call-fwd-on-busy&jp-wo)
  175. exten => ja,n,SayDigits(${toext})
  176. exten => ja,n,Playback(is-set-to)
  177. exten => ja,n,Return()
  178. exten => ja,n(hook_3),Playback(extension)
  179. exten => ja,n,SayDigits(${fromext})
  180. exten => ja,n,Playback(jp-no&call-fwd-on-busy&jp-wo)
  181. exten => ja,n,SayDigits(${toext})
  182. exten => ja,n,Playback(is-set-to)
  183. exten => ja,n,Return()
  184.  
  185. ;--== end of [app-cf-busy-prompting-on] ==--;
  186.  
  187.  
  188. [app-cf-busy-on]
  189. include => app-cf-busy-on-custom
  190. exten => lang-playback,1,GosubIf($[${DIALPLAN_EXISTS(app-cf-busy-on,${CHANNEL(language)})}]?app-cf-busy-on,${CHANNEL(language)},${ARG1}():app-cf-busy-on,en,${ARG1}())
  191. exten => lang-playback,n,Return()
  192.  
  193. exten => *90,1,Answer
  194. exten => *90,n,Wait(1)
  195. exten => *90,n,Macro(user-callerid,)
  196. exten => *90,n,Set(fromext=${AMPUSER})
  197. exten => *90,n,GotoIf($["${fromext}"!=""]?startread)
  198. exten => *90,n,Playback(agent-loggedoff)
  199. exten => *90,n,Macro(hangupcall,)
  200. exten => *90,n(startread),Gosub(app-cf-busy-on,lang-playback,1(hook_1))
  201. exten => *90,n,Gosub(app-cf-busy-on,lang-playback,1(hook_2))
  202. exten => *90,n,Macro(hangupcall,)
  203.  
  204. exten => _*90.,1,Answer
  205. exten => _*90.,n,Wait(1)
  206. exten => _*90.,n,Macro(user-callerid,)
  207. exten => _*90.,n,Set(fromext=${AMPUSER})
  208. exten => _*90.,n,Set(toext=${EXTEN:3})
  209. exten => _*90.,n,Set(DB(CFB/${fromext})=${toext})
  210. exten => _*90.,n,Gosub(app-cf-busy-on,lang-playback,1(hook_3))
  211. exten => _*90.,n,Macro(hangupcall,)
  212.  
  213. exten => en,1(hook_0),Read(fromext,call-fwd-on-busy&please-enter-your-extension-then-press-pound,,,,)
  214. exten => en,n,Return()
  215. exten => en,n(hook_1),Read(toext,agent-newlocation,,,,)
  216. exten => en,n,GotoIf($["${toext}"=""]?hook_1)
  217. exten => en,n,Wait(1)
  218. exten => en,n,Set(DB(CFB/${fromext})=${toext})
  219. exten => en,n,Return()
  220. exten => en,n(hook_2),Playback(call-fwd-on-busy&for&extension)
  221. exten => en,n,SayDigits(${fromext})
  222. exten => en,n,Playback(is-set-to)
  223. exten => en,n,SayDigits(${toext})
  224. exten => en,n,Return()
  225. exten => en,n(hook_3),Playback(call-fwd-on-busy&for&extension)
  226. exten => en,n,SayDigits(${fromext})
  227. exten => en,n,Playback(is-set-to)
  228. exten => en,n,SayDigits(${toext})
  229. exten => en,n,Return()
  230.  
  231. exten => ja,1(hook_0),Read(fromext,call-fwd-on-busy&extension&please-enter-your&vm-press-pound,,,,)
  232. exten => ja,n,Return()
  233. exten => ja,n(hook_1),Read(toext,ent-target-attendant&then-press-pound,,,,)
  234. exten => ja,n,GotoIf($["${toext}"=""]?hook_1)
  235. exten => ja,n,Wait(1)
  236. exten => ja,n,Set(DB(CFB/${fromext})=${toext})
  237. exten => ja,n,Return()
  238. exten => ja,n(hook_2),Playback(extension)
  239. exten => ja,n,SayDigits(${fromext})
  240. exten => ja,n,Playback(jp-no&call-fwd-on-busy&jp-wo)
  241. exten => ja,n,SayDigits(${toext})
  242. exten => ja,n,Playback(is-set-to)
  243. exten => ja,n,Return()
  244. exten => ja,n(hook_3),Playback(extension)
  245. exten => ja,n,SayDigits(${fromext})
  246. exten => ja,n,Playback(jp-no&call-fwd-on-busy&jp-wo)
  247. exten => ja,n,SayDigits(${toext})
  248. exten => ja,n,Playback(is-set-to)
  249. exten => ja,n,Return()
  250.  
  251. ;--== end of [app-cf-busy-on] ==--;
  252.  
  253.  
  254. [app-cf-busy-off-any]
  255. include => app-cf-busy-off-any-custom
  256. exten => lang-playback,1,GosubIf($[${DIALPLAN_EXISTS(app-cf-busy-off-any,${CHANNEL(language)})}]?app-cf-busy-off-any,${CHANNEL(language)},${ARG1}():app-cf-busy-off-any,en,${ARG1}())
  257. exten => lang-playback,n,Return()
  258.  
  259. exten => *92,1,Answer
  260. exten => *92,n,Macro(user-callerid,)
  261. exten => *92,n,Wait(1)
  262. exten => *92,n,Gosub(app-cf-busy-off-any,lang-playback,1(hook_0))
  263. exten => *92,n,Set(fromext=${IF($["foo${fromext}"="foo"]?${AMPUSER}:${fromext})})
  264. exten => *92,n,Wait(1)
  265. exten => *92,n,Noop(Deleting: CFB/${fromext} ${DB_DELETE(CFB/${fromext})})
  266. exten => *92,n,Gosub(app-cf-busy-off-any,lang-playback,1(hook_1))
  267. exten => *92,n,Macro(hangupcall,)
  268.  
  269. exten => en,1(hook_0),Read(fromext,please-enter-your-extension-then-press-pound,,,,)
  270. exten => en,n,Return()
  271. exten => en,n(hook_1),Playback(call-fwd-on-busy&for&extension)
  272. exten => en,n,SayDigits(${fromext})
  273. exten => en,n,Playback(cancelled)
  274. exten => en,n,Return()
  275.  
  276. exten => ja,1(hook_0),Read(fromext,extension&please-enter-your&vm-press-pound,,,,)
  277. exten => ja,n,Return()
  278. exten => ja,n(hook_1),Playback(extension)
  279. exten => ja,n,SayDigits(${fromext})
  280. exten => ja,n,Playback(jp-no&call-fwd-on-busy&jp-wo)
  281. exten => ja,n,Playback(cancelled)
  282. exten => ja,n,Return()
  283.  
  284. ;--== end of [app-cf-busy-off-any] ==--;
  285.  
  286.  
  287. [app-cf-busy-off]
  288. include => app-cf-busy-off-custom
  289. exten => lang-playback,1,GosubIf($[${DIALPLAN_EXISTS(app-cf-busy-off,${CHANNEL(language)})}]?app-cf-busy-off,${CHANNEL(language)},${ARG1}():app-cf-busy-off,en,${ARG1}())
  290. exten => lang-playback,n,Return()
  291.  
  292. exten => *91,1,Answer
  293. exten => *91,n,Wait(1)
  294. exten => *91,n,Macro(user-callerid,)
  295. exten => *91,n,Set(fromext=${AMPUSER})
  296. exten => *91,n,Noop(Deleting: CFB/${fromext} ${DB_DELETE(CFB/${fromext})})
  297. exten => *91,n,Gosub(app-cf-busy-off,lang-playback,1(hook_0))
  298. exten => *91,n,Macro(hangupcall,)
  299.  
  300. exten => _*91.,1,Answer
  301. exten => _*91.,n,Wait(1)
  302. exten => _*91.,n,Macro(user-callerid,)
  303. exten => _*91.,n,Set(fromext=${EXTEN:3})
  304. exten => _*91.,n,Noop(Deleting: CFB/${fromext} ${DB_DELETE(CFB/${fromext})})
  305. exten => _*91.,n,Gosub(app-cf-busy-off,lang-playback,1(hook_1))
  306. exten => _*91.,n,Macro(hangupcall,)
  307.  
  308. exten => en,1(hook_0),Playback(call-fwd-on-busy&de-activated)
  309. exten => en,n,Return()
  310. exten => en,n(hook_1),Playback(call-fwd-on-busy&for&extension)
  311. exten => en,n,SayDigits(${fromext})
  312. exten => en,n,Playback(cancelled)
  313. exten => en,n,Return()
  314.  
  315. exten => ja,1(hook_0),Playback(call-fwd-on-busy&de-activated)
  316. exten => ja,n,Return()
  317. exten => ja,n(hook_1),Playback(extension)
  318. exten => ja,n,SayDigits(${fromext})
  319. exten => ja,n,Playback(jp-no&call-fwd-on-busy&jp-wo)
  320. exten => ja,n,Playback(cancelled)
  321. exten => ja,n,Return()
  322.  
  323. ;--== end of [app-cf-busy-off] ==--;
  324.  
  325.  
  326. [app-cf-off]
  327. include => app-cf-off-custom
  328. exten => lang-playback,1,GosubIf($[${DIALPLAN_EXISTS(app-cf-off,${CHANNEL(language)})}]?app-cf-off,${CHANNEL(language)},${ARG1}():app-cf-off,en,${ARG1}())
  329. exten => lang-playback,n,Return()
  330.  
  331. exten => *73,1,Answer
  332. exten => *73,n,Wait(1)
  333. exten => *73,n,Macro(user-callerid,)
  334. exten => *73,n,Set(fromext=${AMPUSER})
  335. exten => *73,n,Noop(Deleting: CF/${fromext} ${DB_DELETE(CF/${fromext})})
  336. exten => *73,n,Set(STATE=NOT_INUSE)
  337. exten => *73,n,Gosub(app-cf-off,sstate,1())
  338. exten => *73,n,Gosub(app-cf-off,lang-playback,1(hook_0))
  339. exten => *73,n,Macro(hangupcall,)
  340.  
  341. exten => _*73.,1,Answer
  342. exten => _*73.,n,Wait(1)
  343. exten => _*73.,n,Macro(user-callerid,)
  344. exten => _*73.,n,Set(fromext=${EXTEN:3})
  345. exten => _*73.,n,Noop(Deleting: CF/${fromext} ${DB_DELETE(CF/${fromext})})
  346. exten => _*73.,n,Set(STATE=NOT_INUSE)
  347. exten => _*73.,n,Gosub(app-cf-off,sstate,1())
  348. exten => _*73.,n,Gosub(app-cf-off,lang-playback,1(hook_1))
  349. exten => _*73.,n,Macro(hangupcall,)
  350.  
  351. exten => sstate,1,Set(DEVICE_STATE(Custom:CF${fromext})=${STATE})
  352. exten => sstate,n,Set(DEVICES=${DB(AMPUSER/${fromext}/device)})
  353. exten => sstate,n,GotoIf($["${DEVICES}" = "" ]?return)
  354. exten => sstate,n,Set(LOOPCNT=${FIELDQTY(DEVICES,&)})
  355. exten => sstate,n,Set(ITER=1)
  356. exten => sstate,n(begin),Set(DEVICE_STATE(Custom:DEVCF${CUT(DEVICES,&,${ITER})})=${STATE})
  357. exten => sstate,n,Set(ITER=$[${ITER} + 1])
  358. exten => sstate,n,GotoIf($[${ITER} <= ${LOOPCNT}]?begin)
  359. exten => sstate,n(return),Return()
  360.  
  361. exten => en,1(hook_0),Playback(call-fwd-unconditional&de-activated)
  362. exten => en,n,Return()
  363. exten => en,n(hook_1),Playback(call-fwd-unconditional&for&extension)
  364. exten => en,n,SayDigits(${fromext})
  365. exten => en,n,Playback(cancelled)
  366. exten => en,n,Return()
  367.  
  368. exten => ja,1(hook_0),Playback(call-fwd-unconditional&de-activated)
  369. exten => ja,n,Return()
  370. exten => ja,n(hook_1),Playback(extension)
  371. exten => ja,n,SayDigits(${fromext})
  372. exten => ja,n,Playback(jp-no&call-fwd-unconditional&jp-wo&cancelled)
  373. exten => ja,n,Return()
  374.  
  375. ;--== end of [app-cf-off] ==--;
  376.  
  377.  
  378. [app-cf-off-any]
  379. include => app-cf-off-any-custom
  380. exten => lang-playback,1,GosubIf($[${DIALPLAN_EXISTS(app-cf-off-any,${CHANNEL(language)})}]?app-cf-off-any,${CHANNEL(language)},${ARG1}():app-cf-off-any,en,${ARG1}())
  381. exten => lang-playback,n,Return()
  382.  
  383. exten => *74,1,Answer
  384. exten => *74,n,Macro(user-callerid,)
  385. exten => *74,n,Wait(1)
  386. exten => *74,n,Gosub(app-cf-off-any,lang-playback,1(hook_0))
  387. exten => *74,n,Set(fromext=${IF($["foo${fromext}"="foo"]?${AMPUSER}:${fromext})})
  388. exten => *74,n,Wait(1)
  389. exten => *74,n,Noop(Deleting: CF/${fromext} ${DB_DELETE(CF/${fromext})})
  390. exten => *74,n,Set(STATE=NOT_INUSE)
  391. exten => *74,n,Gosub(app-cf-off-any,sstate,1())
  392. exten => *74,n,Gosub(app-cf-off-any,lang-playback,1(hook_1))
  393. exten => *74,n,Macro(hangupcall,)
  394.  
  395. exten => sstate,1,Set(DEVICE_STATE(Custom:CF${fromext})=${STATE})
  396. exten => sstate,n,Set(DEVICES=${DB(AMPUSER/${fromext}/device)})
  397. exten => sstate,n,GotoIf($["${DEVICES}" = "" ]?return)
  398. exten => sstate,n,Set(LOOPCNT=${FIELDQTY(DEVICES,&)})
  399. exten => sstate,n,Set(ITER=1)
  400. exten => sstate,n(begin),Set(DEVICE_STATE(Custom:DEVCF${CUT(DEVICES,&,${ITER})})=${STATE})
  401. exten => sstate,n,Set(ITER=$[${ITER} + 1])
  402. exten => sstate,n,GotoIf($[${ITER} <= ${LOOPCNT}]?begin)
  403. exten => sstate,n(return),Return()
  404.  
  405. exten => en,1(hook_0),Read(fromext,please-enter-your-extension-then-press-pound,,,,)
  406. exten => en,n,Return()
  407. exten => en,n(hook_1),Playback(call-fwd-unconditional&for&extension)
  408. exten => en,n,SayDigits(${fromext})
  409. exten => en,n,Playback(cancelled)
  410. exten => en,n,Return()
  411.  
  412. exten => ja,1(hook_0),Read(fromext,extension&please-enter-your&vm-press-pound,,,,)
  413. exten => ja,n,Return()
  414. exten => ja,n(hook_1),Playback(extension)
  415. exten => ja,n,SayDigits(${fromext})
  416. exten => ja,n,Playback(jp-no&call-fwd-unconditional&jp-wo&cancelled)
  417. exten => ja,n,Return()
  418.  
  419. ;--== end of [app-cf-off-any] ==--;
  420.  
  421.  
  422. [app-cf-unavailable-prompt-on]
  423. include => app-cf-unavailable-prompt-on-custom
  424. exten => lang-playback,1,GosubIf($[${DIALPLAN_EXISTS(app-cf-unavailable-prompt-on,${CHANNEL(language)})}]?app-cf-unavailable-prompt-on,${CHANNEL(language)},${ARG1}():app-cf-unavailable-prompt-on,en,${ARG1}())
  425. exten => lang-playback,n,Return()
  426.  
  427. exten => *95,1,Answer
  428. exten => *95,n,Wait(1)
  429. exten => *95,n,Macro(user-callerid,)
  430. exten => *95,n,Gosub(app-cf-unavailable-prompt-on,lang-playback,1(hook_0))
  431. exten => *95,n,Set(fromext=${IF($["${fromext}"=""]?${AMPUSER}:${fromext})})
  432. exten => *95,n,Wait(1)
  433. exten => *95,n(startread),Gosub(app-cf-unavailable-prompt-on,lang-playback,1(hook_1))
  434. exten => *95,n,GotoIf($["${toext}"=""]?startread)
  435. exten => *95,n,Wait(1)
  436. exten => *95,n,Set(DB(CFU/${fromext})=${toext})
  437. exten => *95,n,Gosub(app-cf-unavailable-prompt-on,lang-playback,1(hook_2))
  438. exten => *95,n,Macro(hangupcall,)
  439.  
  440. exten => _*95.,1,Answer
  441. exten => _*95.,n,Wait(1)
  442. exten => _*95.,n,Macro(user-callerid,)
  443. exten => _*95.,n,Set(fromext=${AMPUSER})
  444. exten => _*95.,n,Set(toext=${EXTEN:3})
  445. exten => _*95.,n,Set(DB(CFU/${fromext})=${toext})
  446. exten => _*95.,n(startread),Gosub(app-cf-unavailable-prompt-on,lang-playback,1(hook_3))
  447. exten => _*95.,n,Macro(hangupcall,)
  448.  
  449. exten => en,1(hook_0),Read(fromext,call-fwd-no-ans&please-enter-your-extension-then-press-pound,,,,)
  450. exten => en,n,Return()
  451. exten => en,n(hook_1),Read(toext,agent-newlocation,,,,)
  452. exten => en,n,Return()
  453. exten => en,n(hook_2),Playback(call-fwd-no-ans&for&extension)
  454. exten => en,n,SayDigits(${fromext})
  455. exten => en,n,Playback(is-set-to)
  456. exten => en,n,SayDigits(${toext})
  457. exten => en,n,Return()
  458. exten => en,n(hook_3),Playback(call-fwd-no-ans&for&extension)
  459. exten => en,n,SayDigits(${fromext})
  460. exten => en,n,Playback(is-set-to)
  461. exten => en,n,SayDigits(${toext})
  462. exten => en,n,Return()
  463.  
  464. exten => ja,1(hook_0),Read(fromext,call-fwd-no-ans&extension&please-enter-your&vm-press-pound,,,,)
  465. exten => ja,n,Return()
  466. exten => ja,n(hook_1),Read(toext,ent-target-attendant&then-press-pound,,,,)
  467. exten => ja,n,Return()
  468. exten => ja,n(hook_2),Playback(extension)
  469. exten => ja,n,SayDigits(${fromext})
  470. exten => ja,n,Playback(jp-no&call-fwd-no-ans&jp-wo)
  471. exten => ja,n,SayDigits(${toext})
  472. exten => ja,n,Playback(is-set-to)
  473. exten => ja,n,Return()
  474. exten => ja,n(hook_3),Playback(extension)
  475. exten => ja,n,SayDigits(${fromext})
  476. exten => ja,n,Playback(jp-no&call-fwd-no-ans&jp-wo)
  477. exten => ja,n,SayDigits(${toext})
  478. exten => ja,n,Playback(is-set-to)
  479. exten => ja,n,Return()
  480.  
  481. ;--== end of [app-cf-unavailable-prompt-on] ==--;
  482.  
  483.  
  484. [app-cf-unavailable-on]
  485. include => app-cf-unavailable-on-custom
  486. exten => lang-playback,1,GosubIf($[${DIALPLAN_EXISTS(app-cf-unavailable-on,${CHANNEL(language)})}]?app-cf-unavailable-on,${CHANNEL(language)},${ARG1}():app-cf-unavailable-on,en,${ARG1}())
  487. exten => lang-playback,n,Return()
  488.  
  489. exten => *52,1,Answer
  490. exten => *52,n,Wait(1)
  491. exten => *52,n,Macro(user-callerid,)
  492. exten => *52,n,Set(fromext=${AMPUSER})
  493. exten => *52,n,GotoIf($["${fromext}"!=""]?startread)
  494. exten => *52,n,Playback(agent-loggedoff)
  495. exten => *52,n,Macro(hangupcall,)
  496. exten => *52,n(startread),Gosub(app-cf-unavailable-on,lang-playback,1(hook_1))
  497. exten => *52,n,GotoIf($["${toext}"=""]?startread)
  498. exten => *52,n,Wait(1)
  499. exten => *52,n,Set(DB(CFU/${fromext})=${toext})
  500. exten => *52,n,Gosub(app-cf-unavailable-on,lang-playback,1(hook_2))
  501. exten => *52,n,Macro(hangupcall,)
  502.  
  503. exten => _*52.,1,Answer
  504. exten => _*52.,n,Wait(1)
  505. exten => _*52.,n,Macro(user-callerid,)
  506. exten => _*52.,n,Set(fromext=${AMPUSER})
  507. exten => _*52.,n,Set(toext=${EXTEN:3})
  508. exten => _*52.,n,Set(DB(CFU/${fromext})=${toext})
  509. exten => _*52.,n(startread),Gosub(app-cf-unavailable-on,lang-playback,1(hook_3))
  510. exten => _*52.,n,Macro(hangupcall,)
  511.  
  512. exten => en,1(hook_0),Read(fromext,call-fwd-no-ans&please-enter-your-extension-then-press-pound,,,,)
  513. exten => en,n,Return()
  514. exten => en,n(hook_1),Read(toext,agent-newlocation,,,,)
  515. exten => en,n,Return()
  516. exten => en,n(hook_2),Playback(call-fwd-no-ans&for&extension)
  517. exten => en,n,SayDigits(${fromext})
  518. exten => en,n,Playback(is-set-to)
  519. exten => en,n,SayDigits(${toext})
  520. exten => en,n,Return()
  521. exten => en,n(hook_3),Playback(call-fwd-no-ans&for&extension)
  522. exten => en,n,SayDigits(${fromext})
  523. exten => en,n,Playback(is-set-to)
  524. exten => en,n,SayDigits(${toext})
  525. exten => en,n,Return()
  526.  
  527. exten => ja,1(hook_0),Read(fromext,call-fwd-no-ans&extension&please-enter-your&vm-press-pound,,,,)
  528. exten => ja,n,Return()
  529. exten => ja,n(hook_1),Read(toext,ent-target-attendant&then-press-pound,,,,)
  530. exten => ja,n,Return()
  531. exten => ja,n(hook_2),Playback(extension)
  532. exten => ja,n,SayDigits(${fromext})
  533. exten => ja,n,Playback(jp-no&call-fwd-no-ans&jp-wo)
  534. exten => ja,n,SayDigits(${toext})
  535. exten => ja,n,Playback(is-set-to)
  536. exten => ja,n,Return()
  537. exten => ja,n(hook_3),Playback(extension)
  538. exten => ja,n,SayDigits(${fromext})
  539. exten => ja,n,Playback(jp-no&call-fwd-no-ans&jp-wo)
  540. exten => ja,n,SayDigits(${toext})
  541. exten => ja,n,Playback(is-set-to)
  542. exten => ja,n,Return()
  543.  
  544. ;--== end of [app-cf-unavailable-on] ==--;
  545.  
  546.  
  547. [app-cf-unavailable-off]
  548. include => app-cf-unavailable-off-custom
  549. exten => lang-playback,1,GosubIf($[${DIALPLAN_EXISTS(app-cf-unavailable-off,${CHANNEL(language)})}]?app-cf-unavailable-off,${CHANNEL(language)},${ARG1}():app-cf-unavailable-off,en,${ARG1}())
  550. exten => lang-playback,n,Return()
  551.  
  552. exten => *53,1,Answer
  553. exten => *53,n,Wait(1)
  554. exten => *53,n,Macro(user-callerid,)
  555. exten => *53,n,Set(fromext=${AMPUSER})
  556. exten => *53,n,Noop(Deleting: CFU/${fromext} ${DB_DELETE(CFU/${fromext})})
  557. exten => *53,n,Gosub(app-cf-unavailable-off,lang-playback,1(hook_0))
  558. exten => *53,n,Macro(hangupcall,)
  559.  
  560. exten => _*53.,1,Answer
  561. exten => _*53.,n,Wait(1)
  562. exten => _*53.,n,Macro(user-callerid,)
  563. exten => _*53.,n,Set(fromext=${EXTEN:3})
  564. exten => _*53.,n,Noop(Deleting: CFU/${fromext} ${DB_DELETE(CFU/${fromext})})
  565. exten => _*53.,n,Gosub(app-cf-unavailable-off,lang-playback,1(hook_1))
  566. exten => _*53.,n,Macro(hangupcall,)
  567.  
  568. exten => en,1(hook_0),Playback(call-fwd-no-ans&de-activated)
  569. exten => en,n,Return()
  570. exten => en,n(hook_1),Playback(call-fwd-no-ans&for&extension)
  571. exten => en,n,SayDigits(${fromext})
  572. exten => en,n,Playback(cancelled)
  573. exten => en,n,Return()
  574.  
  575. exten => ja,1(hook_0),Playback(call-fwd-no-ans&de-activated)
  576. exten => ja,n,Return()
  577. exten => ja,n(hook_1),Playback(extension)
  578. exten => ja,n,SayDigits(${fromext})
  579. exten => ja,n,Playback(jp-no&call-fwd-no-ans&jp-wo)
  580. exten => ja,n,Playback(cancelled)
  581. exten => ja,n,Return()
  582.  
  583. ;--== end of [app-cf-unavailable-off] ==--;
  584.  
  585.  
  586. [app-cf-on]
  587. include => app-cf-on-custom
  588. exten => lang-playback,1,GosubIf($[${DIALPLAN_EXISTS(app-cf-on,${CHANNEL(language)})}]?app-cf-on,${CHANNEL(language)},${ARG1}():app-cf-on,en,${ARG1}())
  589. exten => lang-playback,n,Return()
  590.  
  591. exten => *72,1,Answer
  592. exten => *72,n,Wait(1)
  593. exten => *72,n,Macro(user-callerid,)
  594. exten => *72,n,Set(fromext=${AMPUSER})
  595. exten => *72,n,GotoIf($["${fromext}"!=""]?startread)
  596. exten => *72,n,Playback(agent-loggedoff)
  597. exten => *72,n,Macro(hangupcall,)
  598. exten => *72,n(startread),Gosub(app-cf-on,lang-playback,1(hook_1))
  599. exten => *72,n,GotoIf($["foo${toext}"="foo"]?startread)
  600. exten => *72,n,Wait(1)
  601. exten => *72,n,Set(DB(CF/${fromext})=${toext})
  602. exten => *72,n,Set(STATE=BUSY)
  603. exten => *72,n,Gosub(app-cf-on,sstate,1())
  604. exten => *72,n,Gosub(app-cf-on,lang-playback,1(hook_2))
  605. exten => *72,n,Macro(hangupcall,)
  606.  
  607. exten => _*72.,1,Answer
  608. exten => _*72.,n,Wait(1)
  609. exten => _*72.,n,Macro(user-callerid,)
  610. exten => _*72.,n,Set(fromext=${AMPUSER})
  611. exten => _*72.,n,Set(toext=${EXTEN:3})
  612. exten => _*72.,n,Set(DB(CF/${fromext})=${toext})
  613. exten => _*72.,n,Set(STATE=BUSY)
  614. exten => _*72.,n,Gosub(app-cf-on,sstate,1())
  615. exten => _*72.,n,Gosub(app-cf-on,lang-playback,1(hook_3))
  616. exten => _*72.,n,Macro(hangupcall,)
  617.  
  618. exten => sstate,1,Set(DEVICE_STATE(Custom:CF${fromext})=${STATE})
  619. exten => sstate,n,Set(DEVICES=${DB(AMPUSER/${fromext}/device)})
  620. exten => sstate,n,GotoIf($["${DEVICES}" = "" ]?return)
  621. exten => sstate,n,Set(LOOPCNT=${FIELDQTY(DEVICES,&)})
  622. exten => sstate,n,Set(ITER=1)
  623. exten => sstate,n(begin),Set(DEVICE_STATE(Custom:DEVCF${CUT(DEVICES,&,${ITER})})=${STATE})
  624. exten => sstate,n,Set(ITER=$[${ITER} + 1])
  625. exten => sstate,n,GotoIf($[${ITER} <= ${LOOPCNT}]?begin)
  626. exten => sstate,n(return),Return()
  627.  
  628. exten => en,1(hook_0),Read(fromext,call-fwd-unconditional&please-enter-your-extension-then-press-pound,,,,)
  629. exten => en,n,Return()
  630. exten => en,n(hook_1),Read(toext,agent-newlocation,,,,)
  631. exten => en,n,Return()
  632. exten => en,n(hook_2),Playback(call-fwd-unconditional&for&extension)
  633. exten => en,n,SayDigits(${fromext})
  634. exten => en,n,Playback(is-set-to)
  635. exten => en,n,SayDigits(${toext})
  636. exten => en,n,Return()
  637. exten => en,n(hook_3),Playback(call-fwd-unconditional&for&extension)
  638. exten => en,n,SayDigits(${fromext})
  639. exten => en,n,Playback(is-set-to)
  640. exten => en,n,SayDigits(${toext})
  641. exten => en,n,Return()
  642.  
  643. exten => ja,1(hook_0),Read(fromext,call-fwd-unconditional&extension&please-enter-your&vm-press-pound,,,,)
  644. exten => ja,n,Return()
  645. exten => ja,n(hook_1),Read(toext,ent-target-attendant&vm-press-pound,,,,)
  646. exten => ja,n,Return()
  647. exten => ja,n(hook_2),Playback(extension)
  648. exten => ja,n,SayDigits(${fromext})
  649. exten => ja,n,Playback(jp-no&call-fwd-unconditional&jp-wo)
  650. exten => ja,n,SayDigits(${toext})
  651. exten => ja,n,Playback(is-set-to)
  652. exten => ja,n,Return()
  653. exten => ja,n(hook_3),Playback(extension)
  654. exten => ja,n,SayDigits(${fromext})
  655. exten => ja,n,Playback(jp-no&call-fwd-unconditional&jp-wo)
  656. exten => ja,n,SayDigits(${toext})
  657. exten => ja,n,Playback(is-set-to)
  658. exten => ja,n,Return()
  659.  
  660. ;--== end of [app-cf-on] ==--;
  661.  
  662.  
  663. [app-cf-prompting-on]
  664. include => app-cf-prompting-on-custom
  665. exten => lang-playback,1,GosubIf($[${DIALPLAN_EXISTS(app-cf-prompting-on,${CHANNEL(language)})}]?app-cf-prompting-on,${CHANNEL(language)},${ARG1}():app-cf-prompting-on,en,${ARG1}())
  666. exten => lang-playback,n,Return()
  667.  
  668. exten => *93,1,Answer
  669. exten => *93,n,Wait(1)
  670. exten => *93,n,Macro(user-callerid,)
  671. exten => *93,n,Gosub(app-cf-prompting-on,lang-playback,1(hook_0))
  672. exten => *93,n,Set(fromext=${IF($["foo${fromext}"="foo"]?${AMPUSER}:${fromext})})
  673. exten => *93,n,Wait(1)
  674. exten => *93,n(startread),Gosub(app-cf-prompting-on,lang-playback,1(hook_1))
  675. exten => *93,n,GotoIf($["foo${toext}"="foo"]?startread)
  676. exten => *93,n,Wait(1)
  677. exten => *93,n,Set(DB(CF/${fromext})=${toext})
  678. exten => *93,n,Set(STATE=BUSY)
  679. exten => *93,n,Gosub(app-cf-prompting-on,sstate,1())
  680. exten => *93,n,Gosub(app-cf-prompting-on,lang-playback,1(hook_2))
  681. exten => *93,n,Macro(hangupcall,)
  682.  
  683. exten => _*93.,1,Answer
  684. exten => _*93.,n,Wait(1)
  685. exten => _*93.,n,Macro(user-callerid,)
  686. exten => _*93.,n,Set(fromext=${AMPUSER})
  687. exten => _*93.,n,Set(toext=${EXTEN:3})
  688. exten => _*93.,n,Set(DB(CF/${fromext})=${toext})
  689. exten => _*93.,n,Set(STATE=BUSY)
  690. exten => _*93.,n,Gosub(app-cf-prompting-on,sstate,1())
  691. exten => _*93.,n,Gosub(app-cf-prompting-on,lang-playback,1(hook_3))
  692. exten => _*93.,n,Macro(hangupcall,)
  693.  
  694. exten => sstate,1,Set(DEVICE_STATE(Custom:CF${fromext})=${STATE})
  695. exten => sstate,n,Set(DEVICES=${DB(AMPUSER/${fromext}/device)})
  696. exten => sstate,n,GotoIf($["${DEVICES}" = "" ]?return)
  697. exten => sstate,n,Set(LOOPCNT=${FIELDQTY(DEVICES,&)})
  698. exten => sstate,n,Set(ITER=1)
  699. exten => sstate,n(begin),Set(DEVICE_STATE(Custom:DEVCF${CUT(DEVICES,&,${ITER})})=${STATE})
  700. exten => sstate,n,Set(ITER=$[${ITER} + 1])
  701. exten => sstate,n,GotoIf($[${ITER} <= ${LOOPCNT}]?begin)
  702. exten => sstate,n(return),Return()
  703.  
  704. exten => en,1(hook_0),Read(fromext,call-fwd-unconditional&please-enter-your-extension-then-press-pound,,,,)
  705. exten => en,n,Return()
  706. exten => en,n(hook_1),Read(toext,agent-newlocation,,,,)
  707. exten => en,n,Return()
  708. exten => en,n(hook_2),Playback(call-fwd-unconditional&for&extension)
  709. exten => en,n,SayDigits(${fromext})
  710. exten => en,n,Playback(is-set-to)
  711. exten => en,n,SayDigits(${toext})
  712. exten => en,n,Return()
  713. exten => en,n(hook_3),Playback(call-fwd-unconditional&for&extension)
  714. exten => en,n,SayDigits(${fromext})
  715. exten => en,n,Playback(is-set-to)
  716. exten => en,n,SayDigits(${toext})
  717. exten => en,n,Return()
  718.  
  719. exten => ja,1(hook_0),Read(fromext,call-fwd-unconditional&extension&please-enter-your&vm-press-pound,,,,)
  720. exten => ja,n,Return()
  721. exten => ja,n(hook_1),Read(toext,ent-target-attendant&vm-press-pound,,,,)
  722. exten => ja,n,Return()
  723. exten => ja,n(hook_2),Playback(extension)
  724. exten => ja,n,SayDigits(${fromext})
  725. exten => ja,n,Playback(jp-no&call-fwd-unconditional&jp-wo)
  726. exten => ja,n,SayDigits(${toext})
  727. exten => ja,n,Playback(is-set-to)
  728. exten => ja,n,Return()
  729. exten => ja,n(hook_3),Playback(extension)
  730. exten => ja,n,SayDigits(${fromext})
  731. exten => ja,n,Playback(jp-no&call-fwd-unconditional&jp-wo)
  732. exten => ja,n,SayDigits(${toext})
  733. exten => ja,n,Playback(is-set-to)
  734. exten => ja,n,Return()
  735.  
  736. ;--== end of [app-cf-prompting-on] ==--;
  737.  
  738.  
  739. [ext-cf-hints]
  740. include => ext-cf-hints-custom
  741. exten => _*961000.,1,Set(toext=${EXTEN:7})
  742. exten => _*961000.,n,Goto(app-cf-toggle,*96,setdirect)
  743.  
  744. exten => _*961001.,1,Set(toext=${EXTEN:7})
  745. exten => _*961001.,n,Goto(app-cf-toggle,*96,setdirect)
  746.  
  747. exten => _*961002.,1,Set(toext=${EXTEN:7})
  748. exten => _*961002.,n,Goto(app-cf-toggle,*96,setdirect)
  749.  
  750. exten => _*961003.,1,Set(toext=${EXTEN:7})
  751. exten => _*961003.,n,Goto(app-cf-toggle,*96,setdirect)
  752.  
  753. exten => _*961004.,1,Set(toext=${EXTEN:7})
  754. exten => _*961004.,n,Goto(app-cf-toggle,*96,setdirect)
  755.  
  756. exten => _*968000.,1,Set(toext=${EXTEN:7})
  757. exten => _*968000.,n,Goto(app-cf-toggle,*96,setdirect)
  758.  
  759. exten => _*969000.,1,Set(toext=${EXTEN:7})
  760. exten => _*969000.,n,Goto(app-cf-toggle,*96,setdirect)
  761.  
  762. exten => _*96XXXX,1,Goto(app-cf-toggle,*96,1)
  763.  
  764. exten => _*96X.,hint,Custom:DEVCF${EXTEN:3}
  765. ;--== end of [ext-cf-hints] ==--;
  766.  
  767.  
  768. [sub-record-cancel]
  769. include => sub-record-cancel-custom
  770. exten => s,1,Return()
  771.  
  772. ;--== end of [sub-record-cancel] ==--;
  773.  
  774.  
  775. [sub-record-check]
  776. include => sub-record-check-custom
  777. exten => s,1,GotoIf($[${LEN(${FROMEXTEN})}]?initialized)
  778. exten => s,n,Set(__REC_STATUS=INITIALIZED)
  779. exten => s,n,Set(NOW=${EPOCH})
  780. exten => s,n,Set(__DAY=${STRFTIME(${NOW},,%d)})
  781. exten => s,n,Set(__MONTH=${STRFTIME(${NOW},,%m)})
  782. exten => s,n,Set(__YEAR=${STRFTIME(${NOW},,%Y)})
  783. exten => s,n,Set(__TIMESTR=${YEAR}${MONTH}${DAY}-${STRFTIME(${NOW},,%H%M%S)})
  784. exten => s,n,Set(__FROMEXTEN=${IF($[${LEN(${AMPUSER})}]?${AMPUSER}:${IF($[${LEN(${REALCALLERIDNUM})}]?${REALCALLERIDNUM}:unknown)})})
  785. exten => s,n,Set(__MON_FMT=${IF($["${MIXMON_FORMAT}"="wav49"]?WAV:${MIXMON_FORMAT})})
  786. exten => s,n(initialized),Noop(Recordings initialized)
  787. exten => s,n,ExecIf($[!${LEN(${ARG3})}]?Set(ARG3=dontcare))
  788. exten => s,n,Set(REC_POLICY_MODE_SAVE=${REC_POLICY_MODE})
  789. exten => s,n,ExecIf($["${BLINDTRANSFER}${ATTENDEDTRANSFER}" != ""]?Set(REC_STATUS=NO))
  790. exten => s,n(next),GotoIf($[${LEN(${ARG1})}]?checkaction)
  791. exten => s,n(recorderror),Playback(something-terribly-wrong,error)
  792. exten => s,n,Hangup
  793. exten => s,n(checkaction),GotoIf($[${DIALPLAN_EXISTS(sub-record-check,${ARG1})}]?sub-record-check,${ARG1},1)
  794. exten => s,n,Noop(Generic ${ARG1} Recording Check - ${FROMEXTEN} ${ARG2})
  795. exten => s,n,Gosub(recordcheck,1(${ARG3},${ARG1},${ARG2}))
  796. exten => s,n,Return()
  797.  
  798. exten => recordcheck,1,Noop(Starting recording check against ${ARG1})
  799. exten => recordcheck,n,Goto(${ARG1})
  800. exten => recordcheck,n(dontcare),Return()
  801. exten => recordcheck,n(always),Noop(Detected legacy "always" entry. Mapping to "force")
  802. exten => recordcheck,n(force),Set(__REC_POLICY_MODE=FORCE)
  803. exten => recordcheck,n,GotoIf($["${REC_STATUS}"!="RECORDING"]?startrec)
  804. exten => recordcheck,n,Return()
  805. exten => recordcheck,n(delayed),Noop(Detected legacy "delayed" entry. Mapping to "yes")
  806. exten => recordcheck,n(yes),ExecIf($["${REC_POLICY_MODE}" = "NEVER" | "${REC_POLICY_MODE}" = "NO" | "${REC_STATUS}" = "RECORDING"]?Return())
  807. exten => recordcheck,n,Set(__REC_POLICY_MODE=YES)
  808. exten => recordcheck,n,Goto(startrec)
  809. exten => recordcheck,n(no),Set(__REC_POLICY_MODE=NO)
  810. exten => recordcheck,n,Return()
  811. exten => recordcheck,n(never),Set(__REC_POLICY_MODE=NEVER)
  812. exten => recordcheck,n,Goto(stoprec)
  813. exten => recordcheck,n(startrec),Noop(Starting recording: ${ARG2}, ${ARG3})
  814. exten => recordcheck,n,Set(AUDIOHOOK_INHERIT(MixMonitor)=yes)
  815. exten => recordcheck,n,Set(__CALLFILENAME=${ARG2}-${ARG3}-${FROMEXTEN}-${TIMESTR}-${UNIQUEID})
  816. exten => recordcheck,n,MixMonitor(${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT},abi(LOCAL_MIXMON_ID)${MIXMON_BEEP},${MIXMON_POST})
  817. exten => recordcheck,n,Set(__MIXMON_ID=${LOCAL_MIXMON_ID})
  818. exten => recordcheck,n,Set(__RECORD_ID=${CHANNEL(name)})
  819. exten => recordcheck,n,Set(__REC_STATUS=RECORDING)
  820. exten => recordcheck,n,Set(CDR(recordingfile)=${CALLFILENAME}.${MON_FMT})
  821. exten => recordcheck,n,Return()
  822. exten => recordcheck,n(stoprec),Noop(Stopping recording: ${ARG2}, ${ARG3})
  823. exten => recordcheck,n,Set(__REC_STATUS=STOPPED)
  824. exten => recordcheck,n,System(${AMPBIN}/stoprecording.php "${CHANNEL(name)}")
  825. exten => recordcheck,n,Return()
  826.  
  827. exten => out,1,Noop(Outbound Recording Check from ${FROMEXTEN} to ${ARG2})
  828. exten => out,n,Set(RECMODE=${DB(AMPUSER/${FROMEXTEN}/recording/out/external)})
  829. exten => out,n,ExecIf($[!${LEN(${RECMODE})} | "${RECMODE}" = "dontcare"]?Goto(routewins))
  830. exten => out,n,ExecIf($["${ARG3}" = "never" | "${ARG3}" = "force"]?Goto(routewins))
  831. exten => out,n(extenwins),Gosub(recordcheck,1(${RECMODE},out,${ARG2}))
  832. exten => out,n,Return()
  833. exten => out,n(routewins),Gosub(recordcheck,1(${ARG3},out,${ARG2}))
  834. exten => out,n,Return()
  835.  
  836. exten => in,1,Noop(Inbound Recording Check to ${ARG2})
  837. exten => in,n,Set(FROMEXTEN=unknown)
  838. exten => in,n,ExecIf($[${LEN(${CALLERID(num)})}]?Set(FROMEXTEN=${CALLERID(num)}))
  839. exten => in,n,Gosub(recordcheck,1(${ARG3},in,${ARG2}))
  840. exten => in,n,Return()
  841.  
  842. exten => exten,1,Noop(Exten Recording Check between ${FROMEXTEN} and ${ARG2})
  843. exten => exten,n,Set(CALLTYPE=${IF($[${LEN(${FROM_DID})}]?external:internal)})
  844. exten => exten,n,ExecIf(${LEN(${CALLTYPE_OVERRIDE})}?Set(CALLTYPE=${CALLTYPE_OVERRIDE}))
  845. exten => exten,n,Set(CALLEE=${DB(AMPUSER/${ARG2}/recording/in/${CALLTYPE})})
  846. exten => exten,n,ExecIf($[!${LEN(${CALLEE})}]?Set(CALLEE=dontcare))
  847. exten => exten,n,GotoIf($["${CALLTYPE}"="external"]?callee)
  848. exten => exten,n,GotoIf($["${CALLEE}"="dontcare"]?caller)
  849. exten => exten,n,ExecIf($[${LEN(${DB(AMPUSER/${FROMEXTEN}/recording/priority)})}]?Set(CALLER_PRI=${DB(AMPUSER/${FROMEXTEN}/recording/priority)}):Set(CALLER_PRI=0))
  850. exten => exten,n,ExecIf($[${LEN(${DB(AMPUSER/${ARG2}/recording/priority)})}]?Set(CALLEE_PRI=${DB(AMPUSER/${ARG2}/recording/priority)}):Set(CALLEE_PRI=0))
  851. exten => exten,n,GotoIf($["${CALLER_PRI}"="${CALLEE_PRI}"]?${REC_POLICY}:${IF($[${CALLER_PRI}>${CALLEE_PRI}]?caller:callee)})
  852. exten => exten,n(callee),Gosub(recordcheck,1(${CALLEE},${CALLTYPE},${ARG2}))
  853. exten => exten,n,Return()
  854. exten => exten,n(caller),Set(RECMODE=${DB(AMPUSER/${FROMEXTEN}/recording/out/internal)})
  855. exten => exten,n,ExecIf($[!${LEN(${RECMODE})}]?Set(RECMODE=dontcare))
  856. exten => exten,n,ExecIf($["${RECMODE}"="dontcare"]?Set(RECMODE=${CALLEE}))
  857. exten => exten,n,Gosub(recordcheck,1(${RECMODE},${CALLTYPE},${ARG2}))
  858. exten => exten,n,Return()
  859.  
  860. exten => conf,1,Noop(Conference Recording Check ${FROMEXTEN} to ${ARG2})
  861. exten => conf,n,Gosub(recconf,1(${ARG2},${ARG2},${ARG3}))
  862. exten => conf,n,Return()
  863.  
  864. exten => page,1,Noop(Paging Recording Check ${FROMEXTEN} to ${ARG2})
  865. exten => page,n,GosubIf($["${REC_POLICY_MODE}"="always"]?recconf,1(${ARG2},${FROMEXTEN},${ARG3}))
  866. exten => page,n,Return()
  867.  
  868. exten => recconf,1,Noop(Setting up recording: ${ARG1}, ${ARG2}, ${ARG3})
  869. exten => recconf,n,Set(__CALLFILENAME=${IF($[${CONFBRIDGE_INFO(parties,${ARG2})}]?${DB(RECCONF/${ARG2})}:${ARG1}-${ARG2}-${ARG3}-${TIMESTR}-${UNIQUEID})})
  870. exten => recconf,n,ExecIf($[!${CONFBRIDGE_INFO(parties,${ARG2})}]?Set(DB(RECCONF/${ARG2})=${CALLFILENAME}))
  871. exten => recconf,n,Set(CONFBRIDGE(bridge,record_file)=${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT})
  872. exten => recconf,n,ExecIf($["${ARG3}"!="always"]?Return())
  873. exten => recconf,n,Set(CONFBRIDGE(bridge,record_conference)=yes)
  874. exten => recconf,n,Set(__REC_STATUS=RECORDING)
  875. exten => recconf,n,Set(CDR(recordingfile)=${IF($[${CONFBRIDGE_INFO(parties,${ARG2})}]?${CALLFILENAME}.${MON_FMT}:${CALLFILENAME}.${MON_FMT})})
  876. exten => recconf,n,Noop(${MIXMONITOR_FILENAME})
  877. exten => recconf,n,Set(CHANNEL(hangup_handler_push)=sub-record-hh-check,s,1)
  878. exten => recconf,n,Return()
  879.  
  880. exten => recq,1,Noop(Setting up recording: ${ARG1}, ${ARG2}, ${ARG3})
  881. exten => recq,n,Set(AUDIOHOOK_INHERIT(MixMonitor)=yes)
  882. exten => recq,n,Set(MONITOR_FILENAME=${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME})
  883. exten => recq,n,MixMonitor(${MONITOR_FILENAME}.${MON_FMT},${MONITOR_OPTIONS}${MIXMON_BEEP},${MIXMON_POST})
  884. exten => recq,n,Set(__REC_STATUS=RECORDING)
  885. exten => recq,n,Set(CDR(recordingfile)=${CALLFILENAME}.${MON_FMT})
  886. exten => recq,n,Return()
  887.  
  888. exten => parking,1,Noop(User ${ARG2} picked up a parked call)
  889. exten => parking,n,Set(USER=${ARG2})
  890. exten => parking,n,ExecIf($[!${LEN(${ARG2})}]?Set(USER=unknown))
  891. exten => parking,n,Set(RECMODE=${DB(AMPUSER/${ARG2}/recording/out/internal)})
  892. exten => parking,n,ExecIf($[!${LEN(${RECMODE})}]?Set(RECMODE=dontcare))
  893. exten => parking,n,Gosub(recordcheck,1(${RECMODE},parked,${USER}))
  894. exten => parking,n,Return()
  895.  
  896. ;--== end of [sub-record-check] ==--;
  897.  
  898.  
  899. [sub-record-hh-check]
  900. include => sub-record-hh-check-custom
  901. exten => _.,1,Noop(Callee: ${MIXMONITOR_FILENAME})
  902. exten => _.,n(exit),Return()
  903.  
  904. ;--== end of [sub-record-hh-check] ==--;
  905.  
  906.  
  907. [macro-one-touch-record]
  908. include => macro-one-touch-record-custom
  909. exten => s,1,Set(ONETOUCH_REC_SCRIPT_STATUS=)
  910. exten => s,n,System(${AMPBIN}/one_touch_record.php "${CHANNEL(name)}")
  911. exten => s,n,Noop(ONETOUCH_REC_SCRIPT_STATUS: [${ONETOUCH_REC_SCRIPT_STATUS}])
  912. exten => s,n,Noop(REC_STATUS: [${REC_STATUS}])
  913. exten => s,n,GotoIf($["${ONETOUCH_REC_SCRIPT_STATUS:0:6}"="DENIED"]?denied)
  914. exten => s,n,ExecIf($["${REC_STATUS}"="STOPPED"]?Playback(beep&beep))
  915. exten => s,n,GotoIf($["${REC_STATUS}"="STOPPED"]?end)
  916. exten => s,n,GotoIf($["${REC_STATUS}"="RECORDING"]?startrec)
  917. exten => s,n(startrec),MixMonitor(${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT},ai(LOCAL_MIXMON_ID)${MIXMON_BEEP},${MIXMON_POST})
  918. exten => s,n,ExecIf($["${REC_STATUS}"="RECORDING"]?Playback(beep))
  919. exten => s,n(denied),ExecIf($["${ONETOUCH_REC_SCRIPT_STATUS:0:6}"="DENIED"]?Playback(access-denied))
  920. exten => s,n(end),MacroExit()
  921.  
  922. ;--== end of [macro-one-touch-record] ==--;
  923.  
  924.  
  925. [app-callwaiting-cwoff]
  926. include => app-callwaiting-cwoff-custom
  927. exten => *71,1,Macro(user-callerid,)
  928. exten => *71,n,Set(CONNECTEDLINE(name-charset,i)=utf8)
  929. exten => *71,n,Set(CONNECTEDLINE(name,i)=Call Waiting: OFF)
  930. exten => *71,n,Set(CONNECTEDLINE(num,i)=${AMPUSER})
  931. exten => *71,n,Answer
  932. exten => *71,n,Wait(1)
  933. exten => *71,n,Noop(Deleting: CW/${AMPUSER} ${DB_DELETE(CW/${AMPUSER})})
  934. exten => *71,n(hook_1),Playback(call-waiting&de-activated)
  935. exten => *71,n,Macro(hangupcall,)
  936.  
  937. ;--== end of [app-callwaiting-cwoff] ==--;
  938.  
  939.  
  940. [app-callwaiting-cwon]
  941. include => app-callwaiting-cwon-custom
  942. exten => *70,1,Macro(user-callerid,)
  943. exten => *70,n,Set(CONNECTEDLINE(name-charset,i)=utf8)
  944. exten => *70,n,Set(CONNECTEDLINE(name,i)=Call Waiting: ON)
  945. exten => *70,n,Set(CONNECTEDLINE(num,i)=${AMPUSER})
  946. exten => *70,n,Answer
  947. exten => *70,n,Wait(1)
  948. exten => *70,n,Set(DB(CW/${AMPUSER})=ENABLED)
  949. exten => *70,n(hook_1),Playback(call-waiting&activated)
  950. exten => *70,n,Macro(hangupcall,)
  951.  
  952. ;--== end of [app-callwaiting-cwon] ==--;
  953.  
  954.  
  955. [cidlookup]
  956. include => cidlookup-custom
  957. exten => cidlookup_return,1,ExecIf($["${DB(cidname/${CALLERID(num)})}" != ""]?Set(CALLERID(name)=${DB(cidname/${CALLERID(num)})}))
  958. exten => cidlookup_return,n,Return()
  959.  
  960. ;--== end of [cidlookup] ==--;
  961.  
  962.  
  963. [c-x-3-operator-panel-hold]
  964. include => c-x-3-operator-panel-hold-custom
  965. exten => 432111,1,MusicOnHold(${XMLNamespaceMusicOnHoldClass})
  966. exten => 432111,n,Hangup
  967.  
  968. ;--== end of [c-x-3-operator-panel-hold] ==--;
  969.  
  970.  
  971. [c-x-3-operator-panel-voice-mail]
  972. include => c-x-3-operator-panel-voice-mail-custom
  973. exten => 432112,1,VoiceMail(${XMLNamespaceVoiceMailBox}@${XMLNamespaceVoiceMailBoxContext},u)
  974. exten => 432112,n,Hangup
  975.  
  976. ;--== end of [c-x-3-operator-panel-voice-mail] ==--;
  977.  
  978.  
  979. [c-x-3-operator-panel-meetme]
  980. include => c-x-3-operator-panel-meetme-custom
  981. exten => 432113,1,ConfBridge(${XMLNamespaceMeetMeRoomNumber},${XMLNamespaceMeetMeRoomOptions},,)
  982. exten => 432113,n,Hangup
  983.  
  984. ;--== end of [c-x-3-operator-panel-meetme] ==--;
  985.  
  986.  
  987. [c-x-3-operator-panel-confbridge]
  988. include => c-x-3-operator-panel-confbridge-custom
  989. exten => 432113,1,ConfBridge(${XMLNamespaceMeetMeRoomNumber},,,)
  990. exten => 432113,n,Hangup
  991.  
  992. ;--== end of [c-x-3-operator-panel-confbridge] ==--;
  993.  
  994.  
  995. [c-x-3-operator-panel-park]
  996. include => c-x-3-operator-panel-park-custom
  997. exten => 432114,1,ParkAndAnnounce(pbx-transfer:PARKED,200,Local/432116@c-x-3-operator-panel-park-announce-answer,${XMLNamespaceParkContext},${XMLNamespaceParkExtension},1)
  998. exten => 432114,n,Hangup
  999.  
  1000. ;--== end of [c-x-3-operator-panel-park] ==--;
  1001.  
  1002.  
  1003. [c-x-3-operator-panel-park-announce-answer]
  1004. include => c-x-3-operator-panel-park-announce-answer-custom
  1005. exten => 432116,1,Answer
  1006. exten => 432116,n,Hangup
  1007.  
  1008. ;--== end of [c-x-3-operator-panel-park-announce-answer] ==--;
  1009.  
  1010.  
  1011. [c-x-3-operator-panel-listen-to-voice-mail]
  1012. include => c-x-3-operator-panel-listen-to-voice-mail-custom
  1013. exten => 432115,1,ControlPlayback(${XMLNamespaceVoiceMailPath},1000,*,#,7,8,9)
  1014. exten => 432115,n,Hangup
  1015.  
  1016. ;--== end of [c-x-3-operator-panel-listen-to-voice-mail] ==--;
  1017.  
  1018.  
  1019. [c-x-3-operator-panel-listen-to-recording]
  1020. include => c-x-3-operator-panel-listen-to-recording-custom
  1021. exten => 432118,1,ControlPlayback(${XMLNamespaceRecordingPath},1000,*,#,7,8,9)
  1022. exten => 432118,n,Hangup
  1023.  
  1024. ;--== end of [c-x-3-operator-panel-listen-to-recording] ==--;
  1025.  
  1026.  
  1027. [c-x-3-operator-panel-spy]
  1028. include => c-x-3-operator-panel-spy-custom
  1029. exten => 432117,1,ChanSpy(${XMLNamespaceChanSpyChannel},${XMLNamespaceChanSpyOptions})
  1030. exten => 432117,n,Hangup
  1031.  
  1032. ;--== end of [c-x-3-operator-panel-spy] ==--;
  1033.  
  1034.  
  1035. [c-x-3-operator-panel-pjsip-auto-answer-headers]
  1036. include => c-x-3-operator-panel-pjsip-auto-answer-headers-custom
  1037. exten => addheader,1,Set(PJSIP_HEADER(add,Alert-Info)=<http://www.notused.com>\;info=alert-autoanswer\;delay=0)
  1038. exten => addheader,n,Set(PJSIP_HEADER(add,Alert-Info)=Ring Answer)
  1039. exten => addheader,n,Set(PJSIP_HEADER(add,Alert-Info)=ring-answer)
  1040. exten => addheader,n,Set(PJSIP_HEADER(add,Call-Info)=\;answer-after=0)
  1041.  
  1042. ;--== end of [c-x-3-operator-panel-pjsip-auto-answer-headers] ==--;
  1043.  
  1044.  
  1045. [c-x-3-operator-panel-pjsip-auto-answer-redirect]
  1046. include => c-x-3-operator-panel-pjsip-auto-answer-redirect-custom
  1047. exten => _X!,1,ExecIf($["${D_OPTIONS}"==""]?Set(D_OPTIONS=TtrI))
  1048. exten => _X!,n,Dial(${CX_AUTOANSWER_REDIRECT_PEER},,${D_OPTIONS}b(c-x-3-operator-panel-pjsip-auto-answer-headers^addheader^1))
  1049.  
  1050. ;--== end of [c-x-3-operator-panel-pjsip-auto-answer-redirect] ==--;
  1051.  
  1052.  
  1053. [app-dictate-record]
  1054. include => app-dictate-record-custom
  1055. exten => *34,1,Answer
  1056. exten => *34,n,Macro(user-callerid,)
  1057. exten => *34,n,Noop(CallerID is ${AMPUSER})
  1058. exten => *34,n,Set(DICTENABLED=${DB(AMPUSER/${AMPUSER}/dictate/enabled)})
  1059. exten => *34,n,GotoIf($[$["x${DICTENABLED}"="x"]|$["x${DICTENABLED}"="xdisabled"]]?nodict:dictok)
  1060. exten => *34,n(nodict),Playback(feature-not-avail-line)
  1061. exten => *34,n,Hangup
  1062. exten => *34,n(dictok),Dictate(/var/lib/asterisk/sounds/dictate/${AMPUSER})
  1063. exten => *34,n,Macro(hangupcall,)
  1064.  
  1065. ;--== end of [app-dictate-record] ==--;
  1066.  
  1067.  
  1068. [app-dictate-send]
  1069. include => app-dictate-send-custom
  1070. exten => *35,1,Answer
  1071. exten => *35,n,Macro(user-callerid,)
  1072. exten => *35,n,Noop(CallerID is ${AMPUSER})
  1073. exten => *35,n,Set(DICTENABLED=${DB(AMPUSER/${AMPUSER}/dictate/enabled)})
  1074. exten => *35,n,GotoIf($[$["x${DICTENABLED}"="x"]|$["x${DICTENABLED}"="xdisabled"]]?nodict:dictok)
  1075. exten => *35,n(nodict),Playback(feature-not-avail-line)
  1076. exten => *35,n,Hangup
  1077. exten => *35,n(dictok),Read(DICTFILE,enter-filename-short,,,,)
  1078. exten => *35,n,Set(DICTEMAIL=${DB(AMPUSER/${AMPUSER}/dictate/email)})
  1079. exten => *35,n,Set(DICTFMT=${DB(AMPUSER/${AMPUSER}/dictate/format)})
  1080. exten => *35,n,Set(DICTFROM=${DB(AMPUSER/${AMPUSER}/dictate/from)})
  1081. exten => *35,n,Set(NAME=${DB(AMPUSER/${AMPUSER}/cidname)})
  1082. exten => *35,n,Playback(dictation-being-processed)
  1083. exten => *35,n,System(/var/lib/asterisk/bin/audio-email.pl --file /var/lib/asterisk/sounds/dictate/${AMPUSER}/${DICTFILE}.raw --attachment dict-${DICTFILE} --format ${DICTFMT} --to ${DICTEMAIL} --from ${DICTFROM} --subject "Dictation from ${NAME} Attached")
  1084. exten => *35,n,Playback(dictation-sent)
  1085. exten => *35,n,Macro(hangupcall,)
  1086.  
  1087. ;--== end of [app-dictate-send] ==--;
  1088.  
  1089.  
  1090. [disa-dial]
  1091. include => disa-dial-custom
  1092. exten => _[0-9a-zA-Z],1,Noop(called ${EXTEN} in ${DISACONTEXT} by ID: ${CUT(DISA,^,2)})
  1093. exten => _[0-9a-zA-Z],n,Dial(Local/${EXTEN}@${DISACONTEXT},300,${HANGUP})
  1094. exten => _[0-9a-zA-Z],n,Gosub(s-${DIALSTATUS},1())
  1095. exten => _[0-9a-zA-Z],n,Goto(${CUT(DISA,^,1)},${CUT(DISA,^,2)},${CUT(DISA,^,3)})
  1096.  
  1097. exten => _[0-9a-zA-Z*#].,1,Noop(called ${EXTEN} in ${DISACONTEXT} by ID: ${CUT(DISA,^,2)})
  1098. exten => _[0-9a-zA-Z*#].,n,Dial(Local/${EXTEN}@${DISACONTEXT},300,${HANGUP})
  1099. exten => _[0-9a-zA-Z*#].,n,Gosub(s-${DIALSTATUS},1())
  1100. exten => _[0-9a-zA-Z*#].,n,Goto(${CUT(DISA,^,1)},${CUT(DISA,^,2)},${CUT(DISA,^,3)})
  1101.  
  1102. exten => s-ANSWER,1,Return()
  1103.  
  1104. exten => s-CANCEL,1,Return()
  1105.  
  1106. exten => s-BUSY,1,Playtones(busy)
  1107. exten => s-BUSY,n,Wait(3)
  1108. exten => s-BUSY,n,Return()
  1109.  
  1110. exten => _s-.,1,Noop(DISA Dial failed due to ${DIALSTATUS} - returning to dial tone)
  1111. exten => _s-.,n,Playtones(congestion)
  1112. exten => _s-.,n,Wait(3)
  1113. exten => _s-.,n,StopPlaytones
  1114. exten => _s-.,n,Return()
  1115.  
  1116. ;--== end of [disa-dial] ==--;
  1117.  
  1118.  
  1119. [app-dnd-off]
  1120. include => app-dnd-off-custom
  1121. exten => *79,1,Macro(user-callerid,)
  1122. exten => *79,n,Set(CONNECTEDLINE(name-charset,i)=utf8)
  1123. exten => *79,n,Set(CONNECTEDLINE(name,i)=Do Not Disturb: OFF)
  1124. exten => *79,n,Set(CONNECTEDLINE(num,i)=${AMPUSER})
  1125. exten => *79,n,Answer
  1126. exten => *79,n,Wait(1)
  1127. exten => *79,n,Noop(Deleting: DND/${AMPUSER} ${DB_DELETE(DND/${AMPUSER})})
  1128. exten => *79,n,Set(STATE=NOT_INUSE)
  1129. exten => *79,n,Gosub(app-dnd-off,sstate,1())
  1130. exten => *79,n(hook_1),Playback(do-not-disturb&de-activated)
  1131. exten => *79,n,Macro(hangupcall,)
  1132.  
  1133. exten => sstate,1,Set(DEVICE_STATE(Custom:DND${AMPUSER})=${STATE})
  1134. exten => sstate,n,Set(DEVICES=${DB(AMPUSER/${AMPUSER}/device)})
  1135. exten => sstate,n,GotoIf($["${DEVICES}" = "" ]?return)
  1136. exten => sstate,n,Set(LOOPCNT=${FIELDQTY(DEVICES,&)})
  1137. exten => sstate,n,Set(ITER=1)
  1138. exten => sstate,n(begin),Set(DEVICE_STATE(Custom:DEVDND${CUT(DEVICES,&,${ITER})})=${STATE})
  1139. exten => sstate,n,Set(ITER=$[${ITER} + 1])
  1140. exten => sstate,n,GotoIf($[${ITER} <= ${LOOPCNT}]?begin)
  1141. exten => sstate,n(return),Return()
  1142.  
  1143. ;--== end of [app-dnd-off] ==--;
  1144.  
  1145.  
  1146. [app-dnd-on]
  1147. include => app-dnd-on-custom
  1148. exten => *78,1,Macro(user-callerid,)
  1149. exten => *78,n,Set(CONNECTEDLINE(name-charset,i)=utf8)
  1150. exten => *78,n,Set(CONNECTEDLINE(name,i)=Do Not Disturb: ON)
  1151. exten => *78,n,Set(CONNECTEDLINE(num,i)=${AMPUSER})
  1152. exten => *78,n,Answer
  1153. exten => *78,n,Wait(1)
  1154. exten => *78,n,Set(DB(DND/${AMPUSER})=YES)
  1155. exten => *78,n,Set(STATE=BUSY)
  1156. exten => *78,n,Gosub(app-dnd-on,sstate,1())
  1157. exten => *78,n(hook_1),Playback(do-not-disturb&activated)
  1158. exten => *78,n,Macro(hangupcall,)
  1159.  
  1160. exten => sstate,1,Set(DEVICE_STATE(Custom:DND${AMPUSER})=${STATE})
  1161. exten => sstate,n,Set(DEVICES=${DB(AMPUSER/${AMPUSER}/device)})
  1162. exten => sstate,n,GotoIf($["${DEVICES}" = "" ]?return)
  1163. exten => sstate,n,Set(LOOPCNT=${FIELDQTY(DEVICES,&)})
  1164. exten => sstate,n,Set(ITER=1)
  1165. exten => sstate,n(begin),Set(DEVICE_STATE(Custom:DEVDND${CUT(DEVICES,&,${ITER})})=${STATE})
  1166. exten => sstate,n,Set(ITER=$[${ITER} + 1])
  1167. exten => sstate,n,GotoIf($[${ITER} <= ${LOOPCNT}]?begin)
  1168. exten => sstate,n(return),Return()
  1169.  
  1170. ;--== end of [app-dnd-on] ==--;
  1171.  
  1172.  
  1173. [app-dnd-toggle]
  1174. include => app-dnd-toggle-custom
  1175. exten => *76,1,Macro(user-callerid,)
  1176. exten => *76,n,ExecIf($["${DB(DND/${AMPUSER})}" = ""]?Set(STATE=ON):Set(STATE=OFF))
  1177. exten => *76,n,Set(CONNECTEDLINE(name-charset,i)=utf8)
  1178. exten => *76,n,Set(CONNECTEDLINE(name,i)=Do Not Disturb: ${STATE})
  1179. exten => *76,n,Set(CONNECTEDLINE(num,i)=${AMPUSER})
  1180. exten => *76,n,Answer
  1181. exten => *76,n,Wait(1)
  1182. exten => *76,n,GotoIf($["${DB(DND/${AMPUSER})}" = ""]?activate:deactivate)
  1183. exten => *76,n(activate),Set(DB(DND/${AMPUSER})=YES)
  1184. exten => *76,n,Set(STATE=BUSY)
  1185. exten => *76,n,Gosub(app-dnd-toggle,sstate,1())
  1186. exten => *76,n(hook_on),Playback(do-not-disturb&activated)
  1187. exten => *76,n,Macro(hangupcall,)
  1188. exten => *76,n(deactivate),Noop(Deleting: DND/${AMPUSER} ${DB_DELETE(DND/${AMPUSER})})
  1189. exten => *76,n,Set(STATE=NOT_INUSE)
  1190. exten => *76,n,Gosub(app-dnd-toggle,sstate,1())
  1191. exten => *76,n(hook_off),Playback(do-not-disturb&de-activated)
  1192. exten => *76,n,Macro(hangupcall,)
  1193.  
  1194. exten => sstate,1,Set(DEVICE_STATE(Custom:DND${AMPUSER})=${STATE})
  1195. exten => sstate,n,Set(DEVICES=${DB(AMPUSER/${AMPUSER}/device)})
  1196. exten => sstate,n,GotoIf($["${DEVICES}" = "" ]?return)
  1197. exten => sstate,n,Set(LOOPCNT=${FIELDQTY(DEVICES,&)})
  1198. exten => sstate,n,Set(ITER=1)
  1199. exten => sstate,n(begin),Set(DEVICE_STATE(Custom:DEVDND${CUT(DEVICES,&,${ITER})})=${STATE})
  1200. exten => sstate,n,Set(ITER=$[${ITER} + 1])
  1201. exten => sstate,n,GotoIf($[${ITER} <= ${LOOPCNT}]?begin)
  1202. exten => sstate,n(return),Return()
  1203.  
  1204. ;--== end of [app-dnd-toggle] ==--;
  1205.  
  1206.  
  1207. [ext-dnd-hints]
  1208. include => ext-dnd-hints-custom
  1209. exten => _*76X.,1,Goto(app-dnd-toggle,*76,1)
  1210. exten => _*76X.,hint,Custom:DEVDND${EXTEN:3}
  1211.  
  1212. ;--== end of [ext-dnd-hints] ==--;
  1213.  
  1214.  
  1215. [ext-fax]
  1216. include => ext-fax-custom
  1217. exten => 1,1,Set(FAX_FOR=1000 (1))
  1218. exten => 1,n,Noop(Receiving Fax for: ${FAX_FOR}, From: ${CALLERID(all)})
  1219. exten => 1,n,Set(FAX_RX_USER=1)
  1220. exten => 1,n,Set(FAX_RX_EMAIL_LEN=0)
  1221. exten => 1,n(receivefax),Goto(s,receivefax)
  1222.  
  1223. exten => 2,1,Set(FAX_FOR=1001 (2))
  1224. exten => 2,n,Noop(Receiving Fax for: ${FAX_FOR}, From: ${CALLERID(all)})
  1225. exten => 2,n,Set(FAX_RX_USER=2)
  1226. exten => 2,n,Set(FAX_RX_EMAIL_LEN=0)
  1227. exten => 2,n(receivefax),Goto(s,receivefax)
  1228.  
  1229. exten => 3,1,Set(FAX_FOR=1002 (3))
  1230. exten => 3,n,Noop(Receiving Fax for: ${FAX_FOR}, From: ${CALLERID(all)})
  1231. exten => 3,n,Set(FAX_RX_USER=3)
  1232. exten => 3,n,Set(FAX_RX_EMAIL_LEN=0)
  1233. exten => 3,n(receivefax),Goto(s,receivefax)
  1234.  
  1235. exten => 4,1,Set(FAX_FOR=1003 (4))
  1236. exten => 4,n,Noop(Receiving Fax for: ${FAX_FOR}, From: ${CALLERID(all)})
  1237. exten => 4,n,Set(FAX_RX_USER=4)
  1238. exten => 4,n,Set(FAX_RX_EMAIL_LEN=0)
  1239. exten => 4,n(receivefax),Goto(s,receivefax)
  1240.  
  1241. exten => 5,1,Set(FAX_FOR=Main IVR (5))
  1242. exten => 5,n,Noop(Receiving Fax for: ${FAX_FOR}, From: ${CALLERID(all)})
  1243. exten => 5,n,Set(FAX_RX_USER=5)
  1244. exten => 5,n,Set(FAX_RX_EMAIL_LEN=0)
  1245. exten => 5,n(receivefax),Goto(s,receivefax)
  1246.  
  1247. exten => 6,1,Set(FAX_FOR=1004 (6))
  1248. exten => 6,n,Noop(Receiving Fax for: ${FAX_FOR}, From: ${CALLERID(all)})
  1249. exten => 6,n,Set(FAX_RX_USER=6)
  1250. exten => 6,n,Set(FAX_RX_EMAIL_LEN=0)
  1251. exten => 6,n(receivefax),Goto(s,receivefax)
  1252.  
  1253. exten => 7,1,Set(FAX_FOR=9002 (7))
  1254. exten => 7,n,Noop(Receiving Fax for: ${FAX_FOR}, From: ${CALLERID(all)})
  1255. exten => 7,n,Set(FAX_RX_USER=7)
  1256. exten => 7,n,Set(FAX_RX_EMAIL_LEN=0)
  1257. exten => 7,n(receivefax),Goto(s,receivefax)
  1258.  
  1259. exten => 8,1,Set(FAX_FOR=800 (8))
  1260. exten => 8,n,Noop(Receiving Fax for: ${FAX_FOR}, From: ${CALLERID(all)})
  1261. exten => 8,n,Set(FAX_RX_USER=8)
  1262. exten => 8,n,Set(FAX_RX_EMAIL_LEN=16)
  1263. exten => 8,n(receivefax),Goto(s,receivefax)
  1264.  
  1265. exten => s,1,Macro(user-callerid,)
  1266. exten => s,n,Noop(Receiving Fax for: ${FAX_FOR} , From: ${CALLERID(all)})
  1267. exten => s,n(receivefax),StopPlaytones
  1268. exten => s,n,ReceiveFAX(${ASTSPOOLDIR}/fax/${UNIQUEID}.tif,f)
  1269. exten => s,n,ExecIf($["${FAXSTATUS:0:6}"="FAILED" && "${FAXERROR}"!="INIT_ERROR"]?Set(FAXSTATUS="FAILED: error: ${FAXERROR} statusstr: ${FAXOPT(statusstr)}"))
  1270. exten => s,n,Hangup
  1271.  
  1272. exten => h,1,GotoIf($[${STAT(e,${ASTSPOOLDIR}/fax/${UNIQUEID}.tif)} = 0]?failed)
  1273. exten => h,n(delete_opt),Set(DELETE_AFTER_SEND=true)
  1274. exten => h,n(process),GotoIf($[ "${FAX_RX_EMAIL_LEN}" = "0" | "${FAX_RX_EMAIL_LEN}" = "" ]?noemail)
  1275. exten => h,n(sendfax),System(${AMPBIN}/fax2mail.php --remotestationid "${FAXOPT(remotestationid)}" --user "${FAX_RX_USER}" --dest "${FROM_DID}" --callerid "${BASE64_ENCODE(${CALLERID(all)})}" --file ${ASTSPOOLDIR}/fax/${UNIQUEID}.tif --delete "${DELETE_AFTER_SEND}")
  1276. exten => h,n(end),Macro(hangupcall,)
  1277. exten => h,n(noemail),Noop(ERROR: No Email Address to send FAX: status: [${FAXSTATUS}], From: [${CALLERID(all)}], trying system fax destination)
  1278. exten => h,n,GotoIf($[ "${FAX_RX_EMAIL}" = "" ]?delfax)
  1279. exten => h,n,System(${AMPBIN}/fax2mail.php --remotestationid "${FAXOPT(remotestationid)}" --sendto "${FAX_RX_EMAIL}" --dest "${FROM_DID}" --callerid "${BASE64_ENCODE(${CALLERID(all)})}" --file ${ASTSPOOLDIR}/fax/${UNIQUEID}.tif --delete "${DELETE_AFTER_SEND}")
  1280. exten => h,n,Macro(hangupcall,)
  1281. exten => h,n(delfax),System(${AMPBIN}/fax2mail.php --file ${ASTSPOOLDIR}/fax/${UNIQUEID}.tif --delete "${DELETE_AFTER_SEND}")
  1282. exten => h,n,Macro(hangupcall,)
  1283. exten => h,process+101(failed),Noop(FAX ${FAXSTATUS} for: ${FAX_FOR} , From: ${CALLERID(all)})
  1284. exten => h,n,Macro(hangupcall,)
  1285.  
  1286. ;--== end of [ext-fax] ==--;
  1287.  
  1288.  
  1289. [app-fax]
  1290. include => app-fax-custom
  1291. exten => 666,1,Set(FAX_RX_EMAIL=)
  1292. exten => 666,n,Goto(ext-fax,s,1)
  1293.  
  1294. exten => h,1,Macro(hangupcall,)
  1295.  
  1296. ;--== end of [app-fax] ==--;
  1297.  
  1298.  
  1299. [ext-did-0001]
  1300. include => ext-did-0001-custom
  1301. exten => fax,1,Set(__DIRECTION=INBOUND)
  1302. exten => fax,n,Goto(${CUT(FAX_DEST,^,1)},${CUT(FAX_DEST,^,2)},${CUT(FAX_DEST,^,3)})
  1303.  
  1304. ;--== end of [ext-did-0001] ==--;
  1305.  
  1306.  
  1307. [ext-did-0002]
  1308. include => ext-did-0002-custom
  1309. exten => fax,1,Set(__DIRECTION=INBOUND)
  1310. exten => fax,n,Goto(${CUT(FAX_DEST,^,1)},${CUT(FAX_DEST,^,2)},${CUT(FAX_DEST,^,3)})
  1311.  
  1312. exten => 9000,1,Set(__DIRECTION=INBOUND)
  1313. exten => 9000,n,Gosub(sub-record-check,s,1(in,${EXTEN},dontcare))
  1314. exten => 9000,n,Gosub(app-blacklist-check,s,1())
  1315. exten => 9000,n,Set(__FROM_DID=${EXTEN})
  1316. exten => 9000,n,Set(CDR(did)=${FROM_DID})
  1317. exten => 9000,n,ExecIf($[ "${CALLERID(name)}" = "" ] ?Set(CALLERID(name)=${CALLERID(num)}))
  1318. exten => 9000,n,Set(__MOHCLASS=)
  1319. exten => 9000,n,Set(__REVERSAL_REJECT=FALSE)
  1320. exten => 9000,n,GotoIf($["${REVERSAL_REJECT}"!="TRUE"]?post-reverse-charge)
  1321. exten => 9000,n,GotoIf($["${CHANNEL(reversecharge)}"="1"]?macro-hangupcall)
  1322. exten => 9000,n(post-reverse-charge),Noop()
  1323. exten => 9000,n,Set(__CALLINGNAMEPRES_SV=${CALLERID(name-pres)})
  1324. exten => 9000,n,Set(__CALLINGNUMPRES_SV=${CALLERID(num-pres)})
  1325. exten => 9000,n,Set(CALLERID(name-pres)=allowed_not_screened)
  1326. exten => 9000,n,Set(CALLERID(num-pres)=allowed_not_screened)
  1327. exten => 9000,n(did-cid-hook),Noop(CallerID Entry Point)
  1328. exten => 9000,n,Set(__CRM_DIRECTION=INBOUND)
  1329. exten => 9000,n,Set(__CRM_SOURCE=${CALLERID(num)})
  1330. exten => 9000,n,Set(__CRM_LINKEDID=${CHANNEL(LINKEDID)})
  1331. exten => 9000,n,ExecIf($["${CRM_DIRECTION}"="INBOUND"]?Set(CHANNEL(hangup_handler_push)=crm-hangup,s,1))
  1332. exten => 9000,n(dest-ext),Goto(ivr-1,s,1)
  1333.  
  1334. ;--== end of [ext-did-0002] ==--;
  1335.  
  1336.  
  1337. [ivr-2] ; IVRSUB01
  1338. include => ivr-2-custom
  1339. include => from-ivr-directory-Disabled
  1340. exten => fax,1,Goto(${CUT(FAX_DEST,^,1)},${CUT(FAX_DEST,^,2)},${CUT(FAX_DEST,^,3)})
  1341.  
  1342. exten => s,1,Set(TIMEOUT_LOOPCOUNT=0)
  1343. exten => s,n,Set(INVALID_LOOPCOUNT=0)
  1344. exten => s,n,Set(_IVR_CONTEXT_${CONTEXT}=${IVR_CONTEXT})
  1345. exten => s,n,Set(_IVR_CONTEXT=${CONTEXT})
  1346. exten => s,n,Set(__IVR_RETVM=RETURN)
  1347. exten => s,n,GotoIf($["${CHANNEL(state)}" = "Up"]?skip)
  1348. exten => s,n,Answer
  1349. exten => s,n,Wait(1)
  1350. exten => s,n(skip),Set(IVR_MSG=custom/sub-01)
  1351. exten => s,n(start),Set(TIMEOUT(digit)=3)
  1352. exten => s,n,ExecIf($["${IVR_MSG}" != ""]?Background(${IVR_MSG}))
  1353. exten => s,n,WaitExten(10,)
  1354.  
  1355. exten => 1,1(ivrsel-1),Goto(from-did-direct,1002,1)
  1356.  
  1357. exten => 2,1(ivrsel-2),Goto(from-did-direct,1004,1)
  1358.  
  1359. exten => 3,1(ivrsel-3),Goto(from-did-direct,1000,1)
  1360.  
  1361. exten => 4,1(ivrsel-4),Goto(from-did-direct,8000,1)
  1362.  
  1363. exten => 5,1(ivrsel-5),Goto(ivr-1,s,1)
  1364.  
  1365. exten => 6,1(ivrsel-6),Goto(app-blackhole,hangup,1)
  1366.  
  1367. exten => i,1,Set(INVALID_LOOPCOUNT=$[${INVALID_LOOPCOUNT}+1])
  1368. exten => i,n,GotoIf($[${INVALID_LOOPCOUNT} > 3]?final)
  1369. exten => i,n,Set(IVR_MSG=no-valid-responce-pls-try-again&custom/sub-01)
  1370. exten => i,n,Goto(s,start)
  1371. exten => i,n(final),Playback(custom/test1)
  1372. exten => i,n,Goto(ivr-1,s,1)
  1373.  
  1374. exten => t,1,Set(TIMEOUT_LOOPCOUNT=$[${TIMEOUT_LOOPCOUNT}+1])
  1375. exten => t,n,GotoIf($[${TIMEOUT_LOOPCOUNT} > 3]?final)
  1376. exten => t,n,Set(IVR_MSG=no-valid-responce-pls-try-again)
  1377. exten => t,n,Goto(s,start)
  1378. exten => t,n(final),Playback(custom/test1)
  1379. exten => t,n,Goto(ivr-1,s,1)
  1380.  
  1381. exten => return,1,Set(_IVR_CONTEXT=${CONTEXT})
  1382. exten => return,n,Set(_IVR_CONTEXT_${CONTEXT}=${IVR_CONTEXT_${CONTEXT}})
  1383. exten => return,n,Set(IVR_MSG=custom/sub-01)
  1384. exten => return,n,Goto(s,start)
  1385.  
  1386. exten => h,1,Hangup
  1387.  
  1388. exten => hang,1,Playback(vm-goodbye)
  1389. exten => hang,n,Hangup
  1390.  
  1391. ;--== end of [ivr-2] ==--;
  1392.  
  1393.  
  1394. [ivr-1] ; WELCOME
  1395. include => ivr-1-custom
  1396. include => from-ivr-directory-Disabled
  1397. exten => fax,1,Goto(${CUT(FAX_DEST,^,1)},${CUT(FAX_DEST,^,2)},${CUT(FAX_DEST,^,3)})
  1398.  
  1399. exten => s,1,Set(TIMEOUT_LOOPCOUNT=0)
  1400. exten => s,n,Set(INVALID_LOOPCOUNT=0)
  1401. exten => s,n,Set(_IVR_CONTEXT_${CONTEXT}=${IVR_CONTEXT})
  1402. exten => s,n,Set(_IVR_CONTEXT=${CONTEXT})
  1403. exten => s,n,Set(__IVR_RETVM=)
  1404. exten => s,n,GotoIf($["${CHANNEL(state)}" = "Up"]?skip)
  1405. exten => s,n,Answer
  1406. exten => s,n,Wait(1)
  1407. exten => s,n(skip),Set(IVR_MSG=custom/test1)
  1408. exten => s,n(start),Set(TIMEOUT(digit)=3)
  1409. exten => s,n,ExecIf($["${IVR_MSG}" != ""]?Background(${IVR_MSG}))
  1410. exten => s,n,WaitExten(10,)
  1411.  
  1412. exten => 1,1(ivrsel-1),Goto(from-did-direct,1001,1)
  1413.  
  1414. exten => 2,1(ivrsel-2),Goto(from-did-direct,1003,1)
  1415.  
  1416. exten => 3,1(ivrsel-3),Goto(ivr-2,s,1)
  1417.  
  1418. exten => i,1,Set(INVALID_LOOPCOUNT=$[${INVALID_LOOPCOUNT}+1])
  1419. exten => i,n,GotoIf($[${INVALID_LOOPCOUNT} > 3]?final)
  1420. exten => i,n,Set(IVR_MSG=no-valid-responce-pls-try-again)
  1421. exten => i,n,Goto(s,start)
  1422. exten => i,n(final),Playback(no-valid-responce-transfering)
  1423. exten => i,n,Goto()
  1424.  
  1425. exten => t,1,Set(TIMEOUT_LOOPCOUNT=$[${TIMEOUT_LOOPCOUNT}+1])
  1426. exten => t,n,GotoIf($[${TIMEOUT_LOOPCOUNT} > 3]?final)
  1427. exten => t,n,Set(IVR_MSG=no-valid-responce-pls-try-again)
  1428. exten => t,n,Goto(s,start)
  1429. exten => t,n(final),Playback(no-valid-responce-transfering)
  1430. exten => t,n,Goto()
  1431.  
  1432. exten => return,1,Set(_IVR_CONTEXT=${CONTEXT})
  1433. exten => return,n,Set(_IVR_CONTEXT_${CONTEXT}=${IVR_CONTEXT_${CONTEXT}})
  1434. exten => return,n,Set(IVR_MSG=custom/test1)
  1435. exten => return,n,Goto(s,start)
  1436.  
  1437. exten => h,1,Hangup
  1438.  
  1439. exten => hang,1,Playback(vm-goodbye)
  1440. exten => hang,n,Hangup
  1441.  
  1442. ;--== end of [ivr-1] ==--;
  1443.  
  1444.  
  1445. [ext-featurecodes]
  1446. include => ext-featurecodes-custom
  1447. exten => *30,1,Goto(from-internal,*30,1)
  1448.  
  1449. exten => *31,1,Goto(from-internal,*31,1)
  1450.  
  1451. exten => *10,1,Goto(from-internal,*10,1)
  1452.  
  1453. exten => 555,1,Goto(from-internal,555,1)
  1454.  
  1455. exten => 7777,1,Goto(from-internal,7777,1)
  1456.  
  1457. exten => 888,1,Goto(from-internal,888,1)
  1458.  
  1459. exten => 666,1,Goto(from-internal,666,1)
  1460.  
  1461. exten => *43,1,Goto(from-internal,*43,1)
  1462.  
  1463. exten => *60,1,Goto(from-internal,*60,1)
  1464.  
  1465. exten => *88,1,Goto(from-internal,*88,1)
  1466.  
  1467. exten => *85,1,Goto(from-internal,*85,1)
  1468.  
  1469. exten => *86,1,Goto(from-internal,*86,1)
  1470.  
  1471. exten => 411,1,Goto(from-internal,411,1)
  1472.  
  1473. exten => *271,1,Goto(from-internal,*271,1)
  1474.  
  1475. exten => *98,1,Goto(from-internal,*98,1)
  1476.  
  1477. ;--== end of [ext-featurecodes] ==--;
  1478.  
  1479.  
  1480. [app-fmf-toggle]
  1481. include => app-fmf-toggle-custom
  1482. exten => *21,1,Goto(app-fmf-toggle,s,start)
  1483.  
  1484. exten => s,1(start),Answer
  1485. exten => s,n,Wait(1)
  1486. exten => s,n,Macro(user-callerid,)
  1487. exten => s,n,GotoIf($["${DB(AMPUSER/${AMPUSER}/followme/ddial)}" = "EXTENSION"]?activate)
  1488. exten => s,n,GotoIf($["${DB(AMPUSER/${AMPUSER}/followme/ddial)}" = "DIRECT"]?deactivate:end)
  1489. exten => s,n(deactivate),Set(DB(AMPUSER/${AMPUSER}/followme/ddial)=EXTENSION)
  1490. exten => s,n,Set(STATE=NOT_INUSE)
  1491. exten => s,n,Gosub(app-fmf-toggle,sstate,1())
  1492. exten => s,n(hook_off),Playback(followme&de-activated)
  1493. exten => s,n(end),Macro(hangupcall,)
  1494. exten => s,n(activate),Set(DB(AMPUSER/${AMPUSER}/followme/ddial)=DIRECT)
  1495. exten => s,n,Set(STATE=INUSE)
  1496. exten => s,n,Gosub(app-fmf-toggle,sstate,1())
  1497. exten => s,n(hook_on),Playback(followme&activated)
  1498. exten => s,n,Macro(hangupcall,)
  1499.  
  1500. exten => sstate,1,Set(DEVICES=${DB(AMPUSER/${AMPUSER}/device)})
  1501. exten => sstate,n,GotoIf($["${DEVICES}" = "" ]?return)
  1502. exten => sstate,n,Set(LOOPCNT=${FIELDQTY(DEVICES,&)})
  1503. exten => sstate,n,Set(ITER=1)
  1504. exten => sstate,n(begin),Set(DEVICE_STATE(Custom:FOLLOWME${CUT(DEVICES,&,${ITER})})=${STATE})
  1505. exten => sstate,n,Set(ITER=$[${ITER} + 1])
  1506. exten => sstate,n,GotoIf($[${ITER} <= ${LOOPCNT}]?begin)
  1507. exten => sstate,n(return),Return()
  1508.  
  1509. ;--== end of [app-fmf-toggle] ==--;
  1510.  
  1511.  
  1512. [ext-findmefollow]
  1513. include => ext-findmefollow-custom
  1514. exten => _*21X.,1,Goto(app-fmf-toggle,*21,1)
  1515. exten => _*21X.,hint,Custom:FOLLOWME${EXTEN:3}
  1516.  
  1517. exten => 1000,1,GotoIf($[${DB_EXISTS(AMPUSER/${EXTEN}/followme/ddial)} != 1 | "${DB(AMPUSER/${EXTEN}/followme/ddial)}" = "EXTENSION"]?ext-local,${EXTEN},1:followme-check,${EXTEN},1)
  1518.  
  1519. exten => 1001,1,GotoIf($[${DB_EXISTS(AMPUSER/${EXTEN}/followme/ddial)} != 1 | "${DB(AMPUSER/${EXTEN}/followme/ddial)}" = "EXTENSION"]?ext-local,${EXTEN},1:followme-check,${EXTEN},1)
  1520.  
  1521. exten => 1002,1,GotoIf($[${DB_EXISTS(AMPUSER/${EXTEN}/followme/ddial)} != 1 | "${DB(AMPUSER/${EXTEN}/followme/ddial)}" = "EXTENSION"]?ext-local,${EXTEN},1:followme-check,${EXTEN},1)
  1522.  
  1523. exten => 1003,1,GotoIf($[${DB_EXISTS(AMPUSER/${EXTEN}/followme/ddial)} != 1 | "${DB(AMPUSER/${EXTEN}/followme/ddial)}" = "EXTENSION"]?ext-local,${EXTEN},1:followme-check,${EXTEN},1)
  1524.  
  1525. exten => 9000,1,GotoIf($[${DB_EXISTS(AMPUSER/${EXTEN}/followme/ddial)} != 1 | "${DB(AMPUSER/${EXTEN}/followme/ddial)}" = "EXTENSION"]?ext-local,${EXTEN},1:followme-check,${EXTEN},1)
  1526.  
  1527. exten => 1004,1,GotoIf($[${DB_EXISTS(AMPUSER/${EXTEN}/followme/ddial)} != 1 | "${DB(AMPUSER/${EXTEN}/followme/ddial)}" = "EXTENSION"]?ext-local,${EXTEN},1:followme-check,${EXTEN},1)
  1528.  
  1529. exten => 8000,1,GotoIf($[${DB_EXISTS(AMPUSER/${EXTEN}/followme/ddial)} != 1 | "${DB(AMPUSER/${EXTEN}/followme/ddial)}" = "EXTENSION"]?ext-local,${EXTEN},1:followme-check,${EXTEN},1)
  1530.  
  1531. exten => _FMX.,1,Goto(followme-check,${EXTEN:2},FMCID)
  1532.  
  1533. ;--== end of [ext-findmefollow] ==--;
  1534.  
  1535.  
  1536. [fmgrps]
  1537. include => fmgrps-custom
  1538. exten => _RG-1000.,1+1,Macro(dial,${DB(AMPUSER/1000/followme/grptime)},${DIAL_OPTIONS}M(confirm^^^1000),${EXTEN:8})
  1539.  
  1540. exten => _RG-1001.,1+1,Macro(dial,${DB(AMPUSER/1001/followme/grptime)},${DIAL_OPTIONS}M(confirm^^^1001),${EXTEN:8})
  1541.  
  1542. exten => _RG-1002.,1+1,Macro(dial,${DB(AMPUSER/1002/followme/grptime)},${DIAL_OPTIONS}M(confirm^^^1002),${EXTEN:8})
  1543.  
  1544. exten => _RG-1003.,1+1,Macro(dial,${DB(AMPUSER/1003/followme/grptime)},${DIAL_OPTIONS}M(confirm^^^1003),${EXTEN:8})
  1545.  
  1546. exten => _RG-9000.,1+1,Macro(dial,${DB(AMPUSER/9000/followme/grptime)},${DIAL_OPTIONS}M(confirm^^^9000),${EXTEN:8})
  1547.  
  1548. exten => _RG-1004.,1+1,Macro(dial,${DB(AMPUSER/1004/followme/grptime)},${DIAL_OPTIONS}M(confirm^^^1004),${EXTEN:8})
  1549.  
  1550. exten => _RG-8000.,1+1,Macro(dial,${DB(AMPUSER/8000/followme/grptime)},${DIAL_OPTIONS}M(confirm^^^8000),${EXTEN:8})
  1551.  
  1552. exten => _RG-X.,1,Set(CDR_PROP(disable)=true)
  1553.  
  1554. ;--== end of [fmgrps] ==--;
  1555.  
  1556.  
  1557. [followme-check]
  1558. include => followme-check-custom
  1559. exten => _X.,1(FMCID),Gosub(followme-sub,${EXTEN},1())
  1560. exten => _X.,n,Noop(Should never get here)
  1561. exten => _X.,n,Hangup
  1562.  
  1563. ;--== end of [followme-check] ==--;
  1564.  
  1565.  
  1566. [followme-sub]
  1567. include => followme-sub-custom
  1568. exten => _X.,1,Macro(user-callerid,)
  1569. exten => _X.,n,Set(DIAL_OPTIONS=${DIAL_OPTIONS}I)
  1570. exten => _X.,n,Set(CONNECTEDLINE(num,i)=${EXTEN})
  1571. exten => _X.,n,Gosub(sub-presencestate-display,s,1(${EXTEN}))
  1572. exten => _X.,n,Set(CONNECTEDLINE(name)=${DB(AMPUSER/${EXTEN}/cidname)}${PRESENCESTATE_DISPLAY})
  1573. exten => _X.,n,Set(FM_DIALSTATUS=${EXTENSION_STATE(${EXTEN}@ext-local)})
  1574. exten => _X.,n,Set(__EXTTOCALL=${EXTEN})
  1575. exten => _X.,n,Set(__PICKUPMARK=${EXTEN})
  1576. exten => _X.,n,Macro(blkvm-setifempty,)
  1577. exten => _X.,n,GotoIf($["${GOSUB_RETVAL}" = "TRUE"]?skipov)
  1578. exten => _X.,n,Macro(blkvm-set,reset)
  1579. exten => _X.,n,Set(__NODEST=)
  1580. exten => _X.,n(skipov),Set(RRNODEST=${NODEST})
  1581. exten => _X.,n(skipvmblk),Set(__NODEST=${EXTEN})
  1582. exten => _X.,n,GosubIf($[${DB_EXISTS(AMPUSER/${EXTEN}/followme/changecid)} = 1 & "${DB(AMPUSER/${EXTEN}/followme/changecid)}" != "default" & "${DB(AMPUSER/${EXTEN}/followme/changecid)}" != ""]?sub-fmsetcid,s,1())
  1583. exten => _X.,n,GotoIf($[ "${DB(AMPUSER/${EXTEN}/followme/grppre)}" = "" ]?skipprepend)
  1584. exten => _X.,n,Macro(prepend-cid,${DB(AMPUSER/${EXTEN}/followme/grppre)})
  1585. exten => _X.,n(skipprepend),Set(RecordMethod=Group)
  1586. exten => _X.,n(checkrecord),Gosub(sub-record-check,s,1(exten,${EXTEN},))
  1587. exten => _X.,n,GotoIf($[ $["${DB(AMPUSER/${EXTEN}/followme/dring)}" = ""] | $["${ALERT_INFO}"!=""] ]?skipdring)
  1588. exten => _X.,n,Set(DRING=${DB(AMPUSER/${EXTEN}/followme/dring)})
  1589. exten => _X.,n,Set(__ALERT_INFO=${STRREPLACE(DRING,\;,\\;)})
  1590. exten => _X.,n(skipdring),Set(STRATEGY=${DB(AMPUSER/${EXTEN}/followme/strategy)})
  1591. exten => _X.,n,Set(__RVOL=${DB(AMPUSER/${EXTEN}/followme/rvolume)})
  1592. exten => _X.,n,GotoIf($["${CUT(STRATEGY,-,1)}"="ringallv2"]?skipsimple)
  1593. exten => _X.,n,GotoIf($[$[ "${DB(AMPUSER/${EXTEN}/followme/prering)}" = "0" ] | $[ "${DB(AMPUSER/${EXTEN}/followme/prering)}" = "" ]] ?skipsimple)
  1594. exten => _X.,n,Macro(simple-dial,${EXTEN},${DB(AMPUSER/${EXTEN}/followme/prering)})
  1595. exten => _X.,n(skipsimple),Set(RingGroupMethod=${STRATEGY})
  1596. exten => _X.,n,Set(_FMGRP=${EXTEN})
  1597. exten => _X.,n,GotoIf($[$["${DB(AMPUSER/${EXTEN}/followme/annmsg)}" = ""] | $["${DIALSTATUS}" = "ANSWER"] | $["foo${RRNODEST}" != "foo"]]?DIALGRP)
  1598. exten => _X.,n,Answer
  1599. exten => _X.,n,Wait(1)
  1600. exten => _X.,n,Playback(${DB(AMPUSER/${EXTEN}/followme/annmsg)})
  1601. exten => _X.,n(DIALGRP),ExecIf($[$["${DB(AMPUSER/${EXTEN}/followme/ringing)}"="Ring"] | $["${DB(AMPUSER/${EXTEN}/followme/ringing)}"=""]]?Set(DOPTS=${DIAL_OPTIONS}):Set(DOPTS=m(${DB(AMPUSER/${EXTEN}/followme/ringing)})${STRREPLACE(DIAL_OPTIONS,r)}))
  1602. exten => _X.,n,Set(__ALT_CONFIRM_MSG=${IF($["${ALT_CONFIRM_MSG}"!=""]?${ALT_CONFIRM_MSG}:${VQ_CONFIRMMSG})})
  1603. exten => _X.,n,GotoIf($[("${DB(AMPUSER/${EXTEN}/followme/grpconf)}"="ENABLED") | ("${FORCE_CONFIRM}"!="") | ($[${LEN(${VQ_CONFIRMMSG})}>1])])?doconfirm)
  1604. exten => _X.,n,GotoIf($["${CUT(STRATEGY,-,1)}"="ringallv2"]?ringallv21)
  1605. exten => _X.,n,Macro(dial,${DB(AMPUSER/${EXTEN}/followme/grptime)},${DOPTS},${DB(AMPUSER/${EXTEN}/followme/grplist)})
  1606. exten => _X.,n,Goto(nextstep)
  1607. exten => _X.,n(ringallv21),Macro(dial,$[ ${DB(AMPUSER/${EXTEN}/followme/grptime)} + ${DB(AMPUSER/${EXTEN}/followme/prering)} ],${DOPTS},${DB(AMPUSER/${EXTEN}/followme/grplist)})
  1608. exten => _X.,n,Goto(nextstep)
  1609. exten => _X.,n(doconfirm),GotoIf($["${CUT(STRATEGY,-,1)}"="ringallv2"]?ringallv22)
  1610. exten => _X.,n,Macro(dial-confirm,${DB(AMPUSER/${EXTEN}/followme/grptime)},${DOPTS},${DB(AMPUSER/${EXTEN}/followme/grplist)},${EXTEN})
  1611. exten => _X.,n,Goto(nextstep)
  1612. exten => _X.,n(ringallv22),Macro(dial-confirm,$[ ${DB(AMPUSER/${EXTEN}/followme/grptime)} + ${DB(AMPUSER/${EXTEN}/followme/prering)} ],${DOPTS},${DB(AMPUSER/${EXTEN}/followme/grplist)},${EXTEN})
  1613. exten => _X.,n(nextstep),Set(RingGroupMethod=)
  1614. exten => _X.,n,GotoIf($["foo${RRNODEST}" != "foo"]?nodest)
  1615. exten => _X.,n,Set(__NODEST=)
  1616. exten => _X.,n,Set(__PICKUPMARK=)
  1617. exten => _X.,n,Macro(blkvm-clr,)
  1618. exten => _X.,n,Set(DIALSTATUS=${IF($["${FM_DIALSTATUS}"="NOT_INUSE"&"${DIALSTATUS}"!="CHANUNAVAIL"]?NOANSWER:${IF($["${DIALSTATUS}"="CHANUNAVAIL"|"${FM_DIALSTATUS}"="UNAVAILABLE"|"${FM_DIALSTATUS}"="UNKNOWN"|"${FM_DIALSTATUS}"="INVALID"]?CHANUNAVAIL:BUSY)})})
  1619. exten => _X.,n,GotoIf($["${DB(AMPUSER/${EXTEN}/followme/postdest)}"=""]?dohangup)
  1620. exten => _X.,n,Goto(${DB(AMPUSER/${EXTEN}/followme/postdest)})
  1621. exten => _X.,n(dohangup),Hangup
  1622. exten => _X.,n(nodest),Noop(SKIPPING DEST, CALL CAME FROM Q/RG: ${RRNODEST})
  1623. exten => _X.,n,Return()
  1624.  
  1625. ;--== end of [followme-sub] ==--;
  1626.  
  1627.  
  1628. [sub-fmsetcid]
  1629. include => sub-fmsetcid-custom
  1630. exten => s,1,Goto(s-${DB(AMPUSER/${EXTTOCALL}/followme/changecid)},1)
  1631.  
  1632. exten => s-fixed,1,ExecIf($["${REGEX("^[\+]?[0-9]+$" ${DB(AMPUSER/${EXTTOCALL}/followme/fixedcid)})}" = "1"]?Set(__TRUNKCIDOVERRIDE=${DB(AMPUSER/${EXTTOCALL}/followme/fixedcid)}))
  1633. exten => s-fixed,n,Return()
  1634.  
  1635. exten => s-extern,1,ExecIf($["${REGEX("^[\+]?[0-9]+$" ${DB(AMPUSER/${EXTTOCALL}/followme/fixedcid)})}" == "1" & "${FROM_DID}" != ""]?Set(__TRUNKCIDOVERRIDE=${DB(AMPUSER/${EXTTOCALL}/followme/fixedcid)}))
  1636. exten => s-extern,n,Return()
  1637.  
  1638. exten => s-did,1,ExecIf($["${REGEX("^[\+]?[0-9]+$" ${FROM_DID})}" = "1"]?Set(__REALCALLERIDNUM=${FROM_DID}))
  1639. exten => s-did,n,Return()
  1640.  
  1641. exten => s-forcedid,1,ExecIf($["${REGEX("^[\+]?[0-9]+$" ${FROM_DID})}" = "1"]?Set(__TRUNKCIDOVERRIDE=${FROM_DID}))
  1642. exten => s-forcedid,n,Return()
  1643.  
  1644. exten => _s-.,1,Noop(Unknown value for AMPUSER/${EXTTOCALL}/followme/changecid of ${DB(AMPUSER/${EXTTOCALL}/followme/changecid)} set to "default")
  1645. exten => _s-.,n,Set(DB(AMPUSER/${EXTTOCALL}/followme/changecid)=default)
  1646. exten => _s-.,n,Return()
  1647.  
  1648. ;--== end of [sub-fmsetcid] ==--;
  1649.  
  1650.  
  1651. [app-hotelwakeup]
  1652. include => app-hotelwakeup-custom
  1653. exten => *68,1,Macro(user-callerid,)
  1654. exten => *68,n,Answer
  1655. exten => *68,n,Wait(1)
  1656. exten => *68,n,AGI(wakeup)
  1657. exten => *68,n,Hangup
  1658.  
  1659. ;--== end of [app-hotelwakeup] ==--;
  1660.  
  1661.  
  1662. [app-calltrace]
  1663. include => app-calltrace-custom
  1664. exten => *69,1,Goto(app-calltrace-perform,s,1)
  1665.  
  1666. ;--== end of [app-calltrace] ==--;
  1667.  
  1668.  
  1669. [app-calltrace-perform]
  1670. include => app-calltrace-perform-custom
  1671. exten => s,1,Set(CONNECTEDLINE(name-charset,i)=utf8)
  1672. exten => s,n,Set(CONNECTEDLINE(name,i)=Call Trace)
  1673. exten => s,n,Set(CONNECTEDLINE(num,i)=s)
  1674. exten => s,n,Answer
  1675. exten => s,n,Wait(1)
  1676. exten => s,n,Macro(user-callerid,)
  1677. exten => s,n,Playback(info-about-last-call&telephone-number)
  1678. exten => s,n,Set(lastcaller=${DB(CALLTRACE/${AMPUSER})})
  1679. exten => s,n,GotoIf($[ $[ "${lastcaller}" = "" ] | $[ "${lastcaller}" = "unknown" ] ]?noinfo)
  1680. exten => s,n,SayDigits(${lastcaller})
  1681. exten => s,n,Set(TIMEOUT(digit)=3)
  1682. exten => s,n,Set(TIMEOUT(response)=7)
  1683. exten => s,n,Background(to-call-this-number&press&digits/1)
  1684. exten => s,n,Goto(fin)
  1685. exten => s,n(noinfo),Playback(from-unknown-caller)
  1686. exten => s,n,Macro(hangupcall,)
  1687. exten => s,n(fin),Noop(Waiting for input)
  1688. exten => s,n,WaitExten(60,)
  1689. exten => s,n,Playback(sorry-youre-having-problems&goodbye)
  1690.  
  1691. exten => 1,1,Goto(from-internal,${lastcaller},1)
  1692.  
  1693. exten => i,1,Playback(vm-goodbye)
  1694. exten => i,n,Macro(hangupcall,)
  1695.  
  1696. exten => t,1,Playback(vm-goodbye)
  1697. exten => t,n,Macro(hangupcall,)
  1698.  
  1699. ;--== end of [app-calltrace-perform] ==--;
  1700.  
  1701.  
  1702. [app-echo-test]
  1703. include => app-echo-test-custom
  1704. exten => *43,1,Set(CONNECTEDLINE(name-charset,i)=utf8)
  1705. exten => *43,n,Set(CONNECTEDLINE(name,i)=Echo Test)
  1706. exten => *43,n,Set(CONNECTEDLINE(num,i)=*43)
  1707. exten => *43,n,Answer
  1708. exten => *43,n,Macro(user-callerid,)
  1709. exten => *43,n,Wait(1)
  1710. exten => *43,n,Background(demo-echotest,,,app-echo-test-echo)
  1711. exten => *43,n,Goto(app-echo-test-echo,1,1)
  1712.  
  1713. ;--== end of [app-echo-test] ==--;
  1714.  
  1715.  
  1716. [app-echo-test-echo]
  1717. include => app-echo-test-echo-custom
  1718. exten => _[0-9#*],1,Echo()
  1719. exten => _[0-9#*],n,Playback(demo-echodone)
  1720. exten => _[0-9#*],n,Hangup
  1721.  
  1722. ;--== end of [app-echo-test-echo] ==--;
  1723.  
  1724.  
  1725. [app-speakextennum]
  1726. include => app-speakextennum-custom
  1727. exten => *65,1,Set(CONNECTEDLINE(name-charset,i)=utf8)
  1728. exten => *65,n,Set(CONNECTEDLINE(name,i)=Speak Extension)
  1729. exten => *65,n,Set(CONNECTEDLINE(num,i)=*65)
  1730. exten => *65,n,Answer
  1731. exten => *65,n,Wait(1)
  1732. exten => *65,n,Macro(user-callerid,)
  1733. exten => *65,n,GotoIf($[${DIALPLAN_EXISTS(app-speakextennum,${CHANNEL(language)},1)}]?app-speakextennum,${CHANNEL(language)},1:app-speakextennum,en,1)
  1734.  
  1735. exten => en,1,Playback(your)
  1736. exten => en,n,Playback(extension)
  1737. exten => en,n,Playback(number)
  1738. exten => en,n,Playback(is)
  1739. exten => en,n,SayDigits(${AMPUSER})
  1740. exten => en,n,Wait(2)
  1741. exten => en,n,Hangup
  1742.  
  1743. exten => fr,1,Playback(your)
  1744. exten => fr,n,Playback(extension)
  1745. exten => fr,n,Playback(is2)
  1746. exten => fr,n,SayDigits(${AMPUSER})
  1747. exten => fr,n,Wait(2)
  1748. exten => fr,n,Hangup
  1749.  
  1750. exten => ja,1,Playback(your)
  1751. exten => ja,n,Playback(extension)
  1752. exten => ja,n,Playback(jp-wa)
  1753. exten => ja,n,SayDigits(${AMPUSER})
  1754. exten => ja,n,Wait(2)
  1755. exten => ja,n,Hangup
  1756.  
  1757. ;--== end of [app-speakextennum] ==--;
  1758.  
  1759.  
  1760. [sub-hr12format]
  1761. include => sub-hr12format-custom
  1762. exten => s,1,GotoIf($[${DIALPLAN_EXISTS(sub-hr12format,${CHANNEL(language)},1)}]?sub-hr12format,${CHANNEL(language)},1:sub-hr12format,en,1)
  1763. exten => s,n,GotoIf($[${DIALPLAN_EXISTS(sub-hr12format,${CHANNEL(language)},1)}]?${CHANNEL(language)},1:en,1)
  1764.  
  1765. exten => en,1,Playback(at-tone-time-exactly)
  1766. exten => en,n,SayUnixTime(${FutureTime},,IM 'vm-and' S 'seconds' p)
  1767. exten => en,n,Return()
  1768. exten => en,n,Playback(at-tone-time-exactly)
  1769. exten => en,n,SayUnixTime(${FutureTime},,IM 'vm-and' S 'seconds' p)
  1770. exten => en,n,Return()
  1771.  
  1772. exten => fr,1,Playback(at-tone-time-exactly)
  1773. exten => fr,n,SayUnixTime(${FutureTime},,IMSp)
  1774. exten => fr,n,Return()
  1775. exten => fr,n,Playback(at-tone-time-exactly)
  1776. exten => fr,n,SayUnixTime(${FutureTime},,IMSp)
  1777. exten => fr,n,Return()
  1778.  
  1779. exten => de,1,Playback(at-tone-time-exactly)
  1780. exten => de,n,SayUnixTime(${FutureTime},,IMSp)
  1781. exten => de,n,Return()
  1782. exten => de,n,Playback(at-tone-time-exactly)
  1783. exten => de,n,SayUnixTime(${FutureTime},,IMSp)
  1784. exten => de,n,Return()
  1785.  
  1786. exten => ja,1,Playback(at-tone-time-exactly)
  1787. exten => ja,n,SayUnixTime(${FutureTime},,pIMS)
  1788. exten => ja,n,Return()
  1789. exten => ja,n,Playback(at-tone-time-exactly)
  1790. exten => ja,n,SayUnixTime(${FutureTime},,pIMS)
  1791. exten => ja,n,Return()
  1792.  
  1793. ;--== end of [sub-hr12format] ==--;
  1794.  
  1795.  
  1796. [app-speakingclock]
  1797. include => app-speakingclock-custom
  1798. exten => *60,1,Set(CONNECTEDLINE(name-charset,i)=utf8)
  1799. exten => *60,n,Set(CONNECTEDLINE(name,i)=Speaking Clock)
  1800. exten => *60,n,Set(CONNECTEDLINE(num,i)=*60)
  1801. exten => *60,n,Macro(user-callerid,)
  1802. exten => *60,n,Answer
  1803. exten => *60,n,Wait(1)
  1804. exten => *60,n,Set(NumLoops=0)
  1805. exten => *60,n(start),Set(FutureTime=$[${EPOCH} + 8])
  1806. exten => *60,n,Set(FutureTimeMod=$[${FutureTime} % 10])
  1807. exten => *60,n,Set(FutureTime=$[${FutureTime} - ${FutureTimeMod} + 10])
  1808. exten => *60,n,Gosub(sub-hr12format,s,1())
  1809. exten => *60,n(waitloop),Set(TimeLeft=$[${FutureTime} - ${EPOCH}])
  1810. exten => *60,n,GotoIf($[${TimeLeft} < 1]?playbeep)
  1811. exten => *60,n,Wait(1)
  1812. exten => *60,n,Goto(waitloop)
  1813. exten => *60,n(playbeep),Playback(beep)
  1814. exten => *60,n,Wait(5)
  1815. exten => *60,n,Set(NumLoops=$[${NumLoops} + 1])
  1816. exten => *60,n,GotoIf($[${NumLoops} < 5]?start)
  1817. exten => *60,n,Playback(goodbye)
  1818. exten => *60,n,Hangup
  1819.  
  1820. ;--== end of [app-speakingclock] ==--;
  1821.  
  1822.  
  1823. [sub-hr24format]
  1824. include => sub-hr24format-custom
  1825. exten => s,1,GotoIf($[${DIALPLAN_EXISTS(sub-hr24format,${CHANNEL(language)},1)}]?${CHANNEL(language)},1:en,1)
  1826.  
  1827. exten => en,1,Playback(at-tone-time-exactly)
  1828. exten => en,n,SayUnixTime(${FutureTime},,kM 'vm-and' S 'seconds')
  1829. exten => en,n,Return()
  1830.  
  1831. exten => fr,1,Playback(at-tone-time-exactly)
  1832. exten => fr,n,SayUnixTime(${FutureTime},,kMS)
  1833. exten => fr,n,Return()
  1834.  
  1835. exten => de,1,Playback(at-tone-time-exactly)
  1836. exten => de,n,SayUnixTime(${FutureTime},,kMS)
  1837. exten => de,n,Return()
  1838.  
  1839. exten => ja,1,Playback(at-tone-time-exactly)
  1840. exten => ja,n,SayUnixTime(${FutureTime},,kMS)
  1841. exten => ja,n,Return()
  1842.  
  1843. ;--== end of [sub-hr24format] ==--;
  1844.  
  1845.  
  1846. [app-miscapps]
  1847. include => app-miscapps-custom
  1848. exten => 9002,1,Noop(Running miscapp 2: sub ivr)
  1849. exten => 9002,n,Macro(user-callerid,)
  1850. exten => 9002,n,Goto(ivr-2,s,1)
  1851.  
  1852. exten => 9001,1,Noop(Running miscapp 1: test 7777)
  1853. exten => 9001,n,Macro(user-callerid,)
  1854. exten => 9001,n,Goto(ivr-1,s,1)
  1855.  
  1856. ;--== end of [app-miscapps] ==--;
  1857.  
  1858.  
  1859. [macro-outisbusy]
  1860. include => macro-outisbusy-custom
  1861. exten => s,1,Progress
  1862. exten => s,n,GotoIf($["${EMERGENCYROUTE}" = "YES"]?emergency,1)
  1863. exten => s,n,GotoIf($["${INTRACOMPANYROUTE}" = "YES"]?intracompany,1)
  1864. exten => s,n,Playback(all-circuits-busy-now&please-try-call-later, noanswer)
  1865. exten => s,n,Congestion(20)
  1866. exten => s,n,Hangup
  1867.  
  1868. exten => intracompany,1,Playback(all-circuits-busy-now&please-try-call-later, noanswer)
  1869. exten => intracompany,n,Congestion(20)
  1870. exten => intracompany,n,Hangup
  1871.  
  1872. exten => emergency,1,Playback(all-circuits-busy-now&please-try-call-later)
  1873. exten => emergency,n,Congestion(20)
  1874. exten => emergency,n,Hangup
  1875.  
  1876. ;--== end of [macro-outisbusy] ==--;
  1877.  
  1878.  
  1879. [originate-aa]
  1880. include => originate-aa-custom
  1881. exten => _.X,1,Macro(blkvm-set,)
  1882. exten => _.X,n,Gosub(app-paging,ssetup,1())
  1883. exten => _.X,n,Macro(autoanswer,${EXTEN})
  1884. exten => _.X,n,Gosub(autoanswer,s,1(${ALERTINFO},${CALLINFO}))
  1885. exten => _.X,n,Goto(from-internal,${EXTEN},1)
  1886.  
  1887. ;--== end of [originate-aa] ==--;
  1888.  
  1889.  
  1890. [ext-intercom]
  1891. include => ext-intercom-custom
  1892. exten => lang-playback,1,GosubIf($[${DIALPLAN_EXISTS(ext-intercom,${CHANNEL(language)})}]?ext-intercom,${CHANNEL(language)},${ARG1}():ext-intercom,en,${ARG1}())
  1893. exten => lang-playback,n,Return()
  1894.  
  1895. exten => _*80.,1,Macro(user-callerid,)
  1896. exten => _*80.,n,Set(dialnumber=${EXTEN:3})
  1897. exten => _*80.,n,Set(INTERCOM_CALL=TRUE)
  1898. exten => _*80.,n,Gosub(sub-record-check,s,1(exten,${dialnumber}))
  1899. exten => _*80.,n,GotoIf($["${DB(AMPUSER/${AMPUSER}/intercom/block)}" = "blocked"]?end)
  1900. exten => _*80.,n,GotoIf($["${DB(DND/${dialnumber})}" = "YES"]?end)
  1901. exten => _*80.,n,GotoIf($["${DB(AMPUSER/${dialnumber}/intercom/${AMPUSER})}" = "allow" ]?allow)
  1902. exten => _*80.,n,GotoIf($["${DB(AMPUSER/${dialnumber}/intercom/${AMPUSER})}" = "deny" ]?nointercom)
  1903. exten => _*80.,n,GotoIf($["${DB(AMPUSER/${dialnumber}/intercom)}" = "disabled" ]?nointercom)
  1904. exten => _*80.,n(allow),Set(DEVICES=${DB(AMPUSER/${dialnumber}/device)})
  1905. exten => _*80.,n,GotoIf($["${DEVICES}" = "" ]?end)
  1906. exten => _*80.,n,Set(OVERRIDE=${DB(AMPUSER/${dialnumber}/intercom/override)})
  1907. exten => _*80.,n,Set(LOOPCNT=${FIELDQTY(DEVICES,&)})
  1908. exten => _*80.,n,Set(_SIPURI=)
  1909. exten => _*80.,n,Set(_ALERTINFO=Ring Answer)
  1910. exten => _*80.,n,Set(_CALLINFO=<uri>\;answer-after=0)
  1911. exten => _*80.,n,Set(_SIPURI=intercom=true)
  1912. exten => _*80.,n,Set(_DTIME=5)
  1913. exten => _*80.,n,Set(_ANSWERMACRO=)
  1914. exten => _*80.,n,GotoIf($[${LOOPCNT} > 1 ]?pagemode)
  1915. exten => _*80.,n,Macro(autoanswer,${DEVICES})
  1916. exten => _*80.,n,Set(_DOPTIONS=A(beep)b(autoanswer^s^1(${ALERTINFO},${CALLINFO})))
  1917. exten => _*80.,n(check),ChanIsAvail(${DEVICE},s)
  1918. exten => _*80.,n,ExecIf($["${AVAILSTATUS}" = "6"]?Set(AVAILORIGCHAN=${DEVICE}))
  1919. exten => _*80.,n,GotoIf($["${AVAILORIGCHAN}" != ""]?continue)
  1920. exten => _*80.,n,ExecIf($["${OVERRIDE}" = ""]?Set(OVERRIDE=reject))
  1921. exten => _*80.,n,GotoIf($["${OVERRIDE}" = "reject"]?end)
  1922. exten => _*80.,n,Set(DTIME=30)
  1923. exten => _*80.,n,ExecIf($["${OVERRIDE}" = "ring"]?Set(DOPTIONS=A(beep)))
  1924. exten => _*80.,n(continue),Noop(Continuing with page)
  1925. exten => _*80.,n,GotoIf($["${DB(AMPUSER/${EXTEN:3}/cidname)}" = ""]?godial)
  1926. exten => _*80.,n,Set(CONNECTEDLINE(name,i)=${DB(AMPUSER/${EXTEN:3}/cidname)})
  1927. exten => _*80.,n,Set(CONNECTEDLINE(num)=${EXTEN:3})
  1928. exten => _*80.,n(godial),Dial(${DIAL},${DTIME},I${DOPTIONS}${INTERCOM_EXT_DOPTIONS})
  1929. exten => _*80.,n(end),ExecIf($[${INTERCOM_RETURN}]?Return())
  1930. exten => _*80.,n,Busy(20)
  1931. exten => _*80.,n,Macro(hangupcall,)
  1932. exten => _*80.,n(pagemode),Set(ITER=1)
  1933. exten => _*80.,n,Set(DIALSTR=)
  1934. exten => _*80.,n(begin),ChanIsAvail(${DB(DEVICE/${CUT(DEVICES,&,${ITER})}/dial)},s)
  1935. exten => _*80.,n,GotoIf($["${AVAILORIGCHAN}" = ""]?skip)
  1936. exten => _*80.,n,Set(DIALSTR=${DIALSTR}-${CUT(DEVICES,&,${ITER})})
  1937. exten => _*80.,n(skip),Set(ITER=$[${ITER} + 1])
  1938. exten => _*80.,n,GotoIf($[${ITER} <= ${LOOPCNT}]?begin)
  1939. exten => _*80.,n,Set(DIALSTR=${DIALSTR:1})
  1940. exten => _*80.,n,GotoIf($["${DIALSTR}" = ""]?end2)
  1941. exten => _*80.,n,Set(_AMPUSER=${AMPUSER})
  1942. exten => _*80.,n,Gosub(page,1(${DIALSTR}))
  1943. exten => _*80.,n(end2),ExecIf($[${INTERCOM_RETURN}]?Return())
  1944. exten => _*80.,n,Busy(20)
  1945. exten => _*80.,n,Macro(hangupcall,)
  1946. exten => _*80.,n(nointercom),Noop(Intercom disallowed by ${dialnumber})
  1947. exten => _*80.,n,ExecIf($[${INTERCOM_RETURN}]?Return())
  1948. exten => _*80.,n,Gosub(ext-intercom,lang-playback,1(hook_0))
  1949. exten => _*80.,n,Congestion(20)
  1950.  
  1951. exten => page,1,Set(PAGE_CONF=${EPOCH}${RAND(100,999)})
  1952. exten => page,n,Set(PAGEMODE=PAGE)
  1953. exten => page,n,Set(PAGE_MEMBERS=${ARG1})
  1954. exten => page,n,Set(PAGE_CONF_OPTS=duplex)
  1955. exten => page,n,AGI(page.agi)
  1956. exten => page,n,Set(CONFBRIDGE(user,template)=page_user_duplex)
  1957. exten => page,n,Set(CONFBRIDGE(user,admin)=yes)
  1958. exten => page,n,Set(CONFBRIDGE(user,marked)=yes)
  1959. exten => page,n,ConfBridge(${PAGE_CONF},,,admin_menu)
  1960. exten => page,n,Hangup
  1961.  
  1962. exten => en,1(hook_0),Playback(intercom&for&extension)
  1963. exten => en,n,SayDigits(${dialnumber})
  1964. exten => en,n,Playback(is&disabled)
  1965. exten => en,n,Return()
  1966.  
  1967. exten => ja,1(hook_0),Playback(extension)
  1968. exten => ja,n,SayDigits(${dialnumber})
  1969. exten => ja,n,Playback(jp-no&intercom&jp-wa&disabled-2)
  1970. exten => ja,n,Return()
  1971.  
  1972. ;--== end of [ext-intercom] ==--;
  1973.  
  1974.  
  1975. [ext-intercom-users]
  1976. include => ext-intercom-users-custom
  1977. exten => _*80XXXX,1,Goto(ext-intercom,${EXTEN},1)
  1978.  
  1979. exten => lang-playback,1,GosubIf($[${DIALPLAN_EXISTS(ext-intercom-users,${CHANNEL(language)})}]?ext-intercom-users,${CHANNEL(language)},${ARG1}():ext-intercom-users,en,${ARG1}())
  1980. exten => lang-playback,n,Return()
  1981.  
  1982. exten => *54,1,Macro(user-callerid,)
  1983. exten => *54,n,Set(CONNECTEDLINE(name-charset,i)=utf8)
  1984. exten => *54,n,Set(CONNECTEDLINE(name,i)=Intercom: Enabled)
  1985. exten => *54,n,Set(CONNECTEDLINE(num,i)=${AMPUSER})
  1986. exten => *54,n,Answer
  1987. exten => *54,n,Wait(1)
  1988. exten => *54,n,Set(DB(AMPUSER/${AMPUSER}/intercom)=enabled)
  1989. exten => *54,n,Playback(intercom&enabled)
  1990. exten => *54,n,Macro(hangupcall,)
  1991.  
  1992. exten => _*54.,1,Macro(user-callerid,)
  1993. exten => _*54.,n,Set(CONNECTEDLINE(name-charset,i)=utf8)
  1994. exten => _*54.,n,Set(CONNECTEDLINE(name,i)=Intercom from ${EXTEN:3}: Enabled)
  1995. exten => _*54.,n,Set(CONNECTEDLINE(num,i)=${AMPUSER})
  1996. exten => _*54.,n,Set(dialnumber=${EVAL(${EXTEN:3})})
  1997. exten => _*54.,n,Answer
  1998. exten => _*54.,n,Wait(1)
  1999. exten => _*54.,n,GotoIf($["${DB(AMPUSER/${AMPUSER}/intercom/${EXTEN:3})}" = "allow" ]}?unset)
  2000. exten => _*54.,n,GotoIf($[${DB_EXISTS(AMPUSER/${EXTEN:3}/device)} != 1]?invaliduser)
  2001. exten => _*54.,n,Set(DB(AMPUSER/${AMPUSER}/intercom/${EXTEN:3})=allow)
  2002. exten => _*54.,n,Gosub(ext-intercom-users,lang-playback,1(hook_1))
  2003. exten => _*54.,n,Macro(hangupcall,)
  2004. exten => _*54.,n(unset),dbDeltree(AMPUSER/${AMPUSER}/intercom/${EXTEN:3})
  2005. exten => _*54.,n,Gosub(ext-intercom-users,lang-playback,1(hook_2))
  2006. exten => _*54.,n,Macro(hangupcall,)
  2007. exten => _*54.,n(invaliduser),Gosub(ext-intercom-users,lang-playback,1(hook_3))
  2008. exten => _*54.,n,Macro(hangupcall,)
  2009.  
  2010. exten => en,1(hook_1),Playback(intercom&from&extension&number)
  2011. exten => en,n,SayDigits(${dialnumber})
  2012. exten => en,n,Playback(enabled)
  2013. exten => en,n,Return()
  2014. exten => en,n(hook_2),Playback(intercom&enabled&cancelled&for&extension&number)
  2015. exten => en,n,SayDigits(${dialnumber})
  2016. exten => en,n,Return()
  2017. exten => en,n(hook_3),Playback(extension&number)
  2018. exten => en,n,SayDigits(${dialnumber})
  2019. exten => en,n,Playback(invalid)
  2020. exten => en,n,Return()
  2021. exten => en,n(hook_4),Playback(intercom&from&extension&number)
  2022. exten => en,n,SayDigits(${dialnumber})
  2023. exten => en,n,Playback(disabled)
  2024. exten => en,n,Return()
  2025. exten => en,n(hook_5),Playback(intercom&disabled&cancelled&for&extension&number)
  2026. exten => en,n,SayDigits(${dialnumber})
  2027. exten => en,n,Return()
  2028. exten => en,n(hook_6),Playback(extension&number)
  2029. exten => en,n,SayDigits(${dialnumber})
  2030. exten => en,n,Playback(invalid)
  2031. exten => en,n,Return()
  2032.  
  2033. exten => ja,1(hook_1),Playback(extension)
  2034. exten => ja,n,SayDigits(${dialnumber})
  2035. exten => ja,n,Playback(jp-kara&jp-no&intercom&jp-wo&allow)
  2036. exten => ja,n,Return()
  2037. exten => ja,n(hook_2),Playback(extension)
  2038. exten => ja,n,SayDigits(${dialnumber})
  2039. exten => ja,n,Playback(jp-kara&jp-no&intercom&setting&jp-wo&cancelled)
  2040. exten => ja,n,Return()
  2041. exten => ja,n(hook_3),Playback(extension)
  2042. exten => ja,n,SayDigits(${dialnumber})
  2043. exten => ja,n,Playback(invalid)
  2044. exten => ja,n,Return()
  2045. exten => ja,n(hook_4),Playback(extension)
  2046. exten => ja,n,SayDigits(${dialnumber})
  2047. exten => ja,n,Playback(jp-kara&jp-no&intercom&jp-wo&deny)
  2048. exten => ja,n,Return()
  2049. exten => ja,n(hook_5),Playback(extension)
  2050. exten => ja,n,SayDigits(${dialnumber})
  2051. exten => ja,n,Playback(jp-kara&jp-no&intercom&setting&jp-wo&cancelled)
  2052. exten => ja,n,Return()
  2053. exten => ja,n(hook_6),Playback(extension)
  2054. exten => ja,n,SayDigits(${dialnumber})
  2055. exten => ja,n,Playback(invalid)
  2056. exten => ja,n,Return()
  2057.  
  2058. exten => *55,1,Macro(user-callerid,)
  2059. exten => *55,n,Set(CONNECTEDLINE(name-charset,i)=utf8)
  2060. exten => *55,n,Set(CONNECTEDLINE(name,i)=Intercom: Disabled)
  2061. exten => *55,n,Set(CONNECTEDLINE(num,i)=${AMPUSER})
  2062. exten => *55,n,Answer
  2063. exten => *55,n,Wait(1)
  2064. exten => *55,n,Set(DB(AMPUSER/${AMPUSER}/intercom)=disabled)
  2065. exten => *55,n,Playback(intercom&disabled)
  2066. exten => *55,n,Macro(hangupcall,)
  2067.  
  2068. exten => _*55.,1,Macro(user-callerid,)
  2069. exten => _*55.,n,Set(CONNECTEDLINE(name-charset,i)=utf8)
  2070. exten => _*55.,n,Set(CONNECTEDLINE(name,i)=Intercom from ${EXTEN:3}: Disabled)
  2071. exten => _*55.,n,Set(CONNECTEDLINE(num,i)=${AMPUSER})
  2072. exten => _*55.,n,Set(dialnumber=${EVAL(${EXTEN:3})})
  2073. exten => _*55.,n,Answer
  2074. exten => _*55.,n,Wait(1)
  2075. exten => _*55.,n,GotoIf($["${DB(AMPUSER/${AMPUSER}/intercom/${EXTEN:3})}" = "deny" ]}?unset2)
  2076. exten => _*55.,n,GotoIf($[${DB_EXISTS(AMPUSER/${EXTEN:3}/device)} != 1]?invaliduser2)
  2077. exten => _*55.,n,Set(DB(AMPUSER/${AMPUSER}/intercom/${EXTEN:3})=deny)
  2078. exten => _*55.,n,Gosub(ext-intercom-users,lang-playback,1(hook_4))
  2079. exten => _*55.,n,Macro(hangupcall,)
  2080. exten => _*55.,n(unset2),dbDeltree(AMPUSER/${AMPUSER}/intercom/${EXTEN:3})
  2081. exten => _*55.,n,Gosub(ext-intercom-users,lang-playback,1(hook_5))
  2082. exten => _*55.,n,Macro(hangupcall,)
  2083. exten => _*55.,n(invaliduser2),Gosub(ext-intercom-users,lang-playback,1(hook_6))
  2084. exten => _*55.,n,Macro(hangupcall,)
  2085.  
  2086. ;--== end of [ext-intercom-users] ==--;
  2087.  
  2088.  
  2089. [macro-autoanswer]
  2090. include => macro-autoanswer-custom
  2091. exten => s,1,GotoIf($["${KNOWNDIAL}" != ""]?knowndial)
  2092. exten => s,n,Set(DEVICE=${DB(DEVICE/${ARG1}/dial)})
  2093. exten => s,n,GotoIf($["${DEVICE:0:5}" == "PJSIP" ]?dopjsip)
  2094. exten => s,n,Set(KNOWNDIAL=${DEVICE})
  2095. exten => s,n,Goto(knowndial)
  2096. exten => s,n(dopjsip),Set(KNOWNDIAL=${PJSIP_DIAL_CONTACTS(${ARG1})})
  2097. exten => s,n,GotoIf($[${REGEX("&" ${KNOWNDIAL})} == 0]?knowndial)
  2098. exten => s,n,Gosub(app-paging,ssetup,1())
  2099. exten => s,n,Set(PAGEMODE=PAGE)
  2100. exten => s,n,Set(PAGE_CONF_OPTS=duplex)
  2101. exten => s,n,Set(STREAM=NONE)
  2102. exten => s,n,Set(PAGE_MEMBERS=${ARG1})
  2103. exten => s,n,AGI(page.agi)
  2104. exten => s,n,Set(CONFBRIDGE(user,template)=page_user_duplex)
  2105. exten => s,n,Set(CONFBRIDGE(user,admin)=yes)
  2106. exten => s,n,Set(CONFBRIDGE(user,marked)=yes)
  2107. exten => s,n,ConfBridge(${PAGE_CONF},,,admin_menu)
  2108. exten => s,n,Hangup
  2109. exten => s,n(knowndial),Set(DIAL=${KNOWNDIAL})
  2110. exten => s,n,ExecIf($["${DIAL:0:3}" = "ZAP"]?Set(DIAL=DAHDI${DIAL:3}))
  2111. exten => s,n,GotoIf($["${DB(DEVICE/${ARG1}/autoanswer/macro)}" != "" ]?macro)
  2112. exten => s,n,GotoIf($["${DIAL:0:5}" = "PJSIP"]?pjsipua)
  2113. exten => s,n,Set(USERAGENT=${SIPPEER(${CUT(DIAL,/,2)},useragent)})
  2114. exten => s,n,Goto(uafin)
  2115. exten => s,n(pjsipua),Set(AOR=${CUT(DIAL,/,2)})
  2116. exten => s,n,Set(CONTACT=${PJSIP_AOR(${AOR},contact)})
  2117. exten => s,n,Set(USERAGENT=${PJSIP_CONTACT(${CONTACT},user_agent)})
  2118. exten => s,n(uafin),ExecIf($["${KNOWNAGENT}" != ""]?Set(USERAGENT=${KNOWNAGENT}))
  2119. exten => s,n,ExecIf($["${LEN(${PVOL})}" != "0"]?Set(PAGE_VOL=\;volume=${PVOL}))
  2120. exten => s,n,ExecIf($["${USERAGENT:0:6}" = "Digium"]?Set(ALERTINFO=ring-answer))
  2121. exten => s,n,ExecIf($["${USERAGENT:0:5}" = "Mitel"]?Set(CALLINFO=<sip:broadworks.net>\;answer-after=0))
  2122. exten => s,n,ExecIf($["${USERAGENT:0:9}" = "OpenStage"]?Set(ALERTINFO=<http://example.com>\;info=alert-autoanswer))
  2123. exten => s,n,ExecIf($["${USERAGENT:0:9}" = "Panasonic"]?Set(ALERTINFO=Intercom))
  2124. exten => s,n,ExecIf($["${USERAGENT:0:7}" = "Polycom"]?Set(ALERTINFO=Alert-Info: Auto Answer))
  2125. exten => s,n,ExecIf($["${USERAGENT:0:7}" = "Sangoma"]?Set(ALERTINFO=<http://www.sangoma.com>\;info=external${PAGE_VOL}))
  2126. exten => s,n,ExecIf($["${SIPURI}" != ""]?Set(__SIP_URI_OPTIONS=${SIPURI}))
  2127. exten => s,n+2(macro),Macro(${DB(DEVICE/${ARG1}/autoanswer/macro)},${ARG1})
  2128.  
  2129. ;--== end of [macro-autoanswer] ==--;
  2130.  
  2131.  
  2132. [autoanswer]
  2133. include => autoanswer-custom
  2134. exten => s,1,GosubIf($["${ARG1}" != ""]?func-set-sipheader,s,1(Alert-Info,${ARG1}))
  2135. exten => s,n,GosubIf($["${ARG2}" != ""]?func-set-sipheader,s,1(Call-Info,${ARG2}))
  2136. exten => s,n,Gosub(func-apply-sipheaders,s,1())
  2137. exten => s,n,Return()
  2138.  
  2139. ;--== end of [autoanswer] ==--;
  2140.  
  2141.  
  2142. [app-paging]
  2143. include => app-paging-custom
  2144. exten => ssetup,1,Set(_SIPURI=)
  2145. exten => ssetup,n,Set(_ALERTINFO=Ring Answer)
  2146. exten => ssetup,n,Set(_CALLINFO=<uri>\;answer-after=0)
  2147. exten => ssetup,n,Set(_SIPURI=intercom=true)
  2148. exten => ssetup,n,Set(_DTIME=5)
  2149. exten => ssetup,n,Set(_ANSWERMACRO=)
  2150. exten => ssetup,n,Set(PAGE_CONF=${EPOCH}${RAND(100,999)})
  2151. exten => ssetup,n,Return()
  2152.  
  2153. exten => _PAGE.,1(SKIPCHECK),Macro(autoanswer,${EXTEN:4})
  2154. exten => _PAGE.,n,Noop(${EXTRINGTIME})
  2155. exten => _PAGE.,n,GotoIf($["${EXTRINGTIME}" != "true"]?doptions)
  2156. exten => _PAGE.,n,Set(_DTIME=${RINGTIMER_DEFAULT})
  2157. exten => _PAGE.,n,ExecIf($["${DB(AMPUSER/${EXTEN:4}/ringtimer)}" != "" & ${DB(AMPUSER/${EXTEN:4}/ringtimer)} > 0]?Set(_DTIME=${DB(AMPUSER/${EXTEN:4}/ringtimer)}))
  2158. exten => _PAGE.,n(doptions),ExecIf($["${DOPTIONS}" = ""]?Set(_DOPTIONS=b(autoanswer^s^1(${ALERTINFO},${CALLINFO}))))
  2159. exten => _PAGE.,n,Dial(${DIAL},${DTIME},A(${ANNOUNCEMENT})${DOPTIONS})
  2160. exten => _PAGE.,n(skipself),Hangup
  2161.  
  2162. exten => _SPAGE.,1(chanspy),ChanSpy(${SP_DEVICE}-,qW)
  2163. exten => _SPAGE.,n,Hangup
  2164.  
  2165. ;--== end of [app-paging] ==--;
  2166.  
  2167.  
  2168. [app-page-stream]
  2169. include => app-page-stream-custom
  2170. exten => s,1,Wait(1)
  2171. exten => s,n,Answer
  2172. exten => s,n,Set(CONFBRIDGE(user,template)=page_user_duplex)
  2173. exten => s,n,Set(CONFBRIDGE(user,marked)=yes)
  2174. exten => s,n,ConfBridge(${PAGE_CONF},,,)
  2175. exten => s,n,Hangup
  2176.  
  2177. ;--== end of [app-page-stream] ==--;
  2178.  
  2179.  
  2180. [macro-parked-call]
  2181. include => macro-parked-call-custom
  2182. exten => s,1,Macro(user-callerid,)
  2183. exten => s,n,Gosub(sub-record-check,s,1(parking,${AMPUSER},${AMPUSER}))
  2184. exten => s,n,Noop(PARKRETURNTO: ${SHARED(PARKRETURNTO,${CHANNEL})})
  2185. exten => s,n,GotoIf($[${LEN(${SHARED(PARKRETURNTO,${CHANNEL})})} > 0]?backtosender)
  2186. exten => s,n,GotoIf($[${LEN(${BLINDTRANSFER})} > 0 | ${LEN(${ATTENDEDTRANSFER})} > 0]?attemptpark)
  2187. exten => s,n,AGI(parkfetch.agi,${ARG1},${ARG2})
  2188. exten => s,n,GotoIf($["${REC_STATUS}" != "RECORDING"]?next)
  2189. exten => s,n,Set(AUDIOHOOK_INHERIT(MixMonitor)=yes)
  2190. exten => s,n,Set(CDR(recordingfile)=${CALLFILENAME}.${MON_FMT})
  2191. exten => s,n(next),Set(CCSS_SETUP=TRUE)
  2192. exten => s,n,GotoIf($["${PARKIE}" != ""]?pcall)
  2193. exten => s,n,ResetCDR()
  2194. exten => s,n,Set(CDR_PROP(disable)=true)
  2195. exten => s,n,Wait(1)
  2196. exten => s,n,Playback(pbx-invalidpark)
  2197. exten => s,n,Wait(1)
  2198. exten => s,n,Hangup
  2199. exten => s,n(pcall),Noop(User: ${CALLERID(all)} attempting to pick up Parked Call Slot ${ARG1})
  2200. exten => s,n,Noop(PARKIE: ${PARKIE})
  2201. exten => s,n,Set(SHARED(PARKRETURNTO,${PARKIE})=)
  2202. exten => s,n,Set(PARKOWNER=1)
  2203. exten => s,n,ParkedCall(${ARG2},${ARG1})
  2204. exten => s,n,Hangup
  2205. exten => s,n(attemptpark),Noop(User: ${CALLERID(all)} attempting to Park into slot ${ARG1})
  2206. exten => s,n,Noop(Blind Transfer: ${BLINDTRANSFER}, Attended Transfer: ${ATTENDEDTRANSFER})
  2207. exten => s,n,Noop($[${LEN(${PARKOWNER})} = 0])
  2208. exten => s,n,GotoIf($[${LEN(${PARKOWNER})} = 0]?parkit)
  2209. exten => s,n,Macro(hangupcall,)
  2210. exten => s,n(parkit),Set(PARKINGEXTEN=${ARG1})
  2211. exten => s,n,ExecIf($[${LEN(${BLINDTRANSFER})} > 0]?Set(SHARED(PARKRETURNTO,${CHANNEL})=${CUT(BLINDTRANSFER,-,1)}):Set(SHARED(PARKRETURNTO,${CHANNEL})=${CUT(ATTENDEDTRANSFER,-,1)}))
  2212. exten => s,n,Noop(PARKRETURNTO: ${SHARED(PARKRETURNTO,${CHANNEL})})
  2213. exten => s,n,Park(${ARG2},sc(${CONTEXT},s,200))
  2214. exten => s,1+199(backtosender),Noop(Attempting to go back to sender)
  2215. exten => s,n,Set(PARKCALLBACK=${PARKER})
  2216. exten => s,n,Set(SHARED(PARKRETURNTO,${CHANNEL})=)
  2217. exten => s,n,Goto(park-return-routing,${PARKINGSLOT},1)
  2218.  
  2219. exten => h,1,Macro(hangupcall,)
  2220.  
  2221. ;--== end of [macro-parked-call] ==--;
  2222.  
  2223.  
  2224. [parkedcallstimeout]
  2225. include => parkedcallstimeout-custom
  2226. exten => _[0-9a-zA-Z*#].,1,Set(PARKCALLBACK=${REPLACE(EXTEN,_,/)})
  2227. exten => _[0-9a-zA-Z*#].,n,GotoIf($["${REC_STATUS}" != "RECORDING"]?next)
  2228. exten => _[0-9a-zA-Z*#].,n,Set(AUDIOHOOK_INHERIT(MixMonitor)=yes)
  2229. exten => _[0-9a-zA-Z*#].,n,MixMonitor(${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MIXMON_FORMAT},a,${MIXMON_POST})
  2230. exten => _[0-9a-zA-Z*#].,n(next),Goto(park-return-routing,${PARKINGSLOT},1)
  2231.  
  2232. ;--== end of [parkedcallstimeout] ==--;
  2233.  
  2234.  
  2235. [park-dial]
  2236. include => park-dial-custom
  2237. exten => t,1,Noop(WARNING: PARKRETURN to: [${EXTEN}] failed with: [${DIALSTATUS}]. Trying Alternate Dest On Parking Lot ${PARKINGSLOT})
  2238. exten => t,n,Goto(park-orphan-routing,70,1)
  2239.  
  2240. exten => _[0-9a-zA-Z*#].,1,Noop(WARNING: PARKRETURN to: [${EXTEN}] failed with: [${DIALSTATUS}]. Trying Alternate Dest On Parking Lot ${PARKINGSLOT})
  2241. exten => _[0-9a-zA-Z*#].,n,Goto(park-orphan-routing,70,1)
  2242.  
  2243. ;--== end of [park-dial] ==--;
  2244.  
  2245.  
  2246. [park-orphan-routing]
  2247. include => park-orphan-routing-custom
  2248. exten => 70,1,Goto(app-blackhole,hangup,1)
  2249.  
  2250. ;--== end of [park-orphan-routing] ==--;
  2251.  
  2252.  
  2253. [park-return-routing]
  2254. include => park-return-routing-custom
  2255. exten => 70,1,Set(PLOT=70)
  2256. exten => 70,n,ExecIf($["${ALERT_INFO}"!=""]?Set(HASH(__SIPHEADERS,Alert-Info)=${ALERT_INFO}))
  2257. exten => 70,n,ExecIf($["${RVOL}"!=""]?Set(HASH(__SIPHEADERS,Alert-Info)=${ALERT_INFO}\;volume=${RVOL}))
  2258. exten => 70,n,Dial(${PARKCALLBACK},15,b(func-apply-sipheaders^s^1),tr)
  2259. exten => 70,n,Set(PARKCALLBACK=)
  2260. exten => 70,n,Goto(app-blackhole,hangup,1)
  2261.  
  2262. exten => 71,1,Goto(70,1)
  2263.  
  2264. exten => 72,1,Goto(70,1)
  2265.  
  2266. exten => 73,1,Goto(70,1)
  2267.  
  2268. exten => 74,1,Goto(70,1)
  2269.  
  2270. exten => 75,1,Goto(70,1)
  2271.  
  2272. exten => 76,1,Goto(70,1)
  2273.  
  2274. exten => 77,1,Goto(70,1)
  2275.  
  2276. exten => 78,1,Goto(70,1)
  2277.  
  2278. ;--== end of [park-return-routing] ==--;
  2279.  
  2280.  
  2281. [park-hints]
  2282. include => park-hints-custom
  2283. include => parkedcalls ; Default Lot
  2284. exten => 71,1,Macro(parked-call,71,default)
  2285. exten => 71,hint,park:71@parkedcalls
  2286.  
  2287. exten => *8571,1,Set(FORCEPICKUP=default)
  2288. exten => *8571,n,Macro(parked-call,71,default)
  2289. exten => *8571,hint,park:71@parkedcalls
  2290.  
  2291. exten => 72,1,Macro(parked-call,72,default)
  2292. exten => 72,hint,park:72@parkedcalls
  2293.  
  2294. exten => *8572,1,Set(FORCEPICKUP=default)
  2295. exten => *8572,n,Macro(parked-call,72,default)
  2296. exten => *8572,hint,park:72@parkedcalls
  2297.  
  2298. exten => 73,1,Macro(parked-call,73,default)
  2299. exten => 73,hint,park:73@parkedcalls
  2300.  
  2301. exten => *8573,1,Set(FORCEPICKUP=default)
  2302. exten => *8573,n,Macro(parked-call,73,default)
  2303. exten => *8573,hint,park:73@parkedcalls
  2304.  
  2305. exten => 74,1,Macro(parked-call,74,default)
  2306. exten => 74,hint,park:74@parkedcalls
  2307.  
  2308. exten => *8574,1,Set(FORCEPICKUP=default)
  2309. exten => *8574,n,Macro(parked-call,74,default)
  2310. exten => *8574,hint,park:74@parkedcalls
  2311.  
  2312. exten => 75,1,Macro(parked-call,75,default)
  2313. exten => 75,hint,park:75@parkedcalls
  2314.  
  2315. exten => *8575,1,Set(FORCEPICKUP=default)
  2316. exten => *8575,n,Macro(parked-call,75,default)
  2317. exten => *8575,hint,park:75@parkedcalls
  2318.  
  2319. exten => 76,1,Macro(parked-call,76,default)
  2320. exten => 76,hint,park:76@parkedcalls
  2321.  
  2322. exten => *8576,1,Set(FORCEPICKUP=default)
  2323. exten => *8576,n,Macro(parked-call,76,default)
  2324. exten => *8576,hint,park:76@parkedcalls
  2325.  
  2326. exten => 77,1,Macro(parked-call,77,default)
  2327. exten => 77,hint,park:77@parkedcalls
  2328.  
  2329. exten => *8577,1,Set(FORCEPICKUP=default)
  2330. exten => *8577,n,Macro(parked-call,77,default)
  2331. exten => *8577,hint,park:77@parkedcalls
  2332.  
  2333. exten => 78,1,Macro(parked-call,78,default)
  2334. exten => 78,hint,park:78@parkedcalls
  2335.  
  2336. exten => *8578,1,Set(FORCEPICKUP=default)
  2337. exten => *8578,n,Macro(parked-call,78,default)
  2338. exten => *8578,hint,park:78@parkedcalls
  2339.  
  2340. exten => 70,hint,park:71@parkedcalls&park:72@parkedcalls&park:73@parkedcalls&park:74@parkedcalls&park:75@parkedcalls&park:76@parkedcalls&park:77@parkedcalls&park:78@parkedcalls
  2341. ;--== end of [park-hints] ==--;
  2342.  
  2343.  
  2344. [app-parking]
  2345. include => app-parking-custom
  2346. exten => *88,1,Park()
  2347.  
  2348. ;--== end of [app-parking] ==--;
  2349.  
  2350.  
  2351. [app-pbdirectory]
  2352. include => app-pbdirectory-custom
  2353. exten => 411,1,Goto(pbdirectory,1)
  2354.  
  2355. exten => pbdirectory,1,Answer
  2356. exten => pbdirectory,n,Wait(1)
  2357. exten => pbdirectory,n,Macro(user-callerid,)
  2358. exten => pbdirectory,n,AGI(pbdirectory)
  2359. exten => pbdirectory,n,GotoIf($["${dialnumber}"=""]?hangup,1)
  2360. exten => pbdirectory,n,Noop(Got number to dial: ${dialnumber})
  2361. exten => pbdirectory,n,Dial(Local/${dialnumber}@from-internal/n,)
  2362.  
  2363. exten => hangup,1,Hangup
  2364.  
  2365. ;--== end of [app-pbdirectory] ==--;
  2366.  
  2367.  
  2368. [play-system-recording]
  2369. include => play-system-recording-custom
  2370. exten => 1,1,Answer
  2371. exten => 1,n,Playback(custom/test1)
  2372. exten => 1,n,Hangup
  2373.  
  2374. exten => 2,1,Answer
  2375. exten => 2,n,Playback(custom/sub-01)
  2376. exten => 2,n,Hangup
  2377.  
  2378. ;--== end of [play-system-recording] ==--;
  2379.  
  2380.  
  2381. [systemrecording-gui]
  2382. include => systemrecording-gui-custom
  2383. exten => dorecord,1,Record(${RECFILE}.wav,,,k)
  2384.  
  2385. exten => h,1,System(touch ${RECFILE}.finished)
  2386. exten => h,n(exit),Hangup
  2387.  
  2388. ;--== end of [systemrecording-gui] ==--;
  2389.  
  2390.  
  2391. [macro-systemrecording]
  2392. include => macro-systemrecording-custom
  2393. exten => s,1,GotoIf($["${ARG2}" = ""]?invalid)
  2394. exten => s,n,Set(TMPLANG=${CHANNEL(language)})
  2395. exten => s,n,Set(RECFILE=${TMPLANG}/${ARG2})
  2396. exten => s,n,Set(LISTEN=docheck)
  2397. exten => s,n,ExecIf($["${ARG3}" != ""]?Authenticate(${ARG3}))
  2398. exten => s,n,Goto(${ARG1},1)
  2399.  
  2400. exten => dorecord,1,Set(TMPRECFILE=${RECFILE}-TMP)
  2401. exten => dorecord,n,Background(say-temp-msg-prs-pound,,${CHANNEL(language)})
  2402. exten => dorecord,n,Record(${TMPRECFILE}.${CHANNEL(audioreadformat)},,,k)
  2403. exten => dorecord,n,Set(LISTEN=dochecknolanguage)
  2404. exten => dorecord,n,Goto(confmenu,1)
  2405.  
  2406. exten => dochecknolanguage,1,Playback(beep)
  2407. exten => dochecknolanguage,n(dc_start),Background(${TMPRECFILE},m,,macro-systemrecording)
  2408. exten => dochecknolanguage,n,Wait(1)
  2409. exten => dochecknolanguage,n,Goto(confmenu,1)
  2410.  
  2411. exten => docheck,1,Playback(beep)
  2412. exten => docheck,n(dc_start),Background(${RECFILE},m,${CHANNEL(language)},macro-systemrecording)
  2413. exten => docheck,n,Wait(1)
  2414. exten => docheck,n,Goto(confmenu,1)
  2415.  
  2416. exten => confmenu,1,Background(to-listen-to-it&press-1&to-accept-recording&press-2&to-rerecord-it&press-star&language&press-3,m,${CHANNEL(language)},macro-systemrecording)
  2417. exten => confmenu,n,Read(RECRESULT,,1,,,4)
  2418. exten => confmenu,n,GotoIf($["x${RECRESULT}"="x*"]?dorecord,1)
  2419. exten => confmenu,n,GotoIf($["x${RECRESULT}"="x1"]?${LISTEN},2)
  2420. exten => confmenu,n,GotoIf($["x${RECRESULT}"="x2"]?doaccept,1)
  2421. exten => confmenu,n,GotoIf($["x${RECRESULT}"="x3"]?switchlang,1)
  2422. exten => confmenu,n,Goto(1)
  2423.  
  2424. exten => doaccept,1,Set(EXISTS=${STAT(e,${ASTVARLIBDIR}/sounds/${TMPRECFILE}.${CHANNEL(audioreadformat)})})
  2425. exten => doaccept,n,Noop(${EXISTS})
  2426. exten => doaccept,n,GotoIf($["${EXISTS}" != "1"]?exit)
  2427. exten => doaccept,n,System(touch ${ASTVARLIBDIR}/sounds/${RECFILE}.finished)
  2428. exten => doaccept,n,GotoIf($["x${TMPRECFILE}"="x"]?exit)
  2429. exten => doaccept,n,System(mv ${ASTVARLIBDIR}/sounds/${TMPRECFILE}.${CHANNEL(audioreadformat)} ${ASTVARLIBDIR}/sounds/${RECFILE}.${CHANNEL(audioreadformat)})
  2430. exten => doaccept,n,Playback(wait-moment)
  2431. exten => doaccept,n,AGI(recordings.agi)
  2432. exten => doaccept,n,Set(TMPRECFILE=${RECFILE})
  2433. exten => doaccept,n(exit),Playback(auth-thankyou)
  2434. exten => doaccept,n,Goto(confmenu,1)
  2435.  
  2436. exten => switchlang,1,Playback(language&is-set-to)
  2437. exten => switchlang,n,SayAlpha(${TMPLANG})
  2438. exten => switchlang,n,Playback(after-the-tone)
  2439. exten => switchlang,n,Background(press-1)
  2440. exten => switchlang,n,SayAlpha(en)
  2441. exten => switchlang,n,Playback(beep)
  2442. exten => switchlang,n,Read(LANGRESULT,,1,,,4)
  2443. exten => switchlang,n,ExecIf($["x${LANGRESULT}"="x1"]?Set(TMPLANG=en))
  2444. exten => switchlang,n,Set(RECFILE=${TMPLANG}/${ARG2})
  2445. exten => switchlang,n,Playback(language&is-set-to)
  2446. exten => switchlang,n,SayAlpha(${TMPLANG})
  2447. exten => switchlang,n,Goto(confmenu,1)
  2448.  
  2449. exten => invalid,1,Playback(pm-invalid-option)
  2450. exten => invalid,n,Hangup
  2451.  
  2452. exten => 1,1,Goto(${LISTEN},dc_start)
  2453.  
  2454. exten => 2,1,Goto(doaccept,1)
  2455.  
  2456. exten => 3,1,Goto(switchlang,1)
  2457.  
  2458. exten => *,1,Goto(dorecord,1)
  2459.  
  2460. exten => t,1,Playback(goodbye)
  2461. exten => t,n,Hangup
  2462.  
  2463. exten => i,1,Playback(pm-invalid-option)
  2464. exten => i,n,Goto(confmenu,1)
  2465.  
  2466. exten => h,1,System(touch ${ASTVARLIBDIR}/sounds/${RECFILE}.finished)
  2467. exten => h,n,GotoIf($["x${TMPRECFILE}"="x"]?exit)
  2468. exten => h,n,System(mv ${ASTVARLIBDIR}/sounds/${TMPRECFILE}.${CHANNEL(audioreadformat)} ${ASTVARLIBDIR}/sounds/${CHANNEL(language)}/${RECFILE}.${CHANNEL(audioreadformat)})
  2469. exten => h,n(exit),Hangup
  2470.  
  2471. ;--== end of [macro-systemrecording] ==--;
  2472.  
  2473.  
  2474. [ext-group]
  2475. include => ext-group-custom
  2476. exten => h,1,Macro(hangupcall,)
  2477.  
  2478. ;--== end of [ext-group] ==--;
  2479.  
  2480.  
  2481. [macro-speeddial-lookup]
  2482. include => macro-speeddial-lookup-custom
  2483. exten => s,1,GotoIf($["${ARG2}"=""]]?lookupsys)
  2484. exten => s,n,Set(SPEEDDIALNUMBER=)
  2485. exten => s,n(lookupuser),Set(SPEEDDIALNUMBER=${DB(AMPUSER/${ARG2}/speeddials/${ARG1})})
  2486. exten => s,n,GotoIf($["${SPEEDDIALNUMBER}"=""]?lookupsys)
  2487. exten => s,n,Noop(Found speeddial ${ARG1} for user ${ARG2}: ${SPEEDDIALNUMBER})
  2488. exten => s,n,Goto(end)
  2489. exten => s,lookupuser+101(lookupsys),Set(SPEEDDIALNUMBER=${DB(sysspeeddials/${ARG1})})
  2490. exten => s,n,GotoIf($["${SPEEDDIALNUMBER}"=""]?failed)
  2491. exten => s,n,Noop(Found system speeddial ${ARG1}: ${SPEEDDIALNUMBER})
  2492. exten => s,n,Goto(end)
  2493. exten => s,lookupsys+101(failed),Noop(No system or user speeddial found)
  2494. exten => s,n(end),Noop(End of Speeddial-lookup)
  2495.  
  2496. ;--== end of [macro-speeddial-lookup] ==--;
  2497.  
  2498.  
  2499. [app-speeddial]
  2500. include => app-speeddial-custom
  2501. exten => _*0.,1,Macro(user-callerid,)
  2502. exten => _*0.,n,Set(SPEEDDIALLOCATION=${EXTEN:2})
  2503. exten => _*0.,n(lookup),Macro(speeddial-lookup,${SPEEDDIALLOCATION},${AMPUSER})
  2504. exten => _*0.,n,GotoIf($["${SPEEDDIALNUMBER}"=""]?failed)
  2505. exten => _*0.,n,Goto(from-internal,${SPEEDDIALNUMBER},1)
  2506. exten => _*0.,lookup+101(failed),Playback(speed-dial-empty)
  2507. exten => _*0.,n,Congestion()
  2508.  
  2509. exten => *75,1,Goto(app-speeddial-set,s,1)
  2510.  
  2511. ;--== end of [app-speeddial] ==--;
  2512.  
  2513.  
  2514. [app-speeddial-set]
  2515. include => app-speeddial-set-custom
  2516. exten => lang-playback,1,GosubIf($[${DIALPLAN_EXISTS(app-speeddial-set,${CHANNEL(language)})}]?app-speeddial-set,${CHANNEL(language)},${ARG1}():app-speeddial-set,en,${ARG1}())
  2517. exten => lang-playback,n,Return()
  2518.  
  2519. exten => s,1,Macro(user-callerid,)
  2520. exten => s,n(setloc),Read(newlocation,speed-enterlocation,,,,)
  2521. exten => s,n(lookup),Macro(speeddial-lookup,${newlocation},${AMPUSER})
  2522. exten => s,n,GotoIf($["${SPEEDDIALNUMBER}"!=""]?conflicts)
  2523. exten => s,n(setnum),Read(newnum,speed-enternumber,,,,)
  2524. exten => s,n(success),Set(DB(AMPUSER/${AMPUSER}/speeddials/${newlocation})=${newnum})
  2525. exten => s,n,Gosub(app-speeddial-set,lang-playback,1(hook_0))
  2526. exten => s,n,Hangup
  2527. exten => s,n(conflicts),Gosub(app-speeddial-set,lang-playback,1(hook_1))
  2528. exten => s,n,WaitExten(60,)
  2529.  
  2530. exten => 1,1,Gosub(app-speeddial-set,lang-playback,1(hook_2))
  2531. exten => 1,n,Goto(s,conflicts)
  2532.  
  2533. exten => 2,1,Goto(s,setloc)
  2534.  
  2535. exten => 3,1,Goto(s,setnum)
  2536.  
  2537. exten => t,1,Congestion()
  2538.  
  2539. exten => en,1(hook_0),Playback(speed-dial)
  2540. exten => en,n,SayDigits(${newlocation})
  2541. exten => en,n,Playback(is-set-to)
  2542. exten => en,n,SayDigits(${newnum})
  2543. exten => en,n,Return()
  2544. exten => en,n(hook_1),Playback(speed-dial)
  2545. exten => en,n,SayDigits(${newlocation})
  2546. exten => en,n,Playback(is-in-use)
  2547. exten => en,n,Background(press-1&to-listen-to-it&press-2&to-enter-a-diff&location&press-3&to-change&telephone-number)
  2548. exten => en,n,Return()
  2549. exten => en,n(hook_2),Playback(speed-dial)
  2550. exten => en,n,SayDigits(${newlocation})
  2551. exten => en,n,Playback(is-set-to)
  2552. exten => en,n,SayDigits(${SPEEDDIALNUMBER})
  2553. exten => en,n,Return()
  2554.  
  2555. exten => ja,1(hook_0),Playback(speed-dial)
  2556. exten => ja,n,SayDigits(${newlocation})
  2557. exten => ja,n,Playback(jp-wo)
  2558. exten => ja,n,SayDigits(${newnum})
  2559. exten => ja,n,Playback(is-set-to)
  2560. exten => ja,n,Return()
  2561. exten => ja,n(hook_1),Playback(speed-dial)
  2562. exten => ja,n,SayDigits(${newlocation})
  2563. exten => ja,n,Playback(jp-wa&is-in-use)
  2564. exten => ja,n,Background(list&press-1&to-enter-a-diff&location&jp-wo&to-enter&press-2&telephone-number&jp-wo&to-change&press-3)
  2565. exten => ja,n,Return()
  2566. exten => ja,n(hook_2),Playback(speed-dial)
  2567. exten => ja,n,SayDigits(${newlocation})
  2568. exten => ja,n,Playback(jp-wa)
  2569. exten => ja,n,SayDigits(${SPEEDDIALNUMBER})
  2570. exten => ja,n,Playback(is-set-to-2)
  2571. exten => ja,n,Return()
  2572.  
  2573. ;--== end of [app-speeddial-set] ==--;
  2574.  
  2575.  
  2576. [timeconditions]
  2577. include => timeconditions-custom
  2578. exten => 1,1,Set(DB(TC/1/INUSESTATE)=INUSE)
  2579. exten => 1,n,Set(DB(TC/1/NOT_INUSESTATE)=NOT_INUSE)
  2580. exten => 1,n,Noop(TIMENOW: ${STRFTIME(${EPOCH},,%H:%M,%a,%e,%b)})
  2581. exten => 1,n,Noop(TIMEMATCHED: ${IFTIME(00:00-23:59,sun-sat,1-31,jan-dec?TRUE:FALSE)})
  2582. exten => 1,n,GotoIfTime(00:00-23:59,sun-sat,1-31,jan-dec?truestate)
  2583. exten => 1,n(falsestate),GotoIf($["${DB(TC/1):0:4}" = "true"]?truegoto)
  2584. exten => 1,n,ExecIf($["${DB(TC/1)}" = "false"]?Set(DB(TC/1)=))
  2585. exten => 1,n(falsegoto),Set(DEVICE_STATE(Custom:TC1)=INUSE)
  2586. exten => 1,n,ExecIf($["${DB(TC/1)}" = "false_sticky"]?Set(DEVICE_STATE(Custom:TCSTICKY${ARG1})=INUSE))
  2587. exten => 1,n,GotoIf($["${TCRETURN}"!="RETURN"]?ivr-3,s,1)
  2588. exten => 1,n,Set(TCSTATE=false)
  2589. exten => 1,n,Set(TCOVERRIDE=${IF($["${DB(TC/1):0:5}" = "false"]?true:false)})
  2590. exten => 1,n,Return()
  2591. exten => 1,n(truestate),GotoIf($["${DB(TC/1):0:5}" = "false"]?falsegoto)
  2592. exten => 1,n,ExecIf($["${DB(TC/1)}" = "true"]?Set(DB(TC/1)=))
  2593. exten => 1,n(truegoto),Set(DEVICE_STATE(Custom:TC1)=NOT_INUSE)
  2594. exten => 1,n,ExecIf($["${DB(TC/1)}" = "true_sticky"]?Set(DEVICE_STATE(Custom:TCSTICKY${ARG1})=INUSE))
  2595. exten => 1,n,GotoIf($["${TCRETURN}"!="RETURN"]?ivr-2,s,1)
  2596. exten => 1,n,Set(TCSTATE=true)
  2597. exten => 1,n,Set(TCOVERRIDE=${IF($["${DB(TC/1):0:4}" = "true"]?true:false)})
  2598. exten => 1,n,Return()
  2599.  
  2600. ;--== end of [timeconditions] ==--;
  2601.  
  2602.  
  2603. [timeconditions-toggles]
  2604. include => timeconditions-toggles-custom
  2605. exten => *271,1,Macro(user-callerid,)
  2606. exten => *271,n,Macro(toggle-tc,1)
  2607. exten => *271,n,Hangup
  2608. exten => *271,hint,Custom:TC1
  2609.  
  2610. exten => h,1,Hangup
  2611.  
  2612. ;--== end of [timeconditions-toggles] ==--;
  2613.  
  2614.  
  2615. [macro-toggle-tc]
  2616. include => macro-toggle-tc-custom
  2617. exten => lang-playback,1,GosubIf($[${DIALPLAN_EXISTS(macro-toggle-tc,${CHANNEL(language)})}]?macro-toggle-tc,${CHANNEL(language)},${ARG1}():macro-toggle-tc,en,${ARG1}())
  2618. exten => lang-playback,n,Return()
  2619.  
  2620. exten => s,1,GotoIf($[${ARG2} > 0]?hasauth:toggle)
  2621. exten => s,n(hasauth),Authenticate(${ARG2},)
  2622. exten => s,n(toggle),Set(INDEXES=${ARG1})
  2623. exten => s,n,Set(TCRETURN=RETURN)
  2624. exten => s,n,Set(TCSTATE=false)
  2625. exten => s,n,Set(TCINUSE=${DB(TC/${ARG1}/INUSESTATE)})
  2626. exten => s,n,Set(TCNOTINUSE=${DB(TC/${ARG1}/NOT_INUSESTATE)})
  2627. exten => s,n,Set(LOOPCNT=${FIELDQTY(INDEXES,&)})
  2628. exten => s,n,Set(ITER=1)
  2629. exten => s,n(begin1),Set(INDEX=${CUT(INDEXES,&,${ITER})})
  2630. exten => s,n,Gosub(timeconditions,${INDEX},1())
  2631. exten => s,n,Set(TCSTATE_${INDEX}=${TCSTATE})
  2632. exten => s,n,ExecIf($["${TCOVERRIDE}" = "true"]?Set(OVERRIDE=true))
  2633. exten => s,n(end1),Set(ITER=$[${ITER} + 1])
  2634. exten => s,n,GotoIf($[${ITER} <= ${LOOPCNT}]?begin1)
  2635. exten => s,n,Set(LOOPCNT=${FIELDQTY(INDEXES,&)})
  2636. exten => s,n,Set(ITER=1)
  2637. exten => s,n(begin2),Set(INDEX=${CUT(INDEXES,&,${ITER})})
  2638. exten => s,n,Set(DB(TC/${INDEX})=${IF($["${OVERRIDE}" = "true"]?:${IF($["${TCSTATE_${INDEX}}" == "true"]?false:true)})})
  2639. exten => s,n,Gosub(timeconditions,${INDEX},1())
  2640. exten => s,n(end2),Set(ITER=$[${ITER} + 1])
  2641. exten => s,n,GotoIf($[${ITER} <= ${LOOPCNT}]?begin2)
  2642. exten => s,n(playback),Gosub(macro-toggle-tc,lang-playback,1(hook_0))
  2643.  
  2644. exten => en,1(hook_0),Playback(beep&silence/1&time&${IF($["${TCSTATE}" = "true"]?de-activated:activated)})
  2645.  
  2646. exten => ja,1(hook_0),Playback(beep&silence/1&time-change&${IF($["${TCSTATE}" = "true"]?de-activated:activated)})
  2647.  
  2648. ;--== end of [macro-toggle-tc] ==--;
  2649.  
  2650.  
  2651. [vm-callme]
  2652. include => vm-callme-custom
  2653. exten => s,1,Answer
  2654. exten => s,n,Wait(1)
  2655. exten => s,n(repeat),Background(${MSG}&silence/2&vm-repeat&vm-starmain)
  2656. exten => s,n,WaitExten(15,)
  2657.  
  2658. exten => 5,1,Goto(s,repeat)
  2659.  
  2660. exten => #,1,Playback(vm-goodbye)
  2661. exten => #,n,Hangup
  2662.  
  2663. exten => *,1,Macro(get-vmcontext,${MBOX})
  2664. exten => *,n,VoiceMailMain(${MBOX}@${VMCONTEXT},s)
  2665.  
  2666. exten => i,1,Playback(pm-invalid-option)
  2667. exten => i,n,Goto(s,repeat)
  2668.  
  2669. exten => t,1,Playback(vm-goodbye)
  2670. exten => t,n,Hangup
  2671.  
  2672. exten => h,1,Hangup
  2673.  
  2674. ;--== end of [vm-callme] ==--;
  2675.  
  2676.  
  2677. [app-dialvm]
  2678. include => app-dialvm-custom
  2679. exten => *98,1,Macro(user-callerid,)
  2680. exten => *98,n,Set(CONNECTEDLINE(name-charset,i)=utf8)
  2681. exten => *98,n,Set(CONNECTEDLINE(name,i)=Dial Voicemail)
  2682. exten => *98,n,Set(CONNECTEDLINE(num,i)=${EXTEN})
  2683. exten => *98,n,Answer
  2684. exten => *98,n(start),Wait(1)
  2685. exten => *98,n,Noop(app-dialvm: Asking for mailbox)
  2686. exten => *98,n,Read(MAILBOX,vm-login,,,3,2)
  2687. exten => *98,n(check),GotoIf($["${MAILBOX}" = ""]?hangup)
  2688. exten => *98,n,Noop(app-dialvm: Got Mailbox ${MAILBOX})
  2689. exten => *98,n,Macro(get-vmcontext,${MAILBOX})
  2690. exten => *98,n,Set(VMBOXEXISTSSTATUS=${IF(${VM_INFO(${MAILBOX}@${VMCONTEXT},exists)}?SUCCESS:FAILED)})
  2691. exten => *98,n,GotoIf($["${VMBOXEXISTSSTATUS}" = "SUCCESS"]?good:bad)
  2692. exten => *98,n,Macro(hangupcall,)
  2693. exten => *98,n(good),Noop(app-dialvm: Good mailbox ${MAILBOX}@${VMCONTEXT})
  2694. exten => *98,n,VoiceMailMain(${MAILBOX}@${VMCONTEXT})
  2695. exten => *98,n,GotoIf($["${IVR_RETVM}" = "RETURN" & "${IVR_CONTEXT}" != ""]?playret)
  2696. exten => *98,n,Macro(hangupcall,)
  2697. exten => *98,n(bad),Noop(app-dialvm: BAD mailbox ${MAILBOX}@${VMCONTEXT})
  2698. exten => *98,n,Wait(1)
  2699. exten => *98,n,Noop(app-dialvm: Asking for password so people can't probe for existence of a mailbox)
  2700. exten => *98,n,Read(FAKEPW,vm-password,,,3,2)
  2701. exten => *98,n,Noop(app-dialvm: Asking for mailbox again)
  2702. exten => *98,n,Read(MAILBOX,vm-incorrect-mailbox,,,3,2)
  2703. exten => *98,n,Goto(check)
  2704. exten => *98,n,Macro(hangupcall,)
  2705. exten => *98,n(hangup),Playback(vm-incorrect&vm-goodbye)
  2706. exten => *98,n,Macro(hangupcall,)
  2707. exten => *98,n(playret),Playback(beep&you-will-be-transfered-menu&silence/1)
  2708. exten => *98,n,Goto(${IVR_CONTEXT},return,1)
  2709.  
  2710. exten => *988000,1,Goto(dvm${EXTEN:3},1)
  2711.  
  2712. exten => _dvm.,1,Set(CONNECTEDLINE(name-charset,i)=utf8)
  2713. exten => _dvm.,n,Set(CONNECTEDLINE(name,i)=Dial Voicemail)
  2714. exten => _dvm.,n,Set(CONNECTEDLINE(num,i)=${EXTEN:3})
  2715. exten => _dvm.,n,Answer
  2716. exten => _dvm.,n,Wait(1)
  2717. exten => _dvm.,n,Macro(get-vmcontext,${EXTEN:3})
  2718. exten => _dvm.,n,VoiceMailMain(${EXTEN:3}@${VMCONTEXT})
  2719. exten => _dvm.,n,GotoIf($["${IVR_RETVM}" = "RETURN" & "${IVR_CONTEXT}" != ""]?${IVR_CONTEXT},return,1)
  2720. exten => _dvm.,n,Macro(hangupcall,)
  2721.  
  2722. exten => _*98X.,hint,MWI:${EXTEN:3}@${DB(AMPUSER/${EXTEN:3}/voicemail)}
  2723. ;--== end of [app-dialvm] ==--;
  2724.  
  2725.  
  2726. [ext-local]
  2727. include => ext-local-custom
  2728. exten => *8000,1,Set(CONNECTEDLINE(name-charset,i)=utf8)
  2729. exten => *8000,n,Set(CONNECTEDLINE(name,i)=8000 Voicemail)
  2730. exten => *8000,n,Set(CONNECTEDLINE(num,i)=8000)
  2731. exten => *8000,n,Macro(vm,8000,DIRECTDIAL,${IVR_RETVM})
  2732. exten => *8000,n,Goto(vmret,1)
  2733.  
  2734. exten => 1000,1,Set(__RINGTIMER=${IF($["${DB(AMPUSER/1000/ringtimer)}" > "0"]?${DB(AMPUSER/1000/ringtimer)}:${RINGTIMER_DEFAULT})})
  2735. exten => 1000,n,Macro(exten-vm,novm,1000,0,0,0)
  2736. exten => 1000,n(dest),Set(__PICKUPMARK=)
  2737. exten => 1000,n,Goto(${IVR_CONTEXT},return,1)
  2738. exten => 1000,hint,PJSIP/1000&Custom:DND1000,CustomPresence:1000
  2739.  
  2740. exten => 1001,1,Set(__RINGTIMER=${IF($["${DB(AMPUSER/1001/ringtimer)}" > "0"]?${DB(AMPUSER/1001/ringtimer)}:${RINGTIMER_DEFAULT})})
  2741. exten => 1001,n,Macro(exten-vm,novm,1001,0,0,0)
  2742. exten => 1001,n(dest),Set(__PICKUPMARK=)
  2743. exten => 1001,n,Goto(${IVR_CONTEXT},return,1)
  2744. exten => 1001,hint,PJSIP/1001&Custom:DND1001,CustomPresence:1001
  2745.  
  2746. exten => 1002,1,Set(__RINGTIMER=${IF($["${DB(AMPUSER/1002/ringtimer)}" > "0"]?${DB(AMPUSER/1002/ringtimer)}:${RINGTIMER_DEFAULT})})
  2747. exten => 1002,n,Macro(exten-vm,novm,1002,0,0,0)
  2748. exten => 1002,n(dest),Set(__PICKUPMARK=)
  2749. exten => 1002,n,Goto(${IVR_CONTEXT},return,1)
  2750. exten => 1002,hint,PJSIP/1002&Custom:DND1002,CustomPresence:1002
  2751.  
  2752. exten => 1003,1,Set(__RINGTIMER=${IF($["${DB(AMPUSER/1003/ringtimer)}" > "0"]?${DB(AMPUSER/1003/ringtimer)}:${RINGTIMER_DEFAULT})})
  2753. exten => 1003,n,Macro(exten-vm,novm,1003,0,0,0)
  2754. exten => 1003,n(dest),Set(__PICKUPMARK=)
  2755. exten => 1003,n,Goto(${IVR_CONTEXT},return,1)
  2756. exten => 1003,hint,PJSIP/1003&Custom:DND1003,CustomPresence:1003
  2757.  
  2758. exten => 1004,1,Set(__RINGTIMER=${IF($["${DB(AMPUSER/1004/ringtimer)}" > "0"]?${DB(AMPUSER/1004/ringtimer)}:${RINGTIMER_DEFAULT})})
  2759. exten => 1004,n,Macro(exten-vm,novm,1004,0,0,0)
  2760. exten => 1004,n(dest),Set(__PICKUPMARK=)
  2761. exten => 1004,n,Goto(${IVR_CONTEXT},return,1)
  2762. exten => 1004,hint,PJSIP/1004&Custom:DND1004,CustomPresence:1004
  2763.  
  2764. exten => 8000,1,Set(__RINGTIMER=${IF($["${DB(AMPUSER/8000/ringtimer)}" > "0"]?${DB(AMPUSER/8000/ringtimer)}:${RINGTIMER_DEFAULT})})
  2765. exten => 8000,n,Macro(exten-vm,8000,8000,0,0,0)
  2766. exten => 8000,n(dest),Set(__PICKUPMARK=)
  2767. exten => 8000,n,Macro(vm,8000,${DIALSTATUS},${IVR_RETVM})
  2768. exten => 8000,n,Goto(vmret,1)
  2769. exten => 8000,hint,PJSIP/8000&Custom:DND8000,CustomPresence:8000
  2770.  
  2771. exten => vmb8000,1,Macro(vm,8000,BUSY,${IVR_RETVM})
  2772. exten => vmb8000,n,Goto(vmret,1)
  2773.  
  2774. exten => vmu8000,1,Macro(vm,8000,NOANSWER,${IVR_RETVM})
  2775. exten => vmu8000,n,Goto(vmret,1)
  2776.  
  2777. exten => vms8000,1,Macro(vm,8000,NOMESSAGE,${IVR_RETVM})
  2778. exten => vms8000,n,Goto(vmret,1)
  2779.  
  2780. exten => vmi8000,1,Macro(vm,8000,INSTRUCT,${IVR_RETVM})
  2781. exten => vmi8000,n,Goto(vmret,1)
  2782.  
  2783. exten => 9000,1,Set(__RINGTIMER=${IF($["${DB(AMPUSER/9000/ringtimer)}" > "0"]?${DB(AMPUSER/9000/ringtimer)}:${RINGTIMER_DEFAULT})})
  2784. exten => 9000,n,Macro(exten-vm,novm,9000,0,0,0)
  2785. exten => 9000,n(dest),Set(__PICKUPMARK=)
  2786. exten => 9000,n,Goto(${IVR_CONTEXT},return,1)
  2787. exten => 9000,hint,PJSIP/9000&Custom:DND9000,CustomPresence:9000
  2788.  
  2789. exten => vmret,1,GotoIf($["${IVR_RETVM}" = "RETURN" & "${IVR_CONTEXT}" != ""]?playret)
  2790. exten => vmret,n,Hangup
  2791. exten => vmret,n(playret),Playback(exited-vm-will-be-transfered&silence/1)
  2792. exten => vmret,n,Goto(${IVR_CONTEXT},return,1)
  2793.  
  2794. exten => h,1,Macro(hangupcall,)
  2795.  
  2796. exten => _*80X.,hint,${DB(AMPUSER/${EXTEN:3}/hint)}
  2797. ;--== end of [ext-local] ==--;
  2798.  
  2799.  
  2800. [from-did-direct-ivr]
  2801. include => from-did-direct-ivr-custom
  2802. exten => *8000,1,Set(CONNECTEDLINE(name-charset,i)=utf8)
  2803. exten => *8000,n,Set(CONNECTEDLINE(name,i)=8000 Voicemail)
  2804. exten => *8000,n,Set(CONNECTEDLINE(num,i)=8000)
  2805. exten => *8000,n,Macro(blkvm-clr,)
  2806. exten => *8000,n,Set(__NODEST=)
  2807. exten => *8000,n,Macro(vm,8000,DIRECTDIAL,${IVR_RETVM})
  2808. exten => *8000,n,GotoIf($["${IVR_RETVM}" = "RETURN" & "${IVR_CONTEXT}" != ""]?ext-local,vmret,playret)
  2809.  
  2810. exten => _X.,1,GotoIf($[${DIALPLAN_EXISTS(from-did-direct,${EXTEN},1)} = 0]?i,1)
  2811. exten => _X.,n,Macro(blkvm-clr,)
  2812. exten => _X.,n,Set(__NODEST=)
  2813. exten => _X.,n,Goto(from-did-direct,${EXTEN},1)
  2814.  
  2815. ;--== end of [from-did-direct-ivr] ==--;
  2816.  
  2817.  
  2818. [app-vmmain]
  2819. include => app-vmmain-custom
  2820. exten => *97,1,Macro(user-callerid,)
  2821. exten => *97,n,Set(CONNECTEDLINE(name-charset,i)=utf8)
  2822. exten => *97,n,Set(CONNECTEDLINE(name,i)=My Voicemail)
  2823. exten => *97,n,Set(CONNECTEDLINE(num,i)=${AMPUSER})
  2824. exten => *97,n,Answer
  2825. exten => *97,n,Wait(1)
  2826. exten => *97,n,Macro(get-vmcontext,${AMPUSER})
  2827. exten => *97,n(check),Set(VMBOXEXISTSSTATUS=${IF(${VM_INFO(${AMPUSER}@${VMCONTEXT},exists)}?SUCCESS:FAILED)})
  2828. exten => *97,n,GotoIf($["${VMBOXEXISTSSTATUS}" = "SUCCESS"]?mbexist)
  2829. exten => *97,n,VoiceMailMain()
  2830. exten => *97,n,GotoIf($["${IVR_RETVM}" = "RETURN" & "${IVR_CONTEXT}" != ""]?playret)
  2831. exten => *97,n,Macro(hangupcall,)
  2832. exten => *97,check+101(mbexist),GotoIf($["${DB(AMPUSER/${AMPUSER}/novmpw)}"!=""]?novmpw:vmpw)
  2833. exten => *97,n(novmpw),Noop(Verifying channel ${CHANNEL} is actually ${AMPUSER})
  2834. exten => *97,n,Set(DEVICES=${DB(AMPUSER/${AMPUSER}/device)})
  2835. exten => *97,n,ExecIf($["${DEVICES}" = ""]?Set(DEVICES=${AMPUSER}))
  2836. exten => *97,n,ExecIf($["${DEVICES:0:1}" = "&"]?Set(DEVICES=${DEVICES:1}))
  2837. exten => *97,n,While($["${SET(DEV=${SHIFT(DEVICES,&)})}" != ""])
  2838. exten => *97,n,GotoIf($["${DB(DEVICE/${DEV}/dial)}" = "${CUT(CHANNEL,-,1)}"]?vmpwskip)
  2839. exten => *97,n,EndWhile
  2840. exten => *97,n,Noop(Channel ${CHANNEL} is NOT ${AMPUSER} forcing VM Password)
  2841. exten => *97,n(vmpw),VoiceMailMain(${AMPUSER}@${VMCONTEXT})
  2842. exten => *97,n,Goto(vmend)
  2843. exten => *97,n(vmpwskip),VoiceMailMain(${AMPUSER}@${VMCONTEXT},s)
  2844. exten => *97,n(vmend),GotoIf($["${IVR_RETVM}" = "RETURN" & "${IVR_CONTEXT}" != ""]?playret)
  2845. exten => *97,n,Macro(hangupcall,)
  2846. exten => *97,n(playret),Playback(beep&you-will-be-transfered-menu&silence/1)
  2847. exten => *97,n,Goto(${IVR_CONTEXT},return,1)
  2848.  
  2849. ;--== end of [app-vmmain] ==--;
  2850.  
  2851.  
  2852. [app-blacklist]
  2853. include => app-blacklist-custom
  2854. exten => s,1,Macro(user-callerid,)
  2855.  
  2856. exten => *30,1,Goto(app-blacklist-add,s,1)
  2857.  
  2858. exten => *31,1,Goto(app-blacklist-remove,s,1)
  2859.  
  2860. exten => *32,1,Goto(app-blacklist-last,s,1)
  2861.  
  2862. ;--== end of [app-blacklist] ==--;
  2863.  
  2864.  
  2865. [app-blacklist-check]
  2866. include => app-blacklist-check-custom
  2867. exten => s,1(check),GotoIf($["${BLACKLIST()}"="1"]?blacklisted)
  2868. exten => s,n,Set(CALLED_BLACKLIST=1)
  2869. exten => s,n,Return()
  2870. exten => s,n(blacklisted),Answer
  2871. exten => s,n,Set(BLDEST=${DB(blacklist/dest)})
  2872. exten => s,n,GotoIf(${LEN(${BLDEST})}?${BLDEST}:app-blackhole,zapateller,1)
  2873.  
  2874. ;--== end of [app-blacklist-check] ==--;
  2875.  
  2876.  
  2877. [app-blacklist-add]
  2878. include => app-blacklist-add-custom
  2879. exten => s,1,Answer
  2880. exten => s,n,Macro(user-callerid,)
  2881. exten => s,n,Wait(1)
  2882. exten => s,n,Set(NumLoops=0)
  2883. exten => s,n(start),Playback(enter-num-blacklist)
  2884. exten => s,n,Set(TIMEOUT(digit)=5)
  2885. exten => s,n,Set(TIMEOUT(response)=60)
  2886. exten => s,n,Read(blacknr,vm-then-pound,,,,)
  2887. exten => s,n,SayDigits(${blacknr})
  2888. exten => s,n,GosubIf($[${DIALPLAN_EXISTS(app-blacklist-add,${CHANNEL(language)})}]?app-blacklist-add,${CHANNEL(language)},1():app-blacklist-add,en,1())
  2889. exten => s,n,Noop(Waiting for input)
  2890. exten => s,n(end),WaitExten(10,)
  2891. exten => s,n,Playback(sorry-youre-having-problems&goodbye)
  2892. exten => s,n,Wait(1)
  2893. exten => s,n,Hangup
  2894.  
  2895. exten => en,1,Playback(if-correct-press&digits/1)
  2896. exten => en,n,Return()
  2897.  
  2898. exten => ja,1,Playback(if-correct-press&digits/1&pleasepress)
  2899. exten => ja,n,Return()
  2900.  
  2901. exten => 1,1,GotoIf($[ "${blacknr}" != ""]?:app-blacklist-add-invalid,s,1)
  2902. exten => 1,n,Set(DB(blacklist/${blacknr})=1)
  2903. exten => 1,n,Playback(num-was-successfully&added)
  2904. exten => 1,n,Wait(1)
  2905. exten => 1,n,Hangup
  2906.  
  2907. ;--== end of [app-blacklist-add] ==--;
  2908.  
  2909.  
  2910. [app-blacklist-add-invalid]
  2911. include => app-blacklist-add-invalid-custom
  2912. exten => s,1,Set(NumLoops=$[${NumLoops} + 1])
  2913. exten => s,n,Playback(pm-invalid-option)
  2914. exten => s,n,GotoIf($[${NumLoops} < 3]?app-blacklist-add,s,start)
  2915. exten => s,n,Playback(goodbye)
  2916. exten => s,n,Hangup
  2917.  
  2918. ;--== end of [app-blacklist-add-invalid] ==--;
  2919.  
  2920.  
  2921. [app-blacklist-remove]
  2922. include => app-blacklist-remove-custom
  2923. exten => s,1,Answer
  2924. exten => s,n,Macro(user-callerid,)
  2925. exten => s,n,Wait(1)
  2926. exten => s,n,Playback(entr-num-rmv-blklist)
  2927. exten => s,n,Set(TIMEOUT(digit)=5)
  2928. exten => s,n,Set(TIMEOUT(response)=60)
  2929. exten => s,n,Read(blacknr,vm-then-pound,,,,)
  2930. exten => s,n,SayDigits(${blacknr})
  2931. exten => s,n,GosubIf($[${DIALPLAN_EXISTS(app-blacklist-remove,${CHANNEL(language)})}]?app-blacklist-remove,${CHANNEL(language)},1():app-blacklist-remove,en,1())
  2932. exten => s,n,Noop(Waiting for input)
  2933. exten => s,n(end),WaitExten(60,)
  2934. exten => s,n,Playback(sorry-youre-having-problems&goodbye)
  2935.  
  2936. exten => en,1,Playback(if-correct-press&digits/1)
  2937. exten => en,n,Return()
  2938.  
  2939. exten => ja,1,Playback(if-correct-press&digits/1&pleasepress)
  2940. exten => ja,n,Return()
  2941.  
  2942. exten => 1,1,Noop(Deleting: blacklist/${blacknr} ${DB_DELETE(blacklist/${blacknr})})
  2943. exten => 1,n,Playback(num-was-successfully&removed)
  2944. exten => 1,n,Wait(1)
  2945. exten => 1,n,Hangup
  2946.  
  2947. ;--== end of [app-blacklist-remove] ==--;
  2948.  
  2949.  
  2950. [app-blacklist-last]
  2951. include => app-blacklist-last-custom
  2952. exten => s,1,Answer
  2953. exten => s,n,Macro(user-callerid,)
  2954. exten => s,n,Wait(1)
  2955. exten => s,n,Set(lastcaller=${DB(CALLTRACE/${AMPUSER})})
  2956. exten => s,n,GotoIf($[ $[ "${lastcaller}" = "" ] | $[ "${lastcaller}" = "unknown" ] ]?noinfo)
  2957. exten => s,n,Playback(privacy-to-blacklist-last-caller&telephone-number)
  2958. exten => s,n,SayDigits(${lastcaller})
  2959. exten => s,n,Set(TIMEOUT(digit)=3)
  2960. exten => s,n,Set(TIMEOUT(response)=7)
  2961. exten => s,n,GosubIf($[${DIALPLAN_EXISTS(app-blacklist-last,${CHANNEL(language)})}]?app-blacklist-last,${CHANNEL(language)},1():app-blacklist-last,en,1())
  2962. exten => s,n,Goto(end)
  2963. exten => s,n(noinfo),Playback(unidentified-no-callback)
  2964. exten => s,n,Hangup
  2965. exten => s,n,Noop(Waiting for input)
  2966. exten => s,n(end),WaitExten(60,)
  2967. exten => s,n,Playback(sorry-youre-having-problems&goodbye)
  2968.  
  2969. exten => en,1,Playback(if-correct-press&digits/1)
  2970. exten => en,n,Return()
  2971.  
  2972. exten => ja,1,Playback(if-correct-press&digits/1&pleasepress)
  2973. exten => ja,n,Return()
  2974.  
  2975. exten => 1,1,Set(DB(blacklist/${lastcaller})=1)
  2976. exten => 1,n,Playback(num-was-successfully)
  2977. exten => 1,n,Playback(added)
  2978. exten => 1,n,Wait(1)
  2979. exten => 1,n,Hangup
  2980.  
  2981. ;--== end of [app-blacklist-last] ==--;
  2982.  
  2983.  
  2984. [macro-dial]
  2985. include => macro-dial-custom
  2986. exten => s,1,Noop(Blind Transfer: ${BLINDTRANSFER}, Attended Transfer: ${ATTENDEDTRANSFER}, User: ${AMPUSER}, Alert Info: ${ALERT_INFO})
  2987. exten => s,n,Set(__CRM_SOURCE=${CALLERID(num)})
  2988. exten => s,n,ExecIf($["${ALERT_INFO}"="" & ${LEN(${AMPUSER})}!=0 & ${LEN(${BLINDTRANSFER})}=0 & ${LEN(${ATTENDEDTRANSFER})}=0]?Set(ALERT_INFO=))
  2989. exten => s,n,ExecIf($[${LEN(${BLINDTRANSFER})}!=0]?Set(ALERT_INFO=))
  2990. exten => s,n,ExecIf($[${LEN(${ATTENDEDTRANSFER})}!=0]?Set(ALERT_INFO=))
  2991. exten => s,n,ExecIf($[("${MOHCLASS}"!="default") & ("${MOHCLASS}"!="")]?Set(CHANNEL(musicclass)=${MOHCLASS}))
  2992. exten => s,n(dial),AGI(dialparties.agi)
  2993. exten => s,n,Noop(Returned from dialparties with no extensions to call and DIALSTATUS: ${DIALSTATUS})
  2994. exten => s,n,MacroExit()
  2995. exten => s,n(normdial),Noop(Returned from dialparties with groups to dial)
  2996. exten => s,n,Set(LOOPCNT=${FIELDQTY(FILTERED_DIAL,-)})
  2997. exten => s,n,Set(ITER=1)
  2998. exten => s,n(ndloopbegin),Set(EXTTOCALL=${CUT(FILTERED_DIAL,-,${ITER})})
  2999. exten => s,n,Noop(Working with ${EXTTOCALL})
  3000. exten => s,n,ExecIf($["${RVOL}"!=""]?Set(HASH(__SIPHEADERS,Alert-Info)=${IF($["${ALERT_INFO}"!=""]?${ALERT_INFO}:Normal)}\;volume=${RVOL}))
  3001. exten => s,n,ExecIf($["${RVOL}"="" & "${DB(AMPUSER/${EXTTOCALL}/rvolume)}" != ""]?Set(HASH(__SIPHEADERS,Alert-Info)=${IF($["${ALERT_INFO}"!=""]?${ALERT_INFO}:Normal)}\;volume=${DB(AMPUSER/${EXTTOCALL}/rvolume)}))
  3002. exten => s,n,Set(ITER=$[${ITER}+1])
  3003. exten => s,n,GotoIf($[${ITER}<=${LOOPCNT}]?ndloopbegin)
  3004. exten => s,n,Macro(dial-ringall-predial-hook,)
  3005. exten => s,n(nddialapp),Dial(${ds}b(func-apply-sipheaders^s^1),)
  3006. exten => s,n,Set(DIALSTATUS=${IF($["${DIALSTATUS_CW}"!="" ]?${DIALSTATUS_CW}:${DIALSTATUS})})
  3007. exten => s,n,GosubIf($[("${SCREEN}" != "" & ("${DIALSTATUS}" = "TORTURE" | "${DIALSTATUS}" = "DONTCALL")) | "${DIALSTATUS}" = "ANSWER"]?${DIALSTATUS},1())
  3008. exten => s,n(groupnoanswer),Noop(Returning since nobody answered)
  3009. exten => s,n,MacroExit()
  3010. exten => s,n(huntdial),Noop(Returned from dialparties with ${HuntMembers} hunt members to dial)
  3011. exten => s,n,Set(HuntLoop=0)
  3012. exten => s,n,ExecIf($[${LEN(${HuntMembers})}=0]?Set(HuntMembers=0))
  3013. exten => s,n(a22),GotoIf($[${HuntMembers} >= 1]?a30)
  3014. exten => s,n(huntnoanswer),Noop(Returning as there are no members left in the hunt group to ring)
  3015. exten => s,n,MacroExit()
  3016. exten => s,n(a30),Set(HuntMember=HuntMember${HuntLoop})
  3017. exten => s,n,GotoIf($[$["${CALLTRACE_HUNT}" != "" ] & $[$["${RingGroupMethod}" = "hunt" ] | $["${RingGroupMethod}" = "firstavailable"] | $["${RingGroupMethod}" = "firstnotonphone"]]]?a32:a35)
  3018. exten => s,n(a32),Set(CT_EXTEN=${CUT(FILTERED_DIAL,,$[${HuntLoop} + 1])})
  3019. exten => s,n,Set(EXTTOCALL=${CT_EXTEN})
  3020. exten => s,n,Set(__PICKUPMARK=${CT_EXTEN})
  3021. exten => s,n,Set(DB(CALLTRACE/${CT_EXTEN})=${CALLTRACE_HUNT})
  3022. exten => s,n,Goto(s,huntstart)
  3023. exten => s,n(a35),GotoIf($[$["${CALLTRACE_HUNT}" != "" ] & $["${RingGroupMethod}" = "memoryhunt" ]]?a36:a50)
  3024. exten => s,n(a36),Set(CTLoop=0)
  3025. exten => s,n(a37),GotoIf($[${CTLoop} > ${HuntLoop}]?huntstart)
  3026. exten => s,n,Set(CT_EXTEN=${CUT(FILTERED_DIAL,,$[${CTLoop} + 1])})
  3027. exten => s,n,Set(EXTTOCALL=${CT_EXTEN})
  3028. exten => s,n,Set(DB(CALLTRACE/${CT_EXTEN})=${CALLTRACE_HUNT})
  3029. exten => s,n,Set(CTLoop=$[1 + ${CTLoop}])
  3030. exten => s,n,Goto(s,a37)
  3031. exten => s,n(huntstart),Noop(Hunt Dial Start)
  3032. exten => s,n,ExecIf($["${RVOL}"!=""]?Set(HASH(__SIPHEADERS,Alert-Info)=${IF($["${ALERT_INFO}"!=""]?${ALERT_INFO}:Normal)}\;volume=${RVOL}))
  3033. exten => s,n,ExecIf($["${RVOL}"="" & "${DB(AMPUSER/${EXTTOCALL}/rvolume)}" != ""]?Set(HASH(__SIPHEADERS,Alert-Info)=${IF($["${ALERT_INFO}"!=""]?${ALERT_INFO}:Normal)}\;volume=${DB(AMPUSER/${EXTTOCALL}/rvolume)}))
  3034. exten => s,n,Macro(dial-hunt-predial-hook,)
  3035. exten => s,n(hsdialapp),Dial(${${HuntMember}}${ds}b(func-apply-sipheaders^s^1),)
  3036. exten => s,n,GotoIf($["${DIALSTATUS}" = "ANSWER"]?ANSWER,1)
  3037. exten => s,n,Set(HuntLoop=$[1 + ${HuntLoop}])
  3038. exten => s,n,GotoIf($[$["${RingGroupMethod}" = "firstavailable"] | $["${RingGroupMethod}" = "firstnotonphone"]] & $[$["${DIALSTATUS}" != "CHANUNAVAIL"] & $["${DIALSTATUS}" != "CONGESTION"]]?huntreset:a46)
  3039. exten => s,n(huntreset),Set(HuntMembers=1)
  3040. exten => s,n(a46),Set(HuntMembers=$[${HuntMembers} - 1])
  3041. exten => s,n,Goto(s,a22)
  3042. exten => s,n(a50),Noop(Deleting: CALLTRACE/${CT_EXTEN} ${DB_DELETE(CALLTRACE/${CT_EXTEN})})
  3043. exten => s,n,Goto(s,huntstart)
  3044. exten => s,n,GotoIf($["${ZULU_TYPE}"!="Sangomacrm-url"]?ndcrm-save)
  3045. exten => s,n,AGI(sangomacrm.agi,true)
  3046. exten => s,n,Goto(ndzuluend)
  3047. exten => s,n(ndcrm-save),AGI(sangomacrm.agi)
  3048. exten => s,n,GotoIf($["${ZULU_TYPE}"!="Sangomacrm-url"]?hscrm-save)
  3049. exten => s,n,AGI(sangomacrm.agi,true)
  3050. exten => s,n,Goto(hszuluend)
  3051. exten => s,n(hscrm-save),AGI(sangomacrm.agi)
  3052.  
  3053. exten => NOANSWER,1,Macro(vm,${SCREEN_EXTEN},BUSY,${IVR_RETVM})
  3054. exten => NOANSWER,n,GotoIf($["${IVR_RETVM}" != "RETURN" | "${IVR_CONTEXT}" = ""]?bye)
  3055. exten => NOANSWER,n,Return()
  3056. exten => NOANSWER,n(bye),Macro(hangupcall,)
  3057.  
  3058. exten => TORTURE,1,Goto(app-blackhole,musiconhold,1)
  3059. exten => TORTURE,n,Macro(hangupcall,)
  3060.  
  3061. exten => DONTCALL,1,Answer
  3062. exten => DONTCALL,n,Wait(1)
  3063. exten => DONTCALL,n,Zapateller()
  3064. exten => DONTCALL,n,Playback(ss-noservice)
  3065. exten => DONTCALL,n,Macro(hangupcall,)
  3066.  
  3067. exten => ANSWER,1(answered),Noop(Call successfully answered - Hanging up now)
  3068. exten => ANSWER,n,Macro(hangupcall,)
  3069.  
  3070. exten => h,1,Macro(hangupcall,)
  3071.  
  3072. ;--== end of [macro-dial] ==--;
  3073.  
  3074.  
  3075. [ext-local-confirm]
  3076. include => ext-local-confirm-custom
  3077. exten => _LC-.,1,ExecIf($["${DIRECTION}" = "INBOUND"]?Set(DIAL_OPTIONS=${STRREPLACE(DIAL_OPTIONS,T)}I))
  3078. exten => _LC-.,n,Set(THISDIAL=${DB(DEVICE/${EXTEN:3}/dial)})
  3079. exten => _LC-.,n,GotoIf($["${THISDIAL:0:5}"!="PJSIP"]?dial)
  3080. exten => _LC-.,n,Noop(Debug: Found PJSIP Destination ${THISDIAL}, updating with PJSIP_DIAL_CONTACTS)
  3081. exten => _LC-.,n,Set(THISDIAL=${PJSIP_DIAL_CONTACTS(${EXTEN:3})})
  3082. exten => _LC-.,n(dial),Dial(${THISDIAL},${RT},${DIAL_OPTIONS}M(auto-confirm^${RG_IDX})b(func-apply-sipheaders^s^1))
  3083.  
  3084. ;--== end of [ext-local-confirm] ==--;
  3085.  
  3086.  
  3087. [findmefollow-ringallv2]
  3088. include => findmefollow-ringallv2-custom
  3089. exten => _FMPR-.,1,Set(CDR_PROP(disable)=true)
  3090. exten => _FMPR-.,n,Set(RingGroupMethod=)
  3091. exten => _FMPR-.,n,Set(USE_CONFIRMATION=)
  3092. exten => _FMPR-.,n,Set(RINGGROUP_INDEX=)
  3093. exten => _FMPR-.,n,Macro(simple-dial,${EXTEN:5},${FMREALPRERING})
  3094. exten => _FMPR-.,n,ExecIf($["${DIALSTATUS}" = "BUSY"]?Set(SHARED(FM_DND,${FMUNIQUE})=DND))
  3095. exten => _FMPR-.,n,Hangup
  3096.  
  3097. exten => _FMGL-.,1,Set(CDR_PROP(disable)=true)
  3098. exten => _FMGL-.,n,Set(ENDLOOP=$[${EPOCH} + ${FMPRERING} + 2])
  3099. exten => _FMGL-.,n(start),GotoIf($["${SHARED(FM_DND,${FMUNIQUE})}" = "DND"]?dodnd)
  3100. exten => _FMGL-.,n,Wait(1)
  3101. exten => _FMGL-.,n,GotoIf($[${EPOCH} < ${ENDLOOP}]?start)
  3102. exten => _FMGL-.,n,Set(SHARED(FM_DND,${FMUNIQUE})=)
  3103. exten => _FMGL-.,n(dodial),Macro(dial,${FMGRPTIME},${DIAL_OPTIONS},${EXTEN:5})
  3104. exten => _FMGL-.,n,Hangup
  3105. exten => _FMGL-.,n+10(dodnd),Set(SHARED(FM_DND,${FMUNIQUE})=)
  3106. exten => _FMGL-.,n,GotoIf($["${FMPRIME}" = "FALSE"]?dodial)
  3107. exten => _FMGL-.,n,Hangup
  3108.  
  3109. ;--== end of [findmefollow-ringallv2] ==--;
  3110.  
  3111.  
  3112. [app-pickup]
  3113. include => app-pickup-custom
  3114. exten => _**.,1,Macro(user-callerid,)
  3115. exten => _**.,n,Set(PICKUP_EXTEN=${AMPUSER})
  3116. exten => _**.,n,Pickup(${EXTEN:2}&${EXTEN:2}@PICKUPMARK)
  3117. exten => _**.,n,Hangup
  3118.  
  3119. exten => _***80.,1,Macro(user-callerid,)
  3120. exten => _***80.,n,Set(PICKUP_EXTEN=${AMPUSER})
  3121. exten => _***80.,n,Pickup(${EXTEN:5}&${EXTEN:5}@PICKUPMARK)
  3122. exten => _***80.,n,Hangup
  3123.  
  3124. ;--== end of [app-pickup] ==--;
  3125.  
  3126.  
  3127. [app-chanspy]
  3128. include => app-chanspy-custom
  3129. exten => 555,1,Macro(user-callerid,)
  3130. exten => 555,n,Answer
  3131. exten => 555,n,Wait(1)
  3132. exten => 555,n,ChanSpy()
  3133. exten => 555,n,Hangup
  3134.  
  3135. ;--== end of [app-chanspy] ==--;
  3136.  
  3137.  
  3138. [ext-test]
  3139. include => ext-test-custom
  3140. exten => 7777,1,Macro(user-callerid,)
  3141. exten => 7777,n,Goto(from-pstn,${EXTEN},1)
  3142.  
  3143. exten => h,1,Macro(hangupcall,)
  3144.  
  3145. ;--== end of [ext-test] ==--;
  3146.  
  3147.  
  3148. [ext-did]
  3149. include => ext-did-custom
  3150. include => ext-did-0001
  3151. include => ext-did-0002
  3152. exten => foo,1,Noop(bar)
  3153.  
  3154. ;--== end of [ext-did] ==--;
  3155.  
  3156.  
  3157. [ext-did-catchall]
  3158. include => ext-did-catchall-custom
  3159. exten => s,1,Noop(No DID or CID Match)
  3160. exten => s,n(a2),Answer
  3161. exten => s,n,Log(WARNING,Friendly Scanner from ${CUT(CUT(SIP_HEADER(Via), ,2),:,1)})
  3162. exten => s,n,Wait(2)
  3163. exten => s,n,Playback(ss-noservice)
  3164. exten => s,n,SayAlpha(${FROM_DID})
  3165. exten => s,n,Hangup
  3166.  
  3167. exten => _.,1,Set(__FROM_DID=${EXTEN})
  3168. exten => _.,n,Noop(Received an unknown call with DID set to ${EXTEN})
  3169. exten => _.,n,Goto(s,a2)
  3170.  
  3171. exten => h,1,Hangup
  3172.  
  3173. ;--== end of [ext-did-catchall] ==--;
  3174.  
  3175.  
  3176. [macro-prepend-cid]
  3177. include => macro-prepend-cid-custom
  3178. exten => s,1,GotoIf($["${RGPREFIX}" = ""]?REPCID)
  3179. exten => s,n,GotoIf($["${RGPREFIX}" != "${CALLERID(name):0:${LEN(${RGPREFIX})}}"]?REPCID)
  3180. exten => s,n,Set(CALLERID(name)=${CALLERID(name):${LEN(${RGPREFIX})}})
  3181. exten => s,n,Set(_RGPREFIX=)
  3182. exten => s,n(REPCID),Set(_RGPREFIX=${ARG1})
  3183. exten => s,n,Set(CALLERID(name)=${RGPREFIX}${CALLERID(name)})
  3184.  
  3185. ;--== end of [macro-prepend-cid] ==--;
  3186.  
  3187.  
  3188. [outbound-allroutes]
  3189. include => outbound-allroutes-custom
  3190. exten => foo,1,Noop(bar)
  3191.  
  3192. ;--== end of [outbound-allroutes] ==--;
  3193.  
  3194.  
  3195. [app-blackhole]
  3196. include => app-blackhole-custom
  3197. exten => hangup,1,Noop(Blackhole Dest: Hangup)
  3198. exten => hangup,n,Hangup
  3199.  
  3200. exten => zapateller,1,Noop(Blackhole Dest: Play SIT Tone)
  3201. exten => zapateller,n,Answer
  3202. exten => zapateller,n,Zapateller()
  3203.  
  3204. exten => musiconhold,1,Noop(Blackhole Dest: Put caller on hold forever)
  3205. exten => musiconhold,n,Answer
  3206. exten => musiconhold,n,MusicOnHold()
  3207.  
  3208. exten => congestion,1,Noop(Blackhole Dest: Congestion)
  3209. exten => congestion,n,Progress
  3210. exten => congestion,n,Playtones(congestion)
  3211. exten => congestion,n,Congestion(20)
  3212. exten => congestion,n,Hangup
  3213.  
  3214. exten => busy,1,Noop(Blackhole Dest: Busy)
  3215. exten => busy,n,Progress
  3216. exten => busy,n,Busy(20)
  3217. exten => busy,n,Hangup
  3218.  
  3219. exten => ring,1,Noop(Blackhole Dest: Ring)
  3220. exten => ring,n,Answer
  3221. exten => ring,n,Playtones(ring)
  3222. exten => ring,n,Wait(300)
  3223. exten => ring,n,Hangup
  3224.  
  3225. exten => no-service,1,Noop(Blackhole Dest: No service)
  3226. exten => no-service,n,Answer
  3227. exten => no-service,n,Wait(1)
  3228. exten => no-service,n,Zapateller()
  3229. exten => no-service,n,Playback(ss-noservice)
  3230. exten => no-service,n,Hangup
  3231.  
  3232. ;--== end of [app-blackhole] ==--;
  3233.  
  3234.  
  3235. [bad-number]
  3236. include => bad-number-custom
  3237. exten => _X.,1,ResetCDR()
  3238. exten => _X.,n,NoCDR()
  3239. exten => _X.,n,Progress
  3240. exten => _X.,n,Wait(1)
  3241. exten => _X.,n,Playback(silence/1&cannot-complete-as-dialed&check-number-dial-again,noanswer)
  3242. exten => _X.,n,Wait(1)
  3243. exten => _X.,n,Congestion(20)
  3244. exten => _X.,n,Hangup
  3245.  
  3246. exten => s,1,Goto(11,1)
  3247.  
  3248. ;--== end of [bad-number] ==--;
  3249.  
  3250.  
  3251. [sub-presencestate-display]
  3252. include => sub-presencestate-display-custom
  3253. exten => s,1,Goto(state-${TOLOWER(${PRESENCE_STATE(CustomPresence:${ARG1},value)})},1)
  3254.  
  3255. exten => state-available,1,Set(PRESENCESTATE_DISPLAY=(Available))
  3256. exten => state-available,n,Return()
  3257.  
  3258. exten => state-chat,1,Set(PRESENCESTATE_DISPLAY=(Chatty))
  3259. exten => state-chat,n,Return()
  3260.  
  3261. exten => state-away,1,Set(PRESENCESTATE_DISPLAY=(Away))
  3262. exten => state-away,n,Return()
  3263.  
  3264. exten => state-dnd,1,Set(PRESENCESTATE_DISPLAY=(DND))
  3265. exten => state-dnd,n,Return()
  3266.  
  3267. exten => state-xa,1,Set(PRESENCESTATE_DISPLAY=(Extended Away))
  3268. exten => state-xa,n,Return()
  3269.  
  3270. exten => state-unavailable,1,Set(PRESENCESTATE_DISPLAY=(Unavailable))
  3271. exten => state-unavailable,n,Return()
  3272.  
  3273. exten => _state-.,1,Set(PRESENCESTATE_DISPLAY=)
  3274. exten => _state-.,n,Return()
  3275.  
  3276. exten => state-,1,Set(PRESENCESTATE_DISPLAY=)
  3277. exten => state-,n,Return()
  3278.  
  3279. ;--== end of [sub-presencestate-display] ==--;
  3280.  
  3281.  
  3282. [macro-confirm]
  3283. include => macro-confirm-custom
  3284. exten => s,1,Set(LOOPCOUNT=0)
  3285. exten => s,n,Set(__MACRO_RESULT=ABORT)
  3286. exten => s,n,Set(MSG1=${IF($["${ARG1}${ALT_CONFIRM_MSG}"=""]?incoming-call-1-accept-2-decline:${IF($[${LEN(${ALT_CONFIRM_MSG})}>0]?${ALT_CONFIRM_MSG}:${ARG1})})})
  3287. exten => s,n(start),Background(${MSG1},m,${CHANNEL(language)},macro-confirm)
  3288. exten => s,n,Read(INPUT,,1,,,4)
  3289. exten => s,n,GotoIf($[${LEN(${INPUT})} > 0]?${INPUT},1:t,1)
  3290.  
  3291. exten => 1,1,GotoIf($["${DB_EXISTS(RG/${ARG3}/${UNIQCHAN})}"="0" & "${SHARED(ANSWER_STATUS,${FORCE_CONFIRM})}"=""]?toolate,1)
  3292. exten => 1,n,Noop(Deleting: RG/${ARG3}/${UNIQCHAN} ${DB_DELETE(RG/${ARG3}/${UNIQCHAN})})
  3293. exten => 1,n,Macro(blkvm-clr,)
  3294. exten => 1,n,Set(SHARED(ANSWER_STATUS,${FORCE_CONFIRM})=)
  3295. exten => 1,n(skip),Set(__MACRO_RESULT=)
  3296. exten => 1,n,ExecIf($[("${MOHCLASS}"!="default") & ("${MOHCLASS}"!="")]?Set(CHANNEL(musicclass)=${MOHCLASS}))
  3297. exten => 1,n(exitopt1),MacroExit()
  3298.  
  3299. exten => 2,1,Goto(noanswer,1)
  3300.  
  3301. exten => 3,1,SayDigits(${CALLCONFIRMCID})
  3302. exten => 3,n,GotoIf($["${DB_EXISTS(RG/${ARG3}/${UNIQCHAN})}"="0" & "${SHARED(ANSWER_STATUS,${FORCE_CONFIRM})}"=""]?toolate,1:s,start)
  3303.  
  3304. exten => t,1,GotoIf($["${DB_EXISTS(RG/${ARG3}/${UNIQCHAN})}"="0" & "${SHARED(ANSWER_STATUS,${FORCE_CONFIRM})}"=""]?toolate,1)
  3305. exten => t,n,Set(LOOPCOUNT=$[ ${LOOPCOUNT} + 1 ])
  3306. exten => t,n,GotoIf($[ ${LOOPCOUNT} < 5 ]?s,start:noanswer,1)
  3307.  
  3308. exten => _X,1,Background(invalid,m,${CHANNEL(language)},macro-confirm)
  3309. exten => _X,n,GotoIf($["${DB_EXISTS(RG/${ARG3}/${UNIQCHAN})}"="0" | "${SHARED(ANSWER_STATUS,${FORCE_CONFIRM})}"=""]?toolate,1)
  3310. exten => _X,n,Set(LOOPCOUNT=$[ ${LOOPCOUNT} + 1 ])
  3311. exten => _X,n,GotoIf($[ ${LOOPCOUNT} < 5 ]?s,start:noanswer,1)
  3312.  
  3313. exten => noanswer,1,Set(__MACRO_RESULT=ABORT)
  3314. exten => noanswer,n(exitnoanswer),MacroExit()
  3315.  
  3316. exten => toolate,1,Set(MSG2=${IF($["foo${ARG2}" != "foo"]?${ARG2}:"incoming-call-no-longer-avail")})
  3317. exten => toolate,n,Playback(${MSG2})
  3318. exten => toolate,n,Set(__MACRO_RESULT=ABORT)
  3319. exten => toolate,n(exittoolate),MacroExit()
  3320.  
  3321. exten => h,1,Macro(hangupcall,)
  3322.  
  3323. ;--== end of [macro-confirm] ==--;
  3324.  
  3325.  
  3326. [macro-auto-confirm]
  3327. include => macro-auto-confirm-custom
  3328. exten => s,1,Set(__MACRO_RESULT=)
  3329. exten => s,n,Set(CFIGNORE=)
  3330. exten => s,n,Set(MASTER_CHANNEL(CFIGNORE)=)
  3331. exten => s,n,Set(FORWARD_CONTEXT=from-internal)
  3332. exten => s,n,Set(MASTER_CHANNEL(FORWARD_CONTEXT)=from-internal)
  3333. exten => s,n,Macro(blkvm-clr,)
  3334. exten => s,n,Noop(Deleting: RG/${ARG1}/${UNIQCHAN} ${DB_DELETE(RG/${ARG1}/${UNIQCHAN})})
  3335. exten => s,n,ExecIf($[!${REGEX("[^0-9]" ${DIALEDPEERNUMBER})} && "${DB(AMPUSER/${AMPUSER}/cidname)}" != ""]?Set(MASTER_CHANNEL(CONNECTEDLINE(num))=${DIALEDPEERNUMBER}))
  3336. exten => s,n,ExecIf($[!${REGEX("[^0-9]" ${DIALEDPEERNUMBER})} && "${DB(AMPUSER/${AMPUSER}/cidname)}" != ""]?Set(MASTER_CHANNEL(CONNECTEDLINE(name))=${DB(AMPUSER/${DIALEDPEERNUMBER}/cidname)}))
  3337.  
  3338. ;--== end of [macro-auto-confirm] ==--;
  3339.  
  3340.  
  3341. [macro-auto-blkvm]
  3342. include => macro-auto-blkvm-custom
  3343. exten => s,1,Set(__MACRO_RESULT=)
  3344. exten => s,n,Set(CFIGNORE=)
  3345. exten => s,n,Set(MASTER_CHANNEL(CFIGNORE)=)
  3346. exten => s,n,Set(FORWARD_CONTEXT=from-internal)
  3347. exten => s,n,Set(MASTER_CHANNEL(FORWARD_CONTEXT)=from-internal)
  3348. exten => s,n,Macro(blkvm-clr,)
  3349. exten => s,n,ExecIf($[!${REGEX("[^0-9]" ${DIALEDPEERNUMBER})} && "${DB(AMPUSER/${AMPUSER}/cidname)}" != ""]?Set(MASTER_CHANNEL(CONNECTEDLINE(num))=${DIALEDPEERNUMBER}))
  3350. exten => s,n,ExecIf($[!${REGEX("[^0-9]" ${DIALEDPEERNUMBER})} && "${DB(AMPUSER/${AMPUSER}/cidname)}" != ""]?Set(MASTER_CHANNEL(CONNECTEDLINE(name))=${DB(AMPUSER/${DIALEDPEERNUMBER}/cidname)}))
  3351.  
  3352. ;--== end of [macro-auto-blkvm] ==--;
  3353.  
  3354.  
  3355. [sub-pincheck]
  3356. include => sub-pincheck-custom
  3357. exten => s,1,Authenticate(${ARG3},)
  3358. exten => s,n,ResetCDR()
  3359. exten => s,n,Return()
  3360.  
  3361. ;--== end of [sub-pincheck] ==--;
  3362.  
  3363.  
  3364. [macro-privacy-mgr]
  3365. include => macro-privacy-mgr-custom
  3366. exten => s,1,Set(KEEPCID=${CALLERID(num)})
  3367. exten => s,n,Set(TESTCID=${IF($["${CALLERID(num):0:1}"="+"]?${MATH(1+${CALLERID(num):1})}:${MATH(1+${CALLERID(num)})})})
  3368. exten => s,n,ExecIf($[${LEN(${TESTCID})}=0]?Set(CALLERID(num)=))
  3369. exten => s,n,PrivacyManager(${ARG1},${ARG2})
  3370. exten => s,n,GotoIf($["${PRIVACYMGRSTATUS}"="FAILED"]?fail)
  3371. exten => s,n,GosubIf($["${CALLED_BLACKLIST}"="1"]?app-blacklist-check,s,1())
  3372. exten => s,n,Set(CALLERID(num-pres)=allowed_passed_screen)
  3373. exten => s,n,MacroExit()
  3374. exten => s,n(fail),Noop(STATUS: ${PRIVACYMGRSTATUS} CID: ${CALLERID(num)} ${CALLERID(name)} CALLPRES: ${CALLLINGPRES})
  3375. exten => s,n,Playback(sorry-youre-having-problems&goodbye)
  3376. exten => s,n,Playtones(congestion)
  3377. exten => s,n,Congestion(20)
  3378.  
  3379. exten => h,1,Hangup
  3380.  
  3381. ;--== end of [macro-privacy-mgr] ==--;
  3382.  
  3383.  
  3384. [macro-user-callerid]
  3385. include => macro-user-callerid-custom
  3386. exten => lang-playback,1,GosubIf($[${DIALPLAN_EXISTS(macro-user-callerid,${CHANNEL(language)})}]?macro-user-callerid,${CHANNEL(language)},${ARG1}():macro-user-callerid,en,${ARG1}())
  3387. exten => lang-playback,n,Return()
  3388.  
  3389. exten => s,1,Set(TOUCH_MONITOR=${UNIQUEID})
  3390. exten => s,n,Set(AMPUSER=${IF($["${AMPUSER}" = ""]?${CALLERID(number)}:${AMPUSER})})
  3391. exten => s,n,GotoIf($["${CUT(CHANNEL,@,2):5:5}"="queue" | ${LEN(${AMPUSERCIDNAME})}]?report)
  3392. exten => s,n,ExecIf($["${REALCALLERIDNUM:1:2}" = ""]?Set(__REALCALLERIDNUM=${CALLERID(number)}))
  3393. exten => s,n,Set(AMPUSER=${DB(DEVICE/${REALCALLERIDNUM}/user)})
  3394. exten => s,n,GotoIf($["${AMPUSER}" = "none"]?limit)
  3395. exten => s,n,Set(AMPUSERCIDNAME=${DB(AMPUSER/${AMPUSER}/cidname)})
  3396. exten => s,n,GotoIf($["${AMPUSERCIDNAME:1:2}" = ""]?report)
  3397. exten => s,n,Set(AMPUSERCID=${IF($["${ARG2}" != "EXTERNAL" & "${DB_EXISTS(AMPUSER/${AMPUSER}/cidnum)}" = "1"]?${DB_RESULT}:${AMPUSER})})
  3398. exten => s,n,Set(__DIAL_OPTIONS=${IF($["${DB_EXISTS(AMPUSER/${AMPUSER}/dialopts)}" = "1"]?${DB_RESULT}:${DIAL_OPTIONS})})
  3399. exten => s,n,Set(CALLERID(all)="${AMPUSERCIDNAME}" <${AMPUSERCID}>)
  3400. exten => s,n,GotoIf($["${ARG1}"="LIMIT" & ${LEN(${AMPUSER})} & ${DB_EXISTS(AMPUSER/${AMPUSER}/concurrency_limit)} & ${DB(AMPUSER/${AMPUSER}/concurrency_limit)}>0 & ${GROUP_COUNT(${AMPUSER}@concurrency_limit)}>=${DB(AMPUSER/${AMPUSER}/concurrency_limit)}]?limit)
  3401. exten => s,n,ExecIf($["${ARG1}"="LIMIT" & ${LEN(${AMPUSER})}]?Set(GROUP(concurrency_limit)=${AMPUSER}))
  3402. exten => s,n,ExecIf($["${DB(AMPUSER/${AMPUSER}/language)}" != ""]?Set(CHANNEL(language)=${DB(AMPUSER/${AMPUSER}/language)}))
  3403. exten => s,n(report),GotoIf($[ "${ARG1}" = "SKIPTTL" | "${ARG1}" = "LIMIT" ]?continue)
  3404. exten => s,n,ExecIf($["${CALLEE_ACCOUNCODE}" = ""]?Set(__CALLEE_ACCOUNCODE=${DB(AMPUSER/${IF($["${MACRO_CONTEXT}"="macro-exten-vm"]?${ARG2}:${MACRO_EXTEN})}/accountcode)}))
  3405. exten => s,n(report2),Set(__TTL=${IF($["foo${TTL}" = "foo"]?6:$[ ${TTL} - 1 ])})
  3406. exten => s,n,GotoIf($[ ${TTL} > 0 ]?continue)
  3407. exten => s,n,Wait(${RINGTIMER})
  3408. exten => s,n,Answer
  3409. exten => s,n,Wait(1)
  3410. exten => s,n,Gosub(macro-user-callerid,lang-playback,1(hook_0))
  3411. exten => s,n,Macro(hangupcall,)
  3412. exten => s,n(limit),Answer
  3413. exten => s,n,Wait(1)
  3414. exten => s,n,Gosub(macro-user-callerid,lang-playback,1(hook_1))
  3415. exten => s,n,Macro(hangupcall,)
  3416. exten => s,n,Congestion(20)
  3417. exten => s,n(continue),Set(CALLERID(number)=${CALLERID(number):0:40})
  3418. exten => s,n,Set(CALLERID(name)=${CALLERID(name):0:40})
  3419. exten => s,n,GotoIf($["${CALLERID(name)}" = ""]?cnum)
  3420. exten => s,n,Set(CDR(cnam)=${CALLERID(name)})
  3421. exten => s,n(cnum),Set(CDR(cnum)=${CALLERID(num)})
  3422. exten => s,n,Set(CHANNEL(language)=${MASTER_CHANNEL(CHANNEL(language))})
  3423.  
  3424. exten => h,1,Macro(hangupcall,)
  3425.  
  3426. exten => en,1(hook_0),Playback(im-sorry&an-error-has-occurred&with&call-forwarding)
  3427. exten => en,n,Return()
  3428. exten => en,n(hook_1),Playback(beep&im-sorry&your&simul-call-limit-reached&goodbye)
  3429. exten => en,n,Return()
  3430.  
  3431. exten => ja,1(hook_0),Playback(im-sorry&call-forwarding&jp-no&an-error-has-occured)
  3432. exten => ja,n,Return()
  3433. exten => ja,n(hook_1),Playback(beep&im-sorry&simul-call-limit-reached)
  3434. exten => ja,n,Return()
  3435.  
  3436. ;--== end of [macro-user-callerid] ==--;
  3437.  
  3438.  
  3439. [macro-outbound-callerid]
  3440. include => macro-outbound-callerid-custom
  3441. exten => s,1,ExecIf($["${CALLINGNAMEPRES_SV}" != ""]?Set(CALLERPRES(name-pres)=${CALLINGNAMEPRES_SV}))
  3442. exten => s,n,ExecIf($["${CALLINGNUMPRES_SV}" != ""]?Set(CALLERPRES(num-pres)=${CALLINGNUMPRES_SV}))
  3443. exten => s,n,ExecIf($["${REALCALLERIDNUM:1:2}" = ""]?Set(REALCALLERIDNUM=${CALLERID(number)}))
  3444. exten => s,n(start),GotoIf($[ $["${REALCALLERIDNUM}" = ""] | $["${KEEPCID}" != "TRUE"] | $["${OUTKEEPCID_${ARG1}}" = "on"] ]?normcid)
  3445. exten => s,n,Set(USEROUTCID=${REALCALLERIDNUM})
  3446. exten => s,n,GotoIf($["foo${DB(AMPUSER/${REALCALLERIDNUM}/device)}" = "foo"]?bypass)
  3447. exten => s,n(normcid),Set(USEROUTCID=${DB(AMPUSER/${AMPUSER}/outboundcid)})
  3448. exten => s,n(bypass),Set(EMERGENCYCID=${DB(DEVICE/${REALCALLERIDNUM}/emergency_cid)})
  3449. exten => s,n,Set(TRUNKOUTCID=${OUTCID_${ARG1}})
  3450. exten => s,n,GotoIf($["${EMERGENCYROUTE:1:2}" = "" | "${EMERGENCYCID:1:2}" = ""]?trunkcid)
  3451. exten => s,n,Set(CALLERID(all)=${EMERGENCYCID})
  3452. exten => s,n,Set(CDR(outbound_cnum)=${CALLERID(num)})
  3453. exten => s,n,Set(CDR(outbound_cnam)=${CALLERID(name)})
  3454. exten => s,n(exit),MacroExit()
  3455. exten => s,n(trunkcid),ExecIf($[${LEN(${TRUNKOUTCID})} != 0]?Set(CALLERID(all)=${TRUNKOUTCID}))
  3456. exten => s,n(usercid),ExecIf($[${LEN(${USEROUTCID})} != 0]?Set(CALLERID(all)=${USEROUTCID}))
  3457. exten => s,n,ExecIf($[${LEN(${TRUNKCIDOVERRIDE})} != 0 | ${LEN(${FORCEDOUTCID_${ARG1}})} != 0]?Set(CALLERID(all)=${IF($[${LEN(${FORCEDOUTCID_${ARG1}})}=0]?${TRUNKCIDOVERRIDE}:${FORCEDOUTCID_${ARG1}})}))
  3458. exten => s,n(hidecid),ExecIf($["${CALLERID(name)}"="hidden"]?Set(CALLERPRES(name-pres)=prohib_passed_screen))
  3459. exten => s,n,ExecIf($["${CALLERID(name)}"="hidden"]?Set(CALLERPRES(num-pres)=prohib_passed_screen))
  3460. exten => s,n,Set(CDR(outbound_cnum)=${CALLERID(num)})
  3461. exten => s,n,Set(CDR(outbound_cnam)=${CALLERID(name)})
  3462.  
  3463. ;--== end of [macro-outbound-callerid] ==--;
  3464.  
  3465.  
  3466. [from-zaptel]
  3467. include => from-zaptel-custom
  3468. include => from-dahdi
  3469. exten => foo,1,Noop(bar)
  3470.  
  3471. ;--== end of [from-zaptel] ==--;
  3472.  
  3473.  
  3474. [from-dahdi]
  3475. include => from-dahdi-custom
  3476. exten => _X.,1,Set(DID=${EXTEN})
  3477. exten => _X.,n,Goto(s,1)
  3478.  
  3479. exten => s,1,Noop(Entering from-dahdi with DID == ${DID})
  3480. exten => s,n,Ringing()
  3481. exten => s,n,Set(DID=${IF($["${DID}"= ""]?s:${DID})})
  3482. exten => s,n,Noop(DID is now ${DID})
  3483. exten => s,n,GotoIf($["${CHANNEL:0:5}"="DAHDI"]?dahdiok:checkzap)
  3484. exten => s,n(checkzap),GotoIf($["${CHANNEL:0:3}"="Zap"]?zapok:neither)
  3485. exten => s,n(neither),Goto(from-pstn,${DID},1)
  3486. exten => s,n,Macro(Hangupcall,dummy)
  3487. exten => s,n(dahdiok),Noop(Is a DAHDi Channel)
  3488. exten => s,n,Set(CHAN=${CHANNEL:6})
  3489. exten => s,n,Set(CHAN=${CUT(CHAN,-,1)})
  3490. exten => s,n,Macro(from-dahdi-${CHAN},${DID},1)
  3491. exten => s,n,Noop(Returned from Macro from-dahdi-${CHAN})
  3492. exten => s,n,Goto(from-pstn,${DID},1)
  3493. exten => s,n(zapok),Noop(Is a Zaptel Channel)
  3494. exten => s,n,Set(CHAN=${CHANNEL:4})
  3495. exten => s,n,Set(CHAN=${CUT(CHAN,-,1)})
  3496. exten => s,n,Macro(from-dahdi-${CHAN},${DID},1)
  3497. exten => s,n,Noop(Returned from Macro from-dahdi-${CHAN})
  3498. exten => s,n,Goto(from-pstn,${DID},1)
  3499.  
  3500. ;--== end of [from-dahdi] ==--;
  3501.  
  3502.  
  3503. [macro-dial-confirm]
  3504. include => macro-dial-confirm-custom
  3505. exten => s,1,Set(DB(RG/${ARG4}/${CHANNEL})=RINGING)
  3506. exten => s,n,Set(__UNIQCHAN=${CHANNEL})
  3507. exten => s,n,Set(USE_CONFIRMATION=TRUE)
  3508. exten => s,n,Set(RINGGROUP_INDEX=${ARG4})
  3509. exten => s,n,Set(FORCE_CONFIRM=)
  3510. exten => s,n,Set(ARG4=)
  3511. exten => s,n,Macro(dial,${ARG1},${ARG2},${ARG3})
  3512. exten => s,n,Noop(Deleting: RG/${RINGGROUP_INDEX}/${CHANNEL} ${DB_DELETE(RG/${RINGGROUP_INDEX}/${CHANNEL})})
  3513. exten => s,n,Set(USE_CONFIRMATION=)
  3514. exten => s,n,Set(RINGGROUP_INDEX=)
  3515.  
  3516. ;--== end of [macro-dial-confirm] ==--;
  3517.  
  3518.  
  3519. [macro-setmusic]
  3520. include => macro-setmusic-custom
  3521. exten => s,1,Set(CHANNEL(musicclass)=${ARG1})
  3522.  
  3523. ;--== end of [macro-setmusic] ==--;
  3524.  
  3525.  
  3526. [macro-block-cf]
  3527. include => macro-block-cf-custom
  3528. exten => _X.,1,Hangup
  3529.  
  3530. exten => s-ANSWER,1,Noop(Call successfully answered - Hanging up now)
  3531. exten => s-ANSWER,n,Macro(hangupcall,)
  3532.  
  3533. ;--== end of [macro-block-cf] ==--;
  3534.  
  3535.  
  3536. [macro-vm]
  3537. include => macro-vm-custom
  3538. exten => s,1,Macro(user-callerid,SKIPTTL)
  3539. exten => s,n,Set(VMGAIN=${IF($["foo${VM_GAIN}"!="foo"]?"g(${VM_GAIN})": )})
  3540. exten => s,n,Macro(blkvm-check,)
  3541. exten => s,n,GotoIf($["${GOSUB_RETVAL}" != "TRUE"]?vmx,1)
  3542. exten => s,n,Hangup
  3543.  
  3544. exten => vmx,1,Set(__EXTTOCALL=${ARG1})
  3545. exten => vmx,n,Set(__CRM_VOICEMAIL=${ARG1})
  3546. exten => vmx,n,Set(MEXTEN=${ARG1})
  3547. exten => vmx,n,Set(MMODE=${ARG2})
  3548. exten => vmx,n,Set(RETVM=${ARG3})
  3549. exten => vmx,n,Set(MODE=${IF($["${MMODE}"="BUSY"]?busy:unavail)})
  3550. exten => vmx,n,Macro(get-vmcontext,${MEXTEN})
  3551. exten => vmx,n,Set(MODE=${IF($[(${STAT(f,${ASTSPOOLDIR}/voicemail/${VMCONTEXT}/${MEXTEN}/temp.wav)} = 1) || (${STAT(f,${ASTSPOOLDIR}/voicemail/${VMCONTEXT}/${MEXTEN}/temp.WAV)} = 1)]?temp:${MODE})})
  3552. exten => vmx,n,Noop(MODE IS: ${MODE})
  3553. exten => vmx,n,GotoIf($["${DB(AMPUSER/${MEXTEN}/vmx/${MODE}/state)}" != "enabled"]?chknomsg)
  3554. exten => vmx,n,Set(VM_OPTS=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/vmxopts/timeout)}" = "1"]?${DB_RESULT}:${VM_OPTS})})
  3555. exten => vmx,n(chknomsg),GotoIf($["${MMODE}"="NOMESSAGE"]?s-${MMODE},1)
  3556. exten => vmx,n,GotoIf($["${MMODE}" != "DIRECTDIAL"]?notdirect)
  3557. exten => vmx,n,Set(MODE=${IF($["${REGEX("[b]" ${VM_DDTYPE})}" = "1"]?busy:${MODE})})
  3558. exten => vmx,n(notdirect),Noop(Checking if ext ${MEXTEN} is enabled: ${DB(AMPUSER/${MEXTEN}/vmx/${MODE}/state)})
  3559. exten => vmx,n,GotoIf($["${DB(AMPUSER/${MEXTEN}/vmx/${MODE}/state)}" != "enabled"]?s-${MMODE},1)
  3560. exten => vmx,n,GotoIf($[(${STAT(f,${ASTSPOOLDIR}/voicemail/${VMCONTEXT}/${MEXTEN}/temp.wav)} = 1) || (${STAT(f,${ASTSPOOLDIR}/voicemail/${VMCONTEXT}/${MEXTEN}/temp.WAV)} = 1)]?tmpgreet)
  3561. exten => vmx,n,GotoIf($[(${STAT(f,${ASTSPOOLDIR}/voicemail/${VMCONTEXT}/${MEXTEN}/${MODE}.wav)} = 0) && (${STAT(f,${ASTSPOOLDIR}/voicemail/${VMCONTEXT}/${MEXTEN}/${MODE}.WAV)} = 0)]?nofile)
  3562. exten => vmx,n,Set(VMX_TIMEOUT=2)
  3563. exten => vmx,n,Set(VMX_REPEAT=1)
  3564. exten => vmx,n,Set(VMX_LOOPS=1)
  3565. exten => vmx,n,Set(LOOPCOUNT=0)
  3566. exten => vmx,n,Set(VMX_REPEAT=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/repeat)}" = "1"]?${DB_RESULT}:${VMX_REPEAT})})
  3567. exten => vmx,n(vmxtime),Set(VMX_TIMEOUT=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/timeout)}" = "1"]?${DB_RESULT}:${VMX_TIMEOUT})})
  3568. exten => vmx,n(vmxloops),Set(VMX_LOOPS=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/loops)}" = "1"]?${DB_RESULT}:${VMX_LOOPS})})
  3569. exten => vmx,n(vmxanswer),Answer
  3570. exten => vmx,n(loopstart),Read(ACTION,${ASTSPOOLDIR}/voicemail/${VMCONTEXT}/${MEXTEN}/${MODE},1,skip,${VMX_REPEAT},${VMX_TIMEOUT})
  3571. exten => vmx,n,GotoIf($["${EXISTS(${ACTION})}" = "1"]?checkopt)
  3572. exten => vmx,n(noopt),Noop(Timeout: going to timeout dest)
  3573. exten => vmx,n,Set(VMX_OPTS=${DB(AMPUSER/${MEXTEN}/vmx/${MODE}/vmxopts/timeout)})
  3574. exten => vmx,n(chktime),GotoIf($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/timedest/ext)}" = "0"]?dotime)
  3575. exten => vmx,n,Set(VMX_TIMEDEST_EXT=${DB_RESULT})
  3576. exten => vmx,n,Set(VMX_TIMEDEST_CONTEXT=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/timedest/context)}" = "1"]?${DB_RESULT}:${VMX_TIMEDEST_CONTEXT})})
  3577. exten => vmx,n(timepri),Set(VMX_TIMEDEST_PRI=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/timedest/pri)}" = "1"]?${DB_RESULT}:${VMX_TIMEDEST_PRI})})
  3578. exten => vmx,n(dotime),Goto(${VMX_TIMEDEST_CONTEXT},${VMX_TIMEDEST_EXT},${VMX_TIMEDEST_PRI})
  3579. exten => vmx,n(checkopt),GotoIf($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/${ACTION}/ext)}" = "1"]?doopt)
  3580. exten => vmx,n,GotoIf($["${ACTION}" = "0"]?o,1)
  3581. exten => vmx,n,GotoIf($["${ACTION}" = "*"]?adef,1)
  3582. exten => vmx,n,Set(LOOPCOUNT=$[${LOOPCOUNT} + 1])
  3583. exten => vmx,n,GotoIf($["${LOOPCOUNT}" > "${VMX_LOOPS}"]?toomany)
  3584. exten => vmx,n,Playback(pm-invalid-option&please-try-again)
  3585. exten => vmx,n,Goto(loopstart)
  3586. exten => vmx,n(toomany),Noop(Too Many invalid entries, got to invalid dest)
  3587. exten => vmx,n,Set(VMX_OPTS=${VMX_OPTS_LOOP})
  3588. exten => vmx,n,Set(VMX_OPTS=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/vmxopts/loops)}" = "1"]?${DB_RESULT}:${VMX_OPTS})})
  3589. exten => vmx,n(chkloop),GotoIf($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/loopdest/ext)}" = "0"]?doloop)
  3590. exten => vmx,n,Set(VMX_LOOPDEST_EXT=${DB_RESULT})
  3591. exten => vmx,n,Set(VMX_LOOPDEST_CONTEXT=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/loopdest/context)}" = "1"]?${DB_RESULT}:${VMX_LOOPDEST_CONTEXT})})
  3592. exten => vmx,n(looppri),Set(VMX_LOOPDEST_PRI=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/loopdest/pri)}" = "1"]?${DB_RESULT}:${VMX_LOOPDEST_PRI})})
  3593. exten => vmx,n(doloop),Goto(${VMX_LOOPDEST_CONTEXT},${VMX_LOOPDEST_EXT},${VMX_LOOPDEST_PRI})
  3594. exten => vmx,n(doopt),Noop(Got a valid option: ${DB_RESULT})
  3595. exten => vmx,n,Set(VMX_EXT=${DB_RESULT})
  3596. exten => vmx,n,GotoIf($["${VMX_EXT}" != "dovm"]?getdest)
  3597. exten => vmx,n(vmxopts),Set(VMX_OPTS=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/vmxopts/dovm)}" = "1"]?${DB_RESULT}:${VMX_OPTS_DOVM})})
  3598. exten => vmx,n(vmxdovm),Goto(dovm,1)
  3599. exten => vmx,n(getdest),Set(VMX_CONTEXT=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/${ACTION}/context)}" = "1"]?${DB_RESULT}:${VMX_CONTEXT})})
  3600. exten => vmx,n(vmxpri),Set(VMX_PRI=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/${ACTION}/pri)}" = "1"]?${DB_RESULT}:${VMX_PRI})})
  3601. exten => vmx,n(vmxgoto),Goto(${VMX_CONTEXT},${VMX_EXT},${VMX_PRI})
  3602. exten => vmx,n(nofile),Noop(File for mode: ${MODE} does not exist, SYSTEMSTATUS: ${SYSTEMSTATUS}, going to normal voicemail)
  3603. exten => vmx,n,Goto(s-${MMODE},1)
  3604. exten => vmx,n(tmpgreet),Noop(Temporary Greeting Detected, going to normal voicemail)
  3605. exten => vmx,n,Goto(s-${MMODE},1)
  3606.  
  3607. exten => dovm,1,Noop(VMX Timeout - go to voicemail)
  3608. exten => dovm,n,VoiceMail(${MEXTEN}@${VMCONTEXT},${VMX_OPTS}${VMGAIN})
  3609. exten => dovm,n,Goto(exit-${VMSTATUS},1)
  3610.  
  3611. exten => s-BUSY,1,Noop(BUSY voicemail)
  3612. exten => s-BUSY,n,Macro(get-vmcontext,${MEXTEN})
  3613. exten => s-BUSY,n,VoiceMail(${MEXTEN}@${VMCONTEXT},${VM_OPTS}b${VMGAIN})
  3614. exten => s-BUSY,n,Goto(exit-${VMSTATUS},1)
  3615.  
  3616. exten => s-NOMESSAGE,1,Noop(NOMESSAGE (beep only) voicemail)
  3617. exten => s-NOMESSAGE,n,Macro(get-vmcontext,${MEXTEN})
  3618. exten => s-NOMESSAGE,n,VoiceMail(${MEXTEN}@${VMCONTEXT},s${VM_OPTS}${VMGAIN})
  3619. exten => s-NOMESSAGE,n,Goto(exit-${VMSTATUS},1)
  3620.  
  3621. exten => s-INSTRUCT,1,Noop(NOMESSAGE (beeb only) voicemail)
  3622. exten => s-INSTRUCT,n,Macro(get-vmcontext,${MEXTEN})
  3623. exten => s-INSTRUCT,n,VoiceMail(${MEXTEN}@${VMCONTEXT},${VM_OPTS}${VMGAIN})
  3624. exten => s-INSTRUCT,n,Goto(exit-${VMSTATUS},1)
  3625.  
  3626. exten => s-DIRECTDIAL,1,Noop(DIRECTDIAL voicemail)
  3627. exten => s-DIRECTDIAL,n,Macro(get-vmcontext,${MEXTEN})
  3628. exten => s-DIRECTDIAL,n,VoiceMail(${MEXTEN}@${VMCONTEXT},${VM_OPTS}${VM_DDTYPE}${VMGAIN})
  3629. exten => s-DIRECTDIAL,n,Goto(exit-${VMSTATUS},1)
  3630.  
  3631. exten => _s-.,1,Macro(get-vmcontext,${MEXTEN})
  3632. exten => _s-.,n,VoiceMail(${MEXTEN}@${VMCONTEXT},${VM_OPTS}u${VMGAIN})
  3633. exten => _s-.,n,Goto(exit-${VMSTATUS},1)
  3634.  
  3635. exten => o,1,Playback(one-moment-please)
  3636. exten => o,n,GotoIf($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/0/ext)}" = "0"]?doopdef)
  3637. exten => o,n,Set(VMX_OPDEST_EXT=${DB_RESULT})
  3638. exten => o,n(opcontext),Set(VMX_OPDEST_CONTEXT=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/0/context)}" = "1"]?${DB_RESULT}:${VMX_CONTEXT})})
  3639. exten => o,n(oppri),Set(VMX_OPDEST_PRI=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/0/pri)}" = "1"]?${DB_RESULT}:${VMX_PRI})})
  3640. exten => o,n,Goto(${VMX_OPDEST_CONTEXT},${VMX_OPDEST_EXT},${VMX_OPDEST_PRI})
  3641. exten => o,n(doopdef),GotoIf($["x${OPERATOR_XTN}"="x"]?nooper:from-internal,${OPERATOR_XTN},1)
  3642. exten => o,n(nooper),GotoIf($["x${FROM_DID}"="x"]?nodid)
  3643. exten => o,n,Dial(Local/${FROM_DID}@from-pstn,)
  3644. exten => o,n,Macro(hangup,)
  3645. exten => o,n(nodid),Dial(Local/s@from-pstn,)
  3646. exten => o,n,Macro(hangup,)
  3647.  
  3648. exten => a,1,Macro(get-vmcontext,${MEXTEN})
  3649. exten => a,n,GotoIf($["${DB_EXISTS(AMPUSER/${MEXTEN}/novmstar)}" = "1"]?s,1)
  3650. exten => a,n,GotoIf($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/*/ext)}" = "0"]?adef,1)
  3651. exten => a,n,Set(VMX_ADEST_EXT=${DB_RESULT})
  3652. exten => a,n(acontext),Set(VMX_ADEST_CONTEXT=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/*/context)}" = "1"]?${DB_RESULT}:${VMX_CONTEXT})})
  3653. exten => a,n(apri),Set(VMX_ADEST_PRI=${IF($["${DB_EXISTS(AMPUSER/${MEXTEN}/vmx/${MODE}/*/pri)}" = "1"]?${DB_RESULT}:${VMX_PRI})})
  3654. exten => a,n,Goto(${VMX_ADEST_CONTEXT},${VMX_ADEST_EXT},${VMX_ADEST_PRI})
  3655.  
  3656. exten => adef,1,VoiceMailMain(${MEXTEN}@${VMCONTEXT})
  3657. exten => adef,n,GotoIf($["${RETVM}" = "RETURN"]?exit-RETURN,1)
  3658. exten => adef,n,Hangup
  3659.  
  3660. exten => exit-FAILED,1,Playback(im-sorry&an-error-has-occurred)
  3661. exten => exit-FAILED,n,GotoIf($["${RETVM}" = "RETURN"]?exit-RETURN,1)
  3662. exten => exit-FAILED,n,Hangup
  3663.  
  3664. exten => exit-SUCCESS,1,GotoIf($["${RETVM}" = "RETURN"]?exit-RETURN,1)
  3665. exten => exit-SUCCESS,n,Playback(goodbye)
  3666. exten => exit-SUCCESS,n,Hangup
  3667.  
  3668. exten => exit-USEREXIT,1,GotoIf($["${RETVM}" = "RETURN"]?exit-RETURN,1)
  3669. exten => exit-USEREXIT,n,Playback(goodbye)
  3670. exten => exit-USEREXIT,n,Hangup
  3671.  
  3672. exten => exit-RETURN,1,Noop(Returning From Voicemail because macro)
  3673.  
  3674. exten => t,1,Hangup
  3675.  
  3676. ;--== end of [macro-vm] ==--;
  3677.  
  3678.  
  3679. [macro-exten-vm]
  3680. include => macro-exten-vm-custom
  3681. exten => s,1,Macro(user-callerid,)
  3682. exten => s,n,Set(RingGroupMethod=none)
  3683. exten => s,n,Set(__EXTTOCALL=${ARG2})
  3684. exten => s,n,Set(__PICKUPMARK=${ARG2})
  3685. exten => s,n,Set(RT=${IF($["${ARG1}"!="novm" | "${DB(CFU/${EXTTOCALL})}"!="" | "${DB(CFB/${EXTTOCALL})}"!="" | "${ARG3}"="1" | "${ARG4}"="1" | "${ARG5}"="1"]?${RINGTIMER}:)})
  3686. exten => s,n,ExecIf($[$["${REDIRECTING(reason)}" = "send_to_vm" | "${SIP_HEADER(X-Digium-Call-Feature)}" = "feature_send_to_vm" | "${PJSIP_HEADER(read,X-Digium-Call-Feature)}" = "feature_send_to_vm"] & "${ARG1}" != "novm"]?Macro(vm,${ARG1},DIRECTDIAL,${IVR_RETVM}))
  3687. exten => s,n,ExecIf($[$["${REDIRECTING(reason)}" = "send_to_vm" | "${SIP_HEADER(X-Digium-Call-Feature)}" = "feature_send_to_vm" | "${PJSIP_HEADER(read,X-Digium-Call-Feature)}" = "feature_send_to_vm"] & "${ARG1}" != "novm"]?MacroExit())
  3688. exten => s,n,ExecIf($["${SIP_HEADER(X-Digium-Call-Feature)}" = "feature_intercom" | "${PJSIP_HEADER(read,X-Digium-Call-Feature)}" = "feature_intercom"]?Gosub(ext-intercom,${INTERCOMCODE}${EXTTOCALL},1()))
  3689. exten => s,n,ExecIf($["${SIP_HEADER(X-Digium-Call-Feature)}" = "feature_intercom" | "${PJSIP_HEADER(read,X-Digium-Call-Feature)}" = "feature_intercom"]?MacroExit())
  3690. exten => s,n,ExecIf($["${SIP_HEADER(X-Digium-Call-Feature)}" = "feature_monitor" | "${PJSIP_HEADER(read,X-Digium-Call-Feature)}" = "feature_monitor"]?ChanSpy(${DB(DEVICE/${EXTTOCALL}/dial},q))
  3691. exten => s,n,ExecIf($["${SIP_HEADER(X-Digium-Call-Feature)}" = "feature_monitor" | "${PJSIP_HEADER(read,X-Digium-Call-Feature)}" = "feature_monitor"]?MacroExit())
  3692. exten => s,n(checkrecord),Gosub(sub-record-check,s,1(exten,${EXTTOCALL},dontcare))
  3693. exten => s,n,GotoIf($["${CUT(CHANNEL,@,2):5:5}"="queue"|"${AMPUSER}"=""|${LEN(${FROM_DID})}|"${DB(AMPUSER/${EXTTOCALL}/answermode)}"!="intercom"|${LEN(${BLINDTRANSFER})}|"${EXTENSION_STATE(${EXTTOCALL})}"!="NOT_INUSE"|"${CC_RECALL}"!=""]?macrodial)
  3694. exten => s,n,Set(INTERCOM_EXT_DOPTIONS=${DIAL_OPTIONS})
  3695. exten => s,n,Set(INTERCOM_RETURN=TRUE)
  3696. exten => s,n,Gosub(ext-intercom,*80${EXTTOCALL},1())
  3697. exten => s,n,Set(INTERCOM_RETURN=)
  3698. exten => s,n,Set(INTERCOM_EXT_DOPTIONS=)
  3699. exten => s,n(macrodial),GosubIf($["${INTERCOM_CALL}"="TRUE" & ${LEN(${BLINDTRANSFER})}]?clrheader,1())
  3700. exten => s,n,Macro(dial-one,${RT},${DIAL_OPTIONS},${EXTTOCALL})
  3701. exten => s,n,Set(SV_DIALSTATUS=${DIALSTATUS})
  3702. exten => s,n(calldocfu),GosubIf($[("${SV_DIALSTATUS}"="NOANSWER"|"${SV_DIALSTATUS}"="CHANUNAVAIL") & "${DB(CFU/${EXTTOCALL})}"!="" & "${SCREEN}"=""]?docfu,1())
  3703. exten => s,n(calldocfb),GosubIf($["${SV_DIALSTATUS}"="BUSY" & "${DB(CFB/${EXTTOCALL})}"!="" & "${SCREEN}"=""]?docfb,1())
  3704. exten => s,n,Set(DIALSTATUS=${SV_DIALSTATUS})
  3705. exten => s,n,ExecIf($[("${DIALSTATUS}"="NOANSWER"&"${ARG3}"="1")|("${DIALSTATUS}"="BUSY"&"${ARG4}"="1")|("${DIALSTATUS}"="CHANUNAVAIL"&"${ARG5}"="1")]?MacroExit())
  3706. exten => s,n,GotoIf($["${ARG1}"="novm"]?s-${DIALSTATUS},1)
  3707. exten => s,n,Macro(vm,${ARG1},${DIALSTATUS},${IVR_RETVM})
  3708.  
  3709. exten => docfu,1(docfu),ExecIf($["${DB(AMPUSER/${EXTTOCALL}/cfringtimer)}"="-1"|("${ARG1}"="novm"&"${ARG3}"="1")]?StackPop())
  3710. exten => docfu,n,GotoIf($["${DB(AMPUSER/${EXTTOCALL}/cfringtimer)}"="-1"|("${ARG1}"="novm"&"${ARG3}"="1")]?from-internal,${DB(CFU/${EXTTOCALL})},1)
  3711. exten => docfu,n,Set(RTCF=${IF($["${DB(AMPUSER/${EXTTOCALL}/cfringtimer)}"="0"]?${RT}:${DB(AMPUSER/${EXTTOCALL}/cfringtimer)})})
  3712. exten => docfu,n,ExecIf($["${DIRECTION}" = "INBOUND"]?Set(DIAL_OPTIONS=${STRREPLACE(DIAL_OPTIONS,T)}I))
  3713. exten => docfu,n,Dial(Local/${DB(CFU/${EXTTOCALL})}@from-internal/n,${RTCF},${DIAL_OPTIONS})
  3714. exten => docfu,n,Return()
  3715.  
  3716. exten => docfb,1(docfu),ExecIf($["${DB(AMPUSER/${EXTTOCALL}/cfringtimer)}"="-1"|("${ARG1}"="novm"&"${ARG4}"="1")]?StackPop())
  3717. exten => docfb,n,GotoIf($["${DB(AMPUSER/${EXTTOCALL}/cfringtimer)}"="-1"|("${ARG1}"="novm"&"${ARG4}"="1")]?from-internal,${DB(CFB/${EXTTOCALL})},1)
  3718. exten => docfb,n,Set(RTCF=${IF($["${DB(AMPUSER/${EXTTOCALL}/cfringtimer)}"="0"]?${RT}:${DB(AMPUSER/${EXTTOCALL}/cfringtimer)})})
  3719. exten => docfb,n,ExecIf($["${DIRECTION}" = "INBOUND"]?Set(DIAL_OPTIONS=${STRREPLACE(DIAL_OPTIONS,T)}I))
  3720. exten => docfb,n,Dial(Local/${DB(CFB/${EXTTOCALL})}@from-internal/n,${RTCF},${DIAL_OPTIONS})
  3721. exten => docfb,n,Return()
  3722.  
  3723. exten => clrheader,1,ExecIf($[${LEN(${SIPURI})}&"${SIPURI}"="${SIP_URI_OPTIONS}"]?Set(SIP_URI_OPTIONS=))
  3724. exten => clrheader,n,ExecIf($[${LEN(${ALERTINFO})}]?SIPRemoveHeader(${ALERTINFO}))
  3725. exten => clrheader,n,ExecIf($[${LEN(${CALLINFO})}]?SIPRemoveHeader(${CALLINFO}))
  3726. exten => clrheader,n,Return()
  3727.  
  3728. exten => s-BUSY,1,GotoIf($["${IVR_RETVM}"="RETURN" & "${IVR_CONTEXT}"!=""]?exit,1)
  3729. exten => s-BUSY,n,Playtones(busy)
  3730. exten => s-BUSY,n,Busy(20)
  3731.  
  3732. exten => _s-!,1,GotoIf($["${IVR_RETVM}"="RETURN" & "${IVR_CONTEXT}"!=""]?exit,1)
  3733. exten => _s-!,n,Playtones(congestion)
  3734. exten => _s-!,n,Congestion(10)
  3735.  
  3736. exten => exit,1,Playback(beep&line-busy-transfer-menu&silence/1)
  3737. exten => exit,n,MacroExit()
  3738.  
  3739. ;--== end of [macro-exten-vm] ==--;
  3740.  
  3741.  
  3742. [macro-simple-dial]
  3743. include => macro-simple-dial-custom
  3744. exten => s,1,Set(__EXTTOCALL=${ARG1})
  3745. exten => s,n,Set(RT=${ARG2})
  3746. exten => s,n,Set(CFUEXT=${DB(CFU/${EXTTOCALL})})
  3747. exten => s,n,Set(CFBEXT=${DB(CFB/${EXTTOCALL})})
  3748. exten => s,n,Set(CWI_TMP=${CWIGNORE})
  3749. exten => s,n(macrodial),Macro(dial-one,${RT},${DIAL_OPTIONS},${EXTTOCALL})
  3750. exten => s,n,Set(__CWIGNORE=${CWI_TMP})
  3751. exten => s,n,Set(PR_DIALSTATUS=${DIALSTATUS})
  3752. exten => s,n(calldocfu),GosubIf($["${PR_DIALSTATUS}"="NOANSWER" & "${CFUEXT}"!=""]?docfu,1())
  3753. exten => s,n(calldocfb),GosubIf($["${PR_DIALSTATUS}"="BUSY" & "${CFBEXT}"!=""]?docfb,1())
  3754. exten => s,n,Set(DIALSTATUS=${PR_DIALSTATUS})
  3755. exten => s,n,Goto(s-${DIALSTATUS},1)
  3756.  
  3757. exten => docfu,1,GotoIf($["${DB(AMPUSER/${CFUEXT}/device)}" = "" ]?chlocal)
  3758. exten => docfu,n,Dial(Local/${CFUEXT}@ext-local,${RT},${DIAL_OPTIONS})
  3759. exten => docfu,n,Return()
  3760. exten => docfu,n(chlocal),ExecIf($["${DIRECTION}" = "INBOUND"]?Set(DIAL_OPTIONS=${STRREPLACE(DIAL_OPTIONS,T)}I))
  3761. exten => docfu,n,Dial(Local/${CFUEXT}@from-internal/n,${RT},${DIAL_OPTIONS})
  3762. exten => docfu,n,Return()
  3763.  
  3764. exten => docfb,1,GotoIf($["${DB(AMPUSER/${CFBEXT}/device)}" = "" ]?chlocal)
  3765. exten => docfb,n,Dial(Local/${CFBEXT}@ext-local,${RT},${DIAL_OPTIONS})
  3766. exten => docfb,n,Return()
  3767. exten => docfb,n(chlocal),ExecIf($["${DIRECTION}" = "INBOUND"]?Set(DIAL_OPTIONS=${STRREPLACE(DIAL_OPTIONS,T)}I))
  3768. exten => docfb,n,Dial(Local/${CFBEXT}@from-internal/n,${RT},${DIAL_OPTIONS})
  3769. exten => docfb,n,Return()
  3770.  
  3771. exten => _s-.,1,Noop(Extension is reporting ${EXTEN})
  3772.  
  3773. ;--== end of [macro-simple-dial] ==--;
  3774.  
  3775.  
  3776. [originate-skipvm]
  3777. include => originate-skipvm-custom
  3778. exten => _.X,1,Macro(blkvm-set,)
  3779. exten => _.X,n,Goto(from-internal,${EXTEN},1)
  3780.  
  3781. ;--== end of [originate-skipvm] ==--;
  3782.  
  3783.  
  3784. [macro-blkvm-setifempty]
  3785. include => macro-blkvm-setifempty-custom
  3786. exten => s,1,GotoIf($[!${EXISTS(${BLKVM_CHANNEL})}]?init)
  3787. exten => s,n,Set(GOSUB_RETVAL=${SHARED(BLKVM,${BLKVM_CHANNEL})})
  3788. exten => s,n,MacroExit()
  3789. exten => s,n(init),Set(__BLKVM_CHANNEL=${CHANNEL})
  3790. exten => s,n,Set(SHARED(BLKVM,${BLKVM_CHANNEL})=TRUE)
  3791. exten => s,n,Set(GOSUB_RETVAL=TRUE)
  3792. exten => s,n,MacroExit()
  3793.  
  3794. ;--== end of [macro-blkvm-setifempty] ==--;
  3795.  
  3796.  
  3797. [macro-blkvm-set]
  3798. include => macro-blkvm-set-custom
  3799. exten => s,1,ExecIf($[!${EXISTS(${BLKVM_CHANNEL})} | "{ARG1}" = "reset"]?Set(__BLKVM_CHANNEL=${CHANNEL}))
  3800. exten => s,n,Set(SHARED(BLKVM,${BLKVM_CHANNEL})=TRUE)
  3801. exten => s,n,Set(GOSUB_RETVAL=TRUE)
  3802. exten => s,n,MacroExit()
  3803.  
  3804. ;--== end of [macro-blkvm-set] ==--;
  3805.  
  3806.  
  3807. [macro-blkvm-clr]
  3808. include => macro-blkvm-clr-custom
  3809. exten => s,1,Set(SHARED(BLKVM,${BLKVM_CHANNEL})=)
  3810. exten => s,n,Set(GOSUB_RETVAL=)
  3811. exten => s,n,MacroExit()
  3812.  
  3813. ;--== end of [macro-blkvm-clr] ==--;
  3814.  
  3815.  
  3816. [macro-blkvm-check]
  3817. include => macro-blkvm-check-custom
  3818. exten => s,1,Set(GOSUB_RETVAL=${SHARED(BLKVM,${BLKVM_CHANNEL})})
  3819. exten => s,n,ExecIf($["${GOSUB_RETVAL}"="" & "${CC_RECALL}"="1"]?Set(GOSUB_RETVAL=TRUE))
  3820. exten => s,n,MacroExit()
  3821.  
  3822. ;--== end of [macro-blkvm-check] ==--;
  3823.  
  3824.  
  3825. [macro-hangupcall]
  3826. include => macro-hangupcall-custom
  3827. exten => s,1(start),GotoIf($["${USE_CONFIRMATION}"="" | "${RINGGROUP_INDEX}"="" | "${CHANNEL}"!="${UNIQCHAN}"]?theend)
  3828. exten => s,n(delrgi),Noop(Deleting: RG/${RINGGROUP_INDEX}/${CHANNEL} ${DB_DELETE(RG/${RINGGROUP_INDEX}/${CHANNEL})})
  3829. exten => s,n(theend),ExecIf($["${ONETOUCH_RECFILE}"!="" & "${CDR(recordingfile)}"=""]?Set(CDR(recordingfile)=${ONETOUCH_RECFILE}))
  3830. exten => s,n,Hangup
  3831. exten => s,n,MacroExit()
  3832.  
  3833. ;--== end of [macro-hangupcall] ==--;
  3834.  
  3835.  
  3836. [macro-dial-one]
  3837. include => macro-dial-one-custom
  3838. exten => s,1,Set(DEXTEN=${ARG3})
  3839. exten => s,n,Set(__CRM_SOURCE=${CALLERID(num)})
  3840. exten => s,n(setexttocall),ExecIf($[${LEN(${EXTTOCALL})}=0 & ${LEN(${DEXTEN})}>0]?Set(EXTTOCALL=${DEXTEN}))
  3841. exten => s,n,Set(DIALSTATUS_CW=)
  3842. exten => s,n,GosubIf($["${FROM_DID}"!="" & "${SCREEN}"="" & "${DB(AMPUSER/${DEXTEN}/screen)}"!=""]?screen,1())
  3843. exten => s,n,GosubIf($["${DB(CF/${DEXTEN})}"!=""]?cf,1())
  3844. exten => s,n,GotoIf($["${DEXTEN:-1}"="#" | "${DB(DND/${DEXTEN})}"=""]?skip1)
  3845. exten => s,n,Set(DEXTEN=)
  3846. exten => s,n,Set(DIALSTATUS=BUSY)
  3847. exten => s,n(skip1),GotoIf($["${DEXTEN}"=""]?nodial)
  3848. exten => s,n,GotoIf($["${DEXTEN:-1}"="#"]?continue)
  3849. exten => s,n,Set(EXTHASCW=${IF($["${CWIGNORE}"!=""]? :${DB(CW/${DEXTEN})})})
  3850. exten => s,n,GotoIf($["${EXTHASCW}"="" | "${DB(CFB/${DEXTEN})}"!="" | "${DB(CFU/${DEXTEN})}"!=""]?next1:cwinusebusy)
  3851. exten => s,n(next1),GotoIf($["${DB(CFU/${DEXTEN})}"!="" & ("${EXTENSION_STATE(${DEXTEN})}"="UNAVAILABLE" | "${EXTENSION_STATE(${DEXTEN})}"="UNKNOWN")]?docfu:skip3)
  3852. exten => s,n(docfu),Set(DEXTEN=)
  3853. exten => s,n,Set(DIALSTATUS=NOANSWER)
  3854. exten => s,n,Goto(nodial)
  3855. exten => s,n(skip3),GotoIf($["${EXTHASCW}"="" | "${DB(CFB/${DEXTEN})}"!=""]?next2:continue)
  3856. exten => s,n(next2),GotoIf($["${EXTENSION_STATE(${DEXTEN})}"="NOT_INUSE" | "${EXTENSION_STATE(${DEXTEN})}"="UNAVAILABLE" | "${EXTENSION_STATE(${DEXTEN})}"="UNKNOWN"]?continue)
  3857. exten => s,n,ExecIf($["${DB(CFB/${DEXTEN})}"!="" & "${CFIGNORE}"=""]?Set(DIALSTATUS=BUSY))
  3858. exten => s,n,GotoIf($["${EXTHASCW}"!="" | "${DEXTEN:-1}"="#"]?cwinusebusy)
  3859. exten => s,n,Set(DEXTEN=)
  3860. exten => s,n,Set(DIALSTATUS=BUSY)
  3861. exten => s,n,Goto(nodial)
  3862. exten => s,n(cwinusebusy),GotoIf($["${EXTHASCW}"!="" & "${CWINUSEBUSY}"="true"]?next3:continue)
  3863. exten => s,n(next3),ExecIf($["${EXTENSION_STATE(${DEXTEN})}"!="UNAVAILABLE" & "${EXTENSION_STATE(${DEXTEN})}"!="NOT_INUSE" & "${EXTENSION_STATE(${DEXTEN})}"!="UNKNOWN"]?Set(DIALSTATUS_CW=BUSY))
  3864. exten => s,n(continue),GotoIf($["${DEXTEN}"=""]?nodial)
  3865. exten => s,n,GosubIf($["${DEXTEN:-1}"!="#"]?dstring,1():dlocal,1())
  3866. exten => s,n,GotoIf($[${LEN(${DSTRING})}=0]?nodial)
  3867. exten => s,n,GotoIf($["${DEXTEN:-1}"="#"]?skiptrace)
  3868. exten => s,n,GosubIf($[${REGEX("^[\+]?[0-9]+$" ${CALLERID(number)})} = 1]?ctset,1():ctclear,1())
  3869. exten => s,n(skiptrace),Set(D_OPTIONS=${IF($["${NODEST}"!="" & ${REGEX("(M[(]auto-blkvm[)])" ${ARG2})} != 1]?${ARG2}M(auto-blkvm):${ARG2})})
  3870. exten => s,n,Noop(Blind Transfer: ${BLINDTRANSFER}, Attended Transfer: ${ATTENDEDTRANSFER}, User: ${AMPUSER}, Alert Info: ${ALERT_INFO})
  3871. exten => s,n,ExecIf($["${ALERT_INFO}"="" & ${LEN(${AMPUSER})}!=0 & ${LEN(${BLINDTRANSFER})}=0 & ${LEN(${ATTENDEDTRANSFER})}=0]?Set(ALERT_INFO=))
  3872. exten => s,n,ExecIf($[${LEN(${BLINDTRANSFER})}!=0]?Set(ALERT_INFO=))
  3873. exten => s,n,ExecIf($[${LEN(${ATTENDEDTRANSFER})}!=0]?Set(ALERT_INFO=))
  3874. exten => s,n,ExecIf($["${RVOL}"!=""]?Set(ALERT_INFO=${IF($["${ALERT_INFO}"!=""]?${ALERT_INFO}:Normal)}\;volume=${RVOL}))
  3875. exten => s,n,ExecIf($["${RVOL}"="" & "${DB(AMPUSER/${EXTTOCALL}/rvolume)}" != ""]?Set(ALERT_INFO=${IF($["${ALERT_INFO}"!=""]?${ALERT_INFO}:Normal)}\;volume=${DB(AMPUSER/${EXTTOCALL}/rvolume)}))
  3876. exten => s,n,GosubIf($["${ALERT_INFO}"!="" & "${ALERT_INFO}"!=" "]?func-set-sipheader,s,1(Alert-Info,${ALERT_INFO}))
  3877. exten => s,n,ExecIf($[("${MOHCLASS}"!="default") & ("${MOHCLASS}"!="")]?Set(CHANNEL(musicclass)=${MOHCLASS}))
  3878. exten => s,n,GosubIf($["${QUEUEWAIT}"!=""]?qwait,1())
  3879. exten => s,n,Set(__CWIGNORE=${CWIGNORE})
  3880. exten => s,n,Set(__KEEPCID=TRUE)
  3881. exten => s,n,GotoIf($["${USEGOTO}"="1"]?usegoto,1)
  3882. exten => s,n,GotoIf($["${DB(AMPUSER/${EXTTOCALL}/cidname)}" = "" || "${DB(AMPUSER/${AMPUSER}/cidname)}" = ""]?godial)
  3883. exten => s,n,Gosub(sub-presencestate-display,s,1(${EXTTOCALL}))
  3884. exten => s,n,Set(CONNECTEDLINE(name,i)=${DB(AMPUSER/${EXTTOCALL}/cidname)}${PRESENCESTATE_DISPLAY})
  3885. exten => s,n,Set(CONNECTEDLINE(num)=${EXTTOCALL})
  3886. exten => s,n,Set(D_OPTIONS=${D_OPTIONS}I)
  3887. exten => s,n(godial),Macro(dialout-one-predial-hook,)
  3888. exten => s,n,ExecIf($["${DIRECTION}" = "INBOUND"]?Set(D_OPTIONS=${STRREPLACE(D_OPTIONS,T)}I))
  3889. exten => s,n(dialapp),Noop()
  3890. exten => s,n,Dial(${DSTRING},${ARG1},${D_OPTIONS}b(func-apply-sipheaders^s^1))
  3891. exten => s,n,ExecIf($["${DIALSTATUS}"="ANSWER" & "${CALLER_DEST}"!=""]?MacroExit())
  3892. exten => s,n,ExecIf($["${DIALSTATUS_CW}"!=""]?Set(DIALSTATUS=${DIALSTATUS_CW}))
  3893. exten => s,n,GosubIf($[("${SCREEN}"!=""&("${DIALSTATUS}"="TORTURE"|"${DIALSTATUS}"="DONTCALL"))|"${DIALSTATUS}"="ANSWER"]?s-${DIALSTATUS},1())
  3894. exten => s,n,MacroExit()
  3895. exten => s,n(nodial),Noop()
  3896. exten => s,n,ExecIf($["${DIALSTATUS}" = ""]?Set(DIALSTATUS=NOANSWER))
  3897. exten => s,n,Noop(Returned from dial-one with nothing to call and DIALSTATUS: ${DIALSTATUS})
  3898. exten => s,n,MacroExit()
  3899. exten => s,n,GotoIf($["${ZULU_TYPE}"!="Sangomacrm-url"]?crm-save)
  3900. exten => s,n,AGI(sangomacrm.agi,true)
  3901. exten => s,n,Goto(zuluend)
  3902. exten => s,n(crm-save),AGI(sangomacrm.agi)
  3903.  
  3904. exten => h,1,Macro(hangupcall,)
  3905.  
  3906. exten => usegoto,1,Set(USEGOTO=)
  3907. exten => usegoto,n,Goto(from-internal,${DSTRING},1)
  3908.  
  3909. exten => screen,1,GotoIf($["${DB(AMPUSER/${DEXTEN}/screen)}"!="nomemory" | "${CALLERID(number)}"=""]?memory)
  3910. exten => screen,n,ExecIf($[${REGEX("^[0-9a-zA-Z ]+$" ${CALLERID(number)})} = 1]?System(rm -f ${ASTVARLIBDIR}/sounds/priv-callerintros/${CALLERID(number)}.*))
  3911. exten => screen,n(memory),Set(__SCREEN=${DB(AMPUSER/${DEXTEN}/screen)})
  3912. exten => screen,n,Set(__SCREEN_EXTEN=${DEXTEN})
  3913. exten => screen,n,Set(ARG2=${ARG2}p)
  3914. exten => screen,n,Return()
  3915.  
  3916. exten => cf,1,Set(CFAMPUSER=${IF($["${AMPUSER}"=""]?${CALLERID(number)}:${AMPUSER})})
  3917. exten => cf,n,ExecIf($["${DB(CF/${DEXTEN})}"="${CFAMPUSER}" | "${DB(CF/${DEXTEN})}"="${REALCALLERIDNUM}" | "${CUT(CUT(BLINDTRANSFER,-,1),/,1)}" = "${DB(CF/${DEXTEN})}" | "${DEXTEN}"="${DB(CF/${DEXTEN})}"]?Return())
  3918. exten => cf,n,ExecIf($["${DB(AMPUSER/${DEXTEN}/cfringtimer)}" != "0" & "${DB(AMPUSER/${DEXTEN}/cfringtimer)}" != ""]?Set(ARG1=${IF($["${DB(AMPUSER/${DEXTEN}/cfringtimer)}"="-1"]? : ${DB(AMPUSER/${DEXTEN}/cfringtimer)})}))
  3919. exten => cf,n,Set(DEXTEN=${IF($["${CFIGNORE}"=""]?"${DB(CF/${DEXTEN})}#": )})
  3920. exten => cf,n,ExecIf($["${DEXTEN}"!=""]?Return())
  3921. exten => cf,n,Set(DIALSTATUS=NOANSWER)
  3922. exten => cf,n,Return()
  3923.  
  3924. exten => qwait,1,ExecIf($["${SAVEDCIDNAME}" = ""]?Set(__SAVEDCIDNAME=${CALLERID(name)}))
  3925. exten => qwait,n,Set(ELAPSED=${MATH($[${EPOCH}+30-${QUEUEWAIT}]/60,int)})
  3926. exten => qwait,n,Set(CALLERID(name)=M${ELAPSED}:${SAVEDCIDNAME})
  3927. exten => qwait,n,Return()
  3928.  
  3929. exten => ctset,1,Set(DB(CALLTRACE/${DEXTEN})=${CALLERID(number)})
  3930. exten => ctset,n,Return()
  3931.  
  3932. exten => ctclear,1,Noop(Deleting: CALLTRACE/${DEXTEN} ${DB_DELETE(CALLTRACE/${DEXTEN})})
  3933. exten => ctclear,n,Return()
  3934.  
  3935. exten => dstring,1,Set(DSTRING=)
  3936. exten => dstring,n,Set(DEVICES=${DB(AMPUSER/${DEXTEN}/device)})
  3937. exten => dstring,n,ExecIf($["${DEVICES}"=""]?Return())
  3938. exten => dstring,n,ExecIf($["${DEVICES:0:1}"="&"]?Set(DEVICES=${DEVICES:1}))
  3939. exten => dstring,n,Set(LOOPCNT=${FIELDQTY(DEVICES,&)})
  3940. exten => dstring,n,Set(ITER=1)
  3941. exten => dstring,n(begin),Set(THISDIAL=${DB(DEVICE/${CUT(DEVICES,&,${ITER})}/dial)})
  3942. exten => dstring,n,GosubIf($["${ASTCHANDAHDI}" = "1"]?zap2dahdi,1())
  3943. exten => dstring,n,GotoIf($["${THISDIAL:0:5}"!="PJSIP"]?docheck)
  3944. exten => dstring,n,Noop(Debug: Found PJSIP Destination ${THISDIAL})
  3945. exten => dstring,n,GotoIf($[ ${REGEX("(/.+/|@)" ${THISDIAL})} = 1 ]?doset)
  3946. exten => dstring,n,Noop(Debug: Updating PJSIP Destination with PJSIP_DIAL_CONTACTS)
  3947. exten => dstring,n,Set(THISDIAL=${PJSIP_DIAL_CONTACTS(${THISDIAL:6})})
  3948. exten => dstring,n(docheck),GotoIf($["${THISDIAL}"=""]?skipset)
  3949. exten => dstring,n(doset),Set(DSTRING=${DSTRING}${THISDIAL}&)
  3950. exten => dstring,n(skipset),Set(ITER=$[${ITER}+1])
  3951. exten => dstring,n,GotoIf($[${ITER}<=${LOOPCNT}]?begin)
  3952. exten => dstring,n,ExecIf($["${DSTRING:-1}"!="&"]?Return())
  3953. exten => dstring,n,Set(DSTRING=${DSTRING:0:$[${LEN(${DSTRING})}-1]})
  3954. exten => dstring,n,Return()
  3955.  
  3956. exten => dlocal,1,Set(DSTRING=${IF($["${ARG1}"=""]?${DEXTEN:0:${MATH(${LEN(${DEXTEN})}-1,int)}}:Local/${DEXTEN:0:${MATH(${LEN(${DEXTEN})}-1,int)}}@from-internal/n)})
  3957. exten => dlocal,n,Set(USEGOTO=${IF($["${ARG1}"=""]?1:0)})
  3958. exten => dlocal,n,Return()
  3959.  
  3960. exten => zap2dahdi,1,ExecIf($["${THISDIAL}" = ""]?Return())
  3961. exten => zap2dahdi,n,Set(NEWDIAL=)
  3962. exten => zap2dahdi,n,Set(LOOPCNT2=${FIELDQTY(THISDIAL,&)})
  3963. exten => zap2dahdi,n,Set(ITER2=1)
  3964. exten => zap2dahdi,n(begin2),Set(THISPART2=${CUT(THISDIAL,&,${ITER2})})
  3965. exten => zap2dahdi,n,ExecIf($["${THISPART2:0:3}" = "ZAP"]?Set(THISPART2=DAHDI${THISPART2:3}))
  3966. exten => zap2dahdi,n,Set(NEWDIAL=${NEWDIAL}${THISPART2}&)
  3967. exten => zap2dahdi,n,Set(ITER2=$[${ITER2} + 1])
  3968. exten => zap2dahdi,n,GotoIf($[${ITER2} <= ${LOOPCNT2}]?begin2)
  3969. exten => zap2dahdi,n,Set(THISDIAL=${NEWDIAL:0:$[${LEN(${NEWDIAL})}-1]})
  3970. exten => zap2dahdi,n,Return()
  3971.  
  3972. exten => s-TORTURE,1,Goto(app-blackhole,musiconhold,1)
  3973. exten => s-TORTURE,n,Macro(hangupcall,)
  3974.  
  3975. exten => s-DONTCALL,1,Answer
  3976. exten => s-DONTCALL,n,Wait(1)
  3977. exten => s-DONTCALL,n,Zapateller()
  3978. exten => s-DONTCALL,n,Playback(ss-noservice)
  3979. exten => s-DONTCALL,n,Macro(hangupcall,)
  3980.  
  3981. exten => s-CHANUNAVAIL,1,Macro(vm,${SCREEN_EXTEN},BUSY,${IVR_RETVM})
  3982. exten => s-CHANUNAVAIL,n,ExecIf($["${IVR_RETVM}"!="RETURN" | "${IVR_CONTEXT}"=""]?Hangup())
  3983. exten => s-CHANUNAVAIL,n,Return()
  3984.  
  3985. exten => s-NOANSWER,1,Macro(vm,${SCREEN_EXTEN},BUSY,${IVR_RETVM})
  3986. exten => s-NOANSWER,n,ExecIf($["${IVR_RETVM}"!="RETURN" | "${IVR_CONTEXT}"=""]?Hangup())
  3987. exten => s-NOANSWER,n,Return()
  3988.  
  3989. exten => s-BUSY,1,Macro(vm,${SCREEN_EXTEN},BUSY,${IVR_RETVM})
  3990. exten => s-BUSY,n,ExecIf($["${IVR_RETVM}"!="RETURN" | "${IVR_CONTEXT}"=""]?Hangup())
  3991. exten => s-BUSY,n,Return()
  3992.  
  3993. ;--== end of [macro-dial-one] ==--;
  3994.  
  3995.  
  3996. [func-set-sipheader]
  3997. include => func-set-sipheader-custom
  3998. exten => s,1,Noop(Sip Add Header function called. Adding ${ARG1} = ${ARG2})
  3999. exten => s,n,Set(HASH(_SIPHEADERS,${ARG1})=${ARG2})
  4000. exten => s,n,Return()
  4001.  
  4002. ;--== end of [func-set-sipheader] ==--;
  4003.  
  4004.  
  4005. [func-apply-sipheaders]
  4006. include => func-apply-sipheaders-custom
  4007. exten => s,1,ExecIf($["${CRM_DIRECTION}"="INBOUND"]?Set(CHANNEL(hangup_handler_push)=crm-hangup,s,1))
  4008. exten => s,n,Noop(Applying SIP Headers to channel)
  4009. exten => s,n,Set(SIPHEADERKEYS=${HASHKEYS(SIPHEADERS)})
  4010. exten => s,n,While($["${SET(sipkey=${SHIFT(SIPHEADERKEYS)})}" != ""])
  4011. exten => s,n,Set(sipheader=${HASH(SIPHEADERS,${sipkey})})
  4012. exten => s,n,SIPAddHeader(${sipkey}: ${sipheader})
  4013. exten => s,n,Set(PJSIP_HEADER(add,${sipkey})=${sipheader})
  4014. exten => s,n,EndWhile
  4015. exten => s,n,Return()
  4016.  
  4017. ;--== end of [func-apply-sipheaders] ==--;
  4018.  
  4019.  
  4020. [macro-pinsets]
  4021. include => macro-pinsets-custom
  4022. exten => s,1,GotoIf($[${ARG2} = 1]?cdr,1)
  4023. exten => s,n,ExecIf($["${DB(AMPUSER/${AMPUSER}/pinless)}" != "NOPASSWD"]?Authenticate(/etc/asterisk/pinset_${ARG1}))
  4024. exten => s,n,ExecIf($["${DB(AMPUSER/${AMPUSER}/pinless)}" != "NOPASSWD"]?ResetCDR(v))
  4025.  
  4026. exten => cdr,1,ExecIf($["${DB(AMPUSER/${AMPUSER}/pinless)}" != "NOPASSWD"]?Authenticate(/etc/asterisk/pinset_${ARG1},a))
  4027. exten => cdr,n,ExecIf($["${DB(AMPUSER/${AMPUSER}/pinless)}" != "NOPASSWD"]?ResetCDR(v))
  4028.  
  4029. ;--== end of [macro-pinsets] ==--;
  4030.  
  4031.  
  4032. [app-contactmanager-sd]
  4033. include => app-contactmanager-sd-custom
  4034. exten => _*10X!,1,Answer
  4035. exten => _*10X!,n,Macro(user-callerid,)
  4036. exten => _*10X!,n,GotoIf($[${DB_EXISTS(CM/speeddial/${EXTEN:3})}=1]?from-internal,${DB(CM/speeddial/${EXTEN:3})},1)
  4037. exten => _*10X!,n,Goto(bad-number,s,1)
  4038.  
  4039. ;--== end of [app-contactmanager-sd] ==--;
  4040.  
  4041.  
  4042. [sipstation-welcome]
  4043. include => sipstation-welcome-custom
  4044. exten => _X.,1,Set(ISNUM=${REGEX("[0-9]" ${CALLERID(number)})})
  4045. exten => _X.,n,Set(DB(sipstation/${EXTEN}/lastcall/cnum)=${CALLERID(number)})
  4046. exten => _X.,n,Set(DB(sipstation/${EXTEN}/lastcall/cnam)=${CALLERID(name)})
  4047. exten => _X.,n,Set(DB(sipstation/${EXTEN}/lastcall/time)=${EPOCH})
  4048. exten => _X.,n,Answer
  4049. exten => _X.,n,Wait(1)
  4050. exten => _X.,n,Playback(you-have-reached-a-test-number&silence/1)
  4051. exten => _X.,n,SayDigits(${EXTEN})
  4052. exten => _X.,n,Playback(your&calling&from&silence/1)
  4053. exten => _X.,n,GotoIf($["${ISNUM}" = "1"]?valid:notvalid)
  4054. exten => _X.,n(valid),SayDigits(${CALLERID(number)})
  4055. exten => _X.,n,Hangup
  4056. exten => _X.,n(notvalid),Playback(unavailable&number)
  4057. exten => _X.,n,Hangup
  4058.  
  4059. ;--== end of [sipstation-welcome] ==--;
  4060.  
  4061.  
  4062. [crm-hangup]
  4063. include => crm-hangup-custom
  4064. exten => s,1,Noop(Sending Hangup to CRM)
  4065. exten => s,n,Noop(HANGUP CAUSE: ${HANGUPCAUSE})
  4066. exten => s,n,ExecIf($[${LEN(${CRM_VOICEMAIL})} > 0]?Set(__CRM_VOICEMAIL=${VMSTATUS}))
  4067. exten => s,n,Noop(MASTER CHANNEL: ${CHANNEL(UNIQUEID)} = ${MASTER_CHANNEL(CHANNEL(UNIQUEID))})
  4068. exten => s,n,GotoIf($["${CHANNEL(UNIQUEID)}"!="${MASTER_CHANNEL(CHANNEL(UNIQUEID))}"]?return)
  4069. exten => s,n,Set(__CRM_HANGUP=1)
  4070. exten => s,n,AGI(sangomacrm.agi)
  4071. exten => s,n(return),Return()
  4072.  
  4073. ;--== end of [crm-hangup] ==--;
  4074.  
  4075.  
  4076. [from-internal-additional]
  4077. include => from-internal-additional-custom
  4078. include => app-cf-toggle
  4079. include => app-cf-busy-prompting-on
  4080. include => app-cf-busy-on
  4081. include => app-cf-busy-off-any
  4082. include => app-cf-busy-off
  4083. include => app-cf-off
  4084. include => app-cf-off-any
  4085. include => app-cf-unavailable-prompt-on
  4086. include => app-cf-unavailable-on
  4087. include => app-cf-unavailable-off
  4088. include => app-cf-on
  4089. include => app-cf-prompting-on
  4090. include => ext-cf-hints
  4091. include => app-callwaiting-cwoff
  4092. include => app-callwaiting-cwon
  4093. include => ext-meetme
  4094. include => app-dictate-record
  4095. include => app-dictate-send
  4096. include => app-dnd-off
  4097. include => app-dnd-on
  4098. include => app-dnd-toggle
  4099. include => ext-dnd-hints
  4100. include => app-fax
  4101. include => app-fmf-toggle
  4102. include => ext-findmefollow
  4103. include => fmgrps
  4104. include => app-hotelwakeup
  4105. include => app-calltrace
  4106. include => app-echo-test
  4107. include => app-speakextennum
  4108. include => app-speakingclock
  4109. include => app-miscapps
  4110. include => ext-intercom-users
  4111. include => park-hints
  4112. include => app-parking
  4113. include => app-pbdirectory
  4114. include => ext-queues
  4115. include => app-recordings
  4116. include => ext-group
  4117. include => grps
  4118. include => app-speeddial
  4119. include => timeconditions-toggles
  4120. include => vmblast-grp
  4121. include => app-dialvm
  4122. include => app-vmmain
  4123. include => app-blacklist
  4124. include => ext-local-confirm
  4125. include => findmefollow-ringallv2
  4126. include => app-pickup
  4127. include => app-chanspy
  4128. include => ext-test
  4129. include => ext-local
  4130. include => outbound-allroutes
  4131. include => app-contactmanager-sd
  4132. include => restapps-device-hints
  4133. exten => h,1,Hangup
  4134.  
  4135. ;--== end of [from-internal-additional] ==--;
  4136.  
  4137.  
  4138. [from-internal-noxfer-additional]
  4139. include => from-internal-noxfer-additional-custom
  4140. exten => h,1,Hangup
  4141.  
  4142. ;--== end of [from-internal-noxfer-additional] ==--;
Add Comment
Please, Sign In to add comment