Проверять или по длине номера
Для исходящих не получится, CALLERID(num) заменяется на внешний номер транка при звонке.
Для входящих... А SIP-оператор разве не может передать какой-нибудь левый номер?
Про setvar любопытно, я думал то же самое макросом сделать. Но
setvar = variable=value : Channel variable to be set for all calls from this peer/user.
Т.е. для входящих не сработает. И есть подозрения, что первый же трансфер эту переменную сбросит (и правильно сделает).
Пока есть такая идея:
[macro-check-devinfo-context]
exten => s,1,Noop(Who am I?)
same => n,Macro(dumpvars)
same => n,Gotoif(${devinfo_context}?the_end)
same => n,Set(devinfo_context=${ODBC_CHECK_CONTEXT(${CALLERID(num)})})
same => n(the_end),MacroExit()
Вызывать этот макрос при совершении любого звонка, а также непосредственно в тех местах, где нужно идентифицировать абонента. Чисто по прикидкам:
1) При звонке с номера 123 переменная получает его контекст из базы.
2) При выходе в транк callerid меняется, но переменная остаётся.
3) При трансфере переменная обнуляется, но и callerid восстанавливается, а значит, следующий вызов макроса восстановит переменную.
Но надо тестить. И ещё беспокоит честность провайдера. Ведь если придёт вызов с callerid=100 (служба поддержки, например), будет неприятно.
Ещё можно просто GotoIf`ом обойтись в Macro фичи.
Если фича самописная, а если стандартная типа *1 = начать запись, опять переписывать на свою? Должен быть более правильный способ, чем переопределять все стандартные фичи, имхо.